From e4f59a7f637fa5b315604badd783d1a5edc8b22a Mon Sep 17 00:00:00 2001 From: Jason Dreyzehner Date: Wed, 10 Jan 2024 18:09:22 -0500 Subject: [PATCH] feat: key generation utilities, utf8 normalization, API improvements BREAKING CHANGE: exposes script source compilations in ResolvedScript and renames authenticationTemplate -> walletTemplate --- .cspell.json | 36 +- .eslintrc | 33 +- .github/CONTRIBUTING.md | 2 +- .github/workflows/benchmark.yaml | 10 +- .github/workflows/ci.yaml | 7 +- .github/workflows/doc.yaml | 6 +- .gitmodules | 4 +- .pnp.cjs | 18679 ++++++++++++++++ .pnp.loader.mjs | 2090 ++ .prettierignore | 9 +- .vscode/extensions.json | 4 +- .vscode/settings.json | 11 +- .yarn | 2 +- .yarnrc.yml | 8 +- CHANGELOG-v1-to-v2.md | 5 +- README.md | 2 +- config/api-extractor.json | 680 +- config/eslint-config-bitauth | 1 + docs/errors.md | 3 +- package.json | 99 +- src/lib/address/base58-address.spec.ts | 56 +- src/lib/address/base58-address.ts | 12 +- src/lib/address/bech32.spec.ts | 69 +- src/lib/address/bech32.ts | 28 +- src/lib/address/cash-address.spec.ts | 169 +- src/lib/address/cash-address.ts | 69 +- src/lib/address/locking-bytecode.spec.ts | 84 +- src/lib/address/locking-bytecode.ts | 42 +- src/lib/bin/hashes.ts | 24 +- src/lib/bin/secp256k1/secp256k1-wasm-types.ts | 112 +- src/lib/bin/secp256k1/secp256k1-wasm.spec.ts | 126 +- src/lib/bin/secp256k1/secp256k1-wasm.ts | 68 +- .../compiler-bch-operations.spec.ts | 8 +- ...ompiler-bch.e2e.built-in-variables.spec.ts | 110 +- .../compiler-bch.e2e.data-signatures.spec.ts | 32 +- .../compiler-bch.e2e.evaluations.spec.ts | 36 +- .../compiler-bch.e2e.hd-key.spec.ts | 102 +- .../compiler-bch/compiler-bch.e2e.key.spec.ts | 58 +- .../compiler-bch.e2e.langauge.spec.ts | 36 +- .../compiler-bch.e2e.p2sh.spec.ts | 18 +- ...e.signing-serialization-algorithms.spec.ts | 34 +- .../compiler-bch.e2e.spec.helper.ts | 12 +- .../compiler-bch.e2e.variables.spec.ts | 44 +- .../compiler-bch/compiler-bch.spec.ts | 56 +- src/lib/compiler/compiler-bch/compiler-bch.ts | 65 +- src/lib/compiler/compiler-defaults.ts | 16 +- .../compiler-operation-helpers.spec.ts | 4 +- .../compiler/compiler-operation-helpers.ts | 28 +- src/lib/compiler/compiler-operations.ts | 61 +- src/lib/compiler/compiler-types.ts | 134 +- src/lib/compiler/compiler-utils.ts | 112 +- src/lib/compiler/compiler.spec.ts | 40 +- src/lib/compiler/compiler.ts | 2 +- src/lib/compiler/p2pkh-utils.ts | 19 +- src/lib/compiler/scenarios.spec.ts | 310 +- src/lib/compiler/scenarios.ts | 209 +- src/lib/compiler/standard/p2pkh.spec.ts | 37 +- src/lib/compiler/standard/p2pkh.ts | 22 +- src/lib/crypto/combinations.ts | 4 +- src/lib/crypto/hash.bench.helper.ts | 50 +- src/lib/crypto/hash.browser.bench.helper.ts | 42 +- src/lib/crypto/hash.browser.bench.ts | 21 +- src/lib/crypto/hash.spec.helper.ts | 65 +- src/lib/crypto/hmac.spec.ts | 15 +- src/lib/crypto/hmac.ts | 6 +- src/lib/crypto/ripemd160.bench.ts | 2 +- src/lib/crypto/ripemd160.ts | 16 +- src/lib/crypto/secp256k1-types.ts | 114 +- src/lib/crypto/secp256k1.bench.ts | 57 +- src/lib/crypto/secp256k1.spec.ts | 485 +- src/lib/crypto/secp256k1.ts | 82 +- src/lib/crypto/sha1.ts | 16 +- src/lib/crypto/sha256.ts | 16 +- src/lib/crypto/sha512.ts | 16 +- src/lib/engine/engine.ts | 8 + src/lib/engine/types/bcmr-types.ts | 940 + .../types}/template-types.ts | 412 +- src/lib/format/base-convert.spec.ts | 41 +- src/lib/format/base-convert.ts | 34 +- src/lib/format/base64.ts | 14 +- src/lib/format/bin-string.spec.ts | 7 +- src/lib/format/bin-string.ts | 6 +- src/lib/format/error.ts | 6 +- src/lib/format/hex.spec.ts | 11 +- src/lib/format/hex.ts | 14 +- src/lib/format/log.spec.ts | 19 +- src/lib/format/log.ts | 11 +- src/lib/format/number.bench.ts | 3 +- src/lib/format/number.spec.ts | 145 +- src/lib/format/number.ts | 84 +- src/lib/format/read.spec.ts | 20 +- src/lib/format/read.ts | 28 +- src/lib/format/time.spec.ts | 19 +- src/lib/format/time.ts | 4 +- src/lib/format/type-utils.ts | 44 +- src/lib/format/utf8.spec.ts | 7 +- src/lib/format/utf8.ts | 52 + src/lib/key/hd-key.spec.ts | 239 +- src/lib/key/hd-key.ts | 190 +- src/lib/key/key-utils.spec.ts | 39 +- src/lib/key/key-utils.ts | 204 +- src/lib/key/wallet-import-format.spec.ts | 16 +- src/lib/key/wallet-import-format.ts | 10 +- src/lib/language/compile.spec.ts | 304 +- src/lib/language/compile.ts | 6 +- src/lib/language/language-types.ts | 302 +- src/lib/language/language-utils.spec.ts | 90 +- src/lib/language/language-utils.ts | 134 +- src/lib/language/parse.spec.ts | 64 +- src/lib/language/parse.ts | 29 +- src/lib/language/parsimmon.ts | 40 +- src/lib/language/reduce.spec.ts | 6 +- src/lib/language/reduce.ts | 29 +- src/lib/language/resolve.spec.ts | 6 +- src/lib/language/resolve.ts | 81 +- src/lib/lib.ts | 3 +- src/lib/mappings.spec.ts | 8 +- src/lib/message/read-components.ts | 16 +- src/lib/message/transaction-encoding.spec.ts | 38 +- src/lib/message/transaction-encoding.ts | 92 +- src/lib/message/transaction-types.ts | 150 +- src/lib/schema/ajv/ajv-types.d.ts | 16 +- src/lib/schema/ajv/ajv-utils.ts | 24 +- ...ation-template.d.ts => validate-bcmr.d.ts} | 4 +- src/lib/schema/ajv/validate-bcmr.js | 6004 +++++ .../schema/ajv/validate-wallet-template.d.ts | 7 + ...emplate.js => validate-wallet-template.js} | 928 +- src/lib/schema/bcmr.schema.json | 493 + src/lib/schema/bcmr.spec.ts | 14 + src/lib/schema/bcmr.ts | 34 + .../fixtures/bcmr/bcmr.art-collection.json | 72 + .../bcmr/bcmr.decentralized-application.json | 67 + .../fixtures/bcmr/bcmr.fungible-token.json | 53 + .../bcmr/bcmr.payouts-or-dividends.json | 75 + src/lib/schema/schema.ts | 3 +- ...chema.json => wallet-template.schema.json} | 184 +- ...mplate.spec.ts => wallet-template.spec.ts} | 272 +- ...ication-template.ts => wallet-template.ts} | 26 +- src/lib/transaction/estimate-transaction.ts | 7 +- .../generate-templates.spec.helper.ts | 10 +- ...template.2-of-2-recoverable.spec.helper.ts | 6 +- .../fixtures/template.2-of-3.spec.helper.ts | 13 +- ... template.cash-channels-v1.spec.helper.ts} | 57 +- .../template.sig-of-sig.spec.helper.ts | 4 +- .../templates/2-of-2-recoverable.json | 2 +- .../fixtures/templates/2-of-3.json | 2 +- ...sh-channels.json => cash-channels-v1.json} | 17 +- .../transaction/fixtures/templates/p2pkh.json | 4 +- .../transaction/generate-transaction.spec.ts | 18 +- src/lib/transaction/generate-transaction.ts | 83 +- ...transaction-e2e.2-of-2-recoverable.spec.ts | 34 +- .../transaction-e2e.2-of-3.spec.ts | 28 +- .../transaction/transaction-e2e.p2pkh.spec.ts | 20 +- .../transaction-e2e.sig-of-sig.spec.ts | 28 +- .../transaction-e2e.spec.helper.ts | 2 +- .../transaction-e2e.templates.spec.ts | 18 +- .../bch/2022/bch-2022-instruction-set.ts | 68 +- .../bch/2022/bch-2022-types.ts | 8 +- .../bch/2023/bch-2023-consensus.ts | 1 + .../bch/2023/bch-2023-crypto.ts | 76 +- .../bch/2023/bch-2023-instruction-set.ts | 94 +- .../bch/2023/bch-2023-tokens.ts | 74 +- .../bch/chips/bch-chips-crypto.ts | 142 +- .../bch/chips/bch-chips-instruction-set.ts | 94 +- .../bch/chips/bch-chips-loops.ts | 68 +- .../bch/chips/bch-chips-types.ts | 35 +- src/lib/vm/instruction-sets/btc/btc-types.ts | 11 +- .../vm/instruction-sets/common/arithmetic.ts | 146 +- src/lib/vm/instruction-sets/common/bitwise.ts | 26 +- .../vm/instruction-sets/common/combinators.ts | 107 +- .../instruction-sets/common/common-types.ts | 78 +- .../vm/instruction-sets/common/consensus.ts | 1 + src/lib/vm/instruction-sets/common/crypto.ts | 128 +- .../vm/instruction-sets/common/encoding.ts | 22 +- src/lib/vm/instruction-sets/common/errors.ts | 7 +- .../instruction-sets/common/flow-control.ts | 38 +- src/lib/vm/instruction-sets/common/format.ts | 54 +- .../vm/instruction-sets/common/inspection.ts | 102 +- .../common/instruction-sets-types.ts | 40 +- .../common/instruction-sets-utils.spec.ts | 64 +- .../common/instruction-sets-utils.ts | 145 +- src/lib/vm/instruction-sets/common/nop.ts | 6 +- .../vm/instruction-sets/common/push.spec.ts | 16 +- src/lib/vm/instruction-sets/common/push.ts | 74 +- .../common/signing-serialization.spec.ts | 8 +- .../common/signing-serialization.ts | 136 +- src/lib/vm/instruction-sets/common/stack.ts | 74 +- src/lib/vm/instruction-sets/common/time.ts | 32 +- .../vm/instruction-sets/common/types.spec.ts | 24 +- .../satoshi-client/bitcoin-satoshi-utils.ts | 15 +- .../xec/xec-instruction-set.ts | 4 +- .../xec/xec-vm-number-operations.ts | 186 +- .../xec/xec.script-tests.spec.ts | 11 +- src/lib/vm/instruction-sets/xec/xec.spec.ts | 32 +- src/lib/vm/virtual-machine.spec.ts | 48 +- src/lib/vm/virtual-machine.ts | 72 +- src/lib/vm/vm-types.ts | 70 +- src/lib/vmb-tests/bch-vmb-test-mixins.ts | 30 +- src/lib/vmb-tests/bch-vmb-test-utils.spec.ts | 2 +- src/lib/vmb-tests/bch-vmb-test-utils.ts | 44 +- src/lib/vmb-tests/bch-vmb-test.spec.helper.ts | 11 +- .../bch-vmb-tests-invalid.spec.helper.ts | 24 +- src/lib/vmb-tests/bch-vmb-tests.cashtokens.ts | 16 +- .../bch-vmb-tests.live.spec.helper.ts | 26 +- .../bch-vmb-tests.signing-serialization.ts | 4 +- .../vmb-tests/bch-vmb-tests.spec.helper.ts | 6 +- src/lib/vmb-tests/bch-vmb-tests.spec.ts | 42 +- src/lib/vmb-tests/bch-vmb-tests.ts | 16 +- src/types/bcrypto.d.ts | 15 - src/types/bitcore-lib-cash.d.ts | 3 +- src/types/chuhai.d.ts | 14 +- src/types/rollup-plugin-alias.d.ts | 6 +- src/types/secp256k1.d.ts | 3 +- tsconfig.json | 6 +- yarn.lock | 8972 ++++---- 215 files changed, 39340 insertions(+), 10153 deletions(-) create mode 100755 .pnp.cjs create mode 100644 .pnp.loader.mjs create mode 160000 config/eslint-config-bitauth create mode 100644 src/lib/engine/engine.ts create mode 100644 src/lib/engine/types/bcmr-types.ts rename src/lib/{compiler => engine/types}/template-types.ts (79%) rename src/lib/schema/ajv/{validate-authentication-template.d.ts => validate-bcmr.d.ts} (51%) create mode 100644 src/lib/schema/ajv/validate-bcmr.js create mode 100644 src/lib/schema/ajv/validate-wallet-template.d.ts rename src/lib/schema/ajv/{validate-authentication-template.js => validate-wallet-template.js} (91%) create mode 100644 src/lib/schema/bcmr.schema.json create mode 100644 src/lib/schema/bcmr.spec.ts create mode 100644 src/lib/schema/bcmr.ts create mode 100644 src/lib/schema/fixtures/bcmr/bcmr.art-collection.json create mode 100644 src/lib/schema/fixtures/bcmr/bcmr.decentralized-application.json create mode 100644 src/lib/schema/fixtures/bcmr/bcmr.fungible-token.json create mode 100644 src/lib/schema/fixtures/bcmr/bcmr.payouts-or-dividends.json rename src/lib/schema/{authentication-template.schema.json => wallet-template.schema.json} (87%) rename src/lib/schema/{authentication-template.spec.ts => wallet-template.spec.ts} (88%) rename src/lib/schema/{authentication-template.ts => wallet-template.ts} (59%) rename src/lib/transaction/fixtures/{template.cash-channels.spec.helper.ts => template.cash-channels-v1.spec.helper.ts} (94%) rename src/lib/transaction/fixtures/templates/{cash-channels.json => cash-channels-v1.json} (97%) delete mode 100644 src/types/bcrypto.d.ts diff --git a/.cspell.json b/.cspell.json index e86e6668..36da9247 100644 --- a/.cspell.json +++ b/.cspell.json @@ -3,18 +3,26 @@ "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/master/cspell.schema.json", "language": "en", "words": [ + "activatable", "ACTIVEBYTECODE", + "airgapped", + "altstack", "Amagi", "ANYONECANPAY", "asmcrypto", "auditability", "auditable", + "authbase", + "authbases", + "authchain", + "authchains", + "authhead", "BCHCHIPs", "bchn", "bchreg", "bchtest", + "bcmr", "bcoin", - "bcrypto", "bech", "benchmarkjs", "bigint", @@ -31,6 +39,7 @@ "camelcase", "cashaddr", "CASHTOKENS", + "Chaingraph", "CHECKDATASIG", "CHECKDATASIGVERIFY", "CHECKLOCKTIMEVERIFY", @@ -39,6 +48,7 @@ "CHECKSEQUENCEVERIFY", "CHECKSIG", "CHECKSIGVERIFY", + "chipnet", "chuhai", "codecov", "codepoint", @@ -47,8 +57,11 @@ "combinator", "combinators", "convertbits", + "corepack", + "counterparties", "cyclomatic", "Datacarrier", + "DDTHH", "deno", "deserialization", "deserialize", @@ -65,15 +78,18 @@ "esnext", "FORKID", "FROMALTSTACK", + "gitter", "GREATERTHAN", "GREATERTHANOREQUAL", "HMAC", "IFDUP", + "IIFE", "INPUTBYTECODE", "INPUTINDEX", "INPUTSEQUENCENUMBER", "Ints", "INVALIDOPCODE", + "ipfs", "LESSTHAN", "LESSTHANOREQUAL", "libauth", @@ -90,8 +106,10 @@ "Merkle", "minification", "MINIMALIF", + "MITM", "monospace", "multisig", + "Nakamoto", "NONFUNGIBLE", "nops", "NOTIF", @@ -121,6 +139,9 @@ "PUBKEYS", "PUSHBYTES", "PUSHDATA", + "rebranded", + "rebranding", + "redenominated", "regtest", "reversebytes", "ripemd", @@ -133,15 +154,18 @@ "seckey", "secp", "secp256k1", + "sidechain", "sigchecks", "sighash", "skippable", "SMALLINTEGER", + "Spedn", "STACKTOP", "standardness", "statelessly", "STATICTOP", "submodule", + "substack", "templating", "testnet", "TOALTSTACK", @@ -171,10 +195,14 @@ "wasm", "wbindgen", "webassembly", + "wechat", + "XAMPL", "xprivkey", "xprv", "xpub", "xpubkey", + "yarnpkg", + "ZDTC", "π’‚Όπ’„„" ], "flagWords": [], @@ -193,9 +221,5 @@ "pattern": "/:[qpzry9x8gf2tvdw0s3jn54khce6mua7l]+/g" } ], - "ignoreRegExpList": [ - "Base64", - "HexValues", - "cash-address-format" - ] + "ignoreRegExpList": ["Base64", "HexValues", "cash-address-format"] } diff --git a/.eslintrc b/.eslintrc index 92ea1352..3e5a2a6e 100644 --- a/.eslintrc +++ b/.eslintrc @@ -3,29 +3,16 @@ "parser": "@typescript-eslint/parser", "parserOptions": { "project": "./tsconfig.json" }, "env": { "es6": true }, - "ignorePatterns": ["node_modules", "build", "coverage"], + "ignorePatterns": [ + "node_modules", + "build", + "coverage", + "src/lib/schema/ajv/*.js" + ], "extends": ["bitauth"], - "globals": { "BigInt": true, "console": true, "WebAssembly": true }, + // "globals": { "BigInt": true, "console": true, "WebAssembly": true }, "rules": { - "@typescript-eslint/prefer-readonly-parameter-types": "off", // TODO: enable when Uint8Array can be made readonly, see `Immutable` type - "@typescript-eslint/no-unused-expressions": "off", // TODO: bug causes crash in eslint 7.2.0 – re-enable later - "@typescript-eslint/naming-convention": [ - "error", - { - "selector": "default", - "format": ["camelCase"], - "leadingUnderscore": "allow" - }, - { - "selector": "variable", - "format": ["camelCase", "UPPER_CASE"], - "leadingUnderscore": "allow" - }, - { "selector": "typeLike", "format": ["PascalCase"] }, - { "selector": "enumMember", "format": ["camelCase", "UPPER_CASE"] } // Allow UPPER_CASE for opcodes - ], - "import/no-internal-modules": ["error"], - "import/extensions": ["error", "always"] + "@typescript-eslint/no-unsafe-enum-comparison": "off" }, "overrides": [ /* @@ -47,9 +34,11 @@ ] } ], - "functional/no-expression-statement": "off", "@typescript-eslint/naming-convention": "off", "@typescript-eslint/no-magic-numbers": "off", + "functional/no-expression-statements": "off", + "functional/no-conditional-statements": "off", + "functional/functional-parameters": "off", "functional/immutable-data": "off", "functional/no-return-void": "off" } diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 6181d9d7..fcc9660b 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -24,7 +24,7 @@ This library should provide the primitives needed to hack on bitcoin and bitcoin ## Some Practical Details -- **accept `readonly`, return mutable** - We should always return mutable types to allow consumers the option of mutating results without running afoul of type-checking. For the same reason, when we accept a value, we should always accept it as `readonly` for maximum flexibility. +- **accept immutable, return mutable** - We should always return mutable types to allow consumers the option of mutating results without running afoul of type-checking. For the same reason, when we accept a value, we should generally avoid mutating it. - **use `eslint-disable-next-line` or `eslint-disable-line`** - It's ok to disable eslint; in some cases, rules should be disabled every time they're hit (e.g. `no-bitwise`). By using single-line disables, we clearly mark intentional deviations from our conventions. - **avoid Hungarian notation & name prefixing** – Including the type of a variable in its name is a code smell: a name should clearly describe only one concept, and types are the business of the type system. Likewise, using prefixes to distinguish between an interface and an instance typically indicates the concepts should be simplified. E.g. `IChecker` and `Checker` – this is likely made unnecessarily complex to accommodate an object-oriented style. Consider replacing with a single function (or if instantiation is required, an object containing only stateless functions). - **don't throw things** – instead, return a result that can be either a success or error type. This strategy encourages a more functional approach to problems, and pragmatically, [TypeScript does not yet offer a `throws` clause or otherwise](https://github.com/microsoft/TypeScript/issues/13219), so only this strategy allows errors to be well-typed. A good pattern is `() => string | ResultType`, where ResultType is the desired output, and error messages are returned as a string. Consumers can easily use `typeof result === 'string'` to narrow the resulting type. When errors are more complex or `ResultType` is also a string, use an object with a `success` property, e.g. `() => { success: true, bytecode: Uint8Array } | { success: false, errors: ErrorType[] }`. diff --git a/.github/workflows/benchmark.yaml b/.github/workflows/benchmark.yaml index a5b8205d..32cf2c20 100644 --- a/.github/workflows/benchmark.yaml +++ b/.github/workflows/benchmark.yaml @@ -9,7 +9,7 @@ permissions: deployments: write concurrency: - group: "benchmarks" + group: 'benchmarks' cancel-in-progress: true jobs: @@ -19,15 +19,15 @@ jobs: steps: - uses: actions/checkout@v3 with: - submodules: 'true' + submodules: 'true' - name: Setup node uses: actions/setup-node@v3 with: - node-version: 16 + node-version: 20 - name: Run benchmark run: yarn && yarn bench - - # TODO: Libauth-only benchmarks: test for performance regressions in Libauth functionality, format results to work with the below configuration + + # TODO: Libauth-only benchmarks: test for performance regressions in Libauth functionality, format results to work with the below configuration # - name: Push benchmark result to gh-pages # uses: benchmark-action/github-action-benchmark@3d3bca03e83647895ef4f911fa57de3c7a391aaf diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 68f03cbf..70d05596 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -2,12 +2,11 @@ name: Lint, Build, and Test Libauth on: [push, pull_request] jobs: - build-and-test: runs-on: ubuntu-latest strategy: matrix: - node: [ 16 ] + node: [18] name: Test Node ${{ matrix.node }} steps: - uses: actions/checkout@v3 @@ -24,7 +23,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - node: [ 18 ] + node: [20] name: Test Node ${{ matrix.node }} steps: - uses: actions/checkout@v3 @@ -49,5 +48,5 @@ jobs: - name: Install Node.js uses: actions/setup-node@v3 with: - node-version: '18' + node-version: '20' - run: yarn install --immutable --immutable-cache --check-cache diff --git a/.github/workflows/doc.yaml b/.github/workflows/doc.yaml index f51e5e4d..655654f4 100644 --- a/.github/workflows/doc.yaml +++ b/.github/workflows/doc.yaml @@ -11,7 +11,7 @@ permissions: id-token: write concurrency: - group: "pages" + group: 'pages' cancel-in-progress: true jobs: @@ -21,11 +21,11 @@ jobs: steps: - uses: actions/checkout@v3 with: - submodules: 'true' + submodules: 'true' - name: Setup node uses: actions/setup-node@v3 with: - node-version: 18 + node-version: 20 - name: Prepare dependencies run: yarn - name: Generate Docs diff --git a/.gitmodules b/.gitmodules index 2ed2e49e..e30f5cab 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,4 +5,6 @@ [submodule ".yarn"] path = .yarn url = https://github.com/bitauth/libauth-dependencies.git - shallow = true \ No newline at end of file +[submodule "config/eslint-config-bitauth"] + path = config/eslint-config-bitauth + url = https://github.com/bitauth/eslint-config-bitauth/ diff --git a/.pnp.cjs b/.pnp.cjs new file mode 100755 index 00000000..6917e56c --- /dev/null +++ b/.pnp.cjs @@ -0,0 +1,18679 @@ +#!/usr/bin/env node +/* eslint-disable */ +"use strict"; + +const RAW_RUNTIME_STATE = +'{\ + "__info": [\ + "This file is automatically generated. Do not touch it, or risk",\ + "your modifications being lost."\ + ],\ + "dependencyTreeRoots": [\ + {\ + "name": "@bitauth/libauth",\ + "reference": "workspace:."\ + }\ + ],\ + "enableTopLevelFallback": true,\ + "ignorePatternData": "(^(?:\\\\.yarn\\\\/sdks(?:\\\\/(?!\\\\.{1,2}(?:\\\\/|$))(?:(?:(?!(?:^|\\\\/)\\\\.{1,2}(?:\\\\/|$)).)*?)|$))$)",\ + "fallbackExclusionList": [\ + ["@bitauth/libauth", ["workspace:."]]\ + ],\ + "fallbackPool": [\ + ],\ + "packageRegistryData": [\ + [null, [\ + [null, {\ + "packageLocation": "./",\ + "packageDependencies": [\ + ["@ava/typescript", "npm:4.1.0"],\ + ["@fast-check/ava", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:1.2.1"],\ + ["@microsoft/api-documenter", "npm:7.23.16"],\ + ["@microsoft/api-extractor", "npm:7.39.1"],\ + ["@playwright/test", "npm:1.40.1"],\ + ["@rollup/plugin-alias", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:5.1.0"],\ + ["@rollup/plugin-commonjs", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:25.0.7"],\ + ["@rollup/plugin-node-resolve", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:15.2.3"],\ + ["@types/elliptic", "npm:6.4.18"],\ + ["@types/express", "npm:4.17.21"],\ + ["@types/node", "npm:20.10.6"],\ + ["@typescript-eslint/eslint-plugin", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.18.1"],\ + ["@typescript-eslint/parser", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.17.0"],\ + ["ajv-cli", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:5.0.0"],\ + ["asmcrypto.js", "npm:2.3.2"],\ + ["ava", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.1"],\ + ["bitcore-lib-cash", "npm:10.0.23"],\ + ["c8", "npm:9.0.0"],\ + ["chuhai", "npm:1.2.0"],\ + ["cpy-cli", "npm:5.0.0"],\ + ["cspell", "npm:8.3.2"],\ + ["cz-conventional-changelog", "npm:3.3.0"],\ + ["elliptic", "npm:6.5.4"],\ + ["eslint", "npm:8.56.0"],\ + ["eslint-config-bitauth", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#portal:./config/eslint-config-bitauth::locator=%40bitauth%2Flibauth%40workspace%3A."],\ + ["eslint-config-prettier", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:9.1.0"],\ + ["eslint-plugin-eslint-comments", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:3.2.0"],\ + ["eslint-plugin-functional", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.0"],\ + ["eslint-plugin-import", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:2.29.1"],\ + ["eslint-plugin-tsdoc", "npm:0.2.17"],\ + ["express", "npm:4.18.2"],\ + ["fast-check", "npm:3.15.0"],\ + ["hash.js", "npm:1.1.7"],\ + ["madge", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.1.0"],\ + ["open-cli", "npm:8.0.0"],\ + ["prettier", "npm:3.1.1"],\ + ["rollup", "npm:4.9.3"],\ + ["secp256k1", "npm:5.0.0"],\ + ["source-map-support", "npm:0.5.21"],\ + ["standard-version", "npm:9.5.0"],\ + ["ts-json-schema-generator", "npm:1.5.0"],\ + ["typedoc", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:0.25.6"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "linkType": "SOFT"\ + }]\ + ]],\ + ["@aashutoshrathi/word-wrap", [\ + ["npm:1.2.6", {\ + "packageLocation": "../../../.yarn/berry/cache/@aashutoshrathi-word-wrap-npm-1.2.6-5b1d95e487-10c0.zip/node_modules/@aashutoshrathi/word-wrap/",\ + "packageDependencies": [\ + ["@aashutoshrathi/word-wrap", "npm:1.2.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@ava/typescript", [\ + ["npm:4.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@ava-typescript-npm-4.1.0-f1a5efe95a-10c0.zip/node_modules/@ava/typescript/",\ + "packageDependencies": [\ + ["@ava/typescript", "npm:4.1.0"],\ + ["escape-string-regexp", "npm:5.0.0"],\ + ["execa", "npm:7.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@babel/code-frame", [\ + ["npm:7.23.5", {\ + "packageLocation": "../../../.yarn/berry/cache/@babel-code-frame-npm-7.23.5-cb10d08de6-10c0.zip/node_modules/@babel/code-frame/",\ + "packageDependencies": [\ + ["@babel/code-frame", "npm:7.23.5"],\ + ["@babel/highlight", "npm:7.23.4"],\ + ["chalk", "npm:2.4.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@babel/helper-string-parser", [\ + ["npm:7.23.4", {\ + "packageLocation": "../../../.yarn/berry/cache/@babel-helper-string-parser-npm-7.23.4-b1f0d030c3-10c0.zip/node_modules/@babel/helper-string-parser/",\ + "packageDependencies": [\ + ["@babel/helper-string-parser", "npm:7.23.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@babel/helper-validator-identifier", [\ + ["npm:7.22.20", {\ + "packageLocation": "../../../.yarn/berry/cache/@babel-helper-validator-identifier-npm-7.22.20-18305bb306-10c0.zip/node_modules/@babel/helper-validator-identifier/",\ + "packageDependencies": [\ + ["@babel/helper-validator-identifier", "npm:7.22.20"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@babel/highlight", [\ + ["npm:7.23.4", {\ + "packageLocation": "../../../.yarn/berry/cache/@babel-highlight-npm-7.23.4-2a9f2d2538-10c0.zip/node_modules/@babel/highlight/",\ + "packageDependencies": [\ + ["@babel/highlight", "npm:7.23.4"],\ + ["@babel/helper-validator-identifier", "npm:7.22.20"],\ + ["chalk", "npm:2.4.2"],\ + ["js-tokens", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@babel/parser", [\ + ["npm:7.23.6", {\ + "packageLocation": "../../../.yarn/berry/cache/@babel-parser-npm-7.23.6-2fad283d6e-10c0.zip/node_modules/@babel/parser/",\ + "packageDependencies": [\ + ["@babel/parser", "npm:7.23.6"],\ + ["@babel/types", "npm:7.23.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@babel/types", [\ + ["npm:7.23.6", {\ + "packageLocation": "../../../.yarn/berry/cache/@babel-types-npm-7.23.6-4e68ac9e9b-10c0.zip/node_modules/@babel/types/",\ + "packageDependencies": [\ + ["@babel/types", "npm:7.23.6"],\ + ["@babel/helper-string-parser", "npm:7.23.4"],\ + ["@babel/helper-validator-identifier", "npm:7.22.20"],\ + ["to-fast-properties", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@bcoe/v8-coverage", [\ + ["npm:0.2.3", {\ + "packageLocation": "../../../.yarn/berry/cache/@bcoe-v8-coverage-npm-0.2.3-9e27b3c57e-10c0.zip/node_modules/@bcoe/v8-coverage/",\ + "packageDependencies": [\ + ["@bcoe/v8-coverage", "npm:0.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@bitauth/libauth", [\ + ["workspace:.", {\ + "packageLocation": "./",\ + "packageDependencies": [\ + ["@bitauth/libauth", "workspace:."],\ + ["@ava/typescript", "npm:4.1.0"],\ + ["@fast-check/ava", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:1.2.1"],\ + ["@microsoft/api-documenter", "npm:7.23.16"],\ + ["@microsoft/api-extractor", "npm:7.39.1"],\ + ["@playwright/test", "npm:1.40.1"],\ + ["@rollup/plugin-alias", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:5.1.0"],\ + ["@rollup/plugin-commonjs", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:25.0.7"],\ + ["@rollup/plugin-node-resolve", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:15.2.3"],\ + ["@types/elliptic", "npm:6.4.18"],\ + ["@types/express", "npm:4.17.21"],\ + ["@types/node", "npm:20.10.6"],\ + ["@typescript-eslint/eslint-plugin", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.18.1"],\ + ["@typescript-eslint/parser", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.17.0"],\ + ["ajv-cli", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:5.0.0"],\ + ["asmcrypto.js", "npm:2.3.2"],\ + ["ava", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.1"],\ + ["bitcore-lib-cash", "npm:10.0.23"],\ + ["c8", "npm:9.0.0"],\ + ["chuhai", "npm:1.2.0"],\ + ["cpy-cli", "npm:5.0.0"],\ + ["cspell", "npm:8.3.2"],\ + ["cz-conventional-changelog", "npm:3.3.0"],\ + ["elliptic", "npm:6.5.4"],\ + ["eslint", "npm:8.56.0"],\ + ["eslint-config-bitauth", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#portal:./config/eslint-config-bitauth::locator=%40bitauth%2Flibauth%40workspace%3A."],\ + ["eslint-config-prettier", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:9.1.0"],\ + ["eslint-plugin-eslint-comments", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:3.2.0"],\ + ["eslint-plugin-functional", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.0"],\ + ["eslint-plugin-import", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:2.29.1"],\ + ["eslint-plugin-tsdoc", "npm:0.2.17"],\ + ["express", "npm:4.18.2"],\ + ["fast-check", "npm:3.15.0"],\ + ["hash.js", "npm:1.1.7"],\ + ["madge", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.1.0"],\ + ["open-cli", "npm:8.0.0"],\ + ["prettier", "npm:3.1.1"],\ + ["rollup", "npm:4.9.3"],\ + ["secp256k1", "npm:5.0.0"],\ + ["source-map-support", "npm:0.5.21"],\ + ["standard-version", "npm:9.5.0"],\ + ["ts-json-schema-generator", "npm:1.5.0"],\ + ["typedoc", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:0.25.6"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "linkType": "SOFT"\ + }]\ + ]],\ + ["@commitlint/config-validator", [\ + ["npm:18.4.4", {\ + "packageLocation": "../../../.yarn/berry/cache/@commitlint-config-validator-npm-18.4.4-e903289934-10c0.zip/node_modules/@commitlint/config-validator/",\ + "packageDependencies": [\ + ["@commitlint/config-validator", "npm:18.4.4"],\ + ["@commitlint/types", "npm:18.4.4"],\ + ["ajv", "npm:8.12.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@commitlint/execute-rule", [\ + ["npm:18.4.4", {\ + "packageLocation": "../../../.yarn/berry/cache/@commitlint-execute-rule-npm-18.4.4-d9423b5542-10c0.zip/node_modules/@commitlint/execute-rule/",\ + "packageDependencies": [\ + ["@commitlint/execute-rule", "npm:18.4.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@commitlint/load", [\ + ["npm:18.4.4", {\ + "packageLocation": "../../../.yarn/berry/cache/@commitlint-load-npm-18.4.4-f5b98f17ad-10c0.zip/node_modules/@commitlint/load/",\ + "packageDependencies": [\ + ["@commitlint/load", "npm:18.4.4"],\ + ["@commitlint/config-validator", "npm:18.4.4"],\ + ["@commitlint/execute-rule", "npm:18.4.4"],\ + ["@commitlint/resolve-extends", "npm:18.4.4"],\ + ["@commitlint/types", "npm:18.4.4"],\ + ["chalk", "npm:4.1.2"],\ + ["cosmiconfig", "virtual:f5b98f17ad7ea81ab857071041c4ce431e85f7ad9573fd6e8cece457137e8a3cb24f7241d1c6f6a0018b320aaa8402caf4d54ddf5f10267d682064c4805d3882#npm:8.3.6"],\ + ["cosmiconfig-typescript-loader", "virtual:f5b98f17ad7ea81ab857071041c4ce431e85f7ad9573fd6e8cece457137e8a3cb24f7241d1c6f6a0018b320aaa8402caf4d54ddf5f10267d682064c4805d3882#npm:5.0.0"],\ + ["lodash.isplainobject", "npm:4.0.6"],\ + ["lodash.merge", "npm:4.6.2"],\ + ["lodash.uniq", "npm:4.5.0"],\ + ["resolve-from", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@commitlint/resolve-extends", [\ + ["npm:18.4.4", {\ + "packageLocation": "../../../.yarn/berry/cache/@commitlint-resolve-extends-npm-18.4.4-7834d28c9c-10c0.zip/node_modules/@commitlint/resolve-extends/",\ + "packageDependencies": [\ + ["@commitlint/resolve-extends", "npm:18.4.4"],\ + ["@commitlint/config-validator", "npm:18.4.4"],\ + ["@commitlint/types", "npm:18.4.4"],\ + ["import-fresh", "npm:3.3.0"],\ + ["lodash.mergewith", "npm:4.6.2"],\ + ["resolve-from", "npm:5.0.0"],\ + ["resolve-global", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@commitlint/types", [\ + ["npm:18.4.4", {\ + "packageLocation": "../../../.yarn/berry/cache/@commitlint-types-npm-18.4.4-c71e2a6ea9-10c0.zip/node_modules/@commitlint/types/",\ + "packageDependencies": [\ + ["@commitlint/types", "npm:18.4.4"],\ + ["chalk", "npm:4.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/cspell-bundled-dicts", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-cspell-bundled-dicts-npm-8.3.2-951aa74adb-10c0.zip/node_modules/@cspell/cspell-bundled-dicts/",\ + "packageDependencies": [\ + ["@cspell/cspell-bundled-dicts", "npm:8.3.2"],\ + ["@cspell/dict-ada", "npm:4.0.2"],\ + ["@cspell/dict-aws", "npm:4.0.1"],\ + ["@cspell/dict-bash", "npm:4.1.3"],\ + ["@cspell/dict-companies", "npm:3.0.29"],\ + ["@cspell/dict-cpp", "npm:5.1.1"],\ + ["@cspell/dict-cryptocurrencies", "npm:5.0.0"],\ + ["@cspell/dict-csharp", "npm:4.0.2"],\ + ["@cspell/dict-css", "npm:4.0.12"],\ + ["@cspell/dict-dart", "npm:2.0.3"],\ + ["@cspell/dict-django", "npm:4.1.0"],\ + ["@cspell/dict-docker", "npm:1.1.7"],\ + ["@cspell/dict-dotnet", "npm:5.0.0"],\ + ["@cspell/dict-elixir", "npm:4.0.3"],\ + ["@cspell/dict-en-common-misspellings", "npm:2.0.0"],\ + ["@cspell/dict-en-gb", "npm:1.1.33"],\ + ["@cspell/dict-en_us", "npm:4.3.13"],\ + ["@cspell/dict-filetypes", "npm:3.0.3"],\ + ["@cspell/dict-fonts", "npm:4.0.0"],\ + ["@cspell/dict-fsharp", "npm:1.0.1"],\ + ["@cspell/dict-fullstack", "npm:3.1.5"],\ + ["@cspell/dict-gaming-terms", "npm:1.0.4"],\ + ["@cspell/dict-git", "npm:3.0.0"],\ + ["@cspell/dict-golang", "npm:6.0.5"],\ + ["@cspell/dict-haskell", "npm:4.0.1"],\ + ["@cspell/dict-html", "npm:4.0.5"],\ + ["@cspell/dict-html-symbol-entities", "npm:4.0.0"],\ + ["@cspell/dict-java", "npm:5.0.6"],\ + ["@cspell/dict-k8s", "npm:1.0.2"],\ + ["@cspell/dict-latex", "npm:4.0.0"],\ + ["@cspell/dict-lorem-ipsum", "npm:4.0.0"],\ + ["@cspell/dict-lua", "npm:4.0.3"],\ + ["@cspell/dict-makefile", "npm:1.0.0"],\ + ["@cspell/dict-node", "npm:4.0.3"],\ + ["@cspell/dict-npm", "npm:5.0.14"],\ + ["@cspell/dict-php", "npm:4.0.5"],\ + ["@cspell/dict-powershell", "npm:5.0.3"],\ + ["@cspell/dict-public-licenses", "npm:2.0.5"],\ + ["@cspell/dict-python", "npm:4.1.11"],\ + ["@cspell/dict-r", "npm:2.0.1"],\ + ["@cspell/dict-ruby", "npm:5.0.2"],\ + ["@cspell/dict-rust", "npm:4.0.1"],\ + ["@cspell/dict-scala", "npm:5.0.0"],\ + ["@cspell/dict-software-terms", "npm:3.3.16"],\ + ["@cspell/dict-sql", "npm:2.1.3"],\ + ["@cspell/dict-svelte", "npm:1.0.2"],\ + ["@cspell/dict-swift", "npm:2.0.1"],\ + ["@cspell/dict-typescript", "npm:3.1.2"],\ + ["@cspell/dict-vue", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/cspell-json-reporter", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-cspell-json-reporter-npm-8.3.2-eb5186652c-10c0.zip/node_modules/@cspell/cspell-json-reporter/",\ + "packageDependencies": [\ + ["@cspell/cspell-json-reporter", "npm:8.3.2"],\ + ["@cspell/cspell-types", "npm:8.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/cspell-pipe", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-cspell-pipe-npm-8.3.2-eb5e202997-10c0.zip/node_modules/@cspell/cspell-pipe/",\ + "packageDependencies": [\ + ["@cspell/cspell-pipe", "npm:8.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/cspell-resolver", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-cspell-resolver-npm-8.3.2-7d4b8a8eda-10c0.zip/node_modules/@cspell/cspell-resolver/",\ + "packageDependencies": [\ + ["@cspell/cspell-resolver", "npm:8.3.2"],\ + ["global-directory", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/cspell-service-bus", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-cspell-service-bus-npm-8.3.2-cc3fbbc9bb-10c0.zip/node_modules/@cspell/cspell-service-bus/",\ + "packageDependencies": [\ + ["@cspell/cspell-service-bus", "npm:8.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/cspell-types", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-cspell-types-npm-8.3.2-1dd998a100-10c0.zip/node_modules/@cspell/cspell-types/",\ + "packageDependencies": [\ + ["@cspell/cspell-types", "npm:8.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-ada", [\ + ["npm:4.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-ada-npm-4.0.2-c712dc56f7-10c0.zip/node_modules/@cspell/dict-ada/",\ + "packageDependencies": [\ + ["@cspell/dict-ada", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-aws", [\ + ["npm:4.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-aws-npm-4.0.1-a19848023b-10c0.zip/node_modules/@cspell/dict-aws/",\ + "packageDependencies": [\ + ["@cspell/dict-aws", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-bash", [\ + ["npm:4.1.3", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-bash-npm-4.1.3-0154f2b1c9-10c0.zip/node_modules/@cspell/dict-bash/",\ + "packageDependencies": [\ + ["@cspell/dict-bash", "npm:4.1.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-companies", [\ + ["npm:3.0.29", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-companies-npm-3.0.29-18c02568a0-10c0.zip/node_modules/@cspell/dict-companies/",\ + "packageDependencies": [\ + ["@cspell/dict-companies", "npm:3.0.29"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-cpp", [\ + ["npm:5.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-cpp-npm-5.1.1-a98d0d1927-10c0.zip/node_modules/@cspell/dict-cpp/",\ + "packageDependencies": [\ + ["@cspell/dict-cpp", "npm:5.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-cryptocurrencies", [\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-cryptocurrencies-npm-5.0.0-6b630d72d9-10c0.zip/node_modules/@cspell/dict-cryptocurrencies/",\ + "packageDependencies": [\ + ["@cspell/dict-cryptocurrencies", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-csharp", [\ + ["npm:4.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-csharp-npm-4.0.2-a32d6e0e56-10c0.zip/node_modules/@cspell/dict-csharp/",\ + "packageDependencies": [\ + ["@cspell/dict-csharp", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-css", [\ + ["npm:4.0.12", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-css-npm-4.0.12-37a94c5eaa-10c0.zip/node_modules/@cspell/dict-css/",\ + "packageDependencies": [\ + ["@cspell/dict-css", "npm:4.0.12"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-dart", [\ + ["npm:2.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-dart-npm-2.0.3-6bcbb5e205-10c0.zip/node_modules/@cspell/dict-dart/",\ + "packageDependencies": [\ + ["@cspell/dict-dart", "npm:2.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-data-science", [\ + ["npm:1.0.11", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-data-science-npm-1.0.11-80d554e26f-10c0.zip/node_modules/@cspell/dict-data-science/",\ + "packageDependencies": [\ + ["@cspell/dict-data-science", "npm:1.0.11"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-django", [\ + ["npm:4.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-django-npm-4.1.0-21815268d5-10c0.zip/node_modules/@cspell/dict-django/",\ + "packageDependencies": [\ + ["@cspell/dict-django", "npm:4.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-docker", [\ + ["npm:1.1.7", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-docker-npm-1.1.7-47601b3ce1-10c0.zip/node_modules/@cspell/dict-docker/",\ + "packageDependencies": [\ + ["@cspell/dict-docker", "npm:1.1.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-dotnet", [\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-dotnet-npm-5.0.0-1021ddef52-10c0.zip/node_modules/@cspell/dict-dotnet/",\ + "packageDependencies": [\ + ["@cspell/dict-dotnet", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-elixir", [\ + ["npm:4.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-elixir-npm-4.0.3-eca50587bc-10c0.zip/node_modules/@cspell/dict-elixir/",\ + "packageDependencies": [\ + ["@cspell/dict-elixir", "npm:4.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-en-common-misspellings", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-en-common-misspellings-npm-2.0.0-7ddee0adf4-10c0.zip/node_modules/@cspell/dict-en-common-misspellings/",\ + "packageDependencies": [\ + ["@cspell/dict-en-common-misspellings", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-en-gb", [\ + ["npm:1.1.33", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-en-gb-npm-1.1.33-40b98cbc5f-10c0.zip/node_modules/@cspell/dict-en-gb/",\ + "packageDependencies": [\ + ["@cspell/dict-en-gb", "npm:1.1.33"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-en_us", [\ + ["npm:4.3.13", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-en_us-npm-4.3.13-b5f78a2dd4-10c0.zip/node_modules/@cspell/dict-en_us/",\ + "packageDependencies": [\ + ["@cspell/dict-en_us", "npm:4.3.13"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-filetypes", [\ + ["npm:3.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-filetypes-npm-3.0.3-4b30f7ab3e-10c0.zip/node_modules/@cspell/dict-filetypes/",\ + "packageDependencies": [\ + ["@cspell/dict-filetypes", "npm:3.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-fonts", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-fonts-npm-4.0.0-8980b7847b-10c0.zip/node_modules/@cspell/dict-fonts/",\ + "packageDependencies": [\ + ["@cspell/dict-fonts", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-fsharp", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-fsharp-npm-1.0.1-1e14e215b4-10c0.zip/node_modules/@cspell/dict-fsharp/",\ + "packageDependencies": [\ + ["@cspell/dict-fsharp", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-fullstack", [\ + ["npm:3.1.5", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-fullstack-npm-3.1.5-05a9bb03ad-10c0.zip/node_modules/@cspell/dict-fullstack/",\ + "packageDependencies": [\ + ["@cspell/dict-fullstack", "npm:3.1.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-gaming-terms", [\ + ["npm:1.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-gaming-terms-npm-1.0.4-ed75efc32a-10c0.zip/node_modules/@cspell/dict-gaming-terms/",\ + "packageDependencies": [\ + ["@cspell/dict-gaming-terms", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-git", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-git-npm-3.0.0-eef5fd2377-10c0.zip/node_modules/@cspell/dict-git/",\ + "packageDependencies": [\ + ["@cspell/dict-git", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-golang", [\ + ["npm:6.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-golang-npm-6.0.5-d007775efd-10c0.zip/node_modules/@cspell/dict-golang/",\ + "packageDependencies": [\ + ["@cspell/dict-golang", "npm:6.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-haskell", [\ + ["npm:4.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-haskell-npm-4.0.1-16dc237412-10c0.zip/node_modules/@cspell/dict-haskell/",\ + "packageDependencies": [\ + ["@cspell/dict-haskell", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-html", [\ + ["npm:4.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-html-npm-4.0.5-ab5ae76ecb-10c0.zip/node_modules/@cspell/dict-html/",\ + "packageDependencies": [\ + ["@cspell/dict-html", "npm:4.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-html-symbol-entities", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-html-symbol-entities-npm-4.0.0-00ba1c0d3f-10c0.zip/node_modules/@cspell/dict-html-symbol-entities/",\ + "packageDependencies": [\ + ["@cspell/dict-html-symbol-entities", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-java", [\ + ["npm:5.0.6", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-java-npm-5.0.6-cb9e3d8c4b-10c0.zip/node_modules/@cspell/dict-java/",\ + "packageDependencies": [\ + ["@cspell/dict-java", "npm:5.0.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-k8s", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-k8s-npm-1.0.2-027232d77f-10c0.zip/node_modules/@cspell/dict-k8s/",\ + "packageDependencies": [\ + ["@cspell/dict-k8s", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-latex", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-latex-npm-4.0.0-6f15ef0792-10c0.zip/node_modules/@cspell/dict-latex/",\ + "packageDependencies": [\ + ["@cspell/dict-latex", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-lorem-ipsum", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-lorem-ipsum-npm-4.0.0-e811e64680-10c0.zip/node_modules/@cspell/dict-lorem-ipsum/",\ + "packageDependencies": [\ + ["@cspell/dict-lorem-ipsum", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-lua", [\ + ["npm:4.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-lua-npm-4.0.3-fc222ad255-10c0.zip/node_modules/@cspell/dict-lua/",\ + "packageDependencies": [\ + ["@cspell/dict-lua", "npm:4.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-makefile", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-makefile-npm-1.0.0-c2c37c1d77-10c0.zip/node_modules/@cspell/dict-makefile/",\ + "packageDependencies": [\ + ["@cspell/dict-makefile", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-node", [\ + ["npm:4.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-node-npm-4.0.3-47c5cd7b47-10c0.zip/node_modules/@cspell/dict-node/",\ + "packageDependencies": [\ + ["@cspell/dict-node", "npm:4.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-npm", [\ + ["npm:5.0.14", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-npm-npm-5.0.14-c05011b6a8-10c0.zip/node_modules/@cspell/dict-npm/",\ + "packageDependencies": [\ + ["@cspell/dict-npm", "npm:5.0.14"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-php", [\ + ["npm:4.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-php-npm-4.0.5-efceb7daa7-10c0.zip/node_modules/@cspell/dict-php/",\ + "packageDependencies": [\ + ["@cspell/dict-php", "npm:4.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-powershell", [\ + ["npm:5.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-powershell-npm-5.0.3-b60ba78494-10c0.zip/node_modules/@cspell/dict-powershell/",\ + "packageDependencies": [\ + ["@cspell/dict-powershell", "npm:5.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-public-licenses", [\ + ["npm:2.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-public-licenses-npm-2.0.5-aca88f034c-10c0.zip/node_modules/@cspell/dict-public-licenses/",\ + "packageDependencies": [\ + ["@cspell/dict-public-licenses", "npm:2.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-python", [\ + ["npm:4.1.11", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-python-npm-4.1.11-8d4dacedf6-10c0.zip/node_modules/@cspell/dict-python/",\ + "packageDependencies": [\ + ["@cspell/dict-python", "npm:4.1.11"],\ + ["@cspell/dict-data-science", "npm:1.0.11"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-r", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-r-npm-2.0.1-7236acbd8c-10c0.zip/node_modules/@cspell/dict-r/",\ + "packageDependencies": [\ + ["@cspell/dict-r", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-ruby", [\ + ["npm:5.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-ruby-npm-5.0.2-0dec0bb03e-10c0.zip/node_modules/@cspell/dict-ruby/",\ + "packageDependencies": [\ + ["@cspell/dict-ruby", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-rust", [\ + ["npm:4.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-rust-npm-4.0.1-79006ee35e-10c0.zip/node_modules/@cspell/dict-rust/",\ + "packageDependencies": [\ + ["@cspell/dict-rust", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-scala", [\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-scala-npm-5.0.0-3487b27d62-10c0.zip/node_modules/@cspell/dict-scala/",\ + "packageDependencies": [\ + ["@cspell/dict-scala", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-software-terms", [\ + ["npm:3.3.16", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-software-terms-npm-3.3.16-d2e144b9a7-10c0.zip/node_modules/@cspell/dict-software-terms/",\ + "packageDependencies": [\ + ["@cspell/dict-software-terms", "npm:3.3.16"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-sql", [\ + ["npm:2.1.3", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-sql-npm-2.1.3-efe4b04a44-10c0.zip/node_modules/@cspell/dict-sql/",\ + "packageDependencies": [\ + ["@cspell/dict-sql", "npm:2.1.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-svelte", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-svelte-npm-1.0.2-6709770ee4-10c0.zip/node_modules/@cspell/dict-svelte/",\ + "packageDependencies": [\ + ["@cspell/dict-svelte", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-swift", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-swift-npm-2.0.1-efa2a5b9cb-10c0.zip/node_modules/@cspell/dict-swift/",\ + "packageDependencies": [\ + ["@cspell/dict-swift", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-typescript", [\ + ["npm:3.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-typescript-npm-3.1.2-929df6b99b-10c0.zip/node_modules/@cspell/dict-typescript/",\ + "packageDependencies": [\ + ["@cspell/dict-typescript", "npm:3.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dict-vue", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dict-vue-npm-3.0.0-99a5f142a5-10c0.zip/node_modules/@cspell/dict-vue/",\ + "packageDependencies": [\ + ["@cspell/dict-vue", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/dynamic-import", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-dynamic-import-npm-8.3.2-a94afddc43-10c0.zip/node_modules/@cspell/dynamic-import/",\ + "packageDependencies": [\ + ["@cspell/dynamic-import", "npm:8.3.2"],\ + ["import-meta-resolve", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@cspell/strong-weak-map", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@cspell-strong-weak-map-npm-8.3.2-a9974430bd-10c0.zip/node_modules/@cspell/strong-weak-map/",\ + "packageDependencies": [\ + ["@cspell/strong-weak-map", "npm:8.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@dependents/detective-less", [\ + ["npm:3.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@dependents-detective-less-npm-3.0.2-eb59b6f173-10c0.zip/node_modules/@dependents/detective-less/",\ + "packageDependencies": [\ + ["@dependents/detective-less", "npm:3.0.2"],\ + ["gonzales-pe", "npm:4.3.0"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@eslint-community/eslint-utils", [\ + ["npm:4.4.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-10c0.zip/node_modules/@eslint-community/eslint-utils/",\ + "packageDependencies": [\ + ["@eslint-community/eslint-utils", "npm:4.4.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:6eec398a4132b5372ea5ffc0bc36d4c81602b7e444a89685d0d958016d8fd53df5c0c97c6a8bf99951469e2c6c06135dd192e9309f6e39b1a4c85e0faabe1f6b#npm:4.4.0", {\ + "packageLocation": "./.yarn/__virtual__/@eslint-community-eslint-utils-virtual-719be7711d/4/.yarn/berry/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-10c0.zip/node_modules/@eslint-community/eslint-utils/",\ + "packageDependencies": [\ + ["@eslint-community/eslint-utils", "virtual:6eec398a4132b5372ea5ffc0bc36d4c81602b7e444a89685d0d958016d8fd53df5c0c97c6a8bf99951469e2c6c06135dd192e9309f6e39b1a4c85e0faabe1f6b#npm:4.4.0"],\ + ["@types/eslint", null],\ + ["eslint", "npm:8.56.0"],\ + ["eslint-visitor-keys", "npm:3.4.3"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@eslint-community/regexpp", [\ + ["npm:4.10.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@eslint-community-regexpp-npm-4.10.0-6bfb984c81-10c0.zip/node_modules/@eslint-community/regexpp/",\ + "packageDependencies": [\ + ["@eslint-community/regexpp", "npm:4.10.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@eslint/eslintrc", [\ + ["npm:2.1.4", {\ + "packageLocation": "../../../.yarn/berry/cache/@eslint-eslintrc-npm-2.1.4-1ff4b5f908-10c0.zip/node_modules/@eslint/eslintrc/",\ + "packageDependencies": [\ + ["@eslint/eslintrc", "npm:2.1.4"],\ + ["ajv", "npm:6.12.6"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["espree", "npm:9.6.1"],\ + ["globals", "npm:13.24.0"],\ + ["ignore", "npm:5.3.0"],\ + ["import-fresh", "npm:3.3.0"],\ + ["js-yaml", "npm:4.1.0"],\ + ["minimatch", "npm:3.1.2"],\ + ["strip-json-comments", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@eslint/js", [\ + ["npm:8.56.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@eslint-js-npm-8.56.0-b1de08cbff-10c0.zip/node_modules/@eslint/js/",\ + "packageDependencies": [\ + ["@eslint/js", "npm:8.56.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@fast-check/ava", [\ + ["npm:1.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@fast-check-ava-npm-1.2.1-b39e961243-10c0.zip/node_modules/@fast-check/ava/",\ + "packageDependencies": [\ + ["@fast-check/ava", "npm:1.2.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:1.2.1", {\ + "packageLocation": "./.yarn/__virtual__/@fast-check-ava-virtual-2647c39898/4/.yarn/berry/cache/@fast-check-ava-npm-1.2.1-b39e961243-10c0.zip/node_modules/@fast-check/ava/",\ + "packageDependencies": [\ + ["@fast-check/ava", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:1.2.1"],\ + ["@types/ava", null],\ + ["ava", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.1"],\ + ["fast-check", "npm:3.15.0"]\ + ],\ + "packagePeers": [\ + "@types/ava",\ + "ava"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@humanwhocodes/config-array", [\ + ["npm:0.11.13", {\ + "packageLocation": "../../../.yarn/berry/cache/@humanwhocodes-config-array-npm-0.11.13-12314014f2-10c0.zip/node_modules/@humanwhocodes/config-array/",\ + "packageDependencies": [\ + ["@humanwhocodes/config-array", "npm:0.11.13"],\ + ["@humanwhocodes/object-schema", "npm:2.0.1"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["minimatch", "npm:3.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@humanwhocodes/module-importer", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@humanwhocodes-module-importer-npm-1.0.1-9d07ed2e4a-10c0.zip/node_modules/@humanwhocodes/module-importer/",\ + "packageDependencies": [\ + ["@humanwhocodes/module-importer", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@humanwhocodes/object-schema", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@humanwhocodes-object-schema-npm-2.0.1-c23364bbfc-10c0.zip/node_modules/@humanwhocodes/object-schema/",\ + "packageDependencies": [\ + ["@humanwhocodes/object-schema", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@hutson/parse-repository-url", [\ + ["npm:3.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@hutson-parse-repository-url-npm-3.0.2-ae5ef1b671-10c0.zip/node_modules/@hutson/parse-repository-url/",\ + "packageDependencies": [\ + ["@hutson/parse-repository-url", "npm:3.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@isaacs/cliui", [\ + ["npm:8.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@isaacs-cliui-npm-8.0.2-f4364666d5-10c0.zip/node_modules/@isaacs/cliui/",\ + "packageDependencies": [\ + ["@isaacs/cliui", "npm:8.0.2"],\ + ["string-width", "npm:5.1.2"],\ + ["string-width-cjs", [\ + "string-width",\ + "npm:4.2.3"\ + ]],\ + ["strip-ansi", "npm:7.1.0"],\ + ["strip-ansi-cjs", [\ + "strip-ansi",\ + "npm:6.0.1"\ + ]],\ + ["wrap-ansi", "npm:8.1.0"],\ + ["wrap-ansi-cjs", [\ + "wrap-ansi",\ + "npm:7.0.0"\ + ]]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@istanbuljs/schema", [\ + ["npm:0.1.3", {\ + "packageLocation": "../../../.yarn/berry/cache/@istanbuljs-schema-npm-0.1.3-466bd3eaaa-10c0.zip/node_modules/@istanbuljs/schema/",\ + "packageDependencies": [\ + ["@istanbuljs/schema", "npm:0.1.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@jridgewell/resolve-uri", [\ + ["npm:3.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@jridgewell-resolve-uri-npm-3.1.1-aa2de3f210-10c0.zip/node_modules/@jridgewell/resolve-uri/",\ + "packageDependencies": [\ + ["@jridgewell/resolve-uri", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@jridgewell/sourcemap-codec", [\ + ["npm:1.4.15", {\ + "packageLocation": "../../../.yarn/berry/cache/@jridgewell-sourcemap-codec-npm-1.4.15-a055fb62cf-10c0.zip/node_modules/@jridgewell/sourcemap-codec/",\ + "packageDependencies": [\ + ["@jridgewell/sourcemap-codec", "npm:1.4.15"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@jridgewell/trace-mapping", [\ + ["npm:0.3.20", {\ + "packageLocation": "../../../.yarn/berry/cache/@jridgewell-trace-mapping-npm-0.3.20-d90f282910-10c0.zip/node_modules/@jridgewell/trace-mapping/",\ + "packageDependencies": [\ + ["@jridgewell/trace-mapping", "npm:0.3.20"],\ + ["@jridgewell/resolve-uri", "npm:3.1.1"],\ + ["@jridgewell/sourcemap-codec", "npm:1.4.15"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@mapbox/node-pre-gyp", [\ + ["npm:1.0.11", {\ + "packageLocation": "../../../.yarn/berry/cache/@mapbox-node-pre-gyp-npm-1.0.11-5547f15a2b-10c0.zip/node_modules/@mapbox/node-pre-gyp/",\ + "packageDependencies": [\ + ["@mapbox/node-pre-gyp", "npm:1.0.11"],\ + ["detect-libc", "npm:2.0.2"],\ + ["https-proxy-agent", "npm:5.0.1"],\ + ["make-dir", "npm:3.1.0"],\ + ["node-fetch", "virtual:5547f15a2bb3d361d141532d43f94523f31e9edfe533f8367b3e26e300194e2978be03f56c09e100afcfee4c02b7fbe13c6ffcf58c613b457a86da522a2979f2#npm:2.7.0"],\ + ["nopt", "npm:5.0.0"],\ + ["npmlog", "npm:5.0.1"],\ + ["rimraf", "npm:3.0.2"],\ + ["semver", "npm:7.5.4"],\ + ["tar", "npm:6.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@microsoft/api-documenter", [\ + ["npm:7.23.16", {\ + "packageLocation": "../../../.yarn/berry/cache/@microsoft-api-documenter-npm-7.23.16-916b7e529e-10c0.zip/node_modules/@microsoft/api-documenter/",\ + "packageDependencies": [\ + ["@microsoft/api-documenter", "npm:7.23.16"],\ + ["@microsoft/api-extractor-model", "npm:7.28.4"],\ + ["@microsoft/tsdoc", "npm:0.14.2"],\ + ["@rushstack/node-core-library", "virtual:4e9ad17c85095d4c9331f459fba57fb5b9a6171d5dd1cfdaf8e6813eff93c55eca427b0fc1e867f1d2dc84f40484dd7139d10b41a2fbf8671e8f05335366569d#npm:3.63.0"],\ + ["@rushstack/ts-command-line", "npm:4.17.1"],\ + ["colors", "npm:1.2.5"],\ + ["js-yaml", "npm:3.13.1"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@microsoft/api-extractor", [\ + ["npm:7.39.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@microsoft-api-extractor-npm-7.39.1-ff49b8ae1b-10c0.zip/node_modules/@microsoft/api-extractor/",\ + "packageDependencies": [\ + ["@microsoft/api-extractor", "npm:7.39.1"],\ + ["@microsoft/api-extractor-model", "npm:7.28.4"],\ + ["@microsoft/tsdoc", "npm:0.14.2"],\ + ["@microsoft/tsdoc-config", "npm:0.16.2"],\ + ["@rushstack/node-core-library", "virtual:4e9ad17c85095d4c9331f459fba57fb5b9a6171d5dd1cfdaf8e6813eff93c55eca427b0fc1e867f1d2dc84f40484dd7139d10b41a2fbf8671e8f05335366569d#npm:3.63.0"],\ + ["@rushstack/rig-package", "npm:0.5.1"],\ + ["@rushstack/ts-command-line", "npm:4.17.1"],\ + ["colors", "npm:1.2.5"],\ + ["lodash", "npm:4.17.21"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"],\ + ["semver", "npm:7.5.4"],\ + ["source-map", "npm:0.6.1"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@microsoft/api-extractor-model", [\ + ["npm:7.28.4", {\ + "packageLocation": "../../../.yarn/berry/cache/@microsoft-api-extractor-model-npm-7.28.4-4e9ad17c85-10c0.zip/node_modules/@microsoft/api-extractor-model/",\ + "packageDependencies": [\ + ["@microsoft/api-extractor-model", "npm:7.28.4"],\ + ["@microsoft/tsdoc", "npm:0.14.2"],\ + ["@microsoft/tsdoc-config", "npm:0.16.2"],\ + ["@rushstack/node-core-library", "virtual:4e9ad17c85095d4c9331f459fba57fb5b9a6171d5dd1cfdaf8e6813eff93c55eca427b0fc1e867f1d2dc84f40484dd7139d10b41a2fbf8671e8f05335366569d#npm:3.63.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@microsoft/tsdoc", [\ + ["npm:0.14.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@microsoft-tsdoc-npm-0.14.2-9988282153-10c0.zip/node_modules/@microsoft/tsdoc/",\ + "packageDependencies": [\ + ["@microsoft/tsdoc", "npm:0.14.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@microsoft/tsdoc-config", [\ + ["npm:0.16.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@microsoft-tsdoc-config-npm-0.16.2-30fd115d09-10c0.zip/node_modules/@microsoft/tsdoc-config/",\ + "packageDependencies": [\ + ["@microsoft/tsdoc-config", "npm:0.16.2"],\ + ["@microsoft/tsdoc", "npm:0.14.2"],\ + ["ajv", "npm:6.12.6"],\ + ["jju", "npm:1.4.0"],\ + ["resolve", "patch:resolve@npm%3A1.19.0#optional!builtin::version=1.19.0&hash=c3c19d"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@nodelib/fs.scandir", [\ + ["npm:2.1.5", {\ + "packageLocation": "../../../.yarn/berry/cache/@nodelib-fs.scandir-npm-2.1.5-89c67370dd-10c0.zip/node_modules/@nodelib/fs.scandir/",\ + "packageDependencies": [\ + ["@nodelib/fs.scandir", "npm:2.1.5"],\ + ["@nodelib/fs.stat", "npm:2.0.5"],\ + ["run-parallel", "npm:1.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@nodelib/fs.stat", [\ + ["npm:2.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/@nodelib-fs.stat-npm-2.0.5-01f4dd3030-10c0.zip/node_modules/@nodelib/fs.stat/",\ + "packageDependencies": [\ + ["@nodelib/fs.stat", "npm:2.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@nodelib/fs.walk", [\ + ["npm:1.2.8", {\ + "packageLocation": "../../../.yarn/berry/cache/@nodelib-fs.walk-npm-1.2.8-b4a89da548-10c0.zip/node_modules/@nodelib/fs.walk/",\ + "packageDependencies": [\ + ["@nodelib/fs.walk", "npm:1.2.8"],\ + ["@nodelib/fs.scandir", "npm:2.1.5"],\ + ["fastq", "npm:1.16.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@npmcli/agent", [\ + ["npm:2.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@npmcli-agent-npm-2.2.0-cf04e8a830-10c0.zip/node_modules/@npmcli/agent/",\ + "packageDependencies": [\ + ["@npmcli/agent", "npm:2.2.0"],\ + ["agent-base", "npm:7.1.0"],\ + ["http-proxy-agent", "npm:7.0.0"],\ + ["https-proxy-agent", "npm:7.0.2"],\ + ["lru-cache", "npm:10.1.0"],\ + ["socks-proxy-agent", "npm:8.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@npmcli/fs", [\ + ["npm:3.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@npmcli-fs-npm-3.1.0-0844a57978-10c0.zip/node_modules/@npmcli/fs/",\ + "packageDependencies": [\ + ["@npmcli/fs", "npm:3.1.0"],\ + ["semver", "npm:7.5.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@pkgjs/parseargs", [\ + ["npm:0.11.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@pkgjs-parseargs-npm-0.11.0-cd2a3fe948-10c0.zip/node_modules/@pkgjs/parseargs/",\ + "packageDependencies": [\ + ["@pkgjs/parseargs", "npm:0.11.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@playwright/test", [\ + ["npm:1.40.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@playwright-test-npm-1.40.1-174ee2ce77-10c0.zip/node_modules/@playwright/test/",\ + "packageDependencies": [\ + ["@playwright/test", "npm:1.40.1"],\ + ["playwright", "npm:1.40.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/plugin-alias", [\ + ["npm:5.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@rollup-plugin-alias-npm-5.1.0-5f8a6a898f-10c0.zip/node_modules/@rollup/plugin-alias/",\ + "packageDependencies": [\ + ["@rollup/plugin-alias", "npm:5.1.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:5.1.0", {\ + "packageLocation": "./.yarn/__virtual__/@rollup-plugin-alias-virtual-f879b1736f/4/.yarn/berry/cache/@rollup-plugin-alias-npm-5.1.0-5f8a6a898f-10c0.zip/node_modules/@rollup/plugin-alias/",\ + "packageDependencies": [\ + ["@rollup/plugin-alias", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:5.1.0"],\ + ["@types/rollup", null],\ + ["rollup", "npm:4.9.3"],\ + ["slash", "npm:4.0.0"]\ + ],\ + "packagePeers": [\ + "@types/rollup",\ + "rollup"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/plugin-commonjs", [\ + ["npm:25.0.7", {\ + "packageLocation": "../../../.yarn/berry/cache/@rollup-plugin-commonjs-npm-25.0.7-f5b19139ea-10c0.zip/node_modules/@rollup/plugin-commonjs/",\ + "packageDependencies": [\ + ["@rollup/plugin-commonjs", "npm:25.0.7"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:25.0.7", {\ + "packageLocation": "./.yarn/__virtual__/@rollup-plugin-commonjs-virtual-3623c8d78a/4/.yarn/berry/cache/@rollup-plugin-commonjs-npm-25.0.7-f5b19139ea-10c0.zip/node_modules/@rollup/plugin-commonjs/",\ + "packageDependencies": [\ + ["@rollup/plugin-commonjs", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:25.0.7"],\ + ["@rollup/pluginutils", "virtual:3623c8d78a2fc97e56a11d9e7e49cd7ea0f8a01d4711968e51f8cbce2d83f86ae56dda9f9578958ba90c1b1ff01e755a070907323dc00549c03d3524be731e8c#npm:5.1.0"],\ + ["@types/rollup", null],\ + ["commondir", "npm:1.0.1"],\ + ["estree-walker", "npm:2.0.2"],\ + ["glob", "npm:8.1.0"],\ + ["is-reference", "npm:1.2.1"],\ + ["magic-string", "npm:0.30.5"],\ + ["rollup", "npm:4.9.3"]\ + ],\ + "packagePeers": [\ + "@types/rollup",\ + "rollup"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/plugin-node-resolve", [\ + ["npm:15.2.3", {\ + "packageLocation": "../../../.yarn/berry/cache/@rollup-plugin-node-resolve-npm-15.2.3-f49fe9c656-10c0.zip/node_modules/@rollup/plugin-node-resolve/",\ + "packageDependencies": [\ + ["@rollup/plugin-node-resolve", "npm:15.2.3"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:15.2.3", {\ + "packageLocation": "./.yarn/__virtual__/@rollup-plugin-node-resolve-virtual-ddb46c60c0/4/.yarn/berry/cache/@rollup-plugin-node-resolve-npm-15.2.3-f49fe9c656-10c0.zip/node_modules/@rollup/plugin-node-resolve/",\ + "packageDependencies": [\ + ["@rollup/plugin-node-resolve", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:15.2.3"],\ + ["@rollup/pluginutils", "virtual:3623c8d78a2fc97e56a11d9e7e49cd7ea0f8a01d4711968e51f8cbce2d83f86ae56dda9f9578958ba90c1b1ff01e755a070907323dc00549c03d3524be731e8c#npm:5.1.0"],\ + ["@types/resolve", "npm:1.20.2"],\ + ["@types/rollup", null],\ + ["deepmerge", "npm:4.3.1"],\ + ["is-builtin-module", "npm:3.2.1"],\ + ["is-module", "npm:1.0.0"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"],\ + ["rollup", "npm:4.9.3"]\ + ],\ + "packagePeers": [\ + "@types/rollup",\ + "rollup"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/pluginutils", [\ + ["npm:4.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@rollup-pluginutils-npm-4.2.1-0f52a5eba2-10c0.zip/node_modules/@rollup/pluginutils/",\ + "packageDependencies": [\ + ["@rollup/pluginutils", "npm:4.2.1"],\ + ["estree-walker", "npm:2.0.2"],\ + ["picomatch", "npm:2.3.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@rollup-pluginutils-npm-5.1.0-6939820ef8-10c0.zip/node_modules/@rollup/pluginutils/",\ + "packageDependencies": [\ + ["@rollup/pluginutils", "npm:5.1.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:3623c8d78a2fc97e56a11d9e7e49cd7ea0f8a01d4711968e51f8cbce2d83f86ae56dda9f9578958ba90c1b1ff01e755a070907323dc00549c03d3524be731e8c#npm:5.1.0", {\ + "packageLocation": "./.yarn/__virtual__/@rollup-pluginutils-virtual-12cea79c63/4/.yarn/berry/cache/@rollup-pluginutils-npm-5.1.0-6939820ef8-10c0.zip/node_modules/@rollup/pluginutils/",\ + "packageDependencies": [\ + ["@rollup/pluginutils", "virtual:3623c8d78a2fc97e56a11d9e7e49cd7ea0f8a01d4711968e51f8cbce2d83f86ae56dda9f9578958ba90c1b1ff01e755a070907323dc00549c03d3524be731e8c#npm:5.1.0"],\ + ["@types/estree", "npm:1.0.5"],\ + ["@types/rollup", null],\ + ["estree-walker", "npm:2.0.2"],\ + ["picomatch", "npm:2.3.1"],\ + ["rollup", "npm:4.9.3"]\ + ],\ + "packagePeers": [\ + "@types/rollup",\ + "rollup"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-android-arm-eabi", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-android-arm-eabi-npm-4.9.3-388790ae16/node_modules/@rollup/rollup-android-arm-eabi/",\ + "packageDependencies": [\ + ["@rollup/rollup-android-arm-eabi", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-android-arm64", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-android-arm64-npm-4.9.3-1bc14afa9a/node_modules/@rollup/rollup-android-arm64/",\ + "packageDependencies": [\ + ["@rollup/rollup-android-arm64", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-darwin-arm64", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-darwin-arm64-npm-4.9.3-efca80b098/node_modules/@rollup/rollup-darwin-arm64/",\ + "packageDependencies": [\ + ["@rollup/rollup-darwin-arm64", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-darwin-x64", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-darwin-x64-npm-4.9.3-6da7490d70/node_modules/@rollup/rollup-darwin-x64/",\ + "packageDependencies": [\ + ["@rollup/rollup-darwin-x64", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-linux-arm-gnueabihf", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-arm-gnueabihf-npm-4.9.3-16477bd780/node_modules/@rollup/rollup-linux-arm-gnueabihf/",\ + "packageDependencies": [\ + ["@rollup/rollup-linux-arm-gnueabihf", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-linux-arm64-gnu", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-arm64-gnu-npm-4.9.3-a080278b46/node_modules/@rollup/rollup-linux-arm64-gnu/",\ + "packageDependencies": [\ + ["@rollup/rollup-linux-arm64-gnu", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-linux-arm64-musl", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-arm64-musl-npm-4.9.3-d8d1e3cf59/node_modules/@rollup/rollup-linux-arm64-musl/",\ + "packageDependencies": [\ + ["@rollup/rollup-linux-arm64-musl", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-linux-riscv64-gnu", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-riscv64-gnu-npm-4.9.3-d59af58936/node_modules/@rollup/rollup-linux-riscv64-gnu/",\ + "packageDependencies": [\ + ["@rollup/rollup-linux-riscv64-gnu", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-linux-x64-gnu", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-x64-gnu-npm-4.9.3-1cf53c0ea3/node_modules/@rollup/rollup-linux-x64-gnu/",\ + "packageDependencies": [\ + ["@rollup/rollup-linux-x64-gnu", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-linux-x64-musl", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-linux-x64-musl-npm-4.9.3-6dfe52c6ae/node_modules/@rollup/rollup-linux-x64-musl/",\ + "packageDependencies": [\ + ["@rollup/rollup-linux-x64-musl", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-win32-arm64-msvc", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-win32-arm64-msvc-npm-4.9.3-479f7c7d96/node_modules/@rollup/rollup-win32-arm64-msvc/",\ + "packageDependencies": [\ + ["@rollup/rollup-win32-arm64-msvc", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-win32-ia32-msvc", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-win32-ia32-msvc-npm-4.9.3-41867a523d/node_modules/@rollup/rollup-win32-ia32-msvc/",\ + "packageDependencies": [\ + ["@rollup/rollup-win32-ia32-msvc", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rollup/rollup-win32-x64-msvc", [\ + ["npm:4.9.3", {\ + "packageLocation": "./.yarn/unplugged/@rollup-rollup-win32-x64-msvc-npm-4.9.3-32c6a3b65b/node_modules/@rollup/rollup-win32-x64-msvc/",\ + "packageDependencies": [\ + ["@rollup/rollup-win32-x64-msvc", "npm:4.9.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rushstack/node-core-library", [\ + ["npm:3.63.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@rushstack-node-core-library-npm-3.63.0-0b93d6dab8-10c0.zip/node_modules/@rushstack/node-core-library/",\ + "packageDependencies": [\ + ["@rushstack/node-core-library", "npm:3.63.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:4e9ad17c85095d4c9331f459fba57fb5b9a6171d5dd1cfdaf8e6813eff93c55eca427b0fc1e867f1d2dc84f40484dd7139d10b41a2fbf8671e8f05335366569d#npm:3.63.0", {\ + "packageLocation": "./.yarn/__virtual__/@rushstack-node-core-library-virtual-59c9c9a071/4/.yarn/berry/cache/@rushstack-node-core-library-npm-3.63.0-0b93d6dab8-10c0.zip/node_modules/@rushstack/node-core-library/",\ + "packageDependencies": [\ + ["@rushstack/node-core-library", "virtual:4e9ad17c85095d4c9331f459fba57fb5b9a6171d5dd1cfdaf8e6813eff93c55eca427b0fc1e867f1d2dc84f40484dd7139d10b41a2fbf8671e8f05335366569d#npm:3.63.0"],\ + ["@types/node", null],\ + ["colors", "npm:1.2.5"],\ + ["fs-extra", "npm:7.0.1"],\ + ["import-lazy", "npm:4.0.0"],\ + ["jju", "npm:1.4.0"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"],\ + ["semver", "npm:7.5.4"],\ + ["z-schema", "npm:5.0.5"]\ + ],\ + "packagePeers": [\ + "@types/node"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rushstack/rig-package", [\ + ["npm:0.5.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@rushstack-rig-package-npm-0.5.1-48ae3999d4-10c0.zip/node_modules/@rushstack/rig-package/",\ + "packageDependencies": [\ + ["@rushstack/rig-package", "npm:0.5.1"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"],\ + ["strip-json-comments", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@rushstack/ts-command-line", [\ + ["npm:4.17.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@rushstack-ts-command-line-npm-4.17.1-479335d0b4-10c0.zip/node_modules/@rushstack/ts-command-line/",\ + "packageDependencies": [\ + ["@rushstack/ts-command-line", "npm:4.17.1"],\ + ["@types/argparse", "npm:1.0.38"],\ + ["argparse", "npm:1.0.10"],\ + ["colors", "npm:1.2.5"],\ + ["string-argv", "npm:0.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@sindresorhus/merge-streams", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@sindresorhus-merge-streams-npm-1.0.0-2ae6684f8f-10c0.zip/node_modules/@sindresorhus/merge-streams/",\ + "packageDependencies": [\ + ["@sindresorhus/merge-streams", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@tokenizer/token", [\ + ["npm:0.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@tokenizer-token-npm-0.3.0-4441352cc5-10c0.zip/node_modules/@tokenizer/token/",\ + "packageDependencies": [\ + ["@tokenizer/token", "npm:0.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/argparse", [\ + ["npm:1.0.38", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-argparse-npm-1.0.38-657c15204c-10c0.zip/node_modules/@types/argparse/",\ + "packageDependencies": [\ + ["@types/argparse", "npm:1.0.38"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/bn.js", [\ + ["npm:5.1.5", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-bn.js-npm-5.1.5-c2195eccd3-10c0.zip/node_modules/@types/bn.js/",\ + "packageDependencies": [\ + ["@types/bn.js", "npm:5.1.5"],\ + ["@types/node", "npm:20.10.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/body-parser", [\ + ["npm:1.19.5", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-body-parser-npm-1.19.5-97fb106976-10c0.zip/node_modules/@types/body-parser/",\ + "packageDependencies": [\ + ["@types/body-parser", "npm:1.19.5"],\ + ["@types/connect", "npm:3.4.38"],\ + ["@types/node", "npm:20.10.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/connect", [\ + ["npm:3.4.38", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-connect-npm-3.4.38-a8a4c38337-10c0.zip/node_modules/@types/connect/",\ + "packageDependencies": [\ + ["@types/connect", "npm:3.4.38"],\ + ["@types/node", "npm:20.10.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/elliptic", [\ + ["npm:6.4.18", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-elliptic-npm-6.4.18-07db1177bc-10c0.zip/node_modules/@types/elliptic/",\ + "packageDependencies": [\ + ["@types/elliptic", "npm:6.4.18"],\ + ["@types/bn.js", "npm:5.1.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/estree", [\ + ["npm:1.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-estree-npm-1.0.5-5b7faed3b4-10c0.zip/node_modules/@types/estree/",\ + "packageDependencies": [\ + ["@types/estree", "npm:1.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/express", [\ + ["npm:4.17.21", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-express-npm-4.17.21-be92a0245e-10c0.zip/node_modules/@types/express/",\ + "packageDependencies": [\ + ["@types/express", "npm:4.17.21"],\ + ["@types/body-parser", "npm:1.19.5"],\ + ["@types/express-serve-static-core", "npm:4.17.41"],\ + ["@types/qs", "npm:6.9.11"],\ + ["@types/serve-static", "npm:1.15.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/express-serve-static-core", [\ + ["npm:4.17.41", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-express-serve-static-core-npm-4.17.41-7d196a92fa-10c0.zip/node_modules/@types/express-serve-static-core/",\ + "packageDependencies": [\ + ["@types/express-serve-static-core", "npm:4.17.41"],\ + ["@types/node", "npm:20.10.6"],\ + ["@types/qs", "npm:6.9.11"],\ + ["@types/range-parser", "npm:1.2.7"],\ + ["@types/send", "npm:0.17.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/http-errors", [\ + ["npm:2.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-http-errors-npm-2.0.4-8b39ca5d7c-10c0.zip/node_modules/@types/http-errors/",\ + "packageDependencies": [\ + ["@types/http-errors", "npm:2.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/istanbul-lib-coverage", [\ + ["npm:2.0.6", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-istanbul-lib-coverage-npm-2.0.6-2ea31fda9c-10c0.zip/node_modules/@types/istanbul-lib-coverage/",\ + "packageDependencies": [\ + ["@types/istanbul-lib-coverage", "npm:2.0.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/json-schema", [\ + ["npm:7.0.15", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-json-schema-npm-7.0.15-fd16381786-10c0.zip/node_modules/@types/json-schema/",\ + "packageDependencies": [\ + ["@types/json-schema", "npm:7.0.15"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/json5", [\ + ["npm:0.0.29", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-json5-npm-0.0.29-f63a7916bd-10c0.zip/node_modules/@types/json5/",\ + "packageDependencies": [\ + ["@types/json5", "npm:0.0.29"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/mime", [\ + ["npm:1.3.5", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-mime-npm-1.3.5-48d28990db-10c0.zip/node_modules/@types/mime/",\ + "packageDependencies": [\ + ["@types/mime", "npm:1.3.5"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-mime-npm-3.0.4-5cb286d662-10c0.zip/node_modules/@types/mime/",\ + "packageDependencies": [\ + ["@types/mime", "npm:3.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/minimist", [\ + ["npm:1.2.5", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-minimist-npm-1.2.5-c85664a9d8-10c0.zip/node_modules/@types/minimist/",\ + "packageDependencies": [\ + ["@types/minimist", "npm:1.2.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/node", [\ + ["npm:20.10.6", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-node-npm-20.10.6-59a7d708ba-10c0.zip/node_modules/@types/node/",\ + "packageDependencies": [\ + ["@types/node", "npm:20.10.6"],\ + ["undici-types", "npm:5.26.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/normalize-package-data", [\ + ["npm:2.4.4", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-normalize-package-data-npm-2.4.4-676a8ba353-10c0.zip/node_modules/@types/normalize-package-data/",\ + "packageDependencies": [\ + ["@types/normalize-package-data", "npm:2.4.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/qs", [\ + ["npm:6.9.11", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-qs-npm-6.9.11-e12802ac61-10c0.zip/node_modules/@types/qs/",\ + "packageDependencies": [\ + ["@types/qs", "npm:6.9.11"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/range-parser", [\ + ["npm:1.2.7", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-range-parser-npm-1.2.7-a83c0b6429-10c0.zip/node_modules/@types/range-parser/",\ + "packageDependencies": [\ + ["@types/range-parser", "npm:1.2.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/resolve", [\ + ["npm:1.20.2", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-resolve-npm-1.20.2-5fccb2ad46-10c0.zip/node_modules/@types/resolve/",\ + "packageDependencies": [\ + ["@types/resolve", "npm:1.20.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/semver", [\ + ["npm:7.5.6", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-semver-npm-7.5.6-9d2637fc95-10c0.zip/node_modules/@types/semver/",\ + "packageDependencies": [\ + ["@types/semver", "npm:7.5.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/send", [\ + ["npm:0.17.4", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-send-npm-0.17.4-9d7c55577f-10c0.zip/node_modules/@types/send/",\ + "packageDependencies": [\ + ["@types/send", "npm:0.17.4"],\ + ["@types/mime", "npm:1.3.5"],\ + ["@types/node", "npm:20.10.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@types/serve-static", [\ + ["npm:1.15.5", {\ + "packageLocation": "../../../.yarn/berry/cache/@types-serve-static-npm-1.15.5-b911ffc092-10c0.zip/node_modules/@types/serve-static/",\ + "packageDependencies": [\ + ["@types/serve-static", "npm:1.15.5"],\ + ["@types/http-errors", "npm:2.0.4"],\ + ["@types/mime", "npm:3.0.4"],\ + ["@types/node", "npm:20.10.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/eslint-plugin", [\ + ["npm:6.18.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-eslint-plugin-npm-6.18.1-afb406fb8f-10c0.zip/node_modules/@typescript-eslint/eslint-plugin/",\ + "packageDependencies": [\ + ["@typescript-eslint/eslint-plugin", "npm:6.18.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.18.1", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-eslint-plugin-virtual-0c80d6cec1/4/.yarn/berry/cache/@typescript-eslint-eslint-plugin-npm-6.18.1-afb406fb8f-10c0.zip/node_modules/@typescript-eslint/eslint-plugin/",\ + "packageDependencies": [\ + ["@typescript-eslint/eslint-plugin", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.18.1"],\ + ["@eslint-community/regexpp", "npm:4.10.0"],\ + ["@types/eslint", null],\ + ["@types/typescript", null],\ + ["@types/typescript-eslint__parser", null],\ + ["@typescript-eslint/parser", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.17.0"],\ + ["@typescript-eslint/scope-manager", "npm:6.18.1"],\ + ["@typescript-eslint/type-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1"],\ + ["@typescript-eslint/utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1"],\ + ["@typescript-eslint/visitor-keys", "npm:6.18.1"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["eslint", "npm:8.56.0"],\ + ["graphemer", "npm:1.4.0"],\ + ["ignore", "npm:5.3.0"],\ + ["natural-compare", "npm:1.4.0"],\ + ["semver", "npm:7.5.4"],\ + ["ts-api-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:1.0.3"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "@types/typescript-eslint__parser",\ + "@types/typescript",\ + "@typescript-eslint/parser",\ + "eslint",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/parser", [\ + ["npm:6.17.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-parser-npm-6.17.0-c7b54d3943-10c0.zip/node_modules/@typescript-eslint/parser/",\ + "packageDependencies": [\ + ["@typescript-eslint/parser", "npm:6.17.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.17.0", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-parser-virtual-e6e1d7cfd6/4/.yarn/berry/cache/@typescript-eslint-parser-npm-6.17.0-c7b54d3943-10c0.zip/node_modules/@typescript-eslint/parser/",\ + "packageDependencies": [\ + ["@typescript-eslint/parser", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.17.0"],\ + ["@types/eslint", null],\ + ["@types/typescript", null],\ + ["@typescript-eslint/scope-manager", "npm:6.17.0"],\ + ["@typescript-eslint/types", "npm:6.17.0"],\ + ["@typescript-eslint/typescript-estree", "virtual:e6e1d7cfd66980172234de35984619ab306c6b237672f3c3b662d184847f85a7635e1cec60ef078ae89a87fc8d8bf40dbfb8ad96ba2bd24f3569008504bd3397#npm:6.17.0"],\ + ["@typescript-eslint/visitor-keys", "npm:6.17.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["eslint", "npm:8.56.0"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "@types/typescript",\ + "eslint",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/scope-manager", [\ + ["npm:6.17.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-scope-manager-npm-6.17.0-487c8a3d96-10c0.zip/node_modules/@typescript-eslint/scope-manager/",\ + "packageDependencies": [\ + ["@typescript-eslint/scope-manager", "npm:6.17.0"],\ + ["@typescript-eslint/types", "npm:6.17.0"],\ + ["@typescript-eslint/visitor-keys", "npm:6.17.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.18.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-scope-manager-npm-6.18.1-3f533b51d7-10c0.zip/node_modules/@typescript-eslint/scope-manager/",\ + "packageDependencies": [\ + ["@typescript-eslint/scope-manager", "npm:6.18.1"],\ + ["@typescript-eslint/types", "npm:6.18.1"],\ + ["@typescript-eslint/visitor-keys", "npm:6.18.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/type-utils", [\ + ["npm:6.18.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-type-utils-npm-6.18.1-40d38d6f53-10c0.zip/node_modules/@typescript-eslint/type-utils/",\ + "packageDependencies": [\ + ["@typescript-eslint/type-utils", "npm:6.18.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-type-utils-virtual-be6bfb49b5/4/.yarn/berry/cache/@typescript-eslint-type-utils-npm-6.18.1-40d38d6f53-10c0.zip/node_modules/@typescript-eslint/type-utils/",\ + "packageDependencies": [\ + ["@typescript-eslint/type-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1"],\ + ["@types/eslint", null],\ + ["@types/typescript", null],\ + ["@typescript-eslint/typescript-estree", "virtual:be6bfb49b5428d9c72a0cb13203452e77c9d44fe11a32d7b8023ffbd53cee614b089863c69283f68d64972fd9edd4465c802c37983c7e0e629bb20ff780d0fa6#npm:6.18.1"],\ + ["@typescript-eslint/utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["eslint", "npm:8.56.0"],\ + ["ts-api-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:1.0.3"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "@types/typescript",\ + "eslint",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/types", [\ + ["npm:4.33.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-types-npm-4.33.0-9e9b956afa-10c0.zip/node_modules/@typescript-eslint/types/",\ + "packageDependencies": [\ + ["@typescript-eslint/types", "npm:4.33.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.62.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-types-npm-5.62.0-5c2e0aab15-10c0.zip/node_modules/@typescript-eslint/types/",\ + "packageDependencies": [\ + ["@typescript-eslint/types", "npm:5.62.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.17.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-types-npm-6.17.0-96c56c0a75-10c0.zip/node_modules/@typescript-eslint/types/",\ + "packageDependencies": [\ + ["@typescript-eslint/types", "npm:6.17.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.18.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-types-npm-6.18.1-a106ef5c16-10c0.zip/node_modules/@typescript-eslint/types/",\ + "packageDependencies": [\ + ["@typescript-eslint/types", "npm:6.18.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/typescript-estree", [\ + ["npm:4.33.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-typescript-estree-npm-4.33.0-b6b79c10d0-10c0.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "npm:4.33.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["npm:5.62.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-typescript-estree-npm-5.62.0-5d1ea132a9-10c0.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "npm:5.62.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["npm:6.17.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-typescript-estree-npm-6.17.0-c77ebc49a9-10c0.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "npm:6.17.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["npm:6.18.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-typescript-estree-npm-6.18.1-8c1bf6eb4a-10c0.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "npm:6.18.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:7acec9484f01c68f8aa5f9931e6ffc696653513b41af7f3d08663c42ada1d00ee091c13e0780af9dcf735ec8a6e052660a87dc109342f3525583cf5ed4b2167b#npm:5.62.0", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-d25122643b/4/.yarn/berry/cache/@typescript-eslint-typescript-estree-npm-5.62.0-5d1ea132a9-10c0.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "virtual:7acec9484f01c68f8aa5f9931e6ffc696653513b41af7f3d08663c42ada1d00ee091c13e0780af9dcf735ec8a6e052660a87dc109342f3525583cf5ed4b2167b#npm:5.62.0"],\ + ["@types/typescript", null],\ + ["@typescript-eslint/types", "npm:5.62.0"],\ + ["@typescript-eslint/visitor-keys", "npm:5.62.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["globby", "npm:11.1.0"],\ + ["is-glob", "npm:4.0.3"],\ + ["semver", "npm:7.5.4"],\ + ["tsutils", "virtual:d25122643b329d297f1158bdbbeb452d30b524ea62c42db7395547701b59d0cea14496f7d76f91f55bbcf1d1440cf89bd89ae4b0cd0a6ebd7928883f9bf0dba3#npm:3.21.0"],\ + ["typescript", "patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:8e35e61358256be2b5d90a559e3a3772257ad03ed9eac447b59935c934deb801b60b5640e0d64c4d3d6d217d8ee32f9d0f8b6df724cdfa9f0a254f75b7b6a4c5#npm:6.18.1", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-45f7b3e074/4/.yarn/berry/cache/@typescript-eslint-typescript-estree-npm-6.18.1-8c1bf6eb4a-10c0.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "virtual:8e35e61358256be2b5d90a559e3a3772257ad03ed9eac447b59935c934deb801b60b5640e0d64c4d3d6d217d8ee32f9d0f8b6df724cdfa9f0a254f75b7b6a4c5#npm:6.18.1"],\ + ["@types/typescript", null],\ + ["@typescript-eslint/types", "npm:6.18.1"],\ + ["@typescript-eslint/visitor-keys", "npm:6.18.1"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["globby", "npm:11.1.0"],\ + ["is-glob", "npm:4.0.3"],\ + ["minimatch", "npm:9.0.3"],\ + ["semver", "npm:7.5.4"],\ + ["ts-api-utils", "virtual:45f7b3e074718861e9d412f1461999483dee0f73f35f1e6f12ded75c3c5b62cd2bcff5f531367f4b6732c1e89724ee8d5efc7a3515fd1f1d59d8f1ab11edf9ed#npm:1.0.3"],\ + ["typescript", null]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:aa734fe5910ab2043ff5b76d2c49e3a3aff381cfe805800a92c03671e0b66da8ec7f2fc8ded6c6952cec7a57f0f439fa45d51213f03f478f98eb208ccfd5b76b#npm:4.33.0", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-40b7528656/4/.yarn/berry/cache/@typescript-eslint-typescript-estree-npm-4.33.0-b6b79c10d0-10c0.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "virtual:aa734fe5910ab2043ff5b76d2c49e3a3aff381cfe805800a92c03671e0b66da8ec7f2fc8ded6c6952cec7a57f0f439fa45d51213f03f478f98eb208ccfd5b76b#npm:4.33.0"],\ + ["@types/typescript", null],\ + ["@typescript-eslint/types", "npm:4.33.0"],\ + ["@typescript-eslint/visitor-keys", "npm:4.33.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["globby", "npm:11.1.0"],\ + ["is-glob", "npm:4.0.3"],\ + ["semver", "npm:7.5.4"],\ + ["tsutils", "virtual:40b7528656205285b7eb6c8a2b798d03c881f5fc5f312b0ac13d2de58079f2f1fefdc278b4177d7b19c2e1c30a289310b9c005566bdd606e08fd4846ffc54362#npm:3.21.0"],\ + ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:be6bfb49b5428d9c72a0cb13203452e77c9d44fe11a32d7b8023ffbd53cee614b089863c69283f68d64972fd9edd4465c802c37983c7e0e629bb20ff780d0fa6#npm:6.18.1", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-861dd30074/4/.yarn/berry/cache/@typescript-eslint-typescript-estree-npm-6.18.1-8c1bf6eb4a-10c0.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "virtual:be6bfb49b5428d9c72a0cb13203452e77c9d44fe11a32d7b8023ffbd53cee614b089863c69283f68d64972fd9edd4465c802c37983c7e0e629bb20ff780d0fa6#npm:6.18.1"],\ + ["@types/typescript", null],\ + ["@typescript-eslint/types", "npm:6.18.1"],\ + ["@typescript-eslint/visitor-keys", "npm:6.18.1"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["globby", "npm:11.1.0"],\ + ["is-glob", "npm:4.0.3"],\ + ["minimatch", "npm:9.0.3"],\ + ["semver", "npm:7.5.4"],\ + ["ts-api-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:1.0.3"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:e6e1d7cfd66980172234de35984619ab306c6b237672f3c3b662d184847f85a7635e1cec60ef078ae89a87fc8d8bf40dbfb8ad96ba2bd24f3569008504bd3397#npm:6.17.0", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-typescript-estree-virtual-aa6a582123/4/.yarn/berry/cache/@typescript-eslint-typescript-estree-npm-6.17.0-c77ebc49a9-10c0.zip/node_modules/@typescript-eslint/typescript-estree/",\ + "packageDependencies": [\ + ["@typescript-eslint/typescript-estree", "virtual:e6e1d7cfd66980172234de35984619ab306c6b237672f3c3b662d184847f85a7635e1cec60ef078ae89a87fc8d8bf40dbfb8ad96ba2bd24f3569008504bd3397#npm:6.17.0"],\ + ["@types/typescript", null],\ + ["@typescript-eslint/types", "npm:6.17.0"],\ + ["@typescript-eslint/visitor-keys", "npm:6.17.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["globby", "npm:11.1.0"],\ + ["is-glob", "npm:4.0.3"],\ + ["minimatch", "npm:9.0.3"],\ + ["semver", "npm:7.5.4"],\ + ["ts-api-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:1.0.3"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/utils", [\ + ["npm:6.18.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-utils-npm-6.18.1-6a422bc632-10c0.zip/node_modules/@typescript-eslint/utils/",\ + "packageDependencies": [\ + ["@typescript-eslint/utils", "npm:6.18.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1", {\ + "packageLocation": "./.yarn/__virtual__/@typescript-eslint-utils-virtual-8e35e61358/4/.yarn/berry/cache/@typescript-eslint-utils-npm-6.18.1-6a422bc632-10c0.zip/node_modules/@typescript-eslint/utils/",\ + "packageDependencies": [\ + ["@typescript-eslint/utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1"],\ + ["@eslint-community/eslint-utils", "virtual:6eec398a4132b5372ea5ffc0bc36d4c81602b7e444a89685d0d958016d8fd53df5c0c97c6a8bf99951469e2c6c06135dd192e9309f6e39b1a4c85e0faabe1f6b#npm:4.4.0"],\ + ["@types/eslint", null],\ + ["@types/json-schema", "npm:7.0.15"],\ + ["@types/semver", "npm:7.5.6"],\ + ["@typescript-eslint/scope-manager", "npm:6.18.1"],\ + ["@typescript-eslint/types", "npm:6.18.1"],\ + ["@typescript-eslint/typescript-estree", "virtual:8e35e61358256be2b5d90a559e3a3772257ad03ed9eac447b59935c934deb801b60b5640e0d64c4d3d6d217d8ee32f9d0f8b6df724cdfa9f0a254f75b7b6a4c5#npm:6.18.1"],\ + ["eslint", "npm:8.56.0"],\ + ["semver", "npm:7.5.4"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@typescript-eslint/visitor-keys", [\ + ["npm:4.33.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-visitor-keys-npm-4.33.0-8b7e72a3c9-10c0.zip/node_modules/@typescript-eslint/visitor-keys/",\ + "packageDependencies": [\ + ["@typescript-eslint/visitor-keys", "npm:4.33.0"],\ + ["@typescript-eslint/types", "npm:4.33.0"],\ + ["eslint-visitor-keys", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.62.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-visitor-keys-npm-5.62.0-da1af55f83-10c0.zip/node_modules/@typescript-eslint/visitor-keys/",\ + "packageDependencies": [\ + ["@typescript-eslint/visitor-keys", "npm:5.62.0"],\ + ["@typescript-eslint/types", "npm:5.62.0"],\ + ["eslint-visitor-keys", "npm:3.4.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.17.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-visitor-keys-npm-6.17.0-fe9f80b87e-10c0.zip/node_modules/@typescript-eslint/visitor-keys/",\ + "packageDependencies": [\ + ["@typescript-eslint/visitor-keys", "npm:6.17.0"],\ + ["@typescript-eslint/types", "npm:6.17.0"],\ + ["eslint-visitor-keys", "npm:3.4.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.18.1", {\ + "packageLocation": "../../../.yarn/berry/cache/@typescript-eslint-visitor-keys-npm-6.18.1-1fdb3bad24-10c0.zip/node_modules/@typescript-eslint/visitor-keys/",\ + "packageDependencies": [\ + ["@typescript-eslint/visitor-keys", "npm:6.18.1"],\ + ["@typescript-eslint/types", "npm:6.18.1"],\ + ["eslint-visitor-keys", "npm:3.4.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@ungap/structured-clone", [\ + ["npm:1.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/@ungap-structured-clone-npm-1.2.0-648f0b82e0-10c0.zip/node_modules/@ungap/structured-clone/",\ + "packageDependencies": [\ + ["@ungap/structured-clone", "npm:1.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["@vercel/nft", [\ + ["npm:0.24.4", {\ + "packageLocation": "../../../.yarn/berry/cache/@vercel-nft-npm-0.24.4-80d5529913-10c0.zip/node_modules/@vercel/nft/",\ + "packageDependencies": [\ + ["@vercel/nft", "npm:0.24.4"],\ + ["@mapbox/node-pre-gyp", "npm:1.0.11"],\ + ["@rollup/pluginutils", "npm:4.2.1"],\ + ["acorn", "npm:8.11.3"],\ + ["async-sema", "npm:3.1.1"],\ + ["bindings", "npm:1.5.0"],\ + ["estree-walker", "npm:2.0.2"],\ + ["glob", "npm:7.2.3"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["micromatch", "npm:4.0.5"],\ + ["node-gyp-build", "npm:4.7.1"],\ + ["resolve-from", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["JSONStream", [\ + ["npm:1.3.5", {\ + "packageLocation": "../../../.yarn/berry/cache/JSONStream-npm-1.3.5-1987f2e6dd-10c0.zip/node_modules/JSONStream/",\ + "packageDependencies": [\ + ["JSONStream", "npm:1.3.5"],\ + ["jsonparse", "npm:1.3.1"],\ + ["through", "npm:2.3.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["abbrev", [\ + ["npm:1.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/abbrev-npm-1.1.1-3659247eab-10c0.zip/node_modules/abbrev/",\ + "packageDependencies": [\ + ["abbrev", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/abbrev-npm-2.0.0-0eb38a17e5-10c0.zip/node_modules/abbrev/",\ + "packageDependencies": [\ + ["abbrev", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["accepts", [\ + ["npm:1.3.8", {\ + "packageLocation": "../../../.yarn/berry/cache/accepts-npm-1.3.8-9a812371c9-10c0.zip/node_modules/accepts/",\ + "packageDependencies": [\ + ["accepts", "npm:1.3.8"],\ + ["mime-types", "npm:2.1.35"],\ + ["negotiator", "npm:0.6.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["acorn", [\ + ["npm:8.11.3", {\ + "packageLocation": "../../../.yarn/berry/cache/acorn-npm-8.11.3-0d7ab48b38-10c0.zip/node_modules/acorn/",\ + "packageDependencies": [\ + ["acorn", "npm:8.11.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["acorn-jsx", [\ + ["npm:5.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/acorn-jsx-npm-5.3.2-d7594599ea-10c0.zip/node_modules/acorn-jsx/",\ + "packageDependencies": [\ + ["acorn-jsx", "npm:5.3.2"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:a50722a5a9326b6a5f12350c494c4db3aa0f4caeac45e3e9e5fe071da20014ecfe738fe2ebe2c9c98abae81a4ea86b42f56d776b3bd5ec37f9ad3670c242b242#npm:5.3.2", {\ + "packageLocation": "./.yarn/__virtual__/acorn-jsx-virtual-834321b202/4/.yarn/berry/cache/acorn-jsx-npm-5.3.2-d7594599ea-10c0.zip/node_modules/acorn-jsx/",\ + "packageDependencies": [\ + ["acorn-jsx", "virtual:a50722a5a9326b6a5f12350c494c4db3aa0f4caeac45e3e9e5fe071da20014ecfe738fe2ebe2c9c98abae81a4ea86b42f56d776b3bd5ec37f9ad3670c242b242#npm:5.3.2"],\ + ["@types/acorn", null],\ + ["acorn", "npm:8.11.3"]\ + ],\ + "packagePeers": [\ + "@types/acorn",\ + "acorn"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["acorn-walk", [\ + ["npm:8.3.1", {\ + "packageLocation": "../../../.yarn/berry/cache/acorn-walk-npm-8.3.1-2a7e2dbd77-10c0.zip/node_modules/acorn-walk/",\ + "packageDependencies": [\ + ["acorn-walk", "npm:8.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["add-stream", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/add-stream-npm-1.0.0-a5a0c0498c-10c0.zip/node_modules/add-stream/",\ + "packageDependencies": [\ + ["add-stream", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["agent-base", [\ + ["npm:6.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/agent-base-npm-6.0.2-428f325a93-10c0.zip/node_modules/agent-base/",\ + "packageDependencies": [\ + ["agent-base", "npm:6.0.2"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/agent-base-npm-7.1.0-4b12ba5111-10c0.zip/node_modules/agent-base/",\ + "packageDependencies": [\ + ["agent-base", "npm:7.1.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["aggregate-error", [\ + ["npm:3.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/aggregate-error-npm-3.1.0-415a406f4e-10c0.zip/node_modules/aggregate-error/",\ + "packageDependencies": [\ + ["aggregate-error", "npm:3.1.0"],\ + ["clean-stack", "npm:2.2.0"],\ + ["indent-string", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/aggregate-error-npm-4.0.1-12d0501fb7-10c0.zip/node_modules/aggregate-error/",\ + "packageDependencies": [\ + ["aggregate-error", "npm:4.0.1"],\ + ["clean-stack", "npm:4.2.0"],\ + ["indent-string", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ajv", [\ + ["npm:6.12.6", {\ + "packageLocation": "../../../.yarn/berry/cache/ajv-npm-6.12.6-4b5105e2b2-10c0.zip/node_modules/ajv/",\ + "packageDependencies": [\ + ["ajv", "npm:6.12.6"],\ + ["fast-deep-equal", "npm:3.1.3"],\ + ["fast-json-stable-stringify", "npm:2.1.0"],\ + ["json-schema-traverse", "npm:0.4.1"],\ + ["uri-js", "npm:4.4.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.12.0", {\ + "packageLocation": "../../../.yarn/berry/cache/ajv-npm-8.12.0-3bf6e30741-10c0.zip/node_modules/ajv/",\ + "packageDependencies": [\ + ["ajv", "npm:8.12.0"],\ + ["fast-deep-equal", "npm:3.1.3"],\ + ["json-schema-traverse", "npm:1.0.0"],\ + ["require-from-string", "npm:2.0.2"],\ + ["uri-js", "npm:4.4.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ajv-cli", [\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/ajv-cli-npm-5.0.0-e12d6f3c52-10c0.zip/node_modules/ajv-cli/",\ + "packageDependencies": [\ + ["ajv-cli", "npm:5.0.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:5.0.0", {\ + "packageLocation": "./.yarn/__virtual__/ajv-cli-virtual-d5efd73224/4/.yarn/berry/cache/ajv-cli-npm-5.0.0-e12d6f3c52-10c0.zip/node_modules/ajv-cli/",\ + "packageDependencies": [\ + ["ajv-cli", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:5.0.0"],\ + ["@types/ts-node", null],\ + ["ajv", "npm:8.12.0"],\ + ["fast-json-patch", "npm:2.2.1"],\ + ["glob", "npm:7.2.3"],\ + ["js-yaml", "npm:3.14.1"],\ + ["json-schema-migrate", "npm:2.0.0"],\ + ["json5", "npm:2.2.3"],\ + ["minimist", "npm:1.2.8"],\ + ["ts-node", null]\ + ],\ + "packagePeers": [\ + "@types/ts-node",\ + "ts-node"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ansi-escapes", [\ + ["npm:4.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/ansi-escapes-npm-4.3.2-3ad173702f-10c0.zip/node_modules/ansi-escapes/",\ + "packageDependencies": [\ + ["ansi-escapes", "npm:4.3.2"],\ + ["type-fest", "npm:0.21.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ansi-regex", [\ + ["npm:5.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/ansi-regex-npm-5.0.1-c963a48615-10c0.zip/node_modules/ansi-regex/",\ + "packageDependencies": [\ + ["ansi-regex", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/ansi-regex-npm-6.0.1-8d663a607d-10c0.zip/node_modules/ansi-regex/",\ + "packageDependencies": [\ + ["ansi-regex", "npm:6.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ansi-sequence-parser", [\ + ["npm:1.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/ansi-sequence-parser-npm-1.1.1-4cfd5b85e2-10c0.zip/node_modules/ansi-sequence-parser/",\ + "packageDependencies": [\ + ["ansi-sequence-parser", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ansi-styles", [\ + ["npm:3.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/ansi-styles-npm-3.2.1-8cb8107983-10c0.zip/node_modules/ansi-styles/",\ + "packageDependencies": [\ + ["ansi-styles", "npm:3.2.1"],\ + ["color-convert", "npm:1.9.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/ansi-styles-npm-4.3.0-245c7d42c7-10c0.zip/node_modules/ansi-styles/",\ + "packageDependencies": [\ + ["ansi-styles", "npm:4.3.0"],\ + ["color-convert", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/ansi-styles-npm-6.2.1-d43647018c-10c0.zip/node_modules/ansi-styles/",\ + "packageDependencies": [\ + ["ansi-styles", "npm:6.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["any-promise", [\ + ["npm:1.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/any-promise-npm-1.3.0-f34eeaa7e7-10c0.zip/node_modules/any-promise/",\ + "packageDependencies": [\ + ["any-promise", "npm:1.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["app-module-path", [\ + ["npm:2.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/app-module-path-npm-2.2.0-71fdc42bce-10c0.zip/node_modules/app-module-path/",\ + "packageDependencies": [\ + ["app-module-path", "npm:2.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["aproba", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/aproba-npm-2.0.0-8716bcfde6-10c0.zip/node_modules/aproba/",\ + "packageDependencies": [\ + ["aproba", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["are-we-there-yet", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/are-we-there-yet-npm-2.0.0-7d2f5201ce-10c0.zip/node_modules/are-we-there-yet/",\ + "packageDependencies": [\ + ["are-we-there-yet", "npm:2.0.0"],\ + ["delegates", "npm:1.0.0"],\ + ["readable-stream", "npm:3.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["argparse", [\ + ["npm:1.0.10", {\ + "packageLocation": "../../../.yarn/berry/cache/argparse-npm-1.0.10-528934e59d-10c0.zip/node_modules/argparse/",\ + "packageDependencies": [\ + ["argparse", "npm:1.0.10"],\ + ["sprintf-js", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/argparse-npm-2.0.1-faff7999e6-10c0.zip/node_modules/argparse/",\ + "packageDependencies": [\ + ["argparse", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array-buffer-byte-length", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/array-buffer-byte-length-npm-1.0.0-331671f28a-10c0.zip/node_modules/array-buffer-byte-length/",\ + "packageDependencies": [\ + ["array-buffer-byte-length", "npm:1.0.0"],\ + ["call-bind", "npm:1.0.5"],\ + ["is-array-buffer", "npm:3.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array-find-index", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/array-find-index-npm-1.0.2-a7d5fbff35-10c0.zip/node_modules/array-find-index/",\ + "packageDependencies": [\ + ["array-find-index", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array-flatten", [\ + ["npm:1.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/array-flatten-npm-1.1.1-9d94ad5f1d-10c0.zip/node_modules/array-flatten/",\ + "packageDependencies": [\ + ["array-flatten", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array-ify", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/array-ify-npm-1.0.0-e09a371977-10c0.zip/node_modules/array-ify/",\ + "packageDependencies": [\ + ["array-ify", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array-includes", [\ + ["npm:3.1.7", {\ + "packageLocation": "../../../.yarn/berry/cache/array-includes-npm-3.1.7-d32a5ee179-10c0.zip/node_modules/array-includes/",\ + "packageDependencies": [\ + ["array-includes", "npm:3.1.7"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["is-string", "npm:1.0.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array-timsort", [\ + ["npm:1.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/array-timsort-npm-1.0.3-50b9e6724f-10c0.zip/node_modules/array-timsort/",\ + "packageDependencies": [\ + ["array-timsort", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array-union", [\ + ["npm:2.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/array-union-npm-2.1.0-4e4852b221-10c0.zip/node_modules/array-union/",\ + "packageDependencies": [\ + ["array-union", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array.prototype.findlastindex", [\ + ["npm:1.2.3", {\ + "packageLocation": "../../../.yarn/berry/cache/array.prototype.findlastindex-npm-1.2.3-2a36f4417b-10c0.zip/node_modules/array.prototype.findlastindex/",\ + "packageDependencies": [\ + ["array.prototype.findlastindex", "npm:1.2.3"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"],\ + ["es-shim-unscopables", "npm:1.0.2"],\ + ["get-intrinsic", "npm:1.2.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array.prototype.flat", [\ + ["npm:1.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/array.prototype.flat-npm-1.3.2-350729f7f4-10c0.zip/node_modules/array.prototype.flat/",\ + "packageDependencies": [\ + ["array.prototype.flat", "npm:1.3.2"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"],\ + ["es-shim-unscopables", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["array.prototype.flatmap", [\ + ["npm:1.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/array.prototype.flatmap-npm-1.3.2-5c6a4af226-10c0.zip/node_modules/array.prototype.flatmap/",\ + "packageDependencies": [\ + ["array.prototype.flatmap", "npm:1.3.2"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"],\ + ["es-shim-unscopables", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["arraybuffer.prototype.slice", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/arraybuffer.prototype.slice-npm-1.0.2-4eda52ad8c-10c0.zip/node_modules/arraybuffer.prototype.slice/",\ + "packageDependencies": [\ + ["arraybuffer.prototype.slice", "npm:1.0.2"],\ + ["array-buffer-byte-length", "npm:1.0.0"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["is-array-buffer", "npm:3.0.2"],\ + ["is-shared-array-buffer", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["arrgv", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/arrgv-npm-1.0.2-2f5078bb50-10c0.zip/node_modules/arrgv/",\ + "packageDependencies": [\ + ["arrgv", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["arrify", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/arrify-npm-1.0.1-affafba9fe-10c0.zip/node_modules/arrify/",\ + "packageDependencies": [\ + ["arrify", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/arrify-npm-3.0.0-84cf7a301c-10c0.zip/node_modules/arrify/",\ + "packageDependencies": [\ + ["arrify", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["asmcrypto.js", [\ + ["npm:2.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/asmcrypto.js-npm-2.3.2-7e6e6cafba-10c0.zip/node_modules/asmcrypto.js/",\ + "packageDependencies": [\ + ["asmcrypto.js", "npm:2.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ast-module-types", [\ + ["npm:2.7.1", {\ + "packageLocation": "../../../.yarn/berry/cache/ast-module-types-npm-2.7.1-1833572dd9-10c0.zip/node_modules/ast-module-types/",\ + "packageDependencies": [\ + ["ast-module-types", "npm:2.7.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/ast-module-types-npm-3.0.0-2f08e895f4-10c0.zip/node_modules/ast-module-types/",\ + "packageDependencies": [\ + ["ast-module-types", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/ast-module-types-npm-4.0.0-1d93ec3f90-10c0.zip/node_modules/ast-module-types/",\ + "packageDependencies": [\ + ["ast-module-types", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["async-sema", [\ + ["npm:3.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/async-sema-npm-3.1.1-a5453a4d6a-10c0.zip/node_modules/async-sema/",\ + "packageDependencies": [\ + ["async-sema", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["at-least-node", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/at-least-node-npm-1.0.0-2b36e661fa-10c0.zip/node_modules/at-least-node/",\ + "packageDependencies": [\ + ["at-least-node", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ava", [\ + ["npm:6.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/ava-npm-6.0.1-dbddac242f-10c0.zip/node_modules/ava/",\ + "packageDependencies": [\ + ["ava", "npm:6.0.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.1", {\ + "packageLocation": "./.yarn/__virtual__/ava-virtual-20275f09c0/4/.yarn/berry/cache/ava-npm-6.0.1-dbddac242f-10c0.zip/node_modules/ava/",\ + "packageDependencies": [\ + ["ava", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.1"],\ + ["@ava/typescript", "npm:4.1.0"],\ + ["@types/ava__typescript", null],\ + ["@vercel/nft", "npm:0.24.4"],\ + ["acorn", "npm:8.11.3"],\ + ["acorn-walk", "npm:8.3.1"],\ + ["ansi-styles", "npm:6.2.1"],\ + ["arrgv", "npm:1.0.2"],\ + ["arrify", "npm:3.0.0"],\ + ["callsites", "npm:4.1.0"],\ + ["cbor", "npm:9.0.1"],\ + ["chalk", "npm:5.3.0"],\ + ["chunkd", "npm:2.0.1"],\ + ["ci-info", "npm:4.0.0"],\ + ["ci-parallel-vars", "npm:1.0.1"],\ + ["cli-truncate", "npm:4.0.0"],\ + ["code-excerpt", "npm:4.0.0"],\ + ["common-path-prefix", "npm:3.0.0"],\ + ["concordance", "npm:5.0.4"],\ + ["currently-unhandled", "npm:0.4.1"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["emittery", "npm:1.0.1"],\ + ["figures", "npm:6.0.1"],\ + ["globby", "npm:14.0.0"],\ + ["ignore-by-default", "npm:2.1.0"],\ + ["indent-string", "npm:5.0.0"],\ + ["is-plain-object", "npm:5.0.0"],\ + ["is-promise", "npm:4.0.0"],\ + ["matcher", "npm:5.0.0"],\ + ["memoize", "npm:10.0.0"],\ + ["ms", "npm:2.1.3"],\ + ["p-map", "npm:6.0.0"],\ + ["package-config", "npm:5.0.0"],\ + ["picomatch", "npm:3.0.1"],\ + ["plur", "npm:5.1.0"],\ + ["pretty-ms", "npm:8.0.0"],\ + ["resolve-cwd", "npm:3.0.0"],\ + ["stack-utils", "npm:2.0.6"],\ + ["strip-ansi", "npm:7.1.0"],\ + ["supertap", "npm:3.0.1"],\ + ["temp-dir", "npm:3.0.0"],\ + ["write-file-atomic", "npm:5.0.1"],\ + ["yargs", "npm:17.7.2"]\ + ],\ + "packagePeers": [\ + "@ava/typescript",\ + "@types/ava__typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["available-typed-arrays", [\ + ["npm:1.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/available-typed-arrays-npm-1.0.5-88f321e4d3-10c0.zip/node_modules/available-typed-arrays/",\ + "packageDependencies": [\ + ["available-typed-arrays", "npm:1.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["balanced-match", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/balanced-match-npm-1.0.2-a53c126459-10c0.zip/node_modules/balanced-match/",\ + "packageDependencies": [\ + ["balanced-match", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["base-x", [\ + ["npm:3.0.9", {\ + "packageLocation": "../../../.yarn/berry/cache/base-x-npm-3.0.9-7b2588e106-10c0.zip/node_modules/base-x/",\ + "packageDependencies": [\ + ["base-x", "npm:3.0.9"],\ + ["safe-buffer", "npm:5.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["base64-js", [\ + ["npm:1.5.1", {\ + "packageLocation": "../../../.yarn/berry/cache/base64-js-npm-1.5.1-b2f7275641-10c0.zip/node_modules/base64-js/",\ + "packageDependencies": [\ + ["base64-js", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bech32", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/bech32-npm-2.0.0-ad98b7dd79-10c0.zip/node_modules/bech32/",\ + "packageDependencies": [\ + ["bech32", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["benchmark", [\ + ["npm:2.1.4", {\ + "packageLocation": "../../../.yarn/berry/cache/benchmark-npm-2.1.4-3d024a205e-10c0.zip/node_modules/benchmark/",\ + "packageDependencies": [\ + ["benchmark", "npm:2.1.4"],\ + ["lodash", "npm:4.17.21"],\ + ["platform", "npm:1.3.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bigi", [\ + ["npm:1.4.2", {\ + "packageLocation": "../../../.yarn/berry/cache/bigi-npm-1.4.2-e1940a4956-10c0.zip/node_modules/bigi/",\ + "packageDependencies": [\ + ["bigi", "npm:1.4.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bindings", [\ + ["npm:1.5.0", {\ + "packageLocation": "../../../.yarn/berry/cache/bindings-npm-1.5.0-77ce1d213c-10c0.zip/node_modules/bindings/",\ + "packageDependencies": [\ + ["bindings", "npm:1.5.0"],\ + ["file-uri-to-path", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bip-schnorr", [\ + ["npm:0.6.4", {\ + "packageLocation": "../../../.yarn/berry/cache/bip-schnorr-npm-0.6.4-9f0fad8f4b-10c0.zip/node_modules/bip-schnorr/",\ + "packageDependencies": [\ + ["bip-schnorr", "npm:0.6.4"],\ + ["bigi", "npm:1.4.2"],\ + ["ecurve", "npm:1.0.6"],\ + ["js-sha256", "npm:0.9.0"],\ + ["randombytes", "npm:2.1.0"],\ + ["safe-buffer", "npm:5.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bitcore-lib", [\ + ["npm:10.0.23", {\ + "packageLocation": "../../../.yarn/berry/cache/bitcore-lib-npm-10.0.23-75b1927db3-10c0.zip/node_modules/bitcore-lib/",\ + "packageDependencies": [\ + ["bitcore-lib", "npm:10.0.23"],\ + ["bech32", "npm:2.0.0"],\ + ["bip-schnorr", "npm:0.6.4"],\ + ["bn.js", "npm:4.11.8"],\ + ["bs58", "npm:4.0.1"],\ + ["buffer-compare", "npm:1.1.1"],\ + ["elliptic", "npm:6.5.4"],\ + ["inherits", "npm:2.0.1"],\ + ["lodash", "npm:4.17.21"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bitcore-lib-cash", [\ + ["npm:10.0.23", {\ + "packageLocation": "../../../.yarn/berry/cache/bitcore-lib-cash-npm-10.0.23-880f1384b2-10c0.zip/node_modules/bitcore-lib-cash/",\ + "packageDependencies": [\ + ["bitcore-lib-cash", "npm:10.0.23"],\ + ["bitcore-lib", "npm:10.0.23"],\ + ["bn.js", "npm:4.11.8"],\ + ["bs58", "npm:4.0.1"],\ + ["buffer-compare", "npm:1.1.1"],\ + ["elliptic", "npm:6.5.4"],\ + ["inherits", "npm:2.0.1"],\ + ["lodash", "npm:4.17.21"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bl", [\ + ["npm:4.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/bl-npm-4.1.0-7f94cdcf3f-10c0.zip/node_modules/bl/",\ + "packageDependencies": [\ + ["bl", "npm:4.1.0"],\ + ["buffer", "npm:5.7.1"],\ + ["inherits", "npm:2.0.4"],\ + ["readable-stream", "npm:3.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bluebird", [\ + ["npm:3.7.2", {\ + "packageLocation": "../../../.yarn/berry/cache/bluebird-npm-3.7.2-6a54136ee3-10c0.zip/node_modules/bluebird/",\ + "packageDependencies": [\ + ["bluebird", "npm:3.7.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["blueimp-md5", [\ + ["npm:2.19.0", {\ + "packageLocation": "../../../.yarn/berry/cache/blueimp-md5-npm-2.19.0-0a19585c8c-10c0.zip/node_modules/blueimp-md5/",\ + "packageDependencies": [\ + ["blueimp-md5", "npm:2.19.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bn.js", [\ + ["npm:4.11.8", {\ + "packageLocation": "../../../.yarn/berry/cache/bn.js-npm-4.11.8-296affce9a-10c0.zip/node_modules/bn.js/",\ + "packageDependencies": [\ + ["bn.js", "npm:4.11.8"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.12.0", {\ + "packageLocation": "../../../.yarn/berry/cache/bn.js-npm-4.12.0-3ec6c884f6-10c0.zip/node_modules/bn.js/",\ + "packageDependencies": [\ + ["bn.js", "npm:4.12.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["body-parser", [\ + ["npm:1.20.1", {\ + "packageLocation": "../../../.yarn/berry/cache/body-parser-npm-1.20.1-759fd14db9-10c0.zip/node_modules/body-parser/",\ + "packageDependencies": [\ + ["body-parser", "npm:1.20.1"],\ + ["bytes", "npm:3.1.2"],\ + ["content-type", "npm:1.0.5"],\ + ["debug", "virtual:3840e914156da5bf3a0152609f7597e38b893022314c08ba5b292edc820681760ec6c83dde1d34d78aa58a3f32c7d8c9d754f99860fa71136383ec1e2a87f57d#npm:2.6.9"],\ + ["depd", "npm:2.0.0"],\ + ["destroy", "npm:1.2.0"],\ + ["http-errors", "npm:2.0.0"],\ + ["iconv-lite", "npm:0.4.24"],\ + ["on-finished", "npm:2.4.1"],\ + ["qs", "npm:6.11.0"],\ + ["raw-body", "npm:2.5.1"],\ + ["type-is", "npm:1.6.18"],\ + ["unpipe", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["brace-expansion", [\ + ["npm:1.1.11", {\ + "packageLocation": "../../../.yarn/berry/cache/brace-expansion-npm-1.1.11-fb95eb05ad-10c0.zip/node_modules/brace-expansion/",\ + "packageDependencies": [\ + ["brace-expansion", "npm:1.1.11"],\ + ["balanced-match", "npm:1.0.2"],\ + ["concat-map", "npm:0.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/brace-expansion-npm-2.0.1-17aa2616f9-10c0.zip/node_modules/brace-expansion/",\ + "packageDependencies": [\ + ["brace-expansion", "npm:2.0.1"],\ + ["balanced-match", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["braces", [\ + ["npm:3.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/braces-npm-3.0.2-782240b28a-10c0.zip/node_modules/braces/",\ + "packageDependencies": [\ + ["braces", "npm:3.0.2"],\ + ["fill-range", "npm:7.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["brorand", [\ + ["npm:1.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/brorand-npm-1.1.0-ea86634c4b-10c0.zip/node_modules/brorand/",\ + "packageDependencies": [\ + ["brorand", "npm:1.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bs58", [\ + ["npm:4.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/bs58-npm-4.0.1-8d2a7822b1-10c0.zip/node_modules/bs58/",\ + "packageDependencies": [\ + ["bs58", "npm:4.0.1"],\ + ["base-x", "npm:3.0.9"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["buffer", [\ + ["npm:5.7.1", {\ + "packageLocation": "../../../.yarn/berry/cache/buffer-npm-5.7.1-513ef8259e-10c0.zip/node_modules/buffer/",\ + "packageDependencies": [\ + ["buffer", "npm:5.7.1"],\ + ["base64-js", "npm:1.5.1"],\ + ["ieee754", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["buffer-compare", [\ + ["npm:1.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/buffer-compare-npm-1.1.1-4ea57f3a1d-10c0.zip/node_modules/buffer-compare/",\ + "packageDependencies": [\ + ["buffer-compare", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["buffer-from", [\ + ["npm:1.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/buffer-from-npm-1.1.2-03d2f20d7e-10c0.zip/node_modules/buffer-from/",\ + "packageDependencies": [\ + ["buffer-from", "npm:1.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["builtin-modules", [\ + ["npm:3.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/builtin-modules-npm-3.3.0-db4f3d32de-10c0.zip/node_modules/builtin-modules/",\ + "packageDependencies": [\ + ["builtin-modules", "npm:3.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bundle-name", [\ + ["npm:4.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/bundle-name-npm-4.1.0-4688335533-10c0.zip/node_modules/bundle-name/",\ + "packageDependencies": [\ + ["bundle-name", "npm:4.1.0"],\ + ["run-applescript", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["bytes", [\ + ["npm:3.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/bytes-npm-3.1.2-28b8643004-10c0.zip/node_modules/bytes/",\ + "packageDependencies": [\ + ["bytes", "npm:3.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["c8", [\ + ["npm:9.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/c8-npm-9.0.0-a08ede145f-10c0.zip/node_modules/c8/",\ + "packageDependencies": [\ + ["c8", "npm:9.0.0"],\ + ["@bcoe/v8-coverage", "npm:0.2.3"],\ + ["@istanbuljs/schema", "npm:0.1.3"],\ + ["find-up", "npm:5.0.0"],\ + ["foreground-child", "npm:3.1.1"],\ + ["istanbul-lib-coverage", "npm:3.2.2"],\ + ["istanbul-lib-report", "npm:3.0.1"],\ + ["istanbul-reports", "npm:3.1.6"],\ + ["test-exclude", "npm:6.0.0"],\ + ["v8-to-istanbul", "npm:9.2.0"],\ + ["yargs", "npm:17.7.2"],\ + ["yargs-parser", "npm:21.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cacache", [\ + ["npm:18.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/cacache-npm-18.0.2-d6329a1b9d-10c0.zip/node_modules/cacache/",\ + "packageDependencies": [\ + ["cacache", "npm:18.0.2"],\ + ["@npmcli/fs", "npm:3.1.0"],\ + ["fs-minipass", "npm:3.0.3"],\ + ["glob", "npm:10.3.10"],\ + ["lru-cache", "npm:10.1.0"],\ + ["minipass", "npm:7.0.4"],\ + ["minipass-collect", "npm:2.0.1"],\ + ["minipass-flush", "npm:1.0.5"],\ + ["minipass-pipeline", "npm:1.2.4"],\ + ["p-map", "npm:4.0.0"],\ + ["ssri", "npm:10.0.5"],\ + ["tar", "npm:6.2.0"],\ + ["unique-filename", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cachedir", [\ + ["npm:2.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/cachedir-npm-2.3.0-640dc16bbb-10c0.zip/node_modules/cachedir/",\ + "packageDependencies": [\ + ["cachedir", "npm:2.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["call-bind", [\ + ["npm:1.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/call-bind-npm-1.0.5-65600fae47-10c0.zip/node_modules/call-bind/",\ + "packageDependencies": [\ + ["call-bind", "npm:1.0.5"],\ + ["function-bind", "npm:1.1.2"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["set-function-length", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["callsites", [\ + ["npm:3.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/callsites-npm-3.1.0-268f989910-10c0.zip/node_modules/callsites/",\ + "packageDependencies": [\ + ["callsites", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/callsites-npm-4.1.0-4af8da43e9-10c0.zip/node_modules/callsites/",\ + "packageDependencies": [\ + ["callsites", "npm:4.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["camelcase", [\ + ["npm:5.3.1", {\ + "packageLocation": "../../../.yarn/berry/cache/camelcase-npm-5.3.1-5db8af62c5-10c0.zip/node_modules/camelcase/",\ + "packageDependencies": [\ + ["camelcase", "npm:5.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["camelcase-keys", [\ + ["npm:6.2.2", {\ + "packageLocation": "../../../.yarn/berry/cache/camelcase-keys-npm-6.2.2-d13777ec12-10c0.zip/node_modules/camelcase-keys/",\ + "packageDependencies": [\ + ["camelcase-keys", "npm:6.2.2"],\ + ["camelcase", "npm:5.3.1"],\ + ["map-obj", "npm:4.3.0"],\ + ["quick-lru", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cbor", [\ + ["npm:9.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/cbor-npm-9.0.1-3a5a6b7751-10c0.zip/node_modules/cbor/",\ + "packageDependencies": [\ + ["cbor", "npm:9.0.1"],\ + ["nofilter", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["chalk", [\ + ["npm:2.4.2", {\ + "packageLocation": "../../../.yarn/berry/cache/chalk-npm-2.4.2-3ea16dd91e-10c0.zip/node_modules/chalk/",\ + "packageDependencies": [\ + ["chalk", "npm:2.4.2"],\ + ["ansi-styles", "npm:3.2.1"],\ + ["escape-string-regexp", "npm:1.0.5"],\ + ["supports-color", "npm:5.5.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/chalk-npm-4.1.2-ba8b67ab80-10c0.zip/node_modules/chalk/",\ + "packageDependencies": [\ + ["chalk", "npm:4.1.2"],\ + ["ansi-styles", "npm:4.3.0"],\ + ["supports-color", "npm:7.2.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/chalk-npm-5.3.0-d181999efb-10c0.zip/node_modules/chalk/",\ + "packageDependencies": [\ + ["chalk", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["chalk-template", [\ + ["npm:1.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/chalk-template-npm-1.1.0-2310bf686b-10c0.zip/node_modules/chalk-template/",\ + "packageDependencies": [\ + ["chalk-template", "npm:1.1.0"],\ + ["chalk", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["chardet", [\ + ["npm:0.7.0", {\ + "packageLocation": "../../../.yarn/berry/cache/chardet-npm-0.7.0-27933dd6c7-10c0.zip/node_modules/chardet/",\ + "packageDependencies": [\ + ["chardet", "npm:0.7.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["chownr", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/chownr-npm-2.0.0-638f1c9c61-10c0.zip/node_modules/chownr/",\ + "packageDependencies": [\ + ["chownr", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["chuhai", [\ + ["npm:1.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/chuhai-npm-1.2.0-3840e91415-10c0.zip/node_modules/chuhai/",\ + "packageDependencies": [\ + ["chuhai", "npm:1.2.0"],\ + ["benchmark", "npm:2.1.4"],\ + ["bluebird", "npm:3.7.2"],\ + ["debug", "virtual:3840e914156da5bf3a0152609f7597e38b893022314c08ba5b292edc820681760ec6c83dde1d34d78aa58a3f32c7d8c9d754f99860fa71136383ec1e2a87f57d#npm:2.6.9"],\ + ["fn-name", "npm:2.0.1"],\ + ["lodash", "npm:4.17.21"],\ + ["stack-utils", "npm:0.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["chunkd", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/chunkd-npm-2.0.1-2a1d1afad0-10c0.zip/node_modules/chunkd/",\ + "packageDependencies": [\ + ["chunkd", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ci-info", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/ci-info-npm-4.0.0-90a0683096-10c0.zip/node_modules/ci-info/",\ + "packageDependencies": [\ + ["ci-info", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ci-parallel-vars", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/ci-parallel-vars-npm-1.0.1-27c813d568-10c0.zip/node_modules/ci-parallel-vars/",\ + "packageDependencies": [\ + ["ci-parallel-vars", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["clean-stack", [\ + ["npm:2.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/clean-stack-npm-2.2.0-a8ce435a5c-10c0.zip/node_modules/clean-stack/",\ + "packageDependencies": [\ + ["clean-stack", "npm:2.2.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/clean-stack-npm-4.2.0-bb0dff47b2-10c0.zip/node_modules/clean-stack/",\ + "packageDependencies": [\ + ["clean-stack", "npm:4.2.0"],\ + ["escape-string-regexp", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["clear-module", [\ + ["npm:4.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/clear-module-npm-4.1.2-8178e7e490-10c0.zip/node_modules/clear-module/",\ + "packageDependencies": [\ + ["clear-module", "npm:4.1.2"],\ + ["parent-module", "npm:2.0.0"],\ + ["resolve-from", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cli-cursor", [\ + ["npm:3.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/cli-cursor-npm-3.1.0-fee1e46b5e-10c0.zip/node_modules/cli-cursor/",\ + "packageDependencies": [\ + ["cli-cursor", "npm:3.1.0"],\ + ["restore-cursor", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cli-spinners", [\ + ["npm:2.9.2", {\ + "packageLocation": "../../../.yarn/berry/cache/cli-spinners-npm-2.9.2-be9c08efee-10c0.zip/node_modules/cli-spinners/",\ + "packageDependencies": [\ + ["cli-spinners", "npm:2.9.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cli-truncate", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/cli-truncate-npm-4.0.0-3113917cdb-10c0.zip/node_modules/cli-truncate/",\ + "packageDependencies": [\ + ["cli-truncate", "npm:4.0.0"],\ + ["slice-ansi", "npm:5.0.0"],\ + ["string-width", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cli-width", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/cli-width-npm-3.0.0-387b3f68f9-10c0.zip/node_modules/cli-width/",\ + "packageDependencies": [\ + ["cli-width", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cliui", [\ + ["npm:7.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/cliui-npm-7.0.4-d6b8a9edb6-10c0.zip/node_modules/cliui/",\ + "packageDependencies": [\ + ["cliui", "npm:7.0.4"],\ + ["string-width", "npm:4.2.3"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["wrap-ansi", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/cliui-npm-8.0.1-3b029092cf-10c0.zip/node_modules/cliui/",\ + "packageDependencies": [\ + ["cliui", "npm:8.0.1"],\ + ["string-width", "npm:4.2.3"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["wrap-ansi", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["clone", [\ + ["npm:1.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/clone-npm-1.0.4-a610fcbcf9-10c0.zip/node_modules/clone/",\ + "packageDependencies": [\ + ["clone", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["code-excerpt", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/code-excerpt-npm-4.0.0-f453325e6e-10c0.zip/node_modules/code-excerpt/",\ + "packageDependencies": [\ + ["code-excerpt", "npm:4.0.0"],\ + ["convert-to-spaces", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["color-convert", [\ + ["npm:1.9.3", {\ + "packageLocation": "../../../.yarn/berry/cache/color-convert-npm-1.9.3-1fe690075e-10c0.zip/node_modules/color-convert/",\ + "packageDependencies": [\ + ["color-convert", "npm:1.9.3"],\ + ["color-name", "npm:1.1.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/color-convert-npm-2.0.1-79730e935b-10c0.zip/node_modules/color-convert/",\ + "packageDependencies": [\ + ["color-convert", "npm:2.0.1"],\ + ["color-name", "npm:1.1.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["color-name", [\ + ["npm:1.1.3", {\ + "packageLocation": "../../../.yarn/berry/cache/color-name-npm-1.1.3-728b7b5d39-10c0.zip/node_modules/color-name/",\ + "packageDependencies": [\ + ["color-name", "npm:1.1.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:1.1.4", {\ + "packageLocation": "../../../.yarn/berry/cache/color-name-npm-1.1.4-025792b0ea-10c0.zip/node_modules/color-name/",\ + "packageDependencies": [\ + ["color-name", "npm:1.1.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["color-support", [\ + ["npm:1.1.3", {\ + "packageLocation": "../../../.yarn/berry/cache/color-support-npm-1.1.3-3be5c53455-10c0.zip/node_modules/color-support/",\ + "packageDependencies": [\ + ["color-support", "npm:1.1.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["colors", [\ + ["npm:1.2.5", {\ + "packageLocation": "../../../.yarn/berry/cache/colors-npm-1.2.5-891bb7682f-10c0.zip/node_modules/colors/",\ + "packageDependencies": [\ + ["colors", "npm:1.2.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["commander", [\ + ["npm:11.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/commander-npm-11.1.0-56e979613c-10c0.zip/node_modules/commander/",\ + "packageDependencies": [\ + ["commander", "npm:11.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.20.3", {\ + "packageLocation": "../../../.yarn/berry/cache/commander-npm-2.20.3-d8dcbaa39b-10c0.zip/node_modules/commander/",\ + "packageDependencies": [\ + ["commander", "npm:2.20.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/commander-npm-7.2.0-19178180f8-10c0.zip/node_modules/commander/",\ + "packageDependencies": [\ + ["commander", "npm:7.2.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:9.5.0", {\ + "packageLocation": "../../../.yarn/berry/cache/commander-npm-9.5.0-993b3f2434-10c0.zip/node_modules/commander/",\ + "packageDependencies": [\ + ["commander", "npm:9.5.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["comment-json", [\ + ["npm:4.2.3", {\ + "packageLocation": "../../../.yarn/berry/cache/comment-json-npm-4.2.3-5f699ecc8d-10c0.zip/node_modules/comment-json/",\ + "packageDependencies": [\ + ["comment-json", "npm:4.2.3"],\ + ["array-timsort", "npm:1.0.3"],\ + ["core-util-is", "npm:1.0.3"],\ + ["esprima", "npm:4.0.1"],\ + ["has-own-prop", "npm:2.0.0"],\ + ["repeat-string", "npm:1.6.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["commitizen", [\ + ["npm:4.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/commitizen-npm-4.3.0-3695cdaf66-10c0.zip/node_modules/commitizen/",\ + "packageDependencies": [\ + ["commitizen", "npm:4.3.0"],\ + ["cachedir", "npm:2.3.0"],\ + ["cz-conventional-changelog", "npm:3.3.0"],\ + ["dedent", "npm:0.7.0"],\ + ["detect-indent", "npm:6.1.0"],\ + ["find-node-modules", "npm:2.1.3"],\ + ["find-root", "npm:1.1.0"],\ + ["fs-extra", "npm:9.1.0"],\ + ["glob", "npm:7.2.3"],\ + ["inquirer", "npm:8.2.5"],\ + ["is-utf8", "npm:0.2.1"],\ + ["lodash", "npm:4.17.21"],\ + ["minimist", "npm:1.2.7"],\ + ["strip-bom", "npm:4.0.0"],\ + ["strip-json-comments", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["common-path-prefix", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/common-path-prefix-npm-3.0.0-68b78785c1-10c0.zip/node_modules/common-path-prefix/",\ + "packageDependencies": [\ + ["common-path-prefix", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["commondir", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/commondir-npm-1.0.1-291b790340-10c0.zip/node_modules/commondir/",\ + "packageDependencies": [\ + ["commondir", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["compare-func", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/compare-func-npm-2.0.0-9cd7852f23-10c0.zip/node_modules/compare-func/",\ + "packageDependencies": [\ + ["compare-func", "npm:2.0.0"],\ + ["array-ify", "npm:1.0.0"],\ + ["dot-prop", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["concat-map", [\ + ["npm:0.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/concat-map-npm-0.0.1-85a921b7ee-10c0.zip/node_modules/concat-map/",\ + "packageDependencies": [\ + ["concat-map", "npm:0.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["concat-stream", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/concat-stream-npm-2.0.0-8bb2ad5aa0-10c0.zip/node_modules/concat-stream/",\ + "packageDependencies": [\ + ["concat-stream", "npm:2.0.0"],\ + ["buffer-from", "npm:1.1.2"],\ + ["inherits", "npm:2.0.4"],\ + ["readable-stream", "npm:3.6.2"],\ + ["typedarray", "npm:0.0.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["concordance", [\ + ["npm:5.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/concordance-npm-5.0.4-e641405dd9-10c0.zip/node_modules/concordance/",\ + "packageDependencies": [\ + ["concordance", "npm:5.0.4"],\ + ["date-time", "npm:3.1.0"],\ + ["esutils", "npm:2.0.3"],\ + ["fast-diff", "npm:1.3.0"],\ + ["js-string-escape", "npm:1.0.1"],\ + ["lodash", "npm:4.17.21"],\ + ["md5-hex", "npm:3.0.1"],\ + ["semver", "npm:7.5.4"],\ + ["well-known-symbols", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["configstore", [\ + ["npm:6.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/configstore-npm-6.0.0-410b4e0bf5-10c0.zip/node_modules/configstore/",\ + "packageDependencies": [\ + ["configstore", "npm:6.0.0"],\ + ["dot-prop", "npm:6.0.1"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["unique-string", "npm:3.0.0"],\ + ["write-file-atomic", "npm:3.0.3"],\ + ["xdg-basedir", "npm:5.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["console-control-strings", [\ + ["npm:1.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/console-control-strings-npm-1.1.0-e3160e5275-10c0.zip/node_modules/console-control-strings/",\ + "packageDependencies": [\ + ["console-control-strings", "npm:1.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["content-disposition", [\ + ["npm:0.5.4", {\ + "packageLocation": "../../../.yarn/berry/cache/content-disposition-npm-0.5.4-2d93678616-10c0.zip/node_modules/content-disposition/",\ + "packageDependencies": [\ + ["content-disposition", "npm:0.5.4"],\ + ["safe-buffer", "npm:5.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["content-type", [\ + ["npm:1.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/content-type-npm-1.0.5-3e037bf9ab-10c0.zip/node_modules/content-type/",\ + "packageDependencies": [\ + ["content-type", "npm:1.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog", [\ + ["npm:3.1.25", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-changelog-npm-3.1.25-dfc69e696b-10c0.zip/node_modules/conventional-changelog/",\ + "packageDependencies": [\ + ["conventional-changelog", "npm:3.1.25"],\ + ["conventional-changelog-angular", "npm:5.0.13"],\ + ["conventional-changelog-atom", "npm:2.0.8"],\ + ["conventional-changelog-codemirror", "npm:2.0.8"],\ + ["conventional-changelog-conventionalcommits", "npm:4.6.3"],\ + ["conventional-changelog-core", "npm:4.2.4"],\ + ["conventional-changelog-ember", "npm:2.0.9"],\ + ["conventional-changelog-eslint", "npm:3.0.9"],\ + ["conventional-changelog-express", "npm:2.0.6"],\ + ["conventional-changelog-jquery", "npm:3.0.11"],\ + ["conventional-changelog-jshint", "npm:2.0.9"],\ + ["conventional-changelog-preset-loader", "npm:2.3.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-angular", [\ + ["npm:5.0.13", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-changelog-angular-npm-5.0.13-50e4a302c4-10c0.zip/node_modules/conventional-changelog-angular/",\ + "packageDependencies": [\ + ["conventional-changelog-angular", "npm:5.0.13"],\ + ["compare-func", "npm:2.0.0"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-atom", [\ + ["npm:2.0.8", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-changelog-atom-npm-2.0.8-ab61571c15-10c0.zip/node_modules/conventional-changelog-atom/",\ + "packageDependencies": [\ + ["conventional-changelog-atom", "npm:2.0.8"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-codemirror", [\ + ["npm:2.0.8", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-changelog-codemirror-npm-2.0.8-342d72f6a3-10c0.zip/node_modules/conventional-changelog-codemirror/",\ + "packageDependencies": [\ + ["conventional-changelog-codemirror", "npm:2.0.8"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-config-spec", [\ + ["npm:2.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-changelog-config-spec-npm-2.1.0-267a163a1a-10c0.zip/node_modules/conventional-changelog-config-spec/",\ + "packageDependencies": [\ + ["conventional-changelog-config-spec", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-conventionalcommits", [\ + ["npm:4.6.3", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-changelog-conventionalcommits-npm-4.6.3-8a4923dc62-10c0.zip/node_modules/conventional-changelog-conventionalcommits/",\ + "packageDependencies": [\ + ["conventional-changelog-conventionalcommits", "npm:4.6.3"],\ + ["compare-func", "npm:2.0.0"],\ + ["lodash", "npm:4.17.21"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-core", [\ + ["npm:4.2.4", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-changelog-core-npm-4.2.4-3507358941-10c0.zip/node_modules/conventional-changelog-core/",\ + "packageDependencies": [\ + ["conventional-changelog-core", "npm:4.2.4"],\ + ["add-stream", "npm:1.0.0"],\ + ["conventional-changelog-writer", "npm:5.0.1"],\ + ["conventional-commits-parser", "npm:3.2.4"],\ + ["dateformat", "npm:3.0.3"],\ + ["get-pkg-repo", "npm:4.2.1"],\ + ["git-raw-commits", "npm:2.0.11"],\ + ["git-remote-origin-url", "npm:2.0.0"],\ + ["git-semver-tags", "npm:4.1.1"],\ + ["lodash", "npm:4.17.21"],\ + ["normalize-package-data", "npm:3.0.3"],\ + ["q", "npm:1.5.1"],\ + ["read-pkg", "npm:3.0.0"],\ + ["read-pkg-up", "npm:3.0.0"],\ + ["through2", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-ember", [\ + ["npm:2.0.9", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-changelog-ember-npm-2.0.9-2276834930-10c0.zip/node_modules/conventional-changelog-ember/",\ + "packageDependencies": [\ + ["conventional-changelog-ember", "npm:2.0.9"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-eslint", [\ + ["npm:3.0.9", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-changelog-eslint-npm-3.0.9-62c523a901-10c0.zip/node_modules/conventional-changelog-eslint/",\ + "packageDependencies": [\ + ["conventional-changelog-eslint", "npm:3.0.9"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-express", [\ + ["npm:2.0.6", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-changelog-express-npm-2.0.6-8a37ff0369-10c0.zip/node_modules/conventional-changelog-express/",\ + "packageDependencies": [\ + ["conventional-changelog-express", "npm:2.0.6"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-jquery", [\ + ["npm:3.0.11", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-changelog-jquery-npm-3.0.11-d4ff10c6e2-10c0.zip/node_modules/conventional-changelog-jquery/",\ + "packageDependencies": [\ + ["conventional-changelog-jquery", "npm:3.0.11"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-jshint", [\ + ["npm:2.0.9", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-changelog-jshint-npm-2.0.9-ef6b791bee-10c0.zip/node_modules/conventional-changelog-jshint/",\ + "packageDependencies": [\ + ["conventional-changelog-jshint", "npm:2.0.9"],\ + ["compare-func", "npm:2.0.0"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-preset-loader", [\ + ["npm:2.3.4", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-changelog-preset-loader-npm-2.3.4-a907f2e49a-10c0.zip/node_modules/conventional-changelog-preset-loader/",\ + "packageDependencies": [\ + ["conventional-changelog-preset-loader", "npm:2.3.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-changelog-writer", [\ + ["npm:5.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-changelog-writer-npm-5.0.1-c7d8f4132f-10c0.zip/node_modules/conventional-changelog-writer/",\ + "packageDependencies": [\ + ["conventional-changelog-writer", "npm:5.0.1"],\ + ["conventional-commits-filter", "npm:2.0.7"],\ + ["dateformat", "npm:3.0.3"],\ + ["handlebars", "npm:4.7.8"],\ + ["json-stringify-safe", "npm:5.0.1"],\ + ["lodash", "npm:4.17.21"],\ + ["meow", "npm:8.1.2"],\ + ["semver", "npm:6.3.1"],\ + ["split", "npm:1.0.1"],\ + ["through2", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-commit-types", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-commit-types-npm-3.0.0-e12e37c124-10c0.zip/node_modules/conventional-commit-types/",\ + "packageDependencies": [\ + ["conventional-commit-types", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-commits-filter", [\ + ["npm:2.0.7", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-commits-filter-npm-2.0.7-8762ee3bfa-10c0.zip/node_modules/conventional-commits-filter/",\ + "packageDependencies": [\ + ["conventional-commits-filter", "npm:2.0.7"],\ + ["lodash.ismatch", "npm:4.4.0"],\ + ["modify-values", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-commits-parser", [\ + ["npm:3.2.4", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-commits-parser-npm-3.2.4-d1ebb48cf6-10c0.zip/node_modules/conventional-commits-parser/",\ + "packageDependencies": [\ + ["conventional-commits-parser", "npm:3.2.4"],\ + ["JSONStream", "npm:1.3.5"],\ + ["is-text-path", "npm:1.0.1"],\ + ["lodash", "npm:4.17.21"],\ + ["meow", "npm:8.1.2"],\ + ["split2", "npm:3.2.2"],\ + ["through2", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["conventional-recommended-bump", [\ + ["npm:6.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/conventional-recommended-bump-npm-6.1.0-18a6db0ce9-10c0.zip/node_modules/conventional-recommended-bump/",\ + "packageDependencies": [\ + ["conventional-recommended-bump", "npm:6.1.0"],\ + ["concat-stream", "npm:2.0.0"],\ + ["conventional-changelog-preset-loader", "npm:2.3.4"],\ + ["conventional-commits-filter", "npm:2.0.7"],\ + ["conventional-commits-parser", "npm:3.2.4"],\ + ["git-raw-commits", "npm:2.0.11"],\ + ["git-semver-tags", "npm:4.1.1"],\ + ["meow", "npm:8.1.2"],\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["convert-source-map", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/convert-source-map-npm-2.0.0-7ab664dc4e-10c0.zip/node_modules/convert-source-map/",\ + "packageDependencies": [\ + ["convert-source-map", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["convert-to-spaces", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/convert-to-spaces-npm-2.0.1-c08fae1ac6-10c0.zip/node_modules/convert-to-spaces/",\ + "packageDependencies": [\ + ["convert-to-spaces", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cookie", [\ + ["npm:0.5.0", {\ + "packageLocation": "../../../.yarn/berry/cache/cookie-npm-0.5.0-e2d58a161a-10c0.zip/node_modules/cookie/",\ + "packageDependencies": [\ + ["cookie", "npm:0.5.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cookie-signature", [\ + ["npm:1.0.6", {\ + "packageLocation": "../../../.yarn/berry/cache/cookie-signature-npm-1.0.6-93f325f7f0-10c0.zip/node_modules/cookie-signature/",\ + "packageDependencies": [\ + ["cookie-signature", "npm:1.0.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["core-util-is", [\ + ["npm:1.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/core-util-is-npm-1.0.3-ca74b76c90-10c0.zip/node_modules/core-util-is/",\ + "packageDependencies": [\ + ["core-util-is", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cosmiconfig", [\ + ["npm:8.3.6", {\ + "packageLocation": "../../../.yarn/berry/cache/cosmiconfig-npm-8.3.6-a5566e2779-10c0.zip/node_modules/cosmiconfig/",\ + "packageDependencies": [\ + ["cosmiconfig", "npm:8.3.6"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:f5b98f17ad7ea81ab857071041c4ce431e85f7ad9573fd6e8cece457137e8a3cb24f7241d1c6f6a0018b320aaa8402caf4d54ddf5f10267d682064c4805d3882#npm:8.3.6", {\ + "packageLocation": "./.yarn/__virtual__/cosmiconfig-virtual-3ff344a29a/4/.yarn/berry/cache/cosmiconfig-npm-8.3.6-a5566e2779-10c0.zip/node_modules/cosmiconfig/",\ + "packageDependencies": [\ + ["cosmiconfig", "virtual:f5b98f17ad7ea81ab857071041c4ce431e85f7ad9573fd6e8cece457137e8a3cb24f7241d1c6f6a0018b320aaa8402caf4d54ddf5f10267d682064c4805d3882#npm:8.3.6"],\ + ["@types/typescript", null],\ + ["import-fresh", "npm:3.3.0"],\ + ["js-yaml", "npm:4.1.0"],\ + ["parse-json", "npm:5.2.0"],\ + ["path-type", "npm:4.0.0"],\ + ["typescript", null]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cosmiconfig-typescript-loader", [\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/cosmiconfig-typescript-loader-npm-5.0.0-6462903b70-10c0.zip/node_modules/cosmiconfig-typescript-loader/",\ + "packageDependencies": [\ + ["cosmiconfig-typescript-loader", "npm:5.0.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:f5b98f17ad7ea81ab857071041c4ce431e85f7ad9573fd6e8cece457137e8a3cb24f7241d1c6f6a0018b320aaa8402caf4d54ddf5f10267d682064c4805d3882#npm:5.0.0", {\ + "packageLocation": "./.yarn/__virtual__/cosmiconfig-typescript-loader-virtual-99d7da4445/4/.yarn/berry/cache/cosmiconfig-typescript-loader-npm-5.0.0-6462903b70-10c0.zip/node_modules/cosmiconfig-typescript-loader/",\ + "packageDependencies": [\ + ["cosmiconfig-typescript-loader", "virtual:f5b98f17ad7ea81ab857071041c4ce431e85f7ad9573fd6e8cece457137e8a3cb24f7241d1c6f6a0018b320aaa8402caf4d54ddf5f10267d682064c4805d3882#npm:5.0.0"],\ + ["@types/cosmiconfig", null],\ + ["@types/node", null],\ + ["@types/typescript", null],\ + ["cosmiconfig", "virtual:f5b98f17ad7ea81ab857071041c4ce431e85f7ad9573fd6e8cece457137e8a3cb24f7241d1c6f6a0018b320aaa8402caf4d54ddf5f10267d682064c4805d3882#npm:8.3.6"],\ + ["jiti", "npm:1.21.0"],\ + ["typescript", null]\ + ],\ + "packagePeers": [\ + "@types/cosmiconfig",\ + "@types/node",\ + "@types/typescript",\ + "cosmiconfig",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cp-file", [\ + ["npm:10.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/cp-file-npm-10.0.0-2641285fb1-10c0.zip/node_modules/cp-file/",\ + "packageDependencies": [\ + ["cp-file", "npm:10.0.0"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["nested-error-stacks", "npm:2.1.1"],\ + ["p-event", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cpy", [\ + ["npm:10.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/cpy-npm-10.1.0-4e4f5d40c2-10c0.zip/node_modules/cpy/",\ + "packageDependencies": [\ + ["cpy", "npm:10.1.0"],\ + ["arrify", "npm:3.0.0"],\ + ["cp-file", "npm:10.0.0"],\ + ["globby", "npm:13.2.2"],\ + ["junk", "npm:4.0.1"],\ + ["micromatch", "npm:4.0.5"],\ + ["nested-error-stacks", "npm:2.1.1"],\ + ["p-filter", "npm:3.0.0"],\ + ["p-map", "npm:6.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cpy-cli", [\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/cpy-cli-npm-5.0.0-58ca287fe2-10c0.zip/node_modules/cpy-cli/",\ + "packageDependencies": [\ + ["cpy-cli", "npm:5.0.0"],\ + ["cpy", "npm:10.1.0"],\ + ["meow", "npm:12.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cross-spawn", [\ + ["npm:7.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/cross-spawn-npm-7.0.3-e4ff3e65b3-10c0.zip/node_modules/cross-spawn/",\ + "packageDependencies": [\ + ["cross-spawn", "npm:7.0.3"],\ + ["path-key", "npm:3.1.1"],\ + ["shebang-command", "npm:2.0.0"],\ + ["which", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["crypto-random-string", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/crypto-random-string-npm-4.0.0-b9f0f76168-10c0.zip/node_modules/crypto-random-string/",\ + "packageDependencies": [\ + ["crypto-random-string", "npm:4.0.0"],\ + ["type-fest", "npm:1.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/cspell-npm-8.3.2-d3d68133fb-10c0.zip/node_modules/cspell/",\ + "packageDependencies": [\ + ["cspell", "npm:8.3.2"],\ + ["@cspell/cspell-json-reporter", "npm:8.3.2"],\ + ["@cspell/cspell-pipe", "npm:8.3.2"],\ + ["@cspell/cspell-types", "npm:8.3.2"],\ + ["@cspell/dynamic-import", "npm:8.3.2"],\ + ["chalk", "npm:5.3.0"],\ + ["chalk-template", "npm:1.1.0"],\ + ["commander", "npm:11.1.0"],\ + ["cspell-gitignore", "npm:8.3.2"],\ + ["cspell-glob", "npm:8.3.2"],\ + ["cspell-io", "npm:8.3.2"],\ + ["cspell-lib", "npm:8.3.2"],\ + ["fast-glob", "npm:3.3.2"],\ + ["fast-json-stable-stringify", "npm:2.1.0"],\ + ["file-entry-cache", "npm:8.0.0"],\ + ["get-stdin", "npm:9.0.0"],\ + ["semver", "npm:7.5.4"],\ + ["strip-ansi", "npm:7.1.0"],\ + ["vscode-uri", "npm:3.0.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell-config-lib", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/cspell-config-lib-npm-8.3.2-23aa0ed7a8-10c0.zip/node_modules/cspell-config-lib/",\ + "packageDependencies": [\ + ["cspell-config-lib", "npm:8.3.2"],\ + ["@cspell/cspell-types", "npm:8.3.2"],\ + ["comment-json", "npm:4.2.3"],\ + ["yaml", "npm:2.3.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell-dictionary", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/cspell-dictionary-npm-8.3.2-dcbcc7f44d-10c0.zip/node_modules/cspell-dictionary/",\ + "packageDependencies": [\ + ["cspell-dictionary", "npm:8.3.2"],\ + ["@cspell/cspell-pipe", "npm:8.3.2"],\ + ["@cspell/cspell-types", "npm:8.3.2"],\ + ["cspell-trie-lib", "npm:8.3.2"],\ + ["fast-equals", "npm:5.0.1"],\ + ["gensequence", "npm:6.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell-gitignore", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/cspell-gitignore-npm-8.3.2-fac35a0208-10c0.zip/node_modules/cspell-gitignore/",\ + "packageDependencies": [\ + ["cspell-gitignore", "npm:8.3.2"],\ + ["cspell-glob", "npm:8.3.2"],\ + ["find-up-simple", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell-glob", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/cspell-glob-npm-8.3.2-c098bc7796-10c0.zip/node_modules/cspell-glob/",\ + "packageDependencies": [\ + ["cspell-glob", "npm:8.3.2"],\ + ["micromatch", "npm:4.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell-grammar", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/cspell-grammar-npm-8.3.2-ab7ffca829-10c0.zip/node_modules/cspell-grammar/",\ + "packageDependencies": [\ + ["cspell-grammar", "npm:8.3.2"],\ + ["@cspell/cspell-pipe", "npm:8.3.2"],\ + ["@cspell/cspell-types", "npm:8.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell-io", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/cspell-io-npm-8.3.2-ede9d006d1-10c0.zip/node_modules/cspell-io/",\ + "packageDependencies": [\ + ["cspell-io", "npm:8.3.2"],\ + ["@cspell/cspell-service-bus", "npm:8.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell-lib", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/cspell-lib-npm-8.3.2-bd9a169a49-10c0.zip/node_modules/cspell-lib/",\ + "packageDependencies": [\ + ["cspell-lib", "npm:8.3.2"],\ + ["@cspell/cspell-bundled-dicts", "npm:8.3.2"],\ + ["@cspell/cspell-pipe", "npm:8.3.2"],\ + ["@cspell/cspell-resolver", "npm:8.3.2"],\ + ["@cspell/cspell-types", "npm:8.3.2"],\ + ["@cspell/dynamic-import", "npm:8.3.2"],\ + ["@cspell/strong-weak-map", "npm:8.3.2"],\ + ["clear-module", "npm:4.1.2"],\ + ["comment-json", "npm:4.2.3"],\ + ["configstore", "npm:6.0.0"],\ + ["cspell-config-lib", "npm:8.3.2"],\ + ["cspell-dictionary", "npm:8.3.2"],\ + ["cspell-glob", "npm:8.3.2"],\ + ["cspell-grammar", "npm:8.3.2"],\ + ["cspell-io", "npm:8.3.2"],\ + ["cspell-trie-lib", "npm:8.3.2"],\ + ["fast-equals", "npm:5.0.1"],\ + ["gensequence", "npm:6.0.0"],\ + ["import-fresh", "npm:3.3.0"],\ + ["resolve-from", "npm:5.0.0"],\ + ["vscode-languageserver-textdocument", "npm:1.0.11"],\ + ["vscode-uri", "npm:3.0.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cspell-trie-lib", [\ + ["npm:8.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/cspell-trie-lib-npm-8.3.2-960ea676e2-10c0.zip/node_modules/cspell-trie-lib/",\ + "packageDependencies": [\ + ["cspell-trie-lib", "npm:8.3.2"],\ + ["@cspell/cspell-pipe", "npm:8.3.2"],\ + ["@cspell/cspell-types", "npm:8.3.2"],\ + ["gensequence", "npm:6.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["currently-unhandled", [\ + ["npm:0.4.1", {\ + "packageLocation": "../../../.yarn/berry/cache/currently-unhandled-npm-0.4.1-38eddab665-10c0.zip/node_modules/currently-unhandled/",\ + "packageDependencies": [\ + ["currently-unhandled", "npm:0.4.1"],\ + ["array-find-index", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["cz-conventional-changelog", [\ + ["npm:3.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/cz-conventional-changelog-npm-3.3.0-46c1d2629a-10c0.zip/node_modules/cz-conventional-changelog/",\ + "packageDependencies": [\ + ["cz-conventional-changelog", "npm:3.3.0"],\ + ["@commitlint/load", "npm:18.4.4"],\ + ["chalk", "npm:2.4.2"],\ + ["commitizen", "npm:4.3.0"],\ + ["conventional-commit-types", "npm:3.0.0"],\ + ["lodash.map", "npm:4.6.0"],\ + ["longest", "npm:2.0.1"],\ + ["word-wrap", "npm:1.2.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["dargs", [\ + ["npm:7.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/dargs-npm-7.0.0-62701e0c7a-10c0.zip/node_modules/dargs/",\ + "packageDependencies": [\ + ["dargs", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["date-time", [\ + ["npm:3.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/date-time-npm-3.1.0-50f6af7aef-10c0.zip/node_modules/date-time/",\ + "packageDependencies": [\ + ["date-time", "npm:3.1.0"],\ + ["time-zone", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["dateformat", [\ + ["npm:3.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/dateformat-npm-3.0.3-ed02e5ddbd-10c0.zip/node_modules/dateformat/",\ + "packageDependencies": [\ + ["dateformat", "npm:3.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["debug", [\ + ["npm:2.6.9", {\ + "packageLocation": "../../../.yarn/berry/cache/debug-npm-2.6.9-7d4cb597dc-10c0.zip/node_modules/debug/",\ + "packageDependencies": [\ + ["debug", "npm:2.6.9"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["npm:3.2.7", {\ + "packageLocation": "../../../.yarn/berry/cache/debug-npm-3.2.7-754e818c7a-10c0.zip/node_modules/debug/",\ + "packageDependencies": [\ + ["debug", "npm:3.2.7"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["npm:4.3.4", {\ + "packageLocation": "../../../.yarn/berry/cache/debug-npm-4.3.4-4513954577-10c0.zip/node_modules/debug/",\ + "packageDependencies": [\ + ["debug", "npm:4.3.4"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:2a426afc4b2eef43db12a540d29c2b5476640459bfcd5c24f86bb401cf8cce97e63bd81794d206a5643057e7f662643afd5ce3dfc4d4bfd8e706006c6309c5fa#npm:3.2.7", {\ + "packageLocation": "./.yarn/__virtual__/debug-virtual-d2345003b7/4/.yarn/berry/cache/debug-npm-3.2.7-754e818c7a-10c0.zip/node_modules/debug/",\ + "packageDependencies": [\ + ["debug", "virtual:2a426afc4b2eef43db12a540d29c2b5476640459bfcd5c24f86bb401cf8cce97e63bd81794d206a5643057e7f662643afd5ce3dfc4d4bfd8e706006c6309c5fa#npm:3.2.7"],\ + ["@types/supports-color", null],\ + ["ms", "npm:2.1.3"],\ + ["supports-color", null]\ + ],\ + "packagePeers": [\ + "@types/supports-color",\ + "supports-color"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:3840e914156da5bf3a0152609f7597e38b893022314c08ba5b292edc820681760ec6c83dde1d34d78aa58a3f32c7d8c9d754f99860fa71136383ec1e2a87f57d#npm:2.6.9", {\ + "packageLocation": "./.yarn/__virtual__/debug-virtual-73072f5d24/4/.yarn/berry/cache/debug-npm-2.6.9-7d4cb597dc-10c0.zip/node_modules/debug/",\ + "packageDependencies": [\ + ["debug", "virtual:3840e914156da5bf3a0152609f7597e38b893022314c08ba5b292edc820681760ec6c83dde1d34d78aa58a3f32c7d8c9d754f99860fa71136383ec1e2a87f57d#npm:2.6.9"],\ + ["@types/supports-color", null],\ + ["ms", "npm:2.0.0"],\ + ["supports-color", null]\ + ],\ + "packagePeers": [\ + "@types/supports-color",\ + "supports-color"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4", {\ + "packageLocation": "./.yarn/__virtual__/debug-virtual-ede24543b9/4/.yarn/berry/cache/debug-npm-4.3.4-4513954577-10c0.zip/node_modules/debug/",\ + "packageDependencies": [\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["@types/supports-color", null],\ + ["ms", "npm:2.1.2"],\ + ["supports-color", null]\ + ],\ + "packagePeers": [\ + "@types/supports-color",\ + "supports-color"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["decamelize", [\ + ["npm:1.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/decamelize-npm-1.2.0-c5a2fdc622-10c0.zip/node_modules/decamelize/",\ + "packageDependencies": [\ + ["decamelize", "npm:1.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["decamelize-keys", [\ + ["npm:1.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/decamelize-keys-npm-1.1.1-4cfa36ed4b-10c0.zip/node_modules/decamelize-keys/",\ + "packageDependencies": [\ + ["decamelize-keys", "npm:1.1.1"],\ + ["decamelize", "npm:1.2.0"],\ + ["map-obj", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["dedent", [\ + ["npm:0.7.0", {\ + "packageLocation": "../../../.yarn/berry/cache/dedent-npm-0.7.0-2dbb45a4c5-10c0.zip/node_modules/dedent/",\ + "packageDependencies": [\ + ["dedent", "npm:0.7.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["deep-extend", [\ + ["npm:0.6.0", {\ + "packageLocation": "../../../.yarn/berry/cache/deep-extend-npm-0.6.0-e182924219-10c0.zip/node_modules/deep-extend/",\ + "packageDependencies": [\ + ["deep-extend", "npm:0.6.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["deep-is", [\ + ["npm:0.1.4", {\ + "packageLocation": "../../../.yarn/berry/cache/deep-is-npm-0.1.4-88938b5a67-10c0.zip/node_modules/deep-is/",\ + "packageDependencies": [\ + ["deep-is", "npm:0.1.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["deepmerge", [\ + ["npm:4.3.1", {\ + "packageLocation": "../../../.yarn/berry/cache/deepmerge-npm-4.3.1-4f751a0844-10c0.zip/node_modules/deepmerge/",\ + "packageDependencies": [\ + ["deepmerge", "npm:4.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["deepmerge-ts", [\ + ["npm:5.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/deepmerge-ts-npm-5.1.0-f2ee394fd9-10c0.zip/node_modules/deepmerge-ts/",\ + "packageDependencies": [\ + ["deepmerge-ts", "npm:5.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["default-browser", [\ + ["npm:5.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/default-browser-npm-5.2.1-e2f8bca718-10c0.zip/node_modules/default-browser/",\ + "packageDependencies": [\ + ["default-browser", "npm:5.2.1"],\ + ["bundle-name", "npm:4.1.0"],\ + ["default-browser-id", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["default-browser-id", [\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/default-browser-id-npm-5.0.0-41fa64d5bb-10c0.zip/node_modules/default-browser-id/",\ + "packageDependencies": [\ + ["default-browser-id", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["defaults", [\ + ["npm:1.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/defaults-npm-1.0.4-f3fbaf2528-10c0.zip/node_modules/defaults/",\ + "packageDependencies": [\ + ["defaults", "npm:1.0.4"],\ + ["clone", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["define-data-property", [\ + ["npm:1.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/define-data-property-npm-1.1.1-2b5156d112-10c0.zip/node_modules/define-data-property/",\ + "packageDependencies": [\ + ["define-data-property", "npm:1.1.1"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["gopd", "npm:1.0.1"],\ + ["has-property-descriptors", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["define-lazy-prop", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/define-lazy-prop-npm-3.0.0-6bb0fc1510-10c0.zip/node_modules/define-lazy-prop/",\ + "packageDependencies": [\ + ["define-lazy-prop", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["define-properties", [\ + ["npm:1.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/define-properties-npm-1.2.1-8a4d42413b-10c0.zip/node_modules/define-properties/",\ + "packageDependencies": [\ + ["define-properties", "npm:1.2.1"],\ + ["define-data-property", "npm:1.1.1"],\ + ["has-property-descriptors", "npm:1.0.1"],\ + ["object-keys", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["delegates", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/delegates-npm-1.0.0-9b1942d75f-10c0.zip/node_modules/delegates/",\ + "packageDependencies": [\ + ["delegates", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["depd", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/depd-npm-2.0.0-b6c51a4b43-10c0.zip/node_modules/depd/",\ + "packageDependencies": [\ + ["depd", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["dependency-tree", [\ + ["npm:9.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/dependency-tree-npm-9.0.0-adb20d5fab-10c0.zip/node_modules/dependency-tree/",\ + "packageDependencies": [\ + ["dependency-tree", "npm:9.0.0"],\ + ["commander", "npm:2.20.3"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["filing-cabinet", "npm:3.3.1"],\ + ["precinct", "npm:9.2.1"],\ + ["typescript", "patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["destroy", [\ + ["npm:1.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/destroy-npm-1.2.0-6a511802e2-10c0.zip/node_modules/destroy/",\ + "packageDependencies": [\ + ["destroy", "npm:1.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detect-file", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/detect-file-npm-1.0.0-a22ca7c5b6-10c0.zip/node_modules/detect-file/",\ + "packageDependencies": [\ + ["detect-file", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detect-indent", [\ + ["npm:6.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/detect-indent-npm-6.1.0-d8c441ff7a-10c0.zip/node_modules/detect-indent/",\ + "packageDependencies": [\ + ["detect-indent", "npm:6.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detect-libc", [\ + ["npm:2.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/detect-libc-npm-2.0.2-03afa59137-10c0.zip/node_modules/detect-libc/",\ + "packageDependencies": [\ + ["detect-libc", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detect-newline", [\ + ["npm:3.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/detect-newline-npm-3.1.0-6d33fa8d37-10c0.zip/node_modules/detect-newline/",\ + "packageDependencies": [\ + ["detect-newline", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-amd", [\ + ["npm:3.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-amd-npm-3.1.2-e4c385792e-10c0.zip/node_modules/detective-amd/",\ + "packageDependencies": [\ + ["detective-amd", "npm:3.1.2"],\ + ["ast-module-types", "npm:3.0.0"],\ + ["escodegen", "npm:2.1.0"],\ + ["get-amd-module-type", "npm:3.0.2"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-amd-npm-4.2.0-ab3ac7d60a-10c0.zip/node_modules/detective-amd/",\ + "packageDependencies": [\ + ["detective-amd", "npm:4.2.0"],\ + ["ast-module-types", "npm:4.0.0"],\ + ["escodegen", "npm:2.1.0"],\ + ["get-amd-module-type", "npm:4.1.0"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-cjs", [\ + ["npm:3.1.3", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-cjs-npm-3.1.3-61080007aa-10c0.zip/node_modules/detective-cjs/",\ + "packageDependencies": [\ + ["detective-cjs", "npm:3.1.3"],\ + ["ast-module-types", "npm:3.0.0"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-cjs-npm-4.1.0-0d445263e2-10c0.zip/node_modules/detective-cjs/",\ + "packageDependencies": [\ + ["detective-cjs", "npm:4.1.0"],\ + ["ast-module-types", "npm:4.0.0"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-es6", [\ + ["npm:2.2.2", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-es6-npm-2.2.2-99504d5c48-10c0.zip/node_modules/detective-es6/",\ + "packageDependencies": [\ + ["detective-es6", "npm:2.2.2"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-es6-npm-3.0.1-23dcfc7269-10c0.zip/node_modules/detective-es6/",\ + "packageDependencies": [\ + ["detective-es6", "npm:3.0.1"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-less", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-less-npm-1.0.2-51713fb487-10c0.zip/node_modules/detective-less/",\ + "packageDependencies": [\ + ["detective-less", "npm:1.0.2"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["gonzales-pe", "npm:4.3.0"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-postcss", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-postcss-npm-4.0.0-3898e15a71-10c0.zip/node_modules/detective-postcss/",\ + "packageDependencies": [\ + ["detective-postcss", "npm:4.0.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["is-url", "npm:1.2.4"],\ + ["postcss", "npm:8.4.33"],\ + ["postcss-values-parser", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.1.3", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-postcss-npm-6.1.3-23a358a5ec-10c0.zip/node_modules/detective-postcss/",\ + "packageDependencies": [\ + ["detective-postcss", "npm:6.1.3"],\ + ["is-url", "npm:1.2.4"],\ + ["postcss", "npm:8.4.33"],\ + ["postcss-values-parser", "virtual:23a358a5ecd6ab3181f7fc99cb0bf6fd4a0734b6e0a2eae05968d1aee7473261ac87704c1b5ed9c912b3faaebe60dd7819a21b2732f3649be486506b370c4c7e#npm:6.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-sass", [\ + ["npm:3.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-sass-npm-3.0.2-6ad220e065-10c0.zip/node_modules/detective-sass/",\ + "packageDependencies": [\ + ["detective-sass", "npm:3.0.2"],\ + ["gonzales-pe", "npm:4.3.0"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.3", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-sass-npm-4.1.3-395275827c-10c0.zip/node_modules/detective-sass/",\ + "packageDependencies": [\ + ["detective-sass", "npm:4.1.3"],\ + ["gonzales-pe", "npm:4.3.0"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-scss", [\ + ["npm:2.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-scss-npm-2.0.2-ec5d066304-10c0.zip/node_modules/detective-scss/",\ + "packageDependencies": [\ + ["detective-scss", "npm:2.0.2"],\ + ["gonzales-pe", "npm:4.3.0"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-scss-npm-3.1.1-52275ee032-10c0.zip/node_modules/detective-scss/",\ + "packageDependencies": [\ + ["detective-scss", "npm:3.1.1"],\ + ["gonzales-pe", "npm:4.3.0"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-stylus", [\ + ["npm:1.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-stylus-npm-1.0.3-e1fc341ca5-10c0.zip/node_modules/detective-stylus/",\ + "packageDependencies": [\ + ["detective-stylus", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-stylus-npm-2.0.1-6700998788-10c0.zip/node_modules/detective-stylus/",\ + "packageDependencies": [\ + ["detective-stylus", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-stylus-npm-3.0.0-7d99db3d7a-10c0.zip/node_modules/detective-stylus/",\ + "packageDependencies": [\ + ["detective-stylus", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["detective-typescript", [\ + ["npm:7.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-typescript-npm-7.0.2-aa734fe591-10c0.zip/node_modules/detective-typescript/",\ + "packageDependencies": [\ + ["detective-typescript", "npm:7.0.2"],\ + ["@typescript-eslint/typescript-estree", "virtual:aa734fe5910ab2043ff5b76d2c49e3a3aff381cfe805800a92c03671e0b66da8ec7f2fc8ded6c6952cec7a57f0f439fa45d51213f03f478f98eb208ccfd5b76b#npm:4.33.0"],\ + ["ast-module-types", "npm:2.7.1"],\ + ["node-source-walk", "npm:4.3.0"],\ + ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:9.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/detective-typescript-npm-9.1.1-7acec9484f-10c0.zip/node_modules/detective-typescript/",\ + "packageDependencies": [\ + ["detective-typescript", "npm:9.1.1"],\ + ["@typescript-eslint/typescript-estree", "virtual:7acec9484f01c68f8aa5f9931e6ffc696653513b41af7f3d08663c42ada1d00ee091c13e0780af9dcf735ec8a6e052660a87dc109342f3525583cf5ed4b2167b#npm:5.62.0"],\ + ["ast-module-types", "npm:4.0.0"],\ + ["node-source-walk", "npm:5.0.2"],\ + ["typescript", "patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["dir-glob", [\ + ["npm:3.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/dir-glob-npm-3.0.1-1aea628b1b-10c0.zip/node_modules/dir-glob/",\ + "packageDependencies": [\ + ["dir-glob", "npm:3.0.1"],\ + ["path-type", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["doctrine", [\ + ["npm:2.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/doctrine-npm-2.1.0-ac15d049b7-10c0.zip/node_modules/doctrine/",\ + "packageDependencies": [\ + ["doctrine", "npm:2.1.0"],\ + ["esutils", "npm:2.0.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/doctrine-npm-3.0.0-c6f1615f04-10c0.zip/node_modules/doctrine/",\ + "packageDependencies": [\ + ["doctrine", "npm:3.0.0"],\ + ["esutils", "npm:2.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["dot-prop", [\ + ["npm:5.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/dot-prop-npm-5.3.0-7bf6ee1eb8-10c0.zip/node_modules/dot-prop/",\ + "packageDependencies": [\ + ["dot-prop", "npm:5.3.0"],\ + ["is-obj", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/dot-prop-npm-6.0.1-de66211710-10c0.zip/node_modules/dot-prop/",\ + "packageDependencies": [\ + ["dot-prop", "npm:6.0.1"],\ + ["is-obj", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["dotgitignore", [\ + ["npm:2.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/dotgitignore-npm-2.1.0-fe0dd60e0e-10c0.zip/node_modules/dotgitignore/",\ + "packageDependencies": [\ + ["dotgitignore", "npm:2.1.0"],\ + ["find-up", "npm:3.0.0"],\ + ["minimatch", "npm:3.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eastasianwidth", [\ + ["npm:0.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/eastasianwidth-npm-0.2.0-c37eb16bd1-10c0.zip/node_modules/eastasianwidth/",\ + "packageDependencies": [\ + ["eastasianwidth", "npm:0.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ecurve", [\ + ["npm:1.0.6", {\ + "packageLocation": "../../../.yarn/berry/cache/ecurve-npm-1.0.6-002f57f49a-10c0.zip/node_modules/ecurve/",\ + "packageDependencies": [\ + ["ecurve", "npm:1.0.6"],\ + ["bigi", "npm:1.4.2"],\ + ["safe-buffer", "npm:5.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ee-first", [\ + ["npm:1.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/ee-first-npm-1.1.1-33f8535b39-10c0.zip/node_modules/ee-first/",\ + "packageDependencies": [\ + ["ee-first", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["elliptic", [\ + ["npm:6.5.4", {\ + "packageLocation": "../../../.yarn/berry/cache/elliptic-npm-6.5.4-0ca8204a86-10c0.zip/node_modules/elliptic/",\ + "packageDependencies": [\ + ["elliptic", "npm:6.5.4"],\ + ["bn.js", "npm:4.12.0"],\ + ["brorand", "npm:1.1.0"],\ + ["hash.js", "npm:1.1.7"],\ + ["hmac-drbg", "npm:1.0.1"],\ + ["inherits", "npm:2.0.4"],\ + ["minimalistic-assert", "npm:1.0.1"],\ + ["minimalistic-crypto-utils", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["emittery", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/emittery-npm-1.0.1-3e4e6ba9b5-10c0.zip/node_modules/emittery/",\ + "packageDependencies": [\ + ["emittery", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["emoji-regex", [\ + ["npm:10.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/emoji-regex-npm-10.3.0-0c9fc2ef7f-10c0.zip/node_modules/emoji-regex/",\ + "packageDependencies": [\ + ["emoji-regex", "npm:10.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/emoji-regex-npm-8.0.0-213764015c-10c0.zip/node_modules/emoji-regex/",\ + "packageDependencies": [\ + ["emoji-regex", "npm:8.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:9.2.2", {\ + "packageLocation": "../../../.yarn/berry/cache/emoji-regex-npm-9.2.2-e6fac8d058-10c0.zip/node_modules/emoji-regex/",\ + "packageDependencies": [\ + ["emoji-regex", "npm:9.2.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["encodeurl", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/encodeurl-npm-1.0.2-f8c8454c41-10c0.zip/node_modules/encodeurl/",\ + "packageDependencies": [\ + ["encodeurl", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["encoding", [\ + ["npm:0.1.13", {\ + "packageLocation": "../../../.yarn/berry/cache/encoding-npm-0.1.13-82a1837d30-10c0.zip/node_modules/encoding/",\ + "packageDependencies": [\ + ["encoding", "npm:0.1.13"],\ + ["iconv-lite", "npm:0.6.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["enhanced-resolve", [\ + ["npm:5.15.0", {\ + "packageLocation": "../../../.yarn/berry/cache/enhanced-resolve-npm-5.15.0-16eb7ddef9-10c0.zip/node_modules/enhanced-resolve/",\ + "packageDependencies": [\ + ["enhanced-resolve", "npm:5.15.0"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["tapable", "npm:2.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["env-paths", [\ + ["npm:2.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/env-paths-npm-2.2.1-7c7577428c-10c0.zip/node_modules/env-paths/",\ + "packageDependencies": [\ + ["env-paths", "npm:2.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["err-code", [\ + ["npm:2.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/err-code-npm-2.0.3-082e0ff9a7-10c0.zip/node_modules/err-code/",\ + "packageDependencies": [\ + ["err-code", "npm:2.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["error-ex", [\ + ["npm:1.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/error-ex-npm-1.3.2-5654f80c0f-10c0.zip/node_modules/error-ex/",\ + "packageDependencies": [\ + ["error-ex", "npm:1.3.2"],\ + ["is-arrayish", "npm:0.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["es-abstract", [\ + ["npm:1.22.3", {\ + "packageLocation": "../../../.yarn/berry/cache/es-abstract-npm-1.22.3-15a58832e5-10c0.zip/node_modules/es-abstract/",\ + "packageDependencies": [\ + ["es-abstract", "npm:1.22.3"],\ + ["array-buffer-byte-length", "npm:1.0.0"],\ + ["arraybuffer.prototype.slice", "npm:1.0.2"],\ + ["available-typed-arrays", "npm:1.0.5"],\ + ["call-bind", "npm:1.0.5"],\ + ["es-set-tostringtag", "npm:2.0.2"],\ + ["es-to-primitive", "npm:1.2.1"],\ + ["function.prototype.name", "npm:1.1.6"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["get-symbol-description", "npm:1.0.0"],\ + ["globalthis", "npm:1.0.3"],\ + ["gopd", "npm:1.0.1"],\ + ["has-property-descriptors", "npm:1.0.1"],\ + ["has-proto", "npm:1.0.1"],\ + ["has-symbols", "npm:1.0.3"],\ + ["hasown", "npm:2.0.0"],\ + ["internal-slot", "npm:1.0.6"],\ + ["is-array-buffer", "npm:3.0.2"],\ + ["is-callable", "npm:1.2.7"],\ + ["is-negative-zero", "npm:2.0.2"],\ + ["is-regex", "npm:1.1.4"],\ + ["is-shared-array-buffer", "npm:1.0.2"],\ + ["is-string", "npm:1.0.7"],\ + ["is-typed-array", "npm:1.1.12"],\ + ["is-weakref", "npm:1.0.2"],\ + ["object-inspect", "npm:1.13.1"],\ + ["object-keys", "npm:1.1.1"],\ + ["object.assign", "npm:4.1.5"],\ + ["regexp.prototype.flags", "npm:1.5.1"],\ + ["safe-array-concat", "npm:1.0.1"],\ + ["safe-regex-test", "npm:1.0.1"],\ + ["string.prototype.trim", "npm:1.2.8"],\ + ["string.prototype.trimend", "npm:1.0.7"],\ + ["string.prototype.trimstart", "npm:1.0.7"],\ + ["typed-array-buffer", "npm:1.0.0"],\ + ["typed-array-byte-length", "npm:1.0.0"],\ + ["typed-array-byte-offset", "npm:1.0.0"],\ + ["typed-array-length", "npm:1.0.4"],\ + ["unbox-primitive", "npm:1.0.2"],\ + ["which-typed-array", "npm:1.1.13"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["es-set-tostringtag", [\ + ["npm:2.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/es-set-tostringtag-npm-2.0.2-dae5ec6c58-10c0.zip/node_modules/es-set-tostringtag/",\ + "packageDependencies": [\ + ["es-set-tostringtag", "npm:2.0.2"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["has-tostringtag", "npm:1.0.0"],\ + ["hasown", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["es-shim-unscopables", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/es-shim-unscopables-npm-1.0.2-a3056a4c0d-10c0.zip/node_modules/es-shim-unscopables/",\ + "packageDependencies": [\ + ["es-shim-unscopables", "npm:1.0.2"],\ + ["hasown", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["es-to-primitive", [\ + ["npm:1.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/es-to-primitive-npm-1.2.1-b7a7eac6c5-10c0.zip/node_modules/es-to-primitive/",\ + "packageDependencies": [\ + ["es-to-primitive", "npm:1.2.1"],\ + ["is-callable", "npm:1.2.7"],\ + ["is-date-object", "npm:1.0.5"],\ + ["is-symbol", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["escalade", [\ + ["npm:3.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/escalade-npm-3.1.1-e02da076aa-10c0.zip/node_modules/escalade/",\ + "packageDependencies": [\ + ["escalade", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["escape-html", [\ + ["npm:1.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/escape-html-npm-1.0.3-376c22ee74-10c0.zip/node_modules/escape-html/",\ + "packageDependencies": [\ + ["escape-html", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["escape-string-regexp", [\ + ["npm:1.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/escape-string-regexp-npm-1.0.5-3284de402f-10c0.zip/node_modules/escape-string-regexp/",\ + "packageDependencies": [\ + ["escape-string-regexp", "npm:1.0.5"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/escape-string-regexp-npm-2.0.0-aef69d2a25-10c0.zip/node_modules/escape-string-regexp/",\ + "packageDependencies": [\ + ["escape-string-regexp", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/escape-string-regexp-npm-4.0.0-4b531d8d59-10c0.zip/node_modules/escape-string-regexp/",\ + "packageDependencies": [\ + ["escape-string-regexp", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/escape-string-regexp-npm-5.0.0-a663e825ce-10c0.zip/node_modules/escape-string-regexp/",\ + "packageDependencies": [\ + ["escape-string-regexp", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["escodegen", [\ + ["npm:2.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/escodegen-npm-2.1.0-e0bf940745-10c0.zip/node_modules/escodegen/",\ + "packageDependencies": [\ + ["escodegen", "npm:2.1.0"],\ + ["esprima", "npm:4.0.1"],\ + ["estraverse", "npm:5.3.0"],\ + ["esutils", "npm:2.0.3"],\ + ["source-map", "npm:0.6.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint", [\ + ["npm:8.56.0", {\ + "packageLocation": "../../../.yarn/berry/cache/eslint-npm-8.56.0-6eec398a41-10c0.zip/node_modules/eslint/",\ + "packageDependencies": [\ + ["eslint", "npm:8.56.0"],\ + ["@eslint-community/eslint-utils", "virtual:6eec398a4132b5372ea5ffc0bc36d4c81602b7e444a89685d0d958016d8fd53df5c0c97c6a8bf99951469e2c6c06135dd192e9309f6e39b1a4c85e0faabe1f6b#npm:4.4.0"],\ + ["@eslint-community/regexpp", "npm:4.10.0"],\ + ["@eslint/eslintrc", "npm:2.1.4"],\ + ["@eslint/js", "npm:8.56.0"],\ + ["@humanwhocodes/config-array", "npm:0.11.13"],\ + ["@humanwhocodes/module-importer", "npm:1.0.1"],\ + ["@nodelib/fs.walk", "npm:1.2.8"],\ + ["@ungap/structured-clone", "npm:1.2.0"],\ + ["ajv", "npm:6.12.6"],\ + ["chalk", "npm:4.1.2"],\ + ["cross-spawn", "npm:7.0.3"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["doctrine", "npm:3.0.0"],\ + ["escape-string-regexp", "npm:4.0.0"],\ + ["eslint-scope", "npm:7.2.2"],\ + ["eslint-visitor-keys", "npm:3.4.3"],\ + ["espree", "npm:9.6.1"],\ + ["esquery", "npm:1.5.0"],\ + ["esutils", "npm:2.0.3"],\ + ["fast-deep-equal", "npm:3.1.3"],\ + ["file-entry-cache", "npm:6.0.1"],\ + ["find-up", "npm:5.0.0"],\ + ["glob-parent", "npm:6.0.2"],\ + ["globals", "npm:13.24.0"],\ + ["graphemer", "npm:1.4.0"],\ + ["ignore", "npm:5.3.0"],\ + ["imurmurhash", "npm:0.1.4"],\ + ["is-glob", "npm:4.0.3"],\ + ["is-path-inside", "npm:3.0.3"],\ + ["js-yaml", "npm:4.1.0"],\ + ["json-stable-stringify-without-jsonify", "npm:1.0.1"],\ + ["levn", "npm:0.4.1"],\ + ["lodash.merge", "npm:4.6.2"],\ + ["minimatch", "npm:3.1.2"],\ + ["natural-compare", "npm:1.4.0"],\ + ["optionator", "npm:0.9.3"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["text-table", "npm:0.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-config-bitauth", [\ + ["portal:./config/eslint-config-bitauth::locator=%40bitauth%2Flibauth%40workspace%3A.", {\ + "packageLocation": "./config/eslint-config-bitauth/",\ + "packageDependencies": [\ + ["eslint-config-bitauth", "portal:./config/eslint-config-bitauth::locator=%40bitauth%2Flibauth%40workspace%3A."]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#portal:./config/eslint-config-bitauth::locator=%40bitauth%2Flibauth%40workspace%3A.", {\ + "packageLocation": "./.yarn/__virtual__/eslint-config-bitauth-virtual-7c7cb0727b/1/config/eslint-config-bitauth/",\ + "packageDependencies": [\ + ["eslint-config-bitauth", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#portal:./config/eslint-config-bitauth::locator=%40bitauth%2Flibauth%40workspace%3A."],\ + ["@types/eslint", null],\ + ["@types/eslint-config-prettier", null],\ + ["@types/eslint-plugin-eslint-comments", null],\ + ["@types/eslint-plugin-functional", null],\ + ["@types/eslint-plugin-import", null],\ + ["@types/eslint-plugin-tsdoc", null],\ + ["@types/typescript", null],\ + ["@types/typescript-eslint__eslint-plugin", null],\ + ["@types/typescript-eslint__parser", null],\ + ["@typescript-eslint/eslint-plugin", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.18.1"],\ + ["@typescript-eslint/parser", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.17.0"],\ + ["eslint", "npm:8.56.0"],\ + ["eslint-config-prettier", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:9.1.0"],\ + ["eslint-plugin-eslint-comments", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:3.2.0"],\ + ["eslint-plugin-functional", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.0"],\ + ["eslint-plugin-import", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:2.29.1"],\ + ["eslint-plugin-tsdoc", "npm:0.2.17"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/eslint-config-prettier",\ + "@types/eslint-plugin-eslint-comments",\ + "@types/eslint-plugin-functional",\ + "@types/eslint-plugin-import",\ + "@types/eslint-plugin-tsdoc",\ + "@types/eslint",\ + "@types/typescript-eslint__eslint-plugin",\ + "@types/typescript-eslint__parser",\ + "@types/typescript",\ + "@typescript-eslint/eslint-plugin",\ + "@typescript-eslint/parser",\ + "eslint-config-prettier",\ + "eslint-plugin-eslint-comments",\ + "eslint-plugin-functional",\ + "eslint-plugin-import",\ + "eslint-plugin-tsdoc",\ + "eslint",\ + "typescript"\ + ],\ + "linkType": "SOFT"\ + }]\ + ]],\ + ["eslint-config-prettier", [\ + ["npm:9.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/eslint-config-prettier-npm-9.1.0-0e1fd42d7d-10c0.zip/node_modules/eslint-config-prettier/",\ + "packageDependencies": [\ + ["eslint-config-prettier", "npm:9.1.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:9.1.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-config-prettier-virtual-bb000c0ba3/4/.yarn/berry/cache/eslint-config-prettier-npm-9.1.0-0e1fd42d7d-10c0.zip/node_modules/eslint-config-prettier/",\ + "packageDependencies": [\ + ["eslint-config-prettier", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:9.1.0"],\ + ["@types/eslint", null],\ + ["eslint", "npm:8.56.0"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-import-resolver-node", [\ + ["npm:0.3.9", {\ + "packageLocation": "../../../.yarn/berry/cache/eslint-import-resolver-node-npm-0.3.9-2a426afc4b-10c0.zip/node_modules/eslint-import-resolver-node/",\ + "packageDependencies": [\ + ["eslint-import-resolver-node", "npm:0.3.9"],\ + ["debug", "virtual:2a426afc4b2eef43db12a540d29c2b5476640459bfcd5c24f86bb401cf8cce97e63bd81794d206a5643057e7f662643afd5ce3dfc4d4bfd8e706006c6309c5fa#npm:3.2.7"],\ + ["is-core-module", "npm:2.13.1"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-module-utils", [\ + ["npm:2.8.0", {\ + "packageLocation": "../../../.yarn/berry/cache/eslint-module-utils-npm-2.8.0-05e42bcab0-10c0.zip/node_modules/eslint-module-utils/",\ + "packageDependencies": [\ + ["eslint-module-utils", "npm:2.8.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:43aa4530715e727e25bba2c4996fd38e8d8ce2d8f6a1d9ee913eb73a1faac7177a5db105bc491396bc6a0d1c246eb19ecc3e90ca0412b3bc3f604ea2ada09079#npm:2.8.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-module-utils-virtual-a41ab9732a/4/.yarn/berry/cache/eslint-module-utils-npm-2.8.0-05e42bcab0-10c0.zip/node_modules/eslint-module-utils/",\ + "packageDependencies": [\ + ["eslint-module-utils", "virtual:43aa4530715e727e25bba2c4996fd38e8d8ce2d8f6a1d9ee913eb73a1faac7177a5db105bc491396bc6a0d1c246eb19ecc3e90ca0412b3bc3f604ea2ada09079#npm:2.8.0"],\ + ["@types/eslint", null],\ + ["@types/eslint-import-resolver-node", null],\ + ["@types/eslint-import-resolver-typescript", null],\ + ["@types/eslint-import-resolver-webpack", null],\ + ["@types/typescript-eslint__parser", null],\ + ["@typescript-eslint/parser", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.17.0"],\ + ["debug", "virtual:2a426afc4b2eef43db12a540d29c2b5476640459bfcd5c24f86bb401cf8cce97e63bd81794d206a5643057e7f662643afd5ce3dfc4d4bfd8e706006c6309c5fa#npm:3.2.7"],\ + ["eslint", "npm:8.56.0"],\ + ["eslint-import-resolver-node", "npm:0.3.9"],\ + ["eslint-import-resolver-typescript", null],\ + ["eslint-import-resolver-webpack", null]\ + ],\ + "packagePeers": [\ + "@types/eslint-import-resolver-node",\ + "@types/eslint-import-resolver-typescript",\ + "@types/eslint-import-resolver-webpack",\ + "@types/eslint",\ + "@types/typescript-eslint__parser",\ + "@typescript-eslint/parser",\ + "eslint-import-resolver-node",\ + "eslint-import-resolver-typescript",\ + "eslint-import-resolver-webpack",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-plugin-eslint-comments", [\ + ["npm:3.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/eslint-plugin-eslint-comments-npm-3.2.0-b1dc85dfb2-10c0.zip/node_modules/eslint-plugin-eslint-comments/",\ + "packageDependencies": [\ + ["eslint-plugin-eslint-comments", "npm:3.2.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:3.2.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-eslint-comments-virtual-f1ea3fd137/4/.yarn/berry/cache/eslint-plugin-eslint-comments-npm-3.2.0-b1dc85dfb2-10c0.zip/node_modules/eslint-plugin-eslint-comments/",\ + "packageDependencies": [\ + ["eslint-plugin-eslint-comments", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:3.2.0"],\ + ["@types/eslint", null],\ + ["escape-string-regexp", "npm:1.0.5"],\ + ["eslint", "npm:8.56.0"],\ + ["ignore", "npm:5.3.0"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-plugin-functional", [\ + ["npm:6.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/eslint-plugin-functional-npm-6.0.0-67c232f937-10c0.zip/node_modules/eslint-plugin-functional/",\ + "packageDependencies": [\ + ["eslint-plugin-functional", "npm:6.0.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.0", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-functional-virtual-45ee868a16/4/.yarn/berry/cache/eslint-plugin-functional-npm-6.0.0-67c232f937-10c0.zip/node_modules/eslint-plugin-functional/",\ + "packageDependencies": [\ + ["eslint-plugin-functional", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.0.0"],\ + ["@types/eslint", null],\ + ["@types/typescript", null],\ + ["@typescript-eslint/utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1"],\ + ["deepmerge-ts", "npm:5.1.0"],\ + ["escape-string-regexp", "npm:4.0.0"],\ + ["eslint", "npm:8.56.0"],\ + ["is-immutable-type", "virtual:45ee868a16e5e16301bd5a061375b37c4ddadfda3dbc29a60eb33cc602493cb2833fdb5058487addec4d7d2fad1c6defdae2c5ae0c70fd6e7e1433365f3b484b#npm:2.0.1"],\ + ["semver", "npm:7.5.4"],\ + ["ts-api-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:1.0.3"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "@types/typescript",\ + "eslint",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-plugin-import", [\ + ["npm:2.29.1", {\ + "packageLocation": "../../../.yarn/berry/cache/eslint-plugin-import-npm-2.29.1-b94305f7dc-10c0.zip/node_modules/eslint-plugin-import/",\ + "packageDependencies": [\ + ["eslint-plugin-import", "npm:2.29.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:2.29.1", {\ + "packageLocation": "./.yarn/__virtual__/eslint-plugin-import-virtual-43aa453071/4/.yarn/berry/cache/eslint-plugin-import-npm-2.29.1-b94305f7dc-10c0.zip/node_modules/eslint-plugin-import/",\ + "packageDependencies": [\ + ["eslint-plugin-import", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:2.29.1"],\ + ["@types/eslint", null],\ + ["@types/typescript-eslint__parser", null],\ + ["@typescript-eslint/parser", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.17.0"],\ + ["array-includes", "npm:3.1.7"],\ + ["array.prototype.findlastindex", "npm:1.2.3"],\ + ["array.prototype.flat", "npm:1.3.2"],\ + ["array.prototype.flatmap", "npm:1.3.2"],\ + ["debug", "virtual:2a426afc4b2eef43db12a540d29c2b5476640459bfcd5c24f86bb401cf8cce97e63bd81794d206a5643057e7f662643afd5ce3dfc4d4bfd8e706006c6309c5fa#npm:3.2.7"],\ + ["doctrine", "npm:2.1.0"],\ + ["eslint", "npm:8.56.0"],\ + ["eslint-import-resolver-node", "npm:0.3.9"],\ + ["eslint-module-utils", "virtual:43aa4530715e727e25bba2c4996fd38e8d8ce2d8f6a1d9ee913eb73a1faac7177a5db105bc491396bc6a0d1c246eb19ecc3e90ca0412b3bc3f604ea2ada09079#npm:2.8.0"],\ + ["hasown", "npm:2.0.0"],\ + ["is-core-module", "npm:2.13.1"],\ + ["is-glob", "npm:4.0.3"],\ + ["minimatch", "npm:3.1.2"],\ + ["object.fromentries", "npm:2.0.7"],\ + ["object.groupby", "npm:1.0.1"],\ + ["object.values", "npm:1.1.7"],\ + ["semver", "npm:6.3.1"],\ + ["tsconfig-paths", "npm:3.15.0"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "@types/typescript-eslint__parser",\ + "@typescript-eslint/parser",\ + "eslint"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-plugin-tsdoc", [\ + ["npm:0.2.17", {\ + "packageLocation": "../../../.yarn/berry/cache/eslint-plugin-tsdoc-npm-0.2.17-a48e3f007d-10c0.zip/node_modules/eslint-plugin-tsdoc/",\ + "packageDependencies": [\ + ["eslint-plugin-tsdoc", "npm:0.2.17"],\ + ["@microsoft/tsdoc", "npm:0.14.2"],\ + ["@microsoft/tsdoc-config", "npm:0.16.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-scope", [\ + ["npm:7.2.2", {\ + "packageLocation": "../../../.yarn/berry/cache/eslint-scope-npm-7.2.2-53cb0df8e8-10c0.zip/node_modules/eslint-scope/",\ + "packageDependencies": [\ + ["eslint-scope", "npm:7.2.2"],\ + ["esrecurse", "npm:4.3.0"],\ + ["estraverse", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["eslint-visitor-keys", [\ + ["npm:2.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/eslint-visitor-keys-npm-2.1.0-c31806b6b9-10c0.zip/node_modules/eslint-visitor-keys/",\ + "packageDependencies": [\ + ["eslint-visitor-keys", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.4.3", {\ + "packageLocation": "../../../.yarn/berry/cache/eslint-visitor-keys-npm-3.4.3-a356ac7e46-10c0.zip/node_modules/eslint-visitor-keys/",\ + "packageDependencies": [\ + ["eslint-visitor-keys", "npm:3.4.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["espree", [\ + ["npm:9.6.1", {\ + "packageLocation": "../../../.yarn/berry/cache/espree-npm-9.6.1-a50722a5a9-10c0.zip/node_modules/espree/",\ + "packageDependencies": [\ + ["espree", "npm:9.6.1"],\ + ["acorn", "npm:8.11.3"],\ + ["acorn-jsx", "virtual:a50722a5a9326b6a5f12350c494c4db3aa0f4caeac45e3e9e5fe071da20014ecfe738fe2ebe2c9c98abae81a4ea86b42f56d776b3bd5ec37f9ad3670c242b242#npm:5.3.2"],\ + ["eslint-visitor-keys", "npm:3.4.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["esprima", [\ + ["npm:4.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/esprima-npm-4.0.1-1084e98778-10c0.zip/node_modules/esprima/",\ + "packageDependencies": [\ + ["esprima", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["esquery", [\ + ["npm:1.5.0", {\ + "packageLocation": "../../../.yarn/berry/cache/esquery-npm-1.5.0-d8f8a06879-10c0.zip/node_modules/esquery/",\ + "packageDependencies": [\ + ["esquery", "npm:1.5.0"],\ + ["estraverse", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["esrecurse", [\ + ["npm:4.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/esrecurse-npm-4.3.0-10b86a887a-10c0.zip/node_modules/esrecurse/",\ + "packageDependencies": [\ + ["esrecurse", "npm:4.3.0"],\ + ["estraverse", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["estraverse", [\ + ["npm:5.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/estraverse-npm-5.3.0-03284f8f63-10c0.zip/node_modules/estraverse/",\ + "packageDependencies": [\ + ["estraverse", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["estree-walker", [\ + ["npm:2.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/estree-walker-npm-2.0.2-dfab42f65c-10c0.zip/node_modules/estree-walker/",\ + "packageDependencies": [\ + ["estree-walker", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["esutils", [\ + ["npm:2.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/esutils-npm-2.0.3-f865beafd5-10c0.zip/node_modules/esutils/",\ + "packageDependencies": [\ + ["esutils", "npm:2.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["etag", [\ + ["npm:1.8.1", {\ + "packageLocation": "../../../.yarn/berry/cache/etag-npm-1.8.1-54a3b989d9-10c0.zip/node_modules/etag/",\ + "packageDependencies": [\ + ["etag", "npm:1.8.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["execa", [\ + ["npm:7.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/execa-npm-7.2.0-7797cafb24-10c0.zip/node_modules/execa/",\ + "packageDependencies": [\ + ["execa", "npm:7.2.0"],\ + ["cross-spawn", "npm:7.0.3"],\ + ["get-stream", "npm:6.0.1"],\ + ["human-signals", "npm:4.3.1"],\ + ["is-stream", "npm:3.0.0"],\ + ["merge-stream", "npm:2.0.0"],\ + ["npm-run-path", "npm:5.2.0"],\ + ["onetime", "npm:6.0.0"],\ + ["signal-exit", "npm:3.0.7"],\ + ["strip-final-newline", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["expand-tilde", [\ + ["npm:2.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/expand-tilde-npm-2.0.2-a4020a62f5-10c0.zip/node_modules/expand-tilde/",\ + "packageDependencies": [\ + ["expand-tilde", "npm:2.0.2"],\ + ["homedir-polyfill", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["exponential-backoff", [\ + ["npm:3.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/exponential-backoff-npm-3.1.1-04df458b30-10c0.zip/node_modules/exponential-backoff/",\ + "packageDependencies": [\ + ["exponential-backoff", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["express", [\ + ["npm:4.18.2", {\ + "packageLocation": "../../../.yarn/berry/cache/express-npm-4.18.2-bb15ff679a-10c0.zip/node_modules/express/",\ + "packageDependencies": [\ + ["express", "npm:4.18.2"],\ + ["accepts", "npm:1.3.8"],\ + ["array-flatten", "npm:1.1.1"],\ + ["body-parser", "npm:1.20.1"],\ + ["content-disposition", "npm:0.5.4"],\ + ["content-type", "npm:1.0.5"],\ + ["cookie", "npm:0.5.0"],\ + ["cookie-signature", "npm:1.0.6"],\ + ["debug", "virtual:3840e914156da5bf3a0152609f7597e38b893022314c08ba5b292edc820681760ec6c83dde1d34d78aa58a3f32c7d8c9d754f99860fa71136383ec1e2a87f57d#npm:2.6.9"],\ + ["depd", "npm:2.0.0"],\ + ["encodeurl", "npm:1.0.2"],\ + ["escape-html", "npm:1.0.3"],\ + ["etag", "npm:1.8.1"],\ + ["finalhandler", "npm:1.2.0"],\ + ["fresh", "npm:0.5.2"],\ + ["http-errors", "npm:2.0.0"],\ + ["merge-descriptors", "npm:1.0.1"],\ + ["methods", "npm:1.1.2"],\ + ["on-finished", "npm:2.4.1"],\ + ["parseurl", "npm:1.3.3"],\ + ["path-to-regexp", "npm:0.1.7"],\ + ["proxy-addr", "npm:2.0.7"],\ + ["qs", "npm:6.11.0"],\ + ["range-parser", "npm:1.2.1"],\ + ["safe-buffer", "npm:5.2.1"],\ + ["send", "npm:0.18.0"],\ + ["serve-static", "npm:1.15.0"],\ + ["setprototypeof", "npm:1.2.0"],\ + ["statuses", "npm:2.0.1"],\ + ["type-is", "npm:1.6.18"],\ + ["utils-merge", "npm:1.0.1"],\ + ["vary", "npm:1.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["external-editor", [\ + ["npm:3.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/external-editor-npm-3.1.0-878e7807af-10c0.zip/node_modules/external-editor/",\ + "packageDependencies": [\ + ["external-editor", "npm:3.1.0"],\ + ["chardet", "npm:0.7.0"],\ + ["iconv-lite", "npm:0.4.24"],\ + ["tmp", "npm:0.0.33"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fast-check", [\ + ["npm:3.15.0", {\ + "packageLocation": "../../../.yarn/berry/cache/fast-check-npm-3.15.0-5e1d76e115-10c0.zip/node_modules/fast-check/",\ + "packageDependencies": [\ + ["fast-check", "npm:3.15.0"],\ + ["pure-rand", "npm:6.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fast-deep-equal", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/fast-deep-equal-npm-2.0.1-9c01e08a62-10c0.zip/node_modules/fast-deep-equal/",\ + "packageDependencies": [\ + ["fast-deep-equal", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.1.3", {\ + "packageLocation": "../../../.yarn/berry/cache/fast-deep-equal-npm-3.1.3-790edcfcf5-10c0.zip/node_modules/fast-deep-equal/",\ + "packageDependencies": [\ + ["fast-deep-equal", "npm:3.1.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fast-diff", [\ + ["npm:1.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/fast-diff-npm-1.3.0-9f19e3b743-10c0.zip/node_modules/fast-diff/",\ + "packageDependencies": [\ + ["fast-diff", "npm:1.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fast-equals", [\ + ["npm:5.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/fast-equals-npm-5.0.1-bbae54ff7b-10c0.zip/node_modules/fast-equals/",\ + "packageDependencies": [\ + ["fast-equals", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fast-glob", [\ + ["npm:3.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/fast-glob-npm-3.3.2-0a8cb4f2ca-10c0.zip/node_modules/fast-glob/",\ + "packageDependencies": [\ + ["fast-glob", "npm:3.3.2"],\ + ["@nodelib/fs.stat", "npm:2.0.5"],\ + ["@nodelib/fs.walk", "npm:1.2.8"],\ + ["glob-parent", "npm:5.1.2"],\ + ["merge2", "npm:1.4.1"],\ + ["micromatch", "npm:4.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fast-json-patch", [\ + ["npm:2.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/fast-json-patch-npm-2.2.1-63b021bb37-10c0.zip/node_modules/fast-json-patch/",\ + "packageDependencies": [\ + ["fast-json-patch", "npm:2.2.1"],\ + ["fast-deep-equal", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fast-json-stable-stringify", [\ + ["npm:2.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/fast-json-stable-stringify-npm-2.1.0-02e8905fda-10c0.zip/node_modules/fast-json-stable-stringify/",\ + "packageDependencies": [\ + ["fast-json-stable-stringify", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fast-levenshtein", [\ + ["npm:2.0.6", {\ + "packageLocation": "../../../.yarn/berry/cache/fast-levenshtein-npm-2.0.6-fcd74b8df5-10c0.zip/node_modules/fast-levenshtein/",\ + "packageDependencies": [\ + ["fast-levenshtein", "npm:2.0.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fastq", [\ + ["npm:1.16.0", {\ + "packageLocation": "../../../.yarn/berry/cache/fastq-npm-1.16.0-88070bb399-10c0.zip/node_modules/fastq/",\ + "packageDependencies": [\ + ["fastq", "npm:1.16.0"],\ + ["reusify", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["figures", [\ + ["npm:3.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/figures-npm-3.2.0-85d357e955-10c0.zip/node_modules/figures/",\ + "packageDependencies": [\ + ["figures", "npm:3.2.0"],\ + ["escape-string-regexp", "npm:1.0.5"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/figures-npm-6.0.1-2993bb3561-10c0.zip/node_modules/figures/",\ + "packageDependencies": [\ + ["figures", "npm:6.0.1"],\ + ["is-unicode-supported", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["file-entry-cache", [\ + ["npm:6.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/file-entry-cache-npm-6.0.1-31965cf0af-10c0.zip/node_modules/file-entry-cache/",\ + "packageDependencies": [\ + ["file-entry-cache", "npm:6.0.1"],\ + ["flat-cache", "npm:3.2.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/file-entry-cache-npm-8.0.0-5b09d19a83-10c0.zip/node_modules/file-entry-cache/",\ + "packageDependencies": [\ + ["file-entry-cache", "npm:8.0.0"],\ + ["flat-cache", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["file-type", [\ + ["npm:18.7.0", {\ + "packageLocation": "../../../.yarn/berry/cache/file-type-npm-18.7.0-b585ca87df-10c0.zip/node_modules/file-type/",\ + "packageDependencies": [\ + ["file-type", "npm:18.7.0"],\ + ["readable-web-to-node-stream", "npm:3.0.2"],\ + ["strtok3", "npm:7.0.0"],\ + ["token-types", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["file-uri-to-path", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/file-uri-to-path-npm-1.0.0-1043ac6206-10c0.zip/node_modules/file-uri-to-path/",\ + "packageDependencies": [\ + ["file-uri-to-path", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["filing-cabinet", [\ + ["npm:3.3.1", {\ + "packageLocation": "../../../.yarn/berry/cache/filing-cabinet-npm-3.3.1-dc82007732-10c0.zip/node_modules/filing-cabinet/",\ + "packageDependencies": [\ + ["filing-cabinet", "npm:3.3.1"],\ + ["app-module-path", "npm:2.2.0"],\ + ["commander", "npm:2.20.3"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["enhanced-resolve", "npm:5.15.0"],\ + ["is-relative-path", "npm:1.0.2"],\ + ["module-definition", "npm:3.4.0"],\ + ["module-lookup-amd", "npm:7.0.1"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"],\ + ["resolve-dependency-path", "npm:2.0.0"],\ + ["sass-lookup", "npm:3.0.0"],\ + ["stylus-lookup", "npm:3.0.2"],\ + ["tsconfig-paths", "npm:3.15.0"],\ + ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fill-range", [\ + ["npm:7.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/fill-range-npm-7.0.1-b8b1817caa-10c0.zip/node_modules/fill-range/",\ + "packageDependencies": [\ + ["fill-range", "npm:7.0.1"],\ + ["to-regex-range", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["finalhandler", [\ + ["npm:1.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/finalhandler-npm-1.2.0-593d001463-10c0.zip/node_modules/finalhandler/",\ + "packageDependencies": [\ + ["finalhandler", "npm:1.2.0"],\ + ["debug", "virtual:3840e914156da5bf3a0152609f7597e38b893022314c08ba5b292edc820681760ec6c83dde1d34d78aa58a3f32c7d8c9d754f99860fa71136383ec1e2a87f57d#npm:2.6.9"],\ + ["encodeurl", "npm:1.0.2"],\ + ["escape-html", "npm:1.0.3"],\ + ["on-finished", "npm:2.4.1"],\ + ["parseurl", "npm:1.3.3"],\ + ["statuses", "npm:2.0.1"],\ + ["unpipe", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["find-node-modules", [\ + ["npm:2.1.3", {\ + "packageLocation": "../../../.yarn/berry/cache/find-node-modules-npm-2.1.3-431b2c5604-10c0.zip/node_modules/find-node-modules/",\ + "packageDependencies": [\ + ["find-node-modules", "npm:2.1.3"],\ + ["findup-sync", "npm:4.0.0"],\ + ["merge", "npm:2.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["find-root", [\ + ["npm:1.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/find-root-npm-1.1.0-a16a94005f-10c0.zip/node_modules/find-root/",\ + "packageDependencies": [\ + ["find-root", "npm:1.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["find-up", [\ + ["npm:2.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/find-up-npm-2.1.0-9f6cb1765c-10c0.zip/node_modules/find-up/",\ + "packageDependencies": [\ + ["find-up", "npm:2.1.0"],\ + ["locate-path", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/find-up-npm-3.0.0-a2d4b1b317-10c0.zip/node_modules/find-up/",\ + "packageDependencies": [\ + ["find-up", "npm:3.0.0"],\ + ["locate-path", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/find-up-npm-4.1.0-c3ccf8d855-10c0.zip/node_modules/find-up/",\ + "packageDependencies": [\ + ["find-up", "npm:4.1.0"],\ + ["locate-path", "npm:5.0.0"],\ + ["path-exists", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/find-up-npm-5.0.0-e03e9b796d-10c0.zip/node_modules/find-up/",\ + "packageDependencies": [\ + ["find-up", "npm:5.0.0"],\ + ["locate-path", "npm:6.0.0"],\ + ["path-exists", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["find-up-simple", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/find-up-simple-npm-1.0.0-81eb875be8-10c0.zip/node_modules/find-up-simple/",\ + "packageDependencies": [\ + ["find-up-simple", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["findup-sync", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/findup-sync-npm-4.0.0-3884c677a0-10c0.zip/node_modules/findup-sync/",\ + "packageDependencies": [\ + ["findup-sync", "npm:4.0.0"],\ + ["detect-file", "npm:1.0.0"],\ + ["is-glob", "npm:4.0.3"],\ + ["micromatch", "npm:4.0.5"],\ + ["resolve-dir", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["flat-cache", [\ + ["npm:3.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/flat-cache-npm-3.2.0-9a887f084e-10c0.zip/node_modules/flat-cache/",\ + "packageDependencies": [\ + ["flat-cache", "npm:3.2.0"],\ + ["flatted", "npm:3.2.9"],\ + ["keyv", "npm:4.5.4"],\ + ["rimraf", "npm:3.0.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/flat-cache-npm-4.0.0-af74b9d632-10c0.zip/node_modules/flat-cache/",\ + "packageDependencies": [\ + ["flat-cache", "npm:4.0.0"],\ + ["flatted", "npm:3.2.9"],\ + ["keyv", "npm:4.5.4"],\ + ["rimraf", "npm:5.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["flatted", [\ + ["npm:3.2.9", {\ + "packageLocation": "../../../.yarn/berry/cache/flatted-npm-3.2.9-0462256d3c-10c0.zip/node_modules/flatted/",\ + "packageDependencies": [\ + ["flatted", "npm:3.2.9"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["flatten", [\ + ["npm:1.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/flatten-npm-1.0.3-87bf6559dd-10c0.zip/node_modules/flatten/",\ + "packageDependencies": [\ + ["flatten", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fn-name", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/fn-name-npm-2.0.1-955ccc097e-10c0.zip/node_modules/fn-name/",\ + "packageDependencies": [\ + ["fn-name", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["for-each", [\ + ["npm:0.3.3", {\ + "packageLocation": "../../../.yarn/berry/cache/for-each-npm-0.3.3-0010ca8cdd-10c0.zip/node_modules/for-each/",\ + "packageDependencies": [\ + ["for-each", "npm:0.3.3"],\ + ["is-callable", "npm:1.2.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["foreground-child", [\ + ["npm:3.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/foreground-child-npm-3.1.1-77e78ed774-10c0.zip/node_modules/foreground-child/",\ + "packageDependencies": [\ + ["foreground-child", "npm:3.1.1"],\ + ["cross-spawn", "npm:7.0.3"],\ + ["signal-exit", "npm:4.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["forwarded", [\ + ["npm:0.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/forwarded-npm-0.2.0-6473dabe35-10c0.zip/node_modules/forwarded/",\ + "packageDependencies": [\ + ["forwarded", "npm:0.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fresh", [\ + ["npm:0.5.2", {\ + "packageLocation": "../../../.yarn/berry/cache/fresh-npm-0.5.2-ad2bb4c0a2-10c0.zip/node_modules/fresh/",\ + "packageDependencies": [\ + ["fresh", "npm:0.5.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fs-extra", [\ + ["npm:7.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/fs-extra-npm-7.0.1-b33a5e53e9-10c0.zip/node_modules/fs-extra/",\ + "packageDependencies": [\ + ["fs-extra", "npm:7.0.1"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["jsonfile", "npm:4.0.0"],\ + ["universalify", "npm:0.1.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:9.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/fs-extra-npm-9.1.0-983c2ddb4c-10c0.zip/node_modules/fs-extra/",\ + "packageDependencies": [\ + ["fs-extra", "npm:9.1.0"],\ + ["at-least-node", "npm:1.0.0"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["jsonfile", "npm:6.1.0"],\ + ["universalify", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fs-minipass", [\ + ["npm:2.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/fs-minipass-npm-2.1.0-501ef87306-10c0.zip/node_modules/fs-minipass/",\ + "packageDependencies": [\ + ["fs-minipass", "npm:2.1.0"],\ + ["minipass", "npm:3.3.6"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/fs-minipass-npm-3.0.3-d148d6ac19-10c0.zip/node_modules/fs-minipass/",\ + "packageDependencies": [\ + ["fs-minipass", "npm:3.0.3"],\ + ["minipass", "npm:7.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fs.realpath", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/fs.realpath-npm-1.0.0-c8f05d8126-10c0.zip/node_modules/fs.realpath/",\ + "packageDependencies": [\ + ["fs.realpath", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["fsevents", [\ + ["patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1", {\ + "packageLocation": "./.yarn/unplugged/fsevents-patch-19706e7e35/node_modules/fsevents/",\ + "packageDependencies": [\ + ["fsevents", "patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1"],\ + ["node-gyp", "npm:10.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1", {\ + "packageLocation": "./.yarn/unplugged/fsevents-patch-6b67494872/node_modules/fsevents/",\ + "packageDependencies": [\ + ["fsevents", "patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1"],\ + ["node-gyp", "npm:10.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["function-bind", [\ + ["npm:1.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/function-bind-npm-1.1.2-7a55be9b03-10c0.zip/node_modules/function-bind/",\ + "packageDependencies": [\ + ["function-bind", "npm:1.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["function.prototype.name", [\ + ["npm:1.1.6", {\ + "packageLocation": "../../../.yarn/berry/cache/function.prototype.name-npm-1.1.6-fd3a6a5cdd-10c0.zip/node_modules/function.prototype.name/",\ + "packageDependencies": [\ + ["function.prototype.name", "npm:1.1.6"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"],\ + ["functions-have-names", "npm:1.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["functions-have-names", [\ + ["npm:1.2.3", {\ + "packageLocation": "../../../.yarn/berry/cache/functions-have-names-npm-1.2.3-e5cf1e2208-10c0.zip/node_modules/functions-have-names/",\ + "packageDependencies": [\ + ["functions-have-names", "npm:1.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["gauge", [\ + ["npm:3.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/gauge-npm-3.0.2-9e22f7af9e-10c0.zip/node_modules/gauge/",\ + "packageDependencies": [\ + ["gauge", "npm:3.0.2"],\ + ["aproba", "npm:2.0.0"],\ + ["color-support", "npm:1.1.3"],\ + ["console-control-strings", "npm:1.1.0"],\ + ["has-unicode", "npm:2.0.1"],\ + ["object-assign", "npm:4.1.1"],\ + ["signal-exit", "npm:3.0.7"],\ + ["string-width", "npm:4.2.3"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["wide-align", "npm:1.1.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["gensequence", [\ + ["npm:6.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/gensequence-npm-6.0.0-6c97e84d9a-10c0.zip/node_modules/gensequence/",\ + "packageDependencies": [\ + ["gensequence", "npm:6.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-amd-module-type", [\ + ["npm:3.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/get-amd-module-type-npm-3.0.2-466fbb8aa0-10c0.zip/node_modules/get-amd-module-type/",\ + "packageDependencies": [\ + ["get-amd-module-type", "npm:3.0.2"],\ + ["ast-module-types", "npm:3.0.0"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/get-amd-module-type-npm-4.1.0-b7d3afdf8c-10c0.zip/node_modules/get-amd-module-type/",\ + "packageDependencies": [\ + ["get-amd-module-type", "npm:4.1.0"],\ + ["ast-module-types", "npm:4.0.0"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-caller-file", [\ + ["npm:2.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/get-caller-file-npm-2.0.5-80e8a86305-10c0.zip/node_modules/get-caller-file/",\ + "packageDependencies": [\ + ["get-caller-file", "npm:2.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-east-asian-width", [\ + ["npm:1.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/get-east-asian-width-npm-1.2.0-6cd8491dbe-10c0.zip/node_modules/get-east-asian-width/",\ + "packageDependencies": [\ + ["get-east-asian-width", "npm:1.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-intrinsic", [\ + ["npm:1.2.2", {\ + "packageLocation": "../../../.yarn/berry/cache/get-intrinsic-npm-1.2.2-3f446d8847-10c0.zip/node_modules/get-intrinsic/",\ + "packageDependencies": [\ + ["get-intrinsic", "npm:1.2.2"],\ + ["function-bind", "npm:1.1.2"],\ + ["has-proto", "npm:1.0.1"],\ + ["has-symbols", "npm:1.0.3"],\ + ["hasown", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-own-enumerable-property-symbols", [\ + ["npm:3.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/get-own-enumerable-property-symbols-npm-3.0.2-f143f9e8d3-10c0.zip/node_modules/get-own-enumerable-property-symbols/",\ + "packageDependencies": [\ + ["get-own-enumerable-property-symbols", "npm:3.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-pkg-repo", [\ + ["npm:4.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/get-pkg-repo-npm-4.2.1-b1cd052cb4-10c0.zip/node_modules/get-pkg-repo/",\ + "packageDependencies": [\ + ["get-pkg-repo", "npm:4.2.1"],\ + ["@hutson/parse-repository-url", "npm:3.0.2"],\ + ["hosted-git-info", "npm:4.1.0"],\ + ["through2", "npm:2.0.5"],\ + ["yargs", "npm:16.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-stdin", [\ + ["npm:9.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/get-stdin-npm-9.0.0-4221477153-10c0.zip/node_modules/get-stdin/",\ + "packageDependencies": [\ + ["get-stdin", "npm:9.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-stream", [\ + ["npm:6.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/get-stream-npm-6.0.1-83e51a4642-10c0.zip/node_modules/get-stream/",\ + "packageDependencies": [\ + ["get-stream", "npm:6.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["get-symbol-description", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/get-symbol-description-npm-1.0.0-9c95a4bc1f-10c0.zip/node_modules/get-symbol-description/",\ + "packageDependencies": [\ + ["get-symbol-description", "npm:1.0.0"],\ + ["call-bind", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["git-raw-commits", [\ + ["npm:2.0.11", {\ + "packageLocation": "../../../.yarn/berry/cache/git-raw-commits-npm-2.0.11-b090f2f684-10c0.zip/node_modules/git-raw-commits/",\ + "packageDependencies": [\ + ["git-raw-commits", "npm:2.0.11"],\ + ["dargs", "npm:7.0.0"],\ + ["lodash", "npm:4.17.21"],\ + ["meow", "npm:8.1.2"],\ + ["split2", "npm:3.2.2"],\ + ["through2", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["git-remote-origin-url", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/git-remote-origin-url-npm-2.0.0-319debe0d1-10c0.zip/node_modules/git-remote-origin-url/",\ + "packageDependencies": [\ + ["git-remote-origin-url", "npm:2.0.0"],\ + ["gitconfiglocal", "npm:1.0.0"],\ + ["pify", "npm:2.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["git-semver-tags", [\ + ["npm:4.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/git-semver-tags-npm-4.1.1-93b9747811-10c0.zip/node_modules/git-semver-tags/",\ + "packageDependencies": [\ + ["git-semver-tags", "npm:4.1.1"],\ + ["meow", "npm:8.1.2"],\ + ["semver", "npm:6.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["gitconfiglocal", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/gitconfiglocal-npm-1.0.0-905970379d-10c0.zip/node_modules/gitconfiglocal/",\ + "packageDependencies": [\ + ["gitconfiglocal", "npm:1.0.0"],\ + ["ini", "npm:1.3.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["glob", [\ + ["npm:10.3.10", {\ + "packageLocation": "../../../.yarn/berry/cache/glob-npm-10.3.10-da1ef8b112-10c0.zip/node_modules/glob/",\ + "packageDependencies": [\ + ["glob", "npm:10.3.10"],\ + ["foreground-child", "npm:3.1.1"],\ + ["jackspeak", "npm:2.3.6"],\ + ["minimatch", "npm:9.0.3"],\ + ["minipass", "npm:7.0.4"],\ + ["path-scurry", "npm:1.10.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.2.3", {\ + "packageLocation": "../../../.yarn/berry/cache/glob-npm-7.2.3-2d866d17a5-10c0.zip/node_modules/glob/",\ + "packageDependencies": [\ + ["glob", "npm:7.2.3"],\ + ["fs.realpath", "npm:1.0.0"],\ + ["inflight", "npm:1.0.6"],\ + ["inherits", "npm:2.0.4"],\ + ["minimatch", "npm:3.1.2"],\ + ["once", "npm:1.4.0"],\ + ["path-is-absolute", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/glob-npm-8.1.0-65f64af8b1-10c0.zip/node_modules/glob/",\ + "packageDependencies": [\ + ["glob", "npm:8.1.0"],\ + ["fs.realpath", "npm:1.0.0"],\ + ["inflight", "npm:1.0.6"],\ + ["inherits", "npm:2.0.4"],\ + ["minimatch", "npm:5.1.6"],\ + ["once", "npm:1.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["glob-parent", [\ + ["npm:5.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/glob-parent-npm-5.1.2-021ab32634-10c0.zip/node_modules/glob-parent/",\ + "packageDependencies": [\ + ["glob-parent", "npm:5.1.2"],\ + ["is-glob", "npm:4.0.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/glob-parent-npm-6.0.2-2cbef12738-10c0.zip/node_modules/glob-parent/",\ + "packageDependencies": [\ + ["glob-parent", "npm:6.0.2"],\ + ["is-glob", "npm:4.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["global-directory", [\ + ["npm:4.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/global-directory-npm-4.0.1-1de95382fd-10c0.zip/node_modules/global-directory/",\ + "packageDependencies": [\ + ["global-directory", "npm:4.0.1"],\ + ["ini", "npm:4.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["global-dirs", [\ + ["npm:0.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/global-dirs-npm-0.1.1-87c167e806-10c0.zip/node_modules/global-dirs/",\ + "packageDependencies": [\ + ["global-dirs", "npm:0.1.1"],\ + ["ini", "npm:1.3.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["global-modules", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/global-modules-npm-1.0.0-70c522e57a-10c0.zip/node_modules/global-modules/",\ + "packageDependencies": [\ + ["global-modules", "npm:1.0.0"],\ + ["global-prefix", "npm:1.0.2"],\ + ["is-windows", "npm:1.0.2"],\ + ["resolve-dir", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["global-prefix", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/global-prefix-npm-1.0.2-a96996834b-10c0.zip/node_modules/global-prefix/",\ + "packageDependencies": [\ + ["global-prefix", "npm:1.0.2"],\ + ["expand-tilde", "npm:2.0.2"],\ + ["homedir-polyfill", "npm:1.0.3"],\ + ["ini", "npm:1.3.8"],\ + ["is-windows", "npm:1.0.2"],\ + ["which", "npm:1.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["globals", [\ + ["npm:13.24.0", {\ + "packageLocation": "../../../.yarn/berry/cache/globals-npm-13.24.0-cc7713139c-10c0.zip/node_modules/globals/",\ + "packageDependencies": [\ + ["globals", "npm:13.24.0"],\ + ["type-fest", "npm:0.20.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["globalthis", [\ + ["npm:1.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/globalthis-npm-1.0.3-96cd56020d-10c0.zip/node_modules/globalthis/",\ + "packageDependencies": [\ + ["globalthis", "npm:1.0.3"],\ + ["define-properties", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["globby", [\ + ["npm:11.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/globby-npm-11.1.0-bdcdf20c71-10c0.zip/node_modules/globby/",\ + "packageDependencies": [\ + ["globby", "npm:11.1.0"],\ + ["array-union", "npm:2.1.0"],\ + ["dir-glob", "npm:3.0.1"],\ + ["fast-glob", "npm:3.3.2"],\ + ["ignore", "npm:5.3.0"],\ + ["merge2", "npm:1.4.1"],\ + ["slash", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:13.2.2", {\ + "packageLocation": "../../../.yarn/berry/cache/globby-npm-13.2.2-47efcd4a86-10c0.zip/node_modules/globby/",\ + "packageDependencies": [\ + ["globby", "npm:13.2.2"],\ + ["dir-glob", "npm:3.0.1"],\ + ["fast-glob", "npm:3.3.2"],\ + ["ignore", "npm:5.3.0"],\ + ["merge2", "npm:1.4.1"],\ + ["slash", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:14.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/globby-npm-14.0.0-3bccdd5188-10c0.zip/node_modules/globby/",\ + "packageDependencies": [\ + ["globby", "npm:14.0.0"],\ + ["@sindresorhus/merge-streams", "npm:1.0.0"],\ + ["fast-glob", "npm:3.3.2"],\ + ["ignore", "npm:5.3.0"],\ + ["path-type", "npm:5.0.0"],\ + ["slash", "npm:5.1.0"],\ + ["unicorn-magic", "npm:0.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["gonzales-pe", [\ + ["npm:4.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/gonzales-pe-npm-4.3.0-82921c6976-10c0.zip/node_modules/gonzales-pe/",\ + "packageDependencies": [\ + ["gonzales-pe", "npm:4.3.0"],\ + ["minimist", "npm:1.2.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["gopd", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/gopd-npm-1.0.1-10c1d0b534-10c0.zip/node_modules/gopd/",\ + "packageDependencies": [\ + ["gopd", "npm:1.0.1"],\ + ["get-intrinsic", "npm:1.2.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["graceful-fs", [\ + ["npm:4.2.11", {\ + "packageLocation": "../../../.yarn/berry/cache/graceful-fs-npm-4.2.11-24bb648a68-10c0.zip/node_modules/graceful-fs/",\ + "packageDependencies": [\ + ["graceful-fs", "npm:4.2.11"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["graphemer", [\ + ["npm:1.4.0", {\ + "packageLocation": "../../../.yarn/berry/cache/graphemer-npm-1.4.0-0627732d35-10c0.zip/node_modules/graphemer/",\ + "packageDependencies": [\ + ["graphemer", "npm:1.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["handlebars", [\ + ["npm:4.7.8", {\ + "packageLocation": "../../../.yarn/berry/cache/handlebars-npm-4.7.8-25244c2c82-10c0.zip/node_modules/handlebars/",\ + "packageDependencies": [\ + ["handlebars", "npm:4.7.8"],\ + ["minimist", "npm:1.2.8"],\ + ["neo-async", "npm:2.6.2"],\ + ["source-map", "npm:0.6.1"],\ + ["uglify-js", "npm:3.17.4"],\ + ["wordwrap", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["hard-rejection", [\ + ["npm:2.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/hard-rejection-npm-2.1.0-a80f2a977d-10c0.zip/node_modules/hard-rejection/",\ + "packageDependencies": [\ + ["hard-rejection", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["has-bigints", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/has-bigints-npm-1.0.2-52732e614d-10c0.zip/node_modules/has-bigints/",\ + "packageDependencies": [\ + ["has-bigints", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["has-flag", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/has-flag-npm-3.0.0-16ac11fe05-10c0.zip/node_modules/has-flag/",\ + "packageDependencies": [\ + ["has-flag", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/has-flag-npm-4.0.0-32af9f0536-10c0.zip/node_modules/has-flag/",\ + "packageDependencies": [\ + ["has-flag", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["has-own-prop", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/has-own-prop-npm-2.0.0-d895adfe8c-10c0.zip/node_modules/has-own-prop/",\ + "packageDependencies": [\ + ["has-own-prop", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["has-property-descriptors", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/has-property-descriptors-npm-1.0.1-61cd62fce3-10c0.zip/node_modules/has-property-descriptors/",\ + "packageDependencies": [\ + ["has-property-descriptors", "npm:1.0.1"],\ + ["get-intrinsic", "npm:1.2.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["has-proto", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/has-proto-npm-1.0.1-631ea9d820-10c0.zip/node_modules/has-proto/",\ + "packageDependencies": [\ + ["has-proto", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["has-symbols", [\ + ["npm:1.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/has-symbols-npm-1.0.3-1986bff2c4-10c0.zip/node_modules/has-symbols/",\ + "packageDependencies": [\ + ["has-symbols", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["has-tostringtag", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/has-tostringtag-npm-1.0.0-b1fcf3ab55-10c0.zip/node_modules/has-tostringtag/",\ + "packageDependencies": [\ + ["has-tostringtag", "npm:1.0.0"],\ + ["has-symbols", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["has-unicode", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/has-unicode-npm-2.0.1-893adb4747-10c0.zip/node_modules/has-unicode/",\ + "packageDependencies": [\ + ["has-unicode", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["hash.js", [\ + ["npm:1.1.7", {\ + "packageLocation": "../../../.yarn/berry/cache/hash.js-npm-1.1.7-f1ad187358-10c0.zip/node_modules/hash.js/",\ + "packageDependencies": [\ + ["hash.js", "npm:1.1.7"],\ + ["inherits", "npm:2.0.4"],\ + ["minimalistic-assert", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["hasown", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/hasown-npm-2.0.0-78b794ceef-10c0.zip/node_modules/hasown/",\ + "packageDependencies": [\ + ["hasown", "npm:2.0.0"],\ + ["function-bind", "npm:1.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["hmac-drbg", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/hmac-drbg-npm-1.0.1-3499ad31cd-10c0.zip/node_modules/hmac-drbg/",\ + "packageDependencies": [\ + ["hmac-drbg", "npm:1.0.1"],\ + ["hash.js", "npm:1.1.7"],\ + ["minimalistic-assert", "npm:1.0.1"],\ + ["minimalistic-crypto-utils", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["homedir-polyfill", [\ + ["npm:1.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/homedir-polyfill-npm-1.0.3-da1a29ce00-10c0.zip/node_modules/homedir-polyfill/",\ + "packageDependencies": [\ + ["homedir-polyfill", "npm:1.0.3"],\ + ["parse-passwd", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["hosted-git-info", [\ + ["npm:2.8.9", {\ + "packageLocation": "../../../.yarn/berry/cache/hosted-git-info-npm-2.8.9-62c44fa93f-10c0.zip/node_modules/hosted-git-info/",\ + "packageDependencies": [\ + ["hosted-git-info", "npm:2.8.9"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/hosted-git-info-npm-4.1.0-4efcdf8fd3-10c0.zip/node_modules/hosted-git-info/",\ + "packageDependencies": [\ + ["hosted-git-info", "npm:4.1.0"],\ + ["lru-cache", "npm:6.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["html-escaper", [\ + ["npm:2.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/html-escaper-npm-2.0.2-38e51ef294-10c0.zip/node_modules/html-escaper/",\ + "packageDependencies": [\ + ["html-escaper", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["http-cache-semantics", [\ + ["npm:4.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/http-cache-semantics-npm-4.1.1-1120131375-10c0.zip/node_modules/http-cache-semantics/",\ + "packageDependencies": [\ + ["http-cache-semantics", "npm:4.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["http-errors", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/http-errors-npm-2.0.0-3f1c503428-10c0.zip/node_modules/http-errors/",\ + "packageDependencies": [\ + ["http-errors", "npm:2.0.0"],\ + ["depd", "npm:2.0.0"],\ + ["inherits", "npm:2.0.4"],\ + ["setprototypeof", "npm:1.2.0"],\ + ["statuses", "npm:2.0.1"],\ + ["toidentifier", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["http-proxy-agent", [\ + ["npm:7.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/http-proxy-agent-npm-7.0.0-106a57cc8c-10c0.zip/node_modules/http-proxy-agent/",\ + "packageDependencies": [\ + ["http-proxy-agent", "npm:7.0.0"],\ + ["agent-base", "npm:7.1.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["https-proxy-agent", [\ + ["npm:5.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/https-proxy-agent-npm-5.0.1-42d65f358e-10c0.zip/node_modules/https-proxy-agent/",\ + "packageDependencies": [\ + ["https-proxy-agent", "npm:5.0.1"],\ + ["agent-base", "npm:6.0.2"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/https-proxy-agent-npm-7.0.2-83ea6a5d42-10c0.zip/node_modules/https-proxy-agent/",\ + "packageDependencies": [\ + ["https-proxy-agent", "npm:7.0.2"],\ + ["agent-base", "npm:7.1.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["human-signals", [\ + ["npm:4.3.1", {\ + "packageLocation": "../../../.yarn/berry/cache/human-signals-npm-4.3.1-d723001512-10c0.zip/node_modules/human-signals/",\ + "packageDependencies": [\ + ["human-signals", "npm:4.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["iconv-lite", [\ + ["npm:0.4.24", {\ + "packageLocation": "../../../.yarn/berry/cache/iconv-lite-npm-0.4.24-c5c4ac6695-10c0.zip/node_modules/iconv-lite/",\ + "packageDependencies": [\ + ["iconv-lite", "npm:0.4.24"],\ + ["safer-buffer", "npm:2.1.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:0.6.3", {\ + "packageLocation": "../../../.yarn/berry/cache/iconv-lite-npm-0.6.3-24b8aae27e-10c0.zip/node_modules/iconv-lite/",\ + "packageDependencies": [\ + ["iconv-lite", "npm:0.6.3"],\ + ["safer-buffer", "npm:2.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ieee754", [\ + ["npm:1.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/ieee754-npm-1.2.1-fb63b3caeb-10c0.zip/node_modules/ieee754/",\ + "packageDependencies": [\ + ["ieee754", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ignore", [\ + ["npm:5.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/ignore-npm-5.3.0-fb0f5fa062-10c0.zip/node_modules/ignore/",\ + "packageDependencies": [\ + ["ignore", "npm:5.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ignore-by-default", [\ + ["npm:2.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/ignore-by-default-npm-2.1.0-996694cc00-10c0.zip/node_modules/ignore-by-default/",\ + "packageDependencies": [\ + ["ignore-by-default", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["import-fresh", [\ + ["npm:3.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/import-fresh-npm-3.3.0-3e34265ca9-10c0.zip/node_modules/import-fresh/",\ + "packageDependencies": [\ + ["import-fresh", "npm:3.3.0"],\ + ["parent-module", "npm:1.0.1"],\ + ["resolve-from", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["import-lazy", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/import-lazy-npm-4.0.0-3215653869-10c0.zip/node_modules/import-lazy/",\ + "packageDependencies": [\ + ["import-lazy", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["import-meta-resolve", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/import-meta-resolve-npm-4.0.0-13a6ef4fd3-10c0.zip/node_modules/import-meta-resolve/",\ + "packageDependencies": [\ + ["import-meta-resolve", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["imurmurhash", [\ + ["npm:0.1.4", {\ + "packageLocation": "../../../.yarn/berry/cache/imurmurhash-npm-0.1.4-610c5068a0-10c0.zip/node_modules/imurmurhash/",\ + "packageDependencies": [\ + ["imurmurhash", "npm:0.1.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["indent-string", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/indent-string-npm-4.0.0-7b717435b2-10c0.zip/node_modules/indent-string/",\ + "packageDependencies": [\ + ["indent-string", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/indent-string-npm-5.0.0-35eaa3b052-10c0.zip/node_modules/indent-string/",\ + "packageDependencies": [\ + ["indent-string", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["indexes-of", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/indexes-of-npm-1.0.1-5ce8500941-10c0.zip/node_modules/indexes-of/",\ + "packageDependencies": [\ + ["indexes-of", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["inflight", [\ + ["npm:1.0.6", {\ + "packageLocation": "../../../.yarn/berry/cache/inflight-npm-1.0.6-ccedb4b908-10c0.zip/node_modules/inflight/",\ + "packageDependencies": [\ + ["inflight", "npm:1.0.6"],\ + ["once", "npm:1.4.0"],\ + ["wrappy", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["inherits", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/inherits-npm-2.0.1-0011554c03-10c0.zip/node_modules/inherits/",\ + "packageDependencies": [\ + ["inherits", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/inherits-npm-2.0.4-c66b3957a0-10c0.zip/node_modules/inherits/",\ + "packageDependencies": [\ + ["inherits", "npm:2.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ini", [\ + ["npm:1.3.8", {\ + "packageLocation": "../../../.yarn/berry/cache/ini-npm-1.3.8-fb5040b4c0-10c0.zip/node_modules/ini/",\ + "packageDependencies": [\ + ["ini", "npm:1.3.8"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/ini-npm-4.1.1-01c2cbda7b-10c0.zip/node_modules/ini/",\ + "packageDependencies": [\ + ["ini", "npm:4.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["inquirer", [\ + ["npm:8.2.5", {\ + "packageLocation": "../../../.yarn/berry/cache/inquirer-npm-8.2.5-ffce7548f9-10c0.zip/node_modules/inquirer/",\ + "packageDependencies": [\ + ["inquirer", "npm:8.2.5"],\ + ["ansi-escapes", "npm:4.3.2"],\ + ["chalk", "npm:4.1.2"],\ + ["cli-cursor", "npm:3.1.0"],\ + ["cli-width", "npm:3.0.0"],\ + ["external-editor", "npm:3.1.0"],\ + ["figures", "npm:3.2.0"],\ + ["lodash", "npm:4.17.21"],\ + ["mute-stream", "npm:0.0.8"],\ + ["ora", "npm:5.4.1"],\ + ["run-async", "npm:2.4.1"],\ + ["rxjs", "npm:7.8.1"],\ + ["string-width", "npm:4.2.3"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["through", "npm:2.3.8"],\ + ["wrap-ansi", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["internal-slot", [\ + ["npm:1.0.6", {\ + "packageLocation": "../../../.yarn/berry/cache/internal-slot-npm-1.0.6-1ed833e09a-10c0.zip/node_modules/internal-slot/",\ + "packageDependencies": [\ + ["internal-slot", "npm:1.0.6"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["hasown", "npm:2.0.0"],\ + ["side-channel", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ip", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/ip-npm-2.0.0-204facb3cc-10c0.zip/node_modules/ip/",\ + "packageDependencies": [\ + ["ip", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ipaddr.js", [\ + ["npm:1.9.1", {\ + "packageLocation": "../../../.yarn/berry/cache/ipaddr.js-npm-1.9.1-19ae7878b4-10c0.zip/node_modules/ipaddr.js/",\ + "packageDependencies": [\ + ["ipaddr.js", "npm:1.9.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["irregular-plurals", [\ + ["npm:3.5.0", {\ + "packageLocation": "../../../.yarn/berry/cache/irregular-plurals-npm-3.5.0-2415613615-10c0.zip/node_modules/irregular-plurals/",\ + "packageDependencies": [\ + ["irregular-plurals", "npm:3.5.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-array-buffer", [\ + ["npm:3.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/is-array-buffer-npm-3.0.2-0dec897785-10c0.zip/node_modules/is-array-buffer/",\ + "packageDependencies": [\ + ["is-array-buffer", "npm:3.0.2"],\ + ["call-bind", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["is-typed-array", "npm:1.1.12"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-arrayish", [\ + ["npm:0.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/is-arrayish-npm-0.2.1-23927dfb15-10c0.zip/node_modules/is-arrayish/",\ + "packageDependencies": [\ + ["is-arrayish", "npm:0.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-bigint", [\ + ["npm:1.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/is-bigint-npm-1.0.4-31c2eecbc9-10c0.zip/node_modules/is-bigint/",\ + "packageDependencies": [\ + ["is-bigint", "npm:1.0.4"],\ + ["has-bigints", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-boolean-object", [\ + ["npm:1.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/is-boolean-object-npm-1.1.2-ecbd575e6a-10c0.zip/node_modules/is-boolean-object/",\ + "packageDependencies": [\ + ["is-boolean-object", "npm:1.1.2"],\ + ["call-bind", "npm:1.0.5"],\ + ["has-tostringtag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-builtin-module", [\ + ["npm:3.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/is-builtin-module-npm-3.2.1-2f92a5d353-10c0.zip/node_modules/is-builtin-module/",\ + "packageDependencies": [\ + ["is-builtin-module", "npm:3.2.1"],\ + ["builtin-modules", "npm:3.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-callable", [\ + ["npm:1.2.7", {\ + "packageLocation": "../../../.yarn/berry/cache/is-callable-npm-1.2.7-808a303e61-10c0.zip/node_modules/is-callable/",\ + "packageDependencies": [\ + ["is-callable", "npm:1.2.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-core-module", [\ + ["npm:2.13.1", {\ + "packageLocation": "../../../.yarn/berry/cache/is-core-module-npm-2.13.1-36e17434f9-10c0.zip/node_modules/is-core-module/",\ + "packageDependencies": [\ + ["is-core-module", "npm:2.13.1"],\ + ["hasown", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-date-object", [\ + ["npm:1.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/is-date-object-npm-1.0.5-88f3d08b5e-10c0.zip/node_modules/is-date-object/",\ + "packageDependencies": [\ + ["is-date-object", "npm:1.0.5"],\ + ["has-tostringtag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-docker", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-docker-npm-3.0.0-1570e32177-10c0.zip/node_modules/is-docker/",\ + "packageDependencies": [\ + ["is-docker", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-extglob", [\ + ["npm:2.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/is-extglob-npm-2.1.1-0870ea68b5-10c0.zip/node_modules/is-extglob/",\ + "packageDependencies": [\ + ["is-extglob", "npm:2.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-fullwidth-code-point", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-fullwidth-code-point-npm-3.0.0-1ecf4ebee5-10c0.zip/node_modules/is-fullwidth-code-point/",\ + "packageDependencies": [\ + ["is-fullwidth-code-point", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-fullwidth-code-point-npm-4.0.0-848488b60d-10c0.zip/node_modules/is-fullwidth-code-point/",\ + "packageDependencies": [\ + ["is-fullwidth-code-point", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-glob", [\ + ["npm:4.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/is-glob-npm-4.0.3-cb87bf1bdb-10c0.zip/node_modules/is-glob/",\ + "packageDependencies": [\ + ["is-glob", "npm:4.0.3"],\ + ["is-extglob", "npm:2.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-immutable-type", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/is-immutable-type-npm-2.0.1-a1c8e237b4-10c0.zip/node_modules/is-immutable-type/",\ + "packageDependencies": [\ + ["is-immutable-type", "npm:2.0.1"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:45ee868a16e5e16301bd5a061375b37c4ddadfda3dbc29a60eb33cc602493cb2833fdb5058487addec4d7d2fad1c6defdae2c5ae0c70fd6e7e1433365f3b484b#npm:2.0.1", {\ + "packageLocation": "./.yarn/__virtual__/is-immutable-type-virtual-a47524ebd3/4/.yarn/berry/cache/is-immutable-type-npm-2.0.1-a1c8e237b4-10c0.zip/node_modules/is-immutable-type/",\ + "packageDependencies": [\ + ["is-immutable-type", "virtual:45ee868a16e5e16301bd5a061375b37c4ddadfda3dbc29a60eb33cc602493cb2833fdb5058487addec4d7d2fad1c6defdae2c5ae0c70fd6e7e1433365f3b484b#npm:2.0.1"],\ + ["@types/eslint", null],\ + ["@types/typescript", null],\ + ["@typescript-eslint/type-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:6.18.1"],\ + ["eslint", "npm:8.56.0"],\ + ["ts-api-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:1.0.3"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/eslint",\ + "@types/typescript",\ + "eslint",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-inside-container", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-inside-container-npm-1.0.0-f2c9e9bb96-10c0.zip/node_modules/is-inside-container/",\ + "packageDependencies": [\ + ["is-inside-container", "npm:1.0.0"],\ + ["is-docker", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-interactive", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-interactive-npm-1.0.0-7ff7c6e04a-10c0.zip/node_modules/is-interactive/",\ + "packageDependencies": [\ + ["is-interactive", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-lambda", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/is-lambda-npm-1.0.1-7ab55bc8a8-10c0.zip/node_modules/is-lambda/",\ + "packageDependencies": [\ + ["is-lambda", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-module", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-module-npm-1.0.0-79ba918283-10c0.zip/node_modules/is-module/",\ + "packageDependencies": [\ + ["is-module", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-negative-zero", [\ + ["npm:2.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/is-negative-zero-npm-2.0.2-0adac91f15-10c0.zip/node_modules/is-negative-zero/",\ + "packageDependencies": [\ + ["is-negative-zero", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-number", [\ + ["npm:7.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-number-npm-7.0.0-060086935c-10c0.zip/node_modules/is-number/",\ + "packageDependencies": [\ + ["is-number", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-number-object", [\ + ["npm:1.0.7", {\ + "packageLocation": "../../../.yarn/berry/cache/is-number-object-npm-1.0.7-539d0e274d-10c0.zip/node_modules/is-number-object/",\ + "packageDependencies": [\ + ["is-number-object", "npm:1.0.7"],\ + ["has-tostringtag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-obj", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/is-obj-npm-1.0.1-7d391539d7-10c0.zip/node_modules/is-obj/",\ + "packageDependencies": [\ + ["is-obj", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-obj-npm-2.0.0-3d95e053f4-10c0.zip/node_modules/is-obj/",\ + "packageDependencies": [\ + ["is-obj", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-path-inside", [\ + ["npm:3.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/is-path-inside-npm-3.0.3-2ea0ef44fd-10c0.zip/node_modules/is-path-inside/",\ + "packageDependencies": [\ + ["is-path-inside", "npm:3.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-plain-obj", [\ + ["npm:1.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-plain-obj-npm-1.1.0-1046f64c0b-10c0.zip/node_modules/is-plain-obj/",\ + "packageDependencies": [\ + ["is-plain-obj", "npm:1.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-plain-object", [\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-plain-object-npm-5.0.0-285b70faa3-10c0.zip/node_modules/is-plain-object/",\ + "packageDependencies": [\ + ["is-plain-object", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-promise", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-promise-npm-4.0.0-1e3c05420c-10c0.zip/node_modules/is-promise/",\ + "packageDependencies": [\ + ["is-promise", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-reference", [\ + ["npm:1.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/is-reference-npm-1.2.1-87ca1743c8-10c0.zip/node_modules/is-reference/",\ + "packageDependencies": [\ + ["is-reference", "npm:1.2.1"],\ + ["@types/estree", "npm:1.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-regex", [\ + ["npm:1.1.4", {\ + "packageLocation": "../../../.yarn/berry/cache/is-regex-npm-1.1.4-cca193ef11-10c0.zip/node_modules/is-regex/",\ + "packageDependencies": [\ + ["is-regex", "npm:1.1.4"],\ + ["call-bind", "npm:1.0.5"],\ + ["has-tostringtag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-regexp", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-regexp-npm-1.0.0-8f95f51a0c-10c0.zip/node_modules/is-regexp/",\ + "packageDependencies": [\ + ["is-regexp", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-relative-path", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/is-relative-path-npm-1.0.2-920be97603-10c0.zip/node_modules/is-relative-path/",\ + "packageDependencies": [\ + ["is-relative-path", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-shared-array-buffer", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/is-shared-array-buffer-npm-1.0.2-32e4181fcd-10c0.zip/node_modules/is-shared-array-buffer/",\ + "packageDependencies": [\ + ["is-shared-array-buffer", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-stream", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-stream-npm-3.0.0-a77ac9a62e-10c0.zip/node_modules/is-stream/",\ + "packageDependencies": [\ + ["is-stream", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-string", [\ + ["npm:1.0.7", {\ + "packageLocation": "../../../.yarn/berry/cache/is-string-npm-1.0.7-9f7066daed-10c0.zip/node_modules/is-string/",\ + "packageDependencies": [\ + ["is-string", "npm:1.0.7"],\ + ["has-tostringtag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-symbol", [\ + ["npm:1.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/is-symbol-npm-1.0.4-eb9baac703-10c0.zip/node_modules/is-symbol/",\ + "packageDependencies": [\ + ["is-symbol", "npm:1.0.4"],\ + ["has-symbols", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-text-path", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/is-text-path-npm-1.0.1-92c78fe58d-10c0.zip/node_modules/is-text-path/",\ + "packageDependencies": [\ + ["is-text-path", "npm:1.0.1"],\ + ["text-extensions", "npm:1.9.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-typed-array", [\ + ["npm:1.1.12", {\ + "packageLocation": "../../../.yarn/berry/cache/is-typed-array-npm-1.1.12-6135c91b1a-10c0.zip/node_modules/is-typed-array/",\ + "packageDependencies": [\ + ["is-typed-array", "npm:1.1.12"],\ + ["which-typed-array", "npm:1.1.13"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-typedarray", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-typedarray-npm-1.0.0-bbd99de5b6-10c0.zip/node_modules/is-typedarray/",\ + "packageDependencies": [\ + ["is-typedarray", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-unicode-supported", [\ + ["npm:0.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-unicode-supported-npm-0.1.0-0833e1bbfb-10c0.zip/node_modules/is-unicode-supported/",\ + "packageDependencies": [\ + ["is-unicode-supported", "npm:0.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-unicode-supported-npm-2.0.0-7daaafc111-10c0.zip/node_modules/is-unicode-supported/",\ + "packageDependencies": [\ + ["is-unicode-supported", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-url", [\ + ["npm:1.2.4", {\ + "packageLocation": "../../../.yarn/berry/cache/is-url-npm-1.2.4-0a28aeb560-10c0.zip/node_modules/is-url/",\ + "packageDependencies": [\ + ["is-url", "npm:1.2.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-url-superb", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-url-superb-npm-4.0.0-71f6df9bc1-10c0.zip/node_modules/is-url-superb/",\ + "packageDependencies": [\ + ["is-url-superb", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-utf8", [\ + ["npm:0.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/is-utf8-npm-0.2.1-46ab364e2f-10c0.zip/node_modules/is-utf8/",\ + "packageDependencies": [\ + ["is-utf8", "npm:0.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-weakref", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/is-weakref-npm-1.0.2-ff80e8c314-10c0.zip/node_modules/is-weakref/",\ + "packageDependencies": [\ + ["is-weakref", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-windows", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/is-windows-npm-1.0.2-898cd6f3d7-10c0.zip/node_modules/is-windows/",\ + "packageDependencies": [\ + ["is-windows", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["is-wsl", [\ + ["npm:3.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/is-wsl-npm-3.1.0-311c6d2265-10c0.zip/node_modules/is-wsl/",\ + "packageDependencies": [\ + ["is-wsl", "npm:3.1.0"],\ + ["is-inside-container", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["isarray", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/isarray-npm-1.0.0-db4f547720-10c0.zip/node_modules/isarray/",\ + "packageDependencies": [\ + ["isarray", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/isarray-npm-2.0.5-4ba522212d-10c0.zip/node_modules/isarray/",\ + "packageDependencies": [\ + ["isarray", "npm:2.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["isexe", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/isexe-npm-2.0.0-b58870bd2e-10c0.zip/node_modules/isexe/",\ + "packageDependencies": [\ + ["isexe", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/isexe-npm-3.1.1-9c0061eead-10c0.zip/node_modules/isexe/",\ + "packageDependencies": [\ + ["isexe", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["istanbul-lib-coverage", [\ + ["npm:3.2.2", {\ + "packageLocation": "../../../.yarn/berry/cache/istanbul-lib-coverage-npm-3.2.2-5c0526e059-10c0.zip/node_modules/istanbul-lib-coverage/",\ + "packageDependencies": [\ + ["istanbul-lib-coverage", "npm:3.2.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["istanbul-lib-report", [\ + ["npm:3.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/istanbul-lib-report-npm-3.0.1-b17446ab24-10c0.zip/node_modules/istanbul-lib-report/",\ + "packageDependencies": [\ + ["istanbul-lib-report", "npm:3.0.1"],\ + ["istanbul-lib-coverage", "npm:3.2.2"],\ + ["make-dir", "npm:4.0.0"],\ + ["supports-color", "npm:7.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["istanbul-reports", [\ + ["npm:3.1.6", {\ + "packageLocation": "../../../.yarn/berry/cache/istanbul-reports-npm-3.1.6-66918eb97f-10c0.zip/node_modules/istanbul-reports/",\ + "packageDependencies": [\ + ["istanbul-reports", "npm:3.1.6"],\ + ["html-escaper", "npm:2.0.2"],\ + ["istanbul-lib-report", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["jackspeak", [\ + ["npm:2.3.6", {\ + "packageLocation": "../../../.yarn/berry/cache/jackspeak-npm-2.3.6-42e1233172-10c0.zip/node_modules/jackspeak/",\ + "packageDependencies": [\ + ["jackspeak", "npm:2.3.6"],\ + ["@isaacs/cliui", "npm:8.0.2"],\ + ["@pkgjs/parseargs", "npm:0.11.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["jiti", [\ + ["npm:1.21.0", {\ + "packageLocation": "../../../.yarn/berry/cache/jiti-npm-1.21.0-baebd5985a-10c0.zip/node_modules/jiti/",\ + "packageDependencies": [\ + ["jiti", "npm:1.21.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["jju", [\ + ["npm:1.4.0", {\ + "packageLocation": "../../../.yarn/berry/cache/jju-npm-1.4.0-670678eaa3-10c0.zip/node_modules/jju/",\ + "packageDependencies": [\ + ["jju", "npm:1.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["js-sha256", [\ + ["npm:0.9.0", {\ + "packageLocation": "../../../.yarn/berry/cache/js-sha256-npm-0.9.0-1aa718efaf-10c0.zip/node_modules/js-sha256/",\ + "packageDependencies": [\ + ["js-sha256", "npm:0.9.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["js-string-escape", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/js-string-escape-npm-1.0.1-8b8d76add3-10c0.zip/node_modules/js-string-escape/",\ + "packageDependencies": [\ + ["js-string-escape", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["js-tokens", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/js-tokens-npm-4.0.0-0ac852e9e2-10c0.zip/node_modules/js-tokens/",\ + "packageDependencies": [\ + ["js-tokens", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["js-yaml", [\ + ["npm:3.13.1", {\ + "packageLocation": "../../../.yarn/berry/cache/js-yaml-npm-3.13.1-3a28ff3b75-10c0.zip/node_modules/js-yaml/",\ + "packageDependencies": [\ + ["js-yaml", "npm:3.13.1"],\ + ["argparse", "npm:1.0.10"],\ + ["esprima", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.14.1", {\ + "packageLocation": "../../../.yarn/berry/cache/js-yaml-npm-3.14.1-b968c6095e-10c0.zip/node_modules/js-yaml/",\ + "packageDependencies": [\ + ["js-yaml", "npm:3.14.1"],\ + ["argparse", "npm:1.0.10"],\ + ["esprima", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/js-yaml-npm-4.1.0-3606f32312-10c0.zip/node_modules/js-yaml/",\ + "packageDependencies": [\ + ["js-yaml", "npm:4.1.0"],\ + ["argparse", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["json-buffer", [\ + ["npm:3.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/json-buffer-npm-3.0.1-f8f6d20603-10c0.zip/node_modules/json-buffer/",\ + "packageDependencies": [\ + ["json-buffer", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["json-parse-better-errors", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/json-parse-better-errors-npm-1.0.2-7f37637d19-10c0.zip/node_modules/json-parse-better-errors/",\ + "packageDependencies": [\ + ["json-parse-better-errors", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["json-parse-even-better-errors", [\ + ["npm:2.3.1", {\ + "packageLocation": "../../../.yarn/berry/cache/json-parse-even-better-errors-npm-2.3.1-144d62256e-10c0.zip/node_modules/json-parse-even-better-errors/",\ + "packageDependencies": [\ + ["json-parse-even-better-errors", "npm:2.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["json-schema-migrate", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/json-schema-migrate-npm-2.0.0-87745c8332-10c0.zip/node_modules/json-schema-migrate/",\ + "packageDependencies": [\ + ["json-schema-migrate", "npm:2.0.0"],\ + ["ajv", "npm:8.12.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["json-schema-traverse", [\ + ["npm:0.4.1", {\ + "packageLocation": "../../../.yarn/berry/cache/json-schema-traverse-npm-0.4.1-4759091693-10c0.zip/node_modules/json-schema-traverse/",\ + "packageDependencies": [\ + ["json-schema-traverse", "npm:0.4.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/json-schema-traverse-npm-1.0.0-fb3684f4f0-10c0.zip/node_modules/json-schema-traverse/",\ + "packageDependencies": [\ + ["json-schema-traverse", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["json-stable-stringify-without-jsonify", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/json-stable-stringify-without-jsonify-npm-1.0.1-b65772b28b-10c0.zip/node_modules/json-stable-stringify-without-jsonify/",\ + "packageDependencies": [\ + ["json-stable-stringify-without-jsonify", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["json-stringify-safe", [\ + ["npm:5.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/json-stringify-safe-npm-5.0.1-064ddd6ab4-10c0.zip/node_modules/json-stringify-safe/",\ + "packageDependencies": [\ + ["json-stringify-safe", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["json5", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/json5-npm-1.0.2-9607f93e30-10c0.zip/node_modules/json5/",\ + "packageDependencies": [\ + ["json5", "npm:1.0.2"],\ + ["minimist", "npm:1.2.8"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.2.3", {\ + "packageLocation": "../../../.yarn/berry/cache/json5-npm-2.2.3-9962c55073-10c0.zip/node_modules/json5/",\ + "packageDependencies": [\ + ["json5", "npm:2.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["jsonc-parser", [\ + ["npm:3.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/jsonc-parser-npm-3.2.0-1896ece3b7-10c0.zip/node_modules/jsonc-parser/",\ + "packageDependencies": [\ + ["jsonc-parser", "npm:3.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["jsonfile", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/jsonfile-npm-4.0.0-10ce3aea15-10c0.zip/node_modules/jsonfile/",\ + "packageDependencies": [\ + ["jsonfile", "npm:4.0.0"],\ + ["graceful-fs", "npm:4.2.11"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/jsonfile-npm-6.1.0-20a4796cee-10c0.zip/node_modules/jsonfile/",\ + "packageDependencies": [\ + ["jsonfile", "npm:6.1.0"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["universalify", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["jsonparse", [\ + ["npm:1.3.1", {\ + "packageLocation": "../../../.yarn/berry/cache/jsonparse-npm-1.3.1-b6fde74828-10c0.zip/node_modules/jsonparse/",\ + "packageDependencies": [\ + ["jsonparse", "npm:1.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["junk", [\ + ["npm:4.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/junk-npm-4.0.1-989df0f7ae-10c0.zip/node_modules/junk/",\ + "packageDependencies": [\ + ["junk", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["keyv", [\ + ["npm:4.5.4", {\ + "packageLocation": "../../../.yarn/berry/cache/keyv-npm-4.5.4-4c8e2cf7f7-10c0.zip/node_modules/keyv/",\ + "packageDependencies": [\ + ["keyv", "npm:4.5.4"],\ + ["json-buffer", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["kind-of", [\ + ["npm:6.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/kind-of-npm-6.0.3-ab15f36220-10c0.zip/node_modules/kind-of/",\ + "packageDependencies": [\ + ["kind-of", "npm:6.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["levn", [\ + ["npm:0.4.1", {\ + "packageLocation": "../../../.yarn/berry/cache/levn-npm-0.4.1-d183b2d7bb-10c0.zip/node_modules/levn/",\ + "packageDependencies": [\ + ["levn", "npm:0.4.1"],\ + ["prelude-ls", "npm:1.2.1"],\ + ["type-check", "npm:0.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lines-and-columns", [\ + ["npm:1.2.4", {\ + "packageLocation": "../../../.yarn/berry/cache/lines-and-columns-npm-1.2.4-d6c7cc5799-10c0.zip/node_modules/lines-and-columns/",\ + "packageDependencies": [\ + ["lines-and-columns", "npm:1.2.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["load-json-file", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/load-json-file-npm-4.0.0-c9f09d85eb-10c0.zip/node_modules/load-json-file/",\ + "packageDependencies": [\ + ["load-json-file", "npm:4.0.0"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["parse-json", "npm:4.0.0"],\ + ["pify", "npm:3.0.0"],\ + ["strip-bom", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/load-json-file-npm-7.0.1-1d6057f4c4-10c0.zip/node_modules/load-json-file/",\ + "packageDependencies": [\ + ["load-json-file", "npm:7.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["locate-path", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/locate-path-npm-2.0.0-673d28b0ea-10c0.zip/node_modules/locate-path/",\ + "packageDependencies": [\ + ["locate-path", "npm:2.0.0"],\ + ["p-locate", "npm:2.0.0"],\ + ["path-exists", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/locate-path-npm-3.0.0-991671ae9f-10c0.zip/node_modules/locate-path/",\ + "packageDependencies": [\ + ["locate-path", "npm:3.0.0"],\ + ["p-locate", "npm:3.0.0"],\ + ["path-exists", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/locate-path-npm-5.0.0-46580c43e4-10c0.zip/node_modules/locate-path/",\ + "packageDependencies": [\ + ["locate-path", "npm:5.0.0"],\ + ["p-locate", "npm:4.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/locate-path-npm-6.0.0-06a1e4c528-10c0.zip/node_modules/locate-path/",\ + "packageDependencies": [\ + ["locate-path", "npm:6.0.0"],\ + ["p-locate", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash", [\ + ["npm:4.17.21", {\ + "packageLocation": "../../../.yarn/berry/cache/lodash-npm-4.17.21-6382451519-10c0.zip/node_modules/lodash/",\ + "packageDependencies": [\ + ["lodash", "npm:4.17.21"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash.get", [\ + ["npm:4.4.2", {\ + "packageLocation": "../../../.yarn/berry/cache/lodash.get-npm-4.4.2-7bda64ed87-10c0.zip/node_modules/lodash.get/",\ + "packageDependencies": [\ + ["lodash.get", "npm:4.4.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash.isequal", [\ + ["npm:4.5.0", {\ + "packageLocation": "../../../.yarn/berry/cache/lodash.isequal-npm-4.5.0-f8b0f64d63-10c0.zip/node_modules/lodash.isequal/",\ + "packageDependencies": [\ + ["lodash.isequal", "npm:4.5.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash.ismatch", [\ + ["npm:4.4.0", {\ + "packageLocation": "../../../.yarn/berry/cache/lodash.ismatch-npm-4.4.0-e538fd6c3d-10c0.zip/node_modules/lodash.ismatch/",\ + "packageDependencies": [\ + ["lodash.ismatch", "npm:4.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash.isplainobject", [\ + ["npm:4.0.6", {\ + "packageLocation": "../../../.yarn/berry/cache/lodash.isplainobject-npm-4.0.6-d73937742f-10c0.zip/node_modules/lodash.isplainobject/",\ + "packageDependencies": [\ + ["lodash.isplainobject", "npm:4.0.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash.map", [\ + ["npm:4.6.0", {\ + "packageLocation": "../../../.yarn/berry/cache/lodash.map-npm-4.6.0-8013e2ad18-10c0.zip/node_modules/lodash.map/",\ + "packageDependencies": [\ + ["lodash.map", "npm:4.6.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash.merge", [\ + ["npm:4.6.2", {\ + "packageLocation": "../../../.yarn/berry/cache/lodash.merge-npm-4.6.2-77cb4416bf-10c0.zip/node_modules/lodash.merge/",\ + "packageDependencies": [\ + ["lodash.merge", "npm:4.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash.mergewith", [\ + ["npm:4.6.2", {\ + "packageLocation": "../../../.yarn/berry/cache/lodash.mergewith-npm-4.6.2-7d2d4201ec-10c0.zip/node_modules/lodash.mergewith/",\ + "packageDependencies": [\ + ["lodash.mergewith", "npm:4.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lodash.uniq", [\ + ["npm:4.5.0", {\ + "packageLocation": "../../../.yarn/berry/cache/lodash.uniq-npm-4.5.0-7c270dca85-10c0.zip/node_modules/lodash.uniq/",\ + "packageDependencies": [\ + ["lodash.uniq", "npm:4.5.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["log-symbols", [\ + ["npm:4.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/log-symbols-npm-4.1.0-0a13492d8b-10c0.zip/node_modules/log-symbols/",\ + "packageDependencies": [\ + ["log-symbols", "npm:4.1.0"],\ + ["chalk", "npm:4.1.2"],\ + ["is-unicode-supported", "npm:0.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["longest", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/longest-npm-2.0.1-4579de9937-10c0.zip/node_modules/longest/",\ + "packageDependencies": [\ + ["longest", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lru-cache", [\ + ["npm:10.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/lru-cache-npm-10.1.0-f3d3a0f0ab-10c0.zip/node_modules/lru-cache/",\ + "packageDependencies": [\ + ["lru-cache", "npm:10.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/lru-cache-npm-6.0.0-b4c8668fe1-10c0.zip/node_modules/lru-cache/",\ + "packageDependencies": [\ + ["lru-cache", "npm:6.0.0"],\ + ["yallist", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["lunr", [\ + ["npm:2.3.9", {\ + "packageLocation": "../../../.yarn/berry/cache/lunr-npm-2.3.9-fa3aa9c2d6-10c0.zip/node_modules/lunr/",\ + "packageDependencies": [\ + ["lunr", "npm:2.3.9"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["madge", [\ + ["npm:6.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/madge-npm-6.1.0-6e84c1d8df-10c0.zip/node_modules/madge/",\ + "packageDependencies": [\ + ["madge", "npm:6.1.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.1.0", {\ + "packageLocation": "./.yarn/__virtual__/madge-virtual-c21c430715/4/.yarn/berry/cache/madge-npm-6.1.0-6e84c1d8df-10c0.zip/node_modules/madge/",\ + "packageDependencies": [\ + ["madge", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:6.1.0"],\ + ["@types/typescript", null],\ + ["chalk", "npm:4.1.2"],\ + ["commander", "npm:7.2.0"],\ + ["commondir", "npm:1.0.1"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["dependency-tree", "npm:9.0.0"],\ + ["detective-amd", "npm:4.2.0"],\ + ["detective-cjs", "npm:4.1.0"],\ + ["detective-es6", "npm:3.0.1"],\ + ["detective-less", "npm:1.0.2"],\ + ["detective-postcss", "npm:6.1.3"],\ + ["detective-sass", "npm:4.1.3"],\ + ["detective-scss", "npm:3.1.1"],\ + ["detective-stylus", "npm:2.0.1"],\ + ["detective-typescript", "npm:9.1.1"],\ + ["ora", "npm:5.4.1"],\ + ["pluralize", "npm:8.0.0"],\ + ["precinct", "npm:8.3.1"],\ + ["pretty-ms", "npm:7.0.1"],\ + ["rc", "npm:1.2.8"],\ + ["stream-to-array", "npm:2.3.0"],\ + ["ts-graphviz", "npm:1.8.1"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"],\ + ["walkdir", "npm:0.4.1"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["magic-string", [\ + ["npm:0.30.5", {\ + "packageLocation": "../../../.yarn/berry/cache/magic-string-npm-0.30.5-dffb7e6a73-10c0.zip/node_modules/magic-string/",\ + "packageDependencies": [\ + ["magic-string", "npm:0.30.5"],\ + ["@jridgewell/sourcemap-codec", "npm:1.4.15"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["make-dir", [\ + ["npm:3.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/make-dir-npm-3.1.0-d1d7505142-10c0.zip/node_modules/make-dir/",\ + "packageDependencies": [\ + ["make-dir", "npm:3.1.0"],\ + ["semver", "npm:6.3.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/make-dir-npm-4.0.0-ec3cd921cc-10c0.zip/node_modules/make-dir/",\ + "packageDependencies": [\ + ["make-dir", "npm:4.0.0"],\ + ["semver", "npm:7.5.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["make-fetch-happen", [\ + ["npm:13.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/make-fetch-happen-npm-13.0.0-f87a92bb87-10c0.zip/node_modules/make-fetch-happen/",\ + "packageDependencies": [\ + ["make-fetch-happen", "npm:13.0.0"],\ + ["@npmcli/agent", "npm:2.2.0"],\ + ["cacache", "npm:18.0.2"],\ + ["http-cache-semantics", "npm:4.1.1"],\ + ["is-lambda", "npm:1.0.1"],\ + ["minipass", "npm:7.0.4"],\ + ["minipass-fetch", "npm:3.0.4"],\ + ["minipass-flush", "npm:1.0.5"],\ + ["minipass-pipeline", "npm:1.2.4"],\ + ["negotiator", "npm:0.6.3"],\ + ["promise-retry", "npm:2.0.1"],\ + ["ssri", "npm:10.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["map-obj", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/map-obj-npm-1.0.1-fa55100fac-10c0.zip/node_modules/map-obj/",\ + "packageDependencies": [\ + ["map-obj", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/map-obj-npm-4.3.0-d53e32935d-10c0.zip/node_modules/map-obj/",\ + "packageDependencies": [\ + ["map-obj", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["marked", [\ + ["npm:4.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/marked-npm-4.3.0-e7ef9e874f-10c0.zip/node_modules/marked/",\ + "packageDependencies": [\ + ["marked", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["matcher", [\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/matcher-npm-5.0.0-426d06a4f6-10c0.zip/node_modules/matcher/",\ + "packageDependencies": [\ + ["matcher", "npm:5.0.0"],\ + ["escape-string-regexp", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["md5-hex", [\ + ["npm:3.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/md5-hex-npm-3.0.1-d9f5f267ed-10c0.zip/node_modules/md5-hex/",\ + "packageDependencies": [\ + ["md5-hex", "npm:3.0.1"],\ + ["blueimp-md5", "npm:2.19.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["media-typer", [\ + ["npm:0.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/media-typer-npm-0.3.0-8674f8f0f5-10c0.zip/node_modules/media-typer/",\ + "packageDependencies": [\ + ["media-typer", "npm:0.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["memoize", [\ + ["npm:10.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/memoize-npm-10.0.0-953b145644-10c0.zip/node_modules/memoize/",\ + "packageDependencies": [\ + ["memoize", "npm:10.0.0"],\ + ["mimic-function", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["meow", [\ + ["npm:12.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/meow-npm-12.1.1-bd7858d088-10c0.zip/node_modules/meow/",\ + "packageDependencies": [\ + ["meow", "npm:12.1.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/meow-npm-8.1.2-bcfe48d4f3-10c0.zip/node_modules/meow/",\ + "packageDependencies": [\ + ["meow", "npm:8.1.2"],\ + ["@types/minimist", "npm:1.2.5"],\ + ["camelcase-keys", "npm:6.2.2"],\ + ["decamelize-keys", "npm:1.1.1"],\ + ["hard-rejection", "npm:2.1.0"],\ + ["minimist-options", "npm:4.1.0"],\ + ["normalize-package-data", "npm:3.0.3"],\ + ["read-pkg-up", "npm:7.0.1"],\ + ["redent", "npm:3.0.0"],\ + ["trim-newlines", "npm:3.0.1"],\ + ["type-fest", "npm:0.18.1"],\ + ["yargs-parser", "npm:20.2.9"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["merge", [\ + ["npm:2.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/merge-npm-2.1.1-90e7307c49-10c0.zip/node_modules/merge/",\ + "packageDependencies": [\ + ["merge", "npm:2.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["merge-descriptors", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/merge-descriptors-npm-1.0.1-615287aaa8-10c0.zip/node_modules/merge-descriptors/",\ + "packageDependencies": [\ + ["merge-descriptors", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["merge-stream", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/merge-stream-npm-2.0.0-2ac83efea5-10c0.zip/node_modules/merge-stream/",\ + "packageDependencies": [\ + ["merge-stream", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["merge2", [\ + ["npm:1.4.1", {\ + "packageLocation": "../../../.yarn/berry/cache/merge2-npm-1.4.1-a2507bd06c-10c0.zip/node_modules/merge2/",\ + "packageDependencies": [\ + ["merge2", "npm:1.4.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["methods", [\ + ["npm:1.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/methods-npm-1.1.2-92f6fdb39b-10c0.zip/node_modules/methods/",\ + "packageDependencies": [\ + ["methods", "npm:1.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["micromatch", [\ + ["npm:4.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/micromatch-npm-4.0.5-cfab5d7669-10c0.zip/node_modules/micromatch/",\ + "packageDependencies": [\ + ["micromatch", "npm:4.0.5"],\ + ["braces", "npm:3.0.2"],\ + ["picomatch", "npm:2.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["mime", [\ + ["npm:1.6.0", {\ + "packageLocation": "../../../.yarn/berry/cache/mime-npm-1.6.0-60ae95038a-10c0.zip/node_modules/mime/",\ + "packageDependencies": [\ + ["mime", "npm:1.6.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["mime-db", [\ + ["npm:1.52.0", {\ + "packageLocation": "../../../.yarn/berry/cache/mime-db-npm-1.52.0-b5371d6fd2-10c0.zip/node_modules/mime-db/",\ + "packageDependencies": [\ + ["mime-db", "npm:1.52.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["mime-types", [\ + ["npm:2.1.35", {\ + "packageLocation": "../../../.yarn/berry/cache/mime-types-npm-2.1.35-dd9ea9f3e2-10c0.zip/node_modules/mime-types/",\ + "packageDependencies": [\ + ["mime-types", "npm:2.1.35"],\ + ["mime-db", "npm:1.52.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["mimic-fn", [\ + ["npm:2.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/mimic-fn-npm-2.1.0-4fbeb3abb4-10c0.zip/node_modules/mimic-fn/",\ + "packageDependencies": [\ + ["mimic-fn", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/mimic-fn-npm-4.0.0-feaeda79f7-10c0.zip/node_modules/mimic-fn/",\ + "packageDependencies": [\ + ["mimic-fn", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["mimic-function", [\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/mimic-function-npm-5.0.0-b0334c4f46-10c0.zip/node_modules/mimic-function/",\ + "packageDependencies": [\ + ["mimic-function", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["min-indent", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/min-indent-npm-1.0.1-77031f50e1-10c0.zip/node_modules/min-indent/",\ + "packageDependencies": [\ + ["min-indent", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minimalistic-assert", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/minimalistic-assert-npm-1.0.1-dc8bb23d29-10c0.zip/node_modules/minimalistic-assert/",\ + "packageDependencies": [\ + ["minimalistic-assert", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minimalistic-crypto-utils", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/minimalistic-crypto-utils-npm-1.0.1-e66b10822e-10c0.zip/node_modules/minimalistic-crypto-utils/",\ + "packageDependencies": [\ + ["minimalistic-crypto-utils", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minimatch", [\ + ["npm:3.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/minimatch-npm-3.1.2-9405269906-10c0.zip/node_modules/minimatch/",\ + "packageDependencies": [\ + ["minimatch", "npm:3.1.2"],\ + ["brace-expansion", "npm:1.1.11"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.1.6", {\ + "packageLocation": "../../../.yarn/berry/cache/minimatch-npm-5.1.6-1e71429f4c-10c0.zip/node_modules/minimatch/",\ + "packageDependencies": [\ + ["minimatch", "npm:5.1.6"],\ + ["brace-expansion", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:9.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/minimatch-npm-9.0.3-69d7d6fad5-10c0.zip/node_modules/minimatch/",\ + "packageDependencies": [\ + ["minimatch", "npm:9.0.3"],\ + ["brace-expansion", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minimist", [\ + ["npm:1.2.7", {\ + "packageLocation": "../../../.yarn/berry/cache/minimist-npm-1.2.7-51d33b1371-10c0.zip/node_modules/minimist/",\ + "packageDependencies": [\ + ["minimist", "npm:1.2.7"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:1.2.8", {\ + "packageLocation": "../../../.yarn/berry/cache/minimist-npm-1.2.8-d7af7b1dce-10c0.zip/node_modules/minimist/",\ + "packageDependencies": [\ + ["minimist", "npm:1.2.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minimist-options", [\ + ["npm:4.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/minimist-options-npm-4.1.0-64ca250fc1-10c0.zip/node_modules/minimist-options/",\ + "packageDependencies": [\ + ["minimist-options", "npm:4.1.0"],\ + ["arrify", "npm:1.0.1"],\ + ["is-plain-obj", "npm:1.1.0"],\ + ["kind-of", "npm:6.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minipass", [\ + ["npm:3.3.6", {\ + "packageLocation": "../../../.yarn/berry/cache/minipass-npm-3.3.6-b8d93a945b-10c0.zip/node_modules/minipass/",\ + "packageDependencies": [\ + ["minipass", "npm:3.3.6"],\ + ["yallist", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/minipass-npm-5.0.0-c64fb63c92-10c0.zip/node_modules/minipass/",\ + "packageDependencies": [\ + ["minipass", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/minipass-npm-7.0.4-eacb4e042e-10c0.zip/node_modules/minipass/",\ + "packageDependencies": [\ + ["minipass", "npm:7.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minipass-collect", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/minipass-collect-npm-2.0.1-73d3907e40-10c0.zip/node_modules/minipass-collect/",\ + "packageDependencies": [\ + ["minipass-collect", "npm:2.0.1"],\ + ["minipass", "npm:7.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minipass-fetch", [\ + ["npm:3.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/minipass-fetch-npm-3.0.4-200ac7c66d-10c0.zip/node_modules/minipass-fetch/",\ + "packageDependencies": [\ + ["minipass-fetch", "npm:3.0.4"],\ + ["encoding", "npm:0.1.13"],\ + ["minipass", "npm:7.0.4"],\ + ["minipass-sized", "npm:1.0.3"],\ + ["minizlib", "npm:2.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minipass-flush", [\ + ["npm:1.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/minipass-flush-npm-1.0.5-efe79d9826-10c0.zip/node_modules/minipass-flush/",\ + "packageDependencies": [\ + ["minipass-flush", "npm:1.0.5"],\ + ["minipass", "npm:3.3.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minipass-pipeline", [\ + ["npm:1.2.4", {\ + "packageLocation": "../../../.yarn/berry/cache/minipass-pipeline-npm-1.2.4-5924cb077f-10c0.zip/node_modules/minipass-pipeline/",\ + "packageDependencies": [\ + ["minipass-pipeline", "npm:1.2.4"],\ + ["minipass", "npm:3.3.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minipass-sized", [\ + ["npm:1.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/minipass-sized-npm-1.0.3-306d86f432-10c0.zip/node_modules/minipass-sized/",\ + "packageDependencies": [\ + ["minipass-sized", "npm:1.0.3"],\ + ["minipass", "npm:3.3.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["minizlib", [\ + ["npm:2.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/minizlib-npm-2.1.2-ea89cd0cfb-10c0.zip/node_modules/minizlib/",\ + "packageDependencies": [\ + ["minizlib", "npm:2.1.2"],\ + ["minipass", "npm:3.3.6"],\ + ["yallist", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["mkdirp", [\ + ["npm:1.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/mkdirp-npm-1.0.4-37f6ef56b9-10c0.zip/node_modules/mkdirp/",\ + "packageDependencies": [\ + ["mkdirp", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["modify-values", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/modify-values-npm-1.0.1-9b2377e166-10c0.zip/node_modules/modify-values/",\ + "packageDependencies": [\ + ["modify-values", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["module-definition", [\ + ["npm:3.4.0", {\ + "packageLocation": "../../../.yarn/berry/cache/module-definition-npm-3.4.0-2eb7522283-10c0.zip/node_modules/module-definition/",\ + "packageDependencies": [\ + ["module-definition", "npm:3.4.0"],\ + ["ast-module-types", "npm:3.0.0"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/module-definition-npm-4.1.0-d712dfff19-10c0.zip/node_modules/module-definition/",\ + "packageDependencies": [\ + ["module-definition", "npm:4.1.0"],\ + ["ast-module-types", "npm:4.0.0"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["module-lookup-amd", [\ + ["npm:7.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/module-lookup-amd-npm-7.0.1-83d0a3e93f-10c0.zip/node_modules/module-lookup-amd/",\ + "packageDependencies": [\ + ["module-lookup-amd", "npm:7.0.1"],\ + ["commander", "npm:2.20.3"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["glob", "npm:7.2.3"],\ + ["requirejs", "npm:2.3.6"],\ + ["requirejs-config-file", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ms", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/ms-npm-2.0.0-9e1101a471-10c0.zip/node_modules/ms/",\ + "packageDependencies": [\ + ["ms", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/ms-npm-2.1.2-ec0c1512ff-10c0.zip/node_modules/ms/",\ + "packageDependencies": [\ + ["ms", "npm:2.1.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.1.3", {\ + "packageLocation": "../../../.yarn/berry/cache/ms-npm-2.1.3-81ff3cfac1-10c0.zip/node_modules/ms/",\ + "packageDependencies": [\ + ["ms", "npm:2.1.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["mute-stream", [\ + ["npm:0.0.8", {\ + "packageLocation": "../../../.yarn/berry/cache/mute-stream-npm-0.0.8-489a7d6c2b-10c0.zip/node_modules/mute-stream/",\ + "packageDependencies": [\ + ["mute-stream", "npm:0.0.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["nanoid", [\ + ["npm:3.3.7", {\ + "packageLocation": "../../../.yarn/berry/cache/nanoid-npm-3.3.7-98824ba130-10c0.zip/node_modules/nanoid/",\ + "packageDependencies": [\ + ["nanoid", "npm:3.3.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["natural-compare", [\ + ["npm:1.4.0", {\ + "packageLocation": "../../../.yarn/berry/cache/natural-compare-npm-1.4.0-97b75b362d-10c0.zip/node_modules/natural-compare/",\ + "packageDependencies": [\ + ["natural-compare", "npm:1.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["negotiator", [\ + ["npm:0.6.3", {\ + "packageLocation": "../../../.yarn/berry/cache/negotiator-npm-0.6.3-9d50e36171-10c0.zip/node_modules/negotiator/",\ + "packageDependencies": [\ + ["negotiator", "npm:0.6.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["neo-async", [\ + ["npm:2.6.2", {\ + "packageLocation": "../../../.yarn/berry/cache/neo-async-npm-2.6.2-75d6902586-10c0.zip/node_modules/neo-async/",\ + "packageDependencies": [\ + ["neo-async", "npm:2.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["nested-error-stacks", [\ + ["npm:2.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/nested-error-stacks-npm-2.1.1-0b1da05af0-10c0.zip/node_modules/nested-error-stacks/",\ + "packageDependencies": [\ + ["nested-error-stacks", "npm:2.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["node-addon-api", [\ + ["npm:5.1.0", {\ + "packageLocation": "./.yarn/unplugged/node-addon-api-npm-5.1.0-b50d00f739/node_modules/node-addon-api/",\ + "packageDependencies": [\ + ["node-addon-api", "npm:5.1.0"],\ + ["node-gyp", "npm:10.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["node-fetch", [\ + ["npm:2.7.0", {\ + "packageLocation": "../../../.yarn/berry/cache/node-fetch-npm-2.7.0-587d57004e-10c0.zip/node_modules/node-fetch/",\ + "packageDependencies": [\ + ["node-fetch", "npm:2.7.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5547f15a2bb3d361d141532d43f94523f31e9edfe533f8367b3e26e300194e2978be03f56c09e100afcfee4c02b7fbe13c6ffcf58c613b457a86da522a2979f2#npm:2.7.0", {\ + "packageLocation": "./.yarn/__virtual__/node-fetch-virtual-64b33d0816/4/.yarn/berry/cache/node-fetch-npm-2.7.0-587d57004e-10c0.zip/node_modules/node-fetch/",\ + "packageDependencies": [\ + ["node-fetch", "virtual:5547f15a2bb3d361d141532d43f94523f31e9edfe533f8367b3e26e300194e2978be03f56c09e100afcfee4c02b7fbe13c6ffcf58c613b457a86da522a2979f2#npm:2.7.0"],\ + ["@types/encoding", null],\ + ["encoding", null],\ + ["whatwg-url", "npm:5.0.0"]\ + ],\ + "packagePeers": [\ + "@types/encoding",\ + "encoding"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["node-gyp", [\ + ["npm:10.0.1", {\ + "packageLocation": "./.yarn/unplugged/node-gyp-npm-10.0.1-48708ce70b/node_modules/node-gyp/",\ + "packageDependencies": [\ + ["node-gyp", "npm:10.0.1"],\ + ["env-paths", "npm:2.2.1"],\ + ["exponential-backoff", "npm:3.1.1"],\ + ["glob", "npm:10.3.10"],\ + ["graceful-fs", "npm:4.2.11"],\ + ["make-fetch-happen", "npm:13.0.0"],\ + ["nopt", "npm:7.2.0"],\ + ["proc-log", "npm:3.0.0"],\ + ["semver", "npm:7.5.4"],\ + ["tar", "npm:6.2.0"],\ + ["which", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["node-gyp-build", [\ + ["npm:4.7.1", {\ + "packageLocation": "../../../.yarn/berry/cache/node-gyp-build-npm-4.7.1-8824d23d05-10c0.zip/node_modules/node-gyp-build/",\ + "packageDependencies": [\ + ["node-gyp-build", "npm:4.7.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["node-source-walk", [\ + ["npm:4.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/node-source-walk-npm-4.3.0-16523f4a14-10c0.zip/node_modules/node-source-walk/",\ + "packageDependencies": [\ + ["node-source-walk", "npm:4.3.0"],\ + ["@babel/parser", "npm:7.23.6"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/node-source-walk-npm-5.0.2-c417ba875a-10c0.zip/node_modules/node-source-walk/",\ + "packageDependencies": [\ + ["node-source-walk", "npm:5.0.2"],\ + ["@babel/parser", "npm:7.23.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["nofilter", [\ + ["npm:3.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/nofilter-npm-3.1.0-3c5ba47d92-10c0.zip/node_modules/nofilter/",\ + "packageDependencies": [\ + ["nofilter", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["nopt", [\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/nopt-npm-5.0.0-304b40fbfe-10c0.zip/node_modules/nopt/",\ + "packageDependencies": [\ + ["nopt", "npm:5.0.0"],\ + ["abbrev", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/nopt-npm-7.2.0-dd734b678d-10c0.zip/node_modules/nopt/",\ + "packageDependencies": [\ + ["nopt", "npm:7.2.0"],\ + ["abbrev", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["normalize-package-data", [\ + ["npm:2.5.0", {\ + "packageLocation": "../../../.yarn/berry/cache/normalize-package-data-npm-2.5.0-af0345deed-10c0.zip/node_modules/normalize-package-data/",\ + "packageDependencies": [\ + ["normalize-package-data", "npm:2.5.0"],\ + ["hosted-git-info", "npm:2.8.9"],\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"],\ + ["semver", "npm:5.7.2"],\ + ["validate-npm-package-license", "npm:3.0.4"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/normalize-package-data-npm-3.0.3-1a49056685-10c0.zip/node_modules/normalize-package-data/",\ + "packageDependencies": [\ + ["normalize-package-data", "npm:3.0.3"],\ + ["hosted-git-info", "npm:4.1.0"],\ + ["is-core-module", "npm:2.13.1"],\ + ["semver", "npm:7.5.4"],\ + ["validate-npm-package-license", "npm:3.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["normalize-path", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/normalize-path-npm-3.0.0-658ba7d77f-10c0.zip/node_modules/normalize-path/",\ + "packageDependencies": [\ + ["normalize-path", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["npm-run-path", [\ + ["npm:5.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/npm-run-path-npm-5.2.0-f449a9c258-10c0.zip/node_modules/npm-run-path/",\ + "packageDependencies": [\ + ["npm-run-path", "npm:5.2.0"],\ + ["path-key", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["npmlog", [\ + ["npm:5.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/npmlog-npm-5.0.1-366cab64a2-10c0.zip/node_modules/npmlog/",\ + "packageDependencies": [\ + ["npmlog", "npm:5.0.1"],\ + ["are-we-there-yet", "npm:2.0.0"],\ + ["console-control-strings", "npm:1.1.0"],\ + ["gauge", "npm:3.0.2"],\ + ["set-blocking", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["object-assign", [\ + ["npm:4.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/object-assign-npm-4.1.1-1004ad6dec-10c0.zip/node_modules/object-assign/",\ + "packageDependencies": [\ + ["object-assign", "npm:4.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["object-inspect", [\ + ["npm:1.13.1", {\ + "packageLocation": "../../../.yarn/berry/cache/object-inspect-npm-1.13.1-fd038a2f0a-10c0.zip/node_modules/object-inspect/",\ + "packageDependencies": [\ + ["object-inspect", "npm:1.13.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["object-keys", [\ + ["npm:1.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/object-keys-npm-1.1.1-1bf2f1be93-10c0.zip/node_modules/object-keys/",\ + "packageDependencies": [\ + ["object-keys", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["object.assign", [\ + ["npm:4.1.5", {\ + "packageLocation": "../../../.yarn/berry/cache/object.assign-npm-4.1.5-aa3b2260ba-10c0.zip/node_modules/object.assign/",\ + "packageDependencies": [\ + ["object.assign", "npm:4.1.5"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["has-symbols", "npm:1.0.3"],\ + ["object-keys", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["object.fromentries", [\ + ["npm:2.0.7", {\ + "packageLocation": "../../../.yarn/berry/cache/object.fromentries-npm-2.0.7-2e38392540-10c0.zip/node_modules/object.fromentries/",\ + "packageDependencies": [\ + ["object.fromentries", "npm:2.0.7"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["object.groupby", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/object.groupby-npm-1.0.1-fc268391fe-10c0.zip/node_modules/object.groupby/",\ + "packageDependencies": [\ + ["object.groupby", "npm:1.0.1"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"],\ + ["get-intrinsic", "npm:1.2.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["object.values", [\ + ["npm:1.1.7", {\ + "packageLocation": "../../../.yarn/berry/cache/object.values-npm-1.1.7-deae619f88-10c0.zip/node_modules/object.values/",\ + "packageDependencies": [\ + ["object.values", "npm:1.1.7"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["on-finished", [\ + ["npm:2.4.1", {\ + "packageLocation": "../../../.yarn/berry/cache/on-finished-npm-2.4.1-907af70f88-10c0.zip/node_modules/on-finished/",\ + "packageDependencies": [\ + ["on-finished", "npm:2.4.1"],\ + ["ee-first", "npm:1.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["once", [\ + ["npm:1.4.0", {\ + "packageLocation": "../../../.yarn/berry/cache/once-npm-1.4.0-ccf03ef07a-10c0.zip/node_modules/once/",\ + "packageDependencies": [\ + ["once", "npm:1.4.0"],\ + ["wrappy", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["onetime", [\ + ["npm:5.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/onetime-npm-5.1.2-3ed148fa42-10c0.zip/node_modules/onetime/",\ + "packageDependencies": [\ + ["onetime", "npm:5.1.2"],\ + ["mimic-fn", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/onetime-npm-6.0.0-4f3684e29a-10c0.zip/node_modules/onetime/",\ + "packageDependencies": [\ + ["onetime", "npm:6.0.0"],\ + ["mimic-fn", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["open", [\ + ["npm:10.0.2", {\ + "packageLocation": "./.yarn/unplugged/open-npm-10.0.2-f2872865de/node_modules/open/",\ + "packageDependencies": [\ + ["open", "npm:10.0.2"],\ + ["default-browser", "npm:5.2.1"],\ + ["define-lazy-prop", "npm:3.0.0"],\ + ["is-inside-container", "npm:1.0.0"],\ + ["is-wsl", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["open-cli", [\ + ["npm:8.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/open-cli-npm-8.0.0-5153900672-10c0.zip/node_modules/open-cli/",\ + "packageDependencies": [\ + ["open-cli", "npm:8.0.0"],\ + ["file-type", "npm:18.7.0"],\ + ["get-stdin", "npm:9.0.0"],\ + ["meow", "npm:12.1.1"],\ + ["open", "npm:10.0.2"],\ + ["tempy", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["optionator", [\ + ["npm:0.9.3", {\ + "packageLocation": "../../../.yarn/berry/cache/optionator-npm-0.9.3-56c3a4bf80-10c0.zip/node_modules/optionator/",\ + "packageDependencies": [\ + ["optionator", "npm:0.9.3"],\ + ["@aashutoshrathi/word-wrap", "npm:1.2.6"],\ + ["deep-is", "npm:0.1.4"],\ + ["fast-levenshtein", "npm:2.0.6"],\ + ["levn", "npm:0.4.1"],\ + ["prelude-ls", "npm:1.2.1"],\ + ["type-check", "npm:0.4.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ora", [\ + ["npm:5.4.1", {\ + "packageLocation": "../../../.yarn/berry/cache/ora-npm-5.4.1-4f0343adb7-10c0.zip/node_modules/ora/",\ + "packageDependencies": [\ + ["ora", "npm:5.4.1"],\ + ["bl", "npm:4.1.0"],\ + ["chalk", "npm:4.1.2"],\ + ["cli-cursor", "npm:3.1.0"],\ + ["cli-spinners", "npm:2.9.2"],\ + ["is-interactive", "npm:1.0.0"],\ + ["is-unicode-supported", "npm:0.1.0"],\ + ["log-symbols", "npm:4.1.0"],\ + ["strip-ansi", "npm:6.0.1"],\ + ["wcwidth", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["os-tmpdir", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/os-tmpdir-npm-1.0.2-e305b0689b-10c0.zip/node_modules/os-tmpdir/",\ + "packageDependencies": [\ + ["os-tmpdir", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["p-event", [\ + ["npm:5.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/p-event-npm-5.0.1-1f7dfbcfb3-10c0.zip/node_modules/p-event/",\ + "packageDependencies": [\ + ["p-event", "npm:5.0.1"],\ + ["p-timeout", "npm:5.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["p-filter", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/p-filter-npm-3.0.0-6c8ee98212-10c0.zip/node_modules/p-filter/",\ + "packageDependencies": [\ + ["p-filter", "npm:3.0.0"],\ + ["p-map", "npm:5.5.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["p-limit", [\ + ["npm:1.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/p-limit-npm-1.3.0-fdb471d864-10c0.zip/node_modules/p-limit/",\ + "packageDependencies": [\ + ["p-limit", "npm:1.3.0"],\ + ["p-try", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/p-limit-npm-2.3.0-94a0310039-10c0.zip/node_modules/p-limit/",\ + "packageDependencies": [\ + ["p-limit", "npm:2.3.0"],\ + ["p-try", "npm:2.2.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/p-limit-npm-3.1.0-05d2ede37f-10c0.zip/node_modules/p-limit/",\ + "packageDependencies": [\ + ["p-limit", "npm:3.1.0"],\ + ["yocto-queue", "npm:0.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["p-locate", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/p-locate-npm-2.0.0-3a2ee263dd-10c0.zip/node_modules/p-locate/",\ + "packageDependencies": [\ + ["p-locate", "npm:2.0.0"],\ + ["p-limit", "npm:1.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/p-locate-npm-3.0.0-74de74f952-10c0.zip/node_modules/p-locate/",\ + "packageDependencies": [\ + ["p-locate", "npm:3.0.0"],\ + ["p-limit", "npm:2.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/p-locate-npm-4.1.0-eec6872537-10c0.zip/node_modules/p-locate/",\ + "packageDependencies": [\ + ["p-locate", "npm:4.1.0"],\ + ["p-limit", "npm:2.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/p-locate-npm-5.0.0-92cc7c7a3e-10c0.zip/node_modules/p-locate/",\ + "packageDependencies": [\ + ["p-locate", "npm:5.0.0"],\ + ["p-limit", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["p-map", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/p-map-npm-4.0.0-4677ae07c7-10c0.zip/node_modules/p-map/",\ + "packageDependencies": [\ + ["p-map", "npm:4.0.0"],\ + ["aggregate-error", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.5.0", {\ + "packageLocation": "../../../.yarn/berry/cache/p-map-npm-5.5.0-9758eb14ee-10c0.zip/node_modules/p-map/",\ + "packageDependencies": [\ + ["p-map", "npm:5.5.0"],\ + ["aggregate-error", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/p-map-npm-6.0.0-9994e631f1-10c0.zip/node_modules/p-map/",\ + "packageDependencies": [\ + ["p-map", "npm:6.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["p-timeout", [\ + ["npm:5.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/p-timeout-npm-5.1.0-11ca554b60-10c0.zip/node_modules/p-timeout/",\ + "packageDependencies": [\ + ["p-timeout", "npm:5.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["p-try", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/p-try-npm-1.0.0-7373139e40-10c0.zip/node_modules/p-try/",\ + "packageDependencies": [\ + ["p-try", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/p-try-npm-2.2.0-e0390dbaf8-10c0.zip/node_modules/p-try/",\ + "packageDependencies": [\ + ["p-try", "npm:2.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["package-config", [\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/package-config-npm-5.0.0-55054b7db9-10c0.zip/node_modules/package-config/",\ + "packageDependencies": [\ + ["package-config", "npm:5.0.0"],\ + ["find-up-simple", "npm:1.0.0"],\ + ["load-json-file", "npm:7.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["parent-module", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/parent-module-npm-1.0.1-1fae11b095-10c0.zip/node_modules/parent-module/",\ + "packageDependencies": [\ + ["parent-module", "npm:1.0.1"],\ + ["callsites", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/parent-module-npm-2.0.0-8434b3cd79-10c0.zip/node_modules/parent-module/",\ + "packageDependencies": [\ + ["parent-module", "npm:2.0.0"],\ + ["callsites", "npm:3.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["parse-json", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/parse-json-npm-4.0.0-a6f7771010-10c0.zip/node_modules/parse-json/",\ + "packageDependencies": [\ + ["parse-json", "npm:4.0.0"],\ + ["error-ex", "npm:1.3.2"],\ + ["json-parse-better-errors", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/parse-json-npm-5.2.0-00a63b1199-10c0.zip/node_modules/parse-json/",\ + "packageDependencies": [\ + ["parse-json", "npm:5.2.0"],\ + ["@babel/code-frame", "npm:7.23.5"],\ + ["error-ex", "npm:1.3.2"],\ + ["json-parse-even-better-errors", "npm:2.3.1"],\ + ["lines-and-columns", "npm:1.2.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["parse-ms", [\ + ["npm:2.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/parse-ms-npm-2.1.0-de852c39bb-10c0.zip/node_modules/parse-ms/",\ + "packageDependencies": [\ + ["parse-ms", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/parse-ms-npm-3.0.0-3acf02c3f3-10c0.zip/node_modules/parse-ms/",\ + "packageDependencies": [\ + ["parse-ms", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["parse-passwd", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/parse-passwd-npm-1.0.0-ace6effa1d-10c0.zip/node_modules/parse-passwd/",\ + "packageDependencies": [\ + ["parse-passwd", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["parseurl", [\ + ["npm:1.3.3", {\ + "packageLocation": "../../../.yarn/berry/cache/parseurl-npm-1.3.3-1542397e00-10c0.zip/node_modules/parseurl/",\ + "packageDependencies": [\ + ["parseurl", "npm:1.3.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["path-exists", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/path-exists-npm-3.0.0-e80371aa68-10c0.zip/node_modules/path-exists/",\ + "packageDependencies": [\ + ["path-exists", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/path-exists-npm-4.0.0-e9e4f63eb0-10c0.zip/node_modules/path-exists/",\ + "packageDependencies": [\ + ["path-exists", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["path-is-absolute", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/path-is-absolute-npm-1.0.1-31bc695ffd-10c0.zip/node_modules/path-is-absolute/",\ + "packageDependencies": [\ + ["path-is-absolute", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["path-key", [\ + ["npm:3.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/path-key-npm-3.1.1-0e66ea8321-10c0.zip/node_modules/path-key/",\ + "packageDependencies": [\ + ["path-key", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/path-key-npm-4.0.0-2bce99f089-10c0.zip/node_modules/path-key/",\ + "packageDependencies": [\ + ["path-key", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["path-parse", [\ + ["npm:1.0.7", {\ + "packageLocation": "../../../.yarn/berry/cache/path-parse-npm-1.0.7-09564527b7-10c0.zip/node_modules/path-parse/",\ + "packageDependencies": [\ + ["path-parse", "npm:1.0.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["path-scurry", [\ + ["npm:1.10.1", {\ + "packageLocation": "../../../.yarn/berry/cache/path-scurry-npm-1.10.1-52bd946f2e-10c0.zip/node_modules/path-scurry/",\ + "packageDependencies": [\ + ["path-scurry", "npm:1.10.1"],\ + ["lru-cache", "npm:10.1.0"],\ + ["minipass", "npm:7.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["path-to-regexp", [\ + ["npm:0.1.7", {\ + "packageLocation": "../../../.yarn/berry/cache/path-to-regexp-npm-0.1.7-2605347373-10c0.zip/node_modules/path-to-regexp/",\ + "packageDependencies": [\ + ["path-to-regexp", "npm:0.1.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["path-type", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/path-type-npm-3.0.0-252361a0eb-10c0.zip/node_modules/path-type/",\ + "packageDependencies": [\ + ["path-type", "npm:3.0.0"],\ + ["pify", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/path-type-npm-4.0.0-10d47fc86a-10c0.zip/node_modules/path-type/",\ + "packageDependencies": [\ + ["path-type", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/path-type-npm-5.0.0-205dd6bae0-10c0.zip/node_modules/path-type/",\ + "packageDependencies": [\ + ["path-type", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["peek-readable", [\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/peek-readable-npm-5.0.0-c469f805e3-10c0.zip/node_modules/peek-readable/",\ + "packageDependencies": [\ + ["peek-readable", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["picocolors", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/picocolors-npm-1.0.0-d81e0b1927-10c0.zip/node_modules/picocolors/",\ + "packageDependencies": [\ + ["picocolors", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["picomatch", [\ + ["npm:2.3.1", {\ + "packageLocation": "../../../.yarn/berry/cache/picomatch-npm-2.3.1-c782cfd986-10c0.zip/node_modules/picomatch/",\ + "packageDependencies": [\ + ["picomatch", "npm:2.3.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/picomatch-npm-3.0.1-89bec5c025-10c0.zip/node_modules/picomatch/",\ + "packageDependencies": [\ + ["picomatch", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["pify", [\ + ["npm:2.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/pify-npm-2.3.0-8b63310934-10c0.zip/node_modules/pify/",\ + "packageDependencies": [\ + ["pify", "npm:2.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/pify-npm-3.0.0-679ee405c8-10c0.zip/node_modules/pify/",\ + "packageDependencies": [\ + ["pify", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["platform", [\ + ["npm:1.3.6", {\ + "packageLocation": "../../../.yarn/berry/cache/platform-npm-1.3.6-8c3cef9352-10c0.zip/node_modules/platform/",\ + "packageDependencies": [\ + ["platform", "npm:1.3.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["playwright", [\ + ["npm:1.40.1", {\ + "packageLocation": "../../../.yarn/berry/cache/playwright-npm-1.40.1-68ec3f34c0-10c0.zip/node_modules/playwright/",\ + "packageDependencies": [\ + ["playwright", "npm:1.40.1"],\ + ["fsevents", "patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1"],\ + ["playwright-core", "npm:1.40.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["playwright-core", [\ + ["npm:1.40.1", {\ + "packageLocation": "./.yarn/unplugged/playwright-core-npm-1.40.1-d5a17fae9e/node_modules/playwright-core/",\ + "packageDependencies": [\ + ["playwright-core", "npm:1.40.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["plur", [\ + ["npm:5.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/plur-npm-5.1.0-a8abe6df1b-10c0.zip/node_modules/plur/",\ + "packageDependencies": [\ + ["plur", "npm:5.1.0"],\ + ["irregular-plurals", "npm:3.5.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["pluralize", [\ + ["npm:8.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/pluralize-npm-8.0.0-f5f044ed52-10c0.zip/node_modules/pluralize/",\ + "packageDependencies": [\ + ["pluralize", "npm:8.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["postcss", [\ + ["npm:8.4.33", {\ + "packageLocation": "../../../.yarn/berry/cache/postcss-npm-8.4.33-6ba8157009-10c0.zip/node_modules/postcss/",\ + "packageDependencies": [\ + ["postcss", "npm:8.4.33"],\ + ["nanoid", "npm:3.3.7"],\ + ["picocolors", "npm:1.0.0"],\ + ["source-map-js", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["postcss-values-parser", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/postcss-values-parser-npm-2.0.1-b7d7dda30d-10c0.zip/node_modules/postcss-values-parser/",\ + "packageDependencies": [\ + ["postcss-values-parser", "npm:2.0.1"],\ + ["flatten", "npm:1.0.3"],\ + ["indexes-of", "npm:1.0.1"],\ + ["uniq", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/postcss-values-parser-npm-6.0.2-2b25ce0808-10c0.zip/node_modules/postcss-values-parser/",\ + "packageDependencies": [\ + ["postcss-values-parser", "npm:6.0.2"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:23a358a5ecd6ab3181f7fc99cb0bf6fd4a0734b6e0a2eae05968d1aee7473261ac87704c1b5ed9c912b3faaebe60dd7819a21b2732f3649be486506b370c4c7e#npm:6.0.2", {\ + "packageLocation": "./.yarn/__virtual__/postcss-values-parser-virtual-4b360ec254/4/.yarn/berry/cache/postcss-values-parser-npm-6.0.2-2b25ce0808-10c0.zip/node_modules/postcss-values-parser/",\ + "packageDependencies": [\ + ["postcss-values-parser", "virtual:23a358a5ecd6ab3181f7fc99cb0bf6fd4a0734b6e0a2eae05968d1aee7473261ac87704c1b5ed9c912b3faaebe60dd7819a21b2732f3649be486506b370c4c7e#npm:6.0.2"],\ + ["@types/postcss", null],\ + ["color-name", "npm:1.1.4"],\ + ["is-url-superb", "npm:4.0.0"],\ + ["postcss", "npm:8.4.33"],\ + ["quote-unquote", "npm:1.0.0"]\ + ],\ + "packagePeers": [\ + "@types/postcss",\ + "postcss"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["precinct", [\ + ["npm:8.3.1", {\ + "packageLocation": "../../../.yarn/berry/cache/precinct-npm-8.3.1-ee2c818667-10c0.zip/node_modules/precinct/",\ + "packageDependencies": [\ + ["precinct", "npm:8.3.1"],\ + ["commander", "npm:2.20.3"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["detective-amd", "npm:3.1.2"],\ + ["detective-cjs", "npm:3.1.3"],\ + ["detective-es6", "npm:2.2.2"],\ + ["detective-less", "npm:1.0.2"],\ + ["detective-postcss", "npm:4.0.0"],\ + ["detective-sass", "npm:3.0.2"],\ + ["detective-scss", "npm:2.0.2"],\ + ["detective-stylus", "npm:1.0.3"],\ + ["detective-typescript", "npm:7.0.2"],\ + ["module-definition", "npm:3.4.0"],\ + ["node-source-walk", "npm:4.3.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:9.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/precinct-npm-9.2.1-5348463d4e-10c0.zip/node_modules/precinct/",\ + "packageDependencies": [\ + ["precinct", "npm:9.2.1"],\ + ["@dependents/detective-less", "npm:3.0.2"],\ + ["commander", "npm:9.5.0"],\ + ["detective-amd", "npm:4.2.0"],\ + ["detective-cjs", "npm:4.1.0"],\ + ["detective-es6", "npm:3.0.1"],\ + ["detective-postcss", "npm:6.1.3"],\ + ["detective-sass", "npm:4.1.3"],\ + ["detective-scss", "npm:3.1.1"],\ + ["detective-stylus", "npm:3.0.0"],\ + ["detective-typescript", "npm:9.1.1"],\ + ["module-definition", "npm:4.1.0"],\ + ["node-source-walk", "npm:5.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["prelude-ls", [\ + ["npm:1.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/prelude-ls-npm-1.2.1-3e4d272a55-10c0.zip/node_modules/prelude-ls/",\ + "packageDependencies": [\ + ["prelude-ls", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["prettier", [\ + ["npm:3.1.1", {\ + "packageLocation": "./.yarn/unplugged/prettier-npm-3.1.1-072c31ec21/node_modules/prettier/",\ + "packageDependencies": [\ + ["prettier", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["pretty-ms", [\ + ["npm:7.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/pretty-ms-npm-7.0.1-d748cac064-10c0.zip/node_modules/pretty-ms/",\ + "packageDependencies": [\ + ["pretty-ms", "npm:7.0.1"],\ + ["parse-ms", "npm:2.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/pretty-ms-npm-8.0.0-7a40e0b54a-10c0.zip/node_modules/pretty-ms/",\ + "packageDependencies": [\ + ["pretty-ms", "npm:8.0.0"],\ + ["parse-ms", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["proc-log", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/proc-log-npm-3.0.0-a8c21c2f0f-10c0.zip/node_modules/proc-log/",\ + "packageDependencies": [\ + ["proc-log", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["process-nextick-args", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/process-nextick-args-npm-2.0.1-b8d7971609-10c0.zip/node_modules/process-nextick-args/",\ + "packageDependencies": [\ + ["process-nextick-args", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["promise-retry", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/promise-retry-npm-2.0.1-871f0b01b7-10c0.zip/node_modules/promise-retry/",\ + "packageDependencies": [\ + ["promise-retry", "npm:2.0.1"],\ + ["err-code", "npm:2.0.3"],\ + ["retry", "npm:0.12.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["proxy-addr", [\ + ["npm:2.0.7", {\ + "packageLocation": "../../../.yarn/berry/cache/proxy-addr-npm-2.0.7-dae6552872-10c0.zip/node_modules/proxy-addr/",\ + "packageDependencies": [\ + ["proxy-addr", "npm:2.0.7"],\ + ["forwarded", "npm:0.2.0"],\ + ["ipaddr.js", "npm:1.9.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["punycode", [\ + ["npm:2.3.1", {\ + "packageLocation": "../../../.yarn/berry/cache/punycode-npm-2.3.1-97543c420d-10c0.zip/node_modules/punycode/",\ + "packageDependencies": [\ + ["punycode", "npm:2.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["pure-rand", [\ + ["npm:6.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/pure-rand-npm-6.0.4-0821a97867-10c0.zip/node_modules/pure-rand/",\ + "packageDependencies": [\ + ["pure-rand", "npm:6.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["q", [\ + ["npm:1.5.1", {\ + "packageLocation": "../../../.yarn/berry/cache/q-npm-1.5.1-a28b3cfeaf-10c0.zip/node_modules/q/",\ + "packageDependencies": [\ + ["q", "npm:1.5.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["qs", [\ + ["npm:6.11.0", {\ + "packageLocation": "../../../.yarn/berry/cache/qs-npm-6.11.0-caf1bc9dea-10c0.zip/node_modules/qs/",\ + "packageDependencies": [\ + ["qs", "npm:6.11.0"],\ + ["side-channel", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["queue-microtask", [\ + ["npm:1.2.3", {\ + "packageLocation": "../../../.yarn/berry/cache/queue-microtask-npm-1.2.3-fcc98e4e2d-10c0.zip/node_modules/queue-microtask/",\ + "packageDependencies": [\ + ["queue-microtask", "npm:1.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["quick-lru", [\ + ["npm:4.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/quick-lru-npm-4.0.1-ef8aa17c9c-10c0.zip/node_modules/quick-lru/",\ + "packageDependencies": [\ + ["quick-lru", "npm:4.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["quote-unquote", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/quote-unquote-npm-1.0.0-5aa1091ab3-10c0.zip/node_modules/quote-unquote/",\ + "packageDependencies": [\ + ["quote-unquote", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["randombytes", [\ + ["npm:2.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/randombytes-npm-2.1.0-e3da76bccf-10c0.zip/node_modules/randombytes/",\ + "packageDependencies": [\ + ["randombytes", "npm:2.1.0"],\ + ["safe-buffer", "npm:5.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["range-parser", [\ + ["npm:1.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/range-parser-npm-1.2.1-1a470fa390-10c0.zip/node_modules/range-parser/",\ + "packageDependencies": [\ + ["range-parser", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["raw-body", [\ + ["npm:2.5.1", {\ + "packageLocation": "../../../.yarn/berry/cache/raw-body-npm-2.5.1-9dd1d9fff9-10c0.zip/node_modules/raw-body/",\ + "packageDependencies": [\ + ["raw-body", "npm:2.5.1"],\ + ["bytes", "npm:3.1.2"],\ + ["http-errors", "npm:2.0.0"],\ + ["iconv-lite", "npm:0.4.24"],\ + ["unpipe", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["rc", [\ + ["npm:1.2.8", {\ + "packageLocation": "../../../.yarn/berry/cache/rc-npm-1.2.8-d6768ac936-10c0.zip/node_modules/rc/",\ + "packageDependencies": [\ + ["rc", "npm:1.2.8"],\ + ["deep-extend", "npm:0.6.0"],\ + ["ini", "npm:1.3.8"],\ + ["minimist", "npm:1.2.8"],\ + ["strip-json-comments", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["read-pkg", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/read-pkg-npm-3.0.0-41471436cb-10c0.zip/node_modules/read-pkg/",\ + "packageDependencies": [\ + ["read-pkg", "npm:3.0.0"],\ + ["load-json-file", "npm:4.0.0"],\ + ["normalize-package-data", "npm:2.5.0"],\ + ["path-type", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/read-pkg-npm-5.2.0-50426bd8dc-10c0.zip/node_modules/read-pkg/",\ + "packageDependencies": [\ + ["read-pkg", "npm:5.2.0"],\ + ["@types/normalize-package-data", "npm:2.4.4"],\ + ["normalize-package-data", "npm:2.5.0"],\ + ["parse-json", "npm:5.2.0"],\ + ["type-fest", "npm:0.6.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["read-pkg-up", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/read-pkg-up-npm-3.0.0-3d7faf047f-10c0.zip/node_modules/read-pkg-up/",\ + "packageDependencies": [\ + ["read-pkg-up", "npm:3.0.0"],\ + ["find-up", "npm:2.1.0"],\ + ["read-pkg", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/read-pkg-up-npm-7.0.1-11895bed9a-10c0.zip/node_modules/read-pkg-up/",\ + "packageDependencies": [\ + ["read-pkg-up", "npm:7.0.1"],\ + ["find-up", "npm:4.1.0"],\ + ["read-pkg", "npm:5.2.0"],\ + ["type-fest", "npm:0.8.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["readable-stream", [\ + ["npm:2.3.8", {\ + "packageLocation": "../../../.yarn/berry/cache/readable-stream-npm-2.3.8-67a94c2cb1-10c0.zip/node_modules/readable-stream/",\ + "packageDependencies": [\ + ["readable-stream", "npm:2.3.8"],\ + ["core-util-is", "npm:1.0.3"],\ + ["inherits", "npm:2.0.4"],\ + ["isarray", "npm:1.0.0"],\ + ["process-nextick-args", "npm:2.0.1"],\ + ["safe-buffer", "npm:5.1.2"],\ + ["string_decoder", "npm:1.1.1"],\ + ["util-deprecate", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.6.2", {\ + "packageLocation": "../../../.yarn/berry/cache/readable-stream-npm-3.6.2-d2a6069158-10c0.zip/node_modules/readable-stream/",\ + "packageDependencies": [\ + ["readable-stream", "npm:3.6.2"],\ + ["inherits", "npm:2.0.4"],\ + ["string_decoder", "npm:1.3.0"],\ + ["util-deprecate", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["readable-web-to-node-stream", [\ + ["npm:3.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/readable-web-to-node-stream-npm-3.0.2-682f5de297-10c0.zip/node_modules/readable-web-to-node-stream/",\ + "packageDependencies": [\ + ["readable-web-to-node-stream", "npm:3.0.2"],\ + ["readable-stream", "npm:3.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["redent", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/redent-npm-3.0.0-31892f4906-10c0.zip/node_modules/redent/",\ + "packageDependencies": [\ + ["redent", "npm:3.0.0"],\ + ["indent-string", "npm:4.0.0"],\ + ["strip-indent", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["regexp.prototype.flags", [\ + ["npm:1.5.1", {\ + "packageLocation": "../../../.yarn/berry/cache/regexp.prototype.flags-npm-1.5.1-b8faeee306-10c0.zip/node_modules/regexp.prototype.flags/",\ + "packageDependencies": [\ + ["regexp.prototype.flags", "npm:1.5.1"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["set-function-name", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["repeat-string", [\ + ["npm:1.6.1", {\ + "packageLocation": "../../../.yarn/berry/cache/repeat-string-npm-1.6.1-bc8e388655-10c0.zip/node_modules/repeat-string/",\ + "packageDependencies": [\ + ["repeat-string", "npm:1.6.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["require-directory", [\ + ["npm:2.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/require-directory-npm-2.1.1-8608aee50b-10c0.zip/node_modules/require-directory/",\ + "packageDependencies": [\ + ["require-directory", "npm:2.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["require-from-string", [\ + ["npm:2.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/require-from-string-npm-2.0.2-8557e0db12-10c0.zip/node_modules/require-from-string/",\ + "packageDependencies": [\ + ["require-from-string", "npm:2.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["requirejs", [\ + ["npm:2.3.6", {\ + "packageLocation": "../../../.yarn/berry/cache/requirejs-npm-2.3.6-cda05b5f88-10c0.zip/node_modules/requirejs/",\ + "packageDependencies": [\ + ["requirejs", "npm:2.3.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["requirejs-config-file", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/requirejs-config-file-npm-4.0.0-e89c26c364-10c0.zip/node_modules/requirejs-config-file/",\ + "packageDependencies": [\ + ["requirejs-config-file", "npm:4.0.0"],\ + ["esprima", "npm:4.0.1"],\ + ["stringify-object", "npm:3.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["resolve", [\ + ["patch:resolve@npm%3A1.19.0#optional!builtin::version=1.19.0&hash=c3c19d", {\ + "packageLocation": "../../../.yarn/berry/cache/resolve-patch-0e96ddcab0-10c0.zip/node_modules/resolve/",\ + "packageDependencies": [\ + ["resolve", "patch:resolve@npm%3A1.19.0#optional!builtin::version=1.19.0&hash=c3c19d"],\ + ["is-core-module", "npm:2.13.1"],\ + ["path-parse", "npm:1.0.7"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d", {\ + "packageLocation": "../../../.yarn/berry/cache/resolve-patch-4254c24959-10c0.zip/node_modules/resolve/",\ + "packageDependencies": [\ + ["resolve", "patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d"],\ + ["is-core-module", "npm:2.13.1"],\ + ["path-parse", "npm:1.0.7"],\ + ["supports-preserve-symlinks-flag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["resolve-cwd", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/resolve-cwd-npm-3.0.0-e6f4e296bf-10c0.zip/node_modules/resolve-cwd/",\ + "packageDependencies": [\ + ["resolve-cwd", "npm:3.0.0"],\ + ["resolve-from", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["resolve-dependency-path", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/resolve-dependency-path-npm-2.0.0-81572580e9-10c0.zip/node_modules/resolve-dependency-path/",\ + "packageDependencies": [\ + ["resolve-dependency-path", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["resolve-dir", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/resolve-dir-npm-1.0.1-0a95903c18-10c0.zip/node_modules/resolve-dir/",\ + "packageDependencies": [\ + ["resolve-dir", "npm:1.0.1"],\ + ["expand-tilde", "npm:2.0.2"],\ + ["global-modules", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["resolve-from", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/resolve-from-npm-4.0.0-f758ec21bf-10c0.zip/node_modules/resolve-from/",\ + "packageDependencies": [\ + ["resolve-from", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/resolve-from-npm-5.0.0-15c9db4d33-10c0.zip/node_modules/resolve-from/",\ + "packageDependencies": [\ + ["resolve-from", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["resolve-global", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/resolve-global-npm-1.0.0-9097e8a466-10c0.zip/node_modules/resolve-global/",\ + "packageDependencies": [\ + ["resolve-global", "npm:1.0.0"],\ + ["global-dirs", "npm:0.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["restore-cursor", [\ + ["npm:3.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/restore-cursor-npm-3.1.0-52c5a4c98f-10c0.zip/node_modules/restore-cursor/",\ + "packageDependencies": [\ + ["restore-cursor", "npm:3.1.0"],\ + ["onetime", "npm:5.1.2"],\ + ["signal-exit", "npm:3.0.7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["retry", [\ + ["npm:0.12.0", {\ + "packageLocation": "../../../.yarn/berry/cache/retry-npm-0.12.0-72ac7fb4cc-10c0.zip/node_modules/retry/",\ + "packageDependencies": [\ + ["retry", "npm:0.12.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["reusify", [\ + ["npm:1.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/reusify-npm-1.0.4-95ac4aec11-10c0.zip/node_modules/reusify/",\ + "packageDependencies": [\ + ["reusify", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["rimraf", [\ + ["npm:3.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/rimraf-npm-3.0.2-2cb7dac69a-10c0.zip/node_modules/rimraf/",\ + "packageDependencies": [\ + ["rimraf", "npm:3.0.2"],\ + ["glob", "npm:7.2.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/rimraf-npm-5.0.5-19228633fd-10c0.zip/node_modules/rimraf/",\ + "packageDependencies": [\ + ["rimraf", "npm:5.0.5"],\ + ["glob", "npm:10.3.10"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["rollup", [\ + ["npm:4.9.3", {\ + "packageLocation": "../../../.yarn/berry/cache/rollup-npm-4.9.3-5cdf0ffefa-10c0.zip/node_modules/rollup/",\ + "packageDependencies": [\ + ["rollup", "npm:4.9.3"],\ + ["@rollup/rollup-android-arm-eabi", "npm:4.9.3"],\ + ["@rollup/rollup-android-arm64", "npm:4.9.3"],\ + ["@rollup/rollup-darwin-arm64", "npm:4.9.3"],\ + ["@rollup/rollup-darwin-x64", "npm:4.9.3"],\ + ["@rollup/rollup-linux-arm-gnueabihf", "npm:4.9.3"],\ + ["@rollup/rollup-linux-arm64-gnu", "npm:4.9.3"],\ + ["@rollup/rollup-linux-arm64-musl", "npm:4.9.3"],\ + ["@rollup/rollup-linux-riscv64-gnu", "npm:4.9.3"],\ + ["@rollup/rollup-linux-x64-gnu", "npm:4.9.3"],\ + ["@rollup/rollup-linux-x64-musl", "npm:4.9.3"],\ + ["@rollup/rollup-win32-arm64-msvc", "npm:4.9.3"],\ + ["@rollup/rollup-win32-ia32-msvc", "npm:4.9.3"],\ + ["@rollup/rollup-win32-x64-msvc", "npm:4.9.3"],\ + ["@types/estree", "npm:1.0.5"],\ + ["fsevents", "patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["run-applescript", [\ + ["npm:7.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/run-applescript-npm-7.0.0-b061c2c4fa-10c0.zip/node_modules/run-applescript/",\ + "packageDependencies": [\ + ["run-applescript", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["run-async", [\ + ["npm:2.4.1", {\ + "packageLocation": "../../../.yarn/berry/cache/run-async-npm-2.4.1-a94bb90861-10c0.zip/node_modules/run-async/",\ + "packageDependencies": [\ + ["run-async", "npm:2.4.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["run-parallel", [\ + ["npm:1.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/run-parallel-npm-1.2.0-3f47ff2034-10c0.zip/node_modules/run-parallel/",\ + "packageDependencies": [\ + ["run-parallel", "npm:1.2.0"],\ + ["queue-microtask", "npm:1.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["rxjs", [\ + ["npm:7.8.1", {\ + "packageLocation": "../../../.yarn/berry/cache/rxjs-npm-7.8.1-41c443a75b-10c0.zip/node_modules/rxjs/",\ + "packageDependencies": [\ + ["rxjs", "npm:7.8.1"],\ + ["tslib", "npm:2.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["safe-array-concat", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/safe-array-concat-npm-1.0.1-8a42907bbf-10c0.zip/node_modules/safe-array-concat/",\ + "packageDependencies": [\ + ["safe-array-concat", "npm:1.0.1"],\ + ["call-bind", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["has-symbols", "npm:1.0.3"],\ + ["isarray", "npm:2.0.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["safe-buffer", [\ + ["npm:5.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/safe-buffer-npm-5.1.2-c27fedf6c4-10c0.zip/node_modules/safe-buffer/",\ + "packageDependencies": [\ + ["safe-buffer", "npm:5.1.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/safe-buffer-npm-5.2.1-3481c8aa9b-10c0.zip/node_modules/safe-buffer/",\ + "packageDependencies": [\ + ["safe-buffer", "npm:5.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["safe-regex-test", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/safe-regex-test-npm-1.0.1-61b42bb704-10c0.zip/node_modules/safe-regex-test/",\ + "packageDependencies": [\ + ["safe-regex-test", "npm:1.0.1"],\ + ["call-bind", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["is-regex", "npm:1.1.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["safe-stable-stringify", [\ + ["npm:2.4.3", {\ + "packageLocation": "../../../.yarn/berry/cache/safe-stable-stringify-npm-2.4.3-d895741b40-10c0.zip/node_modules/safe-stable-stringify/",\ + "packageDependencies": [\ + ["safe-stable-stringify", "npm:2.4.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["safer-buffer", [\ + ["npm:2.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/safer-buffer-npm-2.1.2-8d5c0b705e-10c0.zip/node_modules/safer-buffer/",\ + "packageDependencies": [\ + ["safer-buffer", "npm:2.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["sass-lookup", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/sass-lookup-npm-3.0.0-c756430816-10c0.zip/node_modules/sass-lookup/",\ + "packageDependencies": [\ + ["sass-lookup", "npm:3.0.0"],\ + ["commander", "npm:2.20.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["secp256k1", [\ + ["npm:5.0.0", {\ + "packageLocation": "./.yarn/unplugged/secp256k1-npm-5.0.0-cbca9dfca0/node_modules/secp256k1/",\ + "packageDependencies": [\ + ["secp256k1", "npm:5.0.0"],\ + ["elliptic", "npm:6.5.4"],\ + ["node-addon-api", "npm:5.1.0"],\ + ["node-gyp", "npm:10.0.1"],\ + ["node-gyp-build", "npm:4.7.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["semver", [\ + ["npm:5.7.2", {\ + "packageLocation": "../../../.yarn/berry/cache/semver-npm-5.7.2-938ee91eaa-10c0.zip/node_modules/semver/",\ + "packageDependencies": [\ + ["semver", "npm:5.7.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:6.3.1", {\ + "packageLocation": "../../../.yarn/berry/cache/semver-npm-6.3.1-bcba31fdbe-10c0.zip/node_modules/semver/",\ + "packageDependencies": [\ + ["semver", "npm:6.3.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.5.4", {\ + "packageLocation": "../../../.yarn/berry/cache/semver-npm-7.5.4-c4ad957fcd-10c0.zip/node_modules/semver/",\ + "packageDependencies": [\ + ["semver", "npm:7.5.4"],\ + ["lru-cache", "npm:6.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["send", [\ + ["npm:0.18.0", {\ + "packageLocation": "../../../.yarn/berry/cache/send-npm-0.18.0-faadf6353f-10c0.zip/node_modules/send/",\ + "packageDependencies": [\ + ["send", "npm:0.18.0"],\ + ["debug", "virtual:3840e914156da5bf3a0152609f7597e38b893022314c08ba5b292edc820681760ec6c83dde1d34d78aa58a3f32c7d8c9d754f99860fa71136383ec1e2a87f57d#npm:2.6.9"],\ + ["depd", "npm:2.0.0"],\ + ["destroy", "npm:1.2.0"],\ + ["encodeurl", "npm:1.0.2"],\ + ["escape-html", "npm:1.0.3"],\ + ["etag", "npm:1.8.1"],\ + ["fresh", "npm:0.5.2"],\ + ["http-errors", "npm:2.0.0"],\ + ["mime", "npm:1.6.0"],\ + ["ms", "npm:2.1.3"],\ + ["on-finished", "npm:2.4.1"],\ + ["range-parser", "npm:1.2.1"],\ + ["statuses", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["serialize-error", [\ + ["npm:7.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/serialize-error-npm-7.0.1-c0b3f881a0-10c0.zip/node_modules/serialize-error/",\ + "packageDependencies": [\ + ["serialize-error", "npm:7.0.1"],\ + ["type-fest", "npm:0.13.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["serve-static", [\ + ["npm:1.15.0", {\ + "packageLocation": "../../../.yarn/berry/cache/serve-static-npm-1.15.0-86c81879f5-10c0.zip/node_modules/serve-static/",\ + "packageDependencies": [\ + ["serve-static", "npm:1.15.0"],\ + ["encodeurl", "npm:1.0.2"],\ + ["escape-html", "npm:1.0.3"],\ + ["parseurl", "npm:1.3.3"],\ + ["send", "npm:0.18.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["set-blocking", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/set-blocking-npm-2.0.0-49e2cffa24-10c0.zip/node_modules/set-blocking/",\ + "packageDependencies": [\ + ["set-blocking", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["set-function-length", [\ + ["npm:1.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/set-function-length-npm-1.1.1-d362bf8221-10c0.zip/node_modules/set-function-length/",\ + "packageDependencies": [\ + ["set-function-length", "npm:1.1.1"],\ + ["define-data-property", "npm:1.1.1"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["gopd", "npm:1.0.1"],\ + ["has-property-descriptors", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["set-function-name", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/set-function-name-npm-2.0.1-a9f970eea0-10c0.zip/node_modules/set-function-name/",\ + "packageDependencies": [\ + ["set-function-name", "npm:2.0.1"],\ + ["define-data-property", "npm:1.1.1"],\ + ["functions-have-names", "npm:1.2.3"],\ + ["has-property-descriptors", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["setprototypeof", [\ + ["npm:1.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/setprototypeof-npm-1.2.0-0fedbdcd3a-10c0.zip/node_modules/setprototypeof/",\ + "packageDependencies": [\ + ["setprototypeof", "npm:1.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["shebang-command", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/shebang-command-npm-2.0.0-eb2b01921d-10c0.zip/node_modules/shebang-command/",\ + "packageDependencies": [\ + ["shebang-command", "npm:2.0.0"],\ + ["shebang-regex", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["shebang-regex", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/shebang-regex-npm-3.0.0-899a0cd65e-10c0.zip/node_modules/shebang-regex/",\ + "packageDependencies": [\ + ["shebang-regex", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["shiki", [\ + ["npm:0.14.7", {\ + "packageLocation": "../../../.yarn/berry/cache/shiki-npm-0.14.7-a8806632f6-10c0.zip/node_modules/shiki/",\ + "packageDependencies": [\ + ["shiki", "npm:0.14.7"],\ + ["ansi-sequence-parser", "npm:1.1.1"],\ + ["jsonc-parser", "npm:3.2.0"],\ + ["vscode-oniguruma", "npm:1.7.0"],\ + ["vscode-textmate", "npm:8.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["side-channel", [\ + ["npm:1.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/side-channel-npm-1.0.4-e1f38b9e06-10c0.zip/node_modules/side-channel/",\ + "packageDependencies": [\ + ["side-channel", "npm:1.0.4"],\ + ["call-bind", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["object-inspect", "npm:1.13.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["signal-exit", [\ + ["npm:3.0.7", {\ + "packageLocation": "../../../.yarn/berry/cache/signal-exit-npm-3.0.7-bd270458a3-10c0.zip/node_modules/signal-exit/",\ + "packageDependencies": [\ + ["signal-exit", "npm:3.0.7"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/signal-exit-npm-4.1.0-61fb957687-10c0.zip/node_modules/signal-exit/",\ + "packageDependencies": [\ + ["signal-exit", "npm:4.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["slash", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/slash-npm-3.0.0-b87de2279a-10c0.zip/node_modules/slash/",\ + "packageDependencies": [\ + ["slash", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/slash-npm-4.0.0-ce4bbc4a80-10c0.zip/node_modules/slash/",\ + "packageDependencies": [\ + ["slash", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/slash-npm-5.1.0-718a84282e-10c0.zip/node_modules/slash/",\ + "packageDependencies": [\ + ["slash", "npm:5.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["slice-ansi", [\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/slice-ansi-npm-5.0.0-8cd4f226df-10c0.zip/node_modules/slice-ansi/",\ + "packageDependencies": [\ + ["slice-ansi", "npm:5.0.0"],\ + ["ansi-styles", "npm:6.2.1"],\ + ["is-fullwidth-code-point", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["smart-buffer", [\ + ["npm:4.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/smart-buffer-npm-4.2.0-5ac3f668bb-10c0.zip/node_modules/smart-buffer/",\ + "packageDependencies": [\ + ["smart-buffer", "npm:4.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["socks", [\ + ["npm:2.7.1", {\ + "packageLocation": "../../../.yarn/berry/cache/socks-npm-2.7.1-17f2b53052-10c0.zip/node_modules/socks/",\ + "packageDependencies": [\ + ["socks", "npm:2.7.1"],\ + ["ip", "npm:2.0.0"],\ + ["smart-buffer", "npm:4.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["socks-proxy-agent", [\ + ["npm:8.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/socks-proxy-agent-npm-8.0.2-df165543cf-10c0.zip/node_modules/socks-proxy-agent/",\ + "packageDependencies": [\ + ["socks-proxy-agent", "npm:8.0.2"],\ + ["agent-base", "npm:7.1.0"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"],\ + ["socks", "npm:2.7.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["source-map", [\ + ["npm:0.6.1", {\ + "packageLocation": "../../../.yarn/berry/cache/source-map-npm-0.6.1-1a3621db16-10c0.zip/node_modules/source-map/",\ + "packageDependencies": [\ + ["source-map", "npm:0.6.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["source-map-js", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/source-map-js-npm-1.0.2-ee4f9f9b30-10c0.zip/node_modules/source-map-js/",\ + "packageDependencies": [\ + ["source-map-js", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["source-map-support", [\ + ["npm:0.5.21", {\ + "packageLocation": "../../../.yarn/berry/cache/source-map-support-npm-0.5.21-09ca99e250-10c0.zip/node_modules/source-map-support/",\ + "packageDependencies": [\ + ["source-map-support", "npm:0.5.21"],\ + ["buffer-from", "npm:1.1.2"],\ + ["source-map", "npm:0.6.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["spdx-correct", [\ + ["npm:3.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/spdx-correct-npm-3.2.0-ffae008484-10c0.zip/node_modules/spdx-correct/",\ + "packageDependencies": [\ + ["spdx-correct", "npm:3.2.0"],\ + ["spdx-expression-parse", "npm:3.0.1"],\ + ["spdx-license-ids", "npm:3.0.16"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["spdx-exceptions", [\ + ["npm:2.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/spdx-exceptions-npm-2.3.0-2b68dad75a-10c0.zip/node_modules/spdx-exceptions/",\ + "packageDependencies": [\ + ["spdx-exceptions", "npm:2.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["spdx-expression-parse", [\ + ["npm:3.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/spdx-expression-parse-npm-3.0.1-b718cbb35a-10c0.zip/node_modules/spdx-expression-parse/",\ + "packageDependencies": [\ + ["spdx-expression-parse", "npm:3.0.1"],\ + ["spdx-exceptions", "npm:2.3.0"],\ + ["spdx-license-ids", "npm:3.0.16"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["spdx-license-ids", [\ + ["npm:3.0.16", {\ + "packageLocation": "../../../.yarn/berry/cache/spdx-license-ids-npm-3.0.16-354ed86dd0-10c0.zip/node_modules/spdx-license-ids/",\ + "packageDependencies": [\ + ["spdx-license-ids", "npm:3.0.16"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["split", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/split-npm-1.0.1-88871d88a2-10c0.zip/node_modules/split/",\ + "packageDependencies": [\ + ["split", "npm:1.0.1"],\ + ["through", "npm:2.3.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["split2", [\ + ["npm:3.2.2", {\ + "packageLocation": "../../../.yarn/berry/cache/split2-npm-3.2.2-4ccd21b4f7-10c0.zip/node_modules/split2/",\ + "packageDependencies": [\ + ["split2", "npm:3.2.2"],\ + ["readable-stream", "npm:3.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["sprintf-js", [\ + ["npm:1.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/sprintf-js-npm-1.0.3-73f0a322fa-10c0.zip/node_modules/sprintf-js/",\ + "packageDependencies": [\ + ["sprintf-js", "npm:1.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ssri", [\ + ["npm:10.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/ssri-npm-10.0.5-1a7557d04d-10c0.zip/node_modules/ssri/",\ + "packageDependencies": [\ + ["ssri", "npm:10.0.5"],\ + ["minipass", "npm:7.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["stack-utils", [\ + ["npm:0.4.0", {\ + "packageLocation": "../../../.yarn/berry/cache/stack-utils-npm-0.4.0-99cc707eb9-10c0.zip/node_modules/stack-utils/",\ + "packageDependencies": [\ + ["stack-utils", "npm:0.4.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.6", {\ + "packageLocation": "../../../.yarn/berry/cache/stack-utils-npm-2.0.6-2be1099696-10c0.zip/node_modules/stack-utils/",\ + "packageDependencies": [\ + ["stack-utils", "npm:2.0.6"],\ + ["escape-string-regexp", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["standard-version", [\ + ["npm:9.5.0", {\ + "packageLocation": "../../../.yarn/berry/cache/standard-version-npm-9.5.0-5662d02730-10c0.zip/node_modules/standard-version/",\ + "packageDependencies": [\ + ["standard-version", "npm:9.5.0"],\ + ["chalk", "npm:2.4.2"],\ + ["conventional-changelog", "npm:3.1.25"],\ + ["conventional-changelog-config-spec", "npm:2.1.0"],\ + ["conventional-changelog-conventionalcommits", "npm:4.6.3"],\ + ["conventional-recommended-bump", "npm:6.1.0"],\ + ["detect-indent", "npm:6.1.0"],\ + ["detect-newline", "npm:3.1.0"],\ + ["dotgitignore", "npm:2.1.0"],\ + ["figures", "npm:3.2.0"],\ + ["find-up", "npm:5.0.0"],\ + ["git-semver-tags", "npm:4.1.1"],\ + ["semver", "npm:7.5.4"],\ + ["stringify-package", "npm:1.0.1"],\ + ["yargs", "npm:16.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["statuses", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/statuses-npm-2.0.1-81d2b97fee-10c0.zip/node_modules/statuses/",\ + "packageDependencies": [\ + ["statuses", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["stream-to-array", [\ + ["npm:2.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/stream-to-array-npm-2.3.0-eaa32c31d8-10c0.zip/node_modules/stream-to-array/",\ + "packageDependencies": [\ + ["stream-to-array", "npm:2.3.0"],\ + ["any-promise", "npm:1.3.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["string-argv", [\ + ["npm:0.3.2", {\ + "packageLocation": "../../../.yarn/berry/cache/string-argv-npm-0.3.2-6e057a88f1-10c0.zip/node_modules/string-argv/",\ + "packageDependencies": [\ + ["string-argv", "npm:0.3.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["string-width", [\ + ["npm:4.2.3", {\ + "packageLocation": "../../../.yarn/berry/cache/string-width-npm-4.2.3-2c27177bae-10c0.zip/node_modules/string-width/",\ + "packageDependencies": [\ + ["string-width", "npm:4.2.3"],\ + ["emoji-regex", "npm:8.0.0"],\ + ["is-fullwidth-code-point", "npm:3.0.0"],\ + ["strip-ansi", "npm:6.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/string-width-npm-5.1.2-bf60531341-10c0.zip/node_modules/string-width/",\ + "packageDependencies": [\ + ["string-width", "npm:5.1.2"],\ + ["eastasianwidth", "npm:0.2.0"],\ + ["emoji-regex", "npm:9.2.2"],\ + ["strip-ansi", "npm:7.1.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/string-width-npm-7.0.0-1bcc0b3bce-10c0.zip/node_modules/string-width/",\ + "packageDependencies": [\ + ["string-width", "npm:7.0.0"],\ + ["emoji-regex", "npm:10.3.0"],\ + ["get-east-asian-width", "npm:1.2.0"],\ + ["strip-ansi", "npm:7.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["string.prototype.trim", [\ + ["npm:1.2.8", {\ + "packageLocation": "../../../.yarn/berry/cache/string.prototype.trim-npm-1.2.8-7ed4517ce8-10c0.zip/node_modules/string.prototype.trim/",\ + "packageDependencies": [\ + ["string.prototype.trim", "npm:1.2.8"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["string.prototype.trimend", [\ + ["npm:1.0.7", {\ + "packageLocation": "../../../.yarn/berry/cache/string.prototype.trimend-npm-1.0.7-159b9dcfbc-10c0.zip/node_modules/string.prototype.trimend/",\ + "packageDependencies": [\ + ["string.prototype.trimend", "npm:1.0.7"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["string.prototype.trimstart", [\ + ["npm:1.0.7", {\ + "packageLocation": "../../../.yarn/berry/cache/string.prototype.trimstart-npm-1.0.7-ae2f803b78-10c0.zip/node_modules/string.prototype.trimstart/",\ + "packageDependencies": [\ + ["string.prototype.trimstart", "npm:1.0.7"],\ + ["call-bind", "npm:1.0.5"],\ + ["define-properties", "npm:1.2.1"],\ + ["es-abstract", "npm:1.22.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["string_decoder", [\ + ["npm:1.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/string_decoder-npm-1.1.1-e46a6c1353-10c0.zip/node_modules/string_decoder/",\ + "packageDependencies": [\ + ["string_decoder", "npm:1.1.1"],\ + ["safe-buffer", "npm:5.1.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:1.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/string_decoder-npm-1.3.0-2422117fd0-10c0.zip/node_modules/string_decoder/",\ + "packageDependencies": [\ + ["string_decoder", "npm:1.3.0"],\ + ["safe-buffer", "npm:5.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["stringify-object", [\ + ["npm:3.3.0", {\ + "packageLocation": "../../../.yarn/berry/cache/stringify-object-npm-3.3.0-3e6784f7df-10c0.zip/node_modules/stringify-object/",\ + "packageDependencies": [\ + ["stringify-object", "npm:3.3.0"],\ + ["get-own-enumerable-property-symbols", "npm:3.0.2"],\ + ["is-obj", "npm:1.0.1"],\ + ["is-regexp", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["stringify-package", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/stringify-package-npm-1.0.1-dfc7255692-10c0.zip/node_modules/stringify-package/",\ + "packageDependencies": [\ + ["stringify-package", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["strip-ansi", [\ + ["npm:6.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/strip-ansi-npm-6.0.1-caddc7cb40-10c0.zip/node_modules/strip-ansi/",\ + "packageDependencies": [\ + ["strip-ansi", "npm:6.0.1"],\ + ["ansi-regex", "npm:5.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/strip-ansi-npm-7.1.0-7453b80b79-10c0.zip/node_modules/strip-ansi/",\ + "packageDependencies": [\ + ["strip-ansi", "npm:7.1.0"],\ + ["ansi-regex", "npm:6.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["strip-bom", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/strip-bom-npm-3.0.0-71e8f81ff9-10c0.zip/node_modules/strip-bom/",\ + "packageDependencies": [\ + ["strip-bom", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/strip-bom-npm-4.0.0-97d367a64d-10c0.zip/node_modules/strip-bom/",\ + "packageDependencies": [\ + ["strip-bom", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["strip-final-newline", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/strip-final-newline-npm-3.0.0-7972cbec8b-10c0.zip/node_modules/strip-final-newline/",\ + "packageDependencies": [\ + ["strip-final-newline", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["strip-indent", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/strip-indent-npm-3.0.0-519e75a28d-10c0.zip/node_modules/strip-indent/",\ + "packageDependencies": [\ + ["strip-indent", "npm:3.0.0"],\ + ["min-indent", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["strip-json-comments", [\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/strip-json-comments-npm-2.0.1-e7883b2d04-10c0.zip/node_modules/strip-json-comments/",\ + "packageDependencies": [\ + ["strip-json-comments", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:3.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/strip-json-comments-npm-3.1.1-dcb2324823-10c0.zip/node_modules/strip-json-comments/",\ + "packageDependencies": [\ + ["strip-json-comments", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["strtok3", [\ + ["npm:7.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/strtok3-npm-7.0.0-bb1edd9ba5-10c0.zip/node_modules/strtok3/",\ + "packageDependencies": [\ + ["strtok3", "npm:7.0.0"],\ + ["@tokenizer/token", "npm:0.3.0"],\ + ["peek-readable", "npm:5.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["stylus-lookup", [\ + ["npm:3.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/stylus-lookup-npm-3.0.2-fed0f86b51-10c0.zip/node_modules/stylus-lookup/",\ + "packageDependencies": [\ + ["stylus-lookup", "npm:3.0.2"],\ + ["commander", "npm:2.20.3"],\ + ["debug", "virtual:4b12ba5111caf7e8338099bdbc7cb046a9f8e079a44e74d0c03dca469876e3071ebbe671c5e90ae6b78ae33e22c205fa5ed32169a4aabd1404b13c56d09986e1#npm:4.3.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["supertap", [\ + ["npm:3.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/supertap-npm-3.0.1-d7c04bcbf0-10c0.zip/node_modules/supertap/",\ + "packageDependencies": [\ + ["supertap", "npm:3.0.1"],\ + ["indent-string", "npm:5.0.0"],\ + ["js-yaml", "npm:3.14.1"],\ + ["serialize-error", "npm:7.0.1"],\ + ["strip-ansi", "npm:7.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["supports-color", [\ + ["npm:5.5.0", {\ + "packageLocation": "../../../.yarn/berry/cache/supports-color-npm-5.5.0-183ac537bc-10c0.zip/node_modules/supports-color/",\ + "packageDependencies": [\ + ["supports-color", "npm:5.5.0"],\ + ["has-flag", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:7.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/supports-color-npm-7.2.0-606bfcf7da-10c0.zip/node_modules/supports-color/",\ + "packageDependencies": [\ + ["supports-color", "npm:7.2.0"],\ + ["has-flag", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["supports-preserve-symlinks-flag", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/supports-preserve-symlinks-flag-npm-1.0.0-f17c4d0028-10c0.zip/node_modules/supports-preserve-symlinks-flag/",\ + "packageDependencies": [\ + ["supports-preserve-symlinks-flag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["tapable", [\ + ["npm:2.2.1", {\ + "packageLocation": "../../../.yarn/berry/cache/tapable-npm-2.2.1-8cf5ff3039-10c0.zip/node_modules/tapable/",\ + "packageDependencies": [\ + ["tapable", "npm:2.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["tar", [\ + ["npm:6.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/tar-npm-6.2.0-3eb25205a7-10c0.zip/node_modules/tar/",\ + "packageDependencies": [\ + ["tar", "npm:6.2.0"],\ + ["chownr", "npm:2.0.0"],\ + ["fs-minipass", "npm:2.1.0"],\ + ["minipass", "npm:5.0.0"],\ + ["minizlib", "npm:2.1.2"],\ + ["mkdirp", "npm:1.0.4"],\ + ["yallist", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["temp-dir", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/temp-dir-npm-3.0.0-70414c7a63-10c0.zip/node_modules/temp-dir/",\ + "packageDependencies": [\ + ["temp-dir", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["tempy", [\ + ["npm:3.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/tempy-npm-3.1.0-53fa9712c8-10c0.zip/node_modules/tempy/",\ + "packageDependencies": [\ + ["tempy", "npm:3.1.0"],\ + ["is-stream", "npm:3.0.0"],\ + ["temp-dir", "npm:3.0.0"],\ + ["type-fest", "npm:2.19.0"],\ + ["unique-string", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["test-exclude", [\ + ["npm:6.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/test-exclude-npm-6.0.0-3fb03d69df-10c0.zip/node_modules/test-exclude/",\ + "packageDependencies": [\ + ["test-exclude", "npm:6.0.0"],\ + ["@istanbuljs/schema", "npm:0.1.3"],\ + ["glob", "npm:7.2.3"],\ + ["minimatch", "npm:3.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["text-extensions", [\ + ["npm:1.9.0", {\ + "packageLocation": "../../../.yarn/berry/cache/text-extensions-npm-1.9.0-87655d768f-10c0.zip/node_modules/text-extensions/",\ + "packageDependencies": [\ + ["text-extensions", "npm:1.9.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["text-table", [\ + ["npm:0.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/text-table-npm-0.2.0-d92a778b59-10c0.zip/node_modules/text-table/",\ + "packageDependencies": [\ + ["text-table", "npm:0.2.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["through", [\ + ["npm:2.3.8", {\ + "packageLocation": "../../../.yarn/berry/cache/through-npm-2.3.8-df5f72a16e-10c0.zip/node_modules/through/",\ + "packageDependencies": [\ + ["through", "npm:2.3.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["through2", [\ + ["npm:2.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/through2-npm-2.0.5-77d90f13cd-10c0.zip/node_modules/through2/",\ + "packageDependencies": [\ + ["through2", "npm:2.0.5"],\ + ["readable-stream", "npm:2.3.8"],\ + ["xtend", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/through2-npm-4.0.2-da7b2da443-10c0.zip/node_modules/through2/",\ + "packageDependencies": [\ + ["through2", "npm:4.0.2"],\ + ["readable-stream", "npm:3.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["time-zone", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/time-zone-npm-1.0.0-0522e3467f-10c0.zip/node_modules/time-zone/",\ + "packageDependencies": [\ + ["time-zone", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["tmp", [\ + ["npm:0.0.33", {\ + "packageLocation": "../../../.yarn/berry/cache/tmp-npm-0.0.33-bcbf65df2a-10c0.zip/node_modules/tmp/",\ + "packageDependencies": [\ + ["tmp", "npm:0.0.33"],\ + ["os-tmpdir", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["to-fast-properties", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/to-fast-properties-npm-2.0.0-0dc60cc481-10c0.zip/node_modules/to-fast-properties/",\ + "packageDependencies": [\ + ["to-fast-properties", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["to-regex-range", [\ + ["npm:5.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/to-regex-range-npm-5.0.1-f1e8263b00-10c0.zip/node_modules/to-regex-range/",\ + "packageDependencies": [\ + ["to-regex-range", "npm:5.0.1"],\ + ["is-number", "npm:7.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["toidentifier", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/toidentifier-npm-1.0.1-f759712599-10c0.zip/node_modules/toidentifier/",\ + "packageDependencies": [\ + ["toidentifier", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["token-types", [\ + ["npm:5.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/token-types-npm-5.0.1-a86fdb8b12-10c0.zip/node_modules/token-types/",\ + "packageDependencies": [\ + ["token-types", "npm:5.0.1"],\ + ["@tokenizer/token", "npm:0.3.0"],\ + ["ieee754", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["tr46", [\ + ["npm:0.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/tr46-npm-0.0.3-de53018915-10c0.zip/node_modules/tr46/",\ + "packageDependencies": [\ + ["tr46", "npm:0.0.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["trim-newlines", [\ + ["npm:3.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/trim-newlines-npm-3.0.1-22f1f216de-10c0.zip/node_modules/trim-newlines/",\ + "packageDependencies": [\ + ["trim-newlines", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ts-api-utils", [\ + ["npm:1.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/ts-api-utils-npm-1.0.3-992f360d9b-10c0.zip/node_modules/ts-api-utils/",\ + "packageDependencies": [\ + ["ts-api-utils", "npm:1.0.3"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:1.0.3", {\ + "packageLocation": "./.yarn/__virtual__/ts-api-utils-virtual-041da0d5de/4/.yarn/berry/cache/ts-api-utils-npm-1.0.3-992f360d9b-10c0.zip/node_modules/ts-api-utils/",\ + "packageDependencies": [\ + ["ts-api-utils", "virtual:0c80d6cec1950204664266603588af918fb05a5ef5842a6b010ae6734f59b484f7638a203b0dd52e3d58b49a186aef919870ade9b3e057260f6dc0042d33b19f#npm:1.0.3"],\ + ["@types/typescript", null],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:45f7b3e074718861e9d412f1461999483dee0f73f35f1e6f12ded75c3c5b62cd2bcff5f531367f4b6732c1e89724ee8d5efc7a3515fd1f1d59d8f1ab11edf9ed#npm:1.0.3", {\ + "packageLocation": "./.yarn/__virtual__/ts-api-utils-virtual-4242d16f1c/4/.yarn/berry/cache/ts-api-utils-npm-1.0.3-992f360d9b-10c0.zip/node_modules/ts-api-utils/",\ + "packageDependencies": [\ + ["ts-api-utils", "virtual:45f7b3e074718861e9d412f1461999483dee0f73f35f1e6f12ded75c3c5b62cd2bcff5f531367f4b6732c1e89724ee8d5efc7a3515fd1f1d59d8f1ab11edf9ed#npm:1.0.3"],\ + ["@types/typescript", null],\ + ["typescript", null]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ts-graphviz", [\ + ["npm:1.8.1", {\ + "packageLocation": "../../../.yarn/berry/cache/ts-graphviz-npm-1.8.1-5af04a2735-10c0.zip/node_modules/ts-graphviz/",\ + "packageDependencies": [\ + ["ts-graphviz", "npm:1.8.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["ts-json-schema-generator", [\ + ["npm:1.5.0", {\ + "packageLocation": "../../../.yarn/berry/cache/ts-json-schema-generator-npm-1.5.0-6a03d41094-10c0.zip/node_modules/ts-json-schema-generator/",\ + "packageDependencies": [\ + ["ts-json-schema-generator", "npm:1.5.0"],\ + ["@types/json-schema", "npm:7.0.15"],\ + ["commander", "npm:11.1.0"],\ + ["glob", "npm:8.1.0"],\ + ["json5", "npm:2.2.3"],\ + ["normalize-path", "npm:3.0.0"],\ + ["safe-stable-stringify", "npm:2.4.3"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["tsconfig-paths", [\ + ["npm:3.15.0", {\ + "packageLocation": "../../../.yarn/berry/cache/tsconfig-paths-npm-3.15.0-ff68930e0e-10c0.zip/node_modules/tsconfig-paths/",\ + "packageDependencies": [\ + ["tsconfig-paths", "npm:3.15.0"],\ + ["@types/json5", "npm:0.0.29"],\ + ["json5", "npm:1.0.2"],\ + ["minimist", "npm:1.2.8"],\ + ["strip-bom", "npm:3.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["tslib", [\ + ["npm:1.14.1", {\ + "packageLocation": "../../../.yarn/berry/cache/tslib-npm-1.14.1-102499115e-10c0.zip/node_modules/tslib/",\ + "packageDependencies": [\ + ["tslib", "npm:1.14.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.6.2", {\ + "packageLocation": "../../../.yarn/berry/cache/tslib-npm-2.6.2-4fc8c068d9-10c0.zip/node_modules/tslib/",\ + "packageDependencies": [\ + ["tslib", "npm:2.6.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["tsutils", [\ + ["npm:3.21.0", {\ + "packageLocation": "../../../.yarn/berry/cache/tsutils-npm-3.21.0-347e6636c5-10c0.zip/node_modules/tsutils/",\ + "packageDependencies": [\ + ["tsutils", "npm:3.21.0"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:40b7528656205285b7eb6c8a2b798d03c881f5fc5f312b0ac13d2de58079f2f1fefdc278b4177d7b19c2e1c30a289310b9c005566bdd606e08fd4846ffc54362#npm:3.21.0", {\ + "packageLocation": "./.yarn/__virtual__/tsutils-virtual-16a67883a9/4/.yarn/berry/cache/tsutils-npm-3.21.0-347e6636c5-10c0.zip/node_modules/tsutils/",\ + "packageDependencies": [\ + ["tsutils", "virtual:40b7528656205285b7eb6c8a2b798d03c881f5fc5f312b0ac13d2de58079f2f1fefdc278b4177d7b19c2e1c30a289310b9c005566bdd606e08fd4846ffc54362#npm:3.21.0"],\ + ["@types/typescript", null],\ + ["tslib", "npm:1.14.1"],\ + ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }],\ + ["virtual:d25122643b329d297f1158bdbbeb452d30b524ea62c42db7395547701b59d0cea14496f7d76f91f55bbcf1d1440cf89bd89ae4b0cd0a6ebd7928883f9bf0dba3#npm:3.21.0", {\ + "packageLocation": "./.yarn/__virtual__/tsutils-virtual-8ac2d3a52a/4/.yarn/berry/cache/tsutils-npm-3.21.0-347e6636c5-10c0.zip/node_modules/tsutils/",\ + "packageDependencies": [\ + ["tsutils", "virtual:d25122643b329d297f1158bdbbeb452d30b524ea62c42db7395547701b59d0cea14496f7d76f91f55bbcf1d1440cf89bd89ae4b0cd0a6ebd7928883f9bf0dba3#npm:3.21.0"],\ + ["@types/typescript", null],\ + ["tslib", "npm:1.14.1"],\ + ["typescript", "patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["type-check", [\ + ["npm:0.4.0", {\ + "packageLocation": "../../../.yarn/berry/cache/type-check-npm-0.4.0-60565800ce-10c0.zip/node_modules/type-check/",\ + "packageDependencies": [\ + ["type-check", "npm:0.4.0"],\ + ["prelude-ls", "npm:1.2.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["type-fest", [\ + ["npm:0.13.1", {\ + "packageLocation": "../../../.yarn/berry/cache/type-fest-npm-0.13.1-7f4486b973-10c0.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:0.13.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:0.18.1", {\ + "packageLocation": "../../../.yarn/berry/cache/type-fest-npm-0.18.1-47b079775d-10c0.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:0.18.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:0.20.2", {\ + "packageLocation": "../../../.yarn/berry/cache/type-fest-npm-0.20.2-b36432617f-10c0.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:0.20.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:0.21.3", {\ + "packageLocation": "../../../.yarn/berry/cache/type-fest-npm-0.21.3-5ff2a9c6fd-10c0.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:0.21.3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:0.6.0", {\ + "packageLocation": "../../../.yarn/berry/cache/type-fest-npm-0.6.0-76b229965b-10c0.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:0.6.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:0.8.1", {\ + "packageLocation": "../../../.yarn/berry/cache/type-fest-npm-0.8.1-351ad028fe-10c0.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:0.8.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:1.4.0", {\ + "packageLocation": "../../../.yarn/berry/cache/type-fest-npm-1.4.0-7dd848962a-10c0.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:1.4.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.19.0", {\ + "packageLocation": "../../../.yarn/berry/cache/type-fest-npm-2.19.0-918b953248-10c0.zip/node_modules/type-fest/",\ + "packageDependencies": [\ + ["type-fest", "npm:2.19.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["type-is", [\ + ["npm:1.6.18", {\ + "packageLocation": "../../../.yarn/berry/cache/type-is-npm-1.6.18-6dee4d4961-10c0.zip/node_modules/type-is/",\ + "packageDependencies": [\ + ["type-is", "npm:1.6.18"],\ + ["media-typer", "npm:0.3.0"],\ + ["mime-types", "npm:2.1.35"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typed-array-buffer", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/typed-array-buffer-npm-1.0.0-95cb610310-10c0.zip/node_modules/typed-array-buffer/",\ + "packageDependencies": [\ + ["typed-array-buffer", "npm:1.0.0"],\ + ["call-bind", "npm:1.0.5"],\ + ["get-intrinsic", "npm:1.2.2"],\ + ["is-typed-array", "npm:1.1.12"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typed-array-byte-length", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/typed-array-byte-length-npm-1.0.0-94d79975ca-10c0.zip/node_modules/typed-array-byte-length/",\ + "packageDependencies": [\ + ["typed-array-byte-length", "npm:1.0.0"],\ + ["call-bind", "npm:1.0.5"],\ + ["for-each", "npm:0.3.3"],\ + ["has-proto", "npm:1.0.1"],\ + ["is-typed-array", "npm:1.1.12"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typed-array-byte-offset", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/typed-array-byte-offset-npm-1.0.0-8cbb911cf5-10c0.zip/node_modules/typed-array-byte-offset/",\ + "packageDependencies": [\ + ["typed-array-byte-offset", "npm:1.0.0"],\ + ["available-typed-arrays", "npm:1.0.5"],\ + ["call-bind", "npm:1.0.5"],\ + ["for-each", "npm:0.3.3"],\ + ["has-proto", "npm:1.0.1"],\ + ["is-typed-array", "npm:1.1.12"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typed-array-length", [\ + ["npm:1.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/typed-array-length-npm-1.0.4-92771b81fc-10c0.zip/node_modules/typed-array-length/",\ + "packageDependencies": [\ + ["typed-array-length", "npm:1.0.4"],\ + ["call-bind", "npm:1.0.5"],\ + ["for-each", "npm:0.3.3"],\ + ["is-typed-array", "npm:1.1.12"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typedarray", [\ + ["npm:0.0.6", {\ + "packageLocation": "../../../.yarn/berry/cache/typedarray-npm-0.0.6-37638b2241-10c0.zip/node_modules/typedarray/",\ + "packageDependencies": [\ + ["typedarray", "npm:0.0.6"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typedarray-to-buffer", [\ + ["npm:3.1.5", {\ + "packageLocation": "../../../.yarn/berry/cache/typedarray-to-buffer-npm-3.1.5-aadc11995e-10c0.zip/node_modules/typedarray-to-buffer/",\ + "packageDependencies": [\ + ["typedarray-to-buffer", "npm:3.1.5"],\ + ["is-typedarray", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typedoc", [\ + ["npm:0.25.6", {\ + "packageLocation": "../../../.yarn/berry/cache/typedoc-npm-0.25.6-cdbe1ae961-10c0.zip/node_modules/typedoc/",\ + "packageDependencies": [\ + ["typedoc", "npm:0.25.6"]\ + ],\ + "linkType": "SOFT"\ + }],\ + ["virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:0.25.6", {\ + "packageLocation": "./.yarn/__virtual__/typedoc-virtual-554c11995a/4/.yarn/berry/cache/typedoc-npm-0.25.6-cdbe1ae961-10c0.zip/node_modules/typedoc/",\ + "packageDependencies": [\ + ["typedoc", "virtual:5e2c2634f4a5e533cb699d8f9b1c4acc34ccf947e45d7ed30f8385999c64d0ad7826196b49f3aef89d9e3c624e9036dc9c2773fa1ea27b516851dbf6b3663df5#npm:0.25.6"],\ + ["@types/typescript", null],\ + ["lunr", "npm:2.3.9"],\ + ["marked", "npm:4.3.0"],\ + ["minimatch", "npm:9.0.3"],\ + ["shiki", "npm:0.14.7"],\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "packagePeers": [\ + "@types/typescript",\ + "typescript"\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["typescript", [\ + ["patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3", {\ + "packageLocation": "../../../.yarn/berry/cache/typescript-patch-24818892bd-10c0.zip/node_modules/typescript/",\ + "packageDependencies": [\ + ["typescript", "patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587", {\ + "packageLocation": "../../../.yarn/berry/cache/typescript-patch-32ada147aa-10c0.zip/node_modules/typescript/",\ + "packageDependencies": [\ + ["typescript", "patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7", {\ + "packageLocation": "../../../.yarn/berry/cache/typescript-patch-4778c7998b-10c0.zip/node_modules/typescript/",\ + "packageDependencies": [\ + ["typescript", "patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["uglify-js", [\ + ["npm:3.17.4", {\ + "packageLocation": "../../../.yarn/berry/cache/uglify-js-npm-3.17.4-58d4ab56aa-10c0.zip/node_modules/uglify-js/",\ + "packageDependencies": [\ + ["uglify-js", "npm:3.17.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["unbox-primitive", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/unbox-primitive-npm-1.0.2-cb56a05066-10c0.zip/node_modules/unbox-primitive/",\ + "packageDependencies": [\ + ["unbox-primitive", "npm:1.0.2"],\ + ["call-bind", "npm:1.0.5"],\ + ["has-bigints", "npm:1.0.2"],\ + ["has-symbols", "npm:1.0.3"],\ + ["which-boxed-primitive", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["undici-types", [\ + ["npm:5.26.5", {\ + "packageLocation": "../../../.yarn/berry/cache/undici-types-npm-5.26.5-de4f7c7bb9-10c0.zip/node_modules/undici-types/",\ + "packageDependencies": [\ + ["undici-types", "npm:5.26.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["unicorn-magic", [\ + ["npm:0.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/unicorn-magic-npm-0.1.0-12d4f6ff8b-10c0.zip/node_modules/unicorn-magic/",\ + "packageDependencies": [\ + ["unicorn-magic", "npm:0.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["uniq", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/uniq-npm-1.0.1-5cab2dd0f3-10c0.zip/node_modules/uniq/",\ + "packageDependencies": [\ + ["uniq", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["unique-filename", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/unique-filename-npm-3.0.0-77d68e0a45-10c0.zip/node_modules/unique-filename/",\ + "packageDependencies": [\ + ["unique-filename", "npm:3.0.0"],\ + ["unique-slug", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["unique-slug", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/unique-slug-npm-4.0.0-e6b08f28aa-10c0.zip/node_modules/unique-slug/",\ + "packageDependencies": [\ + ["unique-slug", "npm:4.0.0"],\ + ["imurmurhash", "npm:0.1.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["unique-string", [\ + ["npm:3.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/unique-string-npm-3.0.0-1a556e406a-10c0.zip/node_modules/unique-string/",\ + "packageDependencies": [\ + ["unique-string", "npm:3.0.0"],\ + ["crypto-random-string", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["universalify", [\ + ["npm:0.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/universalify-npm-0.1.2-9b22d31d2d-10c0.zip/node_modules/universalify/",\ + "packageDependencies": [\ + ["universalify", "npm:0.1.2"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/universalify-npm-2.0.1-040ba5a21e-10c0.zip/node_modules/universalify/",\ + "packageDependencies": [\ + ["universalify", "npm:2.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["unpipe", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/unpipe-npm-1.0.0-2ed2a3c2bf-10c0.zip/node_modules/unpipe/",\ + "packageDependencies": [\ + ["unpipe", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["uri-js", [\ + ["npm:4.4.1", {\ + "packageLocation": "../../../.yarn/berry/cache/uri-js-npm-4.4.1-66d11cbcaf-10c0.zip/node_modules/uri-js/",\ + "packageDependencies": [\ + ["uri-js", "npm:4.4.1"],\ + ["punycode", "npm:2.3.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["util-deprecate", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/util-deprecate-npm-1.0.2-e3fe1a219c-10c0.zip/node_modules/util-deprecate/",\ + "packageDependencies": [\ + ["util-deprecate", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["utils-merge", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/utils-merge-npm-1.0.1-363bbdfbca-10c0.zip/node_modules/utils-merge/",\ + "packageDependencies": [\ + ["utils-merge", "npm:1.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["v8-to-istanbul", [\ + ["npm:9.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/v8-to-istanbul-npm-9.2.0-fb333cc45f-10c0.zip/node_modules/v8-to-istanbul/",\ + "packageDependencies": [\ + ["v8-to-istanbul", "npm:9.2.0"],\ + ["@jridgewell/trace-mapping", "npm:0.3.20"],\ + ["@types/istanbul-lib-coverage", "npm:2.0.6"],\ + ["convert-source-map", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["validate-npm-package-license", [\ + ["npm:3.0.4", {\ + "packageLocation": "../../../.yarn/berry/cache/validate-npm-package-license-npm-3.0.4-7af8adc7a8-10c0.zip/node_modules/validate-npm-package-license/",\ + "packageDependencies": [\ + ["validate-npm-package-license", "npm:3.0.4"],\ + ["spdx-correct", "npm:3.2.0"],\ + ["spdx-expression-parse", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["validator", [\ + ["npm:13.11.0", {\ + "packageLocation": "../../../.yarn/berry/cache/validator-npm-13.11.0-f0143e2784-10c0.zip/node_modules/validator/",\ + "packageDependencies": [\ + ["validator", "npm:13.11.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["vary", [\ + ["npm:1.1.2", {\ + "packageLocation": "../../../.yarn/berry/cache/vary-npm-1.1.2-b49f70ae63-10c0.zip/node_modules/vary/",\ + "packageDependencies": [\ + ["vary", "npm:1.1.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["vscode-languageserver-textdocument", [\ + ["npm:1.0.11", {\ + "packageLocation": "../../../.yarn/berry/cache/vscode-languageserver-textdocument-npm-1.0.11-6fc94d2b7b-10c0.zip/node_modules/vscode-languageserver-textdocument/",\ + "packageDependencies": [\ + ["vscode-languageserver-textdocument", "npm:1.0.11"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["vscode-oniguruma", [\ + ["npm:1.7.0", {\ + "packageLocation": "../../../.yarn/berry/cache/vscode-oniguruma-npm-1.7.0-07cc55fbcc-10c0.zip/node_modules/vscode-oniguruma/",\ + "packageDependencies": [\ + ["vscode-oniguruma", "npm:1.7.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["vscode-textmate", [\ + ["npm:8.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/vscode-textmate-npm-8.0.0-2deb0cc7cf-10c0.zip/node_modules/vscode-textmate/",\ + "packageDependencies": [\ + ["vscode-textmate", "npm:8.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["vscode-uri", [\ + ["npm:3.0.8", {\ + "packageLocation": "../../../.yarn/berry/cache/vscode-uri-npm-3.0.8-56f46b9d24-10c0.zip/node_modules/vscode-uri/",\ + "packageDependencies": [\ + ["vscode-uri", "npm:3.0.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["walkdir", [\ + ["npm:0.4.1", {\ + "packageLocation": "../../../.yarn/berry/cache/walkdir-npm-0.4.1-de0c3aebeb-10c0.zip/node_modules/walkdir/",\ + "packageDependencies": [\ + ["walkdir", "npm:0.4.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["wcwidth", [\ + ["npm:1.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/wcwidth-npm-1.0.1-05fa596453-10c0.zip/node_modules/wcwidth/",\ + "packageDependencies": [\ + ["wcwidth", "npm:1.0.1"],\ + ["defaults", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["webidl-conversions", [\ + ["npm:3.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/webidl-conversions-npm-3.0.1-60310f6a2b-10c0.zip/node_modules/webidl-conversions/",\ + "packageDependencies": [\ + ["webidl-conversions", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["well-known-symbols", [\ + ["npm:2.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/well-known-symbols-npm-2.0.0-16fb8dedc6-10c0.zip/node_modules/well-known-symbols/",\ + "packageDependencies": [\ + ["well-known-symbols", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["whatwg-url", [\ + ["npm:5.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/whatwg-url-npm-5.0.0-374fb45e60-10c0.zip/node_modules/whatwg-url/",\ + "packageDependencies": [\ + ["whatwg-url", "npm:5.0.0"],\ + ["tr46", "npm:0.0.3"],\ + ["webidl-conversions", "npm:3.0.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["which", [\ + ["npm:1.3.1", {\ + "packageLocation": "../../../.yarn/berry/cache/which-npm-1.3.1-f0ebb8bdd8-10c0.zip/node_modules/which/",\ + "packageDependencies": [\ + ["which", "npm:1.3.1"],\ + ["isexe", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:2.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/which-npm-2.0.2-320ddf72f7-10c0.zip/node_modules/which/",\ + "packageDependencies": [\ + ["which", "npm:2.0.2"],\ + ["isexe", "npm:2.0.0"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/which-npm-4.0.0-dd31cd4928-10c0.zip/node_modules/which/",\ + "packageDependencies": [\ + ["which", "npm:4.0.0"],\ + ["isexe", "npm:3.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["which-boxed-primitive", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/which-boxed-primitive-npm-1.0.2-e214f9ae5a-10c0.zip/node_modules/which-boxed-primitive/",\ + "packageDependencies": [\ + ["which-boxed-primitive", "npm:1.0.2"],\ + ["is-bigint", "npm:1.0.4"],\ + ["is-boolean-object", "npm:1.1.2"],\ + ["is-number-object", "npm:1.0.7"],\ + ["is-string", "npm:1.0.7"],\ + ["is-symbol", "npm:1.0.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["which-typed-array", [\ + ["npm:1.1.13", {\ + "packageLocation": "../../../.yarn/berry/cache/which-typed-array-npm-1.1.13-92c18b4878-10c0.zip/node_modules/which-typed-array/",\ + "packageDependencies": [\ + ["which-typed-array", "npm:1.1.13"],\ + ["available-typed-arrays", "npm:1.0.5"],\ + ["call-bind", "npm:1.0.5"],\ + ["for-each", "npm:0.3.3"],\ + ["gopd", "npm:1.0.1"],\ + ["has-tostringtag", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["wide-align", [\ + ["npm:1.1.5", {\ + "packageLocation": "../../../.yarn/berry/cache/wide-align-npm-1.1.5-889d77e592-10c0.zip/node_modules/wide-align/",\ + "packageDependencies": [\ + ["wide-align", "npm:1.1.5"],\ + ["string-width", "npm:4.2.3"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["word-wrap", [\ + ["npm:1.2.5", {\ + "packageLocation": "../../../.yarn/berry/cache/word-wrap-npm-1.2.5-42d00c4b09-10c0.zip/node_modules/word-wrap/",\ + "packageDependencies": [\ + ["word-wrap", "npm:1.2.5"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["wordwrap", [\ + ["npm:1.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/wordwrap-npm-1.0.0-ae57a645e8-10c0.zip/node_modules/wordwrap/",\ + "packageDependencies": [\ + ["wordwrap", "npm:1.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["wrap-ansi", [\ + ["npm:7.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/wrap-ansi-npm-7.0.0-ad6e1a0554-10c0.zip/node_modules/wrap-ansi/",\ + "packageDependencies": [\ + ["wrap-ansi", "npm:7.0.0"],\ + ["ansi-styles", "npm:4.3.0"],\ + ["string-width", "npm:4.2.3"],\ + ["strip-ansi", "npm:6.0.1"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:8.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/wrap-ansi-npm-8.1.0-26a4e6ae28-10c0.zip/node_modules/wrap-ansi/",\ + "packageDependencies": [\ + ["wrap-ansi", "npm:8.1.0"],\ + ["ansi-styles", "npm:6.2.1"],\ + ["string-width", "npm:5.1.2"],\ + ["strip-ansi", "npm:7.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["wrappy", [\ + ["npm:1.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/wrappy-npm-1.0.2-916de4d4b3-10c0.zip/node_modules/wrappy/",\ + "packageDependencies": [\ + ["wrappy", "npm:1.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["write-file-atomic", [\ + ["npm:3.0.3", {\ + "packageLocation": "../../../.yarn/berry/cache/write-file-atomic-npm-3.0.3-d948a237da-10c0.zip/node_modules/write-file-atomic/",\ + "packageDependencies": [\ + ["write-file-atomic", "npm:3.0.3"],\ + ["imurmurhash", "npm:0.1.4"],\ + ["is-typedarray", "npm:1.0.0"],\ + ["signal-exit", "npm:3.0.7"],\ + ["typedarray-to-buffer", "npm:3.1.5"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:5.0.1", {\ + "packageLocation": "../../../.yarn/berry/cache/write-file-atomic-npm-5.0.1-52283db6ee-10c0.zip/node_modules/write-file-atomic/",\ + "packageDependencies": [\ + ["write-file-atomic", "npm:5.0.1"],\ + ["imurmurhash", "npm:0.1.4"],\ + ["signal-exit", "npm:4.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["xdg-basedir", [\ + ["npm:5.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/xdg-basedir-npm-5.1.0-589d73b54c-10c0.zip/node_modules/xdg-basedir/",\ + "packageDependencies": [\ + ["xdg-basedir", "npm:5.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["xtend", [\ + ["npm:4.0.2", {\ + "packageLocation": "../../../.yarn/berry/cache/xtend-npm-4.0.2-7f2375736e-10c0.zip/node_modules/xtend/",\ + "packageDependencies": [\ + ["xtend", "npm:4.0.2"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["y18n", [\ + ["npm:5.0.8", {\ + "packageLocation": "../../../.yarn/berry/cache/y18n-npm-5.0.8-5f3a0a7e62-10c0.zip/node_modules/y18n/",\ + "packageDependencies": [\ + ["y18n", "npm:5.0.8"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["yallist", [\ + ["npm:4.0.0", {\ + "packageLocation": "../../../.yarn/berry/cache/yallist-npm-4.0.0-b493d9e907-10c0.zip/node_modules/yallist/",\ + "packageDependencies": [\ + ["yallist", "npm:4.0.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["yaml", [\ + ["npm:2.3.4", {\ + "packageLocation": "../../../.yarn/berry/cache/yaml-npm-2.3.4-8bb6dc2c0d-10c0.zip/node_modules/yaml/",\ + "packageDependencies": [\ + ["yaml", "npm:2.3.4"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["yargs", [\ + ["npm:16.2.0", {\ + "packageLocation": "../../../.yarn/berry/cache/yargs-npm-16.2.0-547873d425-10c0.zip/node_modules/yargs/",\ + "packageDependencies": [\ + ["yargs", "npm:16.2.0"],\ + ["cliui", "npm:7.0.4"],\ + ["escalade", "npm:3.1.1"],\ + ["get-caller-file", "npm:2.0.5"],\ + ["require-directory", "npm:2.1.1"],\ + ["string-width", "npm:4.2.3"],\ + ["y18n", "npm:5.0.8"],\ + ["yargs-parser", "npm:20.2.9"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:17.7.2", {\ + "packageLocation": "../../../.yarn/berry/cache/yargs-npm-17.7.2-80b62638e1-10c0.zip/node_modules/yargs/",\ + "packageDependencies": [\ + ["yargs", "npm:17.7.2"],\ + ["cliui", "npm:8.0.1"],\ + ["escalade", "npm:3.1.1"],\ + ["get-caller-file", "npm:2.0.5"],\ + ["require-directory", "npm:2.1.1"],\ + ["string-width", "npm:4.2.3"],\ + ["y18n", "npm:5.0.8"],\ + ["yargs-parser", "npm:21.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["yargs-parser", [\ + ["npm:20.2.9", {\ + "packageLocation": "../../../.yarn/berry/cache/yargs-parser-npm-20.2.9-a1d19e598d-10c0.zip/node_modules/yargs-parser/",\ + "packageDependencies": [\ + ["yargs-parser", "npm:20.2.9"]\ + ],\ + "linkType": "HARD"\ + }],\ + ["npm:21.1.1", {\ + "packageLocation": "../../../.yarn/berry/cache/yargs-parser-npm-21.1.1-8fdc003314-10c0.zip/node_modules/yargs-parser/",\ + "packageDependencies": [\ + ["yargs-parser", "npm:21.1.1"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["yocto-queue", [\ + ["npm:0.1.0", {\ + "packageLocation": "../../../.yarn/berry/cache/yocto-queue-npm-0.1.0-c6c9a7db29-10c0.zip/node_modules/yocto-queue/",\ + "packageDependencies": [\ + ["yocto-queue", "npm:0.1.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]],\ + ["z-schema", [\ + ["npm:5.0.5", {\ + "packageLocation": "../../../.yarn/berry/cache/z-schema-npm-5.0.5-94fb0e21a9-10c0.zip/node_modules/z-schema/",\ + "packageDependencies": [\ + ["z-schema", "npm:5.0.5"],\ + ["commander", "npm:9.5.0"],\ + ["lodash.get", "npm:4.4.2"],\ + ["lodash.isequal", "npm:4.5.0"],\ + ["validator", "npm:13.11.0"]\ + ],\ + "linkType": "HARD"\ + }]\ + ]]\ + ]\ +}'; + +function $$SETUP_STATE(hydrateRuntimeState, basePath) { + return hydrateRuntimeState(JSON.parse(RAW_RUNTIME_STATE), {basePath: basePath || __dirname}); +} + +const fs = require('fs'); +const path = require('path'); +const crypto = require('crypto'); +const os = require('os'); +const events = require('events'); +const nodeUtils = require('util'); +const stream = require('stream'); +const zlib = require('zlib'); +const require$$0 = require('module'); +const StringDecoder = require('string_decoder'); +const url = require('url'); +const buffer = require('buffer'); +const readline = require('readline'); +const assert = require('assert'); + +const _interopDefaultLegacy = e => e && typeof e === 'object' && 'default' in e ? e : { default: e }; + +function _interopNamespace(e) { + if (e && e.__esModule) return e; + const n = Object.create(null); + if (e) { + for (const k in e) { + if (k !== 'default') { + const d = Object.getOwnPropertyDescriptor(e, k); + Object.defineProperty(n, k, d.get ? d : { + enumerable: true, + get: () => e[k] + }); + } + } + } + n.default = e; + return Object.freeze(n); +} + +const fs__default = /*#__PURE__*/_interopDefaultLegacy(fs); +const path__default = /*#__PURE__*/_interopDefaultLegacy(path); +const nodeUtils__namespace = /*#__PURE__*/_interopNamespace(nodeUtils); +const zlib__default = /*#__PURE__*/_interopDefaultLegacy(zlib); +const require$$0__default = /*#__PURE__*/_interopDefaultLegacy(require$$0); +const StringDecoder__default = /*#__PURE__*/_interopDefaultLegacy(StringDecoder); +const buffer__default = /*#__PURE__*/_interopDefaultLegacy(buffer); +const assert__default = /*#__PURE__*/_interopDefaultLegacy(assert); + +const S_IFMT = 61440; +const S_IFDIR = 16384; +const S_IFREG = 32768; +const S_IFLNK = 40960; +const SAFE_TIME = 456789e3; + +function makeError$1(code, message) { + return Object.assign(new Error(`${code}: ${message}`), { code }); +} +function EBUSY(message) { + return makeError$1(`EBUSY`, message); +} +function ENOSYS(message, reason) { + return makeError$1(`ENOSYS`, `${message}, ${reason}`); +} +function EINVAL(reason) { + return makeError$1(`EINVAL`, `invalid argument, ${reason}`); +} +function EBADF(reason) { + return makeError$1(`EBADF`, `bad file descriptor, ${reason}`); +} +function ENOENT(reason) { + return makeError$1(`ENOENT`, `no such file or directory, ${reason}`); +} +function ENOTDIR(reason) { + return makeError$1(`ENOTDIR`, `not a directory, ${reason}`); +} +function EISDIR(reason) { + return makeError$1(`EISDIR`, `illegal operation on a directory, ${reason}`); +} +function EEXIST(reason) { + return makeError$1(`EEXIST`, `file already exists, ${reason}`); +} +function EROFS(reason) { + return makeError$1(`EROFS`, `read-only filesystem, ${reason}`); +} +function ENOTEMPTY(reason) { + return makeError$1(`ENOTEMPTY`, `directory not empty, ${reason}`); +} +function EOPNOTSUPP(reason) { + return makeError$1(`EOPNOTSUPP`, `operation not supported, ${reason}`); +} +function ERR_DIR_CLOSED() { + return makeError$1(`ERR_DIR_CLOSED`, `Directory handle was closed`); +} + +const DEFAULT_MODE = S_IFREG | 420; +class StatEntry { + constructor() { + this.uid = 0; + this.gid = 0; + this.size = 0; + this.blksize = 0; + this.atimeMs = 0; + this.mtimeMs = 0; + this.ctimeMs = 0; + this.birthtimeMs = 0; + this.atime = new Date(0); + this.mtime = new Date(0); + this.ctime = new Date(0); + this.birthtime = new Date(0); + this.dev = 0; + this.ino = 0; + this.mode = DEFAULT_MODE; + this.nlink = 1; + this.rdev = 0; + this.blocks = 1; + } + isBlockDevice() { + return false; + } + isCharacterDevice() { + return false; + } + isDirectory() { + return (this.mode & S_IFMT) === S_IFDIR; + } + isFIFO() { + return false; + } + isFile() { + return (this.mode & S_IFMT) === S_IFREG; + } + isSocket() { + return false; + } + isSymbolicLink() { + return (this.mode & S_IFMT) === S_IFLNK; + } +} +class BigIntStatsEntry { + constructor() { + this.uid = BigInt(0); + this.gid = BigInt(0); + this.size = BigInt(0); + this.blksize = BigInt(0); + this.atimeMs = BigInt(0); + this.mtimeMs = BigInt(0); + this.ctimeMs = BigInt(0); + this.birthtimeMs = BigInt(0); + this.atimeNs = BigInt(0); + this.mtimeNs = BigInt(0); + this.ctimeNs = BigInt(0); + this.birthtimeNs = BigInt(0); + this.atime = new Date(0); + this.mtime = new Date(0); + this.ctime = new Date(0); + this.birthtime = new Date(0); + this.dev = BigInt(0); + this.ino = BigInt(0); + this.mode = BigInt(DEFAULT_MODE); + this.nlink = BigInt(1); + this.rdev = BigInt(0); + this.blocks = BigInt(1); + } + isBlockDevice() { + return false; + } + isCharacterDevice() { + return false; + } + isDirectory() { + return (this.mode & BigInt(S_IFMT)) === BigInt(S_IFDIR); + } + isFIFO() { + return false; + } + isFile() { + return (this.mode & BigInt(S_IFMT)) === BigInt(S_IFREG); + } + isSocket() { + return false; + } + isSymbolicLink() { + return (this.mode & BigInt(S_IFMT)) === BigInt(S_IFLNK); + } +} +function makeDefaultStats() { + return new StatEntry(); +} +function clearStats(stats) { + for (const key in stats) { + if (Object.hasOwn(stats, key)) { + const element = stats[key]; + if (typeof element === `number`) { + stats[key] = 0; + } else if (typeof element === `bigint`) { + stats[key] = BigInt(0); + } else if (nodeUtils__namespace.types.isDate(element)) { + stats[key] = new Date(0); + } + } + } + return stats; +} +function convertToBigIntStats(stats) { + const bigintStats = new BigIntStatsEntry(); + for (const key in stats) { + if (Object.hasOwn(stats, key)) { + const element = stats[key]; + if (typeof element === `number`) { + bigintStats[key] = BigInt(element); + } else if (nodeUtils__namespace.types.isDate(element)) { + bigintStats[key] = new Date(element); + } + } + } + bigintStats.atimeNs = bigintStats.atimeMs * BigInt(1e6); + bigintStats.mtimeNs = bigintStats.mtimeMs * BigInt(1e6); + bigintStats.ctimeNs = bigintStats.ctimeMs * BigInt(1e6); + bigintStats.birthtimeNs = bigintStats.birthtimeMs * BigInt(1e6); + return bigintStats; +} +function areStatsEqual(a, b) { + if (a.atimeMs !== b.atimeMs) + return false; + if (a.birthtimeMs !== b.birthtimeMs) + return false; + if (a.blksize !== b.blksize) + return false; + if (a.blocks !== b.blocks) + return false; + if (a.ctimeMs !== b.ctimeMs) + return false; + if (a.dev !== b.dev) + return false; + if (a.gid !== b.gid) + return false; + if (a.ino !== b.ino) + return false; + if (a.isBlockDevice() !== b.isBlockDevice()) + return false; + if (a.isCharacterDevice() !== b.isCharacterDevice()) + return false; + if (a.isDirectory() !== b.isDirectory()) + return false; + if (a.isFIFO() !== b.isFIFO()) + return false; + if (a.isFile() !== b.isFile()) + return false; + if (a.isSocket() !== b.isSocket()) + return false; + if (a.isSymbolicLink() !== b.isSymbolicLink()) + return false; + if (a.mode !== b.mode) + return false; + if (a.mtimeMs !== b.mtimeMs) + return false; + if (a.nlink !== b.nlink) + return false; + if (a.rdev !== b.rdev) + return false; + if (a.size !== b.size) + return false; + if (a.uid !== b.uid) + return false; + const aN = a; + const bN = b; + if (aN.atimeNs !== bN.atimeNs) + return false; + if (aN.mtimeNs !== bN.mtimeNs) + return false; + if (aN.ctimeNs !== bN.ctimeNs) + return false; + if (aN.birthtimeNs !== bN.birthtimeNs) + return false; + return true; +} + +const PortablePath = { + root: `/`, + dot: `.`, + parent: `..` +}; +const Filename = { + home: `~`, + nodeModules: `node_modules`, + manifest: `package.json`, + lockfile: `yarn.lock`, + virtual: `__virtual__`, + pnpJs: `.pnp.js`, + pnpCjs: `.pnp.cjs`, + pnpData: `.pnp.data.json`, + pnpEsmLoader: `.pnp.loader.mjs`, + rc: `.yarnrc.yml`, + env: `.env` +}; +const npath = Object.create(path__default.default); +const ppath = Object.create(path__default.default.posix); +npath.cwd = () => process.cwd(); +ppath.cwd = process.platform === `win32` ? () => toPortablePath(process.cwd()) : process.cwd; +if (process.platform === `win32`) { + ppath.resolve = (...segments) => { + if (segments.length > 0 && ppath.isAbsolute(segments[0])) { + return path__default.default.posix.resolve(...segments); + } else { + return path__default.default.posix.resolve(ppath.cwd(), ...segments); + } + }; +} +const contains = function(pathUtils, from, to) { + from = pathUtils.normalize(from); + to = pathUtils.normalize(to); + if (from === to) + return `.`; + if (!from.endsWith(pathUtils.sep)) + from = from + pathUtils.sep; + if (to.startsWith(from)) { + return to.slice(from.length); + } else { + return null; + } +}; +npath.contains = (from, to) => contains(npath, from, to); +ppath.contains = (from, to) => contains(ppath, from, to); +const WINDOWS_PATH_REGEXP = /^([a-zA-Z]:.*)$/; +const UNC_WINDOWS_PATH_REGEXP = /^\/\/(\.\/)?(.*)$/; +const PORTABLE_PATH_REGEXP = /^\/([a-zA-Z]:.*)$/; +const UNC_PORTABLE_PATH_REGEXP = /^\/unc\/(\.dot\/)?(.*)$/; +function fromPortablePathWin32(p) { + let portablePathMatch, uncPortablePathMatch; + if (portablePathMatch = p.match(PORTABLE_PATH_REGEXP)) + p = portablePathMatch[1]; + else if (uncPortablePathMatch = p.match(UNC_PORTABLE_PATH_REGEXP)) + p = `\\\\${uncPortablePathMatch[1] ? `.\\` : ``}${uncPortablePathMatch[2]}`; + else + return p; + return p.replace(/\//g, `\\`); +} +function toPortablePathWin32(p) { + p = p.replace(/\\/g, `/`); + let windowsPathMatch, uncWindowsPathMatch; + if (windowsPathMatch = p.match(WINDOWS_PATH_REGEXP)) + p = `/${windowsPathMatch[1]}`; + else if (uncWindowsPathMatch = p.match(UNC_WINDOWS_PATH_REGEXP)) + p = `/unc/${uncWindowsPathMatch[1] ? `.dot/` : ``}${uncWindowsPathMatch[2]}`; + return p; +} +const toPortablePath = process.platform === `win32` ? toPortablePathWin32 : (p) => p; +const fromPortablePath = process.platform === `win32` ? fromPortablePathWin32 : (p) => p; +npath.fromPortablePath = fromPortablePath; +npath.toPortablePath = toPortablePath; +function convertPath(targetPathUtils, sourcePath) { + return targetPathUtils === npath ? fromPortablePath(sourcePath) : toPortablePath(sourcePath); +} + +const defaultTime = new Date(SAFE_TIME * 1e3); +const defaultTimeMs = defaultTime.getTime(); +async function copyPromise(destinationFs, destination, sourceFs, source, opts) { + const normalizedDestination = destinationFs.pathUtils.normalize(destination); + const normalizedSource = sourceFs.pathUtils.normalize(source); + const prelayout = []; + const postlayout = []; + const { atime, mtime } = opts.stableTime ? { atime: defaultTime, mtime: defaultTime } : await sourceFs.lstatPromise(normalizedSource); + await destinationFs.mkdirpPromise(destinationFs.pathUtils.dirname(destination), { utimes: [atime, mtime] }); + await copyImpl(prelayout, postlayout, destinationFs, normalizedDestination, sourceFs, normalizedSource, { ...opts, didParentExist: true }); + for (const operation of prelayout) + await operation(); + await Promise.all(postlayout.map((operation) => { + return operation(); + })); +} +async function copyImpl(prelayout, postlayout, destinationFs, destination, sourceFs, source, opts) { + const destinationStat = opts.didParentExist ? await maybeLStat(destinationFs, destination) : null; + const sourceStat = await sourceFs.lstatPromise(source); + const { atime, mtime } = opts.stableTime ? { atime: defaultTime, mtime: defaultTime } : sourceStat; + let updated; + switch (true) { + case sourceStat.isDirectory(): + { + updated = await copyFolder(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); + } + break; + case sourceStat.isFile(): + { + updated = await copyFile(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); + } + break; + case sourceStat.isSymbolicLink(): + { + updated = await copySymlink(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); + } + break; + default: + { + throw new Error(`Unsupported file type (${sourceStat.mode})`); + } + } + if (opts.linkStrategy?.type !== `HardlinkFromIndex` || !sourceStat.isFile()) { + if (updated || destinationStat?.mtime?.getTime() !== mtime.getTime() || destinationStat?.atime?.getTime() !== atime.getTime()) { + postlayout.push(() => destinationFs.lutimesPromise(destination, atime, mtime)); + updated = true; + } + if (destinationStat === null || (destinationStat.mode & 511) !== (sourceStat.mode & 511)) { + postlayout.push(() => destinationFs.chmodPromise(destination, sourceStat.mode & 511)); + updated = true; + } + } + return updated; +} +async function maybeLStat(baseFs, p) { + try { + return await baseFs.lstatPromise(p); + } catch (e) { + return null; + } +} +async function copyFolder(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { + if (destinationStat !== null && !destinationStat.isDirectory()) { + if (opts.overwrite) { + prelayout.push(async () => destinationFs.removePromise(destination)); + destinationStat = null; + } else { + return false; + } + } + let updated = false; + if (destinationStat === null) { + prelayout.push(async () => { + try { + await destinationFs.mkdirPromise(destination, { mode: sourceStat.mode }); + } catch (err) { + if (err.code !== `EEXIST`) { + throw err; + } + } + }); + updated = true; + } + const entries = await sourceFs.readdirPromise(source); + const nextOpts = opts.didParentExist && !destinationStat ? { ...opts, didParentExist: false } : opts; + if (opts.stableSort) { + for (const entry of entries.sort()) { + if (await copyImpl(prelayout, postlayout, destinationFs, destinationFs.pathUtils.join(destination, entry), sourceFs, sourceFs.pathUtils.join(source, entry), nextOpts)) { + updated = true; + } + } + } else { + const entriesUpdateStatus = await Promise.all(entries.map(async (entry) => { + await copyImpl(prelayout, postlayout, destinationFs, destinationFs.pathUtils.join(destination, entry), sourceFs, sourceFs.pathUtils.join(source, entry), nextOpts); + })); + if (entriesUpdateStatus.some((status) => status)) { + updated = true; + } + } + return updated; +} +async function copyFileViaIndex(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts, linkStrategy) { + const sourceHash = await sourceFs.checksumFilePromise(source, { algorithm: `sha1` }); + const indexPath = destinationFs.pathUtils.join(linkStrategy.indexPath, sourceHash.slice(0, 2), `${sourceHash}.dat`); + let AtomicBehavior; + ((AtomicBehavior2) => { + AtomicBehavior2[AtomicBehavior2["Lock"] = 0] = "Lock"; + AtomicBehavior2[AtomicBehavior2["Rename"] = 1] = "Rename"; + })(AtomicBehavior || (AtomicBehavior = {})); + let atomicBehavior = 1 /* Rename */; + let indexStat = await maybeLStat(destinationFs, indexPath); + if (destinationStat) { + const isDestinationHardlinkedFromIndex = indexStat && destinationStat.dev === indexStat.dev && destinationStat.ino === indexStat.ino; + const isIndexModified = indexStat?.mtimeMs !== defaultTimeMs; + if (isDestinationHardlinkedFromIndex) { + if (isIndexModified && linkStrategy.autoRepair) { + atomicBehavior = 0 /* Lock */; + indexStat = null; + } + } + if (!isDestinationHardlinkedFromIndex) { + if (opts.overwrite) { + prelayout.push(async () => destinationFs.removePromise(destination)); + destinationStat = null; + } else { + return false; + } + } + } + const tempPath = !indexStat && atomicBehavior === 1 /* Rename */ ? `${indexPath}.${Math.floor(Math.random() * 4294967296).toString(16).padStart(8, `0`)}` : null; + let tempPathCleaned = false; + prelayout.push(async () => { + if (!indexStat) { + if (atomicBehavior === 0 /* Lock */) { + await destinationFs.lockPromise(indexPath, async () => { + const content = await sourceFs.readFilePromise(source); + await destinationFs.writeFilePromise(indexPath, content); + }); + } + if (atomicBehavior === 1 /* Rename */ && tempPath) { + const content = await sourceFs.readFilePromise(source); + await destinationFs.writeFilePromise(tempPath, content); + try { + await destinationFs.linkPromise(tempPath, indexPath); + } catch (err) { + if (err.code === `EEXIST`) { + tempPathCleaned = true; + await destinationFs.unlinkPromise(tempPath); + } else { + throw err; + } + } + } + } + if (!destinationStat) { + await destinationFs.linkPromise(indexPath, destination); + } + }); + postlayout.push(async () => { + if (!indexStat) + await destinationFs.lutimesPromise(indexPath, defaultTime, defaultTime); + if (tempPath && !tempPathCleaned) { + await destinationFs.unlinkPromise(tempPath); + } + }); + return false; +} +async function copyFileDirect(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { + if (destinationStat !== null) { + if (opts.overwrite) { + prelayout.push(async () => destinationFs.removePromise(destination)); + destinationStat = null; + } else { + return false; + } + } + prelayout.push(async () => { + const content = await sourceFs.readFilePromise(source); + await destinationFs.writeFilePromise(destination, content); + }); + return true; +} +async function copyFile(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { + if (opts.linkStrategy?.type === `HardlinkFromIndex`) { + return copyFileViaIndex(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts, opts.linkStrategy); + } else { + return copyFileDirect(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); + } +} +async function copySymlink(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { + if (destinationStat !== null) { + if (opts.overwrite) { + prelayout.push(async () => destinationFs.removePromise(destination)); + destinationStat = null; + } else { + return false; + } + } + prelayout.push(async () => { + await destinationFs.symlinkPromise(convertPath(destinationFs.pathUtils, await sourceFs.readlinkPromise(source)), destination); + }); + return true; +} + +class CustomDir { + constructor(path, nextDirent, opts = {}) { + this.path = path; + this.nextDirent = nextDirent; + this.opts = opts; + this.closed = false; + } + throwIfClosed() { + if (this.closed) { + throw ERR_DIR_CLOSED(); + } + } + async *[Symbol.asyncIterator]() { + try { + let dirent; + while ((dirent = await this.read()) !== null) { + yield dirent; + } + } finally { + await this.close(); + } + } + read(cb) { + const dirent = this.readSync(); + if (typeof cb !== `undefined`) + return cb(null, dirent); + return Promise.resolve(dirent); + } + readSync() { + this.throwIfClosed(); + return this.nextDirent(); + } + close(cb) { + this.closeSync(); + if (typeof cb !== `undefined`) + return cb(null); + return Promise.resolve(); + } + closeSync() { + this.throwIfClosed(); + this.opts.onClose?.(); + this.closed = true; + } +} +function opendir(fakeFs, path, entries, opts) { + const nextDirent = () => { + const filename = entries.shift(); + if (typeof filename === `undefined`) + return null; + const entryPath = fakeFs.pathUtils.join(path, filename); + return Object.assign(fakeFs.statSync(entryPath), { + name: filename, + path: void 0 + }); + }; + return new CustomDir(path, nextDirent, opts); +} + +function assertStatus(current, expected) { + if (current !== expected) { + throw new Error(`Invalid StatWatcher status: expected '${expected}', got '${current}'`); + } +} +class CustomStatWatcher extends events.EventEmitter { + constructor(fakeFs, path, { bigint = false } = {}) { + super(); + this.status = "ready" /* Ready */; + this.changeListeners = /* @__PURE__ */ new Map(); + this.startTimeout = null; + this.fakeFs = fakeFs; + this.path = path; + this.bigint = bigint; + this.lastStats = this.stat(); + } + static create(fakeFs, path, opts) { + const statWatcher = new CustomStatWatcher(fakeFs, path, opts); + statWatcher.start(); + return statWatcher; + } + start() { + assertStatus(this.status, "ready" /* Ready */); + this.status = "running" /* Running */; + this.startTimeout = setTimeout(() => { + this.startTimeout = null; + if (!this.fakeFs.existsSync(this.path)) { + this.emit("change" /* Change */, this.lastStats, this.lastStats); + } + }, 3); + } + stop() { + assertStatus(this.status, "running" /* Running */); + this.status = "stopped" /* Stopped */; + if (this.startTimeout !== null) { + clearTimeout(this.startTimeout); + this.startTimeout = null; + } + this.emit("stop" /* Stop */); + } + stat() { + try { + return this.fakeFs.statSync(this.path, { bigint: this.bigint }); + } catch (error) { + const statInstance = this.bigint ? new BigIntStatsEntry() : new StatEntry(); + return clearStats(statInstance); + } + } + makeInterval(opts) { + const interval = setInterval(() => { + const currentStats = this.stat(); + const previousStats = this.lastStats; + if (areStatsEqual(currentStats, previousStats)) + return; + this.lastStats = currentStats; + this.emit("change" /* Change */, currentStats, previousStats); + }, opts.interval); + return opts.persistent ? interval : interval.unref(); + } + registerChangeListener(listener, opts) { + this.addListener("change" /* Change */, listener); + this.changeListeners.set(listener, this.makeInterval(opts)); + } + unregisterChangeListener(listener) { + this.removeListener("change" /* Change */, listener); + const interval = this.changeListeners.get(listener); + if (typeof interval !== `undefined`) + clearInterval(interval); + this.changeListeners.delete(listener); + } + unregisterAllChangeListeners() { + for (const listener of this.changeListeners.keys()) { + this.unregisterChangeListener(listener); + } + } + hasChangeListeners() { + return this.changeListeners.size > 0; + } + ref() { + for (const interval of this.changeListeners.values()) + interval.ref(); + return this; + } + unref() { + for (const interval of this.changeListeners.values()) + interval.unref(); + return this; + } +} + +const statWatchersByFakeFS = /* @__PURE__ */ new WeakMap(); +function watchFile(fakeFs, path, a, b) { + let bigint; + let persistent; + let interval; + let listener; + switch (typeof a) { + case `function`: + { + bigint = false; + persistent = true; + interval = 5007; + listener = a; + } + break; + default: + { + ({ + bigint = false, + persistent = true, + interval = 5007 + } = a); + listener = b; + } + break; + } + let statWatchers = statWatchersByFakeFS.get(fakeFs); + if (typeof statWatchers === `undefined`) + statWatchersByFakeFS.set(fakeFs, statWatchers = /* @__PURE__ */ new Map()); + let statWatcher = statWatchers.get(path); + if (typeof statWatcher === `undefined`) { + statWatcher = CustomStatWatcher.create(fakeFs, path, { bigint }); + statWatchers.set(path, statWatcher); + } + statWatcher.registerChangeListener(listener, { persistent, interval }); + return statWatcher; +} +function unwatchFile(fakeFs, path, cb) { + const statWatchers = statWatchersByFakeFS.get(fakeFs); + if (typeof statWatchers === `undefined`) + return; + const statWatcher = statWatchers.get(path); + if (typeof statWatcher === `undefined`) + return; + if (typeof cb === `undefined`) + statWatcher.unregisterAllChangeListeners(); + else + statWatcher.unregisterChangeListener(cb); + if (!statWatcher.hasChangeListeners()) { + statWatcher.stop(); + statWatchers.delete(path); + } +} +function unwatchAllFiles(fakeFs) { + const statWatchers = statWatchersByFakeFS.get(fakeFs); + if (typeof statWatchers === `undefined`) + return; + for (const path of statWatchers.keys()) { + unwatchFile(fakeFs, path); + } +} + +class FakeFS { + constructor(pathUtils) { + this.pathUtils = pathUtils; + } + async *genTraversePromise(init, { stableSort = false } = {}) { + const stack = [init]; + while (stack.length > 0) { + const p = stack.shift(); + const entry = await this.lstatPromise(p); + if (entry.isDirectory()) { + const entries = await this.readdirPromise(p); + if (stableSort) { + for (const entry2 of entries.sort()) { + stack.push(this.pathUtils.join(p, entry2)); + } + } else { + throw new Error(`Not supported`); + } + } else { + yield p; + } + } + } + async checksumFilePromise(path, { algorithm = `sha512` } = {}) { + const fd = await this.openPromise(path, `r`); + try { + const CHUNK_SIZE = 65536; + const chunk = Buffer.allocUnsafeSlow(CHUNK_SIZE); + const hash = crypto.createHash(algorithm); + let bytesRead = 0; + while ((bytesRead = await this.readPromise(fd, chunk, 0, CHUNK_SIZE)) !== 0) + hash.update(bytesRead === CHUNK_SIZE ? chunk : chunk.slice(0, bytesRead)); + return hash.digest(`hex`); + } finally { + await this.closePromise(fd); + } + } + async removePromise(p, { recursive = true, maxRetries = 5 } = {}) { + let stat; + try { + stat = await this.lstatPromise(p); + } catch (error) { + if (error.code === `ENOENT`) { + return; + } else { + throw error; + } + } + if (stat.isDirectory()) { + if (recursive) { + const entries = await this.readdirPromise(p); + await Promise.all(entries.map((entry) => { + return this.removePromise(this.pathUtils.resolve(p, entry)); + })); + } + for (let t = 0; t <= maxRetries; t++) { + try { + await this.rmdirPromise(p); + break; + } catch (error) { + if (error.code !== `EBUSY` && error.code !== `ENOTEMPTY`) { + throw error; + } else if (t < maxRetries) { + await new Promise((resolve) => setTimeout(resolve, t * 100)); + } + } + } + } else { + await this.unlinkPromise(p); + } + } + removeSync(p, { recursive = true } = {}) { + let stat; + try { + stat = this.lstatSync(p); + } catch (error) { + if (error.code === `ENOENT`) { + return; + } else { + throw error; + } + } + if (stat.isDirectory()) { + if (recursive) + for (const entry of this.readdirSync(p)) + this.removeSync(this.pathUtils.resolve(p, entry)); + this.rmdirSync(p); + } else { + this.unlinkSync(p); + } + } + async mkdirpPromise(p, { chmod, utimes } = {}) { + p = this.resolve(p); + if (p === this.pathUtils.dirname(p)) + return void 0; + const parts = p.split(this.pathUtils.sep); + let createdDirectory; + for (let u = 2; u <= parts.length; ++u) { + const subPath = parts.slice(0, u).join(this.pathUtils.sep); + if (!this.existsSync(subPath)) { + try { + await this.mkdirPromise(subPath); + } catch (error) { + if (error.code === `EEXIST`) { + continue; + } else { + throw error; + } + } + createdDirectory ??= subPath; + if (chmod != null) + await this.chmodPromise(subPath, chmod); + if (utimes != null) { + await this.utimesPromise(subPath, utimes[0], utimes[1]); + } else { + const parentStat = await this.statPromise(this.pathUtils.dirname(subPath)); + await this.utimesPromise(subPath, parentStat.atime, parentStat.mtime); + } + } + } + return createdDirectory; + } + mkdirpSync(p, { chmod, utimes } = {}) { + p = this.resolve(p); + if (p === this.pathUtils.dirname(p)) + return void 0; + const parts = p.split(this.pathUtils.sep); + let createdDirectory; + for (let u = 2; u <= parts.length; ++u) { + const subPath = parts.slice(0, u).join(this.pathUtils.sep); + if (!this.existsSync(subPath)) { + try { + this.mkdirSync(subPath); + } catch (error) { + if (error.code === `EEXIST`) { + continue; + } else { + throw error; + } + } + createdDirectory ??= subPath; + if (chmod != null) + this.chmodSync(subPath, chmod); + if (utimes != null) { + this.utimesSync(subPath, utimes[0], utimes[1]); + } else { + const parentStat = this.statSync(this.pathUtils.dirname(subPath)); + this.utimesSync(subPath, parentStat.atime, parentStat.mtime); + } + } + } + return createdDirectory; + } + async copyPromise(destination, source, { baseFs = this, overwrite = true, stableSort = false, stableTime = false, linkStrategy = null } = {}) { + return await copyPromise(this, destination, baseFs, source, { overwrite, stableSort, stableTime, linkStrategy }); + } + copySync(destination, source, { baseFs = this, overwrite = true } = {}) { + const stat = baseFs.lstatSync(source); + const exists = this.existsSync(destination); + if (stat.isDirectory()) { + this.mkdirpSync(destination); + const directoryListing = baseFs.readdirSync(source); + for (const entry of directoryListing) { + this.copySync(this.pathUtils.join(destination, entry), baseFs.pathUtils.join(source, entry), { baseFs, overwrite }); + } + } else if (stat.isFile()) { + if (!exists || overwrite) { + if (exists) + this.removeSync(destination); + const content = baseFs.readFileSync(source); + this.writeFileSync(destination, content); + } + } else if (stat.isSymbolicLink()) { + if (!exists || overwrite) { + if (exists) + this.removeSync(destination); + const target = baseFs.readlinkSync(source); + this.symlinkSync(convertPath(this.pathUtils, target), destination); + } + } else { + throw new Error(`Unsupported file type (file: ${source}, mode: 0o${stat.mode.toString(8).padStart(6, `0`)})`); + } + const mode = stat.mode & 511; + this.chmodSync(destination, mode); + } + async changeFilePromise(p, content, opts = {}) { + if (Buffer.isBuffer(content)) { + return this.changeFileBufferPromise(p, content, opts); + } else { + return this.changeFileTextPromise(p, content, opts); + } + } + async changeFileBufferPromise(p, content, { mode } = {}) { + let current = Buffer.alloc(0); + try { + current = await this.readFilePromise(p); + } catch (error) { + } + if (Buffer.compare(current, content) === 0) + return; + await this.writeFilePromise(p, content, { mode }); + } + async changeFileTextPromise(p, content, { automaticNewlines, mode } = {}) { + let current = ``; + try { + current = await this.readFilePromise(p, `utf8`); + } catch (error) { + } + const normalizedContent = automaticNewlines ? normalizeLineEndings(current, content) : content; + if (current === normalizedContent) + return; + await this.writeFilePromise(p, normalizedContent, { mode }); + } + changeFileSync(p, content, opts = {}) { + if (Buffer.isBuffer(content)) { + return this.changeFileBufferSync(p, content, opts); + } else { + return this.changeFileTextSync(p, content, opts); + } + } + changeFileBufferSync(p, content, { mode } = {}) { + let current = Buffer.alloc(0); + try { + current = this.readFileSync(p); + } catch (error) { + } + if (Buffer.compare(current, content) === 0) + return; + this.writeFileSync(p, content, { mode }); + } + changeFileTextSync(p, content, { automaticNewlines = false, mode } = {}) { + let current = ``; + try { + current = this.readFileSync(p, `utf8`); + } catch (error) { + } + const normalizedContent = automaticNewlines ? normalizeLineEndings(current, content) : content; + if (current === normalizedContent) + return; + this.writeFileSync(p, normalizedContent, { mode }); + } + async movePromise(fromP, toP) { + try { + await this.renamePromise(fromP, toP); + } catch (error) { + if (error.code === `EXDEV`) { + await this.copyPromise(toP, fromP); + await this.removePromise(fromP); + } else { + throw error; + } + } + } + moveSync(fromP, toP) { + try { + this.renameSync(fromP, toP); + } catch (error) { + if (error.code === `EXDEV`) { + this.copySync(toP, fromP); + this.removeSync(fromP); + } else { + throw error; + } + } + } + async lockPromise(affectedPath, callback) { + const lockPath = `${affectedPath}.flock`; + const interval = 1e3 / 60; + const startTime = Date.now(); + let fd = null; + const isAlive = async () => { + let pid; + try { + [pid] = await this.readJsonPromise(lockPath); + } catch (error) { + return Date.now() - startTime < 500; + } + try { + process.kill(pid, 0); + return true; + } catch (error) { + return false; + } + }; + while (fd === null) { + try { + fd = await this.openPromise(lockPath, `wx`); + } catch (error) { + if (error.code === `EEXIST`) { + if (!await isAlive()) { + try { + await this.unlinkPromise(lockPath); + continue; + } catch (error2) { + } + } + if (Date.now() - startTime < 60 * 1e3) { + await new Promise((resolve) => setTimeout(resolve, interval)); + } else { + throw new Error(`Couldn't acquire a lock in a reasonable time (via ${lockPath})`); + } + } else { + throw error; + } + } + } + await this.writePromise(fd, JSON.stringify([process.pid])); + try { + return await callback(); + } finally { + try { + await this.closePromise(fd); + await this.unlinkPromise(lockPath); + } catch (error) { + } + } + } + async readJsonPromise(p) { + const content = await this.readFilePromise(p, `utf8`); + try { + return JSON.parse(content); + } catch (error) { + error.message += ` (in ${p})`; + throw error; + } + } + readJsonSync(p) { + const content = this.readFileSync(p, `utf8`); + try { + return JSON.parse(content); + } catch (error) { + error.message += ` (in ${p})`; + throw error; + } + } + async writeJsonPromise(p, data, { compact = false } = {}) { + const space = compact ? 0 : 2; + return await this.writeFilePromise(p, `${JSON.stringify(data, null, space)} +`); + } + writeJsonSync(p, data, { compact = false } = {}) { + const space = compact ? 0 : 2; + return this.writeFileSync(p, `${JSON.stringify(data, null, space)} +`); + } + async preserveTimePromise(p, cb) { + const stat = await this.lstatPromise(p); + const result = await cb(); + if (typeof result !== `undefined`) + p = result; + await this.lutimesPromise(p, stat.atime, stat.mtime); + } + async preserveTimeSync(p, cb) { + const stat = this.lstatSync(p); + const result = cb(); + if (typeof result !== `undefined`) + p = result; + this.lutimesSync(p, stat.atime, stat.mtime); + } +} +class BasePortableFakeFS extends FakeFS { + constructor() { + super(ppath); + } +} +function getEndOfLine(content) { + const matches = content.match(/\r?\n/g); + if (matches === null) + return os.EOL; + const crlf = matches.filter((nl) => nl === `\r +`).length; + const lf = matches.length - crlf; + return crlf > lf ? `\r +` : ` +`; +} +function normalizeLineEndings(originalContent, newContent) { + return newContent.replace(/\r?\n/g, getEndOfLine(originalContent)); +} + +class ProxiedFS extends FakeFS { + getExtractHint(hints) { + return this.baseFs.getExtractHint(hints); + } + resolve(path) { + return this.mapFromBase(this.baseFs.resolve(this.mapToBase(path))); + } + getRealPath() { + return this.mapFromBase(this.baseFs.getRealPath()); + } + async openPromise(p, flags, mode) { + return this.baseFs.openPromise(this.mapToBase(p), flags, mode); + } + openSync(p, flags, mode) { + return this.baseFs.openSync(this.mapToBase(p), flags, mode); + } + async opendirPromise(p, opts) { + return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(p), opts), { path: p }); + } + opendirSync(p, opts) { + return Object.assign(this.baseFs.opendirSync(this.mapToBase(p), opts), { path: p }); + } + async readPromise(fd, buffer, offset, length, position) { + return await this.baseFs.readPromise(fd, buffer, offset, length, position); + } + readSync(fd, buffer, offset, length, position) { + return this.baseFs.readSync(fd, buffer, offset, length, position); + } + async writePromise(fd, buffer, offset, length, position) { + if (typeof buffer === `string`) { + return await this.baseFs.writePromise(fd, buffer, offset); + } else { + return await this.baseFs.writePromise(fd, buffer, offset, length, position); + } + } + writeSync(fd, buffer, offset, length, position) { + if (typeof buffer === `string`) { + return this.baseFs.writeSync(fd, buffer, offset); + } else { + return this.baseFs.writeSync(fd, buffer, offset, length, position); + } + } + async closePromise(fd) { + return this.baseFs.closePromise(fd); + } + closeSync(fd) { + this.baseFs.closeSync(fd); + } + createReadStream(p, opts) { + return this.baseFs.createReadStream(p !== null ? this.mapToBase(p) : p, opts); + } + createWriteStream(p, opts) { + return this.baseFs.createWriteStream(p !== null ? this.mapToBase(p) : p, opts); + } + async realpathPromise(p) { + return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(p))); + } + realpathSync(p) { + return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(p))); + } + async existsPromise(p) { + return this.baseFs.existsPromise(this.mapToBase(p)); + } + existsSync(p) { + return this.baseFs.existsSync(this.mapToBase(p)); + } + accessSync(p, mode) { + return this.baseFs.accessSync(this.mapToBase(p), mode); + } + async accessPromise(p, mode) { + return this.baseFs.accessPromise(this.mapToBase(p), mode); + } + async statPromise(p, opts) { + return this.baseFs.statPromise(this.mapToBase(p), opts); + } + statSync(p, opts) { + return this.baseFs.statSync(this.mapToBase(p), opts); + } + async fstatPromise(fd, opts) { + return this.baseFs.fstatPromise(fd, opts); + } + fstatSync(fd, opts) { + return this.baseFs.fstatSync(fd, opts); + } + lstatPromise(p, opts) { + return this.baseFs.lstatPromise(this.mapToBase(p), opts); + } + lstatSync(p, opts) { + return this.baseFs.lstatSync(this.mapToBase(p), opts); + } + async fchmodPromise(fd, mask) { + return this.baseFs.fchmodPromise(fd, mask); + } + fchmodSync(fd, mask) { + return this.baseFs.fchmodSync(fd, mask); + } + async chmodPromise(p, mask) { + return this.baseFs.chmodPromise(this.mapToBase(p), mask); + } + chmodSync(p, mask) { + return this.baseFs.chmodSync(this.mapToBase(p), mask); + } + async fchownPromise(fd, uid, gid) { + return this.baseFs.fchownPromise(fd, uid, gid); + } + fchownSync(fd, uid, gid) { + return this.baseFs.fchownSync(fd, uid, gid); + } + async chownPromise(p, uid, gid) { + return this.baseFs.chownPromise(this.mapToBase(p), uid, gid); + } + chownSync(p, uid, gid) { + return this.baseFs.chownSync(this.mapToBase(p), uid, gid); + } + async renamePromise(oldP, newP) { + return this.baseFs.renamePromise(this.mapToBase(oldP), this.mapToBase(newP)); + } + renameSync(oldP, newP) { + return this.baseFs.renameSync(this.mapToBase(oldP), this.mapToBase(newP)); + } + async copyFilePromise(sourceP, destP, flags = 0) { + return this.baseFs.copyFilePromise(this.mapToBase(sourceP), this.mapToBase(destP), flags); + } + copyFileSync(sourceP, destP, flags = 0) { + return this.baseFs.copyFileSync(this.mapToBase(sourceP), this.mapToBase(destP), flags); + } + async appendFilePromise(p, content, opts) { + return this.baseFs.appendFilePromise(this.fsMapToBase(p), content, opts); + } + appendFileSync(p, content, opts) { + return this.baseFs.appendFileSync(this.fsMapToBase(p), content, opts); + } + async writeFilePromise(p, content, opts) { + return this.baseFs.writeFilePromise(this.fsMapToBase(p), content, opts); + } + writeFileSync(p, content, opts) { + return this.baseFs.writeFileSync(this.fsMapToBase(p), content, opts); + } + async unlinkPromise(p) { + return this.baseFs.unlinkPromise(this.mapToBase(p)); + } + unlinkSync(p) { + return this.baseFs.unlinkSync(this.mapToBase(p)); + } + async utimesPromise(p, atime, mtime) { + return this.baseFs.utimesPromise(this.mapToBase(p), atime, mtime); + } + utimesSync(p, atime, mtime) { + return this.baseFs.utimesSync(this.mapToBase(p), atime, mtime); + } + async lutimesPromise(p, atime, mtime) { + return this.baseFs.lutimesPromise(this.mapToBase(p), atime, mtime); + } + lutimesSync(p, atime, mtime) { + return this.baseFs.lutimesSync(this.mapToBase(p), atime, mtime); + } + async mkdirPromise(p, opts) { + return this.baseFs.mkdirPromise(this.mapToBase(p), opts); + } + mkdirSync(p, opts) { + return this.baseFs.mkdirSync(this.mapToBase(p), opts); + } + async rmdirPromise(p, opts) { + return this.baseFs.rmdirPromise(this.mapToBase(p), opts); + } + rmdirSync(p, opts) { + return this.baseFs.rmdirSync(this.mapToBase(p), opts); + } + async linkPromise(existingP, newP) { + return this.baseFs.linkPromise(this.mapToBase(existingP), this.mapToBase(newP)); + } + linkSync(existingP, newP) { + return this.baseFs.linkSync(this.mapToBase(existingP), this.mapToBase(newP)); + } + async symlinkPromise(target, p, type) { + const mappedP = this.mapToBase(p); + if (this.pathUtils.isAbsolute(target)) + return this.baseFs.symlinkPromise(this.mapToBase(target), mappedP, type); + const mappedAbsoluteTarget = this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(p), target)); + const mappedTarget = this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(mappedP), mappedAbsoluteTarget); + return this.baseFs.symlinkPromise(mappedTarget, mappedP, type); + } + symlinkSync(target, p, type) { + const mappedP = this.mapToBase(p); + if (this.pathUtils.isAbsolute(target)) + return this.baseFs.symlinkSync(this.mapToBase(target), mappedP, type); + const mappedAbsoluteTarget = this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(p), target)); + const mappedTarget = this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(mappedP), mappedAbsoluteTarget); + return this.baseFs.symlinkSync(mappedTarget, mappedP, type); + } + async readFilePromise(p, encoding) { + return this.baseFs.readFilePromise(this.fsMapToBase(p), encoding); + } + readFileSync(p, encoding) { + return this.baseFs.readFileSync(this.fsMapToBase(p), encoding); + } + readdirPromise(p, opts) { + return this.baseFs.readdirPromise(this.mapToBase(p), opts); + } + readdirSync(p, opts) { + return this.baseFs.readdirSync(this.mapToBase(p), opts); + } + async readlinkPromise(p) { + return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(p))); + } + readlinkSync(p) { + return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(p))); + } + async truncatePromise(p, len) { + return this.baseFs.truncatePromise(this.mapToBase(p), len); + } + truncateSync(p, len) { + return this.baseFs.truncateSync(this.mapToBase(p), len); + } + async ftruncatePromise(fd, len) { + return this.baseFs.ftruncatePromise(fd, len); + } + ftruncateSync(fd, len) { + return this.baseFs.ftruncateSync(fd, len); + } + watch(p, a, b) { + return this.baseFs.watch( + this.mapToBase(p), + a, + b + ); + } + watchFile(p, a, b) { + return this.baseFs.watchFile( + this.mapToBase(p), + a, + b + ); + } + unwatchFile(p, cb) { + return this.baseFs.unwatchFile(this.mapToBase(p), cb); + } + fsMapToBase(p) { + if (typeof p === `number`) { + return p; + } else { + return this.mapToBase(p); + } + } +} + +function direntToPortable(dirent) { + const portableDirent = dirent; + if (typeof dirent.path === `string`) + portableDirent.path = npath.toPortablePath(dirent.path); + return portableDirent; +} +class NodeFS extends BasePortableFakeFS { + constructor(realFs = fs__default.default) { + super(); + this.realFs = realFs; + } + getExtractHint() { + return false; + } + getRealPath() { + return PortablePath.root; + } + resolve(p) { + return ppath.resolve(p); + } + async openPromise(p, flags, mode) { + return await new Promise((resolve, reject) => { + this.realFs.open(npath.fromPortablePath(p), flags, mode, this.makeCallback(resolve, reject)); + }); + } + openSync(p, flags, mode) { + return this.realFs.openSync(npath.fromPortablePath(p), flags, mode); + } + async opendirPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (typeof opts !== `undefined`) { + this.realFs.opendir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.opendir(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }).then((dir) => { + const dirWithFixedPath = dir; + Object.defineProperty(dirWithFixedPath, `path`, { + value: p, + configurable: true, + writable: true + }); + return dirWithFixedPath; + }); + } + opendirSync(p, opts) { + const dir = typeof opts !== `undefined` ? this.realFs.opendirSync(npath.fromPortablePath(p), opts) : this.realFs.opendirSync(npath.fromPortablePath(p)); + const dirWithFixedPath = dir; + Object.defineProperty(dirWithFixedPath, `path`, { + value: p, + configurable: true, + writable: true + }); + return dirWithFixedPath; + } + async readPromise(fd, buffer, offset = 0, length = 0, position = -1) { + return await new Promise((resolve, reject) => { + this.realFs.read(fd, buffer, offset, length, position, (error, bytesRead) => { + if (error) { + reject(error); + } else { + resolve(bytesRead); + } + }); + }); + } + readSync(fd, buffer, offset, length, position) { + return this.realFs.readSync(fd, buffer, offset, length, position); + } + async writePromise(fd, buffer, offset, length, position) { + return await new Promise((resolve, reject) => { + if (typeof buffer === `string`) { + return this.realFs.write(fd, buffer, offset, this.makeCallback(resolve, reject)); + } else { + return this.realFs.write(fd, buffer, offset, length, position, this.makeCallback(resolve, reject)); + } + }); + } + writeSync(fd, buffer, offset, length, position) { + if (typeof buffer === `string`) { + return this.realFs.writeSync(fd, buffer, offset); + } else { + return this.realFs.writeSync(fd, buffer, offset, length, position); + } + } + async closePromise(fd) { + await new Promise((resolve, reject) => { + this.realFs.close(fd, this.makeCallback(resolve, reject)); + }); + } + closeSync(fd) { + this.realFs.closeSync(fd); + } + createReadStream(p, opts) { + const realPath = p !== null ? npath.fromPortablePath(p) : p; + return this.realFs.createReadStream(realPath, opts); + } + createWriteStream(p, opts) { + const realPath = p !== null ? npath.fromPortablePath(p) : p; + return this.realFs.createWriteStream(realPath, opts); + } + async realpathPromise(p) { + return await new Promise((resolve, reject) => { + this.realFs.realpath(npath.fromPortablePath(p), {}, this.makeCallback(resolve, reject)); + }).then((path) => { + return npath.toPortablePath(path); + }); + } + realpathSync(p) { + return npath.toPortablePath(this.realFs.realpathSync(npath.fromPortablePath(p), {})); + } + async existsPromise(p) { + return await new Promise((resolve) => { + this.realFs.exists(npath.fromPortablePath(p), resolve); + }); + } + accessSync(p, mode) { + return this.realFs.accessSync(npath.fromPortablePath(p), mode); + } + async accessPromise(p, mode) { + return await new Promise((resolve, reject) => { + this.realFs.access(npath.fromPortablePath(p), mode, this.makeCallback(resolve, reject)); + }); + } + existsSync(p) { + return this.realFs.existsSync(npath.fromPortablePath(p)); + } + async statPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + this.realFs.stat(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.stat(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }); + } + statSync(p, opts) { + if (opts) { + return this.realFs.statSync(npath.fromPortablePath(p), opts); + } else { + return this.realFs.statSync(npath.fromPortablePath(p)); + } + } + async fstatPromise(fd, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + this.realFs.fstat(fd, opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.fstat(fd, this.makeCallback(resolve, reject)); + } + }); + } + fstatSync(fd, opts) { + if (opts) { + return this.realFs.fstatSync(fd, opts); + } else { + return this.realFs.fstatSync(fd); + } + } + async lstatPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + this.realFs.lstat(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.lstat(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }); + } + lstatSync(p, opts) { + if (opts) { + return this.realFs.lstatSync(npath.fromPortablePath(p), opts); + } else { + return this.realFs.lstatSync(npath.fromPortablePath(p)); + } + } + async fchmodPromise(fd, mask) { + return await new Promise((resolve, reject) => { + this.realFs.fchmod(fd, mask, this.makeCallback(resolve, reject)); + }); + } + fchmodSync(fd, mask) { + return this.realFs.fchmodSync(fd, mask); + } + async chmodPromise(p, mask) { + return await new Promise((resolve, reject) => { + this.realFs.chmod(npath.fromPortablePath(p), mask, this.makeCallback(resolve, reject)); + }); + } + chmodSync(p, mask) { + return this.realFs.chmodSync(npath.fromPortablePath(p), mask); + } + async fchownPromise(fd, uid, gid) { + return await new Promise((resolve, reject) => { + this.realFs.fchown(fd, uid, gid, this.makeCallback(resolve, reject)); + }); + } + fchownSync(fd, uid, gid) { + return this.realFs.fchownSync(fd, uid, gid); + } + async chownPromise(p, uid, gid) { + return await new Promise((resolve, reject) => { + this.realFs.chown(npath.fromPortablePath(p), uid, gid, this.makeCallback(resolve, reject)); + }); + } + chownSync(p, uid, gid) { + return this.realFs.chownSync(npath.fromPortablePath(p), uid, gid); + } + async renamePromise(oldP, newP) { + return await new Promise((resolve, reject) => { + this.realFs.rename(npath.fromPortablePath(oldP), npath.fromPortablePath(newP), this.makeCallback(resolve, reject)); + }); + } + renameSync(oldP, newP) { + return this.realFs.renameSync(npath.fromPortablePath(oldP), npath.fromPortablePath(newP)); + } + async copyFilePromise(sourceP, destP, flags = 0) { + return await new Promise((resolve, reject) => { + this.realFs.copyFile(npath.fromPortablePath(sourceP), npath.fromPortablePath(destP), flags, this.makeCallback(resolve, reject)); + }); + } + copyFileSync(sourceP, destP, flags = 0) { + return this.realFs.copyFileSync(npath.fromPortablePath(sourceP), npath.fromPortablePath(destP), flags); + } + async appendFilePromise(p, content, opts) { + return await new Promise((resolve, reject) => { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + if (opts) { + this.realFs.appendFile(fsNativePath, content, opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.appendFile(fsNativePath, content, this.makeCallback(resolve, reject)); + } + }); + } + appendFileSync(p, content, opts) { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + if (opts) { + this.realFs.appendFileSync(fsNativePath, content, opts); + } else { + this.realFs.appendFileSync(fsNativePath, content); + } + } + async writeFilePromise(p, content, opts) { + return await new Promise((resolve, reject) => { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + if (opts) { + this.realFs.writeFile(fsNativePath, content, opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.writeFile(fsNativePath, content, this.makeCallback(resolve, reject)); + } + }); + } + writeFileSync(p, content, opts) { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + if (opts) { + this.realFs.writeFileSync(fsNativePath, content, opts); + } else { + this.realFs.writeFileSync(fsNativePath, content); + } + } + async unlinkPromise(p) { + return await new Promise((resolve, reject) => { + this.realFs.unlink(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + }); + } + unlinkSync(p) { + return this.realFs.unlinkSync(npath.fromPortablePath(p)); + } + async utimesPromise(p, atime, mtime) { + return await new Promise((resolve, reject) => { + this.realFs.utimes(npath.fromPortablePath(p), atime, mtime, this.makeCallback(resolve, reject)); + }); + } + utimesSync(p, atime, mtime) { + this.realFs.utimesSync(npath.fromPortablePath(p), atime, mtime); + } + async lutimesPromise(p, atime, mtime) { + return await new Promise((resolve, reject) => { + this.realFs.lutimes(npath.fromPortablePath(p), atime, mtime, this.makeCallback(resolve, reject)); + }); + } + lutimesSync(p, atime, mtime) { + this.realFs.lutimesSync(npath.fromPortablePath(p), atime, mtime); + } + async mkdirPromise(p, opts) { + return await new Promise((resolve, reject) => { + this.realFs.mkdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + }); + } + mkdirSync(p, opts) { + return this.realFs.mkdirSync(npath.fromPortablePath(p), opts); + } + async rmdirPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + this.realFs.rmdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.rmdir(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }); + } + rmdirSync(p, opts) { + return this.realFs.rmdirSync(npath.fromPortablePath(p), opts); + } + async linkPromise(existingP, newP) { + return await new Promise((resolve, reject) => { + this.realFs.link(npath.fromPortablePath(existingP), npath.fromPortablePath(newP), this.makeCallback(resolve, reject)); + }); + } + linkSync(existingP, newP) { + return this.realFs.linkSync(npath.fromPortablePath(existingP), npath.fromPortablePath(newP)); + } + async symlinkPromise(target, p, type) { + return await new Promise((resolve, reject) => { + this.realFs.symlink(npath.fromPortablePath(target.replace(/\/+$/, ``)), npath.fromPortablePath(p), type, this.makeCallback(resolve, reject)); + }); + } + symlinkSync(target, p, type) { + return this.realFs.symlinkSync(npath.fromPortablePath(target.replace(/\/+$/, ``)), npath.fromPortablePath(p), type); + } + async readFilePromise(p, encoding) { + return await new Promise((resolve, reject) => { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + this.realFs.readFile(fsNativePath, encoding, this.makeCallback(resolve, reject)); + }); + } + readFileSync(p, encoding) { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + return this.realFs.readFileSync(fsNativePath, encoding); + } + async readdirPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + if (opts.recursive && process.platform === `win32`) { + if (opts.withFileTypes) { + this.realFs.readdir(npath.fromPortablePath(p), opts, this.makeCallback((results) => resolve(results.map(direntToPortable)), reject)); + } else { + this.realFs.readdir(npath.fromPortablePath(p), opts, this.makeCallback((results) => resolve(results.map(npath.toPortablePath)), reject)); + } + } else { + this.realFs.readdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } + } else { + this.realFs.readdir(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }); + } + readdirSync(p, opts) { + if (opts) { + if (opts.recursive && process.platform === `win32`) { + if (opts.withFileTypes) { + return this.realFs.readdirSync(npath.fromPortablePath(p), opts).map(direntToPortable); + } else { + return this.realFs.readdirSync(npath.fromPortablePath(p), opts).map(npath.toPortablePath); + } + } else { + return this.realFs.readdirSync(npath.fromPortablePath(p), opts); + } + } else { + return this.realFs.readdirSync(npath.fromPortablePath(p)); + } + } + async readlinkPromise(p) { + return await new Promise((resolve, reject) => { + this.realFs.readlink(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + }).then((path) => { + return npath.toPortablePath(path); + }); + } + readlinkSync(p) { + return npath.toPortablePath(this.realFs.readlinkSync(npath.fromPortablePath(p))); + } + async truncatePromise(p, len) { + return await new Promise((resolve, reject) => { + this.realFs.truncate(npath.fromPortablePath(p), len, this.makeCallback(resolve, reject)); + }); + } + truncateSync(p, len) { + return this.realFs.truncateSync(npath.fromPortablePath(p), len); + } + async ftruncatePromise(fd, len) { + return await new Promise((resolve, reject) => { + this.realFs.ftruncate(fd, len, this.makeCallback(resolve, reject)); + }); + } + ftruncateSync(fd, len) { + return this.realFs.ftruncateSync(fd, len); + } + watch(p, a, b) { + return this.realFs.watch( + npath.fromPortablePath(p), + a, + b + ); + } + watchFile(p, a, b) { + return this.realFs.watchFile( + npath.fromPortablePath(p), + a, + b + ); + } + unwatchFile(p, cb) { + return this.realFs.unwatchFile(npath.fromPortablePath(p), cb); + } + makeCallback(resolve, reject) { + return (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + }; + } +} + +const MOUNT_MASK = 4278190080; +class MountFS extends BasePortableFakeFS { + constructor({ baseFs = new NodeFS(), filter = null, magicByte = 42, maxOpenFiles = Infinity, useCache = true, maxAge = 5e3, typeCheck = fs.constants.S_IFREG, getMountPoint, factoryPromise, factorySync }) { + if (Math.floor(magicByte) !== magicByte || !(magicByte > 1 && magicByte <= 127)) + throw new Error(`The magic byte must be set to a round value between 1 and 127 included`); + super(); + this.fdMap = /* @__PURE__ */ new Map(); + this.nextFd = 3; + this.isMount = /* @__PURE__ */ new Set(); + this.notMount = /* @__PURE__ */ new Set(); + this.realPaths = /* @__PURE__ */ new Map(); + this.limitOpenFilesTimeout = null; + this.baseFs = baseFs; + this.mountInstances = useCache ? /* @__PURE__ */ new Map() : null; + this.factoryPromise = factoryPromise; + this.factorySync = factorySync; + this.filter = filter; + this.getMountPoint = getMountPoint; + this.magic = magicByte << 24; + this.maxAge = maxAge; + this.maxOpenFiles = maxOpenFiles; + this.typeCheck = typeCheck; + } + getExtractHint(hints) { + return this.baseFs.getExtractHint(hints); + } + getRealPath() { + return this.baseFs.getRealPath(); + } + saveAndClose() { + unwatchAllFiles(this); + if (this.mountInstances) { + for (const [path, { childFs }] of this.mountInstances.entries()) { + childFs.saveAndClose?.(); + this.mountInstances.delete(path); + } + } + } + discardAndClose() { + unwatchAllFiles(this); + if (this.mountInstances) { + for (const [path, { childFs }] of this.mountInstances.entries()) { + childFs.discardAndClose?.(); + this.mountInstances.delete(path); + } + } + } + resolve(p) { + return this.baseFs.resolve(p); + } + remapFd(mountFs, fd) { + const remappedFd = this.nextFd++ | this.magic; + this.fdMap.set(remappedFd, [mountFs, fd]); + return remappedFd; + } + async openPromise(p, flags, mode) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.openPromise(p, flags, mode); + }, async (mountFs, { subPath }) => { + return this.remapFd(mountFs, await mountFs.openPromise(subPath, flags, mode)); + }); + } + openSync(p, flags, mode) { + return this.makeCallSync(p, () => { + return this.baseFs.openSync(p, flags, mode); + }, (mountFs, { subPath }) => { + return this.remapFd(mountFs, mountFs.openSync(subPath, flags, mode)); + }); + } + async opendirPromise(p, opts) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.opendirPromise(p, opts); + }, async (mountFs, { subPath }) => { + return await mountFs.opendirPromise(subPath, opts); + }, { + requireSubpath: false + }); + } + opendirSync(p, opts) { + return this.makeCallSync(p, () => { + return this.baseFs.opendirSync(p, opts); + }, (mountFs, { subPath }) => { + return mountFs.opendirSync(subPath, opts); + }, { + requireSubpath: false + }); + } + async readPromise(fd, buffer, offset, length, position) { + if ((fd & MOUNT_MASK) !== this.magic) + return await this.baseFs.readPromise(fd, buffer, offset, length, position); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`read`); + const [mountFs, realFd] = entry; + return await mountFs.readPromise(realFd, buffer, offset, length, position); + } + readSync(fd, buffer, offset, length, position) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.readSync(fd, buffer, offset, length, position); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`readSync`); + const [mountFs, realFd] = entry; + return mountFs.readSync(realFd, buffer, offset, length, position); + } + async writePromise(fd, buffer, offset, length, position) { + if ((fd & MOUNT_MASK) !== this.magic) { + if (typeof buffer === `string`) { + return await this.baseFs.writePromise(fd, buffer, offset); + } else { + return await this.baseFs.writePromise(fd, buffer, offset, length, position); + } + } + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`write`); + const [mountFs, realFd] = entry; + if (typeof buffer === `string`) { + return await mountFs.writePromise(realFd, buffer, offset); + } else { + return await mountFs.writePromise(realFd, buffer, offset, length, position); + } + } + writeSync(fd, buffer, offset, length, position) { + if ((fd & MOUNT_MASK) !== this.magic) { + if (typeof buffer === `string`) { + return this.baseFs.writeSync(fd, buffer, offset); + } else { + return this.baseFs.writeSync(fd, buffer, offset, length, position); + } + } + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`writeSync`); + const [mountFs, realFd] = entry; + if (typeof buffer === `string`) { + return mountFs.writeSync(realFd, buffer, offset); + } else { + return mountFs.writeSync(realFd, buffer, offset, length, position); + } + } + async closePromise(fd) { + if ((fd & MOUNT_MASK) !== this.magic) + return await this.baseFs.closePromise(fd); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`close`); + this.fdMap.delete(fd); + const [mountFs, realFd] = entry; + return await mountFs.closePromise(realFd); + } + closeSync(fd) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.closeSync(fd); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`closeSync`); + this.fdMap.delete(fd); + const [mountFs, realFd] = entry; + return mountFs.closeSync(realFd); + } + createReadStream(p, opts) { + if (p === null) + return this.baseFs.createReadStream(p, opts); + return this.makeCallSync(p, () => { + return this.baseFs.createReadStream(p, opts); + }, (mountFs, { archivePath, subPath }) => { + const stream = mountFs.createReadStream(subPath, opts); + stream.path = npath.fromPortablePath(this.pathUtils.join(archivePath, subPath)); + return stream; + }); + } + createWriteStream(p, opts) { + if (p === null) + return this.baseFs.createWriteStream(p, opts); + return this.makeCallSync(p, () => { + return this.baseFs.createWriteStream(p, opts); + }, (mountFs, { subPath }) => { + return mountFs.createWriteStream(subPath, opts); + }); + } + async realpathPromise(p) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.realpathPromise(p); + }, async (mountFs, { archivePath, subPath }) => { + let realArchivePath = this.realPaths.get(archivePath); + if (typeof realArchivePath === `undefined`) { + realArchivePath = await this.baseFs.realpathPromise(archivePath); + this.realPaths.set(archivePath, realArchivePath); + } + return this.pathUtils.join(realArchivePath, this.pathUtils.relative(PortablePath.root, await mountFs.realpathPromise(subPath))); + }); + } + realpathSync(p) { + return this.makeCallSync(p, () => { + return this.baseFs.realpathSync(p); + }, (mountFs, { archivePath, subPath }) => { + let realArchivePath = this.realPaths.get(archivePath); + if (typeof realArchivePath === `undefined`) { + realArchivePath = this.baseFs.realpathSync(archivePath); + this.realPaths.set(archivePath, realArchivePath); + } + return this.pathUtils.join(realArchivePath, this.pathUtils.relative(PortablePath.root, mountFs.realpathSync(subPath))); + }); + } + async existsPromise(p) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.existsPromise(p); + }, async (mountFs, { subPath }) => { + return await mountFs.existsPromise(subPath); + }); + } + existsSync(p) { + return this.makeCallSync(p, () => { + return this.baseFs.existsSync(p); + }, (mountFs, { subPath }) => { + return mountFs.existsSync(subPath); + }); + } + async accessPromise(p, mode) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.accessPromise(p, mode); + }, async (mountFs, { subPath }) => { + return await mountFs.accessPromise(subPath, mode); + }); + } + accessSync(p, mode) { + return this.makeCallSync(p, () => { + return this.baseFs.accessSync(p, mode); + }, (mountFs, { subPath }) => { + return mountFs.accessSync(subPath, mode); + }); + } + async statPromise(p, opts) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.statPromise(p, opts); + }, async (mountFs, { subPath }) => { + return await mountFs.statPromise(subPath, opts); + }); + } + statSync(p, opts) { + return this.makeCallSync(p, () => { + return this.baseFs.statSync(p, opts); + }, (mountFs, { subPath }) => { + return mountFs.statSync(subPath, opts); + }); + } + async fstatPromise(fd, opts) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.fstatPromise(fd, opts); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`fstat`); + const [mountFs, realFd] = entry; + return mountFs.fstatPromise(realFd, opts); + } + fstatSync(fd, opts) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.fstatSync(fd, opts); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`fstatSync`); + const [mountFs, realFd] = entry; + return mountFs.fstatSync(realFd, opts); + } + async lstatPromise(p, opts) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.lstatPromise(p, opts); + }, async (mountFs, { subPath }) => { + return await mountFs.lstatPromise(subPath, opts); + }); + } + lstatSync(p, opts) { + return this.makeCallSync(p, () => { + return this.baseFs.lstatSync(p, opts); + }, (mountFs, { subPath }) => { + return mountFs.lstatSync(subPath, opts); + }); + } + async fchmodPromise(fd, mask) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.fchmodPromise(fd, mask); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`fchmod`); + const [mountFs, realFd] = entry; + return mountFs.fchmodPromise(realFd, mask); + } + fchmodSync(fd, mask) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.fchmodSync(fd, mask); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`fchmodSync`); + const [mountFs, realFd] = entry; + return mountFs.fchmodSync(realFd, mask); + } + async chmodPromise(p, mask) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.chmodPromise(p, mask); + }, async (mountFs, { subPath }) => { + return await mountFs.chmodPromise(subPath, mask); + }); + } + chmodSync(p, mask) { + return this.makeCallSync(p, () => { + return this.baseFs.chmodSync(p, mask); + }, (mountFs, { subPath }) => { + return mountFs.chmodSync(subPath, mask); + }); + } + async fchownPromise(fd, uid, gid) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.fchownPromise(fd, uid, gid); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`fchown`); + const [zipFs, realFd] = entry; + return zipFs.fchownPromise(realFd, uid, gid); + } + fchownSync(fd, uid, gid) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.fchownSync(fd, uid, gid); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`fchownSync`); + const [zipFs, realFd] = entry; + return zipFs.fchownSync(realFd, uid, gid); + } + async chownPromise(p, uid, gid) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.chownPromise(p, uid, gid); + }, async (mountFs, { subPath }) => { + return await mountFs.chownPromise(subPath, uid, gid); + }); + } + chownSync(p, uid, gid) { + return this.makeCallSync(p, () => { + return this.baseFs.chownSync(p, uid, gid); + }, (mountFs, { subPath }) => { + return mountFs.chownSync(subPath, uid, gid); + }); + } + async renamePromise(oldP, newP) { + return await this.makeCallPromise(oldP, async () => { + return await this.makeCallPromise(newP, async () => { + return await this.baseFs.renamePromise(oldP, newP); + }, async () => { + throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); + }); + }, async (mountFsO, { subPath: subPathO }) => { + return await this.makeCallPromise(newP, async () => { + throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); + }, async (mountFsN, { subPath: subPathN }) => { + if (mountFsO !== mountFsN) { + throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); + } else { + return await mountFsO.renamePromise(subPathO, subPathN); + } + }); + }); + } + renameSync(oldP, newP) { + return this.makeCallSync(oldP, () => { + return this.makeCallSync(newP, () => { + return this.baseFs.renameSync(oldP, newP); + }, () => { + throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); + }); + }, (mountFsO, { subPath: subPathO }) => { + return this.makeCallSync(newP, () => { + throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); + }, (mountFsN, { subPath: subPathN }) => { + if (mountFsO !== mountFsN) { + throw Object.assign(new Error(`EEXDEV: cross-device link not permitted`), { code: `EEXDEV` }); + } else { + return mountFsO.renameSync(subPathO, subPathN); + } + }); + }); + } + async copyFilePromise(sourceP, destP, flags = 0) { + const fallback = async (sourceFs, sourceP2, destFs, destP2) => { + if ((flags & fs.constants.COPYFILE_FICLONE_FORCE) !== 0) + throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${sourceP2}' -> ${destP2}'`), { code: `EXDEV` }); + if (flags & fs.constants.COPYFILE_EXCL && await this.existsPromise(sourceP2)) + throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${sourceP2}' -> '${destP2}'`), { code: `EEXIST` }); + let content; + try { + content = await sourceFs.readFilePromise(sourceP2); + } catch (error) { + throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${sourceP2}' -> '${destP2}'`), { code: `EINVAL` }); + } + await destFs.writeFilePromise(destP2, content); + }; + return await this.makeCallPromise(sourceP, async () => { + return await this.makeCallPromise(destP, async () => { + return await this.baseFs.copyFilePromise(sourceP, destP, flags); + }, async (mountFsD, { subPath: subPathD }) => { + return await fallback(this.baseFs, sourceP, mountFsD, subPathD); + }); + }, async (mountFsS, { subPath: subPathS }) => { + return await this.makeCallPromise(destP, async () => { + return await fallback(mountFsS, subPathS, this.baseFs, destP); + }, async (mountFsD, { subPath: subPathD }) => { + if (mountFsS !== mountFsD) { + return await fallback(mountFsS, subPathS, mountFsD, subPathD); + } else { + return await mountFsS.copyFilePromise(subPathS, subPathD, flags); + } + }); + }); + } + copyFileSync(sourceP, destP, flags = 0) { + const fallback = (sourceFs, sourceP2, destFs, destP2) => { + if ((flags & fs.constants.COPYFILE_FICLONE_FORCE) !== 0) + throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${sourceP2}' -> ${destP2}'`), { code: `EXDEV` }); + if (flags & fs.constants.COPYFILE_EXCL && this.existsSync(sourceP2)) + throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${sourceP2}' -> '${destP2}'`), { code: `EEXIST` }); + let content; + try { + content = sourceFs.readFileSync(sourceP2); + } catch (error) { + throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${sourceP2}' -> '${destP2}'`), { code: `EINVAL` }); + } + destFs.writeFileSync(destP2, content); + }; + return this.makeCallSync(sourceP, () => { + return this.makeCallSync(destP, () => { + return this.baseFs.copyFileSync(sourceP, destP, flags); + }, (mountFsD, { subPath: subPathD }) => { + return fallback(this.baseFs, sourceP, mountFsD, subPathD); + }); + }, (mountFsS, { subPath: subPathS }) => { + return this.makeCallSync(destP, () => { + return fallback(mountFsS, subPathS, this.baseFs, destP); + }, (mountFsD, { subPath: subPathD }) => { + if (mountFsS !== mountFsD) { + return fallback(mountFsS, subPathS, mountFsD, subPathD); + } else { + return mountFsS.copyFileSync(subPathS, subPathD, flags); + } + }); + }); + } + async appendFilePromise(p, content, opts) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.appendFilePromise(p, content, opts); + }, async (mountFs, { subPath }) => { + return await mountFs.appendFilePromise(subPath, content, opts); + }); + } + appendFileSync(p, content, opts) { + return this.makeCallSync(p, () => { + return this.baseFs.appendFileSync(p, content, opts); + }, (mountFs, { subPath }) => { + return mountFs.appendFileSync(subPath, content, opts); + }); + } + async writeFilePromise(p, content, opts) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.writeFilePromise(p, content, opts); + }, async (mountFs, { subPath }) => { + return await mountFs.writeFilePromise(subPath, content, opts); + }); + } + writeFileSync(p, content, opts) { + return this.makeCallSync(p, () => { + return this.baseFs.writeFileSync(p, content, opts); + }, (mountFs, { subPath }) => { + return mountFs.writeFileSync(subPath, content, opts); + }); + } + async unlinkPromise(p) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.unlinkPromise(p); + }, async (mountFs, { subPath }) => { + return await mountFs.unlinkPromise(subPath); + }); + } + unlinkSync(p) { + return this.makeCallSync(p, () => { + return this.baseFs.unlinkSync(p); + }, (mountFs, { subPath }) => { + return mountFs.unlinkSync(subPath); + }); + } + async utimesPromise(p, atime, mtime) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.utimesPromise(p, atime, mtime); + }, async (mountFs, { subPath }) => { + return await mountFs.utimesPromise(subPath, atime, mtime); + }); + } + utimesSync(p, atime, mtime) { + return this.makeCallSync(p, () => { + return this.baseFs.utimesSync(p, atime, mtime); + }, (mountFs, { subPath }) => { + return mountFs.utimesSync(subPath, atime, mtime); + }); + } + async lutimesPromise(p, atime, mtime) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.lutimesPromise(p, atime, mtime); + }, async (mountFs, { subPath }) => { + return await mountFs.lutimesPromise(subPath, atime, mtime); + }); + } + lutimesSync(p, atime, mtime) { + return this.makeCallSync(p, () => { + return this.baseFs.lutimesSync(p, atime, mtime); + }, (mountFs, { subPath }) => { + return mountFs.lutimesSync(subPath, atime, mtime); + }); + } + async mkdirPromise(p, opts) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.mkdirPromise(p, opts); + }, async (mountFs, { subPath }) => { + return await mountFs.mkdirPromise(subPath, opts); + }); + } + mkdirSync(p, opts) { + return this.makeCallSync(p, () => { + return this.baseFs.mkdirSync(p, opts); + }, (mountFs, { subPath }) => { + return mountFs.mkdirSync(subPath, opts); + }); + } + async rmdirPromise(p, opts) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.rmdirPromise(p, opts); + }, async (mountFs, { subPath }) => { + return await mountFs.rmdirPromise(subPath, opts); + }); + } + rmdirSync(p, opts) { + return this.makeCallSync(p, () => { + return this.baseFs.rmdirSync(p, opts); + }, (mountFs, { subPath }) => { + return mountFs.rmdirSync(subPath, opts); + }); + } + async linkPromise(existingP, newP) { + return await this.makeCallPromise(newP, async () => { + return await this.baseFs.linkPromise(existingP, newP); + }, async (mountFs, { subPath }) => { + return await mountFs.linkPromise(existingP, subPath); + }); + } + linkSync(existingP, newP) { + return this.makeCallSync(newP, () => { + return this.baseFs.linkSync(existingP, newP); + }, (mountFs, { subPath }) => { + return mountFs.linkSync(existingP, subPath); + }); + } + async symlinkPromise(target, p, type) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.symlinkPromise(target, p, type); + }, async (mountFs, { subPath }) => { + return await mountFs.symlinkPromise(target, subPath); + }); + } + symlinkSync(target, p, type) { + return this.makeCallSync(p, () => { + return this.baseFs.symlinkSync(target, p, type); + }, (mountFs, { subPath }) => { + return mountFs.symlinkSync(target, subPath); + }); + } + async readFilePromise(p, encoding) { + return this.makeCallPromise(p, async () => { + return await this.baseFs.readFilePromise(p, encoding); + }, async (mountFs, { subPath }) => { + return await mountFs.readFilePromise(subPath, encoding); + }); + } + readFileSync(p, encoding) { + return this.makeCallSync(p, () => { + return this.baseFs.readFileSync(p, encoding); + }, (mountFs, { subPath }) => { + return mountFs.readFileSync(subPath, encoding); + }); + } + async readdirPromise(p, opts) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.readdirPromise(p, opts); + }, async (mountFs, { subPath }) => { + return await mountFs.readdirPromise(subPath, opts); + }, { + requireSubpath: false + }); + } + readdirSync(p, opts) { + return this.makeCallSync(p, () => { + return this.baseFs.readdirSync(p, opts); + }, (mountFs, { subPath }) => { + return mountFs.readdirSync(subPath, opts); + }, { + requireSubpath: false + }); + } + async readlinkPromise(p) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.readlinkPromise(p); + }, async (mountFs, { subPath }) => { + return await mountFs.readlinkPromise(subPath); + }); + } + readlinkSync(p) { + return this.makeCallSync(p, () => { + return this.baseFs.readlinkSync(p); + }, (mountFs, { subPath }) => { + return mountFs.readlinkSync(subPath); + }); + } + async truncatePromise(p, len) { + return await this.makeCallPromise(p, async () => { + return await this.baseFs.truncatePromise(p, len); + }, async (mountFs, { subPath }) => { + return await mountFs.truncatePromise(subPath, len); + }); + } + truncateSync(p, len) { + return this.makeCallSync(p, () => { + return this.baseFs.truncateSync(p, len); + }, (mountFs, { subPath }) => { + return mountFs.truncateSync(subPath, len); + }); + } + async ftruncatePromise(fd, len) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.ftruncatePromise(fd, len); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`ftruncate`); + const [mountFs, realFd] = entry; + return mountFs.ftruncatePromise(realFd, len); + } + ftruncateSync(fd, len) { + if ((fd & MOUNT_MASK) !== this.magic) + return this.baseFs.ftruncateSync(fd, len); + const entry = this.fdMap.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`ftruncateSync`); + const [mountFs, realFd] = entry; + return mountFs.ftruncateSync(realFd, len); + } + watch(p, a, b) { + return this.makeCallSync(p, () => { + return this.baseFs.watch( + p, + a, + b + ); + }, (mountFs, { subPath }) => { + return mountFs.watch( + subPath, + a, + b + ); + }); + } + watchFile(p, a, b) { + return this.makeCallSync(p, () => { + return this.baseFs.watchFile( + p, + a, + b + ); + }, () => { + return watchFile(this, p, a, b); + }); + } + unwatchFile(p, cb) { + return this.makeCallSync(p, () => { + return this.baseFs.unwatchFile(p, cb); + }, () => { + return unwatchFile(this, p, cb); + }); + } + async makeCallPromise(p, discard, accept, { requireSubpath = true } = {}) { + if (typeof p !== `string`) + return await discard(); + const normalizedP = this.resolve(p); + const mountInfo = this.findMount(normalizedP); + if (!mountInfo) + return await discard(); + if (requireSubpath && mountInfo.subPath === `/`) + return await discard(); + return await this.getMountPromise(mountInfo.archivePath, async (mountFs) => await accept(mountFs, mountInfo)); + } + makeCallSync(p, discard, accept, { requireSubpath = true } = {}) { + if (typeof p !== `string`) + return discard(); + const normalizedP = this.resolve(p); + const mountInfo = this.findMount(normalizedP); + if (!mountInfo) + return discard(); + if (requireSubpath && mountInfo.subPath === `/`) + return discard(); + return this.getMountSync(mountInfo.archivePath, (mountFs) => accept(mountFs, mountInfo)); + } + findMount(p) { + if (this.filter && !this.filter.test(p)) + return null; + let filePath = ``; + while (true) { + const pathPartWithArchive = p.substring(filePath.length); + const mountPoint = this.getMountPoint(pathPartWithArchive, filePath); + if (!mountPoint) + return null; + filePath = this.pathUtils.join(filePath, mountPoint); + if (!this.isMount.has(filePath)) { + if (this.notMount.has(filePath)) + continue; + try { + if (this.typeCheck !== null && (this.baseFs.lstatSync(filePath).mode & fs.constants.S_IFMT) !== this.typeCheck) { + this.notMount.add(filePath); + continue; + } + } catch { + return null; + } + this.isMount.add(filePath); + } + return { + archivePath: filePath, + subPath: this.pathUtils.join(PortablePath.root, p.substring(filePath.length)) + }; + } + } + limitOpenFiles(max) { + if (this.mountInstances === null) + return; + const now = Date.now(); + let nextExpiresAt = now + this.maxAge; + let closeCount = max === null ? 0 : this.mountInstances.size - max; + for (const [path, { childFs, expiresAt, refCount }] of this.mountInstances.entries()) { + if (refCount !== 0 || childFs.hasOpenFileHandles?.()) { + continue; + } else if (now >= expiresAt) { + childFs.saveAndClose?.(); + this.mountInstances.delete(path); + closeCount -= 1; + continue; + } else if (max === null || closeCount <= 0) { + nextExpiresAt = expiresAt; + break; + } + childFs.saveAndClose?.(); + this.mountInstances.delete(path); + closeCount -= 1; + } + if (this.limitOpenFilesTimeout === null && (max === null && this.mountInstances.size > 0 || max !== null) && isFinite(nextExpiresAt)) { + this.limitOpenFilesTimeout = setTimeout(() => { + this.limitOpenFilesTimeout = null; + this.limitOpenFiles(null); + }, nextExpiresAt - now).unref(); + } + } + async getMountPromise(p, accept) { + if (this.mountInstances) { + let cachedMountFs = this.mountInstances.get(p); + if (!cachedMountFs) { + const createFsInstance = await this.factoryPromise(this.baseFs, p); + cachedMountFs = this.mountInstances.get(p); + if (!cachedMountFs) { + cachedMountFs = { + childFs: createFsInstance(), + expiresAt: 0, + refCount: 0 + }; + } + } + this.mountInstances.delete(p); + this.limitOpenFiles(this.maxOpenFiles - 1); + this.mountInstances.set(p, cachedMountFs); + cachedMountFs.expiresAt = Date.now() + this.maxAge; + cachedMountFs.refCount += 1; + try { + return await accept(cachedMountFs.childFs); + } finally { + cachedMountFs.refCount -= 1; + } + } else { + const mountFs = (await this.factoryPromise(this.baseFs, p))(); + try { + return await accept(mountFs); + } finally { + mountFs.saveAndClose?.(); + } + } + } + getMountSync(p, accept) { + if (this.mountInstances) { + let cachedMountFs = this.mountInstances.get(p); + if (!cachedMountFs) { + cachedMountFs = { + childFs: this.factorySync(this.baseFs, p), + expiresAt: 0, + refCount: 0 + }; + } + this.mountInstances.delete(p); + this.limitOpenFiles(this.maxOpenFiles - 1); + this.mountInstances.set(p, cachedMountFs); + cachedMountFs.expiresAt = Date.now() + this.maxAge; + return accept(cachedMountFs.childFs); + } else { + const childFs = this.factorySync(this.baseFs, p); + try { + return accept(childFs); + } finally { + childFs.saveAndClose?.(); + } + } + } +} + +class PosixFS extends ProxiedFS { + constructor(baseFs) { + super(npath); + this.baseFs = baseFs; + } + mapFromBase(path) { + return npath.fromPortablePath(path); + } + mapToBase(path) { + return npath.toPortablePath(path); + } +} + +const NUMBER_REGEXP = /^[0-9]+$/; +const VIRTUAL_REGEXP = /^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/; +const VALID_COMPONENT = /^([^/]+-)?[a-f0-9]+$/; +class VirtualFS extends ProxiedFS { + constructor({ baseFs = new NodeFS() } = {}) { + super(ppath); + this.baseFs = baseFs; + } + static makeVirtualPath(base, component, to) { + if (ppath.basename(base) !== `__virtual__`) + throw new Error(`Assertion failed: Virtual folders must be named "__virtual__"`); + if (!ppath.basename(component).match(VALID_COMPONENT)) + throw new Error(`Assertion failed: Virtual components must be ended by an hexadecimal hash`); + const target = ppath.relative(ppath.dirname(base), to); + const segments = target.split(`/`); + let depth = 0; + while (depth < segments.length && segments[depth] === `..`) + depth += 1; + const finalSegments = segments.slice(depth); + const fullVirtualPath = ppath.join(base, component, String(depth), ...finalSegments); + return fullVirtualPath; + } + static resolveVirtual(p) { + const match = p.match(VIRTUAL_REGEXP); + if (!match || !match[3] && match[5]) + return p; + const target = ppath.dirname(match[1]); + if (!match[3] || !match[4]) + return target; + const isnum = NUMBER_REGEXP.test(match[4]); + if (!isnum) + return p; + const depth = Number(match[4]); + const backstep = `../`.repeat(depth); + const subpath = match[5] || `.`; + return VirtualFS.resolveVirtual(ppath.join(target, backstep, subpath)); + } + getExtractHint(hints) { + return this.baseFs.getExtractHint(hints); + } + getRealPath() { + return this.baseFs.getRealPath(); + } + realpathSync(p) { + const match = p.match(VIRTUAL_REGEXP); + if (!match) + return this.baseFs.realpathSync(p); + if (!match[5]) + return p; + const realpath = this.baseFs.realpathSync(this.mapToBase(p)); + return VirtualFS.makeVirtualPath(match[1], match[3], realpath); + } + async realpathPromise(p) { + const match = p.match(VIRTUAL_REGEXP); + if (!match) + return await this.baseFs.realpathPromise(p); + if (!match[5]) + return p; + const realpath = await this.baseFs.realpathPromise(this.mapToBase(p)); + return VirtualFS.makeVirtualPath(match[1], match[3], realpath); + } + mapToBase(p) { + if (p === ``) + return p; + if (this.pathUtils.isAbsolute(p)) + return VirtualFS.resolveVirtual(p); + const resolvedRoot = VirtualFS.resolveVirtual(this.baseFs.resolve(PortablePath.dot)); + const resolvedP = VirtualFS.resolveVirtual(this.baseFs.resolve(p)); + return ppath.relative(resolvedRoot, resolvedP) || PortablePath.dot; + } + mapFromBase(p) { + return p; + } +} + +class NodePathFS extends ProxiedFS { + constructor(baseFs) { + super(npath); + this.baseFs = baseFs; + } + mapFromBase(path) { + return path; + } + mapToBase(path) { + if (typeof path === `string`) + return path; + if (path instanceof url.URL) + return url.fileURLToPath(path); + if (Buffer.isBuffer(path)) { + const str = path.toString(); + if (!isUtf8(path, str)) + throw new Error(`Non-utf8 buffers are not supported at the moment. Please upvote the following issue if you encounter this error: https://github.com/yarnpkg/berry/issues/4942`); + return str; + } + throw new Error(`Unsupported path type: ${nodeUtils.inspect(path)}`); + } +} +function isUtf8(buf, str) { + if (typeof buffer__default.default.isUtf8 !== `undefined`) + return buffer__default.default.isUtf8(buf); + return Buffer.byteLength(str) === buf.byteLength; +} + +var _a, _b, _c, _d; +const kBaseFs = Symbol(`kBaseFs`); +const kFd = Symbol(`kFd`); +const kClosePromise = Symbol(`kClosePromise`); +const kCloseResolve = Symbol(`kCloseResolve`); +const kCloseReject = Symbol(`kCloseReject`); +const kRefs = Symbol(`kRefs`); +const kRef = Symbol(`kRef`); +const kUnref = Symbol(`kUnref`); +class FileHandle { + constructor(fd, baseFs) { + this[_a] = 1; + this[_b] = void 0; + this[_c] = void 0; + this[_d] = void 0; + this[kBaseFs] = baseFs; + this[kFd] = fd; + } + get fd() { + return this[kFd]; + } + async appendFile(data, options) { + try { + this[kRef](this.appendFile); + const encoding = (typeof options === `string` ? options : options?.encoding) ?? void 0; + return await this[kBaseFs].appendFilePromise(this.fd, data, encoding ? { encoding } : void 0); + } finally { + this[kUnref](); + } + } + async chown(uid, gid) { + try { + this[kRef](this.chown); + return await this[kBaseFs].fchownPromise(this.fd, uid, gid); + } finally { + this[kUnref](); + } + } + async chmod(mode) { + try { + this[kRef](this.chmod); + return await this[kBaseFs].fchmodPromise(this.fd, mode); + } finally { + this[kUnref](); + } + } + createReadStream(options) { + return this[kBaseFs].createReadStream(null, { ...options, fd: this.fd }); + } + createWriteStream(options) { + return this[kBaseFs].createWriteStream(null, { ...options, fd: this.fd }); + } + datasync() { + throw new Error(`Method not implemented.`); + } + sync() { + throw new Error(`Method not implemented.`); + } + async read(bufferOrOptions, offset, length, position) { + try { + this[kRef](this.read); + let buffer; + if (!Buffer.isBuffer(bufferOrOptions)) { + bufferOrOptions ??= {}; + buffer = bufferOrOptions.buffer ?? Buffer.alloc(16384); + offset = bufferOrOptions.offset || 0; + length = bufferOrOptions.length ?? buffer.byteLength; + position = bufferOrOptions.position ?? null; + } else { + buffer = bufferOrOptions; + } + offset ??= 0; + length ??= 0; + if (length === 0) { + return { + bytesRead: length, + buffer + }; + } + const bytesRead = await this[kBaseFs].readPromise(this.fd, buffer, offset, length, position); + return { + bytesRead, + buffer + }; + } finally { + this[kUnref](); + } + } + async readFile(options) { + try { + this[kRef](this.readFile); + const encoding = (typeof options === `string` ? options : options?.encoding) ?? void 0; + return await this[kBaseFs].readFilePromise(this.fd, encoding); + } finally { + this[kUnref](); + } + } + readLines(options) { + return readline.createInterface({ + input: this.createReadStream(options), + crlfDelay: Infinity + }); + } + async stat(opts) { + try { + this[kRef](this.stat); + return await this[kBaseFs].fstatPromise(this.fd, opts); + } finally { + this[kUnref](); + } + } + async truncate(len) { + try { + this[kRef](this.truncate); + return await this[kBaseFs].ftruncatePromise(this.fd, len); + } finally { + this[kUnref](); + } + } + utimes(atime, mtime) { + throw new Error(`Method not implemented.`); + } + async writeFile(data, options) { + try { + this[kRef](this.writeFile); + const encoding = (typeof options === `string` ? options : options?.encoding) ?? void 0; + await this[kBaseFs].writeFilePromise(this.fd, data, encoding); + } finally { + this[kUnref](); + } + } + async write(...args) { + try { + this[kRef](this.write); + if (ArrayBuffer.isView(args[0])) { + const [buffer, offset, length, position] = args; + const bytesWritten = await this[kBaseFs].writePromise(this.fd, buffer, offset ?? void 0, length ?? void 0, position ?? void 0); + return { bytesWritten, buffer }; + } else { + const [data, position, encoding] = args; + const bytesWritten = await this[kBaseFs].writePromise(this.fd, data, position, encoding); + return { bytesWritten, buffer: data }; + } + } finally { + this[kUnref](); + } + } + async writev(buffers, position) { + try { + this[kRef](this.writev); + let bytesWritten = 0; + if (typeof position !== `undefined`) { + for (const buffer of buffers) { + const writeResult = await this.write(buffer, void 0, void 0, position); + bytesWritten += writeResult.bytesWritten; + position += writeResult.bytesWritten; + } + } else { + for (const buffer of buffers) { + const writeResult = await this.write(buffer); + bytesWritten += writeResult.bytesWritten; + } + } + return { + buffers, + bytesWritten + }; + } finally { + this[kUnref](); + } + } + readv(buffers, position) { + throw new Error(`Method not implemented.`); + } + close() { + if (this[kFd] === -1) + return Promise.resolve(); + if (this[kClosePromise]) + return this[kClosePromise]; + this[kRefs]--; + if (this[kRefs] === 0) { + const fd = this[kFd]; + this[kFd] = -1; + this[kClosePromise] = this[kBaseFs].closePromise(fd).finally(() => { + this[kClosePromise] = void 0; + }); + } else { + this[kClosePromise] = new Promise((resolve, reject) => { + this[kCloseResolve] = resolve; + this[kCloseReject] = reject; + }).finally(() => { + this[kClosePromise] = void 0; + this[kCloseReject] = void 0; + this[kCloseResolve] = void 0; + }); + } + return this[kClosePromise]; + } + [(_a = kRefs, _b = kClosePromise, _c = kCloseResolve, _d = kCloseReject, kRef)](caller) { + if (this[kFd] === -1) { + const err = new Error(`file closed`); + err.code = `EBADF`; + err.syscall = caller.name; + throw err; + } + this[kRefs]++; + } + [kUnref]() { + this[kRefs]--; + if (this[kRefs] === 0) { + const fd = this[kFd]; + this[kFd] = -1; + this[kBaseFs].closePromise(fd).then(this[kCloseResolve], this[kCloseReject]); + } + } +} + +const SYNC_IMPLEMENTATIONS = /* @__PURE__ */ new Set([ + `accessSync`, + `appendFileSync`, + `createReadStream`, + `createWriteStream`, + `chmodSync`, + `fchmodSync`, + `chownSync`, + `fchownSync`, + `closeSync`, + `copyFileSync`, + `linkSync`, + `lstatSync`, + `fstatSync`, + `lutimesSync`, + `mkdirSync`, + `openSync`, + `opendirSync`, + `readlinkSync`, + `readFileSync`, + `readdirSync`, + `readlinkSync`, + `realpathSync`, + `renameSync`, + `rmdirSync`, + `statSync`, + `symlinkSync`, + `truncateSync`, + `ftruncateSync`, + `unlinkSync`, + `unwatchFile`, + `utimesSync`, + `watch`, + `watchFile`, + `writeFileSync`, + `writeSync` +]); +const ASYNC_IMPLEMENTATIONS = /* @__PURE__ */ new Set([ + `accessPromise`, + `appendFilePromise`, + `fchmodPromise`, + `chmodPromise`, + `fchownPromise`, + `chownPromise`, + `closePromise`, + `copyFilePromise`, + `linkPromise`, + `fstatPromise`, + `lstatPromise`, + `lutimesPromise`, + `mkdirPromise`, + `openPromise`, + `opendirPromise`, + `readdirPromise`, + `realpathPromise`, + `readFilePromise`, + `readdirPromise`, + `readlinkPromise`, + `renamePromise`, + `rmdirPromise`, + `statPromise`, + `symlinkPromise`, + `truncatePromise`, + `ftruncatePromise`, + `unlinkPromise`, + `utimesPromise`, + `writeFilePromise`, + `writeSync` +]); +function patchFs(patchedFs, fakeFs) { + fakeFs = new NodePathFS(fakeFs); + const setupFn = (target, name, replacement) => { + const orig = target[name]; + target[name] = replacement; + if (typeof orig?.[nodeUtils.promisify.custom] !== `undefined`) { + replacement[nodeUtils.promisify.custom] = orig[nodeUtils.promisify.custom]; + } + }; + { + setupFn(patchedFs, `exists`, (p, ...args) => { + const hasCallback = typeof args[args.length - 1] === `function`; + const callback = hasCallback ? args.pop() : () => { + }; + process.nextTick(() => { + fakeFs.existsPromise(p).then((exists) => { + callback(exists); + }, () => { + callback(false); + }); + }); + }); + setupFn(patchedFs, `read`, (...args) => { + let [fd, buffer, offset, length, position, callback] = args; + if (args.length <= 3) { + let options = {}; + if (args.length < 3) { + callback = args[1]; + } else { + options = args[1]; + callback = args[2]; + } + ({ + buffer = Buffer.alloc(16384), + offset = 0, + length = buffer.byteLength, + position + } = options); + } + if (offset == null) + offset = 0; + length |= 0; + if (length === 0) { + process.nextTick(() => { + callback(null, 0, buffer); + }); + return; + } + if (position == null) + position = -1; + process.nextTick(() => { + fakeFs.readPromise(fd, buffer, offset, length, position).then((bytesRead) => { + callback(null, bytesRead, buffer); + }, (error) => { + callback(error, 0, buffer); + }); + }); + }); + for (const fnName of ASYNC_IMPLEMENTATIONS) { + const origName = fnName.replace(/Promise$/, ``); + if (typeof patchedFs[origName] === `undefined`) + continue; + const fakeImpl = fakeFs[fnName]; + if (typeof fakeImpl === `undefined`) + continue; + const wrapper = (...args) => { + const hasCallback = typeof args[args.length - 1] === `function`; + const callback = hasCallback ? args.pop() : () => { + }; + process.nextTick(() => { + fakeImpl.apply(fakeFs, args).then((result) => { + callback(null, result); + }, (error) => { + callback(error); + }); + }); + }; + setupFn(patchedFs, origName, wrapper); + } + patchedFs.realpath.native = patchedFs.realpath; + } + { + setupFn(patchedFs, `existsSync`, (p) => { + try { + return fakeFs.existsSync(p); + } catch (error) { + return false; + } + }); + setupFn(patchedFs, `readSync`, (...args) => { + let [fd, buffer, offset, length, position] = args; + if (args.length <= 3) { + const options = args[2] || {}; + ({ offset = 0, length = buffer.byteLength, position } = options); + } + if (offset == null) + offset = 0; + length |= 0; + if (length === 0) + return 0; + if (position == null) + position = -1; + return fakeFs.readSync(fd, buffer, offset, length, position); + }); + for (const fnName of SYNC_IMPLEMENTATIONS) { + const origName = fnName; + if (typeof patchedFs[origName] === `undefined`) + continue; + const fakeImpl = fakeFs[fnName]; + if (typeof fakeImpl === `undefined`) + continue; + setupFn(patchedFs, origName, fakeImpl.bind(fakeFs)); + } + patchedFs.realpathSync.native = patchedFs.realpathSync; + } + { + const patchedFsPromises = patchedFs.promises; + for (const fnName of ASYNC_IMPLEMENTATIONS) { + const origName = fnName.replace(/Promise$/, ``); + if (typeof patchedFsPromises[origName] === `undefined`) + continue; + const fakeImpl = fakeFs[fnName]; + if (typeof fakeImpl === `undefined`) + continue; + if (fnName === `open`) + continue; + setupFn(patchedFsPromises, origName, (pathLike, ...args) => { + if (pathLike instanceof FileHandle) { + return pathLike[origName].apply(pathLike, args); + } else { + return fakeImpl.call(fakeFs, pathLike, ...args); + } + }); + } + setupFn(patchedFsPromises, `open`, async (...args) => { + const fd = await fakeFs.openPromise(...args); + return new FileHandle(fd, fakeFs); + }); + } + { + patchedFs.read[nodeUtils.promisify.custom] = async (fd, buffer, ...args) => { + const res = fakeFs.readPromise(fd, buffer, ...args); + return { bytesRead: await res, buffer }; + }; + patchedFs.write[nodeUtils.promisify.custom] = async (fd, buffer, ...args) => { + const res = fakeFs.writePromise(fd, buffer, ...args); + return { bytesWritten: await res, buffer }; + }; + } +} + +let cachedInstance; +let registeredFactory = () => { + throw new Error(`Assertion failed: No libzip instance is available, and no factory was configured`); +}; +function setFactory(factory) { + registeredFactory = factory; +} +function getInstance() { + if (typeof cachedInstance === `undefined`) + cachedInstance = registeredFactory(); + return cachedInstance; +} + +var libzipSync = {exports: {}}; + +(function (module, exports) { +var frozenFs = Object.assign({}, fs__default.default); +var createModule = function() { + var _scriptDir = void 0; + if (typeof __filename !== "undefined") + _scriptDir = _scriptDir || __filename; + return function(createModule2) { + createModule2 = createModule2 || {}; + var Module = typeof createModule2 !== "undefined" ? createModule2 : {}; + var readyPromiseResolve, readyPromiseReject; + Module["ready"] = new Promise(function(resolve, reject) { + readyPromiseResolve = resolve; + readyPromiseReject = reject; + }); + var moduleOverrides = {}; + var key; + for (key in Module) { + if (Module.hasOwnProperty(key)) { + moduleOverrides[key] = Module[key]; + } + } + var scriptDirectory = ""; + function locateFile(path) { + if (Module["locateFile"]) { + return Module["locateFile"](path, scriptDirectory); + } + return scriptDirectory + path; + } + var read_, readBinary; + var nodeFS; + var nodePath; + { + { + scriptDirectory = __dirname + "/"; + } + read_ = function shell_read(filename, binary) { + var ret = tryParseAsDataURI(filename); + if (ret) { + return binary ? ret : ret.toString(); + } + if (!nodeFS) + nodeFS = frozenFs; + if (!nodePath) + nodePath = path__default.default; + filename = nodePath["normalize"](filename); + return nodeFS["readFileSync"](filename, binary ? null : "utf8"); + }; + readBinary = function readBinary2(filename) { + var ret = read_(filename, true); + if (!ret.buffer) { + ret = new Uint8Array(ret); + } + assert(ret.buffer); + return ret; + }; + if (process["argv"].length > 1) { + process["argv"][1].replace(/\\/g, "/"); + } + process["argv"].slice(2); + Module["inspect"] = function() { + return "[Emscripten Module object]"; + }; + } + Module["print"] || console.log.bind(console); + var err = Module["printErr"] || console.warn.bind(console); + for (key in moduleOverrides) { + if (moduleOverrides.hasOwnProperty(key)) { + Module[key] = moduleOverrides[key]; + } + } + moduleOverrides = null; + if (Module["arguments"]) + ; + if (Module["thisProgram"]) + ; + if (Module["quit"]) + ; + var wasmBinary; + if (Module["wasmBinary"]) + wasmBinary = Module["wasmBinary"]; + Module["noExitRuntime"] || true; + if (typeof WebAssembly !== "object") { + abort("no native wasm support detected"); + } + function getValue(ptr, type, noSafe) { + type = type || "i8"; + if (type.charAt(type.length - 1) === "*") + type = "i32"; + switch (type) { + case "i1": + return HEAP8[ptr >> 0]; + case "i8": + return HEAP8[ptr >> 0]; + case "i16": + return LE_HEAP_LOAD_I16((ptr >> 1) * 2); + case "i32": + return LE_HEAP_LOAD_I32((ptr >> 2) * 4); + case "i64": + return LE_HEAP_LOAD_I32((ptr >> 2) * 4); + case "float": + return LE_HEAP_LOAD_F32((ptr >> 2) * 4); + case "double": + return LE_HEAP_LOAD_F64((ptr >> 3) * 8); + default: + abort("invalid type for getValue: " + type); + } + return null; + } + var wasmMemory; + var ABORT = false; + function assert(condition, text) { + if (!condition) { + abort("Assertion failed: " + text); + } + } + function getCFunc(ident) { + var func = Module["_" + ident]; + assert( + func, + "Cannot call unknown function " + ident + ", make sure it is exported" + ); + return func; + } + function ccall(ident, returnType, argTypes, args, opts) { + var toC = { + string: function(str) { + var ret2 = 0; + if (str !== null && str !== void 0 && str !== 0) { + var len = (str.length << 2) + 1; + ret2 = stackAlloc(len); + stringToUTF8(str, ret2, len); + } + return ret2; + }, + array: function(arr) { + var ret2 = stackAlloc(arr.length); + writeArrayToMemory(arr, ret2); + return ret2; + } + }; + function convertReturnValue(ret2) { + if (returnType === "string") + return UTF8ToString(ret2); + if (returnType === "boolean") + return Boolean(ret2); + return ret2; + } + var func = getCFunc(ident); + var cArgs = []; + var stack = 0; + if (args) { + for (var i = 0; i < args.length; i++) { + var converter = toC[argTypes[i]]; + if (converter) { + if (stack === 0) + stack = stackSave(); + cArgs[i] = converter(args[i]); + } else { + cArgs[i] = args[i]; + } + } + } + var ret = func.apply(null, cArgs); + ret = convertReturnValue(ret); + if (stack !== 0) + stackRestore(stack); + return ret; + } + function cwrap(ident, returnType, argTypes, opts) { + argTypes = argTypes || []; + var numericArgs = argTypes.every(function(type) { + return type === "number"; + }); + var numericRet = returnType !== "string"; + if (numericRet && numericArgs && !opts) { + return getCFunc(ident); + } + return function() { + return ccall(ident, returnType, argTypes, arguments); + }; + } + var UTF8Decoder = new TextDecoder("utf8"); + function UTF8ToString(ptr, maxBytesToRead) { + if (!ptr) + return ""; + var maxPtr = ptr + maxBytesToRead; + for (var end = ptr; !(end >= maxPtr) && HEAPU8[end]; ) + ++end; + return UTF8Decoder.decode(HEAPU8.subarray(ptr, end)); + } + function stringToUTF8Array(str, heap, outIdx, maxBytesToWrite) { + if (!(maxBytesToWrite > 0)) + return 0; + var startIdx = outIdx; + var endIdx = outIdx + maxBytesToWrite - 1; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) { + var u1 = str.charCodeAt(++i); + u = 65536 + ((u & 1023) << 10) | u1 & 1023; + } + if (u <= 127) { + if (outIdx >= endIdx) + break; + heap[outIdx++] = u; + } else if (u <= 2047) { + if (outIdx + 1 >= endIdx) + break; + heap[outIdx++] = 192 | u >> 6; + heap[outIdx++] = 128 | u & 63; + } else if (u <= 65535) { + if (outIdx + 2 >= endIdx) + break; + heap[outIdx++] = 224 | u >> 12; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } else { + if (outIdx + 3 >= endIdx) + break; + heap[outIdx++] = 240 | u >> 18; + heap[outIdx++] = 128 | u >> 12 & 63; + heap[outIdx++] = 128 | u >> 6 & 63; + heap[outIdx++] = 128 | u & 63; + } + } + heap[outIdx] = 0; + return outIdx - startIdx; + } + function stringToUTF8(str, outPtr, maxBytesToWrite) { + return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite); + } + function lengthBytesUTF8(str) { + var len = 0; + for (var i = 0; i < str.length; ++i) { + var u = str.charCodeAt(i); + if (u >= 55296 && u <= 57343) + u = 65536 + ((u & 1023) << 10) | str.charCodeAt(++i) & 1023; + if (u <= 127) + ++len; + else if (u <= 2047) + len += 2; + else if (u <= 65535) + len += 3; + else + len += 4; + } + return len; + } + function allocateUTF8(str) { + var size = lengthBytesUTF8(str) + 1; + var ret = _malloc(size); + if (ret) + stringToUTF8Array(str, HEAP8, ret, size); + return ret; + } + function writeArrayToMemory(array, buffer2) { + HEAP8.set(array, buffer2); + } + function alignUp(x, multiple) { + if (x % multiple > 0) { + x += multiple - x % multiple; + } + return x; + } + var buffer, HEAP8, HEAPU8; + var HEAP_DATA_VIEW; + function updateGlobalBufferAndViews(buf) { + buffer = buf; + Module["HEAP_DATA_VIEW"] = HEAP_DATA_VIEW = new DataView(buf); + Module["HEAP8"] = HEAP8 = new Int8Array(buf); + Module["HEAP16"] = new Int16Array(buf); + Module["HEAP32"] = new Int32Array(buf); + Module["HEAPU8"] = HEAPU8 = new Uint8Array(buf); + Module["HEAPU16"] = new Uint16Array(buf); + Module["HEAPU32"] = new Uint32Array(buf); + Module["HEAPF32"] = new Float32Array(buf); + Module["HEAPF64"] = new Float64Array(buf); + } + Module["INITIAL_MEMORY"] || 16777216; + var wasmTable; + var __ATPRERUN__ = []; + var __ATINIT__ = []; + var __ATPOSTRUN__ = []; + function preRun() { + if (Module["preRun"]) { + if (typeof Module["preRun"] == "function") + Module["preRun"] = [Module["preRun"]]; + while (Module["preRun"].length) { + addOnPreRun(Module["preRun"].shift()); + } + } + callRuntimeCallbacks(__ATPRERUN__); + } + function initRuntime() { + callRuntimeCallbacks(__ATINIT__); + } + function postRun() { + if (Module["postRun"]) { + if (typeof Module["postRun"] == "function") + Module["postRun"] = [Module["postRun"]]; + while (Module["postRun"].length) { + addOnPostRun(Module["postRun"].shift()); + } + } + callRuntimeCallbacks(__ATPOSTRUN__); + } + function addOnPreRun(cb) { + __ATPRERUN__.unshift(cb); + } + function addOnInit(cb) { + __ATINIT__.unshift(cb); + } + function addOnPostRun(cb) { + __ATPOSTRUN__.unshift(cb); + } + var runDependencies = 0; + var dependenciesFulfilled = null; + function addRunDependency(id) { + runDependencies++; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + } + function removeRunDependency(id) { + runDependencies--; + if (Module["monitorRunDependencies"]) { + Module["monitorRunDependencies"](runDependencies); + } + if (runDependencies == 0) { + if (dependenciesFulfilled) { + var callback = dependenciesFulfilled; + dependenciesFulfilled = null; + callback(); + } + } + } + Module["preloadedImages"] = {}; + Module["preloadedAudios"] = {}; + function abort(what) { + if (Module["onAbort"]) { + Module["onAbort"](what); + } + what += ""; + err(what); + ABORT = true; + what = "abort(" + what + "). Build with -s ASSERTIONS=1 for more info."; + var e = new WebAssembly.RuntimeError(what); + readyPromiseReject(e); + throw e; + } + var dataURIPrefix = "data:application/octet-stream;base64,"; + function isDataURI(filename) { + return filename.startsWith(dataURIPrefix); + } + var wasmBinaryFile = "data:application/octet-stream;base64,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QCAAKAJIIgEgASADaiADEAcaAkAgAyAAKAJsIgFNBEAgACABIANrNgJsDAELIABCADcCbAsgACAAKAJoIANrIgE2AmggACAAKAJYIANrNgJYIAEgACgChC5JBEAgACABNgKELgsgAEH8gAEoAgARAwAgAiADaiECCwJAIAAoAgAiASgCBCIERQ0AIAAoAjwhBSAAIAIgBCACIARJGyICBH8gACgCSCAAKAJoaiAFaiEFIAEgBCACazYCBAJAAkACQAJAIAEoAhwiBCgCFEEBaw4CAQACCyAEQaABaiAFIAEoAgAgAkHcgAEoAgARCAAMAgsgASABKAIwIAUgASgCACACQcSAASgCABEEADYCMAwBCyAFIAEoAgAgAhAHGgsgASABKAIAIAJqNgIAIAEgASgCCCACajYCCCAAKAI8BSAFCyACaiICNgI8AkAgACgChC4iASACakEDSQ0AIAAoAmggAWshAQJAIAAoAnRBgQhPBEAgACAAIAAoAkggAWoiAi0AACACLQABIAAoAnwRAAA2AlQMAQsgAUUNACAAIAFBAWsgACgChAERAgAaCyAAKAKELiAAKAI8IgJBAUZrIgRFDQAgACABIAQgACgCgAERBQAgACAAKAKELiAEazYChC4gACgCPCECCyACQYUCSw0AIAAoAgAoAgRFDQAgACgCMCEBDAELCwJAIAAoAkQiAiAAKAJAIgNNDQAgAAJ/IAAoAjwgACgCaGoiASADSwRAIAAoAkggAWpBACACIAFrIgNBggIgA0GCAkkbIgMQGSABIANqDAELIAFBggJqIgEgA00NASAAKAJIIANqQQAgAiADayICIAEgA2siAyACIANJGyIDEBkgACgCQCADags2AkALC50CAQF/AkAgAAJ/IAAoAqAuIgFBwABGBEAgACgCBCAAKAIQaiAAKQOYLjcAACAAQgA3A5guIAAgACgCEEEIajYCEEEADAELIAFBIE4EQCAAKAIEIAAoAhBqIAApA5guPgAAIAAgAEGcLmo1AgA3A5guIAAgACgCEEEEajYCECAAIAAoAqAuQSBrIgE2AqAuCyABQRBOBEAgACgCBCAAKAIQaiAAKQOYLj0AACAAIAAoAhBBAmo2AhAgACAAKQOYLkIQiDcDmC4gACAAKAKgLkEQayIBNgKgLgsgAUEISA0BIAAgACgCECIBQQFqNgIQ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KAJUIgEEfyABQQAgARAiEBkgACgCVAVBAAsQBiAAQQA2AlQLC9wMAgl/AX4jAEFAaiIGJAACQAJAAkACQAJAIAEoAjBBABAjIgVBAkZBACABKAI4QQAQIyIEQQFGGw0AIAVBAUZBACAEQQJGGw0AIAVBAkciAw0BIARBAkcNAQsgASABLwEMQYAQcjsBDEEAIQMMAQsgASABLwEMQf/vA3E7AQxBACEFIANFBEBB9eABIAEoAjAgAEEIahBpIgVFDQILIAJBgAJxBEAgBSEDDAELIARBAkcEQCAFIQMMAQtB9cYBIAEoAjggAEEIahBpIgNFBEAgBRAcDAILIAMgBTYCAAsgASABLwEMQf7/A3EgAS8BUiIFQQBHcjsBDAJAAkACQAJAAn8CQAJAIAEpAyhC/v///w9WDQAgASkDIEL+////D1YNACACQYAEcUUNASABKQNIQv////8PVA0BCyAFQYECa0H//wNxQQNJIQdBAQwBCyAFQYECa0H//wNxIQQgAkGACnFBgApHDQEgBEEDSSEHQQALIQkgBkIcEBciBEUEQCAAQQhqIgAEQCAAQQA2AgQgAEEONgIACyADEBwMBQsgAkGACHEhBQJAAkAgAkGAAnEEQAJAIAUNACABKQMgQv////8PVg0AIAEpAyhCgICAgBBUDQMLIAQgASkDKBAYIAEpAyAhDAwBCwJAAkACQCAFDQAgASkDIEL/////D1YNACABKQMoIgxC/////w9WDQEgASkDSEKAgICAEFQNBAsgASkDKCIMQv////8PVA0BCyAEIAwQGAsgASkDICIMQv////8PWgRAIAQgDBAYCyABKQNIIgxC/////w9UDQELIAQgDBAYCyAELQAARQRAIABBCGoiAARAIABBADYCBCAAQRQ2AgALIAQQCCADEBwMBQtBASEKQQEgBC0AAAR+IAQpAxAFQgALp0H//wNxIAYQRyEFIAQQCCAFIAM2AgAgBw0BDAILIAMhBSAEQQJLDQELIAZCBxAXIgRFBEAgAEEIaiIABEAgAEEANgIEIABBDjYCAAsgBRAcDAMLIARBAhANIARBhxJBAhAsIAQgAS0AUhBwIAQgAS8BEBANIAQtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAsgBBAIDAILQYGyAkEHIAYQRyEDIAQQCCADIAU2AgBBASEL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NgIEIABB7A42AhggGiEdDAMLIARB/wFxIgJBwABxRQRAIAggDSADLwECQQJ0aiAdp0F/IAJ0QX9zcUECdGoiAy0AASICayEIIB0gAq2IIR0gAy0AACIERQ0HDAELCyAEQSBxBEAgB0G//gA2AgQgASECDAgLIAdB0f4ANgIEIABB0A42AhggASECDAcLIB1BfyAGdEF/c62DIBt8IhunIQUgCCAEQQ9xIgNrIQggGiAErUIPg4ghHSABIBdrIgYgAjMBAiAaQX8gA3RBf3Otg3ynIgRPDQIgBCAGayIGIBlNDQEgBygCjEdFDQEgB0HR/gA2AgQgAEG5DDYCGAsgASECIAshBQwFCwJAIA5FBEAgDCARIAZraiEDDAELIAYgDk0EQCAMIA4gBmtqIQMMAQsgDCARIAYgDmsiBmtqIQMgBSAGTQ0AIAUgBmshBQJAAkAgASADTSABIA8gAWusIhogBq0iGyAaIBtUGyIapyIGaiICIANLcQ0AIAMgBmogAUsgASADT3ENACABIAMgBhAHGiACIQEMAQsgASADIAMgAWsiASABQR91IgFqIAFzIgIQByACaiEBIBogAq0iHn0iHFANACACIANqIQIDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgASACKQAANwAAIAEgAikAGDcAGCABIAIpABA3ABAgASACKQAINwAIIBpCIH0hGiACQSBqIQIgAUEgaiEBIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAEgAikAADcAACABIAIpABg3ABggASACKQAQNwAQIAEgAikACDcACCABIAIpADg3ADggASACKQAwNwAwIAEgAikAKDcAKCABIAIpACA3ACAgASACKQBYNwBYIAEgAikAUDcAUCABIAIpAEg3AEggASACKQBANwBAIAEgAikAYDcAYCABIAIpAGg3AGggASACKQBwNwBwIAEgAikAeDcAeCACQYABaiECIAFBgAFqIQEgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAEgAikAADcAACABIAIpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCABIAIpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCABIAIoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCABIAIvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCABIAItAAA6AAAgAkEBaiECIAFBAWohAQsgHEIAUg0ACwsgDiEGIAwhAwsgBSAGSwRAAkACQCABIANNIAEgDyABa6wiGiAGrSIbIBogG1QbIhqnIglqIgIgA0txDQAgAyAJaiABSyABIANPcQ0AIAEgAyAJEAcaDAELIAEgAyADIAFrIgEgAUEfdSIBaiABcyIBEAcgAWohAiAaIAGtIh59IhxQDQAgASADaiEBA0ACQCAcIB4gHCAeVBsiG0IgVARAIBshGgwBCyAbIhpCIH0iIEIFiEIBfEIDgyIfUEUEQANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCAaQiB9IRogAUEgaiEBIAJBIGohAiAfQgF9Ih9CAFINAAsLICBC4ABUDQADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggAiABKQA4NwA4IAIgASkAMDcAMCACIAEpACg3ACggAiABKQAgNwAgIAIgASkAWDcAWCACIAEpAFA3AFAgAiABKQBINwBIIAIgASkAQDcAQCACIAEpAGA3AGAgAiABKQBoNwBoIAIgASkAcDcAcCACIAEpAHg3AHggAUGAAWohASACQYABaiECIBpCgAF9IhpCH1YNAAsLIBpCEFoEQCACIAEpAAA3AAAgAiABKQAINwAIIBpCEH0hGiACQRBqIQIgAUEQaiEBCyAaQghaBEAgAiABKQAANwAAIBpCCH0hGiACQQhqIQIgAUEIaiEBCyAaQgRaBEAgAiABKAAANgAAIBpCBH0hGiACQQRqIQIgAUEEaiEBCyAaQgJaBEAgAiABLwAAOwAAIBpCAn0hGiACQQJqIQIgAUECaiEBCyAcIBt9IRwgGlBFBEAgAiABLQAAOgAAIAJBAWohAiABQQFqIQELIBxCAFINAAsLIAUgBmshAUEAIARrIQUCQCAEQQdLBEAgBCEDDAELIAEgBE0EQCAEIQMMAQsgAiAEayEFA0ACQCACIAUpAAA3AAAgBEEBdCEDIAEgBGshASACIARqIQIgBEEDSw0AIAMhBCABIANLDQELC0EAIANrIQULIAIgBWohBAJAIAUgDyACa6wiGiABrSIbIBogG1QbIhqnIgFIIAVBf0pxDQAgBUEBSCABIARqIAJLcQ0AIAIgBCABEAcgAWohAgwDCyACIAQgAyADQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANAiABIARqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAILAkAgASADTSABIA8gAWusIhogBa0iGyAaIBtUGyIapyIEaiICIANLcQ0AIAMgBGogAUsgASADT3ENACABIAMgBBAHGgwCCyABIAMgAyABayIBIAFBH3UiAWogAXMiARAHIAFqIQIgGiABrSIefSIcUA0BIAEgA2ohAQNAAkAgHCAeIBwgHlQbIhtCIFQEQCAbIRoMAQsgGyIaQiB9IiBCBYhCAXxCA4MiH1BFBEADQCACIAEpAAA3AAAgAiABKQAYNwAYIAIgASkAEDcAECACIAEpAAg3AAggGkIgfSEaIAFBIGohASACQSBqIQIgH0IBfSIfQgBSDQALCyAgQuAAVA0AA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIAIgASkAODcAOCACIAEpADA3ADAgAiABKQAoNwAoIAIgASkAIDcAICACIAEpAFg3AFggAiABKQBQNwBQIAIgASkASDcASCACIAEpAEA3AEAgAiABKQBgNwBgIAIgASkAaDcAaCACIAEpAHA3AHAgAiABKQB4NwB4IAFBgAFqIQEgAkGAAWohAiAaQoABfSIaQh9WDQALCyAaQhBaBEAgAiABKQAANwAAIAIgASkACDcACCAaQhB9IRogAkEQaiECIAFBEGohAQsgGkIIWgRAIAIgASkAADcAACAaQgh9IRogAkEIaiECIAFBCGohAQsgGkIEWgRAIAIgASgAADYAACAaQgR9IRogAkEEaiECIAFBBGohAQsgGkICWgRAIAIgAS8AADsAACAaQgJ9IRogAkECaiECIAFBAmohAQsgHCAbfSEcIBpQRQRAIAIgAS0AADoAACACQQFqIQIgAUEBaiEBCyAcUEUNAAsMAQsCQAJAIBYEQAJAIAQgBUkEQCAHKAKYRyAESw0BCyABIARrIQMCQEEAIARrIgVBf0ogDyABa6wiGiAbIBogG1QbIhqnIgIgBUpxDQAgBUEBSCACIANqIAFLcQ0AIAEgAyACEAcgAmohAgwFCyABIAMgBCAEQR91IgFqIAFzIgEQByABaiECIBogAa0iHn0iHFANBCABIANqIQEDQAJAIBwgHiAcIB5UGyIbQiBUBEAgGyEaDAELIBsiGkIgfSIgQgWIQgF8QgODIh9QRQRAA0AgAiABKQAANwAAIAIgASkAGDcAGCACIAEpABA3ABAgAiABKQAINwAIIBpCIH0hGiABQSBqIQEgAkEgaiECIB9CAX0iH0IAUg0ACwsgIELgAFQNAANAIAIgASkAADcAACACIAEpABg3ABggAiABKQAQNwAQIAIgASkACDcACCACIAEpADg3ADggAiABKQAwNwAwIAIgASkAKDcAKCACIAEpACA3ACAgAiABKQBYNwBYIAIgASkAUDcAUCACIAEpAEg3AEggAiABKQBANwBAIAIgASkAYDcAYCACIAEpAGg3AGggAiABKQBwNwBwIAIgASkAeDcAeCABQYABaiEBIAJBgAFqIQIgGkKAAX0iGkIfVg0ACwsgGkIQWgRAIAIgASkAADcAACACIAEpAAg3AAggGkIQfSEaIAJBEGohAiABQRBqIQELIBpCCFoEQCACIAEpAAA3AAAgGkIIfSEaIAJBCGohAiABQQhqIQELIBpCBFoEQCACIAEoAAA2AAAgGkIEfSEaIAJBBGohAiABQQRqIQELIBpCAloEQCACIAEvAAA7AAAgGkICfSEaIAJBAmohAiABQQJqIQELIBwgG30hHCAaUEUEQCACIAEtAAA6AAAgAkEBaiECIAFBAWohAQsgHFBFDQALDAQLIBAgAWsiCUEBaiIGIAUgBSAGSxshAyABIARrIQIgAUEHcUUNAiADRQ0CIAEgAi0AADoAACACQQFqIQIgAUEBaiIGQQdxQQAgA0EBayIFGw0BIAYhASAFIQMgCSEGDAILAkAgBCAFSQRAIAcoAphHIARLDQELIAEgASAEayIGKQAANwAAIAEgBUEBa0EHcUEBaiIDaiECIAUgA2siBEUNAyADIAZqIQEDQCACIAEpAAA3AAAgAUEIaiEBIAJBCGohAiAEQQhrIgQNAAsMAwsgASAEIAUQPyECDAILIAEgAi0AADoAASAJQQFrIQYgA0ECayEFIAJBAWohAgJAIAFBAmoiCkEHcUUNACAFRQ0AIAEgAi0AADoAAiAJQQJrIQYgA0EDayEFIAJBAWohAgJAIAFBA2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAAyAJQQNrIQYgA0EEayEFIAJBAWohAgJAIAFBBGoiCkEHcUUNACAFRQ0AIAEgAi0AADoABCAJQQRrIQYgA0EFayEFIAJBAWohAgJAIAFBBWoiCkEHcUUNACAFRQ0AIAEgAi0AADoABSAJQQVrIQYgA0EGayEFIAJBAWohAgJAIAFBBmoiCkEHcUUNACAFRQ0AIAEgAi0AADoABiAJQQZrIQYgA0EHayEFIAJBAWohAgJAIAFBB2oiCkEHcUUNACAFRQ0AIAEgAi0AADoAByAJQQdrIQYgA0EIayEDIAFBCGohASACQQFqIQIMBgsgCiEBIAUhAwwFCyAKIQEgBSEDDAQLIAohASAFIQMMAwsgCiEBIAUhAwwCCyAKIQEgBSEDDAELIAohASAFIQMLAkACQCAGQRdNBEAgA0UNASADQQFrIQUgA0EHcSIEBEADQCABIAItAAA6AAAgA0EBayEDIAFBAWohASACQQFqIQIgBEEBayIEDQALCyAFQQdJDQEDQCABIAItAAA6AAAgASACLQABOgABIAEgAi0AAjoAAiABIAItAAM6AAMgASACLQAEOgAEIAEgAi0ABToABSABIAItAAY6AAYgASACLQAHOgAHIAFBCGohASACQQhqIQIgA0EIayIDDQALDAELIAMNAQsgASECDAELIAEgBCADED8hAgsgCyEFDAELIAEgAy0AAjoAACABQQFqIQILIAUgFE8NACACIBNJDQELCyAAIAI2AgwgACAFIAhBA3ZrIgE2AgAgACATIAJrQYMCajYCECAAIBQgAWtBDmo2AgQgByAIQQdxIgA2AogBIAcgHUJ/IACthkJ/hYM+AoQBC+cFAQR/IAMgAiACIANLGyEEIAAgAWshAgJAIABBB3FFDQAgBEUNACAAIAItAAA6AAAgA0EBayEGIAJBAWohAiAAQQFqIgdBB3FBACAEQQFrIgUbRQRAIAchACAFIQQgBiEDDAELIAAgAi0AADoAASADQQJrIQYgBEECayEFIAJBAWohAgJAIABBAmoiB0EHcUUNACAFRQ0AIAAgAi0AADoAAiADQQNrIQYgBEEDayEFIAJBAWohAgJAIABBA2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAAyADQQRrIQYgBEEEayEFIAJBAWohAgJAIABBBGoiB0EHcUUNACAFRQ0AIAAgAi0AADoABCADQQVrIQYgBEEFayEFIAJBAWohAgJAIABBBWoiB0EHcUUNACAFRQ0AIAAgAi0AADoABSADQQZrIQYgBEEGayEFIAJBAWohAgJAIABBBmoiB0EHcUUNACAFRQ0AIAAgAi0AADoABiADQQdrIQYgBEEHayEFIAJBAWohAgJAIABBB2oiB0EHcUUNACAFRQ0AIAAgAi0AADoAByADQQhrIQMgBEEIayEEIABBCGohACACQQFqIQIMBgsgByEAIAUhBCAGIQMMBQsgByEAIAUhBCAGIQMMBAsgByEAIAUhBCAGIQMMAwsgByEAIAUhBCAGIQMMAgsgByEAIAUhBCAGIQMMAQsgByEAIAUhBCAGIQMLAkAgA0EXTQRAIARFDQEgBEEBayEBIARBB3EiAwRAA0AgACACLQAAOgAAIARBAWshBCAAQQFqIQAgAkEBaiECIANBAWsi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CyAAIAMtAAAEfiADKQMQBUIAC6dB//8DcSADKAIEEEcLIQUgAxAICyAEQRBqJAAgBQvgAQICfwF+QTAQCSICRQRAIAEEQCABQQA2AgQgAUEONgIAC0EADwsgAkIANwMIIAJBADYCACACQgA3AxAgAkIANwMYIAJCADcDICACQgA3ACUgAFAEQCACDwsCQCAAQv////8AVg0AIACnQQR0EAkiA0UNACACIAM2AgBBACEBQgEhBANAIAMgAUEEdGoiAUIANwIAIAFCADcABSAAIARSBEAgBKchASAEQgF8IQQMAQsLIAIgADcDCCACIAA3AxAgAg8LIAEEQCABQQA2AgQgAUEONgIAC0EAEBAgAhAGQQAL7gECA38BfiMAQRBrIgQkAAJAIARBDGpCBBAXIgNFBEBBfyECDAELAkAgAQRAIAJBgAZxIQUDQAJAIAUgASgCBHFFDQACQCADKQMIQgBUBEAgA0EAOgAADAELIANCADcDECADQQE6AAALIAMgAS8BCBANIAMgAS8BChANIAMtAABFBEAgAEEIaiIABEAgAEEANgIEIABBFDYCAAtBfyECDAQLQX8hAiAAIARBDGpCBBAbQQBIDQMgATMBCiIGUA0AIAAgASgCDCAGEBtBAEgNAwsgASgCACIBDQALC0EAIQILIAMQCAsgBEEQaiQAIAILPAEBfyAABEAgAUGABnEhAQNAIAEgACgCBHEEQCACIAAvAQpqQQRqIQILIAAoAgAiAA0ACwsgAkH//wNxC5wBAQN/IABFBEBBAA8LIAAhAwNAAn8CQAJAIAAvAQgiAUH04AFNBEAgAUEBRg0BIAFB9cYBRg0BDAILIAFBgbICRg0AIAFB9eABRw0BCyAAKAIAIQEgAEEANgIAIAAoAgwQBiAAEAYgASADIAAgA0YbIQMCQCACRQRAQQAhAgwBCyACIAE2AgALIAEMAQsgACICKAIACyIADQALIAMLsgQCBX8BfgJAAkACQCAAIAGtEBciAQRAIAEtAAANAUEAIQAMAgsgBARAIARBADYCBCAEQQ42AgALQQAPC0EAIQADQCABLQAABH4gASkDCCABKQMQfQVCAAtCBFQNASABEAwhByABIAEQDCIGrRATIghFBEBBACECIAQEQCAEQQA2AgQgBEEVNgIACyABEAggAEUNAwNAIAAoAgAhASAAKAIMEAYg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DCAAQRg2AggLDAMLIAAgBiAFLwFqQQAgBCABEQYAIQEgBhALIAFFDQILAkAgDUUEQCABIQMMAQsgACABIAUvAWgQgQEhAyABEAsgA0UNAQsCQCAJRSAMckUEQCADIQEMAQsgACADQQEQgAEhASADEAsgAUUNAQsgASEDDAELQQAhAwsgBUHwAGokACADC4UBAQF/IAFFBEAgAEEIaiIABEAgAEEANgIEIABBEjYCAAtBAA8LQTgQCSIDRQRAIABBCGoiAARAIABBADYCBCAAQQ42AgALQQAPCyADQQA2AhAgA0IANwIIIANCADcDKCADQQA2AgQgAyACNgIAIANCADcDGCADQQA2AjAgACABQTsgAxBCCw8AIAAgASACQQBBABCCAQusAgECfyABRQRAIABBCGoiAARAIABBADYCBCAAQRI2AgALQQAPCwJAIAJBfUsNACACQf//A3FBCEYNACAAQQhqIgAEQCAAQQA2AgQgAEEQNgIAC0EADwsCQEGwwAAQCSIFBEAgBUEANgIIIAVCADcCACAFQYiBAUGogQEgAxs2AqhAIAUgAjYCFCAFIAM6ABAgBUEAOgAPIAVBADsBDCAFIAMgAkF9SyIGcToADiAFQQggAiAGG0H//wNxIAQgBUGIgQFBqIEBIAMbKAIAEQAAIgI2AqxAIAINASAFEDEgBRAGCyAAQQhqIgAEQCAAQQA2AgQgAEEONgIAC0EADwsgACABQTogBRBCIgAEfyAABSAFKAKsQCAFKAKoQCgCBBEDACAFEDEgBRAGQQALC6ABAQF/IAIgACgCBCIDIAIgA0kbIgIEQCAAIAMgAms2AgQCQAJAAkACQCAAKAIcIgMoAhRBAWsOAgEAAgsgA0GgAWogASAAKAIAIAJB3IABKAIAEQgADAILIAAgACgCMCABIAAoAgAgAkHEgAEoAgARBAA2AjAMAQsgASAAKAIAIAIQBxoLIAAgACgCACACajYCACAAIAAoAgggAmo2AggLC7cCAQR/QX4hAgJAIABFDQAgACgCIEUNACAAKAIkIgRFDQAgACgCHCIBRQ0AIAEoAgAgAEcNAAJAAkAgASgCICIDQTlrDjkBAgICAgICAgICAgIBAgICAQICAgICAgICAgICAgICAgICAQICAgICAgICAgICAQICAgICAgICAgEACyADQZoFRg0AIANBKkcN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DCABajYCDCAGIAYoAgggAWo2AgggBSAFKAIUIAFqNgIUIAUgBSgCECABazYCECAGIAYoAhAgAWsiATYCECABDQAgBiAGKAIENgIIC0EAIQRBACEJIAMoAhBFDQAMCgsgAygCHCgCJCEGIAMgAygCGCIBQQFqNgIYIAEgBmotAAAhASADIARBAWo2AhAgAygCBCAEaiABOgAAIAEEQCADKAIQIQQMAQsLIAMoAhwoAixFDQAgAygCECIGIAlNDQAgBQJ/IAUoAjAhBEEAIAMoAgQgCWoiAUUNABogBCABIAYgCWtB1IABKAIAEQAACzYCMAsgA0HnADYCIAsCQCADKAIcKAIsBEAgAygCDCADKAIQIgFBAmpJBH8gBRAKIAMoAhANAkEABSABCyADKAIEaiAFKAIwOwAAIAMgAygCEEECajYCECADQaABakHkgAEoAgARAQAaCyADQfEANgIgIAUQCiADKAIQRQ0BDAcLDAYLIAUoAgQNAQsgAygCPA0AIApFDQEgAygCIEGaBUYNAQsCfyADKAKIASIBRQRAIAMgChCFAQwBCwJAAkACQCADKAKMAUECaw4CAAECCwJ/AkADQAJAAkAgAygCPA0AIAMQLyADKAI8DQAgCg0BQQAMBAsgAygCSCADKAJoai0AACEEIAMgAygC8C0iAUEBajYC8C0gASADKALsLWpBADoAACADIAMoAvAtIgFBAWo2AvAtIAEgAygC7C1qQQA6AAAgAyADKALwLSIBQQFqNgLwLSABIAMoAuwtaiAEOgAAIAMgBEECdGoiASABLwHkAUEBajsB5AEgAyADKAI8QQFrNgI8IAMgAygCaEEBaiIBNgJoIAMoAvAtIAMoAvQtRw0BQQAhBCADIAMoAlgiBkEATgR/IAMoAkggBmoFQQALIAEgBmtBABAPIAMgAygCaDYCWCADKAIAEAogAygCACgCEA0BDAILCyADQQA2AoQuIApBBEYEQCADIAMoAlgiAUEATgR/IAMoAkggAWoFQQALIAMoAmggAWtBARAPIAMgAygCaDYCWCADKAIAEApBA0ECIAMoAgAoAhAbDAILIAMoAvAtBEBBACEEIAMgAygCWCIBQQBOBH8gAygCSCABagVBAAsgAygCaCABa0EAEA8gAyADKAJoNgJYIAMoAgAQCiADKAIAKAIQRQ0BC0EBIQQLIAQL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bGl0ZXJhbC9sZW5ndGhzIHNldABpbnZhbGlkIGNvZGUgbGVuZ3RocyBzZXQAdW5rbm93biBoZWFkZXIgZmxhZ3Mgc2V0AGludmFsaWQgZGlzdGFuY2VzIHNldABpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0AEZpbGUgYWxyZWFkeSBleGlzdHMAdG9vIG1hbnkgbGVuZ3RoIG9yIGRpc3RhbmNlIHN5bWJvbHMAaW52YWxpZCBzdG9yZWQgYmxvY2sgbGVuZ3RocwAlcyVzJXMAYnVmZmVyIGVycm9yAE5vIGVycm9yAHN0cmVhbSBlcnJvcgBUZWxsIGVycm9yAEludGVybmFsIGVycm9yAFNlZWsgZXJyb3IAV3JpdGUgZXJyb3IAZmlsZSBlcnJvcgBSZWFkIGVycm9yAFpsaWIgZXJyb3IAZGF0YSBlcnJvcgBDUkMgZXJyb3IAaW5jb21wYXRpYmxlIHZlcnNpb24AaW52YWxpZCBjb2RlIC0tIG1pc3NpbmcgZW5kLW9mLWJsb2NrAGluY29ycmVjdCBoZWFkZXIgY2hlY2sAaW5jb3JyZWN0IGxlbmd0aCBjaGVjawBpbmNvcnJlY3QgZGF0YSBjaGVjawBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjawBoZWFkZXIgY3JjIG1pc21hdGNoADEuMi4xMy56bGliLW5nAGludmFsaWQgd2luZG93IHNpemUAUmVhZC1vbmx5IGFyY2hpdmUATm90IGEgemlwIGFyY2hpdmUAUmVzb3VyY2Ugc3RpbGwgaW4gdXNlAE1hbGxvYyBmYWlsdXJlAGludmFsaWQgYmxvY2sgdHlwZQBGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZQBDYW4ndCBvcGVuIGZpbGUATm8gc3VjaCBmaWxlAFByZW1hdHVyZSBlbmQgb2YgZmlsZQBDYW4ndCByZW1vdmUgZmlsZQBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUAaW52YWxpZCBkaXN0YW5jZSBjb2RlAHVua25vd24gY29tcHJlc3Npb24gbWV0aG9kAHN0cmVhbSBlbmQAQ29tcHJlc3NlZCBkYXRhIGludmFsaWQATXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRl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UgAIANIACAAyAAgAsgAIAHIACADyAAgACgAIAIoACABKAAgAygAIACoACACqAAgAagAIAOoACAAaAAgAmgAIAFoACADaAAgAOgAIALoACAB6AAgA+gAIAAYACACGAAgARgAIAMYACAAmAAgApgAIAGYACADmAAgAFgAIAJYACABWAAgA1gAIADYACAC2AAgAdgAIAPYACAAOAAgAjgAIAE4ACADOAAgALgAIAK4ACABuAAgA7gAIAB4ACACeAAgAXgAIAN4ACAA+AAgAvgAIAH4ACAD+AAgAAQAIAIEACABBAAgAwQAIACEACAChAAgAYQAIAOEACAARAAgAkQAIAFEACADRAAgAMQAIALEACABxAAgA8QAIAAkACACJAAgASQAIAMkACAApAAgAqQAIAGkACADpAAgAGQAIAJkACABZAAgA2QAIADkACAC5AAgAeQAIAPkACAAFAAgAhQAIAEUACADFAAgAJQAIAKUACABlAAgA5QAIABUACACVAAgAVQAIANUACAA1AAgAtQAIAHUACAD1AAgADQAIAI0ACABNAAgAzQAIAC0ACACtAAgAbQAIAO0ACAAdAAgAnQAIAF0ACADdAAgAPQAIAL0ACAB9AAgA/QAIABMACQATAQkAkwAJAJMBCQBTAAkAUwEJANMACQDTAQkAMwAJADMBCQCzAAkAswEJAHMACQBzAQkA8wAJAPMBCQALAAkACwEJAIsACQCLAQkASwAJAEsBCQDLAAkAywEJACsACQArAQkAqwAJAKsBCQBrAAkAawEJAOsACQDrAQkAGwAJABsBCQCbAAkAmwEJAFsACQBbAQkA2wAJANsBCQA7AAkAOwEJALsACQC7AQkAewAJAHsBCQD7AAkA+wEJAAcACQAHAQkAhwAJAIcBCQBHAAkARwEJAMcACQDHAQkAJwAJACcBCQCnAAkApwEJAGcACQBnAQkA5wAJAOcBCQAXAAkAFwEJAJcACQCXAQkAVwAJAFcBCQDXAAkA1wEJADcACQA3AQkAtwAJALcBCQB3AAkAdwEJAPcACQD3AQkADwAJAA8BCQCPAAkAjwEJAE8ACQBPAQkAzwAJAM8BCQAvAAkALwEJAK8ACQCvAQkAbwAJAG8BCQDvAAkA7wEJAB8ACQAfAQkAnwAJAJ8BCQBfAAkAXwEJAN8ACQDfAQkAPwAJAD8BCQC/AAkA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SXMgYSBkaXJlY3RvcnkAVGV4dCBmaWxlIGJ1c3kARXhlYyBmb3JtYXQgZXJyb3IASW52YWxpZCBhcmd1bWVudABBcmd1bWVudCBsaXN0IHRvbyBsb25nAFN5bWJvbGljIGxpbmsgbG9vcABGaWxlbmFtZSB0b28gbG9uZwBUb28gbWFueSBvcGVuIGZpbGVzIGluIHN5c3RlbQBObyBmaWxlIGRlc2NyaXB0b3JzIGF2YWlsYWJsZQBCYWQgZmlsZSBkZXNjcmlwdG9yAE5vIGNoaWxkIHByb2Nlc3MAQmFkIGFkZHJlc3MARmlsZSB0b28gbGFyZ2UAVG9vIG1hbnkgbGlua3MATm8gbG9ja3MgYXZhaWxhYmxlAFJlc291cmNlIGRlYWRsb2NrIHdvdWxkIG9jY3VyAFN0YXRlIG5vdCByZWNvdmVyYWJsZQBQcmV2aW91cyBvd25lciBkaWVkAE9wZXJhdGlvbiBjYW5jZWxlZABGdW5jdGlvbiBub3QgaW1wbGVtZW50ZWQATm8gbWVzc2FnZSBvZiBkZXNpcmVkIHR5cGUASWRlbnRpZmllciByZW1vdmVkAERldmljZSBub3QgYSBzdHJlYW0ATm8gZGF0YSBhdmFpbGFibGUARGV2aWNlIHRpbWVvdXQAT3V0IG9mIHN0cmVhbXMgcmVzb3VyY2VzAExpbmsgaGFzIGJlZW4gc2V2ZXJlZABQcm90b2NvbCBlcnJvcgBCYWQgbWVzc2FnZQBGaWxlIGRlc2NyaXB0b3IgaW4gYmFkIHN0YXRlAE5vdCBhIHNvY2tldABEZXN0aW5hdGlvbiBhZGRyZXNzIHJlcXVpcmVkAE1lc3NhZ2UgdG9vIGxhcmdlAFByb3RvY29sIHdyb25nIHR5cGUgZm9yIHNvY2tldABQcm90b2NvbCBub3QgYXZhaWxhYmxlAFByb3RvY29sIG5vdCBzdXBwb3J0ZWQAU29ja2V0IHR5cGUgbm90IHN1cHBvcnRlZABOb3Qgc3VwcG9ydGVkAFByb3RvY29sIGZhbWlseSBub3Qgc3VwcG9ydGVkAEFkZHJlc3MgZmFtaWx5IG5vdCBzdXBwb3J0ZWQgYnkgcHJvdG9jb2wAQWRkcmVzcyBub3QgYXZhaWxhYmxlAE5ldHdvcmsgaXMgZG93bgBOZXR3b3JrIHVucmVhY2hhYmxlAENvbm5lY3Rpb24gcmVzZXQgYnkgbmV0d29yawBDb25uZWN0aW9uIGFib3J0ZWQATm8gYnVmZmVyIHNwYWNlIGF2YWlsYWJsZQBTb2NrZXQgaXMgY29ubmVjdGVkAFNvY2tldCBub3QgY29ubmVjdGVkAENhbm5vdCBzZW5kIGFmdGVyIHNvY2tldCBzaHV0ZG93bgBPcGVyYXRpb24gYWxyZWFkeSBpbiBwcm9ncmVzcwBPcGVyYXRpb24gaW4gcHJvZ3Jlc3MAU3RhbGUgZmlsZSBoYW5kbGUAUmVtb3RlIEkvTyBlcnJvcgBRdW90YSBleGNlZWRlZABObyBtZWRpdW0gZm91bmQAV3JvbmcgbWVkaXVtIHR5cGUATm8gZXJyb3IgaW5mb3JtYXRpb24AQcCAAQuFARMAAAAUAAAAFQAAABYAAAAXAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAjAAAAgERQADEAAAAyAAAAMwAAADQAAAA1AAAANgAAADcAAAA4AAAAOQAAADIAAAAzAAAANAAAADUAAAA2AAAANwAAADgAQfSCAQsCXEQAQbCDAQsQ/////////////////////w=="; + if (!isDataURI(wasmBinaryFile)) { + wasmBinaryFile = locateFile(wasmBinaryFile); + } + function getBinary(file) { + try { + if (file == wasmBinaryFile && wasmBinary) { + return new Uint8Array(wasmBinary); + } + var binary = tryParseAsDataURI(file); + if (binary) { + return binary; + } + if (readBinary) { + return readBinary(file); + } else { + throw "sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"; + } + } catch (err2) { + abort(err2); + } + } + function instantiateSync(file, info) { + var instance; + var module2; + var binary; + try { + binary = getBinary(file); + module2 = new WebAssembly.Module(binary); + instance = new WebAssembly.Instance(module2, info); + } catch (e) { + var str = e.toString(); + err("failed to compile wasm module: " + str); + if (str.includes("imported Memory") || str.includes("memory import")) { + err( + "Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)." + ); + } + throw e; + } + return [instance, module2]; + } + function createWasm() { + var info = { a: asmLibraryArg }; + function receiveInstance(instance, module2) { + var exports3 = instance.exports; + Module["asm"] = exports3; + wasmMemory = Module["asm"]["g"]; + updateGlobalBufferAndViews(wasmMemory.buffer); + wasmTable = Module["asm"]["W"]; + addOnInit(Module["asm"]["h"]); + removeRunDependency(); + } + addRunDependency(); + if (Module["instantiateWasm"]) { + try { + var exports2 = Module["instantiateWasm"](info, receiveInstance); + return exports2; + } catch (e) { + err("Module.instantiateWasm callback failed with error: " + e); + return false; + } + } + var result = instantiateSync(wasmBinaryFile, info); + receiveInstance(result[0]); + return Module["asm"]; + } + function LE_HEAP_LOAD_F32(byteOffset) { + return HEAP_DATA_VIEW.getFloat32(byteOffset, true); + } + function LE_HEAP_LOAD_F64(byteOffset) { + return HEAP_DATA_VIEW.getFloat64(byteOffset, true); + } + function LE_HEAP_LOAD_I16(byteOffset) { + return HEAP_DATA_VIEW.getInt16(byteOffset, true); + } + function LE_HEAP_LOAD_I32(byteOffset) { + return HEAP_DATA_VIEW.getInt32(byteOffset, true); + } + function LE_HEAP_STORE_I32(byteOffset, value) { + HEAP_DATA_VIEW.setInt32(byteOffset, value, true); + } + function callRuntimeCallbacks(callbacks) { + while (callbacks.length > 0) { + var callback = callbacks.shift(); + if (typeof callback == "function") { + callback(Module); + continue; + } + var func = callback.func; + if (typeof func === "number") { + if (callback.arg === void 0) { + wasmTable.get(func)(); + } else { + wasmTable.get(func)(callback.arg); + } + } else { + func(callback.arg === void 0 ? null : callback.arg); + } + } + } + function _gmtime_r(time, tmPtr) { + var date = new Date(LE_HEAP_LOAD_I32((time >> 2) * 4) * 1e3); + LE_HEAP_STORE_I32((tmPtr >> 2) * 4, date.getUTCSeconds()); + LE_HEAP_STORE_I32((tmPtr + 4 >> 2) * 4, date.getUTCMinutes()); + LE_HEAP_STORE_I32((tmPtr + 8 >> 2) * 4, date.getUTCHours()); + LE_HEAP_STORE_I32((tmPtr + 12 >> 2) * 4, date.getUTCDate()); + LE_HEAP_STORE_I32((tmPtr + 16 >> 2) * 4, date.getUTCMonth()); + LE_HEAP_STORE_I32((tmPtr + 20 >> 2) * 4, date.getUTCFullYear() - 1900); + LE_HEAP_STORE_I32((tmPtr + 24 >> 2) * 4, date.getUTCDay()); + LE_HEAP_STORE_I32((tmPtr + 36 >> 2) * 4, 0); + LE_HEAP_STORE_I32((tmPtr + 32 >> 2) * 4, 0); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = (date.getTime() - start) / (1e3 * 60 * 60 * 24) | 0; + LE_HEAP_STORE_I32((tmPtr + 28 >> 2) * 4, yday); + if (!_gmtime_r.GMTString) + _gmtime_r.GMTString = allocateUTF8("GMT"); + LE_HEAP_STORE_I32((tmPtr + 40 >> 2) * 4, _gmtime_r.GMTString); + return tmPtr; + } + function ___gmtime_r(a0, a1) { + return _gmtime_r(a0, a1); + } + function _emscripten_memcpy_big(dest, src, num) { + HEAPU8.copyWithin(dest, src, src + num); + } + function emscripten_realloc_buffer(size) { + try { + wasmMemory.grow(size - buffer.byteLength + 65535 >>> 16); + updateGlobalBufferAndViews(wasmMemory.buffer); + return 1; + } catch (e) { + } + } + function _emscripten_resize_heap(requestedSize) { + var oldSize = HEAPU8.length; + requestedSize = requestedSize >>> 0; + var maxHeapSize = 2147483648; + if (requestedSize > maxHeapSize) { + return false; + } + for (var cutDown = 1; cutDown <= 4; cutDown *= 2) { + var overGrownHeapSize = oldSize * (1 + 0.2 / cutDown); + overGrownHeapSize = Math.min( + overGrownHeapSize, + requestedSize + 100663296 + ); + var newSize = Math.min( + maxHeapSize, + alignUp(Math.max(requestedSize, overGrownHeapSize), 65536) + ); + var replacement = emscripten_realloc_buffer(newSize); + if (replacement) { + return true; + } + } + return false; + } + function _setTempRet0(val) { + } + function _time(ptr) { + var ret = Date.now() / 1e3 | 0; + if (ptr) { + LE_HEAP_STORE_I32((ptr >> 2) * 4, ret); + } + return ret; + } + function _tzset() { + if (_tzset.called) + return; + _tzset.called = true; + var currentYear = new Date().getFullYear(); + var winter = new Date(currentYear, 0, 1); + var summer = new Date(currentYear, 6, 1); + var winterOffset = winter.getTimezoneOffset(); + var summerOffset = summer.getTimezoneOffset(); + var stdTimezoneOffset = Math.max(winterOffset, summerOffset); + LE_HEAP_STORE_I32((__get_timezone() >> 2) * 4, stdTimezoneOffset * 60); + LE_HEAP_STORE_I32( + (__get_daylight() >> 2) * 4, + Number(winterOffset != summerOffset) + ); + function extractZone(date) { + var match = date.toTimeString().match(/\(([A-Za-z ]+)\)$/); + return match ? match[1] : "GMT"; + } + var winterName = extractZone(winter); + var summerName = extractZone(summer); + var winterNamePtr = allocateUTF8(winterName); + var summerNamePtr = allocateUTF8(summerName); + if (summerOffset < winterOffset) { + LE_HEAP_STORE_I32((__get_tzname() >> 2) * 4, winterNamePtr); + LE_HEAP_STORE_I32((__get_tzname() + 4 >> 2) * 4, summerNamePtr); + } else { + LE_HEAP_STORE_I32((__get_tzname() >> 2) * 4, summerNamePtr); + LE_HEAP_STORE_I32((__get_tzname() + 4 >> 2) * 4, winterNamePtr); + } + } + function _timegm(tmPtr) { + _tzset(); + var time = Date.UTC( + LE_HEAP_LOAD_I32((tmPtr + 20 >> 2) * 4) + 1900, + LE_HEAP_LOAD_I32((tmPtr + 16 >> 2) * 4), + LE_HEAP_LOAD_I32((tmPtr + 12 >> 2) * 4), + LE_HEAP_LOAD_I32((tmPtr + 8 >> 2) * 4), + LE_HEAP_LOAD_I32((tmPtr + 4 >> 2) * 4), + LE_HEAP_LOAD_I32((tmPtr >> 2) * 4), + 0 + ); + var date = new Date(time); + LE_HEAP_STORE_I32((tmPtr + 24 >> 2) * 4, date.getUTCDay()); + var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0); + var yday = (date.getTime() - start) / (1e3 * 60 * 60 * 24) | 0; + LE_HEAP_STORE_I32((tmPtr + 28 >> 2) * 4, yday); + return date.getTime() / 1e3 | 0; + } + function intArrayFromBase64(s) { + { + var buf; + try { + buf = Buffer.from(s, "base64"); + } catch (_) { + buf = new Buffer(s, "base64"); + } + return new Uint8Array( + buf["buffer"], + buf["byteOffset"], + buf["byteLength"] + ); + } + } + function tryParseAsDataURI(filename) { + if (!isDataURI(filename)) { + return; + } + return intArrayFromBase64(filename.slice(dataURIPrefix.length)); + } + var asmLibraryArg = { + e: ___gmtime_r, + c: _emscripten_memcpy_big, + d: _emscripten_resize_heap, + a: _setTempRet0, + b: _time, + f: _timegm + }; + var asm = createWasm(); + Module["___wasm_call_ctors"] = asm["h"]; + Module["_zip_ext_count_symlinks"] = asm["i"]; + Module["_zip_file_get_external_attributes"] = asm["j"]; + Module["_zipstruct_statS"] = asm["k"]; + Module["_zipstruct_stat_size"] = asm["l"]; + Module["_zipstruct_stat_mtime"] = asm["m"]; + Module["_zipstruct_stat_crc"] = asm["n"]; + Module["_zipstruct_errorS"] = asm["o"]; + Module["_zipstruct_error_code_zip"] = asm["p"]; + Module["_zipstruct_stat_comp_size"] = asm["q"]; + Module["_zipstruct_stat_comp_method"] = asm["r"]; + Module["_zip_close"] = asm["s"]; + Module["_zip_delete"] = asm["t"]; + Module["_zip_dir_add"] = asm["u"]; + Module["_zip_discard"] = asm["v"]; + Module["_zip_error_init_with_code"] = asm["w"]; + Module["_zip_get_error"] = asm["x"]; + Module["_zip_file_get_error"] = asm["y"]; + Module["_zip_error_strerror"] = asm["z"]; + Module["_zip_fclose"] = asm["A"]; + Module["_zip_file_add"] = asm["B"]; + Module["_free"] = asm["C"]; + var _malloc = Module["_malloc"] = asm["D"]; + Module["_zip_source_error"] = asm["E"]; + Module["_zip_source_seek"] = asm["F"]; + Module["_zip_file_set_external_attributes"] = asm["G"]; + Module["_zip_file_set_mtime"] = asm["H"]; + Module["_zip_fopen_index"] = asm["I"]; + Module["_zip_fread"] = asm["J"]; + Module["_zip_get_name"] = asm["K"]; + Module["_zip_get_num_entries"] = asm["L"]; + Module["_zip_source_read"] = asm["M"]; + Module["_zip_name_locate"] = asm["N"]; + Module["_zip_open_from_source"] = asm["O"]; + Module["_zip_set_file_compression"] = asm["P"]; + Module["_zip_source_buffer"] = asm["Q"]; + Module["_zip_source_buffer_create"] = asm["R"]; + Module["_zip_source_close"] = asm["S"]; + Module["_zip_source_free"] = asm["T"]; + Module["_zip_source_keep"] = asm["U"]; + Module["_zip_source_open"] = asm["V"]; + Module["_zip_source_tell"] = asm["X"]; + Module["_zip_stat_index"] = asm["Y"]; + var __get_tzname = Module["__get_tzname"] = asm["Z"]; + var __get_daylight = Module["__get_daylight"] = asm["_"]; + var __get_timezone = Module["__get_timezone"] = asm["$"]; + var stackSave = Module["stackSave"] = asm["aa"]; + var stackRestore = Module["stackRestore"] = asm["ba"]; + var stackAlloc = Module["stackAlloc"] = asm["ca"]; + Module["cwrap"] = cwrap; + Module["getValue"] = getValue; + var calledRun; + dependenciesFulfilled = function runCaller() { + if (!calledRun) + run(); + if (!calledRun) + dependenciesFulfilled = runCaller; + }; + function run(args) { + if (runDependencies > 0) { + return; + } + preRun(); + if (runDependencies > 0) { + return; + } + function doRun() { + if (calledRun) + return; + calledRun = true; + Module["calledRun"] = true; + if (ABORT) + return; + initRuntime(); + readyPromiseResolve(Module); + if (Module["onRuntimeInitialized"]) + Module["onRuntimeInitialized"](); + postRun(); + } + if (Module["setStatus"]) { + Module["setStatus"]("Running..."); + setTimeout(function() { + setTimeout(function() { + Module["setStatus"](""); + }, 1); + doRun(); + }, 1); + } else { + doRun(); + } + } + Module["run"] = run; + if (Module["preInit"]) { + if (typeof Module["preInit"] == "function") + Module["preInit"] = [Module["preInit"]]; + while (Module["preInit"].length > 0) { + Module["preInit"].pop()(); + } + } + run(); + return createModule2; + }; +}(); +module.exports = createModule; +}(libzipSync)); + +const createModule = libzipSync.exports; + +const number64 = [ + `number`, + `number` +]; +var Errors = /* @__PURE__ */ ((Errors2) => { + Errors2[Errors2["ZIP_ER_OK"] = 0] = "ZIP_ER_OK"; + Errors2[Errors2["ZIP_ER_MULTIDISK"] = 1] = "ZIP_ER_MULTIDISK"; + Errors2[Errors2["ZIP_ER_RENAME"] = 2] = "ZIP_ER_RENAME"; + Errors2[Errors2["ZIP_ER_CLOSE"] = 3] = "ZIP_ER_CLOSE"; + Errors2[Errors2["ZIP_ER_SEEK"] = 4] = "ZIP_ER_SEEK"; + Errors2[Errors2["ZIP_ER_READ"] = 5] = "ZIP_ER_READ"; + Errors2[Errors2["ZIP_ER_WRITE"] = 6] = "ZIP_ER_WRITE"; + Errors2[Errors2["ZIP_ER_CRC"] = 7] = "ZIP_ER_CRC"; + Errors2[Errors2["ZIP_ER_ZIPCLOSED"] = 8] = "ZIP_ER_ZIPCLOSED"; + Errors2[Errors2["ZIP_ER_NOENT"] = 9] = "ZIP_ER_NOENT"; + Errors2[Errors2["ZIP_ER_EXISTS"] = 10] = "ZIP_ER_EXISTS"; + Errors2[Errors2["ZIP_ER_OPEN"] = 11] = "ZIP_ER_OPEN"; + Errors2[Errors2["ZIP_ER_TMPOPEN"] = 12] = "ZIP_ER_TMPOPEN"; + Errors2[Errors2["ZIP_ER_ZLIB"] = 13] = "ZIP_ER_ZLIB"; + Errors2[Errors2["ZIP_ER_MEMORY"] = 14] = "ZIP_ER_MEMORY"; + Errors2[Errors2["ZIP_ER_CHANGED"] = 15] = "ZIP_ER_CHANGED"; + Errors2[Errors2["ZIP_ER_COMPNOTSUPP"] = 16] = "ZIP_ER_COMPNOTSUPP"; + Errors2[Errors2["ZIP_ER_EOF"] = 17] = "ZIP_ER_EOF"; + Errors2[Errors2["ZIP_ER_INVAL"] = 18] = "ZIP_ER_INVAL"; + Errors2[Errors2["ZIP_ER_NOZIP"] = 19] = "ZIP_ER_NOZIP"; + Errors2[Errors2["ZIP_ER_INTERNAL"] = 20] = "ZIP_ER_INTERNAL"; + Errors2[Errors2["ZIP_ER_INCONS"] = 21] = "ZIP_ER_INCONS"; + Errors2[Errors2["ZIP_ER_REMOVE"] = 22] = "ZIP_ER_REMOVE"; + Errors2[Errors2["ZIP_ER_DELETED"] = 23] = "ZIP_ER_DELETED"; + Errors2[Errors2["ZIP_ER_ENCRNOTSUPP"] = 24] = "ZIP_ER_ENCRNOTSUPP"; + Errors2[Errors2["ZIP_ER_RDONLY"] = 25] = "ZIP_ER_RDONLY"; + Errors2[Errors2["ZIP_ER_NOPASSWD"] = 26] = "ZIP_ER_NOPASSWD"; + Errors2[Errors2["ZIP_ER_WRONGPASSWD"] = 27] = "ZIP_ER_WRONGPASSWD"; + Errors2[Errors2["ZIP_ER_OPNOTSUPP"] = 28] = "ZIP_ER_OPNOTSUPP"; + Errors2[Errors2["ZIP_ER_INUSE"] = 29] = "ZIP_ER_INUSE"; + Errors2[Errors2["ZIP_ER_TELL"] = 30] = "ZIP_ER_TELL"; + Errors2[Errors2["ZIP_ER_COMPRESSED_DATA"] = 31] = "ZIP_ER_COMPRESSED_DATA"; + return Errors2; +})(Errors || {}); +const makeInterface = (emZip) => ({ + get HEAPU8() { + return emZip.HEAPU8; + }, + errors: Errors, + SEEK_SET: 0, + SEEK_CUR: 1, + SEEK_END: 2, + ZIP_CHECKCONS: 4, + ZIP_EXCL: 2, + ZIP_RDONLY: 16, + ZIP_FL_OVERWRITE: 8192, + ZIP_FL_COMPRESSED: 4, + ZIP_OPSYS_DOS: 0, + ZIP_OPSYS_AMIGA: 1, + ZIP_OPSYS_OPENVMS: 2, + ZIP_OPSYS_UNIX: 3, + ZIP_OPSYS_VM_CMS: 4, + ZIP_OPSYS_ATARI_ST: 5, + ZIP_OPSYS_OS_2: 6, + ZIP_OPSYS_MACINTOSH: 7, + ZIP_OPSYS_Z_SYSTEM: 8, + ZIP_OPSYS_CPM: 9, + ZIP_OPSYS_WINDOWS_NTFS: 10, + ZIP_OPSYS_MVS: 11, + ZIP_OPSYS_VSE: 12, + ZIP_OPSYS_ACORN_RISC: 13, + ZIP_OPSYS_VFAT: 14, + ZIP_OPSYS_ALTERNATE_MVS: 15, + ZIP_OPSYS_BEOS: 16, + ZIP_OPSYS_TANDEM: 17, + ZIP_OPSYS_OS_400: 18, + ZIP_OPSYS_OS_X: 19, + ZIP_CM_DEFAULT: -1, + ZIP_CM_STORE: 0, + ZIP_CM_DEFLATE: 8, + uint08S: emZip._malloc(1), + uint32S: emZip._malloc(4), + malloc: emZip._malloc, + free: emZip._free, + getValue: emZip.getValue, + openFromSource: emZip.cwrap(`zip_open_from_source`, `number`, [`number`, `number`, `number`]), + close: emZip.cwrap(`zip_close`, `number`, [`number`]), + discard: emZip.cwrap(`zip_discard`, null, [`number`]), + getError: emZip.cwrap(`zip_get_error`, `number`, [`number`]), + getName: emZip.cwrap(`zip_get_name`, `string`, [`number`, `number`, `number`]), + getNumEntries: emZip.cwrap(`zip_get_num_entries`, `number`, [`number`, `number`]), + delete: emZip.cwrap(`zip_delete`, `number`, [`number`, `number`]), + statIndex: emZip.cwrap(`zip_stat_index`, `number`, [`number`, ...number64, `number`, `number`]), + fopenIndex: emZip.cwrap(`zip_fopen_index`, `number`, [`number`, ...number64, `number`]), + fread: emZip.cwrap(`zip_fread`, `number`, [`number`, `number`, `number`, `number`]), + fclose: emZip.cwrap(`zip_fclose`, `number`, [`number`]), + dir: { + add: emZip.cwrap(`zip_dir_add`, `number`, [`number`, `string`]) + }, + file: { + add: emZip.cwrap(`zip_file_add`, `number`, [`number`, `string`, `number`, `number`]), + getError: emZip.cwrap(`zip_file_get_error`, `number`, [`number`]), + getExternalAttributes: emZip.cwrap(`zip_file_get_external_attributes`, `number`, [`number`, ...number64, `number`, `number`, `number`]), + setExternalAttributes: emZip.cwrap(`zip_file_set_external_attributes`, `number`, [`number`, ...number64, `number`, `number`, `number`]), + setMtime: emZip.cwrap(`zip_file_set_mtime`, `number`, [`number`, ...number64, `number`, `number`]), + setCompression: emZip.cwrap(`zip_set_file_compression`, `number`, [`number`, ...number64, `number`, `number`]) + }, + ext: { + countSymlinks: emZip.cwrap(`zip_ext_count_symlinks`, `number`, [`number`]) + }, + error: { + initWithCode: emZip.cwrap(`zip_error_init_with_code`, null, [`number`, `number`]), + strerror: emZip.cwrap(`zip_error_strerror`, `string`, [`number`]) + }, + name: { + locate: emZip.cwrap(`zip_name_locate`, `number`, [`number`, `string`, `number`]) + }, + source: { + fromUnattachedBuffer: emZip.cwrap(`zip_source_buffer_create`, `number`, [`number`, ...number64, `number`, `number`]), + fromBuffer: emZip.cwrap(`zip_source_buffer`, `number`, [`number`, `number`, ...number64, `number`]), + free: emZip.cwrap(`zip_source_free`, null, [`number`]), + keep: emZip.cwrap(`zip_source_keep`, null, [`number`]), + open: emZip.cwrap(`zip_source_open`, `number`, [`number`]), + close: emZip.cwrap(`zip_source_close`, `number`, [`number`]), + seek: emZip.cwrap(`zip_source_seek`, `number`, [`number`, ...number64, `number`]), + tell: emZip.cwrap(`zip_source_tell`, `number`, [`number`]), + read: emZip.cwrap(`zip_source_read`, `number`, [`number`, `number`, `number`]), + error: emZip.cwrap(`zip_source_error`, `number`, [`number`]) + }, + struct: { + statS: emZip.cwrap(`zipstruct_statS`, `number`, []), + statSize: emZip.cwrap(`zipstruct_stat_size`, `number`, [`number`]), + statCompSize: emZip.cwrap(`zipstruct_stat_comp_size`, `number`, [`number`]), + statCompMethod: emZip.cwrap(`zipstruct_stat_comp_method`, `number`, [`number`]), + statMtime: emZip.cwrap(`zipstruct_stat_mtime`, `number`, [`number`]), + statCrc: emZip.cwrap(`zipstruct_stat_crc`, `number`, [`number`]), + errorS: emZip.cwrap(`zipstruct_errorS`, `number`, []), + errorCodeZip: emZip.cwrap(`zipstruct_error_code_zip`, `number`, [`number`]) + } +}); + +function getArchivePart(path, extension) { + let idx = path.indexOf(extension); + if (idx <= 0) + return null; + let nextCharIdx = idx; + while (idx >= 0) { + nextCharIdx = idx + extension.length; + if (path[nextCharIdx] === ppath.sep) + break; + if (path[idx - 1] === ppath.sep) + return null; + idx = path.indexOf(extension, nextCharIdx); + } + if (path.length > nextCharIdx && path[nextCharIdx] !== ppath.sep) + return null; + return path.slice(0, nextCharIdx); +} +class ZipOpenFS extends MountFS { + static async openPromise(fn, opts) { + const zipOpenFs = new ZipOpenFS(opts); + try { + return await fn(zipOpenFs); + } finally { + zipOpenFs.saveAndClose(); + } + } + constructor(opts = {}) { + const fileExtensions = opts.fileExtensions; + const readOnlyArchives = opts.readOnlyArchives; + const getMountPoint = typeof fileExtensions === `undefined` ? (path) => getArchivePart(path, `.zip`) : (path) => { + for (const extension of fileExtensions) { + const result = getArchivePart(path, extension); + if (result) { + return result; + } + } + return null; + }; + const factorySync = (baseFs, p) => { + return new ZipFS(p, { + baseFs, + readOnly: readOnlyArchives, + stats: baseFs.statSync(p) + }); + }; + const factoryPromise = async (baseFs, p) => { + const zipOptions = { + baseFs, + readOnly: readOnlyArchives, + stats: await baseFs.statPromise(p) + }; + return () => { + return new ZipFS(p, zipOptions); + }; + }; + super({ + ...opts, + factorySync, + factoryPromise, + getMountPoint + }); + } +} + +const DEFAULT_COMPRESSION_LEVEL = `mixed`; +function toUnixTimestamp(time) { + if (typeof time === `string` && String(+time) === time) + return +time; + if (typeof time === `number` && Number.isFinite(time)) { + if (time < 0) { + return Date.now() / 1e3; + } else { + return time; + } + } + if (nodeUtils.types.isDate(time)) + return time.getTime() / 1e3; + throw new Error(`Invalid time`); +} +function makeEmptyArchive() { + return Buffer.from([ + 80, + 75, + 5, + 6, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0 + ]); +} +class LibzipError extends Error { + constructor(message, code) { + super(message); + this.name = `Libzip Error`; + this.code = code; + } +} +class ZipFS extends BasePortableFakeFS { + constructor(source, opts = {}) { + super(); + this.listings = /* @__PURE__ */ new Map(); + this.entries = /* @__PURE__ */ new Map(); + this.fileSources = /* @__PURE__ */ new Map(); + this.fds = /* @__PURE__ */ new Map(); + this.nextFd = 0; + this.ready = false; + this.readOnly = false; + const pathOptions = opts; + this.level = typeof pathOptions.level !== `undefined` ? pathOptions.level : DEFAULT_COMPRESSION_LEVEL; + source ??= makeEmptyArchive(); + if (typeof source === `string`) { + const { baseFs = new NodeFS() } = pathOptions; + this.baseFs = baseFs; + this.path = source; + } else { + this.path = null; + this.baseFs = null; + } + if (opts.stats) { + this.stats = opts.stats; + } else { + if (typeof source === `string`) { + try { + this.stats = this.baseFs.statSync(source); + } catch (error) { + if (error.code === `ENOENT` && pathOptions.create) { + this.stats = makeDefaultStats(); + } else { + throw error; + } + } + } else { + this.stats = makeDefaultStats(); + } + } + this.libzip = getInstance(); + const errPtr = this.libzip.malloc(4); + try { + let flags = 0; + if (opts.readOnly) { + flags |= this.libzip.ZIP_RDONLY; + this.readOnly = true; + } + if (typeof source === `string`) + source = pathOptions.create ? makeEmptyArchive() : this.baseFs.readFileSync(source); + const lzSource = this.allocateUnattachedSource(source); + try { + this.zip = this.libzip.openFromSource(lzSource, flags, errPtr); + this.lzSource = lzSource; + } catch (error) { + this.libzip.source.free(lzSource); + throw error; + } + if (this.zip === 0) { + const error = this.libzip.struct.errorS(); + this.libzip.error.initWithCode(error, this.libzip.getValue(errPtr, `i32`)); + throw this.makeLibzipError(error); + } + } finally { + this.libzip.free(errPtr); + } + this.listings.set(PortablePath.root, /* @__PURE__ */ new Set()); + const entryCount = this.libzip.getNumEntries(this.zip, 0); + for (let t = 0; t < entryCount; ++t) { + const raw = this.libzip.getName(this.zip, t, 0); + if (ppath.isAbsolute(raw)) + continue; + const p = ppath.resolve(PortablePath.root, raw); + this.registerEntry(p, t); + if (raw.endsWith(`/`)) { + this.registerListing(p); + } + } + this.symlinkCount = this.libzip.ext.countSymlinks(this.zip); + if (this.symlinkCount === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + this.ready = true; + } + makeLibzipError(error) { + const errorCode = this.libzip.struct.errorCodeZip(error); + const strerror = this.libzip.error.strerror(error); + const libzipError = new LibzipError(strerror, this.libzip.errors[errorCode]); + if (errorCode === this.libzip.errors.ZIP_ER_CHANGED) + throw new Error(`Assertion failed: Unexpected libzip error: ${libzipError.message}`); + return libzipError; + } + getExtractHint(hints) { + for (const fileName of this.entries.keys()) { + const ext = this.pathUtils.extname(fileName); + if (hints.relevantExtensions.has(ext)) { + return true; + } + } + return false; + } + getAllFiles() { + return Array.from(this.entries.keys()); + } + getRealPath() { + if (!this.path) + throw new Error(`ZipFS don't have real paths when loaded from a buffer`); + return this.path; + } + prepareClose() { + if (!this.ready) + throw EBUSY(`archive closed, close`); + unwatchAllFiles(this); + } + getBufferAndClose() { + this.prepareClose(); + if (this.entries.size === 0) { + this.discardAndClose(); + return makeEmptyArchive(); + } + try { + this.libzip.source.keep(this.lzSource); + if (this.libzip.close(this.zip) === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + if (this.libzip.source.open(this.lzSource) === -1) + throw this.makeLibzipError(this.libzip.source.error(this.lzSource)); + if (this.libzip.source.seek(this.lzSource, 0, 0, this.libzip.SEEK_END) === -1) + throw this.makeLibzipError(this.libzip.source.error(this.lzSource)); + const size = this.libzip.source.tell(this.lzSource); + if (size === -1) + throw this.makeLibzipError(this.libzip.source.error(this.lzSource)); + if (this.libzip.source.seek(this.lzSource, 0, 0, this.libzip.SEEK_SET) === -1) + throw this.makeLibzipError(this.libzip.source.error(this.lzSource)); + const buffer = this.libzip.malloc(size); + if (!buffer) + throw new Error(`Couldn't allocate enough memory`); + try { + const rc = this.libzip.source.read(this.lzSource, buffer, size); + if (rc === -1) + throw this.makeLibzipError(this.libzip.source.error(this.lzSource)); + else if (rc < size) + throw new Error(`Incomplete read`); + else if (rc > size) + throw new Error(`Overread`); + const memory = this.libzip.HEAPU8.subarray(buffer, buffer + size); + return Buffer.from(memory); + } finally { + this.libzip.free(buffer); + } + } finally { + this.libzip.source.close(this.lzSource); + this.libzip.source.free(this.lzSource); + this.ready = false; + } + } + discardAndClose() { + this.prepareClose(); + this.libzip.discard(this.zip); + this.ready = false; + } + saveAndClose() { + if (!this.path || !this.baseFs) + throw new Error(`ZipFS cannot be saved and must be discarded when loaded from a buffer`); + if (this.readOnly) { + this.discardAndClose(); + return; + } + const newMode = this.baseFs.existsSync(this.path) || this.stats.mode === DEFAULT_MODE ? void 0 : this.stats.mode; + this.baseFs.writeFileSync(this.path, this.getBufferAndClose(), { mode: newMode }); + this.ready = false; + } + resolve(p) { + return ppath.resolve(PortablePath.root, p); + } + async openPromise(p, flags, mode) { + return this.openSync(p, flags, mode); + } + openSync(p, flags, mode) { + const fd = this.nextFd++; + this.fds.set(fd, { cursor: 0, p }); + return fd; + } + hasOpenFileHandles() { + return !!this.fds.size; + } + async opendirPromise(p, opts) { + return this.opendirSync(p, opts); + } + opendirSync(p, opts = {}) { + const resolvedP = this.resolveFilename(`opendir '${p}'`, p); + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) + throw ENOENT(`opendir '${p}'`); + const directoryListing = this.listings.get(resolvedP); + if (!directoryListing) + throw ENOTDIR(`opendir '${p}'`); + const entries = [...directoryListing]; + const fd = this.openSync(resolvedP, `r`); + const onClose = () => { + this.closeSync(fd); + }; + return opendir(this, resolvedP, entries, { onClose }); + } + async readPromise(fd, buffer, offset, length, position) { + return this.readSync(fd, buffer, offset, length, position); + } + readSync(fd, buffer, offset = 0, length = buffer.byteLength, position = -1) { + const entry = this.fds.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`read`); + const realPosition = position === -1 || position === null ? entry.cursor : position; + const source = this.readFileSync(entry.p); + source.copy(buffer, offset, realPosition, realPosition + length); + const bytesRead = Math.max(0, Math.min(source.length - realPosition, length)); + if (position === -1 || position === null) + entry.cursor += bytesRead; + return bytesRead; + } + async writePromise(fd, buffer, offset, length, position) { + if (typeof buffer === `string`) { + return this.writeSync(fd, buffer, position); + } else { + return this.writeSync(fd, buffer, offset, length, position); + } + } + writeSync(fd, buffer, offset, length, position) { + const entry = this.fds.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`read`); + throw new Error(`Unimplemented`); + } + async closePromise(fd) { + return this.closeSync(fd); + } + closeSync(fd) { + const entry = this.fds.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`read`); + this.fds.delete(fd); + } + createReadStream(p, { encoding } = {}) { + if (p === null) + throw new Error(`Unimplemented`); + const fd = this.openSync(p, `r`); + const stream$1 = Object.assign( + new stream.PassThrough({ + emitClose: true, + autoDestroy: true, + destroy: (error, callback) => { + clearImmediate(immediate); + this.closeSync(fd); + callback(error); + } + }), + { + close() { + stream$1.destroy(); + }, + bytesRead: 0, + path: p, + pending: false + } + ); + const immediate = setImmediate(async () => { + try { + const data = await this.readFilePromise(p, encoding); + stream$1.bytesRead = data.length; + stream$1.end(data); + } catch (error) { + stream$1.destroy(error); + } + }); + return stream$1; + } + createWriteStream(p, { encoding } = {}) { + if (this.readOnly) + throw EROFS(`open '${p}'`); + if (p === null) + throw new Error(`Unimplemented`); + const chunks = []; + const fd = this.openSync(p, `w`); + const stream$1 = Object.assign( + new stream.PassThrough({ + autoDestroy: true, + emitClose: true, + destroy: (error, callback) => { + try { + if (error) { + callback(error); + } else { + this.writeFileSync(p, Buffer.concat(chunks), encoding); + callback(null); + } + } catch (err) { + callback(err); + } finally { + this.closeSync(fd); + } + } + }), + { + close() { + stream$1.destroy(); + }, + bytesWritten: 0, + path: p, + pending: false + } + ); + stream$1.on(`data`, (chunk) => { + const chunkBuffer = Buffer.from(chunk); + stream$1.bytesWritten += chunkBuffer.length; + chunks.push(chunkBuffer); + }); + return stream$1; + } + async realpathPromise(p) { + return this.realpathSync(p); + } + realpathSync(p) { + const resolvedP = this.resolveFilename(`lstat '${p}'`, p); + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) + throw ENOENT(`lstat '${p}'`); + return resolvedP; + } + async existsPromise(p) { + return this.existsSync(p); + } + existsSync(p) { + if (!this.ready) + throw EBUSY(`archive closed, existsSync '${p}'`); + if (this.symlinkCount === 0) { + const resolvedP2 = ppath.resolve(PortablePath.root, p); + return this.entries.has(resolvedP2) || this.listings.has(resolvedP2); + } + let resolvedP; + try { + resolvedP = this.resolveFilename(`stat '${p}'`, p, void 0, false); + } catch (error) { + return false; + } + if (resolvedP === void 0) + return false; + return this.entries.has(resolvedP) || this.listings.has(resolvedP); + } + async accessPromise(p, mode) { + return this.accessSync(p, mode); + } + accessSync(p, mode = fs.constants.F_OK) { + const resolvedP = this.resolveFilename(`access '${p}'`, p); + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) + throw ENOENT(`access '${p}'`); + if (this.readOnly && mode & fs.constants.W_OK) { + throw EROFS(`access '${p}'`); + } + } + async statPromise(p, opts = { bigint: false }) { + if (opts.bigint) + return this.statSync(p, { bigint: true }); + return this.statSync(p); + } + statSync(p, opts = { bigint: false, throwIfNoEntry: true }) { + const resolvedP = this.resolveFilename(`stat '${p}'`, p, void 0, opts.throwIfNoEntry); + if (resolvedP === void 0) + return void 0; + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) { + if (opts.throwIfNoEntry === false) + return void 0; + throw ENOENT(`stat '${p}'`); + } + if (p[p.length - 1] === `/` && !this.listings.has(resolvedP)) + throw ENOTDIR(`stat '${p}'`); + return this.statImpl(`stat '${p}'`, resolvedP, opts); + } + async fstatPromise(fd, opts) { + return this.fstatSync(fd, opts); + } + fstatSync(fd, opts) { + const entry = this.fds.get(fd); + if (typeof entry === `undefined`) + throw EBADF(`fstatSync`); + const { p } = entry; + const resolvedP = this.resolveFilename(`stat '${p}'`, p); + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) + throw ENOENT(`stat '${p}'`); + if (p[p.length - 1] === `/` && !this.listings.has(resolvedP)) + throw ENOTDIR(`stat '${p}'`); + return this.statImpl(`fstat '${p}'`, resolvedP, opts); + } + async lstatPromise(p, opts = { bigint: false }) { + if (opts.bigint) + return this.lstatSync(p, { bigint: true }); + return this.lstatSync(p); + } + lstatSync(p, opts = { bigint: false, throwIfNoEntry: true }) { + const resolvedP = this.resolveFilename(`lstat '${p}'`, p, false, opts.throwIfNoEntry); + if (resolvedP === void 0) + return void 0; + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) { + if (opts.throwIfNoEntry === false) + return void 0; + throw ENOENT(`lstat '${p}'`); + } + if (p[p.length - 1] === `/` && !this.listings.has(resolvedP)) + throw ENOTDIR(`lstat '${p}'`); + return this.statImpl(`lstat '${p}'`, resolvedP, opts); + } + statImpl(reason, p, opts = {}) { + const entry = this.entries.get(p); + if (typeof entry !== `undefined`) { + const stat = this.libzip.struct.statS(); + const rc = this.libzip.statIndex(this.zip, entry, 0, 0, stat); + if (rc === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + const uid = this.stats.uid; + const gid = this.stats.gid; + const size = this.libzip.struct.statSize(stat) >>> 0; + const blksize = 512; + const blocks = Math.ceil(size / blksize); + const mtimeMs = (this.libzip.struct.statMtime(stat) >>> 0) * 1e3; + const atimeMs = mtimeMs; + const birthtimeMs = mtimeMs; + const ctimeMs = mtimeMs; + const atime = new Date(atimeMs); + const birthtime = new Date(birthtimeMs); + const ctime = new Date(ctimeMs); + const mtime = new Date(mtimeMs); + const type = this.listings.has(p) ? fs.constants.S_IFDIR : this.isSymbolicLink(entry) ? fs.constants.S_IFLNK : fs.constants.S_IFREG; + const defaultMode = type === fs.constants.S_IFDIR ? 493 : 420; + const mode = type | this.getUnixMode(entry, defaultMode) & 511; + const crc = this.libzip.struct.statCrc(stat); + const statInstance = Object.assign(new StatEntry(), { uid, gid, size, blksize, blocks, atime, birthtime, ctime, mtime, atimeMs, birthtimeMs, ctimeMs, mtimeMs, mode, crc }); + return opts.bigint === true ? convertToBigIntStats(statInstance) : statInstance; + } + if (this.listings.has(p)) { + const uid = this.stats.uid; + const gid = this.stats.gid; + const size = 0; + const blksize = 512; + const blocks = 0; + const atimeMs = this.stats.mtimeMs; + const birthtimeMs = this.stats.mtimeMs; + const ctimeMs = this.stats.mtimeMs; + const mtimeMs = this.stats.mtimeMs; + const atime = new Date(atimeMs); + const birthtime = new Date(birthtimeMs); + const ctime = new Date(ctimeMs); + const mtime = new Date(mtimeMs); + const mode = fs.constants.S_IFDIR | 493; + const crc = 0; + const statInstance = Object.assign(new StatEntry(), { uid, gid, size, blksize, blocks, atime, birthtime, ctime, mtime, atimeMs, birthtimeMs, ctimeMs, mtimeMs, mode, crc }); + return opts.bigint === true ? convertToBigIntStats(statInstance) : statInstance; + } + throw new Error(`Unreachable`); + } + getUnixMode(index, defaultMode) { + const rc = this.libzip.file.getExternalAttributes(this.zip, index, 0, 0, this.libzip.uint08S, this.libzip.uint32S); + if (rc === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + const opsys = this.libzip.getValue(this.libzip.uint08S, `i8`) >>> 0; + if (opsys !== this.libzip.ZIP_OPSYS_UNIX) + return defaultMode; + return this.libzip.getValue(this.libzip.uint32S, `i32`) >>> 16; + } + registerListing(p) { + const existingListing = this.listings.get(p); + if (existingListing) + return existingListing; + const parentListing = this.registerListing(ppath.dirname(p)); + parentListing.add(ppath.basename(p)); + const newListing = /* @__PURE__ */ new Set(); + this.listings.set(p, newListing); + return newListing; + } + registerEntry(p, index) { + const parentListing = this.registerListing(ppath.dirname(p)); + parentListing.add(ppath.basename(p)); + this.entries.set(p, index); + } + unregisterListing(p) { + this.listings.delete(p); + const parentListing = this.listings.get(ppath.dirname(p)); + parentListing?.delete(ppath.basename(p)); + } + unregisterEntry(p) { + this.unregisterListing(p); + const entry = this.entries.get(p); + this.entries.delete(p); + if (typeof entry === `undefined`) + return; + this.fileSources.delete(entry); + if (this.isSymbolicLink(entry)) { + this.symlinkCount--; + } + } + deleteEntry(p, index) { + this.unregisterEntry(p); + const rc = this.libzip.delete(this.zip, index); + if (rc === -1) { + throw this.makeLibzipError(this.libzip.getError(this.zip)); + } + } + resolveFilename(reason, p, resolveLastComponent = true, throwIfNoEntry = true) { + if (!this.ready) + throw EBUSY(`archive closed, ${reason}`); + let resolvedP = ppath.resolve(PortablePath.root, p); + if (resolvedP === `/`) + return PortablePath.root; + const fileIndex = this.entries.get(resolvedP); + if (resolveLastComponent && fileIndex !== void 0) { + if (this.symlinkCount !== 0 && this.isSymbolicLink(fileIndex)) { + const target = this.getFileSource(fileIndex).toString(); + return this.resolveFilename(reason, ppath.resolve(ppath.dirname(resolvedP), target), true, throwIfNoEntry); + } else { + return resolvedP; + } + } + while (true) { + const parentP = this.resolveFilename(reason, ppath.dirname(resolvedP), true, throwIfNoEntry); + if (parentP === void 0) + return parentP; + const isDir = this.listings.has(parentP); + const doesExist = this.entries.has(parentP); + if (!isDir && !doesExist) { + if (throwIfNoEntry === false) + return void 0; + throw ENOENT(reason); + } + if (!isDir) + throw ENOTDIR(reason); + resolvedP = ppath.resolve(parentP, ppath.basename(resolvedP)); + if (!resolveLastComponent || this.symlinkCount === 0) + break; + const index = this.libzip.name.locate(this.zip, resolvedP.slice(1), 0); + if (index === -1) + break; + if (this.isSymbolicLink(index)) { + const target = this.getFileSource(index).toString(); + resolvedP = ppath.resolve(ppath.dirname(resolvedP), target); + } else { + break; + } + } + return resolvedP; + } + allocateBuffer(content) { + if (!Buffer.isBuffer(content)) + content = Buffer.from(content); + const buffer = this.libzip.malloc(content.byteLength); + if (!buffer) + throw new Error(`Couldn't allocate enough memory`); + const heap = new Uint8Array(this.libzip.HEAPU8.buffer, buffer, content.byteLength); + heap.set(content); + return { buffer, byteLength: content.byteLength }; + } + allocateUnattachedSource(content) { + const error = this.libzip.struct.errorS(); + const { buffer, byteLength } = this.allocateBuffer(content); + const source = this.libzip.source.fromUnattachedBuffer(buffer, byteLength, 0, 1, error); + if (source === 0) { + this.libzip.free(error); + throw this.makeLibzipError(error); + } + return source; + } + allocateSource(content) { + const { buffer, byteLength } = this.allocateBuffer(content); + const source = this.libzip.source.fromBuffer(this.zip, buffer, byteLength, 0, 1); + if (source === 0) { + this.libzip.free(buffer); + throw this.makeLibzipError(this.libzip.getError(this.zip)); + } + return source; + } + setFileSource(p, content) { + const buffer = Buffer.isBuffer(content) ? content : Buffer.from(content); + const target = ppath.relative(PortablePath.root, p); + const lzSource = this.allocateSource(content); + try { + const newIndex = this.libzip.file.add(this.zip, target, lzSource, this.libzip.ZIP_FL_OVERWRITE); + if (newIndex === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + if (this.level !== `mixed`) { + const method = this.level === 0 ? this.libzip.ZIP_CM_STORE : this.libzip.ZIP_CM_DEFLATE; + const rc = this.libzip.file.setCompression(this.zip, newIndex, 0, method, this.level); + if (rc === -1) { + throw this.makeLibzipError(this.libzip.getError(this.zip)); + } + } + this.fileSources.set(newIndex, buffer); + return newIndex; + } catch (error) { + this.libzip.source.free(lzSource); + throw error; + } + } + isSymbolicLink(index) { + if (this.symlinkCount === 0) + return false; + const attrs = this.libzip.file.getExternalAttributes(this.zip, index, 0, 0, this.libzip.uint08S, this.libzip.uint32S); + if (attrs === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + const opsys = this.libzip.getValue(this.libzip.uint08S, `i8`) >>> 0; + if (opsys !== this.libzip.ZIP_OPSYS_UNIX) + return false; + const attributes = this.libzip.getValue(this.libzip.uint32S, `i32`) >>> 16; + return (attributes & fs.constants.S_IFMT) === fs.constants.S_IFLNK; + } + getFileSource(index, opts = { asyncDecompress: false }) { + const cachedFileSource = this.fileSources.get(index); + if (typeof cachedFileSource !== `undefined`) + return cachedFileSource; + const stat = this.libzip.struct.statS(); + const rc = this.libzip.statIndex(this.zip, index, 0, 0, stat); + if (rc === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + const size = this.libzip.struct.statCompSize(stat); + const compressionMethod = this.libzip.struct.statCompMethod(stat); + const buffer = this.libzip.malloc(size); + try { + const file = this.libzip.fopenIndex(this.zip, index, 0, this.libzip.ZIP_FL_COMPRESSED); + if (file === 0) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + try { + const rc2 = this.libzip.fread(file, buffer, size, 0); + if (rc2 === -1) + throw this.makeLibzipError(this.libzip.file.getError(file)); + else if (rc2 < size) + throw new Error(`Incomplete read`); + else if (rc2 > size) + throw new Error(`Overread`); + const memory = this.libzip.HEAPU8.subarray(buffer, buffer + size); + const data = Buffer.from(memory); + if (compressionMethod === 0) { + this.fileSources.set(index, data); + return data; + } else if (opts.asyncDecompress) { + return new Promise((resolve, reject) => { + zlib__default.default.inflateRaw(data, (error, result) => { + if (error) { + reject(error); + } else { + this.fileSources.set(index, result); + resolve(result); + } + }); + }); + } else { + const decompressedData = zlib__default.default.inflateRawSync(data); + this.fileSources.set(index, decompressedData); + return decompressedData; + } + } finally { + this.libzip.fclose(file); + } + } finally { + this.libzip.free(buffer); + } + } + async fchmodPromise(fd, mask) { + return this.chmodPromise(this.fdToPath(fd, `fchmod`), mask); + } + fchmodSync(fd, mask) { + return this.chmodSync(this.fdToPath(fd, `fchmodSync`), mask); + } + async chmodPromise(p, mask) { + return this.chmodSync(p, mask); + } + chmodSync(p, mask) { + if (this.readOnly) + throw EROFS(`chmod '${p}'`); + mask &= 493; + const resolvedP = this.resolveFilename(`chmod '${p}'`, p, false); + const entry = this.entries.get(resolvedP); + if (typeof entry === `undefined`) + throw new Error(`Assertion failed: The entry should have been registered (${resolvedP})`); + const oldMod = this.getUnixMode(entry, fs.constants.S_IFREG | 0); + const newMod = oldMod & ~511 | mask; + const rc = this.libzip.file.setExternalAttributes(this.zip, entry, 0, 0, this.libzip.ZIP_OPSYS_UNIX, newMod << 16); + if (rc === -1) { + throw this.makeLibzipError(this.libzip.getError(this.zip)); + } + } + async fchownPromise(fd, uid, gid) { + return this.chownPromise(this.fdToPath(fd, `fchown`), uid, gid); + } + fchownSync(fd, uid, gid) { + return this.chownSync(this.fdToPath(fd, `fchownSync`), uid, gid); + } + async chownPromise(p, uid, gid) { + return this.chownSync(p, uid, gid); + } + chownSync(p, uid, gid) { + throw new Error(`Unimplemented`); + } + async renamePromise(oldP, newP) { + return this.renameSync(oldP, newP); + } + renameSync(oldP, newP) { + throw new Error(`Unimplemented`); + } + async copyFilePromise(sourceP, destP, flags) { + const { indexSource, indexDest, resolvedDestP } = this.prepareCopyFile(sourceP, destP, flags); + const source = await this.getFileSource(indexSource, { asyncDecompress: true }); + const newIndex = this.setFileSource(resolvedDestP, source); + if (newIndex !== indexDest) { + this.registerEntry(resolvedDestP, newIndex); + } + } + copyFileSync(sourceP, destP, flags = 0) { + const { indexSource, indexDest, resolvedDestP } = this.prepareCopyFile(sourceP, destP, flags); + const source = this.getFileSource(indexSource); + const newIndex = this.setFileSource(resolvedDestP, source); + if (newIndex !== indexDest) { + this.registerEntry(resolvedDestP, newIndex); + } + } + prepareCopyFile(sourceP, destP, flags = 0) { + if (this.readOnly) + throw EROFS(`copyfile '${sourceP} -> '${destP}'`); + if ((flags & fs.constants.COPYFILE_FICLONE_FORCE) !== 0) + throw ENOSYS(`unsupported clone operation`, `copyfile '${sourceP}' -> ${destP}'`); + const resolvedSourceP = this.resolveFilename(`copyfile '${sourceP} -> ${destP}'`, sourceP); + const indexSource = this.entries.get(resolvedSourceP); + if (typeof indexSource === `undefined`) + throw EINVAL(`copyfile '${sourceP}' -> '${destP}'`); + const resolvedDestP = this.resolveFilename(`copyfile '${sourceP}' -> ${destP}'`, destP); + const indexDest = this.entries.get(resolvedDestP); + if ((flags & (fs.constants.COPYFILE_EXCL | fs.constants.COPYFILE_FICLONE_FORCE)) !== 0 && typeof indexDest !== `undefined`) + throw EEXIST(`copyfile '${sourceP}' -> '${destP}'`); + return { + indexSource, + resolvedDestP, + indexDest + }; + } + async appendFilePromise(p, content, opts) { + if (this.readOnly) + throw EROFS(`open '${p}'`); + if (typeof opts === `undefined`) + opts = { flag: `a` }; + else if (typeof opts === `string`) + opts = { flag: `a`, encoding: opts }; + else if (typeof opts.flag === `undefined`) + opts = { flag: `a`, ...opts }; + return this.writeFilePromise(p, content, opts); + } + appendFileSync(p, content, opts = {}) { + if (this.readOnly) + throw EROFS(`open '${p}'`); + if (typeof opts === `undefined`) + opts = { flag: `a` }; + else if (typeof opts === `string`) + opts = { flag: `a`, encoding: opts }; + else if (typeof opts.flag === `undefined`) + opts = { flag: `a`, ...opts }; + return this.writeFileSync(p, content, opts); + } + fdToPath(fd, reason) { + const path = this.fds.get(fd)?.p; + if (typeof path === `undefined`) + throw EBADF(reason); + return path; + } + async writeFilePromise(p, content, opts) { + const { encoding, mode, index, resolvedP } = this.prepareWriteFile(p, opts); + if (index !== void 0 && typeof opts === `object` && opts.flag && opts.flag.includes(`a`)) + content = Buffer.concat([await this.getFileSource(index, { asyncDecompress: true }), Buffer.from(content)]); + if (encoding !== null) + content = content.toString(encoding); + const newIndex = this.setFileSource(resolvedP, content); + if (newIndex !== index) + this.registerEntry(resolvedP, newIndex); + if (mode !== null) { + await this.chmodPromise(resolvedP, mode); + } + } + writeFileSync(p, content, opts) { + const { encoding, mode, index, resolvedP } = this.prepareWriteFile(p, opts); + if (index !== void 0 && typeof opts === `object` && opts.flag && opts.flag.includes(`a`)) + content = Buffer.concat([this.getFileSource(index), Buffer.from(content)]); + if (encoding !== null) + content = content.toString(encoding); + const newIndex = this.setFileSource(resolvedP, content); + if (newIndex !== index) + this.registerEntry(resolvedP, newIndex); + if (mode !== null) { + this.chmodSync(resolvedP, mode); + } + } + prepareWriteFile(p, opts) { + if (typeof p === `number`) + p = this.fdToPath(p, `read`); + if (this.readOnly) + throw EROFS(`open '${p}'`); + const resolvedP = this.resolveFilename(`open '${p}'`, p); + if (this.listings.has(resolvedP)) + throw EISDIR(`open '${p}'`); + let encoding = null, mode = null; + if (typeof opts === `string`) { + encoding = opts; + } else if (typeof opts === `object`) { + ({ + encoding = null, + mode = null + } = opts); + } + const index = this.entries.get(resolvedP); + return { + encoding, + mode, + resolvedP, + index + }; + } + async unlinkPromise(p) { + return this.unlinkSync(p); + } + unlinkSync(p) { + if (this.readOnly) + throw EROFS(`unlink '${p}'`); + const resolvedP = this.resolveFilename(`unlink '${p}'`, p); + if (this.listings.has(resolvedP)) + throw EISDIR(`unlink '${p}'`); + const index = this.entries.get(resolvedP); + if (typeof index === `undefined`) + throw EINVAL(`unlink '${p}'`); + this.deleteEntry(resolvedP, index); + } + async utimesPromise(p, atime, mtime) { + return this.utimesSync(p, atime, mtime); + } + utimesSync(p, atime, mtime) { + if (this.readOnly) + throw EROFS(`utimes '${p}'`); + const resolvedP = this.resolveFilename(`utimes '${p}'`, p); + this.utimesImpl(resolvedP, mtime); + } + async lutimesPromise(p, atime, mtime) { + return this.lutimesSync(p, atime, mtime); + } + lutimesSync(p, atime, mtime) { + if (this.readOnly) + throw EROFS(`lutimes '${p}'`); + const resolvedP = this.resolveFilename(`utimes '${p}'`, p, false); + this.utimesImpl(resolvedP, mtime); + } + utimesImpl(resolvedP, mtime) { + if (this.listings.has(resolvedP)) { + if (!this.entries.has(resolvedP)) + this.hydrateDirectory(resolvedP); + } + const entry = this.entries.get(resolvedP); + if (entry === void 0) + throw new Error(`Unreachable`); + const rc = this.libzip.file.setMtime(this.zip, entry, 0, toUnixTimestamp(mtime), 0); + if (rc === -1) { + throw this.makeLibzipError(this.libzip.getError(this.zip)); + } + } + async mkdirPromise(p, opts) { + return this.mkdirSync(p, opts); + } + mkdirSync(p, { mode = 493, recursive = false } = {}) { + if (recursive) + return this.mkdirpSync(p, { chmod: mode }); + if (this.readOnly) + throw EROFS(`mkdir '${p}'`); + const resolvedP = this.resolveFilename(`mkdir '${p}'`, p); + if (this.entries.has(resolvedP) || this.listings.has(resolvedP)) + throw EEXIST(`mkdir '${p}'`); + this.hydrateDirectory(resolvedP); + this.chmodSync(resolvedP, mode); + return void 0; + } + async rmdirPromise(p, opts) { + return this.rmdirSync(p, opts); + } + rmdirSync(p, { recursive = false } = {}) { + if (this.readOnly) + throw EROFS(`rmdir '${p}'`); + if (recursive) { + this.removeSync(p); + return; + } + const resolvedP = this.resolveFilename(`rmdir '${p}'`, p); + const directoryListing = this.listings.get(resolvedP); + if (!directoryListing) + throw ENOTDIR(`rmdir '${p}'`); + if (directoryListing.size > 0) + throw ENOTEMPTY(`rmdir '${p}'`); + const index = this.entries.get(resolvedP); + if (typeof index === `undefined`) + throw EINVAL(`rmdir '${p}'`); + this.deleteEntry(p, index); + } + hydrateDirectory(resolvedP) { + const index = this.libzip.dir.add(this.zip, ppath.relative(PortablePath.root, resolvedP)); + if (index === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + this.registerListing(resolvedP); + this.registerEntry(resolvedP, index); + return index; + } + async linkPromise(existingP, newP) { + return this.linkSync(existingP, newP); + } + linkSync(existingP, newP) { + throw EOPNOTSUPP(`link '${existingP}' -> '${newP}'`); + } + async symlinkPromise(target, p) { + return this.symlinkSync(target, p); + } + symlinkSync(target, p) { + if (this.readOnly) + throw EROFS(`symlink '${target}' -> '${p}'`); + const resolvedP = this.resolveFilename(`symlink '${target}' -> '${p}'`, p); + if (this.listings.has(resolvedP)) + throw EISDIR(`symlink '${target}' -> '${p}'`); + if (this.entries.has(resolvedP)) + throw EEXIST(`symlink '${target}' -> '${p}'`); + const index = this.setFileSource(resolvedP, target); + this.registerEntry(resolvedP, index); + const rc = this.libzip.file.setExternalAttributes(this.zip, index, 0, 0, this.libzip.ZIP_OPSYS_UNIX, (fs.constants.S_IFLNK | 511) << 16); + if (rc === -1) + throw this.makeLibzipError(this.libzip.getError(this.zip)); + this.symlinkCount += 1; + } + async readFilePromise(p, encoding) { + if (typeof encoding === `object`) + encoding = encoding ? encoding.encoding : void 0; + const data = await this.readFileBuffer(p, { asyncDecompress: true }); + return encoding ? data.toString(encoding) : data; + } + readFileSync(p, encoding) { + if (typeof encoding === `object`) + encoding = encoding ? encoding.encoding : void 0; + const data = this.readFileBuffer(p); + return encoding ? data.toString(encoding) : data; + } + readFileBuffer(p, opts = { asyncDecompress: false }) { + if (typeof p === `number`) + p = this.fdToPath(p, `read`); + const resolvedP = this.resolveFilename(`open '${p}'`, p); + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) + throw ENOENT(`open '${p}'`); + if (p[p.length - 1] === `/` && !this.listings.has(resolvedP)) + throw ENOTDIR(`open '${p}'`); + if (this.listings.has(resolvedP)) + throw EISDIR(`read`); + const entry = this.entries.get(resolvedP); + if (entry === void 0) + throw new Error(`Unreachable`); + return this.getFileSource(entry, opts); + } + async readdirPromise(p, opts) { + return this.readdirSync(p, opts); + } + readdirSync(p, opts) { + const resolvedP = this.resolveFilename(`scandir '${p}'`, p); + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) + throw ENOENT(`scandir '${p}'`); + const directoryListing = this.listings.get(resolvedP); + if (!directoryListing) + throw ENOTDIR(`scandir '${p}'`); + if (opts?.recursive) { + if (opts?.withFileTypes) { + const entries = Array.from(directoryListing, (name) => { + return Object.assign(this.statImpl(`lstat`, ppath.join(p, name)), { + name, + path: PortablePath.dot + }); + }); + for (const entry of entries) { + if (!entry.isDirectory()) + continue; + const subPath = ppath.join(entry.path, entry.name); + const subListing = this.listings.get(ppath.join(resolvedP, subPath)); + for (const child of subListing) { + entries.push(Object.assign(this.statImpl(`lstat`, ppath.join(p, subPath, child)), { + name: child, + path: subPath + })); + } + } + return entries; + } else { + const entries = [...directoryListing]; + for (const subPath of entries) { + const subListing = this.listings.get(ppath.join(resolvedP, subPath)); + if (typeof subListing === `undefined`) + continue; + for (const child of subListing) { + entries.push(ppath.join(subPath, child)); + } + } + return entries; + } + } else if (opts?.withFileTypes) { + return Array.from(directoryListing, (name) => { + return Object.assign(this.statImpl(`lstat`, ppath.join(p, name)), { + name, + path: void 0 + }); + }); + } else { + return [...directoryListing]; + } + } + async readlinkPromise(p) { + const entry = this.prepareReadlink(p); + return (await this.getFileSource(entry, { asyncDecompress: true })).toString(); + } + readlinkSync(p) { + const entry = this.prepareReadlink(p); + return this.getFileSource(entry).toString(); + } + prepareReadlink(p) { + const resolvedP = this.resolveFilename(`readlink '${p}'`, p, false); + if (!this.entries.has(resolvedP) && !this.listings.has(resolvedP)) + throw ENOENT(`readlink '${p}'`); + if (p[p.length - 1] === `/` && !this.listings.has(resolvedP)) + throw ENOTDIR(`open '${p}'`); + if (this.listings.has(resolvedP)) + throw EINVAL(`readlink '${p}'`); + const entry = this.entries.get(resolvedP); + if (entry === void 0) + throw new Error(`Unreachable`); + if (!this.isSymbolicLink(entry)) + throw EINVAL(`readlink '${p}'`); + return entry; + } + async truncatePromise(p, len = 0) { + const resolvedP = this.resolveFilename(`open '${p}'`, p); + const index = this.entries.get(resolvedP); + if (typeof index === `undefined`) + throw EINVAL(`open '${p}'`); + const source = await this.getFileSource(index, { asyncDecompress: true }); + const truncated = Buffer.alloc(len, 0); + source.copy(truncated); + return await this.writeFilePromise(p, truncated); + } + truncateSync(p, len = 0) { + const resolvedP = this.resolveFilename(`open '${p}'`, p); + const index = this.entries.get(resolvedP); + if (typeof index === `undefined`) + throw EINVAL(`open '${p}'`); + const source = this.getFileSource(index); + const truncated = Buffer.alloc(len, 0); + source.copy(truncated); + return this.writeFileSync(p, truncated); + } + async ftruncatePromise(fd, len) { + return this.truncatePromise(this.fdToPath(fd, `ftruncate`), len); + } + ftruncateSync(fd, len) { + return this.truncateSync(this.fdToPath(fd, `ftruncateSync`), len); + } + watch(p, a, b) { + let persistent; + switch (typeof a) { + case `function`: + case `string`: + case `undefined`: + { + persistent = true; + } + break; + default: + { + ({ persistent = true } = a); + } + break; + } + if (!persistent) + return { on: () => { + }, close: () => { + } }; + const interval = setInterval(() => { + }, 24 * 60 * 60 * 1e3); + return { on: () => { + }, close: () => { + clearInterval(interval); + } }; + } + watchFile(p, a, b) { + const resolvedP = ppath.resolve(PortablePath.root, p); + return watchFile(this, resolvedP, a, b); + } + unwatchFile(p, cb) { + const resolvedP = ppath.resolve(PortablePath.root, p); + return unwatchFile(this, resolvedP, cb); + } +} + +setFactory(() => { + const emZip = createModule(); + return makeInterface(emZip); +}); + +var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => { + ErrorCode2["API_ERROR"] = `API_ERROR`; + ErrorCode2["BUILTIN_NODE_RESOLUTION_FAILED"] = `BUILTIN_NODE_RESOLUTION_FAILED`; + ErrorCode2["EXPORTS_RESOLUTION_FAILED"] = `EXPORTS_RESOLUTION_FAILED`; + ErrorCode2["MISSING_DEPENDENCY"] = `MISSING_DEPENDENCY`; + ErrorCode2["MISSING_PEER_DEPENDENCY"] = `MISSING_PEER_DEPENDENCY`; + ErrorCode2["QUALIFIED_PATH_RESOLUTION_FAILED"] = `QUALIFIED_PATH_RESOLUTION_FAILED`; + ErrorCode2["INTERNAL"] = `INTERNAL`; + ErrorCode2["UNDECLARED_DEPENDENCY"] = `UNDECLARED_DEPENDENCY`; + ErrorCode2["UNSUPPORTED"] = `UNSUPPORTED`; + return ErrorCode2; +})(ErrorCode || {}); +const MODULE_NOT_FOUND_ERRORS = /* @__PURE__ */ new Set([ + "BUILTIN_NODE_RESOLUTION_FAILED" /* BUILTIN_NODE_RESOLUTION_FAILED */, + "MISSING_DEPENDENCY" /* MISSING_DEPENDENCY */, + "MISSING_PEER_DEPENDENCY" /* MISSING_PEER_DEPENDENCY */, + "QUALIFIED_PATH_RESOLUTION_FAILED" /* QUALIFIED_PATH_RESOLUTION_FAILED */, + "UNDECLARED_DEPENDENCY" /* UNDECLARED_DEPENDENCY */ +]); +function makeError(pnpCode, message, data = {}, code) { + code ??= MODULE_NOT_FOUND_ERRORS.has(pnpCode) ? `MODULE_NOT_FOUND` : pnpCode; + const propertySpec = { + configurable: true, + writable: true, + enumerable: false + }; + return Object.defineProperties(new Error(message), { + code: { + ...propertySpec, + value: code + }, + pnpCode: { + ...propertySpec, + value: pnpCode + }, + data: { + ...propertySpec, + value: data + } + }); +} +function getIssuerModule(parent) { + let issuer = parent; + while (issuer && (issuer.id === `[eval]` || issuer.id === `` || !issuer.filename)) + issuer = issuer.parent; + return issuer || null; +} +function getPathForDisplay(p) { + return npath.normalize(npath.fromPortablePath(p)); +} + +const [major, minor] = process.versions.node.split(`.`).map((value) => parseInt(value, 10)); +const WATCH_MODE_MESSAGE_USES_ARRAYS = major > 19 || major === 19 && minor >= 2 || major === 18 && minor >= 13; + +function readPackageScope(checkPath) { + const rootSeparatorIndex = checkPath.indexOf(npath.sep); + let separatorIndex; + do { + separatorIndex = checkPath.lastIndexOf(npath.sep); + checkPath = checkPath.slice(0, separatorIndex); + if (checkPath.endsWith(`${npath.sep}node_modules`)) + return false; + const pjson = readPackage(checkPath + npath.sep); + if (pjson) { + return { + data: pjson, + path: checkPath + }; + } + } while (separatorIndex > rootSeparatorIndex); + return false; +} +function readPackage(requestPath) { + const jsonPath = npath.resolve(requestPath, `package.json`); + if (!fs__default.default.existsSync(jsonPath)) + return null; + return JSON.parse(fs__default.default.readFileSync(jsonPath, `utf8`)); +} +function ERR_REQUIRE_ESM(filename, parentPath = null) { + const basename = parentPath && path__default.default.basename(filename) === path__default.default.basename(parentPath) ? filename : path__default.default.basename(filename); + const msg = `require() of ES Module ${filename}${parentPath ? ` from ${parentPath}` : ``} not supported. +Instead change the require of ${basename} in ${parentPath} to a dynamic import() which is available in all CommonJS modules.`; + const err = new Error(msg); + err.code = `ERR_REQUIRE_ESM`; + return err; +} +function reportRequiredFilesToWatchMode(files) { + if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) { + files = files.map((filename) => npath.fromPortablePath(VirtualFS.resolveVirtual(npath.toPortablePath(filename)))); + if (WATCH_MODE_MESSAGE_USES_ARRAYS) { + process.send({ "watch:require": files }); + } else { + for (const filename of files) { + process.send({ "watch:require": filename }); + } + } + } +} + +function applyPatch(pnpapi, opts) { + let enableNativeHooks = true; + process.versions.pnp = String(pnpapi.VERSIONS.std); + const moduleExports = require$$0__default.default; + moduleExports.findPnpApi = (lookupSource) => { + const lookupPath = lookupSource instanceof url.URL ? url.fileURLToPath(lookupSource) : lookupSource; + const apiPath = opts.manager.findApiPathFor(lookupPath); + if (apiPath === null) + return null; + const apiEntry = opts.manager.getApiEntry(apiPath, true); + return apiEntry.instance.findPackageLocator(lookupPath) ? apiEntry.instance : null; + }; + function getRequireStack(parent) { + const requireStack = []; + for (let cursor = parent; cursor; cursor = cursor.parent) + requireStack.push(cursor.filename || cursor.id); + return requireStack; + } + const originalModuleLoad = require$$0.Module._load; + require$$0.Module._load = function(request, parent, isMain) { + if (request === `pnpapi`) { + const parentApiPath = opts.manager.getApiPathFromParent(parent); + if (parentApiPath) { + return opts.manager.getApiEntry(parentApiPath, true).instance; + } + } + return originalModuleLoad.call(require$$0.Module, request, parent, isMain); + }; + function getIssuerSpecsFromPaths(paths) { + return paths.map((path) => ({ + apiPath: opts.manager.findApiPathFor(path), + path, + module: null + })); + } + function getIssuerSpecsFromModule(module) { + if (module && module.id !== `` && module.id !== `internal/preload` && !module.parent && !module.filename && module.paths.length > 0) { + return [{ + apiPath: opts.manager.findApiPathFor(module.paths[0]), + path: module.paths[0], + module + }]; + } + const issuer = getIssuerModule(module); + if (issuer !== null) { + const path = npath.dirname(issuer.filename); + const apiPath = opts.manager.getApiPathFromParent(issuer); + return [{ apiPath, path, module }]; + } else { + const path = process.cwd(); + const apiPath = opts.manager.findApiPathFor(npath.join(path, `[file]`)) ?? opts.manager.getApiPathFromParent(null); + return [{ apiPath, path, module }]; + } + } + function makeFakeParent(path) { + const fakeParent = new require$$0.Module(``); + const fakeFilePath = npath.join(path, `[file]`); + fakeParent.paths = require$$0.Module._nodeModulePaths(fakeFilePath); + return fakeParent; + } + const pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:@[^/]+\/)?[^/]+)\/*(.*|)$/; + const originalModuleResolveFilename = require$$0.Module._resolveFilename; + require$$0.Module._resolveFilename = function(request, parent, isMain, options) { + if (require$$0.isBuiltin(request)) + return request; + if (!enableNativeHooks) + return originalModuleResolveFilename.call(require$$0.Module, request, parent, isMain, options); + if (options && options.plugnplay === false) { + const { plugnplay, ...forwardedOptions } = options; + try { + enableNativeHooks = false; + return originalModuleResolveFilename.call(require$$0.Module, request, parent, isMain, forwardedOptions); + } finally { + enableNativeHooks = true; + } + } + if (options) { + const optionNames = new Set(Object.keys(options)); + optionNames.delete(`paths`); + optionNames.delete(`plugnplay`); + if (optionNames.size > 0) { + throw makeError( + ErrorCode.UNSUPPORTED, + `Some options passed to require() aren't supported by PnP yet (${Array.from(optionNames).join(`, `)})` + ); + } + } + const issuerSpecs = options && options.paths ? getIssuerSpecsFromPaths(options.paths) : getIssuerSpecsFromModule(parent); + if (request.match(pathRegExp) === null) { + const parentDirectory = parent?.filename != null ? npath.dirname(parent.filename) : null; + const absoluteRequest = npath.isAbsolute(request) ? request : parentDirectory !== null ? npath.resolve(parentDirectory, request) : null; + if (absoluteRequest !== null) { + const apiPath = parent && parentDirectory === npath.dirname(absoluteRequest) ? opts.manager.getApiPathFromParent(parent) : opts.manager.findApiPathFor(absoluteRequest); + if (apiPath !== null) { + issuerSpecs.unshift({ + apiPath, + path: parentDirectory, + module: null + }); + } + } + } + let firstError; + for (const { apiPath, path, module } of issuerSpecs) { + let resolution; + const issuerApi = apiPath !== null ? opts.manager.getApiEntry(apiPath, true).instance : null; + try { + if (issuerApi !== null) { + resolution = issuerApi.resolveRequest(request, path !== null ? `${path}/` : null); + } else { + if (path === null) + throw new Error(`Assertion failed: Expected the path to be set`); + resolution = originalModuleResolveFilename.call(require$$0.Module, request, module || makeFakeParent(path), isMain); + } + } catch (error) { + firstError = firstError || error; + continue; + } + if (resolution !== null) { + return resolution; + } + } + const requireStack = getRequireStack(parent); + Object.defineProperty(firstError, `requireStack`, { + configurable: true, + writable: true, + enumerable: false, + value: requireStack + }); + if (requireStack.length > 0) + firstError.message += ` +Require stack: +- ${requireStack.join(` +- `)}`; + if (typeof firstError.pnpCode === `string`) + Error.captureStackTrace(firstError); + throw firstError; + }; + const originalFindPath = require$$0.Module._findPath; + require$$0.Module._findPath = function(request, paths, isMain) { + if (request === `pnpapi`) + return false; + if (!enableNativeHooks) + return originalFindPath.call(require$$0.Module, request, paths, isMain); + const isAbsolute = npath.isAbsolute(request); + if (isAbsolute) + paths = [``]; + else if (!paths || paths.length === 0) + return false; + for (const path of paths) { + let resolution; + try { + const pnpApiPath = opts.manager.findApiPathFor(isAbsolute ? request : path); + if (pnpApiPath !== null) { + const api = opts.manager.getApiEntry(pnpApiPath, true).instance; + resolution = api.resolveRequest(request, path) || false; + } else { + resolution = originalFindPath.call(require$$0.Module, request, [path], isMain); + } + } catch (error) { + continue; + } + if (resolution) { + return resolution; + } + } + return false; + }; + const originalExtensionJSFunction = require$$0.Module._extensions[`.js`]; + require$$0.Module._extensions[`.js`] = function(module, filename) { + if (filename.endsWith(`.js`)) { + const pkg = readPackageScope(filename); + if (pkg && pkg.data?.type === `module`) { + const err = ERR_REQUIRE_ESM(filename, module.parent?.filename); + Error.captureStackTrace(err); + throw err; + } + } + originalExtensionJSFunction.call(this, module, filename); + }; + const originalDlopen = process.dlopen; + process.dlopen = function(...args) { + const [module, filename, ...rest] = args; + return originalDlopen.call( + this, + module, + npath.fromPortablePath(VirtualFS.resolveVirtual(npath.toPortablePath(filename))), + ...rest + ); + }; + const originalEmit = process.emit; + process.emit = function(name, data, ...args) { + if (name === `warning` && typeof data === `object` && data.name === `ExperimentalWarning` && (data.message.includes(`--experimental-loader`) || data.message.includes(`Custom ESM Loaders is an experimental feature`))) + return false; + return originalEmit.apply(process, arguments); + }; + patchFs(fs__default.default, new PosixFS(opts.fakeFs)); +} + +function hydrateRuntimeState(data, { basePath }) { + const portablePath = npath.toPortablePath(basePath); + const absolutePortablePath = ppath.resolve(portablePath); + const ignorePattern = data.ignorePatternData !== null ? new RegExp(data.ignorePatternData) : null; + const packageLocatorsByLocations = /* @__PURE__ */ new Map(); + const packageRegistry = new Map(data.packageRegistryData.map(([packageName, packageStoreData]) => { + return [packageName, new Map(packageStoreData.map(([packageReference, packageInformationData]) => { + if (packageName === null !== (packageReference === null)) + throw new Error(`Assertion failed: The name and reference should be null, or neither should`); + const discardFromLookup = packageInformationData.discardFromLookup ?? false; + const packageLocator = { name: packageName, reference: packageReference }; + const entry = packageLocatorsByLocations.get(packageInformationData.packageLocation); + if (!entry) { + packageLocatorsByLocations.set(packageInformationData.packageLocation, { locator: packageLocator, discardFromLookup }); + } else { + entry.discardFromLookup = entry.discardFromLookup && discardFromLookup; + if (!discardFromLookup) { + entry.locator = packageLocator; + } + } + let resolvedPackageLocation = null; + return [packageReference, { + packageDependencies: new Map(packageInformationData.packageDependencies), + packagePeers: new Set(packageInformationData.packagePeers), + linkType: packageInformationData.linkType, + discardFromLookup, + get packageLocation() { + return resolvedPackageLocation || (resolvedPackageLocation = ppath.join(absolutePortablePath, packageInformationData.packageLocation)); + } + }]; + }))]; + })); + const fallbackExclusionList = new Map(data.fallbackExclusionList.map(([packageName, packageReferences]) => { + return [packageName, new Set(packageReferences)]; + })); + const fallbackPool = new Map(data.fallbackPool); + const dependencyTreeRoots = data.dependencyTreeRoots; + const enableTopLevelFallback = data.enableTopLevelFallback; + return { + basePath: portablePath, + dependencyTreeRoots, + enableTopLevelFallback, + fallbackExclusionList, + fallbackPool, + ignorePattern, + packageLocatorsByLocations, + packageRegistry + }; +} + +const ArrayIsArray = Array.isArray; +const JSONStringify = JSON.stringify; +const ObjectGetOwnPropertyNames = Object.getOwnPropertyNames; +const ObjectPrototypeHasOwnProperty = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop); +const RegExpPrototypeExec = (obj, string) => RegExp.prototype.exec.call(obj, string); +const RegExpPrototypeSymbolReplace = (obj, ...rest) => RegExp.prototype[Symbol.replace].apply(obj, rest); +const StringPrototypeEndsWith = (str, ...rest) => String.prototype.endsWith.apply(str, rest); +const StringPrototypeIncludes = (str, ...rest) => String.prototype.includes.apply(str, rest); +const StringPrototypeLastIndexOf = (str, ...rest) => String.prototype.lastIndexOf.apply(str, rest); +const StringPrototypeIndexOf = (str, ...rest) => String.prototype.indexOf.apply(str, rest); +const StringPrototypeReplace = (str, ...rest) => String.prototype.replace.apply(str, rest); +const StringPrototypeSlice = (str, ...rest) => String.prototype.slice.apply(str, rest); +const StringPrototypeStartsWith = (str, ...rest) => String.prototype.startsWith.apply(str, rest); +const SafeMap = Map; +const JSONParse = JSON.parse; + +function createErrorType(code, messageCreator, errorType) { + return class extends errorType { + constructor(...args) { + super(messageCreator(...args)); + this.code = code; + this.name = `${errorType.name} [${code}]`; + } + }; +} +const ERR_PACKAGE_IMPORT_NOT_DEFINED = createErrorType( + `ERR_PACKAGE_IMPORT_NOT_DEFINED`, + (specifier, packagePath, base) => { + return `Package import specifier "${specifier}" is not defined${packagePath ? ` in package ${packagePath}package.json` : ``} imported from ${base}`; + }, + TypeError +); +const ERR_INVALID_MODULE_SPECIFIER = createErrorType( + `ERR_INVALID_MODULE_SPECIFIER`, + (request, reason, base = void 0) => { + return `Invalid module "${request}" ${reason}${base ? ` imported from ${base}` : ``}`; + }, + TypeError +); +const ERR_INVALID_PACKAGE_TARGET = createErrorType( + `ERR_INVALID_PACKAGE_TARGET`, + (pkgPath, key, target, isImport = false, base = void 0) => { + const relError = typeof target === `string` && !isImport && target.length && !StringPrototypeStartsWith(target, `./`); + if (key === `.`) { + assert__default.default(isImport === false); + return `Invalid "exports" main target ${JSONStringify(target)} defined in the package config ${pkgPath}package.json${base ? ` imported from ${base}` : ``}${relError ? `; targets must start with "./"` : ``}`; + } + return `Invalid "${isImport ? `imports` : `exports`}" target ${JSONStringify( + target + )} defined for '${key}' in the package config ${pkgPath}package.json${base ? ` imported from ${base}` : ``}${relError ? `; targets must start with "./"` : ``}`; + }, + Error +); +const ERR_INVALID_PACKAGE_CONFIG = createErrorType( + `ERR_INVALID_PACKAGE_CONFIG`, + (path, base, message) => { + return `Invalid package config ${path}${base ? ` while importing ${base}` : ``}${message ? `. ${message}` : ``}`; + }, + Error +); +const ERR_PACKAGE_PATH_NOT_EXPORTED = createErrorType( + "ERR_PACKAGE_PATH_NOT_EXPORTED", + (pkgPath, subpath, base = void 0) => { + if (subpath === ".") + return `No "exports" main defined in ${pkgPath}package.json${base ? ` imported from ${base}` : ""}`; + return `Package subpath '${subpath}' is not defined by "exports" in ${pkgPath}package.json${base ? ` imported from ${base}` : ""}`; + }, + Error +); + +function filterOwnProperties(source, keys) { + const filtered = /* @__PURE__ */ Object.create(null); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (ObjectPrototypeHasOwnProperty(source, key)) { + filtered[key] = source[key]; + } + } + return filtered; +} + +const packageJSONCache = new SafeMap(); +function getPackageConfig(path, specifier, base, readFileSyncFn) { + const existing = packageJSONCache.get(path); + if (existing !== void 0) { + return existing; + } + const source = readFileSyncFn(path); + if (source === void 0) { + const packageConfig2 = { + pjsonPath: path, + exists: false, + main: void 0, + name: void 0, + type: "none", + exports: void 0, + imports: void 0 + }; + packageJSONCache.set(path, packageConfig2); + return packageConfig2; + } + let packageJSON; + try { + packageJSON = JSONParse(source); + } catch (error) { + throw new ERR_INVALID_PACKAGE_CONFIG( + path, + (base ? `"${specifier}" from ` : "") + url.fileURLToPath(base || specifier), + error.message + ); + } + let { imports, main, name, type } = filterOwnProperties(packageJSON, [ + "imports", + "main", + "name", + "type" + ]); + const exports = ObjectPrototypeHasOwnProperty(packageJSON, "exports") ? packageJSON.exports : void 0; + if (typeof imports !== "object" || imports === null) { + imports = void 0; + } + if (typeof main !== "string") { + main = void 0; + } + if (typeof name !== "string") { + name = void 0; + } + if (type !== "module" && type !== "commonjs") { + type = "none"; + } + const packageConfig = { + pjsonPath: path, + exists: true, + main, + name, + type, + exports, + imports + }; + packageJSONCache.set(path, packageConfig); + return packageConfig; +} +function getPackageScopeConfig(resolved, readFileSyncFn) { + let packageJSONUrl = new URL("./package.json", resolved); + while (true) { + const packageJSONPath2 = packageJSONUrl.pathname; + if (StringPrototypeEndsWith(packageJSONPath2, "node_modules/package.json")) { + break; + } + const packageConfig2 = getPackageConfig( + url.fileURLToPath(packageJSONUrl), + resolved, + void 0, + readFileSyncFn + ); + if (packageConfig2.exists) { + return packageConfig2; + } + const lastPackageJSONUrl = packageJSONUrl; + packageJSONUrl = new URL("../package.json", packageJSONUrl); + if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) { + break; + } + } + const packageJSONPath = url.fileURLToPath(packageJSONUrl); + const packageConfig = { + pjsonPath: packageJSONPath, + exists: false, + main: void 0, + name: void 0, + type: "none", + exports: void 0, + imports: void 0 + }; + packageJSONCache.set(packageJSONPath, packageConfig); + return packageConfig; +} + +/** + @license + Copyright Node.js contributors. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. +*/ +function throwImportNotDefined(specifier, packageJSONUrl, base) { + throw new ERR_PACKAGE_IMPORT_NOT_DEFINED( + specifier, + packageJSONUrl && url.fileURLToPath(new URL(".", packageJSONUrl)), + url.fileURLToPath(base) + ); +} +function throwInvalidSubpath(subpath, packageJSONUrl, internal, base) { + const reason = `request is not a valid subpath for the "${internal ? "imports" : "exports"}" resolution of ${url.fileURLToPath(packageJSONUrl)}`; + throw new ERR_INVALID_MODULE_SPECIFIER( + subpath, + reason, + base && url.fileURLToPath(base) + ); +} +function throwInvalidPackageTarget(subpath, target, packageJSONUrl, internal, base) { + if (typeof target === "object" && target !== null) { + target = JSONStringify(target, null, ""); + } else { + target = `${target}`; + } + throw new ERR_INVALID_PACKAGE_TARGET( + url.fileURLToPath(new URL(".", packageJSONUrl)), + subpath, + target, + internal, + base && url.fileURLToPath(base) + ); +} +const invalidSegmentRegEx = /(^|\\|\/)((\.|%2e)(\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))(\\|\/|$)/i; +const patternRegEx = /\*/g; +function resolvePackageTargetString(target, subpath, match, packageJSONUrl, base, pattern, internal, conditions) { + if (subpath !== "" && !pattern && target[target.length - 1] !== "/") + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + if (!StringPrototypeStartsWith(target, "./")) { + if (internal && !StringPrototypeStartsWith(target, "../") && !StringPrototypeStartsWith(target, "/")) { + let isURL = false; + try { + new URL(target); + isURL = true; + } catch { + } + if (!isURL) { + const exportTarget = pattern ? RegExpPrototypeSymbolReplace(patternRegEx, target, () => subpath) : target + subpath; + return exportTarget; + } + } + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + } + if (RegExpPrototypeExec( + invalidSegmentRegEx, + StringPrototypeSlice(target, 2) + ) !== null) + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + const resolved = new URL(target, packageJSONUrl); + const resolvedPath = resolved.pathname; + const packagePath = new URL(".", packageJSONUrl).pathname; + if (!StringPrototypeStartsWith(resolvedPath, packagePath)) + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + if (subpath === "") + return resolved; + if (RegExpPrototypeExec(invalidSegmentRegEx, subpath) !== null) { + const request = pattern ? StringPrototypeReplace(match, "*", () => subpath) : match + subpath; + throwInvalidSubpath(request, packageJSONUrl, internal, base); + } + if (pattern) { + return new URL( + RegExpPrototypeSymbolReplace(patternRegEx, resolved.href, () => subpath) + ); + } + return new URL(subpath, resolved); +} +function isArrayIndex(key) { + const keyNum = +key; + if (`${keyNum}` !== key) + return false; + return keyNum >= 0 && keyNum < 4294967295; +} +function resolvePackageTarget(packageJSONUrl, target, subpath, packageSubpath, base, pattern, internal, conditions) { + if (typeof target === "string") { + return resolvePackageTargetString( + target, + subpath, + packageSubpath, + packageJSONUrl, + base, + pattern, + internal); + } else if (ArrayIsArray(target)) { + if (target.length === 0) { + return null; + } + let lastException; + for (let i = 0; i < target.length; i++) { + const targetItem = target[i]; + let resolveResult; + try { + resolveResult = resolvePackageTarget( + packageJSONUrl, + targetItem, + subpath, + packageSubpath, + base, + pattern, + internal, + conditions + ); + } catch (e) { + lastException = e; + if (e.code === "ERR_INVALID_PACKAGE_TARGET") { + continue; + } + throw e; + } + if (resolveResult === void 0) { + continue; + } + if (resolveResult === null) { + lastException = null; + continue; + } + return resolveResult; + } + if (lastException === void 0 || lastException === null) + return lastException; + throw lastException; + } else if (typeof target === "object" && target !== null) { + const keys = ObjectGetOwnPropertyNames(target); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (isArrayIndex(key)) { + throw new ERR_INVALID_PACKAGE_CONFIG( + url.fileURLToPath(packageJSONUrl), + base, + '"exports" cannot contain numeric property keys.' + ); + } + } + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (key === "default" || conditions.has(key)) { + const conditionalTarget = target[key]; + const resolveResult = resolvePackageTarget( + packageJSONUrl, + conditionalTarget, + subpath, + packageSubpath, + base, + pattern, + internal, + conditions + ); + if (resolveResult === void 0) + continue; + return resolveResult; + } + } + return void 0; + } else if (target === null) { + return null; + } + throwInvalidPackageTarget( + packageSubpath, + target, + packageJSONUrl, + internal, + base + ); +} +function patternKeyCompare(a, b) { + const aPatternIndex = StringPrototypeIndexOf(a, "*"); + const bPatternIndex = StringPrototypeIndexOf(b, "*"); + const baseLenA = aPatternIndex === -1 ? a.length : aPatternIndex + 1; + const baseLenB = bPatternIndex === -1 ? b.length : bPatternIndex + 1; + if (baseLenA > baseLenB) + return -1; + if (baseLenB > baseLenA) + return 1; + if (aPatternIndex === -1) + return 1; + if (bPatternIndex === -1) + return -1; + if (a.length > b.length) + return -1; + if (b.length > a.length) + return 1; + return 0; +} +function isConditionalExportsMainSugar(exports, packageJSONUrl, base) { + if (typeof exports === "string" || ArrayIsArray(exports)) + return true; + if (typeof exports !== "object" || exports === null) + return false; + const keys = ObjectGetOwnPropertyNames(exports); + let isConditionalSugar = false; + let i = 0; + for (let j = 0; j < keys.length; j++) { + const key = keys[j]; + const curIsConditionalSugar = key === "" || key[0] !== "."; + if (i++ === 0) { + isConditionalSugar = curIsConditionalSugar; + } else if (isConditionalSugar !== curIsConditionalSugar) { + throw new ERR_INVALID_PACKAGE_CONFIG( + url.fileURLToPath(packageJSONUrl), + base, + `"exports" cannot contain some keys starting with '.' and some not. The exports object must either be an object of package subpath keys or an object of main entry condition name keys only.` + ); + } + } + return isConditionalSugar; +} +function throwExportsNotFound(subpath, packageJSONUrl, base) { + throw new ERR_PACKAGE_PATH_NOT_EXPORTED( + url.fileURLToPath(new URL(".", packageJSONUrl)), + subpath, + base && url.fileURLToPath(base) + ); +} +const emittedPackageWarnings = /* @__PURE__ */ new Set(); +function emitTrailingSlashPatternDeprecation(match, pjsonUrl, base) { + const pjsonPath = url.fileURLToPath(pjsonUrl); + if (emittedPackageWarnings.has(pjsonPath + "|" + match)) + return; + emittedPackageWarnings.add(pjsonPath + "|" + match); + process.emitWarning( + `Use of deprecated trailing slash pattern mapping "${match}" in the "exports" field module resolution of the package at ${pjsonPath}${base ? ` imported from ${url.fileURLToPath(base)}` : ""}. Mapping specifiers ending in "/" is no longer supported.`, + "DeprecationWarning", + "DEP0155" + ); +} +function packageExportsResolve({ + packageJSONUrl, + packageSubpath, + exports, + base, + conditions +}) { + if (isConditionalExportsMainSugar(exports, packageJSONUrl, base)) + exports = { ".": exports }; + if (ObjectPrototypeHasOwnProperty(exports, packageSubpath) && !StringPrototypeIncludes(packageSubpath, "*") && !StringPrototypeEndsWith(packageSubpath, "/")) { + const target = exports[packageSubpath]; + const resolveResult = resolvePackageTarget( + packageJSONUrl, + target, + "", + packageSubpath, + base, + false, + false, + conditions + ); + if (resolveResult == null) { + throwExportsNotFound(packageSubpath, packageJSONUrl, base); + } + return resolveResult; + } + let bestMatch = ""; + let bestMatchSubpath; + const keys = ObjectGetOwnPropertyNames(exports); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const patternIndex = StringPrototypeIndexOf(key, "*"); + if (patternIndex !== -1 && StringPrototypeStartsWith( + packageSubpath, + StringPrototypeSlice(key, 0, patternIndex) + )) { + if (StringPrototypeEndsWith(packageSubpath, "/")) + emitTrailingSlashPatternDeprecation( + packageSubpath, + packageJSONUrl, + base + ); + const patternTrailer = StringPrototypeSlice(key, patternIndex + 1); + if (packageSubpath.length >= key.length && StringPrototypeEndsWith(packageSubpath, patternTrailer) && patternKeyCompare(bestMatch, key) === 1 && StringPrototypeLastIndexOf(key, "*") === patternIndex) { + bestMatch = key; + bestMatchSubpath = StringPrototypeSlice( + packageSubpath, + patternIndex, + packageSubpath.length - patternTrailer.length + ); + } + } + } + if (bestMatch) { + const target = exports[bestMatch]; + const resolveResult = resolvePackageTarget( + packageJSONUrl, + target, + bestMatchSubpath, + bestMatch, + base, + true, + false, + conditions + ); + if (resolveResult == null) { + throwExportsNotFound(packageSubpath, packageJSONUrl, base); + } + return resolveResult; + } + throwExportsNotFound(packageSubpath, packageJSONUrl, base); +} +function packageImportsResolve({ name, base, conditions, readFileSyncFn }) { + if (name === "#" || StringPrototypeStartsWith(name, "#/") || StringPrototypeEndsWith(name, "/")) { + const reason = "is not a valid internal imports specifier name"; + throw new ERR_INVALID_MODULE_SPECIFIER(name, reason, url.fileURLToPath(base)); + } + let packageJSONUrl; + const packageConfig = getPackageScopeConfig(base, readFileSyncFn); + if (packageConfig.exists) { + packageJSONUrl = url.pathToFileURL(packageConfig.pjsonPath); + const imports = packageConfig.imports; + if (imports) { + if (ObjectPrototypeHasOwnProperty(imports, name) && !StringPrototypeIncludes(name, "*")) { + const resolveResult = resolvePackageTarget( + packageJSONUrl, + imports[name], + "", + name, + base, + false, + true, + conditions + ); + if (resolveResult != null) { + return resolveResult; + } + } else { + let bestMatch = ""; + let bestMatchSubpath; + const keys = ObjectGetOwnPropertyNames(imports); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const patternIndex = StringPrototypeIndexOf(key, "*"); + if (patternIndex !== -1 && StringPrototypeStartsWith( + name, + StringPrototypeSlice(key, 0, patternIndex) + )) { + const patternTrailer = StringPrototypeSlice(key, patternIndex + 1); + if (name.length >= key.length && StringPrototypeEndsWith(name, patternTrailer) && patternKeyCompare(bestMatch, key) === 1 && StringPrototypeLastIndexOf(key, "*") === patternIndex) { + bestMatch = key; + bestMatchSubpath = StringPrototypeSlice( + name, + patternIndex, + name.length - patternTrailer.length + ); + } + } + } + if (bestMatch) { + const target = imports[bestMatch]; + const resolveResult = resolvePackageTarget( + packageJSONUrl, + target, + bestMatchSubpath, + bestMatch, + base, + true, + true, + conditions + ); + if (resolveResult != null) { + return resolveResult; + } + } + } + } + } + throwImportNotDefined(name, packageJSONUrl, base); +} + +const flagSymbol = Symbol('arg flag'); + +class ArgError extends Error { + constructor(msg, code) { + super(msg); + this.name = 'ArgError'; + this.code = code; + + Object.setPrototypeOf(this, ArgError.prototype); + } +} + +function arg( + opts, + { + argv = process.argv.slice(2), + permissive = false, + stopAtPositional = false + } = {} +) { + if (!opts) { + throw new ArgError( + 'argument specification object is required', + 'ARG_CONFIG_NO_SPEC' + ); + } + + const result = { _: [] }; + + const aliases = {}; + const handlers = {}; + + for (const key of Object.keys(opts)) { + if (!key) { + throw new ArgError( + 'argument key cannot be an empty string', + 'ARG_CONFIG_EMPTY_KEY' + ); + } + + if (key[0] !== '-') { + throw new ArgError( + `argument key must start with '-' but found: '${key}'`, + 'ARG_CONFIG_NONOPT_KEY' + ); + } + + if (key.length === 1) { + throw new ArgError( + `argument key must have a name; singular '-' keys are not allowed: ${key}`, + 'ARG_CONFIG_NONAME_KEY' + ); + } + + if (typeof opts[key] === 'string') { + aliases[key] = opts[key]; + continue; + } + + let type = opts[key]; + let isFlag = false; + + if ( + Array.isArray(type) && + type.length === 1 && + typeof type[0] === 'function' + ) { + const [fn] = type; + type = (value, name, prev = []) => { + prev.push(fn(value, name, prev[prev.length - 1])); + return prev; + }; + isFlag = fn === Boolean || fn[flagSymbol] === true; + } else if (typeof type === 'function') { + isFlag = type === Boolean || type[flagSymbol] === true; + } else { + throw new ArgError( + `type missing or not a function or valid array type: ${key}`, + 'ARG_CONFIG_VAD_TYPE' + ); + } + + if (key[1] !== '-' && key.length > 2) { + throw new ArgError( + `short argument keys (with a single hyphen) must have only one character: ${key}`, + 'ARG_CONFIG_SHORTOPT_TOOLONG' + ); + } + + handlers[key] = [type, isFlag]; + } + + for (let i = 0, len = argv.length; i < len; i++) { + const wholeArg = argv[i]; + + if (stopAtPositional && result._.length > 0) { + result._ = result._.concat(argv.slice(i)); + break; + } + + if (wholeArg === '--') { + result._ = result._.concat(argv.slice(i + 1)); + break; + } + + if (wholeArg.length > 1 && wholeArg[0] === '-') { + /* eslint-disable operator-linebreak */ + const separatedArguments = + wholeArg[1] === '-' || wholeArg.length === 2 + ? [wholeArg] + : wholeArg + .slice(1) + .split('') + .map((a) => `-${a}`); + /* eslint-enable operator-linebreak */ + + for (let j = 0; j < separatedArguments.length; j++) { + const arg = separatedArguments[j]; + const [originalArgName, argStr] = + arg[1] === '-' ? arg.split(/=(.*)/, 2) : [arg, undefined]; + + let argName = originalArgName; + while (argName in aliases) { + argName = aliases[argName]; + } + + if (!(argName in handlers)) { + if (permissive) { + result._.push(arg); + continue; + } else { + throw new ArgError( + `unknown or unexpected option: ${originalArgName}`, + 'ARG_UNKNOWN_OPTION' + ); + } + } + + const [type, isFlag] = handlers[argName]; + + if (!isFlag && j + 1 < separatedArguments.length) { + throw new ArgError( + `option requires argument (but was followed by another short argument): ${originalArgName}`, + 'ARG_MISSING_REQUIRED_SHORTARG' + ); + } + + if (isFlag) { + result[argName] = type(true, argName, result[argName]); + } else if (argStr === undefined) { + if ( + argv.length < i + 2 || + (argv[i + 1].length > 1 && + argv[i + 1][0] === '-' && + !( + argv[i + 1].match(/^-?\d*(\.(?=\d))?\d*$/) && + (type === Number || + // eslint-disable-next-line no-undef + (typeof BigInt !== 'undefined' && type === BigInt)) + )) + ) { + const extended = + originalArgName === argName ? '' : ` (alias for ${argName})`; + throw new ArgError( + `option requires argument: ${originalArgName}${extended}`, + 'ARG_MISSING_REQUIRED_LONGARG' + ); + } + + result[argName] = type(argv[i + 1], argName, result[argName]); + ++i; + } else { + result[argName] = type(argStr, argName, result[argName]); + } + } + } else { + result._.push(wholeArg); + } + } + + return result; +} + +arg.flag = (fn) => { + fn[flagSymbol] = true; + return fn; +}; + +// Utility types +arg.COUNT = arg.flag((v, name, existingCount) => (existingCount || 0) + 1); + +// Expose error class +arg.ArgError = ArgError; + +var arg_1 = arg; + +/** + @license + The MIT License (MIT) + + Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com) + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ +function getOptionValue(opt) { + parseOptions(); + return options[opt]; +} +let options; +function parseOptions() { + if (!options) { + options = { + "--conditions": [], + ...parseArgv(getNodeOptionsEnvArgv()), + ...parseArgv(process.execArgv) + }; + } +} +function parseArgv(argv) { + return arg_1( + { + "--conditions": [String], + "-C": "--conditions" + }, + { + argv, + permissive: true + } + ); +} +function getNodeOptionsEnvArgv() { + const errors = []; + const envArgv = ParseNodeOptionsEnvVar(process.env.NODE_OPTIONS || "", errors); + if (errors.length !== 0) ; + return envArgv; +} +function ParseNodeOptionsEnvVar(node_options, errors) { + const env_argv = []; + let is_in_string = false; + let will_start_new_arg = true; + for (let index = 0; index < node_options.length; ++index) { + let c = node_options[index]; + if (c === "\\" && is_in_string) { + if (index + 1 === node_options.length) { + errors.push("invalid value for NODE_OPTIONS (invalid escape)\n"); + return env_argv; + } else { + c = node_options[++index]; + } + } else if (c === " " && !is_in_string) { + will_start_new_arg = true; + continue; + } else if (c === '"') { + is_in_string = !is_in_string; + continue; + } + if (will_start_new_arg) { + env_argv.push(c); + will_start_new_arg = false; + } else { + env_argv[env_argv.length - 1] += c; + } + } + if (is_in_string) { + errors.push("invalid value for NODE_OPTIONS (unterminated string)\n"); + } + return env_argv; +} + +function makeApi(runtimeState, opts) { + const alwaysWarnOnFallback = Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK) > 0; + const debugLevel = Number(process.env.PNP_DEBUG_LEVEL); + const pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/; + const isStrictRegExp = /^(\/|\.{1,2}(\/|$))/; + const isDirRegExp = /\/$/; + const isRelativeRegexp = /^\.{0,2}\//; + const topLevelLocator = { name: null, reference: null }; + const fallbackLocators = []; + const emittedWarnings = /* @__PURE__ */ new Set(); + if (runtimeState.enableTopLevelFallback === true) + fallbackLocators.push(topLevelLocator); + if (opts.compatibilityMode !== false) { + for (const name of [`react-scripts`, `gatsby`]) { + const packageStore = runtimeState.packageRegistry.get(name); + if (packageStore) { + for (const reference of packageStore.keys()) { + if (reference === null) { + throw new Error(`Assertion failed: This reference shouldn't be null`); + } else { + fallbackLocators.push({ name, reference }); + } + } + } + } + } + const { + ignorePattern, + packageRegistry, + packageLocatorsByLocations + } = runtimeState; + function makeLogEntry(name, args) { + return { + fn: name, + args, + error: null, + result: null + }; + } + function trace(entry) { + const colors = process.stderr?.hasColors?.() ?? process.stdout.isTTY; + const c = (n, str) => `\x1B[${n}m${str}\x1B[0m`; + const error = entry.error; + if (error) + console.error(c(`31;1`, `\u2716 ${entry.error?.message.replace(/\n.*/s, ``)}`)); + else + console.error(c(`33;1`, `\u203C Resolution`)); + if (entry.args.length > 0) + console.error(); + for (const arg of entry.args) + console.error(` ${c(`37;1`, `In \u2190`)} ${nodeUtils.inspect(arg, { colors, compact: true })}`); + if (entry.result) { + console.error(); + console.error(` ${c(`37;1`, `Out \u2192`)} ${nodeUtils.inspect(entry.result, { colors, compact: true })}`); + } + const stack = new Error().stack.match(/(?<=^ +)at.*/gm)?.slice(2) ?? []; + if (stack.length > 0) { + console.error(); + for (const line of stack) { + console.error(` ${c(`38;5;244`, line)}`); + } + } + console.error(); + } + function maybeLog(name, fn) { + if (opts.allowDebug === false) + return fn; + if (Number.isFinite(debugLevel)) { + if (debugLevel >= 2) { + return (...args) => { + const logEntry = makeLogEntry(name, args); + try { + return logEntry.result = fn(...args); + } catch (error) { + throw logEntry.error = error; + } finally { + trace(logEntry); + } + }; + } else if (debugLevel >= 1) { + return (...args) => { + try { + return fn(...args); + } catch (error) { + const logEntry = makeLogEntry(name, args); + logEntry.error = error; + trace(logEntry); + throw error; + } + }; + } + } + return fn; + } + function getPackageInformationSafe(packageLocator) { + const packageInformation = getPackageInformation(packageLocator); + if (!packageInformation) { + throw makeError( + ErrorCode.INTERNAL, + `Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)` + ); + } + return packageInformation; + } + function isDependencyTreeRoot(packageLocator) { + if (packageLocator.name === null) + return true; + for (const dependencyTreeRoot of runtimeState.dependencyTreeRoots) + if (dependencyTreeRoot.name === packageLocator.name && dependencyTreeRoot.reference === packageLocator.reference) + return true; + return false; + } + const defaultExportsConditions = /* @__PURE__ */ new Set([ + `node`, + `require`, + ...getOptionValue(`--conditions`) + ]); + function applyNodeExportsResolution(unqualifiedPath, conditions = defaultExportsConditions, issuer) { + const locator = findPackageLocator(ppath.join(unqualifiedPath, `internal.js`), { + resolveIgnored: true, + includeDiscardFromLookup: true + }); + if (locator === null) { + throw makeError( + ErrorCode.INTERNAL, + `The locator that owns the "${unqualifiedPath}" path can't be found inside the dependency tree (this is probably an internal error)` + ); + } + const { packageLocation } = getPackageInformationSafe(locator); + const manifestPath = ppath.join(packageLocation, Filename.manifest); + if (!opts.fakeFs.existsSync(manifestPath)) + return null; + const pkgJson = JSON.parse(opts.fakeFs.readFileSync(manifestPath, `utf8`)); + if (pkgJson.exports == null) + return null; + let subpath = ppath.contains(packageLocation, unqualifiedPath); + if (subpath === null) { + throw makeError( + ErrorCode.INTERNAL, + `unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)` + ); + } + if (subpath !== `.` && !isRelativeRegexp.test(subpath)) + subpath = `./${subpath}`; + try { + const resolvedExport = packageExportsResolve({ + packageJSONUrl: url.pathToFileURL(npath.fromPortablePath(manifestPath)), + packageSubpath: subpath, + exports: pkgJson.exports, + base: issuer ? url.pathToFileURL(npath.fromPortablePath(issuer)) : null, + conditions + }); + return npath.toPortablePath(url.fileURLToPath(resolvedExport)); + } catch (error) { + throw makeError( + ErrorCode.EXPORTS_RESOLUTION_FAILED, + error.message, + { unqualifiedPath: getPathForDisplay(unqualifiedPath), locator, pkgJson, subpath: getPathForDisplay(subpath), conditions }, + error.code + ); + } + } + function applyNodeExtensionResolution(unqualifiedPath, candidates, { extensions }) { + let stat; + try { + candidates.push(unqualifiedPath); + stat = opts.fakeFs.statSync(unqualifiedPath); + } catch (error) { + } + if (stat && !stat.isDirectory()) + return opts.fakeFs.realpathSync(unqualifiedPath); + if (stat && stat.isDirectory()) { + let pkgJson; + try { + pkgJson = JSON.parse(opts.fakeFs.readFileSync(ppath.join(unqualifiedPath, Filename.manifest), `utf8`)); + } catch (error) { + } + let nextUnqualifiedPath; + if (pkgJson && pkgJson.main) + nextUnqualifiedPath = ppath.resolve(unqualifiedPath, pkgJson.main); + if (nextUnqualifiedPath && nextUnqualifiedPath !== unqualifiedPath) { + const resolution = applyNodeExtensionResolution(nextUnqualifiedPath, candidates, { extensions }); + if (resolution !== null) { + return resolution; + } + } + } + for (let i = 0, length = extensions.length; i < length; i++) { + const candidateFile = `${unqualifiedPath}${extensions[i]}`; + candidates.push(candidateFile); + if (opts.fakeFs.existsSync(candidateFile)) { + return candidateFile; + } + } + if (stat && stat.isDirectory()) { + for (let i = 0, length = extensions.length; i < length; i++) { + const candidateFile = ppath.format({ dir: unqualifiedPath, name: `index`, ext: extensions[i] }); + candidates.push(candidateFile); + if (opts.fakeFs.existsSync(candidateFile)) { + return candidateFile; + } + } + } + return null; + } + function makeFakeModule(path) { + const fakeModule = new require$$0.Module(path, null); + fakeModule.filename = path; + fakeModule.paths = require$$0.Module._nodeModulePaths(path); + return fakeModule; + } + function callNativeResolution(request, issuer) { + if (issuer.endsWith(`/`)) + issuer = ppath.join(issuer, `internal.js`); + return require$$0.Module._resolveFilename(npath.fromPortablePath(request), makeFakeModule(npath.fromPortablePath(issuer)), false, { plugnplay: false }); + } + function isPathIgnored(path) { + if (ignorePattern === null) + return false; + const subPath = ppath.contains(runtimeState.basePath, path); + if (subPath === null) + return false; + if (ignorePattern.test(subPath.replace(/\/$/, ``))) { + return true; + } else { + return false; + } + } + const VERSIONS = { std: 3, resolveVirtual: 1, getAllLocators: 1 }; + const topLevel = topLevelLocator; + function getPackageInformation({ name, reference }) { + const packageInformationStore = packageRegistry.get(name); + if (!packageInformationStore) + return null; + const packageInformation = packageInformationStore.get(reference); + if (!packageInformation) + return null; + return packageInformation; + } + function findPackageDependents({ name, reference }) { + const dependents = []; + for (const [dependentName, packageInformationStore] of packageRegistry) { + if (dependentName === null) + continue; + for (const [dependentReference, packageInformation] of packageInformationStore) { + if (dependentReference === null) + continue; + const dependencyReference = packageInformation.packageDependencies.get(name); + if (dependencyReference !== reference) + continue; + if (dependentName === name && dependentReference === reference) + continue; + dependents.push({ + name: dependentName, + reference: dependentReference + }); + } + } + return dependents; + } + function findBrokenPeerDependencies(dependency, initialPackage) { + const brokenPackages = /* @__PURE__ */ new Map(); + const alreadyVisited = /* @__PURE__ */ new Set(); + const traversal = (currentPackage) => { + const identifier = JSON.stringify(currentPackage.name); + if (alreadyVisited.has(identifier)) + return; + alreadyVisited.add(identifier); + const dependents = findPackageDependents(currentPackage); + for (const dependent of dependents) { + const dependentInformation = getPackageInformationSafe(dependent); + if (dependentInformation.packagePeers.has(dependency)) { + traversal(dependent); + } else { + let brokenSet = brokenPackages.get(dependent.name); + if (typeof brokenSet === `undefined`) + brokenPackages.set(dependent.name, brokenSet = /* @__PURE__ */ new Set()); + brokenSet.add(dependent.reference); + } + } + }; + traversal(initialPackage); + const brokenList = []; + for (const name of [...brokenPackages.keys()].sort()) + for (const reference of [...brokenPackages.get(name)].sort()) + brokenList.push({ name, reference }); + return brokenList; + } + function findPackageLocator(location, { resolveIgnored = false, includeDiscardFromLookup = false } = {}) { + if (isPathIgnored(location) && !resolveIgnored) + return null; + let relativeLocation = ppath.relative(runtimeState.basePath, location); + if (!relativeLocation.match(isStrictRegExp)) + relativeLocation = `./${relativeLocation}`; + if (!relativeLocation.endsWith(`/`)) + relativeLocation = `${relativeLocation}/`; + do { + const entry = packageLocatorsByLocations.get(relativeLocation); + if (typeof entry === `undefined` || entry.discardFromLookup && !includeDiscardFromLookup) { + relativeLocation = relativeLocation.substring(0, relativeLocation.lastIndexOf(`/`, relativeLocation.length - 2) + 1); + continue; + } + return entry.locator; + } while (relativeLocation !== ``); + return null; + } + function tryReadFile(filePath) { + try { + return opts.fakeFs.readFileSync(npath.toPortablePath(filePath), `utf8`); + } catch (err) { + if (err.code === `ENOENT`) + return void 0; + throw err; + } + } + function resolveToUnqualified(request, issuer, { considerBuiltins = true } = {}) { + if (request.startsWith(`#`)) + throw new Error(`resolveToUnqualified can not handle private import mappings`); + if (request === `pnpapi`) + return npath.toPortablePath(opts.pnpapiResolution); + if (considerBuiltins && require$$0.isBuiltin(request)) + return null; + const requestForDisplay = getPathForDisplay(request); + const issuerForDisplay = issuer && getPathForDisplay(issuer); + if (issuer && isPathIgnored(issuer)) { + if (!ppath.isAbsolute(request) || findPackageLocator(request) === null) { + const result = callNativeResolution(request, issuer); + if (result === false) { + throw makeError( + ErrorCode.BUILTIN_NODE_RESOLUTION_FAILED, + `The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) + +Require request: "${requestForDisplay}" +Required by: ${issuerForDisplay} +`, + { request: requestForDisplay, issuer: issuerForDisplay } + ); + } + return npath.toPortablePath(result); + } + } + let unqualifiedPath; + const dependencyNameMatch = request.match(pathRegExp); + if (!dependencyNameMatch) { + if (ppath.isAbsolute(request)) { + unqualifiedPath = ppath.normalize(request); + } else { + if (!issuer) { + throw makeError( + ErrorCode.API_ERROR, + `The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute`, + { request: requestForDisplay, issuer: issuerForDisplay } + ); + } + const absoluteIssuer = ppath.resolve(issuer); + if (issuer.match(isDirRegExp)) { + unqualifiedPath = ppath.normalize(ppath.join(absoluteIssuer, request)); + } else { + unqualifiedPath = ppath.normalize(ppath.join(ppath.dirname(absoluteIssuer), request)); + } + } + } else { + if (!issuer) { + throw makeError( + ErrorCode.API_ERROR, + `The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute`, + { request: requestForDisplay, issuer: issuerForDisplay } + ); + } + const [, dependencyName, subPath] = dependencyNameMatch; + const issuerLocator = findPackageLocator(issuer); + if (!issuerLocator) { + const result = callNativeResolution(request, issuer); + if (result === false) { + throw makeError( + ErrorCode.BUILTIN_NODE_RESOLUTION_FAILED, + `The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). + +Require path: "${requestForDisplay}" +Required by: ${issuerForDisplay} +`, + { request: requestForDisplay, issuer: issuerForDisplay } + ); + } + return npath.toPortablePath(result); + } + const issuerInformation = getPackageInformationSafe(issuerLocator); + let dependencyReference = issuerInformation.packageDependencies.get(dependencyName); + let fallbackReference = null; + if (dependencyReference == null) { + if (issuerLocator.name !== null) { + const exclusionEntry = runtimeState.fallbackExclusionList.get(issuerLocator.name); + const canUseFallbacks = !exclusionEntry || !exclusionEntry.has(issuerLocator.reference); + if (canUseFallbacks) { + for (let t = 0, T = fallbackLocators.length; t < T; ++t) { + const fallbackInformation = getPackageInformationSafe(fallbackLocators[t]); + const reference = fallbackInformation.packageDependencies.get(dependencyName); + if (reference == null) + continue; + if (alwaysWarnOnFallback) + fallbackReference = reference; + else + dependencyReference = reference; + break; + } + if (runtimeState.enableTopLevelFallback) { + if (dependencyReference == null && fallbackReference === null) { + const reference = runtimeState.fallbackPool.get(dependencyName); + if (reference != null) { + fallbackReference = reference; + } + } + } + } + } + } + let error = null; + if (dependencyReference === null) { + if (isDependencyTreeRoot(issuerLocator)) { + error = makeError( + ErrorCode.MISSING_PEER_DEPENDENCY, + `Your application tried to access ${dependencyName} (a peer dependency); this isn't allowed as there is no ancestor to satisfy the requirement. Use a devDependency if needed. + +Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} +Required by: ${issuerForDisplay} +`, + { request: requestForDisplay, issuer: issuerForDisplay, dependencyName } + ); + } else { + const brokenAncestors = findBrokenPeerDependencies(dependencyName, issuerLocator); + if (brokenAncestors.every((ancestor) => isDependencyTreeRoot(ancestor))) { + error = makeError( + ErrorCode.MISSING_PEER_DEPENDENCY, + `${issuerLocator.name} tried to access ${dependencyName} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. + +Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} +Required by: ${issuerLocator.name}@${issuerLocator.reference} (via ${issuerForDisplay}) +${brokenAncestors.map((ancestorLocator) => `Ancestor breaking the chain: ${ancestorLocator.name}@${ancestorLocator.reference} +`).join(``)} +`, + { request: requestForDisplay, issuer: issuerForDisplay, issuerLocator: Object.assign({}, issuerLocator), dependencyName, brokenAncestors } + ); + } else { + error = makeError( + ErrorCode.MISSING_PEER_DEPENDENCY, + `${issuerLocator.name} tried to access ${dependencyName} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. + +Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} +Required by: ${issuerLocator.name}@${issuerLocator.reference} (via ${issuerForDisplay}) + +${brokenAncestors.map((ancestorLocator) => `Ancestor breaking the chain: ${ancestorLocator.name}@${ancestorLocator.reference} +`).join(``)} +`, + { request: requestForDisplay, issuer: issuerForDisplay, issuerLocator: Object.assign({}, issuerLocator), dependencyName, brokenAncestors } + ); + } + } + } else if (dependencyReference === void 0) { + if (!considerBuiltins && require$$0.isBuiltin(request)) { + if (isDependencyTreeRoot(issuerLocator)) { + error = makeError( + ErrorCode.UNDECLARED_DEPENDENCY, + `Your application tried to access ${dependencyName}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${dependencyName} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. + +Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} +Required by: ${issuerForDisplay} +`, + { request: requestForDisplay, issuer: issuerForDisplay, dependencyName } + ); + } else { + error = makeError( + ErrorCode.UNDECLARED_DEPENDENCY, + `${issuerLocator.name} tried to access ${dependencyName}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${dependencyName} isn't otherwise declared in ${issuerLocator.name}'s dependencies, this makes the require call ambiguous and unsound. + +Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} +Required by: ${issuerForDisplay} +`, + { request: requestForDisplay, issuer: issuerForDisplay, issuerLocator: Object.assign({}, issuerLocator), dependencyName } + ); + } + } else { + if (isDependencyTreeRoot(issuerLocator)) { + error = makeError( + ErrorCode.UNDECLARED_DEPENDENCY, + `Your application tried to access ${dependencyName}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. + +Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} +Required by: ${issuerForDisplay} +`, + { request: requestForDisplay, issuer: issuerForDisplay, dependencyName } + ); + } else { + error = makeError( + ErrorCode.UNDECLARED_DEPENDENCY, + `${issuerLocator.name} tried to access ${dependencyName}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. + +Required package: ${dependencyName}${dependencyName !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} +Required by: ${issuerLocator.name}@${issuerLocator.reference} (via ${issuerForDisplay}) +`, + { request: requestForDisplay, issuer: issuerForDisplay, issuerLocator: Object.assign({}, issuerLocator), dependencyName } + ); + } + } + } + if (dependencyReference == null) { + if (fallbackReference === null || error === null) + throw error || new Error(`Assertion failed: Expected an error to have been set`); + dependencyReference = fallbackReference; + const message = error.message.replace(/\n.*/g, ``); + error.message = message; + if (!emittedWarnings.has(message) && debugLevel !== 0) { + emittedWarnings.add(message); + process.emitWarning(error); + } + } + const dependencyLocator = Array.isArray(dependencyReference) ? { name: dependencyReference[0], reference: dependencyReference[1] } : { name: dependencyName, reference: dependencyReference }; + const dependencyInformation = getPackageInformationSafe(dependencyLocator); + if (!dependencyInformation.packageLocation) { + throw makeError( + ErrorCode.MISSING_DEPENDENCY, + `A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod. + +Required package: ${dependencyLocator.name}@${dependencyLocator.reference}${dependencyLocator.name !== requestForDisplay ? ` (via "${requestForDisplay}")` : ``} +Required by: ${issuerLocator.name}@${issuerLocator.reference} (via ${issuerForDisplay}) +`, + { request: requestForDisplay, issuer: issuerForDisplay, dependencyLocator: Object.assign({}, dependencyLocator) } + ); + } + const dependencyLocation = dependencyInformation.packageLocation; + if (subPath) { + unqualifiedPath = ppath.join(dependencyLocation, subPath); + } else { + unqualifiedPath = dependencyLocation; + } + } + return ppath.normalize(unqualifiedPath); + } + function resolveUnqualifiedExport(request, unqualifiedPath, conditions = defaultExportsConditions, issuer) { + if (isStrictRegExp.test(request)) + return unqualifiedPath; + const unqualifiedExportPath = applyNodeExportsResolution(unqualifiedPath, conditions, issuer); + if (unqualifiedExportPath) { + return ppath.normalize(unqualifiedExportPath); + } else { + return unqualifiedPath; + } + } + function resolveUnqualified(unqualifiedPath, { extensions = Object.keys(require$$0.Module._extensions) } = {}) { + const candidates = []; + const qualifiedPath = applyNodeExtensionResolution(unqualifiedPath, candidates, { extensions }); + if (qualifiedPath) { + return ppath.normalize(qualifiedPath); + } else { + reportRequiredFilesToWatchMode(candidates.map((candidate) => npath.fromPortablePath(candidate))); + const unqualifiedPathForDisplay = getPathForDisplay(unqualifiedPath); + const containingPackage = findPackageLocator(unqualifiedPath); + if (containingPackage) { + const { packageLocation } = getPackageInformationSafe(containingPackage); + let exists = true; + try { + opts.fakeFs.accessSync(packageLocation); + } catch (err) { + if (err?.code === `ENOENT`) { + exists = false; + } else { + const readableError = (err?.message ?? err ?? `empty exception thrown`).replace(/^[A-Z]/, ($0) => $0.toLowerCase()); + throw makeError(ErrorCode.QUALIFIED_PATH_RESOLUTION_FAILED, `Required package exists but could not be accessed (${readableError}). + +Missing package: ${containingPackage.name}@${containingPackage.reference} +Expected package location: ${getPathForDisplay(packageLocation)} +`, { unqualifiedPath: unqualifiedPathForDisplay, extensions }); + } + } + if (!exists) { + const errorMessage = packageLocation.includes(`/unplugged/`) ? `Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).` : `Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.`; + throw makeError( + ErrorCode.QUALIFIED_PATH_RESOLUTION_FAILED, + `${errorMessage} + +Missing package: ${containingPackage.name}@${containingPackage.reference} +Expected package location: ${getPathForDisplay(packageLocation)} +`, + { unqualifiedPath: unqualifiedPathForDisplay, extensions } + ); + } + } + throw makeError( + ErrorCode.QUALIFIED_PATH_RESOLUTION_FAILED, + `Qualified path resolution failed: we looked for the following paths, but none could be accessed. + +Source path: ${unqualifiedPathForDisplay} +${candidates.map((candidate) => `Not found: ${getPathForDisplay(candidate)} +`).join(``)}`, + { unqualifiedPath: unqualifiedPathForDisplay, extensions } + ); + } + } + function resolvePrivateRequest(request, issuer, opts2) { + if (!issuer) + throw new Error(`Assertion failed: An issuer is required to resolve private import mappings`); + const resolved = packageImportsResolve({ + name: request, + base: url.pathToFileURL(npath.fromPortablePath(issuer)), + conditions: opts2.conditions ?? defaultExportsConditions, + readFileSyncFn: tryReadFile + }); + if (resolved instanceof URL) { + return resolveUnqualified(npath.toPortablePath(url.fileURLToPath(resolved)), { extensions: opts2.extensions }); + } else { + if (resolved.startsWith(`#`)) + throw new Error(`Mapping from one private import to another isn't allowed`); + return resolveRequest(resolved, issuer, opts2); + } + } + function resolveRequest(request, issuer, opts2 = {}) { + try { + if (request.startsWith(`#`)) + return resolvePrivateRequest(request, issuer, opts2); + const { considerBuiltins, extensions, conditions } = opts2; + const unqualifiedPath = resolveToUnqualified(request, issuer, { considerBuiltins }); + if (request === `pnpapi`) + return unqualifiedPath; + if (unqualifiedPath === null) + return null; + const isIssuerIgnored = () => issuer !== null ? isPathIgnored(issuer) : false; + const remappedPath = (!considerBuiltins || !require$$0.isBuiltin(request)) && !isIssuerIgnored() ? resolveUnqualifiedExport(request, unqualifiedPath, conditions, issuer) : unqualifiedPath; + return resolveUnqualified(remappedPath, { extensions }); + } catch (error) { + if (Object.hasOwn(error, `pnpCode`)) + Object.assign(error.data, { request: getPathForDisplay(request), issuer: issuer && getPathForDisplay(issuer) }); + throw error; + } + } + function resolveVirtual(request) { + const normalized = ppath.normalize(request); + const resolved = VirtualFS.resolveVirtual(normalized); + return resolved !== normalized ? resolved : null; + } + return { + VERSIONS, + topLevel, + getLocator: (name, referencish) => { + if (Array.isArray(referencish)) { + return { name: referencish[0], reference: referencish[1] }; + } else { + return { name, reference: referencish }; + } + }, + getDependencyTreeRoots: () => { + return [...runtimeState.dependencyTreeRoots]; + }, + getAllLocators() { + const locators = []; + for (const [name, entry] of packageRegistry) + for (const reference of entry.keys()) + if (name !== null && reference !== null) + locators.push({ name, reference }); + return locators; + }, + getPackageInformation: (locator) => { + const info = getPackageInformation(locator); + if (info === null) + return null; + const packageLocation = npath.fromPortablePath(info.packageLocation); + const nativeInfo = { ...info, packageLocation }; + return nativeInfo; + }, + findPackageLocator: (path) => { + return findPackageLocator(npath.toPortablePath(path)); + }, + resolveToUnqualified: maybeLog(`resolveToUnqualified`, (request, issuer, opts2) => { + const portableIssuer = issuer !== null ? npath.toPortablePath(issuer) : null; + const resolution = resolveToUnqualified(npath.toPortablePath(request), portableIssuer, opts2); + if (resolution === null) + return null; + return npath.fromPortablePath(resolution); + }), + resolveUnqualified: maybeLog(`resolveUnqualified`, (unqualifiedPath, opts2) => { + return npath.fromPortablePath(resolveUnqualified(npath.toPortablePath(unqualifiedPath), opts2)); + }), + resolveRequest: maybeLog(`resolveRequest`, (request, issuer, opts2) => { + const portableIssuer = issuer !== null ? npath.toPortablePath(issuer) : null; + const resolution = resolveRequest(npath.toPortablePath(request), portableIssuer, opts2); + if (resolution === null) + return null; + return npath.fromPortablePath(resolution); + }), + resolveVirtual: maybeLog(`resolveVirtual`, (path) => { + const result = resolveVirtual(npath.toPortablePath(path)); + if (result !== null) { + return npath.fromPortablePath(result); + } else { + return null; + } + }) + }; +} + +function makeManager(pnpapi, opts) { + const initialApiPath = npath.toPortablePath(pnpapi.resolveToUnqualified(`pnpapi`, null)); + const initialApiStats = opts.fakeFs.statSync(npath.toPortablePath(initialApiPath)); + const apiMetadata = /* @__PURE__ */ new Map([ + [initialApiPath, { + instance: pnpapi, + stats: initialApiStats, + lastRefreshCheck: Date.now() + }] + ]); + function loadApiInstance(pnpApiPath) { + const nativePath = npath.fromPortablePath(pnpApiPath); + const module = new require$$0.Module(nativePath, null); + module.load(nativePath); + return module.exports; + } + function refreshApiEntry(pnpApiPath, apiEntry) { + const timeNow = Date.now(); + if (timeNow - apiEntry.lastRefreshCheck < 500) + return; + apiEntry.lastRefreshCheck = timeNow; + const stats = opts.fakeFs.statSync(pnpApiPath); + if (stats.mtime > apiEntry.stats.mtime) { + process.emitWarning(`[Warning] The runtime detected new information in a PnP file; reloading the API instance (${npath.fromPortablePath(pnpApiPath)})`); + apiEntry.stats = stats; + apiEntry.instance = loadApiInstance(pnpApiPath); + } + } + function getApiEntry(pnpApiPath, refresh = false) { + let apiEntry = apiMetadata.get(pnpApiPath); + if (typeof apiEntry !== `undefined`) { + if (refresh) { + refreshApiEntry(pnpApiPath, apiEntry); + } + } else { + apiMetadata.set(pnpApiPath, apiEntry = { + instance: loadApiInstance(pnpApiPath), + stats: opts.fakeFs.statSync(pnpApiPath), + lastRefreshCheck: Date.now() + }); + } + return apiEntry; + } + const findApiPathCache = /* @__PURE__ */ new Map(); + function addToCacheAndReturn(start, end, target) { + if (target !== null) { + target = VirtualFS.resolveVirtual(target); + target = opts.fakeFs.realpathSync(target); + } + let curr; + let next = start; + do { + curr = next; + findApiPathCache.set(curr, target); + next = ppath.dirname(curr); + } while (curr !== end); + return target; + } + function findApiPathFor(modulePath) { + let bestCandidate = null; + for (const [apiPath, apiEntry] of apiMetadata) { + const locator = apiEntry.instance.findPackageLocator(modulePath); + if (!locator) + continue; + if (apiMetadata.size === 1) + return apiPath; + const packageInformation = apiEntry.instance.getPackageInformation(locator); + if (!packageInformation) + throw new Error(`Assertion failed: Couldn't get package information for '${modulePath}'`); + if (!bestCandidate) + bestCandidate = { packageLocation: packageInformation.packageLocation, apiPaths: [] }; + if (packageInformation.packageLocation === bestCandidate.packageLocation) { + bestCandidate.apiPaths.push(apiPath); + } else if (packageInformation.packageLocation.length > bestCandidate.packageLocation.length) { + bestCandidate = { packageLocation: packageInformation.packageLocation, apiPaths: [apiPath] }; + } + } + if (bestCandidate) { + if (bestCandidate.apiPaths.length === 1) + return bestCandidate.apiPaths[0]; + const controlSegment = bestCandidate.apiPaths.map((apiPath) => ` ${npath.fromPortablePath(apiPath)}`).join(` +`); + throw new Error(`Unable to locate pnpapi, the module '${modulePath}' is controlled by multiple pnpapi instances. +This is usually caused by using the global cache (enableGlobalCache: true) + +Controlled by: +${controlSegment} +`); + } + const start = ppath.resolve(npath.toPortablePath(modulePath)); + let curr; + let next = start; + do { + curr = next; + const cached = findApiPathCache.get(curr); + if (cached !== void 0) + return addToCacheAndReturn(start, curr, cached); + const cjsCandidate = ppath.join(curr, Filename.pnpCjs); + if (opts.fakeFs.existsSync(cjsCandidate) && opts.fakeFs.statSync(cjsCandidate).isFile()) + return addToCacheAndReturn(start, curr, cjsCandidate); + const legacyCjsCandidate = ppath.join(curr, Filename.pnpJs); + if (opts.fakeFs.existsSync(legacyCjsCandidate) && opts.fakeFs.statSync(legacyCjsCandidate).isFile()) + return addToCacheAndReturn(start, curr, legacyCjsCandidate); + next = ppath.dirname(curr); + } while (curr !== PortablePath.root); + return addToCacheAndReturn(start, curr, null); + } + const moduleToApiPathCache = /* @__PURE__ */ new WeakMap(); + function getApiPathFromParent(parent) { + if (parent == null) + return initialApiPath; + let apiPath = moduleToApiPathCache.get(parent); + if (typeof apiPath !== `undefined`) + return apiPath; + apiPath = parent.filename ? findApiPathFor(parent.filename) : null; + moduleToApiPathCache.set(parent, apiPath); + return apiPath; + } + return { + getApiPathFromParent, + findApiPathFor, + getApiEntry + }; +} + +const localFs = { ...fs__default.default }; +const nodeFs = new NodeFS(localFs); +const defaultRuntimeState = $$SETUP_STATE(hydrateRuntimeState); +const defaultPnpapiResolution = __filename; +const defaultFsLayer = new VirtualFS({ + baseFs: new ZipOpenFS({ + baseFs: nodeFs, + maxOpenFiles: 80, + readOnlyArchives: true + }) +}); +class DynamicFS extends ProxiedFS { + constructor() { + super(ppath); + this.baseFs = defaultFsLayer; + } + mapToBase(p) { + return p; + } + mapFromBase(p) { + return p; + } +} +const dynamicFsLayer = new DynamicFS(); +let manager; +const defaultApi = Object.assign(makeApi(defaultRuntimeState, { + fakeFs: dynamicFsLayer, + pnpapiResolution: defaultPnpapiResolution +}), { + makeApi: ({ + basePath = void 0, + fakeFs = dynamicFsLayer, + pnpapiResolution = defaultPnpapiResolution, + ...rest + }) => { + const apiRuntimeState = typeof basePath !== `undefined` ? $$SETUP_STATE(hydrateRuntimeState, basePath) : defaultRuntimeState; + return makeApi(apiRuntimeState, { + fakeFs, + pnpapiResolution, + ...rest + }); + }, + setup: (api) => { + applyPatch(api || defaultApi, { + fakeFs: defaultFsLayer, + manager + }); + dynamicFsLayer.baseFs = new NodeFS(fs__default.default); + } +}); +manager = makeManager(defaultApi, { + fakeFs: dynamicFsLayer +}); +if (module.parent && module.parent.id === `internal/preload`) { + defaultApi.setup(); + if (module.filename) { + delete require$$0__default.default._cache[module.filename]; + } +} +if (process.mainModule === module) { + const reportError = (code, message, data) => { + process.stdout.write(`${JSON.stringify([{ code, message, data }, null])} +`); + }; + const reportSuccess = (resolution) => { + process.stdout.write(`${JSON.stringify([null, resolution])} +`); + }; + const processResolution = (request, issuer) => { + try { + reportSuccess(defaultApi.resolveRequest(request, issuer)); + } catch (error) { + reportError(error.code, error.message, error.data); + } + }; + const processRequest = (data) => { + try { + const [request, issuer] = JSON.parse(data); + processResolution(request, issuer); + } catch (error) { + reportError(`INVALID_JSON`, error.message, error.data); + } + }; + if (process.argv.length > 2) { + if (process.argv.length !== 4) { + process.stderr.write(`Usage: ${process.argv[0]} ${process.argv[1]} +`); + process.exitCode = 64; + } else { + processResolution(process.argv[2], process.argv[3]); + } + } else { + let buffer = ``; + const decoder = new StringDecoder__default.default.StringDecoder(); + process.stdin.on(`data`, (chunk) => { + buffer += decoder.write(chunk); + do { + const index = buffer.indexOf(` +`); + if (index === -1) + break; + const line = buffer.slice(0, index); + buffer = buffer.slice(index + 1); + processRequest(line); + } while (true); + }); + } +} + +module.exports = defaultApi; diff --git a/.pnp.loader.mjs b/.pnp.loader.mjs new file mode 100644 index 00000000..fe96ee1d --- /dev/null +++ b/.pnp.loader.mjs @@ -0,0 +1,2090 @@ +import fs from 'fs'; +import { URL as URL$1, fileURLToPath, pathToFileURL } from 'url'; +import path from 'path'; +import { createHash } from 'crypto'; +import { EOL } from 'os'; +import moduleExports, { isBuiltin } from 'module'; +import assert from 'assert'; + +const SAFE_TIME = 456789e3; + +const PortablePath = { + root: `/`, + dot: `.`, + parent: `..` +}; +const npath = Object.create(path); +const ppath = Object.create(path.posix); +npath.cwd = () => process.cwd(); +ppath.cwd = process.platform === `win32` ? () => toPortablePath(process.cwd()) : process.cwd; +if (process.platform === `win32`) { + ppath.resolve = (...segments) => { + if (segments.length > 0 && ppath.isAbsolute(segments[0])) { + return path.posix.resolve(...segments); + } else { + return path.posix.resolve(ppath.cwd(), ...segments); + } + }; +} +const contains = function(pathUtils, from, to) { + from = pathUtils.normalize(from); + to = pathUtils.normalize(to); + if (from === to) + return `.`; + if (!from.endsWith(pathUtils.sep)) + from = from + pathUtils.sep; + if (to.startsWith(from)) { + return to.slice(from.length); + } else { + return null; + } +}; +npath.contains = (from, to) => contains(npath, from, to); +ppath.contains = (from, to) => contains(ppath, from, to); +const WINDOWS_PATH_REGEXP = /^([a-zA-Z]:.*)$/; +const UNC_WINDOWS_PATH_REGEXP = /^\/\/(\.\/)?(.*)$/; +const PORTABLE_PATH_REGEXP = /^\/([a-zA-Z]:.*)$/; +const UNC_PORTABLE_PATH_REGEXP = /^\/unc\/(\.dot\/)?(.*)$/; +function fromPortablePathWin32(p) { + let portablePathMatch, uncPortablePathMatch; + if (portablePathMatch = p.match(PORTABLE_PATH_REGEXP)) + p = portablePathMatch[1]; + else if (uncPortablePathMatch = p.match(UNC_PORTABLE_PATH_REGEXP)) + p = `\\\\${uncPortablePathMatch[1] ? `.\\` : ``}${uncPortablePathMatch[2]}`; + else + return p; + return p.replace(/\//g, `\\`); +} +function toPortablePathWin32(p) { + p = p.replace(/\\/g, `/`); + let windowsPathMatch, uncWindowsPathMatch; + if (windowsPathMatch = p.match(WINDOWS_PATH_REGEXP)) + p = `/${windowsPathMatch[1]}`; + else if (uncWindowsPathMatch = p.match(UNC_WINDOWS_PATH_REGEXP)) + p = `/unc/${uncWindowsPathMatch[1] ? `.dot/` : ``}${uncWindowsPathMatch[2]}`; + return p; +} +const toPortablePath = process.platform === `win32` ? toPortablePathWin32 : (p) => p; +const fromPortablePath = process.platform === `win32` ? fromPortablePathWin32 : (p) => p; +npath.fromPortablePath = fromPortablePath; +npath.toPortablePath = toPortablePath; +function convertPath(targetPathUtils, sourcePath) { + return targetPathUtils === npath ? fromPortablePath(sourcePath) : toPortablePath(sourcePath); +} + +const defaultTime = new Date(SAFE_TIME * 1e3); +const defaultTimeMs = defaultTime.getTime(); +async function copyPromise(destinationFs, destination, sourceFs, source, opts) { + const normalizedDestination = destinationFs.pathUtils.normalize(destination); + const normalizedSource = sourceFs.pathUtils.normalize(source); + const prelayout = []; + const postlayout = []; + const { atime, mtime } = opts.stableTime ? { atime: defaultTime, mtime: defaultTime } : await sourceFs.lstatPromise(normalizedSource); + await destinationFs.mkdirpPromise(destinationFs.pathUtils.dirname(destination), { utimes: [atime, mtime] }); + await copyImpl(prelayout, postlayout, destinationFs, normalizedDestination, sourceFs, normalizedSource, { ...opts, didParentExist: true }); + for (const operation of prelayout) + await operation(); + await Promise.all(postlayout.map((operation) => { + return operation(); + })); +} +async function copyImpl(prelayout, postlayout, destinationFs, destination, sourceFs, source, opts) { + const destinationStat = opts.didParentExist ? await maybeLStat(destinationFs, destination) : null; + const sourceStat = await sourceFs.lstatPromise(source); + const { atime, mtime } = opts.stableTime ? { atime: defaultTime, mtime: defaultTime } : sourceStat; + let updated; + switch (true) { + case sourceStat.isDirectory(): + { + updated = await copyFolder(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); + } + break; + case sourceStat.isFile(): + { + updated = await copyFile(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); + } + break; + case sourceStat.isSymbolicLink(): + { + updated = await copySymlink(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); + } + break; + default: + { + throw new Error(`Unsupported file type (${sourceStat.mode})`); + } + } + if (opts.linkStrategy?.type !== `HardlinkFromIndex` || !sourceStat.isFile()) { + if (updated || destinationStat?.mtime?.getTime() !== mtime.getTime() || destinationStat?.atime?.getTime() !== atime.getTime()) { + postlayout.push(() => destinationFs.lutimesPromise(destination, atime, mtime)); + updated = true; + } + if (destinationStat === null || (destinationStat.mode & 511) !== (sourceStat.mode & 511)) { + postlayout.push(() => destinationFs.chmodPromise(destination, sourceStat.mode & 511)); + updated = true; + } + } + return updated; +} +async function maybeLStat(baseFs, p) { + try { + return await baseFs.lstatPromise(p); + } catch (e) { + return null; + } +} +async function copyFolder(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { + if (destinationStat !== null && !destinationStat.isDirectory()) { + if (opts.overwrite) { + prelayout.push(async () => destinationFs.removePromise(destination)); + destinationStat = null; + } else { + return false; + } + } + let updated = false; + if (destinationStat === null) { + prelayout.push(async () => { + try { + await destinationFs.mkdirPromise(destination, { mode: sourceStat.mode }); + } catch (err) { + if (err.code !== `EEXIST`) { + throw err; + } + } + }); + updated = true; + } + const entries = await sourceFs.readdirPromise(source); + const nextOpts = opts.didParentExist && !destinationStat ? { ...opts, didParentExist: false } : opts; + if (opts.stableSort) { + for (const entry of entries.sort()) { + if (await copyImpl(prelayout, postlayout, destinationFs, destinationFs.pathUtils.join(destination, entry), sourceFs, sourceFs.pathUtils.join(source, entry), nextOpts)) { + updated = true; + } + } + } else { + const entriesUpdateStatus = await Promise.all(entries.map(async (entry) => { + await copyImpl(prelayout, postlayout, destinationFs, destinationFs.pathUtils.join(destination, entry), sourceFs, sourceFs.pathUtils.join(source, entry), nextOpts); + })); + if (entriesUpdateStatus.some((status) => status)) { + updated = true; + } + } + return updated; +} +async function copyFileViaIndex(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts, linkStrategy) { + const sourceHash = await sourceFs.checksumFilePromise(source, { algorithm: `sha1` }); + const indexPath = destinationFs.pathUtils.join(linkStrategy.indexPath, sourceHash.slice(0, 2), `${sourceHash}.dat`); + let AtomicBehavior; + ((AtomicBehavior2) => { + AtomicBehavior2[AtomicBehavior2["Lock"] = 0] = "Lock"; + AtomicBehavior2[AtomicBehavior2["Rename"] = 1] = "Rename"; + })(AtomicBehavior || (AtomicBehavior = {})); + let atomicBehavior = 1 /* Rename */; + let indexStat = await maybeLStat(destinationFs, indexPath); + if (destinationStat) { + const isDestinationHardlinkedFromIndex = indexStat && destinationStat.dev === indexStat.dev && destinationStat.ino === indexStat.ino; + const isIndexModified = indexStat?.mtimeMs !== defaultTimeMs; + if (isDestinationHardlinkedFromIndex) { + if (isIndexModified && linkStrategy.autoRepair) { + atomicBehavior = 0 /* Lock */; + indexStat = null; + } + } + if (!isDestinationHardlinkedFromIndex) { + if (opts.overwrite) { + prelayout.push(async () => destinationFs.removePromise(destination)); + destinationStat = null; + } else { + return false; + } + } + } + const tempPath = !indexStat && atomicBehavior === 1 /* Rename */ ? `${indexPath}.${Math.floor(Math.random() * 4294967296).toString(16).padStart(8, `0`)}` : null; + let tempPathCleaned = false; + prelayout.push(async () => { + if (!indexStat) { + if (atomicBehavior === 0 /* Lock */) { + await destinationFs.lockPromise(indexPath, async () => { + const content = await sourceFs.readFilePromise(source); + await destinationFs.writeFilePromise(indexPath, content); + }); + } + if (atomicBehavior === 1 /* Rename */ && tempPath) { + const content = await sourceFs.readFilePromise(source); + await destinationFs.writeFilePromise(tempPath, content); + try { + await destinationFs.linkPromise(tempPath, indexPath); + } catch (err) { + if (err.code === `EEXIST`) { + tempPathCleaned = true; + await destinationFs.unlinkPromise(tempPath); + } else { + throw err; + } + } + } + } + if (!destinationStat) { + await destinationFs.linkPromise(indexPath, destination); + } + }); + postlayout.push(async () => { + if (!indexStat) + await destinationFs.lutimesPromise(indexPath, defaultTime, defaultTime); + if (tempPath && !tempPathCleaned) { + await destinationFs.unlinkPromise(tempPath); + } + }); + return false; +} +async function copyFileDirect(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { + if (destinationStat !== null) { + if (opts.overwrite) { + prelayout.push(async () => destinationFs.removePromise(destination)); + destinationStat = null; + } else { + return false; + } + } + prelayout.push(async () => { + const content = await sourceFs.readFilePromise(source); + await destinationFs.writeFilePromise(destination, content); + }); + return true; +} +async function copyFile(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { + if (opts.linkStrategy?.type === `HardlinkFromIndex`) { + return copyFileViaIndex(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts, opts.linkStrategy); + } else { + return copyFileDirect(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts); + } +} +async function copySymlink(prelayout, postlayout, destinationFs, destination, destinationStat, sourceFs, source, sourceStat, opts) { + if (destinationStat !== null) { + if (opts.overwrite) { + prelayout.push(async () => destinationFs.removePromise(destination)); + destinationStat = null; + } else { + return false; + } + } + prelayout.push(async () => { + await destinationFs.symlinkPromise(convertPath(destinationFs.pathUtils, await sourceFs.readlinkPromise(source)), destination); + }); + return true; +} + +class FakeFS { + constructor(pathUtils) { + this.pathUtils = pathUtils; + } + async *genTraversePromise(init, { stableSort = false } = {}) { + const stack = [init]; + while (stack.length > 0) { + const p = stack.shift(); + const entry = await this.lstatPromise(p); + if (entry.isDirectory()) { + const entries = await this.readdirPromise(p); + if (stableSort) { + for (const entry2 of entries.sort()) { + stack.push(this.pathUtils.join(p, entry2)); + } + } else { + throw new Error(`Not supported`); + } + } else { + yield p; + } + } + } + async checksumFilePromise(path, { algorithm = `sha512` } = {}) { + const fd = await this.openPromise(path, `r`); + try { + const CHUNK_SIZE = 65536; + const chunk = Buffer.allocUnsafeSlow(CHUNK_SIZE); + const hash = createHash(algorithm); + let bytesRead = 0; + while ((bytesRead = await this.readPromise(fd, chunk, 0, CHUNK_SIZE)) !== 0) + hash.update(bytesRead === CHUNK_SIZE ? chunk : chunk.slice(0, bytesRead)); + return hash.digest(`hex`); + } finally { + await this.closePromise(fd); + } + } + async removePromise(p, { recursive = true, maxRetries = 5 } = {}) { + let stat; + try { + stat = await this.lstatPromise(p); + } catch (error) { + if (error.code === `ENOENT`) { + return; + } else { + throw error; + } + } + if (stat.isDirectory()) { + if (recursive) { + const entries = await this.readdirPromise(p); + await Promise.all(entries.map((entry) => { + return this.removePromise(this.pathUtils.resolve(p, entry)); + })); + } + for (let t = 0; t <= maxRetries; t++) { + try { + await this.rmdirPromise(p); + break; + } catch (error) { + if (error.code !== `EBUSY` && error.code !== `ENOTEMPTY`) { + throw error; + } else if (t < maxRetries) { + await new Promise((resolve) => setTimeout(resolve, t * 100)); + } + } + } + } else { + await this.unlinkPromise(p); + } + } + removeSync(p, { recursive = true } = {}) { + let stat; + try { + stat = this.lstatSync(p); + } catch (error) { + if (error.code === `ENOENT`) { + return; + } else { + throw error; + } + } + if (stat.isDirectory()) { + if (recursive) + for (const entry of this.readdirSync(p)) + this.removeSync(this.pathUtils.resolve(p, entry)); + this.rmdirSync(p); + } else { + this.unlinkSync(p); + } + } + async mkdirpPromise(p, { chmod, utimes } = {}) { + p = this.resolve(p); + if (p === this.pathUtils.dirname(p)) + return void 0; + const parts = p.split(this.pathUtils.sep); + let createdDirectory; + for (let u = 2; u <= parts.length; ++u) { + const subPath = parts.slice(0, u).join(this.pathUtils.sep); + if (!this.existsSync(subPath)) { + try { + await this.mkdirPromise(subPath); + } catch (error) { + if (error.code === `EEXIST`) { + continue; + } else { + throw error; + } + } + createdDirectory ??= subPath; + if (chmod != null) + await this.chmodPromise(subPath, chmod); + if (utimes != null) { + await this.utimesPromise(subPath, utimes[0], utimes[1]); + } else { + const parentStat = await this.statPromise(this.pathUtils.dirname(subPath)); + await this.utimesPromise(subPath, parentStat.atime, parentStat.mtime); + } + } + } + return createdDirectory; + } + mkdirpSync(p, { chmod, utimes } = {}) { + p = this.resolve(p); + if (p === this.pathUtils.dirname(p)) + return void 0; + const parts = p.split(this.pathUtils.sep); + let createdDirectory; + for (let u = 2; u <= parts.length; ++u) { + const subPath = parts.slice(0, u).join(this.pathUtils.sep); + if (!this.existsSync(subPath)) { + try { + this.mkdirSync(subPath); + } catch (error) { + if (error.code === `EEXIST`) { + continue; + } else { + throw error; + } + } + createdDirectory ??= subPath; + if (chmod != null) + this.chmodSync(subPath, chmod); + if (utimes != null) { + this.utimesSync(subPath, utimes[0], utimes[1]); + } else { + const parentStat = this.statSync(this.pathUtils.dirname(subPath)); + this.utimesSync(subPath, parentStat.atime, parentStat.mtime); + } + } + } + return createdDirectory; + } + async copyPromise(destination, source, { baseFs = this, overwrite = true, stableSort = false, stableTime = false, linkStrategy = null } = {}) { + return await copyPromise(this, destination, baseFs, source, { overwrite, stableSort, stableTime, linkStrategy }); + } + copySync(destination, source, { baseFs = this, overwrite = true } = {}) { + const stat = baseFs.lstatSync(source); + const exists = this.existsSync(destination); + if (stat.isDirectory()) { + this.mkdirpSync(destination); + const directoryListing = baseFs.readdirSync(source); + for (const entry of directoryListing) { + this.copySync(this.pathUtils.join(destination, entry), baseFs.pathUtils.join(source, entry), { baseFs, overwrite }); + } + } else if (stat.isFile()) { + if (!exists || overwrite) { + if (exists) + this.removeSync(destination); + const content = baseFs.readFileSync(source); + this.writeFileSync(destination, content); + } + } else if (stat.isSymbolicLink()) { + if (!exists || overwrite) { + if (exists) + this.removeSync(destination); + const target = baseFs.readlinkSync(source); + this.symlinkSync(convertPath(this.pathUtils, target), destination); + } + } else { + throw new Error(`Unsupported file type (file: ${source}, mode: 0o${stat.mode.toString(8).padStart(6, `0`)})`); + } + const mode = stat.mode & 511; + this.chmodSync(destination, mode); + } + async changeFilePromise(p, content, opts = {}) { + if (Buffer.isBuffer(content)) { + return this.changeFileBufferPromise(p, content, opts); + } else { + return this.changeFileTextPromise(p, content, opts); + } + } + async changeFileBufferPromise(p, content, { mode } = {}) { + let current = Buffer.alloc(0); + try { + current = await this.readFilePromise(p); + } catch (error) { + } + if (Buffer.compare(current, content) === 0) + return; + await this.writeFilePromise(p, content, { mode }); + } + async changeFileTextPromise(p, content, { automaticNewlines, mode } = {}) { + let current = ``; + try { + current = await this.readFilePromise(p, `utf8`); + } catch (error) { + } + const normalizedContent = automaticNewlines ? normalizeLineEndings(current, content) : content; + if (current === normalizedContent) + return; + await this.writeFilePromise(p, normalizedContent, { mode }); + } + changeFileSync(p, content, opts = {}) { + if (Buffer.isBuffer(content)) { + return this.changeFileBufferSync(p, content, opts); + } else { + return this.changeFileTextSync(p, content, opts); + } + } + changeFileBufferSync(p, content, { mode } = {}) { + let current = Buffer.alloc(0); + try { + current = this.readFileSync(p); + } catch (error) { + } + if (Buffer.compare(current, content) === 0) + return; + this.writeFileSync(p, content, { mode }); + } + changeFileTextSync(p, content, { automaticNewlines = false, mode } = {}) { + let current = ``; + try { + current = this.readFileSync(p, `utf8`); + } catch (error) { + } + const normalizedContent = automaticNewlines ? normalizeLineEndings(current, content) : content; + if (current === normalizedContent) + return; + this.writeFileSync(p, normalizedContent, { mode }); + } + async movePromise(fromP, toP) { + try { + await this.renamePromise(fromP, toP); + } catch (error) { + if (error.code === `EXDEV`) { + await this.copyPromise(toP, fromP); + await this.removePromise(fromP); + } else { + throw error; + } + } + } + moveSync(fromP, toP) { + try { + this.renameSync(fromP, toP); + } catch (error) { + if (error.code === `EXDEV`) { + this.copySync(toP, fromP); + this.removeSync(fromP); + } else { + throw error; + } + } + } + async lockPromise(affectedPath, callback) { + const lockPath = `${affectedPath}.flock`; + const interval = 1e3 / 60; + const startTime = Date.now(); + let fd = null; + const isAlive = async () => { + let pid; + try { + [pid] = await this.readJsonPromise(lockPath); + } catch (error) { + return Date.now() - startTime < 500; + } + try { + process.kill(pid, 0); + return true; + } catch (error) { + return false; + } + }; + while (fd === null) { + try { + fd = await this.openPromise(lockPath, `wx`); + } catch (error) { + if (error.code === `EEXIST`) { + if (!await isAlive()) { + try { + await this.unlinkPromise(lockPath); + continue; + } catch (error2) { + } + } + if (Date.now() - startTime < 60 * 1e3) { + await new Promise((resolve) => setTimeout(resolve, interval)); + } else { + throw new Error(`Couldn't acquire a lock in a reasonable time (via ${lockPath})`); + } + } else { + throw error; + } + } + } + await this.writePromise(fd, JSON.stringify([process.pid])); + try { + return await callback(); + } finally { + try { + await this.closePromise(fd); + await this.unlinkPromise(lockPath); + } catch (error) { + } + } + } + async readJsonPromise(p) { + const content = await this.readFilePromise(p, `utf8`); + try { + return JSON.parse(content); + } catch (error) { + error.message += ` (in ${p})`; + throw error; + } + } + readJsonSync(p) { + const content = this.readFileSync(p, `utf8`); + try { + return JSON.parse(content); + } catch (error) { + error.message += ` (in ${p})`; + throw error; + } + } + async writeJsonPromise(p, data, { compact = false } = {}) { + const space = compact ? 0 : 2; + return await this.writeFilePromise(p, `${JSON.stringify(data, null, space)} +`); + } + writeJsonSync(p, data, { compact = false } = {}) { + const space = compact ? 0 : 2; + return this.writeFileSync(p, `${JSON.stringify(data, null, space)} +`); + } + async preserveTimePromise(p, cb) { + const stat = await this.lstatPromise(p); + const result = await cb(); + if (typeof result !== `undefined`) + p = result; + await this.lutimesPromise(p, stat.atime, stat.mtime); + } + async preserveTimeSync(p, cb) { + const stat = this.lstatSync(p); + const result = cb(); + if (typeof result !== `undefined`) + p = result; + this.lutimesSync(p, stat.atime, stat.mtime); + } +} +class BasePortableFakeFS extends FakeFS { + constructor() { + super(ppath); + } +} +function getEndOfLine(content) { + const matches = content.match(/\r?\n/g); + if (matches === null) + return EOL; + const crlf = matches.filter((nl) => nl === `\r +`).length; + const lf = matches.length - crlf; + return crlf > lf ? `\r +` : ` +`; +} +function normalizeLineEndings(originalContent, newContent) { + return newContent.replace(/\r?\n/g, getEndOfLine(originalContent)); +} + +class ProxiedFS extends FakeFS { + getExtractHint(hints) { + return this.baseFs.getExtractHint(hints); + } + resolve(path) { + return this.mapFromBase(this.baseFs.resolve(this.mapToBase(path))); + } + getRealPath() { + return this.mapFromBase(this.baseFs.getRealPath()); + } + async openPromise(p, flags, mode) { + return this.baseFs.openPromise(this.mapToBase(p), flags, mode); + } + openSync(p, flags, mode) { + return this.baseFs.openSync(this.mapToBase(p), flags, mode); + } + async opendirPromise(p, opts) { + return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(p), opts), { path: p }); + } + opendirSync(p, opts) { + return Object.assign(this.baseFs.opendirSync(this.mapToBase(p), opts), { path: p }); + } + async readPromise(fd, buffer, offset, length, position) { + return await this.baseFs.readPromise(fd, buffer, offset, length, position); + } + readSync(fd, buffer, offset, length, position) { + return this.baseFs.readSync(fd, buffer, offset, length, position); + } + async writePromise(fd, buffer, offset, length, position) { + if (typeof buffer === `string`) { + return await this.baseFs.writePromise(fd, buffer, offset); + } else { + return await this.baseFs.writePromise(fd, buffer, offset, length, position); + } + } + writeSync(fd, buffer, offset, length, position) { + if (typeof buffer === `string`) { + return this.baseFs.writeSync(fd, buffer, offset); + } else { + return this.baseFs.writeSync(fd, buffer, offset, length, position); + } + } + async closePromise(fd) { + return this.baseFs.closePromise(fd); + } + closeSync(fd) { + this.baseFs.closeSync(fd); + } + createReadStream(p, opts) { + return this.baseFs.createReadStream(p !== null ? this.mapToBase(p) : p, opts); + } + createWriteStream(p, opts) { + return this.baseFs.createWriteStream(p !== null ? this.mapToBase(p) : p, opts); + } + async realpathPromise(p) { + return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(p))); + } + realpathSync(p) { + return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(p))); + } + async existsPromise(p) { + return this.baseFs.existsPromise(this.mapToBase(p)); + } + existsSync(p) { + return this.baseFs.existsSync(this.mapToBase(p)); + } + accessSync(p, mode) { + return this.baseFs.accessSync(this.mapToBase(p), mode); + } + async accessPromise(p, mode) { + return this.baseFs.accessPromise(this.mapToBase(p), mode); + } + async statPromise(p, opts) { + return this.baseFs.statPromise(this.mapToBase(p), opts); + } + statSync(p, opts) { + return this.baseFs.statSync(this.mapToBase(p), opts); + } + async fstatPromise(fd, opts) { + return this.baseFs.fstatPromise(fd, opts); + } + fstatSync(fd, opts) { + return this.baseFs.fstatSync(fd, opts); + } + lstatPromise(p, opts) { + return this.baseFs.lstatPromise(this.mapToBase(p), opts); + } + lstatSync(p, opts) { + return this.baseFs.lstatSync(this.mapToBase(p), opts); + } + async fchmodPromise(fd, mask) { + return this.baseFs.fchmodPromise(fd, mask); + } + fchmodSync(fd, mask) { + return this.baseFs.fchmodSync(fd, mask); + } + async chmodPromise(p, mask) { + return this.baseFs.chmodPromise(this.mapToBase(p), mask); + } + chmodSync(p, mask) { + return this.baseFs.chmodSync(this.mapToBase(p), mask); + } + async fchownPromise(fd, uid, gid) { + return this.baseFs.fchownPromise(fd, uid, gid); + } + fchownSync(fd, uid, gid) { + return this.baseFs.fchownSync(fd, uid, gid); + } + async chownPromise(p, uid, gid) { + return this.baseFs.chownPromise(this.mapToBase(p), uid, gid); + } + chownSync(p, uid, gid) { + return this.baseFs.chownSync(this.mapToBase(p), uid, gid); + } + async renamePromise(oldP, newP) { + return this.baseFs.renamePromise(this.mapToBase(oldP), this.mapToBase(newP)); + } + renameSync(oldP, newP) { + return this.baseFs.renameSync(this.mapToBase(oldP), this.mapToBase(newP)); + } + async copyFilePromise(sourceP, destP, flags = 0) { + return this.baseFs.copyFilePromise(this.mapToBase(sourceP), this.mapToBase(destP), flags); + } + copyFileSync(sourceP, destP, flags = 0) { + return this.baseFs.copyFileSync(this.mapToBase(sourceP), this.mapToBase(destP), flags); + } + async appendFilePromise(p, content, opts) { + return this.baseFs.appendFilePromise(this.fsMapToBase(p), content, opts); + } + appendFileSync(p, content, opts) { + return this.baseFs.appendFileSync(this.fsMapToBase(p), content, opts); + } + async writeFilePromise(p, content, opts) { + return this.baseFs.writeFilePromise(this.fsMapToBase(p), content, opts); + } + writeFileSync(p, content, opts) { + return this.baseFs.writeFileSync(this.fsMapToBase(p), content, opts); + } + async unlinkPromise(p) { + return this.baseFs.unlinkPromise(this.mapToBase(p)); + } + unlinkSync(p) { + return this.baseFs.unlinkSync(this.mapToBase(p)); + } + async utimesPromise(p, atime, mtime) { + return this.baseFs.utimesPromise(this.mapToBase(p), atime, mtime); + } + utimesSync(p, atime, mtime) { + return this.baseFs.utimesSync(this.mapToBase(p), atime, mtime); + } + async lutimesPromise(p, atime, mtime) { + return this.baseFs.lutimesPromise(this.mapToBase(p), atime, mtime); + } + lutimesSync(p, atime, mtime) { + return this.baseFs.lutimesSync(this.mapToBase(p), atime, mtime); + } + async mkdirPromise(p, opts) { + return this.baseFs.mkdirPromise(this.mapToBase(p), opts); + } + mkdirSync(p, opts) { + return this.baseFs.mkdirSync(this.mapToBase(p), opts); + } + async rmdirPromise(p, opts) { + return this.baseFs.rmdirPromise(this.mapToBase(p), opts); + } + rmdirSync(p, opts) { + return this.baseFs.rmdirSync(this.mapToBase(p), opts); + } + async linkPromise(existingP, newP) { + return this.baseFs.linkPromise(this.mapToBase(existingP), this.mapToBase(newP)); + } + linkSync(existingP, newP) { + return this.baseFs.linkSync(this.mapToBase(existingP), this.mapToBase(newP)); + } + async symlinkPromise(target, p, type) { + const mappedP = this.mapToBase(p); + if (this.pathUtils.isAbsolute(target)) + return this.baseFs.symlinkPromise(this.mapToBase(target), mappedP, type); + const mappedAbsoluteTarget = this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(p), target)); + const mappedTarget = this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(mappedP), mappedAbsoluteTarget); + return this.baseFs.symlinkPromise(mappedTarget, mappedP, type); + } + symlinkSync(target, p, type) { + const mappedP = this.mapToBase(p); + if (this.pathUtils.isAbsolute(target)) + return this.baseFs.symlinkSync(this.mapToBase(target), mappedP, type); + const mappedAbsoluteTarget = this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(p), target)); + const mappedTarget = this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(mappedP), mappedAbsoluteTarget); + return this.baseFs.symlinkSync(mappedTarget, mappedP, type); + } + async readFilePromise(p, encoding) { + return this.baseFs.readFilePromise(this.fsMapToBase(p), encoding); + } + readFileSync(p, encoding) { + return this.baseFs.readFileSync(this.fsMapToBase(p), encoding); + } + readdirPromise(p, opts) { + return this.baseFs.readdirPromise(this.mapToBase(p), opts); + } + readdirSync(p, opts) { + return this.baseFs.readdirSync(this.mapToBase(p), opts); + } + async readlinkPromise(p) { + return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(p))); + } + readlinkSync(p) { + return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(p))); + } + async truncatePromise(p, len) { + return this.baseFs.truncatePromise(this.mapToBase(p), len); + } + truncateSync(p, len) { + return this.baseFs.truncateSync(this.mapToBase(p), len); + } + async ftruncatePromise(fd, len) { + return this.baseFs.ftruncatePromise(fd, len); + } + ftruncateSync(fd, len) { + return this.baseFs.ftruncateSync(fd, len); + } + watch(p, a, b) { + return this.baseFs.watch( + this.mapToBase(p), + a, + b + ); + } + watchFile(p, a, b) { + return this.baseFs.watchFile( + this.mapToBase(p), + a, + b + ); + } + unwatchFile(p, cb) { + return this.baseFs.unwatchFile(this.mapToBase(p), cb); + } + fsMapToBase(p) { + if (typeof p === `number`) { + return p; + } else { + return this.mapToBase(p); + } + } +} + +function direntToPortable(dirent) { + const portableDirent = dirent; + if (typeof dirent.path === `string`) + portableDirent.path = npath.toPortablePath(dirent.path); + return portableDirent; +} +class NodeFS extends BasePortableFakeFS { + constructor(realFs = fs) { + super(); + this.realFs = realFs; + } + getExtractHint() { + return false; + } + getRealPath() { + return PortablePath.root; + } + resolve(p) { + return ppath.resolve(p); + } + async openPromise(p, flags, mode) { + return await new Promise((resolve, reject) => { + this.realFs.open(npath.fromPortablePath(p), flags, mode, this.makeCallback(resolve, reject)); + }); + } + openSync(p, flags, mode) { + return this.realFs.openSync(npath.fromPortablePath(p), flags, mode); + } + async opendirPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (typeof opts !== `undefined`) { + this.realFs.opendir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.opendir(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }).then((dir) => { + const dirWithFixedPath = dir; + Object.defineProperty(dirWithFixedPath, `path`, { + value: p, + configurable: true, + writable: true + }); + return dirWithFixedPath; + }); + } + opendirSync(p, opts) { + const dir = typeof opts !== `undefined` ? this.realFs.opendirSync(npath.fromPortablePath(p), opts) : this.realFs.opendirSync(npath.fromPortablePath(p)); + const dirWithFixedPath = dir; + Object.defineProperty(dirWithFixedPath, `path`, { + value: p, + configurable: true, + writable: true + }); + return dirWithFixedPath; + } + async readPromise(fd, buffer, offset = 0, length = 0, position = -1) { + return await new Promise((resolve, reject) => { + this.realFs.read(fd, buffer, offset, length, position, (error, bytesRead) => { + if (error) { + reject(error); + } else { + resolve(bytesRead); + } + }); + }); + } + readSync(fd, buffer, offset, length, position) { + return this.realFs.readSync(fd, buffer, offset, length, position); + } + async writePromise(fd, buffer, offset, length, position) { + return await new Promise((resolve, reject) => { + if (typeof buffer === `string`) { + return this.realFs.write(fd, buffer, offset, this.makeCallback(resolve, reject)); + } else { + return this.realFs.write(fd, buffer, offset, length, position, this.makeCallback(resolve, reject)); + } + }); + } + writeSync(fd, buffer, offset, length, position) { + if (typeof buffer === `string`) { + return this.realFs.writeSync(fd, buffer, offset); + } else { + return this.realFs.writeSync(fd, buffer, offset, length, position); + } + } + async closePromise(fd) { + await new Promise((resolve, reject) => { + this.realFs.close(fd, this.makeCallback(resolve, reject)); + }); + } + closeSync(fd) { + this.realFs.closeSync(fd); + } + createReadStream(p, opts) { + const realPath = p !== null ? npath.fromPortablePath(p) : p; + return this.realFs.createReadStream(realPath, opts); + } + createWriteStream(p, opts) { + const realPath = p !== null ? npath.fromPortablePath(p) : p; + return this.realFs.createWriteStream(realPath, opts); + } + async realpathPromise(p) { + return await new Promise((resolve, reject) => { + this.realFs.realpath(npath.fromPortablePath(p), {}, this.makeCallback(resolve, reject)); + }).then((path) => { + return npath.toPortablePath(path); + }); + } + realpathSync(p) { + return npath.toPortablePath(this.realFs.realpathSync(npath.fromPortablePath(p), {})); + } + async existsPromise(p) { + return await new Promise((resolve) => { + this.realFs.exists(npath.fromPortablePath(p), resolve); + }); + } + accessSync(p, mode) { + return this.realFs.accessSync(npath.fromPortablePath(p), mode); + } + async accessPromise(p, mode) { + return await new Promise((resolve, reject) => { + this.realFs.access(npath.fromPortablePath(p), mode, this.makeCallback(resolve, reject)); + }); + } + existsSync(p) { + return this.realFs.existsSync(npath.fromPortablePath(p)); + } + async statPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + this.realFs.stat(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.stat(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }); + } + statSync(p, opts) { + if (opts) { + return this.realFs.statSync(npath.fromPortablePath(p), opts); + } else { + return this.realFs.statSync(npath.fromPortablePath(p)); + } + } + async fstatPromise(fd, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + this.realFs.fstat(fd, opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.fstat(fd, this.makeCallback(resolve, reject)); + } + }); + } + fstatSync(fd, opts) { + if (opts) { + return this.realFs.fstatSync(fd, opts); + } else { + return this.realFs.fstatSync(fd); + } + } + async lstatPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + this.realFs.lstat(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.lstat(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }); + } + lstatSync(p, opts) { + if (opts) { + return this.realFs.lstatSync(npath.fromPortablePath(p), opts); + } else { + return this.realFs.lstatSync(npath.fromPortablePath(p)); + } + } + async fchmodPromise(fd, mask) { + return await new Promise((resolve, reject) => { + this.realFs.fchmod(fd, mask, this.makeCallback(resolve, reject)); + }); + } + fchmodSync(fd, mask) { + return this.realFs.fchmodSync(fd, mask); + } + async chmodPromise(p, mask) { + return await new Promise((resolve, reject) => { + this.realFs.chmod(npath.fromPortablePath(p), mask, this.makeCallback(resolve, reject)); + }); + } + chmodSync(p, mask) { + return this.realFs.chmodSync(npath.fromPortablePath(p), mask); + } + async fchownPromise(fd, uid, gid) { + return await new Promise((resolve, reject) => { + this.realFs.fchown(fd, uid, gid, this.makeCallback(resolve, reject)); + }); + } + fchownSync(fd, uid, gid) { + return this.realFs.fchownSync(fd, uid, gid); + } + async chownPromise(p, uid, gid) { + return await new Promise((resolve, reject) => { + this.realFs.chown(npath.fromPortablePath(p), uid, gid, this.makeCallback(resolve, reject)); + }); + } + chownSync(p, uid, gid) { + return this.realFs.chownSync(npath.fromPortablePath(p), uid, gid); + } + async renamePromise(oldP, newP) { + return await new Promise((resolve, reject) => { + this.realFs.rename(npath.fromPortablePath(oldP), npath.fromPortablePath(newP), this.makeCallback(resolve, reject)); + }); + } + renameSync(oldP, newP) { + return this.realFs.renameSync(npath.fromPortablePath(oldP), npath.fromPortablePath(newP)); + } + async copyFilePromise(sourceP, destP, flags = 0) { + return await new Promise((resolve, reject) => { + this.realFs.copyFile(npath.fromPortablePath(sourceP), npath.fromPortablePath(destP), flags, this.makeCallback(resolve, reject)); + }); + } + copyFileSync(sourceP, destP, flags = 0) { + return this.realFs.copyFileSync(npath.fromPortablePath(sourceP), npath.fromPortablePath(destP), flags); + } + async appendFilePromise(p, content, opts) { + return await new Promise((resolve, reject) => { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + if (opts) { + this.realFs.appendFile(fsNativePath, content, opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.appendFile(fsNativePath, content, this.makeCallback(resolve, reject)); + } + }); + } + appendFileSync(p, content, opts) { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + if (opts) { + this.realFs.appendFileSync(fsNativePath, content, opts); + } else { + this.realFs.appendFileSync(fsNativePath, content); + } + } + async writeFilePromise(p, content, opts) { + return await new Promise((resolve, reject) => { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + if (opts) { + this.realFs.writeFile(fsNativePath, content, opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.writeFile(fsNativePath, content, this.makeCallback(resolve, reject)); + } + }); + } + writeFileSync(p, content, opts) { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + if (opts) { + this.realFs.writeFileSync(fsNativePath, content, opts); + } else { + this.realFs.writeFileSync(fsNativePath, content); + } + } + async unlinkPromise(p) { + return await new Promise((resolve, reject) => { + this.realFs.unlink(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + }); + } + unlinkSync(p) { + return this.realFs.unlinkSync(npath.fromPortablePath(p)); + } + async utimesPromise(p, atime, mtime) { + return await new Promise((resolve, reject) => { + this.realFs.utimes(npath.fromPortablePath(p), atime, mtime, this.makeCallback(resolve, reject)); + }); + } + utimesSync(p, atime, mtime) { + this.realFs.utimesSync(npath.fromPortablePath(p), atime, mtime); + } + async lutimesPromise(p, atime, mtime) { + return await new Promise((resolve, reject) => { + this.realFs.lutimes(npath.fromPortablePath(p), atime, mtime, this.makeCallback(resolve, reject)); + }); + } + lutimesSync(p, atime, mtime) { + this.realFs.lutimesSync(npath.fromPortablePath(p), atime, mtime); + } + async mkdirPromise(p, opts) { + return await new Promise((resolve, reject) => { + this.realFs.mkdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + }); + } + mkdirSync(p, opts) { + return this.realFs.mkdirSync(npath.fromPortablePath(p), opts); + } + async rmdirPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + this.realFs.rmdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } else { + this.realFs.rmdir(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }); + } + rmdirSync(p, opts) { + return this.realFs.rmdirSync(npath.fromPortablePath(p), opts); + } + async linkPromise(existingP, newP) { + return await new Promise((resolve, reject) => { + this.realFs.link(npath.fromPortablePath(existingP), npath.fromPortablePath(newP), this.makeCallback(resolve, reject)); + }); + } + linkSync(existingP, newP) { + return this.realFs.linkSync(npath.fromPortablePath(existingP), npath.fromPortablePath(newP)); + } + async symlinkPromise(target, p, type) { + return await new Promise((resolve, reject) => { + this.realFs.symlink(npath.fromPortablePath(target.replace(/\/+$/, ``)), npath.fromPortablePath(p), type, this.makeCallback(resolve, reject)); + }); + } + symlinkSync(target, p, type) { + return this.realFs.symlinkSync(npath.fromPortablePath(target.replace(/\/+$/, ``)), npath.fromPortablePath(p), type); + } + async readFilePromise(p, encoding) { + return await new Promise((resolve, reject) => { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + this.realFs.readFile(fsNativePath, encoding, this.makeCallback(resolve, reject)); + }); + } + readFileSync(p, encoding) { + const fsNativePath = typeof p === `string` ? npath.fromPortablePath(p) : p; + return this.realFs.readFileSync(fsNativePath, encoding); + } + async readdirPromise(p, opts) { + return await new Promise((resolve, reject) => { + if (opts) { + if (opts.recursive && process.platform === `win32`) { + if (opts.withFileTypes) { + this.realFs.readdir(npath.fromPortablePath(p), opts, this.makeCallback((results) => resolve(results.map(direntToPortable)), reject)); + } else { + this.realFs.readdir(npath.fromPortablePath(p), opts, this.makeCallback((results) => resolve(results.map(npath.toPortablePath)), reject)); + } + } else { + this.realFs.readdir(npath.fromPortablePath(p), opts, this.makeCallback(resolve, reject)); + } + } else { + this.realFs.readdir(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + } + }); + } + readdirSync(p, opts) { + if (opts) { + if (opts.recursive && process.platform === `win32`) { + if (opts.withFileTypes) { + return this.realFs.readdirSync(npath.fromPortablePath(p), opts).map(direntToPortable); + } else { + return this.realFs.readdirSync(npath.fromPortablePath(p), opts).map(npath.toPortablePath); + } + } else { + return this.realFs.readdirSync(npath.fromPortablePath(p), opts); + } + } else { + return this.realFs.readdirSync(npath.fromPortablePath(p)); + } + } + async readlinkPromise(p) { + return await new Promise((resolve, reject) => { + this.realFs.readlink(npath.fromPortablePath(p), this.makeCallback(resolve, reject)); + }).then((path) => { + return npath.toPortablePath(path); + }); + } + readlinkSync(p) { + return npath.toPortablePath(this.realFs.readlinkSync(npath.fromPortablePath(p))); + } + async truncatePromise(p, len) { + return await new Promise((resolve, reject) => { + this.realFs.truncate(npath.fromPortablePath(p), len, this.makeCallback(resolve, reject)); + }); + } + truncateSync(p, len) { + return this.realFs.truncateSync(npath.fromPortablePath(p), len); + } + async ftruncatePromise(fd, len) { + return await new Promise((resolve, reject) => { + this.realFs.ftruncate(fd, len, this.makeCallback(resolve, reject)); + }); + } + ftruncateSync(fd, len) { + return this.realFs.ftruncateSync(fd, len); + } + watch(p, a, b) { + return this.realFs.watch( + npath.fromPortablePath(p), + a, + b + ); + } + watchFile(p, a, b) { + return this.realFs.watchFile( + npath.fromPortablePath(p), + a, + b + ); + } + unwatchFile(p, cb) { + return this.realFs.unwatchFile(npath.fromPortablePath(p), cb); + } + makeCallback(resolve, reject) { + return (err, result) => { + if (err) { + reject(err); + } else { + resolve(result); + } + }; + } +} + +const NUMBER_REGEXP = /^[0-9]+$/; +const VIRTUAL_REGEXP = /^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/; +const VALID_COMPONENT = /^([^/]+-)?[a-f0-9]+$/; +class VirtualFS extends ProxiedFS { + constructor({ baseFs = new NodeFS() } = {}) { + super(ppath); + this.baseFs = baseFs; + } + static makeVirtualPath(base, component, to) { + if (ppath.basename(base) !== `__virtual__`) + throw new Error(`Assertion failed: Virtual folders must be named "__virtual__"`); + if (!ppath.basename(component).match(VALID_COMPONENT)) + throw new Error(`Assertion failed: Virtual components must be ended by an hexadecimal hash`); + const target = ppath.relative(ppath.dirname(base), to); + const segments = target.split(`/`); + let depth = 0; + while (depth < segments.length && segments[depth] === `..`) + depth += 1; + const finalSegments = segments.slice(depth); + const fullVirtualPath = ppath.join(base, component, String(depth), ...finalSegments); + return fullVirtualPath; + } + static resolveVirtual(p) { + const match = p.match(VIRTUAL_REGEXP); + if (!match || !match[3] && match[5]) + return p; + const target = ppath.dirname(match[1]); + if (!match[3] || !match[4]) + return target; + const isnum = NUMBER_REGEXP.test(match[4]); + if (!isnum) + return p; + const depth = Number(match[4]); + const backstep = `../`.repeat(depth); + const subpath = match[5] || `.`; + return VirtualFS.resolveVirtual(ppath.join(target, backstep, subpath)); + } + getExtractHint(hints) { + return this.baseFs.getExtractHint(hints); + } + getRealPath() { + return this.baseFs.getRealPath(); + } + realpathSync(p) { + const match = p.match(VIRTUAL_REGEXP); + if (!match) + return this.baseFs.realpathSync(p); + if (!match[5]) + return p; + const realpath = this.baseFs.realpathSync(this.mapToBase(p)); + return VirtualFS.makeVirtualPath(match[1], match[3], realpath); + } + async realpathPromise(p) { + const match = p.match(VIRTUAL_REGEXP); + if (!match) + return await this.baseFs.realpathPromise(p); + if (!match[5]) + return p; + const realpath = await this.baseFs.realpathPromise(this.mapToBase(p)); + return VirtualFS.makeVirtualPath(match[1], match[3], realpath); + } + mapToBase(p) { + if (p === ``) + return p; + if (this.pathUtils.isAbsolute(p)) + return VirtualFS.resolveVirtual(p); + const resolvedRoot = VirtualFS.resolveVirtual(this.baseFs.resolve(PortablePath.dot)); + const resolvedP = VirtualFS.resolveVirtual(this.baseFs.resolve(p)); + return ppath.relative(resolvedRoot, resolvedP) || PortablePath.dot; + } + mapFromBase(p) { + return p; + } +} + +const [major, minor] = process.versions.node.split(`.`).map((value) => parseInt(value, 10)); +const WATCH_MODE_MESSAGE_USES_ARRAYS = major > 19 || major === 19 && minor >= 2 || major === 18 && minor >= 13; +const HAS_LAZY_LOADED_TRANSLATORS = major === 20 && minor < 6 || major === 19 && minor >= 3; + +function readPackageScope(checkPath) { + const rootSeparatorIndex = checkPath.indexOf(npath.sep); + let separatorIndex; + do { + separatorIndex = checkPath.lastIndexOf(npath.sep); + checkPath = checkPath.slice(0, separatorIndex); + if (checkPath.endsWith(`${npath.sep}node_modules`)) + return false; + const pjson = readPackage(checkPath + npath.sep); + if (pjson) { + return { + data: pjson, + path: checkPath + }; + } + } while (separatorIndex > rootSeparatorIndex); + return false; +} +function readPackage(requestPath) { + const jsonPath = npath.resolve(requestPath, `package.json`); + if (!fs.existsSync(jsonPath)) + return null; + return JSON.parse(fs.readFileSync(jsonPath, `utf8`)); +} + +async function tryReadFile$1(path2) { + try { + return await fs.promises.readFile(path2, `utf8`); + } catch (error) { + if (error.code === `ENOENT`) + return null; + throw error; + } +} +function tryParseURL(str, base) { + try { + return new URL$1(str, base); + } catch { + return null; + } +} +let entrypointPath = null; +function setEntrypointPath(file) { + entrypointPath = file; +} +function getFileFormat(filepath) { + const ext = path.extname(filepath); + switch (ext) { + case `.mjs`: { + return `module`; + } + case `.cjs`: { + return `commonjs`; + } + case `.wasm`: { + throw new Error( + `Unknown file extension ".wasm" for ${filepath}` + ); + } + case `.json`: { + return `json`; + } + case `.js`: { + const pkg = readPackageScope(filepath); + if (!pkg) + return `commonjs`; + return pkg.data.type ?? `commonjs`; + } + default: { + if (entrypointPath !== filepath) + return null; + const pkg = readPackageScope(filepath); + if (!pkg) + return `commonjs`; + if (pkg.data.type === `module`) + return null; + return pkg.data.type ?? `commonjs`; + } + } +} + +async function load$1(urlString, context, nextLoad) { + const url = tryParseURL(urlString); + if (url?.protocol !== `file:`) + return nextLoad(urlString, context, nextLoad); + const filePath = fileURLToPath(url); + const format = getFileFormat(filePath); + if (!format) + return nextLoad(urlString, context, nextLoad); + if (format === `json` && context.importAssertions?.type !== `json`) { + const err = new TypeError(`[ERR_IMPORT_ASSERTION_TYPE_MISSING]: Module "${urlString}" needs an import assertion of type "json"`); + err.code = `ERR_IMPORT_ASSERTION_TYPE_MISSING`; + throw err; + } + if (process.env.WATCH_REPORT_DEPENDENCIES && process.send) { + const pathToSend = pathToFileURL( + npath.fromPortablePath( + VirtualFS.resolveVirtual(npath.toPortablePath(filePath)) + ) + ).href; + process.send({ + "watch:import": WATCH_MODE_MESSAGE_USES_ARRAYS ? [pathToSend] : pathToSend + }); + } + return { + format, + source: format === `commonjs` ? void 0 : await fs.promises.readFile(filePath, `utf8`), + shortCircuit: true + }; +} + +const ArrayIsArray = Array.isArray; +const JSONStringify = JSON.stringify; +const ObjectGetOwnPropertyNames = Object.getOwnPropertyNames; +const ObjectPrototypeHasOwnProperty = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop); +const RegExpPrototypeExec = (obj, string) => RegExp.prototype.exec.call(obj, string); +const RegExpPrototypeSymbolReplace = (obj, ...rest) => RegExp.prototype[Symbol.replace].apply(obj, rest); +const StringPrototypeEndsWith = (str, ...rest) => String.prototype.endsWith.apply(str, rest); +const StringPrototypeIncludes = (str, ...rest) => String.prototype.includes.apply(str, rest); +const StringPrototypeLastIndexOf = (str, ...rest) => String.prototype.lastIndexOf.apply(str, rest); +const StringPrototypeIndexOf = (str, ...rest) => String.prototype.indexOf.apply(str, rest); +const StringPrototypeReplace = (str, ...rest) => String.prototype.replace.apply(str, rest); +const StringPrototypeSlice = (str, ...rest) => String.prototype.slice.apply(str, rest); +const StringPrototypeStartsWith = (str, ...rest) => String.prototype.startsWith.apply(str, rest); +const SafeMap = Map; +const JSONParse = JSON.parse; + +function createErrorType(code, messageCreator, errorType) { + return class extends errorType { + constructor(...args) { + super(messageCreator(...args)); + this.code = code; + this.name = `${errorType.name} [${code}]`; + } + }; +} +const ERR_PACKAGE_IMPORT_NOT_DEFINED = createErrorType( + `ERR_PACKAGE_IMPORT_NOT_DEFINED`, + (specifier, packagePath, base) => { + return `Package import specifier "${specifier}" is not defined${packagePath ? ` in package ${packagePath}package.json` : ``} imported from ${base}`; + }, + TypeError +); +const ERR_INVALID_MODULE_SPECIFIER = createErrorType( + `ERR_INVALID_MODULE_SPECIFIER`, + (request, reason, base = void 0) => { + return `Invalid module "${request}" ${reason}${base ? ` imported from ${base}` : ``}`; + }, + TypeError +); +const ERR_INVALID_PACKAGE_TARGET = createErrorType( + `ERR_INVALID_PACKAGE_TARGET`, + (pkgPath, key, target, isImport = false, base = void 0) => { + const relError = typeof target === `string` && !isImport && target.length && !StringPrototypeStartsWith(target, `./`); + if (key === `.`) { + assert(isImport === false); + return `Invalid "exports" main target ${JSONStringify(target)} defined in the package config ${pkgPath}package.json${base ? ` imported from ${base}` : ``}${relError ? `; targets must start with "./"` : ``}`; + } + return `Invalid "${isImport ? `imports` : `exports`}" target ${JSONStringify( + target + )} defined for '${key}' in the package config ${pkgPath}package.json${base ? ` imported from ${base}` : ``}${relError ? `; targets must start with "./"` : ``}`; + }, + Error +); +const ERR_INVALID_PACKAGE_CONFIG = createErrorType( + `ERR_INVALID_PACKAGE_CONFIG`, + (path, base, message) => { + return `Invalid package config ${path}${base ? ` while importing ${base}` : ``}${message ? `. ${message}` : ``}`; + }, + Error +); + +function filterOwnProperties(source, keys) { + const filtered = /* @__PURE__ */ Object.create(null); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (ObjectPrototypeHasOwnProperty(source, key)) { + filtered[key] = source[key]; + } + } + return filtered; +} + +const packageJSONCache = new SafeMap(); +function getPackageConfig(path, specifier, base, readFileSyncFn) { + const existing = packageJSONCache.get(path); + if (existing !== void 0) { + return existing; + } + const source = readFileSyncFn(path); + if (source === void 0) { + const packageConfig2 = { + pjsonPath: path, + exists: false, + main: void 0, + name: void 0, + type: "none", + exports: void 0, + imports: void 0 + }; + packageJSONCache.set(path, packageConfig2); + return packageConfig2; + } + let packageJSON; + try { + packageJSON = JSONParse(source); + } catch (error) { + throw new ERR_INVALID_PACKAGE_CONFIG( + path, + (base ? `"${specifier}" from ` : "") + fileURLToPath(base || specifier), + error.message + ); + } + let { imports, main, name, type } = filterOwnProperties(packageJSON, [ + "imports", + "main", + "name", + "type" + ]); + const exports = ObjectPrototypeHasOwnProperty(packageJSON, "exports") ? packageJSON.exports : void 0; + if (typeof imports !== "object" || imports === null) { + imports = void 0; + } + if (typeof main !== "string") { + main = void 0; + } + if (typeof name !== "string") { + name = void 0; + } + if (type !== "module" && type !== "commonjs") { + type = "none"; + } + const packageConfig = { + pjsonPath: path, + exists: true, + main, + name, + type, + exports, + imports + }; + packageJSONCache.set(path, packageConfig); + return packageConfig; +} +function getPackageScopeConfig(resolved, readFileSyncFn) { + let packageJSONUrl = new URL("./package.json", resolved); + while (true) { + const packageJSONPath2 = packageJSONUrl.pathname; + if (StringPrototypeEndsWith(packageJSONPath2, "node_modules/package.json")) { + break; + } + const packageConfig2 = getPackageConfig( + fileURLToPath(packageJSONUrl), + resolved, + void 0, + readFileSyncFn + ); + if (packageConfig2.exists) { + return packageConfig2; + } + const lastPackageJSONUrl = packageJSONUrl; + packageJSONUrl = new URL("../package.json", packageJSONUrl); + if (packageJSONUrl.pathname === lastPackageJSONUrl.pathname) { + break; + } + } + const packageJSONPath = fileURLToPath(packageJSONUrl); + const packageConfig = { + pjsonPath: packageJSONPath, + exists: false, + main: void 0, + name: void 0, + type: "none", + exports: void 0, + imports: void 0 + }; + packageJSONCache.set(packageJSONPath, packageConfig); + return packageConfig; +} + +/** + @license + Copyright Node.js contributors. All rights reserved. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to + deal in the Software without restriction, including without limitation the + rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. +*/ +function throwImportNotDefined(specifier, packageJSONUrl, base) { + throw new ERR_PACKAGE_IMPORT_NOT_DEFINED( + specifier, + packageJSONUrl && fileURLToPath(new URL(".", packageJSONUrl)), + fileURLToPath(base) + ); +} +function throwInvalidSubpath(subpath, packageJSONUrl, internal, base) { + const reason = `request is not a valid subpath for the "${internal ? "imports" : "exports"}" resolution of ${fileURLToPath(packageJSONUrl)}`; + throw new ERR_INVALID_MODULE_SPECIFIER( + subpath, + reason, + base && fileURLToPath(base) + ); +} +function throwInvalidPackageTarget(subpath, target, packageJSONUrl, internal, base) { + if (typeof target === "object" && target !== null) { + target = JSONStringify(target, null, ""); + } else { + target = `${target}`; + } + throw new ERR_INVALID_PACKAGE_TARGET( + fileURLToPath(new URL(".", packageJSONUrl)), + subpath, + target, + internal, + base && fileURLToPath(base) + ); +} +const invalidSegmentRegEx = /(^|\\|\/)((\.|%2e)(\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))(\\|\/|$)/i; +const patternRegEx = /\*/g; +function resolvePackageTargetString(target, subpath, match, packageJSONUrl, base, pattern, internal, conditions) { + if (subpath !== "" && !pattern && target[target.length - 1] !== "/") + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + if (!StringPrototypeStartsWith(target, "./")) { + if (internal && !StringPrototypeStartsWith(target, "../") && !StringPrototypeStartsWith(target, "/")) { + let isURL = false; + try { + new URL(target); + isURL = true; + } catch { + } + if (!isURL) { + const exportTarget = pattern ? RegExpPrototypeSymbolReplace(patternRegEx, target, () => subpath) : target + subpath; + return exportTarget; + } + } + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + } + if (RegExpPrototypeExec( + invalidSegmentRegEx, + StringPrototypeSlice(target, 2) + ) !== null) + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + const resolved = new URL(target, packageJSONUrl); + const resolvedPath = resolved.pathname; + const packagePath = new URL(".", packageJSONUrl).pathname; + if (!StringPrototypeStartsWith(resolvedPath, packagePath)) + throwInvalidPackageTarget(match, target, packageJSONUrl, internal, base); + if (subpath === "") + return resolved; + if (RegExpPrototypeExec(invalidSegmentRegEx, subpath) !== null) { + const request = pattern ? StringPrototypeReplace(match, "*", () => subpath) : match + subpath; + throwInvalidSubpath(request, packageJSONUrl, internal, base); + } + if (pattern) { + return new URL( + RegExpPrototypeSymbolReplace(patternRegEx, resolved.href, () => subpath) + ); + } + return new URL(subpath, resolved); +} +function isArrayIndex(key) { + const keyNum = +key; + if (`${keyNum}` !== key) + return false; + return keyNum >= 0 && keyNum < 4294967295; +} +function resolvePackageTarget(packageJSONUrl, target, subpath, packageSubpath, base, pattern, internal, conditions) { + if (typeof target === "string") { + return resolvePackageTargetString( + target, + subpath, + packageSubpath, + packageJSONUrl, + base, + pattern, + internal); + } else if (ArrayIsArray(target)) { + if (target.length === 0) { + return null; + } + let lastException; + for (let i = 0; i < target.length; i++) { + const targetItem = target[i]; + let resolveResult; + try { + resolveResult = resolvePackageTarget( + packageJSONUrl, + targetItem, + subpath, + packageSubpath, + base, + pattern, + internal, + conditions + ); + } catch (e) { + lastException = e; + if (e.code === "ERR_INVALID_PACKAGE_TARGET") { + continue; + } + throw e; + } + if (resolveResult === void 0) { + continue; + } + if (resolveResult === null) { + lastException = null; + continue; + } + return resolveResult; + } + if (lastException === void 0 || lastException === null) + return lastException; + throw lastException; + } else if (typeof target === "object" && target !== null) { + const keys = ObjectGetOwnPropertyNames(target); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (isArrayIndex(key)) { + throw new ERR_INVALID_PACKAGE_CONFIG( + fileURLToPath(packageJSONUrl), + base, + '"exports" cannot contain numeric property keys.' + ); + } + } + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + if (key === "default" || conditions.has(key)) { + const conditionalTarget = target[key]; + const resolveResult = resolvePackageTarget( + packageJSONUrl, + conditionalTarget, + subpath, + packageSubpath, + base, + pattern, + internal, + conditions + ); + if (resolveResult === void 0) + continue; + return resolveResult; + } + } + return void 0; + } else if (target === null) { + return null; + } + throwInvalidPackageTarget( + packageSubpath, + target, + packageJSONUrl, + internal, + base + ); +} +function patternKeyCompare(a, b) { + const aPatternIndex = StringPrototypeIndexOf(a, "*"); + const bPatternIndex = StringPrototypeIndexOf(b, "*"); + const baseLenA = aPatternIndex === -1 ? a.length : aPatternIndex + 1; + const baseLenB = bPatternIndex === -1 ? b.length : bPatternIndex + 1; + if (baseLenA > baseLenB) + return -1; + if (baseLenB > baseLenA) + return 1; + if (aPatternIndex === -1) + return 1; + if (bPatternIndex === -1) + return -1; + if (a.length > b.length) + return -1; + if (b.length > a.length) + return 1; + return 0; +} +function packageImportsResolve({ name, base, conditions, readFileSyncFn }) { + if (name === "#" || StringPrototypeStartsWith(name, "#/") || StringPrototypeEndsWith(name, "/")) { + const reason = "is not a valid internal imports specifier name"; + throw new ERR_INVALID_MODULE_SPECIFIER(name, reason, fileURLToPath(base)); + } + let packageJSONUrl; + const packageConfig = getPackageScopeConfig(base, readFileSyncFn); + if (packageConfig.exists) { + packageJSONUrl = pathToFileURL(packageConfig.pjsonPath); + const imports = packageConfig.imports; + if (imports) { + if (ObjectPrototypeHasOwnProperty(imports, name) && !StringPrototypeIncludes(name, "*")) { + const resolveResult = resolvePackageTarget( + packageJSONUrl, + imports[name], + "", + name, + base, + false, + true, + conditions + ); + if (resolveResult != null) { + return resolveResult; + } + } else { + let bestMatch = ""; + let bestMatchSubpath; + const keys = ObjectGetOwnPropertyNames(imports); + for (let i = 0; i < keys.length; i++) { + const key = keys[i]; + const patternIndex = StringPrototypeIndexOf(key, "*"); + if (patternIndex !== -1 && StringPrototypeStartsWith( + name, + StringPrototypeSlice(key, 0, patternIndex) + )) { + const patternTrailer = StringPrototypeSlice(key, patternIndex + 1); + if (name.length >= key.length && StringPrototypeEndsWith(name, patternTrailer) && patternKeyCompare(bestMatch, key) === 1 && StringPrototypeLastIndexOf(key, "*") === patternIndex) { + bestMatch = key; + bestMatchSubpath = StringPrototypeSlice( + name, + patternIndex, + name.length - patternTrailer.length + ); + } + } + } + if (bestMatch) { + const target = imports[bestMatch]; + const resolveResult = resolvePackageTarget( + packageJSONUrl, + target, + bestMatchSubpath, + bestMatch, + base, + true, + true, + conditions + ); + if (resolveResult != null) { + return resolveResult; + } + } + } + } + } + throwImportNotDefined(name, packageJSONUrl, base); +} + +const pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/; +const isRelativeRegexp = /^\.{0,2}\//; +function tryReadFile(filePath) { + try { + return fs.readFileSync(filePath, `utf8`); + } catch (err) { + if (err.code === `ENOENT`) + return void 0; + throw err; + } +} +async function resolvePrivateRequest(specifier, issuer, context, nextResolve) { + const resolved = packageImportsResolve({ + name: specifier, + base: pathToFileURL(issuer), + conditions: new Set(context.conditions), + readFileSyncFn: tryReadFile + }); + if (resolved instanceof URL) { + return { url: resolved.href, shortCircuit: true }; + } else { + if (resolved.startsWith(`#`)) + throw new Error(`Mapping from one private import to another isn't allowed`); + return resolve$1(resolved, context, nextResolve); + } +} +async function resolve$1(originalSpecifier, context, nextResolve) { + const { findPnpApi } = moduleExports; + if (!findPnpApi || isBuiltin(originalSpecifier)) + return nextResolve(originalSpecifier, context, nextResolve); + let specifier = originalSpecifier; + const url = tryParseURL(specifier, isRelativeRegexp.test(specifier) ? context.parentURL : void 0); + if (url) { + if (url.protocol !== `file:`) + return nextResolve(originalSpecifier, context, nextResolve); + specifier = fileURLToPath(url); + } + const { parentURL, conditions = [] } = context; + const issuer = parentURL && tryParseURL(parentURL)?.protocol === `file:` ? fileURLToPath(parentURL) : process.cwd(); + const pnpapi = findPnpApi(issuer) ?? (url ? findPnpApi(specifier) : null); + if (!pnpapi) + return nextResolve(originalSpecifier, context, nextResolve); + if (specifier.startsWith(`#`)) + return resolvePrivateRequest(specifier, issuer, context, nextResolve); + const dependencyNameMatch = specifier.match(pathRegExp); + let allowLegacyResolve = false; + if (dependencyNameMatch) { + const [, dependencyName, subPath] = dependencyNameMatch; + if (subPath === `` && dependencyName !== `pnpapi`) { + const resolved = pnpapi.resolveToUnqualified(`${dependencyName}/package.json`, issuer); + if (resolved) { + const content = await tryReadFile$1(resolved); + if (content) { + const pkg = JSON.parse(content); + allowLegacyResolve = pkg.exports == null; + } + } + } + } + let result; + try { + result = pnpapi.resolveRequest(specifier, issuer, { + conditions: new Set(conditions), + extensions: allowLegacyResolve ? void 0 : [] + }); + } catch (err) { + if (err instanceof Error && `code` in err && err.code === `MODULE_NOT_FOUND`) + err.code = `ERR_MODULE_NOT_FOUND`; + throw err; + } + if (!result) + throw new Error(`Resolving '${specifier}' from '${issuer}' failed`); + const resultURL = pathToFileURL(result); + if (url) { + resultURL.search = url.search; + resultURL.hash = url.hash; + } + if (!parentURL) + setEntrypointPath(fileURLToPath(resultURL)); + return { + url: resultURL.href, + shortCircuit: true + }; +} + +if (!HAS_LAZY_LOADED_TRANSLATORS) { + const binding = process.binding(`fs`); + const originalReadFile = binding.readFileUtf8 || binding.readFileSync; + if (originalReadFile) { + binding[originalReadFile.name] = function(...args) { + try { + return fs.readFileSync(args[0], { + encoding: `utf8`, + flag: args[1] + }); + } catch { + } + return originalReadFile.apply(this, args); + }; + } else { + const binding2 = process.binding(`fs`); + const originalfstat = binding2.fstat; + const ZIP_MASK = 4278190080; + const ZIP_MAGIC = 704643072; + binding2.fstat = function(...args) { + const [fd, useBigint, req] = args; + if ((fd & ZIP_MASK) === ZIP_MAGIC && useBigint === false && req === void 0) { + try { + const stats = fs.fstatSync(fd); + return new Float64Array([ + stats.dev, + stats.mode, + stats.nlink, + stats.uid, + stats.gid, + stats.rdev, + stats.blksize, + stats.ino, + stats.size, + stats.blocks + ]); + } catch { + } + } + return originalfstat.apply(this, args); + }; + } +} + +const resolve = resolve$1; +const load = load$1; + +export { load, resolve }; diff --git a/.prettierignore b/.prettierignore index 0e80a3c8..72d7ea41 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,7 @@ -# package.json is formatted by package managers, so we ignore it here -package.json \ No newline at end of file +config/eslint-config-bitauth +wasm +.yarn +.pnp.* +package.json +src/lib/address/fixtures/key_io_*.json +src/lib/vm/instruction-sets/xec/fixtures/satoshi-client/*.json \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json index dacf61ff..0c2aa1e4 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -6,9 +6,9 @@ "dtsvet.vscode-wasm", "gruntfuggly.todo-tree", "maelvalais.autoconf", - "bungcip.better-toml", "ms-vscode.cpptools", "streetsidesoftware.code-spell-checker", - "ms-azuretools.vscode-docker" + "ms-azuretools.vscode-docker", + "arcanis.vscode-zipfs" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index f5025c53..d4c7e2ef 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,11 +1,16 @@ { "cSpell.userWords": [], // only use words from .cspell.json - "debug.javascript.usePreview": false, "deno.enable": false, "editor.formatOnSave": true, "editor.semanticHighlighting.enabled": true, - "typescript.tsdk": "node_modules/typescript/lib", + "typescript.tsdk": ".yarn/sdks/typescript/lib", "typescript.enablePromptUseWorkspaceTsdk": true, "cSpell.enabled": true, - "typescript.preferences.importModuleSpecifierEnding": "js" + "typescript.preferences.importModuleSpecifierEnding": "js", + "search.exclude": { + "**/.yarn": true, + "**/.pnp.*": true + }, + "eslint.nodePath": ".yarn/sdks", + "prettier.prettierPath": ".yarn/sdks/prettier/index.js" } diff --git a/.yarn b/.yarn index b13e162c..1c743318 160000 --- a/.yarn +++ b/.yarn @@ -1 +1 @@ -Subproject commit b13e162cd936faa7ac667c724bc360527d1c53f1 +Subproject commit 1c743318a465c6dcbd55de1186e70839e2f02b12 diff --git a/.yarnrc.yml b/.yarnrc.yml index a568a96c..3b187193 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -1,7 +1,5 @@ -nodeLinker: node-modules +enableScripts: false -plugins: - - path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs - spec: "@yarnpkg/plugin-interactive-tools" +nodeLinker: pnp -yarnPath: .yarn/releases/yarn-3.3.1.cjs +yarnPath: .yarn/releases/yarn-4.0.2.cjs diff --git a/CHANGELOG-v1-to-v2.md b/CHANGELOG-v1-to-v2.md index 782d5250..9d670345 100644 --- a/CHANGELOG-v1-to-v2.md +++ b/CHANGELOG-v1-to-v2.md @@ -1,4 +1,4 @@ -### Draft v2 Notes +# Migrating from v1 to v2 Libauth is now a [pure ESM package](https://gist.github.com/sindresorhus/a39789f98801d908bbc7ff3ecc99d99c), simplifying the developer experience by allowing WASM crypto to be instantiated internally/automatically by default πŸŽ‰. This refactor also simplifies the usage of and types surrounding Libauth virtual machines and compilers, and several other APIs have been improved. @@ -34,3 +34,6 @@ Several other improvements have been made: - **Expanded state available to VMs and compilers** – VM and compiler operations can now access all raw contents of transactions and source outputs. - **Expanded capabilities of template scenarios** – scenarios can now represent any transaction shape and generate full, serializable transactions. - **New VM bytecode test vector generation** – Libauth includes a new `vmb_tests` test vector generation system to produce sets of cross-implementation test vectors as serialized transactions; this allows for sets of test vectors that fully test all transaction validation infrastructure without making assumptions about implementation internals. +- **Improved CashAddress utilities** – cash address utilities no longer require enums, hash lengths are measured in bytes rather than bits, and `type` is distinguished from `typeBit`. +- **More consistent [encoding/decoding utilities](./docs/encodings-and-formats.md)** – Several decoding methods have been renamed and refactored to use the new ReadPosition API. +- **More consistent [error handling](./docs/errors.md)** – all possible errors are surfaced in type signatures as `string`s. diff --git a/README.md b/README.md index 69285d4a..bdf6a094 100644 --- a/README.md +++ b/README.md @@ -97,7 +97,7 @@ Libauth uses [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/ Pull Requests welcome! Please see [`CONTRIBUTING.md`](.github/CONTRIBUTING.md) for details. -This library requires [Yarn](https://yarnpkg.com/) for development. If you don't have Yarn, make sure you have `Node.js` installed, then run `npm install -g yarn`. Once Yarn is installed: +This library requires [Yarn](https://yarnpkg.com/) for development. With `Node.js` installed, the `yarn` package manager can be installed by running `corepack enable`. Once `yarn` is installed: ```sh # note the use of --recursive to clone submodules diff --git a/config/api-extractor.json b/config/api-extractor.json index 2f23edb3..b3ed25c5 100644 --- a/config/api-extractor.json +++ b/config/api-extractor.json @@ -1,340 +1,340 @@ -/** - * Config file for API Extractor. For more info, please visit: https://api-extractor.com - */ -{ - "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", - - /** - * Optionally specifies another JSON config file that this file extends from. This provides a way for - * standard settings to be shared across multiple projects. - * - * If the path starts with "./" or "../", the path is resolved relative to the folder of the file that contains - * the "extends" field. Otherwise, the first path segment is interpreted as an NPM package name, and will be - * resolved using NodeJS require(). - * - * SUPPORTED TOKENS: none - * DEFAULT VALUE: "" - */ - // "extends": "./shared/api-extractor-base.json" - // "extends": "my-package/include/api-extractor-base.json" - - /** - * Determines the "" token that can be used with other config file settings. The project folder - * typically contains the tsconfig.json and package.json config files, but the path is user-defined. - * - * The path is resolved relative to the folder of the config file that contains the setting. - * - * The default value for "projectFolder" is the token "", which means the folder is determined by traversing - * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder - * that contains a tsconfig.json file. If a tsconfig.json file cannot be found in this way, then an error - * will be reported. - * - * SUPPORTED TOKENS: - * DEFAULT VALUE: "" - */ - // "projectFolder": "..", - - /** - * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis. API Extractor - * analyzes the symbols exported by this module. - * - * The file extension must be ".d.ts" and not ".ts". - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - */ - "mainEntryPointFilePath": "/build/main/index.d.ts", - - /** - * Determines how the TypeScript compiler engine will be invoked by API Extractor. - */ - "compiler": { - /** - * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * Note: This setting will be ignored if "overrideTsconfig" is used. - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "/tsconfig.json" - */ - // "tsconfigFilePath": "/tsconfig.json", - /** - * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk. - * The object must conform to the TypeScript tsconfig schema: - * - * http://json.schemastore.org/tsconfig - * - * If omitted, then the tsconfig.json file will be read from the "projectFolder". - * - * DEFAULT VALUE: no overrideTsconfig section - */ - // "overrideTsconfig": { - // . . . - // } - /** - * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended - * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when - * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses - * for its analysis. Where possible, the underlying issue should be fixed rather than relying on skipLibCheck. - * - * DEFAULT VALUE: false - */ - // "skipLibCheck": true, - }, - - /** - * Configures how the API report file (*.api.md) will be generated. - */ - "apiReport": { - /** - * (REQUIRED) Whether to generate an API report. - */ - "enabled": true, - - /** - * The filename for the API report files. It will be combined with "reportFolder" or "reportTempFolder" to produce - * a full file path. - * - * The file extension should be ".api.md", and the string should not contain a path separator such as "\" or "/". - * - * SUPPORTED TOKENS: , - * DEFAULT VALUE: ".api.md" - */ - // "reportFileName": ".api.md", - - /** - * Specifies the folder where the API report file is written. The file name portion is determined by - * the "reportFileName" setting. - * - * The API report file is normally tracked by Git. Changes to it can be used to trigger a branch policy, - * e.g. for an API review. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "/etc/" - */ - "reportFolder": "/docs/api/" - - /** - * Specifies the folder where the temporary report file is written. The file name portion is determined by - * the "reportFileName" setting. - * - * After the temporary file is written to disk, it is compared with the file in the "reportFolder". - * If they are different, a production build will fail. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "/temp/" - */ - // "reportTempFolder": "/temp/" - }, - - /** - * Configures how the doc model file (*.api.json) will be generated. - */ - "docModel": { - /** - * (REQUIRED) Whether to generate a doc model file. - */ - "enabled": true - - /** - * The output path for the doc model file. The file extension should be ".api.json". - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "/temp/.api.json" - */ - // "apiJsonFilePath": "/temp/.api.json" - }, - - /** - * Configures how the .d.ts rollup file will be generated. - */ - "dtsRollup": { - /** - * (REQUIRED) Whether to generate the .d.ts rollup file. - */ - "enabled": true, - - /** - * Specifies the output path for a .d.ts rollup file to be generated without any trimming. - * This file will include all declarations that are exported by the main entry point. - * - * If the path is an empty string, then this file will not be written. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "/dist/.d.ts" - */ - "untrimmedFilePath": "/build/-all.d.ts", - - /** - * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "beta" release. - * This file will include only declarations that are marked as "@public" or "@beta". - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "" - */ - "betaTrimmedFilePath": "/build/-beta.d.ts", - - /** - * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "public" release. - * This file will include only declarations that are marked as "@public". - * - * If the path is an empty string, then this file will not be written. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "" - */ - "publicTrimmedFilePath": "/build/-public.d.ts" - - /** - * When a declaration is trimmed, by default it will be replaced by a code comment such as - * "Excluded from this release type: exampleMember". Set "omitTrimmingComments" to true to remove the - * declaration completely. - * - * DEFAULT VALUE: false - */ - // "omitTrimmingComments": true - }, - - /** - * Configures how the tsdoc-metadata.json file will be generated. - */ - "tsdocMetadata": { - /** - * Whether to generate the tsdoc-metadata.json file. - * - * DEFAULT VALUE: true - */ - // "enabled": true, - /** - * Specifies where the TSDoc metadata file should be written. - * - * The path is resolved relative to the folder of the config file that contains the setting; to change this, - * prepend a folder token such as "". - * - * The default value is "", which causes the path to be automatically inferred from the "tsdocMetadata", - * "typings" or "main" fields of the project's package.json. If none of these fields are set, the lookup - * falls back to "tsdoc-metadata.json" in the package folder. - * - * SUPPORTED TOKENS: , , - * DEFAULT VALUE: "" - */ - // "tsdocMetadataFilePath": "/dist/tsdoc-metadata.json" - }, - - /** - * Configures how API Extractor reports error and warning messages produced during analysis. - * - * There are three sources of messages: compiler messages, API Extractor messages, and TSDoc messages. - */ - "messages": { - /** - * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing - * the input .d.ts files. - * - * TypeScript message identifiers start with "TS" followed by an integer. For example: "TS2551" - * - * DEFAULT VALUE: A single "default" entry with logLevel=warning. - */ - "compilerMessageReporting": { - /** - * Configures the default routing for messages that don't match an explicit rule in this table. - */ - "default": { - /** - * Specifies whether the message should be written to the the tool's output log. Note that - * the "addToApiReportFile" property may supersede this option. - * - * Possible values: "error", "warning", "none" - * - * Errors cause the build to fail and return a nonzero exit code. Warnings cause a production build fail - * and return a nonzero exit code. For a non-production build (e.g. when "api-extractor run" includes - * the "--local" option), the warning is displayed but the build will not fail. - * - * DEFAULT VALUE: "warning" - */ - "logLevel": "warning" - - /** - * When addToApiReportFile is true: If API Extractor is configured to write an API report file (.api.md), - * then the message will be written inside that file; otherwise, the message is instead logged according to - * the "logLevel" option. - * - * DEFAULT VALUE: false - */ - // "addToApiReportFile": false - } - - // "TS2551": { - // "logLevel": "warning", - // "addToApiReportFile": true - // }, - // - // . . . - }, - - /** - * Configures handling of messages reported by API Extractor during its analysis. - * - * API Extractor message identifiers start with "ae-". For example: "ae-extra-release-tag" - * - * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings - */ - "extractorMessageReporting": { - "default": { - "logLevel": "warning" - // "addToApiReportFile": false - } - - // "ae-extra-release-tag": { - // "logLevel": "warning", - // "addToApiReportFile": true - // }, - // - // . . . - }, - - /** - * Configures handling of messages reported by the TSDoc parser when analyzing code comments. - * - * TSDoc message identifiers start with "tsdoc-". For example: "tsdoc-link-tag-unescaped-text" - * - * DEFAULT VALUE: A single "default" entry with logLevel=warning. - */ - "tsdocMessageReporting": { - "default": { - "logLevel": "warning" - // "addToApiReportFile": false - } - - // "tsdoc-link-tag-unescaped-text": { - // "logLevel": "warning", - // "addToApiReportFile": true - // }, - // - // . . . - } - } -} +/** + * Config file for API Extractor. For more info, please visit: https://api-extractor.com + */ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + + /** + * Optionally specifies another JSON config file that this file extends from. This provides a way for + * standard settings to be shared across multiple projects. + * + * If the path starts with "./" or "../", the path is resolved relative to the folder of the file that contains + * the "extends" field. Otherwise, the first path segment is interpreted as an NPM package name, and will be + * resolved using NodeJS require(). + * + * SUPPORTED TOKENS: none + * DEFAULT VALUE: "" + */ + // "extends": "./shared/api-extractor-base.json" + // "extends": "my-package/include/api-extractor-base.json" + + /** + * Determines the "" token that can be used with other config file settings. The project folder + * typically contains the tsconfig.json and package.json config files, but the path is user-defined. + * + * The path is resolved relative to the folder of the config file that contains the setting. + * + * The default value for "projectFolder" is the token "", which means the folder is determined by traversing + * parent folders, starting from the folder containing api-extractor.json, and stopping at the first folder + * that contains a tsconfig.json file. If a tsconfig.json file cannot be found in this way, then an error + * will be reported. + * + * SUPPORTED TOKENS: + * DEFAULT VALUE: "" + */ + // "projectFolder": "..", + + /** + * (REQUIRED) Specifies the .d.ts file to be used as the starting point for analysis. API Extractor + * analyzes the symbols exported by this module. + * + * The file extension must be ".d.ts" and not ".ts". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + */ + "mainEntryPointFilePath": "/build/index.d.ts", + + /** + * Determines how the TypeScript compiler engine will be invoked by API Extractor. + */ + "compiler": { + /** + * Specifies the path to the tsconfig.json file to be used by API Extractor when analyzing the project. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * Note: This setting will be ignored if "overrideTsconfig" is used. + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/tsconfig.json" + */ + // "tsconfigFilePath": "/tsconfig.json", + /** + * Provides a compiler configuration that will be used instead of reading the tsconfig.json file from disk. + * The object must conform to the TypeScript tsconfig schema: + * + * http://json.schemastore.org/tsconfig + * + * If omitted, then the tsconfig.json file will be read from the "projectFolder". + * + * DEFAULT VALUE: no overrideTsconfig section + */ + // "overrideTsconfig": { + // . . . + // } + /** + * This option causes the compiler to be invoked with the --skipLibCheck option. This option is not recommended + * and may cause API Extractor to produce incomplete or incorrect declarations, but it may be required when + * dependencies contain declarations that are incompatible with the TypeScript engine that API Extractor uses + * for its analysis. Where possible, the underlying issue should be fixed rather than relying on skipLibCheck. + * + * DEFAULT VALUE: false + */ + // "skipLibCheck": true, + }, + + /** + * Configures how the API report file (*.api.md) will be generated. + */ + "apiReport": { + /** + * (REQUIRED) Whether to generate an API report. + */ + "enabled": true, + + /** + * The filename for the API report files. It will be combined with "reportFolder" or "reportTempFolder" to produce + * a full file path. + * + * The file extension should be ".api.md", and the string should not contain a path separator such as "\" or "/". + * + * SUPPORTED TOKENS: , + * DEFAULT VALUE: ".api.md" + */ + // "reportFileName": ".api.md", + + /** + * Specifies the folder where the API report file is written. The file name portion is determined by + * the "reportFileName" setting. + * + * The API report file is normally tracked by Git. Changes to it can be used to trigger a branch policy, + * e.g. for an API review. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/etc/" + */ + "reportFolder": "/build/api/" + + /** + * Specifies the folder where the temporary report file is written. The file name portion is determined by + * the "reportFileName" setting. + * + * After the temporary file is written to disk, it is compared with the file in the "reportFolder". + * If they are different, a production build will fail. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/temp/" + */ + // "reportTempFolder": "/temp/" + }, + + /** + * Configures how the doc model file (*.api.json) will be generated. + */ + "docModel": { + /** + * (REQUIRED) Whether to generate a doc model file. + */ + "enabled": true + + /** + * The output path for the doc model file. The file extension should be ".api.json". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/temp/.api.json" + */ + // "apiJsonFilePath": "/temp/.api.json" + }, + + /** + * Configures how the .d.ts rollup file will be generated. + */ + "dtsRollup": { + /** + * (REQUIRED) Whether to generate the .d.ts rollup file. + */ + "enabled": true, + + /** + * Specifies the output path for a .d.ts rollup file to be generated without any trimming. + * This file will include all declarations that are exported by the main entry point. + * + * If the path is an empty string, then this file will not be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "/dist/.d.ts" + */ + "untrimmedFilePath": "/build/-all.d.ts", + + /** + * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "beta" release. + * This file will include only declarations that are marked as "@public" or "@beta". + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + "betaTrimmedFilePath": "/build/-beta.d.ts", + + /** + * Specifies the output path for a .d.ts rollup file to be generated with trimming for a "public" release. + * This file will include only declarations that are marked as "@public". + * + * If the path is an empty string, then this file will not be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + "publicTrimmedFilePath": "/build/-public.d.ts" + + /** + * When a declaration is trimmed, by default it will be replaced by a code comment such as + * "Excluded from this release type: exampleMember". Set "omitTrimmingComments" to true to remove the + * declaration completely. + * + * DEFAULT VALUE: false + */ + // "omitTrimmingComments": true + }, + + /** + * Configures how the tsdoc-metadata.json file will be generated. + */ + "tsdocMetadata": { + /** + * Whether to generate the tsdoc-metadata.json file. + * + * DEFAULT VALUE: true + */ + // "enabled": true, + /** + * Specifies where the TSDoc metadata file should be written. + * + * The path is resolved relative to the folder of the config file that contains the setting; to change this, + * prepend a folder token such as "". + * + * The default value is "", which causes the path to be automatically inferred from the "tsdocMetadata", + * "typings" or "main" fields of the project's package.json. If none of these fields are set, the lookup + * falls back to "tsdoc-metadata.json" in the package folder. + * + * SUPPORTED TOKENS: , , + * DEFAULT VALUE: "" + */ + // "tsdocMetadataFilePath": "/dist/tsdoc-metadata.json" + }, + + /** + * Configures how API Extractor reports error and warning messages produced during analysis. + * + * There are three sources of messages: compiler messages, API Extractor messages, and TSDoc messages. + */ + "messages": { + /** + * Configures handling of diagnostic messages reported by the TypeScript compiler engine while analyzing + * the input .d.ts files. + * + * TypeScript message identifiers start with "TS" followed by an integer. For example: "TS2551" + * + * DEFAULT VALUE: A single "default" entry with logLevel=warning. + */ + "compilerMessageReporting": { + /** + * Configures the default routing for messages that don't match an explicit rule in this table. + */ + "default": { + /** + * Specifies whether the message should be written to the the tool's output log. Note that + * the "addToApiReportFile" property may supersede this option. + * + * Possible values: "error", "warning", "none" + * + * Errors cause the build to fail and return a nonzero exit code. Warnings cause a production build fail + * and return a nonzero exit code. For a non-production build (e.g. when "api-extractor run" includes + * the "--local" option), the warning is displayed but the build will not fail. + * + * DEFAULT VALUE: "warning" + */ + "logLevel": "warning" + + /** + * When addToApiReportFile is true: If API Extractor is configured to write an API report file (.api.md), + * then the message will be written inside that file; otherwise, the message is instead logged according to + * the "logLevel" option. + * + * DEFAULT VALUE: false + */ + // "addToApiReportFile": false + } + + // "TS2551": { + // "logLevel": "warning", + // "addToApiReportFile": true + // }, + // + // . . . + }, + + /** + * Configures handling of messages reported by API Extractor during its analysis. + * + * API Extractor message identifiers start with "ae-". For example: "ae-extra-release-tag" + * + * DEFAULT VALUE: See api-extractor-defaults.json for the complete table of extractorMessageReporting mappings + */ + "extractorMessageReporting": { + "default": { + "logLevel": "warning" + // "addToApiReportFile": false + } + + // "ae-extra-release-tag": { + // "logLevel": "warning", + // "addToApiReportFile": true + // }, + // + // . . . + }, + + /** + * Configures handling of messages reported by the TSDoc parser when analyzing code comments. + * + * TSDoc message identifiers start with "tsdoc-". For example: "tsdoc-link-tag-unescaped-text" + * + * DEFAULT VALUE: A single "default" entry with logLevel=warning. + */ + "tsdocMessageReporting": { + "default": { + "logLevel": "warning" + // "addToApiReportFile": false + } + + // "tsdoc-link-tag-unescaped-text": { + // "logLevel": "warning", + // "addToApiReportFile": true + // }, + // + // . . . + } + } +} diff --git a/config/eslint-config-bitauth b/config/eslint-config-bitauth new file mode 160000 index 00000000..271ca754 --- /dev/null +++ b/config/eslint-config-bitauth @@ -0,0 +1 @@ +Subproject commit 271ca754e19528b883ebbfce88692119863af43b diff --git a/docs/errors.md b/docs/errors.md index 91d62b13..128e9943 100644 --- a/docs/errors.md +++ b/docs/errors.md @@ -1,7 +1,6 @@ # Libauth Errors -In Libauth, expected errors use the type `string` rather than `Error` (or other objects that inherit from `Error`) to simplify the resulting function types and -typechecking requirements. +In Libauth, expected errors use the type `string` rather than `Error` (or other objects that inherit from `Error`) to simplify the resulting function types and typechecking requirements. This convention ensures consistency of returned errors in all environments, avoids exposing internal details like stack traces and line numbers, and allows error messages to be recorded or displayed as text without an explicit or implicit `toString()` method call (e.g. for cleaner compatibility with [`restrict-template-expressions`](https://typescript-eslint.io/rules/restrict-template-expressions/)). diff --git a/package.json b/package.json index 1f5b5633..41f0f796 100644 --- a/package.json +++ b/package.json @@ -37,25 +37,27 @@ "build:wasm": "cpy --flat src/lib/bin/secp256k1/secp256k1.wasm build/lib/bin/secp256k1 && cpy --flat src/lib/bin/sha1/sha1.wasm build/lib/bin/sha1 && cpy --flat src/lib/bin/sha256/sha256.wasm build/lib/bin/sha256 && cpy --flat src/lib/bin/sha512/sha512.wasm build/lib/bin/sha512 && cpy --flat src/lib/bin/ripemd160/ripemd160.wasm build/lib/bin/ripemd160", "compile:debug:secp256k1": "docker run -it libauth-secp256k1 bash", "compile:debug:hashes": "docker run -it libauth-hashes bash", - "fix": "yarn fix:prettier && yarn fix:lint", - "fix:prettier": "prettier \"src/**/*.ts\" --write", - "fix:lint": "eslint . --ext .ts --fix", + "fix": "yarn fix:eslint && yarn fix:prettier", + "fix:prettier": "prettier . --write", + "fix:eslint": "yarn test:eslint --fix", "gen:vmb-tests": "yarn build && yarn gen:vmb-tests:bch && yarn gen:vmb-tests-prettier", "gen:vmb-tests-prettier": "prettier 'src/lib/vmb-tests/generated/**/*.json' --write", "gen:vmb-tests:bch": "node 'build/lib/vmb-tests/bch-vmb-tests.spec.helper.js' 'src/lib/vmb-tests/generated/bch' && yarn run gen:vmb-tests:bch:reasons", "gen:vmb-tests:bch:reasons": "node 'build/lib/vmb-tests/bch-vmb-tests-invalid.spec.helper.js'", "wallet": "node 'build/lib/vmb-tests/bch-vmb-tests.live.spec.helper.js'", - "gen:schema": "yarn gen:schema:authentication-template", - "gen:schema:authentication-template": "ts-json-schema-generator --no-ref-encode --path 'src/lib/compiler/template-types.ts' --type 'AuthenticationTemplate' > src/lib/schema/authentication-template.schema.json && prettier 'src/lib/schema/authentication-template.schema.json' --write && ajv compile -s src/lib/schema/authentication-template.schema.json --allowUnionTypes -o src/lib/schema/ajv/validate-authentication-template.js && prettier 'src/lib/schema/ajv/validate-authentication-template.js' --write && node -e \"const fs = require('fs'), path = 'src/lib/schema/ajv/validate-authentication-template.js'; fs.writeFileSync(path, fs.readFileSync(path, 'utf8').replace(/'use strict'[\\s\\S]*module.exports.default =/, 'export default'), 'utf8')\"", + "gen:schema": "yarn gen:schema:wallet-template && yarn gen:schema:bcmr", + "gen:schema:wallet-template": "ts-json-schema-generator --no-ref-encode --path 'src/lib/engine/types/template-types.ts' --type 'WalletTemplate' > src/lib/schema/wallet-template.schema.json && prettier 'src/lib/schema/wallet-template.schema.json' --write && ajv compile -s src/lib/schema/wallet-template.schema.json --allowUnionTypes -o src/lib/schema/ajv/validate-wallet-template.js && prettier 'src/lib/schema/ajv/validate-wallet-template.js' --write && node -e \"const fs = require('fs'), path = 'src/lib/schema/ajv/validate-wallet-template.js'; fs.writeFileSync(path, fs.readFileSync(path, 'utf8').replace(/'use strict'[\\s\\S]*module.exports.default =/, 'export default'), 'utf8')\"", + "gen:schema:bcmr": "ts-json-schema-generator --no-ref-encode --path 'src/lib/engine/types/bcmr-types.ts' --type 'MetadataRegistry' > src/lib/schema/bcmr.schema.json && prettier 'src/lib/schema/bcmr.schema.json' --write && ajv compile -s src/lib/schema/bcmr.schema.json --allowUnionTypes -o src/lib/schema/ajv/validate-bcmr.js && prettier 'src/lib/schema/ajv/validate-bcmr.js' --write && node -e \"const fs = require('fs'), path = 'src/lib/schema/ajv/validate-bcmr.js'; fs.writeFileSync(path, fs.readFileSync(path, 'utf8').replace(/'use strict'[\\s\\S]*module.exports.default =/, 'export default'), 'utf8')\"", "gen:schema-TODO": "//TODO: use ajv compile --code-esm option after merge: https://github.com/ajv-validator/ajv-cli/pull/200", - "gen:templates": "yarn build && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' 'p2pkh' > src/lib/transaction/fixtures/templates/p2pkh.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' '2-of-3' > src/lib/transaction/fixtures/templates/2-of-3.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' '2-of-2-recoverable' > src/lib/transaction/fixtures/templates/2-of-2-recoverable.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' 'sig-of-sig' > src/lib/transaction/fixtures/templates/sig-of-sig.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' 'cash-channels' > src/lib/transaction/fixtures/templates/cash-channels.json && prettier 'src/lib/transaction/fixtures/templates/*.json' --write", + "gen:templates": "yarn build && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' 'p2pkh' > src/lib/transaction/fixtures/templates/p2pkh.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' '2-of-3' > src/lib/transaction/fixtures/templates/2-of-3.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' '2-of-2-recoverable' > src/lib/transaction/fixtures/templates/2-of-2-recoverable.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' 'sig-of-sig' > src/lib/transaction/fixtures/templates/sig-of-sig.json && node 'build/lib/transaction/fixtures/generate-templates.spec.helper.js' 'cash-channels-v1' > src/lib/transaction/fixtures/templates/cash-channels-v1.json && prettier 'src/lib/transaction/fixtures/templates/*.json' --write", "gen:graph": "mkdir -p temp && madge --image temp/deps-$(date +\"%FT%H%M\").svg build/index.js", - "test": "yarn build && yarn test:deps && yarn test:schemas && yarn test:lint && yarn test:prettier && yarn test:spelling && yarn test:cycles && yarn test:unit", + "test": "yarn build && yarn test:deps && yarn test:schemas && yarn test:lint && yarn test:cycles && yarn test:unit", "test:deps": "node -e \"import('./package.json', { assert: { type: 'json' } }).then(p => typeof p.dependencies === 'undefined' ? console.log('No dependencies found.') : (console.error('Dependencies are not allowed.') && process.exit(1)));\"", "test:schemas:unchanged": "yarn gen:schema && node -e \"child_process.exec('git status src/lib/schema --porcelain | head -c1 | wc -c', (err, stdout) => stdout.trim() === '0' ? process.exit(0) : process.exit(1) )\"", "test:schemas": "yarn test:schemas:unchanged && echo \"Schemas are up to date.\" || echo \"Error: one or more schemas are outdated. Please review and commit the changes in src/lib/schema.\"", - "test:lint": "eslint . --ext .ts", - "test:prettier": "prettier \"src/**/*.ts\" --list-different", + "test:lint": "yarn test:prettier && yarn test:eslint && yarn test:spelling", + "test:eslint": "eslint . -c .eslintrc", + "test:prettier": "prettier . --list-different", "test:spelling": "cspell \"{README.md,.github/*.md,src/**/*.ts}\"", "test:cycles": "madge --circular build/index.js", "test:unit": "c8 ava", @@ -71,13 +73,13 @@ "cov": "yarn build && yarn test:unit && yarn cov:html && yarn cov:lcov && open-cli coverage/index.html", "cov:html": "c8 report --reporter=html", "cov:lcov": "c8 report --reporter=lcov", - "cov:check": "c8 report && c8 check-coverage --lines 90 --functions 90 --branches 90", + "cov:check": "c8 report && c8 check-coverage --lines 80 --functions 80 --branches 80", "doc": "yarn doc:html && yarn doc:html && open-cli build/docs/index.html", "doc:logo": "cpy assets/libauth.svg build/docs", "doc:html": "typedoc src/index.ts --out build/docs", "doc:next": "yarn build && yarn doc:extract && yarn doc:generate", - "doc:extract": "api-extractor run --local --typescript-compiler-folder node_modules/typescript", - "doc:generate": "api-documenter markdown -i temp -o docs/markdown", + "doc:extract": "mkdir -p build/api && api-extractor run --local --typescript-compiler-folder node_modules/typescript", + "doc:generate": "api-documenter markdown -i temp -o build/api/markdown", "doc:check-api": "api-extractor run --typescript-compiler-folder node_modules/typescript", "version": "standard-version", "version:alpha": "standard-version --prerelease alpha", @@ -89,50 +91,49 @@ "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "devDependencies": { - "@ava/typescript": "^3.0.1", - "@fast-check/ava": "^1.1.3", - "@microsoft/api-documenter": "^7.19.27", - "@microsoft/api-extractor": "^7.33.7", - "@rollup/plugin-alias": "^4.0.2", - "@rollup/plugin-commonjs": "^22.0.2", - "@rollup/plugin-node-resolve": "^15.0.1", - "@types/elliptic": "^6.4.14", - "@types/express": "^4.17.15", - "@typescript-eslint/eslint-plugin": "^5.48.1", - "@typescript-eslint/parser": "^5.48.1", + "@ava/typescript": "^4.1.0", + "@fast-check/ava": "^1.2.1", + "@microsoft/api-documenter": "^7.23.16", + "@microsoft/api-extractor": "^7.39.1", + "@playwright/test": "^1.40.1", + "@rollup/plugin-alias": "^5.1.0", + "@rollup/plugin-commonjs": "^25.0.7", + "@rollup/plugin-node-resolve": "^15.2.3", + "@types/elliptic": "^6.4.18", + "@types/express": "^4.17.21", + "@types/node": "^20.10.6", + "@typescript-eslint/eslint-plugin": "^6.18.1", + "@typescript-eslint/parser": "^6.17.0", "ajv-cli": "^5.0.0", "asmcrypto.js": "^2.3.2", - "ava": "^5.1.0", - "bcrypto": "^5.4.0", - "bitcore-lib-cash": "^8.25.40", - "c8": "^7.12.0", + "ava": "^6.0.1", + "bitcore-lib-cash": "^10.0.23", + "c8": "^9.0.0", "chuhai": "^1.2.0", - "cpy-cli": "^4.2.0", - "cspell": "^6.18.1", + "cpy-cli": "^5.0.0", + "cspell": "^8.3.2", "cz-conventional-changelog": "^3.3.0", "elliptic": "^6.5.4", - "eslint": "8.31.0", - "eslint-config-bitauth": "^3.1.2", - "eslint-config-prettier": "^8.6.0", + "eslint": "8.56.0", + "eslint-config-bitauth": "5.0.0", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-eslint-comments": "^3.2.0", - "eslint-plugin-functional": "^4.4.1", - "eslint-plugin-import": "^2.26.0", - "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-functional": "^6.0.0", + "eslint-plugin-import": "^2.29.1", "eslint-plugin-tsdoc": "^0.2.17", "express": "^4.18.2", - "fast-check": "^3.5.0", + "fast-check": "^3.15.0", "hash.js": "^1.1.7", - "madge": "^5.0.1", - "open-cli": "^7.1.0", - "prettier": "^2.8.2", - "puppeteer": "^19.5.0", - "rollup": "^2.79.1", - "secp256k1": "^4.0.3", + "madge": "^6.1.0", + "open-cli": "^8.0.0", + "prettier": "^3.1.1", + "rollup": "^4.9.2", + "secp256k1": "^5.0.0", "source-map-support": "^0.5.21", "standard-version": "^9.5.0", - "ts-json-schema-generator": "^1.2.0", - "typedoc": "^0.23.24", - "typescript": "^4.9.4" + "ts-json-schema-generator": "^1.5.0", + "typedoc": "^0.25.6", + "typescript": "^5.3.3" }, "files": [ "build", @@ -202,9 +203,13 @@ "exclude": [ "**/*.bench.js", "**/*.spec.js", - "**/*.spec.helper.js" + "**/*.spec.helper.js", + ".pnp.*" ] }, "sideEffects": false, - "packageManager": "yarn@3.3.1" + "packageManager": "yarn@4.0.2", + "resolutions": { + "eslint-config-bitauth": "portal:./config/eslint-config-bitauth" + } } diff --git a/src/lib/address/base58-address.spec.ts b/src/lib/address/base58-address.spec.ts index e8789866..16f6b928 100644 --- a/src/lib/address/base58-address.spec.ts +++ b/src/lib/address/base58-address.spec.ts @@ -1,4 +1,3 @@ -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import { @@ -19,12 +18,14 @@ import keyIoInvalid from './fixtures/key_io_invalid.json' assert { type: 'json' // eslint-disable-next-line import/no-restricted-paths, import/no-internal-modules import keyIoValid from './fixtures/key_io_valid.json' assert { type: 'json' }; +import { fc, testProp } from '@fast-check/ava'; + const invalidVectors = Object.values(keyIoInvalid).filter( - (item) => Array.isArray(item) && item.every((x) => typeof x === 'string') + (item) => Array.isArray(item) && item.every((x) => typeof x === 'string'), ); const validVectors = Object.values(keyIoValid).filter((item) => - item.every((x) => !Array.isArray(x)) + item.every((x) => !Array.isArray(x)), ); test('encodeBase58AddressFormat', (t) => { @@ -32,16 +33,16 @@ test('encodeBase58AddressFormat', (t) => { t.deepEqual( encodeBase58AddressFormat(Base58AddressFormatVersion.p2pkh, payload), // cspell: disable-next-line - '1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i' + '1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i', ); t.deepEqual( encodeBase58AddressFormat( Base58AddressFormatVersion.p2pkh, payload, - sha256 + sha256, ), // cspell: disable-next-line - '1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i' + '1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i', ); }); @@ -50,32 +51,32 @@ test('encodeBase58Address', (t) => { t.deepEqual( encodeBase58Address('p2pkh', payload, sha256), // cspell: disable-next-line - '1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu' + '1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu', ); t.deepEqual( encodeBase58Address('p2pkhTestnet', payload, sha256), // cspell: disable-next-line - 'mrLC19Je2BuWQDkWSTriGYPyQJXKkkBmCx' + 'mrLC19Je2BuWQDkWSTriGYPyQJXKkkBmCx', ); t.deepEqual( encodeBase58Address('p2pkhCopayBCH', payload), // cspell: disable-next-line - 'CTH8H8Zj6DSnXFBKQeDG28ogAS92iS16Bp' + 'CTH8H8Zj6DSnXFBKQeDG28ogAS92iS16Bp', ); t.deepEqual( encodeBase58Address('p2sh20', payload, sha256), // cspell: disable-next-line - '3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC' + '3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC', ); t.deepEqual( encodeBase58Address('p2sh20Testnet', payload), // cspell: disable-next-line - '2N44ThNe8NXHyv4bsX8AoVCXquBRW94Ls7W' + '2N44ThNe8NXHyv4bsX8AoVCXquBRW94Ls7W', ); t.deepEqual( encodeBase58Address('p2sh20CopayBCH', payload, sha256), // cspell: disable-next-line - 'HHLN6S9BcP1JLSrMhgD5qe57iVEMFMLCBT' + 'HHLN6S9BcP1JLSrMhgD5qe57iVEMFMLCBT', ); }); @@ -84,12 +85,12 @@ test('decodeBase58AddressFormat', (t) => { t.deepEqual( // cspell: disable-next-line decodeBase58AddressFormat('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i'), - { payload, version: Base58AddressFormatVersion.p2pkh } + { payload, version: Base58AddressFormatVersion.p2pkh }, ); t.deepEqual( // cspell: disable-next-line decodeBase58AddressFormat('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i', sha256), - { payload, version: Base58AddressFormatVersion.p2pkh } + { payload, version: Base58AddressFormatVersion.p2pkh }, ); }); @@ -98,12 +99,12 @@ test('decodeBase58Address', (t) => { t.deepEqual( // cspell: disable-next-line decodeBase58Address('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i'), - { payload, version: Base58AddressFormatVersion.p2pkh } + { payload, version: Base58AddressFormatVersion.p2pkh }, ); t.deepEqual( // cspell: disable-next-line decodeBase58Address('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62i', sha256), - { payload, version: Base58AddressFormatVersion.p2pkh } + { payload, version: Base58AddressFormatVersion.p2pkh }, ); }); @@ -126,33 +127,33 @@ testProp( payload, version, }); - } + }, ); test('decodeBase58AddressFormat: errors', (t) => { t.deepEqual( // cspell: disable-next-line decodeBase58AddressFormat('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62a'), - Base58AddressError.invalidChecksum + Base58AddressError.invalidChecksum, ); t.deepEqual(decodeBase58AddressFormat('1234'), Base58AddressError.tooShort); t.deepEqual( // cspell: disable-next-line decodeBase58AddressFormat('1AGNa15ZQXAZUgFiqJ2i7Z2DPU2J6hW62I'), - Base58AddressError.unknownCharacter + Base58AddressError.unknownCharacter, ); }); test('decodeBase58Address: errors', (t) => { t.deepEqual( // cspell: disable-next-line decodeBase58Address('6PfDNQxJdsBx7K4r9kMrRBZSa2NZKVNUZn'), - Base58AddressError.unknownAddressVersion + Base58AddressError.unknownAddressVersion, ); t.deepEqual( // cspell: disable-next-line decodeBase58Address('2DqXtydYdu9pq6uXcy3Tbw3pUscCiPC6F'), // Base58AddressError.incorrectLength - Base58AddressError.unknownAddressVersion + Base58AddressError.unknownAddressVersion, ); }); @@ -186,11 +187,10 @@ test('Base58Address Valid Vectors (from C++ implementation – includes WIF vect isCompressed?: boolean; isPrivkey: boolean; chain: 'main' | 'regtest' | 'test'; - } + }, ]; const testnet = meta.chain !== 'main'; - // eslint-disable-next-line functional/no-conditional-statement if (meta.isPrivkey) { const wifKey = base58Address; const compressed = Boolean(meta.isCompressed); @@ -200,20 +200,18 @@ test('Base58Address Valid Vectors (from C++ implementation – includes WIF vect ? 'testnet' : 'testnetUncompressed' : compressed - ? 'mainnet' - : 'mainnetUncompressed'; + ? 'mainnet' + : 'mainnetUncompressed'; t.deepEqual(decodePrivateKeyWif(wifKey), { privateKey, type }); - - // eslint-disable-next-line functional/no-conditional-statement } else { const lockingBytecode = data; t.deepEqual( lockingBytecodeToBase58Address( hexToBin(lockingBytecode), testnet ? 'testnet' : 'mainnet', - sha256 + sha256, ), - base58Address + base58Address, ); } }); diff --git a/src/lib/address/base58-address.ts b/src/lib/address/base58-address.ts index 0dd75178..57a0d82a 100644 --- a/src/lib/address/base58-address.ts +++ b/src/lib/address/base58-address.ts @@ -107,11 +107,11 @@ export type Base58AddressNetwork = 'copayBCH' | 'mainnet' | 'testnet'; * implementation) */ export const encodeBase58AddressFormat = < - VersionType extends number = Base58AddressFormatVersion + VersionType extends number = Base58AddressFormatVersion, >( version: VersionType, payload: Uint8Array, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => { const checksumBytes = 4; const content = Uint8Array.from([version, ...payload]); @@ -146,7 +146,7 @@ export const encodeBase58Address = ( | 'p2sh20CopayBCH' | 'p2sh20Testnet', payload: Uint8Array, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => encodeBase58AddressFormat( { @@ -158,7 +158,7 @@ export const encodeBase58Address = ( p2sh20Testnet: Base58AddressFormatVersion.p2sh20Testnet, }[type], payload, - sha256 + sha256, ); export enum Base58AddressError { @@ -181,7 +181,7 @@ export enum Base58AddressError { */ export const decodeBase58AddressFormat = ( address: string, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => { const checksumBytes = 4; const bin = base58ToBin(address); @@ -232,7 +232,7 @@ export const decodeBase58AddressFormat = ( */ export const decodeBase58Address = ( address: string, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => { const decoded = decodeBase58AddressFormat(address, sha256); if (typeof decoded === 'string') return decoded; diff --git a/src/lib/address/bech32.spec.ts b/src/lib/address/bech32.spec.ts index 7a5d8281..0c882f47 100644 --- a/src/lib/address/bech32.spec.ts +++ b/src/lib/address/bech32.spec.ts @@ -1,6 +1,4 @@ -import { testProp } from '@fast-check/ava'; import test from 'ava'; -import fc from 'fast-check'; import { Bech32DecodingError, @@ -14,6 +12,9 @@ import { regroupBits, } from '../lib.js'; +import { testProp } from '@fast-check/ava'; +import fc from 'fast-check'; + test('regroupBits', (t) => { t.deepEqual( regroupBits({ @@ -21,7 +22,7 @@ test('regroupBits', (t) => { resultWordLength: 1, sourceWordLength: 8, }), - [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] + [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], ); t.deepEqual( regroupBits({ @@ -29,7 +30,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 1, }), - [0b11111111, 0b11111111] + [0b11111111, 0b11111111], ); t.deepEqual( regroupBits({ @@ -37,7 +38,7 @@ test('regroupBits', (t) => { resultWordLength: 2, sourceWordLength: 8, }), - [0b11, 0b11, 0b11, 0b11, 0b11, 0b11, 0b11, 0b11] + [0b11, 0b11, 0b11, 0b11, 0b11, 0b11, 0b11, 0b11], ); t.deepEqual( regroupBits({ @@ -45,7 +46,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 2, }), - [0b11111111, 0b11111111] + [0b11111111, 0b11111111], ); t.deepEqual( regroupBits({ @@ -53,7 +54,7 @@ test('regroupBits', (t) => { resultWordLength: 3, sourceWordLength: 8, }), - [0b111, 0b111, 0b111, 0b111, 0b111, 0b100] + [0b111, 0b111, 0b111, 0b111, 0b111, 0b100], ); t.deepEqual( regroupBits({ @@ -65,7 +66,7 @@ test('regroupBits', (t) => { * The 2 padding bit are now considered significant, so we have to add * padding to encode them. */ - [0b11111111, 0b11111111, 0b00] + [0b11111111, 0b11111111, 0b00], ); t.deepEqual( regroupBits({ @@ -73,7 +74,7 @@ test('regroupBits', (t) => { resultWordLength: 4, sourceWordLength: 8, }), - [0b1111, 0b1111, 0b1111, 0b1111] + [0b1111, 0b1111, 0b1111, 0b1111], ); t.deepEqual( regroupBits({ @@ -81,7 +82,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 4, }), - [0b11111111, 0b11111111] + [0b11111111, 0b11111111], ); t.deepEqual( regroupBits({ @@ -89,7 +90,7 @@ test('regroupBits', (t) => { resultWordLength: 5, sourceWordLength: 8, }), - [0b11111, 0b11111, 0b11111, 0b10000] + [0b11111, 0b11111, 0b11111, 0b10000], ); t.deepEqual( regroupBits({ @@ -97,7 +98,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 5, }), - [0b11111111, 0b11111111, 0b0000] + [0b11111111, 0b11111111, 0b0000], ); t.deepEqual( regroupBits({ @@ -105,7 +106,7 @@ test('regroupBits', (t) => { resultWordLength: 6, sourceWordLength: 8, }), - [0b111111, 0b111111, 0b111100] + [0b111111, 0b111111, 0b111100], ); t.deepEqual( regroupBits({ @@ -113,7 +114,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 6, }), - [0b11111111, 0b11111111, 0b00] + [0b11111111, 0b11111111, 0b00], ); t.deepEqual( regroupBits({ @@ -121,7 +122,7 @@ test('regroupBits', (t) => { resultWordLength: 7, sourceWordLength: 8, }), - [0b1111111, 0b1111111, 0b1100000] + [0b1111111, 0b1111111, 0b1100000], ); t.deepEqual( regroupBits({ @@ -129,7 +130,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 7, }), - [0b11111111, 0b11111111, 0b00000] + [0b11111111, 0b11111111, 0b00000], ); t.deepEqual( regroupBits({ @@ -137,7 +138,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 8, }), - [0b11111111, 0b11111111] + [0b11111111, 0b11111111], ); t.deepEqual( regroupBits({ @@ -145,11 +146,11 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 8, }), - [0b11111111, 0b11111111] + [0b11111111, 0b11111111], ); t.deepEqual( regroupBits({ bin: [256], resultWordLength: 5, sourceWordLength: 8 }), - BitRegroupingError.integerOutOfRange + BitRegroupingError.integerOutOfRange, ); t.deepEqual( regroupBits({ @@ -158,7 +159,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 5, }), - BitRegroupingError.requiresDisallowedPadding + BitRegroupingError.requiresDisallowedPadding, ); t.deepEqual( regroupBits({ @@ -170,7 +171,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 5, }), - BitRegroupingError.requiresDisallowedPadding + BitRegroupingError.requiresDisallowedPadding, ); t.deepEqual( regroupBits({ @@ -179,7 +180,7 @@ test('regroupBits', (t) => { resultWordLength: 8, sourceWordLength: 5, }), - BitRegroupingError.hasDisallowedPadding + BitRegroupingError.hasDisallowedPadding, ); }); @@ -202,7 +203,7 @@ test('decodeBech32', (t) => { // cspell: disable-next-line decodeBech32('qpzry9x8gf2tvdw0s3jn54khce6mua7l'), // prettier-ignore - [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31] + [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], ); }); @@ -215,7 +216,7 @@ test('encodeBech32', (t) => { // prettier-ignore encodeBech32([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31]), // cspell: disable-next-line - 'qpzry9x8gf2tvdw0s3jn54khce6mua7l' + 'qpzry9x8gf2tvdw0s3jn54khce6mua7l', ); }); @@ -229,19 +230,19 @@ test('binToBech32Padded', (t) => { test('bech32PaddedToBin', (t) => { t.deepEqual( bech32PaddedToBin('qqq'), - BitRegroupingError.hasDisallowedPadding + BitRegroupingError.hasDisallowedPadding, ); t.deepEqual(bech32PaddedToBin('qq'), Uint8Array.of(0)); t.deepEqual( bech32PaddedToBin('tf'), - BitRegroupingError.requiresDisallowedPadding + BitRegroupingError.requiresDisallowedPadding, ); t.deepEqual(bech32PaddedToBin('lu'), Uint8Array.of(255)); // cspell: disable-next-line t.deepEqual(bech32PaddedToBin('qqqsyqc'), Uint8Array.of(0, 1, 2, 3)); t.deepEqual( bech32PaddedToBin('qqq1'), - Bech32DecodingError.notBech32CharacterSet + Bech32DecodingError.notBech32CharacterSet, ); }); @@ -267,9 +268,9 @@ testProp( (t, input) => { t.deepEqual( decodeBech32(encodeBech32(input)), - input as ReturnType + input as ReturnType, ); - } + }, ); testProp( @@ -278,17 +279,17 @@ testProp( (t, input) => { t.deepEqual( binToBech32Padded( - bech32PaddedToBin(binToBech32Padded(input)) as Uint8Array + bech32PaddedToBin(binToBech32Padded(input)) as Uint8Array, ), - binToBech32Padded(input) + binToBech32Padded(input), ); - } + }, ); testProp( '[fast-check] binToBech32Padded -> isBech32', [fcUint8Array(0, maxBinLength)], - (t, input) => t.true(isBech32CharacterSet(binToBech32Padded(input))) + (t, input) => t.true(isBech32CharacterSet(binToBech32Padded(input))), ); testProp( @@ -303,5 +304,5 @@ testProp( return; } t.deepEqual(binToBech32Padded(tryBin), maybeBech32); - } + }, ); diff --git a/src/lib/address/bech32.ts b/src/lib/address/bech32.ts index 4e161939..83f71301 100644 --- a/src/lib/address/bech32.ts +++ b/src/lib/address/bech32.ts @@ -1,5 +1,3 @@ -import type { Immutable } from '../lib.js'; - /** * The list of 32 symbols used in Bech32 encoding. */ @@ -18,7 +16,7 @@ export enum BitRegroupingError { requiresDisallowedPadding = 'Encoding requires padding while padding is disallowed.', } -/* eslint-disable functional/no-let, no-bitwise, functional/no-expression-statement, functional/no-conditional-statement, complexity */ +/* eslint-disable functional/no-let, no-bitwise, functional/no-expression-statements, functional/no-conditional-statements, complexity */ /** * Given an array of integers, regroup bits from `sourceWordLength` to * `resultWordLength`, returning a new array of integers between 0 and @@ -40,7 +38,7 @@ export const regroupBits = ({ * An array of numbers representing the bits to regroup. Each item must be a * number within the range of `sourceWordLength`. */ - bin: Immutable | readonly number[]; + bin: number[] | Uint8Array; /** * The bit-length of each number in `bin`, e.g. to regroup bits from a * `Uint8Array`, use `8` (must be a positive integer) @@ -62,7 +60,7 @@ export const regroupBits = ({ let bits = 0; const result = []; const maxResultInt = (1 << resultWordLength) - 1; - // eslint-disable-next-line functional/no-loop-statement, @typescript-eslint/prefer-for-of, no-plusplus + // eslint-disable-next-line functional/no-loop-statements, @typescript-eslint/prefer-for-of, no-plusplus for (let p = 0; p < bin.length; ++p) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const value = bin[p]!; @@ -71,7 +69,7 @@ export const regroupBits = ({ } accumulator = (accumulator << sourceWordLength) | value; bits += sourceWordLength; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (bits >= resultWordLength) { bits -= resultWordLength; // eslint-disable-next-line functional/immutable-data @@ -91,7 +89,7 @@ export const regroupBits = ({ } return result; }; -/* eslint-enable functional/no-let, no-bitwise, functional/no-expression-statement, functional/no-conditional-statement, complexity */ +/* eslint-enable functional/no-let, no-bitwise, functional/no-expression-statements, functional/no-conditional-statements, complexity */ /** * Encode an array of numbers as a base32 string using the Bech32 character set. @@ -102,12 +100,12 @@ export const regroupBits = ({ * * @param base32IntegerArray - the array of 5-bit integers to encode */ -export const encodeBech32 = (base32IntegerArray: readonly number[]) => { +export const encodeBech32 = (base32IntegerArray: number[]) => { // eslint-disable-next-line functional/no-let let result = ''; - // eslint-disable-next-line @typescript-eslint/prefer-for-of, functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line @typescript-eslint/prefer-for-of, functional/no-let, functional/no-loop-statements, no-plusplus for (let i = 0; i < base32IntegerArray.length; i++) { - // eslint-disable-next-line functional/no-expression-statement, @typescript-eslint/no-non-null-assertion + // eslint-disable-next-line functional/no-expression-statements, @typescript-eslint/no-non-null-assertion result += bech32CharacterSet[base32IntegerArray[i]!]; } return result; @@ -126,13 +124,13 @@ export const encodeBech32 = (base32IntegerArray: readonly number[]) => { export const decodeBech32 = (validBech32: string) => { const result: (typeof bech32CharacterSetIndex)[keyof typeof bech32CharacterSetIndex][] = []; - // eslint-disable-next-line @typescript-eslint/prefer-for-of, functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line @typescript-eslint/prefer-for-of, functional/no-let, functional/no-loop-statements, no-plusplus for (let i = 0; i < validBech32.length; i++) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data result.push( bech32CharacterSetIndex[ validBech32[i] as keyof typeof bech32CharacterSetIndex - ] + ], ); } return result; @@ -184,11 +182,11 @@ export const bech32PaddedToBin = (bech32Padded: string) => { * * @param bytes - the Uint8Array to bech32 encode */ -export const binToBech32Padded = (bytes: Immutable) => +export const binToBech32Padded = (bytes: Uint8Array) => encodeBech32( regroupBits({ bin: bytes, resultWordLength: base32WordLength, sourceWordLength: base256WordLength, - }) as number[] + }) as number[], ); diff --git a/src/lib/address/cash-address.spec.ts b/src/lib/address/cash-address.spec.ts index adf36a0d..44496a05 100644 --- a/src/lib/address/cash-address.spec.ts +++ b/src/lib/address/cash-address.spec.ts @@ -1,5 +1,4 @@ import test from 'ava'; -import fc from 'fast-check'; import type { CashAddressAvailableTypeBits, @@ -32,6 +31,8 @@ import { // eslint-disable-next-line import/no-restricted-paths, import/no-internal-modules import cashAddrJson from './fixtures/cashaddr.json' assert { type: 'json' }; +import fc from 'fast-check'; + const lowercaseLetter = () => fc.integer({ max: 122, min: 97 }).map((i) => String.fromCharCode(i)); @@ -44,35 +45,35 @@ test('maskCashAddressPrefix', (t) => { test('encodeCashAddressVersionByte', (t) => { t.deepEqual( encodeCashAddressVersionByte(CashAddressTypeBits.p2pkh, 20), - CashAddressVersionByte.p2pkh + CashAddressVersionByte.p2pkh, ); t.deepEqual( encodeCashAddressVersionByte(0, 20), - CashAddressVersionByte.p2pkh + CashAddressVersionByte.p2pkh, ); t.deepEqual( encodeCashAddressVersionByte(CashAddressTypeBits.p2sh, 20), - CashAddressVersionByte.p2sh20 + CashAddressVersionByte.p2sh20, ); t.deepEqual( encodeCashAddressVersionByte(1, 20), - CashAddressVersionByte.p2sh20 + CashAddressVersionByte.p2sh20, ); t.deepEqual( encodeCashAddressVersionByte(CashAddressTypeBits.p2sh, 32), - CashAddressVersionByte.p2sh32 + CashAddressVersionByte.p2sh32, ); t.deepEqual( encodeCashAddressVersionByte(CashAddressTypeBits.p2pkhWithTokens, 20), - CashAddressVersionByte.p2pkhWithTokens + CashAddressVersionByte.p2pkhWithTokens, ); t.deepEqual( encodeCashAddressVersionByte(CashAddressTypeBits.p2shWithTokens, 20), - CashAddressVersionByte.p2sh20WithTokens + CashAddressVersionByte.p2sh20WithTokens, ); t.deepEqual( encodeCashAddressVersionByte(CashAddressTypeBits.p2shWithTokens, 32), - CashAddressVersionByte.p2sh32WithTokens + CashAddressVersionByte.p2sh32WithTokens, ); }); @@ -91,19 +92,19 @@ test('decodeCashAddressVersionByte', (t) => { }); t.deepEqual( decodeCashAddressVersionByte(0b10000000), - CashAddressVersionByteDecodingError.reservedBitSet + CashAddressVersionByteDecodingError.reservedBitSet, ); t.deepEqual( decodeCashAddressVersionByte(CashAddressVersionByte.p2pkhWithTokens), - { length: 20, typeBits: 2 } + { length: 20, typeBits: 2 }, ); t.deepEqual( decodeCashAddressVersionByte(CashAddressVersionByte.p2sh20WithTokens), - { length: 20, typeBits: 3 } + { length: 20, typeBits: 3 }, ); t.deepEqual( decodeCashAddressVersionByte(CashAddressVersionByte.p2sh32WithTokens), - { length: 32, typeBits: 3 } + { length: 32, typeBits: 3 }, ); t.deepEqual(decodeCashAddressVersionByte(0b01000011), { length: 32, @@ -121,35 +122,35 @@ test('encodeCashAddress: works', (t) => { t.deepEqual( encodeCashAddress('bchtest', CashAddressType.p2pkh, payload), - 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' + 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x', ); t.deepEqual( encodeCashAddress('bchtest', 'p2pkh', payload), - 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' + 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x', ); t.deepEqual( encodeCashAddress('bitcoincash', CashAddressType.p2pkh, payload), - 'bitcoincash:qq2azmyyv6dtgczexyalqar70q036yund54qgw0wg6' + 'bitcoincash:qq2azmyyv6dtgczexyalqar70q036yund54qgw0wg6', ); t.deepEqual( encodeCashAddress('bitcoincash', 'p2pkh', payload), - 'bitcoincash:qq2azmyyv6dtgczexyalqar70q036yund54qgw0wg6' + 'bitcoincash:qq2azmyyv6dtgczexyalqar70q036yund54qgw0wg6', ); t.deepEqual( encodeCashAddress('bitcoincash', CashAddressType.p2pkhWithTokens, payload), - 'bitcoincash:zq2azmyyv6dtgczexyalqar70q036yund5j2mspghf' + 'bitcoincash:zq2azmyyv6dtgczexyalqar70q036yund5j2mspghf', ); t.deepEqual( encodeCashAddress('bitcoincash', 'p2pkhWithTokens', payload), - 'bitcoincash:zq2azmyyv6dtgczexyalqar70q036yund5j2mspghf' + 'bitcoincash:zq2azmyyv6dtgczexyalqar70q036yund5j2mspghf', ); t.deepEqual( encodeCashAddress('bchreg', 'p2pkh', payload), - 'bchreg:qq2azmyyv6dtgczexyalqar70q036yund5tw6gw2vq' + 'bchreg:qq2azmyyv6dtgczexyalqar70q036yund5tw6gw2vq', ); t.deepEqual( encodeCashAddress('bchreg', 'p2pkh', payload), - 'bchreg:qq2azmyyv6dtgczexyalqar70q036yund5tw6gw2vq' + 'bchreg:qq2azmyyv6dtgczexyalqar70q036yund5tw6gw2vq', ); t.deepEqual( @@ -157,10 +158,10 @@ test('encodeCashAddress: works', (t) => { 'bitauth', encodeCashAddressVersionByte(0, 32), hexToBin( - '978306aa4e02fd06e251b38d2e961f78f4af2ea6524a3e4531126776276a6af1' - ) + '978306aa4e02fd06e251b38d2e961f78f4af2ea6524a3e4531126776276a6af1', + ), ), - 'bitauth:qwtcxp42fcp06phz2xec6t5krau0ftew5efy50j9xyfxwa38df40zp58z6t5w' + 'bitauth:qwtcxp42fcp06phz2xec6t5krau0ftew5efy50j9xyfxwa38df40zp58z6t5w', ); t.throws(() => encodeCashAddress('bitcoincash', 'p2sh', hexToBin('97')), { @@ -172,7 +173,7 @@ test('encodeCashAddress: works', (t) => { test('decodeCashAddress: works', (t) => { const payload = hexToBin('15d16c84669ab46059313bf0747e781f1d13936d'); const result = decodeCashAddress( - 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' + 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x', ); if (typeof result === 'string') { t.log(result); @@ -190,7 +191,7 @@ test('decodeCashAddress: works', (t) => { payload, prefix: CashAddressNetworkPrefix.testnet, type: CashAddressType.p2pkh, - } + }, ); t.deepEqual( @@ -199,11 +200,11 @@ test('decodeCashAddress: works', (t) => { payload, prefix: CashAddressNetworkPrefix.mainnet, type: CashAddressType.p2pkh, - } + }, ); t.deepEqual( decodeCashAddress('bitcoincash:qq2azmyyv6dtgczexyalqar70q036yund54qgw0wg6'), - { payload, prefix: 'bitcoincash', type: CashAddressType.p2pkh } + { payload, prefix: 'bitcoincash', type: CashAddressType.p2pkh }, ); t.deepEqual( @@ -212,63 +213,63 @@ test('decodeCashAddress: works', (t) => { payload, prefix: CashAddressNetworkPrefix.regtest, type: CashAddressType.p2pkh, - } + }, ); t.deepEqual( decodeCashAddress('bchreg:qq2azmyyv6dtgczexyalqar70q036yund5tw6gw2vq'), - { payload, prefix: 'bchreg', type: CashAddressType.p2pkh } + { payload, prefix: 'bchreg', type: CashAddressType.p2pkh }, ); t.deepEqual( decodeCashAddressFormat( - 'bitauth:qwtcxp42fcp06phz2xec6t5krau0ftew5efy50j9xyfxwa38df40zp58z6t5w' + 'bitauth:qwtcxp42fcp06phz2xec6t5krau0ftew5efy50j9xyfxwa38df40zp58z6t5w', ), { payload: hexToBin( - '978306aa4e02fd06e251b38d2e961f78f4af2ea6524a3e4531126776276a6af1' + '978306aa4e02fd06e251b38d2e961f78f4af2ea6524a3e4531126776276a6af1', ), prefix: 'bitauth', version: encodeCashAddressVersionByte(0, 32), - } + }, ); t.deepEqual( decodeCashAddressFormat( - ':qwtcxp42fcp06phz2xec6t5krau0ftew5efy50j9xyfxwa38df40zp58z6t5w' + ':qwtcxp42fcp06phz2xec6t5krau0ftew5efy50j9xyfxwa38df40zp58z6t5w', ), - CashAddressDecodingError.invalidFormat + CashAddressDecodingError.invalidFormat, ); t.deepEqual( decodeCashAddress('prefix:broken'), - CashAddressDecodingError.invalidCharacters + CashAddressDecodingError.invalidCharacters, ); t.deepEqual( decodeCashAddressFormat('prefix:broken'), - CashAddressDecodingError.invalidCharacters + CashAddressDecodingError.invalidCharacters, ); t.deepEqual( // cspell: disable-next-line decodeCashAddressFormat('verybroken:lll30n6j98m5'), - CashAddressDecodingError.improperPadding + CashAddressDecodingError.improperPadding, ); t.deepEqual( // cspell: disable-next-line decodeCashAddressFormat('bchtest:testnetaddress4d6njnut'), - CashAddressDecodingError.improperPadding + CashAddressDecodingError.improperPadding, ); t.deepEqual( decodeCashAddress( - 'bchreg:555555555555555555555555555555555555555555555udxmlmrz' + 'bchreg:555555555555555555555555555555555555555555555udxmlmrz', ), - CashAddressDecodingError.reservedByte + CashAddressDecodingError.reservedByte, ); t.deepEqual( decodeCashAddress('bitcoincash:qu2azmyyv6dtgczexyalqar70q036yund53an46hf6'), - CashAddressDecodingError.mismatchedPayloadLength + CashAddressDecodingError.mismatchedPayloadLength, ); }); @@ -282,10 +283,9 @@ test('CashAddress test vectors', (t) => { const typeBits = vector.type as CashAddressAvailableTypeBits; const version = encodeCashAddressVersionByte( typeBits, - payload.length as CashAddressSupportedLength + payload.length as CashAddressSupportedLength, ); const encodeResult = encodeCashAddressFormat(prefix, version, payload); - // eslint-disable-next-line functional/no-conditional-statement if (cashaddr !== encodeResult) { t.log('expected vector', vector.cashaddr); t.log('typeBits', typeBits); @@ -296,7 +296,6 @@ test('CashAddress test vectors', (t) => { t.deepEqual(vector.cashaddr, encodeResult); const decodeResult = decodeCashAddressNonStandard(cashaddr); - // eslint-disable-next-line functional/no-conditional-statement if (typeof decodeResult === 'string') { t.log(decodeResult); t.fail(); @@ -309,43 +308,43 @@ test('decodeCashAddressWithoutPrefix', (t) => { const payload = hexToBin('15d16c84669ab46059313bf0747e781f1d13936d'); t.deepEqual( decodeCashAddressFormatWithoutPrefix( - 'qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' + 'qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x', ), - { payload, prefix: 'bchtest', version: 0 } + { payload, prefix: 'bchtest', version: 0 }, ); t.deepEqual( decodeCashAddressFormatWithoutPrefix( - 'qq2azmyyv6dtgczexyalqar70q036yund54qgw0wg6' + 'qq2azmyyv6dtgczexyalqar70q036yund54qgw0wg6', ), - { payload, prefix: 'bitcoincash', version: 0 } + { payload, prefix: 'bitcoincash', version: 0 }, ); t.deepEqual( decodeCashAddressFormatWithoutPrefix( - 'qq2azmyyv6dtgczexyalqar70q036yund5tw6gw2vq' + 'qq2azmyyv6dtgczexyalqar70q036yund5tw6gw2vq', ), - { payload, prefix: 'bchreg', version: 0 } + { payload, prefix: 'bchreg', version: 0 }, ); t.deepEqual( decodeCashAddressFormatWithoutPrefix( 'qwtcxp42fcp06phz2xec6t5krau0ftew5efy50j9xyfxwa38df40zp58z6t5w', - ['bitauth'] + ['bitauth'], ), { payload: hexToBin( - '978306aa4e02fd06e251b38d2e961f78f4af2ea6524a3e4531126776276a6af1' + '978306aa4e02fd06e251b38d2e961f78f4af2ea6524a3e4531126776276a6af1', ), prefix: 'bitauth', version: encodeCashAddressVersionByte(0, 32), - } + }, ); t.deepEqual( // cspell: disable-next-line decodeCashAddressFormatWithoutPrefix('qwtcxp42fcp06phz', ['bitauth']), - CashAddressDecodingError.invalidChecksum + CashAddressDecodingError.invalidChecksum, ); }); @@ -360,11 +359,11 @@ test('[fast-check] encodeCashAddressFormat <-> decodeCashAddressFormat', (t) => (prefix, version, payload) => { t.deepEqual( decodeCashAddressFormat( - encodeCashAddressFormat(prefix, version, payload) + encodeCashAddressFormat(prefix, version, payload), ), - { payload, prefix, version } + { payload, prefix, version }, ); - } + }, ); t.notThrows(() => { fc.assert(roundTripWithPayloadLength(20)); @@ -392,12 +391,12 @@ test('[fast-check] encodeCashAddressNonStandard <-> decodeCashAddressNonStandard encodeCashAddressNonStandard( prefix, typeBits as CashAddressAvailableTypeBits, - payload - ) + payload, + ), ), - { payload, prefix, typeBits } + { payload, prefix, typeBits }, ); - } + }, ); t.notThrows(() => { fc.assert(roundTripWithPayloadLength(20)); @@ -413,7 +412,7 @@ test('[fast-check] encodeCashAddressNonStandard <-> decodeCashAddressNonStandard test('[fast-check] encodeCashAddress <-> decodeCashAddress', (t) => { const prefixes = Object.keys( - CashAddressNetworkPrefix + CashAddressNetworkPrefix, ) as CashAddressNetworkPrefix[]; const types = Object.keys(CashAddressType) as CashAddressType[]; const roundTripWithPayloadLength = (length: CashAddressSupportedLength) => @@ -428,9 +427,9 @@ test('[fast-check] encodeCashAddress <-> decodeCashAddress', (t) => { const type = types[typeIndex]!; t.deepEqual( decodeCashAddress(encodeCashAddress(prefix, type, payload)), - { payload, prefix, type } + { payload, prefix, type }, ); - } + }, ); t.notThrows(() => { fc.assert(roundTripWithPayloadLength(20)); @@ -448,35 +447,35 @@ test('attemptCashAddressErrorCorrection', (t) => { t.deepEqual( attemptCashAddressFormatErrorCorrection( // cspell: disable-next-line - ':qq2azmyyv6dtgczexyalqar70q036yund53jvfde0c' + ':qq2azmyyv6dtgczexyalqar70q036yund53jvfde0c', ), - CashAddressDecodingError.invalidFormat + CashAddressDecodingError.invalidFormat, ); t.deepEqual( attemptCashAddressFormatErrorCorrection( // cspell: disable-next-line - 'broken:broken' + 'broken:broken', ), - CashAddressDecodingError.invalidCharacters + CashAddressDecodingError.invalidCharacters, ); t.deepEqual( attemptCashAddressFormatErrorCorrection( // cspell: disable-next-line - 'achtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0c' + 'achtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0c', ), { address: 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x', corrections: [0, 49], - } + }, ); t.deepEqual( attemptCashAddressFormatErrorCorrection( // cspell: disable-next-line - 'btcbest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' + 'btcbest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x', ), - CashAddressCorrectionError.tooManyErrors + CashAddressCorrectionError.tooManyErrors, ); }); @@ -489,24 +488,24 @@ test('[fast-check] attemptCashAddressErrorCorrection', (t) => { fc.nat(15), fc.uint8Array({ maxLength: payloadLength, minLength: payloadLength }), fc.array(fc.nat(payloadLength), { maxLength: 2, minLength: 0 }), - // eslint-disable-next-line max-params + // eslint-disable-next-line @typescript-eslint/max-params (prefix, typeBits, payload, randomErrors) => { const address = encodeCashAddressNonStandard( prefix, typeBits as CashAddressAvailableTypeBits, - payload + payload, ); const addressChars = splitEvery(address, 1); const errors = [ ...new Set( randomErrors .filter((i) => i !== prefix.length) - .sort((a, b) => a - b) + .sort((a, b) => a - b), ), ]; const broken = addressChars .map((char, i) => - errors.includes(i) ? (char === 'q' ? 'p' : 'q') : char + errors.includes(i) ? (char === 'q' ? 'p' : 'q') : char, ) .join(''); @@ -514,7 +513,7 @@ test('[fast-check] attemptCashAddressErrorCorrection', (t) => { address, corrections: errors, }); - } + }, ); t.notThrows(() => { fc.assert(correctsUpToTwoErrors(20)); @@ -551,47 +550,47 @@ test( legacyVectors, // cspell: disable-next-line '1BpEi6DfDAUFd7GtittLSdBeYJvcoaVggu', - 'bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a' + 'bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a', ); test( legacyVectors, // cspell: disable-next-line '1KXrWXciRDZUpQwQmuM1DbwsKDLYAYsVLR', - 'bitcoincash:qr95sy3j9xwd2ap32xkykttr4cvcu7as4y0qverfuy' + 'bitcoincash:qr95sy3j9xwd2ap32xkykttr4cvcu7as4y0qverfuy', ); test( legacyVectors, // cspell: disable-next-line '16w1D5WRVKJuZUsSRzdLp9w3YGcgoxDXb', - 'bitcoincash:qqq3728yw0y47sqn6l2na30mcw6zm78dzqre909m2r' + 'bitcoincash:qqq3728yw0y47sqn6l2na30mcw6zm78dzqre909m2r', ); test( legacyVectors, // cspell: disable-next-line '3CWFddi6m4ndiGyKqzYvsFYagqDLPVMTzC', - 'bitcoincash:ppm2qsznhks23z7629mms6s4cwef74vcwvn0h829pq' + 'bitcoincash:ppm2qsznhks23z7629mms6s4cwef74vcwvn0h829pq', ); test( legacyVectors, // cspell: disable-next-line '3LDsS579y7sruadqu11beEJoTjdFiFCdX4', - 'bitcoincash:pr95sy3j9xwd2ap32xkykttr4cvcu7as4yc93ky28e' + 'bitcoincash:pr95sy3j9xwd2ap32xkykttr4cvcu7as4yc93ky28e', ); test( legacyVectors, // cspell: disable-next-line '31nwvkZwyPdgzjBJZXfDmSWsC4ZLKpYyUw', - 'bitcoincash:pqq3728yw0y47sqn6l2na30mcw6zm78dzq5ucqzc37' + 'bitcoincash:pqq3728yw0y47sqn6l2na30mcw6zm78dzq5ucqzc37', ); test( legacyVectors, // cspell: disable-next-line '1Q2TWHE3GMdB6BZKafqwxXtWAWgFt5Jvm3', - 'bitcoincash:qr7fzmep8g7h7ymfxy74lgc0v950j3r2959lhtxxsl' + 'bitcoincash:qr7fzmep8g7h7ymfxy74lgc0v950j3r2959lhtxxsl', ); diff --git a/src/lib/address/cash-address.ts b/src/lib/address/cash-address.ts index 3be4f0c5..16dbfacd 100644 --- a/src/lib/address/cash-address.ts +++ b/src/lib/address/cash-address.ts @@ -1,5 +1,4 @@ import { formatError } from '../format/format.js'; -import type { Immutable } from '../lib.js'; import { decodeBech32, @@ -213,7 +212,7 @@ const enum Constants { */ export const encodeCashAddressVersionByte = ( typeBits: CashAddressAvailableTypeBits, - length: CashAddressSupportedLength + length: CashAddressSupportedLength, ) => // eslint-disable-next-line no-bitwise (typeBits << Constants.cashAddressTypeBitsShift) | @@ -253,9 +252,9 @@ export const decodeCashAddressVersionByte = (version: number) => */ export const maskCashAddressPrefix = (prefix: string) => { const result = []; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line functional/no-let, functional/no-loop-statements, no-plusplus for (let i = 0; i < prefix.length; i++) { - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, functional/immutable-data result.push(prefix.charCodeAt(i) & Constants.asciiCaseInsensitiveBits); } return result; @@ -314,8 +313,8 @@ const bech32GeneratorRemainingBytes = [0xf2bc8e61, 0xb76d99e2, 0x3e5fb3c4, 0x2ea * @param v - Array of 5-bit integers over which the checksum is to be computed */ // Derived from the `bitcore-lib-cash` implementation (does not require BigInt): https://github.com/bitpay/bitcore -export const cashAddressPolynomialModulo = (v: readonly number[]) => { - /* eslint-disable functional/no-let, functional/no-loop-statement, functional/no-expression-statement, no-bitwise, @typescript-eslint/no-magic-numbers */ +export const cashAddressPolynomialModulo = (v: number[]) => { + /* eslint-disable functional/no-let, functional/no-loop-statements, functional/no-expression-statements, no-bitwise, @typescript-eslint/no-magic-numbers */ let mostSignificantByte = 0; let lowerBytes = 1; let c = 0; @@ -331,7 +330,7 @@ export const cashAddressPolynomialModulo = (v: readonly number[]) => { lowerBytes ^= v[j]!; // eslint-disable-next-line no-plusplus for (let i = 0; i < bech32GeneratorMostSignificantByte.length; ++i) { - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (c & (1 << i)) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion mostSignificantByte ^= bech32GeneratorMostSignificantByte[i]!; @@ -341,13 +340,13 @@ export const cashAddressPolynomialModulo = (v: readonly number[]) => { } } lowerBytes ^= 1; - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (lowerBytes < 0) { lowerBytes ^= 1 << 31; lowerBytes += (1 << 30) * 2; } return mostSignificantByte * (1 << 30) * 4 + lowerBytes; - /* eslint-enable functional/no-let, functional/no-loop-statement, functional/no-expression-statement, no-bitwise, @typescript-eslint/no-magic-numbers */ + /* eslint-enable functional/no-let, functional/no-loop-statements, functional/no-expression-statements, no-bitwise, @typescript-eslint/no-magic-numbers */ }; /** @@ -358,11 +357,11 @@ export const cashAddressPolynomialModulo = (v: readonly number[]) => { */ export const cashAddressChecksumToUint5Array = (checksum: number) => { const result = []; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line functional/no-let, functional/no-loop-statements, no-plusplus for (let i = 0; i < Constants.base256WordLength; ++i) { - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, @typescript-eslint/no-magic-numbers, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, @typescript-eslint/no-magic-numbers, functional/immutable-data result.push(checksum & 31); - // eslint-disable-next-line functional/no-expression-statement, @typescript-eslint/no-magic-numbers, no-param-reassign + // eslint-disable-next-line functional/no-expression-statements, @typescript-eslint/no-magic-numbers, no-param-reassign checksum /= 32; } // eslint-disable-next-line functional/immutable-data @@ -384,7 +383,7 @@ export const cashAddressChecksumToUint5Array = (checksum: number) => { export const encodeCashAddressFormat = ( prefix: string, version: number, - payload: Immutable + payload: Uint8Array, ) => { const checksum40BitPlaceholder = [0, 0, 0, 0, 0, 0, 0, 0]; const payloadContents = regroupBits({ @@ -413,7 +412,7 @@ export enum CashAddressEncodingError { } export const isValidCashAddressPayloadLength = ( - length: number + length: number, ): length is CashAddressSupportedLength => (cashAddressLengthToSizeBits[length as CashAddressSupportedLength] as | CashAddressSizeBits @@ -443,22 +442,22 @@ export const isValidCashAddressPayloadLength = ( export const encodeCashAddressNonStandard = ( prefix: string, typeBits: CashAddressAvailableTypeBits, - payload: Uint8Array + payload: Uint8Array, ) => { const { length } = payload; if (!isValidCashAddressPayloadLength(length)) { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new Error( formatError( CashAddressEncodingError.unsupportedPayloadLength, - `Payload length: ${length}.` - ) + `Payload length: ${length}.`, + ), ); } return encodeCashAddressFormat( prefix, encodeCashAddressVersionByte(typeBits, length), - payload + payload, ); }; @@ -484,12 +483,12 @@ export const encodeCashAddressNonStandard = ( export const encodeCashAddress = ( prefix: `${CashAddressNetworkPrefix}`, type: `${CashAddressType}`, - payload: Uint8Array + payload: Uint8Array, ) => encodeCashAddressNonStandard( prefix, cashAddressTypeToTypeBits[type], - payload + payload, ); export enum CashAddressDecodingError { @@ -639,13 +638,13 @@ export const decodeCashAddress = (address: string) => { // decodeCashAddressWithoutPrefix export const decodeCashAddressFormatWithoutPrefix = ( address: string, - possiblePrefixes: readonly string[] = [ + possiblePrefixes: string[] = [ CashAddressNetworkPrefix.mainnet, CashAddressNetworkPrefix.testnet, CashAddressNetworkPrefix.regtest, - ] + ], ) => { - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const prefix of possiblePrefixes) { const attempt = decodeCashAddressFormat(`${prefix}:${address}`); if (attempt !== CashAddressDecodingError.invalidChecksum) { @@ -670,14 +669,12 @@ export const decodeCashAddressFormatWithoutPrefix = ( * @param polynomial - an array of 5-bit integers representing the terms of a * CashAddress polynomial */ -export const cashAddressPolynomialToCashAddress = ( - polynomial: readonly number[] -) => { +export const cashAddressPolynomialToCashAddress = (polynomial: number[]) => { const separatorPosition = polynomial.indexOf(0); const prefix = polynomial .slice(0, separatorPosition) .map((integer) => - String.fromCharCode(Constants.asciiLowerCaseStart + integer) + String.fromCharCode(Constants.asciiLowerCaseStart + integer), ) .join(''); const contents = encodeBech32(polynomial.slice(separatorPosition + 1)); @@ -737,9 +734,9 @@ export const attemptCashAddressFormatErrorCorrection = (address: string) => { } const syndromes: { [index: string]: number } = {}; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line functional/no-let, functional/no-loop-statements, no-plusplus for (let term = 0; term < polynomial.length; term++) { - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for ( // eslint-disable-next-line functional/no-let let errorVector = 1; @@ -747,7 +744,7 @@ export const attemptCashAddressFormatErrorCorrection = (address: string) => { // eslint-disable-next-line no-plusplus errorVector++ ) { - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, functional/immutable-data polynomial[term] ^= errorVector; const correct = cashAddressPolynomialModulo(polynomial); @@ -759,14 +756,14 @@ export const attemptCashAddressFormatErrorCorrection = (address: string) => { } // eslint-disable-next-line no-bitwise const s0 = (BigInt(correct) ^ BigInt(originalChecksum)).toString(); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data syndromes[s0] = term * Constants.finiteFieldOrder + errorVector; - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, functional/immutable-data polynomial[term] ^= errorVector; } } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [s0, pe] of Object.entries(syndromes)) { // eslint-disable-next-line no-bitwise const s1Location = (BigInt(s0) ^ BigInt(originalChecksum)).toString(); @@ -774,9 +771,9 @@ export const attemptCashAddressFormatErrorCorrection = (address: string) => { if (s1 !== undefined) { const correctionIndex1 = Math.trunc(pe / Constants.finiteFieldOrder); const correctionIndex2 = Math.trunc(s1 / Constants.finiteFieldOrder); - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, functional/immutable-data polynomial[correctionIndex1] ^= pe % Constants.finiteFieldOrder; - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, functional/immutable-data polynomial[correctionIndex2] ^= s1 % Constants.finiteFieldOrder; return { address: cashAddressPolynomialToCashAddress(polynomial), diff --git a/src/lib/address/locking-bytecode.spec.ts b/src/lib/address/locking-bytecode.spec.ts index cc04e6bb..117eb4cb 100644 --- a/src/lib/address/locking-bytecode.spec.ts +++ b/src/lib/address/locking-bytecode.spec.ts @@ -19,10 +19,10 @@ import { test('lockingBytecode <-> AddressContents: P2PK', (t) => { const genesisCoinbase = hexToBin( - '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac' + '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac', ); const genesisPublicKey = hexToBin( - '04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f' + '04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f', ); t.deepEqual(lockingBytecodeToAddressContents(genesisCoinbase), { @@ -35,21 +35,21 @@ test('lockingBytecode <-> AddressContents: P2PK', (t) => { payload: genesisPublicKey, type: 'P2PK', }), - genesisCoinbase + genesisCoinbase, ); t.deepEqual( addressContentsToLockingBytecode({ payload: genesisPublicKey, type: LockingBytecodeType.p2pk, }), - genesisCoinbase + genesisCoinbase, ); const genesisCoinbaseCompressed = hexToBin( - '2103678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6ac' + '2103678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6ac', ); const compressedPublicKey = hexToBin( - '03678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6' + '03678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6', ); t.deepEqual(lockingBytecodeToAddressContents(genesisCoinbaseCompressed), { payload: compressedPublicKey, @@ -61,7 +61,7 @@ test('lockingBytecode <-> AddressContents: P2PK', (t) => { payload: compressedPublicKey, type: LockingBytecodeType.p2pk, }), - genesisCoinbaseCompressed + genesisCoinbaseCompressed, ); }); @@ -77,14 +77,14 @@ test('lockingBytecode <-> AddressContents: P2PKH', (t) => { payload: expectedPayload, type: 'P2PKH', }), - p2pkh + p2pkh, ); t.deepEqual( addressContentsToLockingBytecode({ payload: expectedPayload, type: LockingBytecodeType.p2pkh, }), - p2pkh + p2pkh, ); }); @@ -100,14 +100,14 @@ test('lockingBytecode <-> AddressContents: P2SH20', (t) => { payload: expectedPayload, type: 'P2SH20', }), - p2sh20 + p2sh20, ); t.deepEqual( addressContentsToLockingBytecode({ payload: expectedPayload, type: LockingBytecodeType.p2sh20, }), - p2sh20 + p2sh20, ); }); @@ -125,7 +125,7 @@ test('lockingBytecode <-> AddressContents: unknown', (t) => { // @ts-expect-error type: 'unknown', }), - { message: 'Unrecognized addressContents type: unknown' } + { message: 'Unrecognized addressContents type: unknown' }, ); const almostP2pk = hexToBin('0100ac'); @@ -184,12 +184,12 @@ const cashVectors = test.macro<[string, string]>({ options: { tokenSupport: false }, prefix: 'bitcoincash', }, - 'cashAddressToLockingBytecode' + 'cashAddressToLockingBytecode', ); t.deepEqual( lockingBytecodeToCashAddress(hexToBin(bytecode), 'bitcoincash'), cashAddress, - 'lockingBytecodeToCashAddress' + 'lockingBytecodeToCashAddress', ); }, title: (_, cashAddress) => @@ -199,42 +199,42 @@ const cashVectors = test.macro<[string, string]>({ test( cashVectors, 'bitcoincash:qpm2qsznhks23z7629mms6s4cwef74vcwvy22gdx6a', - '76a91476a04053bda0a88bda5177b86a15c3b29f55987388ac' + '76a91476a04053bda0a88bda5177b86a15c3b29f55987388ac', ); test( cashVectors, 'bitcoincash:qr95sy3j9xwd2ap32xkykttr4cvcu7as4y0qverfuy', - '76a914cb481232299cd5743151ac4b2d63ae198e7bb0a988ac' + '76a914cb481232299cd5743151ac4b2d63ae198e7bb0a988ac', ); test( cashVectors, 'bitcoincash:qqq3728yw0y47sqn6l2na30mcw6zm78dzqre909m2r', - '76a914011f28e473c95f4013d7d53ec5fbc3b42df8ed1088ac' + '76a914011f28e473c95f4013d7d53ec5fbc3b42df8ed1088ac', ); test( cashVectors, 'bitcoincash:ppm2qsznhks23z7629mms6s4cwef74vcwvn0h829pq', - 'a91476a04053bda0a88bda5177b86a15c3b29f55987387' + 'a91476a04053bda0a88bda5177b86a15c3b29f55987387', ); test( cashVectors, 'bitcoincash:pr95sy3j9xwd2ap32xkykttr4cvcu7as4yc93ky28e', - 'a914cb481232299cd5743151ac4b2d63ae198e7bb0a987' + 'a914cb481232299cd5743151ac4b2d63ae198e7bb0a987', ); test( cashVectors, 'bitcoincash:pqq3728yw0y47sqn6l2na30mcw6zm78dzq5ucqzc37', - 'a914011f28e473c95f4013d7d53ec5fbc3b42df8ed1087' + 'a914011f28e473c95f4013d7d53ec5fbc3b42df8ed1087', ); test('lockingBytecodeToCashAddress: P2PK', (t) => { const genesisCoinbase = hexToBin( - '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac' + '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac', ); t.deepEqual(lockingBytecodeToCashAddress(genesisCoinbase, 'bitcoincash'), { @@ -242,16 +242,16 @@ test('lockingBytecodeToCashAddress: P2PK', (t) => { }); const genesisCoinbaseCompressed = hexToBin( - '2103678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6ac' + '2103678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6ac', ); t.deepEqual( lockingBytecodeToCashAddress( genesisCoinbaseCompressed, - CashAddressNetworkPrefix.mainnet + CashAddressNetworkPrefix.mainnet, ), { error: CashAddressEncodingError.noTypeBitsValueStandardizedForP2pk, - } + }, ); }); @@ -262,7 +262,7 @@ test('cashAddressToLockingBytecode <-> lockingBytecodeToCashAddress: P2PKH', (t) t.deepEqual(lockingBytecodeToCashAddress(p2pkh, 'bitcoincash'), address); t.deepEqual( lockingBytecodeToCashAddress(p2pkh, 'bitcoincash', { tokenSupport: true }), - tokenAddress + tokenAddress, ); t.deepEqual(cashAddressToLockingBytecode(address), { bytecode: p2pkh, @@ -283,7 +283,7 @@ test('cashAddressToLockingBytecode <-> lockingBytecodeToCashAddress: P2SH20', (t t.deepEqual(lockingBytecodeToCashAddress(p2sh20, 'bitcoincash'), address); t.deepEqual( lockingBytecodeToCashAddress(p2sh20, 'bitcoincash', { tokenSupport: true }), - tokenAddress + tokenAddress, ); t.deepEqual(cashAddressToLockingBytecode(address), { bytecode: p2sh20, @@ -299,7 +299,7 @@ test('cashAddressToLockingBytecode <-> lockingBytecodeToCashAddress: P2SH20', (t test('cashAddressToLockingBytecode <-> lockingBytecodeToCashAddress: P2SH32', (t) => { const p2sh32 = hexToBin( - 'aa20000000000000000000000000000012345678900000000000000000000000000087' + 'aa20000000000000000000000000000012345678900000000000000000000000000087', ); const address = 'bitcoincash:pvqqqqqqqqqqqqqqqqqqqqqqzg69v7ysqqqqqqqqqqqqqqqqqqqqqpkp7fqn0'; @@ -308,7 +308,7 @@ test('cashAddressToLockingBytecode <-> lockingBytecodeToCashAddress: P2SH32', (t t.deepEqual(lockingBytecodeToCashAddress(p2sh32, 'bitcoincash'), address); t.deepEqual( lockingBytecodeToCashAddress(p2sh32, 'bitcoincash', { tokenSupport: true }), - tokenAddress + tokenAddress, ); t.deepEqual(cashAddressToLockingBytecode(address), { bytecode: p2sh32, @@ -329,7 +329,7 @@ test('lockingBytecodeToCashAddress: error', (t) => { error: CashAddressEncodingError.unknownLockingBytecodeType, }); const genesisCoinbase = hexToBin( - '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac' + '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac', ); t.deepEqual(lockingBytecodeToCashAddress(genesisCoinbase, 'bitcoincash'), { error: CashAddressEncodingError.noTypeBitsValueStandardizedForP2pk, @@ -339,22 +339,22 @@ test('lockingBytecodeToCashAddress: error', (t) => { test('cashAddressToLockingBytecode: error', (t) => { t.deepEqual( cashAddressToLockingBytecode('bad:address'), - CashAddressDecodingError.invalidChecksum + CashAddressDecodingError.invalidChecksum, ); t.deepEqual( cashAddressToLockingBytecode( - 'bitcoincash:dp60yz0ka2g8ut4y3a604czhs2hg5ejj2u6xkulaqj' + 'bitcoincash:dp60yz0ka2g8ut4y3a604czhs2hg5ejj2u6xkulaqj', ), - `${CashAddressDecodingError.unknownAddressType} Type bit value: 13.` + `${CashAddressDecodingError.unknownAddressType} Type bit value: 13.`, ); }); test('lockingBytecodeToBase58Address: P2PK', (t) => { const genesisCoinbase = hexToBin( - '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac' + '4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac', ); const genesisPublicKey = hexToBin( - '04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f' + '04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f', ); t.deepEqual( @@ -362,25 +362,25 @@ test('lockingBytecodeToBase58Address: P2PK', (t) => { { payload: genesisPublicKey, type: LockingBytecodeType.p2pk, - } + }, ); const genesisCoinbaseCompressed = hexToBin( - '2103678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6ac' + '2103678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6ac', ); const compressedPublicKey = hexToBin( - '03678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6' + '03678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb6', ); t.deepEqual( lockingBytecodeToBase58Address( genesisCoinbaseCompressed, 'testnet', - sha256 + sha256, ), { payload: compressedPublicKey, type: LockingBytecodeType.p2pk, - } + }, ); }); @@ -395,7 +395,7 @@ test('base58AddressToLockingBytecode <-> lockingBytecodeToBase58Address: P2PKH', t.deepEqual(lockingBytecodeToBase58Address(p2pkh, 'mainnet'), address); t.deepEqual( lockingBytecodeToBase58Address(p2pkh, 'testnet', sha256), - addressTestnet + addressTestnet, ); t.deepEqual(lockingBytecodeToBase58Address(p2pkh, 'copayBCH'), addressCopay); @@ -424,7 +424,7 @@ test('base58AddressToLockingBytecode <-> lockingBytecodeToBase58Address: P2SH20' t.deepEqual(lockingBytecodeToBase58Address(p2sh20, 'mainnet'), address); t.deepEqual( lockingBytecodeToBase58Address(p2sh20, 'testnet', sha256), - addressTestnet + addressTestnet, ); t.deepEqual(lockingBytecodeToBase58Address(p2sh20, 'copayBCH'), addressCopay); @@ -445,6 +445,6 @@ test('base58AddressToLockingBytecode <-> lockingBytecodeToBase58Address: P2SH20' test('base58AddressToLockingBytecode: error', (t) => { t.deepEqual( base58AddressToLockingBytecode('bad:address'), - Base58AddressError.unknownCharacter + Base58AddressError.unknownCharacter, ); }); diff --git a/src/lib/address/locking-bytecode.ts b/src/lib/address/locking-bytecode.ts index d6c61fad..b98f8211 100644 --- a/src/lib/address/locking-bytecode.ts +++ b/src/lib/address/locking-bytecode.ts @@ -63,19 +63,19 @@ export enum LockingBytecodeType { * An object representing the contents of an address of a known address type. * This can be used to encode an address or its locking bytecode. */ -export interface KnownAddressTypeContents { +export type KnownAddressTypeContents = { type: `${LockingBytecodeType}`; payload: Uint8Array; -} +}; -export interface UnknownAddressTypeContents { +export type UnknownAddressTypeContents = { /** * This address type represents an address using an unknown or uncommon * locking bytecode pattern for which no standardized address formats exist. */ type: 'unknown'; payload: Uint8Array; -} +}; /** * An object representing the contents of an address. This can be used to encode @@ -208,13 +208,13 @@ const enum AddressPayload { // eslint-disable-next-line complexity export const lockingBytecodeToAddressContents = ( - bytecode: Uint8Array + bytecode: Uint8Array, ): AddressContents => { if (isPayToPublicKeyHash(bytecode)) { return { payload: bytecode.slice( AddressPayload.p2pkhStart, - AddressPayload.p2pkhEnd + AddressPayload.p2pkhEnd, ), type: LockingBytecodeType.p2pkh, }; @@ -224,7 +224,7 @@ export const lockingBytecodeToAddressContents = ( return { payload: bytecode.slice( AddressPayload.p2sh20Start, - AddressPayload.p2sh20End + AddressPayload.p2sh20End, ), type: LockingBytecodeType.p2sh20, }; @@ -234,7 +234,7 @@ export const lockingBytecodeToAddressContents = ( return { payload: bytecode.slice( AddressPayload.p2sh32Start, - AddressPayload.p2sh32End + AddressPayload.p2sh32End, ), type: LockingBytecodeType.p2sh32, }; @@ -244,7 +244,7 @@ export const lockingBytecodeToAddressContents = ( return { payload: bytecode.slice( AddressPayload.p2pkUncompressedStart, - AddressPayload.p2pkUncompressedEnd + AddressPayload.p2pkUncompressedEnd, ), type: LockingBytecodeType.p2pk, }; @@ -254,7 +254,7 @@ export const lockingBytecodeToAddressContents = ( return { payload: bytecode.slice( AddressPayload.p2pkCompressedStart, - AddressPayload.p2pkCompressedEnd + AddressPayload.p2pkCompressedEnd, ), type: LockingBytecodeType.p2pk, }; @@ -368,7 +368,7 @@ export const addressContentsToLockingBytecode = ({ } return unknownValue( type, - `Unrecognized addressContents type: ${type as string}` + `Unrecognized addressContents type: ${type as string}`, ); }; @@ -391,7 +391,7 @@ export const addressContentsToLockingBytecode = ({ export const lockingBytecodeToCashAddress = ( bytecode: Uint8Array, prefix: `${CashAddressNetworkPrefix}` = 'bitcoincash', - options = { tokenSupport: false } + options = { tokenSupport: false }, ) => { const contents = lockingBytecodeToAddressContents(bytecode); if (contents.type === LockingBytecodeType.p2pkh) { @@ -399,7 +399,7 @@ export const lockingBytecodeToCashAddress = ( ? encodeCashAddress( prefix, CashAddressType.p2pkhWithTokens, - contents.payload + contents.payload, ) : encodeCashAddress(prefix, CashAddressType.p2pkh, contents.payload); } @@ -411,7 +411,7 @@ export const lockingBytecodeToCashAddress = ( ? encodeCashAddress( prefix, CashAddressType.p2shWithTokens, - contents.payload + contents.payload, ) : encodeCashAddress(prefix, CashAddressType.p2sh, contents.payload); } @@ -426,7 +426,7 @@ export const lockingBytecodeToCashAddress = ( } return unknownValue( contents.type, - `Unrecognized locking bytecode type: ${contents.type as string}` + `Unrecognized locking bytecode type: ${contents.type as string}`, ); }; @@ -451,7 +451,7 @@ export const cashAddressToLockingBytecode = (address: string) => { ) { return formatError( LockingBytecodeGenerationError.unsupportedPayloadLength, - `Payload length: ${decoded.payload.length}` + `Payload length: ${decoded.payload.length}`, ); } if ( @@ -490,7 +490,7 @@ export const cashAddressToLockingBytecode = (address: string) => { } return unknownValue( decoded.type, - `Unrecognized address type: ${decoded.type as string}` + `Unrecognized address type: ${decoded.type as string}`, ); }; @@ -516,7 +516,7 @@ export const cashAddressToLockingBytecode = (address: string) => { export const lockingBytecodeToBase58Address = ( bytecode: Uint8Array, network: `${Base58AddressNetwork}` = 'mainnet', - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => { const contents = lockingBytecodeToAddressContents(bytecode); @@ -528,7 +528,7 @@ export const lockingBytecodeToBase58Address = ( testnet: Base58AddressFormatVersion.p2pkhTestnet, }[network], contents.payload, - sha256 + sha256, ); } if (contents.type === LockingBytecodeType.p2sh20) { @@ -539,7 +539,7 @@ export const lockingBytecodeToBase58Address = ( testnet: Base58AddressFormatVersion.p2sh20Testnet, }[network], contents.payload, - sha256 + sha256, ); } @@ -556,7 +556,7 @@ export const lockingBytecodeToBase58Address = ( */ export const base58AddressToLockingBytecode = ( address: string, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => { const decoded = decodeBase58Address(address, sha256); if (typeof decoded === 'string') return decoded; diff --git a/src/lib/bin/hashes.ts b/src/lib/bin/hashes.ts index 99fa8816..4c977b24 100644 --- a/src/lib/bin/hashes.ts +++ b/src/lib/bin/hashes.ts @@ -1,11 +1,11 @@ -export interface HashFunction { - readonly final: (rawState: Uint8Array) => Uint8Array; - readonly hash: (input: Uint8Array) => Uint8Array; - readonly init: () => Uint8Array; - readonly update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; -} +export type HashFunction = { + final: (rawState: Uint8Array) => Uint8Array; + hash: (input: Uint8Array) => Uint8Array; + init: () => Uint8Array; + update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; +}; -/* eslint-disable functional/no-conditional-statement, functional/no-let, functional/no-expression-statement, no-underscore-dangle, functional/no-try-statement, @typescript-eslint/no-magic-numbers, max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-non-null-assertion */ +/* eslint-disable functional/no-conditional-statements, functional/no-let, functional/no-expression-statements, no-underscore-dangle, functional/no-try-statements, @typescript-eslint/no-magic-numbers, @typescript-eslint/max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-non-null-assertion */ /** * Note, most of this method is translated and boiled-down from the wasm-pack * workflow. Significant changes to wasm-bindgen or wasm-pack build will likely @@ -17,7 +17,7 @@ export const instantiateRustWasm = async ( hashExportName: string, initExportName: string, updateExportName: string, - finalExportName: string + finalExportName: string, ): Promise => { const wasm = ( await WebAssembly.instantiate(webassemblyBytes, { @@ -30,14 +30,14 @@ export const instantiateRustWasm = async ( // eslint-disable-next-line camelcase, @typescript-eslint/naming-convention __wbindgen_throw: /* istanbul ignore next */ ( ptr: number, - len: number + len: number, ) => { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new Error( // eslint-disable-next-line @typescript-eslint/no-use-before-define Array.from(getUint8Memory().subarray(ptr, ptr + len)) .map((num) => String.fromCharCode(num)) - .join('') + .join(''), ); }, }, @@ -158,4 +158,4 @@ export const instantiateRustWasm = async ( update, }; }; -/* eslint-enable functional/no-conditional-statement, functional/no-let, functional/no-expression-statement, no-underscore-dangle, functional/no-try-statement, @typescript-eslint/no-magic-numbers, max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-non-null-assertion */ +/* eslint-enable functional/no-conditional-statements, functional/no-let, functional/no-expression-statements, no-underscore-dangle, functional/no-try-statements, @typescript-eslint/no-magic-numbers, @typescript-eslint/max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-non-null-assertion */ diff --git a/src/lib/bin/secp256k1/secp256k1-wasm-types.ts b/src/lib/bin/secp256k1/secp256k1-wasm-types.ts index 283340a5..50672ad0 100644 --- a/src/lib/bin/secp256k1/secp256k1-wasm-types.ts +++ b/src/lib/bin/secp256k1/secp256k1-wasm-types.ts @@ -61,7 +61,7 @@ export enum CompressionFlag { * **It's very unlikely that consumers will need to use this interface directly. * See [[Secp256k1]] for a more purely-functional API.** */ -export interface Secp256k1Wasm { +export type Secp256k1Wasm = { /** * Create a Secp256k1 context object. * @@ -74,7 +74,7 @@ export interface Secp256k1Wasm { * verification). * @param context - a `Context` flag representing the capabilities needed */ - readonly contextCreate: (context: ContextFlag) => number; + contextCreate: (context: ContextFlag) => number; /** * Updates the context randomization to protect against side-channel leakage. @@ -97,24 +97,24 @@ export interface Secp256k1Wasm { * @param contextPtr - pointer to a context object * @param seedPtr - pointer to a 32-byte random seed */ - readonly contextRandomize: (contextPtr: number, seedPtr: number) => 0 | 1; + contextRandomize: (contextPtr: number, seedPtr: number) => 0 | 1; /** * Frees a pointer allocated by the `malloc` method. * @param pointer - the pointer to be freed */ - readonly free: (pointer: number) => number; + free: (pointer: number) => number; - readonly heapU32: Uint32Array; - readonly heapU8: Uint8Array; - readonly instance: WebAssembly.Instance; + heapU32: Uint32Array; + heapU8: Uint8Array; + instance: WebAssembly.Instance; /** * Allocates the given number of bytes in WebAssembly memory. * @param malloc - the number of bytes to allocate */ - readonly malloc: (bytes: number) => number; + malloc: (bytes: number) => number; /** * The Secp256k1 library accepts a pointer to a `size_t outputlen` for both @@ -123,14 +123,14 @@ export interface Secp256k1Wasm { * This is a convenience method to create and set the value of those pointers. * @param value - the value of the `size_t` (e.g. the buffer length) */ - readonly mallocSizeT: (value: number) => number; + mallocSizeT: (value: number) => number; /** * Allocates space for the provided array, and assigns the array to the space. * * @param array - a Uint8Array to allocate in WebAssembly memory */ - readonly mallocUint8Array: (array: Uint8Array) => number; + mallocUint8Array: (array: Uint8Array) => number; /** * Tweak a _privateKey_ by adding _tweak_ to it. @@ -140,10 +140,10 @@ export interface Secp256k1Wasm { * @param secretKeyPtr - pointer to a 32 byte private key * @param tweakNum256Ptr - pointer to a 256 bit int representing the tweak value */ - readonly privkeyTweakAdd: ( + privkeyTweakAdd: ( contextPtr: number, secretKeyPtr: number, - tweakNum256Ptr: number + tweakNum256Ptr: number, ) => 0 | 1; /** @@ -154,10 +154,10 @@ export interface Secp256k1Wasm { * @param secretKeyPtr - pointer to a 32 byte private key * @param tweakNum256Ptr - pointer to a 256 bit int representing the tweak value */ - readonly privkeyTweakMul: ( + privkeyTweakMul: ( contextPtr: number, secretKeyPtr: number, - tweakNum256Ptr: number + tweakNum256Ptr: number, ) => 0 | 1; /** @@ -170,10 +170,10 @@ export interface Secp256k1Wasm { * internal representation, and must be serialized for outside use) * @param secretKeyPtr - pointer to a 32-byte private key */ - readonly pubkeyCreate: ( + pubkeyCreate: ( contextPtr: number, publicKeyPtr: number, - secretKeyPtr: number + secretKeyPtr: number, ) => 0 | 1; /** @@ -194,12 +194,12 @@ export interface Secp256k1Wasm { * (Note, this should be a simple integer, rather than a `size_t` pointer as * is required by the serialization methods.) */ - readonly pubkeyParse: ( + pubkeyParse: ( contextPtr: number, publicKeyOutPtr: number, publicKeyInPtr: number, // eslint-disable-next-line @typescript-eslint/no-magic-numbers - publicKeyInLength: 33 | 65 + publicKeyInLength: 33 | 65, ) => 0 | 1; /** @@ -216,12 +216,12 @@ export interface Secp256k1Wasm { * @param compression - a CompressionFlag indicating compressed * or uncompressed */ - readonly pubkeySerialize: ( + pubkeySerialize: ( contextPtr: number, outputPtr: number, outputLengthPtr: number, publicKeyPtr: number, - compression: CompressionFlag + compression: CompressionFlag, ) => 1; /** @@ -234,10 +234,10 @@ export interface Secp256k1Wasm { * @param tweakNum256Ptr - pointer to a 256 bit int representing the tweak value */ - readonly pubkeyTweakAdd: ( + pubkeyTweakAdd: ( contextPtr: number, publicKeyPtr: number, - tweakNum256Ptr: number + tweakNum256Ptr: number, ) => 0 | 1; /** @@ -250,10 +250,10 @@ export interface Secp256k1Wasm { * @param tweakNum256Ptr - pointer to a 256 bit int representing the tweak value */ - readonly pubkeyTweakMul: ( + pubkeyTweakMul: ( contextPtr: number, publicKeyPtr: number, - tweakNum256Ptr: number + tweakNum256Ptr: number, ) => 0 | 1; /** @@ -263,14 +263,14 @@ export interface Secp256k1Wasm { * @param pointer - a pointer to the beginning of the Uint8Array element * @param bytes - the number of bytes to copy */ - readonly readHeapU8: (pointer: number, bytes: number) => Uint8Array; + readHeapU8: (pointer: number, bytes: number) => Uint8Array; /** * Read a `size_t` from WebAssembly memory. * * @param pointer - a pointer to the `size_t` variable to read */ - readonly readSizeT: (pointer: number) => number; + readSizeT: (pointer: number) => number; /** * Compute the public key given a recoverable signature and message hash. @@ -284,11 +284,11 @@ export interface Secp256k1Wasm { * @param msg32Ptr - pointer to the 32-byte message hash the signed by this * signature */ - readonly recover: ( + recover: ( contextPtr: number, publicKeyPtr: number, rSigPtr: number, - msg32Ptr: number + msg32Ptr: number, ) => 0 | 1; /** @@ -309,11 +309,11 @@ export interface Secp256k1Wasm { * @param inputSigPtr - pointer to a serialized signature in compact format * @param rid - the recovery number, as an int. (Not a pointer) */ - readonly recoverableSignatureParse: ( + recoverableSignatureParse: ( contextPtr: number, outputRSigPtr: number, inputSigPtr: number, - rid: number + rid: number, ) => 0 | 1; /** @@ -329,11 +329,11 @@ export interface Secp256k1Wasm { * @param rSigPtr - pointer to the 65-byte signature to be serialized * (internal format) */ - readonly recoverableSignatureSerialize: ( + recoverableSignatureSerialize: ( contextPtr: number, sigOutPtr: number, recIDOutPtr: number, - rSigPtr: number + rSigPtr: number, ) => 1; /** @@ -359,11 +359,11 @@ export interface Secp256k1Wasm { * @param msg32Ptr - pointer to the 32-byte message hash being signed * @param secretKeyPtr - pointer to a 32-byte secret key */ - readonly schnorrSign: ( + schnorrSign: ( contextPtr: number, outputSigPtr: number, msg32Ptr: number, - secretKeyPtr: number + secretKeyPtr: number, ) => 0 | 1; /** @@ -378,11 +378,11 @@ export interface Secp256k1Wasm { * @param pubkeyPtr - pointer to the parsed pubkey with which to verify * (internal format) */ - readonly schnorrVerify: ( + schnorrVerify: ( contextPtr: number, sigPtr: number, msg32Ptr: number, - publicKeyPtr: number + publicKeyPtr: number, ) => 0 | 1; /** @@ -393,7 +393,7 @@ export interface Secp256k1Wasm { * @param contextPtr - pointer to a context object * @param secretKeyPtr - pointer to a 32-byte secret key */ - readonly seckeyVerify: (contextPtr: number, secretKeyPtr: number) => 0 | 1; + seckeyVerify: (contextPtr: number, secretKeyPtr: number) => 0 | 1; /** * Create an ECDSA signature. The created signature is always in lower-S form. @@ -412,11 +412,11 @@ export interface Secp256k1Wasm { * @param msg32Ptr - pointer to the 32-byte message hash being signed * @param secretKeyPtr - pointer to a 32-byte secret key */ - readonly sign: ( + sign: ( contextPtr: number, outputSigPtr: number, msg32Ptr: number, - secretKeyPtr: number + secretKeyPtr: number, ) => 0 | 1; /** @@ -434,10 +434,10 @@ export interface Secp256k1Wasm { * signature will be written (internal format) * @param inputSigPtr - pointer to a signature to malleate */ - readonly signatureMalleate: ( + signatureMalleate: ( contextPtr: number, outputSigPtr: number, - inputSigPtr: number + inputSigPtr: number, ) => 1; /** @@ -483,10 +483,10 @@ export interface Secp256k1Wasm { * @param inputSigPtr - pointer to a signature to check/normalize (internal * format) */ - readonly signatureNormalize: ( + signatureNormalize: ( contextPtr: number, outputSigPtr: number, - inputSigPtr: number + inputSigPtr: number, ) => 0 | 1; /** @@ -506,10 +506,10 @@ export interface Secp256k1Wasm { * will be written. (internal format) * @param compactSigInPtr - pointer to a serialized signature in compact format */ - readonly signatureParseCompact: ( + signatureParseCompact: ( contextPtr: number, sigOutPtr: number, - compactSigInPtr: number + compactSigInPtr: number, ) => 0 | 1; /** @@ -532,11 +532,11 @@ export interface Secp256k1Wasm { * this should be a simple integer, rather than a `size_t` pointer as is * required by the serialization methods.) */ - readonly signatureParseDER: ( + signatureParseDER: ( contextPtr: number, sigOutPtr: number, sigDERInPtr: number, - sigDERInLength: number + sigDERInLength: number, ) => 0 | 1; /** @@ -550,10 +550,10 @@ export interface Secp256k1Wasm { * @param inputSigPtr - pointer to the 64-byte signature to be serialized * (internal format) */ - readonly signatureSerializeCompact: ( + signatureSerializeCompact: ( contextPtr: number, outputCompactSigPtr: number, - inputSigPtr: number + inputSigPtr: number, ) => 1; /** @@ -570,11 +570,11 @@ export interface Secp256k1Wasm { * @param inputSigPtr - pointer to the 64-byte signature to be serialized * (internal format) */ - readonly signatureSerializeDER: ( + signatureSerializeDER: ( contextPtr: number, outputDERSigPtr: number, outputDERSigLengthPtr: number, - inputSigPtr: number + inputSigPtr: number, ) => 0 | 1; /** @@ -595,11 +595,11 @@ export interface Secp256k1Wasm { * @param msg32Ptr - pointer to the 32-byte message hash being signed * @param secretKeyPtr - pointer to a 32-byte secret key */ - readonly signRecoverable: ( + signRecoverable: ( contextPtr: number, outputRSigPtr: number, msg32Ptr: number, - secretKeyPtr: number + secretKeyPtr: number, ) => 0 | 1; /** @@ -623,10 +623,10 @@ export interface Secp256k1Wasm { * @param pubkeyPtr - pointer to the parsed pubkey with which to verify * (internal format) */ - readonly verify: ( + verify: ( contextPtr: number, sigPtr: number, msg32Ptr: number, - pubkeyPtr: number + pubkeyPtr: number, ) => 0 | 1; -} +}; diff --git a/src/lib/bin/secp256k1/secp256k1-wasm.spec.ts b/src/lib/bin/secp256k1/secp256k1-wasm.spec.ts index 98276877..99203c44 100644 --- a/src/lib/bin/secp256k1/secp256k1-wasm.spec.ts +++ b/src/lib/bin/secp256k1/secp256k1-wasm.spec.ts @@ -57,7 +57,7 @@ const sigSchnorr = new Uint8Array([0xb5, 0x10, 0x41, 0x58, 0x7d, 0xa9, 0x46, 0xe const testSecp256k1Wasm = ( t: ExecutionContext, - secp256k1Wasm: Secp256k1Wasm + secp256k1Wasm: Secp256k1Wasm, ) => { t.truthy(secp256k1Wasm.heapU32); t.truthy(secp256k1Wasm.heapU8); @@ -66,7 +66,7 @@ const testSecp256k1Wasm = ( const contextPtr = secp256k1Wasm.contextCreate(ContextFlag.BOTH); { const seedPtr = secp256k1Wasm.mallocUint8Array( - new Uint8Array(randomBytes(32)) + new Uint8Array(randomBytes(32)), ); t.is(secp256k1Wasm.contextRandomize(contextPtr, seedPtr), 1); secp256k1Wasm.free(seedPtr); @@ -86,14 +86,14 @@ const testSecp256k1Wasm = ( uncompressedOutputPtr, uncompressedOutputLengthPtr, rawPubkeyPtr, - CompressionFlag.UNCOMPRESSED + CompressionFlag.UNCOMPRESSED, ); const uncompressedLength = secp256k1Wasm.readSizeT( - uncompressedOutputLengthPtr + uncompressedOutputLengthPtr, ); const uncompressedPublicKey = secp256k1Wasm.readHeapU8( uncompressedOutputPtr, - uncompressedLength + uncompressedLength, ); t.deepEqual(pubkeyUncompressed, uncompressedPublicKey); @@ -105,12 +105,12 @@ const testSecp256k1Wasm = ( compressedOutputPtr, compressedOutputLengthPtr, rawPubkeyPtr, - CompressionFlag.COMPRESSED + CompressionFlag.COMPRESSED, ); const compressedLength = secp256k1Wasm.readSizeT(compressedOutputLengthPtr); const compressedPublicKey = secp256k1Wasm.readHeapU8( compressedOutputPtr, - compressedLength + compressedLength, ); t.deepEqual(pubkeyCompressed, compressedPublicKey); @@ -121,9 +121,9 @@ const testSecp256k1Wasm = ( contextPtr, rawPubkey2Ptr, uncompressedOutputPtr, - 65 + 65, ), - 1 + 1, ); const compressedOutput2Ptr = secp256k1Wasm.malloc(33); const compressedOutput2LengthPtr = secp256k1Wasm.mallocSizeT(33); @@ -133,14 +133,14 @@ const testSecp256k1Wasm = ( compressedOutput2Ptr, compressedOutput2LengthPtr, rawPubkey2Ptr, - CompressionFlag.COMPRESSED + CompressionFlag.COMPRESSED, ), - 1 + 1, ); const convertedLength = secp256k1Wasm.readSizeT(compressedOutput2LengthPtr); const convertedPublicKey = secp256k1Wasm.readHeapU8( compressedOutput2Ptr, - convertedLength + convertedLength, ); t.deepEqual(convertedPublicKey, pubkeyCompressed); t.deepEqual(convertedPublicKey, compressedPublicKey); @@ -158,9 +158,9 @@ const testSecp256k1Wasm = ( contextPtr, sigDERPtr, sigDERLengthPtr, - rawSigPtr + rawSigPtr, ), - 1 + 1, ); const sigDERLength = secp256k1Wasm.readSizeT(sigDERLengthPtr); t.is(sigDERLength, 71); @@ -174,9 +174,9 @@ const testSecp256k1Wasm = ( contextPtr, rawSig2Ptr, sigDERPtr, - sigDERLength + sigDERLength, ), - 1 + 1, ); // serialize the signature in compact format @@ -184,7 +184,7 @@ const testSecp256k1Wasm = ( secp256k1Wasm.signatureSerializeCompact( contextPtr, compactSigPtr, - rawSig2Ptr + rawSig2Ptr, ); const compactSig = secp256k1Wasm.readHeapU8(compactSigPtr, 64); t.deepEqual(compactSig, sigCompact); @@ -193,13 +193,13 @@ const testSecp256k1Wasm = ( const rawSig3Ptr = secp256k1Wasm.malloc(64); t.is( secp256k1Wasm.signatureParseCompact(contextPtr, rawSig3Ptr, compactSigPtr), - 1 + 1, ); // verify the signature t.is( secp256k1Wasm.verify(contextPtr, rawSig3Ptr, sigHashPtr, rawPubkeyPtr), - 1 + 1, ); // malleate, verify and fail @@ -209,11 +209,11 @@ const testSecp256k1Wasm = ( secp256k1Wasm.signatureMalleate( contextPtr, malleatedTwicePtr, - malleatedSigPtr + malleatedSigPtr, ); t.is( secp256k1Wasm.verify(contextPtr, malleatedSigPtr, sigHashPtr, rawPubkeyPtr), - 0 + 0, ); const rawSig3 = secp256k1Wasm.readHeapU8(rawSig3Ptr, 64); const malleatedTwiceSig = secp256k1Wasm.readHeapU8(malleatedTwicePtr, 64); @@ -225,18 +225,18 @@ const testSecp256k1Wasm = ( secp256k1Wasm.signatureNormalize( contextPtr, normalizedSigPtr, - malleatedSigPtr + malleatedSigPtr, ), - 1 + 1, ); t.is( secp256k1Wasm.verify( contextPtr, normalizedSigPtr, sigHashPtr, - rawPubkeyPtr + rawPubkeyPtr, ), - 1 + 1, ); // recovery signature @@ -247,9 +247,9 @@ const testSecp256k1Wasm = ( contextPtr, rawRSigPtr, sigHashPtr, - privkeyPtr + privkeyPtr, ), - 1 + 1, ); // the r and s portions of the signature should match that of a non-recoverable signature @@ -260,7 +260,7 @@ const testSecp256k1Wasm = ( contextPtr, compactRSigPtr, rIDPtr, - rawRSigPtr + rawRSigPtr, ); const compactRSig = secp256k1Wasm.readHeapU8(compactRSigPtr, 64); // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion @@ -276,13 +276,13 @@ const testSecp256k1Wasm = ( contextPtr, rawRSig2Ptr, compactRSigPtr, - rID + rID, ), - 1 + 1, ); t.deepEqual( secp256k1Wasm.readHeapU8(rawRSigPtr, 65), - secp256k1Wasm.readHeapU8(rawRSig2Ptr, 65) + secp256k1Wasm.readHeapU8(rawRSig2Ptr, 65), ); // the recovered public key should match the derived public key @@ -295,9 +295,9 @@ const testSecp256k1Wasm = ( contextPtr, recoveredPublicKeyPtr, rawRSigPtr, - sigHashPtr + sigHashPtr, ), - 1 + 1, ); secp256k1Wasm.pubkeySerialize( @@ -305,11 +305,11 @@ const testSecp256k1Wasm = ( recoveredPublicKeyCompressedPtr, recoveredPublicKeyCompressedLengthPtr, recoveredPublicKeyPtr, - CompressionFlag.COMPRESSED + CompressionFlag.COMPRESSED, ); t.deepEqual( pubkeyCompressed, - secp256k1Wasm.readHeapU8(recoveredPublicKeyCompressedPtr, 33) + secp256k1Wasm.readHeapU8(recoveredPublicKeyCompressedPtr, 33), ); // skipping uncompressed checks since we already verified that parsing and serializing works. @@ -346,14 +346,14 @@ const testSecp256k1Wasm = ( secp256k1Wasm.heapU8.copyWithin( rawPubkeyTweakedAddPtr, rawPubkeyPtr, - rawPubkeyPtr + 64 + rawPubkeyPtr + 64, ); secp256k1Wasm.heapU8.set(privkey, privkeyTweakedMulPtr); secp256k1Wasm.heapU8.copyWithin( rawPubkeyTweakedMulPtr, rawPubkeyPtr, - rawPubkeyPtr + 64 + rawPubkeyPtr + 64, ); /* @@ -364,51 +364,51 @@ const testSecp256k1Wasm = ( secp256k1Wasm.privkeyTweakAdd( contextPtr, privkeyTweakedAddPtr, - keyTweakPtr + keyTweakPtr, ), - 1 + 1, ); t.deepEqual( secp256k1Wasm.readHeapU8(privkeyTweakedAddPtr, 32), - privkeyTweakedAdd + privkeyTweakedAdd, ); t.is( secp256k1Wasm.pubkeyCreate( contextPtr, rawPubkeyDerivedTweakedAddPtr, - privkeyTweakedAddPtr + privkeyTweakedAddPtr, ), - 1 + 1, ); secp256k1Wasm.pubkeySerialize( contextPtr, pubkeyDerivedTweakedAddCompressedPtr, pubkeyDerivedTweakedAddCompressedLengthPtr, rawPubkeyDerivedTweakedAddPtr, - CompressionFlag.COMPRESSED + CompressionFlag.COMPRESSED, ); t.deepEqual( secp256k1Wasm.readHeapU8(pubkeyDerivedTweakedAddCompressedPtr, 33), - pubkeyTweakedAddCompressed + pubkeyTweakedAddCompressed, ); t.is( secp256k1Wasm.pubkeyTweakAdd( contextPtr, rawPubkeyTweakedAddPtr, - keyTweakPtr + keyTweakPtr, ), - 1 + 1, ); secp256k1Wasm.pubkeySerialize( contextPtr, pubkeyTweakedAddCompressedPtr, pubkeyTweakedAddCompressedLengthPtr, rawPubkeyTweakedAddPtr, - CompressionFlag.COMPRESSED + CompressionFlag.COMPRESSED, ); t.deepEqual( secp256k1Wasm.readHeapU8(pubkeyTweakedAddCompressedPtr, 33), - pubkeyTweakedAddCompressed + pubkeyTweakedAddCompressed, ); // tweak mul @@ -416,51 +416,51 @@ const testSecp256k1Wasm = ( secp256k1Wasm.privkeyTweakMul( contextPtr, privkeyTweakedMulPtr, - keyTweakPtr + keyTweakPtr, ), - 1 + 1, ); t.deepEqual( secp256k1Wasm.readHeapU8(privkeyTweakedMulPtr, 32), - privkeyTweakedMul + privkeyTweakedMul, ); t.is( secp256k1Wasm.pubkeyCreate( contextPtr, rawPubkeyDerivedTweakedMulPtr, - privkeyTweakedMulPtr + privkeyTweakedMulPtr, ), - 1 + 1, ); secp256k1Wasm.pubkeySerialize( contextPtr, pubkeyDerivedTweakedMulCompressedPtr, pubkeyDerivedTweakedMulCompressedLengthPtr, rawPubkeyDerivedTweakedMulPtr, - CompressionFlag.COMPRESSED + CompressionFlag.COMPRESSED, ); t.deepEqual( secp256k1Wasm.readHeapU8(pubkeyDerivedTweakedMulCompressedPtr, 33), - pubkeyTweakedMulCompressed + pubkeyTweakedMulCompressed, ); t.is( secp256k1Wasm.pubkeyTweakMul( contextPtr, rawPubkeyTweakedMulPtr, - keyTweakPtr + keyTweakPtr, ), - 1 + 1, ); secp256k1Wasm.pubkeySerialize( contextPtr, pubkeyTweakedMulCompressedPtr, pubkeyTweakedMulCompressedLengthPtr, rawPubkeyTweakedMulPtr, - CompressionFlag.COMPRESSED + CompressionFlag.COMPRESSED, ); t.deepEqual( secp256k1Wasm.readHeapU8(pubkeyTweakedMulCompressedPtr, 33), - pubkeyTweakedMulCompressed + pubkeyTweakedMulCompressed, ); // create schnorr signature @@ -471,9 +471,9 @@ const testSecp256k1Wasm = ( contextPtr, schnorrSigPtr, schnorrMsgHashPtr, - privkeyPtr + privkeyPtr, ), - 1 + 1, ); t.deepEqual(secp256k1Wasm.readHeapU8(schnorrSigPtr, 64), sigSchnorr); @@ -483,9 +483,9 @@ const testSecp256k1Wasm = ( contextPtr, schnorrSigPtr, schnorrMsgHashPtr, - rawPubkeyPtr + rawPubkeyPtr, ), - 1 + 1, ); }; diff --git a/src/lib/bin/secp256k1/secp256k1-wasm.ts b/src/lib/bin/secp256k1/secp256k1-wasm.ts index afe2b20e..50890f22 100644 --- a/src/lib/bin/secp256k1/secp256k1-wasm.ts +++ b/src/lib/bin/secp256k1/secp256k1-wasm.ts @@ -1,4 +1,4 @@ -/* eslint-disable no-underscore-dangle, max-params, @typescript-eslint/naming-convention */ +/* eslint-disable no-underscore-dangle, @typescript-eslint/max-params, @typescript-eslint/naming-convention */ // cSpell:ignore memcpy, anyfunc import { base64ToBin } from '../../format/format.js'; @@ -13,7 +13,7 @@ export { ContextFlag, CompressionFlag }; const wrapSecp256k1Wasm = ( instance: WebAssembly.Instance, heapU8: Uint8Array, - heapU32: Uint32Array + heapU32: Uint32Array, ): Secp256k1Wasm => ({ contextCreate: (context) => (instance.exports as any)._secp256k1_context_create(context), @@ -30,13 +30,13 @@ const wrapSecp256k1Wasm = ( const pointer = (instance.exports as any)._malloc(4); // eslint-disable-next-line no-bitwise, @typescript-eslint/no-magic-numbers const pointerView32 = pointer >> 2; - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements heapU32.set([num], pointerView32); return pointer; }, mallocUint8Array: (array) => { const pointer = (instance.exports as any)._malloc(array.length) as number; - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements heapU8.set(array, pointer); return pointer; }, @@ -44,57 +44,57 @@ const wrapSecp256k1Wasm = ( (instance.exports as any)._secp256k1_ec_privkey_tweak_add( contextPtr, secretKeyPtr, - tweakNum256Ptr + tweakNum256Ptr, ), privkeyTweakMul: (contextPtr, secretKeyPtr, tweakNum256Ptr) => (instance.exports as any)._secp256k1_ec_privkey_tweak_mul( contextPtr, secretKeyPtr, - tweakNum256Ptr + tweakNum256Ptr, ), pubkeyCreate: (contextPtr, publicKeyPtr, secretKeyPtr) => (instance.exports as any)._secp256k1_ec_pubkey_create( contextPtr, publicKeyPtr, - secretKeyPtr + secretKeyPtr, ), pubkeyParse: ( contextPtr, publicKeyOutPtr, publicKeyInPtr, - publicKeyInLength + publicKeyInLength, ) => (instance.exports as any)._secp256k1_ec_pubkey_parse( contextPtr, publicKeyOutPtr, publicKeyInPtr, - publicKeyInLength + publicKeyInLength, ), pubkeySerialize: ( contextPtr, outputPtr, outputLengthPtr, publicKeyPtr, - compression + compression, ) => (instance.exports as any)._secp256k1_ec_pubkey_serialize( contextPtr, outputPtr, outputLengthPtr, publicKeyPtr, - compression + compression, ), pubkeyTweakAdd: (contextPtr, publicKeyPtr, tweakNum256Ptr) => (instance.exports as any)._secp256k1_ec_pubkey_tweak_add( contextPtr, publicKeyPtr, - tweakNum256Ptr + tweakNum256Ptr, ), pubkeyTweakMul: (contextPtr, publicKeyPtr, tweakNum256Ptr) => (instance.exports as any)._secp256k1_ec_pubkey_tweak_mul( contextPtr, publicKeyPtr, - tweakNum256Ptr + tweakNum256Ptr, ), readHeapU8: (pointer, bytes) => new Uint8Array(heapU8.buffer, pointer, bytes), readSizeT: (pointer) => { @@ -108,7 +108,7 @@ const wrapSecp256k1Wasm = ( contextPtr, outputPubkeyPointer, rSigPtr, - msg32Ptr + msg32Ptr, ), recoverableSignatureParse: (contextPtr, outputRSigPtr, inputSigPtr, rid) => ( @@ -117,13 +117,13 @@ const wrapSecp256k1Wasm = ( contextPtr, outputRSigPtr, inputSigPtr, - rid + rid, ), recoverableSignatureSerialize: ( contextPtr, sigOutPtr, recIDOutPtr, - rSigPtr + rSigPtr, ) => ( instance.exports as any @@ -131,95 +131,95 @@ const wrapSecp256k1Wasm = ( contextPtr, sigOutPtr, recIDOutPtr, - rSigPtr + rSigPtr, ), schnorrSign: (contextPtr, outputSigPtr, msg32Ptr, secretKeyPtr) => (instance.exports as any)._secp256k1_schnorr_sign( contextPtr, outputSigPtr, msg32Ptr, - secretKeyPtr + secretKeyPtr, ), schnorrVerify: (contextPtr, sigPtr, msg32Ptr, publicKeyPtr) => (instance.exports as any)._secp256k1_schnorr_verify( contextPtr, sigPtr, msg32Ptr, - publicKeyPtr + publicKeyPtr, ), seckeyVerify: (contextPtr, secretKeyPtr) => (instance.exports as any)._secp256k1_ec_seckey_verify( contextPtr, - secretKeyPtr + secretKeyPtr, ), sign: (contextPtr, outputSigPtr, msg32Ptr, secretKeyPtr) => (instance.exports as any)._secp256k1_ecdsa_sign( contextPtr, outputSigPtr, msg32Ptr, - secretKeyPtr + secretKeyPtr, ), signRecoverable: (contextPtr, outputRSigPtr, msg32Ptr, secretKeyPtr) => (instance.exports as any)._secp256k1_ecdsa_sign_recoverable( contextPtr, outputRSigPtr, msg32Ptr, - secretKeyPtr + secretKeyPtr, ), signatureMalleate: (contextPtr, outputSigPtr, inputSigPtr) => (instance.exports as any)._secp256k1_ecdsa_signature_malleate( contextPtr, outputSigPtr, - inputSigPtr + inputSigPtr, ), signatureNormalize: (contextPtr, outputSigPtr, inputSigPtr) => (instance.exports as any)._secp256k1_ecdsa_signature_normalize( contextPtr, outputSigPtr, - inputSigPtr + inputSigPtr, ), signatureParseCompact: (contextPtr, sigOutPtr, compactSigInPtr) => (instance.exports as any)._secp256k1_ecdsa_signature_parse_compact( contextPtr, sigOutPtr, - compactSigInPtr + compactSigInPtr, ), signatureParseDER: (contextPtr, sigOutPtr, sigDERInPtr, sigDERInLength) => (instance.exports as any)._secp256k1_ecdsa_signature_parse_der( contextPtr, sigOutPtr, sigDERInPtr, - sigDERInLength + sigDERInLength, ), signatureSerializeCompact: (contextPtr, outputCompactSigPtr, inputSigPtr) => (instance.exports as any)._secp256k1_ecdsa_signature_serialize_compact( contextPtr, outputCompactSigPtr, - inputSigPtr + inputSigPtr, ), signatureSerializeDER: ( contextPtr, outputDERSigPtr, outputDERSigLengthPtr, - inputSigPtr + inputSigPtr, ) => (instance.exports as any)._secp256k1_ecdsa_signature_serialize_der( contextPtr, outputDERSigPtr, outputDERSigLengthPtr, - inputSigPtr + inputSigPtr, ), verify: (contextPtr, sigPtr, msg32Ptr, pubkeyPtr) => (instance.exports as any)._secp256k1_ecdsa_verify( contextPtr, sigPtr, msg32Ptr, - pubkeyPtr + pubkeyPtr, ), }); /* eslint-enable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-assignment */ -/* eslint-disable functional/immutable-data, functional/no-expression-statement, @typescript-eslint/no-magic-numbers, functional/no-conditional-statement, no-bitwise, functional/no-throw-statement */ +/* eslint-disable functional/immutable-data, functional/no-expression-statements, @typescript-eslint/no-magic-numbers, functional/no-conditional-statements, no-bitwise, functional/no-throw-statements */ /** * Method extracted from Emscripten's preamble.js */ @@ -253,7 +253,7 @@ const alignMemory = (factor: number, size: number) => * @param webassemblyBytes - A buffer containing the secp256k1 binary. */ export const instantiateSecp256k1WasmBytes = async ( - webassemblyBytes: ArrayBuffer + webassemblyBytes: ArrayBuffer, ): Promise => { const STACK_ALIGN = 16; const GLOBAL_BASE = 1024; @@ -321,7 +321,7 @@ export const instantiateSecp256k1WasmBytes = async ( _emscripten_memcpy_big: /* istanbul ignore next */ ( dest: number, src: number, - num: number + num: number, ) => { heapU8.set(heapU8.subarray(src, src + num), dest); return dest; @@ -359,7 +359,7 @@ export const instantiateSecp256k1WasmBytes = async ( return wrapSecp256k1Wasm(result.instance, heapU8, heapU32); }); }; -/* eslint-enable functional/immutable-data, functional/no-expression-statement, @typescript-eslint/no-magic-numbers, functional/no-conditional-statement, no-bitwise, functional/no-throw-statement */ +/* eslint-enable functional/immutable-data, functional/no-expression-statements, @typescript-eslint/no-magic-numbers, functional/no-conditional-statements, no-bitwise, functional/no-throw-statements */ export const getEmbeddedSecp256k1Binary = () => base64ToBin(secp256k1Base64Bytes).buffer; diff --git a/src/lib/compiler/compiler-bch/compiler-bch-operations.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch-operations.spec.ts index decb6b03..a5ccfc4f 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch-operations.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch-operations.spec.ts @@ -13,13 +13,13 @@ test('compilerOperationSigningSerializationFullBCH: requires an algorithm', (t) sha256: { hash: () => Uint8Array.of() }, sourceScriptIds: ['test'], unlockingScripts: { test: 'lock' }, - } + }, ), { error: 'Invalid signing serialization operation. Include the desired component or algorithm, e.g. "signing_serialization.version".', status: 'error', - } + }, ); }); test('compilerOperationSigningSerializationFullBCH: error on unknown algorithms', (t) => { @@ -32,12 +32,12 @@ test('compilerOperationSigningSerializationFullBCH: error on unknown algorithms' sha256: { hash: () => Uint8Array.of() }, sourceScriptIds: ['test'], unlockingScripts: { test: 'lock' }, - } + }, ), { error: 'Unknown signing serialization algorithm, "full_unknown_serialization".', status: 'error', - } + }, ); }); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.built-in-variables.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.built-in-variables.spec.ts index 96f8d502..b94ca66a 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.built-in-variables.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.built-in-variables.spec.ts @@ -43,7 +43,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -52,10 +52,10 @@ test( '', { currentBlockTime: dateToLocktime( - new Date('2019-10-13T00:00:00.000Z') + new Date('2019-10-13T00:00:00.000Z'), ) as number, }, - { bytecode: hexToBin('040069a25d'), success: true } + { bytecode: hexToBin('040069a25d'), success: true }, ); test( @@ -78,7 +78,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -86,7 +86,7 @@ test( expectCompilationResult, '', { currentBlockHeight: 1 }, - { bytecode: hexToBin('51'), success: true } + { bytecode: hexToBin('51'), success: true }, ); test( @@ -115,7 +115,7 @@ test( success: false, } as BytecodeGenerationResult, {}, - { unlockingScriptTimeLockTypes: { test: 'height' } } + { unlockingScriptTimeLockTypes: { test: 'height' } }, ); test( @@ -144,7 +144,7 @@ test( success: false, } as BytecodeGenerationResult, {}, - { unlockingScriptTimeLockTypes: { test: 'timestamp' } } + { unlockingScriptTimeLockTypes: { test: 'timestamp' } }, ); test( @@ -182,7 +182,7 @@ test( success: false, } as BytecodeGenerationResult, {}, - { unlockingScriptTimeLockTypes: { test: 'height' } } + { unlockingScriptTimeLockTypes: { test: 'height' } }, ); test( @@ -205,7 +205,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -228,7 +228,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); /** @@ -244,10 +244,10 @@ test( { currentBlockHeight: 1, currentBlockTime: dateToLocktime( - new Date('2019-10-13T00:00:00.000Z') + new Date('2019-10-13T00:00:00.000Z'), ) as number, }, - { bytecode: hexToBin('51040069a25d'), success: true } + { bytecode: hexToBin('51040069a25d'), success: true }, ); test( @@ -280,7 +280,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -303,7 +303,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test.failing( @@ -313,10 +313,10 @@ test.failing( {}, { bytecode: hexToBin( - '4c9d000000001cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba214e63bf41490e67d34476778f6707aa6c8d2c8dccdf78ae11e40ee9f91e89a705050505050505050505050505050505050505050505050505050505050505050000000000000000000000000000000000c942a06c127c2c18022677e888020afb174208d299354f3ecfedb124a1f3fa450000000041000000' + '4c9d000000001cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba214e63bf41490e67d34476778f6707aa6c8d2c8dccdf78ae11e40ee9f91e89a705050505050505050505050505050505050505050505050505050505050505050000000000000000000000000000000000c942a06c127c2c18022677e888020afb174208d299354f3ecfedb124a1f3fa450000000041000000', ), success: true, - } + }, ); test.failing( @@ -326,10 +326,10 @@ test.failing( {}, { bytecode: hexToBin( - '4c9d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005050505050505050505050505050505050505050505050505050505050505050000000000000000000000000000000000c942a06c127c2c18022677e888020afb174208d299354f3ecfedb124a1f3fa4500000000c1000000' + '4c9d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005050505050505050505050505050505050505050505050505050505050505050000000000000000000000000000000000c942a06c127c2c18022677e888020afb174208d299354f3ecfedb124a1f3fa4500000000c1000000', ), success: true, - } + }, ); test.failing( @@ -339,10 +339,10 @@ test.failing( {}, { bytecode: hexToBin( - '4c9d000000001cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba0000000000000000000000000000000000000000000000000000000000000000050505050505050505050505050505050505050505050505050505050505050500000000000000000000000000000000009c12cfdc04c74584d787ac3d23772132c18524bc7ab28dec4219b8fc5b425f700000000043000000' + '4c9d000000001cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba0000000000000000000000000000000000000000000000000000000000000000050505050505050505050505050505050505050505050505050505050505050500000000000000000000000000000000009c12cfdc04c74584d787ac3d23772132c18524bc7ab28dec4219b8fc5b425f700000000043000000', ), success: true, - } + }, ); test.failing( @@ -352,10 +352,10 @@ test.failing( {}, { bytecode: hexToBin( - '4c9d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050505050505050505050505050505050505050505050505050505050505050500000000000000000000000000000000009c12cfdc04c74584d787ac3d23772132c18524bc7ab28dec4219b8fc5b425f7000000000c3000000' + '4c9d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000050505050505050505050505050505050505050505050505050505050505050500000000000000000000000000000000009c12cfdc04c74584d787ac3d23772132c18524bc7ab28dec4219b8fc5b425f7000000000c3000000', ), success: true, - } + }, ); test.failing( @@ -365,10 +365,10 @@ test.failing( {}, { bytecode: hexToBin( - '4c9d000000001cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba00000000000000000000000000000000000000000000000000000000000000000505050505050505050505050505050505050505050505050505050505050505000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042000000' + '4c9d000000001cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba00000000000000000000000000000000000000000000000000000000000000000505050505050505050505050505050505050505050505050505050505050505000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000042000000', ), success: true, - } + }, ); test.failing( @@ -378,10 +378,10 @@ test.failing( {}, { bytecode: hexToBin( - '4c9d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005050505050505050505050505050505050505050505050505050505050505050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2000000' + '4c9d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005050505050505050505050505050505050505050505050505050505050505050000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c2000000', ), success: true, - } + }, ); test.failing( @@ -392,7 +392,7 @@ test.failing( { bytecode: hexToBin('51'), success: true, - } + }, ); test.failing( @@ -402,10 +402,10 @@ test.failing( {}, { bytecode: hexToBin( - '209c12cfdc04c74584d787ac3d23772132c18524bc7ab28dec4219b8fc5b425f70' + '209c12cfdc04c74584d787ac3d23772132c18524bc7ab28dec4219b8fc5b425f70', ), success: true, - } + }, ); test( @@ -416,7 +416,7 @@ test( { bytecode: hexToBin('0100'), success: true, - } + }, ); test( @@ -427,7 +427,7 @@ test( { bytecode: hexToBin('00'), success: true, - } + }, ); test( @@ -438,7 +438,7 @@ test( { bytecode: hexToBin('0400000000'), success: true, - } + }, ); test( @@ -449,7 +449,7 @@ test( { bytecode: hexToBin('0400000000'), success: true, - } + }, ); test.failing( @@ -459,10 +459,10 @@ test.failing( {}, { bytecode: hexToBin( - '200505050505050505050505050505050505050505050505050505050505050505' + '200505050505050505050505050505050505050505050505050505050505050505', ), success: true, - } + }, ); test.failing( @@ -473,7 +473,7 @@ test.failing( { bytecode: hexToBin('080000000000000000'), success: true, - } + }, ); test( @@ -484,7 +484,7 @@ test( { bytecode: hexToBin('0400000000'), success: true, - } + }, ); test.failing( @@ -495,7 +495,7 @@ test.failing( { bytecode: hexToBin('52'), success: true, - } + }, ); test.failing( @@ -505,10 +505,10 @@ test.failing( {}, { bytecode: hexToBin( - '201cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba' + '201cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba', ), success: true, - } + }, ); test.failing( @@ -519,7 +519,7 @@ test.failing( { bytecode: hexToBin('53'), success: true, - } + }, ); test.failing( @@ -529,10 +529,10 @@ test.failing( {}, { bytecode: hexToBin( - '20c942a06c127c2c18022677e888020afb174208d299354f3ecfedb124a1f3fa45' + '20c942a06c127c2c18022677e888020afb174208d299354f3ecfedb124a1f3fa45', ), success: true, - } + }, ); test.failing( @@ -543,7 +543,7 @@ test.failing( { bytecode: hexToBin('54'), success: true, - } + }, ); test.failing( @@ -553,10 +553,10 @@ test.failing( {}, { bytecode: hexToBin( - '20214e63bf41490e67d34476778f6707aa6c8d2c8dccdf78ae11e40ee9f91e89a7' + '20214e63bf41490e67d34476778f6707aa6c8d2c8dccdf78ae11e40ee9f91e89a7', ), success: true, - } + }, ); test( @@ -567,7 +567,7 @@ test( { bytecode: hexToBin('0400000000'), success: true, - } + }, ); test( @@ -594,7 +594,7 @@ test( {}, { unlockingScripts: {}, - } + }, ); test( @@ -623,7 +623,7 @@ test( unlockingScripts: { test: 'some_unknown_script', }, - } + }, ); test( @@ -653,7 +653,7 @@ test( lock: 'invalid', test: '', }, - } + }, ); test( @@ -676,7 +676,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -699,7 +699,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test.failing( @@ -742,7 +742,7 @@ test.failing( { bytecode: hexToBin('510052'), success: true, - } + }, ); t.deepEqual( @@ -753,7 +753,7 @@ test.failing( { bytecode: hexToBin('510052'), success: true, - } + }, ); - } + }, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.data-signatures.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.data-signatures.spec.ts index f51914a5..a86eac41 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.data-signatures.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.data-signatures.spec.ts @@ -19,11 +19,11 @@ test( { keys: { privateKeys: { owner: privkey } } }, { bytecode: hexToBin( - '463044022100de1a02c286421ca34e854b9a01449ff8f19c46dfa4397de563d5f694db9d3855021f55b7bf7cd14189f6e1dca08d9a7cdf9b5c38a5bddbd0168aa33d34666950a003abcdef' + '463044022100de1a02c286421ca34e854b9a01449ff8f19c46dfa4397de563d5f694db9d3855021f55b7bf7cd14189f6e1dca08d9a7cdf9b5c38a5bddbd0168aa33d34666950a003abcdef', ), success: true, }, - { owner: { type: 'Key' } } + { owner: { type: 'Key' } }, ); test( @@ -33,17 +33,17 @@ test( { bytecode: { 'owner.data_signature.another': hexToBin( - '3044022100de1a02c286421ca34e854b9a01449ff8f19c46dfa4397de563d5f694db9d3855021f55b7bf7cd14189f6e1dca08d9a7cdf9b5c38a5bddbd0168aa33d34666950a0' + '3044022100de1a02c286421ca34e854b9a01449ff8f19c46dfa4397de563d5f694db9d3855021f55b7bf7cd14189f6e1dca08d9a7cdf9b5c38a5bddbd0168aa33d34666950a0', ), }, }, { bytecode: hexToBin( - '463044022100de1a02c286421ca34e854b9a01449ff8f19c46dfa4397de563d5f694db9d3855021f55b7bf7cd14189f6e1dca08d9a7cdf9b5c38a5bddbd0168aa33d34666950a003abcdef' + '463044022100de1a02c286421ca34e854b9a01449ff8f19c46dfa4397de563d5f694db9d3855021f55b7bf7cd14189f6e1dca08d9a7cdf9b5c38a5bddbd0168aa33d34666950a003abcdef', ), success: true, }, - { owner: { type: 'Key' } } + { owner: { type: 'Key' } }, ); test( @@ -67,7 +67,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'Key' } } + { owner: { type: 'Key' } }, ); test( @@ -91,7 +91,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'Key' } } + { owner: { type: 'Key' } }, ); test( @@ -115,7 +115,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'Key' } } + { owner: { type: 'Key' } }, ); test( @@ -141,7 +141,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'Key' } } + { owner: { type: 'Key' } }, ); test( @@ -166,7 +166,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'Key' } }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -191,7 +191,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'Key' } }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -216,7 +216,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'Key' } }, - { sha256: undefined } + { sha256: undefined }, ); test( @@ -240,7 +240,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'Key' } } + { owner: { type: 'Key' } }, ); test( @@ -252,11 +252,11 @@ test( }, { bytecode: hexToBin( - '463044022100de1a02c286421ca34e854b9a01449ff8f19c46dfa4397de563d5f694db9d3855021f55b7bf7cd14189f6e1dca08d9a7cdf9b5c38a5bddbd0168aa33d34666950a003abcdef' + '463044022100de1a02c286421ca34e854b9a01449ff8f19c46dfa4397de563d5f694db9d3855021f55b7bf7cd14189f6e1dca08d9a7cdf9b5c38a5bddbd0168aa33d34666950a003abcdef', ), success: true, }, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -280,5 +280,5 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.evaluations.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.evaluations.spec.ts index 7a3e011c..64c23115 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.evaluations.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.evaluations.spec.ts @@ -15,7 +15,7 @@ test( { bytecode: Uint8Array.of(0x03), success: true, - } + }, ); test.only( @@ -26,7 +26,7 @@ test.only( { bytecode: Uint8Array.from([0xaa, 0xbb, 0xcc]), success: true, - } + }, ); test( @@ -37,7 +37,7 @@ test( { bytecode: Uint8Array.of(), success: true, - } + }, ); test( @@ -60,7 +60,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -85,7 +85,7 @@ test( success: false, } as BytecodeGenerationResult, {}, - { vm: undefined } + { vm: undefined }, ); test( @@ -110,7 +110,7 @@ test( success: false, } as BytecodeGenerationResult, {}, - { createAuthenticationProgram: undefined } + { createAuthenticationProgram: undefined }, ); test( @@ -133,7 +133,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -156,7 +156,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -179,7 +179,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -202,7 +202,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -225,7 +225,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -248,7 +248,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -259,7 +259,7 @@ test( { bytecode: Uint8Array.of(), success: true, - } + }, ); test( @@ -270,7 +270,7 @@ test( { bytecode: Uint8Array.of(0x03), success: true, - } + }, ); test( @@ -293,7 +293,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -316,7 +316,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -349,7 +349,7 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); test( @@ -372,5 +372,5 @@ test( }, ], success: false, - } as BytecodeGenerationResult + } as BytecodeGenerationResult, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.hd-key.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.hd-key.spec.ts index ace63614..1b5b77b6 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.hd-key.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.hd-key.spec.ts @@ -16,13 +16,13 @@ import { * `m/0` public key push */ const m0PublicPush = hexToBin( - '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); /** * `m/0/0` public key push */ const m00PublicPush = hexToBin( - '2102df61d0e0ca2d1f02670cd94941d1f3299e10a01f0cc008b695e73006e4b28bfc' + '2102df61d0e0ca2d1f02670cd94941d1f3299e10a01f0cc008b695e73006e4b28bfc', ); /** * `m/0'` HD public key @@ -34,14 +34,14 @@ const m0HardenedHdPublicKeyTestnet = * `m/0'/1` public key push */ const m0H1PublicPush = hexToBin( - '21034f4d20bf3a18f6deb0109c20e0ab7328b22ff0d5a29ce85595344012ebca41e6' + '21034f4d20bf3a18f6deb0109c20e0ab7328b22ff0d5a29ce85595344012ebca41e6', ); /** * `m/1` public key push */ const m1PublicPush = hexToBin( - '21034002efc4f44014b116a986faa63b741b0b894a45ccf3f30c671e4146fb1c1954' + '21034002efc4f44014b116a986faa63b741b0b894a45ccf3f30c671e4146fb1c1954', ); test.failing( @@ -53,11 +53,11 @@ test.failing( }, { bytecode: hexToBin( - '473044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241' + '473044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241', ), success: true, }, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test.failing( @@ -69,11 +69,11 @@ test.failing( }, { bytecode: hexToBin( - '41313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41' + '41313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41', ), success: true, }, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -97,7 +97,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -108,7 +108,7 @@ test( hdKeys: { addressIndex: 0, hdPrivateKeys: { ownerEntityId: hdPrivateKey } }, }, { bytecode: m0PublicPush, success: true }, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -119,7 +119,7 @@ test( hdKeys: { addressIndex: 0, hdPublicKeys: { ownerEntityId: hdPublicKey } }, }, { bytecode: m0PublicPush, success: true }, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -129,7 +129,7 @@ test( { hdKeys: { addressIndex: 0, hdPublicKeys: { ownerEntityId: hdPublicKey } } }, { bytecode: m1PublicPush, success: true }, { owner: { type: 'HdKey' } }, - { variables: { owner: { addressOffset: 1, type: 'HdKey' } } } + { variables: { owner: { addressOffset: 1, type: 'HdKey' } } }, ); test( @@ -155,7 +155,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'HdKey' }, - } + }, ); test( @@ -180,7 +180,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'HdKey' } }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -190,13 +190,13 @@ test( { bytecode: { 'owner.public_key': hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), }, }, { bytecode: m0PublicPush, success: true }, { owner: { type: 'HdKey' } }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -206,18 +206,18 @@ test( { bytecode: { 'owner.signature.all_outputs': hexToBin( - '3044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241' + '3044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241', ), }, }, { bytecode: hexToBin( - '473044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241' + '473044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241', ), success: true, }, { owner: { type: 'HdKey' } }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -227,18 +227,18 @@ test( { bytecode: { 'owner.schnorr_signature.all_outputs': hexToBin( - '313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41' + '313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41', ), }, }, { bytecode: hexToBin( - '41313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41' + '41313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41', ), success: true, }, { owner: { type: 'HdKey' } }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -264,7 +264,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -290,7 +290,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -316,7 +316,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -342,7 +342,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -367,7 +367,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -392,7 +392,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -419,7 +419,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'HdKey' } }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -446,7 +446,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'HdKey' } }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -473,7 +473,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'HdKey' } }, - { sha256: undefined } + { sha256: undefined }, ); test( @@ -500,7 +500,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'HdKey' } }, - { sha256: undefined } + { sha256: undefined }, ); test( @@ -512,7 +512,7 @@ test( }, { bytecode: m0PublicPush, success: true }, { owner: { type: 'HdKey' } }, - { variables: { owner: { addressOffset: -1, type: 'HdKey' } } } + { variables: { owner: { addressOffset: -1, type: 'HdKey' } } }, ); test( @@ -523,7 +523,7 @@ test( hdKeys: { addressIndex: 1, hdPrivateKeys: { ownerEntityId: hdPrivateKey } }, }, { bytecode: m1PublicPush, success: true }, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -535,7 +535,7 @@ test( }, { bytecode: m1PublicPush, success: true }, { owner: { type: 'HdKey' } }, - { variables: { owner: { addressOffset: 1, type: 'HdKey' } } } + { variables: { owner: { addressOffset: 1, type: 'HdKey' } } }, ); test( @@ -547,7 +547,7 @@ test( }, { bytecode: m1PublicPush, success: true }, { owner: { type: 'HdKey' } }, - { variables: { owner: { addressOffset: -1, type: 'HdKey' } } } + { variables: { owner: { addressOffset: -1, type: 'HdKey' } } }, ); test( @@ -576,7 +576,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -605,7 +605,7 @@ test( { owner: { type: 'HdKey' }, }, - { variables: { owner: { addressOffset: -1, type: 'HdKey' } } } + { variables: { owner: { addressOffset: -1, type: 'HdKey' } } }, ); test( @@ -639,7 +639,7 @@ test( lock: 'invalid', test: '', }, - } + }, ); test( @@ -670,7 +670,7 @@ test( }, { entityOwnership: undefined, - } + }, ); test( @@ -697,7 +697,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'HdKey' } }, - { entityOwnership: {} } + { entityOwnership: {} }, ); test( @@ -724,7 +724,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'HdKey' } }, - { entityOwnership: undefined } + { entityOwnership: undefined }, ); test( @@ -751,7 +751,7 @@ test( success: false, } as BytecodeGenerationResult, { owner: { type: 'HdKey' } }, - { entityOwnership: {} } + { entityOwnership: {} }, ); test( @@ -777,7 +777,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -806,7 +806,7 @@ test( ], success: false, } as BytecodeGenerationResult, - { owner: { type: 'HdKey' } } + { owner: { type: 'HdKey' } }, ); test( @@ -828,7 +828,7 @@ test( type: 'HdKey', }, }, - } + }, ); test( @@ -865,7 +865,7 @@ test( type: 'HdKey', }, }, - } + }, ); test( @@ -902,7 +902,7 @@ test( type: 'HdKey', }, }, - } + }, ); test( @@ -939,7 +939,7 @@ test( type: 'HdKey', }, }, - } + }, ); test( @@ -961,7 +961,7 @@ test( type: 'HdKey', }, }, - } + }, ); test( @@ -984,5 +984,5 @@ test( type: 'HdKey', }, }, - } + }, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.key.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.key.spec.ts index ca6e4187..075d2b0c 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.key.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.key.spec.ts @@ -18,13 +18,13 @@ test.failing( { keys: { privateKeys: { owner: privkey } } }, { bytecode: hexToBin( - '473044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241' + '473044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241', ), success: true, }, { owner: { type: 'Key' }, - } + }, ); test.failing( @@ -34,13 +34,13 @@ test.failing( { keys: { privateKeys: { owner: privkey } } }, { bytecode: hexToBin( - '41313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41' + '41313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41', ), success: true, }, { owner: { type: 'Key' }, - } + }, ); test( @@ -50,13 +50,13 @@ test( { keys: { privateKeys: { owner: privkey } } }, { bytecode: hexToBin( - '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), success: true, }, { owner: { type: 'Key' }, - } + }, ); test( @@ -83,7 +83,7 @@ test( { owner: { type: 'Key' }, }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -93,20 +93,20 @@ test( { bytecode: { 'owner.public_key': hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), }, }, { bytecode: hexToBin( - '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), success: true, }, { owner: { type: 'Key' }, }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -139,7 +139,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'Key' }, - } + }, ); test( @@ -149,21 +149,21 @@ test( { bytecode: { 'owner.signature.all_outputs': hexToBin( - '3044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241' + '3044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241', ), }, keys: {}, }, { bytecode: hexToBin( - '473044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241' + '473044022059e9ad8fabd511fa2ef6935dae6395d5d3ce93b929436c835c9c8372b353bd3d0220527c17e2e4ec12f7b8969a9bb80e58ab1a24e44c2e5512916d1bcb3fc4dc2f2241', ), success: true, }, { owner: { type: 'Key' }, }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -173,19 +173,19 @@ test( { bytecode: { 'owner.schnorr_signature.all_outputs': hexToBin( - '313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41' + '313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41', ), }, }, { bytecode: hexToBin( - '41313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41' + '41313d8a853bd82f5fe251d6b04581333800001ee7680c5e4775db3afabf4873360b3481802d8d656cc608e4625d6568bf1a8801bb1efff19a8306267681177aed41', ), success: true, }, { owner: { type: 'Key' }, - } + }, ); test( @@ -211,7 +211,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'Key' }, - } + }, ); test( @@ -239,7 +239,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'Key' }, - } + }, ); test( @@ -267,7 +267,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'Key' }, - } + }, ); test( @@ -295,7 +295,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'Key' }, - } + }, ); test( @@ -320,7 +320,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'Key' }, - } + }, ); test( @@ -345,7 +345,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'Key' }, - } + }, ); test( @@ -371,7 +371,7 @@ test( } as BytecodeGenerationResult, { owner: { type: 'Key' }, - } + }, ); test( @@ -398,7 +398,7 @@ test( { owner: { type: 'Key' }, }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -425,7 +425,7 @@ test( { owner: { type: 'Key' }, }, - { secp256k1: undefined } + { secp256k1: undefined }, ); test( @@ -452,7 +452,7 @@ test( { owner: { type: 'Key' }, }, - { sha256: undefined } + { sha256: undefined }, ); test( @@ -479,7 +479,7 @@ test( { owner: { type: 'Key' }, }, - { sha256: undefined } + { sha256: undefined }, ); test( @@ -511,5 +511,5 @@ test( lock: 'invalid', test: '', }, - } + }, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.langauge.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.langauge.spec.ts index e3c1be47..41706f0a 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.langauge.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.langauge.spec.ts @@ -13,7 +13,7 @@ test( expectCompilationResult, '', {}, - { bytecode: hexToBin(''), success: true } + { bytecode: hexToBin(''), success: true }, ); test( @@ -21,7 +21,7 @@ test( expectCompilationResult, '42 -42 2_147_483_647 -2_147_483_647', {}, - { bytecode: hexToBin('2aaaffffff7fffffffff'), success: true } + { bytecode: hexToBin('2aaaffffff7fffffffff'), success: true }, ); test( @@ -29,7 +29,7 @@ test( expectCompilationResult, '0b1 0b1111_1111 0b111 0b1111_1111__1111_1111__1111_1111__1111_1111____1111_1111__1111_1111__1111_1111__1111_1111_1', {}, - { bytecode: hexToBin('01ff07ffffffffffffffff01'), success: true } + { bytecode: hexToBin('01ff07ffffffffffffffff01'), success: true }, ); test( @@ -37,7 +37,7 @@ test( expectCompilationResult, "'abc\"`πŸ‘'", {}, - { bytecode: hexToBin('6162632260f09f918d'), success: true } + { bytecode: hexToBin('6162632260f09f918d'), success: true }, ); test( @@ -45,7 +45,7 @@ test( expectCompilationResult, '"abc\'`πŸ‘"', {}, - { bytecode: hexToBin('6162632760f09f918d'), success: true } + { bytecode: hexToBin('6162632760f09f918d'), success: true }, ); test( @@ -53,7 +53,7 @@ test( expectCompilationResult, '0xdead__beef', {}, - { bytecode: hexToBin('deadbeef'), success: true } + { bytecode: hexToBin('deadbeef'), success: true }, ); test( @@ -61,7 +61,7 @@ test( expectCompilationResult, 'OP_0 OP_1 OP_ADD', {}, - { bytecode: hexToBin('005193'), success: true } + { bytecode: hexToBin('005193'), success: true }, ); test( @@ -78,7 +78,7 @@ test( 0xef `, {}, - { bytecode: hexToBin('abcdef'), success: true } + { bytecode: hexToBin('abcdef'), success: true }, ); test( @@ -86,7 +86,7 @@ test( expectCompilationResult, '<>', {}, - { bytecode: hexToBin('00'), success: true } + { bytecode: hexToBin('00'), success: true }, ); test( @@ -97,7 +97,7 @@ test( { bytecode: hexToBin('4f005152535455565758595a5b5c5d5e5f600111'), success: true, - } + }, ); test( @@ -108,7 +108,7 @@ test( { bytecode: hexToBin('4f005152535455565758595a5b5c5d5e5f600111'), success: true, - } + }, ); test( @@ -119,7 +119,7 @@ test( { bytecode: hexToBin('0100'), success: true, - } + }, ); test( @@ -130,7 +130,7 @@ test( { bytecode: hexToBin('03616263'), success: true, - } + }, ); test( @@ -141,7 +141,7 @@ test( { bytecode: hexToBin('010001510152'), success: true, - } + }, ); test( @@ -152,7 +152,7 @@ test( { bytecode: hexToBin('03020151'), success: true, - } + }, ); test( @@ -172,7 +172,7 @@ test( { bytecode: hexToBin('00000000000061626327f09fa79927'), success: true, - } + }, ); test( @@ -192,7 +192,7 @@ test( c: '0x123456', test: 'a', }, - } + }, ); test( @@ -224,5 +224,5 @@ test( c: ' \n a', test: '\na', }, - } + }, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.p2sh.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.p2sh.spec.ts index 693eb404..0d05d68a 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.p2sh.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.p2sh.spec.ts @@ -29,7 +29,7 @@ test( unlockingScripts: { test: 'lock', }, - } + }, ); test( @@ -53,7 +53,7 @@ test( unlockingScripts: { test: 'lock', }, - } + }, ); test( @@ -77,7 +77,7 @@ test( unlockingScripts: { unlock: 'test', }, - } + }, ); test( @@ -101,7 +101,7 @@ test( unlockingScripts: { unlock: 'test', }, - } + }, ); test( @@ -111,7 +111,7 @@ test( {}, { bytecode: hexToBin( - 'aa20cc2cfe8f87c6f8dc5a518c06c7c939a2f91d0294a59cd8d0b97a3d68700b95b287' + 'aa20cc2cfe8f87c6f8dc5a518c06c7c939a2f91d0294a59cd8d0b97a3d68700b95b287', ), success: true, }, @@ -127,7 +127,7 @@ test( unlockingScripts: { unlock: 'test', }, - } + }, ); test( @@ -162,7 +162,7 @@ test( unlockingScripts: { test: 'lock', }, - } + }, ); test( @@ -190,7 +190,7 @@ test( lockingScriptTypes: { test: 'p2sh20', }, - } + }, ); test( @@ -227,5 +227,5 @@ test( unlock: 'test', }, vm: undefined, - } + }, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.signing-serialization-algorithms.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.signing-serialization-algorithms.spec.ts index 3187c6a0..42fc65b3 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.signing-serialization-algorithms.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.signing-serialization-algorithms.spec.ts @@ -81,8 +81,8 @@ const testSigningSerializationAlgorithms = test.macro<[string, string]>( success: true, }, `Expected bytecode:\n ${stringify(bytecodeHex)} \n\nResult: ${stringify( - resultUnlock - )}` + resultUnlock, + )}`, ); const resultUnlockHd = compiler.generateBytecode({ data: { @@ -98,94 +98,94 @@ const testSigningSerializationAlgorithms = test.macro<[string, string]>( success: true, }, `Expected bytecode:\n ${stringify(bytecodeHex)} \n\nResult: ${stringify( - resultUnlockHd - )}` + resultUnlockHd, + )}`, ); - } + }, ); test.failing( '[BCH compiler] signing serialization algorithms - ECDSA all_outputs', testSigningSerializationAlgorithms, ' ', - '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - ECDSA all_outputs_single_input', testSigningSerializationAlgorithms, ' ', - '483045022100b30fb165fa511b6ff3718a4dcc6dd25dd916620e08e207c47a54bae56a3dbd5402202cf24193d51a9cd11be879eb1da063ad22ac30b355855e5c8147bf1e5f2e2cf1c1210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '483045022100b30fb165fa511b6ff3718a4dcc6dd25dd916620e08e207c47a54bae56a3dbd5402202cf24193d51a9cd11be879eb1da063ad22ac30b355855e5c8147bf1e5f2e2cf1c1210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - ECDSA corresponding_output', testSigningSerializationAlgorithms, ' ', - '483045022100cea4e9fe270b4337c3c0cffdf57b2ccba11245752a860f9ff5c06cd3bfa399d902203ebef34068efe7e9bd2a334f886bc720e975fd4485df9d8b8e0b98e671c1d02243210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '483045022100cea4e9fe270b4337c3c0cffdf57b2ccba11245752a860f9ff5c06cd3bfa399d902203ebef34068efe7e9bd2a334f886bc720e975fd4485df9d8b8e0b98e671c1d02243210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - ECDSA corresponding_output_single_input', testSigningSerializationAlgorithms, ' ', - '473044022075bdb3381383221ea3073b2cc806b9f63ce0f1c1c5276f72a7b58922df2e69e40220075ec2497b9fa291ab028eed556fdc3591d93c52da80a35410731de40de8a0a6c3210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '473044022075bdb3381383221ea3073b2cc806b9f63ce0f1c1c5276f72a7b58922df2e69e40220075ec2497b9fa291ab028eed556fdc3591d93c52da80a35410731de40de8a0a6c3210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - ECDSA no_outputs', testSigningSerializationAlgorithms, ' ', - '47304402206e41f758eb74d0b679a5747c50a3e0c361dee4249ccc82ee491c862455a973e802204056bc00f207a7fb8ef3e2e068c09ca0d71f70685c66af7231a2aa0fb3e335f242210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '47304402206e41f758eb74d0b679a5747c50a3e0c361dee4249ccc82ee491c862455a973e802204056bc00f207a7fb8ef3e2e068c09ca0d71f70685c66af7231a2aa0fb3e335f242210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - ECDSA no_outputs_single_input', testSigningSerializationAlgorithms, ' ', - '483045022100bf73fa9557d725441b35af93ba2ae49e3afe3bd93cbddf9555e179fcc0b52d6f02203d7fb85de9ba6347ac87fe400819455c3a9f1a5c310f4e2dd32c00ae353a1981c2210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '483045022100bf73fa9557d725441b35af93ba2ae49e3afe3bd93cbddf9555e179fcc0b52d6f02203d7fb85de9ba6347ac87fe400819455c3a9f1a5c310f4e2dd32c00ae353a1981c2210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - Schnorr all_outputs', testSigningSerializationAlgorithms, ' ', - '419adccdbb9b0242938a08900238e302c446dcde0415cc3252c2371da1f827090171ed051c9c121030c37caacc81217b979de766b69d04f64c67219c8ebc45fd2541210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '419adccdbb9b0242938a08900238e302c446dcde0415cc3252c2371da1f827090171ed051c9c121030c37caacc81217b979de766b69d04f64c67219c8ebc45fd2541210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - Schnorr all_outputs_single_input', testSigningSerializationAlgorithms, ' ', - '41a8ffa79bd74f44780b6679cbc177735691d85ea86129909b4943e1541594babafab8433943b71de881d8ac6114da4c6095528d93b77cc570a61102ec6352b2ffc1210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '41a8ffa79bd74f44780b6679cbc177735691d85ea86129909b4943e1541594babafab8433943b71de881d8ac6114da4c6095528d93b77cc570a61102ec6352b2ffc1210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - Schnorr corresponding_output', testSigningSerializationAlgorithms, ' ', - '4157130313297ff18f71e123522f6e673258aad57b02bc963350fb59490cde160ebb9da2cdef624d6efa447a297a4d46e56b0035012de361b9902565231782aa8f43210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '4157130313297ff18f71e123522f6e673258aad57b02bc963350fb59490cde160ebb9da2cdef624d6efa447a297a4d46e56b0035012de361b9902565231782aa8f43210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - Schnorr corresponding_output_single_input', testSigningSerializationAlgorithms, ' ', - '41476031c21a9fe94b33135f7e7107a532de49956b0abf16a3bd941dad494b5e507274d50d2f2a67d30d2d26b76465be5bcc42a13b61d16e44068c3d1d905ac628c3210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '41476031c21a9fe94b33135f7e7107a532de49956b0abf16a3bd941dad494b5e507274d50d2f2a67d30d2d26b76465be5bcc42a13b61d16e44068c3d1d905ac628c3210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - Schnorr no_outputs', testSigningSerializationAlgorithms, ' ', - '41c3e465fa4b26870a817aeb29ebce6d697fa76c39454b9bd7d85875ca2a742e47660ce169087d0ac90b7ff35b7854efa1dcfe85fcf5080f6754d69585ab45875f42210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '41c3e465fa4b26870a817aeb29ebce6d697fa76c39454b9bd7d85875ca2a742e47660ce169087d0ac90b7ff35b7854efa1dcfe85fcf5080f6754d69585ab45875f42210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test.failing( '[BCH compiler] signing serialization algorithms - Schnorr no_outputs_single_input', testSigningSerializationAlgorithms, ' ', - '413c24af0348f4eedba198f146fcfd3a099f67d4b17e690321bd038a3fd0ff8340200ab71722d2dd7fa3a513902c04362ff5ea41e4a7548e7733b377678bddcceac2210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '413c24af0348f4eedba198f146fcfd3a099f67d4b17e690321bd038a3fd0ff8340200ab71722d2dd7fa3a513902c04362ff5ea41e4a7548e7733b377678bddcceac2210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ); test('[BCH compiler] signing serialization algorithms - no signing serialization data', (t) => { diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.spec.helper.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.spec.helper.ts index e9973969..3c143725 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.spec.helper.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.spec.helper.ts @@ -52,7 +52,7 @@ export const expectCompilationResult = test.macro< CompilationData, BytecodeGenerationResult, CompilerConfiguration['variables']?, - Partial>? + Partial>?, ] >( ( @@ -61,8 +61,8 @@ export const expectCompilationResult = test.macro< otherData, expectedResult, variables, - configurationOverrides - // eslint-disable-next-line max-params + configurationOverrides, + // eslint-disable-next-line @typescript-eslint/max-params ) => { const compiler = compilerConfigurationToCompilerBCH< CompilerConfigurationBCH, @@ -105,8 +105,8 @@ export const expectCompilationResult = test.macro< resultUnlock, expectedResult, `- \nResult: ${stringifyTestVector( - resultUnlock - )}\n\nExpected:\n ${stringifyTestVector(expectedResult)}\n` + resultUnlock, + )}\n\nExpected:\n ${stringifyTestVector(expectedResult)}\n`, ); - } + }, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.e2e.variables.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.e2e.variables.spec.ts index a26c9ea0..427ddc41 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.e2e.variables.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.e2e.variables.spec.ts @@ -24,7 +24,7 @@ test( name: 'Data', type: 'AddressData', }, - } + }, ); test( @@ -47,7 +47,7 @@ test( name: 'no description', type: 'AddressData', }, - } + }, ); test( @@ -84,7 +84,7 @@ test( { one: { type: 'AddressData' }, two: { type: 'AddressData' }, - } + }, ); test( @@ -127,7 +127,7 @@ test( { one: { type: 'AddressData' }, two: { type: 'AddressData' }, - } + }, ); test( @@ -146,7 +146,7 @@ test( name: 'Data', type: 'WalletData', }, - } + }, ); test( @@ -169,7 +169,7 @@ test( name: 'no description', type: 'WalletData', }, - } + }, ); test( @@ -206,7 +206,7 @@ test( { one: { type: 'WalletData' }, two: { type: 'WalletData' }, - } + }, ); test( @@ -249,7 +249,7 @@ test( { one: { type: 'WalletData' }, two: { type: 'WalletData' }, - } + }, ); test( @@ -262,7 +262,7 @@ test( errors: [ { error: - 'The "current_block_height" variable type can not be resolved because the "currentBlockHeight" operation has not been included in this compiler\'s CompilationEnvironment.', + 'The "current_block_height" variable type can not be resolved because the "currentBlockHeight" operation has not been included in this compiler\'s configuration.', range: { endColumn: 22, endLineNumber: 1, @@ -274,7 +274,7 @@ test( success: false, } as BytecodeGenerationResult, {}, - { operations: undefined } + { operations: undefined }, ); test( @@ -287,7 +287,7 @@ test( errors: [ { error: - 'The "current_block_time" variable type can not be resolved because the "currentBlockTime" operation has not been included in this compiler\'s CompilationEnvironment.', + 'The "current_block_time" variable type can not be resolved because the "currentBlockTime" operation has not been included in this compiler\'s configuration.', range: { endColumn: 20, endLineNumber: 1, @@ -299,7 +299,7 @@ test( success: false, } as BytecodeGenerationResult, {}, - { operations: undefined } + { operations: undefined }, ); test( @@ -312,7 +312,7 @@ test( errors: [ { error: - 'The "signing_serialization" variable type can not be resolved because the "signingSerialization" operation has not been included in this compiler\'s CompilationEnvironment.', + 'The "signing_serialization" variable type can not be resolved because the "signingSerialization" operation has not been included in this compiler\'s configuration.', range: { endColumn: 31, endLineNumber: 1, @@ -324,7 +324,7 @@ test( success: false, } as BytecodeGenerationResult, {}, - { operations: undefined } + { operations: undefined }, ); test( @@ -337,7 +337,7 @@ test( errors: [ { error: - 'The "a" variable type can not be resolved because the "addressData" operation has not been included in this compiler\'s CompilationEnvironment.', + 'The "a" variable type can not be resolved because the "addressData" operation has not been included in this compiler\'s configuration.', range: { endColumn: 3, endLineNumber: 1, @@ -351,7 +351,7 @@ test( { a: { type: 'AddressData' }, }, - { operations: undefined } + { operations: undefined }, ); test( @@ -364,7 +364,7 @@ test( errors: [ { error: - 'The "a" variable type can not be resolved because the "hdKey" operation has not been included in this compiler\'s CompilationEnvironment.', + 'The "a" variable type can not be resolved because the "hdKey" operation has not been included in this compiler\'s configuration.', range: { endColumn: 3, endLineNumber: 1, @@ -378,7 +378,7 @@ test( { a: { type: 'HdKey' }, }, - { operations: undefined } + { operations: undefined }, ); test( @@ -391,7 +391,7 @@ test( errors: [ { error: - 'The "a" variable type can not be resolved because the "key" operation has not been included in this compiler\'s CompilationEnvironment.', + 'The "a" variable type can not be resolved because the "key" operation has not been included in this compiler\'s configuration.', range: { endColumn: 3, endLineNumber: 1, @@ -405,7 +405,7 @@ test( { a: { type: 'Key' }, }, - { operations: undefined } + { operations: undefined }, ); test( @@ -418,7 +418,7 @@ test( errors: [ { error: - 'The "a" variable type can not be resolved because the "walletData" operation has not been included in this compiler\'s CompilationEnvironment.', + 'The "a" variable type can not be resolved because the "walletData" operation has not been included in this compiler\'s configuration.', range: { endColumn: 3, endLineNumber: 1, @@ -432,5 +432,5 @@ test( { a: { type: 'WalletData' }, }, - { operations: undefined } + { operations: undefined }, ); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.spec.ts b/src/lib/compiler/compiler-bch/compiler-bch.spec.ts index 81174f8f..83448548 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.spec.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.spec.ts @@ -42,7 +42,7 @@ test.failing('[BCH compiler] createCompilerBCH: generateBytecode', (t) => { bytecode: hexToBin('76a91415d16c84669ab46059313bf0747e781f1d13936d88ac'), success: true, }, - stringifyTestVector(resultLock) + stringifyTestVector(resultLock), ); const resultUnlock = compiler.generateBytecode({ @@ -56,11 +56,11 @@ test.failing('[BCH compiler] createCompilerBCH: generateBytecode', (t) => { resultUnlock, { bytecode: hexToBin( - '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), success: true, }, - stringifyTestVector(resultUnlock) + stringifyTestVector(resultUnlock), ); }); @@ -293,7 +293,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { }, reduce: { bytecode: hexToBin( - '76a91415d16c84669ab46059313bf0747e781f1d13936d88ac' + '76a91415d16c84669ab46059313bf0747e781f1d13936d88ac', ), range: { endColumn: 76, @@ -333,7 +333,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { script: [ { bytecode: hexToBin( - '15d16c84669ab46059313bf0747e781f1d13936d' + '15d16c84669ab46059313bf0747e781f1d13936d', ), range: { endColumn: 48, @@ -343,7 +343,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { }, source: { bytecode: hexToBin( - '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5a9' + '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5a9', ), range: { endColumn: 47, @@ -354,11 +354,11 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { script: [ { bytecode: hexToBin( - '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), push: { bytecode: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), range: { endColumn: 35, @@ -369,7 +369,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { script: [ { bytecode: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), range: { endColumn: 35, @@ -417,7 +417,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { instructions: [ { data: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), opcode: 33, }, @@ -439,7 +439,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { instructions: [ { data: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), opcode: 33, }, @@ -455,7 +455,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { signedMessages: [], stack: [ hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), ], }, @@ -465,7 +465,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { instructions: [ { data: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), opcode: 33, }, @@ -489,7 +489,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { instructions: [ { data: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), opcode: 33, }, @@ -597,7 +597,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { }, type: 'bytecode', value: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), variable: 'a.public_key', }, @@ -643,7 +643,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { ], success: true, }, - stringifyTestVector(resultLock) + stringifyTestVector(resultLock), ); const resultUnlock = compiler.generateBytecode({ @@ -658,7 +658,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { resultUnlock, { bytecode: hexToBin( - '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), parse: { end: { @@ -761,7 +761,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { }, reduce: { bytecode: hexToBin( - '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), range: { endColumn: 41, @@ -772,11 +772,11 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { script: [ { bytecode: hexToBin( - '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141' + '47304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141', ), push: { bytecode: hexToBin( - '304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141' + '304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141', ), range: { endColumn: 25, @@ -787,7 +787,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { script: [ { bytecode: hexToBin( - '304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141' + '304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141', ), range: { endColumn: 25, @@ -807,11 +807,11 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { }, { bytecode: hexToBin( - '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), push: { bytecode: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), range: { endColumn: 40, @@ -822,7 +822,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { script: [ { bytecode: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), range: { endColumn: 40, @@ -861,12 +861,12 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { }, signature: { serialization: hexToBin( - '000000001cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba214e63bf41490e67d34476778f6707aa6c8d2c8dccdf78ae11e40ee9f91e89a70505050505050505050505050505050505050505050505050505050505050505000000001976a91415d16c84669ab46059313bf0747e781f1d13936d88ac000000000000000000000000c942a06c127c2c18022677e888020afb174208d299354f3ecfedb124a1f3fa450000000041000000' + '000000001cc3adea40ebfd94433ac004777d68150cce9db4c771bc7de1b297a7b795bbba214e63bf41490e67d34476778f6707aa6c8d2c8dccdf78ae11e40ee9f91e89a70505050505050505050505050505050505050505050505050505050505050505000000001976a91415d16c84669ab46059313bf0747e781f1d13936d88ac000000000000000000000000c942a06c127c2c18022677e888020afb174208d299354f3ecfedb124a1f3fa450000000041000000', ), }, type: 'bytecode', value: hexToBin( - '304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141' + '304402200bda982d5b1a2a42d4568cf180ea1e4042397b02a77d5039b4b620dbc5ba1141022008f2a4f13ff538221cbf79d676f55fbe0c05617dea57877b648037b8dae939f141', ), variable: 'a.signature.all_outputs', }, @@ -890,7 +890,7 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { }, type: 'bytecode', value: hexToBin( - '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5' + '0376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5', ), variable: 'a.public_key', }, @@ -899,6 +899,6 @@ test.failing('[BCH compiler] createCompilerBCH: debug', (t) => { ], success: true, }, - stringifyTestVector(resultUnlock) + stringifyTestVector(resultUnlock), ); }); diff --git a/src/lib/compiler/compiler-bch/compiler-bch.ts b/src/lib/compiler/compiler-bch/compiler-bch.ts index 97bfc6c6..76d21f78 100644 --- a/src/lib/compiler/compiler-bch/compiler-bch.ts +++ b/src/lib/compiler/compiler-bch/compiler-bch.ts @@ -8,12 +8,12 @@ import { import type { AnyCompilerConfiguration, AuthenticationProgramStateBCH, - AuthenticationTemplate, CompilationContextBCH, CompilationData, CompilerConfiguration, CompilerOperationResult, Sha256, + WalletTemplate, } from '../../lib.js'; import { createVirtualMachineBCH, @@ -33,9 +33,9 @@ import { } from '../compiler-operation-helpers.js'; import { compilerOperationsCommon } from '../compiler-operations.js'; import { - authenticationTemplateToCompilerConfiguration, compilerConfigurationToCompilerBCH, createAuthenticationProgramEvaluationCommon, + walletTemplateToCompilerConfiguration, } from '../compiler-utils.js'; export type CompilerOperationsKeyBCH = @@ -109,7 +109,7 @@ export enum SigningSerializationAlgorithmIdentifier { // eslint-disable-next-line complexity const getSigningSerializationType = ( algorithmIdentifier: string, - prefix = '' + prefix = '', ) => { switch (algorithmIdentifier) { case `${prefix}${SigningSerializationAlgorithmIdentifier.allOutputs}`: @@ -125,17 +125,17 @@ const getSigningSerializationType = ( SigningSerializationFlag.allOutputs | SigningSerializationFlag.singleInput | SigningSerializationFlag.utxos | - SigningSerializationFlag.forkId + SigningSerializationFlag.forkId, ); case `${prefix}${SigningSerializationAlgorithmIdentifier.correspondingOutput}`: return Uint8Array.of(SigningSerializationTypeBCH.correspondingOutput); case `${prefix}${SigningSerializationAlgorithmIdentifier.correspondingOutputAllUtxos}`: return Uint8Array.of( - SigningSerializationTypeBCH.correspondingOutputAllUtxos + SigningSerializationTypeBCH.correspondingOutputAllUtxos, ); case `${prefix}${SigningSerializationAlgorithmIdentifier.correspondingOutputSingleInput}`: return Uint8Array.of( - SigningSerializationTypeBCH.correspondingOutputSingleInput + SigningSerializationTypeBCH.correspondingOutputSingleInput, ); case `${prefix}${SigningSerializationAlgorithmIdentifier.correspondingOutputSingleInputInvalidAllUtxos}`: return Uint8Array.of( @@ -143,7 +143,7 @@ const getSigningSerializationType = ( SigningSerializationFlag.correspondingOutput | SigningSerializationFlag.singleInput | SigningSerializationFlag.utxos | - SigningSerializationFlag.forkId + SigningSerializationFlag.forkId, ); case `${prefix}${SigningSerializationAlgorithmIdentifier.noOutputs}`: return Uint8Array.of(SigningSerializationTypeBCH.noOutputs); @@ -157,7 +157,7 @@ const getSigningSerializationType = ( SigningSerializationFlag.noOutputs | SigningSerializationFlag.singleInput | SigningSerializationFlag.utxos | - SigningSerializationFlag.forkId + SigningSerializationFlag.forkId, ); default: return undefined; @@ -180,7 +180,7 @@ export const compilerOperationHelperComputeSignatureBCH = ({ operationName: string; sign: ( privateKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => Uint8Array | string; sha256: { hash: Sha256['hash'] }; }): CompilerOperationResult => { @@ -212,7 +212,7 @@ export const compilerOperationHelperComputeSignatureBCH = ({ const serialization = generateSigningSerializationBCH( compilationContext, { coveredBytecode, signingSerializationType }, - sha256 + sha256, ); const digest = hash256(serialization, sha256); const bitcoinEncodedSignature = Uint8Array.from([ @@ -282,7 +282,7 @@ export const compilerOperationHelperHdKeySignatureBCH = ({ sign: secp256k1[secp256k1Method], }); }, - }) + }), ); export const compilerOperationHdKeyEcdsaSignatureBCH = @@ -354,7 +354,7 @@ export const compilerOperationHelperKeySignatureBCH = ({ sign: secp256k1[secp256k1Method], }); }, - }) + }), ); export const compilerOperationKeyEcdsaSignatureBCH = @@ -370,7 +370,7 @@ export const compilerOperationKeySchnorrSignatureBCH = export const compilerOperationHelperComputeDataSignatureBCH = < Data extends CompilationData, - Configuration extends AnyCompilerConfiguration + Configuration extends AnyCompilerConfiguration, >({ data, configuration, @@ -387,7 +387,7 @@ export const compilerOperationHelperComputeDataSignatureBCH = < operationName: string; sign: ( privateKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => Uint8Array | string; sha256: { hash: Sha256['hash'] }; }): CompilerOperationResult => { @@ -395,7 +395,7 @@ export const compilerOperationHelperComputeDataSignatureBCH = < string, string | undefined, string | undefined, - string | undefined + string | undefined, ]; if (unknown !== undefined) { @@ -480,7 +480,7 @@ export const compilerOperationHelperKeyDataSignatureBCH = ({ sign: secp256k1[secp256k1Method], }); }, - }) + }), ); export const compilerOperationKeyEcdsaDataSignatureBCH = @@ -538,7 +538,7 @@ export const compilerOperationHelperHdKeyDataSignatureBCH = ({ sign: secp256k1[secp256k1Method], }); }, - }) + }), ); export const compilerOperationHdKeyEcdsaDataSignatureBCH = @@ -579,7 +579,7 @@ export const compilerOperationSigningSerializationFullBCH = const signingSerializationType = getSigningSerializationType( algorithmOrComponent, - 'full_' + 'full_', ); if (signingSerializationType === undefined) { return { @@ -609,7 +609,7 @@ export const compilerOperationSigningSerializationFullBCH = coveredBytecode: result, signingSerializationType, }, - sha256 + sha256, ), status: 'success', }; @@ -673,10 +673,10 @@ export type CompilerConfigurationBCH = CompilerConfiguration< * include the `scripts` property */ export const createCompilerBCH = < - Configuration extends AnyCompilerConfiguration, - ProgramState extends AuthenticationProgramStateBCH + Configuration extends CompilerConfiguration, + ProgramState extends AuthenticationProgramStateBCH, >( - configuration: Configuration + configuration: Configuration, ) => compilerConfigurationToCompilerBCH({ ...{ @@ -687,10 +687,7 @@ export const createCompilerBCH = < secp256k1: internalSecp256k1, sha256: internalSha256, sha512: internalSha512, - vm: - configuration.vm === undefined - ? createVirtualMachineBCH() - : configuration.vm, + vm: configuration.vm ?? createVirtualMachineBCH(), }, ...configuration, }); @@ -698,21 +695,21 @@ export const createCompilerBCH = < export const createCompiler = createCompilerBCH; /** - * Create a BCH `Compiler` from an `AuthenticationTemplate` and an optional set + * Create a BCH `Compiler` from an `WalletTemplate` and an optional set * of overrides. - * @param template - the `AuthenticationTemplate` from which to create the BCH + * @param template - the `WalletTemplate` from which to create the BCH * compiler * @param overrides - a compiler configuration from which properties will be * used to override properties of the default BCH configuration */ -export const authenticationTemplateToCompilerBCH = < - Configuration extends AnyCompilerConfiguration, - ProgramState extends AuthenticationProgramStateBCH +export const walletTemplateToCompilerBCH = < + Configuration extends CompilerConfiguration, + ProgramState extends AuthenticationProgramStateBCH, >( - template: AuthenticationTemplate, - overrides?: Configuration + template: WalletTemplate, + overrides?: Configuration, ) => createCompilerBCH({ ...overrides, - ...authenticationTemplateToCompilerConfiguration(template), + ...walletTemplateToCompilerConfiguration(template), } as Configuration); diff --git a/src/lib/compiler/compiler-defaults.ts b/src/lib/compiler/compiler-defaults.ts index 21b73746..c6b627d2 100644 --- a/src/lib/compiler/compiler-defaults.ts +++ b/src/lib/compiler/compiler-defaults.ts @@ -8,10 +8,11 @@ export enum CompilerDefaults { * The value used for `["slot"]` and `["copy"]` locking or unlocking bytecode * when generating a scenario and no `unlockingScriptId` is provided. */ + // eslint-disable-next-line @typescript-eslint/no-mixed-enums defaultScenarioBytecode = '', /** * - * The value of `currentBlockHeight` in the default authentication template + * The value of `currentBlockHeight` in the default wallet template * scenario. This is the height of the second mined block after the genesis * block: `000000006a625f06636b8bb6ac7b960a8d03705d1ace08b1a19da3fdcc99ddbd`. * @@ -21,7 +22,7 @@ export enum CompilerDefaults { */ defaultScenarioCurrentBlockHeight = 2, /** - * The value of `currentBlockTime` in the default authentication template + * The value of `currentBlockTime` in the default wallet template * scenario. This is the Median Time-Past block time (BIP113) of block `2` * (the block used in * {@link CompilerDefaults.defaultScenarioCurrentBlockHeight}). @@ -39,17 +40,22 @@ export enum CompilerDefaults { * The default `sequenceNumber` of inputs in scenarios. */ defaultScenarioInputSequenceNumber = 0, + /** + * The default `lockingBytecode` value for scenario outputs, + * `OP_RETURN <"libauth">` (hex: `6a076c696261757468`). + */ + defaultScenarioOutputLockingBytecode = '6a076c696261757468', /** * The default `valueSatoshis` of outputs in scenarios. */ defaultScenarioOutputValueSatoshis = 0, /** - * The value of `transaction.locktime` in the default authentication template + * The value of `transaction.locktime` in the default wallet template * scenario. */ defaultScenarioTransactionLocktime = 0, /** - * The value of `transaction.version` in the default authentication template + * The value of `transaction.version` in the default wallet template * scenario. Transaction version `2` enables `OP_CHECKSEQUENCEVERIFY` as * described in BIP68, BIP112, and BIP113. */ @@ -70,7 +76,7 @@ export enum CompilerDefaults { /** * The prefix used to refer to other scenario bytecode scripts from within a - * bytecode script. See {@link AuthenticationTemplateScenarioData.bytecode} + * bytecode script. See {@link WalletTemplateScenarioData.bytecode} * for details. */ scenarioBytecodeScriptPrefix = '_scenario.', diff --git a/src/lib/compiler/compiler-operation-helpers.spec.ts b/src/lib/compiler/compiler-operation-helpers.spec.ts index 9ae9789b..f9ca77ee 100644 --- a/src/lib/compiler/compiler-operation-helpers.spec.ts +++ b/src/lib/compiler/compiler-operation-helpers.spec.ts @@ -14,7 +14,7 @@ test('attemptCompilerOperations: can skip configuration property check', (t) => dataProperties: [], operation: () => ({ error: 'test failed', status: 'error' }), })('', {}, { scripts: {} }), - { status: 'skip' } + { status: 'skip' }, ); }); @@ -33,6 +33,6 @@ test('compilerOperationHelperGenerateCoveredBytecode: empty sourceScriptIds', (t 'Identifier "test" requires a signing serialization, but "coveredBytecode" cannot be determined because the compiler configuration\'s "sourceScriptIds" is empty.', status: 'error', }, - stringifyTestVector(result) + stringifyTestVector(result), ); }); diff --git a/src/lib/compiler/compiler-operation-helpers.ts b/src/lib/compiler/compiler-operation-helpers.ts index 158f5ef6..bc642226 100644 --- a/src/lib/compiler/compiler-operation-helpers.ts +++ b/src/lib/compiler/compiler-operation-helpers.ts @@ -2,7 +2,6 @@ import { decodeHdPrivateKey, deriveHdPath } from '../key/key.js'; import { resolveScriptIdentifier } from '../language/language.js'; import type { AnyCompilerConfiguration, - AuthenticationTemplateHdKey, CompilationContextBCH, CompilationData, CompilerConfiguration, @@ -10,6 +9,7 @@ import type { CompilerOperationErrorFatal, CompilerOperationResult, CompilerOperationSkip, + WalletTemplateHdKey, } from '../lib.js'; import { CompilerDefaults } from './compiler-defaults.js'; @@ -27,10 +27,10 @@ import { CompilerDefaults } from './compiler-defaults.js'; export const attemptCompilerOperations = ( operations: CompilerOperation[], - finalOperation: CompilerOperation + finalOperation: CompilerOperation, ): CompilerOperation => (identifier, data, configuration) => { - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const operation of operations) { const result = operation(identifier, data, configuration); if (result.status !== 'skip') return result; @@ -51,7 +51,7 @@ export const compilerOperationRequires = CanBeSkipped extends boolean, RequiredDataProperties extends keyof CompilationData, RequiredConfigurationProperties extends keyof CompilerConfiguration, - CompilationContext = CompilationContextBCH + CompilationContext = CompilationContextBCH, >({ /** * If `true`, the accepted operation may return `false`, and any missing @@ -89,12 +89,12 @@ export const compilerOperationRequires = CompilerConfiguration, RequiredConfigurationProperties > - > + >, ) => CompilerOperationResult; }): CompilerOperation => // eslint-disable-next-line complexity (identifier, data, configuration) => { - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const property of configurationProperties) { if (configuration[property] === undefined) return ( @@ -108,7 +108,7 @@ export const compilerOperationRequires = ? CompilerOperationSkip : CompilerOperationErrorFatal; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const property of dataProperties) { if ( (data[property] as (typeof data)[typeof property] | undefined) === @@ -137,7 +137,7 @@ export const compilerOperationRequires = CompilerConfiguration, RequiredConfigurationProperties > - > + >, ); }; @@ -173,7 +173,7 @@ export const compilerOperationHelperDeriveHdPrivateNode = ({ sha256: NonNullable; sha512: NonNullable; }; - hdKey: AuthenticationTemplateHdKey; + hdKey: WalletTemplateHdKey; identifier: string; }): CompilerOperationResult => { const addressOffset = @@ -203,7 +203,7 @@ export const compilerOperationHelperDeriveHdPrivateNode = ({ const instanceNode = deriveHdPath( masterContents.node, instancePath, - configuration + configuration, ); if (typeof instanceNode === 'string') { @@ -221,7 +221,7 @@ export const compilerOperationHelperDeriveHdPrivateNode = ({ export const compilerOperationHelperUnknownEntity = ( identifier: string, - variableId: string + variableId: string, ) => ({ error: `Identifier "${identifier}" refers to an HdKey, but the "entityOwnership" for "${variableId}" is not available in this compiler configuration.`, status: 'error' as const, @@ -274,9 +274,7 @@ export const compilerOperationHelperDeriveHdKeyPrivate = ({ /** * Guaranteed to be an `HdKey` if this method is reached in the compiler. */ - const hdKey = configuration.variables[ - variableId - ] as AuthenticationTemplateHdKey; + const hdKey = configuration.variables[variableId] as WalletTemplateHdKey; return compilerOperationHelperDeriveHdPrivateNode({ addressIndex, @@ -331,7 +329,7 @@ export const compilerOperationHelperCompileScript = ({ * {@link CompilerOperationErrorFatal}. */ export const compilerOperationHelperGenerateCoveredBytecode = < - CompilationContext + CompilationContext, >({ data, configuration, diff --git a/src/lib/compiler/compiler-operations.ts b/src/lib/compiler/compiler-operations.ts index ef128fc6..089bc970 100644 --- a/src/lib/compiler/compiler-operations.ts +++ b/src/lib/compiler/compiler-operations.ts @@ -4,10 +4,7 @@ import { valueSatoshisToBin, } from '../format/format.js'; import { decodeHdPublicKey, deriveHdPath } from '../key/key.js'; -import type { - AuthenticationTemplateHdKey, - CompilerOperationResult, -} from '../lib.js'; +import type { CompilerOperationResult, WalletTemplateHdKey } from '../lib.js'; import { encodeTransactionInputSequenceNumbersForSigning, encodeTransactionOutpoints, @@ -90,7 +87,7 @@ export const compilerOperationSigningSerializationCorrespondingOutput = dataProperties: ['compilationContext'], operation: (_, data) => { const { correspondingOutput } = generateSigningSerializationComponentsBCH( - data.compilationContext + data.compilationContext, ); return correspondingOutput === undefined ? { bytecode: Uint8Array.of(), status: 'success' } @@ -108,13 +105,13 @@ export const compilerOperationSigningSerializationCorrespondingOutputHash = dataProperties: ['compilationContext'], operation: (_, data, configuration) => { const { correspondingOutput } = generateSigningSerializationComponentsBCH( - data.compilationContext + data.compilationContext, ); return correspondingOutput === undefined ? { bytecode: Uint8Array.of(), status: 'success' } : { bytecode: configuration.sha256.hash( - configuration.sha256.hash(correspondingOutput) + configuration.sha256.hash(correspondingOutput), ), status: 'success', }; @@ -122,7 +119,7 @@ export const compilerOperationSigningSerializationCorrespondingOutputHash = }); const compilerOperationHelperSigningSerializationCoveredBytecode = ( - returnLength: boolean + returnLength: boolean, ) => compilerOperationRequires({ canBeSkipped: false, @@ -163,7 +160,7 @@ export const compilerOperationSigningSerializationLocktime = dataProperties: ['compilationContext'], operation: (_, data) => ({ bytecode: numberToBinUint32LE( - data.compilationContext.transaction.locktime + data.compilationContext.transaction.locktime, ), status: 'success', }), @@ -179,7 +176,7 @@ export const compilerOperationSigningSerializationOutpointIndex = // eslint-disable-next-line @typescript-eslint/no-non-null-assertion data.compilationContext.transaction.inputs[ data.compilationContext.inputIndex - ]!.outpointIndex + ]!.outpointIndex, ), status: 'success', }), @@ -210,7 +207,7 @@ export const compilerOperationSigningSerializationOutputValue = // eslint-disable-next-line @typescript-eslint/no-non-null-assertion data.compilationContext.sourceOutputs[ data.compilationContext.inputIndex - ]!.valueSatoshis + ]!.valueSatoshis, ), status: 'success', }), @@ -226,7 +223,7 @@ export const compilerOperationSigningSerializationSequenceNumber = // eslint-disable-next-line @typescript-eslint/no-non-null-assertion data.compilationContext.transaction.inputs[ data.compilationContext.inputIndex - ]!.sequenceNumber + ]!.sequenceNumber, ), status: 'success', }), @@ -239,7 +236,7 @@ export const compilerOperationSigningSerializationTransactionOutpoints = dataProperties: ['compilationContext'], operation: (_, data) => ({ bytecode: encodeTransactionOutpoints( - data.compilationContext.transaction.inputs + data.compilationContext.transaction.inputs, ), status: 'success', }), @@ -253,8 +250,10 @@ export const compilerOperationSigningSerializationTransactionOutpointsHash = operation: (_, data, configuration) => ({ bytecode: configuration.sha256.hash( configuration.sha256.hash( - encodeTransactionOutpoints(data.compilationContext.transaction.inputs) - ) + encodeTransactionOutpoints( + data.compilationContext.transaction.inputs, + ), + ), ), status: 'success', }), @@ -267,7 +266,7 @@ export const compilerOperationSigningSerializationTransactionOutputs = dataProperties: ['compilationContext'], operation: (_, data) => ({ bytecode: encodeTransactionOutputsForSigning( - data.compilationContext.transaction.outputs + data.compilationContext.transaction.outputs, ), status: 'success', }), @@ -282,9 +281,9 @@ export const compilerOperationSigningSerializationTransactionOutputsHash = bytecode: configuration.sha256.hash( configuration.sha256.hash( encodeTransactionOutputsForSigning( - data.compilationContext.transaction.outputs - ) - ) + data.compilationContext.transaction.outputs, + ), + ), ), status: 'success', }), @@ -297,7 +296,7 @@ export const compilerOperationSigningSerializationTransactionSequenceNumbers = dataProperties: ['compilationContext'], operation: (_, data) => ({ bytecode: encodeTransactionInputSequenceNumbersForSigning( - data.compilationContext.transaction.inputs + data.compilationContext.transaction.inputs, ), status: 'success', }), @@ -312,9 +311,9 @@ export const compilerOperationSigningSerializationTransactionSequenceNumbersHash bytecode: configuration.sha256.hash( configuration.sha256.hash( encodeTransactionInputSequenceNumbersForSigning( - data.compilationContext.transaction.inputs - ) - ) + data.compilationContext.transaction.inputs, + ), + ), ), status: 'success', }), @@ -327,7 +326,7 @@ export const compilerOperationSigningSerializationVersion = dataProperties: ['compilationContext'], operation: (_, data) => ({ bytecode: numberToBinUint32LE( - data.compilationContext.transaction.version + data.compilationContext.transaction.version, ), status: 'success', }), @@ -349,7 +348,7 @@ export const compilerOperationKeyPublicKeyCommon = attemptCompilerOperations( return { bytecode: secp256k1.derivePublicKeyCompressed( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - privateKeys[variableId]! + privateKeys[variableId]!, ) as Uint8Array, status: 'success', }; @@ -360,7 +359,7 @@ export const compilerOperationKeyPublicKeyCommon = attemptCompilerOperations( status: 'error', }; }, - }) + }), ); export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( @@ -400,7 +399,7 @@ export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( */ const hdKey = configuration.variables[ variableId - ] as AuthenticationTemplateHdKey; + ] as WalletTemplateHdKey; if (entityHdPrivateKey !== undefined) { const privateResult = compilerOperationHelperDeriveHdPrivateNode({ @@ -414,7 +413,7 @@ export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( if (privateResult.status === 'error') return privateResult; return { bytecode: configuration.secp256k1.derivePublicKeyCompressed( - privateResult.bytecode + privateResult.bytecode, ) as Uint8Array, status: 'success', }; @@ -452,7 +451,7 @@ export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( const masterContents = decodeHdPublicKey( entityHdPublicKey, - configuration + configuration, ); if (typeof masterContents === 'string') { return { @@ -464,7 +463,7 @@ export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( const instanceNode = deriveHdPath( masterContents.node, instancePath, - configuration + configuration, ); if (typeof instanceNode === 'string') { @@ -476,7 +475,7 @@ export const compilerOperationHdKeyPublicKeyCommon = attemptCompilerOperations( return { bytecode: instanceNode.publicKey, status: 'success' }; }, - }) + }), ); /* eslint-disable camelcase, @typescript-eslint/naming-convention */ diff --git a/src/lib/compiler/compiler-types.ts b/src/lib/compiler/compiler-types.ts index fe258864..2c3dd000 100644 --- a/src/lib/compiler/compiler-types.ts +++ b/src/lib/compiler/compiler-types.ts @@ -1,7 +1,5 @@ import type { AuthenticationProgramCommon, - AuthenticationTemplateScenario, - AuthenticationTemplateVariable, AuthenticationVirtualMachine, CompilationContextBCH, CompilationResult, @@ -10,39 +8,40 @@ import type { Secp256k1, Sha256, Sha512, + WalletTemplateScenario, + WalletTemplateVariable, } from '../lib.js'; -export interface CompilerOperationDebug { +export type CompilerOperationDebug = { /** * An additional, complex property that may be returned by custom compiler * operations. For use in extending the compiler to support additional return * information like {@link CompilerOperationSuccessSignature}. */ debug?: unknown; -} +}; /** * A non-recoverable error in a compiler operation. This is any error that * cannot be resolved by simply providing a missing variable. */ -export interface CompilerOperationErrorFatal extends CompilerOperationDebug { +export type CompilerOperationErrorFatal = CompilerOperationDebug & { status: 'error'; error: string; -} +}; /** * A recoverable error in a compiler operation. This occurs when a required * variable was not provided. */ -export interface CompilerOperationErrorRecoverable - extends CompilerOperationErrorFatal { +export type CompilerOperationErrorRecoverable = CompilerOperationErrorFatal & { /** * The full identifier (including any compilation operations) of the variable * missing from compilation, e.g. `my_key.signature.all_outputs` or * `my_key.public_key`. */ recoverable: true; -} +}; /** * An unsuccessful compiler operation result. @@ -58,11 +57,10 @@ export type CompilerOperationSuccess = | CompilerOperationSuccessGeneric | CompilerOperationSuccessSignatureType; -export interface CompilerOperationSuccessGeneric - extends CompilerOperationDebug { +export type CompilerOperationSuccessGeneric = CompilerOperationDebug & { status: 'success'; bytecode: Uint8Array; -} +}; /** * A successful signature-generation compiler operation. This provides slightly @@ -77,42 +75,42 @@ export type CompilerOperationSuccessSignatureType = /** * The result of a successful `signature` compiler operation. */ -export interface CompilerOperationSuccessSignature - extends CompilerOperationSuccessGeneric { - signature: { - /** - * The transaction signing serialization signed by a signature. This signing - * serialization is hashed twice with `sha256`, and the digest is signed. - */ - serialization: Uint8Array; +export type CompilerOperationSuccessSignature = + CompilerOperationSuccessGeneric & { + signature: { + /** + * The transaction signing serialization signed by a signature. This signing + * serialization is hashed twice with `sha256`, and the digest is signed. + */ + serialization: Uint8Array; + }; }; -} /** * The result of a successful `data_signature` compiler operation. */ -export interface CompilerOperationSuccessDataSignature - extends CompilerOperationSuccessGeneric { - signature: { - /** - * The digest of the raw message signed by a data signature. - */ - digest: Uint8Array; - /** - * The raw message signed by a data signature. This message is hashed once - * with `sha256`, and the digest is signed. - */ - message: Uint8Array; +export type CompilerOperationSuccessDataSignature = + CompilerOperationSuccessGeneric & { + signature: { + /** + * The digest of the raw message signed by a data signature. + */ + digest: Uint8Array; + /** + * The raw message signed by a data signature. This message is hashed once + * with `sha256`, and the digest is signed. + */ + message: Uint8Array; + }; }; -} /** * An unsuccessful compiler operation result that should be skipped by the * compiler. See {@link attemptCompilerOperations} for details. */ -export interface CompilerOperationSkip { +export type CompilerOperationSkip = { status: 'skip'; -} +}; export type CompilerOperationResult = CanBeSkipped extends true @@ -142,12 +140,14 @@ export type CompilerOperationResult = export type CompilerOperation< CompilationContext = unknown, CanBeSkipped extends boolean = false, - Data extends CompilationData = CompilationData, - Configuration extends AnyCompilerConfiguration = CompilerConfiguration + Data extends + CompilationData = CompilationData, + Configuration extends + AnyCompilerConfiguration = AnyCompilerConfiguration, > = ( identifier: string, data: Data, - configuration: Configuration + configuration: Configuration, ) => CompilerOperationResult; export type CompilerOperationsKeysCommon = 'public_key' | 'signature'; @@ -211,7 +211,7 @@ export type CompilerOperationsSigningSerializationCommon = * * @remarks * A {@link CompilerConfiguration} must include a subset of the script's - * {@link AuthenticationTemplate} – all the variables and scripts referenced + * {@link WalletTemplate} – all the variables and scripts referenced * (including children of children) by the script in question. * * The context must also include an object mapping of opcode identifiers to the @@ -243,7 +243,7 @@ export type CompilerOperationsSigningSerializationCommon = * operations for `current_block_time` variables or `false` if only a single * compiler operation is used for all instances (default: `false`) */ -export interface CompilerConfiguration< +export type CompilerConfiguration< CompilationContext = unknown, CompilerKeyOperations extends string | false = CompilerOperationsKeysCommon, CompilerSigningSerializationOperations extends @@ -252,8 +252,8 @@ export interface CompilerConfiguration< CompilerAddressDataOperations extends string | false = false, CompilerWalletDataOperations extends string | false = false, CompilerCurrentBlockHeightOperations extends string | false = false, - CompilerCurrentBlockTimeOperations extends string | false = false -> { + CompilerCurrentBlockTimeOperations extends string | false = false, +> = { /** * A method that accepts the compiled bytecode contents of a CashAssembly * evaluation and produces the equivalent {@link AuthenticationProgram} to be @@ -263,7 +263,7 @@ export interface CompilerConfiguration< */ createAuthenticationProgram?: | (( - evaluationBytecode: Uint8Array + evaluationBytecode: Uint8Array, // eslint-disable-next-line @typescript-eslint/no-explicit-any ) => any) | undefined; @@ -378,11 +378,9 @@ export interface CompilerConfiguration< ripemd160?: { hash: Ripemd160['hash'] } | undefined; /** * An object mapping scenario identifiers to the - * {@link AuthenticationTemplateScenario}s they represent. + * {@link WalletTemplateScenario}s they represent. */ - scenarios?: - | { [scriptId: string]: AuthenticationTemplateScenario } - | undefined; + scenarios?: { [scriptId: string]: WalletTemplateScenario } | undefined; /** * An object mapping script identifiers to the text of script in CashAssembly. * @@ -447,7 +445,7 @@ export interface CompilerConfiguration< * The `height` type indicates that the transaction's locktime is provided as * a block height (the `locktime` value is less than `500000000`). * - * See {@link AuthenticationTemplateScript.timeLockType} for details. + * See {@link WalletTemplateScript.timeLockType} for details. */ unlockingScriptTimeLockTypes?: | { @@ -457,27 +455,25 @@ export interface CompilerConfiguration< /** * An object mapping template variable identifiers to the - * {@link AuthenticationTemplateVariable} describing them. + * {@link WalletTemplateVariable} describing them. * * To avoid compilation errors, this object must contain all variables * referenced by the script being compiled (including in child scripts). */ - variables?: - | { [variableId: string]: AuthenticationTemplateVariable } - | undefined; + variables?: { [variableId: string]: WalletTemplateVariable } | undefined; /** * The {@link AuthenticationVirtualMachine} on which CashAssembly `evaluation` * results will be computed. */ // eslint-disable-next-line @typescript-eslint/no-explicit-any vm?: AuthenticationVirtualMachine | undefined; -} +}; /** * Data required at compilation time to generate the bytecode for a particular * CashAssembly Template script. */ -export interface CompilationData { +export type CompilationData = { /** * A map of full identifiers to pre-computed bytecode for this compilation. * @@ -590,7 +586,7 @@ export interface CompilationData { * operations used in the compilation. */ compilationContext?: CompilationContext; -} +}; /** * Any compiler configuration, where each data type may use either a single or @@ -612,7 +608,7 @@ export type AnyCompilerConfiguration = * irrelevant. */ export type AnyCompilerConfigurationIgnoreOperations< - CompilationContext = CompilationContextBCH + CompilationContext = CompilationContextBCH, > = Omit, 'operations'>; export type BytecodeGenerationResult = @@ -623,26 +619,26 @@ export type BytecodeGenerationResult = }; /** - * A fully-generated authentication template scenario. Useful for estimating - * transactions and testing/debugging authentication templates. See - * {@link AuthenticationTemplateScenario} for details. + * A fully-generated wallet template scenario. Useful for estimating + * transactions and testing/debugging wallet templates. See + * {@link WalletTemplateScenario} for details. */ -export interface Scenario { +export type Scenario = { data: CompilationData; program: AuthenticationProgramCommon; -} +}; /** * A scenario generation result that includes all compilation information for * the scripts under test (in the scenario's "slot"s). This allows - * authentication template editors to display debugging information in context. + * wallet template editors to display debugging information in context. * * Note, scenarios can also include compilations for source outputs, inputs, and * outputs that are not under test – while debugging information is not * provided for these other compilations, any errors will result in `scenario` * being set to an error message (`string`). */ -export interface ScenarioGenerationDebuggingResult { +export type ScenarioGenerationDebuggingResult = { /** * Either the compiled scenario or an error message describing the scenario * generation failure. @@ -660,18 +656,18 @@ export interface ScenarioGenerationDebuggingResult { * compilation). */ unlockingCompilation?: CompilationResult; -} +}; /** * A {@link Compiler} is a wrapper around a specific * {@link CompilerConfiguration} that exposes a purely-functional interface and * allows for stronger type checking. */ -export interface Compiler< +export type Compiler< CompilationContext, Configuration extends AnyCompilerConfiguration, - ProgramState -> { + ProgramState, +> = { configuration: Configuration; /** * Generate the bytecode for the given script and compilation data. @@ -735,4 +731,4 @@ export interface Compiler< | (Debug extends true ? ScenarioGenerationDebuggingResult : Scenario); -} +}; diff --git a/src/lib/compiler/compiler-utils.ts b/src/lib/compiler/compiler-utils.ts index 39efeb55..0dbe3cf6 100644 --- a/src/lib/compiler/compiler-utils.ts +++ b/src/lib/compiler/compiler-utils.ts @@ -12,13 +12,13 @@ import type { AuthenticationProgramStateControlStack, AuthenticationProgramStateMinimum, AuthenticationProgramStateStack, - AuthenticationTemplate, BytecodeGenerationResult, CompilationContextBCH, CompilationData, CompilationResult, Compiler, CompilerConfiguration, + WalletTemplate, } from '../lib.js'; import { generateBytecodeMap, @@ -40,9 +40,9 @@ export const createCompilerGenerateBytecodeFunction = Configuration extends AnyCompilerConfiguration, ProgramState extends AuthenticationProgramStateControlStack & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - compilerConfiguration: Configuration + compilerConfiguration: Configuration, ) => ({ data, @@ -56,18 +56,18 @@ export const createCompilerGenerateBytecodeFunction = const result = compileScript( scriptId, data, - compilerConfiguration + compilerConfiguration, ); return ( debug === true ? result : result.success - ? { bytecode: result.bytecode, success: true } - : { - errorType: result.errorType, - errors: result.errors, - success: false, - } + ? { bytecode: result.bytecode, success: true } + : { + errorType: result.errorType, + errors: result.errors, + success: false, + } ) as Debug extends true ? CompilationResult : BytecodeGenerationResult; @@ -84,9 +84,9 @@ export const compilerConfigurationToCompilerBCH = < Configuration extends AnyCompilerConfiguration, ProgramState extends AuthenticationProgramStateControlStack & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - configuration: Configuration + configuration: Configuration, ): Compiler => { const generateBytecode = createCompilerGenerateBytecodeFunction(configuration); @@ -107,7 +107,7 @@ export const compilerConfigurationToCompilerBCH = < scenarioId, unlockingScriptId, }, - debug + debug, ), }; }; @@ -134,7 +134,7 @@ const nullHashLength = 32; * created authentication program */ export const createAuthenticationProgramEvaluationCommon = ( - evaluationBytecode: Uint8Array + evaluationBytecode: Uint8Array, ): AuthenticationProgramCommon => ({ inputIndex: 0, sourceOutputs: [ @@ -172,10 +172,10 @@ export const createAuthenticationProgramEvaluationCommon = ( * configuration – must include the `scripts` property */ export const createCompilerCommon = < - Configuration extends AnyCompilerConfiguration, - ProgramState extends AuthenticationProgramStateCommon + Configuration extends CompilerConfiguration, + ProgramState extends AuthenticationProgramStateCommon, >( - scriptsAndOverrides: Configuration + scriptsAndOverrides: Configuration, ): Compiler => compilerConfigurationToCompilerBCH({ ...{ @@ -216,7 +216,7 @@ export const compileCashAssembly = (script: string) => { return `CashAssembly compilation error:${result.errors.reduce( (all, { error, range }) => `${all} [${range.startLineNumber}, ${range.startColumn}]: ${error}`, - '' + '', )}`; }; @@ -229,8 +229,8 @@ export const compileCashAssembly = (script: string) => { * @param disassembledBytecode - the disassembled bytecode to re-assemble */ export const assembleBytecode = ( - opcodes: Readonly<{ [opcode: string]: Uint8Array }>, - disassembledBytecode: string + opcodes: { [opcode: string]: Uint8Array }, + disassembledBytecode: string, ) => { const configuration = { opcodes, @@ -280,17 +280,17 @@ export const assembleBytecodeBTC = (disassembledBytecode: string) => /** * Create a partial {@link CompilerConfiguration} from an - * {@link AuthenticationTemplate} by extracting and formatting the `scripts` and + * {@link WalletTemplate} by extracting and formatting the `scripts` and * `variables` properties. * - * Note, if this {@link AuthenticationTemplate} might be malformed, first - * validate it with {@link importAuthenticationTemplate}. + * Note, if this {@link WalletTemplate} might be malformed, first + * validate it with {@link importWalletTemplate}. * - * @param template - the {@link AuthenticationTemplate} from which to extract + * @param template - the {@link WalletTemplate} from which to extract * the compiler configuration */ -export const authenticationTemplateToCompilerConfiguration = ( - template: AuthenticationTemplate +export const walletTemplateToCompilerConfiguration = ( + template: WalletTemplate, ): Pick< CompilerConfiguration, | 'entityOwnership' @@ -304,33 +304,35 @@ export const authenticationTemplateToCompilerConfiguration = ( /** * Template scripts including virtualized test scripts. */ - const virtualizedScripts: AuthenticationTemplate['scripts'] = Object.entries( - template.scripts - ).reduce((all, [scriptId, script]) => { + const virtualizedScripts: WalletTemplate['scripts'] = Object.entries( + template.scripts, + ).reduce((all, [scriptId, script]) => { if ('tests' in script) { return { ...all, - ...Object.entries(script.tests).reduce< - AuthenticationTemplate['scripts'] - >((tests, [testId, test]) => { - const pushTestedScript = script.pushed === true; - const checkScriptId = `${scriptId}.${testId}.check`; - const virtualizedLockingScriptId = `${scriptId}.${testId}.lock`; - const virtualizedUnlockingScriptId = `${scriptId}.${testId}.unlock`; - return { - ...tests, - [checkScriptId]: { script: test.check }, - [virtualizedLockingScriptId]: { - script: pushTestedScript - ? `<${scriptId}> ${checkScriptId}` - : `${scriptId} ${checkScriptId}`, - }, - [virtualizedUnlockingScriptId]: { - script: test.setup ?? '', - unlocks: virtualizedLockingScriptId, - }, - }; - }, {}), + ...Object.entries(script.tests).reduce( + (tests, [testId, test]) => { + const pushTestedScript = script.pushed === true; + const checkScriptId = `${scriptId}.${testId}.check`; + const virtualizedLockingScriptId = `${scriptId}.${testId}.lock`; + const virtualizedUnlockingScriptId = `${scriptId}.${testId}.unlock`; + return { + ...tests, + [checkScriptId]: { script: test.check }, + [virtualizedLockingScriptId]: { + lockingType: 'p2sh20', + script: pushTestedScript + ? `<${scriptId}> ${checkScriptId}` + : `${scriptId} ${checkScriptId}`, + }, + [virtualizedUnlockingScriptId]: { + script: test.setup ?? '', + unlocks: virtualizedLockingScriptId, + }, + }; + }, + {}, + ), }; } return all; @@ -355,10 +357,10 @@ export const authenticationTemplateToCompilerConfiguration = ( ...entityVariables, [variableId]: entityId, }), - {} + {}, ), }), - {} + {}, ); const unlockingScripts = Object.entries(allScripts).reduce< CompilerConfiguration['unlockingScripts'] @@ -367,7 +369,7 @@ export const authenticationTemplateToCompilerConfiguration = ( 'unlocks' in def && (def.unlocks as string | undefined) !== undefined ? { ...all, [id]: def.unlocks } : all, - {} + {}, ); const unlockingScriptTimeLockTypes = Object.entries(allScripts).reduce< CompilerConfiguration['unlockingScriptTimeLockTypes'] @@ -376,7 +378,7 @@ export const authenticationTemplateToCompilerConfiguration = ( 'timeLockType' in def && def.timeLockType !== undefined ? { ...all, [id]: def.timeLockType } : all, - {} + {}, ); const lockingScriptTypes = Object.entries(allScripts).reduce< CompilerConfiguration['lockingScriptTypes'] @@ -386,7 +388,7 @@ export const authenticationTemplateToCompilerConfiguration = ( (def.lockingType as string | undefined) !== undefined ? { ...all, [id]: def.lockingType } : all, - {} + {}, ); const scenarios = template.scenarios === undefined diff --git a/src/lib/compiler/compiler.spec.ts b/src/lib/compiler/compiler.spec.ts index 00068ad7..fe42c92e 100644 --- a/src/lib/compiler/compiler.spec.ts +++ b/src/lib/compiler/compiler.spec.ts @@ -1,15 +1,15 @@ /* eslint-disable camelcase */ import test from 'ava'; -import type { AuthenticationTemplate } from '../lib.js'; +import type { WalletTemplate } from '../lib.js'; import { - authenticationTemplateP2pkh, - authenticationTemplateP2pkhNonHd, - authenticationTemplateToCompilerConfiguration, createCompilerCommon, hexToBin, stringify, stringifyTestVector, + walletTemplateP2pkh, + walletTemplateP2pkhNonHd, + walletTemplateToCompilerConfiguration, } from '../lib.js'; test('createCompilerCommon', (t) => { @@ -37,9 +37,9 @@ test('createCompilerCommon', (t) => { }); }); -test('authenticationTemplateToCompilerConfiguration: authenticationTemplateP2pkhNonHd', (t) => { - const configuration = authenticationTemplateToCompilerConfiguration( - authenticationTemplateP2pkhNonHd +test('walletTemplateToCompilerConfiguration: walletTemplateP2pkhNonHd', (t) => { + const configuration = walletTemplateToCompilerConfiguration( + walletTemplateP2pkhNonHd, ); t.deepEqual( configuration, @@ -66,14 +66,13 @@ test('authenticationTemplateToCompilerConfiguration: authenticationTemplateP2pkh }, }, }, - stringify(configuration) + stringify(configuration), ); }); -test('authenticationTemplateToCompilerConfiguration: authenticationTemplateP2pkh', (t) => { - const configuration = authenticationTemplateToCompilerConfiguration( - authenticationTemplateP2pkh - ); +test('walletTemplateToCompilerConfiguration: walletTemplateP2pkh', (t) => { + const configuration = + walletTemplateToCompilerConfiguration(walletTemplateP2pkh); t.deepEqual( configuration, { @@ -99,12 +98,12 @@ test('authenticationTemplateToCompilerConfiguration: authenticationTemplateP2pkh }, }, }, - stringify(configuration) + stringify(configuration), ); }); -test('authenticationTemplateToCompilerConfiguration: virtualized tests', (t) => { - const configuration = authenticationTemplateToCompilerConfiguration({ +test('walletTemplateToCompilerConfiguration: virtualized tests', (t) => { + const configuration = walletTemplateToCompilerConfiguration({ entities: {}, scripts: { add_two: { @@ -129,13 +128,18 @@ test('authenticationTemplateToCompilerConfiguration: virtualized tests', (t) => }, supported: ['BCH_2022_05'], version: 0, - } as AuthenticationTemplate); + } as WalletTemplate); t.deepEqual( configuration, { entityOwnership: {}, - lockingScriptTypes: {}, + lockingScriptTypes: { + 'add_two.0.lock': 'p2sh20', + 'add_two.1.lock': 'p2sh20', + 'message.0.lock': 'p2sh20', + 'push_three.0.lock': 'p2sh20', + }, scripts: { add_two: '<2> OP_ADD', 'add_two.0.check': '<3> OP_EQUAL', @@ -163,6 +167,6 @@ test('authenticationTemplateToCompilerConfiguration: virtualized tests', (t) => }, variables: {}, }, - stringifyTestVector(configuration) + stringifyTestVector(configuration), ); }); diff --git a/src/lib/compiler/compiler.ts b/src/lib/compiler/compiler.ts index c7568679..ce35f2c8 100644 --- a/src/lib/compiler/compiler.ts +++ b/src/lib/compiler/compiler.ts @@ -7,4 +7,4 @@ export * from './compiler-utils.js'; export * from './scenarios.js'; export * from './p2pkh-utils.js'; export * from './standard/standard.js'; -export * from './template-types.js'; +export * from '../engine/types/template-types.js'; diff --git a/src/lib/compiler/p2pkh-utils.ts b/src/lib/compiler/p2pkh-utils.ts index 0f02cd32..ceb5d835 100644 --- a/src/lib/compiler/p2pkh-utils.ts +++ b/src/lib/compiler/p2pkh-utils.ts @@ -1,12 +1,9 @@ import { lockingBytecodeToCashAddress } from '../address/address.js'; -import type { - AuthenticationTemplate, - CashAddressNetworkPrefix, -} from '../lib.js'; -import { importAuthenticationTemplate } from '../schema/schema.js'; +import type { CashAddressNetworkPrefix, WalletTemplate } from '../lib.js'; +import { importWalletTemplate } from '../schema/schema.js'; -import { authenticationTemplateToCompilerBCH } from './compiler-bch/compiler-bch.js'; -import { authenticationTemplateP2pkh } from './standard/standard.js'; +import { walletTemplateToCompilerBCH } from './compiler-bch/compiler-bch.js'; +import { walletTemplateP2pkh } from './standard/standard.js'; /** * Derive the P2PKH locking bytecode at the provided index of the provided HD @@ -29,10 +26,8 @@ export const hdPrivateKeyToP2pkhLockingBytecode = ({ */ addressIndex: number; }) => { - const compiler = authenticationTemplateToCompilerBCH( - importAuthenticationTemplate( - authenticationTemplateP2pkh - ) as AuthenticationTemplate + const compiler = walletTemplateToCompilerBCH( + importWalletTemplate(walletTemplateP2pkh) as WalletTemplate, ); const lockingBytecode = compiler.generateBytecode({ data: { hdKeys: { addressIndex, hdPrivateKeys: { owner: hdKey } } }, @@ -70,5 +65,5 @@ export const hdPrivateKeyToP2pkhAddress = ({ }) => lockingBytecodeToCashAddress( hdPrivateKeyToP2pkhLockingBytecode({ addressIndex, hdKey }), - prefix + prefix, ) as string; diff --git a/src/lib/compiler/scenarios.spec.ts b/src/lib/compiler/scenarios.spec.ts index 2e07f2e6..056cacd4 100644 --- a/src/lib/compiler/scenarios.spec.ts +++ b/src/lib/compiler/scenarios.spec.ts @@ -2,26 +2,26 @@ import test from 'ava'; import type { - AuthenticationTemplate, ExtendedScenarioDefinition, PartialExactOptional, Scenario, + WalletTemplate, } from '../lib.js'; import { - authenticationTemplateP2pkh, - authenticationTemplateP2pkhNonHd, - authenticationTemplateToCompilerBCH, - authenticationTemplateToCompilerConfiguration, extendedScenarioDefinitionToCompilationData, extendScenarioDefinition, extendScenarioDefinitionData, generateDefaultScenarioDefinition, generateExtendedScenario, hexToBin, - importAuthenticationTemplate, + importWalletTemplate, sha256, sha512, stringifyTestVector, + walletTemplateP2pkh, + walletTemplateP2pkhNonHd, + walletTemplateToCompilerBCH, + walletTemplateToCompilerConfiguration, } from '../lib.js'; import { cashChannelsJson } from '../transaction/transaction-e2e.spec.helper.js'; @@ -50,13 +50,13 @@ test('generateDefaultScenarioDefinition: empty', (t) => { locktime: 0, outputs: [ { - lockingBytecode: {}, + lockingBytecode: '6a076c696261757468', }, ], version: 2, }, }, - stringifyTestVector(scenario) + stringifyTestVector(scenario), ); }); @@ -75,7 +75,7 @@ test('generateDefaultScenarioDefinition: missing sha256', (t) => { t.deepEqual( scenario, 'An implementations of "sha256" is required to generate defaults for HD keys, but the "sha256" property is not included in this compiler configuration.', - stringifyTestVector(scenario) + stringifyTestVector(scenario), ); }); @@ -94,7 +94,7 @@ test('generateDefaultScenarioDefinition: missing sha512', (t) => { t.deepEqual( scenario, 'An implementations of "sha512" is required to generate defaults for HD keys, but the "sha512" property is not included in this compiler configuration.', - stringifyTestVector(scenario) + stringifyTestVector(scenario), ); }); @@ -106,7 +106,7 @@ test('extendScenarioDefinitionData: empty', (t) => { test('extendScenarioDefinitionData: 1', (t) => { const extended = extendScenarioDefinitionData( { hdKeys: { hdPublicKeys: { b: '(hd public key)' } } }, - { bytecode: { test: '<"abc">' } } + { bytecode: { test: '<"abc">' } }, ); t.deepEqual( extended, @@ -114,7 +114,7 @@ test('extendScenarioDefinitionData: 1', (t) => { bytecode: { test: '<"abc">' }, hdKeys: { hdPublicKeys: { b: '(hd public key)' } }, }, - stringifyTestVector(extended) + stringifyTestVector(extended), ); }); @@ -149,13 +149,13 @@ test('extendScenarioDefinition: default', (t) => { locktime: 0, outputs: [ { - lockingBytecode: {}, + lockingBytecode: '6a076c696261757468', }, ], version: 2, }, }, - stringifyTestVector(extended) + stringifyTestVector(extended), ); }); @@ -204,7 +204,7 @@ test('extendScenarioDefinition: complex extend', (t) => { }, }, transaction: {}, - } + }, ); t.deepEqual( extended, @@ -249,7 +249,7 @@ test('extendScenarioDefinition: complex extend', (t) => { version: 2, }, }, - stringifyTestVector(extended) + stringifyTestVector(extended), ); }); @@ -282,7 +282,7 @@ test('extendScenarioDefinition: complex extend (2)', (t) => { currentBlockTime: 1231469665, }, sourceOutputs: [{ valueSatoshis: 'ffffffffffffffff' }], - } + }, ); t.deepEqual( extended, @@ -310,7 +310,7 @@ test('extendScenarioDefinition: complex extend (2)', (t) => { }, sourceOutputs: [{ valueSatoshis: 'ffffffffffffffff' }], }, - stringifyTestVector(extended) + stringifyTestVector(extended), ); }); @@ -322,7 +322,7 @@ test('generateExtendedScenario: unknown scenario identifier', (t) => { t.deepEqual( extended, 'Cannot extend scenario "unknown": a scenario with the identifier unknown is not included in this compiler configuration.', - stringifyTestVector(extended) + stringifyTestVector(extended), ); }); @@ -338,9 +338,9 @@ test('extendedScenarioDefinitionToCompilationData: empty hdKeys', (t) => { t.deepEqual(extended, { hdKeys: {} }, stringifyTestVector(extended)); }); -test('generateDefaultScenarioDefinition: authenticationTemplateP2pkhNonHd', (t) => { - const configuration = authenticationTemplateToCompilerConfiguration( - authenticationTemplateP2pkhNonHd +test('generateDefaultScenarioDefinition: walletTemplateP2pkhNonHd', (t) => { + const configuration = walletTemplateToCompilerConfiguration( + walletTemplateP2pkhNonHd, ); const scenario = generateDefaultScenarioDefinition(configuration); @@ -360,19 +360,17 @@ test('generateDefaultScenarioDefinition: authenticationTemplateP2pkhNonHd', (t) transaction: { inputs: [{ unlockingBytecode: ['slot'] }], locktime: 0, - outputs: [{ lockingBytecode: {} }], + outputs: [{ lockingBytecode: '6a076c696261757468' }], version: 2, }, }, - stringifyTestVector(scenario) + stringifyTestVector(scenario), ); }); -test('generateDefaultScenarioDefinition: authenticationTemplateP2pkh', (t) => { +test('generateDefaultScenarioDefinition: walletTemplateP2pkh', (t) => { const configuration = { - ...authenticationTemplateToCompilerConfiguration( - authenticationTemplateP2pkh - ), + ...walletTemplateToCompilerConfiguration(walletTemplateP2pkh), sha256, sha512, }; @@ -395,11 +393,11 @@ test('generateDefaultScenarioDefinition: authenticationTemplateP2pkh', (t) => { transaction: { inputs: [{ unlockingBytecode: ['slot'] }], locktime: 0, - outputs: [{ lockingBytecode: {} }], + outputs: [{ lockingBytecode: '6a076c696261757468' }], version: 2, }, }, - stringifyTestVector(scenario) + stringifyTestVector(scenario), ); }); @@ -407,11 +405,11 @@ export const expectScenarioGenerationResult = test.macro< [ string | undefined, string | undefined, - PartialExactOptional, + PartialExactOptional, Scenario | string, PartialExactOptional< - ReturnType - >? + ReturnType + >?, ] >( ( @@ -420,10 +418,10 @@ export const expectScenarioGenerationResult = test.macro< unlockingScriptId, templateOverrides, expectedResult, - configurationOverrides - // eslint-disable-next-line max-params + configurationOverrides, + // eslint-disable-next-line @typescript-eslint/max-params ) => { - const configuration = authenticationTemplateToCompilerConfiguration({ + const configuration = walletTemplateToCompilerConfiguration({ ...{ entities: { owner: { @@ -435,25 +433,47 @@ export const expectScenarioGenerationResult = test.macro< }, }, scripts: { - lock: { - lockingType: 'standard', + compileTimeAssert: { + name: 'Var1 Padded', + pushed: true, + script: + '$( OP_DUP <0> OP_GREATERTHAN OP_VERIFY OP_DUP <0xff7f> OP_LESSTHANOREQUAL OP_VERIFY <2> OP_NUM2BIN)', + tests: { + is_within_range: { + check: 'OP_SIZE <2> OP_EQUALVERIFY OP_BIN2NUM OP_EQUAL', + invalid: ['above', 'below'], + name: 'Is Within Range', + passes: ['within'], + }, + }, + }, + p2pkhLock: { + script: + 'OP_DUP OP_HASH160 <$( OP_HASH160)> OP_EQUALVERIFY OP_CHECKSIG', + }, + p2pkhUnlock: { + script: ' ', + unlocks: 'p2pkhLock', + }, + p2sh20Lock: { + lockingType: 'p2sh20', script: ' OP_DROP OP_DROP OP_1', }, - unlock: { + p2sh20Unlock: { script: '', - unlocks: 'lock', + unlocks: 'p2sh20Lock', }, }, supported: ['BCH_2020_05'], version: 0, }, ...templateOverrides, - } as AuthenticationTemplate); + } as WalletTemplate); const compiler = createCompilerBCH({ ...configuration, ...(configurationOverrides as Partial< - ReturnType + ReturnType >), }); @@ -466,17 +486,19 @@ export const expectScenarioGenerationResult = test.macro< scenario, expectedResult, `- \nResult: ${stringifyTestVector( - scenario - )}\n\nExpected:\n ${stringifyTestVector(expectedResult)}\n` + scenario, + )}\n\nExpected:\n ${stringifyTestVector( + expectedResult, + )}\n\nConfiguration: ${stringifyTestVector(configuration)}`, ); - } + }, ); test( 'generateScenario: deep extend', expectScenarioGenerationResult, 'c', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { @@ -517,7 +539,7 @@ test( keys: { privateKeys: { another: hexToBin( - '00000000000000000000000000000000000000000000000000000000000000ff' + '00000000000000000000000000000000000000000000000000000000000000ff', ), }, }, @@ -526,7 +548,9 @@ test( inputIndex: 0, sourceOutputs: [ { - lockingBytecode: hexToBin('03010203757551'), + lockingBytecode: hexToBin( + 'a9147ab197d4888698145e7a0af625f8181a95604cd887', + ), valueSatoshis: 0n, }, ], @@ -535,32 +559,32 @@ test( { outpointIndex: 0, outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000001' + '0000000000000000000000000000000000000000000000000000000000000001', ), sequenceNumber: 0, unlockingBytecode: hexToBin( - '41d1851c0a464c5d6b5b15452327e187f5c19d0805a2ce821b00b239dcc2de2112335cf481bed0f69c780adf9eda30c3e0706b893b53e0a58fa9fad0628e30d0da41' + '41fd8c2293325a5e85ba2683aa41a3ad483a3917db24b512c396b696a5ccf023ffdbf3883a589271ff90589f0bcbc1ab69b966257df71c0dba78aea4e4064c5c00410703010203757551', ), }, ], locktime: 0, outputs: [ { - lockingBytecode: hexToBin('03010203757551'), + lockingBytecode: hexToBin('6a076c696261757468'), valueSatoshis: 0n, }, ], version: 2, }, }, - } + }, ); test( 'generateScenario: cyclical extend', expectScenarioGenerationResult, 'c', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { extends: 'c' }, @@ -568,47 +592,47 @@ test( c: { extends: 'b' }, }, }, - 'Cannot generate scenario "c": Cannot extend scenario "c": scenario "c" extends itself. Scenario inheritance path: c β†’ b β†’ a' + 'Cannot generate scenario "c": Cannot extend scenario "c": scenario "c" extends itself. Scenario inheritance path: c β†’ b β†’ a', ); test( 'generateScenario: no scenarios', expectScenarioGenerationResult, 'does_not_exist', - 'unlock', + 'p2sh20Unlock', { scenarios: undefined }, - 'Cannot generate scenario "does_not_exist": a scenario definition with the identifier does_not_exist is not included in this compiler configuration.' + 'Cannot generate scenario "does_not_exist": a scenario definition with the identifier does_not_exist is not included in this compiler configuration.', ); test( 'generateScenario: unknown scenario ID', expectScenarioGenerationResult, 'does_not_exist', - 'unlock', + 'p2sh20Unlock', { scenarios: { another: {} }, }, - 'Cannot generate scenario "does_not_exist": a scenario definition with the identifier does_not_exist is not included in this compiler configuration.' + 'Cannot generate scenario "does_not_exist": a scenario definition with the identifier does_not_exist is not included in this compiler configuration.', ); test( 'generateScenario: invalid bytecode value', expectScenarioGenerationResult, 'a', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { data: { bytecode: { var1: 'invalid' } } }, }, }, - 'Cannot generate scenario "a". Compilation error while generating bytecode for "var1": [1, 1] Unknown identifier "invalid".' + 'Cannot generate scenario "a". Compilation error while generating bytecode for "var1": [1, 1] Unknown identifier "invalid".', ); -test.failing( +test( 'generateScenario: no scenario ID', expectScenarioGenerationResult, undefined, - 'unlock', + 'p2pkhUnlock', { scenarios: { a: {}, @@ -628,7 +652,7 @@ test.failing( keys: { privateKeys: { another: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000001' + '0000000000000000000000000000000000000000000000000000000000000001', ), }, }, @@ -637,7 +661,9 @@ test.failing( inputIndex: 0, sourceOutputs: [ { - lockingBytecode: hexToBin(''), + lockingBytecode: hexToBin( + '76a9141431b2926e6c7953f3dc3f2c5c19fe2d2dc57cfc88ac', + ), valueSatoshis: 0n, }, ], @@ -646,23 +672,25 @@ test.failing( { outpointIndex: 0, outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000001', ), sequenceNumber: 0, - unlockingBytecode: hexToBin(''), + unlockingBytecode: hexToBin( + '4133afdb65a3c9d2b50f32bc0d6750473425b3c21b138c66596182f072cc2f49d956b71e0183f1aa5620616405ebff584a1e3d4584e9c83b3cd8cc669295db73f641210309c64e4fbc61f4ddc950eb0acff2047850b864d6fb8198070a946cda5d72e5ba', + ), }, ], locktime: 0, outputs: [ { - lockingBytecode: hexToBin(''), + lockingBytecode: hexToBin('6a076c696261757468'), valueSatoshis: 0n, }, ], version: 2, }, }, - } + }, ); test( @@ -685,7 +713,7 @@ test( keys: { privateKeys: { another: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000001' + '0000000000000000000000000000000000000000000000000000000000000001', ), }, }, @@ -703,7 +731,7 @@ test( { outpointIndex: 0, outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000001' + '0000000000000000000000000000000000000000000000000000000000000001', ), sequenceNumber: 0, unlockingBytecode: hexToBin(''), @@ -712,34 +740,34 @@ test( locktime: 0, outputs: [ { - lockingBytecode: hexToBin(''), + lockingBytecode: hexToBin('6a076c696261757468'), valueSatoshis: 0n, }, ], version: 2, }, }, - } + }, ); test( 'generateScenario: mismatched source outputs and transaction inputs', expectScenarioGenerationResult, 'a', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { transaction: { inputs: [{}, {}] } }, }, }, - 'Cannot generate scenario "a": could not match source outputs with inputs - "sourceOutputs" must be the same length as "transaction.inputs".' + 'Cannot generate scenario "a": could not match source outputs with inputs - "sourceOutputs" must be the same length as "transaction.inputs".', ); test( 'generateScenario: ambiguous input under test', expectScenarioGenerationResult, 'a', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { @@ -747,14 +775,14 @@ test( }, }, }, - 'Cannot generate scenario "a": Failed compilation of source output at index 0: Cannot resolve "var1" - the "bytecode" property was not provided in the compilation data. Failed compilation of transaction output at index 0: No script with an ID of "unknown" was provided in the compiler configuration.' + 'Cannot generate scenario "a": Failed compilation of source output at index 0: Cannot resolve "var1" - the "bytecode" property was not provided in the compilation data. Failed compilation of transaction output at index 0: No script with an ID of "unknown" was provided in the compiler configuration.', ); test( 'generateScenario: no locking script', expectScenarioGenerationResult, 'a', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { @@ -762,10 +790,10 @@ test( }, }, }, - 'Cannot generate scenario "a" using unlocking script "unlock": the locking script unlocked by "unlock" is not provided in this compiler configuration.', + 'Cannot generate scenario "a" using unlocking script "p2sh20Unlock": the locking script unlocked by "p2sh20Unlock" is not provided in this compiler configuration.', { unlockingScripts: undefined, - } + }, ); test.failing( @@ -783,14 +811,14 @@ test.failing( 'Cannot generate scenario "a": Cannot generate locking bytecode for output 0: this output is set to use the script unlocked by the unlocking script under test, but an unlocking script ID was not provided for scenario generation.', { unlockingScripts: undefined, - } + }, ); -test.failing( +test( 'generateScenario: simple transaction, locking bytecode override', expectScenarioGenerationResult, 'a', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { @@ -804,7 +832,9 @@ test.failing( }, }, }, - sourceOutputs: [{ valueSatoshis: 'ffffffffffffffff' }], + sourceOutputs: [ + { lockingBytecode: ['slot'], valueSatoshis: 'ffffffffffffffff' }, + ], transaction: { outputs: [ { @@ -821,13 +851,13 @@ test.failing( }, }, scripts: { - lock: { + p2sh20Lock: { lockingType: 'standard', script: 'OP_DROP OP_DROP OP_1', }, - unlock: { + p2sh20Unlock: { script: '', - unlocks: 'lock', + unlocks: 'p2sh20Lock', }, }, }, @@ -846,7 +876,7 @@ test.failing( keys: { privateKeys: { another: hexToBin( - '00000000000000000000000000000000000000000000000000000000000000ff' + '00000000000000000000000000000000000000000000000000000000000000ff', ), }, }, @@ -855,7 +885,7 @@ test.failing( inputIndex: 0, sourceOutputs: [ { - lockingBytecode: hexToBin(''), + lockingBytecode: hexToBin('75557551'), valueSatoshis: 0xffffffffffffffffn, }, ], @@ -864,10 +894,12 @@ test.failing( { outpointIndex: 0, outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000001', ), sequenceNumber: 0, - unlockingBytecode: hexToBin(''), + unlockingBytecode: hexToBin( + '419f16a55d6a75256ed6618a12d058f13d3792a3970ea75f11f670a886341bbd9d6e48b9f0cc6ff5074a1b15dd2e398150d4dcc184af8aaecbdc26fb16d15d8b7441', + ), }, ], locktime: 0, @@ -884,18 +916,19 @@ test.failing( version: 3, }, }, - } + }, ); -test.failing( +test( 'generateScenario: complex transaction, locking bytecode variable override', expectScenarioGenerationResult, 'a', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { data: { bytecode: { var1: '0x010203' } }, + sourceOutputs: [{}, { lockingBytecode: ['slot'] }], transaction: { inputs: [ { @@ -947,7 +980,7 @@ test.failing( keys: { privateKeys: { another: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000001' + '0000000000000000000000000000000000000000000000000000000000000001', ), }, }, @@ -956,7 +989,15 @@ test.failing( inputIndex: 1, sourceOutputs: [ { - lockingBytecode: hexToBin(''), + lockingBytecode: hexToBin( + 'a9147ab197d4888698145e7a0af625f8181a95604cd887', + ), + valueSatoshis: 0n, + }, + { + lockingBytecode: hexToBin( + 'a9147ab197d4888698145e7a0af625f8181a95604cd887', + ), valueSatoshis: 0n, }, ], @@ -965,46 +1006,54 @@ test.failing( { outpointIndex: 1, outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000001' + '0000000000000000000000000000000000000000000000000000000000000001', ), sequenceNumber: 1, unlockingBytecode: hexToBin('beef'), }, { - outpointIndex: 0, + outpointIndex: 1, outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000001', ), sequenceNumber: 0, - unlockingBytecode: hexToBin(''), + unlockingBytecode: hexToBin( + '41ceed7320920a9b4035bc4afbb6118635113595a46bd5d64ee3651bb2e88986177b677219e864d639a405c4d0ab28a103a8b3df0cf49b6a0f1cd8d6d95dd9aa71410703010203757551', + ), }, ], locktime: 4294967295, outputs: [ { - lockingBytecode: hexToBin('03010203757551'), + lockingBytecode: hexToBin( + 'a9147ab197d4888698145e7a0af625f8181a95604cd887', + ), valueSatoshis: 1000n, }, { - lockingBytecode: hexToBin('03010203757551'), + lockingBytecode: hexToBin( + 'a9147ab197d4888698145e7a0af625f8181a95604cd887', + ), valueSatoshis: 0n, }, { - lockingBytecode: hexToBin('03030405757551'), + lockingBytecode: hexToBin( + 'a9144e6f989ad736aaffd2f895768f274579722fc73b87', + ), valueSatoshis: 0xffffffffffffffffn, }, ], version: 3, }, }, - } + }, ); -test.failing( +test( 'generateScenario: locking bytecode generation failure', expectScenarioGenerationResult, 'a', - 'unlock', + 'p2sh20Unlock', { scenarios: { a: { @@ -1018,16 +1067,35 @@ test.failing( }, }, }, - 'Cannot generate scenario "a": Cannot generate locking bytecode for output 0: Compilation error while generating bytecode for "var1": [1, 1] Unknown identifier "broken".' + 'Cannot generate scenario "a": Failed compilation of source output at index 0: Cannot resolve "var1" - the "bytecode" property was not provided in the compilation data. Failed compilation of transaction output at index 0: Could not compile scenario "data.bytecode": Compilation error while generating bytecode for "var1": [1, 1] Unknown identifier "broken".', +); + +test( + 'generateScenario: invalid scenario for tested script', + expectScenarioGenerationResult, + 'above', + 'compileTimeAssert.is_within_range.unlock', + { + scenarios: { + above: { + data: { + bytecode: { + var1: '32768', + }, + }, + }, + }, + }, + 'Cannot generate scenario "above": Failed compilation of source output at index 0: Compilation error in resolved script "compileTimeAssert": [1, 1] Failed to reduce evaluation: Program failed an OP_VERIFY operation.', ); -test.failing('generateScenario: cash-channels - after_payment_time', (t) => { - const template = importAuthenticationTemplate(cashChannelsJson); +test('generateScenario: cash-channels-v1 - after_payment_time', (t) => { + const template = importWalletTemplate(cashChannelsJson); if (typeof template === 'string') { t.fail(template); return; } - const compiler = authenticationTemplateToCompilerBCH(template); + const compiler = walletTemplateToCompilerBCH(template); const scenario = compiler.generateScenario({ scenarioId: 'after_payment_time', unlockingScriptId: 'execute_authorization', @@ -1052,13 +1120,13 @@ test.failing('generateScenario: cash-channels - after_payment_time', (t) => { keys: { privateKeys: { owner: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000001' + '0000000000000000000000000000000000000000000000000000000000000001', ), rate_oracle: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000003' + '0000000000000000000000000000000000000000000000000000000000000003', ), receiver: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000004' + '0000000000000000000000000000000000000000000000000000000000000005', ), }, }, @@ -1067,8 +1135,10 @@ test.failing('generateScenario: cash-channels - after_payment_time', (t) => { inputIndex: 0, sourceOutputs: [ { - lockingBytecode: undefined, - valueSatoshis: hexToBin('204e000000000000'), + lockingBytecode: hexToBin( + 'a914582d988b353dbe4d34863606fc7fac13a026f30187', + ), + valueSatoshis: 20000n, }, ], transaction: { @@ -1076,25 +1146,27 @@ test.failing('generateScenario: cash-channels - after_payment_time', (t) => { { outpointIndex: 0, outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000001', ), sequenceNumber: 0, - unlockingBytecode: undefined, + unlockingBytecode: hexToBin( + '412f8a7bef0803cf707cd971e50c3d0ecd432f361d40b22dddb548972522c49cf7d4d55c8eea3ce2e69e6db08857ebd503fc0f0bfecc1ba2fc29fd48d51b5f5a9f414c6902000000d5a45bffe65ef500725b4bc16e60ba39910d364324f702be75ed825c1c78a50c8cb9012517c817fead650287d61bdd9c68803b6bf9c64133dcab3e65b5a50cb9000000000000000000000000000000000000000000000000000000000000000100000000e24c4e210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817987c63766b56795f795779765c79a26958805779588057795880577958807e7e766b7e7e7e7cbbb16d6d5879020202004c92886c537958807e7c6c21022f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4766b7ea9882102f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9bb57795779815193528057797e7ea9011702a9147b01877e7e7e5579817b9458807c7e7c7eaa7c7e7e7e7e7e7e7ea86c7653797bad7b01407f757b7bba67ac6808204e00000000000004000000000880bf345e4100000000021027473045022100a42985db397f96f2dbec3846026c7e0d77a9de8e7a3239e6d241e1123e123e9602202bc889045417638a75ba423d567fa50a6f49ab9d23657dacdf09311db37b9be51477bf07ad61ce9c0ed3b026db9f6201a80a6afcec02042902e803035553440480bf345e473045022100f32fb0c45c9b0915455b6c8dbadb61f05f6b6e5cd74bce81e9fcadadbae466ba02207f7aa8052816478fc104d44b14161bbdc9011cadcc69b52f60337c0767e6622b514ce2210279be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f817987c63766b56795f795779765c79a26958805779588057795880577958807e7e766b7e7e7e7cbbb16d6d5879020200886c537958807e7c6c21022f8bde4d1a07209355b4a7250a5c5128e88b84bddc619ab7cba8d569b240efe4766b7ea9882102f9308a019258c31049344f85f89d5229b531c845836f99b08601f113bce036f9bb57795779815193528057797e7ea9011702a9147b01877e7e7e5579817b9458807c7e7c7eaa7c7e7e7e7e7e7e7ea86c7653797bad7b01407f757b7bba67ac68', + ), }, ], locktime: 1580515200, outputs: [ { lockingBytecode: hexToBin( - 'a9149a97dc2531b9b9af6319aab57ea369284289998987' + 'a91456e3217f1b623d9d566ee2e648cf6c74ac6a9b1687', ), - valueSatoshis: hexToBin('1027000000000000'), + valueSatoshis: 10000n, }, ], version: 2, }, }, }, - stringifyTestVector(scenario) + stringifyTestVector(scenario), ); }); diff --git a/src/lib/compiler/scenarios.ts b/src/lib/compiler/scenarios.ts index 63dfe287..f5accb38 100644 --- a/src/lib/compiler/scenarios.ts +++ b/src/lib/compiler/scenarios.ts @@ -9,11 +9,6 @@ import { deriveHdPrivateNodeFromSeed, encodeHdPrivateKey } from '../key/key.js'; import { compileScriptRaw, stringifyErrors } from '../language/language.js'; import type { AnyCompilerConfigurationIgnoreOperations, - AuthenticationTemplateKey, - AuthenticationTemplateScenario, - AuthenticationTemplateScenarioBytecode, - AuthenticationTemplateScenarioData, - AuthenticationTemplateScenarioOutput, CompilationContextBCH, CompilationData, CompilationError, @@ -23,22 +18,21 @@ import type { Output, Scenario, ScenarioGenerationDebuggingResult, + WalletTemplateKey, + WalletTemplateScenario, + WalletTemplateScenarioBytecode, + WalletTemplateScenarioData, + WalletTemplateScenarioOutput, } from '../lib.js'; import { CompilerDefaults } from './compiler-defaults.js'; /** - * The default `lockingBytecode` value for scenario outputs is a new empty - * object (`{}`). - */ -const defaultScenarioOutputLockingBytecode = () => ({}); - -/** - * The contents of an {@link AuthenticationTemplateScenario} without the `name` + * The contents of an {@link WalletTemplateScenario} without the `name` * and `description`. */ export type ScenarioDefinition = Pick< - AuthenticationTemplateScenario, + WalletTemplateScenario, 'data' | 'sourceOutputs' | 'transaction' >; @@ -67,17 +61,18 @@ export type ExtendedScenarioDefinition = Required< * extended by all the configuration's scenarios. * * For details on default scenario generation, see - * {@link AuthenticationTemplateScenario.extends}. + * {@link WalletTemplateScenario.extends}. * * @param configuration - the compiler configuration from which to generate the * default scenario */ // eslint-disable-next-line complexity export const generateDefaultScenarioDefinition = < - Configuration extends AnyCompilerConfigurationIgnoreOperations, - CompilationContext + Configuration extends + AnyCompilerConfigurationIgnoreOperations, + CompilationContext, >( - configuration: Configuration + configuration: Configuration, ): ExtendedScenarioDefinition | string => { const { variables, entityOwnership } = configuration; @@ -86,8 +81,8 @@ export const generateDefaultScenarioDefinition = < ? [] : Object.entries(variables) .filter( - (entry): entry is [string, AuthenticationTemplateKey] => - entry[1].type === 'Key' + (entry): entry is [string, WalletTemplateKey] => + entry[1].type === 'Key', ) .map(([id]) => id); @@ -97,8 +92,8 @@ export const generateDefaultScenarioDefinition = < : Object.keys( Object.values(entityOwnership).reduce( (all, entityId) => ({ ...all, [entityId]: true }), - {} - ) + {}, + ), ); const valueMap = [...keyVariableIds, ...entityIds] @@ -108,7 +103,7 @@ export const generateDefaultScenarioDefinition = < ...all, [id]: bigIntToBinUint256BEClamped(BigInt(index + 1)), }), - {} + {}, ); const privateKeys = @@ -123,7 +118,7 @@ export const generateDefaultScenarioDefinition = < [variableId]: binToHex(valueMap[variableId]!), } : all, - {} + {}, ); const defaultScenario: ExtendedScenarioDefinition = { @@ -140,7 +135,12 @@ export const generateDefaultScenarioDefinition = < transaction: { inputs: [{ unlockingBytecode: ['slot'] }], locktime: CompilerDefaults.defaultScenarioTransactionLocktime as const, - outputs: [{ lockingBytecode: defaultScenarioOutputLockingBytecode() }], + outputs: [ + { + lockingBytecode: + CompilerDefaults.defaultScenarioOutputLockingBytecode as string, + }, + ], version: CompilerDefaults.defaultScenarioTransactionVersion as const, }, }; @@ -149,7 +149,7 @@ export const generateDefaultScenarioDefinition = < variables === undefined ? false : Object.values(variables).findIndex( - (variable) => variable.type === 'HdKey' + (variable) => variable.type === 'HdKey', ) !== -1; if (!hasHdKeys) { @@ -175,14 +175,14 @@ export const generateDefaultScenarioDefinition = < // eslint-disable-next-line @typescript-eslint/no-non-null-assertion valueMap[entityId]!, assumeValid, - crypto + crypto, ); const hdPrivateKey = encodeHdPrivateKey( { network: 'mainnet', node: masterNode, }, - crypto + crypto, ); return { ...all, [entityId]: hdPrivateKey }; @@ -211,8 +211,8 @@ export const generateDefaultScenarioDefinition = < */ // eslint-disable-next-line complexity export const extendScenarioDefinitionData = ( - parentData: NonNullable, - childData: NonNullable + parentData: NonNullable, + childData: NonNullable, ) => ({ ...parentData, ...childData, @@ -273,10 +273,10 @@ export const extendScenarioDefinitionData = ( */ // eslint-disable-next-line complexity export const extendScenarioDefinition = < - ParentScenarioType extends AuthenticationTemplateScenario + ParentScenarioType extends WalletTemplateScenario, >( parentScenario: ParentScenarioType, - childScenario: AuthenticationTemplateScenario + childScenario: WalletTemplateScenario, ) => ({ ...(parentScenario.data === undefined && childScenario.data === undefined @@ -284,7 +284,7 @@ export const extendScenarioDefinition = < : { data: extendScenarioDefinitionData( parentScenario.data ?? {}, - childScenario.data ?? {} + childScenario.data ?? {}, ), }), ...(parentScenario.transaction === undefined && @@ -303,9 +303,9 @@ export const extendScenarioDefinition = < sourceOutputs: childScenario.sourceOutputs ?? parentScenario.sourceOutputs, }), - } as ParentScenarioType extends ExtendedScenarioDefinition + }) as ParentScenarioType extends ExtendedScenarioDefinition ? ExtendedScenarioDefinition - : ScenarioDefinition); + : ScenarioDefinition; /** * Generate the full scenario that is extended by the provided scenario @@ -314,8 +314,9 @@ export const extendScenarioDefinition = < */ // eslint-disable-next-line complexity export const generateExtendedScenario = < - Configuration extends AnyCompilerConfigurationIgnoreOperations, - CompilationContext + Configuration extends + AnyCompilerConfigurationIgnoreOperations, + CompilationContext, >({ configuration, scenarioId, @@ -338,13 +339,13 @@ export const generateExtendedScenario = < }): ExtendedScenarioDefinition | string => { if (scenarioId === undefined) { return generateDefaultScenarioDefinition( - configuration + configuration, ); } if (sourceScenarioIds.includes(scenarioId)) { return `Cannot extend scenario "${scenarioId}": scenario "${scenarioId}" extends itself. Scenario inheritance path: ${sourceScenarioIds.join( - ' β†’ ' + ' β†’ ', )}`; } const scenario = configuration.scenarios?.[scenarioId]; @@ -354,7 +355,7 @@ export const generateExtendedScenario = < const parentScenario = scenario.extends === undefined ? generateDefaultScenarioDefinition( - configuration + configuration, ) : generateExtendedScenario({ configuration, @@ -377,7 +378,7 @@ export const generateExtendedScenario = < */ // eslint-disable-next-line complexity export const extendedScenarioDefinitionToCompilationData = ( - definition: Required> & ScenarioDefinition + definition: Required> & ScenarioDefinition, ): CompilationData => ({ ...(definition.data.currentBlockHeight === undefined ? {} @@ -417,7 +418,7 @@ export const extendedScenarioDefinitionToCompilationData = ( keys: { privateKeys: Object.entries(definition.data.keys.privateKeys).reduce( (all, [id, hex]) => ({ ...all, [id]: hexToBin(hex) }), - {} + {}, ), }, } @@ -426,11 +427,12 @@ export const extendedScenarioDefinitionToCompilationData = ( /** * Extend a {@link CompilationData} object with the compiled result of the - * bytecode scripts provided by an {@link AuthenticationTemplateScenarioData}. + * bytecode scripts provided by an {@link WalletTemplateScenarioData}. */ export const extendCompilationDataWithScenarioBytecode = < - Configuration extends AnyCompilerConfigurationIgnoreOperations, - CompilationContext + Configuration extends + AnyCompilerConfigurationIgnoreOperations, + CompilationContext, >({ compilationData, configuration, @@ -445,10 +447,10 @@ export const extendCompilationDataWithScenarioBytecode = < */ configuration: Configuration; /** - * The {@link AuthenticationTemplateScenarioData.bytecode} property. + * The {@link WalletTemplateScenarioData.bytecode} property. */ scenarioDataBytecodeScripts: NonNullable< - AuthenticationTemplateScenarioData['bytecode'] + WalletTemplateScenarioData['bytecode'] >; }) => { const prefixBytecodeScriptId = (id: string) => @@ -460,7 +462,7 @@ export const extendCompilationDataWithScenarioBytecode = < ...all, [prefixBytecodeScriptId(id)]: script, }), - {} + {}, ); const bytecodeScriptExtendedConfiguration: Configuration = { @@ -500,21 +502,21 @@ export const extendCompilationDataWithScenarioBytecode = < const failedResults = bytecodeCompilations.filter( ( - result + result, ): result is { errors: CompilationError[] | [CompilationError]; id: string; - } => 'errors' in result + } => 'errors' in result, ); if (failedResults.length > 0) { - return `${failedResults + return failedResults .map( (result) => `Compilation error while generating bytecode for "${ result.id - }": ${stringifyErrors(result.errors)}` + }": ${stringifyErrors(result.errors)}`, ) - .join('; ')}`; + .join('; '); } const compiledBytecode = ( @@ -524,7 +526,7 @@ export const extendCompilationDataWithScenarioBytecode = < }[] ).reduce<{ [fullIdentifier: string]: Uint8Array }>( (all, result) => ({ ...all, [result.id]: result.bytecode }), - {} + {}, ); return { @@ -536,30 +538,30 @@ export const extendCompilationDataWithScenarioBytecode = < }; /** - * Compile a {@link AuthenticationTemplateScenarioOutput.valueSatoshis}, + * Compile a {@link WalletTemplateScenarioOutput.valueSatoshis}, * returning the `Uint8Array` result. */ -export const compileAuthenticationTemplateScenarioValueSatoshis = ( - valueSatoshisDefinition: AuthenticationTemplateScenarioOutput['valueSatoshis'] = CompilerDefaults.defaultScenarioOutputValueSatoshis +export const compileWalletTemplateScenarioValueSatoshis = ( + valueSatoshisDefinition: WalletTemplateScenarioOutput['valueSatoshis'] = CompilerDefaults.defaultScenarioOutputValueSatoshis, ) => typeof valueSatoshisDefinition === 'string' ? binToValueSatoshis(hexToBin(valueSatoshisDefinition)) : BigInt(valueSatoshisDefinition); /** - * Compile an {@link AuthenticationTemplateScenarioBytecode} definition for an - * {@link AuthenticationTemplateScenario}, returning either a + * Compile an {@link WalletTemplateScenarioBytecode} definition for an + * {@link WalletTemplateScenario}, returning either a * simple `Uint8Array` result or a full CashAssembly {@link CompilationResult}. */ // eslint-disable-next-line complexity -export const compileAuthenticationTemplateScenarioBytecode = < +export const compileWalletTemplateScenarioBytecode = < Configuration extends AnyCompilerConfigurationIgnoreOperations, GenerateBytecode extends Compiler< CompilationContextBCH, Configuration, ProgramState >['generateBytecode'], - ProgramState + ProgramState, >({ bytecodeDefinition, compilationContext, @@ -569,11 +571,11 @@ export const compileAuthenticationTemplateScenarioBytecode = < generateBytecode, lockingOrUnlockingScriptIdUnderTest, }: { - bytecodeDefinition: AuthenticationTemplateScenarioBytecode; + bytecodeDefinition: WalletTemplateScenarioBytecode; compilationContext?: CompilationContextBCH; configuration: Configuration; extendedScenario: ExtendedScenarioDefinition; - defaultOverride: AuthenticationTemplateScenarioData; + defaultOverride: WalletTemplateScenarioData; generateBytecode: GenerateBytecode; lockingOrUnlockingScriptIdUnderTest?: string; }): @@ -603,7 +605,7 @@ export const compileAuthenticationTemplateScenarioBytecode = < const overrides = bytecodeDefinition.overrides ?? defaultOverride; const overriddenDataDefinition = extendScenarioDefinitionData( extendedScenario.data, - overrides + overrides, ); const data = extendCompilationDataWithScenarioBytecode({ compilationData: extendedScenarioDefinitionToCompilationData({ @@ -626,12 +628,12 @@ export const compileAuthenticationTemplateScenarioBytecode = < }; /** - * Compile a {@link AuthenticationTemplateScenarioOutput.token}, + * Compile a {@link WalletTemplateScenarioOutput.token}, * returning the {@link Output.token} result. */ // eslint-disable-next-line complexity export const compileScenarioOutputTokenData = ( - output: AuthenticationTemplateScenarioOutput + output: WalletTemplateScenarioOutput, ): Pick => output.token === undefined ? {} @@ -641,7 +643,7 @@ export const compileScenarioOutputTokenData = ( // TODO: doesn't verify length category: hexToBin( output.token.category ?? - CompilerDefaults.defaultScenarioOutputTokenCategory + CompilerDefaults.defaultScenarioOutputTokenCategory, ), ...(output.token.nft === undefined ? {} @@ -674,7 +676,7 @@ export const generateScenarioBCH = < ProgramState >['generateBytecode'], ProgramState, - Debug extends boolean + Debug extends boolean, >( { configuration, @@ -710,7 +712,7 @@ export const generateScenarioBCH = < */ lockingScriptId?: string | undefined; }, - debug?: Debug + debug?: Debug, ): | string | (Debug extends true @@ -739,7 +741,7 @@ export const generateScenarioBCH = < const extendedScenario = extendScenarioDefinition( parentScenario, - scenarioDefinition + scenarioDefinition, ); const partialCompilationData = extendedScenarioDefinitionToCompilationData(extendedScenario); @@ -761,17 +763,17 @@ export const generateScenarioBCH = < } const testedInputs = extendedScenario.transaction.inputs.filter((input) => - Array.isArray(input.unlockingBytecode) + Array.isArray(input.unlockingBytecode), ); if (testedInputs.length !== 1) { return `Cannot generate ${scenarioName}: the specific input under test in this scenario is ambiguous - "transaction.inputs" must include exactly one input that has "unlockingBytecode" set to ["slot"].`; } const testedInputIndex = extendedScenario.transaction.inputs.findIndex( - (input) => Array.isArray(input.unlockingBytecode) + (input) => Array.isArray(input.unlockingBytecode), ); const testedSourceOutputs = extendedScenario.sourceOutputs.filter((output) => - Array.isArray(output.lockingBytecode) + Array.isArray(output.lockingBytecode), ); if (testedSourceOutputs.length !== 1) { return `Cannot generate ${scenarioName}: the source output unlocked by the input under test in this scenario is ambiguous - "sourceOutputs" must include exactly one output that has "lockingBytecode" set to ["slot"].`; @@ -779,7 +781,7 @@ export const generateScenarioBCH = < if ( !Array.isArray( - extendedScenario.sourceOutputs[testedInputIndex]?.lockingBytecode + extendedScenario.sourceOutputs[testedInputIndex]?.lockingBytecode, ) ) { return `Cannot generate ${scenarioName}: the source output unlocked by the input under test in this scenario is ambiguous - the ["slot"] in "transaction.inputs" and "sourceOutputs" must be at the same index.`; @@ -793,11 +795,10 @@ export const generateScenarioBCH = < } const lockingScriptId = - providedLockingScriptId === undefined - ? unlockingScriptId === undefined - ? undefined - : configuration.unlockingScripts?.[unlockingScriptId] - : providedLockingScriptId; + providedLockingScriptId ?? + (unlockingScriptId === undefined + ? undefined + : configuration.unlockingScripts?.[unlockingScriptId]); if (unlockingScriptId !== undefined && lockingScriptId === undefined) { return `Cannot generate ${scenarioName} using unlocking script "${unlockingScriptId}": the locking script unlocked by "${unlockingScriptId}" is not provided in this compiler configuration.`; @@ -814,7 +815,7 @@ export const generateScenarioBCH = < const defaultOverride = {}; return { compiled: { - lockingBytecode: compileAuthenticationTemplateScenarioBytecode({ + lockingBytecode: compileWalletTemplateScenarioBytecode({ bytecodeDefinition, configuration, defaultOverride, @@ -822,8 +823,8 @@ export const generateScenarioBCH = < generateBytecode, lockingOrUnlockingScriptIdUnderTest: lockingScriptId, }), - valueSatoshis: compileAuthenticationTemplateScenarioValueSatoshis( - sourceOutput.valueSatoshis + valueSatoshis: compileWalletTemplateScenarioValueSatoshis( + sourceOutput.valueSatoshis, ), ...compileScenarioOutputTokenData(sourceOutput), }, @@ -831,11 +832,11 @@ export const generateScenarioBCH = < slot, type: 'source output' as const, }; - } + }, ); const lockingCompilation = sourceOutputCompilations.find( - (compilation) => compilation.slot + (compilation) => compilation.slot, )?.compiled.lockingBytecode as CompilationResult; const transactionOutputCompilations = @@ -843,7 +844,7 @@ export const generateScenarioBCH = < const defaultOverride = { hdKeys: { addressIndex: 1 } }; return { compiled: { - lockingBytecode: compileAuthenticationTemplateScenarioBytecode({ + lockingBytecode: compileWalletTemplateScenarioBytecode({ bytecodeDefinition: transactionOutput.lockingBytecode ?? {}, configuration, defaultOverride, @@ -851,8 +852,8 @@ export const generateScenarioBCH = < generateBytecode, lockingOrUnlockingScriptIdUnderTest: lockingScriptId, }), - valueSatoshis: compileAuthenticationTemplateScenarioValueSatoshis( - transactionOutput.valueSatoshis + valueSatoshis: compileWalletTemplateScenarioValueSatoshis( + transactionOutput.valueSatoshis, ), ...compileScenarioOutputTokenData(transactionOutput), }, @@ -870,7 +871,7 @@ export const generateScenarioBCH = < ...accumulated, ...result.compiled.lockingBytecode.errors.map( (errorObject) => - `Failed compilation of ${result.type} at index ${result.index}: ${errorObject.error}` + `Failed compilation of ${result.type} at index ${result.index}: ${errorObject.error}`, ), ]; } @@ -879,7 +880,7 @@ export const generateScenarioBCH = < if (outputCompilationErrors.length > 0) { const error = `Cannot generate ${scenarioName}: ${outputCompilationErrors.join( - ' ' + ' ', )}`; if (debug === true) { return { @@ -892,11 +893,11 @@ export const generateScenarioBCH = < return error; } const sourceOutputCompilationsSuccess = - sourceOutputCompilations as AuthenticationTemplateScenarioOutputSuccessfulCompilation[]; + sourceOutputCompilations as WalletTemplateScenarioOutputSuccessfulCompilation[]; const transactionOutputCompilationsSuccess = - transactionOutputCompilations as AuthenticationTemplateScenarioOutputSuccessfulCompilation[]; + transactionOutputCompilations as WalletTemplateScenarioOutputSuccessfulCompilation[]; - interface AuthenticationTemplateScenarioOutputSuccessfulCompilation { + type WalletTemplateScenarioOutputSuccessfulCompilation = { compiled: { lockingBytecode: CompilationResultSuccess | Uint8Array; valueSatoshis: bigint; @@ -905,10 +906,10 @@ export const generateScenarioBCH = < index: number; slot?: boolean; type: string; - } + }; const extractOutput = ( - compilation: AuthenticationTemplateScenarioOutputSuccessfulCompilation + compilation: WalletTemplateScenarioOutputSuccessfulCompilation, ) => { const { lockingBytecode, valueSatoshis, token } = compilation.compiled; return { @@ -930,13 +931,13 @@ export const generateScenarioBCH = < // TODO: doesn't verify length outpointTransactionHash: hexToBin( input.outpointTransactionHash ?? - CompilerDefaults.defaultScenarioInputOutpointTransactionHash + CompilerDefaults.defaultScenarioInputOutpointTransactionHash, ), sequenceNumber: input.sequenceNumber ?? CompilerDefaults.defaultScenarioInputSequenceNumber, unlockingBytecode: undefined, - }) + }), ); const transactionInputCompilations = extendedScenario.transaction.inputs.map( @@ -957,7 +958,7 @@ export const generateScenarioBCH = < inputsContext[index]!.outpointTransactionHash, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion sequenceNumber: inputsContext[index]!.sequenceNumber, - unlockingBytecode: compileAuthenticationTemplateScenarioBytecode({ + unlockingBytecode: compileWalletTemplateScenarioBytecode({ bytecodeDefinition, compilationContext: { inputIndex: index, @@ -979,14 +980,14 @@ export const generateScenarioBCH = < index, slot, }; - } + }, ); const unlockingCompilation = transactionInputCompilations.find( - (compilation) => compilation.slot + (compilation) => compilation.slot, )?.compiled.unlockingBytecode as CompilationResult; - interface AuthenticationTemplateScenarioInputSuccessfulCompilation { + type WalletTemplateScenarioInputSuccessfulCompilation = { compiled: { outpointIndex: number; outpointTransactionHash: Uint8Array; @@ -996,7 +997,7 @@ export const generateScenarioBCH = < index: number; slot?: boolean; type: string; - } + }; const inputCompilationErrors = transactionInputCompilations.reduce( (accumulated, result) => { @@ -1005,18 +1006,18 @@ export const generateScenarioBCH = < ...accumulated, ...result.compiled.unlockingBytecode.errors.map( (errorObject) => - `Failed compilation of input at index ${result.index}: ${errorObject.error}` + `Failed compilation of input at index ${result.index}: ${errorObject.error}`, ), ]; } return accumulated; }, - [] + [], ); if (inputCompilationErrors.length > 0) { const error = `Cannot generate ${scenarioName}: ${inputCompilationErrors.join( - ' ' + ' ', )}`; if (debug === true) { return { @@ -1031,7 +1032,7 @@ export const generateScenarioBCH = < } const transactionInputCompilationsSuccess = - transactionInputCompilations as AuthenticationTemplateScenarioInputSuccessfulCompilation[]; + transactionInputCompilations as WalletTemplateScenarioInputSuccessfulCompilation[]; const inputs = transactionInputCompilationsSuccess.map((compilation) => { const { diff --git a/src/lib/compiler/standard/p2pkh.spec.ts b/src/lib/compiler/standard/p2pkh.spec.ts index 1b051797..06e4fd8a 100644 --- a/src/lib/compiler/standard/p2pkh.spec.ts +++ b/src/lib/compiler/standard/p2pkh.spec.ts @@ -1,38 +1,27 @@ import test from 'ava'; import { - authenticationTemplateP2pkh, - authenticationTemplateP2pkhNonHd, - importAuthenticationTemplate, + importWalletTemplate, + walletTemplateP2pkh, + walletTemplateP2pkhNonHd, } from '../../lib.js'; -test('authenticationTemplateP2pkh is valid', (t) => { - const template = importAuthenticationTemplate( - authenticationTemplateP2pkhNonHd - ); +test('walletTemplateP2pkh is valid', (t) => { + const template = importWalletTemplate(walletTemplateP2pkhNonHd); t.true(typeof template !== 'string'); }); -test('authenticationTemplateP2pkh is mostly equivalent to authenticationTemplateP2pkhHd', (t) => { - t.deepEqual( - authenticationTemplateP2pkhNonHd.$schema, - authenticationTemplateP2pkh.$schema - ); - t.deepEqual( - authenticationTemplateP2pkhNonHd.scripts, - authenticationTemplateP2pkh.scripts - ); - t.deepEqual( - authenticationTemplateP2pkhNonHd.supported, - authenticationTemplateP2pkh.supported - ); +test('walletTemplateP2pkh is mostly equivalent to walletTemplateP2pkhHd', (t) => { + t.deepEqual(walletTemplateP2pkhNonHd.$schema, walletTemplateP2pkh.$schema); + t.deepEqual(walletTemplateP2pkhNonHd.scripts, walletTemplateP2pkh.scripts); t.deepEqual( - authenticationTemplateP2pkhNonHd.version, - authenticationTemplateP2pkh.version + walletTemplateP2pkhNonHd.supported, + walletTemplateP2pkh.supported, ); + t.deepEqual(walletTemplateP2pkhNonHd.version, walletTemplateP2pkh.version); }); -test('authenticationTemplateP2pkhHd is valid', (t) => { - const template = importAuthenticationTemplate(authenticationTemplateP2pkh); +test('walletTemplateP2pkhHd is valid', (t) => { + const template = importWalletTemplate(walletTemplateP2pkh); t.true(typeof template !== 'string'); }); diff --git a/src/lib/compiler/standard/p2pkh.ts b/src/lib/compiler/standard/p2pkh.ts index fe4ab73c..aaca7357 100644 --- a/src/lib/compiler/standard/p2pkh.ts +++ b/src/lib/compiler/standard/p2pkh.ts @@ -1,20 +1,20 @@ -import type { AuthenticationTemplate } from '../../lib.js'; +import type { WalletTemplate } from '../../lib.js'; /** - * A standard single-factor authentication template that uses + * A standard single-factor wallet template that uses * Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use * on the network. * * This P2PKH template uses BCH Schnorr signatures, reducing the size of * transactions. * - * Note, this authentication template uses only a single `Key`. For HD key - * support, see {@link authenticationTemplateP2pkhHd}. + * Note, this wallet template uses only a single `Key`. For HD key + * support, see {@link walletTemplateP2pkhHd}. */ -export const authenticationTemplateP2pkhNonHd: AuthenticationTemplate = { - $schema: 'https://bitauth.com/schemas/authentication-template-v0.schema.json', +export const walletTemplateP2pkhNonHd: WalletTemplate = { + $schema: 'https://libauth.org/schemas/wallet-template-v0.schema.json', description: - 'A standard single-factor authentication template that uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions.', + 'A standard single-factor wallet template that uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions.', entities: { owner: { description: 'The individual who can spend from this wallet.', @@ -48,7 +48,7 @@ export const authenticationTemplateP2pkhNonHd: AuthenticationTemplate = { }; /** - * A standard single-factor authentication template that uses + * A standard single-factor wallet template that uses * Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use * on the network. * @@ -58,10 +58,10 @@ export const authenticationTemplateP2pkhNonHd: AuthenticationTemplate = { * Because the template uses a Hierarchical Deterministic (HD) key, it also * supports watch-only clients. */ -export const authenticationTemplateP2pkh: AuthenticationTemplate = { - $schema: 'https://bitauth.com/schemas/authentication-template-v0.schema.json', +export const walletTemplateP2pkh: WalletTemplate = { + $schema: 'https://libauth.org/schemas/wallet-template-v0.schema.json', description: - 'A standard single-factor authentication template that uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions. Because the template uses a Hierarchical Deterministic (HD) key, it also supports watch-only clients.', + 'A standard single-factor wallet template that uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions. Because the template uses a Hierarchical Deterministic (HD) key, it also supports watch-only clients.', entities: { owner: { description: 'The individual who can spend from this wallet.', diff --git a/src/lib/crypto/combinations.ts b/src/lib/crypto/combinations.ts index 83d2d8ab..6cd3f7cf 100644 --- a/src/lib/crypto/combinations.ts +++ b/src/lib/crypto/combinations.ts @@ -19,7 +19,7 @@ export const hash160 = ( crypto: { ripemd160: { hash: Ripemd160['hash'] }; sha256: { hash: Sha256['hash'] }; - } = { ripemd160: internalRipemd160, sha256: internalSha256 } + } = { ripemd160: internalRipemd160, sha256: internalSha256 }, ) => crypto.ripemd160.hash(crypto.sha256.hash(payload)); /** @@ -33,5 +33,5 @@ export const hash160 = ( */ export const hash256 = ( payload: Uint8Array, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => sha256.hash(sha256.hash(payload)); diff --git a/src/lib/crypto/hash.bench.helper.ts b/src/lib/crypto/hash.bench.helper.ts index 1542ddd8..364391c8 100644 --- a/src/lib/crypto/hash.bench.helper.ts +++ b/src/lib/crypto/hash.bench.helper.ts @@ -1,31 +1,26 @@ /* global Buffer */ -/* eslint-disable functional/no-let, @typescript-eslint/init-declarations, functional/no-expression-statement, functional/no-conditional-statement, functional/no-return-void*/ +/* eslint-disable functional/no-let, @typescript-eslint/init-declarations, functional/no-expression-statements, functional/no-conditional-statements, functional/no-return-void*/ import { createHash, randomBytes } from 'crypto'; -import asmCrypto from 'asmcrypto.js'; import test from 'ava'; -import bcrypto from 'bcrypto'; -import suite from 'chuhai'; -import hashJs from 'hash.js'; import type { HashFunction } from '../lib.js'; +import asmCrypto from 'asmcrypto.js'; +import suite from 'chuhai'; +import hashJs from 'hash.js'; + export const benchmarkHashingFunction = ( hashFunctionName: string, hashFunctionPromise: Promise, - nodeJsAlgorithm: 'ripemd160' | 'sha1' | 'sha256' | 'sha512' + nodeJsAlgorithm: 'ripemd160' | 'sha1' | 'sha256' | 'sha512', ) => { const singlePassNodeBenchmark = (inputLength: number) => { - const bcryptoAlgorithm = nodeJsAlgorithm.toUpperCase() as - | 'RIPEMD160' - | 'SHA1' - | 'SHA256' - | 'SHA512'; test(`node: ${hashFunctionName}: hash a ${inputLength}-byte input`, async (t) => { const hashFunction = await hashFunctionPromise; await suite(t.title, (s) => { let message: Uint8Array; - let hash: Uint8Array | readonly number[] | null; + let hash: number[] | Uint8Array | null; /* * we let Node.js use the message as a Node.js buffer * (may slightly overestimate Node.js native performance) @@ -42,9 +37,6 @@ export const benchmarkHashingFunction = ( s.bench('hash.js', () => { hash = hashJs[nodeJsAlgorithm]().update(message).digest(); }); - s.bench('bcoin', () => { - hash = bcrypto[bcryptoAlgorithm].digest(Buffer.from(message)); - }); s.bench('node.js native', () => { hash = createHash(nodeJsAlgorithm).update(nodeJsBuffer).digest(); }); @@ -54,8 +46,8 @@ export const benchmarkHashingFunction = ( nodeJsAlgorithm === 'sha1' ? asmCrypto.Sha1 : nodeJsAlgorithm === 'sha256' - ? asmCrypto.Sha256 - : asmCrypto.Sha512; + ? asmCrypto.Sha256 + : asmCrypto.Sha512; s.bench('asmcrypto.js', () => { const instance = new Algorithm(); hash = instance.process(message).finish().result; @@ -64,7 +56,7 @@ export const benchmarkHashingFunction = ( s.cycle(() => { if (hash === null) { t.fail( - `asmcrypto.js failed to produce a hash for message: ${message.toString()}` + `asmcrypto.js failed to produce a hash for message: ${message.toString()}`, ); } else { t.deepEqual(new Uint8Array(hash), hashFunction.hash(message)); @@ -84,14 +76,14 @@ export const benchmarkHashingFunction = ( const hashFunction = await hashFunctionPromise; await suite(t.title, (s) => { let message: Uint8Array; - let messageChunks: readonly Uint8Array[]; - let nodeJsChunks: readonly Buffer[]; - let hash: Uint8Array | readonly number[] | null; + let messageChunks: Uint8Array[]; + let nodeJsChunks: Buffer[]; + let hash: number[] | Uint8Array | null; const nextCycle = () => { message = randomBytes(totalInput); const chunkCount = Math.ceil(message.length / chunkSize); messageChunks = Array.from({ length: chunkCount }).map((_, index) => - message.slice(index * chunkSize, index * chunkSize + chunkSize) + message.slice(index * chunkSize, index * chunkSize + chunkSize), ); nodeJsChunks = messageChunks.map((chunk) => Buffer.from(chunk)); }; @@ -100,15 +92,15 @@ export const benchmarkHashingFunction = ( hash = hashFunction.final( messageChunks.reduce( (state, chunk) => hashFunction.update(state, chunk), - hashFunction.init() - ) + hashFunction.init(), + ), ); }); s.bench('hash.js', () => { hash = messageChunks .reduce( (state, chunk) => state.update(chunk), - hashJs[nodeJsAlgorithm]() + hashJs[nodeJsAlgorithm](), ) .digest(); }); @@ -116,7 +108,7 @@ export const benchmarkHashingFunction = ( hash = nodeJsChunks .reduce( (state, chunk) => state.update(chunk), - createHash(nodeJsAlgorithm) + createHash(nodeJsAlgorithm), ) .digest(); }); @@ -126,8 +118,8 @@ export const benchmarkHashingFunction = ( nodeJsAlgorithm === 'sha1' ? asmCrypto.Sha1 : nodeJsAlgorithm === 'sha256' - ? asmCrypto.Sha256 - : asmCrypto.Sha512; + ? asmCrypto.Sha256 + : asmCrypto.Sha512; s.bench('asmcrypto.js', () => { const instance = new Algorithm(); hash = instance.process(message).finish().result; @@ -136,7 +128,7 @@ export const benchmarkHashingFunction = ( s.cycle(() => { if (hash === null) { t.fail( - `asmcrypto.js failed to produce a hash for message: ${message.toString()}` + `asmcrypto.js failed to produce a hash for message: ${message.toString()}`, ); } else { t.deepEqual(new Uint8Array(hash), hashFunction.hash(message)); diff --git a/src/lib/crypto/hash.browser.bench.helper.ts b/src/lib/crypto/hash.browser.bench.helper.ts index ad57c3bd..e24e277a 100644 --- a/src/lib/crypto/hash.browser.bench.helper.ts +++ b/src/lib/crypto/hash.browser.bench.helper.ts @@ -1,9 +1,5 @@ /* global window, crypto */ -/* eslint-disable functional/no-let, @typescript-eslint/init-declarations, functional/no-expression-statement, functional/no-conditional-statement, functional/no-return-void */ -import * as asmCrypto from 'asmcrypto.js'; -import suite from 'chuhai'; -import hashJs from 'hash.js'; - +/* eslint-disable functional/no-let, @typescript-eslint/init-declarations, functional/no-expression-statements, functional/no-conditional-statements, functional/no-return-void */ import type { HashFunction } from '../lib.js'; import { @@ -13,6 +9,10 @@ import { instantiateSha512, } from './crypto.js'; +import * as asmCrypto from 'asmcrypto.js'; +import suite from 'chuhai'; +import hashJs from 'hash.js'; + declare const benchError: (error: string) => void; declare const benchComplete: () => void; @@ -52,7 +52,7 @@ const singlePassBrowserBenchmark = async ({ s.cycle(() => { if (hash === null) { benchError( - `asmcrypto.js produced a null result given message: ${message.toString()}` + `asmcrypto.js produced a null result given message: ${message.toString()}`, ); } else { compare(hash, hashFunction.hash(message)); @@ -66,7 +66,7 @@ const singlePassBrowserBenchmark = async ({ s.bench('hash.js', () => { hash = new Uint8Array( - hashJs[hashFunctionName]().update(message).digest() + hashJs[hashFunctionName]().update(message).digest(), ); }); @@ -84,21 +84,21 @@ const singlePassBrowserBenchmark = async ({ }, { defer: true, - } + }, ); // eslint-disable-next-line @typescript-eslint/naming-convention const Algorithm = subtleCryptoAlgorithmName === 'SHA-1' ? asmCrypto.Sha1 : subtleCryptoAlgorithmName === 'SHA-256' - ? asmCrypto.Sha256 - : asmCrypto.Sha512; + ? asmCrypto.Sha256 + : asmCrypto.Sha512; s.bench('asmcrypto.js', () => { const instance = new Algorithm(); hash = instance.process(message).finish().result; }); } - } + }, ); const mb = 1_000_000; @@ -120,8 +120,8 @@ const incrementalBrowserBenchmark = async ({ }MB input in ${chunkSize / mb}MB chunks`, (s) => { let message: Uint8Array; - let messageChunks: readonly Uint8Array[]; - let hash: ArrayBuffer | Uint8Array | readonly number[] | null; + let messageChunks: Uint8Array[]; + let hash: ArrayBuffer | number[] | Uint8Array | null; const nextCycle = () => { /** @@ -130,7 +130,7 @@ const incrementalBrowserBenchmark = async ({ message = new Uint8Array(totalInput).fill(0); const chunkCount = Math.ceil(message.length / chunkSize); messageChunks = Array.from({ length: chunkCount }).map((_, index) => - message.slice(index * chunkSize, index * chunkSize + chunkSize) + message.slice(index * chunkSize, index * chunkSize + chunkSize), ); }; nextCycle(); @@ -138,7 +138,7 @@ const incrementalBrowserBenchmark = async ({ s.cycle(() => { if (hash === null) { benchError( - `asmcrypto.js produced a null result given message: ${message.toString()}` + `asmcrypto.js produced a null result given message: ${message.toString()}`, ); } else { compare(new Uint8Array(hash), hashFunction.hash(message)); @@ -150,8 +150,8 @@ const incrementalBrowserBenchmark = async ({ hash = hashFunction.final( messageChunks.reduce( (state, chunk) => hashFunction.update(state, chunk), - hashFunction.init() - ) + hashFunction.init(), + ), ); }); @@ -159,7 +159,7 @@ const incrementalBrowserBenchmark = async ({ hash = messageChunks .reduce( (state, chunk) => state.update(chunk), - hashJs[hashFunctionName]() + hashJs[hashFunctionName](), ) .digest(); }); @@ -170,14 +170,14 @@ const incrementalBrowserBenchmark = async ({ hashFunctionName === 'sha1' ? asmCrypto.Sha1 : hashFunctionName === 'sha256' - ? asmCrypto.Sha256 - : asmCrypto.Sha512; + ? asmCrypto.Sha256 + : asmCrypto.Sha512; s.bench('asmcrypto.js', () => { const instance = new Algorithm(); hash = instance.process(message).finish().result; }); } - } + }, ); const browserBenchmarks = async ({ diff --git a/src/lib/crypto/hash.browser.bench.ts b/src/lib/crypto/hash.browser.bench.ts index 44d50060..1ceecc15 100644 --- a/src/lib/crypto/hash.browser.bench.ts +++ b/src/lib/crypto/hash.browser.bench.ts @@ -1,10 +1,11 @@ import { join } from 'path'; +import test from 'ava'; + +import { chromium } from '@playwright/test'; import alias from '@rollup/plugin-alias'; import commonjs from '@rollup/plugin-commonjs'; import { nodeResolve } from '@rollup/plugin-node-resolve'; -import test from 'ava'; -import puppeteer from 'puppeteer'; import { rollup } from 'rollup'; const prepareCode = async () => { @@ -20,7 +21,7 @@ const prepareCode = async () => { const bundle = await rollup({ input: join( new URL('.', import.meta.url).pathname, - 'hash.browser.bench.helper.js' + 'hash.browser.bench.helper.js', ), plugins: [ alias({ @@ -33,7 +34,7 @@ const prepareCode = async () => { nodeResolve(), ], }); - // eslint-disable-next-line no-console, require-atomic-updates + // eslint-disable-next-line no-console console.warn = realConsoleWarn; const result = await bundle.generate({ @@ -43,10 +44,7 @@ const prepareCode = async () => { }; const preparePage = async () => { - const browser = await puppeteer.launch({ - args: ['--no-sandbox', '--disable-setuid-sandbox'], - // devtools: true - }); + const browser = await chromium.launch(); const page = await browser.newPage(); // https://github.com/GoogleChrome/puppeteer/issues/2301#issuecomment-379622459 await page.goto('file:///'); @@ -59,15 +57,12 @@ const preparePage = async () => { preparePage(), ]); - test(`# browser: ${await browser.version()}`, async (t) => { + test(`# browser: ${browser.version()}`, async (t) => { page.on('console', (msg) => { // eslint-disable-next-line no-console console.log(msg.text()); }); - page.on('error', (err) => { - // eslint-disable-next-line no-console - console.error(`error: ${String(err)}`); - }); + // cspell: disable-next-line page.on('pageerror', (err) => { // eslint-disable-next-line no-console diff --git a/src/lib/crypto/hash.spec.helper.ts b/src/lib/crypto/hash.spec.helper.ts index 93bb813b..ba035b9d 100644 --- a/src/lib/crypto/hash.spec.helper.ts +++ b/src/lib/crypto/hash.spec.helper.ts @@ -1,17 +1,17 @@ /* global Buffer */ -/* eslint-disable functional/no-expression-statement, functional/no-return-void */ +/* eslint-disable functional/no-expression-statements, functional/no-return-void */ import { createHash } from 'crypto'; import { readFileSync } from 'fs'; import { join } from 'path'; import test from 'ava'; -import bcrypto from 'bcrypto'; -import fc from 'fast-check'; -import hashJs from 'hash.js'; import type { HashFunction } from '../lib.js'; import { utf8ToBin } from '../lib.js'; +import fc from 'fast-check'; +import hashJs from 'hash.js'; + const testLength = 10000; const maxUint8Number = 255; @@ -43,19 +43,13 @@ export const testHashFunction = ({ nodeJsAlgorithm: 'ripemd160' | 'sha1' | 'sha256' | 'sha512'; }) => { const binary = getEmbeddedBinary(); - const bcryptoAlgorithm = nodeJsAlgorithm.toUpperCase() as - | 'RIPEMD160' - | 'SHA1' - | 'SHA256' - | 'SHA512'; - test(`[crypto] ${hashFunctionName} getEmbeddedBinary returns the proper binary`, (t) => { const path = join( new URL('.', import.meta.url).pathname, '..', 'bin', - `${hashFunctionName}`, - `${hashFunctionName}.wasm` + hashFunctionName, + `${hashFunctionName}.wasm`, ); const binaryFromDisk = readFileSync(path).buffer; t.deepEqual(binary, binaryFromDisk); @@ -77,21 +71,9 @@ export const testHashFunction = ({ const hash = createHash(nodeJsAlgorithm); t.deepEqual( new Uint8Array(hash.update(Buffer.from(message)).digest()), - hashFunction.hash(message) - ); - } - ); - - const equivalentToBcoin = fc.property( - fcUint8Array(0, testLength), - (message) => { - t.deepEqual( - new Uint8Array( - bcrypto[bcryptoAlgorithm].digest(Buffer.from(message)) - ), - hashFunction.hash(message) + hashFunction.hash(message), ); - } + }, ); const equivalentToHashJs = fc.property( @@ -99,13 +81,12 @@ export const testHashFunction = ({ (message) => { t.deepEqual( new Uint8Array(hashJs[nodeJsAlgorithm]().update(message).digest()), - hashFunction.hash(message) + hashFunction.hash(message), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToNative); - fc.assert(equivalentToBcoin); fc.assert(equivalentToHashJs); }); }); @@ -117,27 +98,27 @@ export const testHashFunction = ({ hashFunction.update( hashFunction.update( hashFunction.update(hashFunction.init(), utf8ToBin('a')), - utf8ToBin('b') + utf8ToBin('b'), ), - utf8ToBin('c') - ) + utf8ToBin('c'), + ), ), - abcHash + abcHash, ); t.deepEqual( hashFunction.final( - hashFunction.update(hashFunction.init(), utf8ToBin('test')) + hashFunction.update(hashFunction.init(), utf8ToBin('test')), ), - testHash + testHash, ); t.deepEqual( hashFunction.final( hashFunction.update( hashFunction.update(hashFunction.init(), utf8ToBin('lib')), - utf8ToBin('auth') - ) + utf8ToBin('auth'), + ), ), - libauthHash + libauthHash, ); const equivalentToSinglePass = fc.property( @@ -148,17 +129,17 @@ export const testHashFunction = ({ const chunks = Array.from({ length: chunkCount }) .map((_, index) => index * chunkSize) .map((startIndex) => - message.slice(startIndex, startIndex + chunkSize) + message.slice(startIndex, startIndex + chunkSize), ); const incrementalResult = hashFunction.final( chunks.reduce( (state, chunk) => hashFunction.update(state, chunk), - hashFunction.init() - ) + hashFunction.init(), + ), ); const singlePassResult = hashFunction.hash(message); t.deepEqual(incrementalResult, singlePassResult); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSinglePass); diff --git a/src/lib/crypto/hmac.spec.ts b/src/lib/crypto/hmac.spec.ts index 91a1c4ed..7e88075b 100644 --- a/src/lib/crypto/hmac.spec.ts +++ b/src/lib/crypto/hmac.spec.ts @@ -1,6 +1,5 @@ import { createHmac } from 'crypto'; -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import { @@ -12,17 +11,19 @@ import { sha512, } from '../lib.js'; +import { fc, testProp } from '@fast-check/ava'; + const vectors = test.macro< [{ secret: string; message: string; sha256: string; sha512: string }] >({ exec: (t, vector) => { t.deepEqual( hmacSha256(hexToBin(vector.secret), hexToBin(vector.message), sha256), - hexToBin(vector.sha256) + hexToBin(vector.sha256), ); t.deepEqual( hmacSha512(hexToBin(vector.secret), hexToBin(vector.message), sha512), - hexToBin(vector.sha512) + hexToBin(vector.sha512), ); }, title: (title) => `[crypto] HMAC Test Vector #${title ?? '?'} (RFC 4231)`, @@ -98,9 +99,9 @@ testProp( (t, secret, message) => { t.deepEqual( binToHex(hmacSha256(secret, message)), - createHmac('sha256', secret).update(message).digest('hex') + createHmac('sha256', secret).update(message).digest('hex'), ); - } + }, ); testProp( @@ -112,7 +113,7 @@ testProp( (t, secret, message) => { t.deepEqual( binToHex(hmacSha512(secret, message)), - createHmac('sha512', secret).update(message).digest('hex') + createHmac('sha512', secret).update(message).digest('hex'), ); - } + }, ); diff --git a/src/lib/crypto/hmac.ts b/src/lib/crypto/hmac.ts index 6cf6e3f7..412c1751 100644 --- a/src/lib/crypto/hmac.ts +++ b/src/lib/crypto/hmac.ts @@ -17,7 +17,7 @@ export const instantiateHmacFunction = (hashFunction: (input: Uint8Array) => Uint8Array, blockByteLength: number) => (secret: Uint8Array, message: Uint8Array) => { const key = new Uint8Array(blockByteLength).fill(0); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements key.set(secret.length > blockByteLength ? hashFunction(secret) : secret, 0); const innerPaddingFill = 0x36; @@ -51,7 +51,7 @@ const sha256BlockByteLength = 64; export const hmacSha256 = ( secret: Uint8Array, message: Uint8Array, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => instantiateHmacFunction(sha256.hash, sha256BlockByteLength)(secret, message); @@ -72,6 +72,6 @@ const sha512BlockByteLength = 128; export const hmacSha512 = ( secret: Uint8Array, message: Uint8Array, - sha512: { hash: Sha512['hash'] } = internalSha512 + sha512: { hash: Sha512['hash'] } = internalSha512, ) => instantiateHmacFunction(sha512.hash, sha512BlockByteLength)(secret, message); diff --git a/src/lib/crypto/ripemd160.bench.ts b/src/lib/crypto/ripemd160.bench.ts index 5fcf7be7..de10e213 100644 --- a/src/lib/crypto/ripemd160.bench.ts +++ b/src/lib/crypto/ripemd160.bench.ts @@ -6,5 +6,5 @@ import { benchmarkHashingFunction } from './hash.bench.helper.js'; benchmarkHashingFunction( 'ripemd160', instantiateRipemd160(), - 'ripemd160' + 'ripemd160', ); diff --git a/src/lib/crypto/ripemd160.ts b/src/lib/crypto/ripemd160.ts index c81b4fc6..0dc6ccf7 100644 --- a/src/lib/crypto/ripemd160.ts +++ b/src/lib/crypto/ripemd160.ts @@ -6,7 +6,7 @@ import { ripemd160Base64Bytes, } from './dependencies.js'; -export interface Ripemd160 extends HashFunction { +export type Ripemd160 = HashFunction & { /** * Finish an incremental ripemd160 hashing computation. * @@ -14,7 +14,7 @@ export interface Ripemd160 extends HashFunction { * * @param rawState - a raw state returned by `update` */ - readonly final: (rawState: Uint8Array) => Uint8Array; + final: (rawState: Uint8Array) => Uint8Array; /** * Returns the ripemd160 hash of the provided input. @@ -24,7 +24,7 @@ export interface Ripemd160 extends HashFunction { * * @param input - a Uint8Array to be hashed using ripemd160 */ - readonly hash: (input: Uint8Array) => Uint8Array; + hash: (input: Uint8Array) => Uint8Array; /** * Begin an incremental ripemd160 hashing computation. @@ -40,7 +40,7 @@ export interface Ripemd160 extends HashFunction { * const hash = ripemd160.final(state3); * ``` */ - readonly init: () => Uint8Array; + init: () => Uint8Array; /** * Add input to an incremental ripemd160 hashing computation. @@ -54,8 +54,8 @@ export interface Ripemd160 extends HashFunction { * @param rawState - a raw state returned by either `init` or `update` * @param input - a Uint8Array to be added to the ripemd160 computation */ - readonly update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; -} + update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; +}; /** * The most performant way to instantiate ripemd160 functionality. To avoid @@ -64,7 +64,7 @@ export interface Ripemd160 extends HashFunction { * @param webassemblyBytes - A buffer containing the ripemd160 binary. */ export const instantiateRipemd160Bytes = async ( - webassemblyBytes: ArrayBuffer + webassemblyBytes: ArrayBuffer, ): Promise => { const wasm = await instantiateRustWasm( webassemblyBytes, @@ -72,7 +72,7 @@ export const instantiateRipemd160Bytes = async ( 'ripemd160', 'ripemd160_init', 'ripemd160_update', - 'ripemd160_final' + 'ripemd160_final', ); return { final: wasm.final, diff --git a/src/lib/crypto/secp256k1-types.ts b/src/lib/crypto/secp256k1-types.ts index 691199b1..dd77f8ea 100644 --- a/src/lib/crypto/secp256k1-types.ts +++ b/src/lib/crypto/secp256k1-types.ts @@ -1,9 +1,9 @@ export type RecoveryId = 0 | 1 | 2 | 3; -export interface RecoverableSignature { +export type RecoverableSignature = { recoveryId: RecoveryId; signature: Uint8Array; -} +}; /** * An object that exposes a set of purely-functional Secp256k1 methods. @@ -19,7 +19,7 @@ export interface RecoverableSignature { * : console.log('❌ Signature invalid'); * ``` */ -export interface Secp256k1 { +export type Secp256k1 = { /** * Tweak a privateKey by adding `tweakValue` to it. * @@ -29,9 +29,9 @@ export interface Secp256k1 { * @param privateKey - a valid secp256k1 private key * @param tweakValue - 256 bit value to tweak by (BE) */ - readonly addTweakPrivateKey: ( + addTweakPrivateKey: ( privateKey: Uint8Array, - tweakValue: Uint8Array + tweakValue: Uint8Array, ) => Uint8Array | string; /** @@ -45,9 +45,9 @@ export interface Secp256k1 { * @param publicKey - a public key. * @param tweakValue - 256 bit value to tweak by (BE) */ - readonly addTweakPublicKeyCompressed: ( + addTweakPublicKeyCompressed: ( publicKey: Uint8Array, - tweakValue: Uint8Array + tweakValue: Uint8Array, ) => Uint8Array | string; /** @@ -61,9 +61,9 @@ export interface Secp256k1 { * @param publicKey - a public key. * @param tweakValue - 256 bit value to tweak by (BE) */ - readonly addTweakPublicKeyUncompressed: ( + addTweakPublicKeyUncompressed: ( publicKey: Uint8Array, - tweakValue: Uint8Array + tweakValue: Uint8Array, ) => Uint8Array | string; /** @@ -79,7 +79,7 @@ export interface Secp256k1 { * * @param privateKey - a public key to compress */ - readonly compressPublicKey: (publicKey: Uint8Array) => Uint8Array | string; + compressPublicKey: (publicKey: Uint8Array) => Uint8Array | string; /** * Derive a compressed public key from a valid secp256k1 private key. @@ -89,9 +89,7 @@ export interface Secp256k1 { * * @param privateKey - a valid secp256k1, 32-byte private key */ - readonly derivePublicKeyCompressed: ( - privateKey: Uint8Array - ) => Uint8Array | string; + derivePublicKeyCompressed: (privateKey: Uint8Array) => Uint8Array | string; /** * Derive an uncompressed public key from a valid secp256k1 private key. @@ -101,9 +99,7 @@ export interface Secp256k1 { * * @param privateKey - a valid secp256k1, 32-byte private key */ - readonly derivePublicKeyUncompressed: ( - privateKey: Uint8Array - ) => Uint8Array | string; + derivePublicKeyUncompressed: (privateKey: Uint8Array) => Uint8Array | string; /** * Malleate a compact-encoded ECDSA signature. @@ -117,9 +113,7 @@ export interface Secp256k1 { * @param signature - a compact-encoded ECDSA signature to malleate, max 72 * bytes */ - readonly malleateSignatureCompact: ( - signature: Uint8Array - ) => Uint8Array | string; + malleateSignatureCompact: (signature: Uint8Array) => Uint8Array | string; /** * Malleate a DER-encoded ECDSA signature. @@ -132,7 +126,7 @@ export interface Secp256k1 { * * @param signature - a DER-encoded ECDSA signature to malleate, max 72 bytes */ - readonly malleateSignatureDER: (signature: Uint8Array) => Uint8Array | string; + malleateSignatureDER: (signature: Uint8Array) => Uint8Array | string; /** * Tweak a privateKey by multiplying it by a `tweakValue`. @@ -144,9 +138,9 @@ export interface Secp256k1 { * @param tweakValue - 256 bit value to tweak by (BE) * */ - readonly mulTweakPrivateKey: ( + mulTweakPrivateKey: ( privateKey: Uint8Array, - tweakValue: Uint8Array + tweakValue: Uint8Array, ) => Uint8Array | string; /** @@ -160,9 +154,9 @@ export interface Secp256k1 { * @param publicKey - a public key. * @param tweakValue - 256 bit value to tweak by (BE) */ - readonly mulTweakPublicKeyCompressed: ( + mulTweakPublicKeyCompressed: ( publicKey: Uint8Array, - tweakValue: Uint8Array + tweakValue: Uint8Array, ) => Uint8Array | string; /** @@ -177,9 +171,9 @@ export interface Secp256k1 { * @param tweakValue - 256 bit value to tweak by (BE) */ - readonly mulTweakPublicKeyUncompressed: ( + mulTweakPublicKeyUncompressed: ( publicKey: Uint8Array, - tweakValue: Uint8Array + tweakValue: Uint8Array, ) => Uint8Array | string; /** @@ -190,9 +184,7 @@ export interface Secp256k1 { * @param signature - a compact-encoded ECDSA signature to normalize to * lower-S form, max 72 bytes */ - readonly normalizeSignatureCompact: ( - signature: Uint8Array - ) => Uint8Array | string; + normalizeSignatureCompact: (signature: Uint8Array) => Uint8Array | string; /** * Normalize a DER-encoded ECDSA signature to lower-S form. @@ -202,9 +194,7 @@ export interface Secp256k1 { * @param signature - a DER-encoded ECDSA signature to normalize to lower-S * form, max 72 bytes */ - readonly normalizeSignatureDER: ( - signature: Uint8Array - ) => Uint8Array | string; + normalizeSignatureDER: (signature: Uint8Array) => Uint8Array | string; /** * Compute a compressed public key from a valid signature, recovery number, @@ -217,10 +207,10 @@ export interface Secp256k1 { * @param messageHash - the hash used to generate the signature and recovery * number */ - readonly recoverPublicKeyCompressed: ( + recoverPublicKeyCompressed: ( signature: Uint8Array, recoveryId: RecoveryId, - messageHash: Uint8Array + messageHash: Uint8Array, ) => Uint8Array | string; /** @@ -234,10 +224,10 @@ export interface Secp256k1 { * @param messageHash - the hash used to generate the signature and recovery * number */ - readonly recoverPublicKeyUncompressed: ( + recoverPublicKeyUncompressed: ( signature: Uint8Array, recoveryId: RecoveryId, - messageHash: Uint8Array + messageHash: Uint8Array, ) => Uint8Array | string; /** @@ -247,9 +237,7 @@ export interface Secp256k1 { * * @param signature - a compact-encoded ECDSA signature to convert */ - readonly signatureCompactToDER: ( - signature: Uint8Array - ) => Uint8Array | string; + signatureCompactToDER: (signature: Uint8Array) => Uint8Array | string; /** * Convert a DER-encoded ECDSA signature to compact encoding. @@ -258,9 +246,7 @@ export interface Secp256k1 { * * @param signature - a DER-encoded ECDSA signature to convert */ - readonly signatureDERToCompact: ( - signature: Uint8Array - ) => Uint8Array | string; + signatureDERToCompact: (signature: Uint8Array) => Uint8Array | string; /** * Create an ECDSA signature in compact format. The created signature is @@ -272,9 +258,9 @@ export interface Secp256k1 { * @param privateKey - a valid secp256k1 private key * @param messageHash - the 32-byte message hash to be signed */ - readonly signMessageHashCompact: ( + signMessageHashCompact: ( privateKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => Uint8Array | string; /** @@ -287,9 +273,9 @@ export interface Secp256k1 { * @param privateKey - a valid secp256k1, 32-byte private key * @param messageHash - the 32-byte message hash to be signed */ - readonly signMessageHashDER: ( + signMessageHashDER: ( privateKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => Uint8Array | string; /** @@ -305,9 +291,9 @@ export interface Secp256k1 { * @param privateKey - a valid secp256k1, 32-byte private key * @param messageHash - the 32-byte message hash to be signed */ - readonly signMessageHashRecoverableCompact: ( + signMessageHashRecoverableCompact: ( privateKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => RecoverableSignature | string; /** @@ -325,9 +311,9 @@ export interface Secp256k1 { * @param privateKey - a valid secp256k1, 32-byte private key * @param messageHash - the 32-byte message hash to be signed */ - readonly signMessageHashSchnorr: ( + signMessageHashSchnorr: ( privateKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => Uint8Array | string; /** @@ -343,7 +329,7 @@ export interface Secp256k1 { * * @param publicKey - a public key to uncompress */ - readonly uncompressPublicKey: (publicKey: Uint8Array) => Uint8Array | string; + uncompressPublicKey: (publicKey: Uint8Array) => Uint8Array | string; /** * Verify that a private key is valid for secp256k1. Note, this library @@ -360,7 +346,7 @@ export interface Secp256k1 { * * @param privateKey - a 32-byte private key to validate */ - readonly validatePrivateKey: (privateKey: Uint8Array) => boolean; + validatePrivateKey: (privateKey: Uint8Array) => boolean; /** * Verify that a public key is valid for secp256k1. @@ -369,7 +355,7 @@ export interface Secp256k1 { * * @param publicKey - a public key to validate */ - readonly validatePublicKey: (publicKey: Uint8Array) => boolean; + validatePublicKey: (publicKey: Uint8Array) => boolean; /** * Normalize a signature to lower-S form, then `verifySignatureCompactLowS`. @@ -379,10 +365,10 @@ export interface Secp256k1 { * uncompressed (65-byte) format * @param messageHash - the 32-byte message hash signed by the signature */ - readonly verifySignatureCompact: ( + verifySignatureCompact: ( signature: Uint8Array, publicKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => boolean; /** @@ -395,10 +381,10 @@ export interface Secp256k1 { * uncompressed (65-byte) format * @param messageHash - the 32-byte message hash signed by the signature */ - readonly verifySignatureCompactLowS: ( + verifySignatureCompactLowS: ( signature: Uint8Array, publicKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => boolean; /** @@ -409,10 +395,10 @@ export interface Secp256k1 { * uncompressed (65-byte) format * @param messageHash - the 32-byte message hash signed by the signature */ - readonly verifySignatureDER: ( + verifySignatureDER: ( signature: Uint8Array, publicKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => boolean; /** @@ -425,10 +411,10 @@ export interface Secp256k1 { * uncompressed (65-byte) format * @param messageHash - the 32-byte message hash signed by the signature */ - readonly verifySignatureDERLowS: ( + verifySignatureDERLowS: ( signature: Uint8Array, publicKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => boolean; /** @@ -439,9 +425,9 @@ export interface Secp256k1 { * uncompressed (65-byte) format * @param messageHash - the 32-byte message hash signed by the signature */ - readonly verifySignatureSchnorr: ( + verifySignatureSchnorr: ( signature: Uint8Array, publicKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => boolean; -} +}; diff --git a/src/lib/crypto/secp256k1.bench.ts b/src/lib/crypto/secp256k1.bench.ts index a3a2f7f5..3fec9910 100644 --- a/src/lib/crypto/secp256k1.bench.ts +++ b/src/lib/crypto/secp256k1.bench.ts @@ -2,12 +2,13 @@ import { randomBytes } from 'crypto'; import test from 'ava'; + +import { binToHex, generatePrivateKey, instantiateSecp256k1 } from '../lib.js'; + import suite from 'chuhai'; import elliptic from 'elliptic'; import secp256k1Node from 'secp256k1'; -import { binToHex, generatePrivateKey, instantiateSecp256k1 } from '../lib.js'; - const secp256k1Promise = instantiateSecp256k1(); const privateKeyLength = 32; @@ -38,11 +39,11 @@ test('bench: secp256k1: verify signature Low-S, uncompressed pubkey', async (t) const privKey = generatePrivateKey(secureRandom); messageHash = randomBytes(privateKeyLength); pubkeyUncompressed = secp256k1.derivePublicKeyUncompressed( - privKey + privKey, ) as Uint8Array; ellipticPublicKey = ellipticEc.keyFromPublic( binToHex(pubkeyUncompressed), - 'hex' + 'hex', ); sigDER = secp256k1.signMessageHashDER(privKey, messageHash) as Uint8Array; result = false; @@ -52,7 +53,7 @@ test('bench: secp256k1: verify signature Low-S, uncompressed pubkey', async (t) result = secp256k1.verifySignatureDERLowS( sigDER, pubkeyUncompressed, - messageHash + messageHash, ); }); s.bench('elliptic', () => { @@ -64,7 +65,7 @@ test('bench: secp256k1: verify signature Low-S, uncompressed pubkey', async (t) result = secp256k1Node.ecdsaVerify( secp256k1Node.signatureImport(sigDER), messageHash, - pubkeyUncompressed + pubkeyUncompressed, ); }); s.cycle(() => { @@ -86,11 +87,11 @@ test('bench: secp256k1: verify signature Low-S, compressed pubkey', async (t) => const privKey = generatePrivateKey(secureRandom); messageHash = randomBytes(privateKeyLength); pubkeyCompressed = secp256k1.derivePublicKeyCompressed( - privKey + privKey, ) as Uint8Array; ellipticPublicKey = ellipticEc.keyFromPublic( binToHex(pubkeyCompressed), - 'hex' + 'hex', ); sigDER = secp256k1.signMessageHashDER(privKey, messageHash) as Uint8Array; result = false; @@ -100,7 +101,7 @@ test('bench: secp256k1: verify signature Low-S, compressed pubkey', async (t) => result = secp256k1.verifySignatureDERLowS( sigDER, pubkeyCompressed, - messageHash + messageHash, ); }); s.bench('elliptic', () => { @@ -112,7 +113,7 @@ test('bench: secp256k1: verify signature Low-S, compressed pubkey', async (t) => result = secp256k1Node.ecdsaVerify( secp256k1Node.signatureImport(sigDER), messageHash, - pubkeyCompressed + pubkeyCompressed, ); }); s.cycle(() => { @@ -131,18 +132,18 @@ test('bench: secp256k1: derive compressed pubkey', async (t) => { const nextCycle = () => { privKey = generatePrivateKey(secureRandom); pubkeyCompressedExpected = secp256k1.derivePublicKeyCompressed( - privKey + privKey, ) as Uint8Array; }; nextCycle(); s.bench('libauth', () => { pubkeyCompressedBenchmark = secp256k1.derivePublicKeyCompressed( - privKey + privKey, ) as Uint8Array; }); s.bench('elliptic', () => { pubkeyCompressedBenchmark = Uint8Array.from( - ellipticEc.keyFromPrivate(privKey).getPublic().encodeCompressed() + ellipticEc.keyFromPrivate(privKey).getPublic().encodeCompressed(), ); }); s.bench('secp256k1-node', () => { @@ -167,24 +168,24 @@ test('bench: secp256k1: create DER Low-S signature', async (t) => { messageHash = randomBytes(privateKeyLength); sigDERExpected = secp256k1.signMessageHashDER( privKey, - messageHash + messageHash, ) as Uint8Array; }; nextCycle(); s.bench('libauth', () => { sigDERBenchmark = secp256k1.signMessageHashDER( privKey, - messageHash + messageHash, ) as Uint8Array; }); s.bench('elliptic', () => { sigDERBenchmark = Uint8Array.from( - ellipticEc.keyFromPrivate(privKey).sign(messageHash).toDER() + ellipticEc.keyFromPrivate(privKey).sign(messageHash).toDER(), ); }); s.bench('secp256k1-node', () => { sigDERBenchmark = secp256k1Node.signatureExport( - secp256k1Node.ecdsaSign(messageHash, privKey).signature + secp256k1Node.ecdsaSign(messageHash, privKey).signature, ); }); s.cycle(() => { @@ -195,7 +196,7 @@ test('bench: secp256k1: create DER Low-S signature', async (t) => { */ t.deepEqual( sigDERExpected, - secp256k1.normalizeSignatureDER(new Uint8Array(sigDERBenchmark)) + secp256k1.normalizeSignatureDER(new Uint8Array(sigDERBenchmark)), ); nextCycle(); }); @@ -217,11 +218,11 @@ test('bench: secp256k1: sign: Schnorr vs. ECDSA', async (t) => { messageHash = randomBytes(privateKeyLength); sigDERExpected = secp256k1.signMessageHashDER( privKey, - messageHash + messageHash, ) as Uint8Array; sigSchnorrExpected = secp256k1.signMessageHashSchnorr( privKey, - messageHash + messageHash, ) as Uint8Array; }; nextCycle(); @@ -229,14 +230,14 @@ test('bench: secp256k1: sign: Schnorr vs. ECDSA', async (t) => { isSchnorr = false; sigDERBenchmark = secp256k1.signMessageHashDER( privKey, - messageHash + messageHash, ) as Uint8Array; }); s.bench('secp256k1.signMessageHashSchnorr', () => { isSchnorr = true; sigSchnorrBenchmark = secp256k1.signMessageHashSchnorr( privKey, - messageHash + messageHash, ) as Uint8Array; }); s.cycle(() => { @@ -263,12 +264,12 @@ test('bench: secp256k1: verify: Schnorr vs. ECDSA', async (t) => { const privKey = generatePrivateKey(secureRandom); messageHash = randomBytes(privateKeyLength); pubkeyCompressed = secp256k1.derivePublicKeyCompressed( - privKey + privKey, ) as Uint8Array; sigDER = secp256k1.signMessageHashDER(privKey, messageHash) as Uint8Array; sigSchnorr = secp256k1.signMessageHashSchnorr( privKey, - messageHash + messageHash, ) as Uint8Array; result = false; }; @@ -279,9 +280,9 @@ test('bench: secp256k1: verify: Schnorr vs. ECDSA', async (t) => { result = secp256k1.verifySignatureDERLowS( sigDER, pubkeyCompressed, - messageHash + messageHash, ); - } + }, ); s.bench( 'secp256k1.verifySignatureSchnorr (Schnorr, pubkey compressed)', @@ -289,9 +290,9 @@ test('bench: secp256k1: verify: Schnorr vs. ECDSA', async (t) => { result = secp256k1.verifySignatureSchnorr( sigSchnorr, pubkeyCompressed, - messageHash + messageHash, ); - } + }, ); s.cycle(() => { t.true(result); diff --git a/src/lib/crypto/secp256k1.spec.ts b/src/lib/crypto/secp256k1.spec.ts index 9eaff452..70da5baf 100644 --- a/src/lib/crypto/secp256k1.spec.ts +++ b/src/lib/crypto/secp256k1.spec.ts @@ -1,13 +1,10 @@ -/* eslint-disable max-lines, max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-argument */ +/* eslint-disable max-lines, @typescript-eslint/max-params, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-argument */ // cspell:ignore recid /* global Buffer */ import { randomBytes } from 'crypto'; import test from 'ava'; -import elliptic from 'elliptic'; -import fc from 'fast-check'; -import secp256k1Node from 'secp256k1'; import type { RecoverableSignature } from '../lib.js'; import { @@ -18,6 +15,10 @@ import { Secp256k1Error, } from '../lib.js'; +import elliptic from 'elliptic'; +import fc from 'fast-check'; +import secp256k1Node from 'secp256k1'; + // test vectors (from `zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo zoo wrong`, m/0 and m/1): // prettier-ignore @@ -88,7 +89,7 @@ const ec = new elliptic.ec('secp256k1'); // eslint-disable-line new-cap const setupElliptic = (privateKey: Uint8Array) => { const key = ec.keyFromPrivate(privateKey); const pubUncompressed = new Uint8Array( - key.getPublic().encode('array', false) + key.getPublic().encode('array', false), ); const pubCompressed = new Uint8Array(key.getPublic().encodeCompressed()); return { @@ -104,7 +105,7 @@ const ellipticCheckSignature = ( sig: Uint8Array, // eslint-disable-next-line @typescript-eslint/no-explicit-any key: any, - message: Uint8Array + message: Uint8Array, ): boolean => key.verify(message, sig); // fast-check helpers @@ -114,20 +115,20 @@ const fcUint8Array = (minLength: number, maxLength: number) => .map((a) => Uint8Array.from(a)); const fcUint8Array32 = () => fcUint8Array(32, 32); const fcValidPrivateKey = fcUint8Array32().filter((generated) => - internalSecp256k1.validatePrivateKey(generated) + internalSecp256k1.validatePrivateKey(generated), ); test('[crypto] instantiateSecp256k1 with binary', async (t) => { const secp256k1 = await instantiateSecp256k1Bytes(binary); t.true( - secp256k1.verifySignatureDERLowS(sigDER, pubkeyCompressed, messageHash) + secp256k1.verifySignatureDERLowS(sigDER, pubkeyCompressed, messageHash), ); }); test('[crypto] instantiateSecp256k1 with randomization', async (t) => { const secp256k1 = await instantiateSecp256k1(randomBytes(32)); t.true( - secp256k1.verifySignatureDERLowS(sigDER, pubkeyUncompressed, messageHash) + secp256k1.verifySignatureDERLowS(sigDER, pubkeyUncompressed, messageHash), ); }); @@ -135,11 +136,11 @@ test('[crypto] secp256k1.addTweakPrivateKey', async (t) => { const secp256k1 = await secp256k1Promise; t.deepEqual( secp256k1.addTweakPrivateKey(privkey, keyTweakVal), - privkeyTweakedAdd + privkeyTweakedAdd, ); t.deepEqual( secp256k1.addTweakPrivateKey(privkey, Buffer.alloc(32, 255)), - Secp256k1Error.addTweakPrivateKey + Secp256k1Error.addTweakPrivateKey, ); }); @@ -151,10 +152,10 @@ test('[fast-check] [crypto] secp256k1.addTweakPrivateKey', async (t) => { t.deepEqual( secp256k1.addTweakPrivateKey(privateKey, keyTweakVal), new Uint8Array( - secp256k1Node.privateKeyTweakAdd(privateKey, keyTweakVal) - ) + secp256k1Node.privateKeyTweakAdd(privateKey, keyTweakVal), + ), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -169,23 +170,23 @@ test('[crypto] secp256k1.addTweakPublicKeyCompressed', (t) => { t.deepEqual( internalSecp256k1.addTweakPublicKeyCompressed( pubkeyCompressed, - keyTweakVal + keyTweakVal, ), - pubkeyTweakedAddCompressed + pubkeyTweakedAddCompressed, ); t.deepEqual( internalSecp256k1.addTweakPublicKeyCompressed( new Uint8Array(65), - keyTweakVal + keyTweakVal, ), - Secp256k1Error.unparsablePublicKey + Secp256k1Error.unparsablePublicKey, ); t.deepEqual( internalSecp256k1.addTweakPublicKeyCompressed( pubkeyCompressed, - Buffer.alloc(32, 255) + Buffer.alloc(32, 255), ), - Secp256k1Error.addTweakPublicKey + Secp256k1Error.addTweakPublicKey, ); }); @@ -195,15 +196,15 @@ test('[fast-check] [crypto] secp256k1.addTweakPublicKeyCompressed', async (t) => fcValidPrivateKey, (privateKey) => { const pubkeyC = secp256k1.derivePublicKeyCompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( secp256k1.addTweakPublicKeyCompressed(pubkeyC, keyTweakVal), new Uint8Array( - secp256k1Node.publicKeyTweakAdd(pubkeyC, keyTweakVal, true) - ) + secp256k1Node.publicKeyTweakAdd(pubkeyC, keyTweakVal, true), + ), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -218,23 +219,23 @@ test('[crypto] secp256k1.addTweakPublicKeyUncompressed', (t) => { t.deepEqual( internalSecp256k1.addTweakPublicKeyUncompressed( pubkeyUncompressed, - keyTweakVal + keyTweakVal, ), - pubkeyTweakedAddUncompressed + pubkeyTweakedAddUncompressed, ); t.deepEqual( internalSecp256k1.addTweakPublicKeyUncompressed( new Uint8Array(65), - keyTweakVal + keyTweakVal, ), - Secp256k1Error.unparsablePublicKey + Secp256k1Error.unparsablePublicKey, ); t.deepEqual( internalSecp256k1.addTweakPublicKeyUncompressed( pubkeyCompressed, - Buffer.alloc(32, 255) + Buffer.alloc(32, 255), ), - Secp256k1Error.addTweakPublicKey + Secp256k1Error.addTweakPublicKey, ); }); @@ -244,15 +245,15 @@ test('[fast-check] [crypto] secp256k1.addTweakPublicKeyUncompressed', async (t) fcValidPrivateKey, (privateKey) => { const pubkeyU = secp256k1.derivePublicKeyUncompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( secp256k1.addTweakPublicKeyUncompressed(pubkeyU, keyTweakVal), new Uint8Array( - secp256k1Node.publicKeyTweakAdd(pubkeyU, keyTweakVal, false) - ) + secp256k1Node.publicKeyTweakAdd(pubkeyU, keyTweakVal, false), + ), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -266,11 +267,11 @@ test('[fast-check] [crypto] secp256k1.addTweakPublicKeyUncompressed', async (t) test('[crypto] secp256k1.compressPublicKey', (t) => { t.deepEqual( internalSecp256k1.compressPublicKey(pubkeyUncompressed), - pubkeyCompressed + pubkeyCompressed, ); t.deepEqual( internalSecp256k1.compressPublicKey(new Uint8Array(65)), - Secp256k1Error.unparsablePublicKey + Secp256k1Error.unparsablePublicKey, ); }); @@ -278,13 +279,13 @@ test('[fast-check] [crypto] secp256k1.compressPublicKey', async (t) => { const secp256k1 = await secp256k1Promise; const reversesUncompress = fc.property(fcValidPrivateKey, (privateKey) => { const pubkeyC = secp256k1.derivePublicKeyCompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( pubkeyC, secp256k1.compressPublicKey( - secp256k1.uncompressPublicKey(pubkeyC) as Uint8Array - ) + secp256k1.uncompressPublicKey(pubkeyC) as Uint8Array, + ), ); }); @@ -292,22 +293,22 @@ test('[fast-check] [crypto] secp256k1.compressPublicKey', async (t) => { fcValidPrivateKey, (privateKey) => { const pubkeyU = secp256k1.derivePublicKeyUncompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( secp256k1.compressPublicKey(pubkeyU), - new Uint8Array(secp256k1Node.publicKeyConvert(pubkeyU, true)) + new Uint8Array(secp256k1Node.publicKeyConvert(pubkeyU, true)), ); - } + }, ); const equivalentToElliptic = fc.property(fcValidPrivateKey, (privateKey) => { const pubkeyU = secp256k1.derivePublicKeyUncompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( secp256k1.compressPublicKey(pubkeyU), - new Uint8Array(ec.keyFromPublic(pubkeyU).getPublic().encodeCompressed()) + new Uint8Array(ec.keyFromPublic(pubkeyU).getPublic().encodeCompressed()), ); }); t.notThrows(() => { @@ -320,11 +321,11 @@ test('[fast-check] [crypto] secp256k1.compressPublicKey', async (t) => { test('[crypto] secp256k1.derivePublicKeyCompressed', (t) => { t.deepEqual( internalSecp256k1.derivePublicKeyCompressed(privkey), - pubkeyCompressed + pubkeyCompressed, ); t.deepEqual( internalSecp256k1.derivePublicKeyCompressed(secp256k1OrderN), - Secp256k1Error.derivePublicKeyFromInvalidPrivateKey + Secp256k1Error.derivePublicKeyFromInvalidPrivateKey, ); }); @@ -334,11 +335,11 @@ test('[fast-check] [crypto] secp256k1.derivePublicKeyCompressed', async (t) => { fcValidPrivateKey, (privateKey) => { const pubkeyU = secp256k1.derivePublicKeyUncompressed( - privateKey + privateKey, ) as Uint8Array; const pubkeyC = secp256k1.derivePublicKeyCompressed(privateKey); t.deepEqual(pubkeyC, secp256k1.compressPublicKey(pubkeyU)); - } + }, ); const equivalentToSecp256k1Node = fc.property( @@ -346,15 +347,15 @@ test('[fast-check] [crypto] secp256k1.derivePublicKeyCompressed', async (t) => { (privateKey) => { t.deepEqual( secp256k1.derivePublicKeyCompressed(privateKey), - new Uint8Array(secp256k1Node.publicKeyCreate(privateKey, true)) + new Uint8Array(secp256k1Node.publicKeyCreate(privateKey, true)), ); - } + }, ); const equivalentToElliptic = fc.property(fcValidPrivateKey, (privateKey) => { t.deepEqual( secp256k1.derivePublicKeyCompressed(privateKey), - setupElliptic(privateKey).pubCompressed + setupElliptic(privateKey).pubCompressed, ); }); t.notThrows(() => { @@ -367,11 +368,11 @@ test('[fast-check] [crypto] secp256k1.derivePublicKeyCompressed', async (t) => { test('[crypto] secp256k1.derivePublicKeyUncompressed', (t) => { t.deepEqual( internalSecp256k1.derivePublicKeyUncompressed(privkey), - pubkeyUncompressed + pubkeyUncompressed, ); t.deepEqual( internalSecp256k1.derivePublicKeyUncompressed(secp256k1OrderN), - Secp256k1Error.derivePublicKeyFromInvalidPrivateKey + Secp256k1Error.derivePublicKeyFromInvalidPrivateKey, ); }); @@ -381,11 +382,11 @@ test('[fast-check] [crypto] secp256k1.derivePublicKeyUncompressed', async (t) => fcValidPrivateKey, (privateKey) => { const pubkeyC = secp256k1.derivePublicKeyCompressed( - privateKey + privateKey, ) as Uint8Array; const pubkeyU = secp256k1.derivePublicKeyUncompressed(privateKey); t.deepEqual(pubkeyU, secp256k1.uncompressPublicKey(pubkeyC)); - } + }, ); const equivalentToSecp256k1Node = fc.property( @@ -393,15 +394,15 @@ test('[fast-check] [crypto] secp256k1.derivePublicKeyUncompressed', async (t) => (privateKey) => { t.deepEqual( secp256k1.derivePublicKeyUncompressed(privateKey), - new Uint8Array(secp256k1Node.publicKeyCreate(privateKey, false)) + new Uint8Array(secp256k1Node.publicKeyCreate(privateKey, false)), ); - } + }, ); const equivalentToElliptic = fc.property(fcValidPrivateKey, (privateKey) => { t.deepEqual( secp256k1.derivePublicKeyUncompressed(privateKey), - setupElliptic(privateKey).pubUncompressed + setupElliptic(privateKey).pubUncompressed, ); }); t.notThrows(() => { @@ -423,11 +424,11 @@ test('[fast-check] [crypto] secp256k1.malleateSignatureDER', async (t) => { (privateKey, message) => { const { key } = setupElliptic(privateKey); const pubkey = secp256k1.derivePublicKeyCompressed( - privateKey + privateKey, ) as Uint8Array; const sig = secp256k1.signMessageHashDER( privateKey, - message + message, ) as Uint8Array; t.true(secp256k1.verifySignatureDERLowS(sig, pubkey, message)); t.true(ellipticCheckSignature(sig, key, message)); @@ -436,7 +437,7 @@ test('[fast-check] [crypto] secp256k1.malleateSignatureDER', async (t) => { t.true(ellipticCheckSignature(malleated, key, message)); t.false(secp256k1.verifySignatureDERLowS(malleated, pubkey, message)); t.deepEqual(sig, secp256k1.malleateSignatureDER(malleated)); - } + }, ); t.notThrows(() => { fc.assert(malleationIsJustNegation); @@ -446,7 +447,7 @@ test('[fast-check] [crypto] secp256k1.malleateSignatureDER', async (t) => { test('[crypto] secp256k1.malleateSignatureCompact', (t) => { t.deepEqual( internalSecp256k1.malleateSignatureCompact(sigCompact), - sigCompactHighS + sigCompactHighS, ); }); @@ -457,11 +458,11 @@ test('[fast-check] [crypto] secp256k1.malleateSignatureCompact', async (t) => { fcUint8Array32(), (privateKey, message) => { const pubkey = secp256k1.derivePublicKeyCompressed( - privateKey + privateKey, ) as Uint8Array; const sig = secp256k1.signMessageHashCompact( privateKey, - message + message, ) as Uint8Array; t.true(secp256k1.verifySignatureCompactLowS(sig, pubkey, message)); t.true(secp256k1Node.ecdsaVerify(sig, message, pubkey)); @@ -470,18 +471,18 @@ test('[fast-check] [crypto] secp256k1.malleateSignatureCompact', async (t) => { t.false(secp256k1.verifySignatureCompactLowS(malleated, pubkey, message)); t.false(secp256k1Node.ecdsaVerify(malleated, message, pubkey)); const malleatedMalleated = secp256k1.malleateSignatureCompact( - malleated + malleated, ) as Uint8Array; t.true(secp256k1Node.ecdsaVerify(malleatedMalleated, message, pubkey)); t.true( secp256k1.verifySignatureCompactLowS( malleatedMalleated, pubkey, - message - ) + message, + ), ); t.deepEqual(sig, malleatedMalleated); - } + }, ); t.notThrows(() => { fc.assert(malleationIsJustNegation); @@ -491,11 +492,11 @@ test('[fast-check] [crypto] secp256k1.malleateSignatureCompact', async (t) => { test('[crypto] secp256k1.mulTweakPrivateKey', (t) => { t.deepEqual( internalSecp256k1.mulTweakPrivateKey(privkey, keyTweakVal), - privkeyTweakedMul + privkeyTweakedMul, ); t.deepEqual( internalSecp256k1.mulTweakPrivateKey(privkey, Buffer.alloc(32, 255)), - Secp256k1Error.mulTweakPrivateKey + Secp256k1Error.mulTweakPrivateKey, ); }); @@ -507,10 +508,10 @@ test('[fast-check] [crypto] secp256k1.mulTweakPrivateKey', async (t) => { t.deepEqual( secp256k1.mulTweakPrivateKey(privateKey, keyTweakVal), new Uint8Array( - secp256k1Node.privateKeyTweakMul(privateKey, keyTweakVal) - ) + secp256k1Node.privateKeyTweakMul(privateKey, keyTweakVal), + ), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -525,23 +526,23 @@ test('[crypto] secp256k1.mulTweakPublicKeyCompressed', (t) => { t.deepEqual( internalSecp256k1.mulTweakPublicKeyCompressed( pubkeyCompressed, - keyTweakVal + keyTweakVal, ), - pubkeyTweakedMulCompressed + pubkeyTweakedMulCompressed, ); t.deepEqual( internalSecp256k1.mulTweakPublicKeyCompressed( new Uint8Array(65), - keyTweakVal + keyTweakVal, ), - Secp256k1Error.unparsablePublicKey + Secp256k1Error.unparsablePublicKey, ); t.deepEqual( internalSecp256k1.mulTweakPublicKeyCompressed( pubkeyCompressed, - Buffer.alloc(32, 255) + Buffer.alloc(32, 255), ), - Secp256k1Error.mulTweakPublicKey + Secp256k1Error.mulTweakPublicKey, ); }); @@ -551,15 +552,15 @@ test('[fast-check] [crypto] secp256k1.mulTweakPublicKeyCompressed', async (t) => fcValidPrivateKey, (privateKey) => { const pubkeyC = secp256k1.derivePublicKeyCompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( secp256k1.mulTweakPublicKeyCompressed(pubkeyC, keyTweakVal), new Uint8Array( - secp256k1Node.publicKeyTweakMul(pubkeyC, keyTweakVal, true) - ) + secp256k1Node.publicKeyTweakMul(pubkeyC, keyTweakVal, true), + ), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -574,23 +575,23 @@ test('[crypto] secp256k1.mulTweakPublicKeyUncompressed', (t) => { t.deepEqual( internalSecp256k1.mulTweakPublicKeyUncompressed( pubkeyUncompressed, - keyTweakVal + keyTweakVal, ), - pubkeyTweakedMulUncompressed + pubkeyTweakedMulUncompressed, ); t.deepEqual( internalSecp256k1.mulTweakPublicKeyUncompressed( new Uint8Array(65), - keyTweakVal + keyTweakVal, ), - Secp256k1Error.unparsablePublicKey + Secp256k1Error.unparsablePublicKey, ); t.deepEqual( internalSecp256k1.mulTweakPublicKeyUncompressed( pubkeyCompressed, - Buffer.alloc(32, 255) + Buffer.alloc(32, 255), ), - Secp256k1Error.mulTweakPublicKey + Secp256k1Error.mulTweakPublicKey, ); }); @@ -600,15 +601,15 @@ test('[fast-check] [crypto] secp256k1.mulTweakPublicKeyUncompressed', async (t) fcValidPrivateKey, (privateKey) => { const pubkeyU = secp256k1.derivePublicKeyUncompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( secp256k1.mulTweakPublicKeyUncompressed(pubkeyU, keyTweakVal), new Uint8Array( - secp256k1Node.publicKeyTweakMul(pubkeyU, keyTweakVal, false) - ) + secp256k1Node.publicKeyTweakMul(pubkeyU, keyTweakVal, false), + ), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -622,7 +623,7 @@ test('[fast-check] [crypto] secp256k1.mulTweakPublicKeyUncompressed', async (t) test('[crypto] secp256k1.normalizeSignatureCompact', (t) => { t.deepEqual( internalSecp256k1.normalizeSignatureCompact(sigCompactHighS), - sigCompact + sigCompact, ); }); @@ -634,15 +635,15 @@ test('[fast-check] [crypto] secp256k1.normalizeSignatureCompact', async (t) => { (privateKey, hash) => { const sig = secp256k1.signMessageHashCompact( privateKey, - hash + hash, ) as Uint8Array; t.deepEqual( sig, secp256k1.normalizeSignatureCompact( - secp256k1.malleateSignatureCompact(sig) as Uint8Array - ) + secp256k1.malleateSignatureCompact(sig) as Uint8Array, + ), ); - } + }, ); const equivalentToSecp256k1Node = fc.property( @@ -651,14 +652,14 @@ test('[fast-check] [crypto] secp256k1.normalizeSignatureCompact', async (t) => { (privateKey, hash) => { const sig = secp256k1.signMessageHashCompact( privateKey, - hash + hash, ) as Uint8Array; const malleated = secp256k1.malleateSignatureCompact(sig) as Uint8Array; t.deepEqual( secp256k1.normalizeSignatureCompact(malleated), - new Uint8Array(secp256k1Node.signatureNormalize(malleated)) + new Uint8Array(secp256k1Node.signatureNormalize(malleated)), ); - } + }, ); t.notThrows(() => { @@ -681,10 +682,10 @@ test('[fast-check] [crypto] secp256k1.normalizeSignatureDER', async (t) => { t.deepEqual( sig, secp256k1.normalizeSignatureDER( - secp256k1.malleateSignatureDER(sig) as Uint8Array - ) + secp256k1.malleateSignatureDER(sig) as Uint8Array, + ), ); - } + }, ); const equivalentToSecp256k1Node = fc.property( @@ -698,12 +699,12 @@ test('[fast-check] [crypto] secp256k1.normalizeSignatureDER', async (t) => { new Uint8Array( secp256k1Node.signatureExport( secp256k1Node.signatureNormalize( - secp256k1Node.signatureImport(malleated) - ) - ) - ) + secp256k1Node.signatureImport(malleated), + ), + ), + ), ); - } + }, ); t.notThrows(() => { @@ -717,26 +718,26 @@ test('[crypto] secp256k1.recoverPublicKeyCompressed', (t) => { internalSecp256k1.recoverPublicKeyCompressed( sigCompact, sigRecovery, - messageHash + messageHash, ), - pubkeyCompressed + pubkeyCompressed, ); t.deepEqual( internalSecp256k1.recoverPublicKeyCompressed( new Uint8Array(64).fill(255), sigRecovery, - messageHash + messageHash, ), - Secp256k1Error.recoverPublicKeyWithUnparsableSignature + Secp256k1Error.recoverPublicKeyWithUnparsableSignature, ); const failRecover = 2; t.deepEqual( internalSecp256k1.recoverPublicKeyCompressed( sigCompact, failRecover, - messageHash + messageHash, ), - Secp256k1Error.recoverPublicKeyInvalidMaterial + Secp256k1Error.recoverPublicKeyInvalidMaterial, ); }); @@ -748,24 +749,24 @@ test('[fast-check] [crypto] secp256k1.recoverPublicKeyCompressed', async (t) => (privateKey, hash) => { const recoverableStuff = secp256k1.signMessageHashRecoverableCompact( privateKey, - hash + hash, ) as RecoverableSignature; t.deepEqual( secp256k1.recoverPublicKeyCompressed( recoverableStuff.signature, recoverableStuff.recoveryId, - hash + hash, ), new Uint8Array( secp256k1Node.ecdsaRecover( recoverableStuff.signature, recoverableStuff.recoveryId, hash, - true - ) - ) + true, + ), + ), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -777,9 +778,9 @@ test('[crypto] secp256k1.recoverPublicKeyUncompressed', (t) => { internalSecp256k1.recoverPublicKeyUncompressed( sigCompact, sigRecovery, - messageHash + messageHash, ), - pubkeyUncompressed + pubkeyUncompressed, ); }); @@ -791,24 +792,24 @@ test('[fast-check] [crypto] secp256k1.recoverPublicKeyUncompressed', async (t) = (privateKey, hash) => { const recoverableStuff = secp256k1.signMessageHashRecoverableCompact( privateKey, - hash + hash, ) as RecoverableSignature; t.deepEqual( secp256k1.recoverPublicKeyUncompressed( recoverableStuff.signature, recoverableStuff.recoveryId, - hash + hash, ), new Uint8Array( secp256k1Node.ecdsaRecover( recoverableStuff.signature, recoverableStuff.recoveryId, hash, - false - ) - ) + false, + ), + ), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -818,15 +819,15 @@ test('[fast-check] [crypto] secp256k1.recoverPublicKeyUncompressed', async (t) = test('[crypto] secp256k1.signMessageHashCompact', (t) => { t.deepEqual( internalSecp256k1.signMessageHashCompact(privkey, messageHash), - sigCompact + sigCompact, ); t.notDeepEqual( internalSecp256k1.signMessageHashCompact(privkey, Uint8Array.of()), - sigCompact + sigCompact, ); t.deepEqual( internalSecp256k1.signMessageHashCompact(secp256k1OrderN, messageHash), - Secp256k1Error.signWithInvalidPrivateKey + Secp256k1Error.signWithInvalidPrivateKey, ); }); @@ -838,9 +839,9 @@ test('[fast-check] [crypto] secp256k1.signMessageHashCompact', async (t) => { (privateKey, hash) => { t.deepEqual( secp256k1.signMessageHashCompact(privateKey, hash), - new Uint8Array(secp256k1Node.ecdsaSign(hash, privateKey).signature) + new Uint8Array(secp256k1Node.ecdsaSign(hash, privateKey).signature), ); - } + }, ); const equivalentToElliptic = fc.property( @@ -852,11 +853,11 @@ test('[fast-check] [crypto] secp256k1.signMessageHashCompact', async (t) => { secp256k1.signMessageHashCompact(privateKey, hash), secp256k1.signatureDERToCompact( secp256k1.normalizeSignatureDER( - ellipticSignMessageDER(key, hash) - ) as Uint8Array - ) + ellipticSignMessageDER(key, hash), + ) as Uint8Array, + ), ); - } + }, ); t.notThrows(() => { @@ -868,15 +869,15 @@ test('[fast-check] [crypto] secp256k1.signMessageHashCompact', async (t) => { test('[crypto] secp256k1.signMessageHashDER', (t) => { t.deepEqual( internalSecp256k1.signMessageHashDER(privkey, messageHash), - sigDER + sigDER, ); t.notDeepEqual( internalSecp256k1.signMessageHashDER(privkey, Uint8Array.of()), - sigDER + sigDER, ); t.deepEqual( internalSecp256k1.signMessageHashDER(secp256k1OrderN, messageHash), - Secp256k1Error.signWithInvalidPrivateKey + Secp256k1Error.signWithInvalidPrivateKey, ); }); @@ -890,11 +891,11 @@ test('[fast-check] [crypto] secp256k1.signMessageHashDER', async (t) => { secp256k1.signMessageHashDER(privateKey, hash), new Uint8Array( secp256k1Node.signatureExport( - secp256k1Node.ecdsaSign(hash, privateKey).signature - ) - ) + secp256k1Node.ecdsaSign(hash, privateKey).signature, + ), + ), ); - } + }, ); const equivalentToElliptic = fc.property( @@ -904,9 +905,9 @@ test('[fast-check] [crypto] secp256k1.signMessageHashDER', async (t) => { const { key } = setupElliptic(privateKey); t.deepEqual( secp256k1.signMessageHashDER(privateKey, hash), - secp256k1.normalizeSignatureDER(ellipticSignMessageDER(key, hash)) + secp256k1.normalizeSignatureDER(ellipticSignMessageDER(key, hash)), ); - } + }, ); t.notThrows(() => { @@ -918,16 +919,16 @@ test('[fast-check] [crypto] secp256k1.signMessageHashDER', async (t) => { test('[crypto] secp256k1.signMessageHashRecoverableCompact', (t) => { const recoverableStuff = internalSecp256k1.signMessageHashRecoverableCompact( privkey, - messageHash + messageHash, ) as RecoverableSignature; t.is(recoverableStuff.recoveryId, sigRecovery); t.deepEqual(recoverableStuff.signature, sigCompact); t.deepEqual( internalSecp256k1.signMessageHashRecoverableCompact( secp256k1OrderN, - messageHash + messageHash, ), - Secp256k1Error.signWithInvalidPrivateKey + Secp256k1Error.signWithInvalidPrivateKey, ); }); @@ -943,9 +944,9 @@ test('[fast-check] [crypto] secp256k1.signMessageHashRecoverableCompact', async { recoveryId: nodeRecoverableStuff.recid, signature: new Uint8Array(nodeRecoverableStuff.signature), - } + }, ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -960,13 +961,13 @@ test('[fast-check] [crypto] secp256k1.signatureCompactToDER', async (t) => { const secp256k1 = await secp256k1Promise; const reversesCompress = fc.property(fcValidPrivateKey, (privateKey) => { const pubkeyU = secp256k1.derivePublicKeyUncompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( pubkeyU, secp256k1.uncompressPublicKey( - secp256k1.compressPublicKey(pubkeyU) as Uint8Array - ) + secp256k1.compressPublicKey(pubkeyU) as Uint8Array, + ), ); }); @@ -976,13 +977,13 @@ test('[fast-check] [crypto] secp256k1.signatureCompactToDER', async (t) => { (privateKey, hash) => { const sig = secp256k1.signMessageHashCompact( privateKey, - hash + hash, ) as Uint8Array; t.deepEqual( new Uint8Array(secp256k1Node.signatureExport(sig)), - secp256k1.signatureCompactToDER(sig) + secp256k1.signatureCompactToDER(sig), ); - } + }, ); t.notThrows(() => { @@ -996,7 +997,7 @@ test('[crypto] secp256k1.signatureDERToCompact', (t) => { const sigDERWithBrokenEncoding = sigDER.slice().fill(0, 0, 1); t.deepEqual( internalSecp256k1.signatureDERToCompact(sigDERWithBrokenEncoding), - Secp256k1Error.unparsableSignature + Secp256k1Error.unparsableSignature, ); }); @@ -1009,9 +1010,9 @@ test('[fast-check] [crypto] secp256k1.signatureDERToCompact', async (t) => { const sig = secp256k1.signMessageHashDER(privateKey, hash) as Uint8Array; t.deepEqual( new Uint8Array(secp256k1Node.signatureImport(sig)), - secp256k1.signatureDERToCompact(sig) + secp256k1.signatureDERToCompact(sig), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -1021,11 +1022,11 @@ test('[fast-check] [crypto] secp256k1.signatureDERToCompact', async (t) => { test('[crypto] secp256k1.uncompressPublicKey', (t) => { t.deepEqual( internalSecp256k1.uncompressPublicKey(pubkeyCompressed), - pubkeyUncompressed + pubkeyUncompressed, ); t.deepEqual( internalSecp256k1.uncompressPublicKey(new Uint8Array(33)), - Secp256k1Error.unparsablePublicKey + Secp256k1Error.unparsablePublicKey, ); }); @@ -1035,13 +1036,13 @@ test('[fast-check] [crypto] secp256k1.uncompressPublicKey', async (t) => { fcValidPrivateKey, (privateKey) => { const pubkeyC = secp256k1.derivePublicKeyCompressed( - privateKey + privateKey, ) as Uint8Array; t.deepEqual( new Uint8Array(secp256k1Node.publicKeyConvert(pubkeyC, false)), - secp256k1.uncompressPublicKey(pubkeyC) + secp256k1.uncompressPublicKey(pubkeyC), ); - } + }, ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -1070,7 +1071,7 @@ test('[fast-check] [crypto] secp256k1.validatePrivateKey', async (t) => { .map((random) => Uint8Array.from([...almostInvalid, ...random])), (privateKey) => secp256k1.validatePrivateKey(privateKey) === - secp256k1Node.privateKeyVerify(privateKey) + secp256k1Node.privateKeyVerify(privateKey), ); t.notThrows(() => { fc.assert(equivalentToSecp256k1Node); @@ -1090,29 +1091,29 @@ test('[crypto] secp256k1.verifySignatureCompact', (t) => { internalSecp256k1.verifySignatureCompact( sigCompactHighS, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureCompact( sigCompactHighS, pubkeyCompressed, - Uint8Array.of() - ) + Uint8Array.of(), + ), ); t.true( internalSecp256k1.verifySignatureCompact( sigCompactHighS, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureCompact( Uint8Array.of(), pubkeyCompressed, - messageHash - ) + messageHash, + ), ); }); @@ -1130,13 +1131,13 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompact', async (t) => { const testSig = invalidate ? sig.fill(0, 6, 7) : sig; const pub = compressed ? pubCompressed : pubUncompressed; const malleated = secp256k1.malleateSignatureCompact( - testSig + testSig, ) as Uint8Array; return ( secp256k1Node.ecdsaVerify(testSig, message, pub) === secp256k1.verifySignatureCompact(malleated, pub, message) ); - } + }, ); const equivalentToElliptic = fc.property( @@ -1154,7 +1155,7 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompact', async (t) => { ellipticCheckSignature(testSig, key, message) === secp256k1.verifySignatureCompact(compactSig, pub, message) ); - } + }, ); t.notThrows(() => { @@ -1168,29 +1169,29 @@ test('[crypto] secp256k1.verifySignatureCompactLowS', (t) => { internalSecp256k1.verifySignatureCompactLowS( sigCompact, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureCompactLowS( Uint8Array.of(), pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.true( internalSecp256k1.verifySignatureCompactLowS( sigCompact, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureCompactLowS( sigCompact, pubkeyCompressed, - Uint8Array.of() - ) + Uint8Array.of(), + ), ); }); @@ -1211,7 +1212,7 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompactLowS', async (t) => secp256k1Node.ecdsaVerify(testSig, message, pub) === secp256k1.verifySignatureCompactLowS(testSig, pub, message) ); - } + }, ); const equivalentToElliptic = fc.property( @@ -1222,7 +1223,7 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompactLowS', async (t) => (privateKey, message, compressed, invalidate) => { const { key, pubUncompressed, pubCompressed } = setupElliptic(privateKey); const sig = secp256k1.normalizeSignatureDER( - ellipticSignMessageDER(key, message) + ellipticSignMessageDER(key, message), ) as Uint8Array; const testSig = invalidate ? sig.fill(0, 6, 20) : sig; const pub = compressed ? pubCompressed : pubUncompressed; @@ -1231,7 +1232,7 @@ test('[fast-check] [crypto] secp256k1.verifySignatureCompactLowS', async (t) => ellipticCheckSignature(testSig, key, message) === secp256k1.verifySignatureCompactLowS(compactSig, pub, message) ); - } + }, ); t.notThrows(() => { @@ -1245,50 +1246,50 @@ test('[crypto] secp256k1.verifySignatureDER', (t) => { internalSecp256k1.verifySignatureDER( sigDERHighS, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureDER( Uint8Array.of(), pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.true( internalSecp256k1.verifySignatureDER( sigDERHighS, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureDER( sigDERHighS, pubkeyCompressed, - Uint8Array.of() - ) + Uint8Array.of(), + ), ); t.false( internalSecp256k1.verifySignatureDER( Uint8Array.of(), pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.true( internalSecp256k1.verifySignatureDER( sigDERHighS, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureDER( sigDERHighS, pubkeyCompressed, - Uint8Array.of() - ) + Uint8Array.of(), + ), ); }); @@ -1297,74 +1298,74 @@ test('[crypto] secp256k1.verifySignatureDERLowS', (t) => { internalSecp256k1.verifySignatureDERLowS( sigDER, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureDERLowS( Uint8Array.of(), pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.true( internalSecp256k1.verifySignatureDERLowS( sigDER, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureDERLowS( sigDER, pubkeyCompressed, - Uint8Array.of() - ) + Uint8Array.of(), + ), ); t.false( internalSecp256k1.verifySignatureDERLowS( Uint8Array.of(), pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.true( internalSecp256k1.verifySignatureDERLowS( sigDER, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); t.false( internalSecp256k1.verifySignatureDERLowS( sigDER, pubkeyCompressed, - Uint8Array.of() - ) + Uint8Array.of(), + ), ); const pubkeyWithBrokenEncoding = pubkeyCompressed.slice().fill(0, 0, 1); t.false( internalSecp256k1.verifySignatureDERLowS( sigDER, pubkeyWithBrokenEncoding, - messageHash - ) + messageHash, + ), ); const sigDERWithBrokenEncoding = sigDER.slice().fill(0, 0, 1); t.false( internalSecp256k1.verifySignatureDERLowS( sigDERWithBrokenEncoding, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); const sigDERWithBadSignature = sigDER.slice().fill(0, 6, 7); t.false( internalSecp256k1.verifySignatureDERLowS( sigDERWithBadSignature, pubkeyCompressed, - messageHash - ) + messageHash, + ), ); }); @@ -1387,7 +1388,7 @@ test('[fast-check] [crypto] secp256k1.verifySignatureDERLowS', async (t) => { secp256k1Node.ecdsaVerify(imported, message, pub) === secp256k1.verifySignatureDERLowS(testSig, pub, message) ); - } + }, ); const equivalentToElliptic = fc.property( @@ -1405,10 +1406,10 @@ test('[fast-check] [crypto] secp256k1.verifySignatureDERLowS', async (t) => { secp256k1.verifySignatureDERLowS( secp256k1.normalizeSignatureDER(testSig) as Uint8Array, pub, - message + message, ) ); - } + }, ); t.notThrows(() => { @@ -1420,15 +1421,15 @@ test('[fast-check] [crypto] secp256k1.verifySignatureDERLowS', async (t) => { test('[crypto] secp256k1.signMessageHashSchnorr', (t) => { t.deepEqual( internalSecp256k1.signMessageHashSchnorr(privkey, schnorrMsgHash), - sigSchnorr + sigSchnorr, ); t.notDeepEqual( internalSecp256k1.signMessageHashSchnorr(Uint8Array.of(), schnorrMsgHash), - sigSchnorr + sigSchnorr, ); t.deepEqual( internalSecp256k1.signMessageHashSchnorr(secp256k1OrderN, schnorrMsgHash), - Secp256k1Error.signWithInvalidPrivateKey + Secp256k1Error.signWithInvalidPrivateKey, ); }); @@ -1440,21 +1441,21 @@ test('[fast-check] [crypto] secp256k1.signMessageHashSchnorr', async (t) => { fc.boolean(), (privateKey, hash, invalidate) => { const publicKey = secp256k1.derivePublicKeyCompressed( - privateKey + privateKey, ) as Uint8Array; const signature = secp256k1.signMessageHashSchnorr( privateKey, - hash + hash, ) as Uint8Array; t.is( secp256k1.verifySignatureSchnorr( invalidate ? signature : signature.fill(0), publicKey, - hash + hash, ), - invalidate + invalidate, ); - } + }, ); t.notThrows(() => { fc.assert(createsValidSignatures); @@ -1466,31 +1467,31 @@ test('[crypto] secp256k1.verifySignatureSchnorr', (t) => { internalSecp256k1.verifySignatureSchnorr( sigSchnorr, pubkeyCompressed, - schnorrMsgHash - ) + schnorrMsgHash, + ), ); t.false( internalSecp256k1.verifySignatureSchnorr( Uint8Array.of(), pubkeyCompressed, - schnorrMsgHash - ) + schnorrMsgHash, + ), ); const pubkeyWithBrokenEncoding = pubkeyCompressed.slice().fill(0, 0, 1); t.false( internalSecp256k1.verifySignatureSchnorr( sigSchnorr, pubkeyWithBrokenEncoding, - schnorrMsgHash - ) + schnorrMsgHash, + ), ); const sigSchnorrWithBadSignature = sigSchnorr.slice().fill(0, 6, 7); t.false( internalSecp256k1.verifySignatureSchnorr( sigSchnorrWithBadSignature, pubkeyCompressed, - schnorrMsgHash - ) + schnorrMsgHash, + ), ); // test vectors from Bitcoin ABC libsecp256k1 diff --git a/src/lib/crypto/secp256k1.ts b/src/lib/crypto/secp256k1.ts index 193f144e..4046aaa5 100644 --- a/src/lib/crypto/secp256k1.ts +++ b/src/lib/crypto/secp256k1.ts @@ -1,4 +1,4 @@ -/* eslint-disable functional/no-conditional-statement, functional/no-expression-statement, functional/no-return-void */ +/* eslint-disable functional/no-conditional-statements, functional/no-expression-statements, functional/no-return-void */ import type { RecoveryId, Secp256k1, Secp256k1Wasm } from '../lib.js'; import { @@ -45,7 +45,7 @@ export enum Secp256k1Error { */ const wrapSecp256k1Wasm = ( secp256k1Wasm: Secp256k1Wasm, - randomSeed?: Uint8Array + randomSeed?: Uint8Array, ): Secp256k1 => { /** * Currently, this wrapper creates a context with both SIGN and VERIFY @@ -69,7 +69,7 @@ const wrapSecp256k1Wasm = ( const publicKeyScratch = secp256k1Wasm.malloc(ByteLength.maxPublicKey); const messageHashScratch = secp256k1Wasm.malloc(ByteLength.messageHash); const internalPublicKeyPtr = secp256k1Wasm.malloc( - ByteLength.internalPublicKey + ByteLength.internalPublicKey, ); const internalSigPtr = secp256k1Wasm.malloc(ByteLength.internalSig); const schnorrSigPtr = secp256k1Wasm.malloc(ByteLength.schnorrSig); @@ -103,7 +103,7 @@ const wrapSecp256k1Wasm = ( internalPublicKeyPtr, publicKeyScratch, // eslint-disable-next-line @typescript-eslint/no-magic-numbers - publicKey.length as 33 | 65 + publicKey.length as 33 | 65, ) === 1 ); }; @@ -122,7 +122,7 @@ const wrapSecp256k1Wasm = ( publicKeyScratch, lengthPtr, internalPublicKeyPtr, - flag + flag, ); return secp256k1Wasm.readHeapU8(publicKeyScratch, getLengthPtr()).slice(); }; @@ -131,11 +131,11 @@ const wrapSecp256k1Wasm = ( compressed ? serializePublicKey( ByteLength.compressedPublicKey, - CompressionFlag.COMPRESSED + CompressionFlag.COMPRESSED, ) : serializePublicKey( ByteLength.uncompressedPublicKey, - CompressionFlag.UNCOMPRESSED + CompressionFlag.UNCOMPRESSED, ); const convertPublicKey = (compressed: boolean) => (publicKey: Uint8Array) => { @@ -153,12 +153,12 @@ const wrapSecp256k1Wasm = ( contextPtr, internalSigPtr, sigScratch, - signature.length + signature.length, ) === 1 : secp256k1Wasm.signatureParseCompact( contextPtr, internalSigPtr, - sigScratch + sigScratch, ) === 1; }; @@ -166,7 +166,7 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.signatureSerializeCompact( contextPtr, sigScratch, - internalSigPtr + internalSigPtr, ); return secp256k1Wasm.readHeapU8(sigScratch, ByteLength.compactSig).slice(); }; @@ -177,7 +177,7 @@ const wrapSecp256k1Wasm = ( contextPtr, sigScratch, lengthPtr, - internalSigPtr + internalSigPtr, ); return secp256k1Wasm.readHeapU8(sigScratch, getLengthPtr()).slice(); }; @@ -204,7 +204,7 @@ const wrapSecp256k1Wasm = ( const withPrivateKey = ( privateKey: Uint8Array, - instructions: () => T + instructions: () => T, ): T => { fillPrivateKeyPtr(privateKey); const ret = instructions(); @@ -219,8 +219,8 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.pubkeyCreate( contextPtr, internalPublicKeyPtr, - privateKeyPtr - ) !== 1 + privateKeyPtr, + ) !== 1, ); if (invalid) { @@ -239,7 +239,7 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.signatureNormalize( contextPtr, internalSigPtr, - internalSigPtr + internalSigPtr, ); }; @@ -254,7 +254,7 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.signatureMalleate( contextPtr, internalSigPtr, - internalSigPtr + internalSigPtr, ); } return isDer ? getDERSig() : getCompactSig(); @@ -263,7 +263,7 @@ const wrapSecp256k1Wasm = ( const parseAndNormalizeSignature = ( signature: Uint8Array, isDer: boolean, - normalize: boolean + normalize: boolean, ) => { const ret = parseSignature(signature, isDer); if (normalize) { @@ -281,7 +281,7 @@ const wrapSecp256k1Wasm = ( contextPtr, internalSigPtr, messageHashScratch, - privateKeyPtr + privateKeyPtr, ) !== 1; if (failed) { @@ -294,14 +294,14 @@ const wrapSecp256k1Wasm = ( contextPtr, sigScratch, lengthPtr, - internalSigPtr + internalSigPtr, ); return secp256k1Wasm.readHeapU8(sigScratch, getLengthPtr()).slice(); } secp256k1Wasm.signatureSerializeCompact( contextPtr, sigScratch, - internalSigPtr + internalSigPtr, ); return secp256k1Wasm .readHeapU8(sigScratch, ByteLength.compactSig) @@ -318,7 +318,7 @@ const wrapSecp256k1Wasm = ( contextPtr, schnorrSigPtr, messageHashScratch, - privateKeyPtr + privateKeyPtr, ) !== 1; if (failed) { @@ -338,7 +338,7 @@ const wrapSecp256k1Wasm = ( contextPtr, internalSigPtr, messageHashScratch, - internalPublicKeyPtr + internalPublicKeyPtr, ) === 1 ); }; @@ -352,7 +352,7 @@ const wrapSecp256k1Wasm = ( const verifyMessageSchnorr = ( messageHash: Uint8Array, - signature: Uint8Array + signature: Uint8Array, ) => { fillMessageHashScratch(messageHash); const paddedSignature = cloneAndPad(signature, ByteLength.schnorrSig); @@ -362,7 +362,7 @@ const wrapSecp256k1Wasm = ( contextPtr, schnorrSigPtr, messageHashScratch, - internalPublicKeyPtr + internalPublicKeyPtr, ) === 1 ); }; @@ -376,7 +376,7 @@ const wrapSecp256k1Wasm = ( const signMessageHashRecoverable = ( privateKey: Uint8Array, - messageHash: Uint8Array + messageHash: Uint8Array, ) => { fillMessageHashScratch(messageHash); return withPrivateKey(privateKey, () => { @@ -385,7 +385,7 @@ const wrapSecp256k1Wasm = ( contextPtr, internalRSigPtr, messageHashScratch, - privateKeyPtr + privateKeyPtr, ) !== 1 ) { return Secp256k1Error.signWithInvalidPrivateKey; @@ -394,7 +394,7 @@ const wrapSecp256k1Wasm = ( contextPtr, sigScratch, recoveryNumPtr, - internalRSigPtr + internalRSigPtr, ); return { @@ -411,7 +411,7 @@ const wrapSecp256k1Wasm = ( ( signature: Uint8Array, recoveryId: RecoveryId, - messageHash: Uint8Array + messageHash: Uint8Array, ) => { fillMessageHashScratch(messageHash); const paddedSignature = cloneAndPad(signature, ByteLength.maxECDSASig); @@ -421,7 +421,7 @@ const wrapSecp256k1Wasm = ( contextPtr, internalRSigPtr, sigScratch, - recoveryId + recoveryId, ) !== 1 ) { return Secp256k1Error.recoverPublicKeyWithUnparsableSignature; @@ -431,7 +431,7 @@ const wrapSecp256k1Wasm = ( contextPtr, internalPublicKeyPtr, internalRSigPtr, - messageHashScratch + messageHashScratch, ) !== 1 ) { return Secp256k1Error.recoverPublicKeyInvalidMaterial; @@ -441,7 +441,7 @@ const wrapSecp256k1Wasm = ( const addTweakPrivateKey = ( privateKey: Uint8Array, - tweakValue: Uint8Array + tweakValue: Uint8Array, ) => { fillMessageHashScratch(tweakValue); return withPrivateKey(privateKey, () => { @@ -449,7 +449,7 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.privkeyTweakAdd( contextPtr, privateKeyPtr, - messageHashScratch + messageHashScratch, ) !== 1 ) { return Secp256k1Error.addTweakPrivateKey; @@ -462,7 +462,7 @@ const wrapSecp256k1Wasm = ( const mulTweakPrivateKey = ( privateKey: Uint8Array, - tweakValue: Uint8Array + tweakValue: Uint8Array, ) => { fillMessageHashScratch(tweakValue); return withPrivateKey(privateKey, () => { @@ -470,7 +470,7 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.privkeyTweakMul( contextPtr, privateKeyPtr, - messageHashScratch + messageHashScratch, ) !== 1 ) { return Secp256k1Error.mulTweakPrivateKey; @@ -492,7 +492,7 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.pubkeyTweakAdd( contextPtr, internalPublicKeyPtr, - messageHashScratch + messageHashScratch, ) !== 1 ) { return Secp256k1Error.addTweakPublicKey; @@ -511,7 +511,7 @@ const wrapSecp256k1Wasm = ( secp256k1Wasm.pubkeyTweakMul( contextPtr, internalPublicKeyPtr, - messageHashScratch + messageHashScratch, ) !== 1 ) { return Secp256k1Error.mulTweakPublicKey; @@ -553,7 +553,7 @@ const wrapSecp256k1Wasm = ( validatePrivateKey: (privateKey) => withPrivateKey( privateKey, - () => secp256k1Wasm.seckeyVerify(contextPtr, privateKeyPtr) === 1 + () => secp256k1Wasm.seckeyVerify(contextPtr, privateKeyPtr) === 1, ), validatePublicKey: parsePublicKey, verifySignatureCompact: verifySignature(false, true), @@ -582,7 +582,7 @@ const wrapSecp256k1Wasm = ( * As most applications also benefit from deterministic, reproducible behavior, * context is not randomized by default in Libauth. To randomize the context, * provide a 32-byte Uint8Array of cryptographically strong random values - * (e.g. `Crypto.getRandomValues()`). + * (e.g. `crypto.getRandomValues(new Uint8Array(32))`). * * @param webassemblyBytes - an ArrayBuffer containing the bytes from Libauth's * `secp256k1.wasm` binary. Providing this buffer manually may be faster than @@ -592,11 +592,11 @@ const wrapSecp256k1Wasm = ( */ export const instantiateSecp256k1Bytes = async ( webassemblyBytes: ArrayBuffer, - randomSeed?: Uint8Array + randomSeed?: Uint8Array, ): Promise => wrapSecp256k1Wasm( await instantiateSecp256k1WasmBytes(webassemblyBytes), - randomSeed + randomSeed, ); /** @@ -609,6 +609,6 @@ export const instantiateSecp256k1Bytes = async ( * {@link instantiateSecp256k1Bytes} for details. */ export const instantiateSecp256k1 = async ( - randomSeed?: Uint8Array + randomSeed?: Uint8Array, ): Promise => wrapSecp256k1Wasm(await instantiateSecp256k1Wasm(), randomSeed); diff --git a/src/lib/crypto/sha1.ts b/src/lib/crypto/sha1.ts index d2e958dd..bd4bc47a 100644 --- a/src/lib/crypto/sha1.ts +++ b/src/lib/crypto/sha1.ts @@ -6,7 +6,7 @@ import { sha1Base64Bytes, } from './dependencies.js'; -export interface Sha1 extends HashFunction { +export type Sha1 = HashFunction & { /** * Finish an incremental sha1 hashing computation. * @@ -14,7 +14,7 @@ export interface Sha1 extends HashFunction { * * @param rawState - a raw state returned by `update`. */ - readonly final: (rawState: Uint8Array) => Uint8Array; + final: (rawState: Uint8Array) => Uint8Array; /** * Returns the sha1 hash of the provided input. @@ -24,7 +24,7 @@ export interface Sha1 extends HashFunction { * * @param input - a Uint8Array to be hashed using sha1 */ - readonly hash: (input: Uint8Array) => Uint8Array; + hash: (input: Uint8Array) => Uint8Array; /** * Begin an incremental sha1 hashing computation. @@ -40,7 +40,7 @@ export interface Sha1 extends HashFunction { * const hash = sha1.final(state3); * ``` */ - readonly init: () => Uint8Array; + init: () => Uint8Array; /** * Add input to an incremental sha1 hashing computation. @@ -54,8 +54,8 @@ export interface Sha1 extends HashFunction { * @param rawState - a raw state returned by either `init` or `update` * @param input - a Uint8Array to be added to the sha1 computation */ - readonly update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; -} + update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; +}; /** * The most performant way to instantiate sha1 functionality. To avoid @@ -64,7 +64,7 @@ export interface Sha1 extends HashFunction { * @param webassemblyBytes - A buffer containing the sha1 binary. */ export const instantiateSha1Bytes = async ( - webassemblyBytes: ArrayBuffer + webassemblyBytes: ArrayBuffer, ): Promise => { const wasm = await instantiateRustWasm( webassemblyBytes, @@ -72,7 +72,7 @@ export const instantiateSha1Bytes = async ( 'sha1', 'sha1_init', 'sha1_update', - 'sha1_final' + 'sha1_final', ); return { final: wasm.final, diff --git a/src/lib/crypto/sha256.ts b/src/lib/crypto/sha256.ts index 5ac97115..749902d5 100644 --- a/src/lib/crypto/sha256.ts +++ b/src/lib/crypto/sha256.ts @@ -6,7 +6,7 @@ import { sha256Base64Bytes, } from './dependencies.js'; -export interface Sha256 extends HashFunction { +export type Sha256 = HashFunction & { /** * Finish an incremental sha256 hashing computation. * @@ -14,7 +14,7 @@ export interface Sha256 extends HashFunction { * * @param rawState - a raw state returned by `update`. */ - readonly final: (rawState: Uint8Array) => Uint8Array; + final: (rawState: Uint8Array) => Uint8Array; /** * Returns the sha256 hash of the provided input. @@ -24,7 +24,7 @@ export interface Sha256 extends HashFunction { * * @param input - a Uint8Array to be hashed using sha256 */ - readonly hash: (input: Uint8Array) => Uint8Array; + hash: (input: Uint8Array) => Uint8Array; /** * Begin an incremental sha256 hashing computation. @@ -40,7 +40,7 @@ export interface Sha256 extends HashFunction { * const hash = sha256.final(state3); * ``` */ - readonly init: () => Uint8Array; + init: () => Uint8Array; /** * Add input to an incremental sha256 hashing computation. @@ -54,8 +54,8 @@ export interface Sha256 extends HashFunction { * @param rawState - a raw state returned by either `init` or `update` * @param input - a Uint8Array to be added to the sha256 computation */ - readonly update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; -} + update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; +}; /** * The most performant way to instantiate sha256 functionality. To avoid @@ -64,7 +64,7 @@ export interface Sha256 extends HashFunction { * @param webassemblyBytes - A buffer containing the sha256 binary. */ export const instantiateSha256Bytes = async ( - webassemblyBytes: ArrayBuffer + webassemblyBytes: ArrayBuffer, ): Promise => { const wasm = await instantiateRustWasm( webassemblyBytes, @@ -72,7 +72,7 @@ export const instantiateSha256Bytes = async ( 'sha256', 'sha256_init', 'sha256_update', - 'sha256_final' + 'sha256_final', ); return { final: wasm.final, diff --git a/src/lib/crypto/sha512.ts b/src/lib/crypto/sha512.ts index b21218b7..a7a3a9fb 100644 --- a/src/lib/crypto/sha512.ts +++ b/src/lib/crypto/sha512.ts @@ -6,7 +6,7 @@ import { sha512Base64Bytes, } from './dependencies.js'; -export interface Sha512 extends HashFunction { +export type Sha512 = HashFunction & { /** * Finish an incremental sha512 hashing computation. * @@ -14,7 +14,7 @@ export interface Sha512 extends HashFunction { * * @param rawState - a raw state returned by `update`. */ - readonly final: (rawState: Uint8Array) => Uint8Array; + final: (rawState: Uint8Array) => Uint8Array; /** * Returns the sha512 hash of the provided input. @@ -24,7 +24,7 @@ export interface Sha512 extends HashFunction { * * @param input - a Uint8Array to be hashed using sha512 */ - readonly hash: (input: Uint8Array) => Uint8Array; + hash: (input: Uint8Array) => Uint8Array; /** * Begin an incremental sha512 hashing computation. @@ -40,7 +40,7 @@ export interface Sha512 extends HashFunction { * const hash = sha512.final(state3); * ``` */ - readonly init: () => Uint8Array; + init: () => Uint8Array; /** * Add input to an incremental sha512 hashing computation. @@ -54,8 +54,8 @@ export interface Sha512 extends HashFunction { * @param rawState - a raw state returned by either `init` or `update` * @param input - a Uint8Array to be added to the sha512 computation */ - readonly update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; -} + update: (rawState: Uint8Array, input: Uint8Array) => Uint8Array; +}; /** * The most performant way to instantiate sha512 functionality. To avoid @@ -64,7 +64,7 @@ export interface Sha512 extends HashFunction { * @param webassemblyBytes - A buffer containing the sha512 binary. */ export const instantiateSha512Bytes = async ( - webassemblyBytes: ArrayBuffer + webassemblyBytes: ArrayBuffer, ): Promise => { const wasm = await instantiateRustWasm( webassemblyBytes, @@ -72,7 +72,7 @@ export const instantiateSha512Bytes = async ( 'sha512', 'sha512_init', 'sha512_update', - 'sha512_final' + 'sha512_final', ); return { final: wasm.final, diff --git a/src/lib/engine/engine.ts b/src/lib/engine/engine.ts new file mode 100644 index 00000000..e48eebbd --- /dev/null +++ b/src/lib/engine/engine.ts @@ -0,0 +1,8 @@ +export * from './types/bcmr-types.js'; +// export * from './types/draft-transaction-workspace-types.js'; +export * from './types/template-types.js'; +/* + * export * from './types/wallet-types.js'; + * export * from './types/wallet-activity-types.js'; + * export * from './types/wallet-set-types.js'; + */ diff --git a/src/lib/engine/types/bcmr-types.ts b/src/lib/engine/types/bcmr-types.ts new file mode 100644 index 00000000..8c4525ab --- /dev/null +++ b/src/lib/engine/types/bcmr-types.ts @@ -0,0 +1,940 @@ +// spell-checker:ignore DDTHH, ZDTC + +/** + * A mapping of identifiers to URIs associated with an entity. URI identifiers + * may be widely-standardized or registry-specific. Values must be valid URIs, + * including a protocol prefix – e.g. `https://` or `ipfs://`., Clients are only + * required to support `https` and `ipfs` URIs, but any scheme may be specified. + */ +export type URIs = { + [identifier: string]: string; +}; + +/** + * A mapping of extension identifiers to extension definitions. Extensions may + * be widely standardized or application-specific, and extension definitions + * must be either: + * + * - `string`s, + * - key-value mappings of `string`s, or + * - two-dimensional, key-value mappings of `string`s. + * + * This limitation encourages safety and wider compatibility across + * implementations. + * + * To encode an array, it is recommended that each value be assigned to a + * numeric key indicating the item's index (beginning at `0`). + * Numerically-indexed objects are often a more useful and resilient + * data-transfer format than simple arrays because they simplify difference-only + * transmission: only modified indexes need to be transferred, and shifts in + * item order must be explicit, simplifying merges of conflicting updates. + * + * For encoding of more complex data, consider using base64 and/or + * string-encoded JSON. + */ +export type Extensions = { + [extensionIdentifier: string]: + | string + | { [key: string]: string } + | { [keyA: string]: { [keyB: string]: string } }; +}; + +/** + * Tags allow registries to classify and group identities by a variety of + * characteristics. Tags are standardized within a registry and may represent + * either labels applied by that registry or designations by external + * authorities (certification, membership, ownership, etc.) that are tracked by + * that registry. + * + * Examples of possible tags include: `individual`, `organization`, `token`, + * `wallet`, `exchange`, `staking`, `utility-token`, `security-token`, + * `stablecoin`, `wrapped`, `collectable`, `deflationary`, `governance`, + * `decentralized-exchange`, `liquidity-provider`, `sidechain`, + * `sidechain-bridge`, `acme-audited`, `acme-endorsed`, etc. + * + * Tags may be used by clients in search, discovery, and filtering of + * identities, and they can also convey information like accreditation from + * investor protection organizations, public certifications by security or + * financial auditors, and other designations that signal integrity and value + * to users. + */ +export type Tag = { + /** + * The name of this tag for use in interfaces. + * + * In user interfaces with limited space, names should be hidden beyond + * the first newline character or `20` characters until revealed by the user. + * + * E.g.: + * - `Individual` + * - `Token` + * - `Audited by ACME, Inc.` + */ + name: string; + + /** + * A string describing this tag for use in user interfaces. + * + * In user interfaces with limited space, descriptions should be hidden beyond + * the first newline character or `140` characters until revealed by the user. + * + * E.g.: + * - `An identity maintained by a single individual.` + * - `An identity representing a type of token.` + * - `An on-chain application that has passed security audits by ACME, Inc.` + */ + description?: string; + + /** + * A mapping of identifiers to URIs associated with this tag. URI identifiers + * may be widely-standardized or registry-specific. Values must be valid URIs, + * including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are + * only required to support `https` and `ipfs` URIs, but any scheme may + * be specified. + * + * The following identifiers are recommended for all tags: + * - `icon` + * - `web` + * + * The following optional identifiers are standardized: + * - `blog` + * - `chat` + * - `forum` + * - `icon-intro` + * - `registry` + * - `support` + * + * For details on these standard identifiers, see: + * https://github.com/bitjson/chip-bcmr#uri-identifiers + * + * Custom URI identifiers allow for sharing social networking profiles, p2p + * connection information, and other application-specific URIs. Identifiers + * must be lowercase, alphanumeric strings, with no whitespace or special + * characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`). + * + * For example, some common identifiers include: `discord`, `docker`, + * `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, + * `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, + * `youtube`. + */ + uris?: URIs; + + /** + * A mapping of `Tag` extension identifiers to extension definitions. + * {@link Extensions} may be widely standardized or application-specific. + */ + extensions?: Extensions; +}; + +/** + * A definition for one type of NFT within a token category. + */ +export type NftType = { + /** + * The name of this NFT type for use in interfaces. Names longer than `20` + * characters may be elided in some interfaces. + * + * E.g. `Market Order Buys`, `Limit Order Sales`, `Pledge Receipts`, + * `ACME Stadium Tickets`, `Sealed Votes`, etc. + */ + name: string; + + /** + * A string describing this NFT type for use in user interfaces. + * + * In user interfaces with limited space, names should be hidden beyond the + * first newline character or `140` characters until revealed by the user. + * + * E.g.: + * - "Receipts issued by the exchange to record details about purchases. After + * settlement, these receipts are redeemed for the purchased tokens."; + * - "Receipts issued by the crowdfunding campaign to document the value of + * funds pledged. If the user decides to cancel their pledge before the + * campaign completes, these receipts can be redeemed for a full refund."; + * - "Tickets issued for events at ACME Stadium."; + * - Sealed ballots certified by ACME decentralized organization during the + * voting period. After the voting period ends, these ballots must be revealed + * to reclaim the tokens used for voting." + */ + description?: string; + + /** + * A list of identifiers for fields contained in NFTs of this type. On + * successful parsing evaluations, the bottom item on the altstack indicates + * the matched NFT type, and the remaining altstack items represent NFT field + * contents in the order listed (where `fields[0]` is the second-to-bottom + * item, and the final item in `fields` is the top of the altstack). + * + * Fields should be ordered by recommended importance from most important to + * least important; in user interfaces, clients should display fields at lower + * indexes more prominently than those at higher indexes, e.g. if some fields + * cannot be displayed in minimized interfaces, higher-importance fields can + * still be represented. (Note, this ordering is controlled by the bytecode + * specified in `token.nft.parse.bytecode`.) + * + * If this is a sequential NFT, (the category's `parse.bytecode` is + * undefined), `fields` should be omitted or set to `undefined`. + */ + fields?: string[]; + + /** + * A mapping of identifiers to URIs associated with this NFT type. URI + * identifiers may be widely-standardized or registry-specific. Values must be + * valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). + * Clients are only required to support `https` and `ipfs` URIs, but any + * scheme may be specified. + */ + uris?: URIs; + + /** + * A mapping of NFT type extension identifiers to extension definitions. + * {@link Extensions} may be widely standardized or application-specific. + */ + extensions?: Extensions; +}; + +/** + * A definition specifying a field that can be encoded in non-fungible tokens of + * a token category. + */ +export type NftCategoryField = { + [identifier: string]: { + /** + * The name of this field for use in interfaces. Names longer than `20` + * characters may be elided in some interfaces. + * + * E.g.: + * - `BCH Pledged` + * - `Tokens Sold` + * - `Settlement Locktime` + * - `Seat Number`, + * - `IPFS Content Identifier` + * - `HTTPS URL` + */ + name?: string; + + /** + * A string describing how this identity uses NFTs (for use in user + * interfaces). Descriptions longer than `160` characters may be elided in + * some interfaces. + * + * E.g.: + * - `The BCH value pledged at the time this receipt was issued.` + * - `The number of tokens sold in this order.` + * - `The seat number associated with this ticket.` + */ + description?: string; + + /** + * The expected encoding of this field when read from the parsing altstack + * (see {@link ParsableNftCollection}). All encoding definitions must have a + * `type`, and some encoding definitions allow for additional hinting about + * display strategies in clients. + * + * Encoding types may be set to `binary`, `boolean`, `hex`, `number`, + * or `utf8`: + * + * - `binary` types should be displayed as binary literals (e.g. `0b0101`) + * - `boolean` types should be displayed as `true` if exactly `0x01` or + * `false` if exactly `0x00`. If a boolean value does not match one of these + * values, clients should represent the NFT as unable to be parsed + * (e.g. simply display the full `commitment`). + * - `hex` types should be displayed as hex literals (e.g.`0xabcd`). + * - `https-url` types are percent encoded with the `https://` prefix + * omitted; they may be displayed as URIs or as activatable links. + * - `ipfs-cid` types are binary-encoded IPFS Content Identifiers; they may + * be displayed as URIs or as activatable links. + * - `locktime` types are `OP_TXLOCKTIME` results: integers from `0` to + * `4294967295` (inclusive) where values less than `500000000` are + * understood to be a block height (the current block number in the chain, + * beginning from block `0`), and values greater than or equal to + * `500000000` are understood to be a Median Time Past (BIP113) UNIX + * timestamp. (Note, sequence age is not currently supported.) + * - `number` types should be displayed according the their configured + * `decimals` and `unit` values. + * - `utf8` types should be displayed as utf8 strings. + */ + encoding: + | { + type: + | 'binary' + | 'boolean' + | 'hex' + | 'https-url' + | 'ipfs-cid' + | 'utf8' + | `locktime`; + } + | { + type: 'number'; + + /** + * The `aggregate` property indicates that aggregating this field from + * multiple NFTs is desirable in user interfaces. For example, for a + * field named `BCH Pledged` where `aggregate` is `add`, the client + * can display a `Total BCH Pledged` in any user interface listing + * more than one NFT. + * + * If specified, clients should aggregate the field from all NFTs, of + * all NFT types within the category, within a particular view (e.g. + * NFTs held by a single wallet, NFTs existing in a single + * transaction's outputs, etc.) using the specified operation. + * + * Note, while aggregation could be performed using any commutative + * operation – multiplication, bitwise AND, bitwise OR, bitwise XOR, + * etc. – only `add` is currently supported. + */ + aggregate?: 'add'; + + /** + * An integer between `0` and `18` (inclusive) indicating the + * divisibility of the primary unit of this token field. + * + * This is the number of digits that can appear after the decimal + * separator in amounts. For a field with a `decimals` of `2`, a value + * of `123456` should be displayed as `1234.56`. + * + * If omitted, defaults to `0`. + */ + decimals?: number; + + /** + * The unit in which this field is denominated, taking the `decimals` + * value into account. If representing fungible token amount, this + * will often be the symbol of the represented token category. + * + * E.g. `BCH`, `sats`, `AcmeUSD`, etc. + * + * If not provided, clients should not represent this field as having + * a unit beyond the field's `name`. + */ + unit?: string; + }; + /** + * A mapping of identifiers to URIs associated with this NFT field. URI + * identifiers may be widely-standardized or registry-specific. Values must + * be valid URIs, including a protocol prefix (e.g. `https://` or + * `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, + * but any scheme may be specified. + */ + uris?: URIs; + + /** + * A mapping of NFT field extension identifiers to extension definitions. + * {@link Extensions} may be widely standardized or application-specific. + */ + extensions?: Extensions; + }; +}; + +/** + * Interpretation information for a collection of sequential NFTs, a collection + * in which each NFT includes only a sequential identifier within its on-chain + * commitment. Note that {@link SequentialNftCollection}s differ from + * {@link ParsableNftCollection}s in that sequential collections lack a + * parsing `bytecode` with which to inspect each NFT commitment: the type of + * each NFT is indexed by the full contents its commitment (interpreted as a + * positive VM integer in user interfaces). + */ +export type SequentialNftCollection = { + /** + * A mapping of each NFT commitment (typically, a positive integer encoded as + * a VM number) to metadata for that NFT type in this category. + */ + types: { + /** + * Interpretation information for each type of NFT within the token + * category, indexed by commitment hex. For sequential NFTs, the on-chain + * commitment of each NFT is interpreted as a VM number to reference its + * particular NFT type in user interfaces. Issuing a sequential NFT with a + * negative or invalid VM number is discouraged, but clients may render the + * commitment of such NFTs in hex-encoded form, prefixed with `X`. + */ + [commitmentHex: string]: NftType; + }; +}; + +/** + * Interpretation information for a collection of parsable NFTs, a collection + * in which each NFT may include additional metadata fields beyond a sequential + * identifier within its on-chain commitment. Note that + * {@link ParsableNftCollection}s differ from {@link SequentialNftCollection}s + * in that parsable collections require a parsing `bytecode` with which to + * inspect each NFT commitment: the type of each NFT is indexed by the + * hex-encoded contents the bottom item on the altstack following the evaluation + * of the parsing bytecode. + */ +export type ParsableNftCollection = { + /** + * A segment of hex-encoded Bitcoin Cash VM bytecode that parses UTXOs + * holding NFTs of this category, identifies the NFT's type within the + * category, and returns a list of the NFT's field values via the + * altstack. If undefined, this NFT Category includes only sequential NFTs, + * with only an identifier and no NFT fields encoded in each NFT's + * on-chain commitment. + * + * The parse `bytecode` is evaluated by instantiating and partially + * verifying a standardized NFT parsing transaction: + * - version: `2` + * - inputs: + * - 0: Spends the UTXO containing the NFT with an empty + * unlocking bytecode and sequence number of `0`. + * - 1: Spends index `0` of the empty hash outpoint, with locking + * bytecode set to `parse.bytecode`, unlocking bytecode `OP_1` + * (`0x51`) and sequence number `0`. + * - outputs: + * - 0: A locking bytecode of OP_RETURN (`0x6a`) and value of `0`. + * - locktime: `0` + * + * After input 1 of this NFT parsing transaction is evaluated, if the + * resulting stack is not valid (a single "truthy" element remaining on + * the stack) – or if the altstack is empty – parsing has failed and + * clients should represent the NFT as unable to be parsed (e.g. simply + * display the full `commitment` as a hex-encoded value in the user + * interface). + * + * On successful parsing evaluations, the bottom item on the altstack + * indicates the type of the NFT according to the matching definition in + * `types`. If no match is found, clients should represent the NFT as + * unable to be parsed. + * + * For example: `00d2517f7c6b` (OP_0 OP_UTXOTOKENCOMMITMENT OP_1 OP_SPLIT + * OP_SWAP OP_TOALTSTACK OP_TOALTSTACK) splits the commitment after 1 byte, + * pushing the first byte to the altstack as an NFT type identifier and the + * remaining segment of the commitment as the first NFT field value. + * + * If undefined (in a {@link SequentialNftCollection}), this field could be + * considered to have a default value of `00d26b` (OP_0 OP_UTXOTOKENCOMMITMENT + * OP_TOALTSTACK), which takes the full contents of the commitment as a fixed + * type index. As such, each index of the NFT category's `types` maps a + * precise commitment value to the metadata for NFTs with that particular + * commitment. E.g. an NFT with an empty commitment (VM number 0) maps to + * `types['']`, a commitment of `01` (hex) maps to `types['01']`, etc. This + * pattern is used for collections of sequential NFTs. + */ + bytecode: string; + /** + * A mapping of hex-encoded values to definitions of possible NFT types + * in this category. + */ + types: { + /** + * A definitions for each type of NFT within the token category. Parsable + * NFT types are indexed by the hex-encoded value of the bottom altstack + * item following evaluation of `NftCategory.parse.bytecode`. The remaining + * altstack items are mapped to NFT fields according to the `fields` + * property of the matching NFT type. + */ + [bottomAltstackHex: string]: NftType; + }; +}; + +/** + * A definition specifying the non-fungible token information for a + * token category. + */ +export type NftCategory = { + /** + * A string describing how this identity uses NFTs (for use in user + * interfaces). Descriptions longer than `160` characters may be elided in + * some interfaces. + * + * E.g.: + * - "ACME DEX NFT order receipts are issued when you place orders on the + * decentralized exchange. After orders are processed, order receipts can + * be redeemed for purchased tokens or sales proceeds."; + * - "ACME Game collectable NFTs unlock unique playable content, user + * avatars, and item skins in ACME Game Online."; etc. + */ + description?: string; + + /** + * A mapping of field identifier to field definitions for the data fields + * that can appear in NFT commitments of this category. + * + * Categories including only sequential NFTs (where `parse.bytecode` is + * undefined) should omit `fields` (or set to `undefined`). + */ + fields?: NftCategoryField; + + /** + * Parsing and interpretation information for all NFTs of this category; + * this enables generalized wallets to parse and display detailed + * information about all NFTs held by the wallet, e.g. `BCH Pledged`, + * `Order Price`, `Seat Number`, `Asset Number`, + * `IPFS Content Identifier`, `HTTPS URL`, etc. + * + * Parsing instructions are provided in the `bytecode` property, and the + * results are interpreted using the `types` property. + */ + parse: ParsableNftCollection | SequentialNftCollection; +}; + +/** + * A definition specifying information about an identity's token category. + */ +export type TokenCategory = { + /** + * The current token category used by this identity. Often, this will be + * equal to the identity's authbase, but some token identities must migrate + * to new categories for technical reasons. + */ + category: string; + + /** + * An abbreviation used to uniquely identity this token category. + * + * Symbols must be comprised only of capital letters, numbers, and dashes + * (`-`). This can be validated with the regular expression: + * `/^[-A-Z0-9]+$/`. + */ + symbol: string; + + /** + * An integer between `0` and `18` (inclusive) indicating the divisibility + * of the primary unit of this token category. + * + * This is the number of digits that can appear after the decimal separator + * in fungible token amounts. For a token category with a `symbol` of + * `SYMBOL` and a `decimals` of `2`, a fungible token amount of `12345` + * should be displayed as `123.45 SYMBOL`. + * + * If omitted, defaults to `0`. + */ + decimals?: number; + + /** + * Display information for non-fungible tokens (NFTs) of this identity. + * Omitted for token categories without NFTs. + */ + nfts?: NftCategory; +}; + +/** + * A snapshot of the metadata for a particular identity at a specific time. + */ +export type IdentitySnapshot = { + /** + * The name of this identity for use in interfaces. + * + * In user interfaces with limited space, names should be hidden beyond + * the first newline character or `20` characters until revealed by the user. + * + * E.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc. + */ + name: string; + + /** + * A string describing this identity for use in user interfaces. + * + * In user interfaces with limited space, descriptions should be hidden beyond + * the first newline character or `140` characters until revealed by the user. + * + * E.g.: + * - `The common stock issued by ACME, Inc.` + * - `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.` + * - `Software developer and lead maintainer of Wallet Name.` + */ + description?: string; + + /** + * An array of `Tag` identifiers marking the `Tag`s associated with this + * identity. All specified tag identifiers must be defined in the registry's + * `tags` mapping. + */ + tags?: string[]; + + /** + * The timestamp at which this identity snapshot is fully in effect. This + * value should only be provided if the snapshot takes effect over a period + * of time (e.g. an in-circulation token identity is gradually migrating to + * a new category). In these cases, clients should gradually migrate to + * using the new information beginning after the identity snapshot's timestamp + * and the `migrated` time. + * + * This timestamp must be provided in simplified extended ISO 8601 format, a + * 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is + * zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript + * `Date.toISOString()`. + */ + migrated?: string; + + /** + * If this identity is a type of token, a data structure indicating how tokens + * should be understood and displayed in user interfaces. Omitted for + * non-token identities. + */ + token?: TokenCategory; + + /** + * The status of this identity, must be `active`, `inactive`, or `burned`. If + * omitted, defaults to `active`. + * - Identities with an `active` status should be actively tracked by clients. + * - Identities with an `inactive` status may be considered for archival by + * clients and may be removed in future registry versions. + * - Identities with a `burned` status have been destroyed by setting the + * latest identity output to a data-carrier output (`OP_RETURN`), permanently + * terminating the authchain. Clients should archive burned identities and – + * if the burned identity represented a token type – consider burning any + * remaining tokens of that category to reclaim funds from those outputs. + */ + status?: 'active' | 'burned' | 'inactive'; + + /** + * The split ID of this identity's chain of record. + * + * If undefined, defaults to {@link MetadataRegistry.defaultChain}. + */ + splitId?: string; + + /** + * A mapping of identifiers to URIs associated with this identity. URI + * identifiers may be widely-standardized or registry-specific. Values must be + * valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). + * Clients are only required to support `https` and `ipfs` URIs, but any + * scheme may be specified. + * + * The following identifiers are recommended for all identities: + * - `icon` + * - `web` + * + * The following optional identifiers are standardized: + * - `blog` + * - `chat` + * - `forum` + * - `icon-intro` + * - `image` + * - `migrate` + * - `registry` + * - `support` + * + * For details on these standard identifiers, see: + * https://github.com/bitjson/chip-bcmr#uri-identifiers + * + * Custom URI identifiers allow for sharing social networking profiles, p2p + * connection information, and other application-specific URIs. Identifiers + * must be lowercase, alphanumeric strings, with no whitespace or special + * characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`). + * + * For example, some common identifiers include: `discord`, `docker`, + * `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, + * `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, + * `youtube`. + */ + uris?: URIs; + + /** + * A mapping of `IdentitySnapshot` extension identifiers to extension + * definitions. {@link Extensions} may be widely standardized or + * application-specific. + * + * Standardized extensions for `IdentitySnapshot`s include the `authchain` + * extension. See + * https://github.com/bitjson/chip-bcmr#authchain-extension for details. + */ + extensions?: Extensions; +}; + +/** + * A snapshot of the metadata for a particular chain/network at a specific + * time. This allows for registries to provide similar metadata for each chain's + * native currency unit (name, description, symbol, icon, etc.) as can be + * provided for other registered tokens. + */ +export type ChainSnapshot = Omit & { + /** + * A data structure indicating how the chain's native currency units should be + * displayed in user interfaces. + */ + token: { + /** + * An abbreviation used to uniquely identity this native currency unit. + * + * Symbols must be comprised only of capital letters, numbers, and dashes + * (`-`). This can be validated with the regular expression: + * `/^[-A-Z0-9]+$/`. + */ + symbol: string; + + /** + * An integer between `0` and `18` (inclusive) indicating the divisibility + * of the primary unit of this native currency. + * + * This is the number of digits that can appear after the decimal separator + * in currency amounts. For a currency with a `symbol` of `SYMBOL` and a + * `decimals` of `2`, an amount of `12345` should be displayed as + * `123.45 SYMBOL`. + * + * If omitted, defaults to `0`. + */ + decimals?: number; + }; +}; + +/** + * A field keyed by timestamps to document the evolution of the field. Each + * timestamp must be provided in simplified extended ISO 8601 format, a + * 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is + * zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript + * `Date.toISOString()`. + * + * For example, to insert a new value: + * ```ts + * const result = { ...previousValue, [(new Date()).toISOString()]: newValue }; + * ``` + */ +export type RegistryTimestampKeyedValues = { + [timestamp: string]: T; +}; + +/** + * A block height-keyed map of {@link ChainSnapshot}s documenting the evolution + * of a particular chain/network's identity. Like {@link IdentityHistory}, this + * structure allows wallets and other user interfaces to offer better + * experiences when a chain identity is rebranded, redenominated, or other + * important metadata is modified in a coordinated update. + */ +export type ChainHistory = RegistryTimestampKeyedValues; + +/** + * A timestamp-keyed map of {@link IdentitySnapshot}s documenting + * the evolution of a particular identity. The current identity information is + * the snapshot associated with the latest timestamp reached. If no timestamp + * has yet been reached, the snapshot of the oldest timestamp is considered + * current. Future-dated timestamps indicate planned migrations. + * + * This strategy allows wallets and other user interfaces to offer better + * experiences when an identity is rebranded, a token redenominated, or other + * important metadata is modified in a coordinated update. For example, a wallet + * may warn token holders of a forthcoming rebranding of fungible tokens they + * hold; after the change, the wallet may continue to offer prominent interface + * hints that the rebranded token identity was recently updated. + * + * Timestamps may be order by time via lexicographical sort. For determinism, it + * is recommended that implementations sort from newest to oldest in exported + * registry JSON files. + * + * If the current snapshot's {@link IdentitySnapshot.migrated} isn't specified, + * the snapshot's index is a precise time at which the snapshot takes effect and + * clients should begin using the new information. If `migrated` is specified, + * the snapshot's index is the timestamp at which the transition is considered + * to begin, see {@link IdentitySnapshot.migrated} for details. + * + * Each timestamp must be provided in simplified extended ISO 8601 format, a + * 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is + * zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript + * `Date.toISOString()`. + * + * In the case that an identity change occurs due to on-chain activity (e.g. an + * on-chain migration that is set to complete at a particular locktime value), + * registry-recorded timestamps reflect the real-world time at which the + * maintainer of the registry believes the on-chain activity to have actually + * occurred. Likewise, future-dated timestamps indicate a precise real-world + * time at which a snapshot is estimated to take effect, rather than the Median + * Time Past (BIP113) UNIX timestamp or another on-chain measurement of time. + */ +export type IdentityHistory = RegistryTimestampKeyedValues; + +/** + * An identity representing a metadata registry that is not published on-chain + * and therefore has no authbase or trackable authchain. + */ +export type OffChainRegistryIdentity = Pick< + IdentitySnapshot, + 'description' | 'extensions' | 'name' | 'tags' | 'uris' +>; + +/** + * A Bitcoin Cash Metadata Registry is an authenticated JSON file containing + * metadata about tokens, identities, contract applications, and other on-chain + * artifacts. BCMRs conform to the Bitcoin Cash Metadata Registry JSON Schema, + * and they can be published and maintained by any entity or individual. + */ +export type MetadataRegistry = { + /** + * The schema used by this registry. Many JSON editors can automatically + * provide inline documentation and autocomplete support using the `$schema` + * property, so it is recommended that registries include it. E.g.: + * `https://cashtokens.org/bcmr-v2.schema.json` + */ + $schema?: string; + + /** + * The version of this registry. Versioning adheres to Semantic Versioning + * (https://semver.org/). + */ + version: { + /** + * The major version is incremented when an identity is removed. + */ + major: number; + + /** + * The minor version is incremented when an identity is added or a new + * identity snapshot is added. + */ + minor: number; + + /** + * The patch version is incremented when an existing identity or identity + * snapshot is modified (e.g. to correct an error or add a missing piece of + * information) or when other registry properties (e.g. registry `name`, + * `description`, `uris`, etc.) are modified. + * + * Generally, substantive changes to an existing identity should be made + * using a new identity snapshot in a minor version upgrade – this allows + * clients to provide a better user experience by noting the change in + * relevant user interfaces. + * + * For example, patch upgrades might include spelling corrections in an + * existing snapshot or the addition of an `icon` containing a + * higher-resolution version of an existing `icon` image. On the other hand, + * a rebranding in which the icon is substantially changed may warrant a new + * identity snapshot to be added in a minor version upgrade. + */ + patch: number; + }; + + /** + * The timestamp of the latest revision made to this registry version. The + * timestamp must be provided in simplified extended ISO 8601 format, a + * 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is + * zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript + * `Date.toISOString()`. + */ + latestRevision: string; + + /** + * The identity information of this particular registry, provided as either an + * authbase (recommended) or an `IdentitySnapshot`. + * + * An authbase is a 32-byte, hex-encoded transaction hash (A.K.A. TXID) for + * which the zeroth-descendant transaction chain (ZDTC) authenticates and + * publishes all registry updates. If an authbase is provided, the registry's + * identity information can be found in `identities[authbase]`, and clients + * should immediately attempt to verify the registry's identity on-chain. + * (See https://github.com/bitjson/chip-bcmr#chain-resolved-registries) + * + * If an `IdentitySnapshot` is provided directly, this registry does not + * support on-chain resolution/authentication, and the contained + * `IdentitySnapshot` can only be authenticated via DNS/HTTPS. + */ + registryIdentity: OffChainRegistryIdentity | string; + + /** + * A mapping of authbases to the `IdentityHistory` for that identity. + * + * An authbase is a 32-byte, hex-encoded transaction hash (A.K.A. TXID) for + * which the zeroth-descendant transaction chain (ZDTC) authenticates and + * publishes an identity's claimed metadata. + * + * Identities may represent metadata registries, specific types of tokens, + * companies, organizations, individuals, or other on-chain entities. + */ + identities?: { + [authbase: string]: IdentityHistory; + }; + + /** + * A map of registry-specific `Tag`s used by this registry to convey + * information about identities it tracks. + * + * Tags allow registries to group identities into collections of related + * identities, marking characteristics or those identities. Tags are + * standardized within a registry and may represent either labels applied by + * that registry (e.g. `individual`, `organization`, `token`, `wallet`, + * `exchange`, `staking`, `utility-token`, `security-token`, `stablecoin`, + * `wrapped`, `collectable`, `deflationary`, `governance`, + * `decentralized-exchange`, `liquidity-provider`, `sidechain`, + * `sidechain-bridge`, etc.) or designations by external authorities + * (certification, membership, ownership, etc.) that are tracked by + * that registry. + * + * Tags may be used by clients in search, discover, and filtering of + * identities, and they can also convey information like accreditation from + * investor protection organizations, public certifications by security or + * financial auditors, and other designations that signal legitimacy and value + * to users. + */ + tags?: { + [identifier: string]: Tag; + }; + + /** + * The split ID of the chain/network considered the "default" chain for this + * registry. Identities that do not specify a {@link IdentitySnapshot.splitId} + * are assumed to be set to this split ID. For a description of split IDs, + * see {@link MetadataRegistry.chains}. + * + * If not provided, the `defaultChain` is + * `0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce`, the BCH + * side of the BCH/XEC split (mainnet). Common values include: + * - `00000000ae25e85d9e22cd6c8d72c2f5d4b0222289d801b7f633aeae3f8c6367` + * (testnet4) + * - `00000000040ba9641ba98a37b2e5ceead38e4e2930ac8f145c8094f94c708727` + * (chipnet) + */ + defaultChain?: string; + + /** + * A map of split IDs tracked by this registry to the {@link ChainHistory} for + * that chain/network. + * + * The split ID of a chain is the block header hash (A.K.A. block ID) of the + * first unique block after the most recent tracked split – a split after + * which both resulting chains are considered notable or tracked by the + * registry. (For chains with no such splits, this is the ID of the + * genesis block.) + * + * Note, split ID is inherently a "relative" identifier. After a tracked + * split, both resulting chains will have a new split ID. However, if a wallet + * has not yet heard about a particular split, that wallet will continue to + * reference one of the resulting chains by its previous split ID, and the + * split-unaware wallet may create transactions that are valid on both chains + * (losing claimable value if the receivers of their transactions don't + * acknowledge transfers on both chains). When a registry trusted by the + * wallet notes the split in it's `chains` map, the wallet can represent the + * split in the user interface using the the latest {@link ChainSnapshot} for + * each chain and splitting coins prior to spending (by introducing post-split + * coins in each transaction). + * + * This map may exclude the following well-known split IDs (all clients + * supporting any of these chains should build-in {@link ChainHistory} for + * those chains): + * + * - `0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce`: + * A.K.A. mainnet – the BCH side of the BCH/XEC split. + * - `00000000ae25e85d9e22cd6c8d72c2f5d4b0222289d801b7f633aeae3f8c6367`: + * A.K.A testnet4 – the test network on which CHIPs are activated + * simultaneously with mainnet (May 15 at 12 UTC). + * - `00000000040ba9641ba98a37b2e5ceead38e4e2930ac8f145c8094f94c708727`: + * A.K.A. chipnet – the test network on which CHIPs are activated 6 months + * before mainnet (November 15 at 12 UTC). + * + * All other split IDs referenced by this registry should be included in this + * map. + */ + chains?: { + [splitId: string]: ChainHistory; + }; + + /** + * The license under which this registry is published. This may be specified + * as either a SPDX short identifier (https://spdx.org/licenses/) or by + * including the full text of the license. + * + * Common values include: + * - `CC0-1.0`: https://creativecommons.org/publicdomain/zero/1.0/ + * - `MIT`: https://opensource.org/licenses/MIT + */ + license?: string; + + /** + * A mapping of `Registry` extension identifiers to extension definitions. + * {@link Extensions} may be widely standardized or application-specific. + * + * Standardized extensions for `Registry`s include the `locale` extension. See + * https://github.com/bitjson/chip-bcmr#locales-extension for details. + */ + extensions?: Extensions; +}; diff --git a/src/lib/compiler/template-types.ts b/src/lib/engine/types/template-types.ts similarity index 79% rename from src/lib/compiler/template-types.ts rename to src/lib/engine/types/template-types.ts index dfab0813..c2fb1e4f 100644 --- a/src/lib/compiler/template-types.ts +++ b/src/lib/engine/types/template-types.ts @@ -10,31 +10,36 @@ */ /** - * An `AuthenticationTemplate` (A.K.A. `CashAssembly Template`) specifies a set - * of locking scripts, unlocking scripts, and other information required to use - * a certain authentication scheme. Templates fully describe wallets and - * protocols in a way that can be shared between software clients. + * A `WalletTemplate` specifies a set of locking scripts, unlocking scripts, and + * other information required to use a certain wallet protocol. Templates + * fully describe wallet protocols in a way that can be shared between + * software clients. */ -export interface AuthenticationTemplate { +export type WalletTemplate = { /** * The URI that identifies the JSON Schema used by this template. Try: - * `https://libauth.org/schemas/authentication-template-v0.schema.json` + * `https://libauth.org/schemas/wallet-template-v0.schema.json` * to enable documentation, autocompletion, and validation in JSON documents. */ $schema?: string; /** * An optionally multi-line, free-form, human-readable description for this - * authentication template (for use in user interfaces). If displayed, this + * wallet template (for use in user interfaces). If displayed, this * description should use a monospace font to properly render ASCII diagrams. + * + * Descriptions have no length limit, but in user interfaces with limited + * space, they should be hidden beyond the first newline character or `140` + * characters until revealed by the user (e.g. by hiding the remaining + * description until the user activates a "show more" link). */ description?: string; /** - * A map of entities defined in this authentication template. + * A map of entities defined in this wallet template. * * Object keys are used as entity identifiers, and by convention, should use * `snake_case`. */ - entities: { [entityId: string]: AuthenticationTemplateEntity }; + entities: { [entityId: string]: WalletTemplateEntity }; /** * A single-line, Title Case, human-readable name for this authentication * template (for use in user interfaces). @@ -43,24 +48,24 @@ export interface AuthenticationTemplate { /** * A scenario describes a context in which one or more scripts might be used. * Scenarios are used for transaction estimation and as an integrated testing - * system for authentication templates. + * system for wallet templates. * * Object keys are used as scenario identifiers, and by convention, should use * `snake_case`. */ - scenarios?: { [scenarioId: string]: AuthenticationTemplateScenario }; + scenarios?: { [scenarioId: string]: WalletTemplateScenario }; /** - * A map of scripts used in this authentication template. + * A map of scripts used in this wallet template. * * Object keys are used as script identifiers, and by convention, should use * `snake_case`. */ scripts: { [scriptId: string]: - | AuthenticationTemplateScript - | AuthenticationTemplateScriptLocking - | AuthenticationTemplateScriptTested - | AuthenticationTemplateScriptUnlocking; + | WalletTemplateScript + | WalletTemplateScriptLocking + | WalletTemplateScriptTested + | WalletTemplateScriptUnlocking; }; /** * A list of authentication virtual machine versions supported by this @@ -78,11 +83,11 @@ export interface AuthenticationTemplate { */ supported: AuthenticationVirtualMachineIdentifier[]; /** - * A number identifying the format of this AuthenticationTemplate. + * A number identifying the format of this WalletTemplate. * Currently, this implementation requires `version` be set to `0`. */ version: 0; -} +}; /** * Allowable identifiers for authentication virtual machine versions. The `BCH` @@ -113,9 +118,9 @@ export type AuthenticationVirtualMachineIdentifier = /** * An object describing the configuration for a particular entity within an - * authentication template. + * wallet template. */ -export interface AuthenticationTemplateEntity { +export type WalletTemplateEntity = { /** * An optionally multi-line, free-form, human-readable description for this * entity (for use in user interfaces). If displayed, this description @@ -149,13 +154,13 @@ export interface AuthenticationTemplateEntity { * Object keys are used as variable identifiers, and by convention, should use * `snake_case`. */ - variables?: { [variableId: string]: AuthenticationTemplateVariable }; -} + variables?: { [variableId: string]: WalletTemplateVariable }; +}; /** * An object defining the data to use while compiling a scenario. */ -export interface AuthenticationTemplateScenarioData { +export type WalletTemplateScenarioData = { /** * A map of full identifiers to CashAssembly scripts that compile to each * identifier's value for this scenario. Allowing `bytecode` to be specified @@ -255,11 +260,11 @@ export interface AuthenticationTemplateScenarioData { */ privateKeys?: { [variableId: string]: string }; }; -} +}; /** * A type that describes the configuration for a particular locking or - * unlocking bytecode within an authentication template scenario. + * unlocking bytecode within a wallet template scenario. * * Bytecode may be specified as either a hexadecimal-encoded string or an object * describing the required compilation. @@ -268,7 +273,7 @@ export interface AuthenticationTemplateScenarioData { * `{ script: ["copy"], overrides: {} }`. For `transaction.outputs`, defaults to * `{ script: ["copy"], overrides: { "hdKeys": { "addressIndex": 1 } } }`. */ -export type AuthenticationTemplateScenarioBytecode = +export type WalletTemplateScenarioBytecode = | string | { /** @@ -289,13 +294,13 @@ export type AuthenticationTemplateScenarioBytecode = * Defaults to `{}` for `sourceOutputs` and `transaction.inputs`; defaults * to `{ "hdKeys": { "addressIndex": 1 } }` for `transaction.outputs`. */ - overrides?: AuthenticationTemplateScenarioData; + overrides?: WalletTemplateScenarioData; }; /** - * An example input used to define a scenario for an authentication template. + * An example input used to define a scenario for a wallet template. */ -export interface AuthenticationTemplateScenarioInput { +export type WalletTemplateScenarioInput = { /** * The index of the output in the transaction from which this input is spent. * @@ -388,22 +393,20 @@ export interface AuthenticationTemplateScenarioInput { * The `unlockingBytecode` value of this input for this scenario. This must be * either `["slot"]`, indicating that this input contains the * `unlockingBytecode` under test by the scenario, or an - * `AuthenticationTemplateScenarioBytecode`. + * `WalletTemplateScenarioBytecode`. * * For a scenario to be valid, `unlockingBytecode` must be `["slot"]` for * exactly one input in the scenario. * * Defaults to `["slot"]`. */ - unlockingBytecode?: AuthenticationTemplateScenarioBytecode | ['slot']; -} + unlockingBytecode?: WalletTemplateScenarioBytecode | ['slot']; +}; /** - * An example output used to define a scenario for an authentication template. + * An example output used to define a scenario for a wallet template. */ -export interface AuthenticationTemplateScenarioOutput< - IsSourceOutput extends boolean -> { +export type WalletTemplateScenarioOutput = { /** * The locking bytecode used to encumber this output. * @@ -418,8 +421,8 @@ export interface AuthenticationTemplateScenarioOutput< * exactly one source output slot and one input slot at the same index.) */ readonly lockingBytecode?: IsSourceOutput extends true - ? AuthenticationTemplateScenarioBytecode | ['slot'] - : AuthenticationTemplateScenarioBytecode; + ? WalletTemplateScenarioBytecode | ['slot'] + : WalletTemplateScenarioBytecode; /** * The value of the output in satoshis, the smallest unit of bitcoin. * @@ -439,7 +442,7 @@ export interface AuthenticationTemplateScenarioOutput< * * If undefined, this defaults to: `0`. */ - readonly valueSatoshis?: number | string; + valueSatoshis?: number | string; /** * The CashToken contents of this output. This property is only defined if the @@ -489,26 +492,26 @@ export interface AuthenticationTemplateScenarioOutput< commitment?: string; }; }; -} +}; /** - * A transaction output used to define an authentication template scenario + * A transaction output used to define a wallet template scenario * transaction. */ -export type AuthenticationTemplateScenarioTransactionOutput = - AuthenticationTemplateScenarioOutput; +export type WalletTemplateScenarioTransactionOutput = + WalletTemplateScenarioOutput; /** - * A source output used by an authentication template scenario. + * A source output used by a wallet template scenario. */ -export type AuthenticationTemplateScenarioSourceOutput = - AuthenticationTemplateScenarioOutput; +export type WalletTemplateScenarioSourceOutput = + WalletTemplateScenarioOutput; /** * An object describing the configuration for a particular scenario within an - * authentication template. + * wallet template. */ -export interface AuthenticationTemplateScenario { +export type WalletTemplateScenario = { /** * An object defining the data to use while compiling this scenario. The * properties specified here are used to extend the existing scenario data @@ -517,7 +520,7 @@ export interface AuthenticationTemplateScenario { * Each property is extended individually – to unset a previously-set * property, the property must be individually overridden in this object. */ - data?: AuthenticationTemplateScenarioData; + data?: WalletTemplateScenarioData; /** * An optionally multi-line, free-form, human-readable description for this @@ -620,7 +623,7 @@ export interface AuthenticationTemplateScenario { * If undefined, inherits the default scenario `inputs` value: * `[{ "unlockingBytecode": ["slot"] }]`. */ - inputs?: AuthenticationTemplateScenarioInput[]; + inputs?: WalletTemplateScenarioInput[]; /** * The locktime to use when generating the transaction for this scenario. A * positive integer from `0` to a maximum of `4294967295` – if undefined, @@ -671,7 +674,7 @@ export interface AuthenticationTemplateScenario { * * If undefined, defaults to `[{ "lockingBytecode": {} }]`. */ - outputs?: AuthenticationTemplateScenarioTransactionOutput[]; + outputs?: WalletTemplateScenarioTransactionOutput[]; /** * The version to use when generating the transaction for this scenario. A * positive integer from `0` to a maximum of `4294967295` – if undefined, @@ -693,14 +696,14 @@ export interface AuthenticationTemplateScenario { * * If undefined, defaults to `[{ "lockingBytecode": ["slot"] }]`. */ - sourceOutputs?: AuthenticationTemplateScenarioSourceOutput[]; -} + sourceOutputs?: WalletTemplateScenarioSourceOutput[]; +}; /** * An object describing the configuration for a particular script within an - * authentication template. + * wallet template. */ -export interface AuthenticationTemplateScript { +export type WalletTemplateScript = { /** * A single-line, human-readable name for this script (for use in user * interfaces). @@ -710,10 +713,9 @@ export interface AuthenticationTemplateScript { * The script definition in CashAssembly. */ script: string; -} +}; -export interface AuthenticationTemplateScriptUnlocking - extends AuthenticationTemplateScript { +export type WalletTemplateScriptUnlocking = WalletTemplateScript & { /** * TODO: not yet implemented * @@ -755,7 +757,7 @@ export interface AuthenticationTemplateScriptUnlocking * If not provided, the default scenario will be used for estimation. The * default scenario only provides values for each `Key` and `HdKey` variable, * so compilations requiring other variables will produce errors. See - * `AuthenticationTemplateScenario.extends` for details. + * `WalletTemplateScenario.extends` for details. */ estimate?: string; /** @@ -810,10 +812,9 @@ export interface AuthenticationTemplateScriptUnlocking * unlocking script, and the script it unlocks must be a locking script. */ unlocks: string; -} +}; -export interface AuthenticationTemplateScriptLocking - extends AuthenticationTemplateScript { +export type WalletTemplateScriptLocking = WalletTemplateScript & { /** * Indicates if P2SH20 infrastructure should be used when producing bytecode * related to this script. For more information on P2SH20, see BIP16. @@ -833,10 +834,9 @@ export interface AuthenticationTemplateScriptLocking * `unlocks` property of another script. */ lockingType: 'p2sh20' | 'p2sh32' | 'standard'; -} +}; -export interface AuthenticationTemplateScriptTested - extends AuthenticationTemplateScript { +export type WalletTemplateScriptTested = WalletTemplateScript & { /** * If set to `true`, indicates that this script should be wrapped in a push * statement for testing. @@ -853,10 +853,10 @@ export interface AuthenticationTemplateScriptTested * One or more tests that can be used during development and during template * validation to confirm the correctness of this tested script. */ - tests: { [testId: string]: AuthenticationTemplateScriptTest }; -} + tests: { [testId: string]: WalletTemplateScriptTest }; +}; -export interface AuthenticationTemplateScriptTest { +export type WalletTemplateScriptTest = { /** * The script to evaluate after the script being tested. This can be used to * check that the tested script leaves the expected results on the stack. For @@ -913,9 +913,9 @@ export interface AuthenticationTemplateScriptTest { * In scenario testing, this script is treated as the unlocking script. */ setup?: string; -} +}; -export interface AuthenticationTemplateVariableBase { +export type WalletTemplateVariableBase = { /** * A single-line, human readable description for this variable (for use in * user interfaces). @@ -927,133 +927,148 @@ export interface AuthenticationTemplateVariableBase { */ name?: string; type: string; -} +}; -export interface AuthenticationTemplateHdKey - extends AuthenticationTemplateVariableBase { +export type WalletTemplateKeyBase = { /** - * A single-line, human readable description for this HD key. - */ - description?: string; - /** - * A single-line, Title Case, human-readable name for this HD key. - */ - name?: string; - /** - * The offset by which to increment the `addressIndex` provided in the - * compilation data when deriving this `HdKey`. (Default: 0) + * If set to `true`, indicates that this key should never be used to sign two + * different messages. * - * This is useful for deriving the "next" (`1`) or "previous" (`-1`) address - * to be used in the current compiler configuration. - */ - addressOffset?: number; - /** - * The path to derive the entity's HD public key from the entity's master HD - * private key. By default, `m` (i.e. the entity's HD public key represents - * the same node in the HD tree as its HD private key). + * This is useful for contracts that use zero-confirmation escrow systems to + * guarantee against double-spend attempts. By indicating that the user could + * be subjected to losses if a key were used in multiple signatures, templates + * can ensure that wallet implementations apply appropriate safeguards around + * use of the key. * - * This can be used to specify another derivation path from which the - * `publicDerivationPath` begins, e.g. `m/0'/1'/2'`. See - * `publicDerivationPath` for details. - * - * This path must begin with an `m` (private derivation) and be fixed – it - * cannot contain an `i` character to represent the address index, as a - * dynamic hardened path would require a new HD public key for each address. - */ - hdPublicKeyDerivationPath?: string; - /** - * The derivation path used to derive this `HdKey` from the owning entity's HD - * private key. By default, `m/i`. - * - * This path uses the notation specified in BIP32 and the `i` character to - * represent the location of the `addressIndex`: - * - * The first character must be `m` (private derivation), followed by sets of - * `/` and a number representing the child index used in the derivation at - * that depth. Hardened derivation is represented by a trailing `'`, and - * hardened child indexes are represented with the hardened index offset - * (`2147483648`) subtracted. The `i` character is replaced with the value of - * `addressIndex` plus this `HdKey`'s `addressOffset`. If the `i` character is - * followed by `'`, the hardened index offset is added (`2147483648`) and - * hardened derivation is used. - * - * For example, `m/0/1'/i'` uses 3 levels of derivation, with child indexes in - * the following order: - * - * `derive(derive(derive(node, 0), 2147483648 + 1), 2147483648 + addressIndex + addressOffset)` - * - * Because hardened derivation requires knowledge of the private key, `HdKey` - * variables with `derivationPath`s that include hardened derivation cannot - * use HD public derivation (the `hdPublicKeys` property in - * `CompilationData`). Instead, compilation requires the respective HD private - * key (`CompilationData.hdKeys.hdPrivateKeys`) or the fully-derived public - * key (`CompilationData.hdKeys.derivedPublicKeys`). - */ - privateDerivationPath?: string; - /** - * The derivation path used to derive this `HdKey`'s public key from the - * owning entity's HD public key. If not set, the public equivalent of - * `privateDerivationPath` is used. For the `privateDerivationPath` default of - * `m/i`, this is `M/i`. - * - * If `privateDerivationPath` uses hardened derivation for some levels, but - * later derivation levels use non-hardened derivation, `publicDerivationPath` - * can be used to specify a public derivation path beginning from - * `hdPublicKeyDerivationPath` (i.e. `publicDerivationPath` should always be a - * non-hardened segment of `privateDerivationPath` that follows - * `hdPublicKeyDerivationPath`). - * - * The first character must be `M` (public derivation), followed by sets of - * `/` and a number representing the child index used in the non-hardened - * derivation at that depth. - * - * For example, if `privateDerivationPath` is `m/0'/i`, it is not possible to - * derive the equivalent public key with only the HD public key `M`. (The path - * "`M/0'/i`" is impossible.) However, given the HD public key for `m/0'`, it - * is possible to derive the public key of `m/0'/i` for any `i`. In this case, - * `hdPublicKeyDerivationPath` would be `m/0'` and `publicDerivationPath` - * would be the remaining `M/i`. - * - * @remarks - * Non-hardened derivation paths are more useful for some templates, e.g. to - * allow for new locking scripts to be generated without communicating new - * public keys between entities for each. **However, using a non-hardened key - * has critical security implications.** If an attacker gains possession of - * both a parent HD *public key* and any child private key, the attacker can - * easily derive the parent HD *private key*, and with it, all hardened and - * non-hardened child keys. See BIP32 or - * `crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode` for details. - */ - publicDerivationPath?: string; - /** - * The `HdKey` (Hierarchical-Deterministic Key) type automatically manages key - * generation and mapping in a standard way. For greater control, use `Key`. + * Defaults to `false`. */ - type: 'HdKey'; -} + neverSignTwice?: boolean; +}; -export interface AuthenticationTemplateKey - extends AuthenticationTemplateVariableBase { - /** - * A single-line, human readable description for this key. - */ - description?: string; - /** - * A single-line, Title Case, human-readable name for this key. - */ - name?: string; - /** - * The `Key` type provides fine-grained control over key generation and - * mapping. Most templates should instead use `HdKey`. - * - * Any HD (Hierarchical-Deterministic) derivation must be completed outside of - * the templating system and provided at the time of use. - */ - type: 'Key'; -} +export type WalletTemplateHdKey = WalletTemplateKeyBase & + WalletTemplateVariableBase & { + /** + * A single-line, human readable description for this HD key. + */ + description?: string; + /** + * A single-line, Title Case, human-readable name for this HD key. + */ + name?: string; + /** + * The offset by which to increment the `addressIndex` provided in the + * compilation data when deriving this `HdKey`. (Default: 0) + * + * This is useful for deriving the "next" (`1`) or "previous" (`-1`) address + * to be used in the current compiler configuration. + */ + addressOffset?: number; + /** + * The path to derive the entity's HD public key from the entity's master HD + * private key. By default, `m` (i.e. the entity's HD public key represents + * the same node in the HD tree as its HD private key). + * + * This can be used to specify another derivation path from which the + * `publicDerivationPath` begins, e.g. `m/0'/1'/2'`. See + * `publicDerivationPath` for details. + * + * This path must begin with an `m` (private derivation) and be fixed – it + * cannot contain an `i` character to represent the address index, as a + * dynamic hardened path would require a new HD public key for each address. + */ + hdPublicKeyDerivationPath?: string; + /** + * The derivation path used to derive this `HdKey` from the owning entity's HD + * private key. By default, `m/i`. + * + * This path uses the notation specified in BIP32 and the `i` character to + * represent the location of the `addressIndex`: + * + * The first character must be `m` (private derivation), followed by sets of + * `/` and a number representing the child index used in the derivation at + * that depth. Hardened derivation is represented by a trailing `'`, and + * hardened child indexes are represented with the hardened index offset + * (`2147483648`) subtracted. The `i` character is replaced with the value of + * `addressIndex` plus this `HdKey`'s `addressOffset`. If the `i` character is + * followed by `'`, the hardened index offset is added (`2147483648`) and + * hardened derivation is used. + * + * For example, `m/0/1'/i'` uses 3 levels of derivation, with child indexes in + * the following order: + * + * `derive(derive(derive(node, 0), 2147483648 + 1), 2147483648 + addressIndex + addressOffset)` + * + * Because hardened derivation requires knowledge of the private key, `HdKey` + * variables with `derivationPath`s that include hardened derivation cannot + * use HD public derivation (the `hdPublicKeys` property in + * `CompilationData`). Instead, compilation requires the respective HD private + * key (`CompilationData.hdKeys.hdPrivateKeys`) or the fully-derived public + * key (`CompilationData.hdKeys.derivedPublicKeys`). + */ + privateDerivationPath?: string; + /** + * The derivation path used to derive this `HdKey`'s public key from the + * owning entity's HD public key. If not set, the public equivalent of + * `privateDerivationPath` is used. For the `privateDerivationPath` default of + * `m/i`, this is `M/i`. + * + * If `privateDerivationPath` uses hardened derivation for some levels, but + * later derivation levels use non-hardened derivation, `publicDerivationPath` + * can be used to specify a public derivation path beginning from + * `hdPublicKeyDerivationPath` (i.e. `publicDerivationPath` should always be a + * non-hardened segment of `privateDerivationPath` that follows + * `hdPublicKeyDerivationPath`). + * + * The first character must be `M` (public derivation), followed by sets of + * `/` and a number representing the child index used in the non-hardened + * derivation at that depth. + * + * For example, if `privateDerivationPath` is `m/0'/i`, it is not possible to + * derive the equivalent public key with only the HD public key `M`. (The path + * "`M/0'/i`" is impossible.) However, given the HD public key for `m/0'`, it + * is possible to derive the public key of `m/0'/i` for any `i`. In this case, + * `hdPublicKeyDerivationPath` would be `m/0'` and `publicDerivationPath` + * would be the remaining `M/i`. + * + * @remarks + * Non-hardened derivation paths are more useful for some templates, e.g. to + * allow for new locking scripts to be generated without communicating new + * public keys between entities for each. **However, using a non-hardened key + * has critical security implications.** If an attacker gains possession of + * both a parent HD *public key* and any child private key, the attacker can + * easily derive the parent HD *private key*, and with it, all hardened and + * non-hardened child keys. See BIP32 or + * `crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode` for details. + */ + publicDerivationPath?: string; + /** + * The `HdKey` (Hierarchical-Deterministic Key) type automatically manages key + * generation and mapping in a standard way. For greater control, use `Key`. + */ + type: 'HdKey'; + }; + +export type WalletTemplateKey = WalletTemplateKeyBase & + WalletTemplateVariableBase & { + /** + * A single-line, human readable description for this key. + */ + description?: string; + /** + * A single-line, Title Case, human-readable name for this key. + */ + name?: string; + /** + * The `Key` type provides fine-grained control over key generation and + * mapping. Most templates should instead use `HdKey`. + * + * Any HD (Hierarchical-Deterministic) derivation must be completed outside of + * the templating system and provided at the time of use. + */ + type: 'Key'; + }; -export interface AuthenticationTemplateWalletData - extends AuthenticationTemplateVariableBase { +export type WalletTemplateWalletData = WalletTemplateVariableBase & { /** * A single-line, human readable description for this wallet data. */ @@ -1071,10 +1086,9 @@ export interface AuthenticationTemplateWalletData * For address-specific data, use `AddressData`. */ type: 'WalletData'; -} +}; -export interface AuthenticationTemplateAddressData - extends AuthenticationTemplateVariableBase { +export type WalletTemplateAddressData = WalletTemplateVariableBase & { /** * A single-line, human readable description for this address data. */ @@ -1091,10 +1105,10 @@ export interface AuthenticationTemplateAddressData * For more persistent data, use `WalletData`. */ type: 'AddressData'; -} +}; -export type AuthenticationTemplateVariable = - | AuthenticationTemplateAddressData - | AuthenticationTemplateHdKey - | AuthenticationTemplateKey - | AuthenticationTemplateWalletData; +export type WalletTemplateVariable = + | WalletTemplateAddressData + | WalletTemplateHdKey + | WalletTemplateKey + | WalletTemplateWalletData; diff --git a/src/lib/format/base-convert.spec.ts b/src/lib/format/base-convert.spec.ts index c30668d5..95f4ff44 100644 --- a/src/lib/format/base-convert.spec.ts +++ b/src/lib/format/base-convert.spec.ts @@ -1,4 +1,3 @@ -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import type { BaseConverter } from '../lib.js'; @@ -15,8 +14,10 @@ import { // eslint-disable-next-line import/no-restricted-paths, import/no-internal-modules import base58Json from './fixtures/base58_encode_decode.json' assert { type: 'json' }; +import { fc, testProp } from '@fast-check/ava'; + const base58Vectors = Object.values(base58Json).filter( - (item) => Array.isArray(item) && item.every((x) => typeof x === 'string') + (item) => Array.isArray(item) && item.every((x) => typeof x === 'string'), ); const base2 = createBaseConverter('01') as BaseConverter; @@ -40,7 +41,7 @@ test(base2Vector, '111111111111', Uint8Array.of(15, 255)); test( base2Vector, '11111111000000001111111100000000', - Uint8Array.of(255, 0, 255, 0) + Uint8Array.of(255, 0, 255, 0), ); const base16 = createBaseConverter('0123456789abcdef') as BaseConverter; @@ -76,7 +77,7 @@ test(base58Vector, 'aPEr', utf8ToBin('ccc')); test( base58Vector, '1NS17iag9jJgTHD1VXjvLCEnZuQ3rJDE9L', - hexToBin('00eb15231dfceb60925886b67d065299925915aeb172c06647') + hexToBin('00eb15231dfceb60925886b67d065299925915aeb172c06647'), ); test('createBaseConverter: alphabet too long', (t) => { @@ -84,16 +85,16 @@ test('createBaseConverter: alphabet too long', (t) => { createBaseConverter( range(255) .map((i) => String.fromCharCode(i)) - .join('') + .join(''), ), - BaseConversionError.tooLong + BaseConversionError.tooLong, ); }); test('createBaseConverter: ambiguous character in alphabet', (t) => { t.deepEqual( createBaseConverter('00'), - BaseConversionError.ambiguousCharacter + BaseConversionError.ambiguousCharacter, ); }); @@ -107,8 +108,8 @@ testProp( (t, input) => t.deepEqual( base2.encode(base2.decode(base2.encode(input)) as Uint8Array), - base2.encode(input) - ) + base2.encode(input), + ), ); testProp( @@ -117,13 +118,13 @@ testProp( (t, input) => t.deepEqual( base16.encode(base16.decode(base16.encode(input)) as Uint8Array), - base16.encode(input) - ) + base16.encode(input), + ), ); const base26 = createBaseConverter( // cspell: disable-next-line - 'abcdefghijklmnopqrstuvwxyz' + 'abcdefghijklmnopqrstuvwxyz', ) as BaseConverter; testProp( @@ -132,12 +133,12 @@ testProp( (t, input) => t.deepEqual( base26.encode(base26.decode(base26.encode(input)) as Uint8Array), - base26.encode(input) - ) + base26.encode(input), + ), ); const base42 = createBaseConverter( - '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghi' + '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghi', ) as BaseConverter; testProp( @@ -146,8 +147,8 @@ testProp( (t, input) => t.deepEqual( base42.encode(base42.decode(base42.encode(input)) as Uint8Array), - base42.encode(input) - ) + base42.encode(input), + ), ); testProp( @@ -156,13 +157,13 @@ testProp( (t, input) => t.deepEqual( binToBase58(base58ToBin(binToBase58(input)) as Uint8Array), - binToBase58(input) - ) + binToBase58(input), + ), ); test('base58 Test Vectors', (t) => { t.truthy(base58Vectors); - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [binHex, base58] of base58Vectors) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion t.deepEqual(base58ToBin(base58!) as Uint8Array, hexToBin(binHex!)); diff --git a/src/lib/format/base-convert.ts b/src/lib/format/base-convert.ts index 6d5b6851..210ecc7c 100644 --- a/src/lib/format/base-convert.ts +++ b/src/lib/format/base-convert.ts @@ -4,10 +4,10 @@ export enum BaseConversionError { unknownCharacter = 'Encountered an unknown character for this alphabet.', } -export interface BaseConverter { +export type BaseConverter = { decode: (source: string) => BaseConversionError.unknownCharacter | Uint8Array; encode: (input: Uint8Array) => string; -} +}; /** * Create a {@link BaseConverter}, exposing methods for encoding and decoding @@ -30,7 +30,7 @@ export interface BaseConverter { */ // Algorithm from the `base-x` implementation (derived from the original Satoshi implementation): https://github.com/cryptocoinjs/base-x export const createBaseConverter = ( - alphabet: string + alphabet: string, ): BaseConversionError | BaseConverter => { const undefinedValue = 255; const uint8ArrayBase = 256; @@ -39,13 +39,13 @@ export const createBaseConverter = ( const alphabetMap = new Uint8Array(uint8ArrayBase).fill(undefinedValue); - // eslint-disable-next-line functional/no-loop-statement, functional/no-let, no-plusplus + // eslint-disable-next-line functional/no-loop-statements, functional/no-let, no-plusplus for (let index = 0; index < alphabet.length; index++) { const characterCode = alphabet.charCodeAt(index); if (alphabetMap[characterCode] !== undefinedValue) { return BaseConversionError.ambiguousCharacter; } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data alphabetMap[characterCode] = index; } @@ -67,15 +67,15 @@ export const createBaseConverter = ( } const requiredLength = Math.floor( - (input.length - firstNonZeroIndex) * factor + 1 + (input.length - firstNonZeroIndex) * factor + 1, ); const decoded = new Uint8Array(requiredLength); - /* eslint-disable functional/no-let, functional/no-expression-statement */ + /* eslint-disable functional/no-let, functional/no-expression-statements */ let nextByte = firstNonZeroIndex; let remainingBytes = 0; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (input[nextByte] !== undefined) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion let carry = alphabetMap[input.charCodeAt(nextByte)]!; @@ -83,7 +83,7 @@ export const createBaseConverter = ( return BaseConversionError.unknownCharacter; let digit = 0; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for ( let steps = requiredLength - 1; (carry !== 0 || digit < remainingBytes) && steps !== -1; @@ -101,14 +101,14 @@ export const createBaseConverter = ( // eslint-disable-next-line no-plusplus nextByte++; } - /* eslint-enable functional/no-let, functional/no-expression-statement */ + /* eslint-enable functional/no-let, functional/no-expression-statements */ const firstNonZeroResultDigit = decoded.findIndex((value) => value !== 0); const bin = new Uint8Array( - firstNonZeroIndex + (requiredLength - firstNonZeroResultDigit) + firstNonZeroIndex + (requiredLength - firstNonZeroResultDigit), ); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements bin.set(decoded.slice(firstNonZeroResultDigit), firstNonZeroIndex); return bin; }, @@ -122,19 +122,19 @@ export const createBaseConverter = ( } const requiredLength = Math.floor( - (input.length - firstNonZeroIndex) * inverseFactor + 1 + (input.length - firstNonZeroIndex) * inverseFactor + 1, ); const encoded = new Uint8Array(requiredLength); - /* eslint-disable functional/no-let, functional/no-expression-statement */ + /* eslint-disable functional/no-let, functional/no-expression-statements */ let nextByte = firstNonZeroIndex; let remainingBytes = 0; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (nextByte !== input.length) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion let carry = input[nextByte]!; let digit = 0; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for ( let steps = requiredLength - 1; (carry !== 0 || digit < remainingBytes) && steps !== -1; @@ -151,7 +151,7 @@ export const createBaseConverter = ( // eslint-disable-next-line no-plusplus nextByte++; } - /* eslint-enable functional/no-let, functional/no-expression-statement */ + /* eslint-enable functional/no-let, functional/no-expression-statements */ const firstNonZeroResultDigit = encoded.findIndex((value) => value !== 0); diff --git a/src/lib/format/base64.ts b/src/lib/format/base64.ts index 3243ac5f..e63f9fba 100644 --- a/src/lib/format/base64.ts +++ b/src/lib/format/base64.ts @@ -15,7 +15,7 @@ export const isBase64 = (maybeBase64: string) => maybeBase64.length % base64GroupLength === 0 && !nonBase64Chars.test(maybeBase64); -/* eslint-disable functional/no-expression-statement, functional/immutable-data, @typescript-eslint/no-magic-numbers, no-bitwise, no-plusplus, @typescript-eslint/no-non-null-assertion */ +/* eslint-disable functional/no-expression-statements, functional/immutable-data, @typescript-eslint/no-magic-numbers, no-bitwise, no-plusplus, @typescript-eslint/no-non-null-assertion */ /** * Convert a base64-encoded string to a Uint8Array. @@ -28,7 +28,7 @@ export const isBase64 = (maybeBase64: string) => */ export const base64ToBin = (validBase64: string) => { const lookup = new Uint8Array(123); - // eslint-disable-next-line functional/no-let, functional/no-loop-statement + // eslint-disable-next-line functional/no-let, functional/no-loop-statements for (let i = 0; i < chars.length; i++) { lookup[chars.charCodeAt(i)] = i; } @@ -44,7 +44,7 @@ export const base64ToBin = (validBase64: string) => { const bytes = new Uint8Array(buffer); // eslint-disable-next-line functional/no-let let p = 0; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement + // eslint-disable-next-line functional/no-let, functional/no-loop-statements for (let i = 0; i < stringLength; i += 4) { const encoded1 = lookup[validBase64.charCodeAt(i)]!; const encoded2 = lookup[validBase64.charCodeAt(i + 1)]!; @@ -64,7 +64,7 @@ export const base64ToBin = (validBase64: string) => { export const binToBase64 = (bytes: Uint8Array) => { // eslint-disable-next-line functional/no-let let result = ''; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement + // eslint-disable-next-line functional/no-let, functional/no-loop-statements for (let i = 0; i < bytes.length; i += 3) { result += chars[bytes[i]! >> 2]; result += chars[((bytes[i]! & 3) << 4) | (bytes[i + 1]! >> 4)]; @@ -75,8 +75,8 @@ export const binToBase64 = (bytes: Uint8Array) => { bytes.length % 3 === 2 ? `${result.substring(0, result.length - 1)}=` : bytes.length % 3 === 1 - ? `${result.substring(0, result.length - 2)}==` - : result; + ? `${result.substring(0, result.length - 2)}==` + : result; return padded; }; -/* eslint-enable functional/no-expression-statement, functional/immutable-data, @typescript-eslint/no-magic-numbers, no-bitwise, no-plusplus, @typescript-eslint/no-non-null-assertion */ +/* eslint-enable functional/no-expression-statements, functional/immutable-data, @typescript-eslint/no-magic-numbers, no-bitwise, no-plusplus, @typescript-eslint/no-non-null-assertion */ diff --git a/src/lib/format/bin-string.spec.ts b/src/lib/format/bin-string.spec.ts index 944585ee..3e7ffd60 100644 --- a/src/lib/format/bin-string.spec.ts +++ b/src/lib/format/bin-string.spec.ts @@ -1,8 +1,9 @@ -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import { binStringToBin, binToBinString, isBinString } from '../lib.js'; +import { fc, testProp } from '@fast-check/ava'; + test('isBinString', (t) => { t.deepEqual(isBinString('0'), false); t.deepEqual(isBinString('01'), false); @@ -28,6 +29,6 @@ testProp( (t, input) => t.deepEqual( binToBinString(binStringToBin(binToBinString(input))), - binToBinString(input) - ) + binToBinString(input), + ), ); diff --git a/src/lib/format/bin-string.ts b/src/lib/format/bin-string.ts index 5cde5b3d..b65d699a 100644 --- a/src/lib/format/bin-string.ts +++ b/src/lib/format/bin-string.ts @@ -18,8 +18,8 @@ const binary = 2; export const binStringToBin = (binaryDigits: string) => Uint8Array.from( splitEvery(binaryDigits, binaryByteWidth).map((byteString) => - parseInt(byteString, binary) - ) + parseInt(byteString, binary), + ), ); /** @@ -32,7 +32,7 @@ export const binStringToBin = (binaryDigits: string) => export const binToBinString = (bytes: Uint8Array) => bytes.reduce( (str, byte) => str + byte.toString(binary).padStart(binaryByteWidth, '0'), - '' + '', ); /** diff --git a/src/lib/format/error.ts b/src/lib/format/error.ts index 784be5d3..cbf52dcd 100644 --- a/src/lib/format/error.ts +++ b/src/lib/format/error.ts @@ -34,9 +34,9 @@ export const formatError = (errorType: string, errorDetails?: string) => export const unknownValue = ( value: never, message = `Received an unknown value: ${String( - value - )}. This should have been caught by TypeScript - are your types correct?` + value, + )}. This should have been caught by TypeScript - are your types correct?`, ) => { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new Error(message); }; diff --git a/src/lib/format/hex.spec.ts b/src/lib/format/hex.spec.ts index 4e74880d..5ea1e107 100644 --- a/src/lib/format/hex.spec.ts +++ b/src/lib/format/hex.spec.ts @@ -1,4 +1,3 @@ -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import { @@ -10,6 +9,8 @@ import { swapEndianness, } from '../lib.js'; +import { fc, testProp } from '@fast-check/ava'; + test('range', (t) => { t.deepEqual(range(3), [0, 1, 2]); t.deepEqual(range(3, 1), [1, 2, 3]); @@ -31,18 +32,18 @@ test('isHex', (t) => { test('hexToBin', (t) => { t.deepEqual( hexToBin('0001022a646566ff'), - Uint8Array.from([0, 1, 2, 42, 100, 101, 102, 255]) + Uint8Array.from([0, 1, 2, 42, 100, 101, 102, 255]), ); t.deepEqual( hexToBin('0001022A646566FF'), - Uint8Array.from([0, 1, 2, 42, 100, 101, 102, 255]) + Uint8Array.from([0, 1, 2, 42, 100, 101, 102, 255]), ); }); test('binToHex', (t) => { t.deepEqual( binToHex(Uint8Array.from([0, 1, 2, 42, 100, 101, 102, 255])), - '0001022a646566ff' + '0001022a646566ff', ); }); @@ -50,7 +51,7 @@ testProp( '[fast-check] hexToBin <-> binToHex', [fc.uint8Array({ maxLength: 100, minLength: 0 })], (t, input) => - t.deepEqual(binToHex(hexToBin(binToHex(input))), binToHex(input)) + t.deepEqual(binToHex(hexToBin(binToHex(input))), binToHex(input)), ); test('swapEndianness', (t) => { diff --git a/src/lib/format/hex.ts b/src/lib/format/hex.ts index 6a4e826b..696934ae 100644 --- a/src/lib/format/hex.ts +++ b/src/lib/format/hex.ts @@ -39,8 +39,8 @@ const hexadecimal = 16; export const hexToBin = (validHex: string) => Uint8Array.from( splitEvery(validHex, hexByteWidth).map((byte) => - parseInt(byte, hexadecimal) - ) + parseInt(byte, hexadecimal), + ), ); /** @@ -61,7 +61,7 @@ export const isHex = (maybeHex: string) => export const binToHex = (bytes: Uint8Array) => bytes.reduce( (str, byte) => str + byte.toString(hexadecimal).padStart(hexByteWidth, '0'), - '' + '', ); /** @@ -77,12 +77,12 @@ export const swapEndianness = (validHex: string) => * Reduce an array of `Uint8Array`s into a single `Uint8Array`. * @param array - the array of `Uint8Array`s to flatten */ -export const flattenBinArray = (array: readonly Uint8Array[]) => { +export const flattenBinArray = (array: Uint8Array[]) => { const totalLength = array.reduce((total, bin) => total + bin.length, 0); const flattened = new Uint8Array(totalLength); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements array.reduce((index, bin) => { - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements flattened.set(bin, index); return index + bin.length; }, 0); @@ -99,7 +99,7 @@ export const binsAreEqual = (a: Uint8Array, b: Uint8Array) => { if (a.length !== b.length) { return false; } - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line functional/no-let, functional/no-loop-statements, no-plusplus for (let i = 0; i < a.length; i++) { if (a[i] !== b[i]) { return false; diff --git a/src/lib/format/log.spec.ts b/src/lib/format/log.spec.ts index 8b76a13a..aa96819f 100644 --- a/src/lib/format/log.spec.ts +++ b/src/lib/format/log.spec.ts @@ -8,20 +8,20 @@ test('stringify', (t) => { t.deepEqual(stringify(Uint8Array.of(32, 32)), '""'); t.deepEqual( stringify({ b: Uint8Array.of(32, 32) }), - '{\n "b": ""\n}' + '{\n "b": ""\n}', ); t.deepEqual( stringify((x: number) => x * 2), - '" x * 2>"' + '" x * 2>"', ); t.deepEqual( stringify({ c: (x: number) => x * 2 }), - '{\n "c": " x * 2>"\n}' + '{\n "c": " x * 2>"\n}', ); t.deepEqual(stringify(Symbol('A')), '""'); t.deepEqual( stringify({ d: Symbol('A') }), - '{\n "d": ""\n}' + '{\n "d": ""\n}', ); }); @@ -33,7 +33,7 @@ test('sortObjectKeys', (t) => { b: { ...{ c: 1 }, a: 2, b: null }, ...{ a: Uint8Array.of(2), c: Uint8Array.of(3) }, }), - { a: Uint8Array.of(2), b: { a: 2, b: null, c: 1 }, c: Uint8Array.of(3) } + { a: Uint8Array.of(2), b: { a: 2, b: null, c: 1 }, c: Uint8Array.of(3) }, ); const func = (x: number) => x * 2; t.deepEqual(sortObjectKeys(func), func); @@ -46,7 +46,12 @@ test('sortObjectKeys', (t) => { { b: Uint8Array.of(1), ...{ a: Uint8Array.of(2), c: Uint8Array.of(3) } }, 1, ]), - [3, 2, { a: Uint8Array.of(2), b: Uint8Array.of(1), c: Uint8Array.of(3) }, 1] + [ + 3, + 2, + { a: Uint8Array.of(2), b: Uint8Array.of(1), c: Uint8Array.of(3) }, + 1, + ], ); }); @@ -73,6 +78,6 @@ test('stringifyTestVector', (t) => { } ] }`, - one + one, ); }); diff --git a/src/lib/format/log.ts b/src/lib/format/log.ts index 4a92ec56..579145c1 100644 --- a/src/lib/format/log.ts +++ b/src/lib/format/log.ts @@ -47,7 +47,7 @@ export const stringify = (value: any, spacing = defaultStringifySpacing) => return item; } }, - spacing + spacing, ); /** @@ -57,11 +57,10 @@ export const stringify = (value: any, spacing = defaultStringifySpacing) => * @param objectOrArray - the object or array in which to sort object keys */ export const sortObjectKeys = ( - objectOrArray: unknown + objectOrArray: unknown, // eslint-disable-next-line @typescript-eslint/no-explicit-any ): any => { if (Array.isArray(objectOrArray)) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-return return objectOrArray.map(sortObjectKeys); } if ( @@ -73,7 +72,7 @@ export const sortObjectKeys = ( } // eslint-disable-next-line functional/immutable-data const keys = Object.keys(objectOrArray).sort((a, b) => - a.localeCompare(b, 'en') + a.localeCompare(b, 'en'), ); return keys.reduce( (all, key) => ({ @@ -81,7 +80,7 @@ export const sortObjectKeys = ( // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment [key]: sortObjectKeys((objectOrArray as { [key: string]: unknown })[key]), }), - {} + {}, ); }; @@ -106,7 +105,7 @@ const bigIntRegex = /"[0-9]*)n>"/gu; export const stringifyTestVector = ( // eslint-disable-next-line @typescript-eslint/no-explicit-any value: any, - alphabetize = true + alphabetize = true, ) => { const stringified = alphabetize ? stringify(sortObjectKeys(value)) diff --git a/src/lib/format/number.bench.ts b/src/lib/format/number.bench.ts index 098dcb82..6e147ff1 100644 --- a/src/lib/format/number.bench.ts +++ b/src/lib/format/number.bench.ts @@ -3,7 +3,6 @@ import { randomBytes } from 'crypto'; import test from 'ava'; -import suite from 'chuhai'; import { bigIntToBinUint64LE, @@ -19,6 +18,8 @@ import { numberToBinUint32LEClamped, } from '../lib.js'; +import suite from 'chuhai'; + test(`node: binToBigIntUintBE vs. binToHex -> BigInt()`, async (t) => { await suite(t.title, (s) => { let sourceBin: Uint8Array; diff --git a/src/lib/format/number.spec.ts b/src/lib/format/number.spec.ts index 3fe56062..238915bb 100644 --- a/src/lib/format/number.spec.ts +++ b/src/lib/format/number.spec.ts @@ -1,4 +1,3 @@ -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import { @@ -37,6 +36,8 @@ import { readCompactUintMinimal, } from '../lib.js'; +import { fc, testProp } from '@fast-check/ava'; + test('numberToBinUint16LE', (t) => { t.deepEqual(numberToBinUint16LE(0), Uint8Array.from([0, 0])); t.deepEqual(numberToBinUint16LE(1), Uint8Array.from([1, 0])); @@ -52,11 +53,11 @@ test('numberToBinUint16BE', (t) => { test('numberToBinUint16LE vs. numberToBinUint16LEClamped: behavior on overflow', (t) => { t.deepEqual( numberToBinUint16LE(0x01_0000), - numberToBinUint16LE(0x01_0000 % (0xffff + 1)) + numberToBinUint16LE(0x01_0000 % (0xffff + 1)), ); t.deepEqual( numberToBinUint16LEClamped(0x01_0000), - Uint8Array.from([0xff, 0xff]) + Uint8Array.from([0xff, 0xff]), ); }); @@ -71,7 +72,7 @@ test('numberToBinUint32LE', (t) => { t.deepEqual(numberToBinUint32LE(0x1234), Uint8Array.from([0x34, 0x12, 0, 0])); t.deepEqual( numberToBinUint32LE(0x12345678), - Uint8Array.from([0x78, 0x56, 0x34, 0x12]) + Uint8Array.from([0x78, 0x56, 0x34, 0x12]), ); }); @@ -81,18 +82,18 @@ test('numberToBinUint32BE', (t) => { t.deepEqual(numberToBinUint32BE(0x1234), Uint8Array.from([0, 0, 0x12, 0x34])); t.deepEqual( numberToBinUint32BE(0x12345678), - Uint8Array.from([0x12, 0x34, 0x56, 0x78]) + Uint8Array.from([0x12, 0x34, 0x56, 0x78]), ); }); test('numberToBinUint32LE vs. numberToBinUint32LEClamped: behavior on overflow', (t) => { t.deepEqual( numberToBinUint32LE(0x01_0000_0000), - numberToBinUint32LE(0x01_0000_0000 % (0xffffffff + 1)) + numberToBinUint32LE(0x01_0000_0000 % (0xffffffff + 1)), ); t.deepEqual( numberToBinUint32LEClamped(0x01_0000_0000), - Uint8Array.from([0xff, 0xff, 0xff, 0xff]) + Uint8Array.from([0xff, 0xff, 0xff, 0xff]), ); }); @@ -104,7 +105,7 @@ test('numberToBinUint32LE: behavior on negative numbers', (t) => { test('numberToBinUintLE', (t) => { t.deepEqual( numberToBinUintLE(Number.MAX_SAFE_INTEGER), - Uint8Array.from([255, 255, 255, 255, 255, 255, 31]) + Uint8Array.from([255, 255, 255, 255, 255, 255, 31]), ); }); @@ -121,15 +122,15 @@ test('numberToBinInt32LE', (t) => { t.deepEqual(numberToBinInt32LE(0x1234), Uint8Array.from([0x34, 0x12, 0, 0])); t.deepEqual( numberToBinInt32LE(-0x1234), - Uint8Array.from([0xcc, 0xed, 0xff, 0xff]) + Uint8Array.from([0xcc, 0xed, 0xff, 0xff]), ); t.deepEqual( numberToBinUint32LE(0x12345678), - Uint8Array.from([0x78, 0x56, 0x34, 0x12]) + Uint8Array.from([0x78, 0x56, 0x34, 0x12]), ); t.deepEqual( numberToBinInt32LE(-0x12345678), - Uint8Array.from([0x88, 0xa9, 0xcb, 0xed]) + Uint8Array.from([0x88, 0xa9, 0xcb, 0xed]), ); }); @@ -138,83 +139,83 @@ test('numberToBinInt32TwosCompliment', (t) => { t.deepEqual(numberToBinInt32TwosCompliment(1), Uint8Array.from([1, 0, 0, 0])); t.deepEqual( numberToBinInt32TwosCompliment(-0xffffffff), - Uint8Array.from([1, 0, 0, 0]) + Uint8Array.from([1, 0, 0, 0]), ); t.deepEqual( numberToBinInt32TwosCompliment(0xffffffff), - Uint8Array.from([255, 255, 255, 255]) + Uint8Array.from([255, 255, 255, 255]), ); t.deepEqual( numberToBinInt32TwosCompliment(-1), - Uint8Array.from([255, 255, 255, 255]) + Uint8Array.from([255, 255, 255, 255]), ); t.deepEqual( numberToBinInt32TwosCompliment(0xffff), - Uint8Array.from([255, 255, 0, 0]) + Uint8Array.from([255, 255, 0, 0]), ); t.deepEqual( numberToBinInt32TwosCompliment(-0xffff), - Uint8Array.from([1, 0, 255, 255]) + Uint8Array.from([1, 0, 255, 255]), ); t.deepEqual( numberToBinInt32TwosCompliment(1234567890), - Uint8Array.from([210, 2, 150, 73]) + Uint8Array.from([210, 2, 150, 73]), ); t.deepEqual( numberToBinInt32TwosCompliment(-1234567890), - Uint8Array.from([46, 253, 105, 182]) + Uint8Array.from([46, 253, 105, 182]), ); }); test('bigIntToBinUint64LE', (t) => { t.deepEqual( bigIntToBinUint64LE(0n), - Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0]) + Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0]), ); t.deepEqual( bigIntToBinUint64LE(0x01n), - Uint8Array.from([0x01, 0, 0, 0, 0, 0, 0, 0]) + Uint8Array.from([0x01, 0, 0, 0, 0, 0, 0, 0]), ); t.deepEqual( bigIntToBinUint64LE(0x12345678n), - Uint8Array.from([0x78, 0x56, 0x34, 0x12, 0, 0, 0, 0]) + Uint8Array.from([0x78, 0x56, 0x34, 0x12, 0, 0, 0, 0]), ); t.deepEqual( bigIntToBinUint64LE(BigInt(Number.MAX_SAFE_INTEGER)), - Uint8Array.from([255, 255, 255, 255, 255, 255, 31, 0]) + Uint8Array.from([255, 255, 255, 255, 255, 255, 31, 0]), ); t.deepEqual( bigIntToBinUint64LE(0xffffffffffffffffn), - Uint8Array.from([255, 255, 255, 255, 255, 255, 255, 255]) + Uint8Array.from([255, 255, 255, 255, 255, 255, 255, 255]), ); }); test('bigIntToBinUint64LE vs. bigIntToBinUint64LEClamped: behavior on overflow', (t) => { t.deepEqual( bigIntToBinUint64LE(0x010000000000000000n), - bigIntToBinUint64LE(0x010000000000000000n % (0xffffffffffffffffn + 1n)) + bigIntToBinUint64LE(0x010000000000000000n % (0xffffffffffffffffn + 1n)), ); t.deepEqual( bigIntToBinUint64LEClamped(0x010000000000000000n), - Uint8Array.from([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]) + Uint8Array.from([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]), ); }); test('bigIntToBinUint64LE vs. bigIntToBinUint64LEClamped: behavior on negative numbers', (t) => { t.deepEqual( bigIntToBinUint64LE(-1n), - Uint8Array.from([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]) + Uint8Array.from([0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]), ); t.deepEqual( bigIntToBinUint64LEClamped(-1n), - Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0]) + Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0]), ); }); test('bigIntToCompactUint: larger values return modulo result after opcode', (t) => { t.deepEqual( bigIntToCompactUint(0x010000000000000001n), - Uint8Array.from([0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]) + Uint8Array.from([0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), ); }); @@ -223,15 +224,15 @@ test('binToNumberUintLE', (t) => { t.deepEqual(binToNumberUintLE(Uint8Array.from([0x34, 0x12])), 0x1234); t.deepEqual( binToNumberUintLE(Uint8Array.from([0x78, 0x56, 0x34, 0x12])), - 0x12345678 + 0x12345678, ); t.deepEqual( binToNumberUintLE(Uint8Array.from([0x90, 0x78, 0x56, 0x34, 0x12])), - 0x1234567890 + 0x1234567890, ); t.deepEqual( binToNumberUintLE(Uint8Array.from([255, 255, 255, 255, 255, 255, 31])), - Number.MAX_SAFE_INTEGER + Number.MAX_SAFE_INTEGER, ); t.deepEqual(binToNumberUintLE(Uint8Array.from([0x56, 0x34, 0x12])), 0x123456); const data = Uint8Array.from([0x90, 0x78, 0x56, 0x34, 0x12]); @@ -246,7 +247,7 @@ testProp( '[fast-check] numberToBinUintLE <-> binToNumberUintLE', [fc.integer({ max: Number.MAX_SAFE_INTEGER, min: 0 })], (t, maxSafeInt) => - t.deepEqual(binToNumberUintLE(numberToBinUintLE(maxSafeInt)), maxSafeInt) + t.deepEqual(binToNumberUintLE(numberToBinUintLE(maxSafeInt)), maxSafeInt), ); test('binToNumberUint16LE', (t) => { @@ -264,26 +265,26 @@ test('binToNumberInt16LE', (t) => { test('binToNumberInt32LE', (t) => { t.deepEqual( binToNumberInt32LE(Uint8Array.from([0x78, 0x56, 0x34, 0x12])), - 0x12345678 + 0x12345678, ); t.deepEqual( binToNumberInt32LE(Uint8Array.from([0x88, 0xa9, 0xcb, 0xed])), - -0x12345678 + -0x12345678, ); }); test('binToNumberUint16LE: ignores bytes after the 2nd', (t) => { t.deepEqual( binToNumberUint16LE(Uint8Array.from([0x78, 0x56, 0x34, 0x12, 0xff])), - 0x5678 + 0x5678, ); }); test('binToNumberUint32LE', (t) => { t.deepEqual( binToNumberUint32LE(Uint8Array.from([0x78, 0x56, 0x34, 0x12])), - 0x12345678 + 0x12345678, ); const data = Uint8Array.from([0x90, 0x78, 0x56, 0x34, 0x12, 0x00]); const view = data.subarray(2); @@ -293,7 +294,7 @@ test('binToNumberUint32LE', (t) => { test('binToNumberUint32LE: ignores bytes after the 4th', (t) => { t.deepEqual( binToNumberUint32LE(Uint8Array.from([0x78, 0x56, 0x34, 0x12, 0xff])), - 0x12345678 + 0x12345678, ); }); @@ -302,25 +303,25 @@ test('binToBigIntUintBE', (t) => { t.deepEqual(binToBigIntUintBE(Uint8Array.from([0x12, 0x34])), 0x1234n); t.deepEqual( binToBigIntUintBE(Uint8Array.from([0x12, 0x34, 0x56])), - 0x123456n + 0x123456n, ); t.deepEqual( binToBigIntUintBE(Uint8Array.from([0x12, 0x34, 0x56, 0x78])), - 0x12345678n + 0x12345678n, ); t.deepEqual( binToBigIntUintBE(Uint8Array.from([0x12, 0x34, 0x56, 0x78, 0x90])), - 0x1234567890n + 0x1234567890n, ); t.deepEqual( binToBigIntUintBE( - Uint8Array.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef]) + Uint8Array.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef]), ), - 0x1234567890abcdefn + 0x1234567890abcdefn, ); t.deepEqual( binToBigIntUintBE(Uint8Array.from([0x56, 0x78, 0x90, 0xab, 0xcd, 0xef])), - 0x567890abcdefn + 0x567890abcdefn, ); const d = Uint8Array.from([0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef]); const view = d.subarray(2); @@ -347,7 +348,7 @@ test('binToBigIntUint256BE and bigIntToBinUint256BEClamped', (t) => { overMax[0] = 255; t.deepEqual( bigIntToBinUint256BEClamped(BigInt(`0x${binToHex(overMax)}`)), - max + max, ); }); @@ -357,8 +358,8 @@ testProp( (t, uint256) => t.deepEqual( binToBigIntUint256BE(bigIntToBinUint256BEClamped(uint256)), - uint256 - ) + uint256, + ), ); test('binToBigIntUintLE', (t) => { @@ -366,25 +367,25 @@ test('binToBigIntUintLE', (t) => { t.deepEqual(binToBigIntUintLE(Uint8Array.from([0x34, 0x12])), 0x1234n); t.deepEqual( binToBigIntUintLE(Uint8Array.from([0x56, 0x34, 0x12])), - 0x123456n + 0x123456n, ); t.deepEqual( binToBigIntUintLE(Uint8Array.from([0x78, 0x56, 0x34, 0x12])), - 0x12345678n + 0x12345678n, ); t.deepEqual( binToBigIntUintLE(Uint8Array.from([0x90, 0x78, 0x56, 0x34, 0x12])), - 0x1234567890n + 0x1234567890n, ); t.deepEqual( binToBigIntUintLE( - Uint8Array.from([0xef, 0xcd, 0xab, 0x90, 0x78, 0x56, 0x34, 0x12]) + Uint8Array.from([0xef, 0xcd, 0xab, 0x90, 0x78, 0x56, 0x34, 0x12]), ), - 0x1234567890abcdefn + 0x1234567890abcdefn, ); t.deepEqual( binToBigIntUintLE(Uint8Array.from([0xab, 0x90, 0x78, 0x56, 0x34, 0x12])), - 0x1234567890abn + 0x1234567890abn, ); const d = Uint8Array.from([0xef, 0xcd, 0xab, 0x90, 0x78, 0x56, 0x34, 0x12]); const view = d.subarray(2); @@ -401,40 +402,40 @@ testProp( const bin = bigIntToBinUintLE(uint256); const binReverse = bin.slice().reverse(); t.deepEqual(binToBigIntUintBE(binReverse), binToBigIntUintLE(bin)); - } + }, ); testProp( '[fast-check] bigIntToBinUintLE <-> binToBigIntUintLE', [fc.bigUintN(65)], (t, uint65) => - t.deepEqual(binToBigIntUintLE(bigIntToBinUintLE(uint65)), uint65) + t.deepEqual(binToBigIntUintLE(bigIntToBinUintLE(uint65)), uint65), ); test('binToBigIntUint64LE', (t) => { t.deepEqual( binToBigIntUint64LE(Uint8Array.from([0x78, 0x56, 0x34, 0x12, 0, 0, 0, 0])), - 0x12345678n + 0x12345678n, ); t.deepEqual( binToBigIntUint64LE( - Uint8Array.from([0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01]) + Uint8Array.from([0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01]), ), - 0x0123456789abcdefn + 0x0123456789abcdefn, ); t.deepEqual( binToBigIntUint64LE( Uint8Array.from([ 0xef, 0xcd, 0xab, 0x89, 0x67, 0x45, 0x23, 0x01, 0x00, 0x00, - ]) + ]), ), - 0x0123456789abcdefn + 0x0123456789abcdefn, ); const data = Uint8Array.from([0x90, 0x78, 0x56, 0x34, 0x12, 0, 0, 0, 0, 0]); const view = data.subarray(2); t.deepEqual(binToBigIntUint64LE(view), 0x123456n); t.throws(() => - binToBigIntUint64LE(Uint8Array.from([0x78, 0x56, 0x34, 0x12])) + binToBigIntUint64LE(Uint8Array.from([0x78, 0x56, 0x34, 0x12])), ); }); @@ -457,14 +458,14 @@ test('readCompactUint', (t) => { }); t.deepEqual( readCompactUint({ bin: Uint8Array.from([253, 0, 0]), index: 0 }), - { position: { bin: Uint8Array.from([253, 0, 0]), index: 3 }, result: 0n } + { position: { bin: Uint8Array.from([253, 0, 0]), index: 3 }, result: 0n }, ); t.deepEqual( readCompactUint({ bin: Uint8Array.from([254, 0, 0, 0, 0]), index: 0 }), { position: { bin: Uint8Array.from([254, 0, 0, 0, 0]), index: 5 }, result: 0n, - } + }, ); t.deepEqual( readCompactUint({ @@ -477,18 +478,18 @@ test('readCompactUint', (t) => { index: 9, }, result: 0n, - } + }, ); t.deepEqual( readCompactUint({ bin: Uint8Array.from([253, 253, 0]), index: 0 }), { position: { bin: Uint8Array.from([253, 253, 0]), index: 3 }, result: 253n, - } + }, ); t.deepEqual( readCompactUint({ bin: Uint8Array.from([]), index: 0 }), - CompactUintError.noPrefix + CompactUintError.noPrefix, ); }); @@ -499,7 +500,7 @@ test('readCompactUintMinimal', (t) => { }); t.deepEqual( readCompactUintMinimal({ bin: Uint8Array.from([253, 1, 0]), index: 0 }), - `${CompactUintError.nonMinimal} Value: 1, encoded length: 3, canonical length: 1` + `${CompactUintError.nonMinimal} Value: 1, encoded length: 3, canonical length: 1`, ); }); @@ -508,18 +509,18 @@ test('compactUintToBigInt', (t) => { t.deepEqual(compactUintToBigInt(Uint8Array.from([253, 253, 0])), 253n); t.deepEqual( compactUintToBigInt(Uint8Array.from([253])), - 'Error reading CompactUint: insufficient bytes. CompactUint prefix 253 requires at least 3 bytes. Remaining bytes: 1' + 'Error reading CompactUint: insufficient bytes. CompactUint prefix 253 requires at least 3 bytes. Remaining bytes: 1', ); t.deepEqual( compactUintToBigInt(Uint8Array.from([253, 0, 254, 0])), - 'Error decoding CompactUint: unexpected bytes after CompactUint. CompactUint ends at index 3, but input includes 4 bytes.' + 'Error decoding CompactUint: unexpected bytes after CompactUint. CompactUint ends at index 3, but input includes 4 bytes.', ); }); const compactUintVector = test.macro< [string, bigint, number, number?, string?] >({ - // eslint-disable-next-line max-params + // eslint-disable-next-line @typescript-eslint/max-params exec: (t, hex, value, nextIndex, start = 0, expected = hex) => { t.deepEqual(readCompactUint({ bin: hexToBin(hex), index: start }), { position: { bin: hexToBin(hex), index: nextIndex }, @@ -560,7 +561,7 @@ test( 0x0100000000n, 11, 2, - 'ff0000000001000000' + 'ff0000000001000000', ); test(compactUintVector, 'ff0100000001000000', 0x0100000001n, 9); test(compactUintVector, 'ff1111111111111111', 0x1111111111111111n, 9); @@ -573,7 +574,7 @@ testProp( const compactUint = bigIntToCompactUint(uint64); const result = compactUintToBigInt(compactUint); t.deepEqual(result, uint64); - } + }, ); test('int32SignedToUnsigned/int32UnsignedToSigned', (t) => { @@ -592,5 +593,5 @@ testProp( const signed = int32UnsignedToSigned(uint32); const unsigned = int32SignedToUnsigned(signed); t.deepEqual(unsigned, uint32); - } + }, ); diff --git a/src/lib/format/number.ts b/src/lib/format/number.ts index c78fe1f5..96669b77 100644 --- a/src/lib/format/number.ts +++ b/src/lib/format/number.ts @@ -14,14 +14,14 @@ export const numberToBinUintLE = (value: number) => { const result: number[] = []; // eslint-disable-next-line functional/no-let let remaining = value; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (remaining >= baseUint8Array) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data result.push(remaining % baseUint8Array); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements remaining = Math.floor(remaining / baseUint8Array); } - // eslint-disable-next-line functional/no-conditional-statement, functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-conditional-statements, functional/no-expression-statements, functional/immutable-data if (remaining > 0) result.push(remaining); return Uint8Array.from(result); }; @@ -36,7 +36,7 @@ export const numberToBinUintLE = (value: number) => { export const binToFixedLength = (bin: Uint8Array, bytes: number) => { const fixedBytes = new Uint8Array(bytes); const maxValue = 255; - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements, @typescript-eslint/no-unused-expressions bin.length > bytes ? fixedBytes.fill(maxValue) : fixedBytes.set(bin); return fixedBytes; }; @@ -79,7 +79,7 @@ export const numberToBinUint16LE = (value: number) => { const bin = new Uint8Array(uint16Length); const writeAsLittleEndian = true; const view = new DataView(bin.buffer, bin.byteOffset, bin.byteLength); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements view.setUint16(0, value, writeAsLittleEndian); return bin; }; @@ -98,7 +98,7 @@ export const numberToBinInt16LE = (value: number) => { const bin = new Uint8Array(int16Length); const writeAsLittleEndian = true; const view = new DataView(bin.buffer, bin.byteOffset, bin.byteLength); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements view.setInt16(0, value, writeAsLittleEndian); return bin; }; @@ -117,7 +117,7 @@ export const numberToBinInt32LE = (value: number) => { const bin = new Uint8Array(int32Length); const writeAsLittleEndian = true; const view = new DataView(bin.buffer, bin.byteOffset, bin.byteLength); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements view.setInt32(0, value, writeAsLittleEndian); return bin; }; @@ -162,7 +162,7 @@ export const numberToBinUint16BE = (value: number) => { const bin = new Uint8Array(uint16Length); const writeAsLittleEndian = false; const view = new DataView(bin.buffer, bin.byteOffset, bin.byteLength); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements view.setUint16(0, value, writeAsLittleEndian); return bin; }; @@ -181,7 +181,7 @@ export const numberToBinUint32LE = (value: number) => { const bin = new Uint8Array(uint32Length); const writeAsLittleEndian = true; const view = new DataView(bin.buffer, bin.byteOffset, bin.byteLength); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements view.setUint32(0, value, writeAsLittleEndian); return bin; }; @@ -200,7 +200,7 @@ export const numberToBinUint32BE = (value: number) => { const bin = new Uint8Array(uint32Length); const writeAsLittleEndian = false; const view = new DataView(bin.buffer, bin.byteOffset, bin.byteLength); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements view.setUint32(0, value, writeAsLittleEndian); return bin; }; @@ -217,14 +217,14 @@ export const bigIntToBinUintLE = (value: bigint) => { const result: number[] = []; // eslint-disable-next-line functional/no-let let remaining = value; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (remaining >= base) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data result.push(Number(remaining % base)); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements remaining /= base; } - // eslint-disable-next-line functional/no-conditional-statement, functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-conditional-statements, functional/no-expression-statements, functional/immutable-data if (remaining > 0n) result.push(Number(remaining)); return Uint8Array.from(result.length > 0 ? result : [0]); @@ -274,11 +274,11 @@ export const numberToBinInt32TwosCompliment = (value: number) => { const bytes = 4; const bitsInAByte = 8; const bin = new Uint8Array(bytes); - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line functional/no-let, functional/no-loop-statements, no-plusplus for (let index = 0; index < bytes; index++) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data bin[index] = value; - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, no-param-reassign + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, no-param-reassign value >>>= bitsInAByte; } return bin; @@ -305,12 +305,12 @@ export const binToNumberUintLE = (bin: Uint8Array, bytes = bin.length) => { const bitsInAByte = 8; if (bin.length !== bytes) { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new TypeError(`Bin length must be ${bytes}.`); } return new Uint8Array(bin.buffer, bin.byteOffset, bin.length).reduce( (accumulated, byte, i) => accumulated + byte * base ** (bitsInAByte * i), - 0 + 0, ); }; @@ -358,13 +358,13 @@ export const binToBigIntUintBE = (bin: Uint8Array, bytes = bin.length) => { const shift = BigInt(bitsInAByte); if (bin.length !== bytes) { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new TypeError(`Bin length must be ${bytes}.`); } return new Uint8Array(bin.buffer, bin.byteOffset, bin.length).reduce( // eslint-disable-next-line no-bitwise (accumulated, byte) => (accumulated << shift) | BigInt(byte), - 0n + 0n, ); }; @@ -413,13 +413,13 @@ export const binToBigIntUintLE = (bin: Uint8Array, bytes = bin.length) => { const bitsInAByte = 8; if (bin.length !== bytes) { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new TypeError(`Bin length must be ${bytes}.`); } return new Uint8Array(bin.buffer, bin.byteOffset, bin.length).reduceRight( // eslint-disable-next-line no-bitwise (accumulated, byte) => (accumulated << BigInt(bitsInAByte)) | BigInt(byte), - 0n + 0n, ); }; @@ -505,7 +505,7 @@ export enum CompactUintError { * `CompactUint` */ export const readCompactUint = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const { bin, index } = position; const prefix = bin[index]; @@ -518,7 +518,7 @@ export const readCompactUint = ( CompactUintError.insufficientBytes, `CompactUint prefix ${prefix} requires at least ${bytes} bytes. Remaining bytes: ${ bin.length - index - }` + }`, ); } const hasPrefix = bytes !== 1; @@ -548,19 +548,19 @@ export const bigIntToCompactUint = (value: bigint) => value <= BigInt(CompactUint.uint8MaxValue) ? Uint8Array.of(Number(value)) : value <= BigInt(CompactUint.uint16MaxValue) - ? Uint8Array.from([ - CompactUint.uint16Prefix, - ...numberToBinUint16LE(Number(value)), - ]) - : value <= BigInt(CompactUint.uint32MaxValue) - ? Uint8Array.from([ - CompactUint.uint32Prefix, - ...numberToBinUint32LE(Number(value)), - ]) - : Uint8Array.from([ - CompactUint.uint64Prefix, - ...bigIntToBinUint64LE(value), - ]); + ? Uint8Array.from([ + CompactUint.uint16Prefix, + ...numberToBinUint16LE(Number(value)), + ]) + : value <= BigInt(CompactUint.uint32MaxValue) + ? Uint8Array.from([ + CompactUint.uint32Prefix, + ...numberToBinUint32LE(Number(value)), + ]) + : Uint8Array.from([ + CompactUint.uint64Prefix, + ...bigIntToBinUint64LE(value), + ]); /** * Read a minimally-encoded `CompactUint` from the provided @@ -571,7 +571,7 @@ export const bigIntToCompactUint = (value: bigint) => * `CompactUint` */ export const readCompactUintMinimal = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const read = readCompactUint(position); if (typeof read === 'string') { @@ -584,7 +584,7 @@ export const readCompactUintMinimal = ( CompactUintError.nonMinimal, `Value: ${read.result.toString()}, encoded length: ${readLength}, canonical length: ${ canonicalEncoding.length - }` + }`, ); } return read; @@ -607,7 +607,7 @@ export const compactUintToBigInt = (bin: Uint8Array) => { if (read.position.index !== bin.length) { return formatError( CompactUintError.excessiveBytes, - `CompactUint ends at index ${read.position.index}, but input includes ${bin.length} bytes.` + `CompactUint ends at index ${read.position.index}, but input includes ${bin.length} bytes.`, ); } return read.result; diff --git a/src/lib/format/read.spec.ts b/src/lib/format/read.spec.ts index 2cebb044..228ad819 100644 --- a/src/lib/format/read.spec.ts +++ b/src/lib/format/read.spec.ts @@ -17,7 +17,7 @@ test('readMultiple', (t) => { Uint8Array.from([0]), Uint8Array.from([1, 2, 3]), ], - } + }, ); t.deepEqual( readMultiple({ bin: Uint8Array.from([0, 1, 2, 3, 4]), index: 0 }, [ @@ -26,7 +26,7 @@ test('readMultiple', (t) => { readBytes(3), readBytes(2), ]), - 'Error reading bytes: insufficient length. Provided length: 1' + 'Error reading bytes: insufficient length. Provided length: 1', ); }); @@ -34,39 +34,39 @@ test('readItemCount', (t) => { t.deepEqual( readItemCount( { bin: Uint8Array.from([0, 1, 2, 3, 4]), index: 0 }, - readBytes(2) + readBytes(2), ), { position: { bin: Uint8Array.from([0, 1, 2, 3, 4]), index: 1 }, result: [], - } + }, ); t.deepEqual( readItemCount( { bin: Uint8Array.from([1, 1, 2, 3, 4]), index: 0 }, - readBytes(2) + readBytes(2), ), { position: { bin: Uint8Array.from([1, 1, 2, 3, 4]), index: 3 }, result: [Uint8Array.from([1, 2])], - } + }, ); t.deepEqual( readItemCount( { bin: Uint8Array.from([2, 1, 2, 3, 4]), index: 0 }, - readBytes(2) + readBytes(2), ), { position: { bin: Uint8Array.from([2, 1, 2, 3, 4]), index: 5 }, result: [Uint8Array.from([1, 2]), Uint8Array.from([3, 4])], - } + }, ); t.deepEqual( readItemCount({ bin: Uint8Array.from([0xfd, 1]), index: 0 }, readBytes(2)), - 'Error reading item count. Error reading CompactUint: insufficient bytes. CompactUint prefix 253 requires at least 3 bytes. Remaining bytes: 2' + 'Error reading item count. Error reading CompactUint: insufficient bytes. CompactUint prefix 253 requires at least 3 bytes. Remaining bytes: 2', ); t.deepEqual( readItemCount({ bin: Uint8Array.from([1, 1]), index: 0 }, readBytes(2)), - 'Error reading item. Error reading bytes: insufficient length. Provided length: 1' + 'Error reading item. Error reading bytes: insufficient length. Provided length: 1', ); }); diff --git a/src/lib/format/read.ts b/src/lib/format/read.ts index 65f2f474..c39168ed 100644 --- a/src/lib/format/read.ts +++ b/src/lib/format/read.ts @@ -6,7 +6,7 @@ import { readCompactUintMinimal } from './number.js'; * `ReadPosition`s are the only input of Libauth's read functions, and each read * function returns a new `ReadPosition` after a successful result. */ -export interface ReadPosition { +export type ReadPosition = { /** * The `Uint8Array` from which bytes are being read. */ @@ -15,13 +15,13 @@ export interface ReadPosition { * The index at which the next byte should be read. */ index: number; -} +}; /** * The successful result of a read function, includes the result and the next * {@link ReadPosition}. */ -export interface ReadResult { +export type ReadResult = { /** * The new read position after the successfully-read bytes. */ @@ -30,7 +30,7 @@ export interface ReadResult { * The successfully-read value. */ result: Type; -} +}; /** * The return type of a read function that may fail. May be a {@link ReadResult} @@ -42,10 +42,10 @@ export type MaybeReadResult = ReadResult | string; * A function that reads some data beginning at a {@link ReadPosition}. */ export type ReadFunction = ( - position: ReadPosition + position: ReadPosition, ) => MaybeReadResult; -type ExtractReadFunctionResults[]> = { +type ExtractReadFunctionResults[]> = { [K in keyof T]: T[K] extends ReadFunction ? V : never; }; @@ -62,20 +62,20 @@ type ExtractReadFunctionResults[]> = { */ export const readMultiple = []>( position: ReadPosition, - readFunctions: [...ReadFunctionList] + readFunctions: [...ReadFunctionList], ): MaybeReadResult> => { // eslint-disable-next-line functional/no-let let nextPosition = position; const results = []; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const readFunction of readFunctions) { const out = readFunction(nextPosition); if (typeof out === 'string') { return out; } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data results.push(out.result); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements nextPosition = out.position; } return { @@ -99,7 +99,7 @@ export enum ReadItemCountError { */ export const readItemCount = ( position: ReadPosition, - readFunction: ReadFunction + readFunction: ReadFunction, ): MaybeReadResult => { const countRead = readCompactUintMinimal(position); if (typeof countRead === 'string') { @@ -108,15 +108,15 @@ export const readItemCount = ( // eslint-disable-next-line functional/no-let let nextPosition = countRead.position; const result: Type[] = []; - // eslint-disable-next-line functional/no-loop-statement, functional/no-let, no-plusplus + // eslint-disable-next-line functional/no-loop-statements, functional/no-let, no-plusplus for (let remaining = Number(countRead.result); remaining > 0; remaining--) { const read = readFunction(nextPosition); if (typeof read === 'string') { return formatError(ReadItemCountError.item, read); } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data result.push(read.result); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements nextPosition = read.position; } return { position: nextPosition, result }; diff --git a/src/lib/format/time.spec.ts b/src/lib/format/time.spec.ts index 5f495b53..c9e99f33 100644 --- a/src/lib/format/time.spec.ts +++ b/src/lib/format/time.spec.ts @@ -1,4 +1,3 @@ -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import { @@ -14,11 +13,13 @@ import { minimumLocktimeTimestamp, } from '../lib.js'; +import { fc, testProp } from '@fast-check/ava'; + test('dateToLocktime', (t) => { t.deepEqual(dateToLocktime(new Date('2019-10-13')), 1570924800); t.deepEqual( dateToLocktime(new Date('2107-01-01')), - LocktimeError.dateOutOfRange + LocktimeError.dateOutOfRange, ); }); @@ -26,7 +27,7 @@ test('dateToLocktimeBin', (t) => { t.deepEqual(dateToLocktimeBin(new Date('2019-10-13')), hexToBin('0069a25d')); t.deepEqual( dateToLocktimeBin(new Date('2107-01-01')), - LocktimeError.dateOutOfRange + LocktimeError.dateOutOfRange, ); }); @@ -37,7 +38,7 @@ test('parseLockTime', (t) => { t.deepEqual(decodeLocktime(hexToBin('00')), LocktimeError.incorrectLength); t.deepEqual( decodeLocktime(hexToBin('0000000000')), - LocktimeError.incorrectLength + LocktimeError.incorrectLength, ); }); @@ -50,7 +51,7 @@ testProp( }), ], (t, timestamp) => - t.deepEqual(dateToLocktime(locktimeToDate(timestamp) as Date), timestamp) + t.deepEqual(dateToLocktime(locktimeToDate(timestamp) as Date), timestamp), ); testProp( @@ -58,15 +59,15 @@ testProp( [fc.date({ max: maximumLocktimeDate, min: minimumLocktimeDate })], (t, date) => { const withSecondResolution = new Date( - Math.round(date.getTime() / 1000) * 1000 + Math.round(date.getTime() / 1000) * 1000, ); t.deepEqual( ( decodeLocktime( - dateToLocktimeBin(withSecondResolution) as Uint8Array + dateToLocktimeBin(withSecondResolution) as Uint8Array, ) as Date ).getTime(), - withSecondResolution.getTime() + withSecondResolution.getTime(), ); - } + }, ); diff --git a/src/lib/format/time.ts b/src/lib/format/time.ts index bd4c0bfc..386002af 100644 --- a/src/lib/format/time.ts +++ b/src/lib/format/time.ts @@ -19,7 +19,7 @@ export const maximumLocktimeTimestamp = 0xffffffff; * `locktime`. */ export const minimumLocktimeDate = new Date( - minimumLocktimeTimestamp * msPerLocktimeSecond + minimumLocktimeTimestamp * msPerLocktimeSecond, ); /** @@ -27,7 +27,7 @@ export const minimumLocktimeDate = new Date( * `locktime`. */ export const maximumLocktimeDate = new Date( - maximumLocktimeTimestamp * msPerLocktimeSecond + maximumLocktimeTimestamp * msPerLocktimeSecond, ); export enum LocktimeError { diff --git a/src/lib/format/type-utils.ts b/src/lib/format/type-utils.ts index 4903843d..1d623f30 100644 --- a/src/lib/format/type-utils.ts +++ b/src/lib/format/type-utils.ts @@ -8,52 +8,18 @@ export type PartialExactOptional = { [P in keyof T]?: T[P] | undefined; }; -export type ImmutablePrimitive = - // eslint-disable-next-line @typescript-eslint/ban-types - Function | boolean | number | string | null | undefined; -export type ImmutableArray = readonly Immutable[]; -export type ImmutableMap = ReadonlyMap, Immutable>; -export type ImmutableSet = ReadonlySet>; -export type ImmutableObject = { - readonly [K in keyof T]: Immutable; -}; -// Derived from: https://www.growingwiththeweb.com/2020/10/typescript-readonly-typed-arrays.html -export interface ImmutableUint8Array - extends Omit { - readonly [n: number]: number; -} - -/** - * A deep-readonly utility type. Supports objects, `Array`s, `Uint8Array`s, - * `Map`s, and `Set`s. - * - * Note: `Uint8Array` is the only supported `TypedArray`. - */ -// Derived from: https://github.com/microsoft/TypeScript/issues/13923#issuecomment-557509399 -export type Immutable = T extends ImmutablePrimitive - ? T - : T extends (infer U)[] - ? ImmutableArray - : T extends Uint8Array - ? ImmutableUint8Array - : T extends Map - ? ImmutableMap - : T extends Set - ? ImmutableSet - : ImmutableObject; - -type FunctionComparisonEqualsWrapped = T extends ( // eslint-disable-next-line @typescript-eslint/ban-types, @typescript-eslint/no-unused-vars - T extends {} ? infer R & {} : infer R +type FunctionComparisonEqualsWrapped = T extends ( // eslint-disable-next-line @typescript-eslint/ban-types + T extends Readonly<{}> ? infer R & Readonly<{}> : infer R ) ? { [P in keyof R]: R[P]; } : never; type FunctionComparisonEquals = (< - T + T, // eslint-disable-next-line @typescript-eslint/no-magic-numbers >() => T extends FunctionComparisonEqualsWrapped ? 1 : 2) extends < - T + T, // eslint-disable-next-line @typescript-eslint/no-magic-numbers >() => T extends FunctionComparisonEqualsWrapped ? 1 : 2 ? true @@ -61,7 +27,7 @@ type FunctionComparisonEquals = (< // eslint-disable-next-line @typescript-eslint/no-explicit-any type IsAny = FunctionComparisonEquals; -// eslint-disable-next-line @typescript-eslint/consistent-type-definitions, functional/no-mixed-type +// eslint-disable-next-line functional/no-mixed-types type InvariantComparisonEqualsWrapped = { value: T; setValue: (value: T) => never; diff --git a/src/lib/format/utf8.spec.ts b/src/lib/format/utf8.spec.ts index a8b2a9f4..bfcbcf81 100644 --- a/src/lib/format/utf8.spec.ts +++ b/src/lib/format/utf8.spec.ts @@ -1,9 +1,10 @@ -import { testProp } from '@fast-check/ava'; import test from 'ava'; -import fc from 'fast-check'; import { binToUtf8, hexToBin, utf8ToBin } from '../lib.js'; +import { testProp } from '@fast-check/ava'; +import fc from 'fast-check'; + const maxUint8Number = 255; const fcUint8Array = (minLength: number, maxLength: number) => fc @@ -26,5 +27,5 @@ testProp( '[fast-check] utf8ToBin <-> binToUtf8', [fcUint8Array(0, testBinLength)], (t, input) => - t.deepEqual(binToUtf8(utf8ToBin(binToUtf8(input))), binToUtf8(input)) + t.deepEqual(binToUtf8(utf8ToBin(binToUtf8(input))), binToUtf8(input)), ); diff --git a/src/lib/format/utf8.ts b/src/lib/format/utf8.ts index 0d62e38b..d31b4fd3 100644 --- a/src/lib/format/utf8.ts +++ b/src/lib/format/utf8.ts @@ -12,3 +12,55 @@ const utf8Decoder = new TextDecoder(); * @param bytes - the Uint8Array to decode */ export const binToUtf8 = (bytes: Uint8Array) => utf8Decoder.decode(bytes); + +/** + * Normalize a string using Unicode Normalization Form KC (NFKC): compatibility + * decomposition, followed by canonical composition. NFKC is the preferred form + * for applications in which disambiguation between characters is critical. In + * Libauth, all message formats designed for transmission between trust centers + * are NFKC-normalized to hinder exploits in which lookalike characters are used + * to deceive counterparties. + * + * E.g.: + * ``` + * console.log(lossyNormalize('fitπŸš€πŸ‘«πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦')); // 'fitπŸš€πŸ‘«πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦' + * ``` + */ +export const lossyNormalize = (utf8: string) => utf8.normalize('NFKC'); + +/** + * Return the user-perceived character segments of the given string, e.g.: + * + * ```js + * const test = 'fitπŸš€πŸ‘«πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦'; + * console.log([...test]); // '["fi","t","πŸš€","πŸ‘«","πŸ‘¨","‍","πŸ‘©","‍","πŸ‘§","‍","πŸ‘¦"]' + * console.log(segment(test)); // '["fi","t","πŸš€","πŸ‘«","πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦"]' + * ``` + * + * Note, this utility segments the string into grapheme clusters using + * `Intl.Segmenter`, a TC39 proposal which reached stage 4 in 2022, and may not + * be supported in older environments. + * + * @param utf8 - the string for which to segment characters. + */ +export const segment = (utf8: string) => + [...new Intl.Segmenter('en', { granularity: 'grapheme' }).segment(utf8)].map( + (item) => item.segment, + ); + +/** + * Return the user-perceived character length of the given string, e.g.: + * + * ```js + * const test = 'fitπŸš€πŸ‘«πŸ‘¨β€πŸ‘©β€πŸ‘§β€πŸ‘¦' + * console.log(test.length); // 17 + * console.log(length(test)); // 5 + * ``` + * + * Note, this utility segments the string into grapheme clusters using + * `Intl.Segmenter`, a TC39 proposal which reached stage 4 in 2022, and may not + * be supported in older environments. + * + * @param utf8 - the string for which to count the character length. + */ +export const length = (utf8: string) => segment(utf8).length; diff --git a/src/lib/key/hd-key.spec.ts b/src/lib/key/hd-key.spec.ts index 7eb6c991..238becf6 100644 --- a/src/lib/key/hd-key.spec.ts +++ b/src/lib/key/hd-key.spec.ts @@ -1,6 +1,4 @@ -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; -import bitcoreLibCash from 'bitcore-lib-cash'; import type { HdKeyParameters, @@ -36,6 +34,9 @@ import { validateSecp256k1PrivateKey, } from '../lib.js'; +import { fc, testProp } from '@fast-check/ava'; +import bitcoreLibCash from 'bitcore-lib-cash'; + const seed = Uint8Array.from([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); const xprv = @@ -61,24 +62,24 @@ const crypto = { ripemd160, secp256k1, sha256, sha512 }; test('[crypto] deriveHdPrivateNodeFromSeed', (t) => { const valid = { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), privateKey: hexToBin( - '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4' + '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4', ), valid: true, } as HdPrivateNodeValid; const invalid = { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, invalidPrivateKey: hexToBin( - '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4' + '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4', ), parentFingerprint: hexToBin('00000000'), valid: false, @@ -94,15 +95,15 @@ test('[crypto] deriveHdPrivateNodeFromSeed', (t) => { test('[crypto] deriveHdPrivateNodeIdentifier', (t) => { const { node } = decodeHdPrivateKey( - xprv + xprv, ) as HdKeyParameters; t.deepEqual( deriveHdPrivateNodeIdentifier(node), - hexToBin('15c918d389673c6cd0660050f268a843361e1111') + hexToBin('15c918d389673c6cd0660050f268a843361e1111'), ); t.deepEqual( deriveHdPrivateNodeIdentifier(node, crypto), - hexToBin('15c918d389673c6cd0660050f268a843361e1111') + hexToBin('15c918d389673c6cd0660050f268a843361e1111'), ); }); @@ -110,11 +111,11 @@ test('[crypto] deriveHdPublicNodeIdentifier', (t) => { const { node } = decodeHdPublicKey(xpub) as HdKeyParameters; t.deepEqual( deriveHdPublicNodeIdentifier(node), - hexToBin('15c918d389673c6cd0660050f268a843361e1111') + hexToBin('15c918d389673c6cd0660050f268a843361e1111'), ); t.deepEqual( deriveHdPublicNodeIdentifier(node, crypto), - hexToBin('15c918d389673c6cd0660050f268a843361e1111') + hexToBin('15c918d389673c6cd0660050f268a843361e1111'), ); }); @@ -122,13 +123,13 @@ test('[crypto] decodeHdKey', (t) => { t.deepEqual(decodeHdKey(xprv), { node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), privateKey: hexToBin( - '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4' + '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4', ), valid: true, }, @@ -137,13 +138,13 @@ test('[crypto] decodeHdKey', (t) => { t.deepEqual(decodeHdKey(xpub, crypto), { node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), publicKey: hexToBin( - '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746' + '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746', ), }, version: HdKeyVersion.mainnetPublicKey, @@ -156,9 +157,9 @@ test('[crypto] decodeHdKey: errors', (t) => { t.deepEqual( decodeHdKey( 'xpub661MyMwAqRbcEngHLkoUWCKMBMGeqdqCGkqtzrHaTZub9ALw2oRfHA6fQP5n5X9VHStaNTBYomkSb8BFhUGavwD3RG1qvMkEKceTavTp2Ta', - crypto + crypto, ), - HdKeyDecodingError.invalidChecksum + HdKeyDecodingError.invalidChecksum, ); }); @@ -167,13 +168,13 @@ test('[crypto] decodeHdPrivateKey', (t) => { network: 'mainnet', node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), privateKey: hexToBin( - '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4' + '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4', ), valid: true, }, @@ -182,13 +183,13 @@ test('[crypto] decodeHdPrivateKey', (t) => { network: 'testnet', node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), privateKey: hexToBin( - '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4' + '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4', ), valid: true, }, @@ -199,28 +200,28 @@ test('[crypto] decodeHdPrivateKey: errors', (t) => { t.deepEqual(decodeHdPrivateKey(xpub), HdKeyDecodingError.privateKeyExpected); t.deepEqual( decodeHdPrivateKey( - '1111111111111FF9QeH94hg7KAjgjUqkHUqbrw5wWQLoRNfRhB4cHUDCJxx2HfNb5qDiAjpbKjXeLJSknuzDmja42174H9Es1XbY24sZts9' + '1111111111111FF9QeH94hg7KAjgjUqkHUqbrw5wWQLoRNfRhB4cHUDCJxx2HfNb5qDiAjpbKjXeLJSknuzDmja42174H9Es1XbY24sZts9', ), - HdKeyDecodingError.unknownVersion + HdKeyDecodingError.unknownVersion, ); const xprvWith0FilledKey = 'xprv9s21ZrQH143K2JbpEjGU94NcdKSASB7LuXvJCTsxuENcGN1nVG7QjMnBZ6c54tCKNErugtr5mi7oyGaDVrYe4SE5u1GnzYHmjDKuKg4vuNm'; t.deepEqual( decodeHdPrivateKey(xprvWith0FilledKey), - HdKeyDecodingError.invalidPrivateNode + HdKeyDecodingError.invalidPrivateNode, ); const xprvWith255FilledKey = 'xprv9s21ZrQH143K2JbpEjGU94NcdKSASB7LuXvJCTsxuENcGN1nVG7QjMnBZ8YpF7eMDfY8piRngHjovbAzQyAMi94xgeLuEgyfisLHpC7G5ST'; t.deepEqual( decodeHdPrivateKey(xprvWith255FilledKey), - HdKeyDecodingError.invalidPrivateNode + HdKeyDecodingError.invalidPrivateNode, ); t.deepEqual( decodeHdPrivateKey( - 'xprv9s21ZrQH143K2JbpEjGU94NcdKSASB7LuXvJCTsxuENcGN1nVG7QjMnBhegPMjkj1oGSFcmBkMX3xdwcMy6NSgrHvmqJptpUW5xGjg7kifZ' + 'xprv9s21ZrQH143K2JbpEjGU94NcdKSASB7LuXvJCTsxuENcGN1nVG7QjMnBhegPMjkj1oGSFcmBkMX3xdwcMy6NSgrHvmqJptpUW5xGjg7kifZ', ), - HdKeyDecodingError.missingPrivateKeyPaddingByte + HdKeyDecodingError.missingPrivateKeyPaddingByte, ); }); @@ -229,13 +230,13 @@ test('[crypto] decodeHdPublicKey', (t) => { network: 'mainnet', node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), publicKey: hexToBin( - '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746' + '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746', ), }, }); @@ -243,13 +244,13 @@ test('[crypto] decodeHdPublicKey', (t) => { network: 'testnet', node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), publicKey: hexToBin( - '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746' + '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746', ), }, }); @@ -259,9 +260,9 @@ test('[crypto] decodeHdPublicKey: errors', (t) => { t.deepEqual(decodeHdPublicKey(xprv), HdKeyDecodingError.publicKeyExpected); t.deepEqual( decodeHdPublicKey( - '1111111111111FF9QeH94hg7KAjgjUqkHUqbrw5wWQLoRNfRhB4cHUDCJxx2HfNb5qDiAjpbKjXeLJSknuzDmja42174H9Es1XbY24sZts9' + '1111111111111FF9QeH94hg7KAjgjUqkHUqbrw5wWQLoRNfRhB4cHUDCJxx2HfNb5qDiAjpbKjXeLJSknuzDmja42174H9Es1XbY24sZts9', ), - HdKeyDecodingError.unknownVersion + HdKeyDecodingError.unknownVersion, ); }); @@ -271,18 +272,18 @@ test('[crypto] encodeHdPrivateKey', (t) => { network: 'mainnet', node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), privateKey: hexToBin( - '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4' + '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4', ), valid: true, }, }), - xprv + xprv, ); t.deepEqual( @@ -291,20 +292,20 @@ test('[crypto] encodeHdPrivateKey', (t) => { network: 'testnet', node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), privateKey: hexToBin( - '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4' + '330fd355e141910d33bbe84c369b87a209dd18b81095912be766b2b5a9d72bc4', ), valid: true, }, }, - crypto + crypto, ), - tprv + tprv, ); }); @@ -314,17 +315,17 @@ test('[crypto] encodeHdPublicKey', (t) => { network: 'mainnet', node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), publicKey: hexToBin( - '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746' + '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746', ), }, }), - xpub + xpub, ); t.deepEqual( encodeHdPublicKey( @@ -332,19 +333,19 @@ test('[crypto] encodeHdPublicKey', (t) => { network: 'testnet', node: { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), publicKey: hexToBin( - '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746' + '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746', ), }, }, - crypto + crypto, ), - tpub + tpub, ); }); @@ -356,13 +357,13 @@ test('[crypto] deriveHdPublicNode', (t) => { } t.deepEqual(deriveHdPublicNode(privateParams.node), { chainCode: hexToBin( - '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9' + '18aab7e9ef169f3029d93651d0c85303cbcc2ac559ccd04c324a2e678ef26dc9', ), childIndex: 0, depth: 0, parentFingerprint: hexToBin('00000000'), publicKey: hexToBin( - '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746' + '02be99138b48b430a8ee40bf8b56c8ebc584c363774010a9bfe549a87126e61746', ), }); }); @@ -371,11 +372,11 @@ test('[crypto] deriveHdPrivateNodeChild', (t) => { const master = decodeHdPrivateKey(xprv); const hardenedIndex0Child = decodeHdPrivateKey( - 'xprv9u4S6TaiPQaF7FS24QFpRP6hjff4jXNwwYTkVNC6f6YzHj2a6G28aRN1D6Az82SxMeBivpVS3gDDXyQiu3RANTqWy34Zxi9JN76zSwkjqPF' + 'xprv9u4S6TaiPQaF7FS24QFpRP6hjff4jXNwwYTkVNC6f6YzHj2a6G28aRN1D6Az82SxMeBivpVS3gDDXyQiu3RANTqWy34Zxi9JN76zSwkjqPF', ); const index1GrandChild = decodeHdPrivateKey( - 'xprv9w8PdihBAeR4xgGYWWqBnmDTrpWEW1QjuYAUkR7A6X48q1iQVgN433aSFxQGgtureVz7cCyi5zfuMTtBF3AkanjtvNs9m8u2JobxNfphSi3' + 'xprv9w8PdihBAeR4xgGYWWqBnmDTrpWEW1QjuYAUkR7A6X48q1iQVgN433aSFxQGgtureVz7cCyi5zfuMTtBF3AkanjtvNs9m8u2JobxNfphSi3', ); if ( @@ -390,7 +391,7 @@ test('[crypto] deriveHdPrivateNodeChild', (t) => { const hardenedIndex0 = 0x80000000; const result0 = deriveHdPrivateNodeChild( master.node, - hardenedIndex0 + hardenedIndex0, ) as HdPrivateNodeValid; const result1 = deriveHdPrivateNodeChild(result0, 1, crypto); @@ -407,19 +408,19 @@ test('[crypto] deriveHdPrivateNodeChild', (t) => { test('[crypto] deriveHdPrivateNodeChild: errors', (t) => { const { node } = decodeHdPrivateKey( - xprv + xprv, ) as HdKeyParameters; const max = 0xffffffff; t.deepEqual( deriveHdPrivateNodeChild(node, max + 1), - HdNodeDerivationError.childIndexExceedsMaximum + HdNodeDerivationError.childIndexExceedsMaximum, ); }); test('[crypto] deriveHdPublicNodeChild', (t) => { const { node } = decodeHdPrivateKey( - xprv + xprv, ) as HdKeyParameters; const parentPublic = deriveHdPublicNode(node); @@ -428,19 +429,19 @@ test('[crypto] deriveHdPublicNodeChild', (t) => { const child = deriveHdPrivateNodeChild( node, - derivationIndex + derivationIndex, ) as HdPrivateNodeKnownParent; const expectedPublic = deriveHdPublicNode(child); t.deepEqual( deriveHdPublicNodeChild(parentPublic, derivationIndex), - expectedPublic + expectedPublic, ); t.deepEqual( deriveHdPublicNodeChild(parentPublic, derivationIndex, crypto), - expectedPublic + expectedPublic, ); }); @@ -449,27 +450,27 @@ test('[crypto] deriveHdPublicNodeChild: errors', (t) => { const hardened0 = 0x80000000; t.deepEqual( deriveHdPublicNodeChild(node, hardened0), - HdNodeDerivationError.hardenedDerivationRequiresPrivateNode + HdNodeDerivationError.hardenedDerivationRequiresPrivateNode, ); }); test('[crypto] deriveHdPath', (t) => { const { node: privateNode } = decodeHdPrivateKey( - xprv + xprv, ) as HdKeyParameters; const publicNode = deriveHdPublicNode(privateNode); t.deepEqual( deriveHdPath(privateNode, 'm') as HdPrivateNodeValid, - privateNode + privateNode, ); t.deepEqual( deriveHdPath(publicNode, 'M', crypto) as HdPublicNode, - publicNode + publicNode, ); t.deepEqual(deriveHdPath(privateNode, "m/0'/1"), { ...( decodeHdPrivateKey( - 'xprv9w8PdihBAeR4xgGYWWqBnmDTrpWEW1QjuYAUkR7A6X48q1iQVgN433aSFxQGgtureVz7cCyi5zfuMTtBF3AkanjtvNs9m8u2JobxNfphSi3' + 'xprv9w8PdihBAeR4xgGYWWqBnmDTrpWEW1QjuYAUkR7A6X48q1iQVgN433aSFxQGgtureVz7cCyi5zfuMTtBF3AkanjtvNs9m8u2JobxNfphSi3', ) as HdKeyParameters ).node, parentIdentifier: hexToBin('2f2bc501c943dd7f17904b612c090dd88270cc59'), @@ -477,98 +478,98 @@ test('[crypto] deriveHdPath', (t) => { t.deepEqual( deriveHdPath(publicNode, 'M/0/1/2/3'), deriveHdPublicNode( - deriveHdPath(privateNode, 'm/0/1/2/3') as HdPrivateNodeKnownParent - ) + deriveHdPath(privateNode, 'm/0/1/2/3') as HdPrivateNodeKnownParent, + ), ); t.deepEqual( deriveHdPath(privateNode, "m/0'/1'/2'/3'"), - deriveHdPath(privateNode, 'm/2147483648/2147483649/2147483650/2147483651') + deriveHdPath(privateNode, 'm/2147483648/2147483649/2147483650/2147483651'), ); }); test('[crypto] deriveHdPath: errors', (t) => { const { node: privateNode } = decodeHdPrivateKey( - xprv + xprv, ) as HdKeyParameters; const publicNode = deriveHdPublicNode(privateNode); t.deepEqual( deriveHdPath(privateNode, 'm/bad/1'), - HdNodeDerivationError.invalidDerivationPath + HdNodeDerivationError.invalidDerivationPath, ); t.deepEqual( deriveHdPath(privateNode, 'M'), - HdNodeDerivationError.invalidPrivateDerivationPrefix + HdNodeDerivationError.invalidPrivateDerivationPrefix, ); t.deepEqual( deriveHdPath(publicNode, 'm'), - HdNodeDerivationError.invalidPublicDerivationPrefix + HdNodeDerivationError.invalidPublicDerivationPrefix, ); t.deepEqual( deriveHdPath(privateNode, 'm/0/4294967296/0'), - HdNodeDerivationError.childIndexExceedsMaximum + HdNodeDerivationError.childIndexExceedsMaximum, ); t.deepEqual( deriveHdPath(publicNode, "M/0/0'/0"), - HdNodeDerivationError.hardenedDerivationRequiresPrivateNode + HdNodeDerivationError.hardenedDerivationRequiresPrivateNode, ); t.deepEqual( deriveHdPath(publicNode, 'M/0/2147483648/0'), - HdNodeDerivationError.hardenedDerivationRequiresPrivateNode + HdNodeDerivationError.hardenedDerivationRequiresPrivateNode, ); }); test('[crypto] crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode', (t) => { const { node: parentPrivateNode } = decodeHdPrivateKey( - xprv + xprv, ) as HdKeyParameters; const parentPublicNode = deriveHdPublicNode(parentPrivateNode); const nonHardenedChildNode = deriveHdPath( parentPrivateNode, - 'm/1234' + 'm/1234', ) as HdPrivateNodeKnownParent; const hardenedChildNode = deriveHdPath( parentPrivateNode, - "m/1234'" + "m/1234'", ) as HdPrivateNodeKnownParent; const hardenedChildPublicNode = deriveHdPublicNode(hardenedChildNode); const nonHardenedGrandchildNode = deriveHdPath( hardenedChildNode, - 'm/1234' + 'm/1234', ) as HdPrivateNodeKnownParent; t.deepEqual( crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode( parentPublicNode, - nonHardenedChildNode + nonHardenedChildNode, ), - parentPrivateNode + parentPrivateNode, ); t.deepEqual( crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode( hardenedChildPublicNode, nonHardenedGrandchildNode, - crypto + crypto, ), - hardenedChildNode + hardenedChildNode, ); t.deepEqual( crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode( parentPublicNode, - hardenedChildNode + hardenedChildNode, ), - HdNodeCrackingError.cannotCrackHardenedDerivation + HdNodeCrackingError.cannotCrackHardenedDerivation, ); }); const bip32Vector = test.macro<[string, string, string, string]>({ - // eslint-disable-next-line complexity, max-params + // eslint-disable-next-line complexity, @typescript-eslint/max-params exec: (t, seedHex, path, hdPrivateKey, hdPublicKey) => { const master = deriveHdPrivateNodeFromSeed(hexToBin(seedHex)); @@ -598,7 +599,7 @@ const bip32Vector = test.macro<[string, string, string, string]>({ } t.deepEqual( childNode.parentIdentifier?.slice(0, fingerprintLength), - path === 'm' ? undefined : decodedPrivate.node.parentFingerprint + path === 'm' ? undefined : decodedPrivate.node.parentFingerprint, ); t.deepEqual(childNode, { ...decodedPrivate.node, @@ -613,7 +614,7 @@ const bip32Vector = test.macro<[string, string, string, string]>({ const publicNode = deriveHdPublicNode(childNode); t.deepEqual( publicNode.parentIdentifier?.slice(0, fingerprintLength), - path === 'm' ? undefined : decodedPublic.node.parentFingerprint + path === 'm' ? undefined : decodedPublic.node.parentFingerprint, ); t.deepEqual(publicNode, { ...decodedPublic.node, @@ -637,7 +638,7 @@ test( '000102030405060708090a0b0c0d0e0f', 'm', 'xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi', - 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8' + 'xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8', ); test( @@ -646,7 +647,7 @@ test( '000102030405060708090a0b0c0d0e0f', "m/0'", 'xprv9uHRZZhk6KAJC1avXpDAp4MDc3sQKNxDiPvvkX8Br5ngLNv1TxvUxt4cV1rGL5hj6KCesnDYUhd7oWgT11eZG7XnxHrnYeSvkzY7d2bhkJ7', - 'xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw' + 'xpub68Gmy5EdvgibQVfPdqkBBCHxA5htiqg55crXYuXoQRKfDBFA1WEjWgP6LHhwBZeNK1VTsfTFUHCdrfp1bgwQ9xv5ski8PX9rL2dZXvgGDnw', ); test( @@ -655,7 +656,7 @@ test( '000102030405060708090a0b0c0d0e0f', "m/0'/1", 'xprv9wTYmMFdV23N2TdNG573QoEsfRrWKQgWeibmLntzniatZvR9BmLnvSxqu53Kw1UmYPxLgboyZQaXwTCg8MSY3H2EU4pWcQDnRnrVA1xe8fs', - 'xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ' + 'xpub6ASuArnXKPbfEwhqN6e3mwBcDTgzisQN1wXN9BJcM47sSikHjJf3UFHKkNAWbWMiGj7Wf5uMash7SyYq527Hqck2AxYysAA7xmALppuCkwQ', ); test( @@ -664,7 +665,7 @@ test( '000102030405060708090a0b0c0d0e0f', "m/0'/1/2'", 'xprv9z4pot5VBttmtdRTWfWQmoH1taj2axGVzFqSb8C9xaxKymcFzXBDptWmT7FwuEzG3ryjH4ktypQSAewRiNMjANTtpgP4mLTj34bhnZX7UiM', - 'xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5' + 'xpub6D4BDPcP2GT577Vvch3R8wDkScZWzQzMMUm3PWbmWvVJrZwQY4VUNgqFJPMM3No2dFDFGTsxxpG5uJh7n7epu4trkrX7x7DogT5Uv6fcLW5', ); test( @@ -673,7 +674,7 @@ test( '000102030405060708090a0b0c0d0e0f', "m/0'/1/2'/2", 'xprvA2JDeKCSNNZky6uBCviVfJSKyQ1mDYahRjijr5idH2WwLsEd4Hsb2Tyh8RfQMuPh7f7RtyzTtdrbdqqsunu5Mm3wDvUAKRHSC34sJ7in334', - 'xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV' + 'xpub6FHa3pjLCk84BayeJxFW2SP4XRrFd1JYnxeLeU8EqN3vDfZmbqBqaGJAyiLjTAwm6ZLRQUMv1ZACTj37sR62cfN7fe5JnJ7dh8zL4fiyLHV', ); test( @@ -682,7 +683,7 @@ test( '000102030405060708090a0b0c0d0e0f', "m/0'/1/2'/2/1000000000", 'xprvA41z7zogVVwxVSgdKUHDy1SKmdb533PjDz7J6N6mV6uS3ze1ai8FHa8kmHScGpWmj4WggLyQjgPie1rFSruoUihUZREPSL39UNdE3BBDu76', - 'xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy' + 'xpub6H1LXWLaKsWFhvm6RVpEL9P4KfRZSW7abD2ttkWP3SSQvnyA8FSVqNTEcYFgJS2UaFcxupHiYkro49S8yGasTvXEYBVPamhGW6cFJodrTHy', ); test( @@ -691,7 +692,7 @@ test( 'fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542', 'm', 'xprv9s21ZrQH143K31xYSDQpPDxsXRTUcvj2iNHm5NUtrGiGG5e2DtALGdso3pGz6ssrdK4PFmM8NSpSBHNqPqm55Qn3LqFtT2emdEXVYsCzC2U', - 'xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB' + 'xpub661MyMwAqRbcFW31YEwpkMuc5THy2PSt5bDMsktWQcFF8syAmRUapSCGu8ED9W6oDMSgv6Zz8idoc4a6mr8BDzTJY47LJhkJ8UB7WEGuduB', ); test( @@ -700,7 +701,7 @@ test( 'fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542', 'm/0', 'xprv9vHkqa6EV4sPZHYqZznhT2NPtPCjKuDKGY38FBWLvgaDx45zo9WQRUT3dKYnjwih2yJD9mkrocEZXo1ex8G81dwSM1fwqWpWkeS3v86pgKt', - 'xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH' + 'xpub69H7F5d8KSRgmmdJg2KhpAK8SR3DjMwAdkxj3ZuxV27CprR9LgpeyGmXUbC6wb7ERfvrnKZjXoUmmDznezpbZb7ap6r1D3tgFxHmwMkQTPH', ); test( @@ -709,7 +710,7 @@ test( 'fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542', "m/0/2147483647'", 'xprv9wSp6B7kry3Vj9m1zSnLvN3xH8RdsPP1Mh7fAaR7aRLcQMKTR2vidYEeEg2mUCTAwCd6vnxVrcjfy2kRgVsFawNzmjuHc2YmYRmagcEPdU9', - 'xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a' + 'xpub6ASAVgeehLbnwdqV6UKMHVzgqAG8Gr6riv3Fxxpj8ksbH9ebxaEyBLZ85ySDhKiLDBrQSARLq1uNRts8RuJiHjaDMBU4Zn9h8LZNnBC5y4a', ); test( @@ -718,7 +719,7 @@ test( 'fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542', "m/0/2147483647'/1", 'xprv9zFnWC6h2cLgpmSA46vutJzBcfJ8yaJGg8cX1e5StJh45BBciYTRXSd25UEPVuesF9yog62tGAQtHjXajPPdbRCHuWS6T8XA2ECKADdw4Ef', - 'xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon' + 'xpub6DF8uhdarytz3FWdA8TvFSvvAh8dP3283MY7p2V4SeE2wyWmG5mg5EwVvmdMVCQcoNJxGoWaU9DCWh89LojfZ537wTfunKau47EL2dhHKon', ); test( @@ -727,7 +728,7 @@ test( 'fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542', "m/0/2147483647'/1/2147483646'", 'xprvA1RpRA33e1JQ7ifknakTFpgNXPmW2YvmhqLQYMmrj4xJXXWYpDPS3xz7iAxn8L39njGVyuoseXzU6rcxFLJ8HFsTjSyQbLYnMpCqE2VbFWc', - 'xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL' + 'xpub6ERApfZwUNrhLCkDtcHTcxd75RbzS1ed54G1LkBUHQVHQKqhMkhgbmJbZRkrgZw4koxb5JaHWkY4ALHY2grBGRjaDMzQLcgJvLJuZZvRcEL', ); test( @@ -736,7 +737,7 @@ test( 'fffcf9f6f3f0edeae7e4e1dedbd8d5d2cfccc9c6c3c0bdbab7b4b1aeaba8a5a29f9c999693908d8a8784817e7b7875726f6c696663605d5a5754514e4b484542', "m/0/2147483647'/1/2147483646'/2", 'xprvA2nrNbFZABcdryreWet9Ea4LvTJcGsqrMzxHx98MMrotbir7yrKCEXw7nadnHM8Dq38EGfSh6dqA9QWTyefMLEcBYJUuekgW4BYPJcr9E7j', - 'xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt' + 'xpub6FnCn6nSzZAw5Tw7cgR9bi15UV96gLZhjDstkXXxvCLsUXBGXPdSnLFbdpq8p9HmGsApME5hQTZ3emM2rnY5agb9rXpVGyy3bdW6EEgAtqt', ); test( @@ -745,7 +746,7 @@ test( '4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be', 'm', 'xprv9s21ZrQH143K25QhxbucbDDuQ4naNntJRi4KUfWT7xo4EKsHt2QJDu7KXp1A3u7Bi1j8ph3EGsZ9Xvz9dGuVrtHHs7pXeTzjuxBrCmmhgC6', - 'xpub661MyMwAqRbcEZVB4dScxMAdx6d4nFc9nvyvH3v4gJL378CSRZiYmhRoP7mBy6gSPSCYk6SzXPTf3ND1cZAceL7SfJ1Z3GC8vBgp2epUt13' + 'xpub661MyMwAqRbcEZVB4dScxMAdx6d4nFc9nvyvH3v4gJL378CSRZiYmhRoP7mBy6gSPSCYk6SzXPTf3ND1cZAceL7SfJ1Z3GC8vBgp2epUt13', ); test( @@ -754,7 +755,7 @@ test( '4b381541583be4423346c643850da4b320e46a87ae3d2a4e6da11eba819cd4acba45d239319ac14f863b8d5ab5a0d0c64d2e8a1e7d1457df2e5a3c51c73235be', "m/0'", 'xprv9uPDJpEQgRQfDcW7BkF7eTya6RPxXeJCqCJGHuCJ4GiRVLzkTXBAJMu2qaMWPrS7AANYqdq6vcBcBUdJCVVFceUvJFjaPdGZ2y9WACViL4L', - 'xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y' + 'xpub68NZiKmJWnxxS6aaHmn81bvJeTESw724CRDs6HbuccFQN9Ku14VQrADWgqbhhTHBaohPX4CjNLf9fq9MYo6oDaPPLPxSb7gwQN3ih19Zm4Y', ); const fcBip32Path = () => @@ -767,9 +768,9 @@ const fcBip32Path = () => (array) => `m/${array .map((i) => - i > hardenedIndexOffset ? `${i - hardenedIndexOffset}'` : `${i}` + i > hardenedIndexOffset ? `${i - hardenedIndexOffset}'` : `${i}`, ) - .join('/')}` + .join('/')}`, ); testProp( @@ -797,7 +798,7 @@ testProp( t.deepEqual(resultPrv, bitcorePrv); t.deepEqual(resultPub, bitcorePub); }, - { numRuns: 10 } + { numRuns: 10 }, ); testProp( @@ -820,8 +821,8 @@ testProp( childIndex: number, parentFingerprint: Uint8Array, chainCode: Uint8Array, - publicKey: Uint8Array - // eslint-disable-next-line max-params + publicKey: Uint8Array, + // eslint-disable-next-line @typescript-eslint/max-params ) => { const encoded = encodeHdPublicKey({ network: mainnet ? 'mainnet' : 'testnet', @@ -836,10 +837,10 @@ testProp( t.deepEqual( encoded, encodeHdPublicKey( - decodeHdPublicKey(encoded) as HdKeyParameters - ) + decodeHdPublicKey(encoded) as HdKeyParameters, + ), ); - } + }, ); testProp( @@ -863,8 +864,8 @@ testProp( childIndex: number, parentFingerprint: Uint8Array, chainCode: Uint8Array, - privateKey: Uint8Array - // eslint-disable-next-line max-params + privateKey: Uint8Array, + // eslint-disable-next-line @typescript-eslint/max-params ) => { if (!validateSecp256k1PrivateKey(privateKey)) { t.pass(); @@ -884,10 +885,10 @@ testProp( t.deepEqual( encoded, encodeHdPrivateKey( - decodeHdPrivateKey(encoded) as HdKeyParameters - ) + decodeHdPrivateKey(encoded) as HdKeyParameters, + ), ); - } + }, ); testProp( @@ -908,8 +909,8 @@ testProp( childIndexes: number, parentFingerprint: Uint8Array, chainCode: Uint8Array, - privateKey: Uint8Array - // eslint-disable-next-line max-params + privateKey: Uint8Array, + // eslint-disable-next-line @typescript-eslint/max-params ) => { if (!validateSecp256k1PrivateKey(privateKey)) { t.pass(); @@ -928,19 +929,19 @@ testProp( }); const { node: parentPrivateNode } = decodeHdPrivateKey( - parentXprv + parentXprv, ) as HdKeyParameters; const parentPublicNode = deriveHdPublicNode(parentPrivateNode); const nonHardenedChildNode = deriveHdPrivateNodeChild( parentPrivateNode, - childIndexes + childIndexes, ) as HdPrivateNodeValid; const crackedParentNode = crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode( parentPublicNode, - nonHardenedChildNode + nonHardenedChildNode, ) as HdPrivateNodeValid; const crackedXprv = encodeHdPrivateKey({ network: 'mainnet', @@ -948,5 +949,5 @@ testProp( }); t.deepEqual(parentXprv, crackedXprv); - } + }, ); diff --git a/src/lib/key/hd-key.ts b/src/lib/key/hd-key.ts index 414cb083..f0bb5406 100644 --- a/src/lib/key/hd-key.ts +++ b/src/lib/key/hd-key.ts @@ -14,10 +14,56 @@ import { binToBigIntUint256BE, flattenBinArray, numberToBinUint32BE, + utf8ToBin, } from '../format/format.js'; import type { Ripemd160, Secp256k1, Sha256, Sha512 } from '../lib.js'; -import { validateSecp256k1PrivateKey } from './key-utils.js'; +const enum Secp256k1Constants { + privateKeyLength = 32, +} + +/** + * Verify that a private key is valid for the Secp256k1 curve. Returns `true` + * for success, or `false` on failure. + * + * Private keys are 256-bit numbers encoded as a 32-byte, big-endian Uint8Array. + * Nearly every 256-bit number is a valid secp256k1 private key. Specifically, + * any 256-bit number greater than `0x01` and less than + * `0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140` + * is a valid private key. This range is part of the definition of the + * secp256k1 elliptic curve parameters. + * + * This method does not require a `Secp256k1` implementation. + */ +export const validateSecp256k1PrivateKey = (privateKey: Uint8Array) => { + if ( + privateKey.length !== Secp256k1Constants.privateKeyLength || + privateKey.every((value) => value === 0) + ) { + return false; + } + + /** + * The largest possible Secp256k1 private key – equal to the order of the + * Secp256k1 curve minus one. + */ + // prettier-ignore + const maximumSecp256k1PrivateKey = [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 186, 174, 220, 230, 175, 72, 160, 59, 191, 210, 94, 140, 208, 54, 65, 63]; // eslint-disable-line @typescript-eslint/no-magic-numbers + + const firstDifference = privateKey.findIndex( + (value, i) => value !== maximumSecp256k1PrivateKey[i], + ); + + if ( + firstDifference === -1 || + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + privateKey[firstDifference]! < maximumSecp256k1PrivateKey[firstDifference]! + ) { + return true; + } + + return false; +}; /** * The networks that can be referenced by an HD public or private key. @@ -27,14 +73,14 @@ export type HdKeyNetwork = 'mainnet' | 'testnet'; /** * The decoded contents of an HD public or private key. */ -export interface HdKeyParameters< - NodeType extends HdPrivateNodeValid | HdPublicNode -> { +export type HdKeyParameters< + NodeType extends HdPrivateNodeValid | HdPublicNode, +> = { node: NodeType; network: HdKeyNetwork; -} +}; -interface HdNodeBase { +type HdNodeBase = { /** * 32 bytes of additional entropy that can be used to derive HD child nodes. */ @@ -71,20 +117,20 @@ interface HdNodeBase { * might be unknown. */ parentIdentifier?: Uint8Array; -} +}; /** * A valid private node in a Hierarchical Deterministic (HD) key tree. This node * can be used to derive further nodes, or the private key can be used to * generate a wallet address. */ -export interface HdPrivateNodeValid extends HdNodeBase { +export type HdPrivateNodeValid = HdNodeBase & { /** * This {@link HdPrivateNode}'s 32-byte valid Secp256k1 private key. */ privateKey: Uint8Array; valid: true; -} +}; /** * An invalid private node in a Hierarchical Deterministic (HD) key tree. This @@ -97,7 +143,7 @@ export interface HdPrivateNodeValid extends HdNodeBase { * using the next child index. I.e. the node ultimately derived at the invalid * child index is a duplicate of the node derived at `index + 1`. */ -export interface HdPrivateNodeInvalid extends HdNodeBase { +export type HdPrivateNodeInvalid = HdNodeBase & { /** * The 32-byte derivation result that is not a valid Secp256k1 private key. * This is almost impossibly rare in a securely-random 32-byte Uint8Array, @@ -107,15 +153,15 @@ export interface HdPrivateNodeInvalid extends HdNodeBase { */ invalidPrivateKey: Uint8Array; valid: false; -} +}; /** * A valid HD private node for which the parent node is known (and * `parentIdentifier` is guaranteed to be defined). */ -export interface HdPrivateNodeKnownParent extends HdPrivateNodeValid { +export type HdPrivateNodeKnownParent = HdPrivateNodeValid & { parentIdentifier: Uint8Array; -} +}; /** * A private node in a Hierarchical Deterministic (HD) key tree. To confirm the @@ -132,29 +178,26 @@ export type HdPrivateNode = HdPrivateNodeInvalid | HdPrivateNodeValid; * Note, HD nodes are network-independent. A network is required only when * encoding the node as an HD key or using a derived public key in an address. */ -export interface HdPublicNode extends HdNodeBase { +export type HdPublicNode = HdNodeBase & { /** * This {@link HdPublicNode}'s valid 33-byte Secp256k1 compressed public key. */ publicKey: Uint8Array; -} +}; /** * An HD public node for which the parent node is known (and `parentIdentifier` * is guaranteed to be defined). */ -export interface HdPublicNodeKnownParent extends HdPublicNode { +export type HdPublicNodeKnownParent = HdPublicNode & { parentIdentifier: Uint8Array; -} +}; /** * The HMAC SHA-512 key used by BIP32, "Bitcoin seed" * (`utf8ToBin('Bitcoin seed')`) */ -const bip32HmacSha512Key = Uint8Array.from([ - // eslint-disable-next-line @typescript-eslint/no-magic-numbers - 66, 105, 116, 99, 111, 105, 110, 32, 115, 101, 101, 100, -]); +const bip32HmacSha512Key = utf8ToBin('Bitcoin seed'); const halfHmacSha512Length = 32; /** * Derive an {@link HdPrivateNode} from the provided seed following the BIP32 @@ -166,16 +209,21 @@ const halfHmacSha512Length = 32; * for validity, and will be assumed valid if `true` or invalid if `false` (this * is useful for testing) * @param crypto - an optional object containing an implementation of sha512 - * to use + * @param hmacSha512Key - the HMAC SHA-512 key to use (defaults the HMAC SHA-512 + * key used by BIP32, `utf8ToBin('Bitcoin seed')` */ export const deriveHdPrivateNodeFromSeed = < - AssumedValidity extends boolean | undefined + AssumedValidity extends boolean | undefined, >( seed: Uint8Array, assumeValidity?: AssumedValidity, - crypto: { sha512: { hash: Sha512['hash'] } } = { sha512: internalSha512 } + crypto: { sha512: { hash: Sha512['hash'] } } = { + sha512: internalSha512, + }, + hmacSha512Key = bip32HmacSha512Key, + // eslint-disable-next-line @typescript-eslint/max-params ) => { - const mac = hmacSha512(bip32HmacSha512Key, seed, crypto.sha512); + const mac = hmacSha512(hmacSha512Key, seed, crypto.sha512); const privateKey = mac.slice(0, halfHmacSha512Length); const chainCode = mac.slice(halfHmacSha512Length); const depth = 0; @@ -196,8 +244,8 @@ export const deriveHdPrivateNodeFromSeed = < ) as AssumedValidity extends true ? HdPrivateNodeValid : AssumedValidity extends false - ? HdPrivateNodeInvalid - : HdPrivateNode; + ? HdPrivateNodeInvalid + : HdPrivateNode; }; /** @@ -222,10 +270,10 @@ export const deriveHdPrivateNodeIdentifier = ( ripemd160: internalRipemd160, secp256k1: internalSecp256k1, sha256: internalSha256, - } + }, ) => { const publicKey = crypto.secp256k1.derivePublicKeyCompressed( - hdPrivateNode.privateKey + hdPrivateNode.privateKey, ); if (typeof publicKey === 'string') return publicKey; return crypto.ripemd160.hash(crypto.sha256.hash(publicKey)); @@ -245,7 +293,7 @@ export const deriveHdPublicNodeIdentifier = ( crypto: { ripemd160: { hash: Ripemd160['hash'] }; sha256: { hash: Sha256['hash'] }; - } = { ripemd160: internalRipemd160, sha256: internalSha256 } + } = { ripemd160: internalRipemd160, sha256: internalSha256 }, ) => crypto.ripemd160.hash(crypto.sha256.hash(node.publicKey)); /** @@ -315,7 +363,7 @@ export enum HdKeyDecodingError { // eslint-disable-next-line complexity export const decodeHdKey = ( hdKey: string, - crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 }, ) => { const decoded = base58ToBin(hdKey); if (decoded === BaseConversionError.unknownCharacter) @@ -342,14 +390,14 @@ export const decodeHdKey = ( const version = new DataView( decoded.buffer, decoded.byteOffset, - depthIndex + depthIndex, ).getUint32(0); const depth = decoded[depthIndex]; const parentFingerprint = decoded.slice(fingerprintIndex, childIndexIndex); const childIndex = new DataView( decoded.buffer, decoded.byteOffset + childIndexIndex, - decoded.byteOffset + chainCodeIndex + decoded.byteOffset + chainCodeIndex, ).getUint32(0); const chainCode = decoded.slice(chainCodeIndex, keyDataIndex); const keyData = decoded.slice(keyDataIndex, checksumIndex); @@ -419,7 +467,7 @@ export const decodeHdKey = ( */ export const decodeHdPrivateKey = ( hdPrivateKey: string, - crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 }, ) => { const decoded = decodeHdKey(hdPrivateKey, crypto); if (typeof decoded === 'string') return decoded; @@ -457,7 +505,7 @@ export const decodeHdPrivateKey = ( */ export const decodeHdPublicKey = ( hdPublicKey: string, - crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 }, ) => { const decoded = decodeHdKey(hdPublicKey, crypto); if (typeof decoded === 'string') return decoded; @@ -483,7 +531,7 @@ export const decodeHdPublicKey = ( */ export const hdPrivateKeyToIdentifier = ( hdPrivateKey: string, - crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 }, ) => { const privateKeyParams = decodeHdPrivateKey(hdPrivateKey, crypto); if (typeof privateKeyParams === 'string') { @@ -498,7 +546,7 @@ export const hdPrivateKeyToIdentifier = ( */ export const hdPublicKeyToIdentifier = ( hdPublicKey: string, - crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 }, ) => { const publicKeyParams = decodeHdPublicKey(hdPublicKey, crypto); if (typeof publicKeyParams === 'string') { @@ -508,22 +556,21 @@ export const hdPublicKeyToIdentifier = ( }; /** - * Encode an HD private key (as defined by BIP32) given a valid - * {@link HdPrivateNode} and network. + * Encode an HD private key (as defined by BIP32) payload (without the checksum) + * given a valid {@link HdPrivateNode} and network. * * @param keyParameters - a valid HD private node and the network for which to * encode the key * @param crypto - an optional object containing an implementation of sha256 * to use */ -export const encodeHdPrivateKey = ( +export const encodeHdPrivateKeyPayload = ( keyParameters: HdKeyParameters, - crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } ) => { const version = numberToBinUint32BE( keyParameters.network === 'mainnet' ? HdKeyVersion.mainnetPrivateKey - : HdKeyVersion.testnetPrivateKey + : HdKeyVersion.testnetPrivateKey, ); const depth = Uint8Array.of(keyParameters.node.depth); const childIndex = numberToBinUint32BE(keyParameters.node.childIndex); @@ -537,6 +584,23 @@ export const encodeHdPrivateKey = ( isPrivateKey, keyParameters.node.privateKey, ]); + return payload; +}; + +/** + * Encode an HD private key (as defined by BIP32) given a valid + * {@link HdPrivateNode} and network. + * + * @param keyParameters - a valid HD private node and the network for which to + * encode the key + * @param crypto - an optional object containing an implementation of sha256 + * to use + */ +export const encodeHdPrivateKey = ( + keyParameters: HdKeyParameters, + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 }, +) => { + const payload = encodeHdPrivateKeyPayload(keyParameters); const checksumLength = 4; const checksum = crypto.sha256 .hash(crypto.sha256.hash(payload)) @@ -554,12 +618,12 @@ export const encodeHdPrivateKey = ( */ export const encodeHdPublicKey = ( keyParameters: HdKeyParameters, - crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 } + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 }, ) => { const version = numberToBinUint32BE( keyParameters.network === 'mainnet' ? HdKeyVersion.mainnetPublicKey - : HdKeyVersion.testnetPublicKey + : HdKeyVersion.testnetPublicKey, ); const depth = Uint8Array.of(keyParameters.node.depth); const childIndex = numberToBinUint32BE(keyParameters.node.childIndex); @@ -593,14 +657,14 @@ export const encodeHdPublicKey = ( * compressed public key derivation to use */ export const deriveHdPublicNode = < - PrivateNode extends HdPrivateNodeValid = HdPrivateNodeValid + PrivateNode extends HdPrivateNodeValid = HdPrivateNodeValid, >( node: PrivateNode, crypto: { secp256k1: { derivePublicKeyCompressed: Secp256k1['derivePublicKeyCompressed']; }; - } = { secp256k1: internalSecp256k1 } + } = { secp256k1: internalSecp256k1 }, ) => ({ chainCode: node.chainCode, @@ -611,9 +675,9 @@ export const deriveHdPublicNode = < ? {} : { parentIdentifier: node.parentIdentifier }), publicKey: crypto.secp256k1.derivePublicKeyCompressed(node.privateKey), - } as PrivateNode extends HdPrivateNodeKnownParent + }) as PrivateNode extends HdPrivateNodeKnownParent ? HdPublicNodeKnownParent - : HdPublicNode); + : HdPublicNode; /** * An error in the derivation of child HD public or private nodes. @@ -666,7 +730,7 @@ export const deriveHdPrivateNodeChild = ( secp256k1: internalSecp256k1, sha256: internalSha256, sha512: internalSha512, - } + }, ): | HdNodeDerivationError.childIndexExceedsMaximum | HdNodeDerivationError.nextChildIndexRequiresHardenedAlgorithm @@ -682,7 +746,7 @@ export const deriveHdPrivateNodeChild = ( const keyMaterial = useHardenedAlgorithm ? node.privateKey : (crypto.secp256k1.derivePublicKeyCompressed( - node.privateKey + node.privateKey, ) as Uint8Array); const serialization = Uint8Array.from([ @@ -698,7 +762,7 @@ export const deriveHdPrivateNodeChild = ( const nextPrivateKey = crypto.secp256k1.addTweakPrivateKey( node.privateKey, - tweakValue + tweakValue, ); if (typeof nextPrivateKey === 'string') { if (index === hardenedIndexOffset - 1) { @@ -761,7 +825,7 @@ export const deriveHdPublicNodeChild = ( secp256k1: internalSecp256k1, sha256: internalSha256, sha512: internalSha512, - } + }, ): | HdNodeDerivationError.hardenedDerivationRequiresPrivateNode | HdNodeDerivationError.nextChildIndexRequiresHardenedAlgorithm @@ -783,7 +847,7 @@ export const deriveHdPublicNodeChild = ( const nextPublicKey = crypto.secp256k1.addTweakPublicKeyCompressed( node.publicKey, - tweakValue + tweakValue, ); if (typeof nextPublicKey === 'string') { if (index === hardenedIndexOffset - 1) { @@ -867,7 +931,7 @@ type ReductionResults = NodeType extends HdPrivateNodeValid */ // eslint-disable-next-line complexity export const deriveHdPath = < - NodeType extends HdPrivateNodeValid | HdPublicNode + NodeType extends HdPrivateNodeValid | HdPublicNode, >( node: NodeType, path: string, @@ -885,7 +949,7 @@ export const deriveHdPath = < secp256k1: internalSecp256k1, sha256: internalSha256, sha512: internalSha512, - } + }, ): | HdNodeDerivationError.invalidDerivationPath | HdNodeDerivationError.invalidPrivateDerivationPrefix @@ -915,7 +979,7 @@ export const deriveHdPath = < .map((index) => index.endsWith("'") ? parseInt(index.slice(0, -1), base) + hardenedIndexOffset - : parseInt(index, base) + : parseInt(index, base), ); return ( @@ -925,14 +989,14 @@ export const deriveHdPath = < typeof result === 'string' ? result : deriveHdPrivateNodeChild(result, nextIndex, crypto), - node as PrivateResults // eslint-disable-line @typescript-eslint/prefer-reduce-type-parameter + node as PrivateResults, // eslint-disable-line @typescript-eslint/prefer-reduce-type-parameter ) : indexes.reduce( (result, nextIndex) => typeof result === 'string' ? result : deriveHdPublicNodeChild(result, nextIndex, crypto), - node as PublicResults // eslint-disable-line @typescript-eslint/prefer-reduce-type-parameter + node as PublicResults, // eslint-disable-line @typescript-eslint/prefer-reduce-type-parameter ) ) as ReductionResults; }; @@ -968,11 +1032,11 @@ export enum HdNodeCrackingError { * * @param crypto - an optional object containing an implementation of sha512 */ export const crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode = < - PublicNode extends HdPublicNode = HdPublicNode + PublicNode extends HdPublicNode = HdPublicNode, >( parentPublicNode: PublicNode, childPrivateNode: { childIndex: number; privateKey: Uint8Array }, - crypto: { sha512: { hash: Sha512['hash'] } } = { sha512: internalSha512 } + crypto: { sha512: { hash: Sha512['hash'] } } = { sha512: internalSha512 }, ) => { const hardenedIndexOffset = 0x80000000; if (childPrivateNode.childIndex >= hardenedIndexOffset) { @@ -986,11 +1050,11 @@ export const crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode = < const derivation = hmacSha512( parentPublicNode.chainCode, serialization, - crypto.sha512 + crypto.sha512, ); const tweakValueLength = 32; const tweakValue = binToBigIntUint256BE( - derivation.slice(0, tweakValueLength) + derivation.slice(0, tweakValueLength), ); const childPrivateValue = binToBigIntUint256BE(childPrivateNode.privateKey); const secp256k1OrderN = @@ -999,7 +1063,7 @@ export const crackHdPrivateNodeFromHdPublicNodeAndChildPrivateNode = < const parentPrivateValue = trueMod( childPrivateValue - tweakValue, - secp256k1OrderN + secp256k1OrderN, ); const privateKey = bigIntToBinUint256BEClamped(parentPrivateValue); diff --git a/src/lib/key/key-utils.spec.ts b/src/lib/key/key-utils.spec.ts index 18646cf6..0cb3ada6 100644 --- a/src/lib/key/key-utils.spec.ts +++ b/src/lib/key/key-utils.spec.ts @@ -1,6 +1,5 @@ import { randomBytes } from 'crypto'; -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import { @@ -10,6 +9,8 @@ import { validateSecp256k1PrivateKey, } from '../lib.js'; +import { fc, testProp } from '@fast-check/ava'; + const privateKeyLength = 32; const maximumUint8Value = 255; @@ -21,44 +22,44 @@ test('validateSecp256k1PrivateKey', (t) => { t.false( validateSecp256k1PrivateKey( hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' - ) - ) + '0000000000000000000000000000000000000000000000000000000000000000', + ), + ), ); t.true( validateSecp256k1PrivateKey( hexToBin( - '0000000000000000000000000000000000000000000000000000000000000001' - ) - ) + '0000000000000000000000000000000000000000000000000000000000000001', + ), + ), ); t.true( validateSecp256k1PrivateKey( hexToBin( - '00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff' - ) - ) + '00ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', + ), + ), ); t.true( validateSecp256k1PrivateKey( hexToBin( - 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413f' - ) - ) + 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd036413f', + ), + ), ); t.false( validateSecp256k1PrivateKey( hexToBin( - 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140' - ) - ) + 'fffffffffffffffffffffffffffffffebaaedce6af48a03bbfd25e8cd0364140', + ), + ), ); }); const secp256k1OrderNFFBytes = 15; const almostInvalid = Array(secp256k1OrderNFFBytes).fill( - maximumUint8Value + maximumUint8Value, ) as number[]; const theRest = privateKeyLength - almostInvalid.length; @@ -75,9 +76,9 @@ testProp( (t, input) => { t.deepEqual( validateSecp256k1PrivateKey(input), - secp256k1.validatePrivateKey(input) + secp256k1.validatePrivateKey(input), ); - } + }, ); test('generatePrivateKey: works', (t) => { diff --git a/src/lib/key/key-utils.ts b/src/lib/key/key-utils.ts index 5ef30a18..04056a41 100644 --- a/src/lib/key/key-utils.ts +++ b/src/lib/key/key-utils.ts @@ -1,78 +1,164 @@ -/** - * Verify that a private key is valid for the Secp256k1 curve. Returns `true` - * for success, or `false` on failure. - * - * Private keys are 256-bit numbers encoded as a 32-byte, big-endian Uint8Array. - * Nearly every 256-bit number is a valid secp256k1 private key. Specifically, - * any 256-bit number greater than `0x01` and less than - * `0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140` - * is a valid private key. This range is part of the definition of the - * secp256k1 elliptic curve parameters. - * - * This method does not require a `Secp256k1` implementation. - */ -export const validateSecp256k1PrivateKey = (privateKey: Uint8Array) => { - const privateKeyLength = 32; - if ( - privateKey.length !== privateKeyLength || - privateKey.every((value) => value === 0) - ) { - return false; - } +import { sha256 as internalSha256 } from '../crypto/crypto.js'; +import type { Sha256 } from '../lib.js'; - /** - * The largest possible Secp256k1 private key – equal to the order of the - * Secp256k1 curve minus one. - */ - // prettier-ignore - const maximumSecp256k1PrivateKey = [255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 254, 186, 174, 220, 230, 175, 72, 160, 59, 191, 210, 94, 140, 208, 54, 65, 63]; // eslint-disable-line @typescript-eslint/no-magic-numbers +import type { HdPrivateNode } from './hd-key.js'; +import { + deriveHdPrivateNodeFromSeed, + validateSecp256k1PrivateKey, +} from './hd-key.js'; - const firstDifference = privateKey.findIndex( - (value, i) => value !== maximumSecp256k1PrivateKey[i] - ); +const enum KeyUtilConstants { + privateKeyLength = 32, + privateKeyRequiredEntropyBits = 128, + utf8NumbersOffset = 48, +} - if ( - firstDifference === -1 || - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - privateKey[firstDifference]! < maximumSecp256k1PrivateKey[firstDifference]! - ) { - return true; - } - - return false; -}; +/** + * Generate a Uint8Array of the specified length containing a + * cryptographically-random series of bytes. + * @param length - the length of the Uint8Array to generate + */ +export const generateRandomBytes = (length: number) => + crypto.getRandomValues(new Uint8Array(length)); /** - * Securely generate a valid Secp256k1 private key given a secure source of - * randomness. - * - * **Node.js Usage** - * ```ts - * import { randomBytes } from 'crypto'; - * import { generatePrivateKey } from '@bitauth/libauth'; + * Securely generate a 32-byte, cryptographically random seed (Uint8Array) for + * use in HD Key derivation (see {@link deriveHdPrivateNodeFromSeed}). * - * const key = generatePrivateKey(() => randomBytes(32)); - * ``` + * To generate a single Secp256k1 private key, use {@link generatePrivateKey}. + */ +export const generateRandomSeed = () => + generateRandomBytes(KeyUtilConstants.privateKeyLength); + +/** + * Securely generate a valid Secp256k1 private key. * - * **Browser Usage** - * ```ts - * import { generatePrivateKey } from '@bitauth/libauth'; + * By default, this function uses `crypto.getRandomValues` to produce + * sufficiently-random key material, but another source of randomness may also + * be provided. * - * const key = generatePrivateKey(() => - * window.crypto.getRandomValues(new Uint8Array(32)) - * ); - * ``` + * To generate an HD Key, use {@link generateHdPrivateKey}. * * @param secureRandom - a method that returns a securely-random 32-byte * Uint8Array */ -export const generatePrivateKey = (secureRandom: () => Uint8Array) => { +export const generatePrivateKey = (secureRandom = generateRandomSeed) => { // eslint-disable-next-line functional/no-let, @typescript-eslint/init-declarations let maybeKey: Uint8Array; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements do { - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements maybeKey = secureRandom(); } while (!validateSecp256k1PrivateKey(maybeKey)); return maybeKey; }; + +/** + * Securely generate a valid {@link HdPrivateNode}, returning both the source + * seed and the {@link HdPrivateNodeValid}. + * + * By default, this function uses `crypto.getRandomValues` to produce + * sufficiently-random key material, but another source of randomness may also + * be provided. + * + * To generate a single Secp256k1 private key, use {@link generatePrivateKey}. + */ +export const generateHdPrivateNode = (secureRandom = generateRandomSeed) => { + // eslint-disable-next-line functional/no-let, @typescript-eslint/init-declarations + let seed: Uint8Array; + // eslint-disable-next-line functional/no-let, @typescript-eslint/init-declarations + let hdPrivateNode: HdPrivateNode; + // eslint-disable-next-line functional/no-loop-statements + do { + // eslint-disable-next-line functional/no-expression-statements + seed = secureRandom(); + // eslint-disable-next-line functional/no-expression-statements + hdPrivateNode = deriveHdPrivateNodeFromSeed(seed); + } while (!hdPrivateNode.valid); + return { + hdPrivateNode, + seed, + }; +}; + +/* + * TODO: export const generateLibauthSecretKey = (secureRandom = generateRandomSeed) => { + * const { seed } = generateHdPrivateNode(secureRandom); + * return encodeLibauthSecretKey({ seed }); + * }; + */ + +/** + * Given the number of equally-likely results per event, return the Shannon + * entropy of the event in bits. + * + * @param possibleResults - the number of equally-likely results per event; + * e.g. for a coin, `2`, for dice, the number of faces (for a standard die, `6`) + */ +export const shannonEntropyPerEvent = (possibleResults: number) => + Math.log2(possibleResults); + +/** + * Given the number of equally-likely results per event, return the number of + * events required to achieve the required bits of Shannon entropy. + * entropy of the event in bits. + * + * For example, to compute the number of standard, 6-sided dice rolls required + * to generate a private key (with the recommended 128-bit entropy minimum), + * `minimumEventsPerEntropyBits(6)`. + * + * @param possibleResults - the number of equally-likely results per event; + * e.g. for a coin, `2`, for dice, the number of faces (for a standard die, `6`) + * @param requiredEntropyBits - the number of bits of entropy required. Defaults + * to `128`, the recommended value for all private key generation. + */ +export const minimumEventsPerEntropyBits = ( + possibleResults: number, + requiredEntropyBits = KeyUtilConstants.privateKeyRequiredEntropyBits, +) => Math.ceil(requiredEntropyBits / shannonEntropyPerEvent(possibleResults)); + +/** + * An error in the decoding of an HD public or private key. + */ +export enum DeterministicEntropyGenerationError { + insufficientEntropy = 'Deterministic entropy generation error: the provided list of events contains insufficient entropy.', +} + +/** + * Generate deterministic entropy by seeding SHA-256 with a list of random + * events like coin flips or dice rolls. For ease of verification, events are + * simply encoded as a string of utf8 numbers prior to SHA-256 hashing. For coin + * flips, use `0` ("heads") and `1` ("tails"); for dice, use the exposed number. + * + * @param possibleResults - the number of equally-likely results per event; + * e.g. for a coin, `2`, for dice, the number of faces (for a standard die, `6`) + * @param events - an array of numbers encoding the random events; for coin + * flips, use `0` ("heads") and `1` ("tails"); for dice, use the exposed number + * (e.g. `1` through `6`) + * @param requiredEntropyBits - the number of bits of entropy required. Defaults + * to `128`, the recommended value for all private key generation. + * @param crypto - an optional object containing an implementation of sha256 + * to use + */ +export const generateDeterministicEntropy = ( + possibleResults: number, + events: number[], + requiredEntropyBits = KeyUtilConstants.privateKeyRequiredEntropyBits, + crypto: { sha256: { hash: Sha256['hash'] } } = { sha256: internalSha256 }, + // eslint-disable-next-line @typescript-eslint/max-params +) => { + if ( + events.length < + minimumEventsPerEntropyBits(possibleResults, requiredEntropyBits) + ) { + return DeterministicEntropyGenerationError.insufficientEntropy; + } + const source = Uint8Array.from( + events.map((v) => v + KeyUtilConstants.utf8NumbersOffset), + ); + return crypto.sha256.hash(source); +}; + +// TODO: export const generateLibauthSecretKeyFromCoinFlips = () => {} + +// TODO: export const generateLibauthSecretKeyFromDiceRolls = () => {} diff --git a/src/lib/key/wallet-import-format.spec.ts b/src/lib/key/wallet-import-format.spec.ts index 3566209e..e17e4413 100644 --- a/src/lib/key/wallet-import-format.spec.ts +++ b/src/lib/key/wallet-import-format.spec.ts @@ -12,12 +12,12 @@ import { test('decodePrivateKeyWif: pass through errors', (t) => { t.deepEqual( decodePrivateKeyWif('not a key'), - Base58AddressError.unknownCharacter + Base58AddressError.unknownCharacter, ); }); const wifVectors = test.macro<[WalletImportFormatType, string, string]>({ - // eslint-disable-next-line max-params + // eslint-disable-next-line @typescript-eslint/max-params exec: (t, type, wif, key) => { t.deepEqual(encodePrivateKeyWif(hexToBin(key), type), wif); t.deepEqual(decodePrivateKeyWif(wif), { @@ -34,7 +34,7 @@ const wifVectors = test.macro<[WalletImportFormatType, string, string]>({ `encodePrivateKeyWif <-> decodePrivateKeyWif ${type} - ${base58.slice( 0, - 6 + 6, )}...`, }); @@ -42,33 +42,33 @@ test( wifVectors, 'mainnet', 'L1RrrnXkcKut5DEMwtDthjwRcTTwED36thyL1DebVrKuwvohjMNi', - '7d998b45c219a1e38e99e7cbd312ef67f77a455a9b50c730c27f02c6f730dfb4' + '7d998b45c219a1e38e99e7cbd312ef67f77a455a9b50c730c27f02c6f730dfb4', ); test( wifVectors, 'mainnet', 'KwV9KAfwbwt51veZWNscRTeZs9CKpojyu1MsPnaKTF5kz69H1UN2', - '07f0803fc5399e773555ab1e8939907e9badacc17ca129e67a2f5f2ff84351dd' + '07f0803fc5399e773555ab1e8939907e9badacc17ca129e67a2f5f2ff84351dd', ); test( wifVectors, 'testnet', 'cTpB4YiyKiBcPxnefsDpbnDxFDffjqJob8wGCEDXxgQ7zQoMXJdH', - 'b9f4892c9e8282028fea1d2667c4dc5213564d41fc5783896a0d843fc15089f3' + 'b9f4892c9e8282028fea1d2667c4dc5213564d41fc5783896a0d843fc15089f3', ); test( wifVectors, 'mainnetUncompressed', '5Kd3NBUAdUnhyzenEwVLy9pBKxSwXvE9FMPyR4UKZvpe6E3AgLr', - 'eddbdc1168f1daeadbd3e44c1e3f8f5a284c2029f78ad26af98583a499de5b19' + 'eddbdc1168f1daeadbd3e44c1e3f8f5a284c2029f78ad26af98583a499de5b19', ); test( wifVectors, 'testnetUncompressed', '9213qJab2HNEpMpYNBa7wHGFKKbkDn24jpANDs2huN3yi4J11ko', - '36cb93b9ab1bdabf7fb9f2c04f1b9cc879933530ae7842398eef5a63a56800c2' + '36cb93b9ab1bdabf7fb9f2c04f1b9cc879933530ae7842398eef5a63a56800c2', ); diff --git a/src/lib/key/wallet-import-format.ts b/src/lib/key/wallet-import-format.ts index 8a08a0c1..d715c5e3 100644 --- a/src/lib/key/wallet-import-format.ts +++ b/src/lib/key/wallet-import-format.ts @@ -56,7 +56,7 @@ export type WalletImportFormatType = export const encodePrivateKeyWif = ( privateKey: Uint8Array, type: WalletImportFormatType, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => { const compressedByte = 0x01; const mainnet = type === 'mainnet' || type === 'mainnetUncompressed'; @@ -69,7 +69,7 @@ export const encodePrivateKeyWif = ( ? Base58AddressFormatVersion.wif : Base58AddressFormatVersion.wifTestnet, payload, - sha256 + sha256, ); }; @@ -83,7 +83,7 @@ export const encodePrivateKeyWif = ( // eslint-disable-next-line complexity export const decodePrivateKeyWif = ( wifKey: string, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => { const compressedPayloadLength = 33; const decoded = decodeBase58AddressFormat(wifKey, sha256); @@ -99,8 +99,8 @@ export const decodePrivateKeyWif = ( ? 'mainnet' : 'mainnetUncompressed' : compressed - ? 'testnet' - : 'testnetUncompressed'; + ? 'testnet' + : 'testnetUncompressed'; return { privateKey, type }; }; diff --git a/src/lib/language/compile.spec.ts b/src/lib/language/compile.spec.ts index ee8f40cd..01f8776f 100644 --- a/src/lib/language/compile.spec.ts +++ b/src/lib/language/compile.spec.ts @@ -63,7 +63,7 @@ test('compileScript: clean errors on unexpected input', (t) => { }, ], success: false, - } + }, ); t.deepEqual(compileScript('t', {}, { scripts: { t: '"incomplete' } }), { errorType: 'parse', @@ -192,7 +192,7 @@ test('compileScriptContents: empty string', (t) => { }, ], success: true, - } + }, ); }); @@ -252,14 +252,14 @@ test('compileScriptContents: empty script (script with space)', (t) => { test('describeExpectedInput: handles EOF', (t) => { t.deepEqual( describeExpectedInput(['one thing', 'EOF']), - 'Encountered unexpected input while parsing script. Expected one thing or the end of the script.' + 'Encountered unexpected input while parsing script. Expected one thing or the end of the script.', ); }); test('describeExpectedInput: handles 2 options', (t) => { t.deepEqual( describeExpectedInput(['one thing', 'another thing']), - 'Encountered unexpected input while parsing script. Expected one thing or another thing.' + 'Encountered unexpected input while parsing script. Expected one thing or another thing.', ); }); @@ -353,7 +353,7 @@ test('compileScript: 0x51', (t) => { ], success: true, }, - stringifyTestVector(result) + stringifyTestVector(result), ); }); @@ -487,7 +487,7 @@ test('compileScript: <1>', (t) => { ], success: true, }, - stringifyTestVector(result) + stringifyTestVector(result), ); }); @@ -621,7 +621,7 @@ test('compileScript: <0xabcdef>', (t) => { ], success: true, }, - stringifyTestVector(result) + stringifyTestVector(result), ); }); @@ -755,7 +755,7 @@ test('compileScript: <"abc πŸ‘">', (t) => { ], success: true, }, - stringifyTestVector(result) + stringifyTestVector(result), ); }); @@ -831,7 +831,7 @@ test('compileScript: OP_1 OP_2 OP_ADD', (t) => { OP_ADD: Uint8Array.of(0x93), }, scripts: { t: 'OP_1 OP_2 OP_ADD' }, - } + }, ), { bytecode: Uint8Array.of(0x51, 0x52, 0x93), @@ -966,7 +966,7 @@ test('compileScript: OP_1 OP_2 OP_ADD', (t) => { }, ], success: true, - } + }, ); }); @@ -994,132 +994,212 @@ test('compileScript: variable and script inclusion', (t) => { type: 'AddressData', }, }, - } + }, ); - t.deepEqual(comp, { - bytecode: Uint8Array.of(0x51, 0x52, 0x93), - parse: { - end: { - column: 19, - line: 1, - offset: 18, - }, - name: 'Script', - start: { - column: 1, - line: 1, - offset: 0, - }, - value: [ - { - end: { - column: 12, - line: 1, - offset: 11, - }, - name: 'Identifier', - start: { - column: 1, - line: 1, - offset: 0, - }, - value: 'pushNumbers', + t.deepEqual( + comp, + { + bytecode: Uint8Array.of(0x51, 0x52, 0x93), + parse: { + end: { + column: 19, + line: 1, + offset: 18, }, - { - end: { - column: 19, - line: 1, - offset: 18, - }, - name: 'Identifier', - start: { - column: 13, - line: 1, - offset: 12, - }, - value: 'OP_ADD', + name: 'Script', + start: { + column: 1, + line: 1, + offset: 0, }, - ], - }, - reduce: { - bytecode: Uint8Array.of(0x51, 0x52, 0x93), - range: { - endColumn: 19, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, - }, - script: [ - { - bytecode: Uint8Array.of(0x51, 0x52), - range: { - endColumn: 12, - endLineNumber: 1, - startColumn: 1, - startLineNumber: 1, + value: [ + { + end: { + column: 12, + line: 1, + offset: 11, + }, + name: 'Identifier', + start: { + column: 1, + line: 1, + offset: 0, + }, + value: 'pushNumbers', }, - }, - { - bytecode: Uint8Array.of(0x93), - range: { - endColumn: 19, - endLineNumber: 1, - startColumn: 13, - startLineNumber: 1, + { + end: { + column: 19, + line: 1, + offset: 18, + }, + name: 'Identifier', + start: { + column: 13, + line: 1, + offset: 12, + }, + value: 'OP_ADD', }, - }, - ], - }, - resolve: [ - { + ], + }, + reduce: { + bytecode: Uint8Array.of(0x51, 0x52, 0x93), range: { - endColumn: 12, + endColumn: 19, endLineNumber: 1, startColumn: 1, startLineNumber: 1, }, - script: 'pushNumbers', - source: [ + script: [ { - opcode: 'OP_1', + bytecode: Uint8Array.of(0x51, 0x52), range: { - endColumn: 5, + endColumn: 12, endLineNumber: 1, startColumn: 1, startLineNumber: 1, }, - type: 'bytecode', - value: Uint8Array.of(0x51), }, { + bytecode: Uint8Array.of(0x93), range: { - endColumn: 12, + endColumn: 19, endLineNumber: 1, - startColumn: 6, + startColumn: 13, startLineNumber: 1, }, - type: 'bytecode', - value: Uint8Array.of(0x52), - variable: 'varOp2', }, ], - type: 'bytecode', - value: Uint8Array.of(0x51, 0x52), }, - { - opcode: 'OP_ADD', - range: { - endColumn: 19, - endLineNumber: 1, - startColumn: 13, - startLineNumber: 1, + resolve: [ + { + range: { + endColumn: 12, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + script: 'pushNumbers', + source: { + bytecode: hexToBin('5152'), + parse: { + end: { + column: 12, + line: 1, + offset: 11, + }, + name: 'Script', + start: { + column: 1, + line: 1, + offset: 0, + }, + value: [ + { + end: { + column: 5, + line: 1, + offset: 4, + }, + name: 'Identifier', + start: { + column: 1, + line: 1, + offset: 0, + }, + value: 'OP_1', + }, + { + end: { + column: 12, + line: 1, + offset: 11, + }, + name: 'Identifier', + start: { + column: 6, + line: 1, + offset: 5, + }, + value: 'varOp2', + }, + ], + }, + reduce: { + bytecode: hexToBin('5152'), + range: { + endColumn: 12, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + script: [ + { + bytecode: hexToBin('51'), + range: { + endColumn: 5, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + }, + { + bytecode: hexToBin('52'), + range: { + endColumn: 12, + endLineNumber: 1, + startColumn: 6, + startLineNumber: 1, + }, + }, + ], + }, + resolve: [ + { + opcode: 'OP_1', + range: { + endColumn: 5, + endLineNumber: 1, + startColumn: 1, + startLineNumber: 1, + }, + type: 'bytecode', + value: hexToBin('51'), + }, + { + range: { + endColumn: 12, + endLineNumber: 1, + startColumn: 6, + startLineNumber: 1, + }, + type: 'bytecode', + value: hexToBin('52'), + variable: 'varOp2', + }, + ], + success: true, + }, + type: 'bytecode', + value: Uint8Array.of(0x51, 0x52), }, - type: 'bytecode', - value: Uint8Array.of(0x93), - }, - ], - success: true, - }); + { + opcode: 'OP_ADD', + range: { + endColumn: 19, + endLineNumber: 1, + startColumn: 13, + startLineNumber: 1, + }, + type: 'bytecode', + value: Uint8Array.of(0x93), + }, + ], + success: true, + }, + stringifyTestVector(comp), + ); }); test('compileScript: comments', (t) => { @@ -1127,7 +1207,7 @@ test('compileScript: comments', (t) => { compileScript( 't', {}, - { scripts: { t: '// single-line\n /* multi-\nline */' } } + { scripts: { t: '// single-line\n /* multi-\nline */' } }, ), { bytecode: Uint8Array.of(), @@ -1226,6 +1306,6 @@ test('compileScript: comments', (t) => { }, ], success: true, - } + }, ); }); diff --git a/src/lib/language/compile.ts b/src/lib/language/compile.ts index 20a68b07..92568871 100644 --- a/src/lib/language/compile.ts +++ b/src/lib/language/compile.ts @@ -1,4 +1,5 @@ import type { + AnyCompilerConfiguration, AuthenticationProgramStateControlStack, AuthenticationProgramStateMinimum, AuthenticationProgramStateStack, @@ -7,7 +8,6 @@ import type { CompilationData, CompilationResult, CompilationResultSuccess, - CompilerConfiguration, } from '../lib.js'; import { compileScriptRaw, createEmptyRange } from './resolve.js'; @@ -26,11 +26,11 @@ export const compileScript = < AuthenticationProgramStateStack = AuthenticationProgramStateControlStack & AuthenticationProgramStateMinimum & AuthenticationProgramStateStack, - CompilationContext extends CompilationContextCommon = CompilationContextBCH + CompilationContext extends CompilationContextCommon = CompilationContextBCH, >( scriptId: string, data: CompilationData, - configuration: CompilerConfiguration + configuration: AnyCompilerConfiguration, ): CompilationResult => { const locktimeDisablingSequenceNumber = 0xffffffff; const lockTimeTypeBecomesTimestamp = 500000000; diff --git a/src/lib/language/language-types.ts b/src/lib/language/language-types.ts index 080d8473..bd4a6be4 100644 --- a/src/lib/language/language-types.ts +++ b/src/lib/language/language-types.ts @@ -4,23 +4,23 @@ import type { AuthenticationProgramStateStack, } from '../lib.js'; -export interface Range { +export type Range = { endColumn: number; endLineNumber: number; startColumn: number; startLineNumber: number; -} +}; -export interface SourcePosition { +export type SourcePosition = { column: number; line: number; offset: number; -} +}; -export interface MarkedNode { +export type MarkedNode = { end: SourcePosition; start: SourcePosition; -} +}; type StringSegmentType = | 'BigIntLiteral' @@ -32,80 +32,80 @@ type StringSegmentType = type RecursiveSegmentType = 'Evaluation' | 'Push'; -interface CashAssemblyLanguageSegment extends MarkedNode { +type CashAssemblyLanguageSegment = MarkedNode & { name: string; -} +}; -interface CashAssemblyStringSegment extends CashAssemblyLanguageSegment { +type CashAssemblyStringSegment = CashAssemblyLanguageSegment & { name: StringSegmentType; value: string; -} +}; -interface CashAssemblyRecursiveSegment extends CashAssemblyLanguageSegment { +type CashAssemblyRecursiveSegment = CashAssemblyLanguageSegment & { name: RecursiveSegmentType; value: CashAssemblyScriptSegment; -} +}; -export interface CashAssemblyScriptSegment extends CashAssemblyLanguageSegment { +export type CashAssemblyScriptSegment = CashAssemblyLanguageSegment & { name: 'Script'; value: (CashAssemblyRecursiveSegment | CashAssemblyStringSegment)[]; -} +}; export type ParseResult = | { expected: string[]; index: SourcePosition; status: false } | { status: true; value: CashAssemblyScriptSegment }; -interface ResolvedSegmentBase { +type ResolvedSegmentBase = { range: Range; type: string; -} +}; -export interface ResolvedSegmentPush extends ResolvedSegmentBase { +export type ResolvedSegmentPush = ResolvedSegmentBase & { type: 'push'; value: T; -} +}; -export interface ResolvedSegmentEvaluation extends ResolvedSegmentBase { +export type ResolvedSegmentEvaluation = ResolvedSegmentBase & { type: 'evaluation'; value: T; -} - -export interface ResolvedSegmentVariableBytecode - extends ResolvedSegmentBase, - ResolutionDebug, - ResolutionSignature { - type: 'bytecode'; - value: Uint8Array; - /** - * The full identifier (including any compilation operations) of the variable - * that resolved to this `value`, e.g. `my_key.signature.all_outputs` or - * `my_key.public_key`. - */ - variable: string; -} - -export interface ResolvedSegmentScriptBytecode extends ResolvedSegmentBase { - /** - * The full identifier of the script that resolved to this `value`. - */ - script: string; - /** - * The source {@link ResolvedScript} that was compiled to produce - * this `value`. - */ - source: ResolvedScript; - type: 'bytecode'; - value: Uint8Array; -} - -export interface ResolvedSegmentOpcodeBytecode extends ResolvedSegmentBase { +}; + +export type ResolvedSegmentVariableBytecode = ResolutionDebug & + ResolutionSignature & + ResolvedSegmentBase & { + type: 'bytecode'; + value: Uint8Array; + /** + * The full identifier (including any compilation operations) of the variable + * that resolved to this `value`, e.g. `my_key.signature.all_outputs` or + * `my_key.public_key`. + */ + variable: string; + }; + +export type ResolvedSegmentScriptBytecode = + ResolvedSegmentBase & { + /** + * The full identifier of the script that resolved to this `value`. + */ + script: string; + /** + * The source {@link ResolvedScript} that was compiled to produce + * this `value`. + */ + source: CompilationResultSuccess; + type: 'bytecode'; + value: Uint8Array; + }; + +export type ResolvedSegmentOpcodeBytecode = ResolvedSegmentBase & { /** * The identifier for this opcode, e.g. `OP_1` or `OP_CHECKSIG`. */ opcode: string; type: 'bytecode'; value: Uint8Array; -} +}; export type ResolvedSegmentLiteralType = | 'BigIntLiteral' @@ -113,25 +113,25 @@ export type ResolvedSegmentLiteralType = | 'HexLiteral' | 'UTF8Literal'; -export interface ResolvedSegmentLiteralBytecode extends ResolvedSegmentBase { +export type ResolvedSegmentLiteralBytecode = ResolvedSegmentBase & { literal: string; literalType: ResolvedSegmentLiteralType; type: 'bytecode'; value: Uint8Array; -} +}; -export type ResolvedSegmentBytecode = +export type ResolvedSegmentBytecode = | ResolvedSegmentLiteralBytecode | ResolvedSegmentOpcodeBytecode - | ResolvedSegmentScriptBytecode + | ResolvedSegmentScriptBytecode | ResolvedSegmentVariableBytecode; -export interface ResolvedSegmentComment extends ResolvedSegmentBase { +export type ResolvedSegmentComment = ResolvedSegmentBase & { type: 'comment'; value: string; -} +}; -export interface ResolvedSegmentError extends ResolvedSegmentBase { +export type ResolvedSegmentError = ResolvedSegmentBase & { type: 'error'; value: string; /** @@ -147,17 +147,16 @@ export interface ResolvedSegmentError extends ResolvedSegmentBase { * for the referenced variable is available in the compilation data. */ owningEntity?: string; -} +}; -export type ResolvedSegment = - | ResolvedSegmentBytecode +export type ResolvedSegment = + | ResolvedSegmentBytecode | ResolvedSegmentComment | ResolvedSegmentError - | ResolvedSegmentEvaluation - | ResolvedSegmentPush; + | ResolvedSegmentEvaluation> + | ResolvedSegmentPush>; -// eslint-disable-next-line @typescript-eslint/no-empty-interface -export interface ResolvedScript extends Array {} +export type ResolvedScript = ResolvedSegment[]; export enum IdentifierResolutionType { opcode = 'opcode', @@ -171,7 +170,7 @@ export enum IdentifierResolutionErrorType { script = 'script', } -export interface ResolutionDebug { +export type ResolutionDebug = { /** * An additional, complex property that may be returned by custom * compiler operations. For use in extending the compiler to support @@ -179,9 +178,9 @@ export interface ResolutionDebug { * {@link CompilerOperationSuccessSignature}. */ debug?: unknown; -} +}; -export interface ResolutionSignature { +export type ResolutionSignature = { signature?: | { /** @@ -198,17 +197,19 @@ export interface ResolutionSignature { */ serialization: Uint8Array; }; -} +}; /** * A method that accepts a string and returns either the successfully resolved * bytecode or an error. The string will never be empty (`''`), so resolution * can skip checking the string's length. */ -export type IdentifierResolutionFunction = (identifier: string) => +export type IdentifierResolutionFunction = ( + identifier: string, +) => | { bytecode: Uint8Array; - source: ResolvedScript; + source: CompilationResultSuccess; status: true; type: IdentifierResolutionType.script; } @@ -249,30 +250,30 @@ export type IdentifierResolutionFunction = (identifier: string) => /** * The result of reducing a single CashAssembly script node. */ -export interface ScriptReductionTraceNode { +export type ScriptReductionTraceNode = { bytecode: Uint8Array; errors?: CompilationError[] | undefined; range: Range; -} -interface ScriptReductionTraceErrorNode extends ScriptReductionTraceNode { +}; +type ScriptReductionTraceErrorNode = ScriptReductionTraceNode & { errors: CompilationError[]; -} +}; -export interface ScriptReductionTraceScriptNode - extends ScriptReductionTraceNode { - script: ScriptReductionTraceChildNode[]; -} +export type ScriptReductionTraceScriptNode = + ScriptReductionTraceNode & { + script: ScriptReductionTraceChildNode[]; + }; -export interface ScriptReductionTracePushNode - extends ScriptReductionTraceNode { - push: ScriptReductionTraceScriptNode; -} +export type ScriptReductionTracePushNode = + ScriptReductionTraceNode & { + push: ScriptReductionTraceScriptNode; + }; -export interface ScriptReductionTraceEvaluationNode - extends ScriptReductionTraceNode { - trace: ProgramState[]; - source: ScriptReductionTraceScriptNode; -} +export type ScriptReductionTraceEvaluationNode = + ScriptReductionTraceNode & { + trace: ProgramState[]; + source: ScriptReductionTraceScriptNode; + }; export type ScriptReductionTraceChildNode = | ScriptReductionTraceErrorNode @@ -283,10 +284,10 @@ export type ScriptReductionTraceChildNode = /** * The ProgramState at a particular point in a sampled evaluation. */ -export interface TraceSample { +export type TraceSample = { range: Range; state: ProgramState; -} +}; /** * A group of instructions that when read together are not malformed (contain @@ -294,23 +295,23 @@ export interface TraceSample { * `0x03 'a' 'b' 'c'` would be malformed if not evaluated together, since the * `0x03` becomes `OP_PUSHBYTES_3`, and the UTF8 literals compile to `0x616263`. */ -export interface InstructionAggregation { +export type InstructionAggregation = { instructions: AuthenticationInstruction[]; lastIp: number; range: Range; -} +}; -export interface InstructionAggregationSuccess { +export type InstructionAggregationSuccess = { aggregations: InstructionAggregation[]; success: true; -} +}; -export interface InstructionAggregationError { +export type InstructionAggregationError = { aggregations: InstructionAggregation[]; remainingBytecode: Uint8Array; remainingRange: Range; success: false; -} +}; /** * An evaluation sample extracted from a script reduction trace – includes the @@ -318,7 +319,7 @@ export interface InstructionAggregationError { * that was evaluated, the range in the source script over which the * instruction was defined, and the resulting program state. */ -export interface EvaluationSample { +export type EvaluationSample = { /** * The range of the evaluation node in which this sample was generated. * @@ -357,23 +358,23 @@ export interface EvaluationSample { * The program state after the evaluation of this sample's `instruction`. */ state: ProgramState; -} +}; -export interface CompilationResultResolve { +export type CompilationResultResolve = { parse: CashAssemblyScriptSegment; - resolve: ResolvedScript; -} + resolve: ResolvedScript; +}; -export interface CompilationResultReduce - extends CompilationResultResolve { - reduce: ScriptReductionTraceScriptNode; -} +export type CompilationResultReduce = + CompilationResultResolve & { + reduce: ScriptReductionTraceScriptNode; + }; -export interface CompilationResultErrorBase { +export type CompilationResultErrorBase = { errors: CompilationError[]; errorType: 'parse' | 'reduce' | 'resolve'; success: false; -} +}; export type CompilationError = | CompilationErrorFatal @@ -381,11 +382,11 @@ export type CompilationError = /** * A compilation error from which it is not possible to recover. This includes - * problems with the authentication template, missing dependencies in the - * compiler configuration, and other errors that likely require meaningful + * problems with the wallet template, missing dependencies in the compiler + * configuration, and other errors that likely require meaningful * software changes. */ -export interface CompilationErrorFatal { +export type CompilationErrorFatal = { /** * A message describing the compilation error. */ @@ -395,7 +396,7 @@ export interface CompilationErrorFatal { * useful for highlighting/underlining the cause of the error in development. */ range: Range; -} +}; /** * A compilation error from which recovery can happen without template or @@ -407,7 +408,7 @@ export interface CompilationErrorFatal { * variables can be extracted and used to request action by the user or another * system. */ -export interface CompilationErrorRecoverable extends CompilationErrorFatal { +export type CompilationErrorRecoverable = CompilationErrorFatal & { /** * The variable ID of the variable that – if provided in the compilation data * – would resolve this error. @@ -418,58 +419,57 @@ export interface CompilationErrorRecoverable extends CompilationErrorFatal { * `missingIdentifier`. */ owningEntity: string; -} +}; -export interface CompilationResultParseError - extends CompilationResultErrorBase { +export type CompilationResultParseError = CompilationResultErrorBase & { /** * The `parse` stage produces only a single parse error at a time. */ errors: [CompilationError]; errorType: 'parse'; -} -export interface CompilationResultResolveError - extends CompilationResultResolve, - CompilationResultErrorBase { - errorType: 'resolve'; -} - -export interface CompilationResultReduceError - extends CompilationResultReduce, - CompilationResultErrorBase { - errorType: 'reduce'; -} +}; +export type CompilationResultResolveError = + CompilationResultErrorBase & + CompilationResultResolve & { + errorType: 'resolve'; + }; + +export type CompilationResultReduceError = + CompilationResultErrorBase & + CompilationResultReduce & { + errorType: 'reduce'; + }; export type CompilationResultError = | CompilationResultParseError | CompilationResultReduceError - | CompilationResultResolveError; - -export interface CompilationResultSuccess - extends CompilationResultReduce { - bytecode: Uint8Array; - success: true; - /** - * The transformation type of the resulting bytecode. - * - * Set to `p2sh20-locking` if the resulting bytecode was transformed into a - * P2SH20 locking script (`OP_HASH160 <$( OP_HASH160)> OP_EQUAL`). - * - * Set to `p2sh20-unlocking` if the resulting bytecode was transformed into a - * P2SH20 unlocking script (`result `). - * - * This property is not defined if the result was not transformed. - */ - transformed?: - | 'p2sh20-locking' - | 'p2sh20-unlocking' - | 'p2sh32-locking' - | 'p2sh32-unlocking'; -} + | CompilationResultResolveError; + +export type CompilationResultSuccess = + CompilationResultReduce & { + bytecode: Uint8Array; + success: true; + /** + * The transformation type of the resulting bytecode. + * + * Set to `p2sh20-locking` if the resulting bytecode was transformed into a + * P2SH20 locking script (`OP_HASH160 <$( OP_HASH160)> OP_EQUAL`). + * + * Set to `p2sh20-unlocking` if the resulting bytecode was transformed into a + * P2SH20 unlocking script (`result `). + * + * This property is not defined if the result was not transformed. + */ + transformed?: + | 'p2sh20-locking' + | 'p2sh20-unlocking' + | 'p2sh32-locking' + | 'p2sh32-unlocking'; + }; export type CompilationResult< ProgramState = AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, > = | CompilationResultError | CompilationResultSuccess; diff --git a/src/lib/language/language-utils.spec.ts b/src/lib/language/language-utils.spec.ts index 990adc78..46293e00 100644 --- a/src/lib/language/language-utils.spec.ts +++ b/src/lib/language/language-utils.spec.ts @@ -28,21 +28,21 @@ test('mergeRanges', (t) => { { endColumn: 3, endLineNumber: 1, startColumn: 0, startLineNumber: 1 }, { endColumn: 1, endLineNumber: 3, startColumn: 6, startLineNumber: 0 }, ]), - { endColumn: 1, endLineNumber: 3, startColumn: 6, startLineNumber: 0 } + { endColumn: 1, endLineNumber: 3, startColumn: 6, startLineNumber: 0 }, ); t.deepEqual( mergeRanges([ { endColumn: 4, endLineNumber: 0, startColumn: 0, startLineNumber: 0 }, { endColumn: 8, endLineNumber: 1, startColumn: 6, startLineNumber: 1 }, ]), - { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 } + { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 }, ); t.deepEqual( mergeRanges([ { endColumn: 1, endLineNumber: 1, startColumn: 5, startLineNumber: 0 }, { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 }, ]), - { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 } + { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 }, ); }); @@ -50,31 +50,31 @@ test('containsRange', (t) => { t.deepEqual( containsRange( { endColumn: 1, endLineNumber: 3, startColumn: 6, startLineNumber: 0 }, - { endColumn: 3, endLineNumber: 1, startColumn: 0, startLineNumber: 1 } + { endColumn: 3, endLineNumber: 1, startColumn: 0, startLineNumber: 1 }, ), - true + true, ); t.deepEqual( containsRange( { endColumn: 4, endLineNumber: 0, startColumn: 0, startLineNumber: 0 }, - { endColumn: 8, endLineNumber: 1, startColumn: 6, startLineNumber: 1 } + { endColumn: 8, endLineNumber: 1, startColumn: 6, startLineNumber: 1 }, ), - false + false, ); t.deepEqual( containsRange( { endColumn: 8, endLineNumber: 1, startColumn: 0, startLineNumber: 0 }, - { endColumn: 1, endLineNumber: 1, startColumn: 5, startLineNumber: 0 } + { endColumn: 1, endLineNumber: 1, startColumn: 5, startLineNumber: 0 }, ), - true + true, ); t.deepEqual( containsRange( { endColumn: 5, endLineNumber: 1, startColumn: 1, startLineNumber: 1 }, { endColumn: 5, endLineNumber: 1, startColumn: 1, startLineNumber: 1 }, - false + false, ), - true + true, ); }); @@ -83,13 +83,13 @@ test('compileCashAssembly', (t) => { t.deepEqual( successful, hexToBin('03010203'), - stringifyTestVector(successful) + stringifyTestVector(successful), ); const failed = compileCashAssembly(''); t.deepEqual( failed, 'CashAssembly compilation error: [1, 2]: Unknown identifier "bad".', - stringifyTestVector(failed) + stringifyTestVector(failed), ); }); @@ -167,7 +167,7 @@ test('extractBytecodeResolutions', (t) => { type: 'opcode', }, ], - stringifyTestVector(result) + stringifyTestVector(result), ); }); @@ -188,7 +188,7 @@ test('extractEvaluationSamples: empty trace', (t) => { samples: [], unmatchedStates: [], }, - stringifyTestVector(result) + stringifyTestVector(result), ); }); @@ -590,7 +590,7 @@ test.failing('extractEvaluationSamples: documentation example', (t) => { }, }, ], - stringifyTestVector(nodes) + stringifyTestVector(nodes), ); t.deepEqual( @@ -981,7 +981,7 @@ test.failing('extractEvaluationSamples: documentation example', (t) => { ], }, ], - stringifyTestVector(traceWithUnlockingPhaseAndFinalState) + stringifyTestVector(traceWithUnlockingPhaseAndFinalState), ); t.deepEqual(extracted, { @@ -1118,7 +1118,7 @@ test('extractEvaluationSamples: error in initial validation', (t) => { }, }, ], - stringifyTestVector(nodes) + stringifyTestVector(nodes), ); t.deepEqual( @@ -1145,7 +1145,7 @@ test('extractEvaluationSamples: error in initial validation', (t) => { stack: [], }, ], - stringifyTestVector(trace) + stringifyTestVector(trace), ); t.deepEqual(extracted, { @@ -1179,7 +1179,7 @@ test.failing( return; } const program = createAuthenticationProgramEvaluationCommon( - result.bytecode + result.bytecode, ); const nodes = result.reduce.script; const evaluationRange = result.reduce.range; @@ -1335,7 +1335,7 @@ test.failing( ], }, ], - stringifyTestVector(nodes) + stringifyTestVector(nodes), ); t.deepEqual( @@ -1452,7 +1452,7 @@ test.failing( stack: [hexToBin('ab')], }, ], - stringifyTestVector(traceWithUnlockingPhaseAndFinalState) + stringifyTestVector(traceWithUnlockingPhaseAndFinalState), ); t.deepEqual( @@ -1487,9 +1487,9 @@ test.failing( ], unmatchedStates: [], }, - stringifyTestVector(extracted) + stringifyTestVector(extracted), ); - } + }, ); test('extractEvaluationSamples: node that closes an open sample with an error', (t) => { @@ -1526,7 +1526,7 @@ test('extractEvaluationSamples: node that closes an open sample with an error', }, { bytecode: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262', ), range: { endColumn: 614, @@ -1536,7 +1536,7 @@ test('extractEvaluationSamples: node that closes an open sample with an error', }, }, ], - stringifyTestVector(nodes) + stringifyTestVector(nodes), ); t.deepEqual( @@ -1564,7 +1564,7 @@ test('extractEvaluationSamples: node that closes an open sample with an error', }, { data: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262', ), opcode: 77, }, @@ -1587,7 +1587,7 @@ test('extractEvaluationSamples: node that closes an open sample with an error', }, { data: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262', ), opcode: 77, }, @@ -1612,7 +1612,7 @@ test('extractEvaluationSamples: node that closes an open sample with an error', }, { data: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262', ), opcode: 77, }, @@ -1637,7 +1637,7 @@ test('extractEvaluationSamples: node that closes an open sample with an error', }, { data: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262', ), opcode: 77, }, @@ -1651,7 +1651,7 @@ test('extractEvaluationSamples: node that closes an open sample with an error', stack: [hexToBin('')], }, ], - stringifyTestVector(traceWithUnlockingPhaseAndFinalState) + stringifyTestVector(traceWithUnlockingPhaseAndFinalState), ); t.deepEqual(extracted, { @@ -1678,7 +1678,7 @@ test('extractEvaluationSamples: node that closes an open sample with an error', evaluationRange, instruction: { data: hexToBin( - '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262' + '626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262626262', ), opcode: 77, }, @@ -1751,7 +1751,7 @@ test('extractEvaluationSamples: error3 - error occurs, so final state is dropped }, }, ], - stringifyTestVector(nodes) + stringifyTestVector(nodes), ); t.deepEqual( @@ -1884,7 +1884,7 @@ test('extractEvaluationSamples: error3 - error occurs, so final state is dropped stack: [hexToBin('')], }, ], - stringifyTestVector(traceWithUnlockingPhaseAndFinalState) + stringifyTestVector(traceWithUnlockingPhaseAndFinalState), ); t.deepEqual( @@ -1912,7 +1912,7 @@ test('extractEvaluationSamples: error3 - error occurs, so final state is dropped ], unmatchedStates: [], }, - stringifyTestVector(extracted) + stringifyTestVector(extracted), ); }); @@ -1929,7 +1929,7 @@ test.failing( return; } const program = createAuthenticationProgramEvaluationCommon( - result.bytecode + result.bytecode, ); const nodes = result.reduce.script; const evaluationRange = result.reduce.range; @@ -2967,7 +2967,7 @@ test.failing( }, }, ], - stringifyTestVector(nodes) + stringifyTestVector(nodes), ); t.deepEqual( @@ -3070,7 +3070,7 @@ test.failing( stack: [hexToBin(''), hexToBin('616263')], }, ], - stringifyTestVector(traceWithUnlockingPhaseAndFinalState) + stringifyTestVector(traceWithUnlockingPhaseAndFinalState), ); t.deepEqual( @@ -4028,13 +4028,13 @@ test.failing( }, ], }, - stringifyTestVector(sampleResult) + stringifyTestVector(sampleResult), ); - } + }, ); const extractUnexecutedRangesMacro = test.macro<[string, Range[], boolean?]>({ - // eslint-disable-next-line max-params + // eslint-disable-next-line @typescript-eslint/max-params exec: (t, scriptId, ranges, specifyStart) => { const result = compiler.generateBytecode({ data: {}, @@ -4046,7 +4046,7 @@ const extractUnexecutedRangesMacro = test.macro<[string, Range[], boolean?]>({ return; } const testProgram = createAuthenticationProgramEvaluationCommon( - result.bytecode + result.bytecode, ); const nodes = result.reduce.script; const evaluationRange = result.reduce.range; @@ -4059,12 +4059,12 @@ const extractUnexecutedRangesMacro = test.macro<[string, Range[], boolean?]>({ }); const unexecutedRanges = extractUnexecutedRanges( samples, - specifyStart === undefined ? undefined : '1,1' + specifyStart === undefined ? undefined : '1,1', ); t.deepEqual( unexecutedRanges, ranges, - stringifyTestVector(unexecutedRanges) + stringifyTestVector(unexecutedRanges), ); }, title: (_, scriptId) => `extractUnexecutedRangesMacro: ${scriptId}`, @@ -4123,7 +4123,7 @@ test( startLineNumber: 21, }, ], - true + true, ); test(extractUnexecutedRangesMacro, 'unexecuted01', [ diff --git a/src/lib/language/language-utils.ts b/src/lib/language/language-utils.ts index 6d5ddfd0..f3004d69 100644 --- a/src/lib/language/language-utils.ts +++ b/src/lib/language/language-utils.ts @@ -48,7 +48,7 @@ export const mergeRanges = ( endLineNumber: 0, startColumn: 0, startLineNumber: 0, - } as Range + } as Range, ) => { const minimumRangesToMerge = 2; const unsortedMerged = @@ -63,18 +63,18 @@ export const mergeRanges = ( ...(range.endLineNumber > merged.endLineNumber ? pluckEndPosition(range) : range.endLineNumber === merged.endLineNumber && - range.endColumn > merged.endColumn - ? pluckEndPosition(range) - : pluckEndPosition(merged)), + range.endColumn > merged.endColumn + ? pluckEndPosition(range) + : pluckEndPosition(merged)), ...(range.startLineNumber < merged.startLineNumber ? pluckStartPosition(range) : range.startLineNumber === merged.startLineNumber && - range.startColumn < merged.startColumn - ? pluckStartPosition(range) - : pluckStartPosition(merged)), + range.startColumn < merged.startColumn + ? pluckStartPosition(range) + : pluckStartPosition(merged)), }), // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - ranges[0]! + ranges[0]!, ); return { ...pluckEndPosition(unsortedMerged), @@ -96,24 +96,24 @@ export const mergeRanges = ( export const containsRange = ( outerRange: Range, innerRange: Range, - exclusive = true + exclusive = true, ) => { const startsAfter = outerRange.startLineNumber < innerRange.startLineNumber ? true : outerRange.startLineNumber === innerRange.startLineNumber - ? exclusive - ? outerRange.startColumn < innerRange.startColumn - : outerRange.startColumn <= innerRange.startColumn - : false; + ? exclusive + ? outerRange.startColumn < innerRange.startColumn + : outerRange.startColumn <= innerRange.startColumn + : false; const endsBefore = outerRange.endLineNumber > innerRange.endLineNumber ? true : outerRange.endLineNumber === innerRange.endLineNumber - ? exclusive - ? outerRange.endColumn > innerRange.endColumn - : outerRange.endColumn >= innerRange.endColumn - : false; + ? exclusive + ? outerRange.endColumn > innerRange.endColumn + : outerRange.endColumn >= innerRange.endColumn + : false; return startsAfter && endsBefore; }; @@ -123,8 +123,8 @@ export const containsRange = ( * @param resolvedScript - the result of {@link resolveScript} from which to * extract errors */ -export const getResolutionErrors = ( - resolvedScript: ResolvedScript +export const getResolutionErrors = ( + resolvedScript: ResolvedScript, ): CompilationError[] => resolvedScript.reduce((errors, segment) => { switch (segment.type) { @@ -153,7 +153,7 @@ export const getResolutionErrors = ( /** * Verify that every error in the provided array can be resolved by providing * additional variables in the compilation data (rather than deeper issues, like - * problems with the authentication template or wallet implementation). + * problems with the wallet template or wallet implementation). * * Note, errors are only recoverable if the "entity ownership" of each missing * identifier is known (specified in `CompilationData`'s `entityOwnership`). @@ -161,10 +161,10 @@ export const getResolutionErrors = ( * @param errors - an array of compilation errors */ export const allErrorsAreRecoverable = ( - errors: CompilationError[] + errors: CompilationError[], ): errors is CompilationErrorRecoverable[] => errors.every( - (error) => 'missingIdentifier' in error && 'owningEntity' in error + (error) => 'missingIdentifier' in error && 'owningEntity' in error, ); /** @@ -172,18 +172,18 @@ export const allErrorsAreRecoverable = ( * or `opcode` property contains the full identifier that resolved * to `bytecode`. */ -export interface CashAssemblyResolution { +export type CashAssemblyResolution = { bytecode: Uint8Array; type: ResolvedSegmentLiteralType | 'opcode' | 'script' | 'variable'; text: string; -} +}; /** * Get an array of all resolutions used in a {@link ResolvedScript}. * @param resolvedScript - the resolved script to search */ -export const extractBytecodeResolutions = ( - resolvedScript: ResolvedScript +export const extractBytecodeResolutions = ( + resolvedScript: ResolvedScript, ): CashAssemblyResolution[] => // eslint-disable-next-line complexity resolvedScript.reduce((all, segment) => { @@ -205,7 +205,7 @@ export const extractBytecodeResolutions = ( if ('script' in segment) { return [ ...all, - ...extractBytecodeResolutions(segment.source), + ...extractBytecodeResolutions(segment.source.resolve), { bytecode: segment.value, text: segment.script, @@ -242,8 +242,8 @@ export const extractBytecodeResolutions = ( * * @param resolvedScript - the resolved script to search */ -export const extractResolvedVariableBytecodeMap = ( - resolvedScript: ResolvedScript +export const extractResolvedVariableBytecodeMap = ( + resolvedScript: ResolvedScript, ) => extractBytecodeResolutions(resolvedScript).reduce<{ [fullIdentifier: string]: Uint8Array; @@ -252,7 +252,7 @@ export const extractResolvedVariableBytecodeMap = ( resolution.type === 'variable' ? { ...all, [resolution.text]: resolution.bytecode } : all, - {} + {}, ); /** @@ -267,14 +267,14 @@ export const extractResolvedVariableBytecodeMap = ( * @param separator - the characters with which to join the formatted errors. */ export const stringifyErrors = (errors: CompilationError[], separator = '; ') => - `${errors + errors .map( (error) => - `[${error.range.startLineNumber}, ${error.range.startColumn}] ${error.error}` + `[${error.range.startLineNumber}, ${error.range.startColumn}] ${error.error}`, ) - .join(separator)}`; + .join(separator); -export interface SampleExtractionResult { +export type SampleExtractionResult = { /** * The samples successfully extracted from the provided `nodes` and `trace`. * @@ -299,7 +299,7 @@ export interface SampleExtractionResult { * returned in `unmatchedStates`. */ unmatchedStates: ProgramState[]; -} +}; /** * Extract a set of "evaluation samples" from the result of a CashAssembly @@ -461,7 +461,7 @@ export const extractEvaluationSamples = ({ let nextNode = 0; // eslint-disable-next-line functional/no-let, @typescript-eslint/init-declarations let incomplete: { bytecode: Uint8Array; range: Range } | undefined; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (nextState < traceWithoutFinalState.length && nextNode < nodes.length) { // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const currentNode = nodes[nextNode]!; @@ -495,7 +495,7 @@ export const extractEvaluationSamples = ({ const firstUnmatchedStateIndex = nextState + validInstructions.length; const matchingStates = traceWithoutFinalState.slice( nextState, - firstUnmatchedStateIndex + firstUnmatchedStateIndex, ); const pairedStates = validInstructions.map((instruction, index) => ({ instruction, @@ -511,9 +511,9 @@ export const extractEvaluationSamples = ({ }; const closesCurrentlyOpenSample = incomplete !== undefined; - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (closesCurrentlyOpenSample) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data samples.push({ evaluationRange, instruction: firstPairedState.instruction, @@ -524,7 +524,7 @@ export const extractEvaluationSamples = ({ } const firstUndefinedStateIndex = pairedStates.findIndex( - ({ state }) => state === undefined + ({ state }) => state === undefined, ); const sampleHasError = firstUndefinedStateIndex !== -1; const sampleClosingIndex = sampleHasError @@ -533,7 +533,7 @@ export const extractEvaluationSamples = ({ const closesASecondSample = !closesCurrentlyOpenSample || sampleClosingIndex > 0; - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (closesASecondSample) { const finalState = pairedStates[sampleClosingIndex] as { instruction: AuthenticationInstructionMaybeMalformed; @@ -542,12 +542,12 @@ export const extractEvaluationSamples = ({ const secondSamplePairsBegin = closesCurrentlyOpenSample ? 1 : 0; const internalStates = pairedStates.slice( secondSamplePairsBegin, - sampleClosingIndex + sampleClosingIndex, ) as { instruction: AuthenticationInstructionMaybeMalformed; state: ProgramState; }[]; - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data samples.push({ evaluationRange, instruction: finalState.instruction, @@ -557,27 +557,27 @@ export const extractEvaluationSamples = ({ }); } - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements nextState = firstUnmatchedStateIndex; - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (authenticationInstructionIsMalformed(lastInstruction)) { - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements incomplete = { bytecode: encodeAuthenticationInstructionMalformed(lastInstruction), range: currentNode.range, }; - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements } else { - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements incomplete = undefined; } - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements } else { const lastInstruction = decoded[decoded.length - 1] as | AuthenticationInstructionMalformed | undefined; - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements incomplete = lastInstruction === undefined ? undefined @@ -587,7 +587,7 @@ export const extractEvaluationSamples = ({ range: mergedRange, }; } - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements nextNode += 1; } @@ -642,12 +642,12 @@ export const extractEvaluationSamplesRecursive = ({ }): SampleExtractionResult => { const extractEvaluations = ( node: ScriptReductionTraceChildNode, - depth = 1 + depth = 1, ): EvaluationSample[] => { if ('push' in node) { return node.push.script.reduce[]>( (all, childNode) => [...all, ...extractEvaluations(childNode, depth)], - [] + [], ); } if ('source' in node) { @@ -658,7 +658,7 @@ export const extractEvaluationSamplesRecursive = ({ ...all, ...extractEvaluations(childNode, depth + 1), ], - [] + [], ); const traceWithoutUnlockingPhase = node.trace.slice(1); const evaluationBeginToken = '$('; @@ -686,7 +686,7 @@ export const extractEvaluationSamplesRecursive = ({ const childSamples = nodes.reduce[]>( (all, node) => [...all, ...extractEvaluations(node)], - [] + [], ); const endingOrderedSamples = [...samples, ...childSamples].sort((a, b) => { @@ -703,7 +703,7 @@ export const extractEvaluationSamplesRecursive = ({ }; const stateIsExecuting = ( - state: AuthenticationProgramStateControlStack + state: AuthenticationProgramStateControlStack, ) => state.controlStack.every((item) => item !== false); /** @@ -735,10 +735,10 @@ const stateIsExecuting = ( * executing), defaults to `1,1` */ export const extractUnexecutedRanges = < - ProgramState extends AuthenticationProgramStateControlStack + ProgramState extends AuthenticationProgramStateControlStack, >( samples: EvaluationSample[], - evaluationBegins = '1,1' + evaluationBegins = '1,1', ) => { const reduced = samples.reduce<{ precedingStateSkipsByEvaluation: { @@ -778,7 +778,7 @@ export const extractUnexecutedRanges = < [evaluationBegins]: false, }, unexecutedRanges: [], - } + }, ); const canHaveContainedRanges = 2; @@ -794,7 +794,7 @@ export const extractUnexecutedRanges = < return [range, ...all]; }, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - [reduced.unexecutedRanges[reduced.unexecutedRanges.length - 1]!] + [reduced.unexecutedRanges[reduced.unexecutedRanges.length - 1]!], ); return containedRangesExcluded; }; @@ -825,9 +825,9 @@ export const summarizeDebugTrace = < AuthenticationProgramStateControlStack & AuthenticationProgramStateError & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack)[] + AuthenticationProgramStateStack)[], >( - trace: Trace + trace: Trace, ) => trace.reduce< { @@ -839,7 +839,7 @@ export const summarizeDebugTrace = < stack: string[]; }[] >( - // eslint-disable-next-line max-params + // eslint-disable-next-line @typescript-eslint/max-params (steps, state, stateIndex, states) => { const nextState = states[stateIndex + 1]; return nextState === undefined @@ -859,7 +859,7 @@ export const summarizeDebugTrace = < }, ]; }, - [] + [], ); /** @@ -877,7 +877,7 @@ export const stringifyDebugTraceSummary = ( /** * An opcode enum, e.g. {@link OpcodesBCH}. */ - opcodes: Readonly<{ [opcode: number]: string }>; + opcodes: { [opcode: number]: string }; /** * The width of the instruction column. */ @@ -885,7 +885,7 @@ export const stringifyDebugTraceSummary = ( } = { opcodes: OpcodesBCHCHIPs, padInstruction: 23, - } + }, ) => summary .map( @@ -905,6 +905,6 @@ export const stringifyDebugTraceSummary = ( ? '' : `| alt: ${line.alternateStack.join(' ')}` }` - }` + }`, ) .join('\n'); diff --git a/src/lib/language/parse.spec.ts b/src/lib/language/parse.spec.ts index 1d21777a..5b709d08 100644 --- a/src/lib/language/parse.spec.ts +++ b/src/lib/language/parse.spec.ts @@ -193,7 +193,7 @@ test('parseScript: BigIntLiteral', (t) => { ], }, }, - stringifyTestVector(allowed) + stringifyTestVector(allowed), ); const maybeUnexpected = parseScript('_1 1_'); @@ -259,7 +259,7 @@ test('parseScript: BigIntLiteral', (t) => { ], }, }, - stringifyTestVector(maybeUnexpected) + stringifyTestVector(maybeUnexpected), ); const errors = parseScript('-_1'); @@ -286,7 +286,7 @@ test('parseScript: BigIntLiteral', (t) => { }, status: false, }, - stringifyTestVector(errors) + stringifyTestVector(errors), ); }); @@ -392,6 +392,44 @@ test('parseScript: UTF8Literal', (t) => { }); }); +test('parseScript: always lossy-normalizes unicode characters before parsing', (t) => { + const normalized = parseScript('"fit"'); + const ligature = parseScript('"fit"'); + t.deepEqual(normalized, { + status: true, + value: { + end: { + column: 6, + line: 1, + offset: 5, + }, + name: 'Script', + start: { + column: 1, + line: 1, + offset: 0, + }, + value: [ + { + end: { + column: 6, + line: 1, + offset: 5, + }, + name: 'UTF8Literal', + start: { + column: 1, + line: 1, + offset: 0, + }, + value: 'fit', + }, + ], + }, + }); + t.deepEqual(ligature, normalized); +}); + test('parseScript: HexLiteral', (t) => { t.deepEqual(parseScript('0xdeadbeef'), { status: true, @@ -502,7 +540,7 @@ test('parseScript: HexLiteral', (t) => { ], }, }, - stringifyTestVector(allowed) + stringifyTestVector(allowed), ); const maybeUnexpected = parseScript('0x 0x0_ 0x0_11 0x0_1_ 0x_01'); t.deepEqual( @@ -665,7 +703,7 @@ test('parseScript: HexLiteral', (t) => { ], }, }, - stringifyTestVector(maybeUnexpected) + stringifyTestVector(maybeUnexpected), ); }); @@ -705,7 +743,7 @@ test('parseScript: BinaryLiteral', (t) => { ], }, }, - stringifyTestVector(b1) + stringifyTestVector(b1), ); const b010101 = parseScript('0b010101'); t.deepEqual( @@ -742,7 +780,7 @@ test('parseScript: BinaryLiteral', (t) => { ], }, }, - stringifyTestVector(b010101) + stringifyTestVector(b010101), ); const allowed = parseScript('0b0 0b1 0b111 0b0_0 0b0000_0000__0000_0000'); t.deepEqual( @@ -835,7 +873,7 @@ test('parseScript: BinaryLiteral', (t) => { ], }, }, - stringifyTestVector(allowed) + stringifyTestVector(allowed), ); const maybeUnexpected = parseScript('0b 0b_ 0b_1 0b1_'); t.deepEqual( @@ -970,7 +1008,7 @@ test('parseScript: BinaryLiteral', (t) => { ], }, }, - stringifyTestVector(maybeUnexpected) + stringifyTestVector(maybeUnexpected), ); }); @@ -1010,7 +1048,7 @@ test('parseScript: comments', (t) => { ], }, }, - stringifyTestVector(single) + stringifyTestVector(single), ); const multi = parseScript(`/* \nmulti-line\n comment\n */`); t.deepEqual( @@ -1047,7 +1085,7 @@ test('parseScript: comments', (t) => { ], }, }, - stringifyTestVector(multi) + stringifyTestVector(multi), ); const multiple = parseScript(`/* comment before */ OP_1 /* comment after */`); t.deepEqual( @@ -1112,7 +1150,7 @@ test('parseScript: comments', (t) => { ], }, }, - stringifyTestVector(multiple) + stringifyTestVector(multiple), ); }); @@ -2117,6 +2155,6 @@ test('parseScript: complex script', (t) => { ], }, }, - stringifyTestVector(result) + stringifyTestVector(result), ); }); diff --git a/src/lib/language/parse.ts b/src/lib/language/parse.ts index ad2b96ec..e542631b 100644 --- a/src/lib/language/parse.ts +++ b/src/lib/language/parse.ts @@ -1,3 +1,4 @@ +import { lossyNormalize } from '../format/format.js'; import type { ParseResult } from '../lib.js'; import { P } from './parsimmon.js'; @@ -9,7 +10,7 @@ const cashAssemblyParser = P.createLanguage({ P.optWhitespace, r.expression.sepBy(P.optWhitespace), P.optWhitespace, - (_, expressions) => expressions + (_, expressions) => expressions, ).node('Script'), expression: (r) => P.alt( @@ -20,7 +21,7 @@ const cashAssemblyParser = P.createLanguage({ r.binary, r.hex, r.bigint, - r.identifier + r.identifier, ), comment: (r) => P.alt(r.singleLineComment, r.multiLineComment).node('Comment'), @@ -28,22 +29,22 @@ const cashAssemblyParser = P.createLanguage({ P.seqMap( P.string('//').desc("the start of a single-line comment ('//')"), P.regexp(/[^\n]*/u), - (__, comment) => comment.trim() + (__, comment) => comment.trim(), ), multiLineComment: () => P.seqMap( P.string('/*').desc("the start of a multi-line comment ('/*')"), P.regexp(/[\s\S]*?\*\//u).desc( - "the end of this multi-line comment ('*/')" + "the end of this multi-line comment ('*/')", ), - (__, comment) => comment.slice(0, -'*/'.length).trim() + (__, comment) => comment.slice(0, -'*/'.length).trim(), ), push: (r) => P.seqMap( P.string('<').desc("the start of a push statement ('<')"), r.script, P.string('>').desc("the end of this push statement ('>')"), - (_, push) => push + (_, push) => push, ).node('Push'), evaluation: (r) => P.seqMap( @@ -51,7 +52,7 @@ const cashAssemblyParser = P.createLanguage({ P.string('(').desc("the opening parenthesis of this evaluation ('(')"), r.script, P.string(')').desc("the closing parenthesis of this evaluation (')')"), - (_, __, evaluation) => evaluation + (_, __, evaluation) => evaluation, ).node('Evaluation'), identifier: () => P.regexp(/[a-zA-Z_][.a-zA-Z0-9_-]*/u) @@ -63,28 +64,28 @@ const cashAssemblyParser = P.createLanguage({ P.string('"').desc('a double quote (")'), P.regexp(/[^"]*/u), P.string('"').desc('a closing double quote (")'), - (__, literal) => literal + (__, literal) => literal, ), P.seqMap( P.string("'").desc("a single quote (')"), P.regexp(/[^']*/u), P.string("'").desc("a closing single quote (')"), - (__, literal) => literal - ) + (__, literal) => literal, + ), ).node('UTF8Literal'), hex: () => P.seqMap( P.string('0x').desc("a hex literal ('0x...')"), P.regexp(/[0-9a-f]_*(?:_*[0-9a-f]_*[0-9a-f]_*)*[0-9a-f]/iu).desc( - 'a valid hexadecimal string' + 'a valid hexadecimal string', ), - (__, literal) => literal + (__, literal) => literal, ).node('HexLiteral'), binary: () => P.seqMap( P.string('0b').desc("a binary literal ('0b...')"), P.regexp(/[01]+(?:[01_]*[01]+)*/iu).desc('a string of binary digits'), - (__, literal) => literal + (__, literal) => literal, ).node('BinaryLiteral'), bigint: () => P.regexp(/-?[0-9]+(?:[0-9_]*[0-9]+)*/u) @@ -94,4 +95,4 @@ const cashAssemblyParser = P.createLanguage({ /* eslint-enable sort-keys, @typescript-eslint/naming-convention, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */ export const parseScript = (script: string) => - cashAssemblyParser.script.parse(script) as ParseResult; + cashAssemblyParser.script.parse(lossyNormalize(script)) as ParseResult; diff --git a/src/lib/language/parsimmon.ts b/src/lib/language/parsimmon.ts index fd609849..e1298278 100644 --- a/src/lib/language/parsimmon.ts +++ b/src/lib/language/parsimmon.ts @@ -2,44 +2,44 @@ * This file is derived from https://github.com/jneen/parsimmon and * https://github.com/DefinitelyTyped/DefinitelyTyped. */ -/* eslint-disable @typescript-eslint/unified-signatures, functional/no-method-signature, functional/no-throw-statement, functional/no-conditional-statement, @typescript-eslint/no-this-alias, consistent-this, @typescript-eslint/ban-ts-comment, prefer-spread, @typescript-eslint/restrict-template-expressions, func-names, @typescript-eslint/init-declarations, new-cap, @typescript-eslint/require-array-sort-compare, guard-for-in, no-plusplus, functional/no-let, functional/no-loop-statement, @typescript-eslint/prefer-for-of, @typescript-eslint/restrict-plus-operands, functional/immutable-data, @typescript-eslint/no-use-before-define, @typescript-eslint/strict-boolean-expressions, no-param-reassign, functional/no-expression-statement, functional/no-this-expression, @typescript-eslint/no-explicit-any, func-style, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-return, @typescript-eslint/naming-convention, @typescript-eslint/method-signature-style, @typescript-eslint/no-confusing-void-expression, prefer-arrow-callback, functional/no-return-void, @typescript-eslint/no-unsafe-argument */ +/* eslint-disable @typescript-eslint/unified-signatures, functional/prefer-property-signatures, functional/no-throw-statements, functional/no-conditional-statements, @typescript-eslint/no-this-alias, consistent-this, @typescript-eslint/ban-ts-comment, prefer-spread, func-names, @typescript-eslint/init-declarations, new-cap, guard-for-in, no-plusplus, functional/no-let, functional/no-loop-statements, @typescript-eslint/prefer-for-of, functional/immutable-data, @typescript-eslint/no-use-before-define, @typescript-eslint/strict-boolean-expressions, no-param-reassign, functional/no-expression-statements, functional/no-this-expressions, @typescript-eslint/no-explicit-any, func-style, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-return, @typescript-eslint/naming-convention, @typescript-eslint/method-signature-style, @typescript-eslint/no-confusing-void-expression, prefer-arrow-callback, functional/no-return-void, @typescript-eslint/no-unsafe-argument, functional/functional-parameters */ // cspell: ignore accum -interface Index { +type Index = { /** zero-based character offset */ offset: number; /** one-based line offset */ line: number; /** one-based column offset */ column: number; -} +}; -interface Mark { +type Mark = { start: Index; end: Index; value: T; -} +}; -interface Node extends Mark { +type Node = Mark & { name: Name; -} +}; type Result = Failure | Success; -interface Success { +type Success = { status: true; value: T; -} +}; -interface Failure { +type Failure = { status: false; expected: string[]; index: Index; -} +}; type TypedRule = { [P in keyof TLanguageSpec]: ( - r: TypedLanguage + r: TypedLanguage, ) => Parser; }; @@ -47,7 +47,7 @@ type TypedLanguage = { [P in keyof TLanguageSpec]: Parser; }; -interface Parser { +type Parser = { parse(input: string): Result; or(otherParser: Parser): Parser; then(call: (result: T) => Parser): Parser; @@ -59,7 +59,7 @@ interface Parser { node(name: Name): Parser>; desc(description: string[] | string): Parser; sepBy(separator: Parser): Parser; -} +}; function Parsimmon(action: any) { // @ts-expect-error @@ -185,20 +185,20 @@ function seqMap(p1: Parser, cb: (a1: T) => U): Parser; function seqMap( p1: Parser, p2: Parser, - cb: (a1: T, a2: U) => V + cb: (a1: T, a2: U) => V, ): Parser; function seqMap( p1: Parser, p2: Parser, p3: Parser, - cb: (a1: T, a2: U, a3: V) => W + cb: (a1: T, a2: U, a3: V) => W, ): Parser; function seqMap( p1: Parser, p2: Parser, p3: Parser, p4: Parser, - cb: (a1: T, a2: U, a3: V, a4: W) => X + cb: (a1: T, a2: U, a3: V, a4: W) => X, ): Parser; function seqMap( p1: Parser, @@ -206,7 +206,7 @@ function seqMap( p3: Parser, p4: Parser, p5: Parser, - cb: (a1: T, a2: U, a3: V, a4: W, a5: X) => Y + cb: (a1: T, a2: U, a3: V, a4: W, a5: X) => Y, ): Parser; function seqMap(...params: any[]) { const args = [].slice.call(params); @@ -299,7 +299,7 @@ _.many = function () { /* istanbul ignore if */ if (i === result.index) { throw new Error( 'infinite loop detected in .many() parser --- calling .many() on ' + - 'a parser that can accept zero characters is usually the cause' + 'a parser that can accept zero characters is usually the cause', ); } i = result.index; @@ -340,7 +340,7 @@ _.node = function (name: any) { start, value, }; - } + }, ); }; diff --git a/src/lib/language/reduce.spec.ts b/src/lib/language/reduce.spec.ts index bc81efe8..5cf82724 100644 --- a/src/lib/language/reduce.spec.ts +++ b/src/lib/language/reduce.spec.ts @@ -16,7 +16,7 @@ test('reduceScript: does not throw on empty array', (t) => { }, script: [], }, - stringify(reduced) + stringify(reduced), ); }); @@ -79,7 +79,7 @@ test('reduceScript: resolution error', (t) => { }, ], }, - stringify(reduced) + stringify(reduced), ); }); @@ -96,6 +96,6 @@ test('reduceScript: invalid ResolvedScript', (t) => { type: "uncaught because the consumer isn't using TypeScript" as 'error', value: 'Another kind of value', }, - ]) + ]), ); }); diff --git a/src/lib/language/reduce.ts b/src/lib/language/reduce.ts index 581c9181..47e10fd5 100644 --- a/src/lib/language/reduce.ts +++ b/src/lib/language/reduce.ts @@ -38,9 +38,9 @@ const emptyReductionTraceNode = (range: Range) => ({ export const verifyCashAssemblyEvaluationState = < ProgramState extends AuthenticationProgramStateControlStack & AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: ProgramState + state: ProgramState, ) => { if (state.error !== undefined) { return state.error; @@ -72,15 +72,15 @@ export const reduceScript = < AuthenticationProgramStateError & AuthenticationProgramStateStack, AuthenticationProgram, - ResolvedTransaction + ResolvedTransaction, >( - resolvedScript: ResolvedScript, + resolvedScript: ResolvedScript, vm?: AuthenticationVirtualMachine< ResolvedTransaction, AuthenticationProgram, ProgramState >, - createEvaluationProgram?: (instructions: Uint8Array) => AuthenticationProgram + createEvaluationProgram?: (instructions: Uint8Array) => AuthenticationProgram, ): ScriptReductionTraceScriptNode => { const script = resolvedScript.map< ScriptReductionTraceChildNode @@ -118,7 +118,7 @@ export const reduceScript = < const reductionTrace = reduceScript( segment.value, vm, - createEvaluationProgram + createEvaluationProgram, ); if (reductionTrace.errors !== undefined) { return { @@ -129,7 +129,7 @@ export const reduceScript = < }; } const trace = vm.debug( - createEvaluationProgram(reductionTrace.bytecode) + createEvaluationProgram(reductionTrace.bytecode), ); /** @@ -174,9 +174,11 @@ export const reduceScript = < }; default: - // eslint-disable-next-line functional/no-throw-statement, @typescript-eslint/no-throw-literal + // eslint-disable-next-line functional/no-throw-statements, @typescript-eslint/no-throw-literal throw new Error( - `"${(segment as { type: string }).type}" is not a known segment type.` + `"${ + (segment as { type: string }).type + }" is not a known segment type.`, ) as never; } }); @@ -190,14 +192,11 @@ export const reduceScript = < ranges: [...all.ranges, segment.range], ...(all.errors !== undefined || segment.errors !== undefined ? { - errors: [ - ...(all.errors === undefined ? [] : all.errors), - ...(segment.errors === undefined ? [] : segment.errors), - ], + errors: [...(all.errors ?? []), ...(segment.errors ?? [])], } : undefined), }), - { bytecode: [], ranges: [] } + { bytecode: [], ranges: [] }, ); return { @@ -208,7 +207,7 @@ export const reduceScript = < range: mergeRanges( reduction.ranges, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - resolvedScript.length === 0 ? undefined : resolvedScript[0]!.range + resolvedScript.length === 0 ? undefined : resolvedScript[0]!.range, ), script, }; diff --git a/src/lib/language/resolve.spec.ts b/src/lib/language/resolve.spec.ts index 9c490bb2..4d8681bf 100644 --- a/src/lib/language/resolve.spec.ts +++ b/src/lib/language/resolve.spec.ts @@ -58,7 +58,7 @@ test('resolveScriptSegment: error on unrecognized parse results', (t) => { type: 'error', value: 'Unrecognized segment: Unknown', }, - ] + ], ); }); @@ -68,7 +68,7 @@ test('resolveScriptSegment: marks unknown identifier types', (t) => { t.fail('Parse failed.'); return; } - const malformedResolver: IdentifierResolutionFunction = () => ({ + const malformedResolver: IdentifierResolutionFunction = () => ({ bytecode: Uint8Array.of(), status: true, type: 'unknown-type' as IdentifierResolutionType.variable, @@ -86,5 +86,5 @@ test('resolveScriptSegment: marks unknown identifier types', (t) => { unknown: 'some_identifier', value: Uint8Array.of(), }, - ] as unknown as ResolvedScript); + ] as unknown as ResolvedScript); }); diff --git a/src/lib/language/resolve.ts b/src/lib/language/resolve.ts index 41220262..d619d6a2 100644 --- a/src/lib/language/resolve.ts +++ b/src/lib/language/resolve.ts @@ -4,11 +4,9 @@ import type { AuthenticationProgramStateControlStack, AuthenticationProgramStateMinimum, AuthenticationProgramStateStack, - AuthenticationTemplateVariable, CashAssemblyScriptSegment, CompilationData, CompilationResultSuccess, - CompilerConfiguration, CompilerOperation, CompilerOperationResult, IdentifierResolutionFunction, @@ -16,6 +14,7 @@ import type { Range, ResolvedScript, ResolvedSegment, + WalletTemplateVariable, } from '../lib.js'; import { bigIntToVmNumber } from '../vm/vm.js'; @@ -38,12 +37,12 @@ const pluckRange = (node: MarkedNode): Range => ({ const removeNumericSeparators = (numericLiteral: string) => numericLiteral.replace(/_/gu, ''); -export const resolveScriptSegment = ( +export const resolveScriptSegment = ( segment: CashAssemblyScriptSegment, - resolveIdentifiers: IdentifierResolutionFunction -): ResolvedScript => { + resolveIdentifiers: IdentifierResolutionFunction, +): ResolvedScript => { // eslint-disable-next-line complexity - const resolved = segment.value.map((child) => { + const resolved = segment.value.map>((child) => { const range = pluckRange(child); switch (child.name) { case 'Identifier': { @@ -59,17 +58,17 @@ export const resolveScriptSegment = ( opcode: identifier, } : result.type === IdentifierResolutionType.variable - ? { - ...('debug' in result ? { debug: result.debug } : {}), - ...('signature' in result - ? { signature: result.signature } - : {}), - variable: identifier, - } - : // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - result.type === IdentifierResolutionType.script - ? { script: identifier, source: result.source } - : ({ unknown: identifier } as never)), + ? { + ...('debug' in result ? { debug: result.debug } : {}), + ...('signature' in result + ? { signature: result.signature } + : {}), + variable: identifier, + } + : // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + result.type === IdentifierResolutionType.script + ? { script: identifier, source: result.source } + : ({ unknown: identifier } as never)), } : { ...('debug' in result ? { debug: result.debug } : {}), @@ -157,7 +156,7 @@ export enum BuiltInVariables { const attemptCompilerOperation = < CompilationContext, - Configuration extends AnyCompilerConfiguration + Configuration extends AnyCompilerConfiguration, >({ data, configuration, @@ -182,7 +181,7 @@ const attemptCompilerOperation = < }): CompilerOperationResult => { if (matchingOperations === undefined) { return { - error: `The "${variableId}" variable type can not be resolved because the "${variableType}" operation has not been included in this compiler's CompilationEnvironment.`, + error: `The "${variableId}" variable type can not be resolved because the "${variableType}" operation has not been included in this compiler's configuration.`, status: 'error', }; } @@ -221,19 +220,19 @@ const attemptCompilerOperation = < */ export const resolveVariableIdentifier = < CompilationContext, - Environment extends AnyCompilerConfiguration + Configuration extends AnyCompilerConfiguration, >({ data, configuration, identifier, }: { data: CompilationData; - configuration: Environment; + configuration: Configuration; identifier: string; }): CompilerOperationResult => { const [variableId, operationId] = identifier.split('.') as [ string, - string | undefined + string | undefined, ]; switch (variableId) { @@ -269,7 +268,7 @@ export const resolveVariableIdentifier = < variableType: 'signingSerialization', }); default: { - const expectedVariable: AuthenticationTemplateVariable | undefined = + const expectedVariable: WalletTemplateVariable | undefined = configuration.variables?.[variableId]; if (expectedVariable === undefined) { @@ -323,9 +322,9 @@ export const describeExpectedInput = (expectedArray: string[]) => { */ const EOF = 'EOF'; const newArray = expectedArray.filter((value) => value !== EOF); - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (newArray.length !== expectedArray.length) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data newArray.push('the end of the script'); } const withoutLastElement = newArray.slice(0, newArray.length - 1); @@ -337,8 +336,8 @@ export const describeExpectedInput = (expectedArray: string[]) => { newArray.length >= arrayRequiresCommas ? withoutLastElement.join(', ').concat(`, or ${lastElement}`) : newArray.length === arrayRequiresOr - ? newArray.join(' or ') - : lastElement + ? newArray.join(' or ') + : lastElement }.`; }; @@ -359,14 +358,14 @@ export const compileScriptRaw = < AuthenticationProgramStateStack = AuthenticationProgramStateControlStack & AuthenticationProgramStateMinimum & AuthenticationProgramStateStack, - CompilationContext = unknown + CompilationContext = unknown, >({ data, configuration, scriptId, }: { data: CompilationData; - configuration: CompilerConfiguration; + configuration: AnyCompilerConfiguration; scriptId: string; }): CompilationResult => { const script = configuration.scripts[scriptId]; @@ -389,7 +388,7 @@ export const compileScriptRaw = < errors: [ { error: `A circular dependency was encountered: script "${scriptId}" relies on itself to be generated. (Source scripts: ${configuration.sourceScriptIds.join( - ' β†’ ' + ' β†’ ', )})`, range: createEmptyRange(), }, @@ -437,7 +436,7 @@ export const resolveScriptIdentifier = ({ /** * the provided {@link CompilerConfiguration} */ - configuration: CompilerConfiguration; + configuration: AnyCompilerConfiguration; }): CompilationResultSuccess | string | false => { if (configuration.scripts[identifier] === undefined) { return false; @@ -453,7 +452,7 @@ export const resolveScriptIdentifier = ({ } return `Compilation error in resolved script "${identifier}": ${stringifyErrors( - result.errors + result.errors, )}`; }; @@ -465,7 +464,7 @@ export const resolveScriptIdentifier = ({ * `IdentifierResolutionFunction` will be used. */ export const createIdentifierResolver = - ({ + ({ data, configuration, }: { @@ -478,10 +477,12 @@ export const createIdentifierResolver = * A snapshot of the configuration around `scriptId`, see * {@link CompilerConfiguration} for details */ - configuration: CompilerConfiguration; - }): IdentifierResolutionFunction => + configuration: AnyCompilerConfiguration; + }): IdentifierResolutionFunction => // eslint-disable-next-line complexity - (identifier: string): ReturnType => { + ( + identifier: string, + ): ReturnType> => { const opcodeResult: Uint8Array | undefined = configuration.opcodes?.[identifier]; if (opcodeResult !== undefined) { @@ -543,7 +544,7 @@ export const createIdentifierResolver = } : { bytecode: scriptResult.bytecode, - source: scriptResult.resolve, + source: scriptResult, status: true, type: IdentifierResolutionType.script, }; @@ -563,7 +564,7 @@ export const compileScriptContents = < ProgramState extends AuthenticationProgramStateControlStack & AuthenticationProgramStateStack = AuthenticationProgramStateControlStack & AuthenticationProgramStateStack, - CompilationContext = unknown + CompilationContext = unknown, >({ data, configuration, @@ -571,7 +572,7 @@ export const compileScriptContents = < }: { script: string; data: CompilationData; - configuration: CompilerConfiguration; + configuration: AnyCompilerConfiguration; }): CompilationResult => { const parseResult = parseScript(script); if (!parseResult.status) { @@ -606,7 +607,7 @@ export const compileScriptContents = < const reduction = reduceScript( resolvedScript, configuration.vm, - configuration.createAuthenticationProgram + configuration.createAuthenticationProgram, ); return { ...(reduction.errors === undefined diff --git a/src/lib/lib.ts b/src/lib/lib.ts index 24fe911c..fde4cae9 100644 --- a/src/lib/lib.ts +++ b/src/lib/lib.ts @@ -1,12 +1,13 @@ export * from './address/address.js'; export * from './bin/bin.js'; +export * from './compiler/compiler.js'; export * from './crypto/crypto.js'; +export * from './engine/engine.js'; export * from './format/format.js'; export * from './key/key.js'; export * from './language/language.js'; export * from './message/message.js'; export * from './schema/schema.js'; -export * from './compiler/compiler.js'; export * from './transaction/transaction.js'; export * from './vm/vm.js'; export * from './vmb-tests/vmb-tests.js'; diff --git a/src/lib/mappings.spec.ts b/src/lib/mappings.spec.ts index 6d3cfb74..e33ae1f5 100644 --- a/src/lib/mappings.spec.ts +++ b/src/lib/mappings.spec.ts @@ -68,6 +68,7 @@ import { SigningSerializationTypeBCH, } from './lib.js'; +/* eslint-disable @typescript-eslint/no-duplicate-type-constituents */ type TypeTests = | AssertTypesEqual< AuthenticationProgramStateBCH, @@ -83,6 +84,7 @@ type TypeTests = | AssertTypesEqual | AssertTypesEqual; // TODO: AssertTypesEqual` +/* eslint-enable @typescript-eslint/no-duplicate-type-constituents */ test('Libauth exposes all expected mappings', (t) => { const testTypes: TypeTests = true; @@ -90,15 +92,15 @@ test('Libauth exposes all expected mappings', (t) => { t.deepEqual(AuthenticationErrorBCH2023, AuthenticationErrorBCH); t.deepEqual( cloneAuthenticationProgramStateCommon, - cloneAuthenticationProgramStateBCH + cloneAuthenticationProgramStateBCH, ); t.deepEqual( cloneAuthenticationProgramState, - cloneAuthenticationProgramStateBCH + cloneAuthenticationProgramStateBCH, ); t.deepEqual( compilerConfigurationToCompilerBCH, - compilerConfigurationToCompiler + compilerConfigurationToCompiler, ); t.deepEqual(createInstructionSetBCH2023, createInstructionSetBCH); t.deepEqual(createVirtualMachineBCH2023, createVirtualMachineBCH); diff --git a/src/lib/message/read-components.ts b/src/lib/message/read-components.ts index 0b2ec312..b162efec 100644 --- a/src/lib/message/read-components.ts +++ b/src/lib/message/read-components.ts @@ -28,7 +28,7 @@ export const readBytes = /** * the {@link ReadPosition} at which to start reading the bytes. */ - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const nextPosition: ReadPosition = { bin: position.bin, @@ -38,7 +38,7 @@ export const readBytes = if (result.length !== length) { return formatError( ReadBytesError.insufficientLength, - `Provided length: ${result.length}` + `Provided length: ${result.length}`, ); } return { position: nextPosition, result }; @@ -56,7 +56,7 @@ export enum ReadUint32LEError { * @param position - the {@link ReadPosition} at which to start reading */ export const readUint32LE = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const nextPosition: ReadPosition = { bin: position.bin, @@ -66,7 +66,7 @@ export const readUint32LE = ( if (uint32LEBin.length !== ReadConstants.bytesPerUint32) { return formatError( ReadUint32LEError.insufficientBytes, - `Provided length: ${uint32LEBin.length}` + `Provided length: ${uint32LEBin.length}`, ); } const result = binToNumberUint32LE(uint32LEBin); @@ -85,7 +85,7 @@ export enum ReadUint64LEError { * {@link Output.valueSatoshis} */ export const readUint64LE = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const nextPosition: ReadPosition = { bin: position.bin, @@ -95,7 +95,7 @@ export const readUint64LE = ( if (uint64LEBin.length !== ReadConstants.bytesPerUint64) { return formatError( ReadUint64LEError.insufficientBytes, - `Provided length: ${uint64LEBin.length}` + `Provided length: ${uint64LEBin.length}`, ); } const result = binToBigIntUint64LE(uint64LEBin); @@ -119,7 +119,7 @@ export enum CompactUintPrefixedBinError { * `CompactUint`-prefixed bin (`Uint8Array`) */ export const readCompactUintPrefixedBin = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const read = readCompactUintMinimal(position); if (typeof read === 'string') { @@ -132,7 +132,7 @@ export const readCompactUintPrefixedBin = ( if (contents.length !== length) { return formatError( CompactUintPrefixedBinError.insufficientBytes, - `Required bytes: ${length}, remaining bytes: ${contents.length}` + `Required bytes: ${length}, remaining bytes: ${contents.length}`, ); } return { position: nextPosition, result: contents }; diff --git a/src/lib/message/transaction-encoding.spec.ts b/src/lib/message/transaction-encoding.spec.ts index b1786ced..571a169e 100644 --- a/src/lib/message/transaction-encoding.spec.ts +++ b/src/lib/message/transaction-encoding.spec.ts @@ -78,14 +78,14 @@ test('decodeTransaction', (t) => { * a148ca38 ← locktime (BinUint32LE) */ const tx = hexToBin( - '3eb87070042d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e03000000066a0065525365ffffffffd14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd030000000863acac00535200527ff62cf3ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0020000000100ffffffff6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba01000000055351ac526aa3b8223d0421f25b0400000000026552f92db70500000000075253516a656a53c4a908010000000000b5192901000000000652525251516aa148ca38' + '3eb87070042d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e03000000066a0065525365ffffffffd14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd030000000863acac00535200527ff62cf3ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0020000000100ffffffff6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba01000000055351ac526aa3b8223d0421f25b0400000000026552f92db70500000000075253516a656a53c4a908010000000000b5192901000000000652525251516aa148ca38', ); t.deepEqual(decodeTransactionCommon(tx), { inputs: [ { outpointIndex: 3, outpointTransactionHash: hexToBin( - '1eca9d89dfe01a50627c0d1e8befbe005234aefee08dfec1a380009b46f9162d' + '1eca9d89dfe01a50627c0d1e8befbe005234aefee08dfec1a380009b46f9162d', ), sequenceNumber: 4294967295, unlockingBytecode: hexToBin('6a0065525365'), @@ -93,7 +93,7 @@ test('decodeTransaction', (t) => { { outpointIndex: 3, outpointTransactionHash: hexToBin( - 'fd1718e192d832ce48fca0508084186bdd410f6a0b5d9bd8ddab8b5e339a4ad1' + 'fd1718e192d832ce48fca0508084186bdd410f6a0b5d9bd8ddab8b5e339a4ad1', ), sequenceNumber: 4079810175, unlockingBytecode: hexToBin('63acac0053520052'), @@ -101,7 +101,7 @@ test('decodeTransaction', (t) => { { outpointIndex: 2, outpointTransactionHash: hexToBin( - 'e023f2ebc7f212764f6e15556b26b586801a12503930e6d5ae0e184e06d930ad' + 'e023f2ebc7f212764f6e15556b26b586801a12503930e6d5ae0e184e06d930ad', ), sequenceNumber: 4294967295, unlockingBytecode: hexToBin('00'), @@ -109,7 +109,7 @@ test('decodeTransaction', (t) => { { outpointIndex: 1, outpointTransactionHash: hexToBin( - 'ba88ff9d44fd01d1c0c0a5b416e00e79b4824606a3a70f163159b5ce3aca7362' + 'ba88ff9d44fd01d1c0c0a5b416e00e79b4824606a3a70f163159b5ce3aca7362', ), sequenceNumber: 1025685667, unlockingBytecode: hexToBin('5351ac526a'), @@ -144,7 +144,7 @@ test('encodeTransaction', (t) => { { outpointIndex: 3, outpointTransactionHash: hexToBin( - '1eca9d89dfe01a50627c0d1e8befbe005234aefee08dfec1a380009b46f9162d' + '1eca9d89dfe01a50627c0d1e8befbe005234aefee08dfec1a380009b46f9162d', ), sequenceNumber: 4294967295, unlockingBytecode: hexToBin('6a0065525365'), @@ -152,7 +152,7 @@ test('encodeTransaction', (t) => { { outpointIndex: 3, outpointTransactionHash: hexToBin( - 'fd1718e192d832ce48fca0508084186bdd410f6a0b5d9bd8ddab8b5e339a4ad1' + 'fd1718e192d832ce48fca0508084186bdd410f6a0b5d9bd8ddab8b5e339a4ad1', ), sequenceNumber: 4079810175, unlockingBytecode: hexToBin('63acac0053520052'), @@ -160,7 +160,7 @@ test('encodeTransaction', (t) => { { outpointIndex: 2, outpointTransactionHash: hexToBin( - 'e023f2ebc7f212764f6e15556b26b586801a12503930e6d5ae0e184e06d930ad' + 'e023f2ebc7f212764f6e15556b26b586801a12503930e6d5ae0e184e06d930ad', ), sequenceNumber: 4294967295, unlockingBytecode: hexToBin('00'), @@ -168,7 +168,7 @@ test('encodeTransaction', (t) => { { outpointIndex: 1, outpointTransactionHash: hexToBin( - 'ba88ff9d44fd01d1c0c0a5b416e00e79b4824606a3a70f163159b5ce3aca7362' + 'ba88ff9d44fd01d1c0c0a5b416e00e79b4824606a3a70f163159b5ce3aca7362', ), sequenceNumber: 1025685667, unlockingBytecode: hexToBin('5351ac526a'), @@ -198,8 +198,8 @@ test('encodeTransaction', (t) => { t.deepEqual( encodeTransactionCommon(tx), hexToBin( - '3eb87070042d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e03000000066a0065525365ffffffffd14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd030000000863acac00535200527ff62cf3ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0020000000100ffffffff6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba01000000055351ac526aa3b8223d0421f25b0400000000026552f92db70500000000075253516a656a53c4a908010000000000b5192901000000000652525251516aa148ca38' - ) + '3eb87070042d16f9469b0080a3c1fe8de0feae345200beef8b1e0d7c62501ae0df899dca1e03000000066a0065525365ffffffffd14a9a335e8babddd89b5d0b6a0f41dd6b18848050a0fc48ce32d892e11817fd030000000863acac00535200527ff62cf3ad30d9064e180eaed5e6303950121a8086b5266b55156e4f7612f2c7ebf223e0020000000100ffffffff6273ca3aceb55931160fa7a3064682b4790ee016b4a5c0c0d101fd449dff88ba01000000055351ac526aa3b8223d0421f25b0400000000026552f92db70500000000075253516a656a53c4a908010000000000b5192901000000000652525251516aa148ca38', + ), ); }); @@ -209,15 +209,15 @@ test('decode and encode transaction', (t) => { t.deepEqual( hexToBin(tx), encodeTransactionCommon( - decodeTransactionCommon(hexToBin(tx)) as TransactionCommon - ) + decodeTransactionCommon(hexToBin(tx)) as TransactionCommon, + ), ); }); test('decodeTransaction: invalid', (t) => { t.deepEqual( decodeTransactionCommon(hexToBin('00')), - 'Error reading transaction. Error reading Uint32LE: requires 4 bytes. Provided length: 1' + 'Error reading transaction. Error reading Uint32LE: requires 4 bytes. Provided length: 1', ); }); @@ -237,22 +237,22 @@ test('hashTransaction, hashTransactionUiOrder, hashTransactionP2pOrder', (t) => t.deepEqual(hashTransactionP2pOrder(hexToBin(tx)), hexToBin(txId).reverse()); t.deepEqual( hashTransactionP2pOrder(hexToBin(tx), sha256), - hexToBin(txId).reverse() + hexToBin(txId).reverse(), ); t.deepEqual(hashTransaction(hexToBin(halTx)), halTxId); t.deepEqual(hashTransactionUiOrder(hexToBin(halTx)), hexToBin(halTxId)); t.deepEqual( hashTransactionUiOrder(hexToBin(halTx), sha256), - hexToBin(halTxId) + hexToBin(halTxId), ); t.deepEqual( hashTransactionP2pOrder(hexToBin(halTx)), - hexToBin(halTxId).reverse() + hexToBin(halTxId).reverse(), ); t.deepEqual( hashTransactionP2pOrder(hexToBin(halTx), sha256), - hexToBin(halTxId).reverse() + hexToBin(halTxId).reverse(), ); }); @@ -295,7 +295,7 @@ test('CashTokens: token-prefix-valid.json', (t) => { return t.fail( `${failMessage} Prefix "${prefixHex}" includes unexpected bytes. Bytes remaining after read: ${ decoded.position.bin.length - decoded.position.index - }, ` + }, `, ); } return t.deepEqual(decoded.result.token, token); diff --git a/src/lib/message/transaction-encoding.ts b/src/lib/message/transaction-encoding.ts index 975b10c2..c4a1e5b7 100644 --- a/src/lib/message/transaction-encoding.ts +++ b/src/lib/message/transaction-encoding.ts @@ -64,7 +64,7 @@ export enum TransactionDecodingError { * transaction output */ export const readTransactionInput = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const inputRead = readMultiple(position, [ readBytes(TransactionConstants.outpointTransactionHashLength), @@ -103,7 +103,7 @@ export const readTransactionInput = ( * * @param inputs - the set of inputs to encode */ -export const encodeTransactionInputs = (inputs: readonly Input[]) => +export const encodeTransactionInputs = (inputs: Input[]) => flattenBinArray([ bigIntToCompactUint(BigInt(inputs.length)), ...inputs.map(encodeTransactionInput), @@ -120,7 +120,7 @@ export const encodeTransactionInputs = (inputs: readonly Input[]) => * transaction inputs */ export const readTransactionInputs = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const inputsRead = readItemCount(position, readTransactionInput); if (typeof inputsRead === 'string') { @@ -185,19 +185,19 @@ export enum CashTokenDecodingError { * token amount. */ export const readTokenAmount = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const amountRead = readCompactUintMinimal(position); if (typeof amountRead === 'string') { return formatError( CashTokenDecodingError.invalidAmountEncoding, - amountRead + amountRead, ); } if (amountRead.result > maximumTokenAmount) { return formatError( CashTokenDecodingError.excessiveAmount, - `Encoded amount: ${amountRead.result}` + `Encoded amount: ${amountRead.result}`, ); } if (amountRead.result === 0n) { @@ -220,7 +220,7 @@ export const readTokenAmount = ( */ // eslint-disable-next-line complexity export const readTokenPrefix = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult<{ token?: NonNullable }> => { const { bin, index } = position; if (bin[index] !== CashTokens.PREFIX_TOKEN) { @@ -233,7 +233,7 @@ export const readTokenPrefix = ( CashTokens.minimumPrefixLength }. Missing bytes: ${ CashTokens.minimumPrefixLength - (bin.length - index) - }` + }`, ); } const category = bin @@ -245,14 +245,14 @@ export const readTokenPrefix = ( if ((prefixStructure & CashTokens.RESERVED_BIT) !== 0) { return formatError( CashTokenDecodingError.reservedBit, - `Bitfield: 0b${tokenBitfield.toString(CashTokens.useBinaryOutput)}` + `Bitfield: 0b${tokenBitfield.toString(CashTokens.useBinaryOutput)}`, ); } const nftCapabilityInt = tokenBitfield & CashTokens.nftCapabilityMask; if (nftCapabilityInt > CashTokens.maximumCapability) { return formatError( CashTokenDecodingError.invalidCapability, - `Capability value: ${nftCapabilityInt}` + `Capability value: ${nftCapabilityInt}`, ); } const capability = nftCapabilityNumberToLabel[nftCapabilityInt]!; // eslint-disable-line @typescript-eslint/no-non-null-assertion @@ -262,7 +262,7 @@ export const readTokenPrefix = ( if (hasCommitmentLength && !hasNft) { return formatError( CashTokenDecodingError.commitmentWithoutNft, - `Bitfield: 0b${tokenBitfield.toString(CashTokens.useBinaryOutput)}` + `Bitfield: 0b${tokenBitfield.toString(CashTokens.useBinaryOutput)}`, ); } const hasAmount = (prefixStructure & CashTokens.HAS_AMOUNT) !== 0; @@ -278,7 +278,7 @@ export const readTokenPrefix = ( if (typeof commitmentRead === 'string') { return formatError( CashTokenDecodingError.invalidCommitment, - commitmentRead + commitmentRead, ); } if (hasCommitmentLength && commitmentRead.result.length === 0) { @@ -304,13 +304,13 @@ export const readTokenPrefix = ( if (capability !== NonFungibleTokenCapability.none) { return formatError( CashTokenDecodingError.capabilityWithoutNft, - `Bitfield: 0b${tokenBitfield.toString(CashTokens.useBinaryOutput)}` + `Bitfield: 0b${tokenBitfield.toString(CashTokens.useBinaryOutput)}`, ); } if (!hasAmount) { return formatError( CashTokenDecodingError.noTokens, - `Bitfield: 0b${tokenBitfield.toString(CashTokens.useBinaryOutput)}` + `Bitfield: 0b${tokenBitfield.toString(CashTokens.useBinaryOutput)}`, ); } const amountRead = readTokenAmount(nextPosition); @@ -331,7 +331,7 @@ export const readTokenPrefix = ( * optional token prefix and locking bytecode */ export const readLockingBytecodeWithPrefix = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult<{ lockingBytecode: Uint8Array; token?: NonNullable; @@ -340,7 +340,7 @@ export const readLockingBytecodeWithPrefix = ( if (typeof bytecodeRead === 'string') { return formatError( TransactionDecodingError.lockingBytecodeLength, - bytecodeRead + bytecodeRead, ); } const { result: contents, position: nextPosition } = bytecodeRead; @@ -369,7 +369,7 @@ export const readLockingBytecodeWithPrefix = ( * transaction output */ export const readTransactionOutput = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const outputRead = readMultiple(position, [ readUint64LE, @@ -462,7 +462,7 @@ export const encodeTransactionOutput = (output: Output) => { * transaction outputs */ export const readTransactionOutputs = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const outputsRead = readItemCount(position, readTransactionOutput); if (typeof outputsRead === 'string') { @@ -480,7 +480,7 @@ export const readTransactionOutputs = ( * * @param outputs - the set of outputs to encode */ -export const encodeTransactionOutputs = (outputs: readonly Output[]) => +export const encodeTransactionOutputs = (outputs: Output[]) => flattenBinArray([ bigIntToCompactUint(BigInt(outputs.length)), ...outputs.map(encodeTransactionOutput), @@ -497,7 +497,7 @@ export const encodeTransactionOutputs = (outputs: readonly Output[]) => * {@link TransactionCommon} */ export const readTransactionCommon = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const transactionRead = readMultiple(position, [ readUint32LE, @@ -521,7 +521,7 @@ export const readTransactionCommon = ( export const readTransaction = readTransactionCommon; export const readTransactionOutputNonTokenAware = ( - pos: ReadPosition + pos: ReadPosition, ): MaybeReadResult => { const outputRead = readMultiple(pos, [ readUint64LE, @@ -541,7 +541,7 @@ export const readTransactionOutputNonTokenAware = ( }; export const readTransactionOutputsNonTokenAware = ( - pos: ReadPosition + pos: ReadPosition, ): MaybeReadResult => { const outputsRead = readItemCount(pos, readTransactionOutputNonTokenAware); if (typeof outputsRead === 'string') { @@ -564,7 +564,7 @@ export const readTransactionOutputsNonTokenAware = ( * {@link TransactionCommon} */ export const readTransactionNonTokenAware = ( - position: ReadPosition + position: ReadPosition, ): MaybeReadResult => { const transactionRead = readMultiple(position, [ readUint32LE, @@ -596,7 +596,7 @@ export const readTransactionNonTokenAware = ( * @param bin - the encoded transaction to decode */ export const decodeTransactionCommon = ( - bin: Uint8Array + bin: Uint8Array, ): TransactionCommon | string => { const transactionRead = readTransactionCommon({ bin, index: 0 }); if (typeof transactionRead === 'string') { @@ -609,7 +609,7 @@ export const decodeTransactionCommon = ( transactionRead.position.index - 1 }, leaving ${ bin.length - transactionRead.position.index - } remaining bytes.` + } remaining bytes.`, ); } return transactionRead.result; @@ -628,11 +628,11 @@ export const decodeTransaction = decodeTransactionBCH; * @param bin - the raw message to decode */ export const decodeTransactionUnsafeCommon = ( - bin: Uint8Array + bin: Uint8Array, ): TransactionCommon => { const result = decodeTransactionCommon(bin); if (typeof result === 'string') { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new Error(result); } return result; @@ -655,10 +655,13 @@ export const encodeTransactionCommon = (tx: TransactionCommon) => export const encodeTransactionBCH = encodeTransactionCommon; export const encodeTransaction = encodeTransactionBCH; +/** + * @deprecated use `structuredClone` instead + */ export const cloneTransactionInputsCommon = < - Transaction extends TransactionCommon + Transaction extends TransactionCommon, >( - inputs: Readonly['inputs'] + inputs: Transaction['inputs'], ) => inputs.map((input) => ({ outpointIndex: input.outpointIndex, @@ -667,10 +670,13 @@ export const cloneTransactionInputsCommon = < unlockingBytecode: input.unlockingBytecode.slice(), })); +/** + * @deprecated use `structuredClone` instead + */ export const cloneTransactionOutputsCommon = < - Transaction extends TransactionCommon + Transaction extends TransactionCommon, >( - outputs: Readonly['outputs'] + outputs: Transaction['outputs'], ) => outputs.map((output) => ({ lockingBytecode: output.lockingBytecode.slice(), @@ -693,8 +699,11 @@ export const cloneTransactionOutputsCommon = < valueSatoshis: output.valueSatoshis, })); +/** + * @deprecated use `structuredClone` instead + */ export const cloneTransactionCommon = ( - transaction: Readonly + transaction: Transaction, ) => ({ inputs: cloneTransactionInputsCommon(transaction.inputs), locktime: transaction.locktime, @@ -716,7 +725,7 @@ export const cloneTransactionCommon = ( */ export const hashTransactionP2pOrder = ( transaction: Uint8Array, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => hash256(transaction, sha256); /** @@ -733,7 +742,7 @@ export const hashTransactionP2pOrder = ( */ export const hashTransactionUiOrder = ( transaction: Uint8Array, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => hashTransactionP2pOrder(transaction, sha256).reverse(); /** @@ -754,18 +763,18 @@ export const hashTransaction = (transaction: Uint8Array) => * @param inputs - the series of inputs from which to extract the outpoints */ export const encodeTransactionOutpoints = ( - inputs: readonly { + inputs: { outpointIndex: number; outpointTransactionHash: Uint8Array; - }[] + }[], ) => flattenBinArray( inputs.map((i) => flattenBinArray([ i.outpointTransactionHash.slice().reverse(), numberToBinUint32LE(i.outpointIndex), - ]) - ) + ]), + ), ); /** @@ -775,9 +784,8 @@ export const encodeTransactionOutpoints = ( * * @param outputs - the array of outputs to encode */ -export const encodeTransactionOutputsForSigning = ( - outputs: readonly Output[] -) => flattenBinArray(outputs.map(encodeTransactionOutput)); +export const encodeTransactionOutputsForSigning = (outputs: Output[]) => + flattenBinArray(outputs.map(encodeTransactionOutput)); /** * Encode the sequence numbers of an array of transaction inputs for use in @@ -787,5 +795,5 @@ export const encodeTransactionOutputsForSigning = ( * numbers */ export const encodeTransactionInputSequenceNumbersForSigning = ( - inputs: readonly { sequenceNumber: number }[] + inputs: { sequenceNumber: number }[], ) => flattenBinArray(inputs.map((i) => numberToBinUint32LE(i.sequenceNumber))); diff --git a/src/lib/message/transaction-types.ts b/src/lib/message/transaction-types.ts index 225f00ab..2a298d4d 100644 --- a/src/lib/message/transaction-types.ts +++ b/src/lib/message/transaction-types.ts @@ -13,10 +13,10 @@ import type { * bytes ({@link Input.outpointTransactionHash}) - this allows for * JSON-compatible types to be used rather than the default `Uint8Array`. */ -export interface Input< +export type Input< Bytecode = Uint8Array, - ByteStringRepresentation = Uint8Array -> { + ByteStringRepresentation = Uint8Array, +> = { /** * The index of the output in the transaction from which this input is spent. * @@ -116,7 +116,7 @@ export interface Input< * A.K.A. `scriptSig` or "unlocking script" */ unlockingBytecode: Bytecode; -} +}; /** * The capability assigned to a particular non-fungible token. @@ -146,10 +146,11 @@ export enum NonFungibleTokenCapability { * - this allows for JSON-compatible types to be used rather than the * default `Uint8Array`. */ -export interface Output< +export type Output< Bytecode = Uint8Array, - ByteStringRepresentation = Uint8Array -> { + ByteStringRepresentation = Uint8Array, + NumericRepresentation = bigint, +> = { /** * The bytecode used to encumber this transaction output. To spend the output, * unlocking bytecode must be included in a transaction input that – when @@ -172,7 +173,7 @@ export interface Output< * maximum token amount (`9223372036854775807`), this value is encoded as * a `bigint`. */ - amount: bigint; + amount: NumericRepresentation; /** * The 32-byte ID of the token category to which the token(s) in this output * belong in big-endian byte order. This is the byte order typically seen in @@ -207,7 +208,7 @@ export interface Output< * (`9007199254740991`) is about 4 times larger than the maximum number of * satoshis that should ever exist. I.e. even if all satoshis were * consolidated into a single output, the transaction spending this output - * could still be defined with a numeric `satoshis` value. + * could still be defined with a numeric `valueSatoshis`. * * However, because the encoded output format for version 1 and 2 transactions * (used in both transaction encoding and signing serialization) uses a 64-bit @@ -228,8 +229,8 @@ export interface Output< * {@link valueSatoshisToBin} and {@link binToValueSatoshis}, * respectively. */ - valueSatoshis: bigint; -} + valueSatoshis: NumericRepresentation; +}; /** * The maximum uint64 value – an impossibly large, intentionally invalid value @@ -242,7 +243,7 @@ export const excessiveSatoshis = Uint8Array.from([255, 255, 255, 255, 255, 255, /** * Data type representing a transaction. */ -export interface TransactionCommon { +export type TransactionCommon = { /** * An array of inputs included in this transaction. * @@ -303,12 +304,9 @@ export interface TransactionCommon { * of `4294967295`. Since BIP68, most transactions use a version of `2`. */ version: number; -} +}; -export interface CompilationDirectiveLocking< - CompilerType, - CompilationDataType -> { +export type CompilationDirectiveLocking = { /** * The {@link Compiler} with which to generate bytecode. */ @@ -321,36 +319,34 @@ export interface CompilationDirectiveLocking< * The script ID to compile. */ script: string; -} +}; -export interface CompilationDirectiveUnlocking< - CompilerType, - CompilationDataType -> extends CompilationDirectiveLocking { - /** - * The `satoshis` value of the {@link Output} being spent by this input. - * Required for use in signing serializations. - */ - valueSatoshis: Output['valueSatoshis']; +export type CompilationDirectiveUnlocking = + CompilationDirectiveLocking & { + /** + * The value in satoshis of the {@link Output} being spent by this input. + * Required for use in signing serializations. + */ + valueSatoshis: Output['valueSatoshis']; - /** - * The CashToken contents of this input. This property is only defined if the - * input contains one or more tokens. For details, see - * `CHIP-2022-02-CashTokens`. - */ - token?: Output['token']; -} + /** + * The CashToken contents of this input. This property is only defined if the + * input contains one or more tokens. For details, see + * `CHIP-2022-02-CashTokens`. + */ + token?: Output['token']; + }; -export interface CompilationDirectiveUnlockingEstimate< +export type CompilationDirectiveUnlockingEstimate< CompilerType, - CompilationDataType -> extends CompilationDirectiveUnlocking { + CompilationDataType, +> = CompilationDirectiveUnlocking & { /** * The scenario ID that can be used to estimate the final size of this * unlocking script. This is required when using fee estimation. */ estimate: string; -} +}; /** * An input that may optionally use a {@link CompilationDirectiveUnlocking} as @@ -363,7 +359,7 @@ export interface CompilationDirectiveUnlockingEstimate< export type InputTemplate< CompilerType, RequireEstimate = false, - CompilationDataType = CompilationData + CompilationDataType = CompilationData, > = Input< | Uint8Array | (RequireEstimate extends true @@ -383,7 +379,7 @@ export type InputTemplate< export type OutputTemplate< CompilerType, EnableFeeEstimation = false, - CompilationDataType = CompilationData + CompilationDataType = CompilationData, > = Output< CompilationDirectiveLocking | Uint8Array, EnableFeeEstimation extends true ? Uint8Array | undefined : Uint8Array @@ -402,7 +398,7 @@ export type OutputTemplate< export type TransactionTemplate< CompilerType, EnableFeeEstimation = false, - CompilationDataType = CompilationData + CompilationDataType = CompilationData, > = TransactionCommon< InputTemplate, OutputTemplate @@ -442,7 +438,7 @@ export type TransactionTemplateEstimated = TransactionTemplate< * An error resulting from unsuccessful bytecode generation. Includes the * generation type (`locking` or `unlocking`), and the output or input index */ -export interface BytecodeGenerationErrorBase { +export type BytecodeGenerationErrorBase = { /** * The type of bytecode that was being generated when this error occurred. */ @@ -455,24 +451,24 @@ export interface BytecodeGenerationErrorBase { * If the error occurred after the `parse` stage, the resolved script is * provided for analysis or processing (e.g. `getResolvedBytecode`). */ - resolved?: ResolvedScript; + resolved?: ResolvedScript; /** * The compilation errors that occurred while generating this bytecode. */ errors: CompilationError[]; -} +}; -export interface BytecodeGenerationErrorLocking - extends BytecodeGenerationErrorBase { - type: 'locking'; -} +export type BytecodeGenerationErrorLocking = + BytecodeGenerationErrorBase & { + type: 'locking'; + }; -export interface BytecodeGenerationErrorUnlocking - extends BytecodeGenerationErrorBase { - type: 'unlocking'; -} +export type BytecodeGenerationErrorUnlocking = + BytecodeGenerationErrorBase & { + type: 'unlocking'; + }; -export interface BytecodeGenerationCompletionBase { +export type BytecodeGenerationCompletionBase = { /** * If `output`, this bytecode was generated for the output at `index` (a * `lockingBytecode`). If `input`, the bytecode was generated for the input at @@ -483,25 +479,25 @@ export interface BytecodeGenerationCompletionBase { * The index of the input or output for which this bytecode was generated. */ index: number; -} +}; -export interface BytecodeGenerationCompletionInput - extends BytecodeGenerationCompletionBase { - type: 'input'; - /** - * The successfully generated Input. - */ - input: Input; -} +export type BytecodeGenerationCompletionInput = + BytecodeGenerationCompletionBase & { + type: 'input'; + /** + * The successfully generated Input. + */ + input: Input; + }; -export interface BytecodeGenerationCompletionOutput - extends BytecodeGenerationCompletionBase { - type: 'output'; - /** - * The successfully generated Output. - */ - output: Output; -} +export type BytecodeGenerationCompletionOutput = + BytecodeGenerationCompletionBase & { + type: 'output'; + /** + * The successfully generated Output. + */ + output: Output; + }; /** * A successfully generated `lockingBytecode` (for an output) or @@ -516,16 +512,16 @@ export type BytecodeGenerationCompletion = | BytecodeGenerationCompletionInput | BytecodeGenerationCompletionOutput; -export interface TransactionGenerationSuccess { +export type TransactionGenerationSuccess = { success: true; transaction: TransactionCommon; -} +}; -export type TransactionGenerationError = +export type TransactionGenerationError = | { success: false; completions: BytecodeGenerationCompletionInput[]; - errors: BytecodeGenerationErrorUnlocking[]; + errors: BytecodeGenerationErrorUnlocking[]; /** * Error(s) occurred at the `input` stage of compilation, meaning the * `output` stage completed successfully. @@ -535,7 +531,7 @@ export type TransactionGenerationError = | { success: false; completions: BytecodeGenerationCompletionOutput[]; - errors: BytecodeGenerationErrorLocking[]; + errors: BytecodeGenerationErrorLocking[]; /** * Error(s) occurred at the `output` stage of compilation, so the `input` * stage never began. @@ -543,6 +539,6 @@ export type TransactionGenerationError = stage: 'outputs'; }; -export type TransactionGenerationAttempt = - | TransactionGenerationError +export type TransactionGenerationAttempt = + | TransactionGenerationError | TransactionGenerationSuccess; diff --git a/src/lib/schema/ajv/ajv-types.d.ts b/src/lib/schema/ajv/ajv-types.d.ts index 9d4c829f..9c62e39e 100644 --- a/src/lib/schema/ajv/ajv-types.d.ts +++ b/src/lib/schema/ajv/ajv-types.d.ts @@ -1,14 +1,14 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -export interface AjvError< +export type AjvError< Keyword = string, - Params = { [paramName: string]: number | string } -> { + Params = { [paramName: string]: number | string }, +> = { keyword: Keyword; instancePath: string; schemaPath: string; params: Params; message: string; -} +}; export type LibauthAjvError = | AjvError<'additionalProperties', { additionalProperty: string }> @@ -19,8 +19,8 @@ export type LibauthAjvError = * Note: these types cover only Libauth use cases; other `ajv` error types are * possible using other settings. */ -// eslint-disable-next-line functional/no-mixed-type -export interface AjvValidator { +// eslint-disable-next-line functional/no-mixed-types +export type AjvValidator = { ( data: unknown, dataCxt?: { @@ -28,7 +28,7 @@ export interface AjvValidator { parentData: any; parentDataProperty: any; rootData?: any; - } + }, ): data is T; errors?: LibauthAjvError[] | null; -} +}; diff --git a/src/lib/schema/ajv/ajv-utils.ts b/src/lib/schema/ajv/ajv-utils.ts index 424911fc..e501cce6 100644 --- a/src/lib/schema/ajv/ajv-utils.ts +++ b/src/lib/schema/ajv/ajv-utils.ts @@ -1,25 +1,35 @@ +import { lossyNormalize } from '../../format/format.js'; + import type { AjvValidator, LibauthAjvError } from './ajv-types.js'; -import AuthenticationTemplateValidator from './validate-authentication-template.js'; +import walletTemplateValidator from './validate-wallet-template.js'; const avjErrorsToDescription = (errors: LibauthAjvError[]): string => // TODO: translate instancePath errors.map((error) => `${error.instancePath}: ${error.message}`).join(','); +/** + * Given an untrusted JSON string or object and an AJV validator, verify that + * the untrusted value is of the expected shape. Note, this method first + * normalizes all characters in the input using `Normalization Form KC` + * (Compatibility Decomposition, followed by Canonical Composition). + */ export const ajvStandaloneJsonParse = ( untrustedJsonOrObject: unknown, - validator: AjvValidator + validator: AjvValidator, ) => { - // eslint-disable-next-line functional/no-try-statement + // eslint-disable-next-line functional/no-try-statements try { - const parsed = + const stringified = typeof untrustedJsonOrObject === 'string' - ? (JSON.parse(untrustedJsonOrObject) as unknown) - : untrustedJsonOrObject; + ? untrustedJsonOrObject + : JSON.stringify(untrustedJsonOrObject); + const normalized = lossyNormalize(stringified); + const parsed = JSON.parse(normalized) as unknown; if (validator(parsed)) { return parsed; } // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - return avjErrorsToDescription(AuthenticationTemplateValidator.errors!); + return avjErrorsToDescription(walletTemplateValidator.errors!); } catch (e) { return `Invalid JSON. ${String(e)}`; } diff --git a/src/lib/schema/ajv/validate-authentication-template.d.ts b/src/lib/schema/ajv/validate-bcmr.d.ts similarity index 51% rename from src/lib/schema/ajv/validate-authentication-template.d.ts rename to src/lib/schema/ajv/validate-bcmr.d.ts index e03fe425..c9fed47a 100644 --- a/src/lib/schema/ajv/validate-authentication-template.d.ts +++ b/src/lib/schema/ajv/validate-bcmr.d.ts @@ -1,7 +1,7 @@ -import type { AuthenticationTemplate } from '../../lib.js'; +import type { MetadataRegistry } from '../../lib.js'; import type { AjvValidator } from './ajv-types.js'; -declare const validator: AjvValidator; +declare const validator: AjvValidator; // eslint-disable-next-line import/no-default-export export default validator; diff --git a/src/lib/schema/ajv/validate-bcmr.js b/src/lib/schema/ajv/validate-bcmr.js new file mode 100644 index 00000000..beb00041 --- /dev/null +++ b/src/lib/schema/ajv/validate-bcmr.js @@ -0,0 +1,6004 @@ +export default validate20; +const schema22 = { + $ref: '#/definitions/MetadataRegistry', + $schema: 'http://json-schema.org/draft-07/schema#', + definitions: { + ChainHistory: { + $ref: '#/definitions/RegistryTimestampKeyedValues', + description: + "A block height-keyed map of {@link ChainSnapshot } s documenting the evolution of a particular chain/network's identity. Like {@link IdentityHistory } , this structure allows wallets and other user interfaces to offer better experiences when a chain identity is rebranded, redenominated, or other important metadata is modified in a coordinated update.", + }, + ChainSnapshot: { + additionalProperties: false, + description: + "A snapshot of the metadata for a particular chain/network at a specific time. This allows for registries to provide similar metadata for each chain's native currency unit (name, description, symbol, icon, etc.) as can be provided for other registered tokens.", + properties: { + description: { + description: + 'A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details.', + }, + name: { + description: + 'The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.', + type: 'string', + }, + splitId: { + description: + "The split ID of this identity's chain of record.\n\nIf undefined, defaults to {@link MetadataRegistry.defaultChain } .", + type: 'string', + }, + status: { + description: + 'The status of this identity, must be `active`, `inactive`, or `burned`. If omitted, defaults to `active`.\n- Identities with an `active` status should be actively tracked by clients.\n- Identities with an `inactive` status may be considered for archival by clients and may be removed in future registry versions.\n- Identities with a `burned` status have been destroyed by setting the latest identity output to a data-carrier output (`OP_RETURN`), permanently terminating the authchain. Clients should archive burned identities and – if the burned identity represented a token type – consider burning any remaining tokens of that category to reclaim funds from those outputs.', + enum: ['active', 'burned', 'inactive'], + type: 'string', + }, + tags: { + description: + "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + items: { type: 'string' }, + type: 'array', + }, + token: { + additionalProperties: false, + description: + "A data structure indicating how the chain's native currency units should be displayed in user interfaces.", + properties: { + decimals: { + description: + 'An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this native currency.\n\nThis is the number of digits that can appear after the decimal separator in currency amounts. For a currency with a `symbol` of `SYMBOL` and a `decimals` of `2`, an amount of `12345` should be displayed as `123.45 SYMBOL`.\n\nIf omitted, defaults to `0`.', + type: 'number', + }, + symbol: { + description: + 'An abbreviation used to uniquely identity this native currency unit.\n\nSymbols must be comprised only of capital letters, numbers, and dashes (`-`). This can be validated with the regular expression: `/^[-A-Z0-9]+$/`.', + type: 'string', + }, + }, + required: ['symbol'], + type: 'object', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`.', + }, + }, + required: ['name', 'token'], + type: 'object', + }, + Extensions: { + additionalProperties: { + anyOf: [ + { type: 'string' }, + { additionalProperties: { type: 'string' }, type: 'object' }, + { + additionalProperties: { + additionalProperties: { type: 'string' }, + type: 'object', + }, + type: 'object', + }, + ], + }, + description: + "A mapping of extension identifiers to extension definitions. Extensions may be widely standardized or application-specific, and extension definitions must be either:\n\n- `string`s,\n- key-value mappings of `string`s, or\n- two-dimensional, key-value mappings of `string`s.\n\nThis limitation encourages safety and wider compatibility across implementations.\n\nTo encode an array, it is recommended that each value be assigned to a numeric key indicating the item's index (beginning at `0`). Numerically-indexed objects are often a more useful and resilient data-transfer format than simple arrays because they simplify difference-only transmission: only modified indexes need to be transferred, and shifts in item order must be explicit, simplifying merges of conflicting updates.\n\nFor encoding of more complex data, consider using base64 and/or string-encoded JSON.", + type: 'object', + }, + IdentityHistory: { + $ref: '#/definitions/RegistryTimestampKeyedValues', + description: + "A timestamp-keyed map of {@link IdentitySnapshot } s documenting the evolution of a particular identity. The current identity information is the snapshot associated with the latest timestamp reached. If no timestamp has yet been reached, the snapshot of the oldest timestamp is considered current. Future-dated timestamps indicate planned migrations.\n\nThis strategy allows wallets and other user interfaces to offer better experiences when an identity is rebranded, a token redenominated, or other important metadata is modified in a coordinated update. For example, a wallet may warn token holders of a forthcoming rebranding of fungible tokens they hold; after the change, the wallet may continue to offer prominent interface hints that the rebranded token identity was recently updated.\n\nTimestamps may be order by time via lexicographical sort. For determinism, it is recommended that implementations sort from newest to oldest in exported registry JSON files.\n\nIf the current snapshot's {@link IdentitySnapshot.migrated } isn't specified, the snapshot's index is a precise time at which the snapshot takes effect and clients should begin using the new information. If `migrated` is specified, the snapshot's index is the timestamp at which the transition is considered to begin, see {@link IdentitySnapshot.migrated } for details.\n\nEach timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.\n\nIn the case that an identity change occurs due to on-chain activity (e.g. an on-chain migration that is set to complete at a particular locktime value), registry-recorded timestamps reflect the real-world time at which the maintainer of the registry believes the on-chain activity to have actually occurred. Likewise, future-dated timestamps indicate a precise real-world time at which a snapshot is estimated to take effect, rather than the Median Time Past (BIP113) UNIX timestamp or another on-chain measurement of time.", + }, + IdentitySnapshot: { + additionalProperties: false, + description: + 'A snapshot of the metadata for a particular identity at a specific time.', + properties: { + description: { + description: + 'A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details.', + }, + migrated: { + description: + "The timestamp at which this identity snapshot is fully in effect. This value should only be provided if the snapshot takes effect over a period of time (e.g. an in-circulation token identity is gradually migrating to a new category). In these cases, clients should gradually migrate to using the new information beginning after the identity snapshot's timestamp and the `migrated` time.\n\nThis timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.", + type: 'string', + }, + name: { + description: + 'The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.', + type: 'string', + }, + splitId: { + description: + "The split ID of this identity's chain of record.\n\nIf undefined, defaults to {@link MetadataRegistry.defaultChain } .", + type: 'string', + }, + status: { + description: + 'The status of this identity, must be `active`, `inactive`, or `burned`. If omitted, defaults to `active`.\n- Identities with an `active` status should be actively tracked by clients.\n- Identities with an `inactive` status may be considered for archival by clients and may be removed in future registry versions.\n- Identities with a `burned` status have been destroyed by setting the latest identity output to a data-carrier output (`OP_RETURN`), permanently terminating the authchain. Clients should archive burned identities and – if the burned identity represented a token type – consider burning any remaining tokens of that category to reclaim funds from those outputs.', + enum: ['active', 'burned', 'inactive'], + type: 'string', + }, + tags: { + description: + "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + items: { type: 'string' }, + type: 'array', + }, + token: { + $ref: '#/definitions/TokenCategory', + description: + 'If this identity is a type of token, a data structure indicating how tokens should be understood and displayed in user interfaces. Omitted for non-token identities.', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`.', + }, + }, + required: ['name'], + type: 'object', + }, + MetadataRegistry: { + additionalProperties: false, + description: + 'A Bitcoin Cash Metadata Registry is an authenticated JSON file containing metadata about tokens, identities, contract applications, and other on-chain artifacts. BCMRs conform to the Bitcoin Cash Metadata Registry JSON Schema, and they can be published and maintained by any entity or individual.', + properties: { + $schema: { + description: + 'The schema used by this registry. Many JSON editors can automatically provide inline documentation and autocomplete support using the `$schema` property, so it is recommended that registries include it. E.g.: `https://cashtokens.org/bcmr-v2.schema.json`', + type: 'string', + }, + chains: { + additionalProperties: { $ref: '#/definitions/ChainHistory' }, + description: + 'A map of split IDs tracked by this registry to the {@link ChainHistory } for that chain/network.\n\nThe split ID of a chain is the block header hash (A.K.A. block ID) of the first unique block after the most recent tracked split – a split after which both resulting chains are considered notable or tracked by the registry. (For chains with no such splits, this is the ID of the genesis block.)\n\nNote, split ID is inherently a "relative" identifier. After a tracked split, both resulting chains will have a new split ID. However, if a wallet has not yet heard about a particular split, that wallet will continue to reference one of the resulting chains by its previous split ID, and the split-unaware wallet may create transactions that are valid on both chains (losing claimable value if the receivers of their transactions don\'t acknowledge transfers on both chains). When a registry trusted by the wallet notes the split in it\'s `chains` map, the wallet can represent the split in the user interface using the the latest {@link ChainSnapshot } for each chain and splitting coins prior to spending (by introducing post-split coins in each transaction).\n\nThis map may exclude the following well-known split IDs (all clients supporting any of these chains should build-in {@link ChainHistory } for those chains):\n\n- `0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce`: A.K.A. mainnet – the BCH side of the BCH/XEC split.\n- `00000000ae25e85d9e22cd6c8d72c2f5d4b0222289d801b7f633aeae3f8c6367`: A.K.A testnet4 – the test network on which CHIPs are activated simultaneously with mainnet (May 15 at 12 UTC).\n- `00000000040ba9641ba98a37b2e5ceead38e4e2930ac8f145c8094f94c708727`: A.K.A. chipnet – the test network on which CHIPs are activated 6 months before mainnet (November 15 at 12 UTC).\n\nAll other split IDs referenced by this registry should be included in this map.', + type: 'object', + }, + defaultChain: { + description: + 'The split ID of the chain/network considered the "default" chain for this registry. Identities that do not specify a {@link IdentitySnapshot.splitId } are assumed to be set to this split ID. For a description of split IDs, see {@link MetadataRegistry.chains } .\n\nIf not provided, the `defaultChain` is `0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce`, the BCH side of the BCH/XEC split (mainnet). Common values include:\n- `00000000ae25e85d9e22cd6c8d72c2f5d4b0222289d801b7f633aeae3f8c6367` (testnet4)\n- `00000000040ba9641ba98a37b2e5ceead38e4e2930ac8f145c8094f94c708727` (chipnet)', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `Registry` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `Registry`s include the `locale` extension. See https://github.com/bitjson/chip-bcmr#locales-extension for details.', + }, + identities: { + additionalProperties: { $ref: '#/definitions/IdentityHistory' }, + description: + "A mapping of authbases to the `IdentityHistory` for that identity.\n\nAn authbase is a 32-byte, hex-encoded transaction hash (A.K.A. TXID) for which the zeroth-descendant transaction chain (ZDTC) authenticates and publishes an identity's claimed metadata.\n\nIdentities may represent metadata registries, specific types of tokens, companies, organizations, individuals, or other on-chain entities.", + type: 'object', + }, + latestRevision: { + description: + 'The timestamp of the latest revision made to this registry version. The timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.', + type: 'string', + }, + license: { + description: + 'The license under which this registry is published. This may be specified as either a SPDX short identifier (https://spdx.org/licenses/) or by including the full text of the license.\n\nCommon values include: - `CC0-1.0`: https://creativecommons.org/publicdomain/zero/1.0/ - `MIT`: https://opensource.org/licenses/MIT', + type: 'string', + }, + registryIdentity: { + anyOf: [ + { $ref: '#/definitions/OffChainRegistryIdentity' }, + { type: 'string' }, + ], + description: + "The identity information of this particular registry, provided as either an authbase (recommended) or an `IdentitySnapshot`.\n\nAn authbase is a 32-byte, hex-encoded transaction hash (A.K.A. TXID) for which the zeroth-descendant transaction chain (ZDTC) authenticates and publishes all registry updates. If an authbase is provided, the registry's identity information can be found in `identities[authbase]`, and clients should immediately attempt to verify the registry's identity on-chain. (See https://github.com/bitjson/chip-bcmr#chain-resolved-registries)\n\nIf an `IdentitySnapshot` is provided directly, this registry does not support on-chain resolution/authentication, and the contained `IdentitySnapshot` can only be authenticated via DNS/HTTPS.", + }, + tags: { + additionalProperties: { $ref: '#/definitions/Tag' }, + description: + 'A map of registry-specific `Tag`s used by this registry to convey information about identities it tracks.\n\nTags allow registries to group identities into collections of related identities, marking characteristics or those identities. Tags are standardized within a registry and may represent either labels applied by that registry (e.g. `individual`, `organization`, `token`, `wallet`, `exchange`, `staking`, `utility-token`, `security-token`, `stablecoin`, `wrapped`, `collectable`, `deflationary`, `governance`, `decentralized-exchange`, `liquidity-provider`, `sidechain`, `sidechain-bridge`, etc.) or designations by external authorities (certification, membership, ownership, etc.) that are tracked by that registry.\n\nTags may be used by clients in search, discover, and filtering of identities, and they can also convey information like accreditation from investor protection organizations, public certifications by security or financial auditors, and other designations that signal legitimacy and value to users.', + type: 'object', + }, + version: { + additionalProperties: false, + description: + 'The version of this registry. Versioning adheres to Semantic Versioning (https://semver.org/).', + properties: { + major: { + description: + 'The major version is incremented when an identity is removed.', + type: 'number', + }, + minor: { + description: + 'The minor version is incremented when an identity is added or a new identity snapshot is added.', + type: 'number', + }, + patch: { + description: + 'The patch version is incremented when an existing identity or identity snapshot is modified (e.g. to correct an error or add a missing piece of information) or when other registry properties (e.g. registry `name`, `description`, `uris`, etc.) are modified.\n\nGenerally, substantive changes to an existing identity should be made using a new identity snapshot in a minor version upgrade – this allows clients to provide a better user experience by noting the change in relevant user interfaces.\n\nFor example, patch upgrades might include spelling corrections in an existing snapshot or the addition of an `icon` containing a higher-resolution version of an existing `icon` image. On the other hand, a rebranding in which the icon is substantially changed may warrant a new identity snapshot to be added in a minor version upgrade.', + type: 'number', + }, + }, + required: ['major', 'minor', 'patch'], + type: 'object', + }, + }, + required: ['version', 'latestRevision', 'registryIdentity'], + type: 'object', + }, + NftCategory: { + additionalProperties: false, + description: + 'A definition specifying the non-fungible token information for a token category.', + properties: { + description: { + description: + 'A string describing how this identity uses NFTs (for use in user interfaces). Descriptions longer than `160` characters may be elided in some interfaces.\n\nE.g.:\n- "ACME DEX NFT order receipts are issued when you place orders on the decentralized exchange. After orders are processed, order receipts can be redeemed for purchased tokens or sales proceeds.";\n- "ACME Game collectable NFTs unlock unique playable content, user avatars, and item skins in ACME Game Online."; etc.', + type: 'string', + }, + fields: { + $ref: '#/definitions/NftCategoryField', + description: + 'A mapping of field identifier to field definitions for the data fields that can appear in NFT commitments of this category.\n\nCategories including only sequential NFTs (where `parse.bytecode` is undefined) should omit `fields` (or set to `undefined`).', + }, + parse: { + anyOf: [ + { $ref: '#/definitions/ParsableNftCollection' }, + { $ref: '#/definitions/SequentialNftCollection' }, + ], + description: + 'Parsing and interpretation information for all NFTs of this category; this enables generalized wallets to parse and display detailed information about all NFTs held by the wallet, e.g. `BCH Pledged`, `Order Price`, `Seat Number`, `Asset Number`, `IPFS Content Identifier`, `HTTPS URL`, etc.\n\nParsing instructions are provided in the `bytecode` property, and the results are interpreted using the `types` property.', + }, + }, + required: ['parse'], + type: 'object', + }, + NftCategoryField: { + additionalProperties: { + additionalProperties: false, + properties: { + description: { + description: + 'A string describing how this identity uses NFTs (for use in user interfaces). Descriptions longer than `160` characters may be elided in some interfaces.\n\nE.g.:\n- `The BCH value pledged at the time this receipt was issued.`\n- `The number of tokens sold in this order.`\n- `The seat number associated with this ticket.`', + type: 'string', + }, + encoding: { + anyOf: [ + { + additionalProperties: false, + properties: { + type: { + enum: [ + 'binary', + 'boolean', + 'hex', + 'https-url', + 'ipfs-cid', + 'utf8', + 'locktime', + ], + type: 'string', + }, + }, + required: ['type'], + type: 'object', + }, + { + additionalProperties: false, + properties: { + aggregate: { + const: 'add', + description: + "The `aggregate` property indicates that aggregating this field from multiple NFTs is desirable in user interfaces. For example, for a field named `BCH Pledged` where `aggregate` is `add`, the client can display a `Total BCH Pledged` in any user interface listing more than one NFT.\n\nIf specified, clients should aggregate the field from all NFTs, of all NFT types within the category, within a particular view (e.g. NFTs held by a single wallet, NFTs existing in a single transaction's outputs, etc.) using the specified operation.\n\nNote, while aggregation could be performed using any commutative operation – multiplication, bitwise AND, bitwise OR, bitwise XOR, etc. – only `add` is currently supported.", + type: 'string', + }, + decimals: { + description: + 'An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this token field.\n\nThis is the number of digits that can appear after the decimal separator in amounts. For a field with a `decimals` of `2`, a value of `123456` should be displayed as `1234.56`.\n\nIf omitted, defaults to `0`.', + type: 'number', + }, + type: { const: 'number', type: 'string' }, + unit: { + description: + "The unit in which this field is denominated, taking the `decimals` value into account. If representing fungible token amount, this will often be the symbol of the represented token category.\n\nE.g. `BCH`, `sats`, `AcmeUSD`, etc.\n\nIf not provided, clients should not represent this field as having a unit beyond the field's `name`.", + type: 'string', + }, + }, + required: ['type'], + type: 'object', + }, + ], + description: + 'The expected encoding of this field when read from the parsing altstack (see {@link ParsableNftCollection } ). All encoding definitions must have a `type`, and some encoding definitions allow for additional hinting about display strategies in clients.\n\nEncoding types may be set to `binary`, `boolean`, `hex`, `number`, or `utf8`:\n\n- `binary` types should be displayed as binary literals (e.g. `0b0101`)\n- `boolean` types should be displayed as `true` if exactly `0x01` or `false` if exactly `0x00`. If a boolean value does not match one of these values, clients should represent the NFT as unable to be parsed (e.g. simply display the full `commitment`).\n- `hex` types should be displayed as hex literals (e.g.`0xabcd`).\n- `https-url` types are percent encoded with the `https://` prefix omitted; they may be displayed as URIs or as activatable links.\n- `ipfs-cid` types are binary-encoded IPFS Content Identifiers; they may be displayed as URIs or as activatable links.\n- `locktime` types are `OP_TXLOCKTIME` results: integers from `0` to `4294967295` (inclusive) where values less than `500000000` are understood to be a block height (the current block number in the chain, beginning from block `0`), and values greater than or equal to `500000000` are understood to be a Median Time Past (BIP113) UNIX timestamp. (Note, sequence age is not currently supported.)\n- `number` types should be displayed according the their configured `decimals` and `unit` values.\n- `utf8` types should be displayed as utf8 strings.', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of NFT field extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.', + }, + name: { + description: + 'The name of this field for use in interfaces. Names longer than `20` characters may be elided in some interfaces.\n\nE.g.:\n- `BCH Pledged`\n- `Tokens Sold`\n- `Settlement Locktime`\n- `Seat Number`,\n- `IPFS Content Identifier`\n- `HTTPS URL`', + type: 'string', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this NFT field. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.', + }, + }, + required: ['encoding'], + type: 'object', + }, + description: + 'A definition specifying a field that can be encoded in non-fungible tokens of a token category.', + type: 'object', + }, + NftType: { + additionalProperties: false, + description: 'A definition for one type of NFT within a token category.', + properties: { + description: { + description: + 'A string describing this NFT type for use in user interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- "Receipts issued by the exchange to record details about purchases. After settlement, these receipts are redeemed for the purchased tokens.";\n- "Receipts issued by the crowdfunding campaign to document the value of funds pledged. If the user decides to cancel their pledge before the campaign completes, these receipts can be redeemed for a full refund.";\n- "Tickets issued for events at ACME Stadium.";\n- Sealed ballots certified by ACME decentralized organization during the voting period. After the voting period ends, these ballots must be revealed to reclaim the tokens used for voting."', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of NFT type extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.', + }, + fields: { + description: + "A list of identifiers for fields contained in NFTs of this type. On successful parsing evaluations, the bottom item on the altstack indicates the matched NFT type, and the remaining altstack items represent NFT field contents in the order listed (where `fields[0]` is the second-to-bottom item, and the final item in `fields` is the top of the altstack).\n\nFields should be ordered by recommended importance from most important to least important; in user interfaces, clients should display fields at lower indexes more prominently than those at higher indexes, e.g. if some fields cannot be displayed in minimized interfaces, higher-importance fields can still be represented. (Note, this ordering is controlled by the bytecode specified in `token.nft.parse.bytecode`.)\n\nIf this is a sequential NFT, (the category's `parse.bytecode` is undefined), `fields` should be omitted or set to `undefined`.", + items: { type: 'string' }, + type: 'array', + }, + name: { + description: + 'The name of this NFT type for use in interfaces. Names longer than `20` characters may be elided in some interfaces.\n\nE.g. `Market Order Buys`, `Limit Order Sales`, `Pledge Receipts`, `ACME Stadium Tickets`, `Sealed Votes`, etc.', + type: 'string', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this NFT type. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.', + }, + }, + required: ['name'], + type: 'object', + }, + OffChainRegistryIdentity: { + additionalProperties: false, + description: + 'An identity representing a metadata registry that is not published on-chain and therefore has no authbase or trackable authchain.', + properties: { + description: { + description: + 'A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details.', + }, + name: { + description: + 'The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.', + type: 'string', + }, + tags: { + description: + "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + items: { type: 'string' }, + type: 'array', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`.', + }, + }, + required: ['name'], + type: 'object', + }, + ParsableNftCollection: { + additionalProperties: false, + description: + 'Interpretation information for a collection of parsable NFTs, a collection in which each NFT may include additional metadata fields beyond a sequential identifier within its on-chain commitment. Note that {@link ParsableNftCollection } s differ from {@link SequentialNftCollection } s in that parsable collections require a parsing `bytecode` with which to inspect each NFT commitment: the type of each NFT is indexed by the hex-encoded contents the bottom item on the altstack following the evaluation of the parsing bytecode.', + properties: { + bytecode: { + description: + "A segment of hex-encoded Bitcoin Cash VM bytecode that parses UTXOs holding NFTs of this category, identifies the NFT's type within the category, and returns a list of the NFT's field values via the altstack. If undefined, this NFT Category includes only sequential NFTs, with only an identifier and no NFT fields encoded in each NFT's on-chain commitment.\n\nThe parse `bytecode` is evaluated by instantiating and partially verifying a standardized NFT parsing transaction:\n- version: `2`\n- inputs: - 0: Spends the UTXO containing the NFT with an empty unlocking bytecode and sequence number of `0`. - 1: Spends index `0` of the empty hash outpoint, with locking bytecode set to `parse.bytecode`, unlocking bytecode `OP_1` (`0x51`) and sequence number `0`.\n- outputs: - 0: A locking bytecode of OP_RETURN (`0x6a`) and value of `0`.\n- locktime: `0`\n\nAfter input 1 of this NFT parsing transaction is evaluated, if the resulting stack is not valid (a single \"truthy\" element remaining on the stack) – or if the altstack is empty – parsing has failed and clients should represent the NFT as unable to be parsed (e.g. simply display the full `commitment` as a hex-encoded value in the user interface).\n\nOn successful parsing evaluations, the bottom item on the altstack indicates the type of the NFT according to the matching definition in `types`. If no match is found, clients should represent the NFT as unable to be parsed.\n\nFor example: `00d2517f7c6b` (OP_0 OP_UTXOTOKENCOMMITMENT OP_1 OP_SPLIT OP_SWAP OP_TOALTSTACK OP_TOALTSTACK) splits the commitment after 1 byte, pushing the first byte to the altstack as an NFT type identifier and the remaining segment of the commitment as the first NFT field value.\n\nIf undefined (in a {@link SequentialNftCollection } ), this field could be considered to have a default value of `00d26b` (OP_0 OP_UTXOTOKENCOMMITMENT OP_TOALTSTACK), which takes the full contents of the commitment as a fixed type index. As such, each index of the NFT category's `types` maps a precise commitment value to the metadata for NFTs with that particular commitment. E.g. an NFT with an empty commitment (VM number 0) maps to `types['']`, a commitment of `01` (hex) maps to `types['01']`, etc. This pattern is used for collections of sequential NFTs.", + type: 'string', + }, + types: { + additionalProperties: { + $ref: '#/definitions/NftType', + description: + 'A definitions for each type of NFT within the token category. Parsable NFT types are indexed by the hex-encoded value of the bottom altstack item following evaluation of `NftCategory.parse.bytecode`. The remaining altstack items are mapped to NFT fields according to the `fields` property of the matching NFT type.', + }, + description: + 'A mapping of hex-encoded values to definitions of possible NFT types in this category.', + type: 'object', + }, + }, + required: ['bytecode', 'types'], + type: 'object', + }, + 'RegistryTimestampKeyedValues': { + additionalProperties: { $ref: '#/definitions/ChainSnapshot' }, + description: + 'A field keyed by timestamps to document the evolution of the field. Each timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.\n\nFor example, to insert a new value: ```ts const result = { ...previousValue, [(new Date()).toISOString()]: newValue }; ```', + type: 'object', + }, + 'RegistryTimestampKeyedValues': { + additionalProperties: { $ref: '#/definitions/IdentitySnapshot' }, + description: + 'A field keyed by timestamps to document the evolution of the field. Each timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.\n\nFor example, to insert a new value: ```ts const result = { ...previousValue, [(new Date()).toISOString()]: newValue }; ```', + type: 'object', + }, + SequentialNftCollection: { + additionalProperties: false, + description: + 'Interpretation information for a collection of sequential NFTs, a collection in which each NFT includes only a sequential identifier within its on-chain commitment. Note that {@link SequentialNftCollection } s differ from {@link ParsableNftCollection } s in that sequential collections lack a parsing `bytecode` with which to inspect each NFT commitment: the type of each NFT is indexed by the full contents its commitment (interpreted as a positive VM integer in user interfaces).', + properties: { + types: { + additionalProperties: { + $ref: '#/definitions/NftType', + description: + 'Interpretation information for each type of NFT within the token category, indexed by commitment hex. For sequential NFTs, the on-chain commitment of each NFT is interpreted as a VM number to reference its particular NFT type in user interfaces. Issuing a sequential NFT with a negative or invalid VM number is discouraged, but clients may render the commitment of such NFTs in hex-encoded form, prefixed with `X`.', + }, + description: + 'A mapping of each NFT commitment (typically, a positive integer encoded as a VM number) to metadata for that NFT type in this category.', + type: 'object', + }, + }, + required: ['types'], + type: 'object', + }, + Tag: { + additionalProperties: false, + description: + 'Tags allow registries to classify and group identities by a variety of characteristics. Tags are standardized within a registry and may represent either labels applied by that registry or designations by external authorities (certification, membership, ownership, etc.) that are tracked by that registry.\n\nExamples of possible tags include: `individual`, `organization`, `token`, `wallet`, `exchange`, `staking`, `utility-token`, `security-token`, `stablecoin`, `wrapped`, `collectable`, `deflationary`, `governance`, `decentralized-exchange`, `liquidity-provider`, `sidechain`, `sidechain-bridge`, `acme-audited`, `acme-endorsed`, etc.\n\nTags may be used by clients in search, discovery, and filtering of identities, and they can also convey information like accreditation from investor protection organizations, public certifications by security or financial auditors, and other designations that signal integrity and value to users.', + properties: { + description: { + description: + 'A string describing this tag for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `An identity maintained by a single individual.`\n- `An identity representing a type of token.`\n- `An on-chain application that has passed security audits by ACME, Inc.`', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `Tag` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.', + }, + name: { + description: + 'The name of this tag for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g.:\n- `Individual`\n- `Token`\n- `Audited by ACME, Inc.`', + type: 'string', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this tag. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all tags:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`.', + }, + }, + required: ['name'], + type: 'object', + }, + TokenCategory: { + additionalProperties: false, + description: + "A definition specifying information about an identity's token category.", + properties: { + category: { + description: + "The current token category used by this identity. Often, this will be equal to the identity's authbase, but some token identities must migrate to new categories for technical reasons.", + type: 'string', + }, + decimals: { + description: + 'An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this token category.\n\nThis is the number of digits that can appear after the decimal separator in fungible token amounts. For a token category with a `symbol` of `SYMBOL` and a `decimals` of `2`, a fungible token amount of `12345` should be displayed as `123.45 SYMBOL`.\n\nIf omitted, defaults to `0`.', + type: 'number', + }, + nfts: { + $ref: '#/definitions/NftCategory', + description: + 'Display information for non-fungible tokens (NFTs) of this identity. Omitted for token categories without NFTs.', + }, + symbol: { + description: + 'An abbreviation used to uniquely identity this token category.\n\nSymbols must be comprised only of capital letters, numbers, and dashes (`-`). This can be validated with the regular expression: `/^[-A-Z0-9]+$/`.', + type: 'string', + }, + }, + required: ['category', 'symbol'], + type: 'object', + }, + URIs: { + additionalProperties: { type: 'string' }, + description: + 'A mapping of identifiers to URIs associated with an entity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix – e.g. `https://` or `ipfs://`., Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.', + type: 'object', + }, + }, +}; +const schema23 = { + additionalProperties: false, + description: + 'A Bitcoin Cash Metadata Registry is an authenticated JSON file containing metadata about tokens, identities, contract applications, and other on-chain artifacts. BCMRs conform to the Bitcoin Cash Metadata Registry JSON Schema, and they can be published and maintained by any entity or individual.', + properties: { + $schema: { + description: + 'The schema used by this registry. Many JSON editors can automatically provide inline documentation and autocomplete support using the `$schema` property, so it is recommended that registries include it. E.g.: `https://cashtokens.org/bcmr-v2.schema.json`', + type: 'string', + }, + chains: { + additionalProperties: { $ref: '#/definitions/ChainHistory' }, + description: + 'A map of split IDs tracked by this registry to the {@link ChainHistory } for that chain/network.\n\nThe split ID of a chain is the block header hash (A.K.A. block ID) of the first unique block after the most recent tracked split – a split after which both resulting chains are considered notable or tracked by the registry. (For chains with no such splits, this is the ID of the genesis block.)\n\nNote, split ID is inherently a "relative" identifier. After a tracked split, both resulting chains will have a new split ID. However, if a wallet has not yet heard about a particular split, that wallet will continue to reference one of the resulting chains by its previous split ID, and the split-unaware wallet may create transactions that are valid on both chains (losing claimable value if the receivers of their transactions don\'t acknowledge transfers on both chains). When a registry trusted by the wallet notes the split in it\'s `chains` map, the wallet can represent the split in the user interface using the the latest {@link ChainSnapshot } for each chain and splitting coins prior to spending (by introducing post-split coins in each transaction).\n\nThis map may exclude the following well-known split IDs (all clients supporting any of these chains should build-in {@link ChainHistory } for those chains):\n\n- `0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce`: A.K.A. mainnet – the BCH side of the BCH/XEC split.\n- `00000000ae25e85d9e22cd6c8d72c2f5d4b0222289d801b7f633aeae3f8c6367`: A.K.A testnet4 – the test network on which CHIPs are activated simultaneously with mainnet (May 15 at 12 UTC).\n- `00000000040ba9641ba98a37b2e5ceead38e4e2930ac8f145c8094f94c708727`: A.K.A. chipnet – the test network on which CHIPs are activated 6 months before mainnet (November 15 at 12 UTC).\n\nAll other split IDs referenced by this registry should be included in this map.', + type: 'object', + }, + defaultChain: { + description: + 'The split ID of the chain/network considered the "default" chain for this registry. Identities that do not specify a {@link IdentitySnapshot.splitId } are assumed to be set to this split ID. For a description of split IDs, see {@link MetadataRegistry.chains } .\n\nIf not provided, the `defaultChain` is `0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce`, the BCH side of the BCH/XEC split (mainnet). Common values include:\n- `00000000ae25e85d9e22cd6c8d72c2f5d4b0222289d801b7f633aeae3f8c6367` (testnet4)\n- `00000000040ba9641ba98a37b2e5ceead38e4e2930ac8f145c8094f94c708727` (chipnet)', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `Registry` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `Registry`s include the `locale` extension. See https://github.com/bitjson/chip-bcmr#locales-extension for details.', + }, + identities: { + additionalProperties: { $ref: '#/definitions/IdentityHistory' }, + description: + "A mapping of authbases to the `IdentityHistory` for that identity.\n\nAn authbase is a 32-byte, hex-encoded transaction hash (A.K.A. TXID) for which the zeroth-descendant transaction chain (ZDTC) authenticates and publishes an identity's claimed metadata.\n\nIdentities may represent metadata registries, specific types of tokens, companies, organizations, individuals, or other on-chain entities.", + type: 'object', + }, + latestRevision: { + description: + 'The timestamp of the latest revision made to this registry version. The timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.', + type: 'string', + }, + license: { + description: + 'The license under which this registry is published. This may be specified as either a SPDX short identifier (https://spdx.org/licenses/) or by including the full text of the license.\n\nCommon values include: - `CC0-1.0`: https://creativecommons.org/publicdomain/zero/1.0/ - `MIT`: https://opensource.org/licenses/MIT', + type: 'string', + }, + registryIdentity: { + anyOf: [ + { $ref: '#/definitions/OffChainRegistryIdentity' }, + { type: 'string' }, + ], + description: + "The identity information of this particular registry, provided as either an authbase (recommended) or an `IdentitySnapshot`.\n\nAn authbase is a 32-byte, hex-encoded transaction hash (A.K.A. TXID) for which the zeroth-descendant transaction chain (ZDTC) authenticates and publishes all registry updates. If an authbase is provided, the registry's identity information can be found in `identities[authbase]`, and clients should immediately attempt to verify the registry's identity on-chain. (See https://github.com/bitjson/chip-bcmr#chain-resolved-registries)\n\nIf an `IdentitySnapshot` is provided directly, this registry does not support on-chain resolution/authentication, and the contained `IdentitySnapshot` can only be authenticated via DNS/HTTPS.", + }, + tags: { + additionalProperties: { $ref: '#/definitions/Tag' }, + description: + 'A map of registry-specific `Tag`s used by this registry to convey information about identities it tracks.\n\nTags allow registries to group identities into collections of related identities, marking characteristics or those identities. Tags are standardized within a registry and may represent either labels applied by that registry (e.g. `individual`, `organization`, `token`, `wallet`, `exchange`, `staking`, `utility-token`, `security-token`, `stablecoin`, `wrapped`, `collectable`, `deflationary`, `governance`, `decentralized-exchange`, `liquidity-provider`, `sidechain`, `sidechain-bridge`, etc.) or designations by external authorities (certification, membership, ownership, etc.) that are tracked by that registry.\n\nTags may be used by clients in search, discover, and filtering of identities, and they can also convey information like accreditation from investor protection organizations, public certifications by security or financial auditors, and other designations that signal legitimacy and value to users.', + type: 'object', + }, + version: { + additionalProperties: false, + description: + 'The version of this registry. Versioning adheres to Semantic Versioning (https://semver.org/).', + properties: { + major: { + description: + 'The major version is incremented when an identity is removed.', + type: 'number', + }, + minor: { + description: + 'The minor version is incremented when an identity is added or a new identity snapshot is added.', + type: 'number', + }, + patch: { + description: + 'The patch version is incremented when an existing identity or identity snapshot is modified (e.g. to correct an error or add a missing piece of information) or when other registry properties (e.g. registry `name`, `description`, `uris`, etc.) are modified.\n\nGenerally, substantive changes to an existing identity should be made using a new identity snapshot in a minor version upgrade – this allows clients to provide a better user experience by noting the change in relevant user interfaces.\n\nFor example, patch upgrades might include spelling corrections in an existing snapshot or the addition of an `icon` containing a higher-resolution version of an existing `icon` image. On the other hand, a rebranding in which the icon is substantially changed may warrant a new identity snapshot to be added in a minor version upgrade.', + type: 'number', + }, + }, + required: ['major', 'minor', 'patch'], + type: 'object', + }, + }, + required: ['version', 'latestRevision', 'registryIdentity'], + type: 'object', +}; +const schema26 = { + additionalProperties: { + anyOf: [ + { type: 'string' }, + { additionalProperties: { type: 'string' }, type: 'object' }, + { + additionalProperties: { + additionalProperties: { type: 'string' }, + type: 'object', + }, + type: 'object', + }, + ], + }, + description: + "A mapping of extension identifiers to extension definitions. Extensions may be widely standardized or application-specific, and extension definitions must be either:\n\n- `string`s,\n- key-value mappings of `string`s, or\n- two-dimensional, key-value mappings of `string`s.\n\nThis limitation encourages safety and wider compatibility across implementations.\n\nTo encode an array, it is recommended that each value be assigned to a numeric key indicating the item's index (beginning at `0`). Numerically-indexed objects are often a more useful and resilient data-transfer format than simple arrays because they simplify difference-only transmission: only modified indexes need to be transferred, and shifts in item order must be explicit, simplifying merges of conflicting updates.\n\nFor encoding of more complex data, consider using base64 and/or string-encoded JSON.", + type: 'object', +}; +const func4 = Object.prototype.hasOwnProperty; +const schema24 = { + additionalProperties: { $ref: '#/definitions/ChainSnapshot' }, + description: + 'A field keyed by timestamps to document the evolution of the field. Each timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.\n\nFor example, to insert a new value: ```ts const result = { ...previousValue, [(new Date()).toISOString()]: newValue }; ```', + type: 'object', +}; +const schema25 = { + additionalProperties: false, + description: + "A snapshot of the metadata for a particular chain/network at a specific time. This allows for registries to provide similar metadata for each chain's native currency unit (name, description, symbol, icon, etc.) as can be provided for other registered tokens.", + properties: { + description: { + description: + 'A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details.', + }, + name: { + description: + 'The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.', + type: 'string', + }, + splitId: { + description: + "The split ID of this identity's chain of record.\n\nIf undefined, defaults to {@link MetadataRegistry.defaultChain } .", + type: 'string', + }, + status: { + description: + 'The status of this identity, must be `active`, `inactive`, or `burned`. If omitted, defaults to `active`.\n- Identities with an `active` status should be actively tracked by clients.\n- Identities with an `inactive` status may be considered for archival by clients and may be removed in future registry versions.\n- Identities with a `burned` status have been destroyed by setting the latest identity output to a data-carrier output (`OP_RETURN`), permanently terminating the authchain. Clients should archive burned identities and – if the burned identity represented a token type – consider burning any remaining tokens of that category to reclaim funds from those outputs.', + enum: ['active', 'burned', 'inactive'], + type: 'string', + }, + tags: { + description: + "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + items: { type: 'string' }, + type: 'array', + }, + token: { + additionalProperties: false, + description: + "A data structure indicating how the chain's native currency units should be displayed in user interfaces.", + properties: { + decimals: { + description: + 'An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this native currency.\n\nThis is the number of digits that can appear after the decimal separator in currency amounts. For a currency with a `symbol` of `SYMBOL` and a `decimals` of `2`, an amount of `12345` should be displayed as `123.45 SYMBOL`.\n\nIf omitted, defaults to `0`.', + type: 'number', + }, + symbol: { + description: + 'An abbreviation used to uniquely identity this native currency unit.\n\nSymbols must be comprised only of capital letters, numbers, and dashes (`-`). This can be validated with the regular expression: `/^[-A-Z0-9]+$/`.', + type: 'string', + }, + }, + required: ['symbol'], + type: 'object', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`.', + }, + }, + required: ['name', 'token'], + type: 'object', +}; +const schema27 = { + additionalProperties: { type: 'string' }, + description: + 'A mapping of identifiers to URIs associated with an entity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix – e.g. `https://` or `ipfs://`., Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.', + type: 'object', +}; +function validate23( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if ( + (data.name === undefined && (missing0 = 'name')) || + (data.token === undefined && (missing0 = 'token')) + ) { + validate23.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if ( + !( + key0 === 'description' || + key0 === 'extensions' || + key0 === 'name' || + key0 === 'splitId' || + key0 === 'status' || + key0 === 'tags' || + key0 === 'token' || + key0 === 'uris' + ) + ) { + validate23.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.description !== undefined) { + const _errs2 = errors; + if (typeof data.description !== 'string') { + validate23.errors = [ + { + instancePath: instancePath + '/description', + schemaPath: '#/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.extensions !== undefined) { + let data1 = data.extensions; + const _errs4 = errors; + const _errs5 = errors; + if (errors === _errs5) { + if ( + data1 && + typeof data1 == 'object' && + !Array.isArray(data1) + ) { + for (const key1 in data1) { + let data2 = data1[key1]; + const _errs8 = errors; + const _errs9 = errors; + let valid3 = false; + const _errs10 = errors; + if (typeof data2 !== 'string') { + const err0 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/0/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } + var _valid0 = _errs10 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs12 = errors; + if (errors === _errs12) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key2 in data2) { + const _errs15 = errors; + if (typeof data2[key2] !== 'string') { + const err1 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + } + var valid4 = _errs15 === errors; + if (!valid4) { + break; + } + } + } else { + const err2 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + } + var _valid0 = _errs12 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs17 = errors; + if (errors === _errs17) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key3 in data2) { + let data4 = data2[key3]; + const _errs20 = errors; + if (errors === _errs20) { + if ( + data4 && + typeof data4 == 'object' && + !Array.isArray(data4) + ) { + for (const key4 in data4) { + const _errs23 = errors; + if (typeof data4[key4] !== 'string') { + const err3 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid6 = _errs23 === errors; + if (!valid6) { + break; + } + } + } else { + const err4 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var valid5 = _errs20 === errors; + if (!valid5) { + break; + } + } + } else { + const err5 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } + } + var _valid0 = _errs17 === errors; + valid3 = valid3 || _valid0; + } + } + if (!valid3) { + const err6 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + validate23.errors = vErrors; + return false; + } else { + errors = _errs9; + if (vErrors !== null) { + if (_errs9) { + vErrors.length = _errs9; + } else { + vErrors = null; + } + } + } + var valid2 = _errs8 === errors; + if (!valid2) { + break; + } + } + } else { + validate23.errors = [ + { + instancePath: instancePath + '/extensions', + schemaPath: '#/definitions/Extensions/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.name !== undefined) { + const _errs25 = errors; + if (typeof data.name !== 'string') { + validate23.errors = [ + { + instancePath: instancePath + '/name', + schemaPath: '#/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs25 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.splitId !== undefined) { + const _errs27 = errors; + if (typeof data.splitId !== 'string') { + validate23.errors = [ + { + instancePath: instancePath + '/splitId', + schemaPath: '#/properties/splitId/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs27 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.status !== undefined) { + let data8 = data.status; + const _errs29 = errors; + if (typeof data8 !== 'string') { + validate23.errors = [ + { + instancePath: instancePath + '/status', + schemaPath: '#/properties/status/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + if ( + !( + data8 === 'active' || + data8 === 'burned' || + data8 === 'inactive' + ) + ) { + validate23.errors = [ + { + instancePath: instancePath + '/status', + schemaPath: '#/properties/status/enum', + keyword: 'enum', + params: { + allowedValues: schema25.properties.status.enum, + }, + message: 'must be equal to one of the allowed values', + }, + ]; + return false; + } + var valid0 = _errs29 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.tags !== undefined) { + let data9 = data.tags; + const _errs31 = errors; + if (errors === _errs31) { + if (Array.isArray(data9)) { + var valid7 = true; + const len0 = data9.length; + for (let i0 = 0; i0 < len0; i0++) { + const _errs33 = errors; + if (typeof data9[i0] !== 'string') { + validate23.errors = [ + { + instancePath: instancePath + '/tags/' + i0, + schemaPath: '#/properties/tags/items/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid7 = _errs33 === errors; + if (!valid7) { + break; + } + } + } else { + validate23.errors = [ + { + instancePath: instancePath + '/tags', + schemaPath: '#/properties/tags/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }, + ]; + return false; + } + } + var valid0 = _errs31 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.token !== undefined) { + let data11 = data.token; + const _errs35 = errors; + if (errors === _errs35) { + if ( + data11 && + typeof data11 == 'object' && + !Array.isArray(data11) + ) { + let missing1; + if ( + data11.symbol === undefined && + (missing1 = 'symbol') + ) { + validate23.errors = [ + { + instancePath: instancePath + '/token', + schemaPath: '#/properties/token/required', + keyword: 'required', + params: { missingProperty: missing1 }, + message: + "must have required property '" + + missing1 + + "'", + }, + ]; + return false; + } else { + const _errs37 = errors; + for (const key5 in data11) { + if ( + !(key5 === 'decimals' || key5 === 'symbol') + ) { + validate23.errors = [ + { + instancePath: instancePath + '/token', + schemaPath: + '#/properties/token/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key5 }, + message: + 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs37 === errors) { + if (data11.decimals !== undefined) { + let data12 = data11.decimals; + const _errs38 = errors; + if ( + !( + typeof data12 == 'number' && + isFinite(data12) + ) + ) { + validate23.errors = [ + { + instancePath: + instancePath + '/token/decimals', + schemaPath: + '#/properties/token/properties/decimals/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid8 = _errs38 === errors; + } else { + var valid8 = true; + } + if (valid8) { + if (data11.symbol !== undefined) { + const _errs40 = errors; + if (typeof data11.symbol !== 'string') { + validate23.errors = [ + { + instancePath: + instancePath + '/token/symbol', + schemaPath: + '#/properties/token/properties/symbol/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid8 = _errs40 === errors; + } else { + var valid8 = true; + } + } + } + } + } else { + validate23.errors = [ + { + instancePath: instancePath + '/token', + schemaPath: '#/properties/token/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs35 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.uris !== undefined) { + let data14 = data.uris; + const _errs42 = errors; + const _errs43 = errors; + if (errors === _errs43) { + if ( + data14 && + typeof data14 == 'object' && + !Array.isArray(data14) + ) { + for (const key6 in data14) { + const _errs46 = errors; + if (typeof data14[key6] !== 'string') { + validate23.errors = [ + { + instancePath: + instancePath + + '/uris/' + + key6 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/URIs/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid10 = _errs46 === errors; + if (!valid10) { + break; + } + } + } else { + validate23.errors = [ + { + instancePath: instancePath + '/uris', + schemaPath: '#/definitions/URIs/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs42 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } + } + } + } + } else { + validate23.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate23.errors = vErrors; + return errors === 0; +} +function validate22( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + for (const key0 in data) { + const _errs2 = errors; + if ( + !validate23(data[key0], { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1'), + parentData: data, + parentDataProperty: key0, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate23.errors + : vErrors.concat(validate23.errors); + errors = vErrors.length; + } + var valid0 = _errs2 === errors; + if (!valid0) { + break; + } + } + } else { + validate22.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate22.errors = vErrors; + return errors === 0; +} +const schema29 = { + additionalProperties: { $ref: '#/definitions/IdentitySnapshot' }, + description: + 'A field keyed by timestamps to document the evolution of the field. Each timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.\n\nFor example, to insert a new value: ```ts const result = { ...previousValue, [(new Date()).toISOString()]: newValue }; ```', + type: 'object', +}; +const schema30 = { + additionalProperties: false, + description: + 'A snapshot of the metadata for a particular identity at a specific time.', + properties: { + description: { + description: + 'A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details.', + }, + migrated: { + description: + "The timestamp at which this identity snapshot is fully in effect. This value should only be provided if the snapshot takes effect over a period of time (e.g. an in-circulation token identity is gradually migrating to a new category). In these cases, clients should gradually migrate to using the new information beginning after the identity snapshot's timestamp and the `migrated` time.\n\nThis timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.", + type: 'string', + }, + name: { + description: + 'The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.', + type: 'string', + }, + splitId: { + description: + "The split ID of this identity's chain of record.\n\nIf undefined, defaults to {@link MetadataRegistry.defaultChain } .", + type: 'string', + }, + status: { + description: + 'The status of this identity, must be `active`, `inactive`, or `burned`. If omitted, defaults to `active`.\n- Identities with an `active` status should be actively tracked by clients.\n- Identities with an `inactive` status may be considered for archival by clients and may be removed in future registry versions.\n- Identities with a `burned` status have been destroyed by setting the latest identity output to a data-carrier output (`OP_RETURN`), permanently terminating the authchain. Clients should archive burned identities and – if the burned identity represented a token type – consider burning any remaining tokens of that category to reclaim funds from those outputs.', + enum: ['active', 'burned', 'inactive'], + type: 'string', + }, + tags: { + description: + "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + items: { type: 'string' }, + type: 'array', + }, + token: { + $ref: '#/definitions/TokenCategory', + description: + 'If this identity is a type of token, a data structure indicating how tokens should be understood and displayed in user interfaces. Omitted for non-token identities.', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`.', + }, + }, + required: ['name'], + type: 'object', +}; +const schema32 = { + additionalProperties: false, + description: + "A definition specifying information about an identity's token category.", + properties: { + category: { + description: + "The current token category used by this identity. Often, this will be equal to the identity's authbase, but some token identities must migrate to new categories for technical reasons.", + type: 'string', + }, + decimals: { + description: + 'An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this token category.\n\nThis is the number of digits that can appear after the decimal separator in fungible token amounts. For a token category with a `symbol` of `SYMBOL` and a `decimals` of `2`, a fungible token amount of `12345` should be displayed as `123.45 SYMBOL`.\n\nIf omitted, defaults to `0`.', + type: 'number', + }, + nfts: { + $ref: '#/definitions/NftCategory', + description: + 'Display information for non-fungible tokens (NFTs) of this identity. Omitted for token categories without NFTs.', + }, + symbol: { + description: + 'An abbreviation used to uniquely identity this token category.\n\nSymbols must be comprised only of capital letters, numbers, and dashes (`-`). This can be validated with the regular expression: `/^[-A-Z0-9]+$/`.', + type: 'string', + }, + }, + required: ['category', 'symbol'], + type: 'object', +}; +const schema33 = { + additionalProperties: false, + description: + 'A definition specifying the non-fungible token information for a token category.', + properties: { + description: { + description: + 'A string describing how this identity uses NFTs (for use in user interfaces). Descriptions longer than `160` characters may be elided in some interfaces.\n\nE.g.:\n- "ACME DEX NFT order receipts are issued when you place orders on the decentralized exchange. After orders are processed, order receipts can be redeemed for purchased tokens or sales proceeds.";\n- "ACME Game collectable NFTs unlock unique playable content, user avatars, and item skins in ACME Game Online."; etc.', + type: 'string', + }, + fields: { + $ref: '#/definitions/NftCategoryField', + description: + 'A mapping of field identifier to field definitions for the data fields that can appear in NFT commitments of this category.\n\nCategories including only sequential NFTs (where `parse.bytecode` is undefined) should omit `fields` (or set to `undefined`).', + }, + parse: { + anyOf: [ + { $ref: '#/definitions/ParsableNftCollection' }, + { $ref: '#/definitions/SequentialNftCollection' }, + ], + description: + 'Parsing and interpretation information for all NFTs of this category; this enables generalized wallets to parse and display detailed information about all NFTs held by the wallet, e.g. `BCH Pledged`, `Order Price`, `Seat Number`, `Asset Number`, `IPFS Content Identifier`, `HTTPS URL`, etc.\n\nParsing instructions are provided in the `bytecode` property, and the results are interpreted using the `types` property.', + }, + }, + required: ['parse'], + type: 'object', +}; +const schema34 = { + additionalProperties: { + additionalProperties: false, + properties: { + description: { + description: + 'A string describing how this identity uses NFTs (for use in user interfaces). Descriptions longer than `160` characters may be elided in some interfaces.\n\nE.g.:\n- `The BCH value pledged at the time this receipt was issued.`\n- `The number of tokens sold in this order.`\n- `The seat number associated with this ticket.`', + type: 'string', + }, + encoding: { + anyOf: [ + { + additionalProperties: false, + properties: { + type: { + enum: [ + 'binary', + 'boolean', + 'hex', + 'https-url', + 'ipfs-cid', + 'utf8', + 'locktime', + ], + type: 'string', + }, + }, + required: ['type'], + type: 'object', + }, + { + additionalProperties: false, + properties: { + aggregate: { + const: 'add', + description: + "The `aggregate` property indicates that aggregating this field from multiple NFTs is desirable in user interfaces. For example, for a field named `BCH Pledged` where `aggregate` is `add`, the client can display a `Total BCH Pledged` in any user interface listing more than one NFT.\n\nIf specified, clients should aggregate the field from all NFTs, of all NFT types within the category, within a particular view (e.g. NFTs held by a single wallet, NFTs existing in a single transaction's outputs, etc.) using the specified operation.\n\nNote, while aggregation could be performed using any commutative operation – multiplication, bitwise AND, bitwise OR, bitwise XOR, etc. – only `add` is currently supported.", + type: 'string', + }, + decimals: { + description: + 'An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this token field.\n\nThis is the number of digits that can appear after the decimal separator in amounts. For a field with a `decimals` of `2`, a value of `123456` should be displayed as `1234.56`.\n\nIf omitted, defaults to `0`.', + type: 'number', + }, + type: { const: 'number', type: 'string' }, + unit: { + description: + "The unit in which this field is denominated, taking the `decimals` value into account. If representing fungible token amount, this will often be the symbol of the represented token category.\n\nE.g. `BCH`, `sats`, `AcmeUSD`, etc.\n\nIf not provided, clients should not represent this field as having a unit beyond the field's `name`.", + type: 'string', + }, + }, + required: ['type'], + type: 'object', + }, + ], + description: + 'The expected encoding of this field when read from the parsing altstack (see {@link ParsableNftCollection } ). All encoding definitions must have a `type`, and some encoding definitions allow for additional hinting about display strategies in clients.\n\nEncoding types may be set to `binary`, `boolean`, `hex`, `number`, or `utf8`:\n\n- `binary` types should be displayed as binary literals (e.g. `0b0101`)\n- `boolean` types should be displayed as `true` if exactly `0x01` or `false` if exactly `0x00`. If a boolean value does not match one of these values, clients should represent the NFT as unable to be parsed (e.g. simply display the full `commitment`).\n- `hex` types should be displayed as hex literals (e.g.`0xabcd`).\n- `https-url` types are percent encoded with the `https://` prefix omitted; they may be displayed as URIs or as activatable links.\n- `ipfs-cid` types are binary-encoded IPFS Content Identifiers; they may be displayed as URIs or as activatable links.\n- `locktime` types are `OP_TXLOCKTIME` results: integers from `0` to `4294967295` (inclusive) where values less than `500000000` are understood to be a block height (the current block number in the chain, beginning from block `0`), and values greater than or equal to `500000000` are understood to be a Median Time Past (BIP113) UNIX timestamp. (Note, sequence age is not currently supported.)\n- `number` types should be displayed according the their configured `decimals` and `unit` values.\n- `utf8` types should be displayed as utf8 strings.', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of NFT field extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.', + }, + name: { + description: + 'The name of this field for use in interfaces. Names longer than `20` characters may be elided in some interfaces.\n\nE.g.:\n- `BCH Pledged`\n- `Tokens Sold`\n- `Settlement Locktime`\n- `Seat Number`,\n- `IPFS Content Identifier`\n- `HTTPS URL`', + type: 'string', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this NFT field. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.', + }, + }, + required: ['encoding'], + type: 'object', + }, + description: + 'A definition specifying a field that can be encoded in non-fungible tokens of a token category.', + type: 'object', +}; +function validate30( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + for (const key0 in data) { + let data0 = data[key0]; + const _errs2 = errors; + if (errors === _errs2) { + if (data0 && typeof data0 == 'object' && !Array.isArray(data0)) { + let missing0; + if (data0.encoding === undefined && (missing0 = 'encoding')) { + validate30.errors = [ + { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: '#/additionalProperties/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs4 = errors; + for (const key1 in data0) { + if ( + !( + key1 === 'description' || + key1 === 'encoding' || + key1 === 'extensions' || + key1 === 'name' || + key1 === 'uris' + ) + ) { + validate30.errors = [ + { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: '#/additionalProperties/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key1 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs4 === errors) { + if (data0.description !== undefined) { + const _errs5 = errors; + if (typeof data0.description !== 'string') { + validate30.errors = [ + { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1') + + '/description', + schemaPath: + '#/additionalProperties/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid1 = _errs5 === errors; + } else { + var valid1 = true; + } + if (valid1) { + if (data0.encoding !== undefined) { + let data2 = data0.encoding; + const _errs7 = errors; + const _errs8 = errors; + let valid2 = false; + const _errs9 = errors; + if (errors === _errs9) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + let missing1; + if (data2.type === undefined && (missing1 = 'type')) { + const err0 = { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1') + + '/encoding', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/0/required', + keyword: 'required', + params: { missingProperty: missing1 }, + message: + "must have required property '" + missing1 + "'", + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } else { + const _errs11 = errors; + for (const key2 in data2) { + if (!(key2 === 'type')) { + const err1 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/0/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key2 }, + message: 'must NOT have additional properties', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + break; + } + } + if (_errs11 === errors) { + if (data2.type !== undefined) { + let data3 = data2.type; + if (typeof data3 !== 'string') { + const err2 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding/type', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/0/properties/type/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + if ( + !( + data3 === 'binary' || + data3 === 'boolean' || + data3 === 'hex' || + data3 === 'https-url' || + data3 === 'ipfs-cid' || + data3 === 'utf8' || + data3 === 'locktime' + ) + ) { + const err3 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding/type', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/0/properties/type/enum', + keyword: 'enum', + params: { + allowedValues: + schema34.additionalProperties.properties + .encoding.anyOf[0].properties.type.enum, + }, + message: + 'must be equal to one of the allowed values', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + } + } + } + } else { + const err4 = { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1') + + '/encoding', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/0/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var _valid0 = _errs9 === errors; + valid2 = valid2 || _valid0; + if (!valid2) { + const _errs14 = errors; + if (errors === _errs14) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + let missing2; + if (data2.type === undefined && (missing2 = 'type')) { + const err5 = { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1') + + '/encoding', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/required', + keyword: 'required', + params: { missingProperty: missing2 }, + message: + "must have required property '" + + missing2 + + "'", + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } else { + const _errs16 = errors; + for (const key3 in data2) { + if ( + !( + key3 === 'aggregate' || + key3 === 'decimals' || + key3 === 'type' || + key3 === 'unit' + ) + ) { + const err6 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key3 }, + message: + 'must NOT have additional properties', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + break; + } + } + if (_errs16 === errors) { + if (data2.aggregate !== undefined) { + let data4 = data2.aggregate; + const _errs17 = errors; + if (typeof data4 !== 'string') { + const err7 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding/aggregate', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/properties/aggregate/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err7]; + } else { + vErrors.push(err7); + } + errors++; + } + if ('add' !== data4) { + const err8 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding/aggregate', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/properties/aggregate/const', + keyword: 'const', + params: { allowedValue: 'add' }, + message: 'must be equal to constant', + }; + if (vErrors === null) { + vErrors = [err8]; + } else { + vErrors.push(err8); + } + errors++; + } + var valid4 = _errs17 === errors; + } else { + var valid4 = true; + } + if (valid4) { + if (data2.decimals !== undefined) { + let data5 = data2.decimals; + const _errs19 = errors; + if ( + !( + typeof data5 == 'number' && + isFinite(data5) + ) + ) { + const err9 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding/decimals', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/properties/decimals/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }; + if (vErrors === null) { + vErrors = [err9]; + } else { + vErrors.push(err9); + } + errors++; + } + var valid4 = _errs19 === errors; + } else { + var valid4 = true; + } + if (valid4) { + if (data2.type !== undefined) { + let data6 = data2.type; + const _errs21 = errors; + if (typeof data6 !== 'string') { + const err10 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding/type', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/properties/type/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err10]; + } else { + vErrors.push(err10); + } + errors++; + } + if ('number' !== data6) { + const err11 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding/type', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/properties/type/const', + keyword: 'const', + params: { allowedValue: 'number' }, + message: 'must be equal to constant', + }; + if (vErrors === null) { + vErrors = [err11]; + } else { + vErrors.push(err11); + } + errors++; + } + var valid4 = _errs21 === errors; + } else { + var valid4 = true; + } + if (valid4) { + if (data2.unit !== undefined) { + const _errs23 = errors; + if (typeof data2.unit !== 'string') { + const err12 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/encoding/unit', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/properties/unit/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err12]; + } else { + vErrors.push(err12); + } + errors++; + } + var valid4 = _errs23 === errors; + } else { + var valid4 = true; + } + } + } + } + } + } + } else { + const err13 = { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1') + + '/encoding', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err13]; + } else { + vErrors.push(err13); + } + errors++; + } + } + var _valid0 = _errs14 === errors; + valid2 = valid2 || _valid0; + } + if (!valid2) { + const err14 = { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1') + + '/encoding', + schemaPath: + '#/additionalProperties/properties/encoding/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err14]; + } else { + vErrors.push(err14); + } + errors++; + validate30.errors = vErrors; + return false; + } else { + errors = _errs8; + if (vErrors !== null) { + if (_errs8) { + vErrors.length = _errs8; + } else { + vErrors = null; + } + } + } + var valid1 = _errs7 === errors; + } else { + var valid1 = true; + } + if (valid1) { + if (data0.extensions !== undefined) { + let data8 = data0.extensions; + const _errs25 = errors; + const _errs26 = errors; + if (errors === _errs26) { + if ( + data8 && + typeof data8 == 'object' && + !Array.isArray(data8) + ) { + for (const key4 in data8) { + let data9 = data8[key4]; + const _errs29 = errors; + const _errs30 = errors; + let valid7 = false; + const _errs31 = errors; + if (typeof data9 !== 'string') { + const err15 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/extensions/' + + key4.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/0/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err15]; + } else { + vErrors.push(err15); + } + errors++; + } + var _valid1 = _errs31 === errors; + valid7 = valid7 || _valid1; + if (!valid7) { + const _errs33 = errors; + if (errors === _errs33) { + if ( + data9 && + typeof data9 == 'object' && + !Array.isArray(data9) + ) { + for (const key5 in data9) { + const _errs36 = errors; + if (typeof data9[key5] !== 'string') { + const err16 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/extensions/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key5 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err16]; + } else { + vErrors.push(err16); + } + errors++; + } + var valid8 = _errs36 === errors; + if (!valid8) { + break; + } + } + } else { + const err17 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/extensions/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err17]; + } else { + vErrors.push(err17); + } + errors++; + } + } + var _valid1 = _errs33 === errors; + valid7 = valid7 || _valid1; + if (!valid7) { + const _errs38 = errors; + if (errors === _errs38) { + if ( + data9 && + typeof data9 == 'object' && + !Array.isArray(data9) + ) { + for (const key6 in data9) { + let data11 = data9[key6]; + const _errs41 = errors; + if (errors === _errs41) { + if ( + data11 && + typeof data11 == 'object' && + !Array.isArray(data11) + ) { + for (const key7 in data11) { + const _errs44 = errors; + if ( + typeof data11[key7] !== 'string' + ) { + const err18 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/extensions/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key6 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key7 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err18]; + } else { + vErrors.push(err18); + } + errors++; + } + var valid10 = _errs44 === errors; + if (!valid10) { + break; + } + } + } else { + const err19 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/extensions/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key6 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err19]; + } else { + vErrors.push(err19); + } + errors++; + } + } + var valid9 = _errs41 === errors; + if (!valid9) { + break; + } + } + } else { + const err20 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/extensions/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err20]; + } else { + vErrors.push(err20); + } + errors++; + } + } + var _valid1 = _errs38 === errors; + valid7 = valid7 || _valid1; + } + } + if (!valid7) { + const err21 = { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/extensions/' + + key4.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err21]; + } else { + vErrors.push(err21); + } + errors++; + validate30.errors = vErrors; + return false; + } else { + errors = _errs30; + if (vErrors !== null) { + if (_errs30) { + vErrors.length = _errs30; + } else { + vErrors = null; + } + } + } + var valid6 = _errs29 === errors; + if (!valid6) { + break; + } + } + } else { + validate30.errors = [ + { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1') + + '/extensions', + schemaPath: '#/definitions/Extensions/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid1 = _errs25 === errors; + } else { + var valid1 = true; + } + if (valid1) { + if (data0.name !== undefined) { + const _errs46 = errors; + if (typeof data0.name !== 'string') { + validate30.errors = [ + { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1') + + '/name', + schemaPath: + '#/additionalProperties/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid1 = _errs46 === errors; + } else { + var valid1 = true; + } + if (valid1) { + if (data0.uris !== undefined) { + let data14 = data0.uris; + const _errs48 = errors; + const _errs49 = errors; + if (errors === _errs49) { + if ( + data14 && + typeof data14 == 'object' && + !Array.isArray(data14) + ) { + for (const key8 in data14) { + const _errs52 = errors; + if (typeof data14[key8] !== 'string') { + validate30.errors = [ + { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/uris/' + + key8 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/URIs/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid12 = _errs52 === errors; + if (!valid12) { + break; + } + } + } else { + validate30.errors = [ + { + instancePath: + instancePath + + '/' + + key0 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/uris', + schemaPath: '#/definitions/URIs/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid1 = _errs48 === errors; + } else { + var valid1 = true; + } + } + } + } + } + } + } + } else { + validate30.errors = [ + { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: '#/additionalProperties/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs2 === errors; + if (!valid0) { + break; + } + } + } else { + validate30.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate30.errors = vErrors; + return errors === 0; +} +const schema37 = { + additionalProperties: false, + description: + 'Interpretation information for a collection of parsable NFTs, a collection in which each NFT may include additional metadata fields beyond a sequential identifier within its on-chain commitment. Note that {@link ParsableNftCollection } s differ from {@link SequentialNftCollection } s in that parsable collections require a parsing `bytecode` with which to inspect each NFT commitment: the type of each NFT is indexed by the hex-encoded contents the bottom item on the altstack following the evaluation of the parsing bytecode.', + properties: { + bytecode: { + description: + "A segment of hex-encoded Bitcoin Cash VM bytecode that parses UTXOs holding NFTs of this category, identifies the NFT's type within the category, and returns a list of the NFT's field values via the altstack. If undefined, this NFT Category includes only sequential NFTs, with only an identifier and no NFT fields encoded in each NFT's on-chain commitment.\n\nThe parse `bytecode` is evaluated by instantiating and partially verifying a standardized NFT parsing transaction:\n- version: `2`\n- inputs: - 0: Spends the UTXO containing the NFT with an empty unlocking bytecode and sequence number of `0`. - 1: Spends index `0` of the empty hash outpoint, with locking bytecode set to `parse.bytecode`, unlocking bytecode `OP_1` (`0x51`) and sequence number `0`.\n- outputs: - 0: A locking bytecode of OP_RETURN (`0x6a`) and value of `0`.\n- locktime: `0`\n\nAfter input 1 of this NFT parsing transaction is evaluated, if the resulting stack is not valid (a single \"truthy\" element remaining on the stack) – or if the altstack is empty – parsing has failed and clients should represent the NFT as unable to be parsed (e.g. simply display the full `commitment` as a hex-encoded value in the user interface).\n\nOn successful parsing evaluations, the bottom item on the altstack indicates the type of the NFT according to the matching definition in `types`. If no match is found, clients should represent the NFT as unable to be parsed.\n\nFor example: `00d2517f7c6b` (OP_0 OP_UTXOTOKENCOMMITMENT OP_1 OP_SPLIT OP_SWAP OP_TOALTSTACK OP_TOALTSTACK) splits the commitment after 1 byte, pushing the first byte to the altstack as an NFT type identifier and the remaining segment of the commitment as the first NFT field value.\n\nIf undefined (in a {@link SequentialNftCollection } ), this field could be considered to have a default value of `00d26b` (OP_0 OP_UTXOTOKENCOMMITMENT OP_TOALTSTACK), which takes the full contents of the commitment as a fixed type index. As such, each index of the NFT category's `types` maps a precise commitment value to the metadata for NFTs with that particular commitment. E.g. an NFT with an empty commitment (VM number 0) maps to `types['']`, a commitment of `01` (hex) maps to `types['01']`, etc. This pattern is used for collections of sequential NFTs.", + type: 'string', + }, + types: { + additionalProperties: { + $ref: '#/definitions/NftType', + description: + 'A definitions for each type of NFT within the token category. Parsable NFT types are indexed by the hex-encoded value of the bottom altstack item following evaluation of `NftCategory.parse.bytecode`. The remaining altstack items are mapped to NFT fields according to the `fields` property of the matching NFT type.', + }, + description: + 'A mapping of hex-encoded values to definitions of possible NFT types in this category.', + type: 'object', + }, + }, + required: ['bytecode', 'types'], + type: 'object', +}; +const schema38 = { + additionalProperties: false, + description: 'A definition for one type of NFT within a token category.', + properties: { + description: { + description: + 'A string describing this NFT type for use in user interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- "Receipts issued by the exchange to record details about purchases. After settlement, these receipts are redeemed for the purchased tokens.";\n- "Receipts issued by the crowdfunding campaign to document the value of funds pledged. If the user decides to cancel their pledge before the campaign completes, these receipts can be redeemed for a full refund.";\n- "Tickets issued for events at ACME Stadium.";\n- Sealed ballots certified by ACME decentralized organization during the voting period. After the voting period ends, these ballots must be revealed to reclaim the tokens used for voting."', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of NFT type extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.', + }, + fields: { + description: + "A list of identifiers for fields contained in NFTs of this type. On successful parsing evaluations, the bottom item on the altstack indicates the matched NFT type, and the remaining altstack items represent NFT field contents in the order listed (where `fields[0]` is the second-to-bottom item, and the final item in `fields` is the top of the altstack).\n\nFields should be ordered by recommended importance from most important to least important; in user interfaces, clients should display fields at lower indexes more prominently than those at higher indexes, e.g. if some fields cannot be displayed in minimized interfaces, higher-importance fields can still be represented. (Note, this ordering is controlled by the bytecode specified in `token.nft.parse.bytecode`.)\n\nIf this is a sequential NFT, (the category's `parse.bytecode` is undefined), `fields` should be omitted or set to `undefined`.", + items: { type: 'string' }, + type: 'array', + }, + name: { + description: + 'The name of this NFT type for use in interfaces. Names longer than `20` characters may be elided in some interfaces.\n\nE.g. `Market Order Buys`, `Limit Order Sales`, `Pledge Receipts`, `ACME Stadium Tickets`, `Sealed Votes`, etc.', + type: 'string', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this NFT type. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.', + }, + }, + required: ['name'], + type: 'object', +}; +function validate33( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if (data.name === undefined && (missing0 = 'name')) { + validate33.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if ( + !( + key0 === 'description' || + key0 === 'extensions' || + key0 === 'fields' || + key0 === 'name' || + key0 === 'uris' + ) + ) { + validate33.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.description !== undefined) { + const _errs2 = errors; + if (typeof data.description !== 'string') { + validate33.errors = [ + { + instancePath: instancePath + '/description', + schemaPath: '#/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.extensions !== undefined) { + let data1 = data.extensions; + const _errs4 = errors; + const _errs5 = errors; + if (errors === _errs5) { + if ( + data1 && + typeof data1 == 'object' && + !Array.isArray(data1) + ) { + for (const key1 in data1) { + let data2 = data1[key1]; + const _errs8 = errors; + const _errs9 = errors; + let valid3 = false; + const _errs10 = errors; + if (typeof data2 !== 'string') { + const err0 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/0/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } + var _valid0 = _errs10 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs12 = errors; + if (errors === _errs12) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key2 in data2) { + const _errs15 = errors; + if (typeof data2[key2] !== 'string') { + const err1 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + } + var valid4 = _errs15 === errors; + if (!valid4) { + break; + } + } + } else { + const err2 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + } + var _valid0 = _errs12 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs17 = errors; + if (errors === _errs17) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key3 in data2) { + let data4 = data2[key3]; + const _errs20 = errors; + if (errors === _errs20) { + if ( + data4 && + typeof data4 == 'object' && + !Array.isArray(data4) + ) { + for (const key4 in data4) { + const _errs23 = errors; + if (typeof data4[key4] !== 'string') { + const err3 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid6 = _errs23 === errors; + if (!valid6) { + break; + } + } + } else { + const err4 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var valid5 = _errs20 === errors; + if (!valid5) { + break; + } + } + } else { + const err5 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } + } + var _valid0 = _errs17 === errors; + valid3 = valid3 || _valid0; + } + } + if (!valid3) { + const err6 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + validate33.errors = vErrors; + return false; + } else { + errors = _errs9; + if (vErrors !== null) { + if (_errs9) { + vErrors.length = _errs9; + } else { + vErrors = null; + } + } + } + var valid2 = _errs8 === errors; + if (!valid2) { + break; + } + } + } else { + validate33.errors = [ + { + instancePath: instancePath + '/extensions', + schemaPath: '#/definitions/Extensions/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.fields !== undefined) { + let data6 = data.fields; + const _errs25 = errors; + if (errors === _errs25) { + if (Array.isArray(data6)) { + var valid7 = true; + const len0 = data6.length; + for (let i0 = 0; i0 < len0; i0++) { + const _errs27 = errors; + if (typeof data6[i0] !== 'string') { + validate33.errors = [ + { + instancePath: instancePath + '/fields/' + i0, + schemaPath: '#/properties/fields/items/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid7 = _errs27 === errors; + if (!valid7) { + break; + } + } + } else { + validate33.errors = [ + { + instancePath: instancePath + '/fields', + schemaPath: '#/properties/fields/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }, + ]; + return false; + } + } + var valid0 = _errs25 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.name !== undefined) { + const _errs29 = errors; + if (typeof data.name !== 'string') { + validate33.errors = [ + { + instancePath: instancePath + '/name', + schemaPath: '#/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs29 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.uris !== undefined) { + let data9 = data.uris; + const _errs31 = errors; + const _errs32 = errors; + if (errors === _errs32) { + if ( + data9 && + typeof data9 == 'object' && + !Array.isArray(data9) + ) { + for (const key5 in data9) { + const _errs35 = errors; + if (typeof data9[key5] !== 'string') { + validate33.errors = [ + { + instancePath: + instancePath + + '/uris/' + + key5.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/URIs/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid9 = _errs35 === errors; + if (!valid9) { + break; + } + } + } else { + validate33.errors = [ + { + instancePath: instancePath + '/uris', + schemaPath: '#/definitions/URIs/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs31 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } + } else { + validate33.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate33.errors = vErrors; + return errors === 0; +} +function validate32( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if ( + (data.bytecode === undefined && (missing0 = 'bytecode')) || + (data.types === undefined && (missing0 = 'types')) + ) { + validate32.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if (!(key0 === 'bytecode' || key0 === 'types')) { + validate32.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.bytecode !== undefined) { + const _errs2 = errors; + if (typeof data.bytecode !== 'string') { + validate32.errors = [ + { + instancePath: instancePath + '/bytecode', + schemaPath: '#/properties/bytecode/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.types !== undefined) { + let data1 = data.types; + const _errs4 = errors; + if (errors === _errs4) { + if ( + data1 && + typeof data1 == 'object' && + !Array.isArray(data1) + ) { + for (const key1 in data1) { + const _errs7 = errors; + if ( + !validate33(data1[key1], { + instancePath: + instancePath + + '/types/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + parentData: data1, + parentDataProperty: key1, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate33.errors + : vErrors.concat(validate33.errors); + errors = vErrors.length; + } + var valid1 = _errs7 === errors; + if (!valid1) { + break; + } + } + } else { + validate32.errors = [ + { + instancePath: instancePath + '/types', + schemaPath: '#/properties/types/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + } + } + } + } else { + validate32.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate32.errors = vErrors; + return errors === 0; +} +const schema41 = { + additionalProperties: false, + description: + 'Interpretation information for a collection of sequential NFTs, a collection in which each NFT includes only a sequential identifier within its on-chain commitment. Note that {@link SequentialNftCollection } s differ from {@link ParsableNftCollection } s in that sequential collections lack a parsing `bytecode` with which to inspect each NFT commitment: the type of each NFT is indexed by the full contents its commitment (interpreted as a positive VM integer in user interfaces).', + properties: { + types: { + additionalProperties: { + $ref: '#/definitions/NftType', + description: + 'Interpretation information for each type of NFT within the token category, indexed by commitment hex. For sequential NFTs, the on-chain commitment of each NFT is interpreted as a VM number to reference its particular NFT type in user interfaces. Issuing a sequential NFT with a negative or invalid VM number is discouraged, but clients may render the commitment of such NFTs in hex-encoded form, prefixed with `X`.', + }, + description: + 'A mapping of each NFT commitment (typically, a positive integer encoded as a VM number) to metadata for that NFT type in this category.', + type: 'object', + }, + }, + required: ['types'], + type: 'object', +}; +function validate36( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if (data.types === undefined && (missing0 = 'types')) { + validate36.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if (!(key0 === 'types')) { + validate36.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.types !== undefined) { + let data0 = data.types; + const _errs2 = errors; + if (errors === _errs2) { + if (data0 && typeof data0 == 'object' && !Array.isArray(data0)) { + for (const key1 in data0) { + const _errs5 = errors; + if ( + !validate33(data0[key1], { + instancePath: + instancePath + + '/types/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + parentData: data0, + parentDataProperty: key1, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate33.errors + : vErrors.concat(validate33.errors); + errors = vErrors.length; + } + var valid1 = _errs5 === errors; + if (!valid1) { + break; + } + } + } else { + validate36.errors = [ + { + instancePath: instancePath + '/types', + schemaPath: '#/properties/types/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + } + } + } + } else { + validate36.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate36.errors = vErrors; + return errors === 0; +} +function validate29( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if (data.parse === undefined && (missing0 = 'parse')) { + validate29.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if ( + !(key0 === 'description' || key0 === 'fields' || key0 === 'parse') + ) { + validate29.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.description !== undefined) { + const _errs2 = errors; + if (typeof data.description !== 'string') { + validate29.errors = [ + { + instancePath: instancePath + '/description', + schemaPath: '#/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.fields !== undefined) { + const _errs4 = errors; + if ( + !validate30(data.fields, { + instancePath: instancePath + '/fields', + parentData: data, + parentDataProperty: 'fields', + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate30.errors + : vErrors.concat(validate30.errors); + errors = vErrors.length; + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.parse !== undefined) { + let data2 = data.parse; + const _errs5 = errors; + const _errs6 = errors; + let valid1 = false; + const _errs7 = errors; + if ( + !validate32(data2, { + instancePath: instancePath + '/parse', + parentData: data, + parentDataProperty: 'parse', + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate32.errors + : vErrors.concat(validate32.errors); + errors = vErrors.length; + } + var _valid0 = _errs7 === errors; + valid1 = valid1 || _valid0; + if (!valid1) { + const _errs8 = errors; + if ( + !validate36(data2, { + instancePath: instancePath + '/parse', + parentData: data, + parentDataProperty: 'parse', + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate36.errors + : vErrors.concat(validate36.errors); + errors = vErrors.length; + } + var _valid0 = _errs8 === errors; + valid1 = valid1 || _valid0; + } + if (!valid1) { + const err0 = { + instancePath: instancePath + '/parse', + schemaPath: '#/properties/parse/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + validate29.errors = vErrors; + return false; + } else { + errors = _errs6; + if (vErrors !== null) { + if (_errs6) { + vErrors.length = _errs6; + } else { + vErrors = null; + } + } + } + var valid0 = _errs5 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } else { + validate29.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate29.errors = vErrors; + return errors === 0; +} +function validate28( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if ( + (data.category === undefined && (missing0 = 'category')) || + (data.symbol === undefined && (missing0 = 'symbol')) + ) { + validate28.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if ( + !( + key0 === 'category' || + key0 === 'decimals' || + key0 === 'nfts' || + key0 === 'symbol' + ) + ) { + validate28.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.category !== undefined) { + const _errs2 = errors; + if (typeof data.category !== 'string') { + validate28.errors = [ + { + instancePath: instancePath + '/category', + schemaPath: '#/properties/category/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.decimals !== undefined) { + let data1 = data.decimals; + const _errs4 = errors; + if (!(typeof data1 == 'number' && isFinite(data1))) { + validate28.errors = [ + { + instancePath: instancePath + '/decimals', + schemaPath: '#/properties/decimals/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.nfts !== undefined) { + const _errs6 = errors; + if ( + !validate29(data.nfts, { + instancePath: instancePath + '/nfts', + parentData: data, + parentDataProperty: 'nfts', + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate29.errors + : vErrors.concat(validate29.errors); + errors = vErrors.length; + } + var valid0 = _errs6 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.symbol !== undefined) { + const _errs7 = errors; + if (typeof data.symbol !== 'string') { + validate28.errors = [ + { + instancePath: instancePath + '/symbol', + schemaPath: '#/properties/symbol/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs7 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } else { + validate28.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate28.errors = vErrors; + return errors === 0; +} +function validate27( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if (data.name === undefined && (missing0 = 'name')) { + validate27.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if (!func4.call(schema30.properties, key0)) { + validate27.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.description !== undefined) { + const _errs2 = errors; + if (typeof data.description !== 'string') { + validate27.errors = [ + { + instancePath: instancePath + '/description', + schemaPath: '#/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.extensions !== undefined) { + let data1 = data.extensions; + const _errs4 = errors; + const _errs5 = errors; + if (errors === _errs5) { + if ( + data1 && + typeof data1 == 'object' && + !Array.isArray(data1) + ) { + for (const key1 in data1) { + let data2 = data1[key1]; + const _errs8 = errors; + const _errs9 = errors; + let valid3 = false; + const _errs10 = errors; + if (typeof data2 !== 'string') { + const err0 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/0/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } + var _valid0 = _errs10 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs12 = errors; + if (errors === _errs12) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key2 in data2) { + const _errs15 = errors; + if (typeof data2[key2] !== 'string') { + const err1 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + } + var valid4 = _errs15 === errors; + if (!valid4) { + break; + } + } + } else { + const err2 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + } + var _valid0 = _errs12 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs17 = errors; + if (errors === _errs17) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key3 in data2) { + let data4 = data2[key3]; + const _errs20 = errors; + if (errors === _errs20) { + if ( + data4 && + typeof data4 == 'object' && + !Array.isArray(data4) + ) { + for (const key4 in data4) { + const _errs23 = errors; + if (typeof data4[key4] !== 'string') { + const err3 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid6 = _errs23 === errors; + if (!valid6) { + break; + } + } + } else { + const err4 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var valid5 = _errs20 === errors; + if (!valid5) { + break; + } + } + } else { + const err5 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } + } + var _valid0 = _errs17 === errors; + valid3 = valid3 || _valid0; + } + } + if (!valid3) { + const err6 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + validate27.errors = vErrors; + return false; + } else { + errors = _errs9; + if (vErrors !== null) { + if (_errs9) { + vErrors.length = _errs9; + } else { + vErrors = null; + } + } + } + var valid2 = _errs8 === errors; + if (!valid2) { + break; + } + } + } else { + validate27.errors = [ + { + instancePath: instancePath + '/extensions', + schemaPath: '#/definitions/Extensions/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.migrated !== undefined) { + const _errs25 = errors; + if (typeof data.migrated !== 'string') { + validate27.errors = [ + { + instancePath: instancePath + '/migrated', + schemaPath: '#/properties/migrated/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs25 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.name !== undefined) { + const _errs27 = errors; + if (typeof data.name !== 'string') { + validate27.errors = [ + { + instancePath: instancePath + '/name', + schemaPath: '#/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs27 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.splitId !== undefined) { + const _errs29 = errors; + if (typeof data.splitId !== 'string') { + validate27.errors = [ + { + instancePath: instancePath + '/splitId', + schemaPath: '#/properties/splitId/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs29 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.status !== undefined) { + let data9 = data.status; + const _errs31 = errors; + if (typeof data9 !== 'string') { + validate27.errors = [ + { + instancePath: instancePath + '/status', + schemaPath: '#/properties/status/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + if ( + !( + data9 === 'active' || + data9 === 'burned' || + data9 === 'inactive' + ) + ) { + validate27.errors = [ + { + instancePath: instancePath + '/status', + schemaPath: '#/properties/status/enum', + keyword: 'enum', + params: { + allowedValues: schema30.properties.status.enum, + }, + message: + 'must be equal to one of the allowed values', + }, + ]; + return false; + } + var valid0 = _errs31 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.tags !== undefined) { + let data10 = data.tags; + const _errs33 = errors; + if (errors === _errs33) { + if (Array.isArray(data10)) { + var valid7 = true; + const len0 = data10.length; + for (let i0 = 0; i0 < len0; i0++) { + const _errs35 = errors; + if (typeof data10[i0] !== 'string') { + validate27.errors = [ + { + instancePath: instancePath + '/tags/' + i0, + schemaPath: '#/properties/tags/items/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid7 = _errs35 === errors; + if (!valid7) { + break; + } + } + } else { + validate27.errors = [ + { + instancePath: instancePath + '/tags', + schemaPath: '#/properties/tags/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }, + ]; + return false; + } + } + var valid0 = _errs33 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.token !== undefined) { + const _errs37 = errors; + if ( + !validate28(data.token, { + instancePath: instancePath + '/token', + parentData: data, + parentDataProperty: 'token', + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate28.errors + : vErrors.concat(validate28.errors); + errors = vErrors.length; + } + var valid0 = _errs37 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.uris !== undefined) { + let data13 = data.uris; + const _errs38 = errors; + const _errs39 = errors; + if (errors === _errs39) { + if ( + data13 && + typeof data13 == 'object' && + !Array.isArray(data13) + ) { + for (const key5 in data13) { + const _errs42 = errors; + if (typeof data13[key5] !== 'string') { + validate27.errors = [ + { + instancePath: + instancePath + + '/uris/' + + key5 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/URIs/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid9 = _errs42 === errors; + if (!valid9) { + break; + } + } + } else { + validate27.errors = [ + { + instancePath: instancePath + '/uris', + schemaPath: '#/definitions/URIs/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs38 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } + } + } + } + } + } else { + validate27.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate27.errors = vErrors; + return errors === 0; +} +function validate26( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + for (const key0 in data) { + const _errs2 = errors; + if ( + !validate27(data[key0], { + instancePath: + instancePath + + '/' + + key0.replace(/~/g, '~0').replace(/\//g, '~1'), + parentData: data, + parentDataProperty: key0, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate27.errors + : vErrors.concat(validate27.errors); + errors = vErrors.length; + } + var valid0 = _errs2 === errors; + if (!valid0) { + break; + } + } + } else { + validate26.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate26.errors = vErrors; + return errors === 0; +} +const schema43 = { + additionalProperties: false, + description: + 'An identity representing a metadata registry that is not published on-chain and therefore has no authbase or trackable authchain.', + properties: { + description: { + description: + 'A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details.', + }, + name: { + description: + 'The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.', + type: 'string', + }, + tags: { + description: + "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + items: { type: 'string' }, + type: 'array', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`.', + }, + }, + required: ['name'], + type: 'object', +}; +function validate43( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if (data.name === undefined && (missing0 = 'name')) { + validate43.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if ( + !( + key0 === 'description' || + key0 === 'extensions' || + key0 === 'name' || + key0 === 'tags' || + key0 === 'uris' + ) + ) { + validate43.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.description !== undefined) { + const _errs2 = errors; + if (typeof data.description !== 'string') { + validate43.errors = [ + { + instancePath: instancePath + '/description', + schemaPath: '#/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.extensions !== undefined) { + let data1 = data.extensions; + const _errs4 = errors; + const _errs5 = errors; + if (errors === _errs5) { + if ( + data1 && + typeof data1 == 'object' && + !Array.isArray(data1) + ) { + for (const key1 in data1) { + let data2 = data1[key1]; + const _errs8 = errors; + const _errs9 = errors; + let valid3 = false; + const _errs10 = errors; + if (typeof data2 !== 'string') { + const err0 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/0/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } + var _valid0 = _errs10 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs12 = errors; + if (errors === _errs12) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key2 in data2) { + const _errs15 = errors; + if (typeof data2[key2] !== 'string') { + const err1 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + } + var valid4 = _errs15 === errors; + if (!valid4) { + break; + } + } + } else { + const err2 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + } + var _valid0 = _errs12 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs17 = errors; + if (errors === _errs17) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key3 in data2) { + let data4 = data2[key3]; + const _errs20 = errors; + if (errors === _errs20) { + if ( + data4 && + typeof data4 == 'object' && + !Array.isArray(data4) + ) { + for (const key4 in data4) { + const _errs23 = errors; + if (typeof data4[key4] !== 'string') { + const err3 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid6 = _errs23 === errors; + if (!valid6) { + break; + } + } + } else { + const err4 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var valid5 = _errs20 === errors; + if (!valid5) { + break; + } + } + } else { + const err5 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } + } + var _valid0 = _errs17 === errors; + valid3 = valid3 || _valid0; + } + } + if (!valid3) { + const err6 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + validate43.errors = vErrors; + return false; + } else { + errors = _errs9; + if (vErrors !== null) { + if (_errs9) { + vErrors.length = _errs9; + } else { + vErrors = null; + } + } + } + var valid2 = _errs8 === errors; + if (!valid2) { + break; + } + } + } else { + validate43.errors = [ + { + instancePath: instancePath + '/extensions', + schemaPath: '#/definitions/Extensions/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.name !== undefined) { + const _errs25 = errors; + if (typeof data.name !== 'string') { + validate43.errors = [ + { + instancePath: instancePath + '/name', + schemaPath: '#/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs25 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.tags !== undefined) { + let data7 = data.tags; + const _errs27 = errors; + if (errors === _errs27) { + if (Array.isArray(data7)) { + var valid7 = true; + const len0 = data7.length; + for (let i0 = 0; i0 < len0; i0++) { + const _errs29 = errors; + if (typeof data7[i0] !== 'string') { + validate43.errors = [ + { + instancePath: instancePath + '/tags/' + i0, + schemaPath: '#/properties/tags/items/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid7 = _errs29 === errors; + if (!valid7) { + break; + } + } + } else { + validate43.errors = [ + { + instancePath: instancePath + '/tags', + schemaPath: '#/properties/tags/type', + keyword: 'type', + params: { type: 'array' }, + message: 'must be array', + }, + ]; + return false; + } + } + var valid0 = _errs27 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.uris !== undefined) { + let data9 = data.uris; + const _errs31 = errors; + const _errs32 = errors; + if (errors === _errs32) { + if ( + data9 && + typeof data9 == 'object' && + !Array.isArray(data9) + ) { + for (const key5 in data9) { + const _errs35 = errors; + if (typeof data9[key5] !== 'string') { + validate43.errors = [ + { + instancePath: + instancePath + + '/uris/' + + key5.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/URIs/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid9 = _errs35 === errors; + if (!valid9) { + break; + } + } + } else { + validate43.errors = [ + { + instancePath: instancePath + '/uris', + schemaPath: '#/definitions/URIs/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs31 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } + } else { + validate43.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate43.errors = vErrors; + return errors === 0; +} +const schema46 = { + additionalProperties: false, + description: + 'Tags allow registries to classify and group identities by a variety of characteristics. Tags are standardized within a registry and may represent either labels applied by that registry or designations by external authorities (certification, membership, ownership, etc.) that are tracked by that registry.\n\nExamples of possible tags include: `individual`, `organization`, `token`, `wallet`, `exchange`, `staking`, `utility-token`, `security-token`, `stablecoin`, `wrapped`, `collectable`, `deflationary`, `governance`, `decentralized-exchange`, `liquidity-provider`, `sidechain`, `sidechain-bridge`, `acme-audited`, `acme-endorsed`, etc.\n\nTags may be used by clients in search, discovery, and filtering of identities, and they can also convey information like accreditation from investor protection organizations, public certifications by security or financial auditors, and other designations that signal integrity and value to users.', + properties: { + description: { + description: + 'A string describing this tag for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `An identity maintained by a single individual.`\n- `An identity representing a type of token.`\n- `An on-chain application that has passed security audits by ACME, Inc.`', + type: 'string', + }, + extensions: { + $ref: '#/definitions/Extensions', + description: + 'A mapping of `Tag` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.', + }, + name: { + description: + 'The name of this tag for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g.:\n- `Individual`\n- `Token`\n- `Audited by ACME, Inc.`', + type: 'string', + }, + uris: { + $ref: '#/definitions/URIs', + description: + 'A mapping of identifiers to URIs associated with this tag. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all tags:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`.', + }, + }, + required: ['name'], + type: 'object', +}; +function validate45( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if (data.name === undefined && (missing0 = 'name')) { + validate45.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if ( + !( + key0 === 'description' || + key0 === 'extensions' || + key0 === 'name' || + key0 === 'uris' + ) + ) { + validate45.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.description !== undefined) { + const _errs2 = errors; + if (typeof data.description !== 'string') { + validate45.errors = [ + { + instancePath: instancePath + '/description', + schemaPath: '#/properties/description/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.extensions !== undefined) { + let data1 = data.extensions; + const _errs4 = errors; + const _errs5 = errors; + if (errors === _errs5) { + if ( + data1 && + typeof data1 == 'object' && + !Array.isArray(data1) + ) { + for (const key1 in data1) { + let data2 = data1[key1]; + const _errs8 = errors; + const _errs9 = errors; + let valid3 = false; + const _errs10 = errors; + if (typeof data2 !== 'string') { + const err0 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/0/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } + var _valid0 = _errs10 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs12 = errors; + if (errors === _errs12) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key2 in data2) { + const _errs15 = errors; + if (typeof data2[key2] !== 'string') { + const err1 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + } + var valid4 = _errs15 === errors; + if (!valid4) { + break; + } + } + } else { + const err2 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + } + var _valid0 = _errs12 === errors; + valid3 = valid3 || _valid0; + if (!valid3) { + const _errs17 = errors; + if (errors === _errs17) { + if ( + data2 && + typeof data2 == 'object' && + !Array.isArray(data2) + ) { + for (const key3 in data2) { + let data4 = data2[key3]; + const _errs20 = errors; + if (errors === _errs20) { + if ( + data4 && + typeof data4 == 'object' && + !Array.isArray(data4) + ) { + for (const key4 in data4) { + const _errs23 = errors; + if (typeof data4[key4] !== 'string') { + const err3 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid6 = _errs23 === errors; + if (!valid6) { + break; + } + } + } else { + const err4 = { + instancePath: + instancePath + + '/extensions/' + + key1 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var valid5 = _errs20 === errors; + if (!valid5) { + break; + } + } + } else { + const err5 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } + } + var _valid0 = _errs17 === errors; + valid3 = valid3 || _valid0; + } + } + if (!valid3) { + const err6 = { + instancePath: + instancePath + + '/extensions/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + validate45.errors = vErrors; + return false; + } else { + errors = _errs9; + if (vErrors !== null) { + if (_errs9) { + vErrors.length = _errs9; + } else { + vErrors = null; + } + } + } + var valid2 = _errs8 === errors; + if (!valid2) { + break; + } + } + } else { + validate45.errors = [ + { + instancePath: instancePath + '/extensions', + schemaPath: '#/definitions/Extensions/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.name !== undefined) { + const _errs25 = errors; + if (typeof data.name !== 'string') { + validate45.errors = [ + { + instancePath: instancePath + '/name', + schemaPath: '#/properties/name/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs25 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.uris !== undefined) { + let data7 = data.uris; + const _errs27 = errors; + const _errs28 = errors; + if (errors === _errs28) { + if ( + data7 && + typeof data7 == 'object' && + !Array.isArray(data7) + ) { + for (const key5 in data7) { + const _errs31 = errors; + if (typeof data7[key5] !== 'string') { + validate45.errors = [ + { + instancePath: + instancePath + + '/uris/' + + key5.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/URIs/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid8 = _errs31 === errors; + if (!valid8) { + break; + } + } + } else { + validate45.errors = [ + { + instancePath: instancePath + '/uris', + schemaPath: '#/definitions/URIs/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs27 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } else { + validate45.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate45.errors = vErrors; + return errors === 0; +} +function validate21( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if (errors === 0) { + if (data && typeof data == 'object' && !Array.isArray(data)) { + let missing0; + if ( + (data.version === undefined && (missing0 = 'version')) || + (data.latestRevision === undefined && (missing0 = 'latestRevision')) || + (data.registryIdentity === undefined && (missing0 = 'registryIdentity')) + ) { + validate21.errors = [ + { + instancePath, + schemaPath: '#/required', + keyword: 'required', + params: { missingProperty: missing0 }, + message: "must have required property '" + missing0 + "'", + }, + ]; + return false; + } else { + const _errs1 = errors; + for (const key0 in data) { + if (!func4.call(schema23.properties, key0)) { + validate21.errors = [ + { + instancePath, + schemaPath: '#/additionalProperties', + keyword: 'additionalProperties', + params: { additionalProperty: key0 }, + message: 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs1 === errors) { + if (data.$schema !== undefined) { + const _errs2 = errors; + if (typeof data.$schema !== 'string') { + validate21.errors = [ + { + instancePath: instancePath + '/$schema', + schemaPath: '#/properties/%24schema/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs2 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.chains !== undefined) { + let data1 = data.chains; + const _errs4 = errors; + if (errors === _errs4) { + if ( + data1 && + typeof data1 == 'object' && + !Array.isArray(data1) + ) { + for (const key1 in data1) { + const _errs7 = errors; + if ( + !validate22(data1[key1], { + instancePath: + instancePath + + '/chains/' + + key1.replace(/~/g, '~0').replace(/\//g, '~1'), + parentData: data1, + parentDataProperty: key1, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate22.errors + : vErrors.concat(validate22.errors); + errors = vErrors.length; + } + var valid1 = _errs7 === errors; + if (!valid1) { + break; + } + } + } else { + validate21.errors = [ + { + instancePath: instancePath + '/chains', + schemaPath: '#/properties/chains/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs4 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.defaultChain !== undefined) { + const _errs8 = errors; + if (typeof data.defaultChain !== 'string') { + validate21.errors = [ + { + instancePath: instancePath + '/defaultChain', + schemaPath: '#/properties/defaultChain/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs8 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.extensions !== undefined) { + let data4 = data.extensions; + const _errs10 = errors; + const _errs11 = errors; + if (errors === _errs11) { + if ( + data4 && + typeof data4 == 'object' && + !Array.isArray(data4) + ) { + for (const key2 in data4) { + let data5 = data4[key2]; + const _errs14 = errors; + const _errs15 = errors; + let valid4 = false; + const _errs16 = errors; + if (typeof data5 !== 'string') { + const err0 = { + instancePath: + instancePath + + '/extensions/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/0/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err0]; + } else { + vErrors.push(err0); + } + errors++; + } + var _valid0 = _errs16 === errors; + valid4 = valid4 || _valid0; + if (!valid4) { + const _errs18 = errors; + if (errors === _errs18) { + if ( + data5 && + typeof data5 == 'object' && + !Array.isArray(data5) + ) { + for (const key3 in data5) { + const _errs21 = errors; + if (typeof data5[key3] !== 'string') { + const err1 = { + instancePath: + instancePath + + '/extensions/' + + key2 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key3 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err1]; + } else { + vErrors.push(err1); + } + errors++; + } + var valid5 = _errs21 === errors; + if (!valid5) { + break; + } + } + } else { + const err2 = { + instancePath: + instancePath + + '/extensions/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/1/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err2]; + } else { + vErrors.push(err2); + } + errors++; + } + } + var _valid0 = _errs18 === errors; + valid4 = valid4 || _valid0; + if (!valid4) { + const _errs23 = errors; + if (errors === _errs23) { + if ( + data5 && + typeof data5 == 'object' && + !Array.isArray(data5) + ) { + for (const key4 in data5) { + let data7 = data5[key4]; + const _errs26 = errors; + if (errors === _errs26) { + if ( + data7 && + typeof data7 == 'object' && + !Array.isArray(data7) + ) { + for (const key5 in data7) { + const _errs29 = errors; + if (typeof data7[key5] !== 'string') { + const err3 = { + instancePath: + instancePath + + '/extensions/' + + key2 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key5 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/additionalProperties/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err3]; + } else { + vErrors.push(err3); + } + errors++; + } + var valid7 = _errs29 === errors; + if (!valid7) { + break; + } + } + } else { + const err4 = { + instancePath: + instancePath + + '/extensions/' + + key2 + .replace(/~/g, '~0') + .replace(/\//g, '~1') + + '/' + + key4 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/additionalProperties/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err4]; + } else { + vErrors.push(err4); + } + errors++; + } + } + var valid6 = _errs26 === errors; + if (!valid6) { + break; + } + } + } else { + const err5 = { + instancePath: + instancePath + + '/extensions/' + + key2 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf/2/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }; + if (vErrors === null) { + vErrors = [err5]; + } else { + vErrors.push(err5); + } + errors++; + } + } + var _valid0 = _errs23 === errors; + valid4 = valid4 || _valid0; + } + } + if (!valid4) { + const err6 = { + instancePath: + instancePath + + '/extensions/' + + key2.replace(/~/g, '~0').replace(/\//g, '~1'), + schemaPath: + '#/definitions/Extensions/additionalProperties/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err6]; + } else { + vErrors.push(err6); + } + errors++; + validate21.errors = vErrors; + return false; + } else { + errors = _errs15; + if (vErrors !== null) { + if (_errs15) { + vErrors.length = _errs15; + } else { + vErrors = null; + } + } + } + var valid3 = _errs14 === errors; + if (!valid3) { + break; + } + } + } else { + validate21.errors = [ + { + instancePath: instancePath + '/extensions', + schemaPath: '#/definitions/Extensions/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs10 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.identities !== undefined) { + let data9 = data.identities; + const _errs31 = errors; + if (errors === _errs31) { + if ( + data9 && + typeof data9 == 'object' && + !Array.isArray(data9) + ) { + for (const key6 in data9) { + const _errs34 = errors; + if ( + !validate26(data9[key6], { + instancePath: + instancePath + + '/identities/' + + key6.replace(/~/g, '~0').replace(/\//g, '~1'), + parentData: data9, + parentDataProperty: key6, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate26.errors + : vErrors.concat(validate26.errors); + errors = vErrors.length; + } + var valid8 = _errs34 === errors; + if (!valid8) { + break; + } + } + } else { + validate21.errors = [ + { + instancePath: instancePath + '/identities', + schemaPath: '#/properties/identities/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs31 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.latestRevision !== undefined) { + const _errs35 = errors; + if (typeof data.latestRevision !== 'string') { + validate21.errors = [ + { + instancePath: instancePath + '/latestRevision', + schemaPath: '#/properties/latestRevision/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs35 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.license !== undefined) { + const _errs37 = errors; + if (typeof data.license !== 'string') { + validate21.errors = [ + { + instancePath: instancePath + '/license', + schemaPath: '#/properties/license/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }, + ]; + return false; + } + var valid0 = _errs37 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.registryIdentity !== undefined) { + let data13 = data.registryIdentity; + const _errs39 = errors; + const _errs40 = errors; + let valid9 = false; + const _errs41 = errors; + if ( + !validate43(data13, { + instancePath: instancePath + '/registryIdentity', + parentData: data, + parentDataProperty: 'registryIdentity', + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate43.errors + : vErrors.concat(validate43.errors); + errors = vErrors.length; + } + var _valid1 = _errs41 === errors; + valid9 = valid9 || _valid1; + if (!valid9) { + const _errs42 = errors; + if (typeof data13 !== 'string') { + const err7 = { + instancePath: + instancePath + '/registryIdentity', + schemaPath: + '#/properties/registryIdentity/anyOf/1/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err7]; + } else { + vErrors.push(err7); + } + errors++; + } + var _valid1 = _errs42 === errors; + valid9 = valid9 || _valid1; + } + if (!valid9) { + const err8 = { + instancePath: instancePath + '/registryIdentity', + schemaPath: '#/properties/registryIdentity/anyOf', + keyword: 'anyOf', + params: {}, + message: 'must match a schema in anyOf', + }; + if (vErrors === null) { + vErrors = [err8]; + } else { + vErrors.push(err8); + } + errors++; + validate21.errors = vErrors; + return false; + } else { + errors = _errs40; + if (vErrors !== null) { + if (_errs40) { + vErrors.length = _errs40; + } else { + vErrors = null; + } + } + } + var valid0 = _errs39 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.tags !== undefined) { + let data14 = data.tags; + const _errs44 = errors; + if (errors === _errs44) { + if ( + data14 && + typeof data14 == 'object' && + !Array.isArray(data14) + ) { + for (const key7 in data14) { + const _errs47 = errors; + if ( + !validate45(data14[key7], { + instancePath: + instancePath + + '/tags/' + + key7 + .replace(/~/g, '~0') + .replace(/\//g, '~1'), + parentData: data14, + parentDataProperty: key7, + rootData, + }) + ) { + vErrors = + vErrors === null + ? validate45.errors + : vErrors.concat(validate45.errors); + errors = vErrors.length; + } + var valid10 = _errs47 === errors; + if (!valid10) { + break; + } + } + } else { + validate21.errors = [ + { + instancePath: instancePath + '/tags', + schemaPath: '#/properties/tags/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs44 === errors; + } else { + var valid0 = true; + } + if (valid0) { + if (data.version !== undefined) { + let data16 = data.version; + const _errs48 = errors; + if (errors === _errs48) { + if ( + data16 && + typeof data16 == 'object' && + !Array.isArray(data16) + ) { + let missing1; + if ( + (data16.major === undefined && + (missing1 = 'major')) || + (data16.minor === undefined && + (missing1 = 'minor')) || + (data16.patch === undefined && + (missing1 = 'patch')) + ) { + validate21.errors = [ + { + instancePath: instancePath + '/version', + schemaPath: + '#/properties/version/required', + keyword: 'required', + params: { missingProperty: missing1 }, + message: + "must have required property '" + + missing1 + + "'", + }, + ]; + return false; + } else { + const _errs50 = errors; + for (const key8 in data16) { + if ( + !( + key8 === 'major' || + key8 === 'minor' || + key8 === 'patch' + ) + ) { + validate21.errors = [ + { + instancePath: + instancePath + '/version', + schemaPath: + '#/properties/version/additionalProperties', + keyword: 'additionalProperties', + params: { + additionalProperty: key8, + }, + message: + 'must NOT have additional properties', + }, + ]; + return false; + break; + } + } + if (_errs50 === errors) { + if (data16.major !== undefined) { + let data17 = data16.major; + const _errs51 = errors; + if ( + !( + typeof data17 == 'number' && + isFinite(data17) + ) + ) { + validate21.errors = [ + { + instancePath: + instancePath + '/version/major', + schemaPath: + '#/properties/version/properties/major/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid11 = _errs51 === errors; + } else { + var valid11 = true; + } + if (valid11) { + if (data16.minor !== undefined) { + let data18 = data16.minor; + const _errs53 = errors; + if ( + !( + typeof data18 == 'number' && + isFinite(data18) + ) + ) { + validate21.errors = [ + { + instancePath: + instancePath + + '/version/minor', + schemaPath: + '#/properties/version/properties/minor/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid11 = _errs53 === errors; + } else { + var valid11 = true; + } + if (valid11) { + if (data16.patch !== undefined) { + let data19 = data16.patch; + const _errs55 = errors; + if ( + !( + typeof data19 == 'number' && + isFinite(data19) + ) + ) { + validate21.errors = [ + { + instancePath: + instancePath + + '/version/patch', + schemaPath: + '#/properties/version/properties/patch/type', + keyword: 'type', + params: { type: 'number' }, + message: 'must be number', + }, + ]; + return false; + } + var valid11 = _errs55 === errors; + } else { + var valid11 = true; + } + } + } + } + } + } else { + validate21.errors = [ + { + instancePath: instancePath + '/version', + schemaPath: '#/properties/version/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + var valid0 = _errs48 === errors; + } else { + var valid0 = true; + } + } + } + } + } + } + } + } + } + } + } + } + } else { + validate21.errors = [ + { + instancePath, + schemaPath: '#/type', + keyword: 'type', + params: { type: 'object' }, + message: 'must be object', + }, + ]; + return false; + } + } + validate21.errors = vErrors; + return errors === 0; +} +function validate20( + data, + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, +) { + let vErrors = null; + let errors = 0; + if ( + !validate21(data, { + instancePath, + parentData, + parentDataProperty, + rootData, + }) + ) { + vErrors = + vErrors === null ? validate21.errors : vErrors.concat(validate21.errors); + errors = vErrors.length; + } + validate20.errors = vErrors; + return errors === 0; +} diff --git a/src/lib/schema/ajv/validate-wallet-template.d.ts b/src/lib/schema/ajv/validate-wallet-template.d.ts new file mode 100644 index 00000000..75542399 --- /dev/null +++ b/src/lib/schema/ajv/validate-wallet-template.d.ts @@ -0,0 +1,7 @@ +import type { WalletTemplate } from '../../lib.js'; + +import type { AjvValidator } from './ajv-types.js'; + +declare const validator: AjvValidator; +// eslint-disable-next-line import/no-default-export +export default validator; diff --git a/src/lib/schema/ajv/validate-authentication-template.js b/src/lib/schema/ajv/validate-wallet-template.js similarity index 91% rename from src/lib/schema/ajv/validate-authentication-template.js rename to src/lib/schema/ajv/validate-wallet-template.js index ae53a16d..a111ba86 100644 --- a/src/lib/schema/ajv/validate-authentication-template.js +++ b/src/lib/schema/ajv/validate-wallet-template.js @@ -1,29 +1,45 @@ export default validate20; const schema22 = { - $ref: '#/definitions/AuthenticationTemplate', + $ref: '#/definitions/WalletTemplate', $schema: 'http://json-schema.org/draft-07/schema#', definitions: { - AuthenticationTemplate: { + AuthenticationVirtualMachineIdentifier: { + description: + "Allowable identifiers for authentication virtual machine versions. The `BCH` prefix identifies the Bitcoin Cash network, the `XEC` prefix identifies the eCash network, the `BSV` prefix identifies the Bitcoin SV network, and the `BTC` prefix identifies the Bitcoin Core network. VM versions are named according to the date they were deployed on the indicated network.\n\nFor each network prefix, a `_SPEC` VM version is reserved to indicate that the template requires a custom, not-yet-deployed VM version (e.g. one or more CHIPs). By convention, templates marked for `_SPEC` VMs should indicate their requirements in the template description. After deployment of the `_SPEC` VM, when template compatibility is verified, the template's `supported` array should be updated to indicate compatibility with the live VM version.", + enum: [ + 'BCH_2020_05', + 'BCH_2021_05', + 'BCH_2022_05', + 'BCH_2023_05', + 'BCH_SPEC', + 'BSV_2020_02', + 'BSV_SPEC', + 'BTC_2017_08', + 'BTC_SPEC', + 'XEC_2020_05', + 'XEC_SPEC', + ], + type: 'string', + }, + WalletTemplate: { additionalProperties: false, description: - 'An `AuthenticationTemplate` (A.K.A. `CashAssembly Template`) specifies a set of locking scripts, unlocking scripts, and other information required to use a certain authentication scheme. Templates fully describe wallets and protocols in a way that can be shared between software clients.', + 'A `WalletTemplate` specifies a set of locking scripts, unlocking scripts, and other information required to use a certain wallet protocol. Templates fully describe wallet protocols in a way that can be shared between software clients.', properties: { $schema: { description: - 'The URI that identifies the JSON Schema used by this template. Try: `https://libauth.org/schemas/authentication-template-v0.schema.json` to enable documentation, autocompletion, and validation in JSON documents.', + 'The URI that identifies the JSON Schema used by this template. Try: `https://libauth.org/schemas/wallet-template-v0.schema.json` to enable documentation, autocompletion, and validation in JSON documents.', type: 'string', }, description: { description: - 'An optionally multi-line, free-form, human-readable description for this authentication template (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.', + 'An optionally multi-line, free-form, human-readable description for this wallet template (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.\n\nDescriptions have no length limit, but in user interfaces with limited space, they should be hidden beyond the first newline character or `140` characters until revealed by the user (e.g. by hiding the remaining description until the user activates a "show more" link).', type: 'string', }, entities: { - additionalProperties: { - $ref: '#/definitions/AuthenticationTemplateEntity', - }, + additionalProperties: { $ref: '#/definitions/WalletTemplateEntity' }, description: - 'A map of entities defined in this authentication template.\n\nObject keys are used as entity identifiers, and by convention, should use `snake_case`.', + 'A map of entities defined in this wallet template.\n\nObject keys are used as entity identifiers, and by convention, should use `snake_case`.', type: 'object', }, name: { @@ -33,23 +49,23 @@ const schema22 = { }, scenarios: { additionalProperties: { - $ref: '#/definitions/AuthenticationTemplateScenario', + $ref: '#/definitions/WalletTemplateScenario', }, description: - 'A scenario describes a context in which one or more scripts might be used. Scenarios are used for transaction estimation and as an integrated testing system for authentication templates.\n\nObject keys are used as scenario identifiers, and by convention, should use `snake_case`.', + 'A scenario describes a context in which one or more scripts might be used. Scenarios are used for transaction estimation and as an integrated testing system for wallet templates.\n\nObject keys are used as scenario identifiers, and by convention, should use `snake_case`.', type: 'object', }, scripts: { additionalProperties: { anyOf: [ - { $ref: '#/definitions/AuthenticationTemplateScript' }, - { $ref: '#/definitions/AuthenticationTemplateScriptLocking' }, - { $ref: '#/definitions/AuthenticationTemplateScriptTested' }, - { $ref: '#/definitions/AuthenticationTemplateScriptUnlocking' }, + { $ref: '#/definitions/WalletTemplateScript' }, + { $ref: '#/definitions/WalletTemplateScriptLocking' }, + { $ref: '#/definitions/WalletTemplateScriptTested' }, + { $ref: '#/definitions/WalletTemplateScriptUnlocking' }, ], }, description: - 'A map of scripts used in this authentication template.\n\nObject keys are used as script identifiers, and by convention, should use `snake_case`.', + 'A map of scripts used in this wallet template.\n\nObject keys are used as script identifiers, and by convention, should use `snake_case`.', type: 'object', }, supported: { @@ -63,40 +79,35 @@ const schema22 = { version: { const: 0, description: - 'A number identifying the format of this AuthenticationTemplate. Currently, this implementation requires `version` be set to `0`.', + 'A number identifying the format of this WalletTemplate. Currently, this implementation requires `version` be set to `0`.', type: 'number', }, }, required: ['entities', 'scripts', 'supported', 'version'], type: 'object', }, - AuthenticationTemplateAddressData: { + WalletTemplateAddressData: { additionalProperties: false, properties: { description: { description: - 'A single-line, human readable description for this address data.', + 'A single-line, human readable description for this variable (for use in user interfaces).', type: 'string', }, name: { description: - 'A single-line, Title Case, human-readable name for this address data.', - type: 'string', - }, - type: { - const: 'AddressData', - description: - '`AddressData` is the most low-level variable type. It must be collected and stored each time a script is generated (usually, a locking script). `AddressData` can include any type of data, and can be used in any way.\n\nFor more persistent data, use `WalletData`.', + 'A single-line, Title Case, human-readable name for this variable (for use in user interfaces).', type: 'string', }, + type: { const: 'AddressData', type: 'string' }, }, required: ['type'], type: 'object', }, - AuthenticationTemplateEntity: { + WalletTemplateEntity: { additionalProperties: false, description: - 'An object describing the configuration for a particular entity within an authentication template.', + 'An object describing the configuration for a particular entity within an wallet template.', properties: { description: { description: @@ -116,7 +127,7 @@ const schema22 = { }, variables: { additionalProperties: { - $ref: '#/definitions/AuthenticationTemplateVariable', + $ref: '#/definitions/WalletTemplateVariable', }, description: "A map of variables that must be provided by this entity for use in the template's scripts. Some variables are required before locking script generation, while some variables can or must be resolved only before unlocking script generation.\n\nObject keys are used as variable identifiers, and by convention, should use `snake_case`.", @@ -125,7 +136,7 @@ const schema22 = { }, type: 'object', }, - AuthenticationTemplateHdKey: { + WalletTemplateHdKey: { additionalProperties: false, properties: { addressOffset: { @@ -135,7 +146,7 @@ const schema22 = { }, description: { description: - 'A single-line, human readable description for this HD key.', + 'A single-line, human readable description for this variable (for use in user interfaces).', type: 'string', }, hdPublicKeyDerivationPath: { @@ -145,9 +156,14 @@ const schema22 = { }, name: { description: - 'A single-line, Title Case, human-readable name for this HD key.', + 'A single-line, Title Case, human-readable name for this variable (for use in user interfaces).', type: 'string', }, + neverSignTwice: { + description: + 'If set to `true`, indicates that this key should never be used to sign two different messages.\n\nThis is useful for contracts that use zero-confirmation escrow systems to guarantee against double-spend attempts. By indicating that the user could be subjected to losses if a key were used in multiple signatures, templates can ensure that wallet implementations apply appropriate safeguards around use of the key.\n\nDefaults to `false`.', + type: 'boolean', + }, privateDerivationPath: { description: "The derivation path used to derive this `HdKey` from the owning entity's HD private key. By default, `m/i`.\n\nThis path uses the notation specified in BIP32 and the `i` character to represent the location of the `addressIndex`:\n\nThe first character must be `m` (private derivation), followed by sets of `/` and a number representing the child index used in the derivation at that depth. Hardened derivation is represented by a trailing `'`, and hardened child indexes are represented with the hardened index offset (`2147483648`) subtracted. The `i` character is replaced with the value of `addressIndex` plus this `HdKey`'s `addressOffset`. If the `i` character is followed by `'`, the hardened index offset is added (`2147483648`) and hardened derivation is used.\n\nFor example, `m/0/1'/i'` uses 3 levels of derivation, with child indexes in the following order:\n\n`derive(derive(derive(node, 0), 2147483648 + 1), 2147483648 + addressIndex + addressOffset)`\n\nBecause hardened derivation requires knowledge of the private key, `HdKey` variables with `derivationPath`s that include hardened derivation cannot use HD public derivation (the `hdPublicKeys` property in `CompilationData`). Instead, compilation requires the respective HD private key (`CompilationData.hdKeys.hdPrivateKeys`) or the fully-derived public key (`CompilationData.hdKeys.derivedPublicKeys`).", @@ -158,46 +174,41 @@ const schema22 = { "The derivation path used to derive this `HdKey`'s public key from the owning entity's HD public key. If not set, the public equivalent of `privateDerivationPath` is used. For the `privateDerivationPath` default of `m/i`, this is `M/i`.\n\nIf `privateDerivationPath` uses hardened derivation for some levels, but later derivation levels use non-hardened derivation, `publicDerivationPath` can be used to specify a public derivation path beginning from `hdPublicKeyDerivationPath` (i.e. `publicDerivationPath` should always be a non-hardened segment of `privateDerivationPath` that follows `hdPublicKeyDerivationPath`).\n\nThe first character must be `M` (public derivation), followed by sets of `/` and a number representing the child index used in the non-hardened derivation at that depth.\n\nFor example, if `privateDerivationPath` is `m/0'/i`, it is not possible to derive the equivalent public key with only the HD public key `M`. (The path \"`M/0'/i`\" is impossible.) However, given the HD public key for `m/0'`, it is possible to derive the public key of `m/0'/i` for any `i`. In this case, `hdPublicKeyDerivationPath` would be `m/0'` and `publicDerivationPath` would be the remaining `M/i`.", type: 'string', }, - type: { - const: 'HdKey', - description: - 'The `HdKey` (Hierarchical-Deterministic Key) type automatically manages key generation and mapping in a standard way. For greater control, use `Key`.', - type: 'string', - }, + type: { const: 'HdKey', type: 'string' }, }, required: ['type'], type: 'object', }, - AuthenticationTemplateKey: { + WalletTemplateKey: { additionalProperties: false, properties: { description: { description: - 'A single-line, human readable description for this key.', + 'A single-line, human readable description for this variable (for use in user interfaces).', type: 'string', }, name: { description: - 'A single-line, Title Case, human-readable name for this key.', + 'A single-line, Title Case, human-readable name for this variable (for use in user interfaces).', type: 'string', }, - type: { - const: 'Key', + neverSignTwice: { description: - 'The `Key` type provides fine-grained control over key generation and mapping. Most templates should instead use `HdKey`.\n\nAny HD (Hierarchical-Deterministic) derivation must be completed outside of the templating system and provided at the time of use.', - type: 'string', + 'If set to `true`, indicates that this key should never be used to sign two different messages.\n\nThis is useful for contracts that use zero-confirmation escrow systems to guarantee against double-spend attempts. By indicating that the user could be subjected to losses if a key were used in multiple signatures, templates can ensure that wallet implementations apply appropriate safeguards around use of the key.\n\nDefaults to `false`.', + type: 'boolean', }, + type: { const: 'Key', type: 'string' }, }, required: ['type'], type: 'object', }, - AuthenticationTemplateScenario: { + WalletTemplateScenario: { additionalProperties: false, description: - 'An object describing the configuration for a particular scenario within an authentication template.', + 'An object describing the configuration for a particular scenario within an wallet template.', properties: { data: { - $ref: '#/definitions/AuthenticationTemplateScenarioData', + $ref: '#/definitions/WalletTemplateScenarioData', description: "An object defining the data to use while compiling this scenario. The properties specified here are used to extend the existing scenario data based on this scenario's `extends` property.\n\nEach property is extended individually – to unset a previously-set property, the property must be individually overridden in this object.", }, @@ -219,9 +230,7 @@ const schema22 = { sourceOutputs: { description: 'The list of source outputs (a.k.a. UTXOs) to use when generating the compilation context for this scenario.\n\nThe `sourceOutputs` property must have the same length as `transaction.inputs`, and each source output must be ordered to match the index of the input that spends it.\n\nTo be valid the `sourceOutputs` property must have exactly one source output with `lockingBytecode` set to `["slot"]` – the output at the same index as the `["slot"]` input in `transaction.inputs`.\n\nIf undefined, defaults to `[{ "lockingBytecode": ["slot"] }]`.', - items: { - $ref: '#/definitions/AuthenticationTemplateScenarioSourceOutput', - }, + items: { $ref: '#/definitions/WalletTemplateScenarioSourceOutput' }, type: 'array', }, transaction: { @@ -232,9 +241,7 @@ const schema22 = { inputs: { description: 'The list of inputs to use when generating the transaction for this scenario.\n\nTo be valid the `inputs` property must have exactly one input with `unlockingBytecode` set to `["slot"]`. This is the input in which the unlocking script under test will be placed.\n\nIf undefined, inherits the default scenario `inputs` value: `[{ "unlockingBytecode": ["slot"] }]`.', - items: { - $ref: '#/definitions/AuthenticationTemplateScenarioInput', - }, + items: { $ref: '#/definitions/WalletTemplateScenarioInput' }, type: 'array', }, locktime: { @@ -246,7 +253,7 @@ const schema22 = { description: 'The list of outputs to use when generating the transaction for this scenario.\n\nIf undefined, defaults to `[{ "lockingBytecode": {} }]`.', items: { - $ref: '#/definitions/AuthenticationTemplateScenarioTransactionOutput', + $ref: '#/definitions/WalletTemplateScenarioTransactionOutput', }, type: 'array', }, @@ -261,14 +268,14 @@ const schema22 = { }, type: 'object', }, - AuthenticationTemplateScenarioBytecode: { + WalletTemplateScenarioBytecode: { anyOf: [ { type: 'string' }, { additionalProperties: false, properties: { overrides: { - $ref: '#/definitions/AuthenticationTemplateScenarioData', + $ref: '#/definitions/WalletTemplateScenarioData', description: 'Scenario data that extends the scenario\'s top-level `data` during script compilation.\n\nEach property is extended individually – to modify a property set by the top-level scenario `data`, the new value must be listed here.\n\nDefaults to `{}` for `sourceOutputs` and `transaction.inputs`; defaults to `{ "hdKeys": { "addressIndex": 1 } }` for `transaction.outputs`.', }, @@ -290,9 +297,9 @@ const schema22 = { }, ], description: - 'A type that describes the configuration for a particular locking or unlocking bytecode within an authentication template scenario.\n\nBytecode may be specified as either a hexadecimal-encoded string or an object describing the required compilation.\n\nFor `sourceOutputs` and `transaction.inputs`, defaults to `{ script: ["copy"], overrides: {} }`. For `transaction.outputs`, defaults to `{ script: ["copy"], overrides: { "hdKeys": { "addressIndex": 1 } } }`.', + 'A type that describes the configuration for a particular locking or unlocking bytecode within a wallet template scenario.\n\nBytecode may be specified as either a hexadecimal-encoded string or an object describing the required compilation.\n\nFor `sourceOutputs` and `transaction.inputs`, defaults to `{ script: ["copy"], overrides: {} }`. For `transaction.outputs`, defaults to `{ script: ["copy"], overrides: { "hdKeys": { "addressIndex": 1 } } }`.', }, - AuthenticationTemplateScenarioData: { + WalletTemplateScenarioData: { additionalProperties: false, description: 'An object defining the data to use while compiling a scenario.', @@ -355,10 +362,10 @@ const schema22 = { }, type: 'object', }, - AuthenticationTemplateScenarioInput: { + WalletTemplateScenarioInput: { additionalProperties: false, description: - 'An example input used to define a scenario for an authentication template.', + 'An example input used to define a scenario for a wallet template.', properties: { outpointIndex: { description: @@ -377,7 +384,7 @@ const schema22 = { }, unlockingBytecode: { anyOf: [ - { $ref: '#/definitions/AuthenticationTemplateScenarioBytecode' }, + { $ref: '#/definitions/WalletTemplateScenarioBytecode' }, { items: { const: 'slot', type: 'string' }, maxItems: 1, @@ -386,18 +393,18 @@ const schema22 = { }, ], description: - 'The `unlockingBytecode` value of this input for this scenario. This must be either `["slot"]`, indicating that this input contains the `unlockingBytecode` under test by the scenario, or an `AuthenticationTemplateScenarioBytecode`.\n\nFor a scenario to be valid, `unlockingBytecode` must be `["slot"]` for exactly one input in the scenario.\n\nDefaults to `["slot"]`.', + 'The `unlockingBytecode` value of this input for this scenario. This must be either `["slot"]`, indicating that this input contains the `unlockingBytecode` under test by the scenario, or an `WalletTemplateScenarioBytecode`.\n\nFor a scenario to be valid, `unlockingBytecode` must be `["slot"]` for exactly one input in the scenario.\n\nDefaults to `["slot"]`.', }, }, type: 'object', }, - 'AuthenticationTemplateScenarioOutput': { + 'WalletTemplateScenarioOutput': { additionalProperties: false, description: - 'An example output used to define a scenario for an authentication template.', + 'An example output used to define a scenario for a wallet template.', properties: { lockingBytecode: { - $ref: '#/definitions/AuthenticationTemplateScenarioBytecode', + $ref: '#/definitions/WalletTemplateScenarioBytecode', description: 'The locking bytecode used to encumber this output.\n\n`lockingBytecode` values may be provided as a hexadecimal-encoded string or as an object describing the required compilation. If undefined, defaults to `{}`, which uses the default values for `script` and `overrides`, respectively.\n\nOnly source outputs may specify a `lockingBytecode` of `["slot"]`; this identifies the source output in which the locking script under test will be placed. (To be valid, every scenario\'s `sourceOutputs` property must have exactly one source output slot and one input slot at the same index.)', }, @@ -446,14 +453,14 @@ const schema22 = { }, type: 'object', }, - 'AuthenticationTemplateScenarioOutput': { + 'WalletTemplateScenarioOutput': { additionalProperties: false, description: - 'An example output used to define a scenario for an authentication template.', + 'An example output used to define a scenario for a wallet template.', properties: { lockingBytecode: { anyOf: [ - { $ref: '#/definitions/AuthenticationTemplateScenarioBytecode' }, + { $ref: '#/definitions/WalletTemplateScenarioBytecode' }, { items: { const: 'slot', type: 'string' }, maxItems: 1, @@ -509,20 +516,19 @@ const schema22 = { }, type: 'object', }, - AuthenticationTemplateScenarioSourceOutput: { - $ref: '#/definitions/AuthenticationTemplateScenarioOutput', - description: - 'A source output used by an authentication template scenario.', + WalletTemplateScenarioSourceOutput: { + $ref: '#/definitions/WalletTemplateScenarioOutput', + description: 'A source output used by a wallet template scenario.', }, - AuthenticationTemplateScenarioTransactionOutput: { - $ref: '#/definitions/AuthenticationTemplateScenarioOutput', + WalletTemplateScenarioTransactionOutput: { + $ref: '#/definitions/WalletTemplateScenarioOutput', description: - 'A transaction output used to define an authentication template scenario transaction.', + 'A transaction output used to define a wallet template scenario transaction.', }, - AuthenticationTemplateScript: { + WalletTemplateScript: { additionalProperties: false, description: - 'An object describing the configuration for a particular script within an authentication template.', + 'An object describing the configuration for a particular script within an wallet template.', properties: { name: { description: @@ -537,7 +543,7 @@ const schema22 = { required: ['script'], type: 'object', }, - AuthenticationTemplateScriptLocking: { + WalletTemplateScriptLocking: { additionalProperties: false, properties: { lockingType: { @@ -559,7 +565,7 @@ const schema22 = { required: ['lockingType', 'script'], type: 'object', }, - AuthenticationTemplateScriptTest: { + WalletTemplateScriptTest: { additionalProperties: false, properties: { check: { @@ -599,7 +605,7 @@ const schema22 = { required: ['check'], type: 'object', }, - AuthenticationTemplateScriptTested: { + WalletTemplateScriptTested: { additionalProperties: false, properties: { name: { @@ -618,7 +624,7 @@ const schema22 = { }, tests: { additionalProperties: { - $ref: '#/definitions/AuthenticationTemplateScriptTest', + $ref: '#/definitions/WalletTemplateScriptTest', }, description: 'One or more tests that can be used during development and during template validation to confirm the correctness of this tested script.', @@ -628,7 +634,7 @@ const schema22 = { required: ['script', 'tests'], type: 'object', }, - AuthenticationTemplateScriptUnlocking: { + WalletTemplateScriptUnlocking: { additionalProperties: false, properties: { ageLock: { @@ -638,7 +644,7 @@ const schema22 = { }, estimate: { description: - 'The identifier of the scenario to use for this unlocking script when compiling an estimated transaction.\n\nUsing estimate scenarios, it\'s possible for wallet software to compute an "estimated transaction", an invalid transaction that is guaranteed to be the same byte length as the final transaction. This length can be used to calculate the required transaction fee and assign values to the transaction\'s change output(s). Because estimate scenarios provide "estimated" values for all variables, this estimation can be done by a single entity without input from other entities.\n\nIf not provided, the default scenario will be used for estimation. The default scenario only provides values for each `Key` and `HdKey` variable, so compilations requiring other variables will produce errors. See `AuthenticationTemplateScenario.extends` for details.', + 'The identifier of the scenario to use for this unlocking script when compiling an estimated transaction.\n\nUsing estimate scenarios, it\'s possible for wallet software to compute an "estimated transaction", an invalid transaction that is guaranteed to be the same byte length as the final transaction. This length can be used to calculate the required transaction fee and assign values to the transaction\'s change output(s). Because estimate scenarios provide "estimated" values for all variables, this estimation can be done by a single entity without input from other entities.\n\nIf not provided, the default scenario will be used for estimation. The default scenario only provides values for each `Key` and `HdKey` variable, so compilations requiring other variables will produce errors. See `WalletTemplateScenario.extends` for details.', type: 'string', }, fails: { @@ -683,78 +689,53 @@ const schema22 = { required: ['script', 'unlocks'], type: 'object', }, - AuthenticationTemplateVariable: { + WalletTemplateVariable: { anyOf: [ - { $ref: '#/definitions/AuthenticationTemplateAddressData' }, - { $ref: '#/definitions/AuthenticationTemplateHdKey' }, - { $ref: '#/definitions/AuthenticationTemplateKey' }, - { $ref: '#/definitions/AuthenticationTemplateWalletData' }, + { $ref: '#/definitions/WalletTemplateAddressData' }, + { $ref: '#/definitions/WalletTemplateHdKey' }, + { $ref: '#/definitions/WalletTemplateKey' }, + { $ref: '#/definitions/WalletTemplateWalletData' }, ], }, - AuthenticationTemplateWalletData: { + WalletTemplateWalletData: { additionalProperties: false, properties: { description: { description: - 'A single-line, human readable description for this wallet data.', + 'A single-line, human readable description for this variable (for use in user interfaces).', type: 'string', }, name: { description: - 'A single-line, Title Case, human-readable name for this wallet data.', - type: 'string', - }, - type: { - const: 'WalletData', - description: - 'The `WalletData` type provides a static piece of data that should be collected once and stored at the time of wallet creation. `WalletData` should be persistent for the life of the wallet, rather than changing from locking script to locking script.\n\nFor address-specific data, use `AddressData`.', + 'A single-line, Title Case, human-readable name for this variable (for use in user interfaces).', type: 'string', }, + type: { const: 'WalletData', type: 'string' }, }, required: ['type'], type: 'object', }, - AuthenticationVirtualMachineIdentifier: { - description: - "Allowable identifiers for authentication virtual machine versions. The `BCH` prefix identifies the Bitcoin Cash network, the `XEC` prefix identifies the eCash network, the `BSV` prefix identifies the Bitcoin SV network, and the `BTC` prefix identifies the Bitcoin Core network. VM versions are named according to the date they were deployed on the indicated network.\n\nFor each network prefix, a `_SPEC` VM version is reserved to indicate that the template requires a custom, not-yet-deployed VM version (e.g. one or more CHIPs). By convention, templates marked for `_SPEC` VMs should indicate their requirements in the template description. After deployment of the `_SPEC` VM, when template compatibility is verified, the template's `supported` array should be updated to indicate compatibility with the live VM version.", - enum: [ - 'BCH_2020_05', - 'BCH_2021_05', - 'BCH_2022_05', - 'BCH_2023_05', - 'BCH_SPEC', - 'BSV_2020_02', - 'BSV_SPEC', - 'BTC_2017_08', - 'BTC_SPEC', - 'XEC_2020_05', - 'XEC_SPEC', - ], - type: 'string', - }, }, }; const schema23 = { additionalProperties: false, description: - 'An `AuthenticationTemplate` (A.K.A. `CashAssembly Template`) specifies a set of locking scripts, unlocking scripts, and other information required to use a certain authentication scheme. Templates fully describe wallets and protocols in a way that can be shared between software clients.', + 'A `WalletTemplate` specifies a set of locking scripts, unlocking scripts, and other information required to use a certain wallet protocol. Templates fully describe wallet protocols in a way that can be shared between software clients.', properties: { $schema: { description: - 'The URI that identifies the JSON Schema used by this template. Try: `https://libauth.org/schemas/authentication-template-v0.schema.json` to enable documentation, autocompletion, and validation in JSON documents.', + 'The URI that identifies the JSON Schema used by this template. Try: `https://libauth.org/schemas/wallet-template-v0.schema.json` to enable documentation, autocompletion, and validation in JSON documents.', type: 'string', }, description: { description: - 'An optionally multi-line, free-form, human-readable description for this authentication template (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.', + 'An optionally multi-line, free-form, human-readable description for this wallet template (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.\n\nDescriptions have no length limit, but in user interfaces with limited space, they should be hidden beyond the first newline character or `140` characters until revealed by the user (e.g. by hiding the remaining description until the user activates a "show more" link).', type: 'string', }, entities: { - additionalProperties: { - $ref: '#/definitions/AuthenticationTemplateEntity', - }, + additionalProperties: { $ref: '#/definitions/WalletTemplateEntity' }, description: - 'A map of entities defined in this authentication template.\n\nObject keys are used as entity identifiers, and by convention, should use `snake_case`.', + 'A map of entities defined in this wallet template.\n\nObject keys are used as entity identifiers, and by convention, should use `snake_case`.', type: 'object', }, name: { @@ -763,24 +744,22 @@ const schema23 = { type: 'string', }, scenarios: { - additionalProperties: { - $ref: '#/definitions/AuthenticationTemplateScenario', - }, + additionalProperties: { $ref: '#/definitions/WalletTemplateScenario' }, description: - 'A scenario describes a context in which one or more scripts might be used. Scenarios are used for transaction estimation and as an integrated testing system for authentication templates.\n\nObject keys are used as scenario identifiers, and by convention, should use `snake_case`.', + 'A scenario describes a context in which one or more scripts might be used. Scenarios are used for transaction estimation and as an integrated testing system for wallet templates.\n\nObject keys are used as scenario identifiers, and by convention, should use `snake_case`.', type: 'object', }, scripts: { additionalProperties: { anyOf: [ - { $ref: '#/definitions/AuthenticationTemplateScript' }, - { $ref: '#/definitions/AuthenticationTemplateScriptLocking' }, - { $ref: '#/definitions/AuthenticationTemplateScriptTested' }, - { $ref: '#/definitions/AuthenticationTemplateScriptUnlocking' }, + { $ref: '#/definitions/WalletTemplateScript' }, + { $ref: '#/definitions/WalletTemplateScriptLocking' }, + { $ref: '#/definitions/WalletTemplateScriptTested' }, + { $ref: '#/definitions/WalletTemplateScriptUnlocking' }, ], }, description: - 'A map of scripts used in this authentication template.\n\nObject keys are used as script identifiers, and by convention, should use `snake_case`.', + 'A map of scripts used in this wallet template.\n\nObject keys are used as script identifiers, and by convention, should use `snake_case`.', type: 'object', }, supported: { @@ -792,7 +771,7 @@ const schema23 = { version: { const: 0, description: - 'A number identifying the format of this AuthenticationTemplate. Currently, this implementation requires `version` be set to `0`.', + 'A number identifying the format of this WalletTemplate. Currently, this implementation requires `version` be set to `0`.', type: 'number', }, }, @@ -802,7 +781,7 @@ const schema23 = { const schema37 = { additionalProperties: false, description: - 'An object describing the configuration for a particular script within an authentication template.', + 'An object describing the configuration for a particular script within an wallet template.', properties: { name: { description: @@ -849,7 +828,7 @@ const schema41 = { }, estimate: { description: - 'The identifier of the scenario to use for this unlocking script when compiling an estimated transaction.\n\nUsing estimate scenarios, it\'s possible for wallet software to compute an "estimated transaction", an invalid transaction that is guaranteed to be the same byte length as the final transaction. This length can be used to calculate the required transaction fee and assign values to the transaction\'s change output(s). Because estimate scenarios provide "estimated" values for all variables, this estimation can be done by a single entity without input from other entities.\n\nIf not provided, the default scenario will be used for estimation. The default scenario only provides values for each `Key` and `HdKey` variable, so compilations requiring other variables will produce errors. See `AuthenticationTemplateScenario.extends` for details.', + 'The identifier of the scenario to use for this unlocking script when compiling an estimated transaction.\n\nUsing estimate scenarios, it\'s possible for wallet software to compute an "estimated transaction", an invalid transaction that is guaranteed to be the same byte length as the final transaction. This length can be used to calculate the required transaction fee and assign values to the transaction\'s change output(s). Because estimate scenarios provide "estimated" values for all variables, this estimation can be done by a single entity without input from other entities.\n\nIf not provided, the default scenario will be used for estimation. The default scenario only provides values for each `Key` and `HdKey` variable, so compilations requiring other variables will produce errors. See `WalletTemplateScenario.extends` for details.', type: 'string', }, fails: { @@ -915,7 +894,7 @@ const schema42 = { const schema24 = { additionalProperties: false, description: - 'An object describing the configuration for a particular entity within an authentication template.', + 'An object describing the configuration for a particular entity within an wallet template.', properties: { description: { description: @@ -934,9 +913,7 @@ const schema24 = { type: 'array', }, variables: { - additionalProperties: { - $ref: '#/definitions/AuthenticationTemplateVariable', - }, + additionalProperties: { $ref: '#/definitions/WalletTemplateVariable' }, description: "A map of variables that must be provided by this entity for use in the template's scripts. Some variables are required before locking script generation, while some variables can or must be resolved only before unlocking script generation.\n\nObject keys are used as variable identifiers, and by convention, should use `snake_case`.", type: 'object', @@ -946,10 +923,10 @@ const schema24 = { }; const schema25 = { anyOf: [ - { $ref: '#/definitions/AuthenticationTemplateAddressData' }, - { $ref: '#/definitions/AuthenticationTemplateHdKey' }, - { $ref: '#/definitions/AuthenticationTemplateKey' }, - { $ref: '#/definitions/AuthenticationTemplateWalletData' }, + { $ref: '#/definitions/WalletTemplateAddressData' }, + { $ref: '#/definitions/WalletTemplateHdKey' }, + { $ref: '#/definitions/WalletTemplateKey' }, + { $ref: '#/definitions/WalletTemplateWalletData' }, ], }; const schema26 = { @@ -957,20 +934,15 @@ const schema26 = { properties: { description: { description: - 'A single-line, human readable description for this address data.', + 'A single-line, human readable description for this variable (for use in user interfaces).', type: 'string', }, name: { description: - 'A single-line, Title Case, human-readable name for this address data.', - type: 'string', - }, - type: { - const: 'AddressData', - description: - '`AddressData` is the most low-level variable type. It must be collected and stored each time a script is generated (usually, a locking script). `AddressData` can include any type of data, and can be used in any way.\n\nFor more persistent data, use `WalletData`.', + 'A single-line, Title Case, human-readable name for this variable (for use in user interfaces).', type: 'string', }, + type: { const: 'AddressData', type: 'string' }, }, required: ['type'], type: 'object', @@ -984,7 +956,8 @@ const schema27 = { type: 'number', }, description: { - description: 'A single-line, human readable description for this HD key.', + description: + 'A single-line, human readable description for this variable (for use in user interfaces).', type: 'string', }, hdPublicKeyDerivationPath: { @@ -994,9 +967,14 @@ const schema27 = { }, name: { description: - 'A single-line, Title Case, human-readable name for this HD key.', + 'A single-line, Title Case, human-readable name for this variable (for use in user interfaces).', type: 'string', }, + neverSignTwice: { + description: + 'If set to `true`, indicates that this key should never be used to sign two different messages.\n\nThis is useful for contracts that use zero-confirmation escrow systems to guarantee against double-spend attempts. By indicating that the user could be subjected to losses if a key were used in multiple signatures, templates can ensure that wallet implementations apply appropriate safeguards around use of the key.\n\nDefaults to `false`.', + type: 'boolean', + }, privateDerivationPath: { description: "The derivation path used to derive this `HdKey` from the owning entity's HD private key. By default, `m/i`.\n\nThis path uses the notation specified in BIP32 and the `i` character to represent the location of the `addressIndex`:\n\nThe first character must be `m` (private derivation), followed by sets of `/` and a number representing the child index used in the derivation at that depth. Hardened derivation is represented by a trailing `'`, and hardened child indexes are represented with the hardened index offset (`2147483648`) subtracted. The `i` character is replaced with the value of `addressIndex` plus this `HdKey`'s `addressOffset`. If the `i` character is followed by `'`, the hardened index offset is added (`2147483648`) and hardened derivation is used.\n\nFor example, `m/0/1'/i'` uses 3 levels of derivation, with child indexes in the following order:\n\n`derive(derive(derive(node, 0), 2147483648 + 1), 2147483648 + addressIndex + addressOffset)`\n\nBecause hardened derivation requires knowledge of the private key, `HdKey` variables with `derivationPath`s that include hardened derivation cannot use HD public derivation (the `hdPublicKeys` property in `CompilationData`). Instead, compilation requires the respective HD private key (`CompilationData.hdKeys.hdPrivateKeys`) or the fully-derived public key (`CompilationData.hdKeys.derivedPublicKeys`).", @@ -1007,12 +985,7 @@ const schema27 = { "The derivation path used to derive this `HdKey`'s public key from the owning entity's HD public key. If not set, the public equivalent of `privateDerivationPath` is used. For the `privateDerivationPath` default of `m/i`, this is `M/i`.\n\nIf `privateDerivationPath` uses hardened derivation for some levels, but later derivation levels use non-hardened derivation, `publicDerivationPath` can be used to specify a public derivation path beginning from `hdPublicKeyDerivationPath` (i.e. `publicDerivationPath` should always be a non-hardened segment of `privateDerivationPath` that follows `hdPublicKeyDerivationPath`).\n\nThe first character must be `M` (public derivation), followed by sets of `/` and a number representing the child index used in the non-hardened derivation at that depth.\n\nFor example, if `privateDerivationPath` is `m/0'/i`, it is not possible to derive the equivalent public key with only the HD public key `M`. (The path \"`M/0'/i`\" is impossible.) However, given the HD public key for `m/0'`, it is possible to derive the public key of `m/0'/i` for any `i`. In this case, `hdPublicKeyDerivationPath` would be `m/0'` and `publicDerivationPath` would be the remaining `M/i`.", type: 'string', }, - type: { - const: 'HdKey', - description: - 'The `HdKey` (Hierarchical-Deterministic Key) type automatically manages key generation and mapping in a standard way. For greater control, use `Key`.', - type: 'string', - }, + type: { const: 'HdKey', type: 'string' }, }, required: ['type'], type: 'object', @@ -1021,20 +994,21 @@ const schema28 = { additionalProperties: false, properties: { description: { - description: 'A single-line, human readable description for this key.', + description: + 'A single-line, human readable description for this variable (for use in user interfaces).', type: 'string', }, name: { description: - 'A single-line, Title Case, human-readable name for this key.', + 'A single-line, Title Case, human-readable name for this variable (for use in user interfaces).', type: 'string', }, - type: { - const: 'Key', + neverSignTwice: { description: - 'The `Key` type provides fine-grained control over key generation and mapping. Most templates should instead use `HdKey`.\n\nAny HD (Hierarchical-Deterministic) derivation must be completed outside of the templating system and provided at the time of use.', - type: 'string', + 'If set to `true`, indicates that this key should never be used to sign two different messages.\n\nThis is useful for contracts that use zero-confirmation escrow systems to guarantee against double-spend attempts. By indicating that the user could be subjected to losses if a key were used in multiple signatures, templates can ensure that wallet implementations apply appropriate safeguards around use of the key.\n\nDefaults to `false`.', + type: 'boolean', }, + type: { const: 'Key', type: 'string' }, }, required: ['type'], type: 'object', @@ -1044,27 +1018,22 @@ const schema29 = { properties: { description: { description: - 'A single-line, human readable description for this wallet data.', + 'A single-line, human readable description for this variable (for use in user interfaces).', type: 'string', }, name: { description: - 'A single-line, Title Case, human-readable name for this wallet data.', - type: 'string', - }, - type: { - const: 'WalletData', - description: - 'The `WalletData` type provides a static piece of data that should be collected once and stored at the time of wallet creation. `WalletData` should be persistent for the life of the wallet, rather than changing from locking script to locking script.\n\nFor address-specific data, use `AddressData`.', + 'A single-line, Title Case, human-readable name for this variable (for use in user interfaces).', type: 'string', }, + type: { const: 'WalletData', type: 'string' }, }, required: ['type'], type: 'object', }; function validate23( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -1078,8 +1047,7 @@ function validate23( if (data.type === undefined && (missing0 = 'type')) { const err0 = { instancePath, - schemaPath: - '#/definitions/AuthenticationTemplateAddressData/required', + schemaPath: '#/definitions/WalletTemplateAddressData/required', keyword: 'required', params: { missingProperty: missing0 }, message: "must have required property '" + missing0 + "'", @@ -1097,7 +1065,7 @@ function validate23( const err1 = { instancePath, schemaPath: - '#/definitions/AuthenticationTemplateAddressData/additionalProperties', + '#/definitions/WalletTemplateAddressData/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key0 }, message: 'must NOT have additional properties', @@ -1118,7 +1086,7 @@ function validate23( const err2 = { instancePath: instancePath + '/description', schemaPath: - '#/definitions/AuthenticationTemplateAddressData/properties/description/type', + '#/definitions/WalletTemplateAddressData/properties/description/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -1141,7 +1109,7 @@ function validate23( const err3 = { instancePath: instancePath + '/name', schemaPath: - '#/definitions/AuthenticationTemplateAddressData/properties/name/type', + '#/definitions/WalletTemplateAddressData/properties/name/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -1165,7 +1133,7 @@ function validate23( const err4 = { instancePath: instancePath + '/type', schemaPath: - '#/definitions/AuthenticationTemplateAddressData/properties/type/type', + '#/definitions/WalletTemplateAddressData/properties/type/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -1181,7 +1149,7 @@ function validate23( const err5 = { instancePath: instancePath + '/type', schemaPath: - '#/definitions/AuthenticationTemplateAddressData/properties/type/const', + '#/definitions/WalletTemplateAddressData/properties/type/const', keyword: 'const', params: { allowedValue: 'AddressData' }, message: 'must be equal to constant', @@ -1204,7 +1172,7 @@ function validate23( } else { const err6 = { instancePath, - schemaPath: '#/definitions/AuthenticationTemplateAddressData/type', + schemaPath: '#/definitions/WalletTemplateAddressData/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -1228,7 +1196,7 @@ function validate23( if (data.type === undefined && (missing1 = 'type')) { const err7 = { instancePath, - schemaPath: '#/definitions/AuthenticationTemplateHdKey/required', + schemaPath: '#/definitions/WalletTemplateHdKey/required', keyword: 'required', params: { missingProperty: missing1 }, message: "must have required property '" + missing1 + "'", @@ -1248,6 +1216,7 @@ function validate23( key1 === 'description' || key1 === 'hdPublicKeyDerivationPath' || key1 === 'name' || + key1 === 'neverSignTwice' || key1 === 'privateDerivationPath' || key1 === 'publicDerivationPath' || key1 === 'type' @@ -1256,7 +1225,7 @@ function validate23( const err8 = { instancePath, schemaPath: - '#/definitions/AuthenticationTemplateHdKey/additionalProperties', + '#/definitions/WalletTemplateHdKey/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key1 }, message: 'must NOT have additional properties', @@ -1278,7 +1247,7 @@ function validate23( const err9 = { instancePath: instancePath + '/addressOffset', schemaPath: - '#/definitions/AuthenticationTemplateHdKey/properties/addressOffset/type', + '#/definitions/WalletTemplateHdKey/properties/addressOffset/type', keyword: 'type', params: { type: 'number' }, message: 'must be number', @@ -1301,7 +1270,7 @@ function validate23( const err10 = { instancePath: instancePath + '/description', schemaPath: - '#/definitions/AuthenticationTemplateHdKey/properties/description/type', + '#/definitions/WalletTemplateHdKey/properties/description/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -1324,7 +1293,7 @@ function validate23( const err11 = { instancePath: instancePath + '/hdPublicKeyDerivationPath', schemaPath: - '#/definitions/AuthenticationTemplateHdKey/properties/hdPublicKeyDerivationPath/type', + '#/definitions/WalletTemplateHdKey/properties/hdPublicKeyDerivationPath/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -1347,7 +1316,7 @@ function validate23( const err12 = { instancePath: instancePath + '/name', schemaPath: - '#/definitions/AuthenticationTemplateHdKey/properties/name/type', + '#/definitions/WalletTemplateHdKey/properties/name/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -1364,16 +1333,16 @@ function validate23( var valid4 = true; } if (valid4) { - if (data.privateDerivationPath !== undefined) { + if (data.neverSignTwice !== undefined) { const _errs23 = errors; - if (typeof data.privateDerivationPath !== 'string') { + if (typeof data.neverSignTwice !== 'boolean') { const err13 = { - instancePath: instancePath + '/privateDerivationPath', + instancePath: instancePath + '/neverSignTwice', schemaPath: - '#/definitions/AuthenticationTemplateHdKey/properties/privateDerivationPath/type', + '#/definitions/WalletTemplateHdKey/properties/neverSignTwice/type', keyword: 'type', - params: { type: 'string' }, - message: 'must be string', + params: { type: 'boolean' }, + message: 'must be boolean', }; if (vErrors === null) { vErrors = [err13]; @@ -1387,14 +1356,14 @@ function validate23( var valid4 = true; } if (valid4) { - if (data.publicDerivationPath !== undefined) { + if (data.privateDerivationPath !== undefined) { const _errs25 = errors; - if (typeof data.publicDerivationPath !== 'string') { + if (typeof data.privateDerivationPath !== 'string') { const err14 = { instancePath: - instancePath + '/publicDerivationPath', + instancePath + '/privateDerivationPath', schemaPath: - '#/definitions/AuthenticationTemplateHdKey/properties/publicDerivationPath/type', + '#/definitions/WalletTemplateHdKey/properties/privateDerivationPath/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -1411,14 +1380,14 @@ function validate23( var valid4 = true; } if (valid4) { - if (data.type !== undefined) { - let data9 = data.type; + if (data.publicDerivationPath !== undefined) { const _errs27 = errors; - if (typeof data9 !== 'string') { + if (typeof data.publicDerivationPath !== 'string') { const err15 = { - instancePath: instancePath + '/type', + instancePath: + instancePath + '/publicDerivationPath', schemaPath: - '#/definitions/AuthenticationTemplateHdKey/properties/type/type', + '#/definitions/WalletTemplateHdKey/properties/publicDerivationPath/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -1430,26 +1399,51 @@ function validate23( } errors++; } - if ('HdKey' !== data9) { - const err16 = { - instancePath: instancePath + '/type', - schemaPath: - '#/definitions/AuthenticationTemplateHdKey/properties/type/const', - keyword: 'const', - params: { allowedValue: 'HdKey' }, - message: 'must be equal to constant', - }; - if (vErrors === null) { - vErrors = [err16]; - } else { - vErrors.push(err16); - } - errors++; - } var valid4 = _errs27 === errors; } else { var valid4 = true; } + if (valid4) { + if (data.type !== undefined) { + let data10 = data.type; + const _errs29 = errors; + if (typeof data10 !== 'string') { + const err16 = { + instancePath: instancePath + '/type', + schemaPath: + '#/definitions/WalletTemplateHdKey/properties/type/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err16]; + } else { + vErrors.push(err16); + } + errors++; + } + if ('HdKey' !== data10) { + const err17 = { + instancePath: instancePath + '/type', + schemaPath: + '#/definitions/WalletTemplateHdKey/properties/type/const', + keyword: 'const', + params: { allowedValue: 'HdKey' }, + message: 'must be equal to constant', + }; + if (vErrors === null) { + vErrors = [err17]; + } else { + vErrors.push(err17); + } + errors++; + } + var valid4 = _errs29 === errors; + } else { + var valid4 = true; + } + } } } } @@ -1459,17 +1453,17 @@ function validate23( } } } else { - const err17 = { + const err18 = { instancePath, - schemaPath: '#/definitions/AuthenticationTemplateHdKey/type', + schemaPath: '#/definitions/WalletTemplateHdKey/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', }; if (vErrors === null) { - vErrors = [err17]; + vErrors = [err18]; } else { - vErrors.push(err17); + vErrors.push(err18); } errors++; } @@ -1477,122 +1471,110 @@ function validate23( var _valid0 = _errs11 === errors; valid0 = valid0 || _valid0; if (!valid0) { - const _errs29 = errors; - const _errs30 = errors; - if (errors === _errs30) { + const _errs31 = errors; + const _errs32 = errors; + if (errors === _errs32) { if (data && typeof data == 'object' && !Array.isArray(data)) { let missing2; if (data.type === undefined && (missing2 = 'type')) { - const err18 = { + const err19 = { instancePath, - schemaPath: '#/definitions/AuthenticationTemplateKey/required', + schemaPath: '#/definitions/WalletTemplateKey/required', keyword: 'required', params: { missingProperty: missing2 }, message: "must have required property '" + missing2 + "'", }; if (vErrors === null) { - vErrors = [err18]; + vErrors = [err19]; } else { - vErrors.push(err18); + vErrors.push(err19); } errors++; } else { - const _errs32 = errors; + const _errs34 = errors; for (const key2 in data) { if ( - !(key2 === 'description' || key2 === 'name' || key2 === 'type') + !( + key2 === 'description' || + key2 === 'name' || + key2 === 'neverSignTwice' || + key2 === 'type' + ) ) { - const err19 = { + const err20 = { instancePath, schemaPath: - '#/definitions/AuthenticationTemplateKey/additionalProperties', + '#/definitions/WalletTemplateKey/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key2 }, message: 'must NOT have additional properties', }; if (vErrors === null) { - vErrors = [err19]; + vErrors = [err20]; } else { - vErrors.push(err19); + vErrors.push(err20); } errors++; break; } } - if (_errs32 === errors) { + if (_errs34 === errors) { if (data.description !== undefined) { - const _errs33 = errors; + const _errs35 = errors; if (typeof data.description !== 'string') { - const err20 = { + const err21 = { instancePath: instancePath + '/description', schemaPath: - '#/definitions/AuthenticationTemplateKey/properties/description/type', + '#/definitions/WalletTemplateKey/properties/description/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', }; if (vErrors === null) { - vErrors = [err20]; + vErrors = [err21]; } else { - vErrors.push(err20); + vErrors.push(err21); } errors++; } - var valid6 = _errs33 === errors; + var valid6 = _errs35 === errors; } else { var valid6 = true; } if (valid6) { if (data.name !== undefined) { - const _errs35 = errors; + const _errs37 = errors; if (typeof data.name !== 'string') { - const err21 = { + const err22 = { instancePath: instancePath + '/name', schemaPath: - '#/definitions/AuthenticationTemplateKey/properties/name/type', + '#/definitions/WalletTemplateKey/properties/name/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', }; if (vErrors === null) { - vErrors = [err21]; + vErrors = [err22]; } else { - vErrors.push(err21); + vErrors.push(err22); } errors++; } - var valid6 = _errs35 === errors; + var valid6 = _errs37 === errors; } else { var valid6 = true; } if (valid6) { - if (data.type !== undefined) { - let data12 = data.type; - const _errs37 = errors; - if (typeof data12 !== 'string') { - const err22 = { - instancePath: instancePath + '/type', - schemaPath: - '#/definitions/AuthenticationTemplateKey/properties/type/type', - keyword: 'type', - params: { type: 'string' }, - message: 'must be string', - }; - if (vErrors === null) { - vErrors = [err22]; - } else { - vErrors.push(err22); - } - errors++; - } - if ('Key' !== data12) { + if (data.neverSignTwice !== undefined) { + const _errs39 = errors; + if (typeof data.neverSignTwice !== 'boolean') { const err23 = { - instancePath: instancePath + '/type', + instancePath: instancePath + '/neverSignTwice', schemaPath: - '#/definitions/AuthenticationTemplateKey/properties/type/const', - keyword: 'const', - params: { allowedValue: 'Key' }, - message: 'must be equal to constant', + '#/definitions/WalletTemplateKey/properties/neverSignTwice/type', + keyword: 'type', + params: { type: 'boolean' }, + message: 'must be boolean', }; if (vErrors === null) { vErrors = [err23]; @@ -1601,55 +1583,95 @@ function validate23( } errors++; } - var valid6 = _errs37 === errors; + var valid6 = _errs39 === errors; } else { var valid6 = true; } + if (valid6) { + if (data.type !== undefined) { + let data14 = data.type; + const _errs41 = errors; + if (typeof data14 !== 'string') { + const err24 = { + instancePath: instancePath + '/type', + schemaPath: + '#/definitions/WalletTemplateKey/properties/type/type', + keyword: 'type', + params: { type: 'string' }, + message: 'must be string', + }; + if (vErrors === null) { + vErrors = [err24]; + } else { + vErrors.push(err24); + } + errors++; + } + if ('Key' !== data14) { + const err25 = { + instancePath: instancePath + '/type', + schemaPath: + '#/definitions/WalletTemplateKey/properties/type/const', + keyword: 'const', + params: { allowedValue: 'Key' }, + message: 'must be equal to constant', + }; + if (vErrors === null) { + vErrors = [err25]; + } else { + vErrors.push(err25); + } + errors++; + } + var valid6 = _errs41 === errors; + } else { + var valid6 = true; + } + } } } } } } else { - const err24 = { + const err26 = { instancePath, - schemaPath: '#/definitions/AuthenticationTemplateKey/type', + schemaPath: '#/definitions/WalletTemplateKey/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', }; if (vErrors === null) { - vErrors = [err24]; + vErrors = [err26]; } else { - vErrors.push(err24); + vErrors.push(err26); } errors++; } } - var _valid0 = _errs29 === errors; + var _valid0 = _errs31 === errors; valid0 = valid0 || _valid0; if (!valid0) { - const _errs39 = errors; - const _errs40 = errors; - if (errors === _errs40) { + const _errs43 = errors; + const _errs44 = errors; + if (errors === _errs44) { if (data && typeof data == 'object' && !Array.isArray(data)) { let missing3; if (data.type === undefined && (missing3 = 'type')) { - const err25 = { + const err27 = { instancePath, - schemaPath: - '#/definitions/AuthenticationTemplateWalletData/required', + schemaPath: '#/definitions/WalletTemplateWalletData/required', keyword: 'required', params: { missingProperty: missing3 }, message: "must have required property '" + missing3 + "'", }; if (vErrors === null) { - vErrors = [err25]; + vErrors = [err27]; } else { - vErrors.push(err25); + vErrors.push(err27); } errors++; } else { - const _errs42 = errors; + const _errs46 = errors; for (const key3 in data) { if ( !( @@ -1658,106 +1680,106 @@ function validate23( key3 === 'type' ) ) { - const err26 = { + const err28 = { instancePath, schemaPath: - '#/definitions/AuthenticationTemplateWalletData/additionalProperties', + '#/definitions/WalletTemplateWalletData/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key3 }, message: 'must NOT have additional properties', }; if (vErrors === null) { - vErrors = [err26]; + vErrors = [err28]; } else { - vErrors.push(err26); + vErrors.push(err28); } errors++; break; } } - if (_errs42 === errors) { + if (_errs46 === errors) { if (data.description !== undefined) { - const _errs43 = errors; + const _errs47 = errors; if (typeof data.description !== 'string') { - const err27 = { + const err29 = { instancePath: instancePath + '/description', schemaPath: - '#/definitions/AuthenticationTemplateWalletData/properties/description/type', + '#/definitions/WalletTemplateWalletData/properties/description/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', }; if (vErrors === null) { - vErrors = [err27]; + vErrors = [err29]; } else { - vErrors.push(err27); + vErrors.push(err29); } errors++; } - var valid8 = _errs43 === errors; + var valid8 = _errs47 === errors; } else { var valid8 = true; } if (valid8) { if (data.name !== undefined) { - const _errs45 = errors; + const _errs49 = errors; if (typeof data.name !== 'string') { - const err28 = { + const err30 = { instancePath: instancePath + '/name', schemaPath: - '#/definitions/AuthenticationTemplateWalletData/properties/name/type', + '#/definitions/WalletTemplateWalletData/properties/name/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', }; if (vErrors === null) { - vErrors = [err28]; + vErrors = [err30]; } else { - vErrors.push(err28); + vErrors.push(err30); } errors++; } - var valid8 = _errs45 === errors; + var valid8 = _errs49 === errors; } else { var valid8 = true; } if (valid8) { if (data.type !== undefined) { - let data15 = data.type; - const _errs47 = errors; - if (typeof data15 !== 'string') { - const err29 = { + let data17 = data.type; + const _errs51 = errors; + if (typeof data17 !== 'string') { + const err31 = { instancePath: instancePath + '/type', schemaPath: - '#/definitions/AuthenticationTemplateWalletData/properties/type/type', + '#/definitions/WalletTemplateWalletData/properties/type/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', }; if (vErrors === null) { - vErrors = [err29]; + vErrors = [err31]; } else { - vErrors.push(err29); + vErrors.push(err31); } errors++; } - if ('WalletData' !== data15) { - const err30 = { + if ('WalletData' !== data17) { + const err32 = { instancePath: instancePath + '/type', schemaPath: - '#/definitions/AuthenticationTemplateWalletData/properties/type/const', + '#/definitions/WalletTemplateWalletData/properties/type/const', keyword: 'const', params: { allowedValue: 'WalletData' }, message: 'must be equal to constant', }; if (vErrors === null) { - vErrors = [err30]; + vErrors = [err32]; } else { - vErrors.push(err30); + vErrors.push(err32); } errors++; } - var valid8 = _errs47 === errors; + var valid8 = _errs51 === errors; } else { var valid8 = true; } @@ -1766,28 +1788,28 @@ function validate23( } } } else { - const err31 = { + const err33 = { instancePath, - schemaPath: '#/definitions/AuthenticationTemplateWalletData/type', + schemaPath: '#/definitions/WalletTemplateWalletData/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', }; if (vErrors === null) { - vErrors = [err31]; + vErrors = [err33]; } else { - vErrors.push(err31); + vErrors.push(err33); } errors++; } } - var _valid0 = _errs39 === errors; + var _valid0 = _errs43 === errors; valid0 = valid0 || _valid0; } } } if (!valid0) { - const err32 = { + const err34 = { instancePath, schemaPath: '#/anyOf', keyword: 'anyOf', @@ -1795,9 +1817,9 @@ function validate23( message: 'must match a schema in anyOf', }; if (vErrors === null) { - vErrors = [err32]; + vErrors = [err34]; } else { - vErrors.push(err32); + vErrors.push(err34); } errors++; validate23.errors = vErrors; @@ -1817,7 +1839,7 @@ function validate23( } function validate22( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -2002,10 +2024,10 @@ function validate22( const schema30 = { additionalProperties: false, description: - 'An object describing the configuration for a particular scenario within an authentication template.', + 'An object describing the configuration for a particular scenario within an wallet template.', properties: { data: { - $ref: '#/definitions/AuthenticationTemplateScenarioData', + $ref: '#/definitions/WalletTemplateScenarioData', description: "An object defining the data to use while compiling this scenario. The properties specified here are used to extend the existing scenario data based on this scenario's `extends` property.\n\nEach property is extended individually – to unset a previously-set property, the property must be individually overridden in this object.", }, @@ -2027,9 +2049,7 @@ const schema30 = { sourceOutputs: { description: 'The list of source outputs (a.k.a. UTXOs) to use when generating the compilation context for this scenario.\n\nThe `sourceOutputs` property must have the same length as `transaction.inputs`, and each source output must be ordered to match the index of the input that spends it.\n\nTo be valid the `sourceOutputs` property must have exactly one source output with `lockingBytecode` set to `["slot"]` – the output at the same index as the `["slot"]` input in `transaction.inputs`.\n\nIf undefined, defaults to `[{ "lockingBytecode": ["slot"] }]`.', - items: { - $ref: '#/definitions/AuthenticationTemplateScenarioSourceOutput', - }, + items: { $ref: '#/definitions/WalletTemplateScenarioSourceOutput' }, type: 'array', }, transaction: { @@ -2040,7 +2060,7 @@ const schema30 = { inputs: { description: 'The list of inputs to use when generating the transaction for this scenario.\n\nTo be valid the `inputs` property must have exactly one input with `unlockingBytecode` set to `["slot"]`. This is the input in which the unlocking script under test will be placed.\n\nIf undefined, inherits the default scenario `inputs` value: `[{ "unlockingBytecode": ["slot"] }]`.', - items: { $ref: '#/definitions/AuthenticationTemplateScenarioInput' }, + items: { $ref: '#/definitions/WalletTemplateScenarioInput' }, type: 'array', }, locktime: { @@ -2052,7 +2072,7 @@ const schema30 = { description: 'The list of outputs to use when generating the transaction for this scenario.\n\nIf undefined, defaults to `[{ "lockingBytecode": {} }]`.', items: { - $ref: '#/definitions/AuthenticationTemplateScenarioTransactionOutput', + $ref: '#/definitions/WalletTemplateScenarioTransactionOutput', }, type: 'array', }, @@ -2132,11 +2152,11 @@ const schema31 = { const schema32 = { additionalProperties: false, description: - 'An example output used to define a scenario for an authentication template.', + 'An example output used to define a scenario for a wallet template.', properties: { lockingBytecode: { anyOf: [ - { $ref: '#/definitions/AuthenticationTemplateScenarioBytecode' }, + { $ref: '#/definitions/WalletTemplateScenarioBytecode' }, { items: { const: 'slot', type: 'string' }, maxItems: 1, @@ -2199,7 +2219,7 @@ const schema33 = { additionalProperties: false, properties: { overrides: { - $ref: '#/definitions/AuthenticationTemplateScenarioData', + $ref: '#/definitions/WalletTemplateScenarioData', description: 'Scenario data that extends the scenario\'s top-level `data` during script compilation.\n\nEach property is extended individually – to modify a property set by the top-level scenario `data`, the new value must be listed here.\n\nDefaults to `{}` for `sourceOutputs` and `transaction.inputs`; defaults to `{ "hdKeys": { "addressIndex": 1 } }` for `transaction.outputs`.', }, @@ -2221,11 +2241,11 @@ const schema33 = { }, ], description: - 'A type that describes the configuration for a particular locking or unlocking bytecode within an authentication template scenario.\n\nBytecode may be specified as either a hexadecimal-encoded string or an object describing the required compilation.\n\nFor `sourceOutputs` and `transaction.inputs`, defaults to `{ script: ["copy"], overrides: {} }`. For `transaction.outputs`, defaults to `{ script: ["copy"], overrides: { "hdKeys": { "addressIndex": 1 } } }`.', + 'A type that describes the configuration for a particular locking or unlocking bytecode within a wallet template scenario.\n\nBytecode may be specified as either a hexadecimal-encoded string or an object describing the required compilation.\n\nFor `sourceOutputs` and `transaction.inputs`, defaults to `{ script: ["copy"], overrides: {} }`. For `transaction.outputs`, defaults to `{ script: ["copy"], overrides: { "hdKeys": { "addressIndex": 1 } } }`.', }; function validate28( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -2293,7 +2313,7 @@ function validate28( const err2 = { instancePath: instancePath + '/overrides', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/additionalProperties', + '#/definitions/WalletTemplateScenarioData/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key1 }, message: 'must NOT have additional properties', @@ -2326,7 +2346,7 @@ function validate28( '/overrides/bytecode/' + key2.replace(/~/g, '~0').replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/bytecode/additionalProperties/type', + '#/definitions/WalletTemplateScenarioData/properties/bytecode/additionalProperties/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -2347,7 +2367,7 @@ function validate28( const err4 = { instancePath: instancePath + '/overrides/bytecode', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/bytecode/type', + '#/definitions/WalletTemplateScenarioData/properties/bytecode/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -2373,7 +2393,7 @@ function validate28( instancePath: instancePath + '/overrides/currentBlockHeight', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/currentBlockHeight/type', + '#/definitions/WalletTemplateScenarioData/properties/currentBlockHeight/type', keyword: 'type', params: { type: 'number' }, message: 'must be number', @@ -2398,7 +2418,7 @@ function validate28( instancePath: instancePath + '/overrides/currentBlockTime', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/currentBlockTime/type', + '#/definitions/WalletTemplateScenarioData/properties/currentBlockTime/type', keyword: 'type', params: { type: 'number' }, message: 'must be number', @@ -2437,7 +2457,7 @@ function validate28( instancePath: instancePath + '/overrides/hdKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/additionalProperties', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key3 }, message: @@ -2467,7 +2487,7 @@ function validate28( instancePath + '/overrides/hdKeys/addressIndex', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/addressIndex/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/addressIndex/type', keyword: 'type', params: { type: 'number' }, message: 'must be number', @@ -2504,7 +2524,7 @@ function validate28( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/additionalProperties/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/additionalProperties/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -2527,7 +2547,7 @@ function validate28( instancePath + '/overrides/hdKeys/hdPrivateKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -2567,7 +2587,7 @@ function validate28( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/additionalProperties/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/additionalProperties/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -2590,7 +2610,7 @@ function validate28( instancePath + '/overrides/hdKeys/hdPublicKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -2615,7 +2635,7 @@ function validate28( instancePath: instancePath + '/overrides/hdKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -2649,7 +2669,7 @@ function validate28( instancePath: instancePath + '/overrides/keys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/keys/additionalProperties', + '#/definitions/WalletTemplateScenarioData/properties/keys/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key6 }, message: @@ -2687,7 +2707,7 @@ function validate28( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/keys/properties/privateKeys/additionalProperties/type', + '#/definitions/WalletTemplateScenarioData/properties/keys/properties/privateKeys/additionalProperties/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -2710,7 +2730,7 @@ function validate28( instancePath + '/overrides/keys/privateKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/keys/properties/privateKeys/type', + '#/definitions/WalletTemplateScenarioData/properties/keys/properties/privateKeys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -2730,7 +2750,7 @@ function validate28( instancePath: instancePath + '/overrides/keys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/keys/type', + '#/definitions/WalletTemplateScenarioData/properties/keys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -2755,8 +2775,7 @@ function validate28( } else { const err18 = { instancePath: instancePath + '/overrides', - schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/type', + schemaPath: '#/definitions/WalletTemplateScenarioData/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -2976,7 +2995,7 @@ function validate28( } function validate27( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -3416,7 +3435,7 @@ function validate27( const schema35 = { additionalProperties: false, description: - 'An example input used to define a scenario for an authentication template.', + 'An example input used to define a scenario for a wallet template.', properties: { outpointIndex: { description: @@ -3435,7 +3454,7 @@ const schema35 = { }, unlockingBytecode: { anyOf: [ - { $ref: '#/definitions/AuthenticationTemplateScenarioBytecode' }, + { $ref: '#/definitions/WalletTemplateScenarioBytecode' }, { items: { const: 'slot', type: 'string' }, maxItems: 1, @@ -3444,14 +3463,14 @@ const schema35 = { }, ], description: - 'The `unlockingBytecode` value of this input for this scenario. This must be either `["slot"]`, indicating that this input contains the `unlockingBytecode` under test by the scenario, or an `AuthenticationTemplateScenarioBytecode`.\n\nFor a scenario to be valid, `unlockingBytecode` must be `["slot"]` for exactly one input in the scenario.\n\nDefaults to `["slot"]`.', + 'The `unlockingBytecode` value of this input for this scenario. This must be either `["slot"]`, indicating that this input contains the `unlockingBytecode` under test by the scenario, or an `WalletTemplateScenarioBytecode`.\n\nFor a scenario to be valid, `unlockingBytecode` must be `["slot"]` for exactly one input in the scenario.\n\nDefaults to `["slot"]`.', }, }, type: 'object', }; function validate31( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -3717,10 +3736,10 @@ function validate31( const schema36 = { additionalProperties: false, description: - 'An example output used to define a scenario for an authentication template.', + 'An example output used to define a scenario for a wallet template.', properties: { lockingBytecode: { - $ref: '#/definitions/AuthenticationTemplateScenarioBytecode', + $ref: '#/definitions/WalletTemplateScenarioBytecode', description: 'The locking bytecode used to encumber this output.\n\n`lockingBytecode` values may be provided as a hexadecimal-encoded string or as an object describing the required compilation. If undefined, defaults to `{}`, which uses the default values for `script` and `overrides`, respectively.\n\nOnly source outputs may specify a `lockingBytecode` of `["slot"]`; this identifies the source output in which the locking script under test will be placed. (To be valid, every scenario\'s `sourceOutputs` property must have exactly one source output slot and one input slot at the same index.)', }, @@ -3771,7 +3790,7 @@ const schema36 = { }; function validate34( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -4080,7 +4099,7 @@ function validate34( } function validate26( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -4133,7 +4152,7 @@ function validate26( { instancePath: instancePath + '/data', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/additionalProperties', + '#/definitions/WalletTemplateScenarioData/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key1 }, message: 'must NOT have additional properties', @@ -4163,7 +4182,7 @@ function validate26( '/data/bytecode/' + key2.replace(/~/g, '~0').replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/bytecode/additionalProperties/type', + '#/definitions/WalletTemplateScenarioData/properties/bytecode/additionalProperties/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -4181,7 +4200,7 @@ function validate26( { instancePath: instancePath + '/data/bytecode', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/bytecode/type', + '#/definitions/WalletTemplateScenarioData/properties/bytecode/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -4204,7 +4223,7 @@ function validate26( instancePath: instancePath + '/data/currentBlockHeight', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/currentBlockHeight/type', + '#/definitions/WalletTemplateScenarioData/properties/currentBlockHeight/type', keyword: 'type', params: { type: 'number' }, message: 'must be number', @@ -4226,7 +4245,7 @@ function validate26( instancePath: instancePath + '/data/currentBlockTime', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/currentBlockTime/type', + '#/definitions/WalletTemplateScenarioData/properties/currentBlockTime/type', keyword: 'type', params: { type: 'number' }, message: 'must be number', @@ -4261,7 +4280,7 @@ function validate26( { instancePath: instancePath + '/data/hdKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/additionalProperties', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key3 }, message: @@ -4285,7 +4304,7 @@ function validate26( instancePath + '/data/hdKeys/addressIndex', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/addressIndex/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/addressIndex/type', keyword: 'type', params: { type: 'number' }, message: 'must be number', @@ -4319,7 +4338,7 @@ function validate26( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/additionalProperties/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/additionalProperties/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -4339,7 +4358,7 @@ function validate26( instancePath + '/data/hdKeys/hdPrivateKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/hdPrivateKeys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -4374,7 +4393,7 @@ function validate26( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/additionalProperties/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/additionalProperties/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -4394,7 +4413,7 @@ function validate26( instancePath + '/data/hdKeys/hdPublicKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/properties/hdPublicKeys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -4415,7 +4434,7 @@ function validate26( { instancePath: instancePath + '/data/hdKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/hdKeys/type', + '#/definitions/WalletTemplateScenarioData/properties/hdKeys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -4445,7 +4464,7 @@ function validate26( { instancePath: instancePath + '/data/keys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/keys/additionalProperties', + '#/definitions/WalletTemplateScenarioData/properties/keys/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key6 }, message: @@ -4478,7 +4497,7 @@ function validate26( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/keys/properties/privateKeys/additionalProperties/type', + '#/definitions/WalletTemplateScenarioData/properties/keys/properties/privateKeys/additionalProperties/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -4498,7 +4517,7 @@ function validate26( instancePath + '/data/keys/privateKeys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/keys/properties/privateKeys/type', + '#/definitions/WalletTemplateScenarioData/properties/keys/properties/privateKeys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -4514,7 +4533,7 @@ function validate26( { instancePath: instancePath + '/data/keys', schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/properties/keys/type', + '#/definitions/WalletTemplateScenarioData/properties/keys/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -4536,8 +4555,7 @@ function validate26( validate26.errors = [ { instancePath: instancePath + '/data', - schemaPath: - '#/definitions/AuthenticationTemplateScenarioData/type', + schemaPath: '#/definitions/WalletTemplateScenarioData/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -4901,9 +4919,7 @@ const schema39 = { type: 'string', }, tests: { - additionalProperties: { - $ref: '#/definitions/AuthenticationTemplateScriptTest', - }, + additionalProperties: { $ref: '#/definitions/WalletTemplateScriptTest' }, description: 'One or more tests that can be used during development and during template validation to confirm the correctness of this tested script.', type: 'object', @@ -4954,7 +4970,7 @@ const schema40 = { }; function validate38( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -5090,7 +5106,7 @@ function validate38( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/required', + '#/definitions/WalletTemplateScriptTest/required', keyword: 'required', params: { missingProperty: missing1 }, message: @@ -5122,7 +5138,7 @@ function validate38( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/additionalProperties', + '#/definitions/WalletTemplateScriptTest/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key2 }, message: @@ -5147,7 +5163,7 @@ function validate38( .replace(/\//g, '~1') + '/check', schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/check/type', + '#/definitions/WalletTemplateScriptTest/properties/check/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -5181,7 +5197,7 @@ function validate38( '/fails/' + i0, schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/fails/items/type', + '#/definitions/WalletTemplateScriptTest/properties/fails/items/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -5205,7 +5221,7 @@ function validate38( .replace(/\//g, '~1') + '/fails', schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/fails/type', + '#/definitions/WalletTemplateScriptTest/properties/fails/type', keyword: 'type', params: { type: 'array' }, message: 'must be array', @@ -5240,7 +5256,7 @@ function validate38( '/invalid/' + i1, schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/invalid/items/type', + '#/definitions/WalletTemplateScriptTest/properties/invalid/items/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -5264,7 +5280,7 @@ function validate38( .replace(/\//g, '~1') + '/invalid', schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/invalid/type', + '#/definitions/WalletTemplateScriptTest/properties/invalid/type', keyword: 'type', params: { type: 'array' }, message: 'must be array', @@ -5291,7 +5307,7 @@ function validate38( .replace(/\//g, '~1') + '/name', schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/name/type', + '#/definitions/WalletTemplateScriptTest/properties/name/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -5329,12 +5345,12 @@ function validate38( .replace(/~/g, '~0') .replace( /\//g, - '~1' + '~1', ) + '/passes/' + i2, schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/passes/items/type', + '#/definitions/WalletTemplateScriptTest/properties/passes/items/type', keyword: 'type', params: { type: 'string', @@ -5360,7 +5376,7 @@ function validate38( .replace(/\//g, '~1') + '/passes', schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/passes/type', + '#/definitions/WalletTemplateScriptTest/properties/passes/type', keyword: 'type', params: { type: 'array' }, message: 'must be array', @@ -5389,7 +5405,7 @@ function validate38( .replace(/\//g, '~1') + '/setup', schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/properties/setup/type', + '#/definitions/WalletTemplateScriptTest/properties/setup/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -5416,7 +5432,7 @@ function validate38( '/tests/' + key1.replace(/~/g, '~0').replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptTest/type', + '#/definitions/WalletTemplateScriptTest/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -5471,7 +5487,7 @@ function validate38( const func4 = Object.prototype.hasOwnProperty; function validate21( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; @@ -5717,7 +5733,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScript/required', + '#/definitions/WalletTemplateScript/required', keyword: 'required', params: { missingProperty: missing1 }, message: @@ -5745,7 +5761,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScript/additionalProperties', + '#/definitions/WalletTemplateScript/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key4 }, message: @@ -5773,7 +5789,7 @@ function validate21( .replace(/\//g, '~1') + '/name', schemaPath: - '#/definitions/AuthenticationTemplateScript/properties/name/type', + '#/definitions/WalletTemplateScript/properties/name/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -5802,7 +5818,7 @@ function validate21( .replace(/\//g, '~1') + '/script', schemaPath: - '#/definitions/AuthenticationTemplateScript/properties/script/type', + '#/definitions/WalletTemplateScript/properties/script/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -5830,7 +5846,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScript/type', + '#/definitions/WalletTemplateScript/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -5869,7 +5885,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptLocking/required', + '#/definitions/WalletTemplateScriptLocking/required', keyword: 'required', params: { missingProperty: missing2 }, message: @@ -5901,7 +5917,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptLocking/additionalProperties', + '#/definitions/WalletTemplateScriptLocking/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key5 }, message: @@ -5930,7 +5946,7 @@ function validate21( .replace(/\//g, '~1') + '/lockingType', schemaPath: - '#/definitions/AuthenticationTemplateScriptLocking/properties/lockingType/type', + '#/definitions/WalletTemplateScriptLocking/properties/lockingType/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -5958,7 +5974,7 @@ function validate21( .replace(/\//g, '~1') + '/lockingType', schemaPath: - '#/definitions/AuthenticationTemplateScriptLocking/properties/lockingType/enum', + '#/definitions/WalletTemplateScriptLocking/properties/lockingType/enum', keyword: 'enum', params: { allowedValues: @@ -5992,7 +6008,7 @@ function validate21( .replace(/\//g, '~1') + '/name', schemaPath: - '#/definitions/AuthenticationTemplateScriptLocking/properties/name/type', + '#/definitions/WalletTemplateScriptLocking/properties/name/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -6023,7 +6039,7 @@ function validate21( .replace(/\//g, '~1') + '/script', schemaPath: - '#/definitions/AuthenticationTemplateScriptLocking/properties/script/type', + '#/definitions/WalletTemplateScriptLocking/properties/script/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -6052,7 +6068,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptLocking/type', + '#/definitions/WalletTemplateScriptLocking/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -6114,7 +6130,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/required', + '#/definitions/WalletTemplateScriptUnlocking/required', keyword: 'required', params: { missingProperty: missing3 }, message: @@ -6134,7 +6150,7 @@ function validate21( if ( !func4.call( schema41.properties, - key6 + key6, ) ) { const err13 = { @@ -6145,7 +6161,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/additionalProperties', + '#/definitions/WalletTemplateScriptUnlocking/additionalProperties', keyword: 'additionalProperties', params: { additionalProperty: key6, @@ -6177,7 +6193,7 @@ function validate21( .replace(/\//g, '~1') + '/ageLock', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/ageLock/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/ageLock/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -6209,7 +6225,7 @@ function validate21( .replace(/\//g, '~1') + '/estimate', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/estimate/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/estimate/type', keyword: 'type', params: { type: 'string' }, message: 'must be string', @@ -6250,16 +6266,16 @@ function validate21( key3 .replace( /~/g, - '~0' + '~0', ) .replace( /\//g, - '~1' + '~1', ) + '/fails/' + i0, schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/fails/items/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/fails/items/type', keyword: 'type', params: { type: 'string', @@ -6289,11 +6305,11 @@ function validate21( .replace(/~/g, '~0') .replace( /\//g, - '~1' + '~1', ) + '/fails', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/fails/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/fails/type', keyword: 'type', params: { type: 'array' }, message: 'must be array', @@ -6339,16 +6355,16 @@ function validate21( key3 .replace( /~/g, - '~0' + '~0', ) .replace( /\//g, - '~1' + '~1', ) + '/invalid/' + i1, schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/invalid/items/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/invalid/items/type', keyword: 'type', params: { type: 'string', @@ -6380,11 +6396,11 @@ function validate21( .replace(/~/g, '~0') .replace( /\//g, - '~1' + '~1', ) + '/invalid', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/invalid/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/invalid/type', keyword: 'type', params: { type: 'array', @@ -6422,11 +6438,11 @@ function validate21( .replace(/~/g, '~0') .replace( /\//g, - '~1' + '~1', ) + '/name', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/name/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/name/type', keyword: 'type', params: { type: 'string', @@ -6478,16 +6494,16 @@ function validate21( key3 .replace( /~/g, - '~0' + '~0', ) .replace( /\//g, - '~1' + '~1', ) + '/passes/' + i2, schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/passes/items/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/passes/items/type', keyword: 'type', params: { type: 'string', @@ -6503,7 +6519,7 @@ function validate21( ]; } else { vErrors.push( - err21 + err21, ); } errors++; @@ -6523,15 +6539,15 @@ function validate21( key3 .replace( /~/g, - '~0' + '~0', ) .replace( /\//g, - '~1' + '~1', ) + '/passes', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/passes/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/passes/type', keyword: 'type', params: { type: 'array', @@ -6571,15 +6587,15 @@ function validate21( key3 .replace( /~/g, - '~0' + '~0', ) .replace( /\//g, - '~1' + '~1', ) + '/script', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/script/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/script/type', keyword: 'type', params: { type: 'string', @@ -6621,15 +6637,15 @@ function validate21( key3 .replace( /~/g, - '~0' + '~0', ) .replace( /\//g, - '~1' + '~1', ) + '/timeLockType', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/timeLockType/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/timeLockType/type', keyword: 'type', params: { type: 'string', @@ -6643,7 +6659,7 @@ function validate21( vErrors = [err24]; } else { vErrors.push( - err24 + err24, ); } errors++; @@ -6663,15 +6679,15 @@ function validate21( key3 .replace( /~/g, - '~0' + '~0', ) .replace( /\//g, - '~1' + '~1', ) + '/timeLockType', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/timeLockType/enum', + '#/definitions/WalletTemplateScriptUnlocking/properties/timeLockType/enum', keyword: 'enum', params: { allowedValues: @@ -6689,7 +6705,7 @@ function validate21( vErrors = [err25]; } else { vErrors.push( - err25 + err25, ); } errors++; @@ -6717,15 +6733,15 @@ function validate21( key3 .replace( /~/g, - '~0' + '~0', ) .replace( /\//g, - '~1' + '~1', ) + '/unlocks', schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/properties/unlocks/type', + '#/definitions/WalletTemplateScriptUnlocking/properties/unlocks/type', keyword: 'type', params: { type: 'string', @@ -6741,7 +6757,7 @@ function validate21( ]; } else { vErrors.push( - err26 + err26, ); } errors++; @@ -6771,7 +6787,7 @@ function validate21( .replace(/~/g, '~0') .replace(/\//g, '~1'), schemaPath: - '#/definitions/AuthenticationTemplateScriptUnlocking/type', + '#/definitions/WalletTemplateScriptUnlocking/type', keyword: 'type', params: { type: 'object' }, message: 'must be object', @@ -6978,7 +6994,7 @@ function validate21( } function validate20( data, - { instancePath = '', parentData, parentDataProperty, rootData = data } = {} + { instancePath = '', parentData, parentDataProperty, rootData = data } = {}, ) { let vErrors = null; let errors = 0; diff --git a/src/lib/schema/bcmr.schema.json b/src/lib/schema/bcmr.schema.json new file mode 100644 index 00000000..01b3cb96 --- /dev/null +++ b/src/lib/schema/bcmr.schema.json @@ -0,0 +1,493 @@ +{ + "$ref": "#/definitions/MetadataRegistry", + "$schema": "http://json-schema.org/draft-07/schema#", + "definitions": { + "ChainHistory": { + "$ref": "#/definitions/RegistryTimestampKeyedValues", + "description": "A block height-keyed map of {@link ChainSnapshot } s documenting the evolution of a particular chain/network's identity. Like {@link IdentityHistory } , this structure allows wallets and other user interfaces to offer better experiences when a chain identity is rebranded, redenominated, or other important metadata is modified in a coordinated update." + }, + "ChainSnapshot": { + "additionalProperties": false, + "description": "A snapshot of the metadata for a particular chain/network at a specific time. This allows for registries to provide similar metadata for each chain's native currency unit (name, description, symbol, icon, etc.) as can be provided for other registered tokens.", + "properties": { + "description": { + "description": "A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`", + "type": "string" + }, + "extensions": { + "$ref": "#/definitions/Extensions", + "description": "A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details." + }, + "name": { + "description": "The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.", + "type": "string" + }, + "splitId": { + "description": "The split ID of this identity's chain of record.\n\nIf undefined, defaults to {@link MetadataRegistry.defaultChain } .", + "type": "string" + }, + "status": { + "description": "The status of this identity, must be `active`, `inactive`, or `burned`. If omitted, defaults to `active`.\n- Identities with an `active` status should be actively tracked by clients.\n- Identities with an `inactive` status may be considered for archival by clients and may be removed in future registry versions.\n- Identities with a `burned` status have been destroyed by setting the latest identity output to a data-carrier output (`OP_RETURN`), permanently terminating the authchain. Clients should archive burned identities and – if the burned identity represented a token type – consider burning any remaining tokens of that category to reclaim funds from those outputs.", + "enum": ["active", "burned", "inactive"], + "type": "string" + }, + "tags": { + "description": "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + "items": { + "type": "string" + }, + "type": "array" + }, + "token": { + "additionalProperties": false, + "description": "A data structure indicating how the chain's native currency units should be displayed in user interfaces.", + "properties": { + "decimals": { + "description": "An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this native currency.\n\nThis is the number of digits that can appear after the decimal separator in currency amounts. For a currency with a `symbol` of `SYMBOL` and a `decimals` of `2`, an amount of `12345` should be displayed as `123.45 SYMBOL`.\n\nIf omitted, defaults to `0`.", + "type": "number" + }, + "symbol": { + "description": "An abbreviation used to uniquely identity this native currency unit.\n\nSymbols must be comprised only of capital letters, numbers, and dashes (`-`). This can be validated with the regular expression: `/^[-A-Z0-9]+$/`.", + "type": "string" + } + }, + "required": ["symbol"], + "type": "object" + }, + "uris": { + "$ref": "#/definitions/URIs", + "description": "A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`." + } + }, + "required": ["name", "token"], + "type": "object" + }, + "Extensions": { + "additionalProperties": { + "anyOf": [ + { + "type": "string" + }, + { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + { + "additionalProperties": { + "additionalProperties": { + "type": "string" + }, + "type": "object" + }, + "type": "object" + } + ] + }, + "description": "A mapping of extension identifiers to extension definitions. Extensions may be widely standardized or application-specific, and extension definitions must be either:\n\n- `string`s,\n- key-value mappings of `string`s, or\n- two-dimensional, key-value mappings of `string`s.\n\nThis limitation encourages safety and wider compatibility across implementations.\n\nTo encode an array, it is recommended that each value be assigned to a numeric key indicating the item's index (beginning at `0`). Numerically-indexed objects are often a more useful and resilient data-transfer format than simple arrays because they simplify difference-only transmission: only modified indexes need to be transferred, and shifts in item order must be explicit, simplifying merges of conflicting updates.\n\nFor encoding of more complex data, consider using base64 and/or string-encoded JSON.", + "type": "object" + }, + "IdentityHistory": { + "$ref": "#/definitions/RegistryTimestampKeyedValues", + "description": "A timestamp-keyed map of {@link IdentitySnapshot } s documenting the evolution of a particular identity. The current identity information is the snapshot associated with the latest timestamp reached. If no timestamp has yet been reached, the snapshot of the oldest timestamp is considered current. Future-dated timestamps indicate planned migrations.\n\nThis strategy allows wallets and other user interfaces to offer better experiences when an identity is rebranded, a token redenominated, or other important metadata is modified in a coordinated update. For example, a wallet may warn token holders of a forthcoming rebranding of fungible tokens they hold; after the change, the wallet may continue to offer prominent interface hints that the rebranded token identity was recently updated.\n\nTimestamps may be order by time via lexicographical sort. For determinism, it is recommended that implementations sort from newest to oldest in exported registry JSON files.\n\nIf the current snapshot's {@link IdentitySnapshot.migrated } isn't specified, the snapshot's index is a precise time at which the snapshot takes effect and clients should begin using the new information. If `migrated` is specified, the snapshot's index is the timestamp at which the transition is considered to begin, see {@link IdentitySnapshot.migrated } for details.\n\nEach timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.\n\nIn the case that an identity change occurs due to on-chain activity (e.g. an on-chain migration that is set to complete at a particular locktime value), registry-recorded timestamps reflect the real-world time at which the maintainer of the registry believes the on-chain activity to have actually occurred. Likewise, future-dated timestamps indicate a precise real-world time at which a snapshot is estimated to take effect, rather than the Median Time Past (BIP113) UNIX timestamp or another on-chain measurement of time." + }, + "IdentitySnapshot": { + "additionalProperties": false, + "description": "A snapshot of the metadata for a particular identity at a specific time.", + "properties": { + "description": { + "description": "A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`", + "type": "string" + }, + "extensions": { + "$ref": "#/definitions/Extensions", + "description": "A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details." + }, + "migrated": { + "description": "The timestamp at which this identity snapshot is fully in effect. This value should only be provided if the snapshot takes effect over a period of time (e.g. an in-circulation token identity is gradually migrating to a new category). In these cases, clients should gradually migrate to using the new information beginning after the identity snapshot's timestamp and the `migrated` time.\n\nThis timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.", + "type": "string" + }, + "name": { + "description": "The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.", + "type": "string" + }, + "splitId": { + "description": "The split ID of this identity's chain of record.\n\nIf undefined, defaults to {@link MetadataRegistry.defaultChain } .", + "type": "string" + }, + "status": { + "description": "The status of this identity, must be `active`, `inactive`, or `burned`. If omitted, defaults to `active`.\n- Identities with an `active` status should be actively tracked by clients.\n- Identities with an `inactive` status may be considered for archival by clients and may be removed in future registry versions.\n- Identities with a `burned` status have been destroyed by setting the latest identity output to a data-carrier output (`OP_RETURN`), permanently terminating the authchain. Clients should archive burned identities and – if the burned identity represented a token type – consider burning any remaining tokens of that category to reclaim funds from those outputs.", + "enum": ["active", "burned", "inactive"], + "type": "string" + }, + "tags": { + "description": "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + "items": { + "type": "string" + }, + "type": "array" + }, + "token": { + "$ref": "#/definitions/TokenCategory", + "description": "If this identity is a type of token, a data structure indicating how tokens should be understood and displayed in user interfaces. Omitted for non-token identities." + }, + "uris": { + "$ref": "#/definitions/URIs", + "description": "A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`." + } + }, + "required": ["name"], + "type": "object" + }, + "MetadataRegistry": { + "additionalProperties": false, + "description": "A Bitcoin Cash Metadata Registry is an authenticated JSON file containing metadata about tokens, identities, contract applications, and other on-chain artifacts. BCMRs conform to the Bitcoin Cash Metadata Registry JSON Schema, and they can be published and maintained by any entity or individual.", + "properties": { + "$schema": { + "description": "The schema used by this registry. Many JSON editors can automatically provide inline documentation and autocomplete support using the `$schema` property, so it is recommended that registries include it. E.g.: `https://cashtokens.org/bcmr-v2.schema.json`", + "type": "string" + }, + "chains": { + "additionalProperties": { + "$ref": "#/definitions/ChainHistory" + }, + "description": "A map of split IDs tracked by this registry to the {@link ChainHistory } for that chain/network.\n\nThe split ID of a chain is the block header hash (A.K.A. block ID) of the first unique block after the most recent tracked split – a split after which both resulting chains are considered notable or tracked by the registry. (For chains with no such splits, this is the ID of the genesis block.)\n\nNote, split ID is inherently a \"relative\" identifier. After a tracked split, both resulting chains will have a new split ID. However, if a wallet has not yet heard about a particular split, that wallet will continue to reference one of the resulting chains by its previous split ID, and the split-unaware wallet may create transactions that are valid on both chains (losing claimable value if the receivers of their transactions don't acknowledge transfers on both chains). When a registry trusted by the wallet notes the split in it's `chains` map, the wallet can represent the split in the user interface using the the latest {@link ChainSnapshot } for each chain and splitting coins prior to spending (by introducing post-split coins in each transaction).\n\nThis map may exclude the following well-known split IDs (all clients supporting any of these chains should build-in {@link ChainHistory } for those chains):\n\n- `0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce`: A.K.A. mainnet – the BCH side of the BCH/XEC split.\n- `00000000ae25e85d9e22cd6c8d72c2f5d4b0222289d801b7f633aeae3f8c6367`: A.K.A testnet4 – the test network on which CHIPs are activated simultaneously with mainnet (May 15 at 12 UTC).\n- `00000000040ba9641ba98a37b2e5ceead38e4e2930ac8f145c8094f94c708727`: A.K.A. chipnet – the test network on which CHIPs are activated 6 months before mainnet (November 15 at 12 UTC).\n\nAll other split IDs referenced by this registry should be included in this map.", + "type": "object" + }, + "defaultChain": { + "description": "The split ID of the chain/network considered the \"default\" chain for this registry. Identities that do not specify a {@link IdentitySnapshot.splitId } are assumed to be set to this split ID. For a description of split IDs, see {@link MetadataRegistry.chains } .\n\nIf not provided, the `defaultChain` is `0000000000000000029e471c41818d24b8b74c911071c4ef0b4a0509f9b5a8ce`, the BCH side of the BCH/XEC split (mainnet). Common values include:\n- `00000000ae25e85d9e22cd6c8d72c2f5d4b0222289d801b7f633aeae3f8c6367` (testnet4)\n- `00000000040ba9641ba98a37b2e5ceead38e4e2930ac8f145c8094f94c708727` (chipnet)", + "type": "string" + }, + "extensions": { + "$ref": "#/definitions/Extensions", + "description": "A mapping of `Registry` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `Registry`s include the `locale` extension. See https://github.com/bitjson/chip-bcmr#locales-extension for details." + }, + "identities": { + "additionalProperties": { + "$ref": "#/definitions/IdentityHistory" + }, + "description": "A mapping of authbases to the `IdentityHistory` for that identity.\n\nAn authbase is a 32-byte, hex-encoded transaction hash (A.K.A. TXID) for which the zeroth-descendant transaction chain (ZDTC) authenticates and publishes an identity's claimed metadata.\n\nIdentities may represent metadata registries, specific types of tokens, companies, organizations, individuals, or other on-chain entities.", + "type": "object" + }, + "latestRevision": { + "description": "The timestamp of the latest revision made to this registry version. The timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.", + "type": "string" + }, + "license": { + "description": "The license under which this registry is published. This may be specified as either a SPDX short identifier (https://spdx.org/licenses/) or by including the full text of the license.\n\nCommon values include: - `CC0-1.0`: https://creativecommons.org/publicdomain/zero/1.0/ - `MIT`: https://opensource.org/licenses/MIT", + "type": "string" + }, + "registryIdentity": { + "anyOf": [ + { + "$ref": "#/definitions/OffChainRegistryIdentity" + }, + { + "type": "string" + } + ], + "description": "The identity information of this particular registry, provided as either an authbase (recommended) or an `IdentitySnapshot`.\n\nAn authbase is a 32-byte, hex-encoded transaction hash (A.K.A. TXID) for which the zeroth-descendant transaction chain (ZDTC) authenticates and publishes all registry updates. If an authbase is provided, the registry's identity information can be found in `identities[authbase]`, and clients should immediately attempt to verify the registry's identity on-chain. (See https://github.com/bitjson/chip-bcmr#chain-resolved-registries)\n\nIf an `IdentitySnapshot` is provided directly, this registry does not support on-chain resolution/authentication, and the contained `IdentitySnapshot` can only be authenticated via DNS/HTTPS." + }, + "tags": { + "additionalProperties": { + "$ref": "#/definitions/Tag" + }, + "description": "A map of registry-specific `Tag`s used by this registry to convey information about identities it tracks.\n\nTags allow registries to group identities into collections of related identities, marking characteristics or those identities. Tags are standardized within a registry and may represent either labels applied by that registry (e.g. `individual`, `organization`, `token`, `wallet`, `exchange`, `staking`, `utility-token`, `security-token`, `stablecoin`, `wrapped`, `collectable`, `deflationary`, `governance`, `decentralized-exchange`, `liquidity-provider`, `sidechain`, `sidechain-bridge`, etc.) or designations by external authorities (certification, membership, ownership, etc.) that are tracked by that registry.\n\nTags may be used by clients in search, discover, and filtering of identities, and they can also convey information like accreditation from investor protection organizations, public certifications by security or financial auditors, and other designations that signal legitimacy and value to users.", + "type": "object" + }, + "version": { + "additionalProperties": false, + "description": "The version of this registry. Versioning adheres to Semantic Versioning (https://semver.org/).", + "properties": { + "major": { + "description": "The major version is incremented when an identity is removed.", + "type": "number" + }, + "minor": { + "description": "The minor version is incremented when an identity is added or a new identity snapshot is added.", + "type": "number" + }, + "patch": { + "description": "The patch version is incremented when an existing identity or identity snapshot is modified (e.g. to correct an error or add a missing piece of information) or when other registry properties (e.g. registry `name`, `description`, `uris`, etc.) are modified.\n\nGenerally, substantive changes to an existing identity should be made using a new identity snapshot in a minor version upgrade – this allows clients to provide a better user experience by noting the change in relevant user interfaces.\n\nFor example, patch upgrades might include spelling corrections in an existing snapshot or the addition of an `icon` containing a higher-resolution version of an existing `icon` image. On the other hand, a rebranding in which the icon is substantially changed may warrant a new identity snapshot to be added in a minor version upgrade.", + "type": "number" + } + }, + "required": ["major", "minor", "patch"], + "type": "object" + } + }, + "required": ["version", "latestRevision", "registryIdentity"], + "type": "object" + }, + "NftCategory": { + "additionalProperties": false, + "description": "A definition specifying the non-fungible token information for a token category.", + "properties": { + "description": { + "description": "A string describing how this identity uses NFTs (for use in user interfaces). Descriptions longer than `160` characters may be elided in some interfaces.\n\nE.g.:\n- \"ACME DEX NFT order receipts are issued when you place orders on the decentralized exchange. After orders are processed, order receipts can be redeemed for purchased tokens or sales proceeds.\";\n- \"ACME Game collectable NFTs unlock unique playable content, user avatars, and item skins in ACME Game Online.\"; etc.", + "type": "string" + }, + "fields": { + "$ref": "#/definitions/NftCategoryField", + "description": "A mapping of field identifier to field definitions for the data fields that can appear in NFT commitments of this category.\n\nCategories including only sequential NFTs (where `parse.bytecode` is undefined) should omit `fields` (or set to `undefined`)." + }, + "parse": { + "anyOf": [ + { + "$ref": "#/definitions/ParsableNftCollection" + }, + { + "$ref": "#/definitions/SequentialNftCollection" + } + ], + "description": "Parsing and interpretation information for all NFTs of this category; this enables generalized wallets to parse and display detailed information about all NFTs held by the wallet, e.g. `BCH Pledged`, `Order Price`, `Seat Number`, `Asset Number`, `IPFS Content Identifier`, `HTTPS URL`, etc.\n\nParsing instructions are provided in the `bytecode` property, and the results are interpreted using the `types` property." + } + }, + "required": ["parse"], + "type": "object" + }, + "NftCategoryField": { + "additionalProperties": { + "additionalProperties": false, + "properties": { + "description": { + "description": "A string describing how this identity uses NFTs (for use in user interfaces). Descriptions longer than `160` characters may be elided in some interfaces.\n\nE.g.:\n- `The BCH value pledged at the time this receipt was issued.`\n- `The number of tokens sold in this order.`\n- `The seat number associated with this ticket.`", + "type": "string" + }, + "encoding": { + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "type": { + "enum": [ + "binary", + "boolean", + "hex", + "https-url", + "ipfs-cid", + "utf8", + "locktime" + ], + "type": "string" + } + }, + "required": ["type"], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "aggregate": { + "const": "add", + "description": "The `aggregate` property indicates that aggregating this field from multiple NFTs is desirable in user interfaces. For example, for a field named `BCH Pledged` where `aggregate` is `add`, the client can display a `Total BCH Pledged` in any user interface listing more than one NFT.\n\nIf specified, clients should aggregate the field from all NFTs, of all NFT types within the category, within a particular view (e.g. NFTs held by a single wallet, NFTs existing in a single transaction's outputs, etc.) using the specified operation.\n\nNote, while aggregation could be performed using any commutative operation – multiplication, bitwise AND, bitwise OR, bitwise XOR, etc. – only `add` is currently supported.", + "type": "string" + }, + "decimals": { + "description": "An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this token field.\n\nThis is the number of digits that can appear after the decimal separator in amounts. For a field with a `decimals` of `2`, a value of `123456` should be displayed as `1234.56`.\n\nIf omitted, defaults to `0`.", + "type": "number" + }, + "type": { + "const": "number", + "type": "string" + }, + "unit": { + "description": "The unit in which this field is denominated, taking the `decimals` value into account. If representing fungible token amount, this will often be the symbol of the represented token category.\n\nE.g. `BCH`, `sats`, `AcmeUSD`, etc.\n\nIf not provided, clients should not represent this field as having a unit beyond the field's `name`.", + "type": "string" + } + }, + "required": ["type"], + "type": "object" + } + ], + "description": "The expected encoding of this field when read from the parsing altstack (see {@link ParsableNftCollection } ). All encoding definitions must have a `type`, and some encoding definitions allow for additional hinting about display strategies in clients.\n\nEncoding types may be set to `binary`, `boolean`, `hex`, `number`, or `utf8`:\n\n- `binary` types should be displayed as binary literals (e.g. `0b0101`)\n- `boolean` types should be displayed as `true` if exactly `0x01` or `false` if exactly `0x00`. If a boolean value does not match one of these values, clients should represent the NFT as unable to be parsed (e.g. simply display the full `commitment`).\n- `hex` types should be displayed as hex literals (e.g.`0xabcd`).\n- `https-url` types are percent encoded with the `https://` prefix omitted; they may be displayed as URIs or as activatable links.\n- `ipfs-cid` types are binary-encoded IPFS Content Identifiers; they may be displayed as URIs or as activatable links.\n- `locktime` types are `OP_TXLOCKTIME` results: integers from `0` to `4294967295` (inclusive) where values less than `500000000` are understood to be a block height (the current block number in the chain, beginning from block `0`), and values greater than or equal to `500000000` are understood to be a Median Time Past (BIP113) UNIX timestamp. (Note, sequence age is not currently supported.)\n- `number` types should be displayed according the their configured `decimals` and `unit` values.\n- `utf8` types should be displayed as utf8 strings." + }, + "extensions": { + "$ref": "#/definitions/Extensions", + "description": "A mapping of NFT field extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific." + }, + "name": { + "description": "The name of this field for use in interfaces. Names longer than `20` characters may be elided in some interfaces.\n\nE.g.:\n- `BCH Pledged`\n- `Tokens Sold`\n- `Settlement Locktime`\n- `Seat Number`,\n- `IPFS Content Identifier`\n- `HTTPS URL`", + "type": "string" + }, + "uris": { + "$ref": "#/definitions/URIs", + "description": "A mapping of identifiers to URIs associated with this NFT field. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified." + } + }, + "required": ["encoding"], + "type": "object" + }, + "description": "A definition specifying a field that can be encoded in non-fungible tokens of a token category.", + "type": "object" + }, + "NftType": { + "additionalProperties": false, + "description": "A definition for one type of NFT within a token category.", + "properties": { + "description": { + "description": "A string describing this NFT type for use in user interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- \"Receipts issued by the exchange to record details about purchases. After settlement, these receipts are redeemed for the purchased tokens.\";\n- \"Receipts issued by the crowdfunding campaign to document the value of funds pledged. If the user decides to cancel their pledge before the campaign completes, these receipts can be redeemed for a full refund.\";\n- \"Tickets issued for events at ACME Stadium.\";\n- Sealed ballots certified by ACME decentralized organization during the voting period. After the voting period ends, these ballots must be revealed to reclaim the tokens used for voting.\"", + "type": "string" + }, + "extensions": { + "$ref": "#/definitions/Extensions", + "description": "A mapping of NFT type extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific." + }, + "fields": { + "description": "A list of identifiers for fields contained in NFTs of this type. On successful parsing evaluations, the bottom item on the altstack indicates the matched NFT type, and the remaining altstack items represent NFT field contents in the order listed (where `fields[0]` is the second-to-bottom item, and the final item in `fields` is the top of the altstack).\n\nFields should be ordered by recommended importance from most important to least important; in user interfaces, clients should display fields at lower indexes more prominently than those at higher indexes, e.g. if some fields cannot be displayed in minimized interfaces, higher-importance fields can still be represented. (Note, this ordering is controlled by the bytecode specified in `token.nft.parse.bytecode`.)\n\nIf this is a sequential NFT, (the category's `parse.bytecode` is undefined), `fields` should be omitted or set to `undefined`.", + "items": { + "type": "string" + }, + "type": "array" + }, + "name": { + "description": "The name of this NFT type for use in interfaces. Names longer than `20` characters may be elided in some interfaces.\n\nE.g. `Market Order Buys`, `Limit Order Sales`, `Pledge Receipts`, `ACME Stadium Tickets`, `Sealed Votes`, etc.", + "type": "string" + }, + "uris": { + "$ref": "#/definitions/URIs", + "description": "A mapping of identifiers to URIs associated with this NFT type. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified." + } + }, + "required": ["name"], + "type": "object" + }, + "OffChainRegistryIdentity": { + "additionalProperties": false, + "description": "An identity representing a metadata registry that is not published on-chain and therefore has no authbase or trackable authchain.", + "properties": { + "description": { + "description": "A string describing this identity for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `The common stock issued by ACME, Inc.`\n- `A metadata registry maintained by Company Name, the embedded registry for Wallet Name.`\n- `Software developer and lead maintainer of Wallet Name.`", + "type": "string" + }, + "extensions": { + "$ref": "#/definitions/Extensions", + "description": "A mapping of `IdentitySnapshot` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific.\n\nStandardized extensions for `IdentitySnapshot`s include the `authchain` extension. See https://github.com/bitjson/chip-bcmr#authchain-extension for details." + }, + "name": { + "description": "The name of this identity for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g. `ACME Class A Shares`, `ACME Registry`, `Satoshi Nakamoto`, etc.", + "type": "string" + }, + "tags": { + "description": "An array of `Tag` identifiers marking the `Tag`s associated with this identity. All specified tag identifiers must be defined in the registry's `tags` mapping.", + "items": { + "type": "string" + }, + "type": "array" + }, + "uris": { + "$ref": "#/definitions/URIs", + "description": "A mapping of identifiers to URIs associated with this identity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all identities:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `image`\n- `migrate`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`." + } + }, + "required": ["name"], + "type": "object" + }, + "ParsableNftCollection": { + "additionalProperties": false, + "description": "Interpretation information for a collection of parsable NFTs, a collection in which each NFT may include additional metadata fields beyond a sequential identifier within its on-chain commitment. Note that {@link ParsableNftCollection } s differ from {@link SequentialNftCollection } s in that parsable collections require a parsing `bytecode` with which to inspect each NFT commitment: the type of each NFT is indexed by the hex-encoded contents the bottom item on the altstack following the evaluation of the parsing bytecode.", + "properties": { + "bytecode": { + "description": "A segment of hex-encoded Bitcoin Cash VM bytecode that parses UTXOs holding NFTs of this category, identifies the NFT's type within the category, and returns a list of the NFT's field values via the altstack. If undefined, this NFT Category includes only sequential NFTs, with only an identifier and no NFT fields encoded in each NFT's on-chain commitment.\n\nThe parse `bytecode` is evaluated by instantiating and partially verifying a standardized NFT parsing transaction:\n- version: `2`\n- inputs: - 0: Spends the UTXO containing the NFT with an empty unlocking bytecode and sequence number of `0`. - 1: Spends index `0` of the empty hash outpoint, with locking bytecode set to `parse.bytecode`, unlocking bytecode `OP_1` (`0x51`) and sequence number `0`.\n- outputs: - 0: A locking bytecode of OP_RETURN (`0x6a`) and value of `0`.\n- locktime: `0`\n\nAfter input 1 of this NFT parsing transaction is evaluated, if the resulting stack is not valid (a single \"truthy\" element remaining on the stack) – or if the altstack is empty – parsing has failed and clients should represent the NFT as unable to be parsed (e.g. simply display the full `commitment` as a hex-encoded value in the user interface).\n\nOn successful parsing evaluations, the bottom item on the altstack indicates the type of the NFT according to the matching definition in `types`. If no match is found, clients should represent the NFT as unable to be parsed.\n\nFor example: `00d2517f7c6b` (OP_0 OP_UTXOTOKENCOMMITMENT OP_1 OP_SPLIT OP_SWAP OP_TOALTSTACK OP_TOALTSTACK) splits the commitment after 1 byte, pushing the first byte to the altstack as an NFT type identifier and the remaining segment of the commitment as the first NFT field value.\n\nIf undefined (in a {@link SequentialNftCollection } ), this field could be considered to have a default value of `00d26b` (OP_0 OP_UTXOTOKENCOMMITMENT OP_TOALTSTACK), which takes the full contents of the commitment as a fixed type index. As such, each index of the NFT category's `types` maps a precise commitment value to the metadata for NFTs with that particular commitment. E.g. an NFT with an empty commitment (VM number 0) maps to `types['']`, a commitment of `01` (hex) maps to `types['01']`, etc. This pattern is used for collections of sequential NFTs.", + "type": "string" + }, + "types": { + "additionalProperties": { + "$ref": "#/definitions/NftType", + "description": "A definitions for each type of NFT within the token category. Parsable NFT types are indexed by the hex-encoded value of the bottom altstack item following evaluation of `NftCategory.parse.bytecode`. The remaining altstack items are mapped to NFT fields according to the `fields` property of the matching NFT type." + }, + "description": "A mapping of hex-encoded values to definitions of possible NFT types in this category.", + "type": "object" + } + }, + "required": ["bytecode", "types"], + "type": "object" + }, + "RegistryTimestampKeyedValues": { + "additionalProperties": { + "$ref": "#/definitions/ChainSnapshot" + }, + "description": "A field keyed by timestamps to document the evolution of the field. Each timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.\n\nFor example, to insert a new value: ```ts const result = { ...previousValue, [(new Date()).toISOString()]: newValue }; ```", + "type": "object" + }, + "RegistryTimestampKeyedValues": { + "additionalProperties": { + "$ref": "#/definitions/IdentitySnapshot" + }, + "description": "A field keyed by timestamps to document the evolution of the field. Each timestamp must be provided in simplified extended ISO 8601 format, a 24-character string of format `YYYY-MM-DDTHH:mm:ss.sssZ` where timezone is zero UTC (denoted by `Z`). Note, this is the format returned by ECMAScript `Date.toISOString()`.\n\nFor example, to insert a new value: ```ts const result = { ...previousValue, [(new Date()).toISOString()]: newValue }; ```", + "type": "object" + }, + "SequentialNftCollection": { + "additionalProperties": false, + "description": "Interpretation information for a collection of sequential NFTs, a collection in which each NFT includes only a sequential identifier within its on-chain commitment. Note that {@link SequentialNftCollection } s differ from {@link ParsableNftCollection } s in that sequential collections lack a parsing `bytecode` with which to inspect each NFT commitment: the type of each NFT is indexed by the full contents its commitment (interpreted as a positive VM integer in user interfaces).", + "properties": { + "types": { + "additionalProperties": { + "$ref": "#/definitions/NftType", + "description": "Interpretation information for each type of NFT within the token category, indexed by commitment hex. For sequential NFTs, the on-chain commitment of each NFT is interpreted as a VM number to reference its particular NFT type in user interfaces. Issuing a sequential NFT with a negative or invalid VM number is discouraged, but clients may render the commitment of such NFTs in hex-encoded form, prefixed with `X`." + }, + "description": "A mapping of each NFT commitment (typically, a positive integer encoded as a VM number) to metadata for that NFT type in this category.", + "type": "object" + } + }, + "required": ["types"], + "type": "object" + }, + "Tag": { + "additionalProperties": false, + "description": "Tags allow registries to classify and group identities by a variety of characteristics. Tags are standardized within a registry and may represent either labels applied by that registry or designations by external authorities (certification, membership, ownership, etc.) that are tracked by that registry.\n\nExamples of possible tags include: `individual`, `organization`, `token`, `wallet`, `exchange`, `staking`, `utility-token`, `security-token`, `stablecoin`, `wrapped`, `collectable`, `deflationary`, `governance`, `decentralized-exchange`, `liquidity-provider`, `sidechain`, `sidechain-bridge`, `acme-audited`, `acme-endorsed`, etc.\n\nTags may be used by clients in search, discovery, and filtering of identities, and they can also convey information like accreditation from investor protection organizations, public certifications by security or financial auditors, and other designations that signal integrity and value to users.", + "properties": { + "description": { + "description": "A string describing this tag for use in user interfaces.\n\nIn user interfaces with limited space, descriptions should be hidden beyond the first newline character or `140` characters until revealed by the user.\n\nE.g.:\n- `An identity maintained by a single individual.`\n- `An identity representing a type of token.`\n- `An on-chain application that has passed security audits by ACME, Inc.`", + "type": "string" + }, + "extensions": { + "$ref": "#/definitions/Extensions", + "description": "A mapping of `Tag` extension identifiers to extension definitions. {@link Extensions } may be widely standardized or application-specific." + }, + "name": { + "description": "The name of this tag for use in interfaces.\n\nIn user interfaces with limited space, names should be hidden beyond the first newline character or `20` characters until revealed by the user.\n\nE.g.:\n- `Individual`\n- `Token`\n- `Audited by ACME, Inc.`", + "type": "string" + }, + "uris": { + "$ref": "#/definitions/URIs", + "description": "A mapping of identifiers to URIs associated with this tag. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix (e.g. `https://` or `ipfs://`). Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.\n\nThe following identifiers are recommended for all tags:\n- `icon`\n- `web`\n\nThe following optional identifiers are standardized:\n- `blog`\n- `chat`\n- `forum`\n- `icon-intro`\n- `registry`\n- `support`\n\nFor details on these standard identifiers, see: https://github.com/bitjson/chip-bcmr#uri-identifiers\n\nCustom URI identifiers allow for sharing social networking profiles, p2p connection information, and other application-specific URIs. Identifiers must be lowercase, alphanumeric strings, with no whitespace or special characters other than dashes (as a regular expression: `/^[-a-z0-9]+$/`).\n\nFor example, some common identifiers include: `discord`, `docker`, `facebook`, `git`, `github`, `gitter`, `instagram`, `linkedin`, `matrix`, `npm`, `reddit`, `slack`, `substack`, `telegram`, `twitter`, `wechat`, `youtube`." + } + }, + "required": ["name"], + "type": "object" + }, + "TokenCategory": { + "additionalProperties": false, + "description": "A definition specifying information about an identity's token category.", + "properties": { + "category": { + "description": "The current token category used by this identity. Often, this will be equal to the identity's authbase, but some token identities must migrate to new categories for technical reasons.", + "type": "string" + }, + "decimals": { + "description": "An integer between `0` and `18` (inclusive) indicating the divisibility of the primary unit of this token category.\n\nThis is the number of digits that can appear after the decimal separator in fungible token amounts. For a token category with a `symbol` of `SYMBOL` and a `decimals` of `2`, a fungible token amount of `12345` should be displayed as `123.45 SYMBOL`.\n\nIf omitted, defaults to `0`.", + "type": "number" + }, + "nfts": { + "$ref": "#/definitions/NftCategory", + "description": "Display information for non-fungible tokens (NFTs) of this identity. Omitted for token categories without NFTs." + }, + "symbol": { + "description": "An abbreviation used to uniquely identity this token category.\n\nSymbols must be comprised only of capital letters, numbers, and dashes (`-`). This can be validated with the regular expression: `/^[-A-Z0-9]+$/`.", + "type": "string" + } + }, + "required": ["category", "symbol"], + "type": "object" + }, + "URIs": { + "additionalProperties": { + "type": "string" + }, + "description": "A mapping of identifiers to URIs associated with an entity. URI identifiers may be widely-standardized or registry-specific. Values must be valid URIs, including a protocol prefix – e.g. `https://` or `ipfs://`., Clients are only required to support `https` and `ipfs` URIs, but any scheme may be specified.", + "type": "object" + } + } +} diff --git a/src/lib/schema/bcmr.spec.ts b/src/lib/schema/bcmr.spec.ts new file mode 100644 index 00000000..9302bd74 --- /dev/null +++ b/src/lib/schema/bcmr.spec.ts @@ -0,0 +1,14 @@ +import test from 'ava'; + +import type { MetadataRegistry } from '../lib.js'; +import { importMetadataRegistry } from '../lib.js'; + +test('importMetadataRegistry: accepts templates as either JSON strings or pre-parsed objects', (t) => { + const registry: MetadataRegistry = { + latestRevision: '', + registryIdentity: { name: '' }, + version: { major: 0, minor: 0, patch: 0 }, + }; + t.deepEqual(registry, importMetadataRegistry(registry)); + t.deepEqual(registry, importMetadataRegistry(JSON.stringify(registry))); +}); diff --git a/src/lib/schema/bcmr.ts b/src/lib/schema/bcmr.ts new file mode 100644 index 00000000..a0555157 --- /dev/null +++ b/src/lib/schema/bcmr.ts @@ -0,0 +1,34 @@ +import type { MetadataRegistry } from '../lib.js'; + +import { ajvStandaloneJsonParse } from './ajv/ajv-utils.js'; +// eslint-disable-next-line import/no-internal-modules +import walletTemplateValidator from './ajv/validate-bcmr.js'; + +/** + * Safely parse and validate a Bitcoin Cash Metadata Registry (BCMR), returning + * either an error message as a string or a valid {@link MetadataRegistry}. The + * registry may be provided either as an untrusted JSON string or as a + * pre-parsed object. + * + * This method validates both the structure and the contents of a registry: + * - All properties and sub-properties are verified to be of the expected type. + * - The registry contains no unknown properties. + * + * @param untrustedJsonOrObject - the JSON string or object to validate as + * metadata registry + */ +export const importMetadataRegistry = ( + untrustedJsonOrObject: unknown, +): MetadataRegistry | string => { + const errorPrefix = `Metadata Registry import failed:`; + const registry = ajvStandaloneJsonParse( + untrustedJsonOrObject, + walletTemplateValidator, + ); + if (typeof registry === 'string') { + return `${errorPrefix}${registry}`; + } + + // TODO: additional validation? + return registry; +}; diff --git a/src/lib/schema/fixtures/bcmr/bcmr.art-collection.json b/src/lib/schema/fixtures/bcmr/bcmr.art-collection.json new file mode 100644 index 00000000..5140f76a --- /dev/null +++ b/src/lib/schema/fixtures/bcmr/bcmr.art-collection.json @@ -0,0 +1,72 @@ +{ + "$schema": "https://cashtokens.org/bcmr-v2.schema.json", + "version": { "major": 1, "minor": 1, "patch": 0 }, + "latestRevision": "2023-04-14T00:00:17.720Z", + "registryIdentity": { + "name": "Example.com Token Registry", + "description": "An example registry demonstrating how the issuer of a non-fungible token (NFT) art collection might publish information about the collection.", + "uris": { + "icon": "https://example.com/registry-icon.svg", + "web": "https://example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json" + } + }, + "identities": { + "89cad9e3e34280eb1e8bc420542c00a7fcc01002b663dbf7f38bceddf80e680c": { + "2023-01-13T00:00:00.000Z": { + "name": "Example NFT Collection", + "description": "This is a short description of the collection; in most interfaces, it will be hidden beyond 140 characters or the first newline character.\n\nThis sentence should be hidden in user interfaces with limited space.\n\nThis collection defines metadata for 3 sequential NFTs, Example #0 (XAMPLZ-0), Example #1 (XAMPLZ-1), and Example #2 (XAMPLZ-2). Note that the 'icon' for each NFT is published via IPFS, so clients may download each icon by querying IPFS or by using an IPFS HTTP Gateway.", + "token": { + "category": "89cad9e3e34280eb1e8bc420542c00a7fcc01002b663dbf7f38bceddf80e680c", + "symbol": "XAMPLZ", + "nfts": { + "parse": { + "types": { + "": { + "name": "Example #0", + "description": "An NFT of this category with a zero-length on-chain commitment (VM number 0). Where appropriate, user interfaces may display the ticker symbol of NFTs matching this type as XAMPLZ-0.\n\nIn this example, the art represented by this NFT has a square aspect ratio and uses the SVG format, so the same URI can be used for both the 'icon' and 'image' URIs. For NFTs that represent art in raster formats other aspect ratios, the 'icon' URI should point to a 400px by 400px or SVG icon representing the NFT.", + "uris": { + "icon": "ipfs://bafybeihnmh5bkbaspp3xfdanje74pekhsklhobzzraeyywq6gcpb3iuvey/0.svg", + "image": "ipfs://bafybeihnmh5bkbaspp3xfdanje74pekhsklhobzzraeyywq6gcpb3iuvey/0.svg", + "web": "https://example.com/xamplz/0/details" + } + }, + "01": { + "name": "Example #1", + "description": "An NFT of this category with an on-chain commitment of 0x01 (VM number 1). Where appropriate, user interfaces may display the ticker symbol of NFTs matching this type as XAMPLZ-1.", + "uris": { + "icon": "ipfs://bafybeihnmh5bkbaspp3xfdanje74pekhsklhobzzraeyywq6gcpb3iuvey/1.svg", + "image": "ipfs://bafybeihnmh5bkbaspp3xfdanje74pekhsklhobzzraeyywq6gcpb3iuvey/1.svg", + "web": "https://example.com/xamplz/1/details", + "custom-uri-identifier": "protocol://data-for-some-protocol" + } + }, + "02": { + "name": "Example #2", + "description": "An NFT of this category with an on-chain commitment of 0x02 (VM number 2). Where appropriate, user interfaces may display the ticker symbol of NFTs matching this type as XAMPLZ-2.", + "uris": { + "icon": "ipfs://bafybeihnmh5bkbaspp3xfdanje74pekhsklhobzzraeyywq6gcpb3iuvey/2.svg", + "image": "ipfs://bafybeihnmh5bkbaspp3xfdanje74pekhsklhobzzraeyywq6gcpb3iuvey/2.svg", + "web": "https://example.com/another/path", + "another-uri-identifier": "protocol://data-for-that-protocol" + } + } + } + } + } + }, + "uris": { + "icon": "https://example.com/xamplz-icon.svg", + "web": "https://example.com/about-xamplz-nfts", + "blog": "https://blog.example.com/", + "chat": "https://chat.example.com/", + "forum": "https://forum.example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json", + "support": "https://support.example.com/", + "custom-uri-identifier": "protocol://connection-info-for-some-protocol" + } + } + } + }, + "license": "CC0-1.0" +} diff --git a/src/lib/schema/fixtures/bcmr/bcmr.decentralized-application.json b/src/lib/schema/fixtures/bcmr/bcmr.decentralized-application.json new file mode 100644 index 00000000..7595035e --- /dev/null +++ b/src/lib/schema/fixtures/bcmr/bcmr.decentralized-application.json @@ -0,0 +1,67 @@ +{ + "$schema": "https://cashtokens.org/bcmr-v2.schema.json", + "version": { "major": 1, "minor": 1, "patch": 0 }, + "latestRevision": "2023-04-14T00:00:17.720Z", + "registryIdentity": { + "name": "Example.com Token Registry", + "description": "An example demonstrating how a metadata registry might publish information about a decentralized application.", + "uris": { + "icon": "https://example.com/registry-icon.svg", + "web": "https://example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json" + } + }, + "identities": { + "89cad9e3e34280eb1e8bc420542c00a7fcc01002b663dbf7f38bceddf80e680c": { + "2023-01-13T00:00:00.000Z": { + "name": "Crowdfunding Campaign: Example", + "description": "This is a short description of the decentralized application; in most interfaces, it will be hidden beyond 140 characters or the first newline character.\n\nThis sentence should be hidden in user interfaces with limited space.\n\nThis crowdfunding campaign instance has a distinct name and symbol (CFC2023XAMPL) to make it easily distinguishable from other crowdfunding campaigns published using the same contracts.\n\nThis application uses only one type of parsable NFT, 'Pledge Receipt's, so the 'parse.bytecode' (OP_0 OP_TOALTSTACK OP_0 OP_UTXOTOKENCOMMITMENT OP_TOALTSTACK) doesn't require any OP_IF/ENDIF branches; an empty altstack item is pushed to indicate the NFT type (''), and the remaining portion of the commitment is pushed as the only field (Pledge Value).", + "token": { + "category": "89cad9e3e34280eb1e8bc420542c00a7fcc01002b663dbf7f38bceddf80e680c", + "symbol": "CFC2023XAMPL", + "nfts": { + "description": "Example Crowdfunding Campaign issues your wallet a receipt (NFT) when you make a pledge. Should you decide to cancel your pledge before the campaign completes, this receipt can be redeemed with the on-chain contract to receive a refund.", + "fields": { + "pledgeValue": { + "name": "Pledge Value", + "description": "The value pledged to the campaign in Bitcoin Cash.\n\nThis example demonstrates the additional capabilities of the 'number' encoding; clients are informed that pledge value can be aggregated (by addition) in views containing multiple NFTs to provide useful information to the user. For example, if the wallet holds two NFTs with Pledge Values of 123456 and 654321, the wallet can display a total of the user's pledges to this campaign: 0.00777777 BCH.", + "encoding": { + "type": "number", + "aggregate": "add", + "decimals": 8, + "unit": "BCH" + } + } + }, + "parse": { + "bytecode": "006b00cf6b", + "types": { + "": { + "name": "Pledge Receipt", + "description": "An NFT of this category with a zero-length on-chain commitment (VM number 0). Where appropriate, user interfaces may display the ticker symbol of NFTs matching this type as CFC2023XAMPL-0.\n\nPledge Receipts are the only type of NFT demonstrated in this example, and they contain only one field: pledgeValue.", + "fields": ["pledgeValue"], + "uris": { + "icon": "ipfs://bafybeihnmh5bkbaspp3xfdanje74pekhsklhobzzraeyywq6gcpb3iuvey/0.svg", + "web": "https://example.com/campaign", + "custom-uri-identifier": "protocol://data-for-some-protocol" + } + } + } + } + } + }, + "uris": { + "icon": "https://example.com/campaign-icon.svg", + "web": "https://example.com/about-campaign", + "blog": "https://blog.example.com/", + "chat": "https://chat.example.com/", + "forum": "https://forum.example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json", + "support": "https://support.example.com/", + "custom-uri-identifier": "protocol://connection-info-for-some-protocol" + } + } + } + }, + "license": "CC0-1.0" +} diff --git a/src/lib/schema/fixtures/bcmr/bcmr.fungible-token.json b/src/lib/schema/fixtures/bcmr/bcmr.fungible-token.json new file mode 100644 index 00000000..2ff5a82e --- /dev/null +++ b/src/lib/schema/fixtures/bcmr/bcmr.fungible-token.json @@ -0,0 +1,53 @@ +{ + "$schema": "https://cashtokens.org/bcmr-v2.schema.json", + "version": { "major": 1, "minor": 1, "patch": 0 }, + "latestRevision": "2023-04-14T00:00:17.720Z", + "registryIdentity": { + "name": "Example.com Token Registry", + "description": "An example registry demonstrating how the issuer of a single kind of fungible token might publish information about the token.", + "uris": { + "icon": "https://example.com/registry-icon.svg", + "web": "https://example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json" + } + }, + "identities": { + "89cad9e3e34280eb1e8bc420542c00a7fcc01002b663dbf7f38bceddf80e680c": { + "2023-01-13T00:00:00.000Z": { + "name": "Example Asset", + "description": "This is a short description of Example Asset. In most interfaces, it will be hidden beyond 140 characters or the first newline character.\n\nThis sentence should be hidden in user interfaces with limited space.\n\nNote that this snapshot was introduced on 2023-1-13, but the 'migrated' property indicates that the migration took place over the following month. During that month, most clients should have warned users about the upcoming change, referring users to the 'migrate' URI for information about the change. (Some clients may also offer clients the option to dismiss the migration period and immediately show the new metadata.) At 0 UTC on 2023-2-13, all clients should have switched their default display for this token to use the new metadata, i.e. ticker symbol XAMPL, with 6 decimal places. After the migrated timestamp, old metadata should only be displayed when providing historical context.", + "token": { + "category": "89cad9e3e34280eb1e8bc420542c00a7fcc01002b663dbf7f38bceddf80e680c", + "decimals": 6, + "symbol": "XAMPL" + }, + "migrated": "2023-02-13T00:00:00.000Z", + "uris": { + "icon": "https://example.com/xampl-icon.svg", + "web": "https://example.com/about-xampl", + "migrate": "https://blog.example.com/example-asset-is-now-XAMPL", + "blog": "https://blog.example.com/", + "chat": "https://chat.example.com/", + "forum": "https://forum.example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json", + "support": "https://support.example.com/", + "custom-uri-identifier": "protocol://connection-info-for-some-protocol" + } + }, + "2023-01-03T00:00:00.000Z": { + "name": "Example Asset", + "description": "This is a record of an older entry for the token identity. The token was rebranded (from EXAMPLE to XAMPL) and redenominated (from 8 to 6 decimals), but the existing token category was not modified: users were not required to trade their original EXAMPLE tokens for the redenominated XAMPL tokens, their wallets simply updated the way tokens are displayed using the new metadata. Note, this entry has likely been updated by the issuer to provide useful historical information rather than attempting to preserve the precise contents of the old snapshot; the 'web' URI links to a blog post about XAMPL's re-denomination/re-brand, and outdated URI information is excluded. There may have been metadata updates published between this snapshot and the latest snapshot, but they've been excluded because registries should strive to present a useful history of only meaningful changes to identities. This information can be used in user interfaces to improve continuity following metadata updates or to offer historical context.", + "token": { + "category": "89cad9e3e34280eb1e8bc420542c00a7fcc01002b663dbf7f38bceddf80e680c", + "decimals": 8, + "symbol": "EXAMPLE" + }, + "uris": { + "icon": "https://example.com/old-example-asset-icon.png", + "web": "https://blog.example.com/example-asset-is-now-XAMPL" + } + } + } + }, + "license": "CC0-1.0" +} diff --git a/src/lib/schema/fixtures/bcmr/bcmr.payouts-or-dividends.json b/src/lib/schema/fixtures/bcmr/bcmr.payouts-or-dividends.json new file mode 100644 index 00000000..7e043da7 --- /dev/null +++ b/src/lib/schema/fixtures/bcmr/bcmr.payouts-or-dividends.json @@ -0,0 +1,75 @@ +{ + "$schema": "https://cashtokens.org/bcmr-v2.schema.json", + "version": { "major": 1, "minor": 1, "patch": 0 }, + "latestRevision": "2023-04-14T00:00:17.720Z", + "registryIdentity": { + "name": "Example.com Token Registry", + "description": "An example demonstrating how a registry might publish information about fungible tokens that receive on-chain payouts or dividends, either from off-chain activities (e.g. equity or debt instruments) or as part of an on-chain mechanism (e.g. payouts from a decentralized application or sidechain).\n\nDescriptions below are written from the perspective of a client reading this registry shortly after its 'lastRevision' timestamp on 2023-04-14.", + "uris": { + "icon": "https://example.com/registry-icon.svg", + "web": "https://example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json" + } + }, + "identities": { + "978306aa4e02fd06e251b38d2e961f78f4af2ea6524a3e4531126776276a6af1": { + "2023-06-30T00:00:00.000Z": { + "name": "Example Payout Shares", + "description": "This is a description of Example Payout Shares. In most interfaces, it will be hidden beyond 140 characters or the first newline character.\n\nThis sentence should be hidden in user interfaces with limited space.\n\nThis asset entitles holders to on-chain payouts of some kind. For example, they may be shares of a company, interest-paying debt, or utility tokens of a decentralized application where holders have performed some service to the protocol (e.g. sidechain validation, liquidity provision, etc.).\n\nNote that this particular identity snapshot has not yet come into effect (assuming the client is reading the registry shortly after its 'lastRevision' timestamp on 2023-04-14); the next identity snapshot contains the current information for the identity. Instead, this snapshot indicates an update to the identity expected to happen in the future: a payout for 2023Q2, where token holders will trade in fungible tokens of the 2023Q2 category for a quarterly payout and receive an equivalent number of fungible tokens of the new, 2023Q3 category listed in this snapshot.", + "migrated": "2023-07-01T00:00:00.000Z", + "token": { + "category": "89cad9e3e34280eb1e8bc420542c00a7fcc01002b663dbf7f38bceddf80e680c", + "decimals": 6, + "symbol": "XAMPL-23Q3" + }, + "uris": { + "icon": "https://example.com/asset-icon.svg", + "web": "https://example.com/", + "migrate": "https://app.example.com/payouts/2023Q2", + "blog": "https://blog.example.com/", + "chat": "https://chat.example.com/", + "forum": "https://forum.example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json", + "support": "https://support.example.com/", + "custom-uri-identifier": "protocol://connection-info-for-some-protocol" + } + }, + "2023-03-31T00:00:00.000Z": { + "name": "Example Payout Shares", + "description": "The current identity snapshot for this token identity (assuming the client is reading the registry shortly after its 'lastRevision' timestamp on 2023-04-14). Note that as of now, tokens of this category (b1a35ca...) should be listed by the client simply by base symbol: XAMPL. When the next snapshot's initial timestamp is reached (2023-06-30) their full symbol should be displayed, XAMPL-23Q2, as the latest category for this token identity will become XAMPL-23Q3 (89cad9...), and only tokens of that category should be referred to using the base symbol. Holders of XAMPL-23Q2 can refer to the 'migrate' URI in the next snapshot for information about acquiring the new XAMPL tokens (XAMPL-23Q3) and their 2nd quarterly payout by trading in their XAMPL-23Q2 fungible tokens.", + "migrated": "2023-04-01T00:00:00.000Z", + "token": { + "category": "b1a35cadd5ddb1bd18787eeb99ee061f34b946f0db375d84caadd8ab621c10f5", + "decimals": 6, + "symbol": "XAMPL-23Q2" + }, + "uris": { + "icon": "https://example.com/asset-icon.svg", + "web": "https://example.com/", + "migrate": "https://app.example.com/payouts/2023Q1", + "blog": "https://blog.example.com/", + "chat": "https://chat.example.com/", + "forum": "https://forum.example.com/", + "registry": "https://example.com/.well-known/bitcoin-cash-metadata-registry.json", + "support": "https://support.example.com/", + "custom-uri-identifier": "protocol://connection-info-for-some-protocol" + } + }, + "2022-12-31T00:00:00.000Z": { + "name": "Example Payout Shares (2023Q1)", + "description": "Payout shares for Example Protocol for the first quarter of 2023. These shares can be redeemed with the on-chain payout system to receive the payout and the new tokens for 2023Q2. See the linked website for details.\n\nExample note: this asset (XAMPL-23Q1, 978306...) will still be held in wallets that have not yet redeemed the 2023Q1 payout. Because the payout is held by an on-chain covenant, it's safe to delay redemption indefinitely, as funds (and the new, XAMPL-23Q2 tokens) will remain in the covenant until fully claimed by existing XAMPL-23Q1 holders. Some holders may leave XAMPL-23Q1 tokens in long-term vaults for many quarters before withdrawing, redeeming all payouts, and depositing the latest XAMPL tokens back in such vaults.", + "migrated": "2023-01-01T00:00:00.000Z", + "token": { + "category": "978306aa4e02fd06e251b38d2e961f78f4af2ea6524a3e4531126776276a6af1", + "decimals": 6, + "symbol": "XAMPL-23Q1" + }, + "uris": { + "icon": "https://example.com/asset-icon-pending-payout.svg", + "web": "https://blog.example.com/payout-2023Q1" + } + } + } + }, + "license": "CC0-1.0" +} diff --git a/src/lib/schema/schema.ts b/src/lib/schema/schema.ts index 14f4ffdb..12cde3fa 100644 --- a/src/lib/schema/schema.ts +++ b/src/lib/schema/schema.ts @@ -1 +1,2 @@ -export * from './authentication-template.js'; +export * from './bcmr.js'; +export * from './wallet-template.js'; diff --git a/src/lib/schema/authentication-template.schema.json b/src/lib/schema/wallet-template.schema.json similarity index 87% rename from src/lib/schema/authentication-template.schema.json rename to src/lib/schema/wallet-template.schema.json index 282e3315..f2322cfb 100644 --- a/src/lib/schema/authentication-template.schema.json +++ b/src/lib/schema/wallet-template.schema.json @@ -1,24 +1,41 @@ { - "$ref": "#/definitions/AuthenticationTemplate", + "$ref": "#/definitions/WalletTemplate", "$schema": "http://json-schema.org/draft-07/schema#", "definitions": { - "AuthenticationTemplate": { + "AuthenticationVirtualMachineIdentifier": { + "description": "Allowable identifiers for authentication virtual machine versions. The `BCH` prefix identifies the Bitcoin Cash network, the `XEC` prefix identifies the eCash network, the `BSV` prefix identifies the Bitcoin SV network, and the `BTC` prefix identifies the Bitcoin Core network. VM versions are named according to the date they were deployed on the indicated network.\n\nFor each network prefix, a `_SPEC` VM version is reserved to indicate that the template requires a custom, not-yet-deployed VM version (e.g. one or more CHIPs). By convention, templates marked for `_SPEC` VMs should indicate their requirements in the template description. After deployment of the `_SPEC` VM, when template compatibility is verified, the template's `supported` array should be updated to indicate compatibility with the live VM version.", + "enum": [ + "BCH_2020_05", + "BCH_2021_05", + "BCH_2022_05", + "BCH_2023_05", + "BCH_SPEC", + "BSV_2020_02", + "BSV_SPEC", + "BTC_2017_08", + "BTC_SPEC", + "XEC_2020_05", + "XEC_SPEC" + ], + "type": "string" + }, + "WalletTemplate": { "additionalProperties": false, - "description": "An `AuthenticationTemplate` (A.K.A. `CashAssembly Template`) specifies a set of locking scripts, unlocking scripts, and other information required to use a certain authentication scheme. Templates fully describe wallets and protocols in a way that can be shared between software clients.", + "description": "A `WalletTemplate` specifies a set of locking scripts, unlocking scripts, and other information required to use a certain wallet protocol. Templates fully describe wallet protocols in a way that can be shared between software clients.", "properties": { "$schema": { - "description": "The URI that identifies the JSON Schema used by this template. Try: `https://libauth.org/schemas/authentication-template-v0.schema.json` to enable documentation, autocompletion, and validation in JSON documents.", + "description": "The URI that identifies the JSON Schema used by this template. Try: `https://libauth.org/schemas/wallet-template-v0.schema.json` to enable documentation, autocompletion, and validation in JSON documents.", "type": "string" }, "description": { - "description": "An optionally multi-line, free-form, human-readable description for this authentication template (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.", + "description": "An optionally multi-line, free-form, human-readable description for this wallet template (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.\n\nDescriptions have no length limit, but in user interfaces with limited space, they should be hidden beyond the first newline character or `140` characters until revealed by the user (e.g. by hiding the remaining description until the user activates a \"show more\" link).", "type": "string" }, "entities": { "additionalProperties": { - "$ref": "#/definitions/AuthenticationTemplateEntity" + "$ref": "#/definitions/WalletTemplateEntity" }, - "description": "A map of entities defined in this authentication template.\n\nObject keys are used as entity identifiers, and by convention, should use `snake_case`.", + "description": "A map of entities defined in this wallet template.\n\nObject keys are used as entity identifiers, and by convention, should use `snake_case`.", "type": "object" }, "name": { @@ -27,29 +44,29 @@ }, "scenarios": { "additionalProperties": { - "$ref": "#/definitions/AuthenticationTemplateScenario" + "$ref": "#/definitions/WalletTemplateScenario" }, - "description": "A scenario describes a context in which one or more scripts might be used. Scenarios are used for transaction estimation and as an integrated testing system for authentication templates.\n\nObject keys are used as scenario identifiers, and by convention, should use `snake_case`.", + "description": "A scenario describes a context in which one or more scripts might be used. Scenarios are used for transaction estimation and as an integrated testing system for wallet templates.\n\nObject keys are used as scenario identifiers, and by convention, should use `snake_case`.", "type": "object" }, "scripts": { "additionalProperties": { "anyOf": [ { - "$ref": "#/definitions/AuthenticationTemplateScript" + "$ref": "#/definitions/WalletTemplateScript" }, { - "$ref": "#/definitions/AuthenticationTemplateScriptLocking" + "$ref": "#/definitions/WalletTemplateScriptLocking" }, { - "$ref": "#/definitions/AuthenticationTemplateScriptTested" + "$ref": "#/definitions/WalletTemplateScriptTested" }, { - "$ref": "#/definitions/AuthenticationTemplateScriptUnlocking" + "$ref": "#/definitions/WalletTemplateScriptUnlocking" } ] }, - "description": "A map of scripts used in this authentication template.\n\nObject keys are used as script identifiers, and by convention, should use `snake_case`.", + "description": "A map of scripts used in this wallet template.\n\nObject keys are used as script identifiers, and by convention, should use `snake_case`.", "type": "object" }, "supported": { @@ -61,36 +78,35 @@ }, "version": { "const": 0, - "description": "A number identifying the format of this AuthenticationTemplate. Currently, this implementation requires `version` be set to `0`.", + "description": "A number identifying the format of this WalletTemplate. Currently, this implementation requires `version` be set to `0`.", "type": "number" } }, "required": ["entities", "scripts", "supported", "version"], "type": "object" }, - "AuthenticationTemplateAddressData": { + "WalletTemplateAddressData": { "additionalProperties": false, "properties": { "description": { - "description": "A single-line, human readable description for this address data.", + "description": "A single-line, human readable description for this variable (for use in user interfaces).", "type": "string" }, "name": { - "description": "A single-line, Title Case, human-readable name for this address data.", + "description": "A single-line, Title Case, human-readable name for this variable (for use in user interfaces).", "type": "string" }, "type": { "const": "AddressData", - "description": "`AddressData` is the most low-level variable type. It must be collected and stored each time a script is generated (usually, a locking script). `AddressData` can include any type of data, and can be used in any way.\n\nFor more persistent data, use `WalletData`.", "type": "string" } }, "required": ["type"], "type": "object" }, - "AuthenticationTemplateEntity": { + "WalletTemplateEntity": { "additionalProperties": false, - "description": "An object describing the configuration for a particular entity within an authentication template.", + "description": "An object describing the configuration for a particular entity within an wallet template.", "properties": { "description": { "description": "An optionally multi-line, free-form, human-readable description for this entity (for use in user interfaces). If displayed, this description should use a monospace font to properly render ASCII diagrams.", @@ -109,7 +125,7 @@ }, "variables": { "additionalProperties": { - "$ref": "#/definitions/AuthenticationTemplateVariable" + "$ref": "#/definitions/WalletTemplateVariable" }, "description": "A map of variables that must be provided by this entity for use in the template's scripts. Some variables are required before locking script generation, while some variables can or must be resolved only before unlocking script generation.\n\nObject keys are used as variable identifiers, and by convention, should use `snake_case`.", "type": "object" @@ -117,7 +133,7 @@ }, "type": "object" }, - "AuthenticationTemplateHdKey": { + "WalletTemplateHdKey": { "additionalProperties": false, "properties": { "addressOffset": { @@ -125,7 +141,7 @@ "type": "number" }, "description": { - "description": "A single-line, human readable description for this HD key.", + "description": "A single-line, human readable description for this variable (for use in user interfaces).", "type": "string" }, "hdPublicKeyDerivationPath": { @@ -133,9 +149,13 @@ "type": "string" }, "name": { - "description": "A single-line, Title Case, human-readable name for this HD key.", + "description": "A single-line, Title Case, human-readable name for this variable (for use in user interfaces).", "type": "string" }, + "neverSignTwice": { + "description": "If set to `true`, indicates that this key should never be used to sign two different messages.\n\nThis is useful for contracts that use zero-confirmation escrow systems to guarantee against double-spend attempts. By indicating that the user could be subjected to losses if a key were used in multiple signatures, templates can ensure that wallet implementations apply appropriate safeguards around use of the key.\n\nDefaults to `false`.", + "type": "boolean" + }, "privateDerivationPath": { "description": "The derivation path used to derive this `HdKey` from the owning entity's HD private key. By default, `m/i`.\n\nThis path uses the notation specified in BIP32 and the `i` character to represent the location of the `addressIndex`:\n\nThe first character must be `m` (private derivation), followed by sets of `/` and a number representing the child index used in the derivation at that depth. Hardened derivation is represented by a trailing `'`, and hardened child indexes are represented with the hardened index offset (`2147483648`) subtracted. The `i` character is replaced with the value of `addressIndex` plus this `HdKey`'s `addressOffset`. If the `i` character is followed by `'`, the hardened index offset is added (`2147483648`) and hardened derivation is used.\n\nFor example, `m/0/1'/i'` uses 3 levels of derivation, with child indexes in the following order:\n\n`derive(derive(derive(node, 0), 2147483648 + 1), 2147483648 + addressIndex + addressOffset)`\n\nBecause hardened derivation requires knowledge of the private key, `HdKey` variables with `derivationPath`s that include hardened derivation cannot use HD public derivation (the `hdPublicKeys` property in `CompilationData`). Instead, compilation requires the respective HD private key (`CompilationData.hdKeys.hdPrivateKeys`) or the fully-derived public key (`CompilationData.hdKeys.derivedPublicKeys`).", "type": "string" @@ -146,39 +166,41 @@ }, "type": { "const": "HdKey", - "description": "The `HdKey` (Hierarchical-Deterministic Key) type automatically manages key generation and mapping in a standard way. For greater control, use `Key`.", "type": "string" } }, "required": ["type"], "type": "object" }, - "AuthenticationTemplateKey": { + "WalletTemplateKey": { "additionalProperties": false, "properties": { "description": { - "description": "A single-line, human readable description for this key.", + "description": "A single-line, human readable description for this variable (for use in user interfaces).", "type": "string" }, "name": { - "description": "A single-line, Title Case, human-readable name for this key.", + "description": "A single-line, Title Case, human-readable name for this variable (for use in user interfaces).", "type": "string" }, + "neverSignTwice": { + "description": "If set to `true`, indicates that this key should never be used to sign two different messages.\n\nThis is useful for contracts that use zero-confirmation escrow systems to guarantee against double-spend attempts. By indicating that the user could be subjected to losses if a key were used in multiple signatures, templates can ensure that wallet implementations apply appropriate safeguards around use of the key.\n\nDefaults to `false`.", + "type": "boolean" + }, "type": { "const": "Key", - "description": "The `Key` type provides fine-grained control over key generation and mapping. Most templates should instead use `HdKey`.\n\nAny HD (Hierarchical-Deterministic) derivation must be completed outside of the templating system and provided at the time of use.", "type": "string" } }, "required": ["type"], "type": "object" }, - "AuthenticationTemplateScenario": { + "WalletTemplateScenario": { "additionalProperties": false, - "description": "An object describing the configuration for a particular scenario within an authentication template.", + "description": "An object describing the configuration for a particular scenario within an wallet template.", "properties": { "data": { - "$ref": "#/definitions/AuthenticationTemplateScenarioData", + "$ref": "#/definitions/WalletTemplateScenarioData", "description": "An object defining the data to use while compiling this scenario. The properties specified here are used to extend the existing scenario data based on this scenario's `extends` property.\n\nEach property is extended individually – to unset a previously-set property, the property must be individually overridden in this object." }, "description": { @@ -196,7 +218,7 @@ "sourceOutputs": { "description": "The list of source outputs (a.k.a. UTXOs) to use when generating the compilation context for this scenario.\n\nThe `sourceOutputs` property must have the same length as `transaction.inputs`, and each source output must be ordered to match the index of the input that spends it.\n\nTo be valid the `sourceOutputs` property must have exactly one source output with `lockingBytecode` set to `[\"slot\"]` – the output at the same index as the `[\"slot\"]` input in `transaction.inputs`.\n\nIf undefined, defaults to `[{ \"lockingBytecode\": [\"slot\"] }]`.", "items": { - "$ref": "#/definitions/AuthenticationTemplateScenarioSourceOutput" + "$ref": "#/definitions/WalletTemplateScenarioSourceOutput" }, "type": "array" }, @@ -207,7 +229,7 @@ "inputs": { "description": "The list of inputs to use when generating the transaction for this scenario.\n\nTo be valid the `inputs` property must have exactly one input with `unlockingBytecode` set to `[\"slot\"]`. This is the input in which the unlocking script under test will be placed.\n\nIf undefined, inherits the default scenario `inputs` value: `[{ \"unlockingBytecode\": [\"slot\"] }]`.", "items": { - "$ref": "#/definitions/AuthenticationTemplateScenarioInput" + "$ref": "#/definitions/WalletTemplateScenarioInput" }, "type": "array" }, @@ -218,7 +240,7 @@ "outputs": { "description": "The list of outputs to use when generating the transaction for this scenario.\n\nIf undefined, defaults to `[{ \"lockingBytecode\": {} }]`.", "items": { - "$ref": "#/definitions/AuthenticationTemplateScenarioTransactionOutput" + "$ref": "#/definitions/WalletTemplateScenarioTransactionOutput" }, "type": "array" }, @@ -232,7 +254,7 @@ }, "type": "object" }, - "AuthenticationTemplateScenarioBytecode": { + "WalletTemplateScenarioBytecode": { "anyOf": [ { "type": "string" @@ -241,7 +263,7 @@ "additionalProperties": false, "properties": { "overrides": { - "$ref": "#/definitions/AuthenticationTemplateScenarioData", + "$ref": "#/definitions/WalletTemplateScenarioData", "description": "Scenario data that extends the scenario's top-level `data` during script compilation.\n\nEach property is extended individually – to modify a property set by the top-level scenario `data`, the new value must be listed here.\n\nDefaults to `{}` for `sourceOutputs` and `transaction.inputs`; defaults to `{ \"hdKeys\": { \"addressIndex\": 1 } }` for `transaction.outputs`." }, "script": { @@ -265,9 +287,9 @@ "type": "object" } ], - "description": "A type that describes the configuration for a particular locking or unlocking bytecode within an authentication template scenario.\n\nBytecode may be specified as either a hexadecimal-encoded string or an object describing the required compilation.\n\nFor `sourceOutputs` and `transaction.inputs`, defaults to `{ script: [\"copy\"], overrides: {} }`. For `transaction.outputs`, defaults to `{ script: [\"copy\"], overrides: { \"hdKeys\": { \"addressIndex\": 1 } } }`." + "description": "A type that describes the configuration for a particular locking or unlocking bytecode within a wallet template scenario.\n\nBytecode may be specified as either a hexadecimal-encoded string or an object describing the required compilation.\n\nFor `sourceOutputs` and `transaction.inputs`, defaults to `{ script: [\"copy\"], overrides: {} }`. For `transaction.outputs`, defaults to `{ script: [\"copy\"], overrides: { \"hdKeys\": { \"addressIndex\": 1 } } }`." }, - "AuthenticationTemplateScenarioData": { + "WalletTemplateScenarioData": { "additionalProperties": false, "description": "An object defining the data to use while compiling a scenario.", "properties": { @@ -328,9 +350,9 @@ }, "type": "object" }, - "AuthenticationTemplateScenarioInput": { + "WalletTemplateScenarioInput": { "additionalProperties": false, - "description": "An example input used to define a scenario for an authentication template.", + "description": "An example input used to define a scenario for a wallet template.", "properties": { "outpointIndex": { "description": "The index of the output in the transaction from which this input is spent.\n\nIf undefined, this defaults to the same index as the input itself (so that by default, every outpoint in the produced transaction is different, even if an empty `outpointTransactionHash` is used for each transaction).", @@ -347,7 +369,7 @@ "unlockingBytecode": { "anyOf": [ { - "$ref": "#/definitions/AuthenticationTemplateScenarioBytecode" + "$ref": "#/definitions/WalletTemplateScenarioBytecode" }, { "items": { @@ -359,17 +381,17 @@ "type": "array" } ], - "description": "The `unlockingBytecode` value of this input for this scenario. This must be either `[\"slot\"]`, indicating that this input contains the `unlockingBytecode` under test by the scenario, or an `AuthenticationTemplateScenarioBytecode`.\n\nFor a scenario to be valid, `unlockingBytecode` must be `[\"slot\"]` for exactly one input in the scenario.\n\nDefaults to `[\"slot\"]`." + "description": "The `unlockingBytecode` value of this input for this scenario. This must be either `[\"slot\"]`, indicating that this input contains the `unlockingBytecode` under test by the scenario, or an `WalletTemplateScenarioBytecode`.\n\nFor a scenario to be valid, `unlockingBytecode` must be `[\"slot\"]` for exactly one input in the scenario.\n\nDefaults to `[\"slot\"]`." } }, "type": "object" }, - "AuthenticationTemplateScenarioOutput": { + "WalletTemplateScenarioOutput": { "additionalProperties": false, - "description": "An example output used to define a scenario for an authentication template.", + "description": "An example output used to define a scenario for a wallet template.", "properties": { "lockingBytecode": { - "$ref": "#/definitions/AuthenticationTemplateScenarioBytecode", + "$ref": "#/definitions/WalletTemplateScenarioBytecode", "description": "The locking bytecode used to encumber this output.\n\n`lockingBytecode` values may be provided as a hexadecimal-encoded string or as an object describing the required compilation. If undefined, defaults to `{}`, which uses the default values for `script` and `overrides`, respectively.\n\nOnly source outputs may specify a `lockingBytecode` of `[\"slot\"]`; this identifies the source output in which the locking script under test will be placed. (To be valid, every scenario's `sourceOutputs` property must have exactly one source output slot and one input slot at the same index.)" }, "token": { @@ -410,14 +432,14 @@ }, "type": "object" }, - "AuthenticationTemplateScenarioOutput": { + "WalletTemplateScenarioOutput": { "additionalProperties": false, - "description": "An example output used to define a scenario for an authentication template.", + "description": "An example output used to define a scenario for a wallet template.", "properties": { "lockingBytecode": { "anyOf": [ { - "$ref": "#/definitions/AuthenticationTemplateScenarioBytecode" + "$ref": "#/definitions/WalletTemplateScenarioBytecode" }, { "items": { @@ -469,17 +491,17 @@ }, "type": "object" }, - "AuthenticationTemplateScenarioSourceOutput": { - "$ref": "#/definitions/AuthenticationTemplateScenarioOutput", - "description": "A source output used by an authentication template scenario." + "WalletTemplateScenarioSourceOutput": { + "$ref": "#/definitions/WalletTemplateScenarioOutput", + "description": "A source output used by a wallet template scenario." }, - "AuthenticationTemplateScenarioTransactionOutput": { - "$ref": "#/definitions/AuthenticationTemplateScenarioOutput", - "description": "A transaction output used to define an authentication template scenario transaction." + "WalletTemplateScenarioTransactionOutput": { + "$ref": "#/definitions/WalletTemplateScenarioOutput", + "description": "A transaction output used to define a wallet template scenario transaction." }, - "AuthenticationTemplateScript": { + "WalletTemplateScript": { "additionalProperties": false, - "description": "An object describing the configuration for a particular script within an authentication template.", + "description": "An object describing the configuration for a particular script within an wallet template.", "properties": { "name": { "description": "A single-line, human-readable name for this script (for use in user interfaces).", @@ -493,7 +515,7 @@ "required": ["script"], "type": "object" }, - "AuthenticationTemplateScriptLocking": { + "WalletTemplateScriptLocking": { "additionalProperties": false, "properties": { "lockingType": { @@ -513,7 +535,7 @@ "required": ["lockingType", "script"], "type": "object" }, - "AuthenticationTemplateScriptTest": { + "WalletTemplateScriptTest": { "additionalProperties": false, "properties": { "check": { @@ -553,7 +575,7 @@ "required": ["check"], "type": "object" }, - "AuthenticationTemplateScriptTested": { + "WalletTemplateScriptTested": { "additionalProperties": false, "properties": { "name": { @@ -570,7 +592,7 @@ }, "tests": { "additionalProperties": { - "$ref": "#/definitions/AuthenticationTemplateScriptTest" + "$ref": "#/definitions/WalletTemplateScriptTest" }, "description": "One or more tests that can be used during development and during template validation to confirm the correctness of this tested script.", "type": "object" @@ -579,7 +601,7 @@ "required": ["script", "tests"], "type": "object" }, - "AuthenticationTemplateScriptUnlocking": { + "WalletTemplateScriptUnlocking": { "additionalProperties": false, "properties": { "ageLock": { @@ -587,7 +609,7 @@ "type": "string" }, "estimate": { - "description": "The identifier of the scenario to use for this unlocking script when compiling an estimated transaction.\n\nUsing estimate scenarios, it's possible for wallet software to compute an \"estimated transaction\", an invalid transaction that is guaranteed to be the same byte length as the final transaction. This length can be used to calculate the required transaction fee and assign values to the transaction's change output(s). Because estimate scenarios provide \"estimated\" values for all variables, this estimation can be done by a single entity without input from other entities.\n\nIf not provided, the default scenario will be used for estimation. The default scenario only provides values for each `Key` and `HdKey` variable, so compilations requiring other variables will produce errors. See `AuthenticationTemplateScenario.extends` for details.", + "description": "The identifier of the scenario to use for this unlocking script when compiling an estimated transaction.\n\nUsing estimate scenarios, it's possible for wallet software to compute an \"estimated transaction\", an invalid transaction that is guaranteed to be the same byte length as the final transaction. This length can be used to calculate the required transaction fee and assign values to the transaction's change output(s). Because estimate scenarios provide \"estimated\" values for all variables, this estimation can be done by a single entity without input from other entities.\n\nIf not provided, the default scenario will be used for estimation. The default scenario only provides values for each `Key` and `HdKey` variable, so compilations requiring other variables will produce errors. See `WalletTemplateScenario.extends` for details.", "type": "string" }, "fails": { @@ -632,58 +654,40 @@ "required": ["script", "unlocks"], "type": "object" }, - "AuthenticationTemplateVariable": { + "WalletTemplateVariable": { "anyOf": [ { - "$ref": "#/definitions/AuthenticationTemplateAddressData" + "$ref": "#/definitions/WalletTemplateAddressData" }, { - "$ref": "#/definitions/AuthenticationTemplateHdKey" + "$ref": "#/definitions/WalletTemplateHdKey" }, { - "$ref": "#/definitions/AuthenticationTemplateKey" + "$ref": "#/definitions/WalletTemplateKey" }, { - "$ref": "#/definitions/AuthenticationTemplateWalletData" + "$ref": "#/definitions/WalletTemplateWalletData" } ] }, - "AuthenticationTemplateWalletData": { + "WalletTemplateWalletData": { "additionalProperties": false, "properties": { "description": { - "description": "A single-line, human readable description for this wallet data.", + "description": "A single-line, human readable description for this variable (for use in user interfaces).", "type": "string" }, "name": { - "description": "A single-line, Title Case, human-readable name for this wallet data.", + "description": "A single-line, Title Case, human-readable name for this variable (for use in user interfaces).", "type": "string" }, "type": { "const": "WalletData", - "description": "The `WalletData` type provides a static piece of data that should be collected once and stored at the time of wallet creation. `WalletData` should be persistent for the life of the wallet, rather than changing from locking script to locking script.\n\nFor address-specific data, use `AddressData`.", "type": "string" } }, "required": ["type"], "type": "object" - }, - "AuthenticationVirtualMachineIdentifier": { - "description": "Allowable identifiers for authentication virtual machine versions. The `BCH` prefix identifies the Bitcoin Cash network, the `XEC` prefix identifies the eCash network, the `BSV` prefix identifies the Bitcoin SV network, and the `BTC` prefix identifies the Bitcoin Core network. VM versions are named according to the date they were deployed on the indicated network.\n\nFor each network prefix, a `_SPEC` VM version is reserved to indicate that the template requires a custom, not-yet-deployed VM version (e.g. one or more CHIPs). By convention, templates marked for `_SPEC` VMs should indicate their requirements in the template description. After deployment of the `_SPEC` VM, when template compatibility is verified, the template's `supported` array should be updated to indicate compatibility with the live VM version.", - "enum": [ - "BCH_2020_05", - "BCH_2021_05", - "BCH_2022_05", - "BCH_2023_05", - "BCH_SPEC", - "BSV_2020_02", - "BSV_SPEC", - "BTC_2017_08", - "BTC_SPEC", - "XEC_2020_05", - "XEC_SPEC" - ], - "type": "string" } } } diff --git a/src/lib/schema/authentication-template.spec.ts b/src/lib/schema/wallet-template.spec.ts similarity index 88% rename from src/lib/schema/authentication-template.spec.ts rename to src/lib/schema/wallet-template.spec.ts index dc84f682..8480a1b9 100644 --- a/src/lib/schema/authentication-template.spec.ts +++ b/src/lib/schema/wallet-template.spec.ts @@ -1,60 +1,56 @@ /* eslint-disable max-lines */ import test from 'ava'; -import type { AuthenticationTemplate } from '../lib.js'; -import { - BuiltInVariables, - importAuthenticationTemplate, - stringify, -} from '../lib.js'; +import type { WalletTemplate } from '../lib.js'; +import { BuiltInVariables, importWalletTemplate, stringify } from '../lib.js'; -test('importAuthenticationTemplate: accepts templates as either JSON strings or pre-parsed objects', (t) => { - const template: AuthenticationTemplate = { +test('importWalletTemplate: accepts templates as either JSON strings or pre-parsed objects', (t) => { + const template: WalletTemplate = { entities: {}, scripts: { a: { script: '' } }, supported: ['BCH_2022_05'], version: 0, }; - t.deepEqual(template, importAuthenticationTemplate(template)); - t.deepEqual(template, importAuthenticationTemplate(JSON.stringify(template))); + t.deepEqual(template, importWalletTemplate(template)); + t.deepEqual(template, importWalletTemplate(JSON.stringify(template))); }); const testValidation = test.macro< - [unknown, ReturnType] + [unknown, ReturnType] >({ exec: (t, input, expected) => { - const result = importAuthenticationTemplate(input); + const result = importWalletTemplate(input); t.deepEqual(result, expected, stringify(result)); }, - title: (title) => `importAuthenticationTemplate: ${title ?? '?'}`, + title: (title) => `importWalletTemplate: ${title ?? '?'}`, }); test.failing( 'must be an object', testValidation, 'a string', - 'A valid authentication template must be an object.' + 'A valid wallet template must be an object.', ); test.failing( 'must be version 0', testValidation, { version: 1 }, - 'Only version 0 authentication templates are currently supported.' + 'Only version 0 wallet templates are currently supported.', ); test.failing( 'must provide a "supported" property', testValidation, { supported: 42, version: 0 }, - 'Version 0 authentication templates must include a "supported" list of authentication virtual machine versions. Available identifiers are: BCH_SPEC, BCH_2022_11, BCH_2022_05_SPEC, BCH_2022_05, BCH_2021_11_SPEC, BCH_2021_11, BCH_2021_05_SPEC, BCH_2021_05, BCH_2020_11_SPEC, BCH_2020_11, BCH_2020_05, BCH_2019_11, BCH_2019_05, BSV_2018_11, BTC_2017_08.' + 'Version 0 wallet templates must include a "supported" list of authentication virtual machine versions. Available identifiers are: BCH_SPEC, BCH_2022_11, BCH_2022_05_SPEC, BCH_2022_05, BCH_2021_11_SPEC, BCH_2021_11, BCH_2021_05_SPEC, BCH_2021_05, BCH_2020_11_SPEC, BCH_2020_11, BCH_2020_05, BCH_2019_11, BCH_2019_05, BSV_2018_11, BTC_2017_08.', ); test.failing( 'must use only known virtual machine identifiers in "supported"', testValidation, { supported: ['not supported'], version: 0 }, - 'Version 0 authentication templates must include a "supported" list of authentication virtual machine versions. Available identifiers are: BCH_SPEC, BCH_2022_11, BCH_2022_05_SPEC, BCH_2022_05, BCH_2021_11_SPEC, BCH_2021_11, BCH_2021_05_SPEC, BCH_2021_05, BCH_2020_11_SPEC, BCH_2020_11, BCH_2020_05, BCH_2019_11, BCH_2019_05, BSV_2018_11, BTC_2017_08.' + 'Version 0 wallet templates must include a "supported" list of authentication virtual machine versions. Available identifiers are: BCH_SPEC, BCH_2022_11, BCH_2022_05_SPEC, BCH_2022_05, BCH_2021_11_SPEC, BCH_2021_11, BCH_2021_05_SPEC, BCH_2021_05, BCH_2020_11_SPEC, BCH_2020_11, BCH_2020_05, BCH_2019_11, BCH_2019_05, BSV_2018_11, BTC_2017_08.', ); test.failing( @@ -62,42 +58,42 @@ test.failing( testValidation, // eslint-disable-next-line no-sparse-arrays { supported: ['BCH_2020_05', , 'BCH_2020_11_SPEC'], version: 0 }, - 'Version 0 authentication templates must include a "supported" list of authentication virtual machine versions. Available identifiers are: BCH_SPEC, BCH_2022_11, BCH_2022_05_SPEC, BCH_2022_05, BCH_2021_11_SPEC, BCH_2021_11, BCH_2021_05_SPEC, BCH_2021_05, BCH_2020_11_SPEC, BCH_2020_11, BCH_2020_05, BCH_2019_11, BCH_2019_05, BSV_2018_11, BTC_2017_08.' + 'Version 0 wallet templates must include a "supported" list of authentication virtual machine versions. Available identifiers are: BCH_SPEC, BCH_2022_11, BCH_2022_05_SPEC, BCH_2022_05, BCH_2021_11_SPEC, BCH_2021_11, BCH_2021_05_SPEC, BCH_2021_05, BCH_2020_11_SPEC, BCH_2020_11, BCH_2020_05, BCH_2019_11, BCH_2019_05, BSV_2018_11, BTC_2017_08.', ); test.failing( '"$schema" must be a string (if present)', testValidation, { $schema: 42, supported: ['BCH_SPEC'], version: 0 }, - 'The "$schema" property of an authentication template must be a string.' + 'The "$schema" property of a wallet template must be a string.', ); test.failing( '"name" must be a string (if present)', testValidation, { name: 42, supported: ['BCH_SPEC'], version: 0 }, - 'The "name" property of an authentication template must be a string.' + 'The "name" property of a wallet template must be a string.', ); test.failing( '"description" must be a string (if present)', testValidation, { description: 42, supported: ['BCH_SPEC'], version: 0 }, - 'The "description" property of an authentication template must be a string.' + 'The "description" property of a wallet template must be a string.', ); test.failing( '"entities" must be a an object', testValidation, { entities: 42, scripts: {}, supported: ['BCH_SPEC'], version: 0 }, - 'The "entities" property of an authentication template must be an object.' + 'The "entities" property of a wallet template must be an object.', ); test.failing( '"scripts" must be a an object', testValidation, { entities: {}, scripts: 42, supported: ['BCH_SPEC'], version: 0 }, - 'The "scripts" property of an authentication template must be an object.' + 'The "scripts" property of a wallet template must be an object.', ); test.failing( @@ -110,7 +106,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "scenarios" property of an authentication template must be an object.' + 'If defined, the "scenarios" property of a wallet template must be an object.', ); test.failing( @@ -123,7 +119,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'All authentication template scripts must be objects, but the following scripts are not objects: "a".' + 'All wallet template scripts must be objects, but the following scripts are not objects: "a".', ); test.failing( @@ -136,7 +132,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "script" property of script "a" must be a string.' + 'The "script" property of script "a" must be a string.', ); test.failing( @@ -149,7 +145,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "script" property of unlocking script "a" must be a string.' + 'The "script" property of unlocking script "a" must be a string.', ); test.failing( @@ -162,7 +158,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "unlocks" property of unlocking script "a" must be a string.' + 'The "unlocks" property of unlocking script "a" must be a string.', ); test.failing( @@ -175,7 +171,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The following locking scripts (referenced in "unlocks" properties) were not provided: "b".' + 'The following locking scripts (referenced in "unlocks" properties) were not provided: "b".', ); test.failing( @@ -191,7 +187,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "timeLockType" property of unlocking script "a" must be either "timestamp" or "height".' + 'If defined, the "timeLockType" property of unlocking script "a" must be either "timestamp" or "height".', ); test.failing( @@ -207,7 +203,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "name" property of unlocking script "a" must be a string.' + 'If defined, the "name" property of unlocking script "a" must be a string.', ); test.failing( @@ -223,7 +219,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "ageLock" property of unlocking script "a" must be a string.' + 'If defined, the "ageLock" property of unlocking script "a" must be a string.', ); test.failing( @@ -239,7 +235,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "estimate" property of unlocking script "a" must be a string.' + 'If defined, the "estimate" property of unlocking script "a" must be a string.', ); test.failing( @@ -255,7 +251,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "passes" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "passes" property of unlocking script "a" must be an array containing only scenario identifiers (strings).', ); test.failing( @@ -271,7 +267,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "fails" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "fails" property of unlocking script "a" must be an array containing only scenario identifiers (strings).', ); test.failing( @@ -287,7 +283,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "invalid" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "invalid" property of unlocking script "a" must be an array containing only scenario identifiers (strings).', ); test.failing( @@ -304,7 +300,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "passes" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "passes" property of unlocking script "a" must be an array containing only scenario identifiers (strings).', ); test.failing( @@ -320,7 +316,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "fails" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "fails" property of unlocking script "a" must be an array containing only scenario identifiers (strings).', ); test.failing( @@ -336,7 +332,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "invalid" property of unlocking script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "invalid" property of unlocking script "a" must be an array containing only scenario identifiers (strings).', ); test( @@ -361,7 +357,7 @@ test( }, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -374,7 +370,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "lockingType" property of locking script "b" must be either "standard" or "p2sh20".' + 'The "lockingType" property of locking script "b" must be either "standard" or "p2sh20".', ); test.failing( @@ -387,7 +383,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "script" property of locking script "b" must be a string.' + 'The "script" property of locking script "b" must be a string.', ); test.failing( @@ -403,7 +399,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "name" property of locking script "b" must be a string.' + 'If defined, the "name" property of locking script "b" must be a string.', ); test.failing( @@ -418,7 +414,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "script" property of tested script "a" must be a string.' + 'The "script" property of tested script "a" must be a string.', ); test.failing( @@ -433,7 +429,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "name" property of tested script "a" must be a string.' + 'If defined, the "name" property of tested script "a" must be a string.', ); test.failing( @@ -448,7 +444,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "tests" property of tested script "a" must be an array.' + 'If defined, the "tests" property of tested script "a" must be an array.', ); test.failing( @@ -463,7 +459,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "check" properties of all tests in tested script "a" must be a strings.' + 'The "check" properties of all tests in tested script "a" must be a strings.', ); test.failing( @@ -478,7 +474,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "name" properties of all tests in tested script "a" must be strings.' + 'If defined, the "name" properties of all tests in tested script "a" must be strings.', ); test.failing( @@ -493,7 +489,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "setup" properties of all tests in tested script "a" must be strings.' + 'If defined, the "setup" properties of all tests in tested script "a" must be strings.', ); test.failing( @@ -508,7 +504,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "passes" property of each test in tested script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "passes" property of each test in tested script "a" must be an array containing only scenario identifiers (strings).', ); test.failing( @@ -523,7 +519,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "fails" property of each test in tested script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "fails" property of each test in tested script "a" must be an array containing only scenario identifiers (strings).', ); test.failing( @@ -538,7 +534,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "invalid" property of each test in tested script "a" must be an array containing only scenario identifiers (strings).' + 'If defined, the "invalid" property of each test in tested script "a" must be an array containing only scenario identifiers (strings).', ); test.failing( @@ -553,7 +549,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "pushed" property of tested script "a" must be a boolean value.' + 'If defined, the "pushed" property of tested script "a" must be a boolean value.', ); test( @@ -610,7 +606,7 @@ test( }, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -626,7 +622,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'Locking and unlocking scripts may not have tests, but the following scripts include a "tests" property: "a", "b"' + 'Locking and unlocking scripts may not have tests, but the following scripts include a "tests" property: "a", "b"', ); test.failing( @@ -639,7 +635,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "name" property of script "a" must be a string.' + 'If defined, the "name" property of script "a" must be a string.', ); test.failing( @@ -652,7 +648,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'All authentication template entities must be objects, but the following entities are not objects: "e".' + 'All wallet template entities must be objects, but the following entities are not objects: "e".', ); test.failing( @@ -665,7 +661,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "description" property of entity "e" must be a string.' + 'If defined, the "description" property of entity "e" must be a string.', ); test.failing( @@ -678,7 +674,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "name" property of entity "e" must be a string.' + 'If defined, the "name" property of entity "e" must be a string.', ); test.failing( @@ -691,7 +687,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "scripts" property of entity "e" must be an array containing only script identifiers (strings).' + 'If defined, the "scripts" property of entity "e" must be an array containing only script identifiers (strings).', ); test.failing( @@ -705,7 +701,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "scripts" property of entity "e" must be an array containing only script identifiers (strings).' + 'If defined, the "scripts" property of entity "e" must be an array containing only script identifiers (strings).', ); test.failing( @@ -718,7 +714,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "variables" property of entity "e" must be an object.' + 'If defined, the "variables" property of entity "e" must be an object.', ); test.failing( @@ -731,7 +727,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'All authentication template variables must be objects, but the following variables owned by entity "e" are not objects: "v".' + 'All wallet template variables must be objects, but the following variables owned by entity "e" are not objects: "v".', ); test.failing( @@ -744,7 +740,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "type" property of variable "v" must be a valid authentication template variable type. Available types are: "AddressData", "HdKey", "Key", "WalletData".' + 'The "type" property of variable "v" must be a valid wallet template variable type. Available types are: "AddressData", "HdKey", "Key", "WalletData".', ); test.failing( @@ -759,7 +755,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "description" property of variable "v" must be a string.' + 'If defined, the "description" property of variable "v" must be a string.', ); test.failing( @@ -774,7 +770,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "name" property of variable "v" must be a string.' + 'If defined, the "name" property of variable "v" must be a string.', ); test.failing( @@ -789,7 +785,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "addressOffset" property of HdKey "v" must be a number.' + 'If defined, the "addressOffset" property of HdKey "v" must be a number.', ); test.failing( @@ -804,7 +800,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "hdPublicKeyDerivationPath" property of HdKey "v" must be a string.' + 'If defined, the "hdPublicKeyDerivationPath" property of HdKey "v" must be a string.', ); test.failing( @@ -819,7 +815,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "privateDerivationPath" property of HdKey "v" must be a string.' + 'If defined, the "privateDerivationPath" property of HdKey "v" must be a string.', ); test.failing( @@ -834,7 +830,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "publicDerivationPath" property of HdKey "v" must be a string.' + 'If defined, the "publicDerivationPath" property of HdKey "v" must be a string.', ); test.failing( @@ -849,7 +845,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "privateDerivationPath" property of HdKey "v" must be a valid private derivation path, but the provided value is "m". A valid path must begin with "m" and include only "/", "\'", a single "i" address index character, and numbers.' + 'If defined, the "privateDerivationPath" property of HdKey "v" must be a valid private derivation path, but the provided value is "m". A valid path must begin with "m" and include only "/", "\'", a single "i" address index character, and numbers.', ); test.failing( @@ -866,7 +862,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "hdPublicKeyDerivationPath" property of an HdKey must be a valid private derivation path for the HdKey\'s HD public node, but the provided value for HdKey "v" is "M/0". A valid path must begin with "m" and include only "/", "\'", and numbers (the "i" character cannot be used in "hdPublicKeyDerivationPath").' + 'If defined, the "hdPublicKeyDerivationPath" property of an HdKey must be a valid private derivation path for the HdKey\'s HD public node, but the provided value for HdKey "v" is "M/0". A valid path must begin with "m" and include only "/", "\'", and numbers (the "i" character cannot be used in "hdPublicKeyDerivationPath").', ); test.failing( @@ -883,7 +879,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "publicDerivationPath" property of HdKey "v" must be a valid public derivation path, but the current value is "m/0". Public derivation paths must begin with "M" and include only "/", a single "i" address index character, and numbers. If the "privateDerivationPath" uses hardened derivation, the "publicDerivationPath" should be set to enable public derivation from the "hdPublicKeyDerivationPath".' + 'The "publicDerivationPath" property of HdKey "v" must be a valid public derivation path, but the current value is "m/0". Public derivation paths must begin with "M" and include only "/", a single "i" address index character, and numbers. If the "privateDerivationPath" uses hardened derivation, the "publicDerivationPath" should be set to enable public derivation from the "hdPublicKeyDerivationPath".', ); test.failing( @@ -908,7 +904,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The "privateDerivationPath" property of HdKey "v" is "m/2\'/i", but the implied private derivation path of "hdPublicKeyDerivationPath" and "publicDerivationPath" is "m/1\'/i". The "publicDerivationPath" property must be set to allow for public derivation of the same HD node derived by "privateDerivationPath" beginning from the HD public key derived at "hdPublicKeyDerivationPath".' + 'The "privateDerivationPath" property of HdKey "v" is "m/2\'/i", but the implied private derivation path of "hdPublicKeyDerivationPath" and "publicDerivationPath" is "m/1\'/i". The "publicDerivationPath" property must be set to allow for public derivation of the same HD node derived by "privateDerivationPath" beginning from the HD public key derived at "hdPublicKeyDerivationPath".', ); test( @@ -927,7 +923,7 @@ test( scripts: { a: { script: '' } }, supported: ['BCH_SPEC'], version: 0, - } + }, ); test( @@ -970,7 +966,7 @@ test( scripts: { a: { script: '' } }, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -983,7 +979,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'All authentication template scenarios must be objects, but the following scenarios are not objects: "a".' + 'All wallet template scenarios must be objects, but the following scenarios are not objects: "a".', ); test.failing( @@ -996,7 +992,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "name" property of scenario "a" must be a string.' + 'If defined, the "name" property of scenario "a" must be a string.', ); test.failing( @@ -1009,7 +1005,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "description" property of scenario "a" must be a string.' + 'If defined, the "description" property of scenario "a" must be a string.', ); test.failing( @@ -1022,7 +1018,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "extends" property of scenario "a" must be a string.' + 'If defined, the "extends" property of scenario "a" must be a string.', ); test.failing( @@ -1035,7 +1031,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, each scenario ID referenced by another scenario\'s "extends" property must exist. Unknown scenario IDs: "c", "d".' + 'If defined, each scenario ID referenced by another scenario\'s "extends" property must exist. Unknown scenario IDs: "c", "d".', ); test.failing( @@ -1048,7 +1044,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "value" property of scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).' + 'If defined, the "value" property of scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).', ); test.failing( @@ -1061,7 +1057,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "value" property of scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).' + 'If defined, the "value" property of scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).', ); test.failing( @@ -1074,7 +1070,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "value" property of scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).' + 'If defined, the "value" property of scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).', ); test( @@ -1097,7 +1093,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1110,7 +1106,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data" property of scenario "a" must be an object.' + 'If defined, the "data" property of scenario "a" must be an object.', ); test( @@ -1129,7 +1125,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1142,7 +1138,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.bytecode" property of scenario "a" must be an object, and each value must be a string.' + 'If defined, the "data.bytecode" property of scenario "a" must be an object, and each value must be a string.', ); test( @@ -1161,7 +1157,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1174,7 +1170,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).' + 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).', ); test.failing( @@ -1187,7 +1183,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).' + 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).', ); test.failing( @@ -1200,7 +1196,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).' + 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).', ); test.failing( @@ -1213,7 +1209,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).' + 'If defined, the "currentBlockHeight" property of scenario "a" must be a positive integer from 0 to 499,999,999 (inclusive).', ); test( @@ -1232,7 +1228,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1245,7 +1241,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "currentBlockTime" property of scenario "a" must be a positive integer from 500,000,000 to 4,294,967,295 (inclusive).' + 'If defined, the "currentBlockTime" property of scenario "a" must be a positive integer from 500,000,000 to 4,294,967,295 (inclusive).', ); test( @@ -1264,7 +1260,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1277,7 +1273,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys" property of scenario "a" must be an object.' + 'If defined, the "data.hdKeys" property of scenario "a" must be an object.', ); test.failing( @@ -1290,7 +1286,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).' + 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).', ); test.failing( @@ -1303,7 +1299,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).' + 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).', ); test.failing( @@ -1316,7 +1312,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).' + 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).', ); test.failing( @@ -1329,7 +1325,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).' + 'If defined, the "data.hdKeys.addressIndex" property of scenario "a" must be a positive integer between 0 and 2,147,483,648 (inclusive).', ); test.failing( @@ -1342,7 +1338,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys.hdPublicKeys" property of scenario "a" must be an object, and each value must be a string.' + 'If defined, the "data.hdKeys.hdPublicKeys" property of scenario "a" must be an object, and each value must be a string.', ); test.failing( @@ -1355,7 +1351,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys.hdPublicKeys" property of scenario "a" must be an object, and each value must be a string.' + 'If defined, the "data.hdKeys.hdPublicKeys" property of scenario "a" must be an object, and each value must be a string.', ); test.failing( @@ -1368,7 +1364,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys.hdPrivateKeys" property of scenario "a" must be an object, and each value must be a string.' + 'If defined, the "data.hdKeys.hdPrivateKeys" property of scenario "a" must be an object, and each value must be a string.', ); test.failing( @@ -1381,7 +1377,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.hdKeys.hdPrivateKeys" property of scenario "a" must be an object, and each value must be a string.' + 'If defined, the "data.hdKeys.hdPrivateKeys" property of scenario "a" must be an object, and each value must be a string.', ); test( @@ -1426,7 +1422,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1439,7 +1435,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.keys" property of scenario "a" must be an object.' + 'If defined, the "data.keys" property of scenario "a" must be an object.', ); test( @@ -1458,7 +1454,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1471,7 +1467,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.keys.privateKeys" property of scenario "a" must be an object, and each value must be a 32-byte, hexadecimal-encoded private key.' + 'If defined, the "data.keys.privateKeys" property of scenario "a" must be an object, and each value must be a 32-byte, hexadecimal-encoded private key.', ); test.failing( @@ -1484,7 +1480,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "data.keys.privateKeys" property of scenario "a" must be an object, and each value must be a 32-byte, hexadecimal-encoded private key.' + 'If defined, the "data.keys.privateKeys" property of scenario "a" must be an object, and each value must be a 32-byte, hexadecimal-encoded private key.', ); test( @@ -1523,7 +1519,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1536,7 +1532,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "transaction" property of scenario "a" must be an object.' + 'If defined, the "transaction" property of scenario "a" must be an object.', ); test( @@ -1555,7 +1551,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1568,7 +1564,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "locktime" property of scenario "a" must be an integer between 0 and 4,294,967,295 (inclusive).' + 'If defined, the "locktime" property of scenario "a" must be an integer between 0 and 4,294,967,295 (inclusive).', ); test( @@ -1587,7 +1583,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1600,7 +1596,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "version" property of scenario "a" must be an integer between 0 and 4,294,967,295 (inclusive).' + 'If defined, the "version" property of scenario "a" must be an integer between 0 and 4,294,967,295 (inclusive).', ); test( @@ -1619,7 +1615,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1632,7 +1628,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "transaction.inputs" array of scenario "a" must have exactly one input under test (an "unlockingBytecode" set to "null").' + 'If defined, the "transaction.inputs" array of scenario "a" must have exactly one input under test (an "unlockingBytecode" set to "null").', ); test.failing( @@ -1648,7 +1644,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "transaction.inputs" property of scenario "a" must be an array of scenario input objects.' + 'If defined, the "transaction.inputs" property of scenario "a" must be an array of scenario input objects.', ); test.failing( @@ -1667,7 +1663,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "outpointIndex" property of input 0 in scenario "a" must be a positive integer.' + 'If defined, the "outpointIndex" property of input 0 in scenario "a" must be a positive integer.', ); test.failing( @@ -1686,7 +1682,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "outpointTransactionHash" property of input 0 in scenario "a" must be a 32-byte, hexadecimal-encoded hash (string).' + 'If defined, the "outpointTransactionHash" property of input 0 in scenario "a" must be a 32-byte, hexadecimal-encoded hash (string).', ); test.failing( @@ -1707,7 +1703,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "outpointTransactionHash" property of input 0 in scenario "a" must be a 32-byte, hexadecimal-encoded hash (string).' + 'If defined, the "outpointTransactionHash" property of input 0 in scenario "a" must be a 32-byte, hexadecimal-encoded hash (string).', ); test.failing( @@ -1726,7 +1722,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "sequenceNumber" property of input 0 in scenario "a" must be a number between 0 and 4294967295 (inclusive).' + 'If defined, the "sequenceNumber" property of input 0 in scenario "a" must be a number between 0 and 4294967295 (inclusive).', ); test.failing( @@ -1745,7 +1741,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "unlockingBytecode" property of input 0 in scenario "a" must be either a null value or a hexadecimal-encoded string.' + 'If defined, the "unlockingBytecode" property of input 0 in scenario "a" must be either a null value or a hexadecimal-encoded string.', ); test( @@ -1794,7 +1790,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1813,7 +1809,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "transaction.outputs" property of scenario "a" must be have at least one output.' + 'If defined, the "transaction.outputs" property of scenario "a" must be have at least one output.', ); test.failing( @@ -1829,7 +1825,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "transaction.outputs" property of scenario "a" must be an array of scenario output objects.' + 'If defined, the "transaction.outputs" property of scenario "a" must be an array of scenario output objects.', ); test.failing( @@ -1848,7 +1844,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "lockingBytecode" property of output 0 in scenario "a" must be a string or an object.' + 'If defined, the "lockingBytecode" property of output 0 in scenario "a" must be a string or an object.', ); test.failing( @@ -1867,7 +1863,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If the "lockingBytecode" property of output 0 in scenario "a" is a string, it must be a valid, hexadecimal-encoded locking bytecode.' + 'If the "lockingBytecode" property of output 0 in scenario "a" is a string, it must be a valid, hexadecimal-encoded locking bytecode.', ); test.failing( @@ -1886,7 +1882,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "script" property of output 0 in scenario "a" must be a hexadecimal-encoded string or "null".' + 'If defined, the "script" property of output 0 in scenario "a" must be a hexadecimal-encoded string or "null".', ); test.failing( @@ -1905,7 +1901,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "overrides" property of output 0 in scenario "a" must be an object.' + 'If defined, the "overrides" property of output 0 in scenario "a" must be an object.', ); test.failing( @@ -1924,7 +1920,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'If defined, the "valueSatoshis" property of output 0 in scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).' + 'If defined, the "valueSatoshis" property of output 0 in scenario "a" must be either a number or a little-endian, unsigned 64-bit integer as a hexadecimal-encoded string (16 characters).', ); test( @@ -1983,7 +1979,7 @@ test( scripts: {}, supported: ['BCH_SPEC'], version: 0, - } + }, ); test.failing( @@ -1995,7 +1991,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'Built-in identifiers may not be re-used by any entity, variable, script, or scenario. The following built-in identifiers are re-used: "current_block_height", "signing_serialization".' + 'Built-in identifiers may not be re-used by any entity, variable, script, or scenario. The following built-in identifiers are re-used: "current_block_height", "signing_serialization".', ); test.failing( @@ -2008,7 +2004,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'The ID of each entity, variable, script, and scenario in an authentication template must be unique. The following IDs are re-used: "b", "d".' + 'The ID of each entity, variable, script, and scenario in a wallet template must be unique. The following IDs are re-used: "b", "d".', ); test.failing( @@ -2020,7 +2016,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'Only known scripts may be assigned to entities. The following script IDs are not provided in this template: "b", "c".' + 'Only known scripts may be assigned to entities. The following script IDs are not provided in this template: "b", "c".', ); test.failing( @@ -2054,7 +2050,7 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'Only known scenarios may be referenced by scripts. The following scenario IDs are not provided in this template: "s1", "s2", "s3", "s4", "s5", "s6", "s7".' + 'Only known scenarios may be referenced by scripts. The following scenario IDs are not provided in this template: "s1", "s2", "s3", "s4", "s5", "s6", "s7".', ); test.failing( @@ -2093,5 +2089,5 @@ test.failing( supported: ['BCH_SPEC'], version: 0, }, - 'Only known entities may be referenced by hdKeys properties within scenarios. The following entity IDs are not provided in this template: "c", "d", "e", "f".' + 'Only known entities may be referenced by hdKeys properties within scenarios. The following entity IDs are not provided in this template: "c", "d", "e", "f".', ); diff --git a/src/lib/schema/authentication-template.ts b/src/lib/schema/wallet-template.ts similarity index 59% rename from src/lib/schema/authentication-template.ts rename to src/lib/schema/wallet-template.ts index 5b17becb..3dff5715 100644 --- a/src/lib/schema/authentication-template.ts +++ b/src/lib/schema/wallet-template.ts @@ -1,12 +1,12 @@ -import type { AuthenticationTemplate } from '../lib.js'; +import type { WalletTemplate } from '../lib.js'; import { ajvStandaloneJsonParse } from './ajv/ajv-utils.js'; // eslint-disable-next-line import/no-internal-modules -import AuthenticationTemplateValidator from './ajv/validate-authentication-template.js'; +import walletTemplateValidator from './ajv/validate-wallet-template.js'; /** - * Safely parse and validate an authentication template, returning either an - * error message as a string or a valid {@link AuthenticationTemplate}. The + * Safely parse and validate a wallet template, returning either an + * error message as a string or a valid {@link WalletTemplate}. The * template may be provided either as an untrusted JSON string or as a * pre-parsed object. * @@ -19,19 +19,19 @@ import AuthenticationTemplateValidator from './ajv/validate-authentication-templ * - The derivation paths of each HdKey are validated against each other. * * This method does not validate the CashAssembly contents of scripts (by - * attempting compilation, evaluating {@link AuthenticationTemplateScriptTest}s, + * attempting compilation, evaluating {@link WalletTemplateScriptTest}s, * or testing scenario generation). * - * @param untrustedJsonOrObject - the JSON string or object to validate as an - * authentication template + * @param untrustedJsonOrObject - the JSON string or object to validate as a + * wallet template */ -export const importAuthenticationTemplate = ( - untrustedJsonOrObject: unknown -): AuthenticationTemplate | string => { - const errorPrefix = `Authentication template import failed:`; - const template = ajvStandaloneJsonParse( +export const importWalletTemplate = ( + untrustedJsonOrObject: unknown, +): WalletTemplate | string => { + const errorPrefix = `Wallet template import failed:`; + const template = ajvStandaloneJsonParse( untrustedJsonOrObject, - AuthenticationTemplateValidator + walletTemplateValidator, ); if (typeof template === 'string') { return `${errorPrefix}${template}`; diff --git a/src/lib/transaction/estimate-transaction.ts b/src/lib/transaction/estimate-transaction.ts index 1918680b..4ee05d0c 100644 --- a/src/lib/transaction/estimate-transaction.ts +++ b/src/lib/transaction/estimate-transaction.ts @@ -35,10 +35,11 @@ export const estimateTransaction = < unknown, AnyCompilerConfiguration, unknown - > + >, + ProgramState, >( - template: Readonly> -): TransactionGenerationAttempt => + template: TransactionTemplateEstimated, +): TransactionGenerationAttempt => // TODO: estimateTransaction typeof template === 'object' ? { completions: [], errors: [], stage: 'inputs', success: false } diff --git a/src/lib/transaction/fixtures/generate-templates.spec.helper.ts b/src/lib/transaction/fixtures/generate-templates.spec.helper.ts index d458d5ea..def8d741 100644 --- a/src/lib/transaction/fixtures/generate-templates.spec.helper.ts +++ b/src/lib/transaction/fixtures/generate-templates.spec.helper.ts @@ -1,16 +1,16 @@ -/* eslint-disable no-console, functional/no-expression-statement */ -import { authenticationTemplateP2pkh, stringify } from '../../lib.js'; +/* eslint-disable no-console, functional/no-expression-statements */ +import { stringify, walletTemplateP2pkh } from '../../lib.js'; import { twoOfTwoRecoverable } from './template.2-of-2-recoverable.spec.helper.js'; import { twoOfThree } from './template.2-of-3.spec.helper.js'; -import { cashChannels } from './template.cash-channels.spec.helper.js'; +import { cashChannels } from './template.cash-channels-v1.spec.helper.js'; import { sigOfSig } from './template.sig-of-sig.spec.helper.js'; // eslint-disable-next-line complexity, functional/no-return-void const printTemplate = (template: string) => { switch (template) { case 'p2pkh': - console.log(stringify(authenticationTemplateP2pkh)); + console.log(stringify(walletTemplateP2pkh)); return; case '2-of-3': console.log(stringify(twoOfThree)); @@ -21,7 +21,7 @@ const printTemplate = (template: string) => { case 'sig-of-sig': console.log(stringify(sigOfSig)); return; - case 'cash-channels': + case 'cash-channels-v1': console.log(stringify(cashChannels)); return; diff --git a/src/lib/transaction/fixtures/template.2-of-2-recoverable.spec.helper.ts b/src/lib/transaction/fixtures/template.2-of-2-recoverable.spec.helper.ts index fba3f7c3..3186860e 100644 --- a/src/lib/transaction/fixtures/template.2-of-2-recoverable.spec.helper.ts +++ b/src/lib/transaction/fixtures/template.2-of-2-recoverable.spec.helper.ts @@ -1,12 +1,12 @@ /* eslint-disable camelcase, @typescript-eslint/naming-convention */ -import type { AuthenticationTemplate } from '../../lib.js'; +import type { WalletTemplate } from '../../lib.js'; import { CompilerDefaults } from '../../lib.js'; const secondsIn30Days = 2592000; -export const twoOfTwoRecoverable: AuthenticationTemplate = { +export const twoOfTwoRecoverable: WalletTemplate = { ...{ name: '2-of-2 Recoverable Vault' }, - $schema: 'https://bitauth.com/schemas/authentication-template-v0.schema.json', + $schema: 'https://libauth.org/schemas/wallet-template-v0.schema.json', description: 'A 2-of-2 wallet, which after a specified delay, can be recovered by either of the original two keys and a signature from a trusted user (e.g. an attorney).\n\nIn this implementation, all wallet addresses become recoverable at the same time. To "bump" the recovery time to a later date, create a new wallet and transfer the funds.\n\nThis scheme is described in more detail in BIP-65.', entities: { diff --git a/src/lib/transaction/fixtures/template.2-of-3.spec.helper.ts b/src/lib/transaction/fixtures/template.2-of-3.spec.helper.ts index 5eca05d2..0e5148f1 100644 --- a/src/lib/transaction/fixtures/template.2-of-3.spec.helper.ts +++ b/src/lib/transaction/fixtures/template.2-of-3.spec.helper.ts @@ -1,14 +1,11 @@ /* eslint-disable camelcase, @typescript-eslint/naming-convention */ -import type { - AuthenticationTemplate, - AuthenticationTemplateEntity, -} from '../../lib.js'; +import type { WalletTemplate, WalletTemplateEntity } from '../../lib.js'; const createSigner = ( name: string, signerIndex: string, - scripts: string[] -): AuthenticationTemplateEntity => ({ + scripts: string[], +): WalletTemplateEntity => ({ name, scripts: ['lock', ...scripts], variables: { [`key${signerIndex}`]: { type: 'HdKey' } }, @@ -18,9 +15,9 @@ const createSigner = ( * 2-of-3 P2SH * This is a mostly-hard-coded 2-of-3 example. A more general function could be written to generate m-of-n wallets */ -export const twoOfThree: AuthenticationTemplate = { +export const twoOfThree: WalletTemplate = { ...{ name: '2-of-3 Multisig' }, - $schema: 'https://bitauth.com/schemas/authentication-template-v0.schema.json', + $schema: 'https://libauth.org/schemas/wallet-template-v0.schema.json', entities: { signer_1: createSigner('Signer 1', '1', ['1_and_2', '1_and_3']), signer_2: createSigner('Signer 2', '2', ['1_and_2', '2_and_3']), diff --git a/src/lib/transaction/fixtures/template.cash-channels.spec.helper.ts b/src/lib/transaction/fixtures/template.cash-channels-v1.spec.helper.ts similarity index 94% rename from src/lib/transaction/fixtures/template.cash-channels.spec.helper.ts rename to src/lib/transaction/fixtures/template.cash-channels-v1.spec.helper.ts index 187acc5a..60702532 100644 --- a/src/lib/transaction/fixtures/template.cash-channels.spec.helper.ts +++ b/src/lib/transaction/fixtures/template.cash-channels-v1.spec.helper.ts @@ -1,8 +1,8 @@ /* eslint-disable camelcase, @typescript-eslint/naming-convention */ -import type { AuthenticationTemplate } from '../../lib.js'; +import type { WalletTemplate } from '../../lib.js'; -export const cashChannels: AuthenticationTemplate = { - $schema: 'https://bitauth.com/schemas/authentication-template-v0.schema.json', +export const cashChannels: WalletTemplate = { + $schema: 'https://libauth.org/schemas/wallet-template-v0.schema.json', description: '**Noncustodial, Privacy-Preserving, Flexibly-Denominated, Recurring Payments for Bitcoin Cash**\n\nA single-key channel that allows the owner to preauthorize any number of future payments to a receiver.\n\nEach authorization specifies a payment value, payment time, channel and payment identification information, and maximum satoshi value. When the payment time for an authorization is reached, the receiver can create a single transaction to withdraw the authorized amount to their own wallet, sending the change back to the channel. Beyond initially signing authorizations, the owner does not need to participate in executing authorized payments.\n\nThe channel does not need to hold a balance to preauthorize transactions – much like a debit account, the owner only needs to ensure that the wallet contains adequate funds to satisfy upcoming payments.\n\nChannel payments can be denominated in any asset. If the channel is denominated in an asset other than BCH, the precise payment amount is determined by a Rate Oracle, an entity partially-trusted with determining the current value of the denominating asset. (If the value of the denominating asset rises dramatically in terms of BCH, the Owner must sign a new authorization with a larger maximum authorized satoshi value.)\n \nThis wallet is entirely noncustodial: at any time, the owner can withdraw their funds to end the arrangement.\n\nIn normal use, the owner should create a unique channel for each Receiver. This provides better privacy (receivers can not determine the payment amounts or frequency of payments to other receivers) and better security (misbehaving receivers can not disrupt upcoming payments to other receivers).\n\nImplementation note: a single authorization can be used to withdraw from any channel UTXO. In most cases, authorizations are meant to be used only once, so wallets should never hold more than one unspent UTXO per channel. To β€œtop up” the wallet, the existing UTXO should be spent back to itself, adding funds as necessary.', entities: { @@ -29,14 +29,10 @@ export const cashChannels: AuthenticationTemplate = { name: 'Maximum Authorized Satoshis', type: 'AddressData', }, - owner: { - description: '', - name: "Owner's Key", - type: 'Key', - }, + owner: { description: '', name: "Owner's Key", type: 'Key' }, payment_number: { description: - 'The sequence number of this payment, used as an identifier for an authorization. Authorizations must be used in order, and this number should be incremented by one for each authorization signed.\n\nEncoded as a VM Number between 0 and 65534, e.g. `42`.', + 'The sequence number of this payment, used as an identifier for an authorization. Authorizations must be used in order, and this number should be incremented by one for each authorization signed.\n\nEncoded as a VM Number between 0 and 32767, e.g. `42`.', name: 'Payment Number', type: 'AddressData', }, @@ -85,9 +81,7 @@ export const cashChannels: AuthenticationTemplate = { description: 'An example of successful payment authorization execution.', extends: 'before_payment_time', name: '$10.00 USD – After Payment Time', - transaction: { - locktime: 1580515200, - }, + transaction: { locktime: 1580515200 }, }, before_payment_time: { data: { @@ -99,26 +93,20 @@ export const cashChannels: AuthenticationTemplate = { payment_satoshis: '10000', payment_time: '1580515200', }, - hdKeys: { - addressIndex: 0, - }, + hdKeys: { addressIndex: 0 }, }, description: 'An example attempting to execute a payment authorization before the payment time authorized by the owner. The authorization is for "1000" in asset "USD" (described in cents, so $10.00 USD), and it authorizes a payment of a maximum of 10500 satoshis. The hypothetical UTXO being spent has a value of 20000 satoshis.', name: '$10.00 USD – Before Payment Time', - sourceOutputs: [{ valueSatoshis: 20000 }], + sourceOutputs: [{ lockingBytecode: ['slot'], valueSatoshis: 20000 }], transaction: { locktime: 1577836800, outputs: [ { lockingBytecode: { overrides: { - bytecode: { - payment_number: '3', - }, - hdKeys: { - addressIndex: 0, - }, + bytecode: { payment_number: '3' }, + hdKeys: { addressIndex: 0 }, }, }, valueSatoshis: 10000, @@ -127,11 +115,7 @@ export const cashChannels: AuthenticationTemplate = { }, }, exceeds_maximum_payment_number: { - data: { - bytecode: { - payment_number: '65536', - }, - }, + data: { bytecode: { payment_number: '32768' } }, description: 'An example scenario where the payment number exceeds the maximum uint16 value.', name: 'Payment Number Exceeds Maximum', @@ -141,13 +125,7 @@ export const cashChannels: AuthenticationTemplate = { "A scenario for testing all bytecode values. Because this scenario doesn't require compiling the script under test for its outputs, errors are a little easier to debug.", extends: 'after_payment_time', name: 'Test Bytecode Values', - transaction: { - outputs: [ - { - lockingBytecode: '', - }, - ], - }, + transaction: { outputs: [{ lockingBytecode: '' }] }, }, }, scripts: { @@ -243,12 +221,13 @@ export const cashChannels: AuthenticationTemplate = { name: 'Payment Number Padded', pushed: true, script: - '$(\n \n OP_DUP <65534> OP_LESSTHANOREQUAL OP_VERIFY\n <2> OP_NUM2BIN\n)\n\n\n<1>', + '$(\n \n OP_DUP <0> OP_GREATERTHAN OP_VERIFY OP_DUP <0xff7f> OP_LESSTHANOREQUAL OP_VERIFY\n <2> OP_NUM2BIN\n)', tests: { - requires_uint16: { - check: '<0x0200>\nOP_EQUAL', - fails: ['exceeds_maximum_payment_number'], - name: 'Requires Uint16', + is_2_bytes: { + check: + 'OP_SIZE <2> OP_EQUALVERIFY\nOP_BIN2NUM \nOP_EQUAL', + invalid: ['exceeds_maximum_payment_number'], + name: 'Is 2 Bytes', passes: ['before_payment_time'], }, }, diff --git a/src/lib/transaction/fixtures/template.sig-of-sig.spec.helper.ts b/src/lib/transaction/fixtures/template.sig-of-sig.spec.helper.ts index 454ded9e..29b16628 100644 --- a/src/lib/transaction/fixtures/template.sig-of-sig.spec.helper.ts +++ b/src/lib/transaction/fixtures/template.sig-of-sig.spec.helper.ts @@ -1,7 +1,7 @@ /* eslint-disable camelcase, @typescript-eslint/naming-convention */ -import type { AuthenticationTemplate } from '../../lib.js'; +import type { WalletTemplate } from '../../lib.js'; -export const sigOfSig: AuthenticationTemplate = { +export const sigOfSig: WalletTemplate = { ...{ name: 'Sig-of-Sig Vault (2-of-2)', }, diff --git a/src/lib/transaction/fixtures/templates/2-of-2-recoverable.json b/src/lib/transaction/fixtures/templates/2-of-2-recoverable.json index a6e1d2b9..7def2f6d 100644 --- a/src/lib/transaction/fixtures/templates/2-of-2-recoverable.json +++ b/src/lib/transaction/fixtures/templates/2-of-2-recoverable.json @@ -1,6 +1,6 @@ { "name": "2-of-2 Recoverable Vault", - "$schema": "https://bitauth.com/schemas/authentication-template-v0.schema.json", + "$schema": "https://libauth.org/schemas/wallet-template-v0.schema.json", "description": "A 2-of-2 wallet, which after a specified delay, can be recovered by either of the original two keys and a signature from a trusted user (e.g. an attorney).\n\nIn this implementation, all wallet addresses become recoverable at the same time. To \"bump\" the recovery time to a later date, create a new wallet and transfer the funds.\n\nThis scheme is described in more detail in BIP-65.", "entities": { "signer_1": { diff --git a/src/lib/transaction/fixtures/templates/2-of-3.json b/src/lib/transaction/fixtures/templates/2-of-3.json index 02421097..bcdddc2b 100644 --- a/src/lib/transaction/fixtures/templates/2-of-3.json +++ b/src/lib/transaction/fixtures/templates/2-of-3.json @@ -1,6 +1,6 @@ { "name": "2-of-3 Multisig", - "$schema": "https://bitauth.com/schemas/authentication-template-v0.schema.json", + "$schema": "https://libauth.org/schemas/wallet-template-v0.schema.json", "entities": { "signer_1": { "name": "Signer 1", diff --git a/src/lib/transaction/fixtures/templates/cash-channels.json b/src/lib/transaction/fixtures/templates/cash-channels-v1.json similarity index 97% rename from src/lib/transaction/fixtures/templates/cash-channels.json rename to src/lib/transaction/fixtures/templates/cash-channels-v1.json index 3f70c9c7..567e4c19 100644 --- a/src/lib/transaction/fixtures/templates/cash-channels.json +++ b/src/lib/transaction/fixtures/templates/cash-channels-v1.json @@ -1,5 +1,5 @@ { - "$schema": "https://bitauth.com/schemas/authentication-template-v0.schema.json", + "$schema": "https://libauth.org/schemas/wallet-template-v0.schema.json", "description": "**Noncustodial, Privacy-Preserving, Flexibly-Denominated, Recurring Payments for Bitcoin Cash**\n\nA single-key channel that allows the owner to preauthorize any number of future payments to a receiver.\n\nEach authorization specifies a payment value, payment time, channel and payment identification information, and maximum satoshi value. When the payment time for an authorization is reached, the receiver can create a single transaction to withdraw the authorized amount to their own wallet, sending the change back to the channel. Beyond initially signing authorizations, the owner does not need to participate in executing authorized payments.\n\nThe channel does not need to hold a balance to preauthorize transactions – much like a debit account, the owner only needs to ensure that the wallet contains adequate funds to satisfy upcoming payments.\n\nChannel payments can be denominated in any asset. If the channel is denominated in an asset other than BCH, the precise payment amount is determined by a Rate Oracle, an entity partially-trusted with determining the current value of the denominating asset. (If the value of the denominating asset rises dramatically in terms of BCH, the Owner must sign a new authorization with a larger maximum authorized satoshi value.)\n \nThis wallet is entirely noncustodial: at any time, the owner can withdraw their funds to end the arrangement.\n\nIn normal use, the owner should create a unique channel for each Receiver. This provides better privacy (receivers can not determine the payment amounts or frequency of payments to other receivers) and better security (misbehaving receivers can not disrupt upcoming payments to other receivers).\n\nImplementation note: a single authorization can be used to withdraw from any channel UTXO. In most cases, authorizations are meant to be used only once, so wallets should never hold more than one unspent UTXO per channel. To β€œtop up” the wallet, the existing UTXO should be spent back to itself, adding funds as necessary.", "entities": { "owner_entity": { @@ -27,7 +27,7 @@ "type": "Key" }, "payment_number": { - "description": "The sequence number of this payment, used as an identifier for an authorization. Authorizations must be used in order, and this number should be incremented by one for each authorization signed.\n\nEncoded as a VM Number between 0 and 65534, e.g. `42`.", + "description": "The sequence number of this payment, used as an identifier for an authorization. Authorizations must be used in order, and this number should be incremented by one for each authorization signed.\n\nEncoded as a VM Number between 0 and 32767, e.g. `42`.", "name": "Payment Number", "type": "AddressData" }, @@ -94,6 +94,7 @@ "name": "$10.00 USD – Before Payment Time", "sourceOutputs": [ { + "lockingBytecode": ["slot"], "valueSatoshis": 20000 } ], @@ -119,7 +120,7 @@ "exceeds_maximum_payment_number": { "data": { "bytecode": { - "payment_number": "65536" + "payment_number": "32768" } }, "description": "An example scenario where the payment number exceeds the maximum uint16 value.", @@ -218,12 +219,12 @@ "payment_number_padded": { "name": "Payment Number Padded", "pushed": true, - "script": "$(\n \n OP_DUP <65534> OP_LESSTHANOREQUAL OP_VERIFY\n <2> OP_NUM2BIN\n)\n\n\n<1>", + "script": "$(\n \n OP_DUP <0> OP_GREATERTHAN OP_VERIFY OP_DUP <0xff7f> OP_LESSTHANOREQUAL OP_VERIFY\n <2> OP_NUM2BIN\n)", "tests": { - "requires_uint16": { - "check": "<0x0200>\nOP_EQUAL", - "fails": ["exceeds_maximum_payment_number"], - "name": "Requires Uint16", + "is_2_bytes": { + "check": "OP_SIZE <2> OP_EQUALVERIFY\nOP_BIN2NUM \nOP_EQUAL", + "invalid": ["exceeds_maximum_payment_number"], + "name": "Is 2 Bytes", "passes": ["before_payment_time"] } } diff --git a/src/lib/transaction/fixtures/templates/p2pkh.json b/src/lib/transaction/fixtures/templates/p2pkh.json index 0889ee5c..405e56cd 100644 --- a/src/lib/transaction/fixtures/templates/p2pkh.json +++ b/src/lib/transaction/fixtures/templates/p2pkh.json @@ -1,6 +1,6 @@ { - "$schema": "https://bitauth.com/schemas/authentication-template-v0.schema.json", - "description": "A standard single-factor authentication template that uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions. Because the template uses a Hierarchical Deterministic (HD) key, it also supports watch-only clients.", + "$schema": "https://libauth.org/schemas/wallet-template-v0.schema.json", + "description": "A standard single-factor wallet template that uses Pay-to-Public-Key-Hash (P2PKH), the most common authentication scheme in use on the network.\n\nThis P2PKH template uses BCH Schnorr signatures, reducing the size of transactions. Because the template uses a Hierarchical Deterministic (HD) key, it also supports watch-only clients.", "entities": { "owner": { "description": "The individual who can spend from this wallet.", diff --git a/src/lib/transaction/generate-transaction.spec.ts b/src/lib/transaction/generate-transaction.spec.ts index f88fc8d4..aa6ea7f4 100644 --- a/src/lib/transaction/generate-transaction.spec.ts +++ b/src/lib/transaction/generate-transaction.spec.ts @@ -2,13 +2,13 @@ import test from 'ava'; import { privkey } from '../compiler/compiler-bch/compiler-bch.e2e.spec.helper.js'; import { - authenticationTemplateToCompilerBCH, CashAddressNetworkPrefix, decodeTransaction, generateTransaction, hexToBin, - importAuthenticationTemplate, + importWalletTemplate, lockingBytecodeToCashAddress, + walletTemplateToCompilerBCH, } from '../lib.js'; const maybeP2pkhTemplate: unknown = { @@ -46,14 +46,14 @@ const maybeP2pkhTemplate: unknown = { }; test('createCompilerBCH: generateTransaction', (t) => { - const p2pkhTemplate = importAuthenticationTemplate(maybeP2pkhTemplate); + const p2pkhTemplate = importWalletTemplate(maybeP2pkhTemplate); if (typeof p2pkhTemplate === 'string') { t.fail(p2pkhTemplate); return; } - const p2pkh = authenticationTemplateToCompilerBCH(p2pkhTemplate); + const p2pkh = walletTemplateToCompilerBCH(p2pkhTemplate); const lockingBytecode = p2pkh.generateBytecode({ data: { keys: { privateKeys: { owner: privkey } } }, scriptId: 'lock', @@ -68,13 +68,13 @@ test('createCompilerBCH: generateTransaction', (t) => { t.deepEqual( lockingBytecodeToCashAddress( lockingBytecode.bytecode, - CashAddressNetworkPrefix.testnet + CashAddressNetworkPrefix.testnet, ), - 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' + 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x', ); const utxoOutpointTransactionHash = hexToBin( - '68127de83d2ab77d7f5fd8d2ac6181d94473c0cbb2d0776084bf28884f6ecd77' + '68127de83d2ab77d7f5fd8d2ac6181d94473c0cbb2d0776084bf28884f6ecd77', ); const valueSatoshis = 1000000; @@ -117,8 +117,8 @@ test('createCompilerBCH: generateTransaction', (t) => { success: true, transaction: decodeTransaction( hexToBin( - '020000000177cd6e4f8828bf846077d0b2cbc07344d98161acd2d85f7f7db72a3de87d1268010000006441f87a1dc0fb4a30443fdfcc678e713d99cffb963bd52b497377e81abe2cc2b5ac6e9837fab0a23f4d05fd06b80e7673a68bfa8d2f66b7ec5537e88696d7bae1b841210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) + '020000000177cd6e4f8828bf846077d0b2cbc07344d98161acd2d85f7f7db72a3de87d1268010000006441f87a1dc0fb4a30443fdfcc678e713d99cffb963bd52b497377e81abe2cc2b5ac6e9837fab0a23f4d05fd06b80e7673a68bfa8d2f66b7ec5537e88696d7bae1b841210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000', + ), ), }); }); diff --git a/src/lib/transaction/generate-transaction.ts b/src/lib/transaction/generate-transaction.ts index 80bfe59b..736f2efb 100644 --- a/src/lib/transaction/generate-transaction.ts +++ b/src/lib/transaction/generate-transaction.ts @@ -26,7 +26,7 @@ import type { } from '../lib.js'; const returnFailedCompilationDirective = < - Type extends 'locking' | 'unlocking' + Type extends 'locking' | 'unlocking', >({ index, result, @@ -36,7 +36,7 @@ const returnFailedCompilationDirective = < result: | CompilationResultParseError | CompilationResultReduceError - | CompilationResultResolveError; + | CompilationResultResolveError; type: Type; }) => ({ errors: result.errors.map((error) => ({ @@ -54,17 +54,18 @@ export const compileOutputTemplate = < unknown, AnyCompilerConfiguration, unknown - > + >, + ProgramState, >({ outputTemplate, index, }: { outputTemplate: OutputTemplate; index: number; -}): BytecodeGenerationErrorLocking | Output => { +}): BytecodeGenerationErrorLocking | Output => { if ('script' in outputTemplate.lockingBytecode) { const directive = outputTemplate.lockingBytecode; - const data = directive.data === undefined ? {} : directive.data; + const data = directive.data ?? {}; const result = directive.compiler.generateBytecode({ data, debug: true, @@ -95,7 +96,8 @@ export const compileInputTemplate = < AnyCompilerConfiguration, unknown >, - CompilationContext extends CompilationContextBCH = CompilationContextBCH + ProgramState, + CompilationContext extends CompilationContextBCH = CompilationContextBCH, >({ inputTemplate, index, @@ -105,13 +107,13 @@ export const compileInputTemplate = < inputTemplate: InputTemplate; index: number; outputs: Output[]; - template: Readonly>; -}): BytecodeGenerationErrorUnlocking | Input => { + template: TransactionTemplateFixed; +}): BytecodeGenerationErrorUnlocking | Input => { if ('script' in inputTemplate.unlockingBytecode) { const directive = inputTemplate.unlockingBytecode; // TODO: workaround, replace by migrating to PST format const sourceOutputs = []; - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data sourceOutputs[index] = { lockingBytecode: Uint8Array.of(), ...(inputTemplate.unlockingBytecode.token === undefined @@ -169,31 +171,35 @@ export const compileInputTemplate = < */ export const generateTransaction = < // eslint-disable-next-line @typescript-eslint/no-explicit-any - CompilerType extends Compiler, any> + CompilerType extends Compiler, any>, + ProgramState, >( - template: Readonly> -): TransactionGenerationAttempt => { + template: TransactionTemplateFixed, +): TransactionGenerationAttempt => { const outputResults = template.outputs.map((outputTemplate, index) => compileOutputTemplate({ index, outputTemplate, - }) + }), ); const outputCompilationErrors = outputResults.filter( - (result): result is BytecodeGenerationErrorLocking => 'errors' in result + (result): result is BytecodeGenerationErrorLocking => + 'errors' in result, ); if (outputCompilationErrors.length > 0) { const outputCompletions = outputResults - .map( - (result, index) => - 'lockingBytecode' in result - ? { index, output: result, type: 'output' } - : result + .map< + | BytecodeGenerationCompletionOutput + | BytecodeGenerationErrorLocking + >((result, index) => + 'lockingBytecode' in result + ? { index, output: result, type: 'output' } + : result, ) .filter( (result): result is BytecodeGenerationCompletionOutput => - 'output' in result + 'output' in result, ); return { completions: outputCompletions, @@ -210,24 +216,26 @@ export const generateTransaction = < inputTemplate, outputs, template, - }) + }), ); const inputCompilationErrors = inputResults.filter( - (result): result is BytecodeGenerationErrorUnlocking => 'errors' in result + (result): result is BytecodeGenerationErrorUnlocking => + 'errors' in result, ); if (inputCompilationErrors.length > 0) { const inputCompletions = inputResults .map< - BytecodeGenerationCompletionInput | BytecodeGenerationErrorUnlocking + | BytecodeGenerationCompletionInput + | BytecodeGenerationErrorUnlocking >((result, index) => 'unlockingBytecode' in result ? { index, input: result, type: 'input' } - : result + : result, ) .filter( (result): result is BytecodeGenerationCompletionInput => - 'input' in result + 'input' in result, ); return { completions: inputCompletions, @@ -257,17 +265,19 @@ export const generateTransaction = < * @param transactionGenerationError - a transaction generation attempt where * `success` is `false` */ -export const extractResolvedVariables = ( - transactionGenerationError: TransactionGenerationError +export const extractResolvedVariables = ( + transactionGenerationError: TransactionGenerationError, ) => - (transactionGenerationError.errors as BytecodeGenerationErrorBase[]).reduce<{ + ( + transactionGenerationError.errors as BytecodeGenerationErrorBase[] + ).reduce<{ [fullIdentifier: string]: Uint8Array; }>( (all, error) => error.resolved === undefined ? all : { ...all, ...extractResolvedVariableBytecodeMap(error.resolved) }, - {} + {}, ); /** @@ -284,11 +294,11 @@ export const extractResolvedVariables = ( * @param transactionGenerationError - a transaction generation result where * `success` is `false` */ -export const extractMissingVariables = ( - transactionGenerationError: TransactionGenerationError +export const extractMissingVariables = ( + transactionGenerationError: TransactionGenerationError, ) => { const allErrors = ( - transactionGenerationError.errors as BytecodeGenerationErrorBase[] + transactionGenerationError.errors as BytecodeGenerationErrorBase[] ).reduce((all, error) => [...all, ...error.errors], []); if (!allErrorsAreRecoverable(allErrors)) { @@ -300,7 +310,7 @@ export const extractMissingVariables = ( ...all, [error.missingIdentifier]: error.owningEntity, }), - {} + {}, ); }; @@ -331,13 +341,14 @@ export const extractMissingVariables = ( * The first compilation must use only trusted compilation data */ export const safelyExtendCompilationData = < - CompilationContext = CompilationContextBCH + ProgramState, + CompilationContext = CompilationContextBCH, >( - transactionGenerationError: TransactionGenerationError, + transactionGenerationError: TransactionGenerationError, trustedCompilationData: CompilationData, untrustedResolutions: { [providedByEntityId: string]: ReturnType; - } + }, ): CompilationData | false => { const missing = extractMissingVariables(transactionGenerationError); if (missing === false) return false; diff --git a/src/lib/transaction/transaction-e2e.2-of-2-recoverable.spec.ts b/src/lib/transaction/transaction-e2e.2-of-2-recoverable.spec.ts index 38489342..1b18cdbd 100644 --- a/src/lib/transaction/transaction-e2e.2-of-2-recoverable.spec.ts +++ b/src/lib/transaction/transaction-e2e.2-of-2-recoverable.spec.ts @@ -8,7 +8,6 @@ import type { TransactionCommon, } from '../lib.js'; import { - authenticationTemplateToCompilerBCH, CashAddressNetworkPrefix, compileCashAssembly, createVirtualMachineBCH, @@ -18,9 +17,10 @@ import { extractMissingVariables, generateTransaction, hexToBin, - importAuthenticationTemplate, + importWalletTemplate, lockingBytecodeToCashAddress, stringify, + walletTemplateToCompilerBCH, } from '../lib.js'; import { @@ -37,7 +37,7 @@ const vm = createVirtualMachineBCH(); // eslint-disable-next-line complexity test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { - const template = importAuthenticationTemplate(twoOfTwoRecoverableJson); + const template = importWalletTemplate(twoOfTwoRecoverableJson); if (typeof template === 'string') { t.fail(template); return; @@ -53,12 +53,12 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { }; const creationDate = dateToLocktime( - new Date('2020-01-01T00:00:00.000Z') + new Date('2020-01-01T00:00:00.000Z'), ) as number; const threeMonths = 60 * 60 * 24 * 90; const locktimeFourMonthsLater = dateToLocktime( - new Date('2020-04-01T00:00:00.000Z') + new Date('2020-04-01T00:00:00.000Z'), ) as number; const lockingData: CompilationData = { @@ -70,7 +70,7 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { }; const lockingScript = 'lock'; - const compiler = authenticationTemplateToCompilerBCH(template); + const compiler = walletTemplateToCompilerBCH(template); const lockingBytecode = compiler.generateBytecode({ data: lockingData, scriptId: lockingScript, @@ -84,7 +84,7 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { const address = lockingBytecodeToCashAddress( lockingBytecode.bytecode, - CashAddressNetworkPrefix.testnet + CashAddressNetworkPrefix.testnet, ); t.deepEqual(address, 'bchtest:pz8p649zg3a492hxy86sh0ccvc7sptrlx5cp3eapah'); @@ -106,7 +106,7 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { const input1 = { outpointIndex: 0, outpointTransactionHash: hexToBin( - '6168cbf5d24784df4fef46e1e5cfacaee14cda4c29dd8114b9cfc44972aea46a' + '6168cbf5d24784df4fef46e1e5cfacaee14cda4c29dd8114b9cfc44972aea46a', ), sequenceNumber: 0, unlockingBytecode: { @@ -122,7 +122,7 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { const input2 = { outpointIndex: 1, outpointTransactionHash: hexToBin( - '0ce50e17e71dadd8ba59e89a291cf3082862b32b229c5fbfc8dee3288165d97c' + '0ce50e17e71dadd8ba59e89a291cf3082862b32b229c5fbfc8dee3288165d97c', ), sequenceNumber: 0, unlockingBytecode: { @@ -189,10 +189,10 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { t.deepEqual(signer1Attempt.completions, []); const expectedSigner1SignatureInput1 = hexToBin( - '304402200a34f3387a8aa3d7ed55506fbddb6957e27cc42063410306ac82e7a77f4d7030022065b08d5a07fac82d1cd6c90ff126f1af965e541525676538eab088b99daa897b41' + '304402200a34f3387a8aa3d7ed55506fbddb6957e27cc42063410306ac82e7a77f4d7030022065b08d5a07fac82d1cd6c90ff126f1af965e541525676538eab088b99daa897b41', ); const expectedSigner1SignatureInput2 = hexToBin( - '3044022028141930f622819de84cf1a1b42fc2ea15c56bafd45e768c72fd84b4d0fe5b7e022066f659c79e6d8b6c53561be0b472bbeb355ffa443828fd8fb083148ffd26e8c841' + '3044022028141930f622819de84cf1a1b42fc2ea15c56bafd45e768c72fd84b4d0fe5b7e022066f659c79e6d8b6c53561be0b472bbeb355ffa443828fd8fb083148ffd26e8c841', ); /** @@ -288,13 +288,13 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { input: { ...input1, unlockingBytecode: hexToBin( - '0047304402200a34f3387a8aa3d7ed55506fbddb6957e27cc42063410306ac82e7a77f4d7030022065b08d5a07fac82d1cd6c90ff126f1af965e541525676538eab088b99daa897b4147304402207d987a4d736fb6abb5f90109da05411e515c212c3b2c8527d15e8d863fe83957022004ad83f50e7b1ae87665c211717caca4b9e9714cd2d27bc4759cf6482394c9f641004c7563040088825eb1752103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7dead51675268210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b846954552ae' + '0047304402200a34f3387a8aa3d7ed55506fbddb6957e27cc42063410306ac82e7a77f4d7030022065b08d5a07fac82d1cd6c90ff126f1af965e541525676538eab088b99daa897b4147304402207d987a4d736fb6abb5f90109da05411e515c212c3b2c8527d15e8d863fe83957022004ad83f50e7b1ae87665c211717caca4b9e9714cd2d27bc4759cf6482394c9f641004c7563040088825eb1752103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7dead51675268210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b846954552ae', ), }, type: 'input', }, ], - stringify(signer2Attempt2.completions) + stringify(signer2Attempt2.completions), ); const completedInput1 = ( @@ -377,12 +377,12 @@ test('transaction e2e tests: 2-of-2 Recoverable Vault', (t) => { * tx: e6c808adcb3cfc06461e962373659554bf6c447ea7b25ac503ff429e21050755 */ hexToBin( - '02000000026aa4ae7249c4cfb91481dd294cda4ce1aeaccfe5e146ef4fdf8447d2f5cb686100000000fd09010047304402200a34f3387a8aa3d7ed55506fbddb6957e27cc42063410306ac82e7a77f4d7030022065b08d5a07fac82d1cd6c90ff126f1af965e541525676538eab088b99daa897b4147304402207d987a4d736fb6abb5f90109da05411e515c212c3b2c8527d15e8d863fe83957022004ad83f50e7b1ae87665c211717caca4b9e9714cd2d27bc4759cf6482394c9f641004c7563040088825eb1752103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7dead51675268210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b846954552ae000000007cd9658128e3dec8bf5f9c222bb3622808f31c299ae859bad8ad1de7170ee50c01000000fd0a0100473044022028141930f622819de84cf1a1b42fc2ea15c56bafd45e768c72fd84b4d0fe5b7e022066f659c79e6d8b6c53561be0b472bbeb355ffa443828fd8fb083148ffd26e8c841483045022100d62f54380b58b99677467a4016fceffd1cd85adabe6d2ffffab61a7e599dc5d302207a43e7809e5afae5069cef08d5f4960adcb9d245d295bbdf6bb8ab9a9056d11441514c7563040088825eb1752103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7dead51675268210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b846954552ae000000000100000000000000000d6a0b68656c6c6f20776f726c6480d9835e' - ) + '02000000026aa4ae7249c4cfb91481dd294cda4ce1aeaccfe5e146ef4fdf8447d2f5cb686100000000fd09010047304402200a34f3387a8aa3d7ed55506fbddb6957e27cc42063410306ac82e7a77f4d7030022065b08d5a07fac82d1cd6c90ff126f1af965e541525676538eab088b99daa897b4147304402207d987a4d736fb6abb5f90109da05411e515c212c3b2c8527d15e8d863fe83957022004ad83f50e7b1ae87665c211717caca4b9e9714cd2d27bc4759cf6482394c9f641004c7563040088825eb1752103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7dead51675268210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b846954552ae000000007cd9658128e3dec8bf5f9c222bb3622808f31c299ae859bad8ad1de7170ee50c01000000fd0a0100473044022028141930f622819de84cf1a1b42fc2ea15c56bafd45e768c72fd84b4d0fe5b7e022066f659c79e6d8b6c53561be0b472bbeb355ffa443828fd8fb083148ffd26e8c841483045022100d62f54380b58b99677467a4016fceffd1cd85adabe6d2ffffab61a7e599dc5d302207a43e7809e5afae5069cef08d5f4960adcb9d245d295bbdf6bb8ab9a9056d11441514c7563040088825eb1752103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7dead51675268210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b846954552ae000000000100000000000000000d6a0b68656c6c6f20776f726c6480d9835e', + ), ) as TransactionCommon, }, `${stringify(successfulCompilation)} - ${stringify( - encodeTransactionCommon(successfulCompilation.transaction) - )}` + encodeTransactionCommon(successfulCompilation.transaction), + )}`, ); }); diff --git a/src/lib/transaction/transaction-e2e.2-of-3.spec.ts b/src/lib/transaction/transaction-e2e.2-of-3.spec.ts index bc5af85c..c861483e 100644 --- a/src/lib/transaction/transaction-e2e.2-of-3.spec.ts +++ b/src/lib/transaction/transaction-e2e.2-of-3.spec.ts @@ -4,7 +4,6 @@ import test from 'ava'; import type { CompilationData, TransactionCommon } from '../lib.js'; import { - authenticationTemplateToCompilerBCH, CashAddressNetworkPrefix, createVirtualMachineBCH, decodeTransactionCommon, @@ -13,10 +12,11 @@ import { extractResolvedVariables, generateTransaction, hexToBin, - importAuthenticationTemplate, + importWalletTemplate, lockingBytecodeToCashAddress, safelyExtendCompilationData, stringify, + walletTemplateToCompilerBCH, } from '../lib.js'; import { @@ -32,7 +32,7 @@ const vm = createVirtualMachineBCH(); // eslint-disable-next-line complexity test('transaction e2e tests: 2-of-3 multisig', (t) => { - const template = importAuthenticationTemplate(twoOfThreeJson); + const template = importWalletTemplate(twoOfThreeJson); if (typeof template === 'string') { t.fail(template); return; @@ -52,7 +52,7 @@ test('transaction e2e tests: 2-of-3 multisig', (t) => { }; const lockingScript = 'lock'; - const compiler = authenticationTemplateToCompilerBCH(template); + const compiler = walletTemplateToCompilerBCH(template); const lockingBytecode = compiler.generateBytecode({ data: lockingData, scriptId: lockingScript, @@ -66,7 +66,7 @@ test('transaction e2e tests: 2-of-3 multisig', (t) => { const address = lockingBytecodeToCashAddress( lockingBytecode.bytecode, - CashAddressNetworkPrefix.testnet + CashAddressNetworkPrefix.testnet, ); t.deepEqual(address, 'bchtest:pplldqjpjaj0058xma6csnpgxd9ew2vxgv26n639yk'); @@ -80,7 +80,7 @@ test('transaction e2e tests: 2-of-3 multisig', (t) => { const input1 = { outpointIndex: 1, outpointTransactionHash: hexToBin( - '3423be78a1976b4ae3516cda594577df004663ff24f1beb9d5bb63056b1b0a60' + '3423be78a1976b4ae3516cda594577df004663ff24f1beb9d5bb63056b1b0a60', ), sequenceNumber: 0, unlockingBytecode: { @@ -141,7 +141,7 @@ test('transaction e2e tests: 2-of-3 multisig', (t) => { const signer1ResolvedVariables = extractResolvedVariables(signer1Attempt); const expectedSigner1Signature = hexToBin( - '304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c7653041' + '304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c7653041', ); t.deepEqual( @@ -149,7 +149,7 @@ test('transaction e2e tests: 2-of-3 multisig', (t) => { { 'key1.signature.all_outputs': expectedSigner1Signature, }, - stringify(signer1ResolvedVariables) + stringify(signer1ResolvedVariables), ); const signer3UnlockingData: CompilationData = { @@ -186,7 +186,7 @@ test('transaction e2e tests: 2-of-3 multisig', (t) => { signer3UnlockingData, { signer_1: signer1ResolvedVariables, - } + }, ) as CompilationData; t.deepEqual( @@ -197,7 +197,7 @@ test('transaction e2e tests: 2-of-3 multisig', (t) => { 'key1.signature.all_outputs': expectedSigner1Signature, }, }, - stringify(signer3UnlockingDataWithMissingVariables) + stringify(signer3UnlockingDataWithMissingVariables), ); const successfulCompilation = generateTransaction({ @@ -232,12 +232,12 @@ test('transaction e2e tests: 2-of-3 multisig', (t) => { * tx: c903aba46b4069e485b51292fd68eefdc95110fb95461b118c650fb454c34a9c */ hexToBin( - '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) + '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000', + ), ) as TransactionCommon, }, `${stringify(successfulCompilation)} - ${stringify( - encodeTransactionCommon(successfulCompilation.transaction) - )}` + encodeTransactionCommon(successfulCompilation.transaction), + )}`, ); }); diff --git a/src/lib/transaction/transaction-e2e.p2pkh.spec.ts b/src/lib/transaction/transaction-e2e.p2pkh.spec.ts index f420efec..49e36f8b 100644 --- a/src/lib/transaction/transaction-e2e.p2pkh.spec.ts +++ b/src/lib/transaction/transaction-e2e.p2pkh.spec.ts @@ -2,13 +2,13 @@ import test from 'ava'; import type { CompilationData, TransactionCommon } from '../lib.js'; import { - authenticationTemplateToCompilerBCH, CashAddressNetworkPrefix, decodeTransactionCommon, generateTransaction, hexToBin, - importAuthenticationTemplate, + importWalletTemplate, lockingBytecodeToCashAddress, + walletTemplateToCompilerBCH, } from '../lib.js'; import { @@ -17,8 +17,8 @@ import { p2pkhJson, } from './transaction-e2e.spec.helper.js'; -test('transaction e2e tests: P2PKH (authenticationTemplateP2pkhHd)', (t) => { - const template = importAuthenticationTemplate(p2pkhJson); +test('transaction e2e tests: P2PKH (walletTemplateP2pkhHd)', (t) => { + const template = importWalletTemplate(p2pkhJson); if (typeof template === 'string') { t.fail(template); return; @@ -40,7 +40,7 @@ test('transaction e2e tests: P2PKH (authenticationTemplateP2pkhHd)', (t) => { hdKeys: { addressIndex: 0, hdPrivateKeys: { owner: hdPrivateKey } }, }; - const compiler = authenticationTemplateToCompilerBCH(template); + const compiler = walletTemplateToCompilerBCH(template); const lockingBytecode = compiler.generateBytecode({ data: lockingData, scriptId: lockingScript, @@ -55,13 +55,13 @@ test('transaction e2e tests: P2PKH (authenticationTemplateP2pkhHd)', (t) => { t.deepEqual( lockingBytecodeToCashAddress( lockingBytecode.bytecode, - CashAddressNetworkPrefix.testnet + CashAddressNetworkPrefix.testnet, ), - 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x' + 'bchtest:qq2azmyyv6dtgczexyalqar70q036yund53jvfde0x', ); const utxoOutpointTransactionHash = hexToBin( - '68127de83d2ab77d7f5fd8d2ac6181d94473c0cbb2d0776084bf28884f6ecd77' + '68127de83d2ab77d7f5fd8d2ac6181d94473c0cbb2d0776084bf28884f6ecd77', ); const satoshis = 1000000; @@ -99,8 +99,8 @@ test('transaction e2e tests: P2PKH (authenticationTemplateP2pkhHd)', (t) => { success: true, transaction: decodeTransactionCommon( hexToBin( - '020000000177cd6e4f8828bf846077d0b2cbc07344d98161acd2d85f7f7db72a3de87d1268010000006441f87a1dc0fb4a30443fdfcc678e713d99cffb963bd52b497377e81abe2cc2b5ac6e9837fab0a23f4d05fd06b80e7673a68bfa8d2f66b7ec5537e88696d7bae1b841210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) + '020000000177cd6e4f8828bf846077d0b2cbc07344d98161acd2d85f7f7db72a3de87d1268010000006441f87a1dc0fb4a30443fdfcc678e713d99cffb963bd52b497377e81abe2cc2b5ac6e9837fab0a23f4d05fd06b80e7673a68bfa8d2f66b7ec5537e88696d7bae1b841210376ea9e36a75d2ecf9c93a0be76885e36f822529db22acfdc761c9b5b4544f5c5000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000', + ), ) as TransactionCommon, }); }); diff --git a/src/lib/transaction/transaction-e2e.sig-of-sig.spec.ts b/src/lib/transaction/transaction-e2e.sig-of-sig.spec.ts index 433bfd40..2f4e69a5 100644 --- a/src/lib/transaction/transaction-e2e.sig-of-sig.spec.ts +++ b/src/lib/transaction/transaction-e2e.sig-of-sig.spec.ts @@ -4,7 +4,6 @@ import test from 'ava'; import type { CompilationData, TransactionCommon } from '../lib.js'; import { - authenticationTemplateToCompilerBCH, CashAddressNetworkPrefix, createVirtualMachineBCH, decodeTransactionCommon, @@ -13,9 +12,10 @@ import { extractResolvedVariables, generateTransaction, hexToBin, - importAuthenticationTemplate, + importWalletTemplate, lockingBytecodeToCashAddress, stringify, + walletTemplateToCompilerBCH, } from '../lib.js'; import { @@ -30,7 +30,7 @@ const vm = createVirtualMachineBCH(); // eslint-disable-next-line complexity test('transaction e2e tests: Sig-of-Sig Example', (t) => { - const template = importAuthenticationTemplate(sigOfSigJson); + const template = importWalletTemplate(sigOfSigJson); if (typeof template === 'string') { t.fail(stringify(template)); return; @@ -49,7 +49,7 @@ test('transaction e2e tests: Sig-of-Sig Example', (t) => { }; const lockingScript = 'lock'; - const compiler = authenticationTemplateToCompilerBCH(template); + const compiler = walletTemplateToCompilerBCH(template); const lockingBytecode = compiler.generateBytecode({ data: lockingData, scriptId: lockingScript, @@ -63,7 +63,7 @@ test('transaction e2e tests: Sig-of-Sig Example', (t) => { const address = lockingBytecodeToCashAddress( lockingBytecode.bytecode, - CashAddressNetworkPrefix.testnet + CashAddressNetworkPrefix.testnet, ); t.deepEqual(address, 'bchtest:ppcvyjuqwhuz06np4us443l26dzck305psl0dw6as9'); @@ -77,7 +77,7 @@ test('transaction e2e tests: Sig-of-Sig Example', (t) => { const input = { outpointIndex: 1, outpointTransactionHash: hexToBin( - '1a3c3f950738c23de2461f04b2acd4dfb6b6eb80daeb457f24a6084c45c7da01' + '1a3c3f950738c23de2461f04b2acd4dfb6b6eb80daeb457f24a6084c45c7da01', ), sequenceNumber: 0, unlockingBytecode: { @@ -136,24 +136,24 @@ test('transaction e2e tests: Sig-of-Sig Example', (t) => { { 'second.data_signature.first_signature': 'signer_2', }, - stringify(signer1MissingVariables) + stringify(signer1MissingVariables), ); const signer1ResolvedVariables = extractResolvedVariables(signer1Attempt); const expectedSigner1Signature = hexToBin( - '30440220097cf5732181c1b398909993b4e7794d6f1dc2d40fa803e4e92665e929ce75d40220208df3ba16d67f20f3063bde3234a131845f21a724ef29dad5086d75d76385ec41' + '30440220097cf5732181c1b398909993b4e7794d6f1dc2d40fa803e4e92665e929ce75d40220208df3ba16d67f20f3063bde3234a131845f21a724ef29dad5086d75d76385ec41', ); t.deepEqual( signer1ResolvedVariables, { 'first.public_key': hexToBin( - '0349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e46588' + '0349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e46588', ), 'first.signature.all_outputs': expectedSigner1Signature, }, - stringify(signer1ResolvedVariables) + stringify(signer1ResolvedVariables), ); /** @@ -227,12 +227,12 @@ test('transaction e2e tests: Sig-of-Sig Example', (t) => { */ transaction: decodeTransactionCommon( hexToBin( - '020000000101dac7454c08a6247f45ebda80ebb6b6dfd4acb2041f46e23dc23807953f3c1a01000000f04730440220097cf5732181c1b398909993b4e7794d6f1dc2d40fa803e4e92665e929ce75d40220208df3ba16d67f20f3063bde3234a131845f21a724ef29dad5086d75d76385ec41210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e4658846304402201673c0f6e8741bf2fd259411c212a2d7e326fe4c238118c0dbcab662ef439de10220259d9cf3414f662b83f5d7210e5b5890cdb64ee7e36f2187e6377c9e88a484613e52792102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b8469545bb76a91433c4f1d1e60cbe8eda7cf976752bbb313780c7db88ac000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) + '020000000101dac7454c08a6247f45ebda80ebb6b6dfd4acb2041f46e23dc23807953f3c1a01000000f04730440220097cf5732181c1b398909993b4e7794d6f1dc2d40fa803e4e92665e929ce75d40220208df3ba16d67f20f3063bde3234a131845f21a724ef29dad5086d75d76385ec41210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e4658846304402201673c0f6e8741bf2fd259411c212a2d7e326fe4c238118c0dbcab662ef439de10220259d9cf3414f662b83f5d7210e5b5890cdb64ee7e36f2187e6377c9e88a484613e52792102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b8469545bb76a91433c4f1d1e60cbe8eda7cf976752bbb313780c7db88ac000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000', + ), ) as TransactionCommon, }, `${stringify(successfulCompilation)} - ${stringify( - encodeTransactionCommon(successfulCompilation.transaction) - )}` + encodeTransactionCommon(successfulCompilation.transaction), + )}`, ); }); diff --git a/src/lib/transaction/transaction-e2e.spec.helper.ts b/src/lib/transaction/transaction-e2e.spec.helper.ts index a101b48e..f54b2bbe 100644 --- a/src/lib/transaction/transaction-e2e.spec.helper.ts +++ b/src/lib/transaction/transaction-e2e.spec.helper.ts @@ -1,7 +1,7 @@ /* eslint-disable import/no-internal-modules */ import twoOfTwoRecoverableJson from './fixtures/templates/2-of-2-recoverable.json' assert { type: 'json' }; import twoOfThreeJson from './fixtures/templates/2-of-3.json' assert { type: 'json' }; -import cashChannelsJson from './fixtures/templates/cash-channels.json' assert { type: 'json' }; +import cashChannelsJson from './fixtures/templates/cash-channels-v1.json' assert { type: 'json' }; import p2pkhJson from './fixtures/templates/p2pkh.json' assert { type: 'json' }; import sigOfSigJson from './fixtures/templates/sig-of-sig.json' assert { type: 'json' }; diff --git a/src/lib/transaction/transaction-e2e.templates.spec.ts b/src/lib/transaction/transaction-e2e.templates.spec.ts index 95a3a928..8fb5e6b2 100644 --- a/src/lib/transaction/transaction-e2e.templates.spec.ts +++ b/src/lib/transaction/transaction-e2e.templates.spec.ts @@ -1,10 +1,10 @@ import test from 'ava'; -import { authenticationTemplateP2pkh } from '../lib.js'; +import { walletTemplateP2pkh } from '../lib.js'; import { twoOfTwoRecoverable } from './fixtures/template.2-of-2-recoverable.spec.helper.js'; import { twoOfThree } from './fixtures/template.2-of-3.spec.helper.js'; -import { cashChannels } from './fixtures/template.cash-channels.spec.helper.js'; +import { cashChannels } from './fixtures/template.cash-channels-v1.spec.helper.js'; import { sigOfSig } from './fixtures/template.sig-of-sig.spec.helper.js'; import { cashChannelsJson, @@ -19,32 +19,32 @@ const ignoreDefault = (anything: object) => ({ default: true, }); -test('example authentication templates are updated', (t) => { +test('example wallet templates are updated', (t) => { const solution = 'Run "yarn gen:templates" to correct this issue. (Note: watch tasks don\'t always update cached JSON imports when the source file changes. You may need to restart tsc.)'; t.deepEqual( ignoreDefault(twoOfTwoRecoverable), ignoreDefault(twoOfTwoRecoverableJson), - `Inconsistency in twoOfTwoRecoverableJson. ${solution}` + `Inconsistency in twoOfTwoRecoverableJson. ${solution}`, ); t.deepEqual( ignoreDefault(twoOfThree), ignoreDefault(twoOfThreeJson), - `Inconsistency in twoOfThreeJson. ${solution}` + `Inconsistency in twoOfThreeJson. ${solution}`, ); t.deepEqual( ignoreDefault(cashChannels), ignoreDefault(cashChannelsJson), - `Inconsistency in cashChannelsJson. ${solution}` + `Inconsistency in cashChannelsJson. ${solution}`, ); t.deepEqual( - ignoreDefault(authenticationTemplateP2pkh), + ignoreDefault(walletTemplateP2pkh), ignoreDefault(p2pkhJson), - `Inconsistency in p2pkhJson. ${solution}` + `Inconsistency in p2pkhJson. ${solution}`, ); t.deepEqual( ignoreDefault(sigOfSig), ignoreDefault(sigOfSigJson), - `Inconsistency in sigOfSigJson. ${solution}` + `Inconsistency in sigOfSigJson. ${solution}`, ); }); diff --git a/src/lib/vm/instruction-sets/bch/2022/bch-2022-instruction-set.ts b/src/lib/vm/instruction-sets/bch/2022/bch-2022-instruction-set.ts index f8845ea2..1a666a37 100644 --- a/src/lib/vm/instruction-sets/bch/2022/bch-2022-instruction-set.ts +++ b/src/lib/vm/instruction-sets/bch/2022/bch-2022-instruction-set.ts @@ -170,7 +170,7 @@ export const createInstructionSetBCH2022 = ( secp256k1: internalSecp256k1, sha1: internalSha1, sha256: internalSha256, - } + }, ): InstructionSet< ResolvedTransactionBCH, AuthenticationProgramBCH, @@ -201,31 +201,31 @@ export const createInstructionSetBCH2022 = ( if (unlockingBytecode.length > ConsensusBCH.maximumBytecodeLength) { return applyError( initialState, - `The provided unlocking bytecode (${unlockingBytecode.length} bytes) exceeds the maximum bytecode length (${ConsensusBCH.maximumBytecodeLength} bytes).` + `The provided unlocking bytecode (${unlockingBytecode.length} bytes) exceeds the maximum bytecode length (${ConsensusBCH.maximumBytecodeLength} bytes).`, ); } if (authenticationInstructionsAreMalformed(unlockingInstructions)) { return applyError( initialState, - AuthenticationErrorCommon.malformedUnlockingBytecode + AuthenticationErrorCommon.malformedUnlockingBytecode, ); } if (!isPushOnly(unlockingBytecode)) { return applyError( initialState, - AuthenticationErrorCommon.requiresPushOnly + AuthenticationErrorCommon.requiresPushOnly, ); } if (lockingBytecode.length > ConsensusBCH.maximumBytecodeLength) { return applyError( initialState, - AuthenticationErrorCommon.exceededMaximumBytecodeLengthLocking + AuthenticationErrorCommon.exceededMaximumBytecodeLengthLocking, ); } if (authenticationInstructionsAreMalformed(lockingInstructions)) { return applyError( initialState, - AuthenticationErrorCommon.malformedLockingBytecode + AuthenticationErrorCommon.malformedLockingBytecode, ); } const unlockingResult = stateEvaluate(initialState); @@ -235,7 +235,7 @@ export const createInstructionSetBCH2022 = ( if (unlockingResult.controlStack.length !== 0) { return applyError( initialState, - AuthenticationErrorCommon.nonEmptyControlStack + AuthenticationErrorCommon.nonEmptyControlStack, ); } const lockingResult = stateEvaluate( @@ -243,7 +243,7 @@ export const createInstructionSetBCH2022 = ( instructions: lockingInstructions, program, stack: unlockingResult.stack, - }) + }), ); if (!isPayToScriptHash20(lockingBytecode)) { return lockingResult; @@ -267,7 +267,7 @@ export const createInstructionSetBCH2022 = ( instructions: p2shInstructions, program, stack: p2shStack, - }) + }), ); }, every: (state) => @@ -276,11 +276,11 @@ export const createInstructionSetBCH2022 = ( ConsensusBCH.maximumStackDepth ? applyError(state, AuthenticationErrorCommon.exceededMaximumStackDepth) : state.operationCount > ConsensusBCH.maximumOperationCount - ? applyError( - state, - AuthenticationErrorCommon.exceededMaximumOperationCount - ) - : state, + ? applyError( + state, + AuthenticationErrorCommon.exceededMaximumOperationCount, + ) + : state, operations: { [OpcodesBCH.OP_0]: conditionallyPush, [OpcodesBCH.OP_PUSHBYTES_1]: conditionallyPush, @@ -457,35 +457,35 @@ export const createInstructionSetBCH2022 = ( [OpcodesBCH.OP_MAX]: conditionallyEvaluate(opMax), [OpcodesBCH.OP_WITHIN]: conditionallyEvaluate(opWithin), [OpcodesBCH.OP_RIPEMD160]: conditionallyEvaluate( - opRipemd160({ ripemd160 }) + opRipemd160({ ripemd160 }), ), [OpcodesBCH.OP_SHA1]: conditionallyEvaluate(opSha1({ sha1 })), [OpcodesBCH.OP_SHA256]: conditionallyEvaluate(opSha256({ sha256 })), [OpcodesBCH.OP_HASH160]: conditionallyEvaluate( - opHash160({ ripemd160, sha256 }) + opHash160({ ripemd160, sha256 }), ), [OpcodesBCH.OP_HASH256]: conditionallyEvaluate(opHash256({ sha256 })), [OpcodesBCH.OP_CODESEPARATOR]: conditionallyEvaluate(opCodeSeparator), [OpcodesBCH.OP_CHECKSIG]: conditionallyEvaluate( - opCheckSig({ secp256k1, sha256 }) + opCheckSig({ secp256k1, sha256 }), ), [OpcodesBCH.OP_CHECKSIGVERIFY]: conditionallyEvaluate( - opCheckSigVerify({ secp256k1, sha256 }) + opCheckSigVerify({ secp256k1, sha256 }), ), [OpcodesBCH.OP_CHECKMULTISIG]: conditionallyEvaluate( - opCheckMultiSig({ secp256k1, sha256 }) + opCheckMultiSig({ secp256k1, sha256 }), ), [OpcodesBCH.OP_CHECKMULTISIGVERIFY]: conditionallyEvaluate( - opCheckMultiSigVerify({ secp256k1, sha256 }) + opCheckMultiSigVerify({ secp256k1, sha256 }), ), ...(standard ? { [OpcodesBCH.OP_NOP1]: conditionallyEvaluate(opNopDisallowed), [OpcodesBCH.OP_CHECKLOCKTIMEVERIFY]: conditionallyEvaluate( - opCheckLockTimeVerify + opCheckLockTimeVerify, ), [OpcodesBCH.OP_CHECKSEQUENCEVERIFY]: conditionallyEvaluate( - opCheckSequenceVerify + opCheckSequenceVerify, ), [OpcodesBCH.OP_NOP4]: conditionallyEvaluate(opNopDisallowed), [OpcodesBCH.OP_NOP5]: conditionallyEvaluate(opNopDisallowed), @@ -498,10 +498,10 @@ export const createInstructionSetBCH2022 = ( : { [OpcodesBCH.OP_NOP1]: conditionallyEvaluate(opNop), [OpcodesBCH.OP_CHECKLOCKTIMEVERIFY]: conditionallyEvaluate( - opCheckLockTimeVerify + opCheckLockTimeVerify, ), [OpcodesBCH.OP_CHECKSEQUENCEVERIFY]: conditionallyEvaluate( - opCheckSequenceVerify + opCheckSequenceVerify, ), [OpcodesBCH.OP_NOP4]: conditionallyEvaluate(opNop), [OpcodesBCH.OP_NOP5]: conditionallyEvaluate(opNop), @@ -512,10 +512,10 @@ export const createInstructionSetBCH2022 = ( [OpcodesBCH.OP_NOP10]: conditionallyEvaluate(opNop), }), [OpcodesBCH.OP_CHECKDATASIG]: conditionallyEvaluate( - opCheckDataSig({ secp256k1, sha256 }) + opCheckDataSig({ secp256k1, sha256 }), ), [OpcodesBCH.OP_CHECKDATASIGVERIFY]: conditionallyEvaluate( - opCheckDataSigVerify({ secp256k1, sha256 }) + opCheckDataSigVerify({ secp256k1, sha256 }), ), [OpcodesBCH.OP_REVERSEBYTES]: conditionallyEvaluate(opReverseBytes), [OpcodesBCH.OP_INPUTINDEX]: conditionallyEvaluate(opInputIndex), @@ -532,12 +532,12 @@ export const createInstructionSetBCH2022 = ( [OpcodesBCH.OP_OUTPOINTINDEX]: conditionallyEvaluate(opOutpointIndex), [OpcodesBCH.OP_INPUTBYTECODE]: conditionallyEvaluate(opInputBytecode), [OpcodesBCH.OP_INPUTSEQUENCENUMBER]: conditionallyEvaluate( - opInputSequenceNumber + opInputSequenceNumber, ), [OpcodesBCH.OP_OUTPUTVALUE]: conditionallyEvaluate(opOutputValue), [OpcodesBCH.OP_OUTPUTBYTECODE]: conditionallyEvaluate(opOutputBytecode), - } + }, ), }, success: (state: AuthenticationProgramStateBCH) => { @@ -588,7 +588,7 @@ export const createInstructionSetBCH2022 = ( return `Transaction exceeds maximum standard size: this transaction is ${transactionSize} bytes, but the maximum standard transaction size is ${ConsensusBCH.maximumStandardTransactionSize} bytes.`; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, output] of sourceOutputs.entries()) { if (!isStandardOutputBytecode(output.lockingBytecode)) { return `Standard transactions may only spend standard output types, but source output ${index} is non-standard.`; @@ -597,15 +597,15 @@ export const createInstructionSetBCH2022 = ( // eslint-disable-next-line functional/no-let let totalArbitraryDataBytes = 0; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, output] of transaction.outputs.entries()) { if (!isStandardOutputBytecode(output.lockingBytecode)) { return `Standard transactions may only create standard output types, but transaction output ${index} is non-standard.`; } - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (isArbitraryDataOutput(output.lockingBytecode)) { - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements totalArbitraryDataBytes += output.lockingBytecode.length + 1; } /* @@ -619,7 +619,7 @@ export const createInstructionSetBCH2022 = ( return `Standard transactions may carry no more than ${ConsensusBCH.maximumDataCarrierBytes} bytes in arbitrary data outputs; this transaction includes ${totalArbitraryDataBytes} bytes of arbitrary data.`; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, input] of transaction.inputs.entries()) { if ( input.unlockingBytecode.length > @@ -633,7 +633,7 @@ export const createInstructionSetBCH2022 = ( } } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const index of transaction.inputs.keys()) { const state = evaluate({ inputIndex: index, diff --git a/src/lib/vm/instruction-sets/bch/2022/bch-2022-types.ts b/src/lib/vm/instruction-sets/bch/2022/bch-2022-types.ts index e5b6e691..3c4d6f2e 100644 --- a/src/lib/vm/instruction-sets/bch/2022/bch-2022-types.ts +++ b/src/lib/vm/instruction-sets/bch/2022/bch-2022-types.ts @@ -29,11 +29,11 @@ export type AuthenticationVirtualMachineBCH = AuthenticationVirtualMachine< >; export type TransactionBCH< InputType = Input, - OutputType = Output + OutputType = Output, > = TransactionCommon; export type Transaction< InputType = Input, - OutputType = Output + OutputType = Output, > = TransactionBCH; export type CompilationContextBCH = CompilationContext< TransactionBCH> @@ -55,7 +55,7 @@ export const createTestAuthenticationProgramBCH = ({ { outpointIndex: 0xffffffff, outpointTransactionHash: hexToBin( - '0000000000000000000000000000000000000000000000000000000000000000' + '0000000000000000000000000000000000000000000000000000000000000000', ), sequenceNumber: 0xffffffff, unlockingBytecode: Uint8Array.of(0, 0), @@ -70,7 +70,7 @@ export const createTestAuthenticationProgramBCH = ({ { outpointIndex: 0, outpointTransactionHash: hashTransactionP2pOrder( - encodeTransactionCommon(testFundingTransaction) + encodeTransactionCommon(testFundingTransaction), ), sequenceNumber: 0xffffffff, diff --git a/src/lib/vm/instruction-sets/bch/2023/bch-2023-consensus.ts b/src/lib/vm/instruction-sets/bch/2023/bch-2023-consensus.ts index 457ddc87..7cf6d168 100644 --- a/src/lib/vm/instruction-sets/bch/2023/bch-2023-consensus.ts +++ b/src/lib/vm/instruction-sets/bch/2023/bch-2023-consensus.ts @@ -54,6 +54,7 @@ export enum ConsensusBCH2023 { * A.K.A. `MAXIMUM_ELEMENT_SIZE_64_BIT` */ maximumVmNumberLength = 8, + // eslint-disable-next-line @typescript-eslint/no-mixed-enums minVmNumber = '-9223372036854775807', maxVmNumber = '9223372036854775807', schnorrSignatureLength = 64, diff --git a/src/lib/vm/instruction-sets/bch/2023/bch-2023-crypto.ts b/src/lib/vm/instruction-sets/bch/2023/bch-2023-crypto.ts index bc5250b5..3451e0c6 100644 --- a/src/lib/vm/instruction-sets/bch/2023/bch-2023-crypto.ts +++ b/src/lib/vm/instruction-sets/bch/2023/bch-2023-crypto.ts @@ -41,7 +41,7 @@ export const opCheckSigBCH2023 = verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ): Operation => (s: State) => // eslint-disable-next-line complexity @@ -49,38 +49,38 @@ export const opCheckSigBCH2023 = if (!isValidPublicKeyEncoding(publicKey)) { return applyError( state, - AuthenticationErrorCommon.invalidPublicKeyEncoding + AuthenticationErrorCommon.invalidPublicKeyEncoding, ); } if ( !isValidSignatureEncodingBCHTransaction( bitcoinEncodedSignature, - SigningSerializationTypesBCH2023 + SigningSerializationTypesBCH2023, ) ) { return applyError( state, AuthenticationErrorCommon.invalidSignatureEncoding, `Transaction signature (including signing serialization): ${binToHex( - bitcoinEncodedSignature - )}` + bitcoinEncodedSignature, + )}`, ); } const coveredBytecode = encodeAuthenticationInstructions( - state.instructions + state.instructions, ).subarray(state.lastCodeSeparator + 1); const { signingSerializationType, signature } = decodeBitcoinSignature( - bitcoinEncodedSignature + bitcoinEncodedSignature, ); const serialization = generateSigningSerializationBCH( state.program, { coveredBytecode, signingSerializationType }, - sha256 + sha256, ); const digest = hash256(serialization, sha256); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.signedMessages.push({ digest, serialization }); const useSchnorr = @@ -109,7 +109,7 @@ export const opCheckMultiSigBCH2023 = secp256k1: { verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ) => (s: State) => useOneVmNumber(s, (state, publicKeysValue) => { @@ -118,26 +118,26 @@ export const opCheckMultiSigBCH2023 = if (potentialPublicKeys < 0) { return applyError( state, - AuthenticationErrorCommon.invalidNaturalNumber + AuthenticationErrorCommon.invalidNaturalNumber, ); } if (potentialPublicKeys > Multisig.maximumPublicKeys) { return applyError( state, - AuthenticationErrorCommon.exceedsMaximumMultisigPublicKeyCount + AuthenticationErrorCommon.exceedsMaximumMultisigPublicKeyCount, ); } const publicKeys = // eslint-disable-next-line functional/immutable-data potentialPublicKeys > 0 ? state.stack.splice(-potentialPublicKeys) : []; - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.operationCount += potentialPublicKeys; return state.operationCount > ConsensusCommon.maximumOperationCount ? applyError( state, - AuthenticationErrorCommon.exceededMaximumOperationCount + AuthenticationErrorCommon.exceededMaximumOperationCount, ) : useOneVmNumber( state, @@ -148,14 +148,14 @@ export const opCheckMultiSigBCH2023 = if (requiredApprovingPublicKeys < 0) { return applyError( nextState, - AuthenticationErrorCommon.invalidNaturalNumber + AuthenticationErrorCommon.invalidNaturalNumber, ); } if (requiredApprovingPublicKeys > potentialPublicKeys) { return applyError( nextState, - AuthenticationErrorCommon.insufficientPublicKeys + AuthenticationErrorCommon.insufficientPublicKeys, ); } @@ -172,18 +172,18 @@ export const opCheckMultiSigBCH2023 = if (protocolBugValue.length !== 0) { return applyError( finalState, - AuthenticationErrorCommon.invalidProtocolBugValue + AuthenticationErrorCommon.invalidProtocolBugValue, ); } const coveredBytecode = encodeAuthenticationInstructions( - finalState.instructions + finalState.instructions, ).subarray(finalState.lastCodeSeparator + 1); let approvingPublicKeys = 0; // eslint-disable-line functional/no-let let remainingSignatures = signatures.length; // eslint-disable-line functional/no-let let remainingPublicKeys = publicKeys.length; // eslint-disable-line functional/no-let - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while ( remainingSignatures > 0 && remainingPublicKeys > 0 && @@ -200,22 +200,22 @@ export const opCheckMultiSigBCH2023 = if (!isValidPublicKeyEncoding(publicKey)) { return applyError( finalState, - AuthenticationErrorCommon.invalidPublicKeyEncoding + AuthenticationErrorCommon.invalidPublicKeyEncoding, ); } if ( !isValidSignatureEncodingBCHTransaction( bitcoinEncodedSignature, - SigningSerializationTypesBCH2023 + SigningSerializationTypesBCH2023, ) ) { return applyError( finalState, AuthenticationErrorCommon.invalidSignatureEncoding, `Transaction signature (including signing serialization type): ${binToHex( - bitcoinEncodedSignature - )}` + bitcoinEncodedSignature, + )}`, ); } @@ -225,11 +225,11 @@ export const opCheckMultiSigBCH2023 = const serialization = generateSigningSerializationBCH( state.program, { coveredBytecode, signingSerializationType }, - sha256 + sha256, ); const digest = hash256(serialization, sha256); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data finalState.signedMessages.push({ digest, serialization }); if ( @@ -238,22 +238,22 @@ export const opCheckMultiSigBCH2023 = ) { return applyError( finalState, - AuthenticationErrorCommon.schnorrSizedSignatureInCheckMultiSig + AuthenticationErrorCommon.schnorrSizedSignatureInCheckMultiSig, ); } const signed = secp256k1.verifySignatureDERLowS( signature, publicKey, - digest + digest, ); - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (signed) { - approvingPublicKeys += 1; // eslint-disable-line functional/no-expression-statement - remainingSignatures -= 1; // eslint-disable-line functional/no-expression-statement + approvingPublicKeys += 1; // eslint-disable-line functional/no-expression-statements + remainingSignatures -= 1; // eslint-disable-line functional/no-expression-statements } - remainingPublicKeys -= 1; // eslint-disable-line functional/no-expression-statement + remainingPublicKeys -= 1; // eslint-disable-line functional/no-expression-statements } const success = @@ -265,19 +265,19 @@ export const opCheckMultiSigBCH2023 = ) { return applyError( finalState, - AuthenticationErrorCommon.nonNullSignatureFailure + AuthenticationErrorCommon.nonNullSignatureFailure, ); } return pushToStack(finalState, booleanToVmNumber(success)); - } + }, ); - } + }, ); }); export const opCheckSigVerifyBCH2023 = < - State extends AuthenticationProgramStateCommon + State extends AuthenticationProgramStateCommon, >( { secp256k1, @@ -288,12 +288,12 @@ export const opCheckSigVerifyBCH2023 = < verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ): Operation => combineOperations(opCheckSigBCH2023({ secp256k1, sha256 }), opVerify); export const opCheckMultiSigVerifyBCH2023 = < - State extends AuthenticationProgramStateCommon + State extends AuthenticationProgramStateCommon, >({ secp256k1, sha256, @@ -305,5 +305,5 @@ export const opCheckMultiSigVerifyBCH2023 = < }): Operation => combineOperations( opCheckMultiSigBCH2023({ secp256k1, sha256 }), - opVerify + opVerify, ); diff --git a/src/lib/vm/instruction-sets/bch/2023/bch-2023-instruction-set.ts b/src/lib/vm/instruction-sets/bch/2023/bch-2023-instruction-set.ts index afebdf11..b1cd9721 100644 --- a/src/lib/vm/instruction-sets/bch/2023/bch-2023-instruction-set.ts +++ b/src/lib/vm/instruction-sets/bch/2023/bch-2023-instruction-set.ts @@ -188,7 +188,7 @@ export const createInstructionSetBCH2023 = ( secp256k1: internalSecp256k1, sha1: internalSha1, sha256: internalSha256, - } + }, ): InstructionSet< ResolvedTransactionBCH, AuthenticationProgramBCH, @@ -219,31 +219,31 @@ export const createInstructionSetBCH2023 = ( if (unlockingBytecode.length > ConsensusBCH2023.maximumBytecodeLength) { return applyError( initialState, - `The provided unlocking bytecode (${unlockingBytecode.length} bytes) exceeds the maximum bytecode length (${ConsensusBCH2023.maximumBytecodeLength} bytes).` + `The provided unlocking bytecode (${unlockingBytecode.length} bytes) exceeds the maximum bytecode length (${ConsensusBCH2023.maximumBytecodeLength} bytes).`, ); } if (authenticationInstructionsAreMalformed(unlockingInstructions)) { return applyError( initialState, - AuthenticationErrorCommon.malformedUnlockingBytecode + AuthenticationErrorCommon.malformedUnlockingBytecode, ); } if (!isPushOnly(unlockingBytecode)) { return applyError( initialState, - AuthenticationErrorCommon.requiresPushOnly + AuthenticationErrorCommon.requiresPushOnly, ); } if (lockingBytecode.length > ConsensusBCH2023.maximumBytecodeLength) { return applyError( initialState, - AuthenticationErrorCommon.exceededMaximumBytecodeLengthLocking + AuthenticationErrorCommon.exceededMaximumBytecodeLengthLocking, ); } if (authenticationInstructionsAreMalformed(lockingInstructions)) { return applyError( initialState, - AuthenticationErrorCommon.malformedLockingBytecode + AuthenticationErrorCommon.malformedLockingBytecode, ); } const unlockingResult = stateEvaluate(initialState); @@ -253,7 +253,7 @@ export const createInstructionSetBCH2023 = ( if (unlockingResult.controlStack.length !== 0) { return applyError( initialState, - AuthenticationErrorCommon.nonEmptyControlStack + AuthenticationErrorCommon.nonEmptyControlStack, ); } const lockingResult = stateEvaluate( @@ -261,7 +261,7 @@ export const createInstructionSetBCH2023 = ( instructions: lockingInstructions, program, stack: unlockingResult.stack, - }) + }), ); const p2sh20 = isPayToScriptHash20(lockingBytecode); @@ -288,7 +288,7 @@ export const createInstructionSetBCH2023 = ( instructions: p2shInstructions, program, stack: p2shStack, - }) + }), ); }, every: (state) => @@ -297,11 +297,11 @@ export const createInstructionSetBCH2023 = ( ConsensusBCH2023.maximumStackDepth ? applyError(state, AuthenticationErrorCommon.exceededMaximumStackDepth) : state.operationCount > ConsensusBCH2023.maximumOperationCount - ? applyError( - state, - AuthenticationErrorCommon.exceededMaximumOperationCount - ) - : state, + ? applyError( + state, + AuthenticationErrorCommon.exceededMaximumOperationCount, + ) + : state, operations: { [OpcodesBCH2023.OP_0]: conditionallyPush, [OpcodesBCH2023.OP_PUSHBYTES_1]: conditionallyPush, @@ -383,7 +383,7 @@ export const createInstructionSetBCH2023 = ( [OpcodesBCH2023.OP_PUSHDATA_2]: conditionallyPush, [OpcodesBCH2023.OP_PUSHDATA_4]: conditionallyPush, [OpcodesBCH2023.OP_1NEGATE]: conditionallyEvaluate( - pushNumberOperation(-1) + pushNumberOperation(-1), ), [OpcodesBCH2023.OP_RESERVED]: conditionallyEvaluate(reservedOperation), [OpcodesBCH2023.OP_1]: conditionallyEvaluate(pushNumberOperation(1)), @@ -483,41 +483,41 @@ export const createInstructionSetBCH2023 = ( [OpcodesBCH2023.OP_MAX]: conditionallyEvaluate(opMax), [OpcodesBCH2023.OP_WITHIN]: conditionallyEvaluate(opWithin), [OpcodesBCH2023.OP_RIPEMD160]: conditionallyEvaluate( - opRipemd160({ ripemd160 }) + opRipemd160({ ripemd160 }), ), [OpcodesBCH2023.OP_SHA1]: conditionallyEvaluate(opSha1({ sha1 })), [OpcodesBCH2023.OP_SHA256]: conditionallyEvaluate( - opSha256({ sha256 }) + opSha256({ sha256 }), ), [OpcodesBCH2023.OP_HASH160]: conditionallyEvaluate( - opHash160({ ripemd160, sha256 }) + opHash160({ ripemd160, sha256 }), ), [OpcodesBCH2023.OP_HASH256]: conditionallyEvaluate( - opHash256({ sha256 }) + opHash256({ sha256 }), ), [OpcodesBCH2023.OP_CODESEPARATOR]: conditionallyEvaluate(opCodeSeparator), [OpcodesBCH2023.OP_CHECKSIG]: conditionallyEvaluate( - opCheckSigBCH2023({ secp256k1, sha256 }) + opCheckSigBCH2023({ secp256k1, sha256 }), ), [OpcodesBCH2023.OP_CHECKSIGVERIFY]: conditionallyEvaluate( - opCheckSigVerifyBCH2023({ secp256k1, sha256 }) + opCheckSigVerifyBCH2023({ secp256k1, sha256 }), ), [OpcodesBCH2023.OP_CHECKMULTISIG]: conditionallyEvaluate( - opCheckMultiSigBCH2023({ secp256k1, sha256 }) + opCheckMultiSigBCH2023({ secp256k1, sha256 }), ), [OpcodesBCH2023.OP_CHECKMULTISIGVERIFY]: conditionallyEvaluate( - opCheckMultiSigVerifyBCH2023({ secp256k1, sha256 }) + opCheckMultiSigVerifyBCH2023({ secp256k1, sha256 }), ), ...(standard ? { [OpcodesBCH2023.OP_NOP1]: conditionallyEvaluate(opNopDisallowed), [OpcodesBCH2023.OP_CHECKLOCKTIMEVERIFY]: conditionallyEvaluate( - opCheckLockTimeVerify + opCheckLockTimeVerify, ), [OpcodesBCH2023.OP_CHECKSEQUENCEVERIFY]: conditionallyEvaluate( - opCheckSequenceVerify + opCheckSequenceVerify, ), [OpcodesBCH2023.OP_NOP4]: conditionallyEvaluate(opNopDisallowed), @@ -537,10 +537,10 @@ export const createInstructionSetBCH2023 = ( : { [OpcodesBCH2023.OP_NOP1]: conditionallyEvaluate(opNop), [OpcodesBCH2023.OP_CHECKLOCKTIMEVERIFY]: conditionallyEvaluate( - opCheckLockTimeVerify + opCheckLockTimeVerify, ), [OpcodesBCH2023.OP_CHECKSEQUENCEVERIFY]: conditionallyEvaluate( - opCheckSequenceVerify + opCheckSequenceVerify, ), [OpcodesBCH2023.OP_NOP4]: conditionallyEvaluate(opNop), [OpcodesBCH2023.OP_NOP5]: conditionallyEvaluate(opNop), @@ -551,10 +551,10 @@ export const createInstructionSetBCH2023 = ( [OpcodesBCH2023.OP_NOP10]: conditionallyEvaluate(opNop), }), [OpcodesBCH2023.OP_CHECKDATASIG]: conditionallyEvaluate( - opCheckDataSig({ secp256k1, sha256 }) + opCheckDataSig({ secp256k1, sha256 }), ), [OpcodesBCH2023.OP_CHECKDATASIGVERIFY]: conditionallyEvaluate( - opCheckDataSigVerify({ secp256k1, sha256 }) + opCheckDataSigVerify({ secp256k1, sha256 }), ), [OpcodesBCH2023.OP_REVERSEBYTES]: conditionallyEvaluate(opReverseBytes), @@ -577,7 +577,7 @@ export const createInstructionSetBCH2023 = ( [OpcodesBCH2023.OP_INPUTBYTECODE]: conditionallyEvaluate(opInputBytecode), [OpcodesBCH2023.OP_INPUTSEQUENCENUMBER]: conditionallyEvaluate( - opInputSequenceNumber + opInputSequenceNumber, ), [OpcodesBCH2023.OP_OUTPUTVALUE]: conditionallyEvaluate(opOutputValue), [OpcodesBCH2023.OP_OUTPUTBYTECODE]: @@ -585,19 +585,19 @@ export const createInstructionSetBCH2023 = ( [OpcodesBCH2023.OP_UTXOTOKENCATEGORY]: conditionallyEvaluate(opUtxoTokenCategory), [OpcodesBCH2023.OP_UTXOTOKENCOMMITMENT]: conditionallyEvaluate( - opUtxoTokenCommitment + opUtxoTokenCommitment, ), [OpcodesBCH2023.OP_UTXOTOKENAMOUNT]: conditionallyEvaluate(opUtxoTokenAmount), [OpcodesBCH2023.OP_OUTPUTTOKENCATEGORY]: conditionallyEvaluate( - opOutputTokenCategory + opOutputTokenCategory, ), [OpcodesBCH2023.OP_OUTPUTTOKENCOMMITMENT]: conditionallyEvaluate( - opOutputTokenCommitment + opOutputTokenCommitment, ), [OpcodesBCH2023.OP_OUTPUTTOKENAMOUNT]: conditionallyEvaluate(opOutputTokenAmount), - } + }, ), }, success: (state: AuthenticationProgramStateBCH) => { @@ -639,11 +639,11 @@ export const createInstructionSetBCH2023 = ( const inputValue = sourceOutputs.reduce( (sum, utxo) => sum + utxo.valueSatoshis, - 0n + 0n, ); const outputValue = transaction.outputs.reduce( (sum, output) => sum + output.valueSatoshis, - 0n + 0n, ); if (outputValue > inputValue) { return `Unable to verify transaction: the sum of transaction outputs exceeds the sum of transaction inputs. Input value: ${inputValue}, output value: ${outputValue}`; @@ -652,11 +652,11 @@ export const createInstructionSetBCH2023 = ( const outpointList = transaction.inputs.map( (input) => `outpointTransactionHash: ${binToHex( - input.outpointTransactionHash - )}, outpointIndex: ${input.outpointIndex}` + input.outpointTransactionHash, + )}, outpointIndex: ${input.outpointIndex}`, ); const firstDuplicate = outpointList.find( - (outpoint, index) => outpointList.lastIndexOf(outpoint) !== index + (outpoint, index) => outpointList.lastIndexOf(outpoint) !== index, ); /** * This check isn't strictly necessary to perform in the VM (assuming the @@ -678,7 +678,7 @@ export const createInstructionSetBCH2023 = ( return `Transaction exceeds maximum standard size: this transaction is ${transactionSize} bytes, but the maximum standard transaction size is ${ConsensusBCH2023.maximumStandardTransactionSize} bytes.`; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, output] of sourceOutputs.entries()) { if (!isStandardOutputBytecode2023(output.lockingBytecode)) { return `Standard transactions may only spend standard output types, but source output ${index} is non-standard.`; @@ -687,19 +687,19 @@ export const createInstructionSetBCH2023 = ( // eslint-disable-next-line functional/no-let let totalArbitraryDataBytes = 0; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, output] of transaction.outputs.entries()) { if (!isStandardOutputBytecode2023(output.lockingBytecode)) { return `Standard transactions may only create standard output types, but transaction output ${index} is non-standard.`; } - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (isArbitraryDataOutput(output.lockingBytecode)) { - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements totalArbitraryDataBytes += output.lockingBytecode.length + 1; } if (isDustOutput(output)) { return `Standard transactions may not have dust outputs, but transaction output ${index} is a dust output. Output ${index} must have a value of at least ${getDustThreshold( - output + output, )} satoshis. Current value: ${output.valueSatoshis}`; } } @@ -709,7 +709,7 @@ export const createInstructionSetBCH2023 = ( return `Standard transactions may carry no more than ${ConsensusBCH2023.maximumDataCarrierBytes} bytes in arbitrary data outputs; this transaction includes ${totalArbitraryDataBytes} bytes of arbitrary data.`; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, input] of transaction.inputs.entries()) { if ( input.unlockingBytecode.length > @@ -725,13 +725,13 @@ export const createInstructionSetBCH2023 = ( const tokenValidationResult = verifyTransactionTokens( transaction, - sourceOutputs + sourceOutputs, ); if (tokenValidationResult !== true) { return tokenValidationResult; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const index of transaction.inputs.keys()) { const state = evaluate({ inputIndex: index, diff --git a/src/lib/vm/instruction-sets/bch/2023/bch-2023-tokens.ts b/src/lib/vm/instruction-sets/bch/2023/bch-2023-tokens.ts index 1eb8bd2a..5c80cf5c 100644 --- a/src/lib/vm/instruction-sets/bch/2023/bch-2023-tokens.ts +++ b/src/lib/vm/instruction-sets/bch/2023/bch-2023-tokens.ts @@ -30,21 +30,21 @@ export const extractGenesisCategories = (inputs: Input[]) => input.outpointIndex === 0 ? [...agg, binToHex(input.outpointTransactionHash)] : agg, - [] + [], ); -interface ImmutableToken { +type ImmutableToken = { categoryHex: string; commitmentHex: string; -} +}; -interface FungibleTokensByCategory { +type FungibleTokensByCategory = { [categoryHex: string]: bigint; -} +}; -interface MutableTokensByCategory { +type MutableTokensByCategory = { [categoryHex: string]: number; -} +}; /** * Given the resolved list of a transaction's source outputs – the Unspent @@ -100,7 +100,7 @@ export const extractSourceOutputTokenData = (sourceOutputs: Output[]) => availableMutableTokensByCategory: {} as MutableTokensByCategory, availableSumsByCategory: {} as FungibleTokensByCategory, inputMintingCategories: [] as string[], - } + }, ); /** @@ -112,7 +112,7 @@ export const extractSourceOutputTokenData = (sourceOutputs: Output[]) => * `outputSumsByCategory`. See CHIP-2022-02-CashTokens for details. */ export const extractTransactionOutputTokenData = ( - outputs: Transaction['outputs'] + outputs: Transaction['outputs'], ) => outputs.reduce( // eslint-disable-next-line complexity @@ -157,7 +157,7 @@ export const extractTransactionOutputTokenData = ( outputMintingCategories: [] as string[], outputMutableTokensByCategory: {} as MutableTokensByCategory, outputSumsByCategory: {} as FungibleTokensByCategory, - } + }, ); /** @@ -171,13 +171,13 @@ export const extractTransactionOutputTokenData = ( // eslint-disable-next-line complexity export const verifyTransactionTokens = ( transaction: Transaction, - sourceOutputs: Output[] + sourceOutputs: Output[], ) => { const excessiveCommitment = [...sourceOutputs, ...transaction.outputs].find( (output) => output.token?.nft?.commitment !== undefined && output.token.nft.commitment.length > - ConsensusBCH2023.maximumCommitmentLength + ConsensusBCH2023.maximumCommitmentLength, ); if (excessiveCommitment !== undefined) { return `Transaction violates token validation: a token commitment exceeds the consensus limit of ${ @@ -206,13 +206,13 @@ export const verifyTransactionTokens = ( ]; const missingMintingCategory = outputMintingCategories.find( - (category) => !availableMintingCategories.includes(category) + (category) => !availableMintingCategories.includes(category), ); if (missingMintingCategory !== undefined) { return `Transaction violates token validation: the transaction outputs include a minting token that is not substantiated by the transaction's inputs. Invalid output minting token category: ${missingMintingCategory}`; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [categoryHex, sum] of Object.entries(outputSumsByCategory)) { if (sum > BigInt(ConsensusBCH2023.maxVmNumber)) { return `Transaction violates token validation: the transaction outputs include a sum of fungible tokens for a category exceeding the maximum supply (${ @@ -233,7 +233,7 @@ export const verifyTransactionTokens = ( } const remainingMutableTokens = Object.entries( - outputMutableTokensByCategory + outputMutableTokensByCategory, ).reduce((agg, [categoryHex, sum]) => { if (availableMintingCategories.includes(categoryHex)) { return agg; @@ -241,7 +241,7 @@ export const verifyTransactionTokens = ( return { ...agg, [categoryHex]: (agg[categoryHex] ?? 0) - sum }; }, availableMutableTokensByCategory); - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [categoryHex, sum] of Object.entries(remainingMutableTokens)) { if (sum < 0) { return `Transaction violates token validation: the transaction creates more mutable tokens than are available for a category without a matching minting token. Category: ${categoryHex}, excess mutable tokens: ${ @@ -259,7 +259,7 @@ export const verifyTransactionTokens = ( const firstMatch = availableImmutableTokens.findIndex( (available) => available.categoryHex === categoryHex && - available.commitmentHex === commitmentHex + available.commitmentHex === commitmentHex, ); if (firstMatch === -1) { return { @@ -267,14 +267,14 @@ export const verifyTransactionTokens = ( unmatchedImmutableTokens: [...agg.unmatchedImmutableTokens, token], }; } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data agg.availableImmutableTokens.splice(firstMatch, 1); return agg; }, { availableImmutableTokens, unmatchedImmutableTokens: [] as ImmutableToken[], - } + }, ); const requiredMutableTokens = unmatchedImmutableTokens.reduce( @@ -282,10 +282,10 @@ export const verifyTransactionTokens = ( ...agg, [token.categoryHex]: (agg[token.categoryHex] ?? 0) + 1, }), - {} + {}, ); - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [categoryHex, required] of Object.entries(requiredMutableTokens)) { const available = remainingMutableTokens[categoryHex] ?? 0; if (available < required) { @@ -304,10 +304,10 @@ const enum Constants { export const pushTokenExtendedCategory = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( state: State, - utxo: Output + utxo: Output, ) => { const { token } = utxo; if (token === undefined) { @@ -317,8 +317,8 @@ export const pushTokenExtendedCategory = < token.nft?.capability === 'minting' ? [Constants.mintingCapabilityByte] : token.nft?.capability === 'mutable' - ? [Constants.mutableCapabilityByte] - : []; + ? [Constants.mutableCapabilityByte] + : []; const extendedCategory = flattenBinArray([ token.category.slice().reverse(), Uint8Array.from(capabilityByte), @@ -332,10 +332,10 @@ type TokenOpState = AuthenticationProgramStateError & export const pushTokenCommitment = ( state: State, - utxo: Output + utxo: Output, ) => { const { token } = utxo; - if (token === undefined || token.nft === undefined) { + if (token?.nft === undefined) { return pushToStackVmNumber(state, 0n); } return pushToStackChecked(state, token.nft.commitment); @@ -343,7 +343,7 @@ export const pushTokenCommitment = ( export const pushTokenAmount = ( state: State, - utxo: Output + utxo: Output, ) => { const { token } = utxo; if (token === undefined) { @@ -354,36 +354,36 @@ export const pushTokenAmount = ( export const opUtxoTokenCategory = (state: State) => useTransactionUtxo(state, (nextState, [utxo]) => - pushTokenExtendedCategory(nextState, utxo) + pushTokenExtendedCategory(nextState, utxo), ); export const opUtxoTokenCommitment = ( - state: State + state: State, ) => useTransactionUtxo(state, (nextState, [utxo]) => - pushTokenCommitment(nextState, utxo) + pushTokenCommitment(nextState, utxo), ); export const opUtxoTokenAmount = (state: State) => useTransactionUtxo(state, (nextState, [utxo]) => - pushTokenAmount(nextState, utxo) + pushTokenAmount(nextState, utxo), ); export const opOutputTokenCategory = ( - state: State + state: State, ) => useTransactionOutput(state, (nextState, [output]) => - pushTokenExtendedCategory(nextState, output) + pushTokenExtendedCategory(nextState, output), ); export const opOutputTokenCommitment = ( - state: State + state: State, ) => useTransactionOutput(state, (nextState, [output]) => - pushTokenCommitment(nextState, output) + pushTokenCommitment(nextState, output), ); export const opOutputTokenAmount = (state: State) => useTransactionOutput(state, (nextState, [output]) => - pushTokenAmount(nextState, output) + pushTokenAmount(nextState, output), ); diff --git a/src/lib/vm/instruction-sets/bch/chips/bch-chips-crypto.ts b/src/lib/vm/instruction-sets/bch/chips/bch-chips-crypto.ts index 2c661559..3bf62f69 100644 --- a/src/lib/vm/instruction-sets/bch/chips/bch-chips-crypto.ts +++ b/src/lib/vm/instruction-sets/bch/chips/bch-chips-crypto.ts @@ -62,11 +62,11 @@ export const hashDigestIterations = (messageLength: number) => */ export const incrementHashDigestIterations = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateResourceLimitsBCHCHIPs + AuthenticationProgramStateResourceLimitsBCHCHIPs, >( state: State, messageLength: number, - operation: (nextState: State) => State + operation: (nextState: State) => State, ) => { const requiredTotalIterations = state.hashDigestIterations + hashDigestIterations(messageLength); @@ -74,7 +74,7 @@ export const incrementHashDigestIterations = < return applyError( state, AuthenticationErrorBCHCHIPs.excessiveHashing, - `Required cumulative iterations: ${requiredTotalIterations}` + `Required cumulative iterations: ${requiredTotalIterations}`, ); } return operation(state); @@ -85,19 +85,19 @@ export const opRipemd160ChipLimits = State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & AuthenticationProgramStateResourceLimitsBCHCHIPs & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { ripemd160, }: { ripemd160: { hash: Ripemd160['hash'] }; - } = { ripemd160: internalRipemd160 } + } = { ripemd160: internalRipemd160 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => incrementHashDigestIterations(nextState, value.length, (finalState) => - pushToStack(finalState, ripemd160.hash(value)) - ) + pushToStack(finalState, ripemd160.hash(value)), + ), ); export const opSha1ChipLimits = @@ -105,19 +105,19 @@ export const opSha1ChipLimits = State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & AuthenticationProgramStateResourceLimitsBCHCHIPs & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { sha1, }: { sha1: { hash: Sha1['hash'] }; - } = { sha1: internalSha1 } + } = { sha1: internalSha1 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => incrementHashDigestIterations(nextState, value.length, (finalState) => - pushToStack(finalState, sha1.hash(value)) - ) + pushToStack(finalState, sha1.hash(value)), + ), ); export const opSha256ChipLimits = @@ -125,7 +125,7 @@ export const opSha256ChipLimits = State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & AuthenticationProgramStateResourceLimitsBCHCHIPs & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { sha256, @@ -133,13 +133,13 @@ export const opSha256ChipLimits = sha256: { hash: Sha256['hash']; }; - } = { sha256: internalSha256 } + } = { sha256: internalSha256 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => incrementHashDigestIterations(nextState, value.length, (finalState) => - pushToStack(finalState, sha256.hash(value)) - ) + pushToStack(finalState, sha256.hash(value)), + ), ); export const opHash160ChipLimits = @@ -147,7 +147,7 @@ export const opHash160ChipLimits = State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & AuthenticationProgramStateResourceLimitsBCHCHIPs & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { ripemd160, @@ -155,13 +155,13 @@ export const opHash160ChipLimits = }: { sha256: { hash: Sha256['hash'] }; ripemd160: { hash: Ripemd160['hash'] }; - } = { ripemd160: internalRipemd160, sha256: internalSha256 } + } = { ripemd160: internalRipemd160, sha256: internalSha256 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => incrementHashDigestIterations(nextState, value.length, (finalState) => - pushToStack(finalState, ripemd160.hash(sha256.hash(value))) - ) + pushToStack(finalState, ripemd160.hash(sha256.hash(value))), + ), ); export const opHash256ChipLimits = @@ -169,7 +169,7 @@ export const opHash256ChipLimits = State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & AuthenticationProgramStateResourceLimitsBCHCHIPs & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { sha256, @@ -177,13 +177,13 @@ export const opHash256ChipLimits = sha256: { hash: Sha256['hash']; }; - } = { sha256: internalSha256 } + } = { sha256: internalSha256 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => incrementHashDigestIterations(nextState, value.length, (finalState) => - pushToStack(finalState, hash256(value, sha256)) - ) + pushToStack(finalState, hash256(value, sha256)), + ), ); export const opCheckSigChipLimits = @@ -197,7 +197,7 @@ export const opCheckSigChipLimits = verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ): Operation => (s: State) => // eslint-disable-next-line complexity @@ -205,34 +205,34 @@ export const opCheckSigChipLimits = if (!isValidPublicKeyEncoding(publicKey)) { return applyError( state, - AuthenticationErrorCommon.invalidPublicKeyEncoding + AuthenticationErrorCommon.invalidPublicKeyEncoding, ); } if ( !isValidSignatureEncodingBCHTransaction( bitcoinEncodedSignature, - SigningSerializationTypesBCH2023 + SigningSerializationTypesBCH2023, ) ) { return applyError( state, AuthenticationErrorCommon.invalidSignatureEncoding, `Transaction signature (including signing serialization type): ${binToHex( - bitcoinEncodedSignature - )}` + bitcoinEncodedSignature, + )}`, ); } const coveredBytecode = encodeAuthenticationInstructions( - state.instructions + state.instructions, ).subarray(state.lastCodeSeparator + 1); const { signingSerializationType, signature } = decodeBitcoinSignature( - bitcoinEncodedSignature + bitcoinEncodedSignature, ); const serialization = generateSigningSerializationBCH( state.program, { coveredBytecode, signingSerializationType }, - sha256 + sha256, ); const requiredTotalIterations = state.hashDigestIterations + hashDigestIterations(serialization.length); @@ -242,12 +242,12 @@ export const opCheckSigChipLimits = return applyError( state, AuthenticationErrorBCHCHIPs.excessiveHashing, - `Required cumulative iterations: ${requiredTotalIterations}` + `Required cumulative iterations: ${requiredTotalIterations}`, ); } const digest = hash256(serialization, sha256); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.signedMessages.push({ digest, serialization }); const useSchnorr = @@ -276,7 +276,7 @@ export const opCheckMultiSigChipLimits = secp256k1: { verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ) => (s: State) => useOneVmNumber(s, (state, publicKeysValue) => { @@ -285,13 +285,13 @@ export const opCheckMultiSigChipLimits = if (potentialPublicKeys < 0) { return applyError( state, - AuthenticationErrorCommon.invalidNaturalNumber + AuthenticationErrorCommon.invalidNaturalNumber, ); } if (potentialPublicKeys > Multisig.maximumPublicKeys) { return applyError( state, - AuthenticationErrorCommon.exceedsMaximumMultisigPublicKeyCount + AuthenticationErrorCommon.exceedsMaximumMultisigPublicKeyCount, ); } const publicKeys = @@ -307,14 +307,14 @@ export const opCheckMultiSigChipLimits = if (requiredApprovingPublicKeys < 0) { return applyError( nextState, - AuthenticationErrorCommon.invalidNaturalNumber + AuthenticationErrorCommon.invalidNaturalNumber, ); } if (requiredApprovingPublicKeys > potentialPublicKeys) { return applyError( nextState, - AuthenticationErrorCommon.insufficientPublicKeys + AuthenticationErrorCommon.insufficientPublicKeys, ); } @@ -331,18 +331,18 @@ export const opCheckMultiSigChipLimits = if (protocolBugValue.length !== 0) { return applyError( finalState, - AuthenticationErrorCommon.invalidProtocolBugValue + AuthenticationErrorCommon.invalidProtocolBugValue, ); } const coveredBytecode = encodeAuthenticationInstructions( - finalState.instructions + finalState.instructions, ).subarray(finalState.lastCodeSeparator + 1); let approvingPublicKeys = 0; // eslint-disable-line functional/no-let let remainingSignatures = signatures.length; // eslint-disable-line functional/no-let let remainingPublicKeys = publicKeys.length; // eslint-disable-line functional/no-let - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while ( remainingSignatures > 0 && remainingPublicKeys > 0 && @@ -359,22 +359,22 @@ export const opCheckMultiSigChipLimits = if (!isValidPublicKeyEncoding(publicKey)) { return applyError( finalState, - AuthenticationErrorCommon.invalidPublicKeyEncoding + AuthenticationErrorCommon.invalidPublicKeyEncoding, ); } if ( !isValidSignatureEncodingBCHTransaction( bitcoinEncodedSignature, - SigningSerializationTypesBCH2023 + SigningSerializationTypesBCH2023, ) ) { return applyError( finalState, AuthenticationErrorCommon.invalidSignatureEncoding, `Transaction signature (including signing serialization type): ${binToHex( - bitcoinEncodedSignature - )}` + bitcoinEncodedSignature, + )}`, ); } @@ -384,7 +384,7 @@ export const opCheckMultiSigChipLimits = const serialization = generateSigningSerializationBCH( state.program, { coveredBytecode, signingSerializationType }, - sha256 + sha256, ); const requiredTotalIterations = state.hashDigestIterations + @@ -396,12 +396,12 @@ export const opCheckMultiSigChipLimits = return applyError( state, AuthenticationErrorBCHCHIPs.excessiveHashing, - `Required cumulative iterations: ${requiredTotalIterations}` + `Required cumulative iterations: ${requiredTotalIterations}`, ); } const digest = hash256(serialization, sha256); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data finalState.signedMessages.push({ digest, serialization }); if ( @@ -409,22 +409,22 @@ export const opCheckMultiSigChipLimits = ) { return applyError( finalState, - AuthenticationErrorCommon.schnorrSizedSignatureInCheckMultiSig + AuthenticationErrorCommon.schnorrSizedSignatureInCheckMultiSig, ); } const signed = secp256k1.verifySignatureDERLowS( signature, publicKey, - digest + digest, ); - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (signed) { - approvingPublicKeys += 1; // eslint-disable-line functional/no-expression-statement - remainingSignatures -= 1; // eslint-disable-line functional/no-expression-statement + approvingPublicKeys += 1; // eslint-disable-line functional/no-expression-statements + remainingSignatures -= 1; // eslint-disable-line functional/no-expression-statements } - remainingPublicKeys -= 1; // eslint-disable-line functional/no-expression-statement + remainingPublicKeys -= 1; // eslint-disable-line functional/no-expression-statements } const success = @@ -436,19 +436,19 @@ export const opCheckMultiSigChipLimits = ) { return applyError( finalState, - AuthenticationErrorCommon.nonNullSignatureFailure + AuthenticationErrorCommon.nonNullSignatureFailure, ); } return pushToStack(finalState, booleanToVmNumber(success)); - } + }, ); - } + }, ); }); export const opCheckSigVerifyChipLimits = < - State extends AuthenticationProgramStateBCHCHIPs + State extends AuthenticationProgramStateBCHCHIPs, >( { secp256k1, @@ -459,15 +459,15 @@ export const opCheckSigVerifyChipLimits = < verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ): Operation => combineOperations( opCheckSigChipLimits({ secp256k1, sha256 }), - opVerify + opVerify, ); export const opCheckMultiSigVerifyChipLimits = < - State extends AuthenticationProgramStateBCHCHIPs + State extends AuthenticationProgramStateBCHCHIPs, >({ secp256k1, sha256, @@ -479,7 +479,7 @@ export const opCheckMultiSigVerifyChipLimits = < }): Operation => combineOperations( opCheckMultiSigChipLimits({ secp256k1, sha256 }), - opVerify + opVerify, ); export const opCheckDataSigChipLimits = @@ -487,7 +487,7 @@ export const opCheckDataSigChipLimits = State extends AuthenticationProgramStateError & AuthenticationProgramStateResourceLimitsBCHCHIPs & AuthenticationProgramStateSignatureAnalysis & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >({ secp256k1, sha256, @@ -505,13 +505,13 @@ export const opCheckDataSigChipLimits = return applyError( nextState, AuthenticationErrorCommon.invalidSignatureEncoding, - `Data signature: ${binToHex(signature)}` + `Data signature: ${binToHex(signature)}`, ); } if (!isValidPublicKeyEncoding(publicKey)) { return applyError( nextState, - AuthenticationErrorCommon.invalidPublicKeyEncoding + AuthenticationErrorCommon.invalidPublicKeyEncoding, ); } const requiredTotalIterations = @@ -522,12 +522,12 @@ export const opCheckDataSigChipLimits = return applyError( state, AuthenticationErrorBCHCHIPs.excessiveHashing, - `Required cumulative iterations: ${requiredTotalIterations}` + `Required cumulative iterations: ${requiredTotalIterations}`, ); } const digest = sha256.hash(message); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data nextState.signedMessages.push({ digest, message }); const useSchnorr = @@ -539,7 +539,7 @@ export const opCheckDataSigChipLimits = return !success && signature.length !== 0 ? applyError( nextState, - AuthenticationErrorCommon.nonNullSignatureFailure + AuthenticationErrorCommon.nonNullSignatureFailure, ) : pushToStack(nextState, booleanToVmNumber(success)); }); @@ -548,7 +548,7 @@ export const opCheckDataSigVerifyChipLimits = < State extends AuthenticationProgramStateError & AuthenticationProgramStateResourceLimitsBCHCHIPs & AuthenticationProgramStateSignatureAnalysis & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { secp256k1, @@ -559,9 +559,9 @@ export const opCheckDataSigVerifyChipLimits = < verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ) => combineOperations( opCheckDataSigChipLimits({ secp256k1, sha256 }), - opVerify + opVerify, ); diff --git a/src/lib/vm/instruction-sets/bch/chips/bch-chips-instruction-set.ts b/src/lib/vm/instruction-sets/bch/chips/bch-chips-instruction-set.ts index 3fb57b80..8503e3f7 100644 --- a/src/lib/vm/instruction-sets/bch/chips/bch-chips-instruction-set.ts +++ b/src/lib/vm/instruction-sets/bch/chips/bch-chips-instruction-set.ts @@ -187,7 +187,7 @@ export const createInstructionSetBCHCHIPs = ( secp256k1: internalSecp256k1, sha1: internalSha1, sha256: internalSha256, - } + }, ): InstructionSet< ResolvedTransactionBCH, AuthenticationProgramBCH, @@ -219,31 +219,31 @@ export const createInstructionSetBCHCHIPs = ( if (unlockingBytecode.length > ConsensusBCH.maximumBytecodeLength) { return applyError( initialState, - `The provided unlocking bytecode (${unlockingBytecode.length} bytes) exceeds the maximum bytecode length (${ConsensusBCH.maximumBytecodeLength} bytes).` + `The provided unlocking bytecode (${unlockingBytecode.length} bytes) exceeds the maximum bytecode length (${ConsensusBCH.maximumBytecodeLength} bytes).`, ); } if (authenticationInstructionsAreMalformed(unlockingInstructions)) { return applyError( initialState, - AuthenticationErrorCommon.malformedUnlockingBytecode + AuthenticationErrorCommon.malformedUnlockingBytecode, ); } if (!isPushOnly(unlockingBytecode)) { return applyError( initialState, - AuthenticationErrorCommon.requiresPushOnly + AuthenticationErrorCommon.requiresPushOnly, ); } if (lockingBytecode.length > ConsensusBCH.maximumBytecodeLength) { return applyError( initialState, - AuthenticationErrorCommon.exceededMaximumBytecodeLengthLocking + AuthenticationErrorCommon.exceededMaximumBytecodeLengthLocking, ); } if (authenticationInstructionsAreMalformed(lockingInstructions)) { return applyError( initialState, - AuthenticationErrorCommon.malformedLockingBytecode + AuthenticationErrorCommon.malformedLockingBytecode, ); } const unlockingResult = stateEvaluate(initialState); @@ -253,7 +253,7 @@ export const createInstructionSetBCHCHIPs = ( if (unlockingResult.controlStack.length !== 0) { return applyError( initialState, - AuthenticationErrorCommon.nonEmptyControlStack + AuthenticationErrorCommon.nonEmptyControlStack, ); } const lockingResult = stateEvaluate( @@ -261,7 +261,7 @@ export const createInstructionSetBCHCHIPs = ( instructions: lockingInstructions, program, stack: unlockingResult.stack, - }) + }), ); if (!isPayToScriptHash20(lockingBytecode)) { return lockingResult; @@ -285,7 +285,7 @@ export const createInstructionSetBCHCHIPs = ( instructions: p2shInstructions, program, stack: p2shStack, - }) + }), ); }, every: (state) => { @@ -295,7 +295,7 @@ export const createInstructionSetBCHCHIPs = ( ) { return applyError( state, - AuthenticationErrorCommon.exceededMaximumStackDepth + AuthenticationErrorCommon.exceededMaximumStackDepth, ); } return state; @@ -381,58 +381,58 @@ export const createInstructionSetBCHCHIPs = ( [OpcodesBCHCHIPs.OP_PUSHDATA_2]: conditionallyPush, [OpcodesBCHCHIPs.OP_PUSHDATA_4]: conditionallyPush, [OpcodesBCHCHIPs.OP_1NEGATE]: conditionallyEvaluateChipLoops( - pushNumberOperation(-1) + pushNumberOperation(-1), ), [OpcodesBCHCHIPs.OP_RESERVED]: conditionallyEvaluateChipLoops(reservedOperation), [OpcodesBCHCHIPs.OP_1]: conditionallyEvaluateChipLoops( - pushNumberOperation(1) + pushNumberOperation(1), ), /* eslint-disable @typescript-eslint/no-magic-numbers */ [OpcodesBCHCHIPs.OP_2]: conditionallyEvaluateChipLoops( - pushNumberOperation(2) + pushNumberOperation(2), ), [OpcodesBCHCHIPs.OP_3]: conditionallyEvaluateChipLoops( - pushNumberOperation(3) + pushNumberOperation(3), ), [OpcodesBCHCHIPs.OP_4]: conditionallyEvaluateChipLoops( - pushNumberOperation(4) + pushNumberOperation(4), ), [OpcodesBCHCHIPs.OP_5]: conditionallyEvaluateChipLoops( - pushNumberOperation(5) + pushNumberOperation(5), ), [OpcodesBCHCHIPs.OP_6]: conditionallyEvaluateChipLoops( - pushNumberOperation(6) + pushNumberOperation(6), ), [OpcodesBCHCHIPs.OP_7]: conditionallyEvaluateChipLoops( - pushNumberOperation(7) + pushNumberOperation(7), ), [OpcodesBCHCHIPs.OP_8]: conditionallyEvaluateChipLoops( - pushNumberOperation(8) + pushNumberOperation(8), ), [OpcodesBCHCHIPs.OP_9]: conditionallyEvaluateChipLoops( - pushNumberOperation(9) + pushNumberOperation(9), ), [OpcodesBCHCHIPs.OP_10]: conditionallyEvaluateChipLoops( - pushNumberOperation(10) + pushNumberOperation(10), ), [OpcodesBCHCHIPs.OP_11]: conditionallyEvaluateChipLoops( - pushNumberOperation(11) + pushNumberOperation(11), ), [OpcodesBCHCHIPs.OP_12]: conditionallyEvaluateChipLoops( - pushNumberOperation(12) + pushNumberOperation(12), ), [OpcodesBCHCHIPs.OP_13]: conditionallyEvaluateChipLoops( - pushNumberOperation(13) + pushNumberOperation(13), ), [OpcodesBCHCHIPs.OP_14]: conditionallyEvaluateChipLoops( - pushNumberOperation(14) + pushNumberOperation(14), ), [OpcodesBCHCHIPs.OP_15]: conditionallyEvaluateChipLoops( - pushNumberOperation(15) + pushNumberOperation(15), ), [OpcodesBCHCHIPs.OP_16]: conditionallyEvaluateChipLoops( - pushNumberOperation(16) + pushNumberOperation(16), ), /* eslint-enable @typescript-eslint/no-magic-numbers */ @@ -518,33 +518,33 @@ export const createInstructionSetBCHCHIPs = ( [OpcodesBCHCHIPs.OP_MAX]: conditionallyEvaluateChipLoops(opMax), [OpcodesBCHCHIPs.OP_WITHIN]: conditionallyEvaluateChipLoops(opWithin), [OpcodesBCHCHIPs.OP_RIPEMD160]: conditionallyEvaluateChipLoops( - opRipemd160({ ripemd160 }) + opRipemd160({ ripemd160 }), ), [OpcodesBCHCHIPs.OP_SHA1]: conditionallyEvaluateChipLoops( - opSha1({ sha1 }) + opSha1({ sha1 }), ), [OpcodesBCHCHIPs.OP_SHA256]: conditionallyEvaluateChipLoops( - opSha256({ sha256 }) + opSha256({ sha256 }), ), [OpcodesBCHCHIPs.OP_HASH160]: conditionallyEvaluateChipLoops( - opHash160({ ripemd160, sha256 }) + opHash160({ ripemd160, sha256 }), ), [OpcodesBCHCHIPs.OP_HASH256]: conditionallyEvaluateChipLoops( - opHash256({ sha256 }) + opHash256({ sha256 }), ), [OpcodesBCHCHIPs.OP_CODESEPARATOR]: conditionallyEvaluateChipLoops(opCodeSeparator), [OpcodesBCHCHIPs.OP_CHECKSIG]: conditionallyEvaluateChipLoops( - opCheckSigChipLimits({ secp256k1, sha256 }) + opCheckSigChipLimits({ secp256k1, sha256 }), ), [OpcodesBCHCHIPs.OP_CHECKSIGVERIFY]: conditionallyEvaluateChipLoops( - opCheckSigVerifyChipLimits({ secp256k1, sha256 }) + opCheckSigVerifyChipLimits({ secp256k1, sha256 }), ), [OpcodesBCHCHIPs.OP_CHECKMULTISIG]: conditionallyEvaluateChipLoops( - opCheckMultiSigChipLimits({ secp256k1, sha256 }) + opCheckMultiSigChipLimits({ secp256k1, sha256 }), ), [OpcodesBCHCHIPs.OP_CHECKMULTISIGVERIFY]: conditionallyEvaluateChipLoops( - opCheckMultiSigVerifyChipLimits({ secp256k1, sha256 }) + opCheckMultiSigVerifyChipLimits({ secp256k1, sha256 }), ), ...(standard ? { @@ -584,10 +584,10 @@ export const createInstructionSetBCHCHIPs = ( [OpcodesBCHCHIPs.OP_NOP10]: conditionallyEvaluateChipLoops(opNop), }), [OpcodesBCHCHIPs.OP_CHECKDATASIG]: conditionallyEvaluateChipLoops( - opCheckDataSig({ secp256k1, sha256 }) + opCheckDataSig({ secp256k1, sha256 }), ), [OpcodesBCHCHIPs.OP_CHECKDATASIGVERIFY]: conditionallyEvaluateChipLoops( - opCheckDataSigVerify({ secp256k1, sha256 }) + opCheckDataSigVerify({ secp256k1, sha256 }), ), [OpcodesBCHCHIPs.OP_REVERSEBYTES]: conditionallyEvaluateChipLoops(opReverseBytes), @@ -614,7 +614,7 @@ export const createInstructionSetBCHCHIPs = ( [OpcodesBCHCHIPs.OP_INPUTBYTECODE]: conditionallyEvaluateChipLoops(opInputBytecode), [OpcodesBCHCHIPs.OP_INPUTSEQUENCENUMBER]: conditionallyEvaluateChipLoops( - opInputSequenceNumber + opInputSequenceNumber, ), [OpcodesBCHCHIPs.OP_OUTPUTVALUE]: conditionallyEvaluateChipLoops(opOutputValue), @@ -623,12 +623,12 @@ export const createInstructionSetBCHCHIPs = ( [OpcodesBCHCHIPs.OP_UTXOTOKENCATEGORY]: conditionallyEvaluateChipLoops(opUtxoTokenCategory), [OpcodesBCHCHIPs.OP_UTXOTOKENCOMMITMENT]: conditionallyEvaluateChipLoops( - opUtxoTokenCommitment + opUtxoTokenCommitment, ), [OpcodesBCHCHIPs.OP_UTXOTOKENAMOUNT]: conditionallyEvaluateChipLoops(opUtxoTokenAmount), [OpcodesBCHCHIPs.OP_OUTPUTTOKENCATEGORY]: conditionallyEvaluateChipLoops( - opOutputTokenCategory + opOutputTokenCategory, ), [OpcodesBCHCHIPs.OP_OUTPUTTOKENCOMMITMENT]: conditionallyEvaluateChipLoops(opOutputTokenCommitment), @@ -683,7 +683,7 @@ export const createInstructionSetBCHCHIPs = ( return `Transaction exceeds maximum standard size: this transaction is ${transactionSize} bytes, but the maximum standard transaction size is ${ConsensusBCH.maximumStandardTransactionSize} bytes.`; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, output] of sourceOutputs.entries()) { if (!isStandardOutputBytecode(output.lockingBytecode)) { return `Standard transactions may only spend standard output types, but source output ${index} is non-standard.`; @@ -692,15 +692,15 @@ export const createInstructionSetBCHCHIPs = ( // eslint-disable-next-line functional/no-let let totalArbitraryDataBytes = 0; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, output] of transaction.outputs.entries()) { if (!isStandardOutputBytecode(output.lockingBytecode)) { return `Standard transactions may only create standard output types, but transaction output ${index} is non-standard.`; } - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (isArbitraryDataOutput(output.lockingBytecode)) { - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements totalArbitraryDataBytes += output.lockingBytecode.length + 1; } /* @@ -714,7 +714,7 @@ export const createInstructionSetBCHCHIPs = ( return `Standard transactions may carry no more than ${ConsensusBCH.maximumDataCarrierBytes} bytes in arbitrary data outputs; this transaction includes ${totalArbitraryDataBytes} bytes of arbitrary data.`; } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const [index, input] of transaction.inputs.entries()) { if ( input.unlockingBytecode.length > @@ -728,7 +728,7 @@ export const createInstructionSetBCHCHIPs = ( } } - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements for (const index of transaction.inputs.keys()) { const state = evaluate({ inputIndex: index, diff --git a/src/lib/vm/instruction-sets/bch/chips/bch-chips-loops.ts b/src/lib/vm/instruction-sets/bch/chips/bch-chips-loops.ts index 5eb82fe7..6e312db2 100644 --- a/src/lib/vm/instruction-sets/bch/chips/bch-chips-loops.ts +++ b/src/lib/vm/instruction-sets/bch/chips/bch-chips-loops.ts @@ -21,9 +21,9 @@ import { import { AuthenticationErrorBCHCHIPs } from './bch-chips-errors.js'; const executionIsActive = < - State extends AuthenticationProgramStateControlStackCHIPs + State extends AuthenticationProgramStateControlStackCHIPs, >( - state: State + state: State, ) => state.controlStack.every((item) => item !== false); /** @@ -32,7 +32,7 @@ const executionIsActive = < */ export const conditionallyEvaluateChipLoops = ( - operation: Operation + operation: Operation, ): Operation => (state: State) => executionIsActive(state) ? operation(state) : state; @@ -40,10 +40,10 @@ export const conditionallyEvaluateChipLoops = export const undefinedOperationChipLoops = conditionallyEvaluateChipLoops( < State extends AuthenticationProgramStateControlStackCHIPs & - AuthenticationProgramStateError + AuthenticationProgramStateError, >( - state: State - ) => applyError(state, AuthenticationErrorCommon.unknownOpcode) + state: State, + ) => applyError(state, AuthenticationErrorCommon.unknownOpcode), ); export const pushOperationChipLoops = @@ -51,9 +51,9 @@ export const pushOperationChipLoops = State extends AuthenticationProgramStateControlStackCHIPs & AuthenticationProgramStateError & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - maximumPushSize = ConsensusCommon.maximumStackItemLength + maximumPushSize = ConsensusCommon.maximumStackItemLength as number, ): Operation => (state: State) => { const instruction = state.instructions[ @@ -62,13 +62,13 @@ export const pushOperationChipLoops = return instruction.data.length > maximumPushSize ? applyError( state, - `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${instruction.data.length} bytes.` + `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${instruction.data.length} bytes.`, ) : executionIsActive(state) - ? isMinimalDataPush(instruction.opcode, instruction.data) - ? pushToStack(state, instruction.data) - : applyError(state, AuthenticationErrorCommon.nonMinimalPush) - : state; + ? isMinimalDataPush(instruction.opcode, instruction.data) + ? pushToStack(state, instruction.data) + : applyError(state, AuthenticationErrorCommon.nonMinimalPush) + : state; }; /** @@ -77,12 +77,12 @@ export const pushOperationChipLoops = * @param data - the value to push to the stack */ export const pushToControlStackChipLoops = < - State extends AuthenticationProgramStateControlStackCHIPs + State extends AuthenticationProgramStateControlStackCHIPs, >( state: State, - value: boolean | number + value: boolean | number, ) => { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.controlStack.push(value); return state; }; @@ -90,13 +90,13 @@ export const pushToControlStackChipLoops = < export const opIfChipLoops = < State extends AuthenticationProgramStateControlStackCHIPs & AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => { if (executionIsActive(state)) { return useOneStackItem(state, (nextState, [item]) => - pushToControlStackChipLoops(nextState, stackItemIsTruthy(item)) + pushToControlStackChipLoops(nextState, stackItemIsTruthy(item)), ); } return pushToControlStackChipLoops(state, false); @@ -105,13 +105,13 @@ export const opIfChipLoops = < export const opNotIfChipLoops = < State extends AuthenticationProgramStateControlStackCHIPs & AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => { if (executionIsActive(state)) { return useOneStackItem(state, (nextState, [item]) => - pushToControlStackChipLoops(nextState, !stackItemIsTruthy(item)) + pushToControlStackChipLoops(nextState, !stackItemIsTruthy(item)), ); } return pushToControlStackChipLoops(state, false); @@ -119,9 +119,9 @@ export const opNotIfChipLoops = < export const opEndIfChipLoops = < State extends AuthenticationProgramStateControlStackCHIPs & - AuthenticationProgramStateError + AuthenticationProgramStateError, >( - state: State + state: State, ) => { // eslint-disable-next-line functional/immutable-data const element = state.controlStack.pop(); @@ -133,37 +133,37 @@ export const opEndIfChipLoops = < export const opElseChipLoops = < State extends AuthenticationProgramStateControlStackCHIPs & - AuthenticationProgramStateError + AuthenticationProgramStateError, >( - state: State + state: State, ) => { const top = state.controlStack[state.controlStack.length - 1]; if (typeof top !== 'boolean') { return applyError(state, AuthenticationErrorCommon.unexpectedElse); } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.controlStack[state.controlStack.length - 1] = !top; return state; }; export const opBegin = ( - state: State + state: State, ) => pushToControlStackChipLoops(state, state.ip); export const opUntil = ( - state: State + state: State, ) => { // eslint-disable-next-line functional/immutable-data const controlValue = state.controlStack.pop(); if (typeof controlValue !== 'number') { return applyError(state, AuthenticationErrorBCHCHIPs.unexpectedUntil); } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.repeatedBytes += encodeAuthenticationInstructions( - state.instructions.slice(controlValue, state.ip) + state.instructions.slice(controlValue, state.ip), ).length; const activeBytecodeLength = encodeAuthenticationInstructions( - state.instructions + state.instructions, ).length; if ( state.repeatedBytes + activeBytecodeLength > @@ -172,14 +172,14 @@ export const opUntil = ( return applyError( state, AuthenticationErrorBCHCHIPs.excessiveLooping, - `Repeated bytes: ${state.repeatedBytes}; active bytecode length: ${activeBytecodeLength}` + `Repeated bytes: ${state.repeatedBytes}; active bytecode length: ${activeBytecodeLength}`, ); } return useOneStackItem(state, (nextState, [item]) => { if (item.length === 1 && item[0] === 1) { return nextState; } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data nextState.ip = controlValue - 1; return nextState; }); diff --git a/src/lib/vm/instruction-sets/bch/chips/bch-chips-types.ts b/src/lib/vm/instruction-sets/bch/chips/bch-chips-types.ts index 19f9a52e..68e502bc 100644 --- a/src/lib/vm/instruction-sets/bch/chips/bch-chips-types.ts +++ b/src/lib/vm/instruction-sets/bch/chips/bch-chips-types.ts @@ -31,7 +31,7 @@ export enum ConsensusBCHCHIPs { export type AuthenticationProgramStateControlStackCHIPs = AuthenticationProgramStateControlStack; -export interface AuthenticationProgramStateResourceLimitsBCHCHIPs { +export type AuthenticationProgramStateResourceLimitsBCHCHIPs = { /** * An unsigned integer counter used by `OP_UNTIL` to prevent excessive use of * loops. @@ -42,18 +42,18 @@ export interface AuthenticationProgramStateResourceLimitsBCHCHIPs { * iterations that required during this evaluation. */ hashDigestIterations: number; -} +}; -export interface AuthenticationProgramStateBCHCHIPs - extends AuthenticationProgramStateMinimum, - AuthenticationProgramStateStack, - AuthenticationProgramStateAlternateStack, - AuthenticationProgramStateControlStackCHIPs, - AuthenticationProgramStateError, - AuthenticationProgramStateCodeSeparator, - AuthenticationProgramStateSignatureAnalysis, - AuthenticationProgramStateTransactionContext, - AuthenticationProgramStateResourceLimitsBCHCHIPs {} +export type AuthenticationProgramStateBCHCHIPs = + AuthenticationProgramStateAlternateStack & + AuthenticationProgramStateCodeSeparator & + AuthenticationProgramStateControlStackCHIPs & + AuthenticationProgramStateError & + AuthenticationProgramStateMinimum & + AuthenticationProgramStateResourceLimitsBCHCHIPs & + AuthenticationProgramStateSignatureAnalysis & + AuthenticationProgramStateStack & + AuthenticationProgramStateTransactionContext; export type AuthenticationVirtualMachineBCHCHIPs = AuthenticationVirtualMachine< ResolvedTransactionBCH, @@ -61,10 +61,13 @@ export type AuthenticationVirtualMachineBCHCHIPs = AuthenticationVirtualMachine< AuthenticationProgramStateBCHCHIPs >; +/** + * @deprecated use `structuredClone` instead + */ export const cloneAuthenticationProgramStateBCHCHIPs = < - State extends AuthenticationProgramStateBCHCHIPs + State extends AuthenticationProgramStateBCHCHIPs, >( - state: Readonly + state: State, ) => ({ ...(state.error === undefined ? {} : { error: state.error }), alternateStack: cloneStack(state.alternateStack), @@ -89,8 +92,8 @@ export const createAuthenticationProgramStateBCHCHIPs = ({ instructions, stack, }: { - program: Readonly; - instructions: readonly AuthenticationInstruction[]; + program: AuthenticationProgramCommon; + instructions: AuthenticationInstruction[]; stack: Uint8Array[]; }): AuthenticationProgramStateBCHCHIPs => ({ alternateStack: [], diff --git a/src/lib/vm/instruction-sets/btc/btc-types.ts b/src/lib/vm/instruction-sets/btc/btc-types.ts index 44a4e740..c24cada7 100644 --- a/src/lib/vm/instruction-sets/btc/btc-types.ts +++ b/src/lib/vm/instruction-sets/btc/btc-types.ts @@ -1,9 +1,8 @@ import type { AuthenticationProgramStateCommon } from '../../../lib.js'; -export interface SegWitState { - readonly witnessBytecode: Uint8Array; -} +export type SegWitState = { + witnessBytecode: Uint8Array; +}; -export interface AuthenticationProgramStateBTC - extends AuthenticationProgramStateCommon, - SegWitState {} +export type AuthenticationProgramStateBTC = AuthenticationProgramStateCommon & + SegWitState; diff --git a/src/lib/vm/instruction-sets/common/arithmetic.ts b/src/lib/vm/instruction-sets/common/arithmetic.ts index 2577f40d..5f8c2a10 100644 --- a/src/lib/vm/instruction-sets/common/arithmetic.ts +++ b/src/lib/vm/instruction-sets/common/arithmetic.ts @@ -20,247 +20,247 @@ import { export const op1Add = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, [value]) => - pushToStackVmNumberChecked(nextState, value + 1n) + pushToStackVmNumberChecked(nextState, value + 1n), ); export const op1Sub = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, [value]) => - pushToStack(nextState, bigIntToVmNumber(value - 1n)) + pushToStack(nextState, bigIntToVmNumber(value - 1n)), ); export const opNegate = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, [value]) => - pushToStack(nextState, bigIntToVmNumber(-value)) + pushToStack(nextState, bigIntToVmNumber(-value)), ); export const opAbs = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, [value]) => - pushToStack(nextState, bigIntToVmNumber(value < 0 ? -value : value)) + pushToStack(nextState, bigIntToVmNumber(value < 0 ? -value : value)), ); export const opNot = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, [value]) => pushToStack( nextState, - value === 0n ? bigIntToVmNumber(1n) : bigIntToVmNumber(0n) - ) + value === 0n ? bigIntToVmNumber(1n) : bigIntToVmNumber(0n), + ), ); export const op0NotEqual = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, [value]) => pushToStack( nextState, - value === 0n ? bigIntToVmNumber(0n) : bigIntToVmNumber(1n) - ) + value === 0n ? bigIntToVmNumber(0n) : bigIntToVmNumber(1n), + ), ); export const opAdd = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStackVmNumberChecked(nextState, firstValue + secondValue) + pushToStackVmNumberChecked(nextState, firstValue + secondValue), ); export const opSub = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStack(nextState, bigIntToVmNumber(firstValue - secondValue)) + pushToStack(nextState, bigIntToVmNumber(firstValue - secondValue)), ); export const opBoolAnd = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => pushToStack( nextState, - booleanToVmNumber(firstValue !== 0n && secondValue !== 0n) - ) + booleanToVmNumber(firstValue !== 0n && secondValue !== 0n), + ), ); export const opBoolOr = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => pushToStack( nextState, - booleanToVmNumber(firstValue !== 0n || secondValue !== 0n) - ) + booleanToVmNumber(firstValue !== 0n || secondValue !== 0n), + ), ); export const opNumEqual = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToVmNumber(firstValue === secondValue)) + pushToStack(nextState, booleanToVmNumber(firstValue === secondValue)), ); export const opNumEqualVerify = combineOperations(opNumEqual, opVerify); export const opNumNotEqual = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToVmNumber(firstValue !== secondValue)) + pushToStack(nextState, booleanToVmNumber(firstValue !== secondValue)), ); export const opLessThan = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToVmNumber(firstValue < secondValue)) + pushToStack(nextState, booleanToVmNumber(firstValue < secondValue)), ); export const opLessThanOrEqual = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToVmNumber(firstValue <= secondValue)) + pushToStack(nextState, booleanToVmNumber(firstValue <= secondValue)), ); export const opGreaterThan = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToVmNumber(firstValue > secondValue)) + pushToStack(nextState, booleanToVmNumber(firstValue > secondValue)), ); export const opGreaterThanOrEqual = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStack(nextState, booleanToVmNumber(firstValue >= secondValue)) + pushToStack(nextState, booleanToVmNumber(firstValue >= secondValue)), ); export const opMin = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => pushToStack( nextState, - bigIntToVmNumber(firstValue < secondValue ? firstValue : secondValue) - ) + bigIntToVmNumber(firstValue < secondValue ? firstValue : secondValue), + ), ); export const opMax = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => pushToStack( nextState, - bigIntToVmNumber(firstValue > secondValue ? firstValue : secondValue) - ) + bigIntToVmNumber(firstValue > secondValue ? firstValue : secondValue), + ), ); export const opWithin = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useThreeVmNumbers(state, (nextState, [firstValue, secondValue, thirdValue]) => pushToStack( nextState, - booleanToVmNumber(secondValue <= firstValue && firstValue < thirdValue) - ) + booleanToVmNumber(secondValue <= firstValue && firstValue < thirdValue), + ), ); export const opMul = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => - pushToStackVmNumberChecked(nextState, firstValue * secondValue) + pushToStackVmNumberChecked(nextState, firstValue * secondValue), ); export const opDiv = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => secondValue === 0n ? applyError(nextState, AuthenticationErrorCommon.divisionByZero) - : pushToStack(nextState, bigIntToVmNumber(firstValue / secondValue)) + : pushToStack(nextState, bigIntToVmNumber(firstValue / secondValue)), ); export const opMod = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers(state, (nextState, [firstValue, secondValue]) => secondValue === 0n ? applyError(nextState, AuthenticationErrorCommon.divisionByZero) - : pushToStack(nextState, bigIntToVmNumber(firstValue % secondValue)) + : pushToStack(nextState, bigIntToVmNumber(firstValue % secondValue)), ); diff --git a/src/lib/vm/instruction-sets/common/bitwise.ts b/src/lib/vm/instruction-sets/common/bitwise.ts index ee46a9ba..64a2c9de 100644 --- a/src/lib/vm/instruction-sets/common/bitwise.ts +++ b/src/lib/vm/instruction-sets/common/bitwise.ts @@ -16,12 +16,12 @@ import { booleanToVmNumber } from './instruction-sets-utils.js'; export const opEqual = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoStackItems(state, (nextState, [element1, element2]) => - pushToStack(nextState, booleanToVmNumber(binsAreEqual(element1, element2))) + pushToStack(nextState, booleanToVmNumber(binsAreEqual(element1, element2))), ); export const opEqualVerify = combineOperations(opEqual, opVerify); @@ -29,9 +29,9 @@ export const opEqualVerify = combineOperations(opEqual, opVerify); export const bitwiseOperation = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - combine: (a: Uint8Array, b: Uint8Array) => Uint8Array + combine: (a: Uint8Array, b: Uint8Array) => Uint8Array, ): Operation => (state: State) => useTwoStackItems(state, (nextState, [a, b]) => @@ -39,30 +39,30 @@ export const bitwiseOperation = ? pushToStack(nextState, combine(a, b)) : applyError( nextState, - AuthenticationErrorCommon.mismatchedBitwiseOperandLength - ) + AuthenticationErrorCommon.mismatchedBitwiseOperandLength, + ), ); // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion export const opAnd = bitwiseOperation((a, b) => a.map((v, i) => v & b[i]!)) as < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => State; // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion export const opOr = bitwiseOperation((a, b) => a.map((v, i) => v | b[i]!)) as < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => State; // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion export const opXor = bitwiseOperation((a, b) => a.map((v, i) => v ^ b[i]!)) as < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => State; diff --git a/src/lib/vm/instruction-sets/common/combinators.ts b/src/lib/vm/instruction-sets/common/combinators.ts index 4b3f3dda..285a8418 100644 --- a/src/lib/vm/instruction-sets/common/combinators.ts +++ b/src/lib/vm/instruction-sets/common/combinators.ts @@ -16,18 +16,18 @@ import { export const incrementOperationCount = ( - operation: Operation + operation: Operation, ): Operation => (state: State) => { const nextState = operation(state); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data nextState.operationCount += 1; return nextState; }; export const conditionallyEvaluate = ( - operation: Operation + operation: Operation, ): Operation => (state: State) => state.controlStack.every((item) => item) ? operation(state) : state; @@ -41,7 +41,7 @@ export const conditionallyEvaluate = */ export const mapOverOperations = ( combinators: ((operation: Operation) => Operation)[], - operationMap: InstructionSetOperationMapping + operationMap: InstructionSetOperationMapping, ) => Object.keys(operationMap).reduce>( (result, opcode) => ({ @@ -49,10 +49,10 @@ export const mapOverOperations = ( [opcode]: combinators.reduce>( (op, combinator) => combinator(op), // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - operationMap[Number(opcode)]! + operationMap[Number(opcode)]!, ), }), - {} + {}, ); /** @@ -60,10 +60,10 @@ export const mapOverOperations = ( */ export const useOneStackItem = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, - operation: (nextState: State, [value]: [Uint8Array]) => State + operation: (nextState: State, [value]: [Uint8Array]) => State, ) => { // eslint-disable-next-line functional/immutable-data const item = state.stack.pop(); @@ -75,39 +75,39 @@ export const useOneStackItem = < export const useTwoStackItems = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, operation: ( nextState: State, - [valueTop, valueTwo]: [Uint8Array, Uint8Array] - ) => State + [valueTop, valueTwo]: [Uint8Array, Uint8Array], + ) => State, ) => useOneStackItem(state, (nextState, [valueTwo]) => useOneStackItem(nextState, (lastState, [valueTop]) => - operation(lastState, [valueTop, valueTwo]) - ) + operation(lastState, [valueTop, valueTwo]), + ), ); export const useThreeStackItems = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, operation: ( nextState: State, - [valueTop, valueTwo, valueThree]: [Uint8Array, Uint8Array, Uint8Array] - ) => State + [valueTop, valueTwo, valueThree]: [Uint8Array, Uint8Array, Uint8Array], + ) => State, ) => useOneStackItem(state, (nextState, [valueThree]) => useTwoStackItems(nextState, (lastState, [valueTop, valueTwo]) => - operation(lastState, [valueTop, valueTwo, valueThree]) - ) + operation(lastState, [valueTop, valueTwo, valueThree]), + ), ); export const useFourStackItems = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, operation: ( @@ -116,19 +116,19 @@ export const useFourStackItems = < Uint8Array, Uint8Array, Uint8Array, - Uint8Array - ] - ) => State + Uint8Array, + ], + ) => State, ) => useTwoStackItems(state, (nextState, [valueThree, valueFour]) => useTwoStackItems(nextState, (lastState, [valueTop, valueTwo]) => - operation(lastState, [valueTop, valueTwo, valueThree, valueFour]) - ) + operation(lastState, [valueTop, valueTwo, valueThree, valueFour]), + ), ); export const useSixStackItems = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, operation: ( @@ -139,9 +139,9 @@ export const useSixStackItems = < Uint8Array, Uint8Array, Uint8Array, - Uint8Array - ] - ) => State + Uint8Array, + ], + ) => State, ) => useFourStackItems( state, @@ -154,15 +154,15 @@ export const useSixStackItems = < valueFour, valueFive, valueSix, - ]) - ) + ]), + ), ); const typicalMaximumVmNumberByteLength = 8; export const useOneVmNumber = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, operation: (nextState: State, [value]: [bigint]) => State, @@ -175,7 +175,7 @@ export const useOneVmNumber = < } = { maximumVmNumberByteLength: typicalMaximumVmNumberByteLength, requireMinimalEncoding: true, - } + }, ) => useOneStackItem(state, (nextState, [item]) => { const value = vmNumberToBigInt(item, { @@ -190,12 +190,12 @@ export const useOneVmNumber = < export const useTwoVmNumbers = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, operation: ( nextState: State, - [firstValue, secondValue]: [bigint, bigint] + [firstValue, secondValue]: [bigint, bigint], ) => State, { maximumVmNumberByteLength = typicalMaximumVmNumberByteLength, @@ -206,7 +206,7 @@ export const useTwoVmNumbers = < } = { maximumVmNumberByteLength: typicalMaximumVmNumberByteLength, requireMinimalEncoding: true, - } + }, ) => useOneVmNumber( state, @@ -218,22 +218,22 @@ export const useTwoVmNumbers = < { maximumVmNumberByteLength, requireMinimalEncoding, - } + }, ), { maximumVmNumberByteLength, requireMinimalEncoding, - } + }, ); export const useThreeVmNumbers = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, operation: ( nextState: State, - [firstValue, secondValue, thirdValue]: [bigint, bigint, bigint] + [firstValue, secondValue, thirdValue]: [bigint, bigint, bigint], ) => State, { maximumVmNumberByteLength = typicalMaximumVmNumberByteLength, @@ -244,7 +244,7 @@ export const useThreeVmNumbers = < } = { maximumVmNumberByteLength: typicalMaximumVmNumberByteLength, requireMinimalEncoding: true, - } + }, ) => useTwoVmNumbers( state, @@ -256,12 +256,12 @@ export const useThreeVmNumbers = < { maximumVmNumberByteLength, requireMinimalEncoding, - } + }, ), { maximumVmNumberByteLength, requireMinimalEncoding, - } + }, ); /** @@ -271,9 +271,10 @@ export const useThreeVmNumbers = < */ export const pushToStack = ( state: State, + // eslint-disable-next-line functional/functional-parameters ...data: Uint8Array[] ) => { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.stack.push(...data); return state; }; @@ -286,19 +287,19 @@ export const pushToStack = ( */ export const pushToStackChecked = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, item: Uint8Array, - maximumLength = ConsensusCommon.maximumStackItemLength + maximumLength = ConsensusCommon.maximumStackItemLength as number, ) => { if (item.length > maximumLength) { return applyError( state, - `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${item.length} bytes.` + `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${item.length} bytes.`, ); } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.stack.push(item); return state; }; @@ -310,10 +311,10 @@ export const pushToStackChecked = < */ export const pushToStackVmNumber = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, - vmNumber: bigint + vmNumber: bigint, ) => pushToStack(state, bigIntToVmNumber(vmNumber)); /** @@ -324,13 +325,13 @@ export const pushToStackVmNumber = < */ export const pushToStackVmNumberChecked = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, vmNumber: bigint, minVmNumber = BigInt(ConsensusCommon.minVmNumber), - maxVmNumber = BigInt(ConsensusCommon.maxVmNumber) - // eslint-disable-next-line max-params + maxVmNumber = BigInt(ConsensusCommon.maxVmNumber), + // eslint-disable-next-line @typescript-eslint/max-params ) => { if (vmNumber > maxVmNumber || vmNumber < minVmNumber) { return applyError(state, AuthenticationErrorCommon.overflowsVmNumberRange); @@ -341,7 +342,7 @@ export const pushToStackVmNumberChecked = < export const combineOperations = ( firstOperation: Operation, - secondOperation: Operation + secondOperation: Operation, ) => (state: State) => secondOperation(firstOperation(state)); diff --git a/src/lib/vm/instruction-sets/common/common-types.ts b/src/lib/vm/instruction-sets/common/common-types.ts index fea0288d..95ce890d 100644 --- a/src/lib/vm/instruction-sets/common/common-types.ts +++ b/src/lib/vm/instruction-sets/common/common-types.ts @@ -24,19 +24,19 @@ import { cloneAuthenticationInstruction } from './instruction-sets-utils.js'; export const undefinedOperation = conditionallyEvaluate( < State extends AuthenticationProgramStateControlStack & - AuthenticationProgramStateError + AuthenticationProgramStateError, >( - state: State - ) => applyError(state, AuthenticationErrorCommon.unknownOpcode) + state: State, + ) => applyError(state, AuthenticationErrorCommon.unknownOpcode), ); export const checkLimitsCommon = < State extends AuthenticationProgramStateAlternateStack & AuthenticationProgramStateError & - AuthenticationProgramStateStack & { operationCount: number } + AuthenticationProgramStateStack & { operationCount: number }, >( - operation: Operation + operation: Operation, ): Operation => (state: State) => { const nextState = operation(state); @@ -44,17 +44,20 @@ export const checkLimitsCommon = ConsensusCommon.maximumStackDepth ? applyError( nextState, - AuthenticationErrorCommon.exceededMaximumStackDepth + AuthenticationErrorCommon.exceededMaximumStackDepth, ) : nextState.operationCount > ConsensusCommon.maximumOperationCount - ? applyError( - nextState, - AuthenticationErrorCommon.exceededMaximumOperationCount - ) - : nextState; + ? applyError( + nextState, + AuthenticationErrorCommon.exceededMaximumOperationCount, + ) + : nextState; }; -export const cloneStack = (stack: readonly Readonly[]) => +/** + * @deprecated use `structuredClone` instead + */ +export const cloneStack = (stack: Uint8Array[]) => stack.map((item) => item.slice()); export const createAuthenticationProgramStateCommon = ({ @@ -62,8 +65,8 @@ export const createAuthenticationProgramStateCommon = ({ instructions, stack, }: { - program: Readonly; - instructions: readonly AuthenticationInstruction[]; + program: AuthenticationProgramCommon; + instructions: AuthenticationInstruction[]; stack: Uint8Array[]; }): AuthenticationProgramStateCommon => ({ alternateStack: [], @@ -78,20 +81,26 @@ export const createAuthenticationProgramStateCommon = ({ stack, }); +/** + * @deprecated use `structuredClone` instead + */ export const cloneAuthenticationProgramCommon = < - Program extends AuthenticationProgramCommon + Program extends AuthenticationProgramCommon, >( - program: Readonly + program: Program, ) => ({ inputIndex: program.inputIndex, sourceOutputs: cloneTransactionOutputsCommon(program.sourceOutputs), transaction: cloneTransactionCommon(program.transaction), }); +/** + * @deprecated use `structuredClone` instead + */ export const cloneAuthenticationProgramStateCommon = < - State extends AuthenticationProgramStateCommon + State extends AuthenticationProgramStateCommon, >( - state: Readonly + state: State, ) => ({ ...(state.error === undefined ? {} : { error: state.error }), alternateStack: cloneStack(state.alternateStack), @@ -111,8 +120,14 @@ export const cloneAuthenticationProgramStateCommon = < stack: cloneStack(state.stack), }); +/** + * @deprecated use `structuredClone` instead + */ export const cloneAuthenticationProgramStateBCH = cloneAuthenticationProgramStateCommon; +/** + * @deprecated use `structuredClone` instead + */ export const cloneAuthenticationProgramState = cloneAuthenticationProgramStateBCH; @@ -126,13 +141,13 @@ export const cloneAuthenticationProgramState = * provided in anticipation of a future signing serialization algorithm that * supports committing to UTXO bytecode values. */ -export interface CompilationContext< - TransactionType extends TransactionCommon> -> { +export type CompilationContext< + TransactionType extends TransactionCommon>, +> = { inputIndex: number; sourceOutputs: Output[]; transaction: TransactionType; -} +}; export type CompilationContextCommon = CompilationContext< TransactionCommon> @@ -178,16 +193,13 @@ export const createCompilationContextCommonTesting = ({ unlockingBytecode: undefined, }, ], - locktime: locktime === undefined ? 0 : locktime, - outputs: - outputs === undefined - ? [ - { - lockingBytecode: Uint8Array.from([]), - valueSatoshis: 0xffffffffffffffffn, - }, - ] - : outputs, - version: version === undefined ? 0 : version, + locktime: locktime ?? 0, + outputs: outputs ?? [ + { + lockingBytecode: Uint8Array.from([]), + valueSatoshis: 0xffffffffffffffffn, + }, + ], + version: version ?? 0, }, }); diff --git a/src/lib/vm/instruction-sets/common/consensus.ts b/src/lib/vm/instruction-sets/common/consensus.ts index fc226792..b304f18d 100644 --- a/src/lib/vm/instruction-sets/common/consensus.ts +++ b/src/lib/vm/instruction-sets/common/consensus.ts @@ -48,6 +48,7 @@ export enum ConsensusCommon { * A.K.A. `MAXIMUM_ELEMENT_SIZE_64_BIT` */ maximumVmNumberLength = 8, + // eslint-disable-next-line @typescript-eslint/no-mixed-enums minVmNumber = '-9223372036854775807', maxVmNumber = '9223372036854775807', schnorrSignatureLength = 64, diff --git a/src/lib/vm/instruction-sets/common/crypto.ts b/src/lib/vm/instruction-sets/common/crypto.ts index e3f93d02..afac5090 100644 --- a/src/lib/vm/instruction-sets/common/crypto.ts +++ b/src/lib/vm/instruction-sets/common/crypto.ts @@ -46,41 +46,41 @@ export const opRipemd160 = < State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { ripemd160, }: { ripemd160: { hash: Ripemd160['hash'] }; - } = { ripemd160: internalRipemd160 } + } = { ripemd160: internalRipemd160 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => - pushToStack(nextState, ripemd160.hash(value)) + pushToStack(nextState, ripemd160.hash(value)), ); export const opSha1 = < State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { sha1, }: { sha1: { hash: Sha1['hash'] }; - } = { sha1: internalSha1 } + } = { sha1: internalSha1 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => - pushToStack(nextState, sha1.hash(value)) + pushToStack(nextState, sha1.hash(value)), ); export const opSha256 = < State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { sha256, @@ -88,18 +88,18 @@ export const opSha256 = sha256: { hash: Sha256['hash']; }; - } = { sha256: internalSha256 } + } = { sha256: internalSha256 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => - pushToStack(nextState, sha256.hash(value)) + pushToStack(nextState, sha256.hash(value)), ); export const opHash160 = < State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { ripemd160, @@ -107,18 +107,18 @@ export const opHash160 = }: { sha256: { hash: Sha256['hash'] }; ripemd160: { hash: Ripemd160['hash'] }; - } = { ripemd160: internalRipemd160, sha256: internalSha256 } + } = { ripemd160: internalRipemd160, sha256: internalSha256 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => - pushToStack(nextState, ripemd160.hash(sha256.hash(value))) + pushToStack(nextState, ripemd160.hash(sha256.hash(value))), ); export const opHash256 = < State extends AuthenticationProgramStateError & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { sha256, @@ -126,21 +126,21 @@ export const opHash256 = sha256: { hash: Sha256['hash']; }; - } = { sha256: internalSha256 } + } = { sha256: internalSha256 }, ): Operation => (state: State) => useOneStackItem(state, (nextState, [value]) => - pushToStack(nextState, hash256(value, sha256)) + pushToStack(nextState, hash256(value, sha256)), ); export const opCodeSeparator = < State extends AuthenticationProgramStateMinimum & { lastCodeSeparator: number; - } + }, >( - state: State + state: State, ) => { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.lastCodeSeparator = state.ip; return state; }; @@ -156,7 +156,7 @@ export const opCheckSig = verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ): Operation => (s: State) => // eslint-disable-next-line complexity @@ -164,38 +164,38 @@ export const opCheckSig = if (!isValidPublicKeyEncoding(publicKey)) { return applyError( state, - AuthenticationErrorCommon.invalidPublicKeyEncoding + AuthenticationErrorCommon.invalidPublicKeyEncoding, ); } if ( !isValidSignatureEncodingBCHTransaction( bitcoinEncodedSignature, - SigningSerializationTypesBCH + SigningSerializationTypesBCH, ) ) { return applyError( state, AuthenticationErrorCommon.invalidSignatureEncoding, `Transaction signature (including signing serialization): ${binToHex( - bitcoinEncodedSignature - )}` + bitcoinEncodedSignature, + )}`, ); } const coveredBytecode = encodeAuthenticationInstructions( - state.instructions + state.instructions, ).subarray(state.lastCodeSeparator + 1); const { signingSerializationType, signature } = decodeBitcoinSignature( - bitcoinEncodedSignature + bitcoinEncodedSignature, ); const serialization = generateSigningSerializationBCH( state.program, { coveredBytecode, signingSerializationType }, - sha256 + sha256, ); const digest = hash256(serialization, sha256); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.signedMessages.push({ digest, serialization }); const useSchnorr = @@ -224,7 +224,7 @@ export const opCheckMultiSig = secp256k1: { verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ) => (s: State) => useOneVmNumber(s, (state, publicKeysValue) => { @@ -233,26 +233,26 @@ export const opCheckMultiSig = if (potentialPublicKeys < 0) { return applyError( state, - AuthenticationErrorCommon.invalidNaturalNumber + AuthenticationErrorCommon.invalidNaturalNumber, ); } if (potentialPublicKeys > Multisig.maximumPublicKeys) { return applyError( state, - AuthenticationErrorCommon.exceedsMaximumMultisigPublicKeyCount + AuthenticationErrorCommon.exceedsMaximumMultisigPublicKeyCount, ); } const publicKeys = // eslint-disable-next-line functional/immutable-data potentialPublicKeys > 0 ? state.stack.splice(-potentialPublicKeys) : []; - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.operationCount += potentialPublicKeys; return state.operationCount > ConsensusCommon.maximumOperationCount ? applyError( state, - AuthenticationErrorCommon.exceededMaximumOperationCount + AuthenticationErrorCommon.exceededMaximumOperationCount, ) : useOneVmNumber( state, @@ -263,14 +263,14 @@ export const opCheckMultiSig = if (requiredApprovingPublicKeys < 0) { return applyError( nextState, - AuthenticationErrorCommon.invalidNaturalNumber + AuthenticationErrorCommon.invalidNaturalNumber, ); } if (requiredApprovingPublicKeys > potentialPublicKeys) { return applyError( nextState, - AuthenticationErrorCommon.insufficientPublicKeys + AuthenticationErrorCommon.insufficientPublicKeys, ); } @@ -287,18 +287,18 @@ export const opCheckMultiSig = if (protocolBugValue.length !== 0) { return applyError( finalState, - AuthenticationErrorCommon.invalidProtocolBugValue + AuthenticationErrorCommon.invalidProtocolBugValue, ); } const coveredBytecode = encodeAuthenticationInstructions( - finalState.instructions + finalState.instructions, ).subarray(finalState.lastCodeSeparator + 1); let approvingPublicKeys = 0; // eslint-disable-line functional/no-let let remainingSignatures = signatures.length; // eslint-disable-line functional/no-let let remainingPublicKeys = publicKeys.length; // eslint-disable-line functional/no-let - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while ( remainingSignatures > 0 && remainingPublicKeys > 0 && @@ -315,22 +315,22 @@ export const opCheckMultiSig = if (!isValidPublicKeyEncoding(publicKey)) { return applyError( finalState, - AuthenticationErrorCommon.invalidPublicKeyEncoding + AuthenticationErrorCommon.invalidPublicKeyEncoding, ); } if ( !isValidSignatureEncodingBCHTransaction( bitcoinEncodedSignature, - SigningSerializationTypesBCH + SigningSerializationTypesBCH, ) ) { return applyError( finalState, AuthenticationErrorCommon.invalidSignatureEncoding, `Transaction signature (including signing serialization type): ${binToHex( - bitcoinEncodedSignature - )}` + bitcoinEncodedSignature, + )}`, ); } @@ -340,11 +340,11 @@ export const opCheckMultiSig = const serialization = generateSigningSerializationBCH( state.program, { coveredBytecode, signingSerializationType }, - sha256 + sha256, ); const digest = hash256(serialization, sha256); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data finalState.signedMessages.push({ digest, serialization }); if ( @@ -353,22 +353,22 @@ export const opCheckMultiSig = ) { return applyError( finalState, - AuthenticationErrorCommon.schnorrSizedSignatureInCheckMultiSig + AuthenticationErrorCommon.schnorrSizedSignatureInCheckMultiSig, ); } const signed = secp256k1.verifySignatureDERLowS( signature, publicKey, - digest + digest, ); - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (signed) { - approvingPublicKeys += 1; // eslint-disable-line functional/no-expression-statement - remainingSignatures -= 1; // eslint-disable-line functional/no-expression-statement + approvingPublicKeys += 1; // eslint-disable-line functional/no-expression-statements + remainingSignatures -= 1; // eslint-disable-line functional/no-expression-statements } - remainingPublicKeys -= 1; // eslint-disable-line functional/no-expression-statement + remainingPublicKeys -= 1; // eslint-disable-line functional/no-expression-statements } const success = @@ -380,19 +380,19 @@ export const opCheckMultiSig = ) { return applyError( finalState, - AuthenticationErrorCommon.nonNullSignatureFailure + AuthenticationErrorCommon.nonNullSignatureFailure, ); } return pushToStack(finalState, booleanToVmNumber(success)); - } + }, ); - } + }, ); }); export const opCheckSigVerify = < - State extends AuthenticationProgramStateCommon + State extends AuthenticationProgramStateCommon, >( { secp256k1, @@ -403,12 +403,12 @@ export const opCheckSigVerify = < verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ): Operation => combineOperations(opCheckSig({ secp256k1, sha256 }), opVerify); export const opCheckMultiSigVerify = < - State extends AuthenticationProgramStateCommon + State extends AuthenticationProgramStateCommon, >({ secp256k1, sha256, @@ -435,7 +435,7 @@ export const opCheckDataSig = < State extends AuthenticationProgramStateError & AuthenticationProgramStateSignatureAnalysis & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >({ secp256k1, sha256, @@ -453,18 +453,18 @@ export const opCheckDataSig = return applyError( nextState, AuthenticationErrorCommon.invalidSignatureEncoding, - `Data signature: ${binToHex(signature)}` + `Data signature: ${binToHex(signature)}`, ); } if (!isValidPublicKeyEncoding(publicKey)) { return applyError( nextState, - AuthenticationErrorCommon.invalidPublicKeyEncoding + AuthenticationErrorCommon.invalidPublicKeyEncoding, ); } const digest = sha256.hash(message); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data nextState.signedMessages.push({ digest, message }); const useSchnorr = @@ -476,7 +476,7 @@ export const opCheckDataSig = return !success && signature.length !== 0 ? applyError( nextState, - AuthenticationErrorCommon.nonNullSignatureFailure + AuthenticationErrorCommon.nonNullSignatureFailure, ) : pushToStack(nextState, booleanToVmNumber(success)); }); @@ -484,7 +484,7 @@ export const opCheckDataSig = export const opCheckDataSigVerify = < State extends AuthenticationProgramStateError & AuthenticationProgramStateSignatureAnalysis & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( { secp256k1, @@ -495,12 +495,12 @@ export const opCheckDataSigVerify = < verifySignatureSchnorr: Secp256k1['verifySignatureSchnorr']; verifySignatureDERLowS: Secp256k1['verifySignatureDERLowS']; }; - } = { secp256k1: internalSecp256k1, sha256: internalSha256 } + } = { secp256k1: internalSecp256k1, sha256: internalSha256 }, ) => combineOperations(opCheckDataSig({ secp256k1, sha256 }), opVerify); export const opReverseBytes = ( - state: State + state: State, ) => useOneStackItem(state, (nextState, [item]) => - pushToStack(nextState, item.slice().reverse()) + pushToStack(nextState, item.slice().reverse()), ); diff --git a/src/lib/vm/instruction-sets/common/encoding.ts b/src/lib/vm/instruction-sets/common/encoding.ts index 1dee21df..a0c38e52 100644 --- a/src/lib/vm/instruction-sets/common/encoding.ts +++ b/src/lib/vm/instruction-sets/common/encoding.ts @@ -5,7 +5,7 @@ const enum ASN1 { integerTagType = 0x02, } -/* eslint-disable @typescript-eslint/no-duplicate-enum-values, @typescript-eslint/prefer-literal-enum-member, @typescript-eslint/restrict-plus-operands */ +/* eslint-disable @typescript-eslint/no-duplicate-enum-values, @typescript-eslint/prefer-literal-enum-member */ const enum DER { minimumLength = 8, maximumLength = 72, @@ -26,7 +26,7 @@ const enum DER { integerMetadataBytes + minimumSValueBytes, } -/* eslint-enable @typescript-eslint/no-duplicate-enum-values, @typescript-eslint/prefer-literal-enum-member, @typescript-eslint/restrict-plus-operands */ +/* eslint-enable @typescript-eslint/no-duplicate-enum-values, @typescript-eslint/prefer-literal-enum-member */ const enum Mask { negative = 0x80, @@ -39,7 +39,7 @@ const isNegative = (value: number | undefined) => const hasUnnecessaryPadding = ( length: number | undefined, firstByte: number | undefined, - secondByte: number | undefined + secondByte: number | undefined, // eslint-disable-next-line @typescript-eslint/no-non-null-assertion ) => length! > 1 && firstByte === 0 && !isNegative(secondByte); @@ -47,8 +47,8 @@ const isValidInteger = ( signature: Uint8Array, tagIndex: number, length: number, - valueIndex: number - // eslint-disable-next-line max-params + valueIndex: number, + // eslint-disable-next-line @typescript-eslint/max-params ) => signature[tagIndex] === ASN1.integerTagType && length !== 0 && @@ -56,7 +56,7 @@ const isValidInteger = ( !hasUnnecessaryPadding( length, signature[valueIndex], - signature[valueIndex + 1] + signature[valueIndex + 1], ); /** @@ -103,9 +103,9 @@ export const isValidSignatureEncodingDER = (signature: Uint8Array) => { signature, DER.rTagIndex, rLength, - DER.rValueIndex + DER.rValueIndex, ); - const sTagIndex = DER.rValueIndex + rLength; // eslint-disable-line @typescript-eslint/restrict-plus-operands + const sTagIndex = DER.rValueIndex + rLength; const sLengthIndex = sTagIndex + 1; const sLength = signature[sLengthIndex]; if (sLength === undefined) { @@ -133,17 +133,17 @@ export const isValidSignatureEncodingDER = (signature: Uint8Array) => { */ export const isValidSignatureEncodingBCHTransaction = ( transactionSignature: Uint8Array, - validSigningSerializationTypes: number[] + validSigningSerializationTypes: number[], ) => transactionSignature.length === 0 || (validSigningSerializationTypes.includes( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - transactionSignature[transactionSignature.length - 1]! + transactionSignature[transactionSignature.length - 1]!, ) && (transactionSignature.length === ConsensusCommon.schnorrSignatureLength + 1 || isValidSignatureEncodingDER( - transactionSignature.slice(0, transactionSignature.length - 1) + transactionSignature.slice(0, transactionSignature.length - 1), ))); /** diff --git a/src/lib/vm/instruction-sets/common/errors.ts b/src/lib/vm/instruction-sets/common/errors.ts index 56708bd1..feb36698 100644 --- a/src/lib/vm/instruction-sets/common/errors.ts +++ b/src/lib/vm/instruction-sets/common/errors.ts @@ -66,11 +66,8 @@ export enum AuthenticationErrorCommon { export const applyError = ( state: State, errorType: string, - errorDetails?: string + errorDetails?: string, ): State => ({ ...state, - error: - state.error === undefined - ? formatError(errorType, errorDetails) - : state.error, + error: state.error ?? formatError(errorType, errorDetails), }); diff --git a/src/lib/vm/instruction-sets/common/flow-control.ts b/src/lib/vm/instruction-sets/common/flow-control.ts index a9d3c71f..d4cb5c0e 100644 --- a/src/lib/vm/instruction-sets/common/flow-control.ts +++ b/src/lib/vm/instruction-sets/common/flow-control.ts @@ -10,41 +10,41 @@ import { stackItemIsTruthy } from './instruction-sets-utils.js'; export const opVerify = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneStackItem(state, (nextState, [item]) => stackItemIsTruthy(item) ? nextState - : applyError(nextState, AuthenticationErrorCommon.failedVerify) + : applyError(nextState, AuthenticationErrorCommon.failedVerify), ); export const reservedOperation = < - State extends AuthenticationProgramStateError + State extends AuthenticationProgramStateError, >( - state: State + state: State, ) => applyError(state, AuthenticationErrorCommon.calledReserved); export const opReturn = ( - state: State + state: State, ) => applyError(state, AuthenticationErrorCommon.calledReturn); export const opIf = < State extends AuthenticationProgramStateControlStack & AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => { if (state.controlStack.every((item) => item)) { return useOneStackItem(state, (nextState, [item]) => { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data nextState.controlStack.push(stackItemIsTruthy(item)); return state; }); } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.controlStack.push(false); return state; }; @@ -57,27 +57,27 @@ export const opIf = < export const opNotIf = < State extends AuthenticationProgramStateControlStack & AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => { if (state.controlStack.every((item) => item)) { return useOneStackItem(state, (nextState, [item]) => { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data nextState.controlStack.push(!stackItemIsTruthy(item)); return state; }); } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.controlStack.push(false); return state; }; export const opEndIf = < State extends AuthenticationProgramStateControlStack & - AuthenticationProgramStateError + AuthenticationProgramStateError, >( - state: State + state: State, ) => { // eslint-disable-next-line functional/immutable-data const element = state.controlStack.pop(); @@ -89,15 +89,15 @@ export const opEndIf = < export const opElse = < State extends AuthenticationProgramStateControlStack & - AuthenticationProgramStateError + AuthenticationProgramStateError, >( - state: State + state: State, ) => { const top = state.controlStack[state.controlStack.length - 1]; if (top === undefined) { return applyError(state, AuthenticationErrorCommon.unexpectedElse); } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.controlStack[state.controlStack.length - 1] = !top; return state; }; diff --git a/src/lib/vm/instruction-sets/common/format.ts b/src/lib/vm/instruction-sets/common/format.ts index bf99fb55..0272195e 100644 --- a/src/lib/vm/instruction-sets/common/format.ts +++ b/src/lib/vm/instruction-sets/common/format.ts @@ -17,26 +17,26 @@ import { bigIntToVmNumber } from './instruction-sets-utils.js'; export const opCat = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoStackItems(state, (nextState, [a, b]) => - pushToStackChecked(nextState, flattenBinArray([a, b])) + pushToStackChecked(nextState, flattenBinArray([a, b])), ); export const opSplit = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, value) => { const index = Number(value); return useOneStackItem(nextState, (finalState, [item]) => index < 0 || index > item.length ? applyError(finalState, AuthenticationErrorCommon.invalidSplitIndex) - : pushToStack(finalState, item.slice(0, index), item.slice(index)) + : pushToStack(finalState, item.slice(0, index), item.slice(index)), ); }); @@ -50,40 +50,40 @@ const enum Constants { */ export const padMinimallyEncodedVmNumber = ( vmNumber: Uint8Array, - length: number + length: number, ) => { // eslint-disable-next-line functional/no-let let signBit = Constants.positiveSign; - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements if (vmNumber.length > 0) { - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, @typescript-eslint/no-non-null-assertion + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, @typescript-eslint/no-non-null-assertion signBit = vmNumber[vmNumber.length - 1]! & Constants.negativeSign; - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, functional/immutable-data vmNumber[vmNumber.length - 1] &= Constants.negativeSign - 1; } const result = Array.from(vmNumber); - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (result.length < length - 1) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data result.push(0); } - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data result.push(signBit); return Uint8Array.from(result); }; export const opNum2Bin = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, value) => { const targetLength = Number(value); return targetLength > ConsensusCommon.maximumStackItemLength ? applyError( nextState, - `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${targetLength} bytes.` + `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${targetLength} bytes.`, ) : useOneVmNumber( nextState, @@ -92,29 +92,29 @@ export const opNum2Bin = < return minimallyEncoded.length > targetLength ? applyError( finalState, - AuthenticationErrorCommon.insufficientLength + AuthenticationErrorCommon.insufficientLength, ) : minimallyEncoded.length === targetLength - ? pushToStack(finalState, minimallyEncoded) - : pushToStack( - finalState, - padMinimallyEncodedVmNumber(minimallyEncoded, targetLength) - ); + ? pushToStack(finalState, minimallyEncoded) + : pushToStack( + finalState, + padMinimallyEncodedVmNumber(minimallyEncoded, targetLength), + ); }, { maximumVmNumberByteLength: // TODO: is this right? ConsensusCommon.maximumStackItemLength as number, requireMinimalEncoding: false, - } + }, ); }); export const opBin2Num = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, @@ -123,7 +123,7 @@ export const opBin2Num = < return minimallyEncoded.length > ConsensusCommon.maximumVmNumberLength ? applyError( nextState, - AuthenticationErrorCommon.exceededMaximumVmNumberLength + AuthenticationErrorCommon.exceededMaximumVmNumberLength, ) : pushToStack(nextState, minimallyEncoded); }, @@ -132,5 +132,5 @@ export const opBin2Num = < maximumVmNumberByteLength: ConsensusCommon.maximumStackItemLength as number, requireMinimalEncoding: false, - } + }, ); diff --git a/src/lib/vm/instruction-sets/common/inspection.ts b/src/lib/vm/instruction-sets/common/inspection.ts index cd7c9754..e3f3f466 100644 --- a/src/lib/vm/instruction-sets/common/inspection.ts +++ b/src/lib/vm/instruction-sets/common/inspection.ts @@ -20,9 +20,9 @@ import { encodeAuthenticationInstructions } from './instruction-sets-utils.js'; export const opInputIndex = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => pushToStackVmNumberChecked(state, BigInt(state.program.inputIndex)); export const opActiveBytecode = < @@ -30,76 +30,76 @@ export const opActiveBytecode = < AuthenticationProgramStateError & AuthenticationProgramStateMinimum & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => pushToStackChecked( state, encodeAuthenticationInstructions( - state.instructions.slice(state.lastCodeSeparator + 1) - ) + state.instructions.slice(state.lastCodeSeparator + 1), + ), ); export const opTxVersion = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => pushToStackVmNumberChecked( state, - BigInt(int32UnsignedToSigned(state.program.transaction.version)) + BigInt(int32UnsignedToSigned(state.program.transaction.version)), ); export const opTxInputCount = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => pushToStackVmNumberChecked( state, - BigInt(state.program.transaction.inputs.length) + BigInt(state.program.transaction.inputs.length), ); export const opTxOutputCount = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => pushToStackVmNumberChecked( state, - BigInt(state.program.transaction.outputs.length) + BigInt(state.program.transaction.outputs.length), ); export const opTxLocktime = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => pushToStackVmNumberChecked(state, BigInt(state.program.transaction.locktime)); export const useTransactionUtxo = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( state: State, - operation: (nextState: State, [utxo]: [Output]) => State + operation: (nextState: State, [utxo]: [Output]) => State, ) => useOneVmNumber(state, (nextState, [index]) => { const utxo = nextState.program.sourceOutputs[Number(index)]; if (utxo === undefined) { return applyError( nextState, - AuthenticationErrorCommon.invalidTransactionUtxoIndex + AuthenticationErrorCommon.invalidTransactionUtxoIndex, ); } return operation(state, [utxo]); @@ -108,39 +108,39 @@ export const useTransactionUtxo = < export const opUtxoValue = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useTransactionUtxo(state, (nextState, [utxo]) => - pushToStackVmNumberChecked(nextState, utxo.valueSatoshis) + pushToStackVmNumberChecked(nextState, utxo.valueSatoshis), ); export const opUtxoBytecode = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useTransactionUtxo(state, (nextState, [utxo]) => - pushToStackChecked(nextState, utxo.lockingBytecode.slice()) + pushToStackChecked(nextState, utxo.lockingBytecode.slice()), ); export const useTransactionInput = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( state: State, - operation: (nextState: State, [input]: [Input]) => State + operation: (nextState: State, [input]: [Input]) => State, ) => useOneVmNumber(state, (nextState, [index]) => { const input = nextState.program.transaction.inputs[Number(index)]; if (input === undefined) { return applyError( nextState, - AuthenticationErrorCommon.invalidTransactionInputIndex + AuthenticationErrorCommon.invalidTransactionInputIndex, ); } return operation(state, [input]); @@ -149,64 +149,64 @@ export const useTransactionInput = < export const opOutpointTxHash = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useTransactionInput(state, (nextState, [input]) => pushToStackChecked( nextState, - input.outpointTransactionHash.slice().reverse() - ) + input.outpointTransactionHash.slice().reverse(), + ), ); export const opOutpointIndex = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useTransactionInput(state, (nextState, [input]) => - pushToStackVmNumberChecked(nextState, BigInt(input.outpointIndex)) + pushToStackVmNumberChecked(nextState, BigInt(input.outpointIndex)), ); export const opInputBytecode = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useTransactionInput(state, (nextState, [input]) => - pushToStackChecked(nextState, input.unlockingBytecode.slice()) + pushToStackChecked(nextState, input.unlockingBytecode.slice()), ); export const opInputSequenceNumber = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useTransactionInput(state, (nextState, [input]) => - pushToStackVmNumberChecked(nextState, BigInt(input.sequenceNumber)) + pushToStackVmNumberChecked(nextState, BigInt(input.sequenceNumber)), ); export const useTransactionOutput = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( state: State, - operation: (nextState: State, [output]: [Output]) => State + operation: (nextState: State, [output]: [Output]) => State, ) => useOneVmNumber(state, (nextState, [index]) => { const input = nextState.program.transaction.outputs[Number(index)]; if (input === undefined) { return applyError( nextState, - AuthenticationErrorCommon.invalidTransactionOutputIndex + AuthenticationErrorCommon.invalidTransactionOutputIndex, ); } return operation(state, [input]); @@ -215,21 +215,21 @@ export const useTransactionOutput = < export const opOutputValue = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useTransactionOutput(state, (nextState, [output]) => - pushToStackVmNumberChecked(nextState, output.valueSatoshis) + pushToStackVmNumberChecked(nextState, output.valueSatoshis), ); export const opOutputBytecode = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useTransactionOutput(state, (nextState, [output]) => - pushToStackChecked(nextState, output.lockingBytecode.slice()) + pushToStackChecked(nextState, output.lockingBytecode.slice()), ); diff --git a/src/lib/vm/instruction-sets/common/instruction-sets-types.ts b/src/lib/vm/instruction-sets/common/instruction-sets-types.ts index 10922ed0..9f66e6e6 100644 --- a/src/lib/vm/instruction-sets/common/instruction-sets-types.ts +++ b/src/lib/vm/instruction-sets/common/instruction-sets-types.ts @@ -2,27 +2,27 @@ * A well-formed "push" authentication instruction (`OP_PUSHBYTES*` or * `OP_PUSHDATA*`). */ -export interface AuthenticationInstructionPush { +export type AuthenticationInstructionPush = { /** * The data to be pushed to the stack. */ - readonly data: Uint8Array; + data: Uint8Array; /** * The opcode used to push this data. */ - readonly opcode: number; -} + opcode: number; +}; /** * An authentication instruction indicating an operation (as opposed to a * {@link AuthenticationInstructionPush}). */ -export interface AuthenticationInstructionOperation { +export type AuthenticationInstructionOperation = { /** * The opcode of this instruction's operation. */ - readonly opcode: number; -} + opcode: number; +}; /** * A well-formed instruction used by an {@link AuthenticationVirtualMachine}. @@ -44,38 +44,38 @@ type Uint32Bytes = 4; * A malformed `OP_PUSHDATA*` authentication instruction in which the length * byte is incomplete (the bytecode ends before enough bytes can be read). */ -export interface AuthenticationInstructionPushMalformedLength { +export type AuthenticationInstructionPushMalformedLength = { /** * The expected number of length bytes (`length.length`) for this * `OP_PUSHDATA*` operation. */ - readonly expectedLengthBytes: Uint8Bytes | Uint16Bytes | Uint32Bytes; + expectedLengthBytes: Uint8Bytes | Uint16Bytes | Uint32Bytes; /** * The length `Uint8Array` provided. This instruction is malformed because the * length of this `Uint8Array` is shorter than the `expectedLengthBytes`. */ - readonly length: Uint8Array; - readonly malformed: true; - readonly opcode: number; -} + length: Uint8Array; + malformed: true; + opcode: number; +}; /** * A malformed "push" authentication instruction in which the pushed data is * incomplete (the bytecode ends before enough bytes can be read). */ -export interface AuthenticationInstructionPushMalformedData { +export type AuthenticationInstructionPushMalformedData = { /** * The data `Uint8Array` provided. This instruction is malformed because the * length of this `Uint8Array` is shorter than the `expectedDataBytes`. */ - readonly data: Uint8Array; + data: Uint8Array; /** * The expected number of `data` bytes for this push operation. */ - readonly expectedDataBytes: number; - readonly malformed: true; - readonly opcode: number; -} + expectedDataBytes: number; + malformed: true; + opcode: number; +}; /** * A malformed authentication instruction (the bytecode ends before enough bytes @@ -101,7 +101,7 @@ export type AuthenticationInstructionMaybeMalformed = export type AuthenticationInstructionsMalformed = [ ...AuthenticationInstruction[], - AuthenticationInstructionMalformed + AuthenticationInstructionMalformed, ]; /** diff --git a/src/lib/vm/instruction-sets/common/instruction-sets-utils.spec.ts b/src/lib/vm/instruction-sets/common/instruction-sets-utils.spec.ts index 578317f7..39feea1d 100644 --- a/src/lib/vm/instruction-sets/common/instruction-sets-utils.spec.ts +++ b/src/lib/vm/instruction-sets/common/instruction-sets-utils.spec.ts @@ -1,4 +1,3 @@ -import { fc, testProp } from '@fast-check/ava'; import test from 'ava'; import type { @@ -26,11 +25,12 @@ import { range, } from '../../../lib.js'; +import { fc, testProp } from '@fast-check/ava'; + test('Each Opcodes enum contains a single instruction for 0-255', (t) => { const expected = range(256); - const names = (keys: readonly string[]) => - keys.filter((k) => isNaN(parseInt(k, 10))); - const numbers = (keys: readonly string[]) => + const names = (keys: string[]) => keys.filter((k) => isNaN(parseInt(k, 10))); + const numbers = (keys: string[]) => keys.map((k) => parseInt(k, 10)).filter((k) => !isNaN(k)); const bch = Object.keys(OpcodesBCH2022); @@ -53,10 +53,10 @@ test('Each Opcodes enum contains a single instruction for 0-255', (t) => { * - element 3 - `length`, hex-encoded (if present) * - element 4 - `expectedLengthBytes`, hex-encoded (if present) */ -type CommonScriptParseAndAsmTests = Readonly<{ +type CommonScriptParseAndAsmTests = { [scriptHex: string]: { - readonly asm: string; - readonly parse: ( + asm: string; + parse: ( | [number, string, number, string, number] | [number, string, number] | [number, string] @@ -64,7 +64,7 @@ type CommonScriptParseAndAsmTests = Readonly<{ | [number] )[]; }; -}>; +}; const defToFixtures = (tests: CommonScriptParseAndAsmTests) => Object.entries(tests).map((entry) => { @@ -190,15 +190,15 @@ const disassemble = test.macro< t.deepEqual( disassembleAuthenticationInstructionsMaybeMalformed( OpcodesBCH2022, - input + input, ), - expected + expected, ); }, title: (title) => `disassemble script: ${title ?? ''}`.trim(), }); -const encode = test.macro<[readonly AuthenticationInstruction[], Uint8Array]>({ +const encode = test.macro<[AuthenticationInstruction[], Uint8Array]>({ exec: (t, input, expected) => { t.deepEqual(encodeAuthenticationInstructions(input), expected); }, @@ -211,7 +211,7 @@ const reEncode = test.macro< exec: (t, input, expected) => { t.deepEqual( encodeAuthenticationInstructionsMaybeMalformed(input), - expected + expected, ); }, title: (title) => `re-encode parsed script: ${title ?? ''}`.trim(), @@ -284,9 +284,9 @@ test('disassembleBytecode', (t) => { t.deepEqual( disassembleBytecode( TestOpcodes, - Uint8Array.from([0, 81, 82, 83, 81, 82, 83]) + Uint8Array.from([0, 81, 82, 83, 81, 82, 83]), ), - 'OP_PUSH_EMPTY OP_A OP_B OP_C OP_A OP_B OP_C' + 'OP_PUSH_EMPTY OP_A OP_B OP_C OP_A OP_B OP_C', ); }); @@ -294,9 +294,9 @@ test('assembleBytecode', (t) => { t.deepEqual( assembleBytecode( generateBytecodeMap(TestOpcodes), - 'OP_PUSH_EMPTY OP_A OP_B OP_C OP_A OP_B OP_C' + 'OP_PUSH_EMPTY OP_A OP_B OP_C OP_A OP_B OP_C', ), - { bytecode: Uint8Array.from([0, 81, 82, 83, 81, 82, 83]), success: true } + { bytecode: Uint8Array.from([0, 81, 82, 83, 81, 82, 83]), success: true }, ); }); @@ -337,16 +337,16 @@ testProp( ) as AuthenticationInstruction[]; const minimalPush = instructions.map((instruction) => [OpcodesBCH2022.OP_PUSHDATA_2, OpcodesBCH2022.OP_PUSHDATA_4].includes( - instruction.opcode + instruction.opcode, ) ? { opcode: OpcodesBCH2022.OP_1 } : instruction.opcode === OpcodesBCH2022.OP_PUSHDATA_1 && - (instruction as AuthenticationInstructionPush).data.length < 76 - ? { - data: new Uint8Array(76), - opcode: OpcodesBCH2022.OP_PUSHDATA_1, - } - : instruction + (instruction as AuthenticationInstructionPush).data.length < 76 + ? { + data: new Uint8Array(76), + opcode: OpcodesBCH2022.OP_PUSHDATA_1, + } + : instruction, ); const encoded = encodeAuthenticationInstructions(minimalPush); @@ -357,7 +357,7 @@ testProp( return; } t.deepEqual(encoded, reassembled.bytecode); - } + }, ); testProp( @@ -372,16 +372,16 @@ testProp( ) as AuthenticationInstruction[]; const minimalPush = instructions.map((instruction) => [OpcodesBTC.OP_PUSHDATA_2, OpcodesBTC.OP_PUSHDATA_4].includes( - instruction.opcode + instruction.opcode, ) ? { opcode: OpcodesBTC.OP_1 } : instruction.opcode === OpcodesBTC.OP_PUSHDATA_1 && - (instruction as AuthenticationInstructionPush).data.length < 76 - ? { - data: new Uint8Array(76), - opcode: OpcodesBTC.OP_PUSHDATA_1, - } - : instruction + (instruction as AuthenticationInstructionPush).data.length < 76 + ? { + data: new Uint8Array(76), + opcode: OpcodesBTC.OP_PUSHDATA_1, + } + : instruction, ); const encoded = encodeAuthenticationInstructions(minimalPush); @@ -392,5 +392,5 @@ testProp( return; } t.deepEqual(encoded, reassembled.bytecode); - } + }, ); diff --git a/src/lib/vm/instruction-sets/common/instruction-sets-utils.ts b/src/lib/vm/instruction-sets/common/instruction-sets-utils.ts index 113bd8e3..a1d68b05 100644 --- a/src/lib/vm/instruction-sets/common/instruction-sets-utils.ts +++ b/src/lib/vm/instruction-sets/common/instruction-sets-utils.ts @@ -30,7 +30,7 @@ import { OpcodesBTC } from '../btc/btc-opcodes.js'; * @param instruction - the instruction to check */ export const authenticationInstructionIsMalformed = ( - instruction: AuthenticationInstructionMaybeMalformed + instruction: AuthenticationInstructionMaybeMalformed, ): instruction is AuthenticationInstructionMalformed => 'malformed' in instruction; @@ -40,14 +40,14 @@ export const authenticationInstructionIsMalformed = ( * @param instructions - the array of instructions to check */ export const authenticationInstructionsAreMalformed = ( - instructions: AuthenticationInstructionsMaybeMalformed + instructions: AuthenticationInstructionsMaybeMalformed, ): instructions is AuthenticationInstructionsMalformed => instructions.length > 0 && // eslint-disable-next-line @typescript-eslint/no-non-null-assertion authenticationInstructionIsMalformed(instructions[instructions.length - 1]!); export const authenticationInstructionsArePushInstructions = ( - instructions: AuthenticationInstructions + instructions: AuthenticationInstructions, ): instructions is AuthenticationInstructionPush[] => instructions.every((instruction) => 'data' in instruction); @@ -69,15 +69,15 @@ const uint32Bytes = 4; export const decodeLittleEndianNumber = ( bytecode: Uint8Array, index: number, - length: typeof uint8Bytes | typeof uint16Bytes | typeof uint32Bytes + length: typeof uint8Bytes | typeof uint16Bytes | typeof uint32Bytes, ) => { const view = new DataView(bytecode.buffer, index, length); const readAsLittleEndian = true; return length === uint8Bytes ? view.getUint8(0) : length === uint16Bytes - ? view.getUint16(0, readAsLittleEndian) - : view.getUint32(0, readAsLittleEndian); + ? view.getUint16(0, readAsLittleEndian) + : view.getUint32(0, readAsLittleEndian); }; /** @@ -86,13 +86,13 @@ export const decodeLittleEndianNumber = ( * @param opcode - an opcode between 0x00 and 0xff */ export const opcodeToPushLength = ( - opcode: number + opcode: number, ): typeof uint8Bytes | typeof uint16Bytes | typeof uint32Bytes | 0 => ({ [CommonPushOpcodes.OP_PUSHDATA_1]: uint8Bytes as typeof uint8Bytes, [CommonPushOpcodes.OP_PUSHDATA_2]: uint16Bytes as typeof uint16Bytes, [CommonPushOpcodes.OP_PUSHDATA_4]: uint32Bytes as typeof uint32Bytes, - }[opcode] ?? 0); + })[opcode] ?? 0; /** * Decode one instruction from the provided virtual machine bytecode. @@ -113,7 +113,7 @@ export const opcodeToPushLength = ( // eslint-disable-next-line complexity export const decodeAuthenticationInstruction = ( bytecode: Uint8Array, - index: number + index: number, ): { instruction: AuthenticationInstructionMaybeMalformed; nextIndex: number; @@ -168,9 +168,11 @@ export const decodeAuthenticationInstruction = ( /** * @param instruction - the {@link AuthenticationInstruction} to clone. * @returns A copy of the provided {@link AuthenticationInstruction}. + * + * @deprecated use `structuredClone` instead */ export const cloneAuthenticationInstruction = ( - instruction: Readonly + instruction: AuthenticationInstruction, ): AuthenticationInstruction => ({ ...('data' in instruction ? { data: instruction.data } : {}), opcode: instruction.opcode, @@ -189,17 +191,17 @@ export const decodeAuthenticationInstructions = (bytecode: Uint8Array) => { const instructions = [] as AuthenticationInstructionsMaybeMalformed; // eslint-disable-next-line functional/no-let let i = 0; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (i < bytecode.length) { const { instruction, nextIndex } = decodeAuthenticationInstruction( bytecode, - i + i, ); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements i = nextIndex; - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data (instructions as AuthenticationInstruction[]).push( - instruction as AuthenticationInstruction + instruction as AuthenticationInstruction, ); } return instructions; @@ -216,7 +218,7 @@ const formatAsmPushHex = (data: Uint8Array) => const formatMissingBytesAsm = (missing: number) => `[missing ${missing} byte${missing === 1 ? '' : 's'}]`; const hasMalformedLength = ( - instruction: AuthenticationInstructionMalformed + instruction: AuthenticationInstructionMalformed, ): instruction is AuthenticationInstructionPushMalformedLength => 'length' in instruction; const isPushData = (pushOpcode: number) => @@ -229,20 +231,20 @@ const isPushData = (pushOpcode: number) => * disassemble */ export const disassembleAuthenticationInstructionMalformed = ( - opcodes: Readonly<{ [opcode: number]: string }>, - instruction: AuthenticationInstructionMalformed + opcodes: { [opcode: number]: string }, + instruction: AuthenticationInstructionMalformed, ): string => `${opcodes[instruction.opcode] ?? 'OP_UNKNOWN'} ${ hasMalformedLength(instruction) ? `${formatAsmPushHex(instruction.length)}${formatMissingBytesAsm( - instruction.expectedLengthBytes - instruction.length.length + instruction.expectedLengthBytes - instruction.length.length, )}` : `${ isPushData(instruction.opcode) ? `${instruction.expectedDataBytes} ` : '' }${formatAsmPushHex(instruction.data)}${formatMissingBytesAsm( - instruction.expectedDataBytes - instruction.data.length + instruction.expectedDataBytes - instruction.data.length, )}` }`; @@ -253,8 +255,8 @@ export const disassembleAuthenticationInstructionMalformed = ( * @param instruction - the instruction to disassemble */ export const disassembleAuthenticationInstruction = ( - opcodes: Readonly<{ [opcode: number]: string }>, - instruction: AuthenticationInstruction + opcodes: { [opcode: number]: string }, + instruction: AuthenticationInstruction, ): string => `${opcodes[instruction.opcode] ?? 'OP_UNKNOWN'}${ 'data' in instruction && isMultiWordPush(instruction.opcode) @@ -272,8 +274,8 @@ export const disassembleAuthenticationInstruction = ( * @param instruction - the instruction to disassemble */ export const disassembleAuthenticationInstructionMaybeMalformed = ( - opcodes: Readonly<{ [opcode: number]: string }>, - instruction: AuthenticationInstructionMaybeMalformed + opcodes: { [opcode: number]: string }, + instruction: AuthenticationInstructionMaybeMalformed, ): string => authenticationInstructionIsMalformed(instruction) ? disassembleAuthenticationInstructionMalformed(opcodes, instruction) @@ -292,12 +294,12 @@ export const disassembleAuthenticationInstructionMaybeMalformed = ( * @param instructions - the array of instructions to disassemble */ export const disassembleAuthenticationInstructionsMaybeMalformed = ( - opcodes: Readonly<{ [opcode: number]: string }>, - instructions: readonly AuthenticationInstructionMaybeMalformed[] + opcodes: { [opcode: number]: string }, + instructions: AuthenticationInstructionMaybeMalformed[], ): string => instructions .map((instruction) => - disassembleAuthenticationInstructionMaybeMalformed(opcodes, instruction) + disassembleAuthenticationInstructionMaybeMalformed(opcodes, instruction), ) .join(' '); @@ -310,12 +312,12 @@ export const disassembleAuthenticationInstructionsMaybeMalformed = ( * @param bytecode - the authentication bytecode to disassemble */ export const disassembleBytecode = ( - opcodes: Readonly<{ [opcode: number]: string }>, - bytecode: Uint8Array + opcodes: { [opcode: number]: string }, + bytecode: Uint8Array, ) => disassembleAuthenticationInstructionsMaybeMalformed( opcodes, - decodeAuthenticationInstructions(bytecode) + decodeAuthenticationInstructions(bytecode), ); /** @@ -329,7 +331,7 @@ export const disassembleBytecode = ( export const disassembleBytecodeBCH = (bytecode: Uint8Array) => disassembleAuthenticationInstructionsMaybeMalformed( OpcodesBCH, - decodeAuthenticationInstructions(bytecode) + decodeAuthenticationInstructions(bytecode), ); /** @@ -343,7 +345,7 @@ export const disassembleBytecodeBCH = (bytecode: Uint8Array) => export const disassembleBytecodeBTC = (bytecode: Uint8Array) => disassembleAuthenticationInstructionsMaybeMalformed( OpcodesBTC, - decodeAuthenticationInstructions(bytecode) + decodeAuthenticationInstructions(bytecode), ); /** @@ -354,26 +356,26 @@ export const disassembleBytecodeBTC = (bytecode: Uint8Array) => export const generateBytecodeMap = (opcodes: { [opcode: string]: unknown }) => Object.entries(opcodes) .filter<[string, number]>( - (entry): entry is [string, number] => typeof entry[1] === 'number' + (entry): entry is [string, number] => typeof entry[1] === 'number', ) .reduce<{ [opcode: string]: Uint8Array }>( (identifiers, pair) => ({ ...identifiers, [pair[0]]: Uint8Array.of(pair[1]), }), - {} + {}, ); const getInstructionLengthBytes = ( - instruction: AuthenticationInstructionPush + instruction: AuthenticationInstructionPush, ) => { const { opcode } = instruction; const expectedLength = opcodeToPushLength(opcode); return expectedLength === uint8Bytes ? Uint8Array.of(instruction.data.length) : expectedLength === uint16Bytes - ? numberToBinUint16LE(instruction.data.length) - : numberToBinUint32LE(instruction.data.length); + ? numberToBinUint16LE(instruction.data.length) + : numberToBinUint32LE(instruction.data.length); }; /** @@ -381,7 +383,7 @@ const getInstructionLengthBytes = ( * @param instruction - the instruction to encode */ export const encodeAuthenticationInstruction = ( - instruction: AuthenticationInstruction + instruction: AuthenticationInstruction, ) => Uint8Array.from([ instruction.opcode, @@ -400,7 +402,7 @@ export const encodeAuthenticationInstruction = ( * @param instruction - the {@link AuthenticationInstructionMalformed} to encode */ export const encodeAuthenticationInstructionMalformed = ( - instruction: AuthenticationInstructionMalformed + instruction: AuthenticationInstructionMalformed, ) => { const { opcode } = instruction; @@ -414,8 +416,8 @@ export const encodeAuthenticationInstructionMalformed = ( ...(opcode === CommonPushOpcodes.OP_PUSHDATA_1 ? Uint8Array.of(instruction.expectedDataBytes) : opcode === CommonPushOpcodes.OP_PUSHDATA_2 - ? numberToBinUint16LE(instruction.expectedDataBytes) - : numberToBinUint32LE(instruction.expectedDataBytes)), + ? numberToBinUint16LE(instruction.expectedDataBytes) + : numberToBinUint32LE(instruction.expectedDataBytes)), ...instruction.data, ]); } @@ -429,7 +431,7 @@ export const encodeAuthenticationInstructionMalformed = ( * to encode */ export const encodeAuthenticationInstructionMaybeMalformed = ( - instruction: AuthenticationInstructionMaybeMalformed + instruction: AuthenticationInstructionMaybeMalformed, ): Uint8Array => authenticationInstructionIsMalformed(instruction) ? encodeAuthenticationInstructionMalformed(instruction) @@ -440,7 +442,7 @@ export const encodeAuthenticationInstructionMaybeMalformed = ( * @param instructions - the array of valid instructions to encode */ export const encodeAuthenticationInstructions = ( - instructions: readonly AuthenticationInstruction[] + instructions: AuthenticationInstruction[], ) => flattenBinArray(instructions.map(encodeAuthenticationInstruction)); /** @@ -449,10 +451,10 @@ export const encodeAuthenticationInstructions = ( * {@link AuthenticationInstructionMaybeMalformed}s to encode */ export const encodeAuthenticationInstructionsMaybeMalformed = ( - instructions: readonly AuthenticationInstructionMaybeMalformed[] + instructions: AuthenticationInstructionMaybeMalformed[], ) => flattenBinArray( - instructions.map(encodeAuthenticationInstructionMaybeMalformed) + instructions.map(encodeAuthenticationInstructionMaybeMalformed), ); export enum VmNumberError { @@ -461,7 +463,7 @@ export enum VmNumberError { } export const isVmNumberError = ( - value: VmNumberError | bigint + value: VmNumberError | bigint, ): value is VmNumberError => value === VmNumberError.outOfRange || value === VmNumberError.requiresMinimal; @@ -504,7 +506,7 @@ export const vmNumberToBigInt = ( } = { maximumVmNumberByteLength: typicalMaximumVmNumberByteLength, requireMinimalEncoding: true, - } + }, ): VmNumberError | bigint => { if (bytes.length === 0) { return 0n; @@ -532,9 +534,9 @@ export const vmNumberToBigInt = ( const signFlippingByte = 0x80; // eslint-disable-next-line functional/no-let let result = 0n; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line functional/no-let, functional/no-loop-statements, no-plusplus for (let byte = 0; byte < bytes.length; byte++) { - // eslint-disable-next-line functional/no-expression-statement, no-bitwise, @typescript-eslint/no-non-null-assertion + // eslint-disable-next-line functional/no-expression-statements, no-bitwise, @typescript-eslint/no-non-null-assertion result |= BigInt(bytes[byte]!) << BigInt(byte * bitsPerByte); } @@ -568,22 +570,22 @@ export const bigIntToVmNumber = (integer: bigint): Uint8Array => { const bitsPerByte = 8; // eslint-disable-next-line functional/no-let let remaining = isNegative ? -integer : integer; - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (remaining > 0) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data, no-bitwise + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data, no-bitwise bytes.push(Number(remaining & BigInt(byteStates))); - // eslint-disable-next-line functional/no-expression-statement, no-bitwise + // eslint-disable-next-line functional/no-expression-statements, no-bitwise remaining >>= BigInt(bitsPerByte); } const signFlippingByte = 0x80; - // eslint-disable-next-line no-bitwise, functional/no-conditional-statement, @typescript-eslint/no-non-null-assertion + // eslint-disable-next-line no-bitwise, functional/no-conditional-statements, @typescript-eslint/no-non-null-assertion if ((bytes[bytes.length - 1]! & signFlippingByte) > 0) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data bytes.push(isNegative ? signFlippingByte : 0x00); - // eslint-disable-next-line functional/no-conditional-statement + // eslint-disable-next-line functional/no-conditional-statements } else if (isNegative) { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data, no-bitwise + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data, no-bitwise bytes[bytes.length - 1] |= signFlippingByte; } return new Uint8Array(bytes); @@ -599,7 +601,7 @@ export const bigIntToVmNumber = (integer: bigint): Uint8Array => { */ export const stackItemIsTruthy = (item: Uint8Array) => { const signFlippingByte = 0x80; - // eslint-disable-next-line functional/no-let, functional/no-loop-statement, no-plusplus + // eslint-disable-next-line functional/no-let, functional/no-loop-statements, no-plusplus for (let i = 0; i < item.length; i++) { if (item[i] !== 0) { if (i === item.length - 1 && item[i] === signFlippingByte) { @@ -651,7 +653,7 @@ export const isPushOperation = (opcode: number) => opcode <= Opcodes.OP_16; export const isPushOnly = (bytecode: Uint8Array) => { const instructions = decodeAuthenticationInstructions(bytecode); return instructions.every((instruction) => - isPushOperation(instruction.opcode) + isPushOperation(instruction.opcode), ); }; @@ -707,6 +709,17 @@ export const getMinimumFee = (length: bigint, feeRateSatsPerKb: bigint) => { return truncated === 0n ? 1n : truncated; }; +export const getDustThresholdForLength = ( + outputLength: number, + dustRelayFeeSatPerKb = BigInt(Dust.standardDustRelayFee), +) => { + const expectedTotalLength = outputLength + Dust.p2pkhInputLength; + return ( + BigInt(Dust.minimumFeeMultiple) * + getMinimumFee(BigInt(expectedTotalLength), dustRelayFeeSatPerKb) + ); +}; + /** * Given an {@link Output} and (optionally) a dust relay fee in * satoshis-per-kilobyte, return the minimum satoshi value for this output to @@ -738,17 +751,13 @@ export const getMinimumFee = (length: bigint, feeRateSatsPerKb: bigint) => { */ export const getDustThreshold = ( output: Output, - dustRelayFeeSatPerKb = BigInt(Dust.standardDustRelayFee) + dustRelayFeeSatPerKb = BigInt(Dust.standardDustRelayFee), ) => { if (isArbitraryDataOutput(output.lockingBytecode)) { return 0n; } const encodedOutputLength = encodeTransactionOutput(output).length; - const expectedTotalLength = encodedOutputLength + Dust.p2pkhInputLength; - return ( - BigInt(Dust.minimumFeeMultiple) * - getMinimumFee(BigInt(expectedTotalLength), dustRelayFeeSatPerKb) - ); + return getDustThresholdForLength(encodedOutputLength, dustRelayFeeSatPerKb); }; /** @@ -761,7 +770,7 @@ export const getDustThreshold = ( */ export const isDustOutput = ( output: Output, - dustRelayFeeSatPerKb = BigInt(Dust.standardDustRelayFee) + dustRelayFeeSatPerKb = BigInt(Dust.standardDustRelayFee), ) => output.valueSatoshis < getDustThreshold(output, dustRelayFeeSatPerKb); const enum PublicKey { @@ -836,7 +845,7 @@ export const isSimpleMultisig = (lockingBytecode: Uint8Array) => { */ const n = pushNumberOpcodeToNumber( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - instructions[lastIndex - 1]!.opcode + instructions[lastIndex - 1]!.opcode, ); if (n === false || m === false) { @@ -845,7 +854,7 @@ export const isSimpleMultisig = (lockingBytecode: Uint8Array) => { const publicKeyInstructions = instructions.slice( Multisig.keyStart, - Multisig.keyEnd + Multisig.keyEnd, ); if (!authenticationInstructionsArePushInstructions(publicKeyInstructions)) { @@ -853,7 +862,7 @@ export const isSimpleMultisig = (lockingBytecode: Uint8Array) => { } const publicKeys = publicKeyInstructions.map( - (instruction) => instruction.data + (instruction) => instruction.data, ); if (publicKeys.some((key) => !isValidPublicKeyEncoding(key))) { diff --git a/src/lib/vm/instruction-sets/common/nop.ts b/src/lib/vm/instruction-sets/common/nop.ts index d977c6cc..a1d584a7 100644 --- a/src/lib/vm/instruction-sets/common/nop.ts +++ b/src/lib/vm/instruction-sets/common/nop.ts @@ -5,7 +5,7 @@ import { applyError, AuthenticationErrorCommon } from './errors.js'; export const opNop = (state: State) => state; export const opNopDisallowed = ( - state: State + state: State, ) => applyError(state, AuthenticationErrorCommon.calledUpgradableNop); /** @@ -13,7 +13,7 @@ export const opNopDisallowed = ( * bytecode, even within an unexecuted branch. */ export const disabledOperation = < - State extends AuthenticationProgramStateError + State extends AuthenticationProgramStateError, >( - state: State + state: State, ) => applyError(state, AuthenticationErrorCommon.unknownOpcode); diff --git a/src/lib/vm/instruction-sets/common/push.spec.ts b/src/lib/vm/instruction-sets/common/push.spec.ts index 1f5095cb..36be23a7 100644 --- a/src/lib/vm/instruction-sets/common/push.spec.ts +++ b/src/lib/vm/instruction-sets/common/push.spec.ts @@ -53,39 +53,39 @@ test('prefixDataPush', (t) => { }); t.deepEqual( encodeDataPush( - Uint8Array.from(range(PushOperationConstants.maximumPushData1Size)) + Uint8Array.from(range(PushOperationConstants.maximumPushData1Size)), ), Uint8Array.from([ PushOperationConstants.OP_PUSHDATA_1, 0xff, ...range(PushOperationConstants.maximumPushData1Size), - ]) + ]), ); t.deepEqual( encodeDataPush( - Uint8Array.from(range(PushOperationConstants.maximumPushData1Size + 1)) + Uint8Array.from(range(PushOperationConstants.maximumPushData1Size + 1)), ), Uint8Array.from([ PushOperationConstants.OP_PUSHDATA_2, 0, 1, ...range(PushOperationConstants.maximumPushData1Size + 1), - ]) + ]), ); t.deepEqual( encodeDataPush( - Uint8Array.from(range(PushOperationConstants.maximumPushData2Size)) + Uint8Array.from(range(PushOperationConstants.maximumPushData2Size)), ), Uint8Array.from([ PushOperationConstants.OP_PUSHDATA_2, 0xff, 0xff, ...range(PushOperationConstants.maximumPushData2Size), - ]) + ]), ); t.deepEqual( encodeDataPush( - Uint8Array.from(range(PushOperationConstants.maximumPushData2Size + 1)) + Uint8Array.from(range(PushOperationConstants.maximumPushData2Size + 1)), ), Uint8Array.from([ PushOperationConstants.OP_PUSHDATA_4, @@ -94,6 +94,6 @@ test('prefixDataPush', (t) => { 1, 0, ...range(PushOperationConstants.maximumPushData2Size + 1), - ]) + ]), ); }); diff --git a/src/lib/vm/instruction-sets/common/push.ts b/src/lib/vm/instruction-sets/common/push.ts index 0149419a..0e804eda 100644 --- a/src/lib/vm/instruction-sets/common/push.ts +++ b/src/lib/vm/instruction-sets/common/push.ts @@ -87,33 +87,33 @@ export const encodeDataPush = (data: Uint8Array) => ? data.length === 0 ? Uint8Array.of(0) : data.length === 1 - ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - data[0] !== 0 && data[0]! <= PushOperationConstants.pushNumberOpcodes - ? Uint8Array.of( - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - data[0]! + PushOperationConstants.pushNumberOpcodesOffset - ) - : data[0] === PushOperationConstants.negativeOne - ? Uint8Array.of(PushOperationConstants.OP_1NEGATE) - : Uint8Array.from([1, ...data]) - : Uint8Array.from([data.length, ...data]) + ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + data[0] !== 0 && data[0]! <= PushOperationConstants.pushNumberOpcodes + ? Uint8Array.of( + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + data[0]! + PushOperationConstants.pushNumberOpcodesOffset, + ) + : data[0] === PushOperationConstants.negativeOne + ? Uint8Array.of(PushOperationConstants.OP_1NEGATE) + : Uint8Array.from([1, ...data]) + : Uint8Array.from([data.length, ...data]) : data.length <= PushOperationConstants.maximumPushData1Size - ? Uint8Array.from([ - PushOperationConstants.OP_PUSHDATA_1, - data.length, - ...data, - ]) - : data.length <= PushOperationConstants.maximumPushData2Size - ? Uint8Array.from([ - PushOperationConstants.OP_PUSHDATA_2, - ...numberToBinUint16LE(data.length), - ...data, - ]) - : Uint8Array.from([ - PushOperationConstants.OP_PUSHDATA_4, - ...numberToBinUint32LE(data.length), - ...data, - ]); + ? Uint8Array.from([ + PushOperationConstants.OP_PUSHDATA_1, + data.length, + ...data, + ]) + : data.length <= PushOperationConstants.maximumPushData2Size + ? Uint8Array.from([ + PushOperationConstants.OP_PUSHDATA_2, + ...numberToBinUint16LE(data.length), + ...data, + ]) + : Uint8Array.from([ + PushOperationConstants.OP_PUSHDATA_4, + ...numberToBinUint32LE(data.length), + ...data, + ]); /** * Returns true if the provided `data` is minimally-encoded by the provided @@ -155,9 +155,9 @@ export const isMinimalDataPush = (opcode: number, data: Uint8Array) => { }; const executionIsActive = < - State extends AuthenticationProgramStateControlStack + State extends AuthenticationProgramStateControlStack, >( - state: State + state: State, ) => state.controlStack.every((item) => item); // TODO: add tests that verify the order of operations below (are non-minimal pushes OK inside unexecuted conditionals?) @@ -167,9 +167,9 @@ export const pushOperation = State extends AuthenticationProgramStateControlStack & AuthenticationProgramStateError & AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - maximumPushSize = ConsensusCommon.maximumStackItemLength + maximumPushSize = ConsensusCommon.maximumStackItemLength as number, ): Operation => (state: State) => { const instruction = state.instructions[ @@ -178,13 +178,13 @@ export const pushOperation = return instruction.data.length > maximumPushSize ? applyError( state, - `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${instruction.data.length} bytes.` + `${AuthenticationErrorCommon.exceededMaximumStackItemLength} Item length: ${instruction.data.length} bytes.`, ) : executionIsActive(state) - ? isMinimalDataPush(instruction.opcode, instruction.data) - ? pushToStack(state, instruction.data) - : applyError(state, AuthenticationErrorCommon.nonMinimalPush) - : state; + ? isMinimalDataPush(instruction.opcode, instruction.data) + ? pushToStack(state, instruction.data) + : applyError(state, AuthenticationErrorCommon.nonMinimalPush) + : state; }; /** @@ -193,9 +193,9 @@ export const pushOperation = */ export const pushNumberOperation = < ProgramState extends AuthenticationProgramStateMinimum & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - number: number + number: number, ) => { const value = bigIntToVmNumber(BigInt(number)); return (state: ProgramState) => pushToStack(state, value); diff --git a/src/lib/vm/instruction-sets/common/signing-serialization.spec.ts b/src/lib/vm/instruction-sets/common/signing-serialization.spec.ts index 21a66e2b..d77675ed 100644 --- a/src/lib/vm/instruction-sets/common/signing-serialization.spec.ts +++ b/src/lib/vm/instruction-sets/common/signing-serialization.spec.ts @@ -30,7 +30,7 @@ const tests = Object.values(sighashTests) * algorithm. If the legacy algorithm is implemented, we can re-enable the * rest of these tests. */ - !isLegacySigningSerialization(expectation.signingSerializationType) + !isLegacySigningSerialization(expectation.signingSerializationType), ); /** @@ -42,12 +42,12 @@ const pendingTests = tests; pendingTests.map((expectation, currentTest) => { test.skip(`[signing-serialization tests] sighash.json ${currentTest}/${pendingTests.length} (#${expectation.testIndex})`, (t) => { const tx = decodeTransactionUnsafeCommon( - hexToBin(expectation.transactionHex) + hexToBin(expectation.transactionHex), ); const lockingBytecode = hexToBin(expectation.scriptHex); const signingSerializationType = numberToBinInt32TwosCompliment( - expectation.signingSerializationType + expectation.signingSerializationType, ); const sourceOutputs = []; sourceOutputs[expectation.inputIndex] = { @@ -81,7 +81,7 @@ pendingTests.map((expectation, currentTest) => { t.deepEqual( digest, hexToBin(expectation.signingSerializationBCHDigestHex).reverse(), - `failed serialization: ${binToHex(serialization)}` + `failed serialization: ${binToHex(serialization)}`, ); }); return undefined; diff --git a/src/lib/vm/instruction-sets/common/signing-serialization.ts b/src/lib/vm/instruction-sets/common/signing-serialization.ts index 1203936e..fc2d8831 100644 --- a/src/lib/vm/instruction-sets/common/signing-serialization.ts +++ b/src/lib/vm/instruction-sets/common/signing-serialization.ts @@ -84,7 +84,7 @@ const match = (type: Uint8Array, flag: SigningSerializationFlag) => const equals = ( type: Uint8Array, - flag: SigningSerializationFlag + flag: SigningSerializationFlag, // eslint-disable-next-line no-bitwise, @typescript-eslint/no-non-null-assertion ) => (type[0]! & Internal.mask5Bits) === flag; @@ -120,7 +120,7 @@ export const hashPrevouts = ( */ transactionOutpoints: Uint8Array; }, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => shouldSerializeSingleInput(signingSerializationType) ? emptyHash() @@ -144,7 +144,7 @@ export const hashUtxos = ( */ transactionUtxos: Uint8Array; }, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => shouldSerializeUtxos(signingSerializationType) ? hash256(transactionUtxos, sha256) @@ -168,7 +168,7 @@ export const hashSequence = ( */ transactionSequenceNumbers: Uint8Array; }, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => !shouldSerializeSingleInput(signingSerializationType) && !shouldSerializeCorrespondingOutput(signingSerializationType) && @@ -199,16 +199,16 @@ export const hashOutputs = ( */ correspondingOutput: Uint8Array | undefined; }, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => !shouldSerializeCorrespondingOutput(signingSerializationType) && !shouldSerializeNoOutputs(signingSerializationType) ? hash256(transactionOutputs, sha256) : shouldSerializeCorrespondingOutput(signingSerializationType) - ? correspondingOutput === undefined - ? emptyHash() - : hash256(correspondingOutput, sha256) - : emptyHash(); + ? correspondingOutput === undefined + ? emptyHash() + : hash256(correspondingOutput, sha256) + : emptyHash(); /** * Encode the signature-protected properties of a transaction following the @@ -312,7 +312,7 @@ export const encodeSigningSerializationBCH = ( */ forkId?: Uint8Array; }, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => flattenBinArray([ numberToBinUint32LE(version), @@ -323,7 +323,7 @@ export const encodeSigningSerializationBCH = ( signingSerializationType, transactionSequenceNumbers, }, - sha256 + sha256, ), outpointTransactionHash.slice().reverse(), numberToBinUint32LE(outpointIndex), @@ -338,7 +338,7 @@ export const encodeSigningSerializationBCH = ( signingSerializationType, transactionOutputs, }, - sha256 + sha256, ), numberToBinUint32LE(locktime), signingSerializationType, @@ -349,102 +349,102 @@ export const encodeSigningSerializationBCH = ( * The signing serialization components that are shared between all of the * inputs in a transaction. */ -export interface SigningSerializationTransactionComponentsBCH { +export type SigningSerializationTransactionComponentsBCH = { /** * A time or block height at which the transaction is considered valid (and * can be added to the block chain). This allows signers to create time-locked * transactions that may only become valid in the future. */ - readonly locktime: number; + locktime: number; /** * A.K.A. the serialization for {@link hashPrevouts} * * The signing serialization of all input outpoints. (See BIP143 or Bitcoin * Cash's Replay Protected Sighash spec for details.) */ - readonly transactionOutpoints: Uint8Array; + transactionOutpoints: Uint8Array; /* * A.K.A. the serialization for {@link hashOutputs} with `SIGHASH_ALL` * * The signing serialization of output amounts and locking scripts. (See * BIP143 or Bitcoin Cash's Replay Protected Sighash spec for details.) */ - readonly transactionOutputs: Uint8Array; + transactionOutputs: Uint8Array; /* * A.K.A. the serialization for {@link hashSequence} * * The signing serialization of all input sequence numbers. (See BIP143 or * Bitcoin Cash's Replay Protected Sighash spec for details.) */ - readonly transactionSequenceNumbers: Uint8Array; + transactionSequenceNumbers: Uint8Array; /** * A.K.A. the serialization for {@link hashUtxos} * * The signing serialization of all UTXOs spent by the transaction's inputs * (concatenated in input order). */ - readonly transactionUtxos: Uint8Array; + transactionUtxos: Uint8Array; /** * The transaction's version. */ - readonly version: number; -} + version: number; +}; /** * All signing serialization components for a particular transaction input. */ -export interface SigningSerializationComponentsBCH - extends SigningSerializationTransactionComponentsBCH { - /* - * A.K.A. the serialization for {@link hashOutputs} with `SIGHASH_SINGLE` - * - * The signing serialization of the output at the same index as this input. If - * this input's index is larger than the total number of outputs (such that - * there is no corresponding output), this should be `undefined`. (See BIP143 - * or Bitcoin Cash's Replay Protected Sighash spec for details.) - */ - readonly correspondingOutput: Uint8Array | undefined; - /** - * The index (within the previous transaction) of the outpoint being spent by - * this input. - */ - readonly outpointIndex: number; - /** - * The hash/ID of the transaction from which the outpoint being spent by this - * input originated. - */ - readonly outpointTransactionHash: Uint8Array; - /** - * The 8-byte `Uint64LE`-encoded value of the output being spent in satoshis - * (see {@link bigIntToBinUint64LE}). - */ - readonly outputValue: Uint8Array; - /** - * The encoded token prefix of the output being spent - * (see {@link encodeTokenPrefix}). - * - * If the output includes no tokens, a zero-length Uint8Array. - */ - readonly outputTokenPrefix: Uint8Array; - /** - * The `sequenceNumber` associated with the input being validated. See - * {@link Input.sequenceNumber} for details. - */ - readonly sequenceNumber: number; -} +export type SigningSerializationComponentsBCH = + SigningSerializationTransactionComponentsBCH & { + /* + * A.K.A. the serialization for {@link hashOutputs} with `SIGHASH_SINGLE` + * + * The signing serialization of the output at the same index as this input. If + * this input's index is larger than the total number of outputs (such that + * there is no corresponding output), this should be `undefined`. (See BIP143 + * or Bitcoin Cash's Replay Protected Sighash spec for details.) + */ + correspondingOutput: Uint8Array | undefined; + /** + * The index (within the previous transaction) of the outpoint being spent by + * this input. + */ + outpointIndex: number; + /** + * The hash/ID of the transaction from which the outpoint being spent by this + * input originated. + */ + outpointTransactionHash: Uint8Array; + /** + * The 8-byte `Uint64LE`-encoded value of the output being spent in satoshis + * (see {@link bigIntToBinUint64LE}). + */ + outputValue: Uint8Array; + /** + * The encoded token prefix of the output being spent + * (see {@link encodeTokenPrefix}). + * + * If the output includes no tokens, a zero-length Uint8Array. + */ + outputTokenPrefix: Uint8Array; + /** + * The `sequenceNumber` associated with the input being validated. See + * {@link Input.sequenceNumber} for details. + */ + sequenceNumber: number; + }; /** * Generate the encoded components of a BCH signing serialization from * compilation context. */ export const generateSigningSerializationComponentsBCH = ( - context: CompilationContextBCH + context: CompilationContextBCH, ): SigningSerializationComponentsBCH => ({ correspondingOutput: context.inputIndex < context.transaction.outputs.length ? encodeTransactionOutput( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - context.transaction.outputs[context.inputIndex]! + context.transaction.outputs[context.inputIndex]!, ) : undefined, locktime: context.transaction.locktime, @@ -455,21 +455,21 @@ export const generateSigningSerializationComponentsBCH = ( context.transaction.inputs[context.inputIndex]!.outpointTransactionHash, outputTokenPrefix: encodeTokenPrefix( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - context.sourceOutputs[context.inputIndex]!.token + context.sourceOutputs[context.inputIndex]!.token, ), outputValue: valueSatoshisToBin( // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - context.sourceOutputs[context.inputIndex]!.valueSatoshis + context.sourceOutputs[context.inputIndex]!.valueSatoshis, ), sequenceNumber: // eslint-disable-next-line @typescript-eslint/no-non-null-assertion context.transaction.inputs[context.inputIndex]!.sequenceNumber, transactionOutpoints: encodeTransactionOutpoints(context.transaction.inputs), transactionOutputs: encodeTransactionOutputsForSigning( - context.transaction.outputs + context.transaction.outputs, ), transactionSequenceNumbers: encodeTransactionInputSequenceNumbersForSigning( - context.transaction.inputs + context.transaction.inputs, ), transactionUtxos: encodeTransactionOutputsForSigning(context.sourceOutputs), version: context.transaction.version, @@ -499,7 +499,7 @@ export const generateSigningSerializationBCH = ( */ signingSerializationType: Uint8Array; }, - sha256: { hash: Sha256['hash'] } = internalSha256 + sha256: { hash: Sha256['hash'] } = internalSha256, ) => encodeSigningSerializationBCH( { @@ -507,7 +507,7 @@ export const generateSigningSerializationBCH = ( coveredBytecode, signingSerializationType, }, - sha256 + sha256, ); /** @@ -515,7 +515,7 @@ export const generateSigningSerializationBCH = ( * serialization algorithm to use */ export const isLegacySigningSerialization = ( - signingSerializationType: number + signingSerializationType: number, ) => { // eslint-disable-next-line no-bitwise, @typescript-eslint/no-magic-numbers const forkValue = signingSerializationType >> 8; diff --git a/src/lib/vm/instruction-sets/common/stack.ts b/src/lib/vm/instruction-sets/common/stack.ts index 040fe303..43f58030 100644 --- a/src/lib/vm/instruction-sets/common/stack.ts +++ b/src/lib/vm/instruction-sets/common/stack.ts @@ -21,12 +21,12 @@ import { export const opToAltStack = < State extends AuthenticationProgramStateAlternateStack & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneStackItem(state, (nextState, [item]) => { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data nextState.alternateStack.push(item); return nextState; }); @@ -34,9 +34,9 @@ export const opToAltStack = < export const opFromAltStack = < State extends AuthenticationProgramStateAlternateStack & AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => { // eslint-disable-next-line functional/immutable-data const item = state.alternateStack.pop(); @@ -47,85 +47,85 @@ export const opFromAltStack = < }; export const op2Drop = ( - state: State + state: State, ) => useTwoStackItems(state, (nextState) => nextState); export const op2Dup = ( - state: State + state: State, ) => useTwoStackItems(state, (nextState, [a, b]) => - pushToStack(nextState, a, b, a.slice(), b.slice()) + pushToStack(nextState, a, b, a.slice(), b.slice()), ); export const op3Dup = ( - state: State + state: State, ) => useThreeStackItems(state, (nextState, [a, b, c]) => - pushToStack(nextState, a, b, c, a.slice(), b.slice(), c.slice()) + pushToStack(nextState, a, b, c, a.slice(), b.slice(), c.slice()), ); export const op2Over = ( - state: State + state: State, ) => useFourStackItems(state, (nextState, [a, b, c, d]) => - pushToStack(nextState, a, b, c, d, a.slice(), b.slice()) + pushToStack(nextState, a, b, c, d, a.slice(), b.slice()), ); export const op2Rot = ( - state: State + state: State, ) => useSixStackItems(state, (nextState, [a, b, c, d, e, f]) => - pushToStack(nextState, c, d, e, f, a, b) + pushToStack(nextState, c, d, e, f, a, b), ); export const op2Swap = ( - state: State + state: State, ) => useFourStackItems(state, (nextState, [a, b, c, d]) => - pushToStack(nextState, c, d, a, b) + pushToStack(nextState, c, d, a, b), ); export const opIfDup = ( - state: State + state: State, ) => useOneStackItem(state, (nextState, [item]) => pushToStack( nextState, - ...(stackItemIsTruthy(item) ? [item, item.slice()] : [item]) - ) + ...(stackItemIsTruthy(item) ? [item, item.slice()] : [item]), + ), ); export const opDepth = ( - state: State + state: State, ) => pushToStack(state, bigIntToVmNumber(BigInt(state.stack.length))); export const opDrop = ( - state: State + state: State, ) => useOneStackItem(state, (nextState) => nextState); export const opDup = ( - state: State + state: State, ) => useOneStackItem(state, (nextState, [item]) => - pushToStack(nextState, item, item.slice()) + pushToStack(nextState, item, item.slice()), ); export const opNip = ( - state: State + state: State, ) => useTwoStackItems(state, (nextState, [, b]) => pushToStack(nextState, b)); export const opOver = ( - state: State + state: State, ) => useTwoStackItems(state, (nextState, [a, b]) => - pushToStack(nextState, a, b, a.slice()) + pushToStack(nextState, a, b, a.slice()), ); export const opPick = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, depth) => { const item = nextState.stack[nextState.stack.length - 1 - Number(depth)]; @@ -137,9 +137,9 @@ export const opPick = < export const opRoll = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, depth) => { const index = nextState.stack.length - 1 - Number(depth); @@ -152,27 +152,27 @@ export const opRoll = < }); export const opRot = ( - state: State + state: State, ) => useThreeStackItems(state, (nextState, [a, b, c]) => - pushToStack(nextState, b, c, a) + pushToStack(nextState, b, c, a), ); export const opSwap = ( - state: State + state: State, ) => useTwoStackItems(state, (nextState, [a, b]) => pushToStack(nextState, b, a)); export const opTuck = ( - state: State + state: State, ) => useTwoStackItems(state, (nextState, [a, b]) => - pushToStack(nextState, b.slice(), a, b) + pushToStack(nextState, b.slice(), a, b), ); export const opSize = ( - state: State + state: State, ) => useOneStackItem(state, (nextState, [item]) => - pushToStack(nextState, item, bigIntToVmNumber(BigInt(item.length))) + pushToStack(nextState, item, bigIntToVmNumber(BigInt(item.length))), ); diff --git a/src/lib/vm/instruction-sets/common/time.ts b/src/lib/vm/instruction-sets/common/time.ts index 9760dce4..8ad1ab7c 100644 --- a/src/lib/vm/instruction-sets/common/time.ts +++ b/src/lib/vm/instruction-sets/common/time.ts @@ -27,10 +27,10 @@ const enum Constants { export const useLocktime = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( state: State, - operation: (nextState: State, locktime: number) => State + operation: (nextState: State, locktime: number) => State, ) => { const item = state.stack[state.stack.length - 1]; if (item === undefined) { @@ -52,7 +52,7 @@ export const useLocktime = < const locktimeTypesAreCompatible = ( locktime: number, - requiredLocktime: number + requiredLocktime: number, ) => (locktime < Constants.locktimeThreshold && requiredLocktime < Constants.locktimeThreshold) || @@ -62,26 +62,26 @@ const locktimeTypesAreCompatible = ( export const opCheckLockTimeVerify = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useLocktime(state, (nextState, requiredLocktime) => { if ( !locktimeTypesAreCompatible( nextState.program.transaction.locktime, - requiredLocktime + requiredLocktime, ) ) { return applyError( nextState, - AuthenticationErrorCommon.incompatibleLocktimeType + AuthenticationErrorCommon.incompatibleLocktimeType, ); } if (requiredLocktime > nextState.program.transaction.locktime) { return applyError( nextState, - AuthenticationErrorCommon.unsatisfiedLocktime + AuthenticationErrorCommon.unsatisfiedLocktime, ); } const { sequenceNumber } = @@ -99,9 +99,9 @@ const includesFlag = (value: number, flag: number) => (value & flag) !== 0; export const opCheckSequenceVerify = < State extends AuthenticationProgramStateError & AuthenticationProgramStateStack & - AuthenticationProgramStateTransactionContext + AuthenticationProgramStateTransactionContext, >( - state: State + state: State, ) => useLocktime( state, @@ -112,7 +112,7 @@ export const opCheckSequenceVerify = < nextState.program.transaction.inputs[nextState.program.inputIndex]!; const sequenceLocktimeDisabled = includesFlag( requiredSequence, - Constants.sequenceLocktimeDisableFlag + Constants.sequenceLocktimeDisableFlag, ); if (sequenceLocktimeDisabled) { return nextState; @@ -124,14 +124,14 @@ export const opCheckSequenceVerify = < ) { return applyError( nextState, - AuthenticationErrorCommon.checkSequenceUnavailable + AuthenticationErrorCommon.checkSequenceUnavailable, ); } if (includesFlag(sequenceNumber, Constants.sequenceLocktimeDisableFlag)) { return applyError( nextState, - AuthenticationErrorCommon.unmatchedSequenceDisable + AuthenticationErrorCommon.unmatchedSequenceDisable, ); } @@ -141,7 +141,7 @@ export const opCheckSequenceVerify = < ) { return applyError( nextState, - AuthenticationErrorCommon.incompatibleSequenceType + AuthenticationErrorCommon.incompatibleSequenceType, ); } @@ -153,10 +153,10 @@ export const opCheckSequenceVerify = < ) { return applyError( nextState, - AuthenticationErrorCommon.unsatisfiedSequenceNumber + AuthenticationErrorCommon.unsatisfiedSequenceNumber, ); } return nextState; - } + }, ); diff --git a/src/lib/vm/instruction-sets/common/types.spec.ts b/src/lib/vm/instruction-sets/common/types.spec.ts index f2d1ff4e..b856a050 100644 --- a/src/lib/vm/instruction-sets/common/types.spec.ts +++ b/src/lib/vm/instruction-sets/common/types.spec.ts @@ -11,7 +11,7 @@ import { } from '../../../lib.js'; // Derived from https://github.com/bitcoinjs/bitcoinjs-lib -const minimallyEncodedVmNumbers: readonly [string, bigint][] = [ +const minimallyEncodedVmNumbers: [string, bigint][] = [ /* spell-checker:disable */ ['', 0n], ['01', 1n], @@ -63,7 +63,7 @@ const minimallyEncodedVmNumbers: readonly [string, bigint][] = [ /* spell-checker:enable */ ]; -const nonMinimallyEncodedVmNumbers: readonly [string, bigint][] = [ +const nonMinimallyEncodedVmNumbers: [string, bigint][] = [ ['00', 0n], ['0000', 0n], ['80', 0n], @@ -75,7 +75,7 @@ const nonMinimallyEncodedVmNumbers: readonly [string, bigint][] = [ ['abcdef4280', -1123012011n], ]; -const equivalentVmNumbers: readonly [string, string][] = [ +const equivalentVmNumbers: [string, string][] = [ ['01020380', '010283'], ['0102030480', '01020384'], ['abcdef4280', 'abcdefc2'], @@ -88,14 +88,14 @@ test('decodeVmNumber', (t) => { vmNumberToBigInt(hexToBin(pair[0]), { requireMinimalEncoding: true, }), - pair[1] + pair[1], ); t.deepEqual( vmNumberToBigInt(hexToBin(pair[0]), { maximumVmNumberByteLength: 4, requireMinimalEncoding: true, }), - pair[1] + pair[1], ); return undefined; }); @@ -106,24 +106,24 @@ test('decodeVmNumber', (t) => { maximumVmNumberByteLength: 5, requireMinimalEncoding: false, }), - pair[1] + pair[1], ); return undefined; - } + }, ); nonMinimallyEncodedVmNumbers.map((pair) => { t.deepEqual( vmNumberToBigInt(hexToBin(pair[0]), { maximumVmNumberByteLength: 5, }), - VmNumberError.requiresMinimal + VmNumberError.requiresMinimal, ); t.deepEqual( vmNumberToBigInt(hexToBin(pair[0]), { maximumVmNumberByteLength: 5, requireMinimalEncoding: true, }), - VmNumberError.requiresMinimal + VmNumberError.requiresMinimal, ); return undefined; }); @@ -136,7 +136,7 @@ test('decodeVmNumber', (t) => { vmNumberToBigInt(hexToBin(pair[1]), { maximumVmNumberByteLength: 5, requireMinimalEncoding: true, - }) + }), ); return undefined; }); @@ -144,13 +144,13 @@ test('decodeVmNumber', (t) => { vmNumberToBigInt(hexToBin('abcdef1234'), { maximumVmNumberByteLength: 4, }), - VmNumberError.outOfRange + VmNumberError.outOfRange, ); t.deepEqual( vmNumberToBigInt(hexToBin('abcdef1234'), { maximumVmNumberByteLength: 5, }), - 223656005035n + 223656005035n, ); }); diff --git a/src/lib/vm/instruction-sets/xec/fixtures/satoshi-client/bitcoin-satoshi-utils.ts b/src/lib/vm/instruction-sets/xec/fixtures/satoshi-client/bitcoin-satoshi-utils.ts index bfc44110..b7b00ea7 100644 --- a/src/lib/vm/instruction-sets/xec/fixtures/satoshi-client/bitcoin-satoshi-utils.ts +++ b/src/lib/vm/instruction-sets/xec/fixtures/satoshi-client/bitcoin-satoshi-utils.ts @@ -11,14 +11,14 @@ import { import { OpcodesXEC } from '../../xec-opcodes.js'; export const bitcoinSatoshiOpcodes = Object.entries( - generateBytecodeMap(OpcodesXEC) -).reduce>( + generateBytecodeMap(OpcodesXEC), +).reduce<{ [opcode: string]: Uint8Array }>( (acc, cur) => ({ ...acc, [cur[0].slice('OP_'.length)]: cur[1] }), { PUSHDATA1: Uint8Array.of(OpcodesXEC.OP_PUSHDATA_1), // eslint-disable-line @typescript-eslint/naming-convention PUSHDATA2: Uint8Array.of(OpcodesXEC.OP_PUSHDATA_2), // eslint-disable-line @typescript-eslint/naming-convention PUSHDATA4: Uint8Array.of(OpcodesXEC.OP_PUSHDATA_4), // eslint-disable-line @typescript-eslint/naming-convention - } + }, ); /** @@ -46,9 +46,8 @@ export const assembleBitcoinSatoshiScript = (satoshiScript: string) => token.startsWith('0x') ? hexToBin(token.slice('0x'.length)) : token.startsWith("'") - ? encodeDataPush(utf8ToBin(token.slice(1, token.length - 1))) - : bitcoinSatoshiOpcodes[token] === undefined - ? encodeDataPush(bigIntToVmNumber(BigInt(token))) - : bitcoinSatoshiOpcodes[token] - ) as Uint8Array[] + ? encodeDataPush(utf8ToBin(token.slice(1, token.length - 1))) + : bitcoinSatoshiOpcodes[token] ?? + encodeDataPush(bigIntToVmNumber(BigInt(token))), + ), ); diff --git a/src/lib/vm/instruction-sets/xec/xec-instruction-set.ts b/src/lib/vm/instruction-sets/xec/xec-instruction-set.ts index f7e3ea62..2e650bb1 100644 --- a/src/lib/vm/instruction-sets/xec/xec-instruction-set.ts +++ b/src/lib/vm/instruction-sets/xec/xec-instruction-set.ts @@ -53,7 +53,7 @@ import { * nodes will refuse to relay them. (Default: `true`) */ export const createInstructionSetXEC = ( - standard = true + standard = true, ): InstructionSet< ResolvedTransactionBCH, AuthenticationProgramBCH, @@ -95,7 +95,7 @@ export const createInstructionSetXEC = ( [OpcodesBCH2022.OP_MIN]: opMin4Byte, [OpcodesBCH2022.OP_MAX]: opMax4Byte, [OpcodesBCH2022.OP_WITHIN]: opWithin4Byte, - } + }, ), [OpcodesBCH2022.OP_INPUTINDEX]: undefinedOperation, [OpcodesBCH2022.OP_ACTIVEBYTECODE]: undefinedOperation, diff --git a/src/lib/vm/instruction-sets/xec/xec-vm-number-operations.ts b/src/lib/vm/instruction-sets/xec/xec-vm-number-operations.ts index ed415e56..2c879ad1 100644 --- a/src/lib/vm/instruction-sets/xec/xec-vm-number-operations.ts +++ b/src/lib/vm/instruction-sets/xec/xec-vm-number-operations.ts @@ -23,9 +23,9 @@ const maximumVmNumberByteLength = ConsensusXEC.maximumVmNumberLength; export const opPick4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, depth) => { const item = nextState.stack[nextState.stack.length - 1 - Number(depth)]; @@ -37,9 +37,9 @@ export const opPick4Byte = < export const opRoll4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, depth) => { const index = nextState.stack.length - 1 - Number(depth); @@ -52,9 +52,9 @@ export const opRoll4Byte = < export const opSplit4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, @@ -63,24 +63,24 @@ export const opSplit4Byte = < return useOneStackItem(nextState, (finalState, [item]) => index < 0 || index > item.length ? applyError(finalState, AuthenticationErrorCommon.invalidSplitIndex) - : pushToStack(finalState, item.slice(0, index), item.slice(index)) + : pushToStack(finalState, item.slice(0, index), item.slice(index)), ); }, - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opNum2Bin4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber(state, (nextState, value) => { const targetLength = Number(value); return targetLength > ConsensusXEC.maximumStackItemLength ? applyError( nextState, - AuthenticationErrorCommon.exceededMaximumStackItemLength + AuthenticationErrorCommon.exceededMaximumStackItemLength, ) : useOneVmNumber( nextState, @@ -89,27 +89,27 @@ export const opNum2Bin4Byte = < return minimallyEncoded.length > targetLength ? applyError( finalState, - AuthenticationErrorCommon.insufficientLength + AuthenticationErrorCommon.insufficientLength, ) : minimallyEncoded.length === targetLength - ? pushToStack(finalState, minimallyEncoded) - : pushToStack( - finalState, - padMinimallyEncodedVmNumber(minimallyEncoded, targetLength) - ); + ? pushToStack(finalState, minimallyEncoded) + : pushToStack( + finalState, + padMinimallyEncodedVmNumber(minimallyEncoded, targetLength), + ); }, { maximumVmNumberByteLength: ConsensusXEC.maximumStackItemLength, requireMinimalEncoding: false, - } + }, ); }); export const opBin2Num4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, @@ -118,130 +118,130 @@ export const opBin2Num4Byte = < return minimallyEncoded.length > ConsensusXEC.maximumVmNumberLength ? applyError( nextState, - AuthenticationErrorCommon.exceededMaximumVmNumberLength + AuthenticationErrorCommon.exceededMaximumVmNumberLength, ) : pushToStack(nextState, minimallyEncoded); }, { maximumVmNumberByteLength: ConsensusXEC.maximumStackItemLength, requireMinimalEncoding: false, - } + }, ); export const op1Add4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, (nextState, [value]) => pushToStack(nextState, bigIntToVmNumber(value + 1n)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const op1Sub4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, (nextState, [value]) => pushToStack(nextState, bigIntToVmNumber(value - 1n)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opNegate4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, (nextState, [value]) => pushToStack(nextState, bigIntToVmNumber(-value)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opAbs4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, (nextState, [value]) => pushToStack(nextState, bigIntToVmNumber(value < 0 ? -value : value)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opNot4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, (nextState, [value]) => pushToStack( nextState, - value === 0n ? bigIntToVmNumber(1n) : bigIntToVmNumber(0n) + value === 0n ? bigIntToVmNumber(1n) : bigIntToVmNumber(0n), ), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const op0NotEqual4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useOneVmNumber( state, (nextState, [value]) => pushToStack( nextState, - value === 0n ? bigIntToVmNumber(0n) : bigIntToVmNumber(1n) + value === 0n ? bigIntToVmNumber(0n) : bigIntToVmNumber(1n), ), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opAdd4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack(nextState, bigIntToVmNumber(firstValue + secondValue)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opSub4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack(nextState, bigIntToVmNumber(firstValue - secondValue)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opDiv4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, @@ -249,14 +249,14 @@ export const opDiv4Byte = < b === 0n ? applyError(nextState, AuthenticationErrorCommon.divisionByZero) : pushToStack(nextState, bigIntToVmNumber(a / b)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opMod4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, @@ -264,168 +264,168 @@ export const opMod4Byte = < b === 0n ? applyError(nextState, AuthenticationErrorCommon.divisionByZero) : pushToStack(nextState, bigIntToVmNumber(a % b)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opBoolAnd4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack( nextState, - booleanToVmNumber(firstValue !== 0n && secondValue !== 0n) + booleanToVmNumber(firstValue !== 0n && secondValue !== 0n), ), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opBoolOr4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack( nextState, - booleanToVmNumber(firstValue !== 0n || secondValue !== 0n) + booleanToVmNumber(firstValue !== 0n || secondValue !== 0n), ), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opNumEqual4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack(nextState, booleanToVmNumber(firstValue === secondValue)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opNumEqualVerify4Byte = combineOperations( opNumEqual4Byte, - opVerify + opVerify, ); export const opNumNotEqual4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack(nextState, booleanToVmNumber(firstValue !== secondValue)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opLessThan4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack(nextState, booleanToVmNumber(firstValue < secondValue)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opLessThanOrEqual4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack(nextState, booleanToVmNumber(firstValue <= secondValue)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opGreaterThan4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack(nextState, booleanToVmNumber(firstValue > secondValue)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opGreaterThanOrEqual4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack(nextState, booleanToVmNumber(firstValue >= secondValue)), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opMin4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack( nextState, - bigIntToVmNumber(firstValue < secondValue ? firstValue : secondValue) + bigIntToVmNumber(firstValue < secondValue ? firstValue : secondValue), ), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opMax4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useTwoVmNumbers( state, (nextState, [firstValue, secondValue]) => pushToStack( nextState, - bigIntToVmNumber(firstValue > secondValue ? firstValue : secondValue) + bigIntToVmNumber(firstValue > secondValue ? firstValue : secondValue), ), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); export const opWithin4Byte = < State extends AuthenticationProgramStateError & - AuthenticationProgramStateStack + AuthenticationProgramStateStack, >( - state: State + state: State, ) => useThreeVmNumbers( state, (nextState, [firstValue, secondValue, thirdValue]) => pushToStack( nextState, - booleanToVmNumber(secondValue <= firstValue && firstValue < thirdValue) + booleanToVmNumber(secondValue <= firstValue && firstValue < thirdValue), ), - { maximumVmNumberByteLength } + { maximumVmNumberByteLength }, ); diff --git a/src/lib/vm/instruction-sets/xec/xec.script-tests.spec.ts b/src/lib/vm/instruction-sets/xec/xec.script-tests.spec.ts index 1eb15917..6a6acf79 100644 --- a/src/lib/vm/instruction-sets/xec/xec.script-tests.spec.ts +++ b/src/lib/vm/instruction-sets/xec/xec.script-tests.spec.ts @@ -103,11 +103,10 @@ pendingTests.map((expectation) => { pendingTests.length } - "${elide(expectation.unlockingBytecodeText, 100)}" | "${elide( expectation.lockingBytecodeText, - 100 + 100, )}" ${ expectation.expectedError === false ? 'passes' : expectation.expectedError } ${expectation.message === undefined ? '' : ` # ${expectation.message}`}`; - // eslint-disable-next-line functional/no-conditional-statement if (expectation.flags.failRequiresReview) { test.todo(`Review failure: ${description}`); } @@ -116,10 +115,10 @@ pendingTests.map((expectation) => { // eslint-disable-next-line complexity (t) => { const unlockingBytecode = assembleBitcoinSatoshiScript( - expectation.unlockingBytecodeText + expectation.unlockingBytecodeText, ); const lockingBytecode = assembleBitcoinSatoshiScript( - expectation.lockingBytecodeText + expectation.lockingBytecodeText, ); const vm = expectation.flags.useStrict ? vmStandard : vmNonStandard; const program = createTestAuthenticationProgramBCH({ @@ -142,7 +141,7 @@ pendingTests.map((expectation) => { t.log('result:', stringify(result)); t.log( 'debug:', - stringifyDebugTraceSummary(summarizeDebugTrace(vm.debug(program))) + stringifyDebugTraceSummary(summarizeDebugTrace(vm.debug(program))), ); if (expectation.expectedError === false) { t.fail('Expected a valid state, but this result is invalid.'); @@ -152,7 +151,7 @@ pendingTests.map((expectation) => { return; } t.pass(); - } + }, ); return undefined; }); diff --git a/src/lib/vm/instruction-sets/xec/xec.spec.ts b/src/lib/vm/instruction-sets/xec/xec.spec.ts index 39f27a9a..f052eecf 100644 --- a/src/lib/vm/instruction-sets/xec/xec.spec.ts +++ b/src/lib/vm/instruction-sets/xec/xec.spec.ts @@ -32,7 +32,7 @@ test('[BCH VM] vm.stateEvaluate: OP_2 OP_2 OP_ADD', (t) => { OpcodesBCH2022.OP_2, OpcodesBCH2022.OP_2, OpcodesBCH2022.OP_ADD, - ]) + ]), ), program, stack: [], @@ -70,7 +70,7 @@ test('[BCH VM] vm.stateDebug: OP_2 OP_2 OP_ADD', (t) => { OpcodesBCH2022.OP_2, OpcodesBCH2022.OP_2, OpcodesBCH2022.OP_ADD, - ]) + ]), ), program, stack: [], @@ -176,7 +176,7 @@ test('[BCH VM] vm.stateStep through: OP_2 OP_2 OP_ADD', (t) => { OpcodesBCH2022.OP_2, OpcodesBCH2022.OP_2, OpcodesBCH2022.OP_ADD, - ]) + ]), ), program, stack: [], @@ -456,8 +456,8 @@ test('verifyTransaction', (t) => { const valueSatoshis = 10000; const transaction = decodeTransactionCommon( hexToBin( - '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) + '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000', + ), ); if (typeof transaction === 'string') { t.fail(transaction); @@ -467,7 +467,7 @@ test('verifyTransaction', (t) => { const sourceOutputs: Output[] = [ { lockingBytecode: hexToBin( - 'a9147ff682419764f7d0e6df75884c28334b9729864387' + 'a9147ff682419764f7d0e6df75884c28334b9729864387', ), valueSatoshis: BigInt(valueSatoshis), }, @@ -482,8 +482,8 @@ test('verifyTransaction: ', (t) => { const valueSatoshis = 10000; const transaction = decodeTransactionCommon( hexToBin( - '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) + '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000', + ), ); if (typeof transaction === 'string') { t.fail(transaction); @@ -493,7 +493,7 @@ test('verifyTransaction: ', (t) => { const sourceOutputs: Output[] = [ { lockingBytecode: hexToBin( - 'a9147ff682419764f7d0e6df75884c28334b9729864387' + 'a9147ff682419764f7d0e6df75884c28334b9729864387', ), valueSatoshis: BigInt(valueSatoshis), }, @@ -507,8 +507,8 @@ test('verifyTransaction: incorrect spentOutputs length', (t) => { const vm = createVirtualMachineXEC(); const transaction = decodeTransactionCommon( hexToBin( - '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) + '0200000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000', + ), ); if (typeof transaction === 'string') { t.fail(transaction); @@ -521,7 +521,7 @@ test('verifyTransaction: incorrect spentOutputs length', (t) => { t.deepEqual( result, 'Unable to verify transaction: a single spent output must be provided for each transaction input.', - stringify(result) + stringify(result), ); }); @@ -530,8 +530,8 @@ test('verifyTransaction: invalid input', (t) => { const valueSatoshis = 10000; const transaction = decodeTransactionCommon( hexToBin( - '0100000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000' - ) + '0100000001600a1b6b0563bbd5b9bef124ff634600df774559da6c51e34a6b97a178be233401000000fc0047304402205e7d56c4e7854f9c672977d6606dd2f0af5494b8e61108e2a92fc920bf8049fc022065262675b0e1a3850d88bd3c56e0eb5fb463d9cdbe49f2f625da5c0f82c765304147304402200d167d5ed77fa169346d295f6fb742e80ae391f0ae086d42b99152bdb23edf4102202c8b85c2583b07b66485b88cacdd14f680bd3aa3f3f12e9f63bc02b4d1cc6d15414c6952210349c17cce8a460f013fdcd286f90f7b0330101d0f3ab4ced44a5a3db764e465882102a438b1662aec9c35f85794600e1d2d3683a43cbb66307cf825fc4486b84695452103d9fffac162e9e15aecbe4f937b951815ccb4f940c850fff9ee52fa70805ae7de53ae000000000100000000000000000d6a0b68656c6c6f20776f726c6400000000', + ), ); if (typeof transaction === 'string') { t.fail(transaction); @@ -541,7 +541,7 @@ test('verifyTransaction: invalid input', (t) => { const sourceOutputs: Output[] = [ { lockingBytecode: hexToBin( - 'a9147ff682419764f7d0e6df75884c28334b9729864387' + 'a9147ff682419764f7d0e6df75884c28334b9729864387', ), valueSatoshis: BigInt(valueSatoshis), }, @@ -551,6 +551,6 @@ test('verifyTransaction: invalid input', (t) => { t.deepEqual( result, 'Error in evaluating input index 0: Program failed a signature verification with a non-null signature (violating the "NULLFAIL" rule).', - stringify(result) + stringify(result), ); }); diff --git a/src/lib/vm/virtual-machine.spec.ts b/src/lib/vm/virtual-machine.spec.ts index 6f980d80..e20ba895 100644 --- a/src/lib/vm/virtual-machine.spec.ts +++ b/src/lib/vm/virtual-machine.spec.ts @@ -25,20 +25,19 @@ const enum SimpleError { FAIL = 'The top stack item must be a 1.', } -interface SimpleResolvedTransaction { - transaction: { instructions: readonly AuthenticationInstruction[] }; -} +type SimpleResolvedTransaction = { + transaction: { instructions: AuthenticationInstruction[] }; +}; -interface SimpleProgram { - instructions: readonly AuthenticationInstruction[]; -} +type SimpleProgram = { + instructions: AuthenticationInstruction[]; +}; -interface SimpleProgramState - extends AuthenticationProgramStateMinimum, - AuthenticationProgramStateStack { - repeated?: true; - error?: string; -} +type SimpleProgramState = AuthenticationProgramStateMinimum & + AuthenticationProgramStateStack & { + repeated?: true; + error?: string; + }; const simpleInstructionSet: InstructionSet< SimpleResolvedTransaction, @@ -105,11 +104,8 @@ const simpleInstructionSet: InstructionSet< }, }, success: (state) => - state.error === undefined - ? state.stack[state.stack.length - 1] === 1 - ? true - : SimpleError.FAIL - : state.error, + state.error ?? + (state.stack[state.stack.length - 1] === 1 || SimpleError.FAIL), undefined: (state) => { state.error = SimpleError.UNDEFINED; return state; @@ -118,7 +114,7 @@ const simpleInstructionSet: InstructionSet< const result = success( evaluate({ instructions: resolvedTransaction.transaction.instructions, - }) + }), ); return typeof result === 'string' ? result : true; }, @@ -126,7 +122,7 @@ const simpleInstructionSet: InstructionSet< const vm = createAuthenticationVirtualMachine(simpleInstructionSet); -const instructions: readonly AuthenticationInstruction[] = [ +const instructions: AuthenticationInstruction[] = [ { opcode: SimpleOps.OP_0 }, { opcode: SimpleOps.OP_INCREMENT }, { opcode: SimpleOps.OP_INCREMENT }, @@ -135,12 +131,12 @@ const instructions: readonly AuthenticationInstruction[] = [ { opcode: SimpleOps.OP_ADD }, ]; -const instructionsFail1: readonly AuthenticationInstruction[] = [ +const instructionsFail1: AuthenticationInstruction[] = [ { opcode: SimpleOps.OP_0 }, { opcode: SimpleOps.OP_DECREMENT }, ]; -const instructionsFail2: readonly AuthenticationInstruction[] = [ +const instructionsFail2: AuthenticationInstruction[] = [ { opcode: SimpleOps.OP_0 }, { opcode: SimpleOps.OP_INCREMENT }, { opcode: SimpleOps.OP_INCREMENT }, @@ -207,14 +203,14 @@ test('vm.verify with a simple instruction set (success)', (t) => { test('vm.verify with a simple instruction set (failure 1)', (t) => { t.deepEqual( vm.verify({ transaction: { instructions: instructionsFail1 } }), - SimpleError.FAIL + SimpleError.FAIL, ); }); test('vm.verify with a simple instruction set (failure 2)', (t) => { t.deepEqual( vm.verify({ transaction: { instructions: instructionsFail2 } }), - SimpleError.EXCESSIVE + SimpleError.EXCESSIVE, ); }); @@ -251,7 +247,7 @@ test('vm.stateStepMutate does not clone (mutating the original state)', (t) => { test('vm.stateSuccess is available', (t) => { t.deepEqual( vm.stateSuccess({ instructions: instructionsFail1, ip: 0, stack: [2] }), - SimpleError.FAIL + SimpleError.FAIL, ); }); @@ -266,12 +262,12 @@ test('vm.stateClone is available', (t) => { instructions, ip: 0, stack: [1, 2, 3], - } + }, ); }); test('vm can control the instruction pointer', (t) => { - const repeated: readonly AuthenticationInstruction[] = [ + const repeated: AuthenticationInstruction[] = [ { opcode: SimpleOps.OP_0 }, { opcode: SimpleOps.OP_INCREMENT }, { opcode: SimpleOps.OP_REPEAT }, diff --git a/src/lib/vm/virtual-machine.ts b/src/lib/vm/virtual-machine.ts index 60e8c04d..f414c54c 100644 --- a/src/lib/vm/virtual-machine.ts +++ b/src/lib/vm/virtual-machine.ts @@ -20,9 +20,9 @@ export type Operation = (state: ProgramState) => ProgramState; * Test a program state, returning an error message. */ export type TestState = (state: ProgramState) => string | true; -export interface InstructionSetOperationMapping { +export type InstructionSetOperationMapping = { [opcode: number]: Operation; -} +}; /** * An {@link InstructionSet} is a mapping of methods that define the operation @@ -37,11 +37,11 @@ export interface InstructionSetOperationMapping { * based on its opcode. Any opcodes that are unassigned by the instruction set * will use the `undefined` operation. */ -export interface InstructionSet< +export type InstructionSet< ResolvedTransaction, AuthenticationProgram, - ProgramState -> { + ProgramState, +> = { /** * Take a `ProgramState` and return a new copy of that `ProgramState`. * @@ -49,6 +49,8 @@ export interface InstructionSet< * This method is used internally by `stateEvaluate`, `stateStep`, and * `stateDebug` to prevent the {@link AuthenticationVirtualMachine} from * mutating an input when mutation is not desirable. + * + * @deprecated use `structuredClone` instead */ clone: Operation; @@ -97,7 +99,7 @@ export interface InstructionSet< */ evaluate: ( program: AuthenticationProgram, - stateEvaluate: (state: Readonly) => ProgramState + stateEvaluate: (state: ProgramState) => ProgramState, ) => ProgramState; /** @@ -151,20 +153,20 @@ export interface InstructionSet< */ verify: ( resolvedTransaction: ResolvedTransaction, - evaluate: (program: Readonly) => ProgramState, - success: (state: ProgramState) => string | true + evaluate: (program: AuthenticationProgram) => ProgramState, + success: (state: ProgramState) => string | true, ) => string | true; -} +}; /** * A set of pure-functions allowing transactions and their authentication * programs to be evaluated and inspected. */ -export interface AuthenticationVirtualMachine< +export type AuthenticationVirtualMachine< ResolvedTransaction, AuthenticationProgram, - ProgramState -> { + ProgramState, +> = { /** * Debug a program by fully evaluating it, cloning and adding each * intermediate `ProgramState` to the returned array. The first `ProgramState` @@ -195,24 +197,26 @@ export interface AuthenticationVirtualMachine< * * @param state - the {@link AuthenticationProgram} to debug */ - debug: (program: Readonly) => ProgramState[]; + debug: (program: AuthenticationProgram) => ProgramState[]; /** * Fully evaluate a program, returning the resulting `ProgramState`. * * @param state - the {@link AuthenticationProgram} to evaluate */ - evaluate: (program: Readonly) => ProgramState; + evaluate: (program: AuthenticationProgram) => ProgramState; /** * Clone the provided ProgramState. + * + * @deprecated use `structuredClone` instead */ - stateClone: (state: Readonly) => ProgramState; + stateClone: (state: ProgramState) => ProgramState; /** * Test the ProgramState to determine if execution should continue. */ - stateContinue: (state: Readonly) => boolean; + stateContinue: (state: ProgramState) => boolean; /** * Return an array of program states by fully evaluating `state`, cloning and @@ -225,7 +229,7 @@ export interface AuthenticationVirtualMachine< * machine and cannot produce a final result. In most cases, `debug` is the * proper method to debug a program. */ - stateDebug: (state: Readonly) => ProgramState[]; + stateDebug: (state: ProgramState) => ProgramState[]; /** * Return a new program state by cloning and fully evaluating `state`. @@ -240,14 +244,14 @@ export interface AuthenticationVirtualMachine< * * @param state - the program state to evaluate */ - stateEvaluate: (state: Readonly) => ProgramState; + stateEvaluate: (state: ProgramState) => ProgramState; /** * Clones and return a new program state advanced by one step. * * @param state - the program state to advance */ - stateStep: (state: Readonly) => ProgramState; + stateStep: (state: ProgramState) => ProgramState; /** * A faster, less-safe version of `step` that directly modifies the provided @@ -294,7 +298,7 @@ export interface AuthenticationVirtualMachine< * and BIP112 for details.) */ verify: (resolvedTransaction: ResolvedTransaction) => string | true; -} +}; /** * Create an {@link AuthenticationVirtualMachine} to evaluate authentication @@ -304,30 +308,30 @@ export interface AuthenticationVirtualMachine< export const createAuthenticationVirtualMachine = < ResolvedTransaction = ResolvedTransactionCommon, AuthenticationProgram = AuthenticationProgramCommon, - ProgramState extends AuthenticationProgramStateMinimum = AuthenticationProgramStateCommon + ProgramState extends + AuthenticationProgramStateMinimum = AuthenticationProgramStateCommon, >( instructionSet: InstructionSet< ResolvedTransaction, AuthenticationProgram, ProgramState - > + >, ): AuthenticationVirtualMachine< ResolvedTransaction, AuthenticationProgram, ProgramState > => { const availableOpcodes = 256; - const operators = range(availableOpcodes).map((codepoint) => - instructionSet.operations[codepoint] === undefined - ? instructionSet.undefined - : instructionSet.operations[codepoint] + const operators = range(availableOpcodes).map( + (codepoint) => + instructionSet.operations[codepoint] ?? instructionSet.undefined, ); // eslint-disable-next-line @typescript-eslint/no-non-null-assertion const getCodepoint = (state: ProgramState) => state.instructions[state.ip]!; const after = (state: ProgramState) => { - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data state.ip += 1; return state; }; @@ -352,11 +356,11 @@ export const createAuthenticationVirtualMachine = < */ const untilComplete = ( state: ProgramState, - stepFunction: (state: ProgramState) => ProgramState + stepFunction: (state: ProgramState) => ProgramState, ) => { - // eslint-disable-next-line functional/no-loop-statement + // eslint-disable-next-line functional/no-loop-statements while (stateContinue(state)) { - // eslint-disable-next-line functional/no-expression-statement, no-param-reassign + // eslint-disable-next-line functional/no-expression-statements, no-param-reassign state = stepFunction(state); } return state; @@ -375,12 +379,12 @@ export const createAuthenticationVirtualMachine = < const stateDebug = (state: ProgramState) => { const trace: ProgramState[] = []; - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data trace.push(state); - // eslint-disable-next-line functional/no-expression-statement + // eslint-disable-next-line functional/no-expression-statements untilComplete(state, (currentState: ProgramState) => { const nextState = stateDebugStep(currentState); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data trace.push(nextState); return nextState; }); @@ -396,7 +400,7 @@ export const createAuthenticationVirtualMachine = < const results: ProgramState[] = []; const proxyDebug = (state: ProgramState) => { const debugResult = stateDebug(state); - // eslint-disable-next-line functional/no-expression-statement, functional/immutable-data + // eslint-disable-next-line functional/no-expression-statements, functional/immutable-data results.push(...debugResult); return debugResult[debugResult.length - 1] ?? state; }; diff --git a/src/lib/vm/vm-types.ts b/src/lib/vm/vm-types.ts index 57be8722..e12c9cef 100644 --- a/src/lib/vm/vm-types.ts +++ b/src/lib/vm/vm-types.ts @@ -4,39 +4,37 @@ import type { TransactionCommon, } from '../lib.js'; -export interface AuthenticationProgramStateMinimum { +export type AuthenticationProgramStateMinimum = { /** * The full list of instructions to be evaluated by the virtual machine. */ - readonly instructions: readonly AuthenticationInstruction[]; + instructions: AuthenticationInstruction[]; /** * Instruction Pointer – the array index of `instructions` that will be read * to identify the next instruction. Once `ip` exceeds the last index of * `instructions` (`ip === instructions.length`), evaluation is complete. */ ip: number; -} +}; -export interface AuthenticationProgramStateStack { +export type AuthenticationProgramStateStack = { /** * The stack is the primary workspace of the virtual machine. Most virtual * machine operations create, read, update, or delete bytecode values * held on the stack. */ stack: StackType[]; -} +}; -export interface AuthenticationProgramStateAlternateStack< - StackType = Uint8Array -> { +export type AuthenticationProgramStateAlternateStack = { /** * The "alternate stack" is separate stack on which `OP_TOALTSTACK` and * `OP_FROMALTSTACK` operate in bitcoin virtual machines. */ alternateStack: StackType[]; -} +}; -export interface AuthenticationProgramStateControlStack { +export type AuthenticationProgramStateControlStack = { /** * An array of boolean values representing the current execution status of the * program. This allows the state to track nested conditional branches. @@ -51,33 +49,33 @@ export interface AuthenticationProgramStateControlStack { * A.K.A. `vfExec` in the C++ implementation. */ controlStack: ItemType[]; -} +}; -export interface AuthenticationProgramStateError { +export type AuthenticationProgramStateError = { /** * If present, the error returned by the most recent virtual machine * operation. */ error?: string; -} +}; /** * A complete view of the information necessary to validate a transaction. */ -export interface ResolvedTransactionCommon { +export type ResolvedTransactionCommon = { sourceOutputs: Output[]; transaction: TransactionCommon; -} +}; /** * A complete view of the information necessary to validate a specified input in * a transaction. */ -export interface AuthenticationProgramCommon extends ResolvedTransactionCommon { +export type AuthenticationProgramCommon = ResolvedTransactionCommon & { inputIndex: number; -} +}; -export interface AuthenticationProgramStateCodeSeparator { +export type AuthenticationProgramStateCodeSeparator = { /** * The `lastCodeSeparator` indicates the index of the most recently executed * `OP_CODESEPARATOR` instruction. In each of the signing serialization @@ -90,9 +88,9 @@ export interface AuthenticationProgramStateCodeSeparator { * array is included in the signing serialization. */ lastCodeSeparator: number; -} +}; -export interface AuthenticationProgramStateSignatureAnalysis { +export type AuthenticationProgramStateSignatureAnalysis = { /** * An array of the `Uint8Array` values used in signature verification over the * course of this program. Each raw signing serialization and data signature @@ -131,24 +129,24 @@ export interface AuthenticationProgramStateSignatureAnalysis { message: Uint8Array; } )[]; -} +}; -export interface AuthenticationProgramStateResourceLimits { +export type AuthenticationProgramStateResourceLimits = { operationCount: number; signatureOperationsCount: number; -} +}; -export interface AuthenticationProgramStateTransactionContext { - program: Readonly; -} +export type AuthenticationProgramStateTransactionContext = { + program: AuthenticationProgramCommon; +}; -export interface AuthenticationProgramStateCommon - extends AuthenticationProgramStateMinimum, - AuthenticationProgramStateStack, - AuthenticationProgramStateAlternateStack, - AuthenticationProgramStateControlStack, - AuthenticationProgramStateError, - AuthenticationProgramStateCodeSeparator, - AuthenticationProgramStateSignatureAnalysis, - AuthenticationProgramStateResourceLimits, - AuthenticationProgramStateTransactionContext {} +export type AuthenticationProgramStateCommon = + AuthenticationProgramStateAlternateStack & + AuthenticationProgramStateCodeSeparator & + AuthenticationProgramStateControlStack & + AuthenticationProgramStateError & + AuthenticationProgramStateMinimum & + AuthenticationProgramStateResourceLimits & + AuthenticationProgramStateSignatureAnalysis & + AuthenticationProgramStateStack & + AuthenticationProgramStateTransactionContext; diff --git a/src/lib/vmb-tests/bch-vmb-test-mixins.ts b/src/lib/vmb-tests/bch-vmb-test-mixins.ts index 007e55c0..b2ec010d 100644 --- a/src/lib/vmb-tests/bch-vmb-test-mixins.ts +++ b/src/lib/vmb-tests/bch-vmb-test-mixins.ts @@ -1,61 +1,61 @@ import type { - AuthenticationTemplateScenario, - AuthenticationTemplateScenarioInput, - AuthenticationTemplateScenarioSourceOutput, - AuthenticationTemplateScenarioTransactionOutput, + WalletTemplateScenario, + WalletTemplateScenarioInput, + WalletTemplateScenarioSourceOutput, + WalletTemplateScenarioTransactionOutput, } from '../lib.js'; -export const simpleP2pkhOutput: AuthenticationTemplateScenarioSourceOutput = { +export const simpleP2pkhOutput: WalletTemplateScenarioSourceOutput = { lockingBytecode: { script: 'lockP2pkh' }, valueSatoshis: 10_000, }; -export const simpleP2pkhInput: AuthenticationTemplateScenarioInput = { +export const simpleP2pkhInput: WalletTemplateScenarioInput = { unlockingBytecode: { script: 'unlockP2pkh' }, }; -export const emptyP2sh20Output: AuthenticationTemplateScenarioSourceOutput = { +export const emptyP2sh20Output: WalletTemplateScenarioSourceOutput = { lockingBytecode: { script: 'lockEmptyP2sh20' }, valueSatoshis: 10_000, }; -export const emptyP2sh20Input: AuthenticationTemplateScenarioInput = { +export const emptyP2sh20Input: WalletTemplateScenarioInput = { unlockingBytecode: { script: 'unlockEmptyP2sh20' }, }; -export const vmbTestOutput: AuthenticationTemplateScenarioTransactionOutput = { +export const vmbTestOutput: WalletTemplateScenarioTransactionOutput = { lockingBytecode: { script: 'vmbTestNullData' }, valueSatoshis: 0, }; -export const slotOutput: AuthenticationTemplateScenarioSourceOutput = { +export const slotOutput: WalletTemplateScenarioSourceOutput = { lockingBytecode: ['slot'], valueSatoshis: 10_000, }; -export const slotInput: AuthenticationTemplateScenarioInput = { +export const slotInput: WalletTemplateScenarioInput = { unlockingBytecode: ['slot'], }; -export const slot0Scenario: AuthenticationTemplateScenario = { +export const slot0Scenario: WalletTemplateScenario = { sourceOutputs: [slotOutput, simpleP2pkhOutput], transaction: { inputs: [slotInput, simpleP2pkhInput], outputs: [vmbTestOutput], }, }; -export const slot1Scenario: AuthenticationTemplateScenario = { +export const slot1Scenario: WalletTemplateScenario = { sourceOutputs: [simpleP2pkhOutput, slotOutput], transaction: { inputs: [simpleP2pkhInput, slotInput], outputs: [vmbTestOutput], }, }; -export const slot2Scenario: AuthenticationTemplateScenario = { +export const slot2Scenario: WalletTemplateScenario = { sourceOutputs: [simpleP2pkhOutput, simpleP2pkhOutput, slotOutput], transaction: { inputs: [simpleP2pkhInput, simpleP2pkhInput, slotInput], outputs: [vmbTestOutput], }, }; -export const slot9Scenario: AuthenticationTemplateScenario = { +export const slot9Scenario: WalletTemplateScenario = { sourceOutputs: [ simpleP2pkhOutput, simpleP2pkhOutput, diff --git a/src/lib/vmb-tests/bch-vmb-test-utils.spec.ts b/src/lib/vmb-tests/bch-vmb-test-utils.spec.ts index 51b77ae5..52978f61 100644 --- a/src/lib/vmb-tests/bch-vmb-test-utils.spec.ts +++ b/src/lib/vmb-tests/bch-vmb-test-utils.spec.ts @@ -59,6 +59,6 @@ test('vmbTestGroupToVmbTests', (t) => { ], ], - `Stringified test vector:\n${stringifyTestVector(result)}` + `Stringified test vector:\n${stringifyTestVector(result)}`, ); }); diff --git a/src/lib/vmb-tests/bch-vmb-test-utils.ts b/src/lib/vmb-tests/bch-vmb-test-utils.ts index 530d1318..4658237d 100644 --- a/src/lib/vmb-tests/bch-vmb-test-utils.ts +++ b/src/lib/vmb-tests/bch-vmb-test-utils.ts @@ -3,13 +3,10 @@ */ import { encodeBech32, regroupBits } from '../address/address.js'; import { createCompilerBCH } from '../compiler/compiler-bch/compiler-bch.js'; -import { authenticationTemplateToCompilerConfiguration } from '../compiler/compiler-utils.js'; +import { walletTemplateToCompilerConfiguration } from '../compiler/compiler-utils.js'; import { sha256 } from '../crypto/crypto.js'; import { binToHex, flattenBinArray } from '../format/format.js'; -import type { - AuthenticationTemplate, - AuthenticationTemplateScenario, -} from '../lib.js'; +import type { WalletTemplate, WalletTemplateScenario } from '../lib.js'; import { encodeTransaction, encodeTransactionOutputs, @@ -71,7 +68,7 @@ export type VmbTestMasterBCH = [ * * This field is left undefined for `inputIndex`s of `0` (the default). */ - inputIndex?: number + inputIndex?: number, ]; export type VmbTest = [ @@ -81,7 +78,7 @@ export type VmbTest = [ redeemOrLockingScriptAsm: string, testTransactionHex: string, sourceOutputsHex: string, - inputIndex?: number + inputIndex?: number, ]; /** @@ -152,9 +149,8 @@ const testSetOverrideListBCH = [ ] as const; type TestSetOverrideListBCH = (typeof testSetOverrideListBCH)[number]; -// eslint-disable-next-line @typescript-eslint/no-unused-vars const testList = (_list: Readonly[]>) => 0; -// eslint-disable-next-line functional/no-expression-statement +// eslint-disable-next-line functional/no-expression-statements testList(testSetOverrideListBCH); type TestPlan = { @@ -715,16 +711,16 @@ export type VmbTestDefinition = [ /** * A scenario that extends the default scenario for use with this test. */ - scenario?: AuthenticationTemplateScenario, + scenario?: WalletTemplateScenario, /** * An additional mapping of scripts to make available during scenario * generation. */ - additionalScripts?: AuthenticationTemplate['scripts'] + additionalScripts?: WalletTemplate['scripts'], ]; export type VmbTestDefinitionGroup = [ groupDescription: string, - tests: VmbTestDefinition[] + tests: VmbTestDefinition[], ]; /** @@ -734,7 +730,7 @@ export type VmbTestDefinitionGroup = [ const defaultShortIdLength = 5; const planTestsBCH = ( - labels?: readonly string[] + labels?: readonly string[], // eslint-disable-next-line @typescript-eslint/no-non-null-assertion ) => supportedTestSetOverridesBCH[(labels ?? []).join(',')]!; @@ -745,7 +741,7 @@ const planTestsBCH = ( export const vmbTestDefinitionToVmbTests = ( testDefinition: VmbTestDefinition, groupName = '', - shortIdLength = defaultShortIdLength + shortIdLength = defaultShortIdLength, ): VmbTestMasterBCH[] => { const [ unlockingScript, @@ -761,7 +757,7 @@ export const vmbTestDefinitionToVmbTests = ( const scenarioDefinition = { extends: 'vmb_default', ...scenarioOverride }; - const configuration = authenticationTemplateToCompilerConfiguration({ + const configuration = walletTemplateToCompilerConfiguration({ entities: { tester: { variables: { key1: { type: 'HdKey' } } } }, scenarios: { [scenarioId]: scenarioDefinition, @@ -816,25 +812,25 @@ export const vmbTestDefinitionToVmbTests = ( }[planItem.mode], }); if (typeof result === 'string') { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new Error(`Error while generating "${description}" - ${result}`); } if (typeof result.scenario === 'string') { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new Error( - `Error while generating "${description}" - ${result.scenario}` + `Error while generating "${description}" - ${result.scenario}`, ); } const encodedTx = encodeTransaction(result.scenario.program.transaction); const encodedSourceOutputs = encodeTransactionOutputs( - result.scenario.program.sourceOutputs + result.scenario.program.sourceOutputs, ); const shortId = encodeBech32( regroupBits({ bin: sha256.hash(flattenBinArray([encodedTx, encodedSourceOutputs])), resultWordLength: 5, sourceWordLength: 8, - }) as number[] + }) as number[], ).slice(0, shortIdLength); const testCase = [ @@ -859,7 +855,7 @@ export const vmbTestDefinitionToVmbTests = ( export const vmbTestGroupToVmbTests = (testGroup: VmbTestDefinitionGroup) => testGroup[1].map((testDefinition) => - vmbTestDefinitionToVmbTests(testDefinition, testGroup[0]) + vmbTestDefinitionToVmbTests(testDefinition, testGroup[0]), ); /** @@ -883,7 +879,7 @@ export const vmbTestGroupToVmbTests = (testGroup: VmbTestDefinitionGroup) => * separate files). */ export const vmbTestPartitionMasterTestList = ( - masterTestList: VmbTestMasterBCH[] + masterTestList: VmbTestMasterBCH[], ) => masterTestList.reduce<{ [key in TestSetIdBCH]?: VmbTest[]; @@ -909,9 +905,9 @@ export const vmbTestPartitionMasterTestList = ( ...(inputIndex === undefined ? [] : [inputIndex]), ] as VmbTest; - // eslint-disable-next-line functional/no-return-void, functional/no-expression-statement + // eslint-disable-next-line functional/no-return-void, functional/no-expression-statements testSets.forEach((testSet) => { - // eslint-disable-next-line functional/immutable-data, functional/no-expression-statement + // eslint-disable-next-line functional/immutable-data, functional/no-expression-statements accumulatedTestSets[testSet] = [ ...(accumulatedTestSets[testSet] ?? []), withoutSets, diff --git a/src/lib/vmb-tests/bch-vmb-test.spec.helper.ts b/src/lib/vmb-tests/bch-vmb-test.spec.helper.ts index 2d230c93..47767c22 100644 --- a/src/lib/vmb-tests/bch-vmb-test.spec.helper.ts +++ b/src/lib/vmb-tests/bch-vmb-test.spec.helper.ts @@ -1,4 +1,4 @@ -/* eslint-disable no-console, functional/no-expression-statement, @typescript-eslint/no-non-null-assertion */ +/* eslint-disable no-console, functional/no-expression-statements, @typescript-eslint/no-non-null-assertion */ import type { Output, ReadResult, Transaction } from '../lib.js'; import { createVirtualMachineBCH2022, @@ -31,13 +31,14 @@ const vms = { const isVm = (vmId: string): vmId is keyof typeof vms => Object.keys(vms).includes(vmId); +// cspell:ignore crzlx const usageInfo = ` This script runs a single VMB test on the requested VM, logging the results and debugging information. Use the "-v" flag to output the full debug trace. Available VMs: ${Object.keys(vms).join(', ')} Usage: yarn test:unit:vmb_test [-v] -E.g.: yarn test:unit:vmb_test bch_2022_standard 9046t +E.g.: yarn test:unit:vmb_test bch_2023_standard crzlx `; const [, , vmId, testId, useVerbose] = process.argv; @@ -64,7 +65,7 @@ const testDefinition = ( testTransactionHex: string, sourceOutputsHex: string, testSets: string[], - inputIndex?: number + inputIndex?: number, ][] ).find(([shortId]) => shortId === testId); @@ -114,7 +115,7 @@ const unexpectedFailingIndexDebugTrace = : undefined; const isP2sh20 = isPayToScriptHash20( - sourceOutputs[testedIndex]!.lockingBytecode + sourceOutputs[testedIndex]!.lockingBytecode, ); const verbose = ` @@ -168,7 +169,7 @@ Note: an unexpected index is failing; the input index under test is ${testedInde Evaluation at failing index (${failingIndex!}): ${stringifyDebugTraceSummary( - summarizeDebugTrace(unexpectedFailingIndexDebugTrace) + summarizeDebugTrace(unexpectedFailingIndexDebugTrace), )} ` } diff --git a/src/lib/vmb-tests/bch-vmb-tests-invalid.spec.helper.ts b/src/lib/vmb-tests/bch-vmb-tests-invalid.spec.helper.ts index e7ef8bda..db267a7d 100644 --- a/src/lib/vmb-tests/bch-vmb-tests-invalid.spec.helper.ts +++ b/src/lib/vmb-tests/bch-vmb-tests-invalid.spec.helper.ts @@ -1,4 +1,4 @@ -/* eslint-disable functional/no-expression-statement */ +/* eslint-disable functional/no-expression-statements */ /** * This script produces a `*reasons.json` file for every VMB test that is * expected to fail. Run it with: `yarn gen:vmb-tests`. @@ -32,10 +32,10 @@ const writeReasonsFile = ( }: { supportsTokens: boolean; vm: AuthenticationVirtualMachineBCH | AuthenticationVirtualMachineBCHCHIPs; - } + }, ) => { const vmbTests = JSON.parse( - readFileSync(invalidJsonPath, { encoding: 'utf8' }) + readFileSync(invalidJsonPath, { encoding: 'utf8' }), ) as VmbTest[]; const getReason = ({ sourceOutputsHex, @@ -66,7 +66,7 @@ const writeReasonsFile = ( [shortId]: getReason({ sourceOutputsHex, txHex }), }; }, - {} + {}, ); writeFileSync(reasonsPath, JSON.stringify(reasons), { encoding: 'utf8' }); }; @@ -77,40 +77,40 @@ const rel = (path: string) => resolve(basePath, path); writeReasonsFile( rel('./bch_vmb_tests_2022_invalid.json'), rel('./bch_vmb_tests_2022_invalid_reasons.json'), - { supportsTokens: false, vm: createVirtualMachineBCH2022(false) } + { supportsTokens: false, vm: createVirtualMachineBCH2022(false) }, ); writeReasonsFile( rel('./bch_vmb_tests_2022_nonstandard.json'), rel('./bch_vmb_tests_2022_nonstandard_reasons.json'), - { supportsTokens: false, vm: createVirtualMachineBCH2022(true) } + { supportsTokens: false, vm: createVirtualMachineBCH2022(true) }, ); writeReasonsFile( rel('./CHIPs/bch_vmb_tests_before_chip_cashtokens_invalid.json'), rel('./CHIPs/bch_vmb_tests_before_chip_cashtokens_invalid_reasons.json'), - { supportsTokens: false, vm: createVirtualMachineBCH2022(false) } + { supportsTokens: false, vm: createVirtualMachineBCH2022(false) }, ); writeReasonsFile( rel('./CHIPs/bch_vmb_tests_before_chip_cashtokens_nonstandard.json'), rel('./CHIPs/bch_vmb_tests_before_chip_cashtokens_nonstandard_reasons.json'), - { supportsTokens: false, vm: createVirtualMachineBCH2022(true) } + { supportsTokens: false, vm: createVirtualMachineBCH2022(true) }, ); writeReasonsFile( rel('./CHIPs/bch_vmb_tests_chip_cashtokens_invalid.json'), rel('./CHIPs/bch_vmb_tests_chip_cashtokens_invalid_reasons.json'), - { supportsTokens: true, vm: createVirtualMachineBCH2023(false) } + { supportsTokens: true, vm: createVirtualMachineBCH2023(false) }, ); writeReasonsFile( rel('./CHIPs/bch_vmb_tests_chip_cashtokens_nonstandard.json'), rel('./CHIPs/bch_vmb_tests_chip_cashtokens_nonstandard_reasons.json'), - { supportsTokens: true, vm: createVirtualMachineBCH2023(true) } + { supportsTokens: true, vm: createVirtualMachineBCH2023(true) }, ); writeReasonsFile( rel('./CHIPs/bch_vmb_tests_chip_loops_invalid.json'), rel('./CHIPs/bch_vmb_tests_chip_loops_invalid_reasons.json'), - { supportsTokens: true, vm: createVirtualMachineBCHCHIPs(false) } + { supportsTokens: true, vm: createVirtualMachineBCHCHIPs(false) }, ); writeReasonsFile( rel('./CHIPs/bch_vmb_tests_chip_loops_nonstandard.json'), rel('./CHIPs/bch_vmb_tests_chip_loops_nonstandard_reasons.json'), - { supportsTokens: true, vm: createVirtualMachineBCHCHIPs(true) } + { supportsTokens: true, vm: createVirtualMachineBCHCHIPs(true) }, ); diff --git a/src/lib/vmb-tests/bch-vmb-tests.cashtokens.ts b/src/lib/vmb-tests/bch-vmb-tests.cashtokens.ts index d56c4bd6..8d6421ba 100644 --- a/src/lib/vmb-tests/bch-vmb-tests.cashtokens.ts +++ b/src/lib/vmb-tests/bch-vmb-tests.cashtokens.ts @@ -5365,8 +5365,8 @@ export const cashTokenTestDefinitionsBCH: VmbTestDefinitionGroup = [ cashAssemblyToBin( `OP_RETURN <0x${range(479) .map((i) => binToHex(Uint8Array.of(i))) - .join('')}>` - ) as Uint8Array + .join('')}>`, + ) as Uint8Array, ), token: { amount: 253 }, valueSatoshis: 1_000, @@ -5390,8 +5390,8 @@ export const cashTokenTestDefinitionsBCH: VmbTestDefinitionGroup = [ cashAssemblyToBin( `OP_RETURN <0x${range(480) .map((i) => binToHex(Uint8Array.of(i))) - .join('')}>` - ) as Uint8Array + .join('')}>`, + ) as Uint8Array, ), token: { amount: 253 }, valueSatoshis: 1_000, @@ -5429,8 +5429,8 @@ export const cashTokenTestDefinitionsBCH: VmbTestDefinitionGroup = [ cashAssemblyToBin( `OP_RETURN <0x${range(516) .map((i) => binToHex(Uint8Array.of(i))) - .join('')}>` - ) as Uint8Array + .join('')}>`, + ) as Uint8Array, ), token: { amount: 253 }, valueSatoshis: 1_000, @@ -5454,8 +5454,8 @@ export const cashTokenTestDefinitionsBCH: VmbTestDefinitionGroup = [ cashAssemblyToBin( `OP_RETURN <0x${range(517) .map((i) => binToHex(Uint8Array.of(i))) - .join('')}>` - ) as Uint8Array + .join('')}>`, + ) as Uint8Array, ), token: { amount: 253 }, valueSatoshis: 1_000, diff --git a/src/lib/vmb-tests/bch-vmb-tests.live.spec.helper.ts b/src/lib/vmb-tests/bch-vmb-tests.live.spec.helper.ts index eef531f4..5b48774d 100644 --- a/src/lib/vmb-tests/bch-vmb-tests.live.spec.helper.ts +++ b/src/lib/vmb-tests/bch-vmb-tests.live.spec.helper.ts @@ -1,4 +1,4 @@ -/* eslint-disable no-console, functional/no-expression-statement */ +/* eslint-disable no-console, functional/no-expression-statements */ // TODO: finish this simple wallet CLI @@ -7,7 +7,6 @@ import { writeFileSync } from 'node:fs'; import { resolve } from 'node:path'; import { - authenticationTemplateToCompilerConfiguration, binsAreEqual, binToHex, cashAddressToLockingBytecode, @@ -25,6 +24,7 @@ import { lockingBytecodeToBase58Address, lockingBytecodeToCashAddress, stringify, + walletTemplateToCompilerConfiguration, } from '../lib.js'; const usageInfo = ` @@ -66,7 +66,7 @@ const fundingAddressIndex = 0; if (arg1 === 'private') { if (arg2 !== undefined && !isHex(arg2)) { console.log( - 'Seed must be hex encoded. To use a random seed, omit this option.' + 'Seed must be hex encoded. To use a random seed, omit this option.', ); process.exit(1); } @@ -76,7 +76,7 @@ if (arg1 === 'private') { const node = deriveHdPrivateNodeFromSeed(seed); if (!node.valid) { console.log( - `Tell everyone you found an invalid HD seed 🀯: ${binToHex(seed)}` + `Tell everyone you found an invalid HD seed 🀯: ${binToHex(seed)}`, ); process.exit(1); } @@ -120,11 +120,11 @@ if (arg1 === 'address') { }; const legacyAddress = lockingBytecodeToBase58Address( bytecode, - 'mainnet' + 'mainnet', ) as string; const copayAddress = lockingBytecodeToBase58Address( bytecode, - 'copayBCH' + 'copayBCH', ) as string; console.log(` Derived address index ${fundingAddressIndex} from key ID: ${binToHex(keyId)}. @@ -149,7 +149,7 @@ if (arg1 !== 'generate') { } if (arg2 === undefined || arg3 === undefined) { console.log( - 'Required arguments for "generate": ' + 'Required arguments for "generate": ', ); console.log(usageInfo); process.exit(1); @@ -168,10 +168,10 @@ const fundingLockingBytecode = hdPrivateKeyToP2pkhLockingBytecode({ }); const fundingAddress = lockingBytecodeToCashAddress( fundingLockingBytecode, - 'bitcoincash' + 'bitcoincash', ) as string; const fundingUtxoIndex = fundingTransaction.outputs.findIndex((output) => - binsAreEqual(output.lockingBytecode, fundingLockingBytecode) + binsAreEqual(output.lockingBytecode, fundingLockingBytecode), ); if (fundingUtxoIndex === -1) { @@ -179,7 +179,7 @@ if (fundingUtxoIndex === -1) { `The provided funding transaction does not have an output which pays to address index ${fundingAddressIndex} of the provided HD private key. Is this the correct transaction? Expected locking bytecode: ${binToHex(fundingLockingBytecode)} CashAddress: ${fundingAddress} -` +`, ); process.exit(1); } @@ -192,7 +192,7 @@ const outputAddress = 'bitcoincash:qq2pq6z974lrdq8s0zkrl79efs3xap98fqvz9f30fl'; const outputLockingBytecode = cashAddressToLockingBytecode(outputAddress); if (typeof outputLockingBytecode === 'string') { console.log( - `The output address "${outputAddress}" is invalid: ${outputLockingBytecode}` + `The output address "${outputAddress}" is invalid: ${outputLockingBytecode}`, ); process.exit(1); } @@ -201,7 +201,7 @@ const fundingUtxoValue = Number(fundingUtxo.valueSatoshis); const expectedInputTransactionSizeBytes = 1000; const setupOutputValue = fundingUtxoValue - expectedInputTransactionSizeBytes; const finalOutputValue = setupOutputValue - expectedInputTransactionSizeBytes; -const configuration = authenticationTemplateToCompilerConfiguration({ +const configuration = walletTemplateToCompilerConfiguration({ entities: { owner: { variables: { key: { type: 'HdKey' } } } }, scenarios: { setupTx: { @@ -266,7 +266,7 @@ if (typeof setupTx === 'string') { } if (typeof setupTx.scenario === 'string') { console.log( - `Error while generating setupTransaction.scenario - ${setupTx.scenario}` + `Error while generating setupTransaction.scenario - ${setupTx.scenario}`, ); process.exit(1); } diff --git a/src/lib/vmb-tests/bch-vmb-tests.signing-serialization.ts b/src/lib/vmb-tests/bch-vmb-tests.signing-serialization.ts index c0f6d6fd..208992cb 100644 --- a/src/lib/vmb-tests/bch-vmb-tests.signing-serialization.ts +++ b/src/lib/vmb-tests/bch-vmb-tests.signing-serialization.ts @@ -2,7 +2,7 @@ * See `bch-vmb-tests.ts` for details about modifying this file. */ -import type { AuthenticationTemplateScenario, VmbTestDefinition, VmbTestDefinitionGroup } from '../lib.js'; +import type { VmbTestDefinition, VmbTestDefinitionGroup, WalletTemplateScenario } from '../lib.js'; import { emptyP2sh20Input, emptyP2sh20Output, simpleP2pkhInput, simpleP2pkhOutput } from './bch-vmb-test-mixins.js'; @@ -46,7 +46,7 @@ const verifyAlgorithm = algorithms.map((algorithm) => [ { sourceOutputs: [{ lockingBytecode: ['slot'], valueSatoshis: 10_000 }], transaction: { inputs: [{ unlockingBytecode: ['slot'] }], outputs: [{ lockingBytecode: { script: 'vmbTestNullData' }, valueSatoshis: 0 }] } }, ]); -const changeScenario = (testDefinitions: VmbTestDefinition[], appendDescription: string, newScenario: AuthenticationTemplateScenario) => testDefinitions.map(([unlockingScript, redeemOrLockingScript, testDescription, testSetOverrideLabels]) => [unlockingScript, redeemOrLockingScript, `${testDescription}${appendDescription}`, testSetOverrideLabels, newScenario]); +const changeScenario = (testDefinitions: VmbTestDefinition[], appendDescription: string, newScenario: WalletTemplateScenario) => testDefinitions.map(([unlockingScript, redeemOrLockingScript, testDescription, testSetOverrideLabels]) => [unlockingScript, redeemOrLockingScript, `${testDescription}${appendDescription}`, testSetOverrideLabels, newScenario]); const verifyAlgorithmWithP2pkhInput = changeScenario(verifyAlgorithm, ' (with P2PKH input)', { sourceOutputs: [simpleP2pkhOutput, { lockingBytecode: ['slot'], valueSatoshis: 10_000 }], transaction: { inputs: [simpleP2pkhInput, { unlockingBytecode: ['slot'] }], outputs: [{ lockingBytecode: { script: 'vmbTestNullData' }, valueSatoshis: 0 }] } }); diff --git a/src/lib/vmb-tests/bch-vmb-tests.spec.helper.ts b/src/lib/vmb-tests/bch-vmb-tests.spec.helper.ts index 28d2ca6e..75f9e98e 100644 --- a/src/lib/vmb-tests/bch-vmb-tests.spec.helper.ts +++ b/src/lib/vmb-tests/bch-vmb-tests.spec.helper.ts @@ -1,4 +1,4 @@ -/* eslint-disable functional/no-expression-statement */ +/* eslint-disable functional/no-expression-statements */ /** * This script generates all bch_vmb_tests, run it with: `yarn gen:vmb-tests`. @@ -15,7 +15,7 @@ import { vmbTestsBCH } from './bch-vmb-tests.js'; */ const [, , outputDir] = process.argv; if (outputDir === undefined) { - // eslint-disable-next-line functional/no-throw-statement + // eslint-disable-next-line functional/no-throw-statements throw new Error('Script requires an output directory.'); } const outputAbsolutePath = resolve(outputDir); @@ -25,7 +25,7 @@ const allTestCases = vmbTestsBCH.flat(testGroupsAndTypes); writeFileSync( `${outputAbsolutePath}/bch_vmb_tests.json`, JSON.stringify(allTestCases), - { encoding: 'utf8' } + { encoding: 'utf8' }, ); const partitionedTestCases = vmbTestPartitionMasterTestList(allTestCases); diff --git a/src/lib/vmb-tests/bch-vmb-tests.spec.ts b/src/lib/vmb-tests/bch-vmb-tests.spec.ts index 20557113..9f6e4031 100644 --- a/src/lib/vmb-tests/bch-vmb-tests.spec.ts +++ b/src/lib/vmb-tests/bch-vmb-tests.spec.ts @@ -68,16 +68,16 @@ test('bch_vmb_tests.json is up to date and contains no test ID collisions', (t) t.deepEqual( allTestCases, vmbTestsBCHJson, - 'New test definitions were added to `bch-vmb.tests.ts`, but the generated tests were not updated. Run "yarn gen:vmb-tests" to correct this issue. (Note: tsc watch tasks don\'t always update cached JSON imports when the source file changes. You may need to restart tsc to clear this error after re-generating tests.)' + 'New test definitions were added to `bch-vmb.tests.ts`, but the generated tests were not updated. Run "yarn gen:vmb-tests" to correct this issue. (Note: tsc watch tasks don\'t always update cached JSON imports when the source file changes. You may need to restart tsc to clear this error after re-generating tests.)', ); const testCaseIds = allTestCases.map((testCase) => testCase[0]); const descriptions = allTestCases.map((testCase) => testCase[1]); const idDup = testCaseIds.findIndex( - (id, i) => testCaseIds.lastIndexOf(id) !== i + (id, i) => testCaseIds.lastIndexOf(id) !== i, ); const descDup = descriptions.findIndex( - (desc, i) => descriptions.lastIndexOf(desc) !== i + (desc, i) => descriptions.lastIndexOf(desc) !== i, ); /* eslint-disable @typescript-eslint/no-non-null-assertion */ @@ -139,16 +139,18 @@ const testVm = ({ supportsTokens ? readTransactionCommon : readTransactionNonTokenAware )({ bin: hexToBin(txHex), index: 0 }); if (typeof sourceOutputsRead === 'string') { + // eslint-disable-next-line @typescript-eslint/no-unused-expressions expectedToSucceed ? t.fail(sourceOutputsRead) : t.pass(); return; } if (typeof transactionRead === 'string') { + // eslint-disable-next-line @typescript-eslint/no-unused-expressions expectedToSucceed ? t.fail(transactionRead) : t.pass(); return; } const sourceOutputs = sourceOutputsRead.result; const transaction = transactionRead.result; - if (debug !== undefined) debugger; // eslint-disable-line functional/no-conditional-statement, no-debugger + if (debug !== undefined) debugger; // eslint-disable-line no-debugger const result = vm.verify({ sourceOutputs, transaction }); const moreDetails = `For more detailed debugging information, run: "yarn test:unit:vmb_test ${vmName} ${shortId} -v"`; const logDebugInfo = () => { @@ -165,10 +167,10 @@ const testVm = ({ evaluateResult, debugResult[debugResult.length - 1], `vm.evaluate and the final result of vm.debug differ: is something being unexpectedly mutated? evaluateResult:\n\n${stringify( - evaluateResult + evaluateResult, )}\n\nFinal debugResult:\n\n${stringify( - debugResult[debugResult.length - 1] - )}` + debugResult[debugResult.length - 1], + )}`, ); t.log(stringifyDebugTraceSummary(summarizeDebugTrace(debugResult))); t.log(moreDetails); @@ -181,7 +183,7 @@ const testVm = ({ Number(failingIndex) !== testedIndex ) { t.fail( - `An unexpected input index caused VMB test "${shortId}" to fail for ${vmName}: the input index under test is ${testedIndex}, but input index ${failingIndex} failed. Error: ${result}` + `An unexpected input index caused VMB test "${shortId}" to fail for ${vmName}: the input index under test is ${testedIndex}, but input index ${failingIndex} failed. Error: ${result}`, ); t.log( `Failing input at index ${failingIndex}:`, @@ -191,23 +193,23 @@ const testVm = ({ inputIndex: Number(failingIndex), sourceOutputs, transaction, - }) as AuthenticationProgramStateCommon[] - ) - ) + }) as AuthenticationProgramStateCommon[], + ), + ), ); t.log(moreDetails); return; } logDebugInfo(); t.fail( - `VMB test "${shortId}" - "${description}" - for ${vmName} is expected to succeed but failed. Error: ${result}` + `VMB test "${shortId}" - "${description}" - for ${vmName} is expected to succeed but failed. Error: ${result}`, ); return; } if (!expectedToSucceed && typeof result !== 'string') { logDebugInfo(); t.fail( - `VMB test "${shortId}" - "${description}" - for ${vmName} is expected to fail but succeeded.` + `VMB test "${shortId}" - "${description}" - for ${vmName} is expected to fail but succeeded.`, ); return; } @@ -216,7 +218,7 @@ const testVm = ({ title: ( // eslint-disable-next-line @typescript-eslint/default-param-last caseNumberOfCaseCount = '(unknown/unknown)', - [shortId, description] + [shortId, description], ) => `[vmb_tests] [${vmName}] ${shortId} ${caseNumberOfCaseCount}: ${description}`, }); @@ -226,26 +228,26 @@ const testVm = ({ (debug === undefined ? test : vmName === debug.vmName && debug.testId === testCase[0] - ? test - : test.skip)( + ? test + : test.skip)( `(${index + 1}/${expectedPass.length + expectedFail.length} valid)`, runCase, testCase, - true + true, ); }); expectedFail.forEach((testCase, index) => { (debug === undefined ? test : vmName === debug.vmName && debug.testId === testCase[0] - ? test - : test.skip)( + ? test + : test.skip)( `(${expectedPass.length + index + 1}/${ expectedPass.length + expectedFail.length } invalid)`, runCase, testCase, - false + false, ); }); }; diff --git a/src/lib/vmb-tests/bch-vmb-tests.ts b/src/lib/vmb-tests/bch-vmb-tests.ts index 966b4b28..3430c536 100644 --- a/src/lib/vmb-tests/bch-vmb-tests.ts +++ b/src/lib/vmb-tests/bch-vmb-tests.ts @@ -778,8 +778,8 @@ export const vmbTestDefinitionsBCH: VmbTestDefinitionGroup[] = [ cashAssemblyToBin( `OP_RETURN <0x${range(516) .map((i) => binToHex(Uint8Array.of(i))) - .join('')}>` - ) as Uint8Array + .join('')}>`, + ) as Uint8Array, ), }, ], @@ -801,8 +801,8 @@ export const vmbTestDefinitionsBCH: VmbTestDefinitionGroup[] = [ cashAssemblyToBin( `OP_RETURN <0x${range(517) .map((i) => binToHex(Uint8Array.of(i))) - .join('')}>` - ) as Uint8Array + .join('')}>`, + ) as Uint8Array, ), }, ], @@ -822,8 +822,8 @@ export const vmbTestDefinitionsBCH: VmbTestDefinitionGroup[] = [ cashAssemblyToBin( `OP_RETURN <0x${range(516) .map((i) => binToHex(Uint8Array.of(i))) - .join('')}>` - ) as Uint8Array + .join('')}>`, + ) as Uint8Array, ), }, ], @@ -843,8 +843,8 @@ export const vmbTestDefinitionsBCH: VmbTestDefinitionGroup[] = [ cashAssemblyToBin( `OP_RETURN <0x${range(517) .map((i) => binToHex(Uint8Array.of(i))) - .join('')}>` - ) as Uint8Array + .join('')}>`, + ) as Uint8Array, ), }, ], diff --git a/src/types/bcrypto.d.ts b/src/types/bcrypto.d.ts deleted file mode 100644 index f7c2069d..00000000 --- a/src/types/bcrypto.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -/* eslint-disable @typescript-eslint/naming-convention */ -// used in tests and benchmarks -declare module 'bcrypto' { - const thingsBitcoinTsTestsUse: { - RIPEMD160: BcryptoHashMethod; - SHA1: BcryptoHashMethod; - SHA256: BcryptoHashMethod; - SHA512: BcryptoHashMethod; - }; - export = thingsBitcoinTsTestsUse; - - interface BcryptoHashMethod { - digest: (input: Buffer) => Buffer; - } -} diff --git a/src/types/bitcore-lib-cash.d.ts b/src/types/bitcore-lib-cash.d.ts index 815f9785..8f4b1aa2 100644 --- a/src/types/bitcore-lib-cash.d.ts +++ b/src/types/bitcore-lib-cash.d.ts @@ -2,5 +2,6 @@ declare module 'bitcore-lib-cash' { // eslint-disable-next-line @typescript-eslint/no-explicit-any const whatever: any; - export = whatever; + // eslint-disable-next-line import/no-default-export + export default whatever; } diff --git a/src/types/chuhai.d.ts b/src/types/chuhai.d.ts index dea26133..72356827 100644 --- a/src/types/chuhai.d.ts +++ b/src/types/chuhai.d.ts @@ -3,31 +3,31 @@ declare module 'chuhai' { function suite(implementation: (s: Helper) => void): Promise; function suite( name: string, - implementation: (s: Helper) => void + implementation: (s: Helper) => void, ): Promise; // eslint-disable-next-line import/no-default-export export default suite; } -interface Helper { +type Helper = { cycle: (implementation: () => void) => void; bench: ( name: string, implementation: Benchmark, - opts?: BenchmarkOptions + opts?: BenchmarkOptions, ) => void; burn: ( name: string, implementation: Benchmark, - opts?: BenchmarkOptions + opts?: BenchmarkOptions, ) => void; // eslint-disable-next-line @typescript-eslint/no-explicit-any set: (key: string, value: any) => void; -} +}; type Benchmark = (deferred: { resolve: () => void }) => void; -interface BenchmarkOptions { +type BenchmarkOptions = { async?: boolean; defer?: boolean; -} +}; diff --git a/src/types/rollup-plugin-alias.d.ts b/src/types/rollup-plugin-alias.d.ts index cac423b1..6a96771e 100644 --- a/src/types/rollup-plugin-alias.d.ts +++ b/src/types/rollup-plugin-alias.d.ts @@ -6,6 +6,6 @@ declare module '@rollup/plugin-alias' { export default alias; } -interface RollupPluginAliasOptions { - readonly entries: Readonly<{ [key: string]: string }>; -} +type RollupPluginAliasOptions = { + entries: { [key: string]: string }; +}; diff --git a/src/types/secp256k1.d.ts b/src/types/secp256k1.d.ts index 23c8ff8d..4fae29a3 100644 --- a/src/types/secp256k1.d.ts +++ b/src/types/secp256k1.d.ts @@ -2,5 +2,6 @@ declare module 'secp256k1' { // eslint-disable-next-line @typescript-eslint/no-explicit-any const whatever: any; - export = whatever; + // eslint-disable-next-line import/no-default-export + export default whatever; } diff --git a/tsconfig.json b/tsconfig.json index e2827505..51e3c910 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { - "target": "es2020", - "module": "esnext", + "target": "es2022", + "module": "nodenext", "moduleResolution": "nodenext", "rootDir": "src", "outDir": "build", @@ -20,7 +20,7 @@ "noImplicitReturns": true /* Report error when not all code paths in function return a value. */, "noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */, // "exactOptionalPropertyTypes": true /* Enforce difference between `undefined` and optional properties */, // TODO: enable exactOptionalPropertyTypes, possibly waiting on https://github.com/microsoft/TypeScript/issues/46969#issuecomment-984083995 (or a `RequiredExactOptional` to match `PartialExactOptional`) - "noUncheckedIndexedAccess": true /* Require checking that an indexed access is not undefined */, // TODO: enable noUncheckedIndexedAccess + "noUncheckedIndexedAccess": true /* Require checking that an indexed access is not undefined */, "noPropertyAccessFromIndexSignature": true /* Disallow dot syntax for fields which are not defined */, /* Debugging Options */ "traceResolution": false /* Report module resolution log messages. */, diff --git a/yarn.lock b/yarn.lock index 0be19f81..dfa9110a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,77 +2,85 @@ # Manual changes might be lost - proceed with caution! __metadata: - version: 6 - cacheKey: 8 + version: 8 + cacheKey: 10c0 -"@ava/typescript@npm:^3.0.1": - version: 3.0.1 - resolution: "@ava/typescript@npm:3.0.1" +"@aashutoshrathi/word-wrap@npm:^1.2.3": + version: 1.2.6 + resolution: "@aashutoshrathi/word-wrap@npm:1.2.6" + checksum: 53c2b231a61a46792b39a0d43bc4f4f776bb4542aa57ee04930676802e5501282c2fc8aac14e4cd1f1120ff8b52616b6ff5ab539ad30aa2277d726444b71619f + languageName: node + linkType: hard + +"@ava/typescript@npm:^4.1.0": + version: 4.1.0 + resolution: "@ava/typescript@npm:4.1.0" dependencies: - escape-string-regexp: ^5.0.0 - execa: ^5.1.1 - checksum: 3075ad519e18d6daa0e0696d44716d31bda8f6cdaad70e3da9639d39b4d1807045995d4c8688cd06698586da38f184b47c054d28d873dac3a89364c309dee982 + escape-string-regexp: "npm:^5.0.0" + execa: "npm:^7.1.1" + checksum: 00f32d5b1f66285b39997927691e5973d09412d9ae4da1b265b7f8007a6226a7e3448ad23a29ab0fe435eceb8c11bb4c401be1edb46557d99c5f4816ba7b9f37 languageName: node linkType: hard "@babel/code-frame@npm:^7.0.0": - version: 7.18.6 - resolution: "@babel/code-frame@npm:7.18.6" + version: 7.23.5 + resolution: "@babel/code-frame@npm:7.23.5" dependencies: - "@babel/highlight": ^7.18.6 - checksum: 195e2be3172d7684bf95cff69ae3b7a15a9841ea9d27d3c843662d50cdd7d6470fd9c8e64be84d031117e4a4083486effba39f9aef6bbb2c89f7f21bcfba33ba + "@babel/highlight": "npm:^7.23.4" + chalk: "npm:^2.4.2" + checksum: a10e843595ddd9f97faa99917414813c06214f4d9205294013e20c70fbdf4f943760da37dec1d998bf3e6fc20fa2918a47c0e987a7e458663feb7698063ad7c6 languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.19.4": - version: 7.19.4 - resolution: "@babel/helper-string-parser@npm:7.19.4" - checksum: b2f8a3920b30dfac81ec282ac4ad9598ea170648f8254b10f475abe6d944808fb006aab325d3eb5a8ad3bea8dfa888cfa6ef471050dae5748497c110ec060943 +"@babel/helper-string-parser@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/helper-string-parser@npm:7.23.4" + checksum: f348d5637ad70b6b54b026d6544bd9040f78d24e7ec245a0fc42293968181f6ae9879c22d89744730d246ce8ec53588f716f102addd4df8bbc79b73ea10004ac languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": - version: 7.19.1 - resolution: "@babel/helper-validator-identifier@npm:7.19.1" - checksum: 0eca5e86a729162af569b46c6c41a63e18b43dbe09fda1d2a3c8924f7d617116af39cac5e4cd5d431bb760b4dca3c0970e0c444789b1db42bcf1fa41fbad0a3a +"@babel/helper-validator-identifier@npm:^7.22.20": + version: 7.22.20 + resolution: "@babel/helper-validator-identifier@npm:7.22.20" + checksum: dcad63db345fb110e032de46c3688384b0008a42a4845180ce7cd62b1a9c0507a1bed727c4d1060ed1a03ae57b4d918570259f81724aaac1a5b776056f37504e languageName: node linkType: hard -"@babel/highlight@npm:^7.18.6": - version: 7.18.6 - resolution: "@babel/highlight@npm:7.18.6" +"@babel/highlight@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/highlight@npm:7.23.4" dependencies: - "@babel/helper-validator-identifier": ^7.18.6 - chalk: ^2.0.0 - js-tokens: ^4.0.0 - checksum: 92d8ee61549de5ff5120e945e774728e5ccd57fd3b2ed6eace020ec744823d4a98e242be1453d21764a30a14769ecd62170fba28539b211799bbaf232bbb2789 + "@babel/helper-validator-identifier": "npm:^7.22.20" + chalk: "npm:^2.4.2" + js-tokens: "npm:^4.0.0" + checksum: fbff9fcb2f5539289c3c097d130e852afd10d89a3a08ac0b5ebebbc055cc84a4bcc3dcfed463d488cde12dd0902ef1858279e31d7349b2e8cee43913744bda33 languageName: node linkType: hard -"@babel/parser@npm:^7.0.0": - version: 7.20.7 - resolution: "@babel/parser@npm:7.20.7" +"@babel/parser@npm:^7.0.0, @babel/parser@npm:^7.21.4": + version: 7.23.6 + resolution: "@babel/parser@npm:7.23.6" bin: parser: ./bin/babel-parser.js - checksum: 25b5266e3bd4be837092685f6b7ef886f1308ff72659a24342eb646ae5014f61ed1771ce8fc20636c890fcae19304fc72c069564ca6075207b7fbf3f75367275 + checksum: 6f76cd5ccae1fa9bcab3525b0865c6222e9c1d22f87abc69f28c5c7b2c8816a13361f5bd06bddbd5faf903f7320a8feba02545c981468acec45d12a03db7755e languageName: node linkType: hard "@babel/types@npm:^7.8.3": - version: 7.20.7 - resolution: "@babel/types@npm:7.20.7" + version: 7.23.6 + resolution: "@babel/types@npm:7.23.6" dependencies: - "@babel/helper-string-parser": ^7.19.4 - "@babel/helper-validator-identifier": ^7.19.1 - to-fast-properties: ^2.0.0 - checksum: b39af241f0b72bba67fd6d0d23914f6faec8c0eba8015c181cbd5ea92e59fc91a52a1ab490d3520c7dbd19ddb9ebb76c476308f6388764f16d8201e37fae6811 + "@babel/helper-string-parser": "npm:^7.23.4" + "@babel/helper-validator-identifier": "npm:^7.22.20" + to-fast-properties: "npm:^2.0.0" + checksum: 42cefce8a68bd09bb5828b4764aa5586c53c60128ac2ac012e23858e1c179347a4aac9c66fc577994fbf57595227611c5ec8270bf0cfc94ff033bbfac0550b70 languageName: node linkType: hard "@bcoe/v8-coverage@npm:^0.2.3": version: 0.2.3 resolution: "@bcoe/v8-coverage@npm:0.2.3" - checksum: 850f9305536d0f2bd13e9e0881cb5f02e4f93fad1189f7b2d4bebf694e3206924eadee1068130d43c11b750efcc9405f88a8e42ef098b6d75239c0f047de1a27 + checksum: 6b80ae4cb3db53f486da2dc63b6e190a74c8c3cca16bb2733f234a0b6a9382b09b146488ae08e2b22cf00f6c83e20f3e040a2f7894f05c045c946d6a090b1d52 languageName: node linkType: hard @@ -80,675 +88,773 @@ __metadata: version: 0.0.0-use.local resolution: "@bitauth/libauth@workspace:." dependencies: - "@ava/typescript": ^3.0.1 - "@fast-check/ava": ^1.1.3 - "@microsoft/api-documenter": ^7.19.27 - "@microsoft/api-extractor": ^7.33.7 - "@rollup/plugin-alias": ^4.0.2 - "@rollup/plugin-commonjs": ^22.0.2 - "@rollup/plugin-node-resolve": ^15.0.1 - "@types/elliptic": ^6.4.14 - "@types/express": ^4.17.15 - "@typescript-eslint/eslint-plugin": ^5.48.1 - "@typescript-eslint/parser": ^5.48.1 - ajv-cli: ^5.0.0 - asmcrypto.js: ^2.3.2 - ava: ^5.1.0 - bcrypto: ^5.4.0 - bitcore-lib-cash: ^8.25.40 - c8: ^7.12.0 - chuhai: ^1.2.0 - cpy-cli: ^4.2.0 - cspell: ^6.18.1 - cz-conventional-changelog: ^3.3.0 - elliptic: ^6.5.4 - eslint: 8.31.0 - eslint-config-bitauth: ^3.1.2 - eslint-config-prettier: ^8.6.0 - eslint-plugin-eslint-comments: ^3.2.0 - eslint-plugin-functional: ^4.4.1 - eslint-plugin-import: ^2.26.0 - eslint-plugin-prettier: ^4.2.1 - eslint-plugin-tsdoc: ^0.2.17 - express: ^4.18.2 - fast-check: ^3.5.0 - hash.js: ^1.1.7 - madge: ^5.0.1 - open-cli: ^7.1.0 - prettier: ^2.8.2 - puppeteer: ^19.5.0 - rollup: ^2.79.1 - secp256k1: ^4.0.3 - source-map-support: ^0.5.21 - standard-version: ^9.5.0 - ts-json-schema-generator: ^1.2.0 - typedoc: ^0.23.24 - typescript: ^4.9.4 + "@ava/typescript": "npm:^4.1.0" + "@fast-check/ava": "npm:^1.2.1" + "@microsoft/api-documenter": "npm:^7.23.16" + "@microsoft/api-extractor": "npm:^7.39.1" + "@playwright/test": "npm:^1.40.1" + "@rollup/plugin-alias": "npm:^5.1.0" + "@rollup/plugin-commonjs": "npm:^25.0.7" + "@rollup/plugin-node-resolve": "npm:^15.2.3" + "@types/elliptic": "npm:^6.4.18" + "@types/express": "npm:^4.17.21" + "@types/node": "npm:^20.10.6" + "@typescript-eslint/eslint-plugin": "npm:^6.18.1" + "@typescript-eslint/parser": "npm:^6.17.0" + ajv-cli: "npm:^5.0.0" + asmcrypto.js: "npm:^2.3.2" + ava: "npm:^6.0.1" + bitcore-lib-cash: "npm:^10.0.23" + c8: "npm:^9.0.0" + chuhai: "npm:^1.2.0" + cpy-cli: "npm:^5.0.0" + cspell: "npm:^8.3.2" + cz-conventional-changelog: "npm:^3.3.0" + elliptic: "npm:^6.5.4" + eslint: "npm:8.56.0" + eslint-config-bitauth: "npm:5.0.0" + eslint-config-prettier: "npm:^9.1.0" + eslint-plugin-eslint-comments: "npm:^3.2.0" + eslint-plugin-functional: "npm:^6.0.0" + eslint-plugin-import: "npm:^2.29.1" + eslint-plugin-tsdoc: "npm:^0.2.17" + express: "npm:^4.18.2" + fast-check: "npm:^3.15.0" + hash.js: "npm:^1.1.7" + madge: "npm:^6.1.0" + open-cli: "npm:^8.0.0" + prettier: "npm:^3.1.1" + rollup: "npm:^4.9.2" + secp256k1: "npm:^5.0.0" + source-map-support: "npm:^0.5.21" + standard-version: "npm:^9.5.0" + ts-json-schema-generator: "npm:^1.5.0" + typedoc: "npm:^0.25.6" + typescript: "npm:^5.3.3" languageName: unknown linkType: soft -"@commitlint/config-validator@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/config-validator@npm:17.4.0" +"@commitlint/config-validator@npm:^18.4.4": + version: 18.4.4 + resolution: "@commitlint/config-validator@npm:18.4.4" dependencies: - "@commitlint/types": ^17.4.0 - ajv: ^8.11.0 - checksum: 4e8885cf8f35a6dbff7b504cabadf2c38bba3b05dc78b40a0403e9a06cc14cf3d29e088b76a19d5f7510e09132f4070c35a586b0e6e52590c1a7b1dfd47982c4 + "@commitlint/types": "npm:^18.4.4" + ajv: "npm:^8.11.0" + checksum: 00599bb176db32e873f1848d6889ddf28b1ac287f679a153a2daa076d34b529342feed527fa96a5fee75eccef0dbb2bf1e391d265bddbd5168c1afb233fd93b0 languageName: node linkType: hard -"@commitlint/execute-rule@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/execute-rule@npm:17.4.0" - checksum: 17d8e56ab00bd45fdecb0ed33186d2020ce261250d6a516204b6509610b75af8c930e7226b1111af3de298db32a7e4d0ba2c9cc7ed67db5ba5159eeed634f067 +"@commitlint/execute-rule@npm:^18.4.4": + version: 18.4.4 + resolution: "@commitlint/execute-rule@npm:18.4.4" + checksum: 1f4fde42649616c403361c4f52802f23cd2995c51f5ae44f02c75897d6f62fbd5b499488033181a67058368da4eaafe91c1aaa7b9b95dbff60233310d4078df4 languageName: node linkType: hard "@commitlint/load@npm:>6.1.1": - version: 17.4.1 - resolution: "@commitlint/load@npm:17.4.1" - dependencies: - "@commitlint/config-validator": ^17.4.0 - "@commitlint/execute-rule": ^17.4.0 - "@commitlint/resolve-extends": ^17.4.0 - "@commitlint/types": ^17.4.0 - "@types/node": "*" - chalk: ^4.1.0 - cosmiconfig: ^8.0.0 - cosmiconfig-typescript-loader: ^4.0.0 - lodash.isplainobject: ^4.0.6 - lodash.merge: ^4.6.2 - lodash.uniq: ^4.5.0 - resolve-from: ^5.0.0 - ts-node: ^10.8.1 - typescript: ^4.6.4 - checksum: 17bc9f2e339da480740138bb1f56d6a5c36ec6d70844a605f09b5ffcbe0bb18fd3ab0ad09d40ba3cfd095f26b0b3cf78a02d7b73d5980d9e58dbdcdfaeb252a2 + version: 18.4.4 + resolution: "@commitlint/load@npm:18.4.4" + dependencies: + "@commitlint/config-validator": "npm:^18.4.4" + "@commitlint/execute-rule": "npm:^18.4.4" + "@commitlint/resolve-extends": "npm:^18.4.4" + "@commitlint/types": "npm:^18.4.4" + chalk: "npm:^4.1.0" + cosmiconfig: "npm:^8.3.6" + cosmiconfig-typescript-loader: "npm:^5.0.0" + lodash.isplainobject: "npm:^4.0.6" + lodash.merge: "npm:^4.6.2" + lodash.uniq: "npm:^4.5.0" + resolve-from: "npm:^5.0.0" + checksum: 46202e2882efd35d759e30bbc1e4ad784d61d2ab2e1522be7e59c54743cfb94303fcbbef1eeb42d556dd76b559d1e35d5c0aa220875a71ece5b5cf994df18bf8 + languageName: node + linkType: hard + +"@commitlint/resolve-extends@npm:^18.4.4": + version: 18.4.4 + resolution: "@commitlint/resolve-extends@npm:18.4.4" + dependencies: + "@commitlint/config-validator": "npm:^18.4.4" + "@commitlint/types": "npm:^18.4.4" + import-fresh: "npm:^3.0.0" + lodash.mergewith: "npm:^4.6.2" + resolve-from: "npm:^5.0.0" + resolve-global: "npm:^1.0.0" + checksum: 0b6cc0a0fe195c693286022129d7ef2cec65ab5e8c004f3681dc43bd7fa21a9fdf3b81a1818d74b94c71932e34f6203008dd8745e8b5b2acb5713aec21b93652 + languageName: node + linkType: hard + +"@commitlint/types@npm:^18.4.4": + version: 18.4.4 + resolution: "@commitlint/types@npm:18.4.4" + dependencies: + chalk: "npm:^4.1.0" + checksum: 706307d76761107a11c2ed95800f9fc66b66a125ab2142021dca6fb1fe316a5a417fd4b8647f2b76405c549a243bdb4c2c050cea05806f328670e70b536b4f67 + languageName: node + linkType: hard + +"@cspell/cspell-bundled-dicts@npm:8.3.2": + version: 8.3.2 + resolution: "@cspell/cspell-bundled-dicts@npm:8.3.2" + dependencies: + "@cspell/dict-ada": "npm:^4.0.2" + "@cspell/dict-aws": "npm:^4.0.1" + "@cspell/dict-bash": "npm:^4.1.3" + "@cspell/dict-companies": "npm:^3.0.29" + "@cspell/dict-cpp": "npm:^5.0.10" + "@cspell/dict-cryptocurrencies": "npm:^5.0.0" + "@cspell/dict-csharp": "npm:^4.0.2" + "@cspell/dict-css": "npm:^4.0.12" + "@cspell/dict-dart": "npm:^2.0.3" + "@cspell/dict-django": "npm:^4.1.0" + "@cspell/dict-docker": "npm:^1.1.7" + "@cspell/dict-dotnet": "npm:^5.0.0" + "@cspell/dict-elixir": "npm:^4.0.3" + "@cspell/dict-en-common-misspellings": "npm:^2.0.0" + "@cspell/dict-en-gb": "npm:1.1.33" + "@cspell/dict-en_us": "npm:^4.3.13" + "@cspell/dict-filetypes": "npm:^3.0.3" + "@cspell/dict-fonts": "npm:^4.0.0" + "@cspell/dict-fsharp": "npm:^1.0.1" + "@cspell/dict-fullstack": "npm:^3.1.5" + "@cspell/dict-gaming-terms": "npm:^1.0.4" + "@cspell/dict-git": "npm:^3.0.0" + "@cspell/dict-golang": "npm:^6.0.5" + "@cspell/dict-haskell": "npm:^4.0.1" + "@cspell/dict-html": "npm:^4.0.5" + "@cspell/dict-html-symbol-entities": "npm:^4.0.0" + "@cspell/dict-java": "npm:^5.0.6" + "@cspell/dict-k8s": "npm:^1.0.2" + "@cspell/dict-latex": "npm:^4.0.0" + "@cspell/dict-lorem-ipsum": "npm:^4.0.0" + "@cspell/dict-lua": "npm:^4.0.3" + "@cspell/dict-makefile": "npm:^1.0.0" + "@cspell/dict-node": "npm:^4.0.3" + "@cspell/dict-npm": "npm:^5.0.14" + "@cspell/dict-php": "npm:^4.0.5" + "@cspell/dict-powershell": "npm:^5.0.3" + "@cspell/dict-public-licenses": "npm:^2.0.5" + "@cspell/dict-python": "npm:^4.1.11" + "@cspell/dict-r": "npm:^2.0.1" + "@cspell/dict-ruby": "npm:^5.0.2" + "@cspell/dict-rust": "npm:^4.0.1" + "@cspell/dict-scala": "npm:^5.0.0" + "@cspell/dict-software-terms": "npm:^3.3.15" + "@cspell/dict-sql": "npm:^2.1.3" + "@cspell/dict-svelte": "npm:^1.0.2" + "@cspell/dict-swift": "npm:^2.0.1" + "@cspell/dict-typescript": "npm:^3.1.2" + "@cspell/dict-vue": "npm:^3.0.0" + checksum: fcd813ef69ab4837b95801849da17806616c99414b3686c22bd3fe50f373b1d04efa4bf95ce0dc11b22649ec40e7bd138a9dd119376a9f22ea14de673412530e + languageName: node + linkType: hard + +"@cspell/cspell-json-reporter@npm:8.3.2": + version: 8.3.2 + resolution: "@cspell/cspell-json-reporter@npm:8.3.2" + dependencies: + "@cspell/cspell-types": "npm:8.3.2" + checksum: c2f78c4c1efe60753fafb59f8832fac314cd554ab8fa8e1da18c87f93bc1291d859d54c1b0d75efbce4dea305a0ccff5937bdd0a72656c158afc4f6a3a1f6550 + languageName: node + linkType: hard + +"@cspell/cspell-pipe@npm:8.3.2": + version: 8.3.2 + resolution: "@cspell/cspell-pipe@npm:8.3.2" + checksum: cfda5f46be058d2274a05c12562f373f44eaa229ac5a6c40e65a4daf7e95cfa3c78b840103ff51af61731f3d861efb58dd910331e18a8067a94c37027f65cdba languageName: node linkType: hard -"@commitlint/resolve-extends@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/resolve-extends@npm:17.4.0" +"@cspell/cspell-resolver@npm:8.3.2": + version: 8.3.2 + resolution: "@cspell/cspell-resolver@npm:8.3.2" dependencies: - "@commitlint/config-validator": ^17.4.0 - "@commitlint/types": ^17.4.0 - import-fresh: ^3.0.0 - lodash.mergewith: ^4.6.2 - resolve-from: ^5.0.0 - resolve-global: ^1.0.0 - checksum: 44d77c343c519f92d3f595508c7f8b07df4a33880ab3c32631cf77101c51bf444e1b03d50505f68ce677ff62729e9e44e81bb1fec8b6d87b831d6137f3d5c5a8 + global-directory: "npm:^4.0.1" + checksum: 1c21fd9d6878756b146ecc7c4bb33f694baa79f73921328bd368e3559c594a9bab504a5ab19cbcfc24ccc4481a611cc79e958035e6bb5bc0d83f4d0e7c542b18 languageName: node linkType: hard -"@commitlint/types@npm:^17.4.0": - version: 17.4.0 - resolution: "@commitlint/types@npm:17.4.0" - dependencies: - chalk: ^4.1.0 - checksum: 58e1743780a0d76b380dc6ebfe6deb530ed5a7ee82d746d73586fe5186c84bf7e07aa0ca0523ca910915d573ed522c2b7b7037c11c9ea49c8a9d90c2b8c48173 +"@cspell/cspell-service-bus@npm:8.3.2": + version: 8.3.2 + resolution: "@cspell/cspell-service-bus@npm:8.3.2" + checksum: facf07f83de03ee306f634debc8fd9ace4abe6e1aff2731be37d0c43430c1222cb45c083f40dd47097f253f7175f1871cceb8c45b0b77855bcfe3156fbf3b2f0 languageName: node linkType: hard -"@cspell/cspell-bundled-dicts@npm:6.18.1": - version: 6.18.1 - resolution: "@cspell/cspell-bundled-dicts@npm:6.18.1" - dependencies: - "@cspell/dict-ada": ^4.0.1 - "@cspell/dict-aws": ^3.0.0 - "@cspell/dict-bash": ^4.1.1 - "@cspell/dict-companies": ^3.0.5 - "@cspell/dict-cpp": ^4.0.1 - "@cspell/dict-cryptocurrencies": ^3.0.1 - "@cspell/dict-csharp": ^4.0.2 - "@cspell/dict-css": ^4.0.1 - "@cspell/dict-dart": ^2.0.1 - "@cspell/dict-django": ^4.0.1 - "@cspell/dict-docker": ^1.1.4 - "@cspell/dict-dotnet": ^4.0.1 - "@cspell/dict-elixir": ^4.0.1 - "@cspell/dict-en-gb": 1.1.33 - "@cspell/dict-en_us": ^4.1.2 - "@cspell/dict-filetypes": ^3.0.0 - "@cspell/dict-fonts": ^3.0.0 - "@cspell/dict-fullstack": ^3.0.0 - "@cspell/dict-gaming-terms": ^1.0.3 - "@cspell/dict-git": ^2.0.0 - "@cspell/dict-golang": ^5.0.1 - "@cspell/dict-haskell": ^4.0.1 - "@cspell/dict-html": ^4.0.2 - "@cspell/dict-html-symbol-entities": ^4.0.0 - "@cspell/dict-java": ^5.0.3 - "@cspell/dict-k8s": ^1.0.0 - "@cspell/dict-latex": ^3.1.0 - "@cspell/dict-lorem-ipsum": ^3.0.0 - "@cspell/dict-lua": ^3.0.0 - "@cspell/dict-node": ^4.0.2 - "@cspell/dict-npm": ^5.0.2 - "@cspell/dict-php": ^3.0.4 - "@cspell/dict-powershell": ^3.0.0 - "@cspell/dict-public-licenses": ^2.0.1 - "@cspell/dict-python": ^4.0.1 - "@cspell/dict-r": ^2.0.1 - "@cspell/dict-ruby": ^3.0.0 - "@cspell/dict-rust": ^3.0.0 - "@cspell/dict-scala": ^3.0.0 - "@cspell/dict-software-terms": ^3.0.7 - "@cspell/dict-sql": ^2.0.1 - "@cspell/dict-svelte": ^1.0.1 - "@cspell/dict-swift": ^2.0.1 - "@cspell/dict-typescript": ^3.1.0 - "@cspell/dict-vue": ^3.0.0 - checksum: 97346d8091df27ce4e0b0cd709f4d0442ed1fc4340c3cd0a7f5aca130f7c08b31be5ea7299411c89caf89ca784452144e91804e477770d5c49c7301f78b5d268 - languageName: node - linkType: hard - -"@cspell/cspell-pipe@npm:6.18.1": - version: 6.18.1 - resolution: "@cspell/cspell-pipe@npm:6.18.1" - checksum: 5df235dddf07468f5c0af2612401ff5157892b4b5b95500befbf08f2b729ae3d6b6dd12127d2af29278db7520aefbed375fdf32ff4f2b205a945a6a1e4d75a79 - languageName: node +"@cspell/cspell-types@npm:8.3.2": + version: 8.3.2 + resolution: "@cspell/cspell-types@npm:8.3.2" + checksum: 664a87dda880dad19d2e9b508c4a914684df9d358ab992663fdb8db79cdddedc6ae098879f311f9c52b930e287c330a3099a59ce5cd0a2f8e6646547cf3ec967 + languageName: node linkType: hard -"@cspell/cspell-service-bus@npm:6.18.1": - version: 6.18.1 - resolution: "@cspell/cspell-service-bus@npm:6.18.1" - checksum: 4128a57a259db57fdfd5e024446bce284e3ad936654b1f7fd4a356bfb8f644dbe3b722bbb70712b14be9f9aa96b7de78b756aadf64c5af8363bff68b65f1adf3 +"@cspell/dict-ada@npm:^4.0.2": + version: 4.0.2 + resolution: "@cspell/dict-ada@npm:4.0.2" + checksum: ef2e34ddfc635a398522a04b0193e2130051a644dffa52f31faa59e864f88d1624b50b53115ed16cc4508f36b43ba8819f504635f437f34ee7d451d3bb441a71 languageName: node linkType: hard -"@cspell/cspell-types@npm:6.18.1": - version: 6.18.1 - resolution: "@cspell/cspell-types@npm:6.18.1" - checksum: d4b0dfa0d749a630f31ec0a88be79bbba9587a3a97139b83d818f479f90e835ba4d78fb72b8a7812821cc7b9085837ebc279e5512aa22505ef040ad161485de4 +"@cspell/dict-aws@npm:^4.0.1": + version: 4.0.1 + resolution: "@cspell/dict-aws@npm:4.0.1" + checksum: 48bc3645f23b8290ded066d4dda4c5cc5e903229e2f8893cba795e2d2583ce45bde8ff835454340eb6593beeb41e8014d52af4c6991fd4d8de1cd6c5a415294b languageName: node linkType: hard -"@cspell/dict-ada@npm:^4.0.1": - version: 4.0.1 - resolution: "@cspell/dict-ada@npm:4.0.1" - checksum: 3422487c8decf01d9dd14e666dcbe29557d730085f60fcd859d03fc5c177359d12df19171368cd105dad29f315d0decfa56f29eeb7c594a300d47c65805c4349 +"@cspell/dict-bash@npm:^4.1.3": + version: 4.1.3 + resolution: "@cspell/dict-bash@npm:4.1.3" + checksum: b91920a38d7db74cdf1da7677ddfa1853643175dacba90b65a9d58343cacb0280f86a3927288c673c9ccc0587b200bc8447b210fdd89e8ea2f66956207d55024 languageName: node linkType: hard -"@cspell/dict-aws@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-aws@npm:3.0.0" - checksum: d06284d5cc438c18175c26e4f5d450f3235d603dbc989fa2d7515bb01d1c7a8b303ce054d532ca4f814fc6cd7c65ef9558d46bf5bacb06d35504b3c259ebe95c +"@cspell/dict-companies@npm:^3.0.29": + version: 3.0.29 + resolution: "@cspell/dict-companies@npm:3.0.29" + checksum: fea647617c2f1c25036cd2d3072dac69a189b6352213a2b21bdc00065c87f643e6631b20b70b2a261ec2e773b2aa37b2bcaaa4d728dcbb4580ac97a236734d64 languageName: node linkType: hard -"@cspell/dict-bash@npm:^4.1.1": - version: 4.1.1 - resolution: "@cspell/dict-bash@npm:4.1.1" - checksum: 5b6fbb597c53fa6b9957213aa77688c6e0231f8d59eed02f0eecda456f3606855fc0f4c0c5121a909e9055c164de83e3f151b32a9abd1ccd4a161634ffee6691 +"@cspell/dict-cpp@npm:^5.0.10": + version: 5.1.1 + resolution: "@cspell/dict-cpp@npm:5.1.1" + checksum: 20b12e994311469e03dccf7e31b8f84d3e00973141ff454485a644e0ecb314b44305e1b9b7fd590bc901dd2ac36999cd4deb0d94e13565957c16e85ead016098 languageName: node linkType: hard -"@cspell/dict-companies@npm:^3.0.5": - version: 3.0.6 - resolution: "@cspell/dict-companies@npm:3.0.6" - checksum: b56d20632f2e953c2b1a199701b4af4c1b5c5d6ea56c889b68bbac8f3e8f8645eb0386b3198274f14491fccf9608586ebdbe94c0835723934966682ffdc0c8f7 +"@cspell/dict-cryptocurrencies@npm:^5.0.0": + version: 5.0.0 + resolution: "@cspell/dict-cryptocurrencies@npm:5.0.0" + checksum: d5b124eb5d037103ffa2b282779dda8a01ec6622c5498282e05b58f92ce262dae9ac8995748e47a89578e9d658ffd963aa430e85699618c8428166fbe741370d languageName: node linkType: hard -"@cspell/dict-cpp@npm:^4.0.1": - version: 4.0.1 - resolution: "@cspell/dict-cpp@npm:4.0.1" - checksum: 53db5515d046bc1be80031f82be801edb9c349a5487f894db7fc54d45a86142f01476b35fe8453605a3402ba6dd850353bf628eba8223fbac8d6f9e7d002827e +"@cspell/dict-csharp@npm:^4.0.2": + version: 4.0.2 + resolution: "@cspell/dict-csharp@npm:4.0.2" + checksum: 146b7edeb8aa1acf6b0ccb283a2a5e0e8f2612e6fc67cca9b26e0fabe954a92042d314860bb5418522d6db265bd5933b6c68004d2b8225ad89498bf795b51f89 languageName: node linkType: hard -"@cspell/dict-cryptocurrencies@npm:^3.0.1": - version: 3.0.1 - resolution: "@cspell/dict-cryptocurrencies@npm:3.0.1" - checksum: 5d646f569e8dc5998de8a508ff3de39db5f5a5db0a846ee4fc750ea3880080d922d5c28fdce38f93910eaacde2723e2fe4c305d50b3f9d53b817ce33a3bed66a +"@cspell/dict-css@npm:^4.0.12": + version: 4.0.12 + resolution: "@cspell/dict-css@npm:4.0.12" + checksum: aba5755408d3184d3fe3bc61db112caf8f9360944da4a777d7ef823198768e9b019c1338993f36af00c33f475434476d8dc2351c439a7cb898dc02dd5acd13e9 languageName: node linkType: hard -"@cspell/dict-csharp@npm:^4.0.2": - version: 4.0.2 - resolution: "@cspell/dict-csharp@npm:4.0.2" - checksum: d2ecb2aada51c5f0d6d557fd4f0c6eddb5b299e0955e066c49cd2afe96a1c6fe0afde699fdb885dd3183603a1efbd1d793b6a490b8d039256445b4b154b7375b +"@cspell/dict-dart@npm:^2.0.3": + version: 2.0.3 + resolution: "@cspell/dict-dart@npm:2.0.3" + checksum: 640b432ced4888c4a6dbdeb2006ed778b59cab7eeb1445e85a66320c1eefe42e905da7c4c89003c42eca97f785380038d603200b8e1f3bea9bc39b81cfadabf7 languageName: node linkType: hard -"@cspell/dict-css@npm:^4.0.1": - version: 4.0.1 - resolution: "@cspell/dict-css@npm:4.0.1" - checksum: 8d072f1f6ba91c1549c745b7b4714e7bf3d133ce1886b9c040d989188db917890d5ae12067f09558f3a037586911ae9bced59c91b8daeef3d7c04fd1367d80d2 +"@cspell/dict-data-science@npm:^1.0.11": + version: 1.0.11 + resolution: "@cspell/dict-data-science@npm:1.0.11" + checksum: c0d7ffc81c43d00c997ac759ef48541c758bbf4074a743f6aa88c896acb4ea7c291b59103e6b84964ba62603314b164d515ffd7f44379870f1d9614dfcc862a3 languageName: node linkType: hard -"@cspell/dict-dart@npm:^2.0.1": - version: 2.0.1 - resolution: "@cspell/dict-dart@npm:2.0.1" - checksum: 6536a47450ebcbaad90253802791e69567565ecab89d0eb00d8be8b8b2d94d3971fcd92c6e013e25e0f06e1994591fb5ae6b5674798d74e3f449ffa1ea556f3e +"@cspell/dict-django@npm:^4.1.0": + version: 4.1.0 + resolution: "@cspell/dict-django@npm:4.1.0" + checksum: 85b7f58d772f169f7471f2c1bcb8a0207cdff7c32677bf470bcbcc74ce6498269623cfcc7910730eeac7f052633f8d4c63574367c1afe5f46a2917748ed397ca languageName: node linkType: hard -"@cspell/dict-django@npm:^4.0.1": - version: 4.0.1 - resolution: "@cspell/dict-django@npm:4.0.1" - checksum: 1954c4b96c05bb2c6aad3a76dcd9963912ed177c49d2bcfb10992af83143c1d644f4306d79acb175eda7767a75444007c9c4d94ba10245aeb256613ae10f0306 +"@cspell/dict-docker@npm:^1.1.7": + version: 1.1.7 + resolution: "@cspell/dict-docker@npm:1.1.7" + checksum: e34428f3e18d3ebb94854e4034746a8a0ef81354994f09d289254f75b9ce11fee53f64c706e1e598d5131fbe50d536401c4e5b854e44b965e6e193d454fa87b7 languageName: node linkType: hard -"@cspell/dict-docker@npm:^1.1.4": - version: 1.1.5 - resolution: "@cspell/dict-docker@npm:1.1.5" - checksum: a983e3587cbe6f741dfbf40c509ca06d9489f1fb64f902128f9d738acb747b3a8651a73d256f2a7ef7750a54897eb76776403a47e4b55d84d785c7efa3a90e5e +"@cspell/dict-dotnet@npm:^5.0.0": + version: 5.0.0 + resolution: "@cspell/dict-dotnet@npm:5.0.0" + checksum: b55e2457f134aa99f9037c58a4441bb1e6b50a8ac399833b775517e14c84b84cf01e2ca8b75a93bccdc75ff9f656a4b0433c4bd82bfe830227848fc5a30ce1b4 languageName: node linkType: hard -"@cspell/dict-dotnet@npm:^4.0.1": - version: 4.0.1 - resolution: "@cspell/dict-dotnet@npm:4.0.1" - checksum: 176b25bc36ea4407439852be685a421d0ea0be19d8c4eb48b897a1aa2bdde3f71731b94f33b6ae1260546260343d7ee1f2c1c1087848cd2ceac0c635c009e370 +"@cspell/dict-elixir@npm:^4.0.3": + version: 4.0.3 + resolution: "@cspell/dict-elixir@npm:4.0.3" + checksum: c24b742b0615f310c89a05ded6648a63ee8e0a9d63326fd155846ce4acba2337a1cef3f58d653b9d8f4b6636d466dfeac2bf7122f374ae39a4d539894ebc5523 languageName: node linkType: hard -"@cspell/dict-elixir@npm:^4.0.1": - version: 4.0.1 - resolution: "@cspell/dict-elixir@npm:4.0.1" - checksum: 080a71b4c3ffa98dafbad851aed31fe2f58c3cb1ca5f3cf7eee1f203168c2f9440076c2fe5970fd92a968af3f36255a3e633aa5962a32bba16c4b7095a0ef0bf +"@cspell/dict-en-common-misspellings@npm:^2.0.0": + version: 2.0.0 + resolution: "@cspell/dict-en-common-misspellings@npm:2.0.0" + checksum: 18faa9e7636fc8dc0106eb6a47fe3a211d90dec15ab89248a33b062c88cb64a9e19363519c1bf4cbca032754dcaa4cc77fc7ce6dae7b327e6c70c1108d358d8e languageName: node linkType: hard "@cspell/dict-en-gb@npm:1.1.33": version: 1.1.33 resolution: "@cspell/dict-en-gb@npm:1.1.33" - checksum: 09a9e7a3ee4cad75c87cc7adf6b5981b3ec52d4e3707e8de2e1a2a55cd5c8539057a7742d9c7035e23eb0aeff80a95b9599696c7192c9b3b9d8f14440fe01938 + checksum: 09563d1016f652dc8164a5f692be49beb78a847a54d5e470d406ae4db125bf8021db75d3db63f7a0c1d1b7a5dfbec4b709fb2ff3520447dcad690adb98d74130 languageName: node linkType: hard -"@cspell/dict-en_us@npm:^4.1.2": - version: 4.1.4 - resolution: "@cspell/dict-en_us@npm:4.1.4" - checksum: ada32bcf6083e9f4d9a33f517fc7b8bf4fefd73f93f07acb430956be357fa35d79f3d5eee642de272a00d2b1ab76cec2db3aafd7a4108d1329f6324b5a2391fc +"@cspell/dict-en_us@npm:^4.3.13": + version: 4.3.13 + resolution: "@cspell/dict-en_us@npm:4.3.13" + checksum: 0f3c21c0167995b989076ed7fc2502ca009be4b5a72311e09832879ed6ef2415d6ad79d3540796e9239564eee31464e74b625db48e7140884fa1600925b070da languageName: node linkType: hard -"@cspell/dict-filetypes@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-filetypes@npm:3.0.0" - checksum: 8afd0785583f913c8d6ad1a2b56a527600258b291fc6ed8e83f543ba70a5273095195495601aca7d80fdeb17cab6a10e8a8aa44bea3083962cd42af130260d8a +"@cspell/dict-filetypes@npm:^3.0.3": + version: 3.0.3 + resolution: "@cspell/dict-filetypes@npm:3.0.3" + checksum: 0a64f24fc4e5e0ec00e4a9982c3da228cf2dc5536f780785af31e3d257ea98d428464c0d35fabd5335ade751051ab0cce6fd2b1aa650a2b63515dfe8752bbd41 languageName: node linkType: hard -"@cspell/dict-fonts@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-fonts@npm:3.0.0" - checksum: 3cd3574c2f32d761775ddd1bb68360488f400cf310c0499e6fac53641596a51708719e57426c97e183b528ad142ee04c90af93bb38a016ceecb921d76a00e9d9 +"@cspell/dict-fonts@npm:^4.0.0": + version: 4.0.0 + resolution: "@cspell/dict-fonts@npm:4.0.0" + checksum: d7b62691ebb34cf5538f65e18e4188716a87e3fcd56cabde090040b5c81676bc0004304bda47bc14c58417ac710b4627b3513a5bbeb99be1fae6d9b5f291bd2c languageName: node linkType: hard -"@cspell/dict-fullstack@npm:^3.0.0": - version: 3.0.1 - resolution: "@cspell/dict-fullstack@npm:3.0.1" - checksum: 05a50b9dc7d0634c78a49cc79cc3955f1d50ac982b0a24cd3af7093ad20c6b87866164a70c1cd3704a3111e260583bab7cfe9fea080f8f52e12c5a09323358ab +"@cspell/dict-fsharp@npm:^1.0.1": + version: 1.0.1 + resolution: "@cspell/dict-fsharp@npm:1.0.1" + checksum: bc1a83f35eab65e4704889cbfa4625dbbf07219987c2535f0c469f741f047ee8d14ea2fb65d32b669fd27b63a79a119b65e587d28ec9608e064a6f49d2274ca6 languageName: node linkType: hard -"@cspell/dict-gaming-terms@npm:^1.0.3": +"@cspell/dict-fullstack@npm:^3.1.5": + version: 3.1.5 + resolution: "@cspell/dict-fullstack@npm:3.1.5" + checksum: c6e02b9ac3cafee8e2fe913b725cb0fa9cb7ac35b5ec331160e1d4ec9c47237f12638a2b5637fd6b2933662ee9b6b1d1c524a9035df109e25fbacc6032ded6c4 + languageName: node + linkType: hard + +"@cspell/dict-gaming-terms@npm:^1.0.4": version: 1.0.4 resolution: "@cspell/dict-gaming-terms@npm:1.0.4" - checksum: 3e57f5567747a8598b3e4de4f63a3b8090cccf7688f3e91f0a9e005e916645db1224ea600afd5b497b7e8c6a1f9291dfd4cb932278dfd423657107203a2ace0b + checksum: 8ea51cb6a0b3c1f54ac4da9c97cfe007ddc2343382f8bc0c719df1dd9efe14d1d8178f4507884e7c780397775f6df5685d86544a069b6aff00e07e45889aa966 languageName: node linkType: hard -"@cspell/dict-git@npm:^2.0.0": - version: 2.0.0 - resolution: "@cspell/dict-git@npm:2.0.0" - checksum: eb3985f1f8717ad4e41e146f1b011e0476d7625ab1ebee55364575b727323300773a89a8dd5a20466c74c57b7d2678e0c92446453bd484a44203be737bc07964 +"@cspell/dict-git@npm:^3.0.0": + version: 3.0.0 + resolution: "@cspell/dict-git@npm:3.0.0" + checksum: baf9de7896f4da603600c735fe861c8ce3db8f8533ac6f52b0541096090ae8efcdcde33aab19b69e8bd6d72af45d664b1f2cfda6fbb157a81608bc6d0d39ce6d languageName: node linkType: hard -"@cspell/dict-golang@npm:^5.0.1": - version: 5.0.1 - resolution: "@cspell/dict-golang@npm:5.0.1" - checksum: 5a82060a2cc87a129174c648e2b52db8af4b9de25d5c18d138299dba3c2783003c68883d5dc9623bca2eb7e35d95783d1af3f0fd5b577a965de934deb36e8578 +"@cspell/dict-golang@npm:^6.0.5": + version: 6.0.5 + resolution: "@cspell/dict-golang@npm:6.0.5" + checksum: 387cc678d94e0d50f9c9c24aa6cdea2990dbf56f379300ef0f6307be8bdc2941ccec6503a86c28718f4b3c110739cc4216471f644ff9d68510100b992b702431 languageName: node linkType: hard "@cspell/dict-haskell@npm:^4.0.1": version: 4.0.1 resolution: "@cspell/dict-haskell@npm:4.0.1" - checksum: cfb51e415b60c5eb266a5782d0a4b19a37f1389b9b018d1bbb2ff4358bd739af1f76f68f26a138d4b4bd0ab67146d6eb9032fc3d3c212695237c134e05339c79 + checksum: 7693a06b74a393aec35b67304ae56dad1ce3509951bec64053d992011e0309e9c420edd13a073ab3e500c0ac53e15dd92472097d689f7602c6d9ad10a2ee0dab languageName: node linkType: hard "@cspell/dict-html-symbol-entities@npm:^4.0.0": version: 4.0.0 resolution: "@cspell/dict-html-symbol-entities@npm:4.0.0" - checksum: 79f05f9080f39dbde703980eb587ed6624b8fc2f5cedc297327bc1b9b7e6022a7c382e6013149b1afe00609b96003ab5c8d18d378979f76f336ab626317183f4 + checksum: 35d3223f02f0d091ac6a93424d4c31a075ece530bee00853ee1f5827e5ed25d08407a522a3c747cbfbaa891333df3aa9cf6107a21f2a030667f74228655c9081 languageName: node linkType: hard -"@cspell/dict-html@npm:^4.0.2": - version: 4.0.2 - resolution: "@cspell/dict-html@npm:4.0.2" - checksum: f4967d362a661408fcfc284292dd64280e4abda06ded0da95a5083473ea921043718b1694e9f0cec852d90e750d7d495fd639a57ce0d1dbd7097bb92c3b3e1b0 +"@cspell/dict-html@npm:^4.0.5": + version: 4.0.5 + resolution: "@cspell/dict-html@npm:4.0.5" + checksum: 6e1b9262bba042a951a6020dfd99efb5fb3a29a5ad8bbdc96a1dd197dc1d89384448afd3b6ff7227a48f2439a90bd3b297566b35c94dcc032f8b473ac147c16a languageName: node linkType: hard -"@cspell/dict-java@npm:^5.0.3": - version: 5.0.4 - resolution: "@cspell/dict-java@npm:5.0.4" - checksum: 1bbb0acc81a6af5a8e0e0e09768b1b52bfac7412e02292b6dd663949cdf33d7245e0a4018148a7d10aae8e5436714191809623a342e7cb1d42a8484dba85d8f7 +"@cspell/dict-java@npm:^5.0.6": + version: 5.0.6 + resolution: "@cspell/dict-java@npm:5.0.6" + checksum: 28cacf0fc3d72d76ee6052af07acda8b34afe5dbf564ab2e91a0f291d3bcde34e88eaf6d484044c75f34256108cdcf32dd22bc763f372bfb2e5637beba26779f languageName: node linkType: hard -"@cspell/dict-k8s@npm:^1.0.0": - version: 1.0.0 - resolution: "@cspell/dict-k8s@npm:1.0.0" - checksum: ef6d12cfd81b41c843773f61fc923a0a48b18d871ae0b8e9cd7e1bca28fba543c4bcd6964b34e2ac760336a86abdf7c8bc81a7b94bfdb274e39244a5c016fc3c +"@cspell/dict-k8s@npm:^1.0.2": + version: 1.0.2 + resolution: "@cspell/dict-k8s@npm:1.0.2" + checksum: ddcd71500a68b2b973276ca8f11f93facc6768a6661e78f6fb17908f2b8f70924d5d138e340ddba4294203588b1cb2da8cea3165671f46e71d0225450bf234ae languageName: node linkType: hard -"@cspell/dict-latex@npm:^3.1.0": - version: 3.1.0 - resolution: "@cspell/dict-latex@npm:3.1.0" - checksum: 90dafd4c1d0f9a9bd9e36734e624ca3d891023a5477ca9df62037a4297c8f751be5b33cbf4def9356d8bcec65a4e1ae89862d80ebe30675e91d10d69e0852de6 +"@cspell/dict-latex@npm:^4.0.0": + version: 4.0.0 + resolution: "@cspell/dict-latex@npm:4.0.0" + checksum: d96392866378e680d2fe29770bb8f38b1abad8c2b5b29e003bdbfe7aee79de1841fe699b6e357629e7b94dbaf882fd33e5e316d066be7fc02f0cea6caa8dcde4 languageName: node linkType: hard -"@cspell/dict-lorem-ipsum@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-lorem-ipsum@npm:3.0.0" - checksum: 145a79ec536bee3ec515b189be3f4a5347a28c563060ac5da6f6783a288e63cb0662fc918be008e1a377bdeb48cfa7a2aa1f9e9f8aef6371109f95f4b049731d +"@cspell/dict-lorem-ipsum@npm:^4.0.0": + version: 4.0.0 + resolution: "@cspell/dict-lorem-ipsum@npm:4.0.0" + checksum: 9f518643664f4ccc8b3e4126abf78385d9ea4abd1d9fc4d5e89f3a140175c62e2d5f729a97845d912f899e908dd8a9ebbc3a0debd2a41f15cee7a2f15d44b04b languageName: node linkType: hard -"@cspell/dict-lua@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-lua@npm:3.0.0" - checksum: 42a09b245cf7e6d4e67f8e7ab644479fe58116056952d1b963c7f9263ae6e11d39b1a0ba4381947ea628622172a383cec4e24a8f78c0123d46fdc2bc3b32483d +"@cspell/dict-lua@npm:^4.0.3": + version: 4.0.3 + resolution: "@cspell/dict-lua@npm:4.0.3" + checksum: 3c6bf9942f3194071d293c0024e3be1b203cdd953222cc4140e97572f1991697c3cc7b6be0c828788eaefb72e7013c8b41937e9b1c14188f79c38b45786fcca5 languageName: node linkType: hard -"@cspell/dict-node@npm:^4.0.2": - version: 4.0.2 - resolution: "@cspell/dict-node@npm:4.0.2" - checksum: 7a63ee44c4c493b429c821eb9e5fdcd1d0f549a2ada64d8ce3f7f0a88e2d26f82daada8801ee6f09a582502a1500d63985aa47204757b39014dff747211539d5 +"@cspell/dict-makefile@npm:^1.0.0": + version: 1.0.0 + resolution: "@cspell/dict-makefile@npm:1.0.0" + checksum: b0618d71cfae52c8cbe023d316195ff7fc80b29504ed983e4994df6109b62ef1e3af00500cf60ad9489b9ca9ca85b33aeb8a56f6dfff4bf8e1ac08b25a38e823 languageName: node linkType: hard -"@cspell/dict-npm@npm:^5.0.2": - version: 5.0.3 - resolution: "@cspell/dict-npm@npm:5.0.3" - checksum: f250a7d67436f23965c04028eb39395595574ef4a2250c0c30ee736b32fb583ad285d0dc383cb2ac1a9a941caaa329eeb4f2e04fe6e253e6196746d77a980880 +"@cspell/dict-node@npm:^4.0.3": + version: 4.0.3 + resolution: "@cspell/dict-node@npm:4.0.3" + checksum: 334ce75e5d3ad97dda48e33192ae2ce37d604b86e7f9d97dda1fe1468030735c6719257962d0e5a7413c63d194100e1348b86d05b5b724599175e75b0b3d29b2 languageName: node linkType: hard -"@cspell/dict-php@npm:^3.0.4": - version: 3.0.4 - resolution: "@cspell/dict-php@npm:3.0.4" - checksum: ba3dcb8afcf214e331d1ee26c61130efb6192aaf62d24655582edf23d543605d42818fb146a3b13ae203a1b70b362d3f9f5c0e793984dafb3156aff979aa6a35 +"@cspell/dict-npm@npm:^5.0.14": + version: 5.0.14 + resolution: "@cspell/dict-npm@npm:5.0.14" + checksum: d679d1dc1278c8f5a5c19347405a5e7d2d0228bbe1f023e61fd10e2532e309318dea5f700c9ac8559c5f45b333a0509b24b15a3d282e95cd050980568b400000 languageName: node linkType: hard -"@cspell/dict-powershell@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-powershell@npm:3.0.0" - checksum: 6ca16d5cb67bc8a26b1c9c52859218af5341cee68c8b5270ac79d9504ec529f24d33e4691fe0a14acb948f9910db7d8006f6c58321eab988c24f7cad6aeaebf9 +"@cspell/dict-php@npm:^4.0.5": + version: 4.0.5 + resolution: "@cspell/dict-php@npm:4.0.5" + checksum: f8910616ab35b1655a1ac5691fae076579220273670366a80d20fab3f81d4b4420d61ead78c714a1212b844302930ff215ab9f4b1c6e5c12d07fce7517beca82 languageName: node linkType: hard -"@cspell/dict-public-licenses@npm:^2.0.1": - version: 2.0.1 - resolution: "@cspell/dict-public-licenses@npm:2.0.1" - checksum: ce563b482df6f931290c0ba752417aedc993a173ae896002a4a30de9cd68418fa6a01664fe61239423388de09f17d8f68430f3ff95979a7e6e2090987aa7d968 +"@cspell/dict-powershell@npm:^5.0.3": + version: 5.0.3 + resolution: "@cspell/dict-powershell@npm:5.0.3" + checksum: 46428e937f740654c70b1e2a281bccd8253952186dcf8f8cf4bf649c7767cf37a5eed5683d9136271c78505d24648e05f4af3b41caf64ae6e881858c2fbe190e languageName: node linkType: hard -"@cspell/dict-python@npm:^4.0.1": - version: 4.0.1 - resolution: "@cspell/dict-python@npm:4.0.1" - checksum: 83ceb2779c64fb8370dfb6070015cea6337905a7066d38e69508a20976236a5e691b9926f11f4a2391ad5676a9245b5bf981a9118db2ad483baab04741467956 +"@cspell/dict-public-licenses@npm:^2.0.5": + version: 2.0.5 + resolution: "@cspell/dict-public-licenses@npm:2.0.5" + checksum: a03abe9c5d8f8088c4e9b8b9eb9a4c83331e5204bd5900987c3d3f99ee27b747fd9ff11cc5d0835e122b44a26ecdc731480680fc5c4fc8b48548c4ec0a6d5243 + languageName: node + linkType: hard + +"@cspell/dict-python@npm:^4.1.11": + version: 4.1.11 + resolution: "@cspell/dict-python@npm:4.1.11" + dependencies: + "@cspell/dict-data-science": "npm:^1.0.11" + checksum: a8f93e0d0d840cf2b62c8f5946aa67b2bfb07a42351228dc7b9275c68b69b0a658e4f3e8ed3fa89d8215950bbe7985cb1798856ba737412a455f6bf3f306593d languageName: node linkType: hard "@cspell/dict-r@npm:^2.0.1": version: 2.0.1 resolution: "@cspell/dict-r@npm:2.0.1" - checksum: fe85939ad4c8ada34284a673918be711cca60b6d6f1c48ee98602c27905228dfbaea3462a350094633032c1d6b6bba9548df7019e0b21673cf1cf887c57ca228 + checksum: c8eead19fed04ff748c8ac75c55c4cf32b0383b0b9d05a23299e7e5d2d6f0c33fe94ff4c73080fdbd5b7e2fcdeaf726373a993122ec35e3a8f2b61f202c4a837 languageName: node linkType: hard -"@cspell/dict-ruby@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-ruby@npm:3.0.0" - checksum: 1fefcf6eb971065fb909bb64c3d73503285a1a2dace8121ca1e0659ed4e12cbb9b17bfa8a33e271e4fe85725bd4d6a0ffbde3adfef7bfa874dd017902a7cb2b8 +"@cspell/dict-ruby@npm:^5.0.2": + version: 5.0.2 + resolution: "@cspell/dict-ruby@npm:5.0.2" + checksum: d966f7cef9065d93671e82605bd30639ff3846b2cc3c89029a6b01898b0cc6575cf88d95e5854f9bc26fe5c02c4cefa7ff35ace4be401607cc4839ed26a116d1 languageName: node linkType: hard -"@cspell/dict-rust@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-rust@npm:3.0.0" - checksum: 0402b073b2d123305437bd7f67d8648931b8aeeb3ce0198f7d1db6aadac466d53cb91b419ae0788fd464c21067b5e4ccc55550beed6803ef5711aa1abddb92a6 +"@cspell/dict-rust@npm:^4.0.1": + version: 4.0.1 + resolution: "@cspell/dict-rust@npm:4.0.1" + checksum: 724441dbc769d67ab3eac9a7d7b5c2734158619d2fea65069a955f036894551f8d074f223a8dbad7e5f326b42a9b5e4341f976210708ef16c27e428c024dae35 languageName: node linkType: hard -"@cspell/dict-scala@npm:^3.0.0": - version: 3.0.0 - resolution: "@cspell/dict-scala@npm:3.0.0" - checksum: 3a8794587cc16b95c2939927e980c9164c98fe2ea4709fa8e65ba98ea7632a2b21f2432da486843f13bd6d2ad1f67c81baa2b8226c48900fb19634b832ea3558 +"@cspell/dict-scala@npm:^5.0.0": + version: 5.0.0 + resolution: "@cspell/dict-scala@npm:5.0.0" + checksum: 6ca476b07610b0602b8e0d4e8147418c4d6046bee2d0d7d9468fa57e84c305e93ab4a4a8eded7cbd660792bf22869c435a4f9dcfab41584ffa03f1884d27ae94 languageName: node linkType: hard -"@cspell/dict-software-terms@npm:^3.0.7": - version: 3.1.0 - resolution: "@cspell/dict-software-terms@npm:3.1.0" - checksum: ef2da1d416bbd7019ad648dbe3e34016a63ca29a342a1bd866e82cb6881ffd0a0f61c2711a78aa6dbc03033b79cc815abcc19b24f132284468df37d68c6ff54c +"@cspell/dict-software-terms@npm:^3.3.15": + version: 3.3.16 + resolution: "@cspell/dict-software-terms@npm:3.3.16" + checksum: 70d6d0eb3a2793fb3309cecc9f75562fa5f22360e2a83862a8ae56185169028032fa483a3ea8256db9378b56a6be2c652dae196137743b6a933dc2670e338a54 languageName: node linkType: hard -"@cspell/dict-sql@npm:^2.0.1": - version: 2.0.1 - resolution: "@cspell/dict-sql@npm:2.0.1" - checksum: c92d2c9f3b22de02be5353dfe17e84ba3e562f463128fdcd46959ac9eacd9affb531a64ca374af159eeb8b1d3314a3a530d86ddaf35d972a76e0042614cb2d38 +"@cspell/dict-sql@npm:^2.1.3": + version: 2.1.3 + resolution: "@cspell/dict-sql@npm:2.1.3" + checksum: 2b9037e51cc471a9bd6a1a79a6cdbd109646a170b5926d5174b29bdfce0a3fd096bc2ab0b9e6d49d5114760429cfce3bf424c3a1e6a15288a361b35860797400 languageName: node linkType: hard -"@cspell/dict-svelte@npm:^1.0.1": +"@cspell/dict-svelte@npm:^1.0.2": version: 1.0.2 resolution: "@cspell/dict-svelte@npm:1.0.2" - checksum: 5b42989bc6743a26ca5172cc23ebc1449d930695b10c908376048ce1835bf57fef7a0004f02ec5e43219f24a97f154e125041df470441199a045ed0be9e654fc + checksum: bd650fd25d2ea83808a69eb2a6cb7a5b82295c3dde1c334fc54ff439287c5bf13e3293397e2c45e8b2d1b69fd133e17f4eb920b64df2571c5a399ac1e206f551 languageName: node linkType: hard "@cspell/dict-swift@npm:^2.0.1": version: 2.0.1 resolution: "@cspell/dict-swift@npm:2.0.1" - checksum: 0bbb106266205c5f5e12886a73ebf0db2078bab1bdd2e1f304fe28445cd72d847a4c5072bf4fe8f9e8cdb4bc69d52fffec0806aea19ea9b64b7a87c67ee01175 + checksum: e29ffc8379d50ef9397018c25b1be05177d4ecb1e18d3b97834f9edf0306af349b5593d7d93a7f2624616c1beeb35eb1e56560d351f459b776c3dd6b2c0ac601 languageName: node linkType: hard -"@cspell/dict-typescript@npm:^3.1.0": - version: 3.1.0 - resolution: "@cspell/dict-typescript@npm:3.1.0" - checksum: b34a9f394a9426d0ec7ff6ee378b973b7e5a4483add7a19686cf923dd7047c0195e8ac155529c4a38e0bda4f48e50f7efe8de8df6ad71f875a29d28e64c8c01c +"@cspell/dict-typescript@npm:^3.1.2": + version: 3.1.2 + resolution: "@cspell/dict-typescript@npm:3.1.2" + checksum: 275838fae72d4a7fec979b1d3f95535ba21057417a3c4521b57b50d242fe0d9bb18e0db0f8e68380b9cd1753a5b7e77f202ee0a455ea0f91048652f5423df8b9 languageName: node linkType: hard "@cspell/dict-vue@npm:^3.0.0": version: 3.0.0 resolution: "@cspell/dict-vue@npm:3.0.0" - checksum: 4db58b1d6f9be1a523a35678877f2cca2bb04548b136ec5ec4e7186500978dbc32cc8747ced80ade3cad3acc3c80eb23afe980679165810f8f8f26802e952e2f + checksum: 2995b912e26cf88cb6ec9728a9adc5b24a0243c001887d425b14a61ef2be22aca38fa99a84d7698d8982aef65c8db4abf583c3d916c2166b9e8d99cec80800cd languageName: node linkType: hard -"@cspell/strong-weak-map@npm:6.18.1": - version: 6.18.1 - resolution: "@cspell/strong-weak-map@npm:6.18.1" - checksum: bad1e5e1041797a2fa3bf74efadbfd0bee3b645f7adb98a4bf676cdc999531990754e948d0519cd3369bcdd0b3152760992bf9142acb3c7a0cb024c75142d9dd +"@cspell/dynamic-import@npm:8.3.2": + version: 8.3.2 + resolution: "@cspell/dynamic-import@npm:8.3.2" + dependencies: + import-meta-resolve: "npm:^4.0.0" + checksum: 21bd5ab5fb6bb9b4ce81a8314fefa377ba3001c6c5e9104cf156639e510065f6b9542e638f153c58d45302af65abc36ebacc5187d024cbee76eefee801bf9d31 languageName: node linkType: hard -"@cspotcode/source-map-support@npm:^0.8.0": - version: 0.8.1 - resolution: "@cspotcode/source-map-support@npm:0.8.1" - dependencies: - "@jridgewell/trace-mapping": 0.3.9 - checksum: 5718f267085ed8edb3e7ef210137241775e607ee18b77d95aa5bd7514f47f5019aa2d82d96b3bf342ef7aa890a346fa1044532ff7cc3009e7d24fce3ce6200fa +"@cspell/strong-weak-map@npm:8.3.2": + version: 8.3.2 + resolution: "@cspell/strong-weak-map@npm:8.3.2" + checksum: 932c8970e003b052c9a29c969845101e52dbd94ece0d108445dd1928eb0d2fbaceb3e186af7f015e28bd5a357928f1aafceb42e231e61801681341876a26b57c languageName: node linkType: hard -"@eslint/eslintrc@npm:^1.4.1": - version: 1.4.1 - resolution: "@eslint/eslintrc@npm:1.4.1" +"@dependents/detective-less@npm:^3.0.1": + version: 3.0.2 + resolution: "@dependents/detective-less@npm:3.0.2" dependencies: - ajv: ^6.12.4 - debug: ^4.3.2 - espree: ^9.4.0 - globals: ^13.19.0 - ignore: ^5.2.0 - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 - minimatch: ^3.1.2 - strip-json-comments: ^3.1.1 - checksum: cd3e5a8683db604739938b1c1c8b77927dc04fce3e28e0c88e7f2cd4900b89466baf83dfbad76b2b9e4d2746abdd00dd3f9da544d3e311633d8693f327d04cd7 + gonzales-pe: "npm:^4.3.0" + node-source-walk: "npm:^5.0.1" + checksum: 112889bd47d1f47f00441326e710bf83bd2191104ab9eb35e24dd531509751f9d0c9000a3f202c84eabffe3e57b488bd2b1ef23485ad13bf5f9ca1b0aed100aa languageName: node linkType: hard -"@fast-check/ava@npm:^1.1.3": - version: 1.1.3 - resolution: "@fast-check/ava@npm:1.1.3" +"@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": + version: 4.4.0 + resolution: "@eslint-community/eslint-utils@npm:4.4.0" dependencies: - fast-check: ^3.0.0 + eslint-visitor-keys: "npm:^3.3.0" peerDependencies: - ava: ">=4.0.0" - checksum: 3540d13ff2898916bfbaf921573b1d5f0f6364cfe09ac79f11670b3fd4768cb89f3dec5712ac75bf58feb4165b5ce188cf72d996a2d8e14711c808764f593c25 + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + checksum: 7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e languageName: node linkType: hard -"@gar/promisify@npm:^1.1.3": - version: 1.1.3 - resolution: "@gar/promisify@npm:1.1.3" - checksum: 4059f790e2d07bf3c3ff3e0fec0daa8144fe35c1f6e0111c9921bd32106adaa97a4ab096ad7dab1e28ee6a9060083c4d1a4ada42a7f5f3f7a96b8812e2b757c1 +"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": + version: 4.10.0 + resolution: "@eslint-community/regexpp@npm:4.10.0" + checksum: c5f60ef1f1ea7649fa7af0e80a5a79f64b55a8a8fa5086de4727eb4c86c652aedee407a9c143b8995d2c0b2d75c1222bec9ba5d73dbfc1f314550554f0979ef4 languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.8": - version: 0.11.8 - resolution: "@humanwhocodes/config-array@npm:0.11.8" +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" dependencies: - "@humanwhocodes/object-schema": ^1.2.1 - debug: ^4.1.1 - minimatch: ^3.0.5 - checksum: 0fd6b3c54f1674ce0a224df09b9c2f9846d20b9e54fabae1281ecfc04f2e6ad69bf19e1d6af6a28f88e8aa3990168b6cb9e1ef755868c3256a630605ec2cb1d3 + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^9.6.0" + globals: "npm:^13.19.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + languageName: node + linkType: hard + +"@eslint/js@npm:8.56.0": + version: 8.56.0 + resolution: "@eslint/js@npm:8.56.0" + checksum: 60b3a1cf240e2479cec9742424224465dc50e46d781da1b7f5ef240501b2d1202c225bd456207faac4b34a64f4765833345bc4ddffd00395e1db40fa8c426f5a + languageName: node + linkType: hard + +"@fast-check/ava@npm:^1.2.1": + version: 1.2.1 + resolution: "@fast-check/ava@npm:1.2.1" + dependencies: + fast-check: "npm:^3.0.0" + peerDependencies: + ava: ^4 || ^5 || ^6 + checksum: 3800098fd7e8098102544a2f7a595351d063a7ebaeca18ed4901df5ec2679da2330ba8c0db2c820721d4cbb3e23d817ba22fec6d058957930e229f44fa71a684 + languageName: node + linkType: hard + +"@humanwhocodes/config-array@npm:^0.11.13": + version: 0.11.13 + resolution: "@humanwhocodes/config-array@npm:0.11.13" + dependencies: + "@humanwhocodes/object-schema": "npm:^2.0.1" + debug: "npm:^4.1.1" + minimatch: "npm:^3.0.5" + checksum: d76ca802d853366094d0e98ff0d0994117fc8eff96649cd357b15e469e428228f597cd2e929d54ab089051684949955f16ee905bb19f7b2f0446fb377157be7a languageName: node linkType: hard "@humanwhocodes/module-importer@npm:^1.0.1": version: 1.0.1 resolution: "@humanwhocodes/module-importer@npm:1.0.1" - checksum: 0fd22007db8034a2cdf2c764b140d37d9020bbfce8a49d3ec5c05290e77d4b0263b1b972b752df8c89e5eaa94073408f2b7d977aed131faf6cf396ebb5d7fb61 + checksum: 909b69c3b86d482c26b3359db16e46a32e0fb30bd306a3c176b8313b9e7313dba0f37f519de6aa8b0a1921349e505f259d19475e123182416a506d7f87e7f529 languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^1.2.1": - version: 1.2.1 - resolution: "@humanwhocodes/object-schema@npm:1.2.1" - checksum: a824a1ec31591231e4bad5787641f59e9633827d0a2eaae131a288d33c9ef0290bd16fda8da6f7c0fcb014147865d12118df10db57f27f41e20da92369fcb3f1 +"@humanwhocodes/object-schema@npm:^2.0.1": + version: 2.0.1 + resolution: "@humanwhocodes/object-schema@npm:2.0.1" + checksum: 9dba24e59fdb4041829d92b693aacb778add3b6f612aaa9c0774f3b650c11a378cc64f042a59da85c11dae33df456580a3c36837b953541aed6ff94294f97fac languageName: node linkType: hard "@hutson/parse-repository-url@npm:^3.0.0": version: 3.0.2 resolution: "@hutson/parse-repository-url@npm:3.0.2" - checksum: 39992c5f183c5ca3d761d6ed9dfabcb79b5f3750bf1b7f3532e1dc439ca370138bbd426ee250fdaba460bc948e6761fbefd484b8f4f36885d71ded96138340d1 + checksum: d9197757ecad2df18d29d3e1d1fe0716d458fd88b849c71cbec9e78239f911074c97e8d764dfd8ed890431c1137e52dd7a337207fd65be20ce0784f7860ae4d1 + languageName: node + linkType: hard + +"@isaacs/cliui@npm:^8.0.2": + version: 8.0.2 + resolution: "@isaacs/cliui@npm:8.0.2" + dependencies: + string-width: "npm:^5.1.2" + string-width-cjs: "npm:string-width@^4.2.0" + strip-ansi: "npm:^7.0.1" + strip-ansi-cjs: "npm:strip-ansi@^6.0.1" + wrap-ansi: "npm:^8.1.0" + wrap-ansi-cjs: "npm:wrap-ansi@^7.0.0" + checksum: b1bf42535d49f11dc137f18d5e4e63a28c5569de438a221c369483731e9dac9fb797af554e8bf02b6192d1e5eba6e6402cf93900c3d0ac86391d00d04876789e languageName: node linkType: hard "@istanbuljs/schema@npm:^0.1.2, @istanbuljs/schema@npm:^0.1.3": version: 0.1.3 resolution: "@istanbuljs/schema@npm:0.1.3" - checksum: 5282759d961d61350f33d9118d16bcaed914ebf8061a52f4fa474b2cb08720c9c81d165e13b82f2e5a8a212cc5af482f0c6fc1ac27b9e067e5394c9a6ed186c9 + checksum: 61c5286771676c9ca3eb2bd8a7310a9c063fb6e0e9712225c8471c582d157392c88f5353581c8c9adbe0dff98892317d2fdfc56c3499aa42e0194405206a963a languageName: node linkType: hard -"@jridgewell/resolve-uri@npm:3.1.0, @jridgewell/resolve-uri@npm:^3.0.3": - version: 3.1.0 - resolution: "@jridgewell/resolve-uri@npm:3.1.0" - checksum: b5ceaaf9a110fcb2780d1d8f8d4a0bfd216702f31c988d8042e5f8fbe353c55d9b0f55a1733afdc64806f8e79c485d2464680ac48a0d9fcadb9548ee6b81d267 +"@jridgewell/resolve-uri@npm:^3.1.0": + version: 3.1.1 + resolution: "@jridgewell/resolve-uri@npm:3.1.1" + checksum: 0dbc9e29bc640bbbdc5b9876d2859c69042bfcf1423c1e6421bcca53e826660bff4e41c7d4bcb8dbea696404231a6f902f76ba41835d049e20f2dd6cffb713bf languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.10": - version: 1.4.14 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.14" - checksum: 61100637b6d173d3ba786a5dff019e1a74b1f394f323c1fee337ff390239f053b87266c7a948777f4b1ee68c01a8ad0ab61e5ff4abb5a012a0b091bec391ab97 +"@jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": + version: 1.4.15 + resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" + checksum: 0c6b5ae663087558039052a626d2d7ed5208da36cfd707dcc5cea4a07cfc918248403dcb5989a8f7afaf245ce0573b7cc6fd94c4a30453bd10e44d9363940ba5 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:0.3.9": - version: 0.3.9 - resolution: "@jridgewell/trace-mapping@npm:0.3.9" +"@jridgewell/trace-mapping@npm:^0.3.12": + version: 0.3.20 + resolution: "@jridgewell/trace-mapping@npm:0.3.20" dependencies: - "@jridgewell/resolve-uri": ^3.0.3 - "@jridgewell/sourcemap-codec": ^1.4.10 - checksum: d89597752fd88d3f3480845691a05a44bd21faac18e2185b6f436c3b0fd0c5a859fbbd9aaa92050c4052caf325ad3e10e2e1d1b64327517471b7d51babc0ddef + "@jridgewell/resolve-uri": "npm:^3.1.0" + "@jridgewell/sourcemap-codec": "npm:^1.4.14" + checksum: 0ea0b2675cf513ec44dc25605616a3c9b808b9832e74b5b63c44260d66b58558bba65764f81928fc1033ead911f8718dca1134049c3e7a93937faf436671df31 languageName: node linkType: hard -"@jridgewell/trace-mapping@npm:^0.3.12": - version: 0.3.17 - resolution: "@jridgewell/trace-mapping@npm:0.3.17" - dependencies: - "@jridgewell/resolve-uri": 3.1.0 - "@jridgewell/sourcemap-codec": 1.4.14 - checksum: 9d703b859cff5cd83b7308fd457a431387db5db96bd781a63bf48e183418dd9d3d44e76b9e4ae13237f6abeeb25d739ec9215c1d5bfdd08f66f750a50074a339 +"@mapbox/node-pre-gyp@npm:^1.0.5": + version: 1.0.11 + resolution: "@mapbox/node-pre-gyp@npm:1.0.11" + dependencies: + detect-libc: "npm:^2.0.0" + https-proxy-agent: "npm:^5.0.0" + make-dir: "npm:^3.1.0" + node-fetch: "npm:^2.6.7" + nopt: "npm:^5.0.0" + npmlog: "npm:^5.0.1" + rimraf: "npm:^3.0.2" + semver: "npm:^7.3.5" + tar: "npm:^6.1.11" + bin: + node-pre-gyp: bin/node-pre-gyp + checksum: 2b24b93c31beca1c91336fa3b3769fda98e202fb7f9771f0f4062588d36dcc30fcf8118c36aa747fa7f7610d8cf601872bdaaf62ce7822bb08b545d1bbe086cc languageName: node linkType: hard -"@microsoft/api-documenter@npm:^7.19.27": - version: 7.19.27 - resolution: "@microsoft/api-documenter@npm:7.19.27" +"@microsoft/api-documenter@npm:^7.23.16": + version: 7.23.16 + resolution: "@microsoft/api-documenter@npm:7.23.16" dependencies: - "@microsoft/api-extractor-model": 7.25.3 - "@microsoft/tsdoc": 0.14.2 - "@rushstack/node-core-library": 3.53.3 - "@rushstack/ts-command-line": 4.13.1 - colors: ~1.2.1 - js-yaml: ~3.13.1 - resolve: ~1.22.1 + "@microsoft/api-extractor-model": "npm:7.28.4" + "@microsoft/tsdoc": "npm:0.14.2" + "@rushstack/node-core-library": "npm:3.63.0" + "@rushstack/ts-command-line": "npm:4.17.1" + colors: "npm:~1.2.1" + js-yaml: "npm:~3.13.1" + resolve: "npm:~1.22.1" bin: api-documenter: bin/api-documenter - checksum: f243f473e1fe58e1cd6e32aad223724b6b621f569276415380abc4845859bf5c23fbe0e370be2a218f362a6c85b01b44b5427336f55800f2ea8bf3f398b0ee41 + checksum: 18f1f04571cf0c8e72f4b6ddf570f9aad07bd8160b06bc377018e0f563f91881f1cca0af883684ceccd8871a59cedd0695c450f9c68eb50583049a722afcf8b3 languageName: node linkType: hard -"@microsoft/api-extractor-model@npm:7.25.3": - version: 7.25.3 - resolution: "@microsoft/api-extractor-model@npm:7.25.3" +"@microsoft/api-extractor-model@npm:7.28.4": + version: 7.28.4 + resolution: "@microsoft/api-extractor-model@npm:7.28.4" dependencies: - "@microsoft/tsdoc": 0.14.2 - "@microsoft/tsdoc-config": ~0.16.1 - "@rushstack/node-core-library": 3.53.3 - checksum: 532ca30606b5649e90035ef70ff46868f6ccc63181e10b783bc5092e580bcb133112b300799b8f71a19da2b79f685a55f7ddbe84c8fe7ad93d71359c1763c521 + "@microsoft/tsdoc": "npm:0.14.2" + "@microsoft/tsdoc-config": "npm:~0.16.1" + "@rushstack/node-core-library": "npm:3.63.0" + checksum: 94b3748d4bcb58871a3b8565378e919bbe548d857585314a1a25cdde092fdf925ecb4aff452e6da39d899c57b469a44a8ba54ca8b3341d3103affcc798a4d2f9 languageName: node linkType: hard -"@microsoft/api-extractor@npm:^7.33.7": - version: 7.33.7 - resolution: "@microsoft/api-extractor@npm:7.33.7" +"@microsoft/api-extractor@npm:^7.39.1": + version: 7.39.1 + resolution: "@microsoft/api-extractor@npm:7.39.1" dependencies: - "@microsoft/api-extractor-model": 7.25.3 - "@microsoft/tsdoc": 0.14.2 - "@microsoft/tsdoc-config": ~0.16.1 - "@rushstack/node-core-library": 3.53.3 - "@rushstack/rig-package": 0.3.17 - "@rushstack/ts-command-line": 4.13.1 - colors: ~1.2.1 - lodash: ~4.17.15 - resolve: ~1.17.0 - semver: ~7.3.0 - source-map: ~0.6.1 - typescript: ~4.8.4 + "@microsoft/api-extractor-model": "npm:7.28.4" + "@microsoft/tsdoc": "npm:0.14.2" + "@microsoft/tsdoc-config": "npm:~0.16.1" + "@rushstack/node-core-library": "npm:3.63.0" + "@rushstack/rig-package": "npm:0.5.1" + "@rushstack/ts-command-line": "npm:4.17.1" + colors: "npm:~1.2.1" + lodash: "npm:~4.17.15" + resolve: "npm:~1.22.1" + semver: "npm:~7.5.4" + source-map: "npm:~0.6.1" + typescript: "npm:5.3.3" bin: api-extractor: bin/api-extractor - checksum: 3f9034ca8e7bc7a6622cb8ac1f53f7f265ebca529e17f4abb2bef0ca297011cfa0927c0703a819607d974ca79b8f5307371491cfb192788e723cfd316250f9a6 + checksum: 2901854e23be830cea15f4a51256a5cb55f099febd8a65e353f917abbcb533cd5bdfd5c787eb2b4d751f60b2b04b460e4b79d82ebb580ae0a8445d998c27f6b3 languageName: node linkType: hard @@ -756,18 +862,18 @@ __metadata: version: 0.16.2 resolution: "@microsoft/tsdoc-config@npm:0.16.2" dependencies: - "@microsoft/tsdoc": 0.14.2 - ajv: ~6.12.6 - jju: ~1.4.0 - resolve: ~1.19.0 - checksum: 12b0d703154076bcaac75ca42e804e4fc292672396441e54346d7eadd0d6b57f90980eda2b1bab89b224af86da34a2389f9054002e282011e795ca5919a4386f + "@microsoft/tsdoc": "npm:0.14.2" + ajv: "npm:~6.12.6" + jju: "npm:~1.4.0" + resolve: "npm:~1.19.0" + checksum: 9e8c176b68f01c8bb38e6365d5b543e471bba59fced6070d9bd35b32461fbd650c2e1a6f686e8dca0cf22bc5e7d796e4213e66bce4426c8cb9864c1f6ca6836c languageName: node linkType: hard "@microsoft/tsdoc@npm:0.14.2": version: 0.14.2 resolution: "@microsoft/tsdoc@npm:0.14.2" - checksum: b167c89e916ba73ee20b9c9d5dba6aa3a0de25ed3d50050e8a344dca7cd43cb2e1059bd515c820369b6e708901dd3fda476a42bc643ca74a35671ce77f724a3a + checksum: c018857ad439144559ce34a397a29ace7cf5b24b999b8e3c1b88d878338088b3a453eaac4435beaf2c7eae13c4c0aac81e42f96f0f1d48e8d4eeb438eb3bb82f languageName: node linkType: hard @@ -775,16 +881,16 @@ __metadata: version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" dependencies: - "@nodelib/fs.stat": 2.0.5 - run-parallel: ^1.1.9 - checksum: a970d595bd23c66c880e0ef1817791432dbb7acbb8d44b7e7d0e7a22f4521260d4a83f7f9fd61d44fda4610105577f8f58a60718105fb38352baed612fd79e59 + "@nodelib/fs.stat": "npm:2.0.5" + run-parallel: "npm:^1.1.9" + checksum: 732c3b6d1b1e967440e65f284bd06e5821fedf10a1bea9ed2bb75956ea1f30e08c44d3def9d6a230666574edbaf136f8cfd319c14fd1f87c66e6a44449afb2eb languageName: node linkType: hard "@nodelib/fs.stat@npm:2.0.5, @nodelib/fs.stat@npm:^2.0.2": version: 2.0.5 resolution: "@nodelib/fs.stat@npm:2.0.5" - checksum: 012480b5ca9d97bff9261571dbbec7bbc6033f69cc92908bc1ecfad0792361a5a1994bc48674b9ef76419d056a03efadfce5a6cf6dbc0a36559571a7a483f6f0 + checksum: 88dafe5e3e29a388b07264680dc996c17f4bda48d163a9d4f5c1112979f0ce8ec72aa7116122c350b4e7976bc5566dc3ddb579be1ceaacc727872eb4ed93926d languageName: node linkType: hard @@ -792,545 +898,609 @@ __metadata: version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: - "@nodelib/fs.scandir": 2.1.5 - fastq: ^1.6.0 - checksum: 190c643f156d8f8f277bf2a6078af1ffde1fd43f498f187c2db24d35b4b4b5785c02c7dc52e356497b9a1b65b13edc996de08de0b961c32844364da02986dc53 + "@nodelib/fs.scandir": "npm:2.1.5" + fastq: "npm:^1.6.0" + checksum: db9de047c3bb9b51f9335a7bb46f4fcfb6829fb628318c12115fbaf7d369bfce71c15b103d1fc3b464812d936220ee9bc1c8f762d032c9f6be9acc99249095b1 languageName: node linkType: hard -"@npmcli/fs@npm:^2.1.0": - version: 2.1.2 - resolution: "@npmcli/fs@npm:2.1.2" +"@npmcli/agent@npm:^2.0.0": + version: 2.2.0 + resolution: "@npmcli/agent@npm:2.2.0" dependencies: - "@gar/promisify": ^1.1.3 - semver: ^7.3.5 - checksum: 405074965e72d4c9d728931b64d2d38e6ea12066d4fad651ac253d175e413c06fe4350970c783db0d749181da8fe49c42d3880bd1cbc12cd68e3a7964d820225 + agent-base: "npm:^7.1.0" + http-proxy-agent: "npm:^7.0.0" + https-proxy-agent: "npm:^7.0.1" + lru-cache: "npm:^10.0.1" + socks-proxy-agent: "npm:^8.0.1" + checksum: 7b89590598476dda88e79c473766b67c682aae6e0ab0213491daa6083dcc0c171f86b3868f5506f22c09aa5ea69ad7dfb78f4bf39a8dca375d89a42f408645b3 languageName: node linkType: hard -"@npmcli/move-file@npm:^2.0.0": - version: 2.0.1 - resolution: "@npmcli/move-file@npm:2.0.1" +"@npmcli/fs@npm:^3.1.0": + version: 3.1.0 + resolution: "@npmcli/fs@npm:3.1.0" dependencies: - mkdirp: ^1.0.4 - rimraf: ^3.0.2 - checksum: 52dc02259d98da517fae4cb3a0a3850227bdae4939dda1980b788a7670636ca2b4a01b58df03dd5f65c1e3cb70c50fa8ce5762b582b3f499ec30ee5ce1fd9380 + semver: "npm:^7.3.5" + checksum: 162b4a0b8705cd6f5c2470b851d1dc6cd228c86d2170e1769d738c1fbb69a87160901411c3c035331e9e99db72f1f1099a8b734bf1637cc32b9a5be1660e4e1e languageName: node linkType: hard -"@rollup/plugin-alias@npm:^4.0.2": - version: 4.0.2 - resolution: "@rollup/plugin-alias@npm:4.0.2" +"@pkgjs/parseargs@npm:^0.11.0": + version: 0.11.0 + resolution: "@pkgjs/parseargs@npm:0.11.0" + checksum: 5bd7576bb1b38a47a7fc7b51ac9f38748e772beebc56200450c4a817d712232b8f1d3ef70532c80840243c657d491cf6a6be1e3a214cff907645819fdc34aadd + languageName: node + linkType: hard + +"@playwright/test@npm:^1.40.1": + version: 1.40.1 + resolution: "@playwright/test@npm:1.40.1" dependencies: - slash: ^4.0.0 + playwright: "npm:1.40.1" + bin: + playwright: cli.js + checksum: 1edbc9659fb6a9c5299cacd9a0c7d3fdc88939036642d8f367e13d267d808ae3f88ca9d00e9981e3bcd5f584ccefba38d24eda6b23d27895908f203dc35f339e + languageName: node + linkType: hard + +"@rollup/plugin-alias@npm:^5.1.0": + version: 5.1.0 + resolution: "@rollup/plugin-alias@npm:5.1.0" + dependencies: + slash: "npm:^4.0.0" peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - checksum: 6f2db9cfea12b366d1127fca8774e09ab3de98da8ea62082834e795544e1e706479d3056b0d4863c3cc41de2ff04aa7f89942c3c333a8a9944c60108051b2e3c + checksum: fcae5d711b66c098cd237e09e3000e7dec27cf8b0fa82f5a9cd437c4d8d9428194f51d12822b8593b49f3d9e51c6df6a583037cab35763d92555f9c7fcb0db3d languageName: node linkType: hard -"@rollup/plugin-commonjs@npm:^22.0.2": - version: 22.0.2 - resolution: "@rollup/plugin-commonjs@npm:22.0.2" +"@rollup/plugin-commonjs@npm:^25.0.7": + version: 25.0.7 + resolution: "@rollup/plugin-commonjs@npm:25.0.7" dependencies: - "@rollup/pluginutils": ^3.1.0 - commondir: ^1.0.1 - estree-walker: ^2.0.1 - glob: ^7.1.6 - is-reference: ^1.2.1 - magic-string: ^0.25.7 - resolve: ^1.17.0 + "@rollup/pluginutils": "npm:^5.0.1" + commondir: "npm:^1.0.1" + estree-walker: "npm:^2.0.2" + glob: "npm:^8.0.3" + is-reference: "npm:1.2.1" + magic-string: "npm:^0.30.3" peerDependencies: - rollup: ^2.68.0 - checksum: 70098a4b91afe3f164f5d27cba65edf148c5ed146ee0e07a964b66940681553ac77391083114cdcf9427e7f2706bf0d61eab310b3a2caeab83b7452c0292fcae + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: d096af5aedd55c19ac528daa84a4cacdf21a69c9c9b20c23e04f27a64966cb383f5e2b01b9c903d40318e35dcaa74dc7b5292a844c6cbc66c252f5447eac05b4 languageName: node linkType: hard -"@rollup/plugin-node-resolve@npm:^15.0.1": - version: 15.0.1 - resolution: "@rollup/plugin-node-resolve@npm:15.0.1" +"@rollup/plugin-node-resolve@npm:^15.2.3": + version: 15.2.3 + resolution: "@rollup/plugin-node-resolve@npm:15.2.3" dependencies: - "@rollup/pluginutils": ^5.0.1 - "@types/resolve": 1.20.2 - deepmerge: ^4.2.2 - is-builtin-module: ^3.2.0 - is-module: ^1.0.0 - resolve: ^1.22.1 + "@rollup/pluginutils": "npm:^5.0.1" + "@types/resolve": "npm:1.20.2" + deepmerge: "npm:^4.2.2" + is-builtin-module: "npm:^3.2.1" + is-module: "npm:^1.0.0" + resolve: "npm:^1.22.1" peerDependencies: - rollup: ^2.78.0||^3.0.0 + rollup: ^2.78.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - checksum: 90e30b41626a15ebf02746a83d34b15f9fe9051ddc156a9bf785504f489947980b3bdeb7bf2f80828a9becfe472a03a96d0238328a3e3e2198a482fcac7eb3aa + checksum: 598c15615086f26e28c4b3dbf966682af7fb0e5bc277cc4e57f559668a3be675a63ab261eb34729ce9569c3a51342c48863e50b5efe02e0fc1571828f0113f9d languageName: node linkType: hard -"@rollup/pluginutils@npm:^3.1.0": - version: 3.1.0 - resolution: "@rollup/pluginutils@npm:3.1.0" +"@rollup/pluginutils@npm:^4.0.0": + version: 4.2.1 + resolution: "@rollup/pluginutils@npm:4.2.1" dependencies: - "@types/estree": 0.0.39 - estree-walker: ^1.0.1 - picomatch: ^2.2.2 - peerDependencies: - rollup: ^1.20.0||^2.0.0 - checksum: 8be16e27863c219edbb25a4e6ec2fe0e1e451d9e917b6a43cf2ae5bc025a6b8faaa40f82a6e53b66d0de37b58ff472c6c3d57a83037ae635041f8df959d6d9aa + estree-walker: "npm:^2.0.1" + picomatch: "npm:^2.2.2" + checksum: 3ee56b2c8f1ed8dfd0a92631da1af3a2dfdd0321948f089b3752b4de1b54dc5076701eadd0e5fc18bd191b77af594ac1db6279e83951238ba16bf8a414c64c48 languageName: node linkType: hard "@rollup/pluginutils@npm:^5.0.1": - version: 5.0.2 - resolution: "@rollup/pluginutils@npm:5.0.2" + version: 5.1.0 + resolution: "@rollup/pluginutils@npm:5.1.0" dependencies: - "@types/estree": ^1.0.0 - estree-walker: ^2.0.2 - picomatch: ^2.3.1 + "@types/estree": "npm:^1.0.0" + estree-walker: "npm:^2.0.2" + picomatch: "npm:^2.3.1" peerDependencies: - rollup: ^1.20.0||^2.0.0||^3.0.0 + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 peerDependenciesMeta: rollup: optional: true - checksum: edea15e543bebc7dcac3b0ac8bc7b8e8e6dbd46e2864dbe5dd28072de1fbd5b0e10d545a610c0edaa178e8a7ac432e2a2a52e547ece1308471412caba47db8ce + checksum: c7bed15711f942d6fdd3470fef4105b73991f99a478605e13d41888963330a6f9e32be37e6ddb13f012bc7673ff5e54f06f59fd47109436c1c513986a8a7612d languageName: node linkType: hard -"@rushstack/node-core-library@npm:3.53.3": - version: 3.53.3 - resolution: "@rushstack/node-core-library@npm:3.53.3" - dependencies: - "@types/node": 12.20.24 - colors: ~1.2.1 - fs-extra: ~7.0.1 - import-lazy: ~4.0.0 - jju: ~1.4.0 - resolve: ~1.17.0 - semver: ~7.3.0 - z-schema: ~5.0.2 - checksum: 265d18e176079b8e90cd507e5d4d45f3afb1f811efdf491ea26f25f0397b77c0e9d42065166bf79a04503426c844ea92034cd3f8d5961b2a116de82e45cf6d6a +"@rollup/rollup-android-arm-eabi@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.9.3" + conditions: os=android & cpu=arm languageName: node linkType: hard -"@rushstack/rig-package@npm:0.3.17": - version: 0.3.17 - resolution: "@rushstack/rig-package@npm:0.3.17" - dependencies: - resolve: ~1.17.0 - strip-json-comments: ~3.1.1 - checksum: 54eeea471c85b547575d7efc84fad3c9588f10106e2bfd8cd022bccb02c2fb0bf8ff597fab9114450b3c262abab0f0a4e52dd074bfd120e850b95037cd7b3102 +"@rollup/rollup-android-arm64@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-android-arm64@npm:4.9.3" + conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rushstack/ts-command-line@npm:4.13.1": - version: 4.13.1 - resolution: "@rushstack/ts-command-line@npm:4.13.1" - dependencies: - "@types/argparse": 1.0.38 - argparse: ~1.0.9 - colors: ~1.2.1 - string-argv: ~0.3.1 - checksum: fea24b2549ecb7d3409b6b485d7c58bf8af8f8d1dd19c43a6b3532c45579ffc546bc4533b5db29c91ae1716581fdee4cb725f6a81ecb300e902ef06600e59f1d +"@rollup/rollup-darwin-arm64@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-darwin-arm64@npm:4.9.3" + conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@tokenizer/token@npm:^0.3.0": - version: 0.3.0 - resolution: "@tokenizer/token@npm:0.3.0" - checksum: 1d575d02d2a9f0c5a4ca5180635ebd2ad59e0f18b42a65f3d04844148b49b3db35cf00b6012a1af2d59c2ab3caca59451c5689f747ba8667ee586ad717ee58e1 +"@rollup/rollup-darwin-x64@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-darwin-x64@npm:4.9.3" + conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@tootallnate/once@npm:2": - version: 2.0.0 - resolution: "@tootallnate/once@npm:2.0.0" - checksum: ad87447820dd3f24825d2d947ebc03072b20a42bfc96cbafec16bff8bbda6c1a81fcb0be56d5b21968560c5359a0af4038a68ba150c3e1694fe4c109a063bed8 +"@rollup/rollup-linux-arm-gnueabihf@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.9.3" + conditions: os=linux & cpu=arm languageName: node linkType: hard -"@tsconfig/node10@npm:^1.0.7": - version: 1.0.9 - resolution: "@tsconfig/node10@npm:1.0.9" - checksum: a33ae4dc2a621c0678ac8ac4bceb8e512ae75dac65417a2ad9b022d9b5411e863c4c198b6ba9ef659e14b9fb609bbec680841a2e84c1172df7a5ffcf076539df +"@rollup/rollup-linux-arm64-gnu@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.9.3" + conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@tsconfig/node12@npm:^1.0.7": - version: 1.0.11 - resolution: "@tsconfig/node12@npm:1.0.11" - checksum: 5ce29a41b13e7897a58b8e2df11269c5395999e588b9a467386f99d1d26f6c77d1af2719e407621412520ea30517d718d5192a32403b8dfcc163bf33e40a338a +"@rollup/rollup-linux-arm64-musl@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.9.3" + conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@tsconfig/node14@npm:^1.0.0": - version: 1.0.3 - resolution: "@tsconfig/node14@npm:1.0.3" - checksum: 19275fe80c4c8d0ad0abed6a96dbf00642e88b220b090418609c4376e1cef81bf16237bf170ad1b341452feddb8115d8dd2e5acdfdea1b27422071163dc9ba9d +"@rollup/rollup-linux-riscv64-gnu@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.9.3" + conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@tsconfig/node16@npm:^1.0.2": - version: 1.0.3 - resolution: "@tsconfig/node16@npm:1.0.3" - checksum: 3a8b657dd047495b7ad23437d6afd20297ce90380ff0bdee93fc7d39a900dbd8d9e26e53ff6b465e7967ce2adf0b218782590ce9013285121e6a5928fbd6819f +"@rollup/rollup-linux-x64-gnu@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.9.3" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.9.3" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.9.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.9.3" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.9.3": + version: 4.9.3 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.9.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rushstack/node-core-library@npm:3.63.0": + version: 3.63.0 + resolution: "@rushstack/node-core-library@npm:3.63.0" + dependencies: + colors: "npm:~1.2.1" + fs-extra: "npm:~7.0.1" + import-lazy: "npm:~4.0.0" + jju: "npm:~1.4.0" + resolve: "npm:~1.22.1" + semver: "npm:~7.5.4" + z-schema: "npm:~5.0.2" + peerDependencies: + "@types/node": "*" + peerDependenciesMeta: + "@types/node": + optional: true + checksum: a6ecfeeeeb3f5b55f3f10428efaa0efd4239da9b622831c413c6d36397284863773ff8d79e8da9e479c8b2bd87b609c8414a6556363ef797cc6dba794d522514 + languageName: node + linkType: hard + +"@rushstack/rig-package@npm:0.5.1": + version: 0.5.1 + resolution: "@rushstack/rig-package@npm:0.5.1" + dependencies: + resolve: "npm:~1.22.1" + strip-json-comments: "npm:~3.1.1" + checksum: a296125a5170dd11c37c3d679eb6e61db4d0c0741b3947902d9eab34e9ff34d5d8e94fbf6b45757141ea077029490198b7eb35d311ba46eaac5e1d4145e9780c + languageName: node + linkType: hard + +"@rushstack/ts-command-line@npm:4.17.1": + version: 4.17.1 + resolution: "@rushstack/ts-command-line@npm:4.17.1" + dependencies: + "@types/argparse": "npm:1.0.38" + argparse: "npm:~1.0.9" + colors: "npm:~1.2.1" + string-argv: "npm:~0.3.1" + checksum: 4fd27d2450a6e71139e67b33d5ecba7abbf3497e7479ab3a96666cf79f207c5a7d4ad4f8de17f43e09bed65a0f28115160a4c5486c8e64f8b472c7145a31c2d2 + languageName: node + linkType: hard + +"@sindresorhus/merge-streams@npm:^1.0.0": + version: 1.0.0 + resolution: "@sindresorhus/merge-streams@npm:1.0.0" + checksum: 43d077170845dc621002e9730aea567e6e126e84b3bbff01b8575266efdb2c81d223939d3bec24020e53960c154b4640bef7746aeb245abd94c5d32972dd6854 + languageName: node + linkType: hard + +"@tokenizer/token@npm:^0.3.0": + version: 0.3.0 + resolution: "@tokenizer/token@npm:0.3.0" + checksum: 7ab9a822d4b5ff3f5bca7f7d14d46bdd8432528e028db4a52be7fbf90c7f495cc1af1324691dda2813c6af8dc4b8eb29de3107d4508165f9aa5b53e7d501f155 languageName: node linkType: hard "@types/argparse@npm:1.0.38": version: 1.0.38 resolution: "@types/argparse@npm:1.0.38" - checksum: 26ed7e3f1e3595efdb883a852f5205f971b798e4c28b7e30a32c5298eee596e8b45834ce831f014d250b9730819ab05acff5b31229666d3af4ba465b4697d0eb + checksum: 4fc892da5df16923f48180da2d1f4562fa8b0507cf636b24780444fa0a1d7321d4dc0c0ecbee6152968823f5a2ae0d321b4f8c705a489bf1ae1245bdeb0868fd languageName: node linkType: hard "@types/bn.js@npm:*": - version: 5.1.1 - resolution: "@types/bn.js@npm:5.1.1" + version: 5.1.5 + resolution: "@types/bn.js@npm:5.1.5" dependencies: - "@types/node": "*" - checksum: e50ed2dd3abe997e047caf90e0352c71e54fc388679735217978b4ceb7e336e51477791b715f49fd77195ac26dd296c7bad08a3be9750e235f9b2e1edb1b51c2 + "@types/node": "npm:*" + checksum: e9f375b43d8119ed82aed2090f83d4cda8afbb63ba13223afb02fa7550258ff90acd76d65cd7186838644048f085241cd98a3a512d8d187aa497c6039c746ac8 languageName: node linkType: hard "@types/body-parser@npm:*": - version: 1.19.2 - resolution: "@types/body-parser@npm:1.19.2" + version: 1.19.5 + resolution: "@types/body-parser@npm:1.19.5" dependencies: - "@types/connect": "*" - "@types/node": "*" - checksum: e17840c7d747a549f00aebe72c89313d09fbc4b632b949b2470c5cb3b1cb73863901ae84d9335b567a79ec5efcfb8a28ff8e3f36bc8748a9686756b6d5681f40 + "@types/connect": "npm:*" + "@types/node": "npm:*" + checksum: aebeb200f25e8818d8cf39cd0209026750d77c9b85381cdd8deeb50913e4d18a1ebe4b74ca9b0b4d21952511eeaba5e9fbbf739b52731a2061e206ec60d568df languageName: node linkType: hard "@types/connect@npm:*": - version: 3.4.35 - resolution: "@types/connect@npm:3.4.35" + version: 3.4.38 + resolution: "@types/connect@npm:3.4.38" dependencies: - "@types/node": "*" - checksum: fe81351470f2d3165e8b12ce33542eef89ea893e36dd62e8f7d72566dfb7e448376ae962f9f3ea888547ce8b55a40020ca0e01d637fab5d99567673084542641 + "@types/node": "npm:*" + checksum: 2e1cdba2c410f25649e77856505cd60223250fa12dff7a503e492208dbfdd25f62859918f28aba95315251fd1f5e1ffbfca1e25e73037189ab85dd3f8d0a148c languageName: node linkType: hard -"@types/elliptic@npm:^6.4.14": - version: 6.4.14 - resolution: "@types/elliptic@npm:6.4.14" +"@types/elliptic@npm:^6.4.18": + version: 6.4.18 + resolution: "@types/elliptic@npm:6.4.18" dependencies: - "@types/bn.js": "*" - checksum: d5a64f540e0ed4b74a12dfa5cc88c0aa7b531eab3b7a9fab17948ffbfc6e01814230e63d7417ce1b607dbd8b5d70e1b64f5afac632deabf96e44875aaac0ae1b + "@types/bn.js": "npm:*" + checksum: 0c438130b9a16b6ff566f47319dbac39979172ead7748cfbe8a782232506c2e64b03c8c3cfcc221f727ecc7036f5749623567cf66946b0478f217d5b5930c22b languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.0": - version: 1.0.0 - resolution: "@types/estree@npm:1.0.0" - checksum: 910d97fb7092c6738d30a7430ae4786a38542023c6302b95d46f49420b797f21619cdde11fa92b338366268795884111c2eb10356e4bd2c8ad5b92941e9e6443 +"@types/estree@npm:*, @types/estree@npm:1.0.5, @types/estree@npm:^1.0.0": + version: 1.0.5 + resolution: "@types/estree@npm:1.0.5" + checksum: b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d languageName: node linkType: hard -"@types/estree@npm:0.0.39": - version: 0.0.39 - resolution: "@types/estree@npm:0.0.39" - checksum: 412fb5b9868f2c418126451821833414189b75cc6bf84361156feed733e3d92ec220b9d74a89e52722e03d5e241b2932732711b7497374a404fad49087adc248 +"@types/express-serve-static-core@npm:^4.17.33": + version: 4.17.41 + resolution: "@types/express-serve-static-core@npm:4.17.41" + dependencies: + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + "@types/send": "npm:*" + checksum: dc166cbf4475c00a81fbcab120bf7477c527184be11ae149df7f26d9c1082114c68f8d387a2926fe80291b06477c8bbd9231ff4f5775de328e887695aefce269 languageName: node linkType: hard -"@types/express-serve-static-core@npm:^4.17.31": - version: 4.17.32 - resolution: "@types/express-serve-static-core@npm:4.17.32" +"@types/express@npm:^4.17.21": + version: 4.17.21 + resolution: "@types/express@npm:4.17.21" dependencies: - "@types/node": "*" - "@types/qs": "*" - "@types/range-parser": "*" - checksum: 70ec1b8f386628850b315a7b9fd4240a5a70297b41ef1c39af65c8b9661d2c775cfff4686b491fd90e5b6eef43088af203700c5541aec0d063db0c6cbeff254c + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^4.17.33" + "@types/qs": "npm:*" + "@types/serve-static": "npm:*" + checksum: 12e562c4571da50c7d239e117e688dc434db1bac8be55613294762f84fd77fbd0658ccd553c7d3ab02408f385bc93980992369dd30e2ecd2c68c358e6af8fabf languageName: node linkType: hard -"@types/express@npm:^4.17.15": - version: 4.17.15 - resolution: "@types/express@npm:4.17.15" - dependencies: - "@types/body-parser": "*" - "@types/express-serve-static-core": ^4.17.31 - "@types/qs": "*" - "@types/serve-static": "*" - checksum: b4acd8a836d4f6409cdf79b12d6e660485249b62500cccd61e7997d2f520093edf77d7f8498ca79d64a112c6434b6de5ca48039b8fde2c881679eced7e96979b +"@types/http-errors@npm:*": + version: 2.0.4 + resolution: "@types/http-errors@npm:2.0.4" + checksum: 494670a57ad4062fee6c575047ad5782506dd35a6b9ed3894cea65830a94367bd84ba302eb3dde331871f6d70ca287bfedb1b2cf658e6132cd2cbd427ab56836 languageName: node linkType: hard "@types/istanbul-lib-coverage@npm:^2.0.1": - version: 2.0.4 - resolution: "@types/istanbul-lib-coverage@npm:2.0.4" - checksum: a25d7589ee65c94d31464c16b72a9dc81dfa0bea9d3e105ae03882d616e2a0712a9c101a599ec482d297c3591e16336962878cb3eb1a0a62d5b76d277a890ce7 + version: 2.0.6 + resolution: "@types/istanbul-lib-coverage@npm:2.0.6" + checksum: 3948088654f3eeb45363f1db158354fb013b362dba2a5c2c18c559484d5eb9f6fd85b23d66c0a7c2fcfab7308d0a585b14dadaca6cc8bf89ebfdc7f8f5102fb7 languageName: node linkType: hard -"@types/json-schema@npm:^7.0.11, @types/json-schema@npm:^7.0.9": - version: 7.0.11 - resolution: "@types/json-schema@npm:7.0.11" - checksum: 527bddfe62db9012fccd7627794bd4c71beb77601861055d87e3ee464f2217c85fca7a4b56ae677478367bbd248dbde13553312b7d4dbc702a2f2bbf60c4018d +"@types/json-schema@npm:^7.0.12": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db languageName: node linkType: hard "@types/json5@npm:^0.0.29": version: 0.0.29 resolution: "@types/json5@npm:0.0.29" - checksum: e60b153664572116dfea673c5bda7778dbff150498f44f998e34b5886d8afc47f16799280e4b6e241c0472aef1bc36add771c569c68fc5125fc2ae519a3eb9ac + checksum: 6bf5337bc447b706bb5b4431d37686aa2ea6d07cfd6f79cc31de80170d6ff9b1c7384a9c0ccbc45b3f512bae9e9f75c2e12109806a15331dc94e8a8db6dbb4ac languageName: node linkType: hard "@types/mime@npm:*": - version: 3.0.1 - resolution: "@types/mime@npm:3.0.1" - checksum: 4040fac73fd0cea2460e29b348c1a6173da747f3a87da0dbce80dd7a9355a3d0e51d6d9a401654f3e5550620e3718b5a899b2ec1debf18424e298a2c605346e7 + version: 3.0.4 + resolution: "@types/mime@npm:3.0.4" + checksum: db478bc0f99e40f7b3e01d356a9bdf7817060808a294978111340317bcd80ca35382855578c5b60fbc84ae449674bd9bb38427b18417e1f8f19e4f72f8b242cd languageName: node linkType: hard -"@types/minimist@npm:^1.2.0, @types/minimist@npm:^1.2.2": - version: 1.2.2 - resolution: "@types/minimist@npm:1.2.2" - checksum: b8da83c66eb4aac0440e64674b19564d9d86c80ae273144db9681e5eeff66f238ade9515f5006ffbfa955ceff8b89ad2bd8ec577d7caee74ba101431fb07045d +"@types/mime@npm:^1": + version: 1.3.5 + resolution: "@types/mime@npm:1.3.5" + checksum: c2ee31cd9b993804df33a694d5aa3fa536511a49f2e06eeab0b484fef59b4483777dbb9e42a4198a0809ffbf698081fdbca1e5c2218b82b91603dfab10a10fbc languageName: node linkType: hard -"@types/node@npm:*": - version: 18.11.18 - resolution: "@types/node@npm:18.11.18" - checksum: 03f17f9480f8d775c8a72da5ea7e9383db5f6d85aa5fefde90dd953a1449bd5e4ffde376f139da4f3744b4c83942166d2a7603969a6f8ea826edfb16e6e3b49d +"@types/minimist@npm:^1.2.0": + version: 1.2.5 + resolution: "@types/minimist@npm:1.2.5" + checksum: 3f791258d8e99a1d7d0ca2bda1ca6ea5a94e5e7b8fc6cde84dd79b0552da6fb68ade750f0e17718f6587783c24254bbca0357648dd59dc3812c150305cabdc46 languageName: node linkType: hard -"@types/node@npm:12.20.24": - version: 12.20.24 - resolution: "@types/node@npm:12.20.24" - checksum: e7a13460e2f5b0b5a32c0f3af7daf1a05201552a66d542d3cc3b1ea8b52d4730250f9eb1961d755e31cfe5d03c78340911a6242657a0a9a17d6f7e341fc9f366 +"@types/node@npm:*, @types/node@npm:^20.10.6": + version: 20.10.6 + resolution: "@types/node@npm:20.10.6" + dependencies: + undici-types: "npm:~5.26.4" + checksum: 6692ccfa8552ef60c4069fda3c8de726c23e8d403cdf788e3c7efa769987e80fbda5f02723dd857f9de7df24a5fa40b3ed4580ec3c5cbac04eba44cf7b2ab1dc languageName: node linkType: hard "@types/normalize-package-data@npm:^2.4.0": - version: 2.4.1 - resolution: "@types/normalize-package-data@npm:2.4.1" - checksum: e87bccbf11f95035c89a132b52b79ce69a1e3652fe55962363063c9c0dae0fe2477ebc585e03a9652adc6f381d24ba5589cc5e51849df4ced3d3e004a7d40ed5 + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: aef7bb9b015883d6f4119c423dd28c4bdc17b0e8a0ccf112c78b4fe0e91fbc4af7c6204b04bba0e199a57d2f3fbbd5b4a14bf8739bf9d2a39b2a0aad545e0f86 languageName: node linkType: hard "@types/qs@npm:*": - version: 6.9.7 - resolution: "@types/qs@npm:6.9.7" - checksum: 7fd6f9c25053e9b5bb6bc9f9f76c1d89e6c04f7707a7ba0e44cc01f17ef5284adb82f230f542c2d5557d69407c9a40f0f3515e8319afd14e1e16b5543ac6cdba + version: 6.9.11 + resolution: "@types/qs@npm:6.9.11" + checksum: 657a50f05b694d6fd3916d24177cfa0f3b8b87d9deff4ffa4dddcb0b03583ebf7c47b424b8de400270fb9a5cc1e9cf790dd82c833c6935305851e7da8ede3ff5 languageName: node linkType: hard "@types/range-parser@npm:*": - version: 1.2.4 - resolution: "@types/range-parser@npm:1.2.4" - checksum: b7c0dfd5080a989d6c8bb0b6750fc0933d9acabeb476da6fe71d8bdf1ab65e37c136169d84148034802f48378ab94e3c37bb4ef7656b2bec2cb9c0f8d4146a95 + version: 1.2.7 + resolution: "@types/range-parser@npm:1.2.7" + checksum: 361bb3e964ec5133fa40644a0b942279ed5df1949f21321d77de79f48b728d39253e5ce0408c9c17e4e0fd95ca7899da36841686393b9f7a1e209916e9381a3c languageName: node linkType: hard "@types/resolve@npm:1.20.2": version: 1.20.2 resolution: "@types/resolve@npm:1.20.2" - checksum: 61c2cad2499ffc8eab36e3b773945d337d848d3ac6b7b0a87c805ba814bc838ef2f262fc0f109bfd8d2e0898ff8bd80ad1025f9ff64f1f71d3d4294c9f14e5f6 + checksum: c5b7e1770feb5ccfb6802f6ad82a7b0d50874c99331e0c9b259e415e55a38d7a86ad0901c57665d93f75938be2a6a0bc9aa06c9749192cadb2e4512800bbc6e6 languageName: node linkType: hard -"@types/semver@npm:^7.3.12": - version: 7.3.13 - resolution: "@types/semver@npm:7.3.13" - checksum: 00c0724d54757c2f4bc60b5032fe91cda6410e48689633d5f35ece8a0a66445e3e57fa1d6e07eb780f792e82ac542948ec4d0b76eb3484297b79bd18b8cf1cb0 - languageName: node - linkType: hard - -"@types/serve-static@npm:*": - version: 1.15.0 - resolution: "@types/serve-static@npm:1.15.0" - dependencies: - "@types/mime": "*" - "@types/node": "*" - checksum: b6ac93d471fb0f53ddcac1f9b67572a09cd62806f7db5855244b28f6f421139626f24799392566e97d1ffc61b12f9de7f30380c39fcae3c8a161fe161d44edf2 +"@types/semver@npm:^7.5.0": + version: 7.5.6 + resolution: "@types/semver@npm:7.5.6" + checksum: 196dc32db5f68cbcde2e6a42bb4aa5cbb100fa2b7bd9c8c82faaaf3e03fbe063e205dbb4f03c7cdf53da2edb70a0d34c9f2e601b54281b377eb8dc1743226acd languageName: node linkType: hard -"@types/yauzl@npm:^2.9.1": - version: 2.10.0 - resolution: "@types/yauzl@npm:2.10.0" +"@types/send@npm:*": + version: 0.17.4 + resolution: "@types/send@npm:0.17.4" dependencies: - "@types/node": "*" - checksum: 55d27ae5d346ea260e40121675c24e112ef0247649073848e5d4e03182713ae4ec8142b98f61a1c6cbe7d3b72fa99bbadb65d8b01873e5e605cdc30f1ff70ef2 + "@types/mime": "npm:^1" + "@types/node": "npm:*" + checksum: 7f17fa696cb83be0a104b04b424fdedc7eaba1c9a34b06027239aba513b398a0e2b7279778af521f516a397ced417c96960e5f50fcfce40c4bc4509fb1a5883c languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:5.28.0": - version: 5.28.0 - resolution: "@typescript-eslint/eslint-plugin@npm:5.28.0" +"@types/serve-static@npm:*": + version: 1.15.5 + resolution: "@types/serve-static@npm:1.15.5" dependencies: - "@typescript-eslint/scope-manager": 5.28.0 - "@typescript-eslint/type-utils": 5.28.0 - "@typescript-eslint/utils": 5.28.0 - debug: ^4.3.4 - functional-red-black-tree: ^1.0.1 - ignore: ^5.2.0 - regexpp: ^3.2.0 - semver: ^7.3.7 - tsutils: ^3.21.0 - peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 49e08865abd35acdc44829b929f2cd01d01a1f91d3c3c357963b6980e938de365f178efcec21e0ed6ec13a2ad9373f52b73001ddd5cdc7b0245fcf02b9564dd3 + "@types/http-errors": "npm:*" + "@types/mime": "npm:*" + "@types/node": "npm:*" + checksum: 811d1a2f7e74a872195e7a013bcd87a2fb1edf07eaedcb9dcfd20c1eb4bc56ad4ea0d52141c13192c91ccda7c8aeb8a530d8a7e60b9c27f5990d7e62e0fecb03 languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^5.48.1": - version: 5.48.1 - resolution: "@typescript-eslint/eslint-plugin@npm:5.48.1" - dependencies: - "@typescript-eslint/scope-manager": 5.48.1 - "@typescript-eslint/type-utils": 5.48.1 - "@typescript-eslint/utils": 5.48.1 - debug: ^4.3.4 - ignore: ^5.2.0 - natural-compare-lite: ^1.4.0 - regexpp: ^3.2.0 - semver: ^7.3.7 - tsutils: ^3.21.0 +"@typescript-eslint/eslint-plugin@npm:^6.18.1": + version: 6.18.1 + resolution: "@typescript-eslint/eslint-plugin@npm:6.18.1" + dependencies: + "@eslint-community/regexpp": "npm:^4.5.1" + "@typescript-eslint/scope-manager": "npm:6.18.1" + "@typescript-eslint/type-utils": "npm:6.18.1" + "@typescript-eslint/utils": "npm:6.18.1" + "@typescript-eslint/visitor-keys": "npm:6.18.1" + debug: "npm:^4.3.4" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.4" + natural-compare: "npm:^1.4.0" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" peerDependencies: - "@typescript-eslint/parser": ^5.0.0 - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + "@typescript-eslint/parser": ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: d8d73d123d16fc9b50b500ef21816dcabdffe0d2dcfdb15089dc5a1015d57cbad709de565d1c830f5058c0d7b410069e2554c0b53d1485fe7b237ea8089e58be + checksum: fbcfae9b92f35ce10212f44f43f93c43f6eb3e28a571da7ed0d424396916aaf080f16ce91a5bffb9e1b42ca2d6003a3e2ad65131b4ef72ed2f94a4bedb35a735 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^5.48.1": - version: 5.48.1 - resolution: "@typescript-eslint/parser@npm:5.48.1" +"@typescript-eslint/parser@npm:^6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/parser@npm:6.17.0" dependencies: - "@typescript-eslint/scope-manager": 5.48.1 - "@typescript-eslint/types": 5.48.1 - "@typescript-eslint/typescript-estree": 5.48.1 - debug: ^4.3.4 + "@typescript-eslint/scope-manager": "npm:6.17.0" + "@typescript-eslint/types": "npm:6.17.0" + "@typescript-eslint/typescript-estree": "npm:6.17.0" + "@typescript-eslint/visitor-keys": "npm:6.17.0" + debug: "npm:^4.3.4" peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: c624d24eb209b4ce7f0a6c8116712363f10a9c9a5138f240e254ff265526ee4b0fd73b7b6b4b6a0e7611bd9934c42036350dd27f96ae2fa4efdade1a7ebd0e9e + checksum: 66b53159688083eb48259de5b4daf076f3de284ac3b4d2618bda3f7ab2d8ee27b01ae851b08e8487047e33ff3668424f17d677d66413164cb231f1519dcff82f languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.28.0": - version: 5.28.0 - resolution: "@typescript-eslint/scope-manager@npm:5.28.0" +"@typescript-eslint/scope-manager@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/scope-manager@npm:6.17.0" dependencies: - "@typescript-eslint/types": 5.28.0 - "@typescript-eslint/visitor-keys": 5.28.0 - checksum: f187fd295d152508aa85233ef3ac89031952300fbbe277e188dfba3fbfd82656b15d3d8daa6d85984970ce00a30fdf75da912c4024df982004b24f3a95420b8f + "@typescript-eslint/types": "npm:6.17.0" + "@typescript-eslint/visitor-keys": "npm:6.17.0" + checksum: b7ac7d9c39515c2a1b3844577fab967bf126ec25ccf28076240748b3f42d60ab3e64131bfffee61f66251bdf2d59e50e39f5cb0bee7987c85c49140c75d26b5f languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:5.48.1": - version: 5.48.1 - resolution: "@typescript-eslint/scope-manager@npm:5.48.1" - dependencies: - "@typescript-eslint/types": 5.48.1 - "@typescript-eslint/visitor-keys": 5.48.1 - checksum: f60a7efe917798cccf8652925de6be58b023ded6c6ee44ce74d074f0c2a1927680398a6d73bab33d500c69474ad8c54d63b90fcc6e13256712707d12a60e0a64 - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:5.28.0": - version: 5.28.0 - resolution: "@typescript-eslint/type-utils@npm:5.28.0" +"@typescript-eslint/scope-manager@npm:6.18.1": + version: 6.18.1 + resolution: "@typescript-eslint/scope-manager@npm:6.18.1" dependencies: - "@typescript-eslint/utils": 5.28.0 - debug: ^4.3.4 - tsutils: ^3.21.0 - peerDependencies: - eslint: "*" - peerDependenciesMeta: - typescript: - optional: true - checksum: 05563dab5414a42b7781f5ce65ee540b10a946c419bde3fbc45593aa3b1225b2a70558581f311720d670dc82ab699a3f9ecb4b1447d6fd557bd330cf8890d8ca + "@typescript-eslint/types": "npm:6.18.1" + "@typescript-eslint/visitor-keys": "npm:6.18.1" + checksum: 66ef86688a2eb69988a15d6c0176e5e1ec3994ab96526ca525226a1815eef63366e10e3e6a041ceb2cd63d1cced27874d2313045b785418330af68a288e50771 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:5.48.1": - version: 5.48.1 - resolution: "@typescript-eslint/type-utils@npm:5.48.1" +"@typescript-eslint/type-utils@npm:6.18.1, @typescript-eslint/type-utils@npm:^6.0.0": + version: 6.18.1 + resolution: "@typescript-eslint/type-utils@npm:6.18.1" dependencies: - "@typescript-eslint/typescript-estree": 5.48.1 - "@typescript-eslint/utils": 5.48.1 - debug: ^4.3.4 - tsutils: ^3.21.0 + "@typescript-eslint/typescript-estree": "npm:6.18.1" + "@typescript-eslint/utils": "npm:6.18.1" + debug: "npm:^4.3.4" + ts-api-utils: "npm:^1.0.1" peerDependencies: - eslint: "*" + eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: 2739b35caf48c9edbeab82936de58ce0759ab34955ce7eec1786690d6a63146ae0a6c5d9c76034605d9fe200c87a73ede0772c6244c5df6e66df992d9ebbab72 + checksum: 5198752a51649afd960205708c4d765e0170a46a1eb96c97e706890fecb2642933a6377337cf3632f9737915da0201607872a46c9c551d1accf9176b0e025023 languageName: node linkType: hard "@typescript-eslint/types@npm:4.33.0": version: 4.33.0 resolution: "@typescript-eslint/types@npm:4.33.0" - checksum: 3baae1ca35872421b4eb60f5d3f3f32dc1d513f2ae0a67dee28c7d159fd7a43ed0d11a8a5a0f0c2d38507ffa036fc7c511cb0f18a5e8ac524b3ebde77390ec53 + checksum: 6c94780a589eca7a75ae2b014f320bc412b50794c39ab04889918bb39a40e72584b65c8c0b035330cb0599579afaa3adccee40701f63cf39c0e89299de199d4b languageName: node linkType: hard -"@typescript-eslint/types@npm:5.28.0": - version: 5.28.0 - resolution: "@typescript-eslint/types@npm:5.28.0" - checksum: e948915d6f24ece98043763a48e34ced5e16a1aa88cc86ea7d9057010ed92ce39457a753dd7a140be52f9b546b27f8a3b33bdc7d671427a386aa1aa381d908ef +"@typescript-eslint/types@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/types@npm:5.62.0" + checksum: 7febd3a7f0701c0b927e094f02e82d8ee2cada2b186fcb938bc2b94ff6fbad88237afc304cbaf33e82797078bbbb1baf91475f6400912f8b64c89be79bfa4ddf languageName: node linkType: hard -"@typescript-eslint/types@npm:5.48.1": - version: 5.48.1 - resolution: "@typescript-eslint/types@npm:5.48.1" - checksum: 8437986e9d86d792b23327517ae2f9861ec55992d5a9cd55991e525409b6244169436cd708f3987ab7c579e45e59b6eab5a9d3583f7729219e25691164293094 +"@typescript-eslint/types@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/types@npm:6.17.0" + checksum: c458d985b9ab4f369018536bcb88f0aedafb0c8c4b22ffd376e0c0c768a44e3956475c85ebeef40ae44238841c8df268893477b85873aa2621995c37e738e37e languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.28.0": - version: 5.28.0 - resolution: "@typescript-eslint/typescript-estree@npm:5.28.0" +"@typescript-eslint/types@npm:6.18.1": + version: 6.18.1 + resolution: "@typescript-eslint/types@npm:6.18.1" + checksum: 58c1a1bcf2403891a4fcb0d21aac643a6f9d06119423230dad74ef2b95adf94201da7cf48617b0c27b51695225b622e48c739cf4186ef5f99294887d2d536557 + languageName: node + linkType: hard + +"@typescript-eslint/typescript-estree@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.17.0" dependencies: - "@typescript-eslint/types": 5.28.0 - "@typescript-eslint/visitor-keys": 5.28.0 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 + "@typescript-eslint/types": "npm:6.17.0" + "@typescript-eslint/visitor-keys": "npm:6.17.0" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + minimatch: "npm:9.0.3" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" peerDependenciesMeta: typescript: optional: true - checksum: e7be6e9ff778ab2728bdc545713f29cd40bbe1282662461453fe46bc18f676f9b33c60e3514347fbc4e5e94d764525c20b8ef3d47baa62fec6bd3ce05fdde6eb + checksum: 5a858288bb05f45a2a45b04394115826ff19f85555144bfb67dc281d4e75fc3a1e1aceb3dee68022e86b91f199d1310c15bda3100a4890004b8e474d86afad51 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:5.48.1": - version: 5.48.1 - resolution: "@typescript-eslint/typescript-estree@npm:5.48.1" - dependencies: - "@typescript-eslint/types": 5.48.1 - "@typescript-eslint/visitor-keys": 5.48.1 - debug: ^4.3.4 - globby: ^11.1.0 - is-glob: ^4.0.3 - semver: ^7.3.7 - tsutils: ^3.21.0 +"@typescript-eslint/typescript-estree@npm:6.18.1": + version: 6.18.1 + resolution: "@typescript-eslint/typescript-estree@npm:6.18.1" + dependencies: + "@typescript-eslint/types": "npm:6.18.1" + "@typescript-eslint/visitor-keys": "npm:6.18.1" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + minimatch: "npm:9.0.3" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" peerDependenciesMeta: typescript: optional: true - checksum: 2b26e5848ef131e1bb99ed54d8c0efa8279cf8e8f7d8b72de00c2ca6cf2799d96c20f5bbbcf26e14e81b7b9d1035ba509bff30f2d852c174815879e8f14c27ed + checksum: 5bca8f58d3134c5296c7e6cbeef512feb3918cdc88b5b22e656a7978277278e7a86187690e7e3be3f3708feb98c952a6ab4d8bbc197fff3826e3afa8bc1e287e languageName: node linkType: hard @@ -1338,51 +1508,52 @@ __metadata: version: 4.33.0 resolution: "@typescript-eslint/typescript-estree@npm:4.33.0" dependencies: - "@typescript-eslint/types": 4.33.0 - "@typescript-eslint/visitor-keys": 4.33.0 - debug: ^4.3.1 - globby: ^11.0.3 - is-glob: ^4.0.1 - semver: ^7.3.5 - tsutils: ^3.21.0 + "@typescript-eslint/types": "npm:4.33.0" + "@typescript-eslint/visitor-keys": "npm:4.33.0" + debug: "npm:^4.3.1" + globby: "npm:^11.0.3" + is-glob: "npm:^4.0.1" + semver: "npm:^7.3.5" + tsutils: "npm:^3.21.0" peerDependenciesMeta: typescript: optional: true - checksum: 2566984390c76bd95f43240057215c068c69769e406e27aba41e9f21fd300074d6772e4983fa58fe61e80eb5550af1548d2e31e80550d92ba1d051bb00fe6f5c + checksum: 67609a7bdd680136765d103dec4b8afb38a17436e8a5cd830da84f62c6153c3acba561da3b9e2140137b1a0bcbbfc19d4256c692f7072acfebcff88db079e22b languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.28.0": - version: 5.28.0 - resolution: "@typescript-eslint/utils@npm:5.28.0" +"@typescript-eslint/typescript-estree@npm:^5.55.0": + version: 5.62.0 + resolution: "@typescript-eslint/typescript-estree@npm:5.62.0" dependencies: - "@types/json-schema": ^7.0.9 - "@typescript-eslint/scope-manager": 5.28.0 - "@typescript-eslint/types": 5.28.0 - "@typescript-eslint/typescript-estree": 5.28.0 - eslint-scope: ^5.1.1 - eslint-utils: ^3.0.0 - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: d30958552470c3f46b2183b690fa8c922a375a84ef83ccfda4785148b8dafb7bf428ab01de6608f67cefbcae35c6a2b0c54b5a6a89bba31566ec3b41f098c02e + "@typescript-eslint/types": "npm:5.62.0" + "@typescript-eslint/visitor-keys": "npm:5.62.0" + debug: "npm:^4.3.4" + globby: "npm:^11.1.0" + is-glob: "npm:^4.0.3" + semver: "npm:^7.3.7" + tsutils: "npm:^3.21.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: d7984a3e9d56897b2481940ec803cb8e7ead03df8d9cfd9797350be82ff765dfcf3cfec04e7355e1779e948da8f02bc5e11719d07a596eb1cb995c48a95e38cf languageName: node linkType: hard -"@typescript-eslint/utils@npm:5.48.1, @typescript-eslint/utils@npm:^5.10.2": - version: 5.48.1 - resolution: "@typescript-eslint/utils@npm:5.48.1" - dependencies: - "@types/json-schema": ^7.0.9 - "@types/semver": ^7.3.12 - "@typescript-eslint/scope-manager": 5.48.1 - "@typescript-eslint/types": 5.48.1 - "@typescript-eslint/typescript-estree": 5.48.1 - eslint-scope: ^5.1.1 - eslint-utils: ^3.0.0 - semver: ^7.3.7 +"@typescript-eslint/utils@npm:6.18.1, @typescript-eslint/utils@npm:^6.2.0": + version: 6.18.1 + resolution: "@typescript-eslint/utils@npm:6.18.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@types/json-schema": "npm:^7.0.12" + "@types/semver": "npm:^7.5.0" + "@typescript-eslint/scope-manager": "npm:6.18.1" + "@typescript-eslint/types": "npm:6.18.1" + "@typescript-eslint/typescript-estree": "npm:6.18.1" + semver: "npm:^7.5.4" peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: 2d112cbb6a920f147c6c3322e404ca3c56c1170e1ede3bcbf16fb779960dc24cdba688b1f2d06acd242859fc1dbc8702da5f8fa8bbf53e7081e41d80bec4c236 + eslint: ^7.0.0 || ^8.0.0 + checksum: b9dcb2fa7cc8c46254c22fee190032320a5dd8ce282fb01e99cb35da6c00e33b157f4285b062d841942e9aad1d7ce1a16aaa46dd05ca7d81de706aedbbfff396 languageName: node linkType: hard @@ -1390,29 +1561,67 @@ __metadata: version: 4.33.0 resolution: "@typescript-eslint/visitor-keys@npm:4.33.0" dependencies: - "@typescript-eslint/types": 4.33.0 - eslint-visitor-keys: ^2.0.0 - checksum: 59953e474ad4610c1aa23b2b1a964445e2c6201521da6367752f37939d854352bbfced5c04ea539274065e012b1337ba3ffa49c2647a240a4e87155378ba9873 + "@typescript-eslint/types": "npm:4.33.0" + eslint-visitor-keys: "npm:^2.0.0" + checksum: 95b3904db6113ef365892567d47365e6af3708e6fa905743426036f99e1b7fd4a275facec5d939afecb618369f9d615e379d39f96b8936f469e75507c41c249c + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" + dependencies: + "@typescript-eslint/types": "npm:5.62.0" + eslint-visitor-keys: "npm:^3.3.0" + checksum: 7c3b8e4148e9b94d9b7162a596a1260d7a3efc4e65199693b8025c71c4652b8042501c0bc9f57654c1e2943c26da98c0f77884a746c6ae81389fcb0b513d995d languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.28.0": - version: 5.28.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.28.0" +"@typescript-eslint/visitor-keys@npm:6.17.0": + version: 6.17.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.17.0" dependencies: - "@typescript-eslint/types": 5.28.0 - eslint-visitor-keys: ^3.3.0 - checksum: e97251968ea273ce33fa0de8a9c04426499b797f6f7800379ff880c4be6e6e02fe023038be0092c595be394a8636f73ee8911974214d5232b3d59492a50771bf + "@typescript-eslint/types": "npm:6.17.0" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 75a48f5810c6a69bc1c082b07d2b840c40895807b1b4ecf9d3ab9eb783176eeb3e7b11eb89d652e8331da79d604f82300f315ffc21cd937819197a8601b48d1d languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.48.1": - version: 5.48.1 - resolution: "@typescript-eslint/visitor-keys@npm:5.48.1" +"@typescript-eslint/visitor-keys@npm:6.18.1": + version: 6.18.1 + resolution: "@typescript-eslint/visitor-keys@npm:6.18.1" dependencies: - "@typescript-eslint/types": 5.48.1 - eslint-visitor-keys: ^3.3.0 - checksum: 2bda10cf4e6bc48b0d463767617e48a832d708b9434665dff6ed101f7d33e0d592f02af17a2259bde1bd17e666246448ae78d0fe006148cb93d897fff9b1d134 + "@typescript-eslint/types": "npm:6.18.1" + eslint-visitor-keys: "npm:^3.4.1" + checksum: f3dacdd1db7347908ac207968da4fa72efb31e38a6dde652651633c5283f054832045f2ad00b4ca7478e7f2e09fe4ae6e3a32b76580c036b9e5c7b8dd55af9f3 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d + languageName: node + linkType: hard + +"@vercel/nft@npm:^0.24.4": + version: 0.24.4 + resolution: "@vercel/nft@npm:0.24.4" + dependencies: + "@mapbox/node-pre-gyp": "npm:^1.0.5" + "@rollup/pluginutils": "npm:^4.0.0" + acorn: "npm:^8.6.0" + async-sema: "npm:^3.1.1" + bindings: "npm:^1.4.0" + estree-walker: "npm:2.0.2" + glob: "npm:^7.1.3" + graceful-fs: "npm:^4.2.9" + micromatch: "npm:^4.0.2" + node-gyp-build: "npm:^4.2.2" + resolve-from: "npm:^5.0.0" + bin: + nft: out/cli.js + checksum: 1a845a8c1587d0595d2981a750b1f579ae99c11db821b8530129c7f8b45c5d059993244b697baaf5ccd537641c0038bd1768534f302ef46f97db981833172109 languageName: node linkType: hard @@ -1420,18 +1629,25 @@ __metadata: version: 1.3.5 resolution: "JSONStream@npm:1.3.5" dependencies: - jsonparse: ^1.2.0 - through: ">=2.2.7 <3" + jsonparse: "npm:^1.2.0" + through: "npm:>=2.2.7 <3" bin: JSONStream: ./bin.js - checksum: 2605fa124260c61bad38bb65eba30d2f72216a78e94d0ab19b11b4e0327d572b8d530c0c9cc3b0764f727ad26d39e00bf7ebad57781ca6368394d73169c59e46 + checksum: 0f54694da32224d57b715385d4a6b668d2117379d1f3223dc758459246cca58fdc4c628b83e8a8883334e454a0a30aa198ede77c788b55537c1844f686a751f2 languageName: node linkType: hard -"abbrev@npm:^1.0.0": +"abbrev@npm:1": version: 1.1.1 resolution: "abbrev@npm:1.1.1" - checksum: a4a97ec07d7ea112c517036882b2ac22f3109b7b19077dc656316d07d308438aac28e4d9746dc4d84bf6b1e75b4a7b0a5f3cb30592419f128ca9a8cee3bcfa17 + checksum: 3f762677702acb24f65e813070e306c61fafe25d4b2583f9dfc935131f774863f3addd5741572ed576bd69cabe473c5af18e1e108b829cb7b6b4747884f726e6 + languageName: node + linkType: hard + +"abbrev@npm:^2.0.0": + version: 2.0.0 + resolution: "abbrev@npm:2.0.0" + checksum: f742a5a107473946f426c691c08daba61a1d15942616f300b5d32fd735be88fef5cba24201757b6c407fd564555fb48c751cfa33519b2605c8a7aadd22baf372 languageName: node linkType: hard @@ -1439,9 +1655,9 @@ __metadata: version: 1.3.8 resolution: "accepts@npm:1.3.8" dependencies: - mime-types: ~2.1.34 - negotiator: 0.6.3 - checksum: 50c43d32e7b50285ebe84b613ee4a3aa426715a7d131b65b786e2ead0fd76b6b60091b9916d3478a75f11f162628a2139991b6c03ab3f1d9ab7c86075dc8eab4 + mime-types: "npm:~2.1.34" + negotiator: "npm:0.6.3" + checksum: 3a35c5f5586cfb9a21163ca47a5f77ac34fa8ceb5d17d2fa2c0d81f41cbd7f8c6fa52c77e2c039acc0f4d09e71abdc51144246900f6bef5e3c4b333f77d89362 languageName: node linkType: hard @@ -1450,50 +1666,48 @@ __metadata: resolution: "acorn-jsx@npm:5.3.2" peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - checksum: c3d3b2a89c9a056b205b69530a37b972b404ee46ec8e5b341666f9513d3163e2a4f214a71f4dfc7370f5a9c07472d2fd1c11c91c3f03d093e37637d95da98950 + checksum: 4c54868fbef3b8d58927d5e33f0a4de35f59012fe7b12cf9dfbb345fb8f46607709e1c4431be869a23fb63c151033d84c4198fa9f79385cec34fcb1dd53974c1 languageName: node linkType: hard -"acorn-walk@npm:^8.1.1, acorn-walk@npm:^8.2.0": - version: 8.2.0 - resolution: "acorn-walk@npm:8.2.0" - checksum: 1715e76c01dd7b2d4ca472f9c58968516a4899378a63ad5b6c2d668bba8da21a71976c14ec5f5b75f887b6317c4ae0b897ab141c831d741dc76024d8745f1ad1 +"acorn-walk@npm:^8.3.0": + version: 8.3.1 + resolution: "acorn-walk@npm:8.3.1" + checksum: a23d2f7c6b6cad617f4c77f14dfeb062a239208d61753e9ba808d916c550add92b39535467d2e6028280761ac4f5a904cc9df21530b84d3f834e3edef74ddde5 languageName: node linkType: hard -"acorn@npm:^8.4.1, acorn@npm:^8.8.0, acorn@npm:^8.8.1": - version: 8.8.1 - resolution: "acorn@npm:8.8.1" +"acorn@npm:^8.11.2, acorn@npm:^8.6.0, acorn@npm:^8.9.0": + version: 8.11.3 + resolution: "acorn@npm:8.11.3" bin: acorn: bin/acorn - checksum: 4079b67283b94935157698831967642f24a075c52ce3feaaaafe095776dfbe15d86a1b33b1e53860fc0d062ed6c83f4284a5c87c85b9ad51853a01173da6097f + checksum: 3ff155f8812e4a746fee8ecff1f227d527c4c45655bb1fad6347c3cb58e46190598217551b1500f18542d2bbe5c87120cb6927f5a074a59166fbdd9468f0a299 languageName: node linkType: hard "add-stream@npm:^1.0.0": version: 1.0.0 resolution: "add-stream@npm:1.0.0" - checksum: 3e9e8b0b8f0170406d7c3a9a39bfbdf419ccccb0fd2a396338c0fda0a339af73bf738ad414fc520741de74517acf0dd92b4a36fd3298a47fd5371eee8f2c5a06 + checksum: 985014a14e76ca4cb24e0fc58bb1556794cf38c5c8937de335a10584f50a371dc48e1c34a59391c7eb9c1fc908b4b86764df5d2756f701df6ba95d1ca2f63ddc languageName: node linkType: hard -"agent-base@npm:6, agent-base@npm:^6.0.2": +"agent-base@npm:6": version: 6.0.2 resolution: "agent-base@npm:6.0.2" dependencies: - debug: 4 - checksum: f52b6872cc96fd5f622071b71ef200e01c7c4c454ee68bc9accca90c98cfb39f2810e3e9aa330435835eedc8c23f4f8a15267f67c6e245d2b33757575bdac49d + debug: "npm:4" + checksum: dc4f757e40b5f3e3d674bc9beb4f1048f4ee83af189bae39be99f57bf1f48dde166a8b0a5342a84b5944ee8e6ed1e5a9d801858f4ad44764e84957122fe46261 languageName: node linkType: hard -"agentkeepalive@npm:^4.2.1": - version: 4.2.1 - resolution: "agentkeepalive@npm:4.2.1" +"agent-base@npm:^7.0.2, agent-base@npm:^7.1.0": + version: 7.1.0 + resolution: "agent-base@npm:7.1.0" dependencies: - debug: ^4.1.0 - depd: ^1.1.2 - humanize-ms: ^1.2.1 - checksum: 39cb49ed8cf217fd6da058a92828a0a84e0b74c35550f82ee0a10e1ee403c4b78ade7948be2279b188b7a7303f5d396ea2738b134731e464bf28de00a4f72a18 + debug: "npm:^4.3.4" + checksum: fc974ab57ffdd8421a2bc339644d312a9cca320c20c3393c9d8b1fd91731b9bbabdb985df5fc860f5b79d81c3e350daa3fcb31c5c07c0bb385aafc817df004ce languageName: node linkType: hard @@ -1501,9 +1715,9 @@ __metadata: version: 3.1.0 resolution: "aggregate-error@npm:3.1.0" dependencies: - clean-stack: ^2.0.0 - indent-string: ^4.0.0 - checksum: 1101a33f21baa27a2fa8e04b698271e64616b886795fd43c31068c07533c7b3facfcaf4e9e0cab3624bd88f729a592f1c901a1a229c9e490eafce411a8644b79 + clean-stack: "npm:^2.0.0" + indent-string: "npm:^4.0.0" + checksum: a42f67faa79e3e6687a4923050e7c9807db3848a037076f791d10e092677d65c1d2d863b7848560699f40fc0502c19f40963fb1cd1fb3d338a7423df8e45e039 languageName: node linkType: hard @@ -1511,9 +1725,9 @@ __metadata: version: 4.0.1 resolution: "aggregate-error@npm:4.0.1" dependencies: - clean-stack: ^4.0.0 - indent-string: ^5.0.0 - checksum: bb3ffdfd13447800fff237c2cba752c59868ee669104bb995dfbbe0b8320e967d679e683dabb640feb32e4882d60258165cde0baafc4cd467cc7d275a13ad6b5 + clean-stack: "npm:^4.0.0" + indent-string: "npm:^5.0.0" + checksum: 75fd739f5c4c60a667cce35ccaf0edf135e147ef0be9a029cab75de14ac9421779b15339d562e58d25b233ea0ef2bbd4c916f149fdbcb73c2b9a62209e611343 languageName: node linkType: hard @@ -1521,13 +1735,13 @@ __metadata: version: 5.0.0 resolution: "ajv-cli@npm:5.0.0" dependencies: - ajv: ^8.0.0 - fast-json-patch: ^2.0.0 - glob: ^7.1.0 - js-yaml: ^3.14.0 - json-schema-migrate: ^2.0.0 - json5: ^2.1.3 - minimist: ^1.2.0 + ajv: "npm:^8.0.0" + fast-json-patch: "npm:^2.0.0" + glob: "npm:^7.1.0" + js-yaml: "npm:^3.14.0" + json-schema-migrate: "npm:^2.0.0" + json5: "npm:^2.1.3" + minimist: "npm:^1.2.0" peerDependencies: ts-node: ">=9.0.0" peerDependenciesMeta: @@ -1535,19 +1749,19 @@ __metadata: optional: true bin: ajv: dist/index.js - checksum: e8ba29f618c653abba3a08d8784f8c882b5ac560dab587540af4d53d8230acb93af07c37165a0461294adb4015ba8ceb09916017a66754c782f950f9679ae94a + checksum: 91c70cb3997fefdb32157b20278643d9ccf6e4897a6b8babf42d6bdb55cb1b7df31524bd5589bf897be14378893b4cf21c366ba313708c3d618e0e976292d7f1 languageName: node linkType: hard -"ajv@npm:^6.10.0, ajv@npm:^6.12.4, ajv@npm:~6.12.6": +"ajv@npm:^6.12.4, ajv@npm:~6.12.6": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: - fast-deep-equal: ^3.1.1 - fast-json-stable-stringify: ^2.0.0 - json-schema-traverse: ^0.4.1 - uri-js: ^4.2.2 - checksum: 874972efe5c4202ab0a68379481fbd3d1b5d0a7bd6d3cc21d40d3536ebff3352a2a1fabb632d4fd2cc7fe4cbdcd5ed6782084c9bbf7f32a1536d18f9da5007d4 + fast-deep-equal: "npm:^3.1.1" + fast-json-stable-stringify: "npm:^2.0.0" + json-schema-traverse: "npm:^0.4.1" + uri-js: "npm:^4.2.2" + checksum: 41e23642cbe545889245b9d2a45854ebba51cda6c778ebced9649420d9205f2efb39cb43dbc41e358409223b1ea43303ae4839db682c848b891e4811da1a5a71 languageName: node linkType: hard @@ -1555,11 +1769,11 @@ __metadata: version: 8.12.0 resolution: "ajv@npm:8.12.0" dependencies: - fast-deep-equal: ^3.1.1 - json-schema-traverse: ^1.0.0 - require-from-string: ^2.0.2 - uri-js: ^4.2.2 - checksum: 4dc13714e316e67537c8b31bc063f99a1d9d9a497eb4bbd55191ac0dcd5e4985bbb71570352ad6f1e76684fb6d790928f96ba3b2d4fd6e10024be9612fe3f001 + fast-deep-equal: "npm:^3.1.1" + json-schema-traverse: "npm:^1.0.0" + require-from-string: "npm:^2.0.2" + uri-js: "npm:^4.2.2" + checksum: ac4f72adf727ee425e049bc9d8b31d4a57e1c90da8d28bcd23d60781b12fcd6fc3d68db5df16994c57b78b94eed7988f5a6b482fd376dc5b084125e20a0a622e languageName: node linkType: hard @@ -1567,22 +1781,29 @@ __metadata: version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: - type-fest: ^0.21.3 - checksum: 93111c42189c0a6bed9cdb4d7f2829548e943827ee8479c74d6e0b22ee127b2a21d3f8b5ca57723b8ef78ce011fbfc2784350eb2bde3ccfccf2f575fa8489815 + type-fest: "npm:^0.21.3" + checksum: da917be01871525a3dfcf925ae2977bc59e8c513d4423368645634bf5d4ceba5401574eb705c1e92b79f7292af5a656f78c5725a4b0e1cec97c4b413705c1d50 languageName: node linkType: hard "ansi-regex@npm:^5.0.1": version: 5.0.1 resolution: "ansi-regex@npm:5.0.1" - checksum: 2aa4bb54caf2d622f1afdad09441695af2a83aa3fe8b8afa581d205e57ed4261c183c4d3877cee25794443fde5876417d859c108078ab788d6af7e4fe52eb66b + checksum: 9a64bb8627b434ba9327b60c027742e5d17ac69277960d041898596271d992d4d52ba7267a63ca10232e29f6107fc8a835f6ce8d719b88c5f8493f8254813737 languageName: node linkType: hard "ansi-regex@npm:^6.0.1": version: 6.0.1 resolution: "ansi-regex@npm:6.0.1" - checksum: 1ff8b7667cded1de4fa2c9ae283e979fc87036864317da86a2e546725f96406746411d0d85e87a2d12fa5abd715d90006de7fa4fa0477c92321ad3b4c7d4e169 + checksum: cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 + languageName: node + linkType: hard + +"ansi-sequence-parser@npm:^1.1.0": + version: 1.1.1 + resolution: "ansi-sequence-parser@npm:1.1.1" + checksum: ab2259ccf69f145ecf1418d4e71524158828f44afdf37c7536677871f4cebaa8b176fcb95de8f94a68129357dddc59586597da25f9d4ebf9968f6ef022bf0b31 languageName: node linkType: hard @@ -1590,8 +1811,8 @@ __metadata: version: 3.2.1 resolution: "ansi-styles@npm:3.2.1" dependencies: - color-convert: ^1.9.0 - checksum: d85ade01c10e5dd77b6c89f34ed7531da5830d2cb5882c645f330079975b716438cd7ebb81d0d6e6b4f9c577f19ae41ab55f07f19786b02f9dfd9e0377395665 + color-convert: "npm:^1.9.0" + checksum: ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b languageName: node linkType: hard @@ -1599,56 +1820,46 @@ __metadata: version: 4.3.0 resolution: "ansi-styles@npm:4.3.0" dependencies: - color-convert: ^2.0.1 - checksum: 513b44c3b2105dd14cc42a19271e80f386466c4be574bccf60b627432f9198571ebf4ab1e4c3ba17347658f4ee1711c163d574248c0c1cdc2d5917a0ad582ec4 + color-convert: "npm:^2.0.1" + checksum: 895a23929da416f2bd3de7e9cb4eabd340949328ab85ddd6e484a637d8f6820d485f53933446f5291c3b760cbc488beb8e88573dd0f9c7daf83dccc8fe81b041 languageName: node linkType: hard -"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.2.1": +"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": version: 6.2.1 resolution: "ansi-styles@npm:6.2.1" - checksum: ef940f2f0ced1a6347398da88a91da7930c33ecac3c77b72c5905f8b8fe402c52e6fde304ff5347f616e27a742da3f1dc76de98f6866c69251ad0b07a66776d9 + checksum: 5d1ec38c123984bcedd996eac680d548f31828bd679a66db2bdf11844634dde55fec3efa9c6bb1d89056a5e79c1ac540c4c784d592ea1d25028a92227d2f2d5c languageName: node linkType: hard -"anymatch@npm:~3.1.2": - version: 3.1.3 - resolution: "anymatch@npm:3.1.3" - dependencies: - normalize-path: ^3.0.0 - picomatch: ^2.0.4 - checksum: 3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 +"any-promise@npm:^1.1.0": + version: 1.3.0 + resolution: "any-promise@npm:1.3.0" + checksum: 60f0298ed34c74fef50daab88e8dab786036ed5a7fad02e012ab57e376e0a0b4b29e83b95ea9b5e7d89df762f5f25119b83e00706ecaccb22cfbacee98d74889 languageName: node linkType: hard "app-module-path@npm:^2.2.0": version: 2.2.0 resolution: "app-module-path@npm:2.2.0" - checksum: b52aa49cfa809efbad41b514222e8ef3f8ee9e147f5eccf79280b45eddcc61f7aeb302b0049474e3f42072dd53a28348c57dd96f36cd461d2e31cc8ab1ef56b5 + checksum: 0d6d581dcee268271af1e611934b4fed715de55c382b2610de67ba6f87d01503fc0426cff687f06210e54cd57545f7a6172e1dd192914a3709ad89c06a4c3a0b languageName: node linkType: hard "aproba@npm:^1.0.3 || ^2.0.0": version: 2.0.0 resolution: "aproba@npm:2.0.0" - checksum: 5615cadcfb45289eea63f8afd064ab656006361020e1735112e346593856f87435e02d8dcc7ff0d11928bc7d425f27bc7c2a84f6c0b35ab0ff659c814c138a24 + checksum: d06e26384a8f6245d8c8896e138c0388824e259a329e0c9f196b4fa533c82502a6fd449586e3604950a0c42921832a458bb3aa0aa9f0ba449cfd4f50fd0d09b5 languageName: node linkType: hard -"are-we-there-yet@npm:^3.0.0": - version: 3.0.1 - resolution: "are-we-there-yet@npm:3.0.1" +"are-we-there-yet@npm:^2.0.0": + version: 2.0.0 + resolution: "are-we-there-yet@npm:2.0.0" dependencies: - delegates: ^1.0.0 - readable-stream: ^3.6.0 - checksum: 52590c24860fa7173bedeb69a4c05fb573473e860197f618b9a28432ee4379049336727ae3a1f9c4cb083114601c1140cee578376164d0e651217a9843f9fe83 - languageName: node - linkType: hard - -"arg@npm:^4.1.0": - version: 4.1.3 - resolution: "arg@npm:4.1.3" - checksum: 544af8dd3f60546d3e4aff084d451b96961d2267d668670199692f8d054f0415d86fc5497d0e641e91546f0aa920e7c29e5250e99fc89f5552a34b5d93b77f43 + delegates: "npm:^1.0.0" + readable-stream: "npm:^3.6.0" + checksum: 375f753c10329153c8d66dc95e8f8b6c7cc2aa66e05cb0960bd69092b10dae22900cacc7d653ad11d26b3ecbdbfe1e8bfb6ccf0265ba8077a7d979970f16b99c languageName: node linkType: hard @@ -1656,176 +1867,235 @@ __metadata: version: 1.0.10 resolution: "argparse@npm:1.0.10" dependencies: - sprintf-js: ~1.0.2 - checksum: 7ca6e45583a28de7258e39e13d81e925cfa25d7d4aacbf806a382d3c02fcb13403a07fb8aeef949f10a7cfe4a62da0e2e807b348a5980554cc28ee573ef95945 + sprintf-js: "npm:~1.0.2" + checksum: b2972c5c23c63df66bca144dbc65d180efa74f25f8fd9b7d9a0a6c88ae839db32df3d54770dcb6460cf840d232b60695d1a6b1053f599d84e73f7437087712de languageName: node linkType: hard "argparse@npm:^2.0.1": version: 2.0.1 resolution: "argparse@npm:2.0.1" - checksum: 83644b56493e89a254bae05702abf3a1101b4fa4d0ca31df1c9985275a5a5bd47b3c27b7fa0b71098d41114d8ca000e6ed90cad764b306f8a503665e4d517ced + checksum: c5640c2d89045371c7cedd6a70212a04e360fd34d6edeae32f6952c63949e3525ea77dbec0289d8213a99bbaeab5abfa860b5c12cf88a2e6cf8106e90dd27a7e + languageName: node + linkType: hard + +"array-buffer-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "array-buffer-byte-length@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + is-array-buffer: "npm:^3.0.1" + checksum: 12f84f6418b57a954caa41654e5e63e019142a4bbb2c6829ba86d1ba65d31ccfaf1461d1743556fd32b091fac34ff44d9dfbdb001402361c45c373b2c86f5c20 languageName: node linkType: hard "array-find-index@npm:^1.0.1": version: 1.0.2 resolution: "array-find-index@npm:1.0.2" - checksum: aac128bf369e1ac6c06ff0bb330788371c0e256f71279fb92d745e26fb4b9db8920e485b4ec25e841c93146bf71a34dcdbcefa115e7e0f96927a214d237b7081 + checksum: 86b9485c74ddd324feab807e10a6de3f9c1683856267236fac4bb4d4667ada6463e106db3f6c540ae6b720e0442b590ec701d13676df4c6af30ebf4da09b4f57 languageName: node linkType: hard "array-flatten@npm:1.1.1": version: 1.1.1 resolution: "array-flatten@npm:1.1.1" - checksum: a9925bf3512d9dce202112965de90c222cd59a4fbfce68a0951d25d965cf44642931f40aac72309c41f12df19afa010ecadceb07cfff9ccc1621e99d89ab5f3b + checksum: 806966c8abb2f858b08f5324d9d18d7737480610f3bd5d3498aaae6eb5efdc501a884ba019c9b4a8f02ff67002058749d05548fd42fa8643f02c9c7f22198b91 languageName: node linkType: hard "array-ify@npm:^1.0.0": version: 1.0.0 resolution: "array-ify@npm:1.0.0" - checksum: c0502015b319c93dd4484f18036bcc4b654eb76a4aa1f04afbcef11ac918859bb1f5d71ba1f0f1141770db9eef1a4f40f1761753650873068010bbf7bcdae4a4 + checksum: 75c9c072faac47bd61779c0c595e912fe660d338504ac70d10e39e1b8a4a0c9c87658703d619b9d1b70d324177ae29dc8d07dda0d0a15d005597bc4c5a59c70c languageName: node linkType: hard -"array-includes@npm:^3.1.4": - version: 3.1.6 - resolution: "array-includes@npm:3.1.6" +"array-includes@npm:^3.1.7": + version: 3.1.7 + resolution: "array-includes@npm:3.1.7" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - get-intrinsic: ^1.1.3 - is-string: ^1.0.7 - checksum: f22f8cd8ba8a6448d91eebdc69f04e4e55085d09232b5216ee2d476dab3ef59984e8d1889e662c6a0ed939dcb1b57fd05b2c0209c3370942fc41b752c82a2ca5 + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + get-intrinsic: "npm:^1.2.1" + is-string: "npm:^1.0.7" + checksum: 692907bd7f19d06dc58ccb761f34b58f5dc0b437d2b47a8fe42a1501849a5cf5c27aed3d521a9702667827c2c85a7e75df00a402c438094d87fc43f39ebf9b2b languageName: node linkType: hard "array-timsort@npm:^1.0.3": version: 1.0.3 resolution: "array-timsort@npm:1.0.3" - checksum: fd4b5b0911214bdc8b5699ed10d309685551b518b3819c611c967cff59b87aee01cf591a10e36a3f14dbff696984bd6682b845f6fdbf1217195e910f241a4f78 + checksum: bd3a1707b621947265c89867e67c9102b9b9f4c50f5b3974220112290d8b60d26ce60595edec5deed3325207b759d70b758bed3cd310b5ddadb835657ffb6d12 languageName: node linkType: hard "array-union@npm:^2.1.0": version: 2.1.0 resolution: "array-union@npm:2.1.0" - checksum: 5bee12395cba82da674931df6d0fea23c4aa4660cb3b338ced9f828782a65caa232573e6bf3968f23e0c5eb301764a382cef2f128b170a9dc59de0e36c39f98d + checksum: 429897e68110374f39b771ec47a7161fc6a8fc33e196857c0a396dc75df0b5f65e4d046674db764330b6bb66b39ef48dd7c53b6a2ee75cfb0681e0c1a7033962 languageName: node linkType: hard -"array.prototype.flat@npm:^1.2.5": - version: 1.3.1 - resolution: "array.prototype.flat@npm:1.3.1" +"array.prototype.findlastindex@npm:^1.2.3": + version: 1.2.3 + resolution: "array.prototype.findlastindex@npm:1.2.3" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + es-shim-unscopables: "npm:^1.0.0" + get-intrinsic: "npm:^1.2.1" + checksum: 2c5c4d3f07512d6729f728f6260a314c00f2eb0a243123092661fa1bc65dce90234c3b483b5f978396eccef6f69c50f0bea248448aaf9cdfcd1cedad6217acbb + languageName: node + linkType: hard + +"array.prototype.flat@npm:^1.3.2": + version: 1.3.2 + resolution: "array.prototype.flat@npm:1.3.2" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + es-shim-unscopables: "npm:^1.0.0" + checksum: a578ed836a786efbb6c2db0899ae80781b476200617f65a44846cb1ed8bd8b24c8821b83703375d8af639c689497b7b07277060024b9919db94ac3e10dc8a49b + languageName: node + linkType: hard + +"array.prototype.flatmap@npm:^1.3.2": + version: 1.3.2 + resolution: "array.prototype.flatmap@npm:1.3.2" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + es-shim-unscopables: "npm:^1.0.0" + checksum: 67b3f1d602bb73713265145853128b1ad77cc0f9b833c7e1e056b323fbeac41a4ff1c9c99c7b9445903caea924d9ca2450578d9011913191aa88cc3c3a4b54f4 + languageName: node + linkType: hard + +"arraybuffer.prototype.slice@npm:^1.0.2": + version: 1.0.2 + resolution: "arraybuffer.prototype.slice@npm:1.0.2" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - es-shim-unscopables: ^1.0.0 - checksum: 5a8415949df79bf6e01afd7e8839bbde5a3581300e8ad5d8449dea52639e9e59b26a467665622783697917b43bf39940a6e621877c7dd9b3d1c1f97484b9b88b + array-buffer-byte-length: "npm:^1.0.0" + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + get-intrinsic: "npm:^1.2.1" + is-array-buffer: "npm:^3.0.2" + is-shared-array-buffer: "npm:^1.0.2" + checksum: 96b6e40e439678ffb7fa266398510074d33c3980fbb475490b69980cca60adec3b0777047ef377068a29862157f83edef42efc64ce48ce38977d04d68de5b7fb languageName: node linkType: hard "arrgv@npm:^1.0.2": version: 1.0.2 resolution: "arrgv@npm:1.0.2" - checksum: 470bbb406ea3b34810dd8b03c0b33282617a42d9fce0ab45d58596efefd042fc548eda49161fa8e3f607cbe9df90e7a67003a09043ab9081eff70f97c63dd0e2 + checksum: 7e6e782e6b749923ac7cbc4048ef6fe0844c4a59bfc8932fcd4c44566ba25eed46501f94dd7cf3c7297da88f3f599ca056bfb77d0c2484aebc92f04239f69124 languageName: node linkType: hard "arrify@npm:^1.0.1": version: 1.0.1 resolution: "arrify@npm:1.0.1" - checksum: 745075dd4a4624ff0225c331dacb99be501a515d39bcb7c84d24660314a6ec28e68131b137e6f7e16318170842ce97538cd298fc4cd6b2cc798e0b957f2747e7 + checksum: c35c8d1a81bcd5474c0c57fe3f4bad1a4d46a5fa353cedcff7a54da315df60db71829e69104b859dff96c5d68af46bd2be259fe5e50dc6aa9df3b36bea0383ab languageName: node linkType: hard "arrify@npm:^3.0.0": version: 3.0.0 resolution: "arrify@npm:3.0.0" - checksum: d6c6f3dad9571234f320e130d57fddb2cc283c87f2ac7df6c7005dffc5161b7bb9376f4be655ed257050330336e84afc4f3020d77696ad231ff580a94ae5aba6 + checksum: 2e26601b8486f29780f1f70f7ac05a226755814c2a3ab42e196748f650af1dc310cd575a11dd4b9841c70fd7460b2dd2b8fe6fb7a3375878e2660706efafa58e languageName: node linkType: hard "asmcrypto.js@npm:^2.3.2": version: 2.3.2 resolution: "asmcrypto.js@npm:2.3.2" - checksum: d61722be99d51c9a09093166412354845fb6ba278374b0cccfb33b18ad9edd26019ced171ae286b1d55c57edd8702fe87d2eec096f20fb2080ee52f8ba4b995e + checksum: 777c0c5eab60addffe9466cc3b7ffdb041a07389a47006b9d566dd1f829248ffe98edcfdd5888d0c51f1790e93a4586127097cc891059ff1c7795ab27024fa83 languageName: node linkType: hard "ast-module-types@npm:^2.7.1": version: 2.7.1 resolution: "ast-module-types@npm:2.7.1" - checksum: 6238647bcf34eeff2a1390cb60388da8a5064dd598acf48d68f8d972d9a332dc8d0382a5a7c511b16470e314b313bcbb95de4b0b669515393e043282c0489538 + checksum: df94462e98a778bc24f6d09cea5db5fbedede1fb96a9d5ea49d91d36dfa8f7b146252a5c455b6a1b06c52685d04aafbaca3204dd74e5c52378f818d95e6fbd02 languageName: node linkType: hard "ast-module-types@npm:^3.0.0": version: 3.0.0 resolution: "ast-module-types@npm:3.0.0" - checksum: c6ef35d9b286f84c7942aeb0e2b50e389e0b6f44ee3b6d2c46aeed4852dbca0681dde8c3c0ec1d456dad5dbc84fced2e1c607b10b4b4c3b065b901b40f45bbe7 + checksum: 4270d4e90db7609d3af01bbf2fa3793819c18ccc102cc4ac459a08aff27558259875451d04f9a95b40ef62f8cd96a885609143f8e1133f133cbe3a60b9796713 + languageName: node + linkType: hard + +"ast-module-types@npm:^4.0.0": + version: 4.0.0 + resolution: "ast-module-types@npm:4.0.0" + checksum: 5ade59e75a3e99595330020b75895858f0c05c863a819c496dd761a179c5282c4ca1ec4ef3ca4d440164bdcf4f72f4a3b4946aa06a23e1775c157506fff86e27 + languageName: node + linkType: hard + +"async-sema@npm:^3.1.1": + version: 3.1.1 + resolution: "async-sema@npm:3.1.1" + checksum: a16da9f7f2dbdd00a969bf264b7ad331b59df3eac2b38f529b881c5cc8662594e68ed096d927ec2aabdc13454379cdc6d677bcdb0a3d2db338fb4be17957832b languageName: node linkType: hard "at-least-node@npm:^1.0.0": version: 1.0.0 resolution: "at-least-node@npm:1.0.0" - checksum: 463e2f8e43384f1afb54bc68485c436d7622acec08b6fad269b421cb1d29cebb5af751426793d0961ed243146fe4dc983402f6d5a51b720b277818dbf6f2e49e + checksum: 4c058baf6df1bc5a1697cf182e2029c58cd99975288a13f9e70068ef5d6f4e1f1fd7c4d2c3c4912eae44797d1725be9700995736deca441b39f3e66d8dee97ef languageName: node linkType: hard -"ava@npm:^5.1.0": - version: 5.1.0 - resolution: "ava@npm:5.1.0" - dependencies: - acorn: ^8.8.1 - acorn-walk: ^8.2.0 - ansi-styles: ^6.2.1 - arrgv: ^1.0.2 - arrify: ^3.0.0 - callsites: ^4.0.0 - cbor: ^8.1.0 - chalk: ^5.1.2 - chokidar: ^3.5.3 - chunkd: ^2.0.1 - ci-info: ^3.6.1 - ci-parallel-vars: ^1.0.1 - clean-yaml-object: ^0.1.0 - cli-truncate: ^3.1.0 - code-excerpt: ^4.0.0 - common-path-prefix: ^3.0.0 - concordance: ^5.0.4 - currently-unhandled: ^0.4.1 - debug: ^4.3.4 - del: ^7.0.0 - emittery: ^1.0.1 - figures: ^5.0.0 - globby: ^13.1.2 - ignore-by-default: ^2.1.0 - indent-string: ^5.0.0 - is-error: ^2.2.2 - is-plain-object: ^5.0.0 - is-promise: ^4.0.0 - matcher: ^5.0.0 - mem: ^9.0.2 - ms: ^2.1.3 - p-event: ^5.0.1 - p-map: ^5.5.0 - picomatch: ^2.3.1 - pkg-conf: ^4.0.0 - plur: ^5.1.0 - pretty-ms: ^8.0.0 - resolve-cwd: ^3.0.0 - slash: ^3.0.0 - stack-utils: ^2.0.6 - strip-ansi: ^7.0.1 - supertap: ^3.0.1 - temp-dir: ^3.0.0 - write-file-atomic: ^5.0.0 - yargs: ^17.6.2 +"ava@npm:^6.0.1": + version: 6.0.1 + resolution: "ava@npm:6.0.1" + dependencies: + "@vercel/nft": "npm:^0.24.4" + acorn: "npm:^8.11.2" + acorn-walk: "npm:^8.3.0" + ansi-styles: "npm:^6.2.1" + arrgv: "npm:^1.0.2" + arrify: "npm:^3.0.0" + callsites: "npm:^4.1.0" + cbor: "npm:^9.0.1" + chalk: "npm:^5.3.0" + chunkd: "npm:^2.0.1" + ci-info: "npm:^4.0.0" + ci-parallel-vars: "npm:^1.0.1" + cli-truncate: "npm:^4.0.0" + code-excerpt: "npm:^4.0.0" + common-path-prefix: "npm:^3.0.0" + concordance: "npm:^5.0.4" + currently-unhandled: "npm:^0.4.1" + debug: "npm:^4.3.4" + emittery: "npm:^1.0.1" + figures: "npm:^6.0.1" + globby: "npm:^14.0.0" + ignore-by-default: "npm:^2.1.0" + indent-string: "npm:^5.0.0" + is-plain-object: "npm:^5.0.0" + is-promise: "npm:^4.0.0" + matcher: "npm:^5.0.0" + memoize: "npm:^10.0.0" + ms: "npm:^2.1.3" + p-map: "npm:^6.0.0" + package-config: "npm:^5.0.0" + picomatch: "npm:^3.0.1" + plur: "npm:^5.1.0" + pretty-ms: "npm:^8.0.0" + resolve-cwd: "npm:^3.0.0" + stack-utils: "npm:^2.0.6" + strip-ansi: "npm:^7.1.0" + supertap: "npm:^3.0.1" + temp-dir: "npm:^3.0.0" + write-file-atomic: "npm:^5.0.1" + yargs: "npm:^17.7.2" peerDependencies: "@ava/typescript": "*" peerDependenciesMeta: @@ -1833,21 +2103,21 @@ __metadata: optional: true bin: ava: entrypoints/cli.mjs - checksum: 5f0b7ebd2ee236fe7698bf85ce6c67f8e4aed841a23f0bcf5e13ed6614f8e94be4937330ac721060f333b18f6d370e5c644649a1a979b2962d039d904f43b364 + checksum: dce43b360013ef8bc78cb6215c58640cd91fbd3c9a4059105556653e5de9728590159719e382ff95d205b973e00b8d050aa3fcf31f4a2298c4fb652d89b3c7df languageName: node linkType: hard "available-typed-arrays@npm:^1.0.5": version: 1.0.5 resolution: "available-typed-arrays@npm:1.0.5" - checksum: 20eb47b3cefd7db027b9bbb993c658abd36d4edd3fe1060e83699a03ee275b0c9b216cc076ff3f2db29073225fb70e7613987af14269ac1fe2a19803ccc97f1a + checksum: c4df567ca72d2754a6cbad20088f5f98b1065b3360178169fa9b44ea101af62c0f423fc3854fa820fd6895b6b9171b8386e71558203103ff8fc2ad503fdcc660 languageName: node linkType: hard "balanced-match@npm:^1.0.0": version: 1.0.2 resolution: "balanced-match@npm:1.0.2" - checksum: 9706c088a283058a8a99e0bf91b0a2f75497f185980d9ffa8b304de1d9e58ebda7c72c07ebf01dadedaac5b2907b2c6f566f660d62bd336c3468e960403b9d65 + checksum: 9308baf0a7e4838a82bbfd11e01b1cb0f0cf2893bc1676c27c2a8c0e70cbae1c59120c3268517a8ae7fb6376b4639ef81ca22582611dbee4ed28df945134aaee languageName: node linkType: hard @@ -1855,33 +2125,22 @@ __metadata: version: 3.0.9 resolution: "base-x@npm:3.0.9" dependencies: - safe-buffer: ^5.0.1 - checksum: 957101d6fd09e1903e846fd8f69fd7e5e3e50254383e61ab667c725866bec54e5ece5ba49ce385128ae48f9ec93a26567d1d5ebb91f4d56ef4a9cc0d5a5481e8 + safe-buffer: "npm:^5.0.1" + checksum: e6bbeae30b24f748b546005affb710c5fbc8b11a83f6cd0ca999bd1ab7ad3a22e42888addc40cd145adc4edfe62fcfab4ebc91da22e4259aae441f95a77aee1a languageName: node linkType: hard "base64-js@npm:^1.3.1": version: 1.5.1 resolution: "base64-js@npm:1.5.1" - checksum: 669632eb3745404c2f822a18fc3a0122d2f9a7a13f7fb8b5823ee19d1d2ff9ee5b52c53367176ea4ad093c332fd5ab4bd0ebae5a8e27917a4105a4cfc86b1005 - languageName: node - linkType: hard - -"bcrypto@npm:^5.4.0": - version: 5.4.0 - resolution: "bcrypto@npm:5.4.0" - dependencies: - bufio: ~1.0.7 - loady: ~0.0.5 - node-gyp: latest - checksum: 0618353afadd524ec3a9907dcbb2059ac37a953ae108fb524e80ded490373db567aebfaefd742351f86fd5099f09ea514950fb4853f8c81bae2802be0facbd1c + checksum: f23823513b63173a001030fae4f2dabe283b99a9d324ade3ad3d148e218134676f1ee8568c877cd79ec1c53158dcf2d2ba527a97c606618928ba99dd930102bf languageName: node linkType: hard "bech32@npm:=2.0.0": version: 2.0.0 resolution: "bech32@npm:2.0.0" - checksum: fa15acb270b59aa496734a01f9155677b478987b773bf701f465858bf1606c6a970085babd43d71ce61895f1baa594cb41a2cd1394bd2c6698f03cc2d811300e + checksum: 45e7cc62758c9b26c05161b4483f40ea534437cf68ef785abadc5b62a2611319b878fef4f86ddc14854f183b645917a19addebc9573ab890e19194bc8f521942 languageName: node linkType: hard @@ -1889,23 +2148,25 @@ __metadata: version: 2.1.4 resolution: "benchmark@npm:2.1.4" dependencies: - lodash: ^4.17.4 - platform: ^1.3.3 - checksum: aa466561d4f2b0a2419a3069b8f90fd35ffacf26849697eea9de525ecfbd10b44da11070cc51c88d772076db8cb2415641b493de7d6c024fdf8551019c6fcf1c + lodash: "npm:^4.17.4" + platform: "npm:^1.3.3" + checksum: 510224c01f7578e9aa60cef67ec3dd8f84ac6670007bcc96285f87865375122aca0853ab4e542cc80cfeeed436356dfdd63bb66cb5e72365abb912685b2139be languageName: node linkType: hard "bigi@npm:^1.1.0, bigi@npm:^1.4.2": version: 1.4.2 resolution: "bigi@npm:1.4.2" - checksum: 82b5ed2c779b2065a269fd8233c39e26bef9e5b129ca1b66579d056de1f5e2627850ac42bd952c477b28560f216760709bf486078299efe617b1898c8ea70306 + checksum: 59acf628a3bd27ea032a1a9257dc6aa759483ed97d65e1cbf094aa2e1f762ec0ec8f86173a5095ff0da42cc53e481ece7cc9462e5ac5abb15efa060788c19ef7 languageName: node linkType: hard -"binary-extensions@npm:^2.0.0": - version: 2.2.0 - resolution: "binary-extensions@npm:2.2.0" - checksum: ccd267956c58d2315f5d3ea6757cf09863c5fc703e50fbeb13a7dc849b812ef76e3cf9ca8f35a0c48498776a7478d7b4a0418e1e2b8cb9cb9731f2922aaad7f8 +"bindings@npm:^1.4.0": + version: 1.5.0 + resolution: "bindings@npm:1.5.0" + dependencies: + file-uri-to-path: "npm:1.0.0" + checksum: 3dab2491b4bb24124252a91e656803eac24292473e56554e35bbfe3cc1875332cfa77600c3bac7564049dc95075bf6fcc63a4609920ff2d64d0fe405fcf0d4ba languageName: node linkType: hard @@ -1913,82 +2174,82 @@ __metadata: version: 0.6.4 resolution: "bip-schnorr@npm:0.6.4" dependencies: - bigi: ^1.4.2 - ecurve: ^1.0.6 - js-sha256: ^0.9.0 - randombytes: ^2.1.0 - safe-buffer: ^5.2.1 - checksum: c5b2f97924854bee5cb64e5b357a6d315678c1fbdf3879475d0bcdbf9d32a776158e5700de7e9c05ac11fdd55e2257f14d0b8864c25acb585f8b371feaad11f8 + bigi: "npm:^1.4.2" + ecurve: "npm:^1.0.6" + js-sha256: "npm:^0.9.0" + randombytes: "npm:^2.1.0" + safe-buffer: "npm:^5.2.1" + checksum: 64d0b4590102f3fc13aba3992ae8a38029c85b0619430e2fa014ede8994ebea9808627d99a514cf72fe9624a6940f981b43a8c64981c6831c98ef6d9518985e7 languageName: node linkType: hard -"bitcore-lib-cash@npm:^8.25.40": - version: 8.25.40 - resolution: "bitcore-lib-cash@npm:8.25.40" +"bitcore-lib-cash@npm:^10.0.23": + version: 10.0.23 + resolution: "bitcore-lib-cash@npm:10.0.23" dependencies: - bitcore-lib: ^8.25.40 - bn.js: =4.11.8 - bs58: ^4.0.1 - buffer-compare: =1.1.1 - elliptic: ^6.5.3 - inherits: =2.0.1 - lodash: ^4.17.20 - checksum: 0cbc66f51dd6c8bfcc1d96f02ddcb982e6005686b0cbcbdf6fdb84d2cb0b818ccfef6b709ada4a32ab0f1d9bb958638f2f520ed73dcbfe2a00aca7fc153035c7 + bitcore-lib: "npm:^10.0.23" + bn.js: "npm:=4.11.8" + bs58: "npm:^4.0.1" + buffer-compare: "npm:=1.1.1" + elliptic: "npm:^6.5.3" + inherits: "npm:=2.0.1" + lodash: "npm:^4.17.20" + checksum: e865343dff0d57c43a3ed5121ccee8c4d0c9b25fba7c825e9d6c3cc1a85a37ba4b81448218e7ca25c4dc29e7b745694a33da387d51f74177e1d2f4e82aa499f2 languageName: node linkType: hard -"bitcore-lib@npm:^8.25.40": - version: 8.25.40 - resolution: "bitcore-lib@npm:8.25.40" +"bitcore-lib@npm:^10.0.23": + version: 10.0.23 + resolution: "bitcore-lib@npm:10.0.23" dependencies: - bech32: =2.0.0 - bip-schnorr: =0.6.4 - bn.js: =4.11.8 - bs58: ^4.0.1 - buffer-compare: =1.1.1 - elliptic: ^6.5.3 - inherits: =2.0.1 - lodash: ^4.17.20 - checksum: f37221914c95e95a2fc48902dc6ff8599b2725a22e0cfdcdd289263f413bb5e0dd628533ff5de5fcf9ef3afca54f62c193d9a3def522f09d618bdaf425ab9ab4 + bech32: "npm:=2.0.0" + bip-schnorr: "npm:=0.6.4" + bn.js: "npm:=4.11.8" + bs58: "npm:^4.0.1" + buffer-compare: "npm:=1.1.1" + elliptic: "npm:^6.5.3" + inherits: "npm:=2.0.1" + lodash: "npm:^4.17.20" + checksum: 23f9a639da0324725bb8a9b19a538f67f406bd8920c716faa57964952f6ff176e8444b459ec2fc4a4f51e2e5bc7eba533c733769eec09f914f4a565b6dcfa784 languageName: node linkType: hard -"bl@npm:^4.0.3, bl@npm:^4.1.0": +"bl@npm:^4.1.0": version: 4.1.0 resolution: "bl@npm:4.1.0" dependencies: - buffer: ^5.5.0 - inherits: ^2.0.4 - readable-stream: ^3.4.0 - checksum: 9e8521fa7e83aa9427c6f8ccdcba6e8167ef30cc9a22df26effcc5ab682ef91d2cbc23a239f945d099289e4bbcfae7a192e9c28c84c6202e710a0dfec3722662 + buffer: "npm:^5.5.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.4.0" + checksum: 02847e1d2cb089c9dc6958add42e3cdeaf07d13f575973963335ac0fdece563a50ac770ac4c8fa06492d2dd276f6cc3b7f08c7cd9c7a7ad0f8d388b2a28def5f languageName: node linkType: hard "bluebird@npm:^3.4.0": version: 3.7.2 resolution: "bluebird@npm:3.7.2" - checksum: 869417503c722e7dc54ca46715f70e15f4d9c602a423a02c825570862d12935be59ed9c7ba34a9b31f186c017c23cac6b54e35446f8353059c101da73eac22ef + checksum: 680de03adc54ff925eaa6c7bb9a47a0690e8b5de60f4792604aae8ed618c65e6b63a7893b57ca924beaf53eee69c5af4f8314148c08124c550fe1df1add897d2 languageName: node linkType: hard "blueimp-md5@npm:^2.10.0": version: 2.19.0 resolution: "blueimp-md5@npm:2.19.0" - checksum: 28095dcbd2c67152a2938006e8d7c74c3406ba6556071298f872505432feb2c13241b0476644160ee0a5220383ba94cb8ccdac0053b51f68d168728f9c382530 + checksum: 85d04343537dd99a288c62450341dcce7380d3454c81f8e5a971ddd80307d6f9ef51b5b92ad7d48aaaa92fd6d3a1f6b2f4fada068faae646887f7bfabc17a346 languageName: node linkType: hard "bn.js@npm:=4.11.8": version: 4.11.8 resolution: "bn.js@npm:4.11.8" - checksum: 80d4709cd58a21f0be8201e9e5859fea5ef133318e9800c8454cd334625c6e1caea593ca21f9b9a085fb560fbc12fb2fb3514363f8604258db924237fd039139 + checksum: d1bd5f8721c9c101c5e5bb3077d8689b3116f618506c6dd009fee5701b8b116da373b35c60d437549c8c720b6b62a161ab070d6a8266a164ef4503a1582b634e languageName: node linkType: hard "bn.js@npm:^4.11.9": version: 4.12.0 resolution: "bn.js@npm:4.12.0" - checksum: 39afb4f15f4ea537b55eaf1446c896af28ac948fdcf47171961475724d1bb65118cca49fa6e3d67706e4790955ec0e74de584e45c8f1ef89f46c812bee5b5a12 + checksum: 9736aaa317421b6b3ed038ff3d4491935a01419ac2d83ddcfebc5717385295fcfcf0c57311d90fe49926d0abbd7a9dbefdd8861e6129939177f7e67ebc645b21 languageName: node linkType: hard @@ -1996,19 +2257,19 @@ __metadata: version: 1.20.1 resolution: "body-parser@npm:1.20.1" dependencies: - bytes: 3.1.2 - content-type: ~1.0.4 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.1 - type-is: ~1.6.18 - unpipe: 1.0.0 - checksum: f1050dbac3bede6a78f0b87947a8d548ce43f91ccc718a50dd774f3c81f2d8b04693e52acf62659fad23101827dd318da1fb1363444ff9a8482b886a3e4a5266 + bytes: "npm:3.1.2" + content-type: "npm:~1.0.4" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + on-finished: "npm:2.4.1" + qs: "npm:6.11.0" + raw-body: "npm:2.5.1" + type-is: "npm:~1.6.18" + unpipe: "npm:1.0.0" + checksum: a202d493e2c10a33fb7413dac7d2f713be579c4b88343cd814b6df7a38e5af1901fc31044e04de176db56b16d9772aa25a7723f64478c20f4d91b1ac223bf3b8 languageName: node linkType: hard @@ -2016,9 +2277,9 @@ __metadata: version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" dependencies: - balanced-match: ^1.0.0 - concat-map: 0.0.1 - checksum: faf34a7bb0c3fcf4b59c7808bc5d2a96a40988addf2e7e09dfbb67a2251800e0d14cd2bfc1aa79174f2f5095c54ff27f46fb1289fe2d77dac755b5eb3434cc07 + balanced-match: "npm:^1.0.0" + concat-map: "npm:0.0.1" + checksum: 695a56cd058096a7cb71fb09d9d6a7070113c7be516699ed361317aca2ec169f618e28b8af352e02ab4233fb54eb0168460a40dc320bab0034b36ab59aaad668 languageName: node linkType: hard @@ -2026,24 +2287,24 @@ __metadata: version: 2.0.1 resolution: "brace-expansion@npm:2.0.1" dependencies: - balanced-match: ^1.0.0 - checksum: a61e7cd2e8a8505e9f0036b3b6108ba5e926b4b55089eeb5550cd04a471fe216c96d4fe7e4c7f995c728c554ae20ddfc4244cad10aef255e72b62930afd233d1 + balanced-match: "npm:^1.0.0" + checksum: b358f2fe060e2d7a87aa015979ecea07f3c37d4018f8d6deb5bd4c229ad3a0384fe6029bb76cd8be63c81e516ee52d1a0673edbe2023d53a5191732ae3c3e49f languageName: node linkType: hard -"braces@npm:^3.0.2, braces@npm:~3.0.2": +"braces@npm:^3.0.2": version: 3.0.2 resolution: "braces@npm:3.0.2" dependencies: - fill-range: ^7.0.1 - checksum: e2a8e769a863f3d4ee887b5fe21f63193a891c68b612ddb4b68d82d1b5f3ff9073af066c343e9867a393fe4c2555dcb33e89b937195feb9c1613d259edfcd459 + fill-range: "npm:^7.0.1" + checksum: 321b4d675791479293264019156ca322163f02dc06e3c4cab33bb15cd43d80b51efef69b0930cfde3acd63d126ebca24cd0544fa6f261e093a0fb41ab9dda381 languageName: node linkType: hard "brorand@npm:^1.1.0": version: 1.1.0 resolution: "brorand@npm:1.1.0" - checksum: 8a05c9f3c4b46572dec6ef71012b1946db6cae8c7bb60ccd4b7dd5a84655db49fe043ecc6272e7ef1f69dc53d6730b9e2a3a03a8310509a3d797a618cbee52be + checksum: 6f366d7c4990f82c366e3878492ba9a372a73163c09871e80d82fb4ae0d23f9f8924cb8a662330308206e6b3b76ba1d528b4601c9ef73c2166b440b2ea3b7571 languageName: node linkType: hard @@ -2051,139 +2312,128 @@ __metadata: version: 4.0.1 resolution: "bs58@npm:4.0.1" dependencies: - base-x: ^3.0.2 - checksum: b3c5365bb9e0c561e1a82f1a2d809a1a692059fae016be233a6127ad2f50a6b986467c3a50669ce4c18929dcccb297c5909314dd347a25a68c21b68eb3e95ac2 + base-x: "npm:^3.0.2" + checksum: 613a1b1441e754279a0e3f44d1faeb8c8e838feef81e550efe174ff021dd2e08a4c9ae5805b52dfdde79f97b5c0918c78dd24a0eb726c4a94365f0984a0ffc65 languageName: node linkType: hard "buffer-compare@npm:=1.1.1": version: 1.1.1 resolution: "buffer-compare@npm:1.1.1" - checksum: fe9a25cdd0c878eb689d928de4f8d6d3b4062b2a2c92bd4a1f6a5dcd22de17a95604bd102d4590542b2eb13779762c009f3193e840092dc9ed2c0dad8b726655 - languageName: node - linkType: hard - -"buffer-crc32@npm:~0.2.3": - version: 0.2.13 - resolution: "buffer-crc32@npm:0.2.13" - checksum: 06252347ae6daca3453b94e4b2f1d3754a3b146a111d81c68924c22d91889a40623264e95e67955b1cb4a68cbedf317abeabb5140a9766ed248973096db5ce1c + checksum: 3c47e7a3b45239b749213ba1d4d70c177b4c99e620ac01acc6d232be370c755e44b7131ee3034fc4b37a814f56dd6955b7b231fa2ab4559d2c9e12683fb7cee0 languageName: node linkType: hard "buffer-from@npm:^1.0.0": version: 1.1.2 resolution: "buffer-from@npm:1.1.2" - checksum: 0448524a562b37d4d7ed9efd91685a5b77a50672c556ea254ac9a6d30e3403a517d8981f10e565db24e8339413b43c97ca2951f10e399c6125a0d8911f5679bb + checksum: 124fff9d66d691a86d3b062eff4663fe437a9d9ee4b47b1b9e97f5a5d14f6d5399345db80f796827be7c95e70a8e765dd404b7c3ff3b3324f98e9b0c8826cc34 languageName: node linkType: hard -"buffer@npm:^5.2.1, buffer@npm:^5.5.0": +"buffer@npm:^5.5.0": version: 5.7.1 resolution: "buffer@npm:5.7.1" dependencies: - base64-js: ^1.3.1 - ieee754: ^1.1.13 - checksum: e2cf8429e1c4c7b8cbd30834ac09bd61da46ce35f5c22a78e6c2f04497d6d25541b16881e30a019c6fd3154150650ccee27a308eff3e26229d788bbdeb08ab84 - languageName: node - linkType: hard - -"bufio@npm:~1.0.7": - version: 1.0.7 - resolution: "bufio@npm:1.0.7" - checksum: 4871b8060a8d3bc04de8722f5cc5575b77f4cb18af389eab62d51bf42b08f43fe75159126ef11f15fe4045dc8c20e0e344406ca8388cb1371e558b986e971a57 + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e languageName: node linkType: hard "builtin-modules@npm:^3.3.0": version: 3.3.0 resolution: "builtin-modules@npm:3.3.0" - checksum: db021755d7ed8be048f25668fe2117620861ef6703ea2c65ed2779c9e3636d5c3b82325bd912244293959ff3ae303afa3471f6a15bf5060c103e4cc3a839749d + checksum: 2cb3448b4f7306dc853632a4fcddc95e8d4e4b9868c139400027b71938fc6806d4ff44007deffb362ac85724bd40c2c6452fb6a0aa4531650eeddb98d8e5ee8a + languageName: node + linkType: hard + +"bundle-name@npm:^4.1.0": + version: 4.1.0 + resolution: "bundle-name@npm:4.1.0" + dependencies: + run-applescript: "npm:^7.0.0" + checksum: 8e575981e79c2bcf14d8b1c027a3775c095d362d1382312f444a7c861b0e21513c0bd8db5bd2b16e50ba0709fa622d4eab6b53192d222120305e68359daece29 languageName: node linkType: hard "bytes@npm:3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" - checksum: e4bcd3948d289c5127591fbedf10c0b639ccbf00243504e4e127374a15c3bc8eed0d28d4aaab08ff6f1cf2abc0cce6ba3085ed32f4f90e82a5683ce0014e1b6e - languageName: node - linkType: hard - -"c8@npm:^7.12.0": - version: 7.12.0 - resolution: "c8@npm:7.12.0" - dependencies: - "@bcoe/v8-coverage": ^0.2.3 - "@istanbuljs/schema": ^0.1.3 - find-up: ^5.0.0 - foreground-child: ^2.0.0 - istanbul-lib-coverage: ^3.2.0 - istanbul-lib-report: ^3.0.0 - istanbul-reports: ^3.1.4 - rimraf: ^3.0.2 - test-exclude: ^6.0.0 - v8-to-istanbul: ^9.0.0 - yargs: ^16.2.0 - yargs-parser: ^20.2.9 + checksum: 76d1c43cbd602794ad8ad2ae94095cddeb1de78c5dddaa7005c51af10b0176c69971a6d88e805a90c2b6550d76636e43c40d8427a808b8645ede885de4a0358e + languageName: node + linkType: hard + +"c8@npm:^9.0.0": + version: 9.0.0 + resolution: "c8@npm:9.0.0" + dependencies: + "@bcoe/v8-coverage": "npm:^0.2.3" + "@istanbuljs/schema": "npm:^0.1.3" + find-up: "npm:^5.0.0" + foreground-child: "npm:^3.1.1" + istanbul-lib-coverage: "npm:^3.2.0" + istanbul-lib-report: "npm:^3.0.1" + istanbul-reports: "npm:^3.1.6" + test-exclude: "npm:^6.0.0" + v8-to-istanbul: "npm:^9.0.0" + yargs: "npm:^17.7.2" + yargs-parser: "npm:^21.1.1" bin: c8: bin/c8.js - checksum: 3b7fa9ad7cff2cb0bb579467e6b544498fbd46e9353a809ad3b8cf749df4beadd074cde277356b0552f3c8055b1b3ec3ebaf2209e9ad4bdefed92dbf64d283ab + checksum: d1be07d8a720807270adc7818492711aa7d3c201a6a3b6b69c85c8ebcf6eb5ccdcca81326b277dce6f19e00197b45a224c6915e707ee41ee0a2805dd538a855f languageName: node linkType: hard -"cacache@npm:^16.1.0": - version: 16.1.3 - resolution: "cacache@npm:16.1.3" +"cacache@npm:^18.0.0": + version: 18.0.2 + resolution: "cacache@npm:18.0.2" dependencies: - "@npmcli/fs": ^2.1.0 - "@npmcli/move-file": ^2.0.0 - chownr: ^2.0.0 - fs-minipass: ^2.1.0 - glob: ^8.0.1 - infer-owner: ^1.0.4 - lru-cache: ^7.7.1 - minipass: ^3.1.6 - minipass-collect: ^1.0.2 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - mkdirp: ^1.0.4 - p-map: ^4.0.0 - promise-inflight: ^1.0.1 - rimraf: ^3.0.2 - ssri: ^9.0.0 - tar: ^6.1.11 - unique-filename: ^2.0.0 - checksum: d91409e6e57d7d9a3a25e5dcc589c84e75b178ae8ea7de05cbf6b783f77a5fae938f6e8fda6f5257ed70000be27a681e1e44829251bfffe4c10216002f8f14e6 + "@npmcli/fs": "npm:^3.1.0" + fs-minipass: "npm:^3.0.0" + glob: "npm:^10.2.2" + lru-cache: "npm:^10.0.1" + minipass: "npm:^7.0.3" + minipass-collect: "npm:^2.0.1" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + p-map: "npm:^4.0.0" + ssri: "npm:^10.0.0" + tar: "npm:^6.1.11" + unique-filename: "npm:^3.0.0" + checksum: 7992665305cc251a984f4fdbab1449d50e88c635bc43bf2785530c61d239c61b349e5734461baa461caaee65f040ab14e2d58e694f479c0810cffd181ba5eabc languageName: node linkType: hard "cachedir@npm:2.3.0": version: 2.3.0 resolution: "cachedir@npm:2.3.0" - checksum: ec90cb0f2e6336e266aa748dbadf3da9e0b20e843e43f1591acab7a3f1451337dc2f26cb9dd833ae8cfefeffeeb43ef5b5ff62782a685f4e3c2305dd98482fcb + checksum: 8380a4a4aa824b20cbc246c38ae2b3379a865f52ea1f31f7b057d07545ea1ab27f93c4323d4bd1bd398991489f18a226880c3166b19ecbf49a77b18c519d075a languageName: node linkType: hard -"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2": - version: 1.0.2 - resolution: "call-bind@npm:1.0.2" +"call-bind@npm:^1.0.0, call-bind@npm:^1.0.2, call-bind@npm:^1.0.4, call-bind@npm:^1.0.5": + version: 1.0.5 + resolution: "call-bind@npm:1.0.5" dependencies: - function-bind: ^1.1.1 - get-intrinsic: ^1.0.2 - checksum: f8e31de9d19988a4b80f3e704788c4a2d6b6f3d17cfec4f57dc29ced450c53a49270dc66bf0fbd693329ee948dd33e6c90a329519aef17474a4d961e8d6426b0 + function-bind: "npm:^1.1.2" + get-intrinsic: "npm:^1.2.1" + set-function-length: "npm:^1.1.1" + checksum: a6172c168fd6dacf744fcde745099218056bd755c50415b592655dcd6562157ed29f130f56c3f6db2250f67e4bd62e5c218cdc56d7bfd76e0bda50770fce2d10 languageName: node linkType: hard "callsites@npm:^3.0.0, callsites@npm:^3.1.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" - checksum: 072d17b6abb459c2ba96598918b55868af677154bec7e73d222ef95a8fdb9bbf7dae96a8421085cdad8cd190d86653b5b6dc55a4484f2e5b2e27d5e0c3fc15b3 + checksum: fff92277400eb06c3079f9e74f3af120db9f8ea03bad0e84d9aede54bbe2d44a56cccb5f6cf12211f93f52306df87077ecec5b712794c5a9b5dac6d615a3f301 languageName: node linkType: hard -"callsites@npm:^4.0.0": - version: 4.0.0 - resolution: "callsites@npm:4.0.0" - checksum: ad3c3a57328a539c0d671cf1ca500abf09461b762807fc545a132026bdf87705fee9c299e1adb38b133c29201a3b04fbf4f2b90d8fa1d9e00ef507e803737cf2 +"callsites@npm:^4.1.0": + version: 4.1.0 + resolution: "callsites@npm:4.1.0" + checksum: 91700844127a6dcd4792d231a12dd8e9ec10525eb9962180a8558417d7e3f443e52a4f14746ad2838eaf14f79431ee1539d13bd188da280f720a06a91bd1157a languageName: node linkType: hard @@ -2191,113 +2441,77 @@ __metadata: version: 6.2.2 resolution: "camelcase-keys@npm:6.2.2" dependencies: - camelcase: ^5.3.1 - map-obj: ^4.0.0 - quick-lru: ^4.0.1 - checksum: 43c9af1adf840471e54c68ab3e5fe8a62719a6b7dbf4e2e86886b7b0ff96112c945736342b837bd2529ec9d1c7d1934e5653318478d98e0cf22c475c04658e2a - languageName: node - linkType: hard - -"camelcase-keys@npm:^7.0.0": - version: 7.0.2 - resolution: "camelcase-keys@npm:7.0.2" - dependencies: - camelcase: ^6.3.0 - map-obj: ^4.1.0 - quick-lru: ^5.1.1 - type-fest: ^1.2.1 - checksum: b5821cc48dd00e8398a30c5d6547f06837ab44de123f1b3a603d0a03399722b2fc67a485a7e47106eb02ef543c3b50c5ebaabc1242cde4b63a267c3258d2365b + camelcase: "npm:^5.3.1" + map-obj: "npm:^4.0.0" + quick-lru: "npm:^4.0.1" + checksum: bf1a28348c0f285c6c6f68fb98a9d088d3c0269fed0cdff3ea680d5a42df8a067b4de374e7a33e619eb9d5266a448fe66c2dd1f8e0c9209ebc348632882a3526 languageName: node linkType: hard "camelcase@npm:^5.3.1": version: 5.3.1 resolution: "camelcase@npm:5.3.1" - checksum: e6effce26b9404e3c0f301498184f243811c30dfe6d0b9051863bd8e4034d09c8c2923794f280d6827e5aa055f6c434115ff97864a16a963366fb35fd673024b + checksum: 92ff9b443bfe8abb15f2b1513ca182d16126359ad4f955ebc83dc4ddcc4ef3fdd2c078bc223f2673dc223488e75c99b16cc4d056624374b799e6a1555cf61b23 languageName: node linkType: hard -"camelcase@npm:^6.3.0": - version: 6.3.0 - resolution: "camelcase@npm:6.3.0" - checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d +"cbor@npm:^9.0.1": + version: 9.0.1 + resolution: "cbor@npm:9.0.1" + dependencies: + nofilter: "npm:^3.1.0" + checksum: 7a5148d31f24d47cf1a85b3de8e5b5d7beec60811f8fb448afe960c163c45b4c887be43d617c2d7ced776b485d313ff2828bfde06f99c5c30041912aa4bde444 languageName: node linkType: hard -"cbor@npm:^8.1.0": - version: 8.1.0 - resolution: "cbor@npm:8.1.0" +"chalk-template@npm:^1.1.0": + version: 1.1.0 + resolution: "chalk-template@npm:1.1.0" dependencies: - nofilter: ^3.1.0 - checksum: a90338435dc7b45cc01461af979e3bb6ddd4f2a08584c437586039cd5f2235014c06e49d664295debbfb3514d87b2f06728092ab6aa6175e2e85e9cd7dc0c1fd + chalk: "npm:^5.2.0" + checksum: bb6eda6115a33d06828caf8c44f786c26e0d392c74c2bd6bb0f7526588b15664e3e7c0305858531cdd9b266fc54a31fe71fe3844afcd47a3e67445313f149437 languageName: node linkType: hard -"chalk@npm:^2.0.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": +"chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" dependencies: - ansi-styles: ^3.2.1 - escape-string-regexp: ^1.0.5 - supports-color: ^5.3.0 - checksum: ec3661d38fe77f681200f878edbd9448821924e0f93a9cefc0e26a33b145f1027a2084bf19967160d11e1f03bfe4eaffcabf5493b89098b2782c3fe0b03d80c2 + ansi-styles: "npm:^3.2.1" + escape-string-regexp: "npm:^1.0.5" + supports-color: "npm:^5.3.0" + checksum: e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 languageName: node linkType: hard -"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1, chalk@npm:^4.1.2": +"chalk@npm:^4.0.0, chalk@npm:^4.1.0, chalk@npm:^4.1.1": version: 4.1.2 resolution: "chalk@npm:4.1.2" dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 languageName: node linkType: hard -"chalk@npm:^5.1.2": - version: 5.2.0 - resolution: "chalk@npm:5.2.0" - checksum: 03d8060277de6cf2fd567dc25fcf770593eb5bb85f460ce443e49255a30ff1242edd0c90a06a03803b0466ff0687a939b41db1757bec987113e83de89a003caa +"chalk@npm:^5.2.0, chalk@npm:^5.3.0": + version: 5.3.0 + resolution: "chalk@npm:5.3.0" + checksum: 8297d436b2c0f95801103ff2ef67268d362021b8210daf8ddbe349695333eb3610a71122172ff3b0272f1ef2cf7cc2c41fdaa4715f52e49ffe04c56340feed09 languageName: node linkType: hard "chardet@npm:^0.7.0": version: 0.7.0 resolution: "chardet@npm:0.7.0" - checksum: 6fd5da1f5d18ff5712c1e0aed41da200d7c51c28f11b36ee3c7b483f3696dabc08927fc6b227735eb8f0e1215c9a8abd8154637f3eff8cada5959df7f58b024d - languageName: node - linkType: hard - -"chokidar@npm:^3.5.3": - version: 3.5.3 - resolution: "chokidar@npm:3.5.3" - dependencies: - anymatch: ~3.1.2 - braces: ~3.0.2 - fsevents: ~2.3.2 - glob-parent: ~5.1.2 - is-binary-path: ~2.1.0 - is-glob: ~4.0.1 - normalize-path: ~3.0.0 - readdirp: ~3.6.0 - dependenciesMeta: - fsevents: - optional: true - checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c - languageName: node - linkType: hard - -"chownr@npm:^1.1.1": - version: 1.1.4 - resolution: "chownr@npm:1.1.4" - checksum: 115648f8eb38bac5e41c3857f3e663f9c39ed6480d1349977c4d96c95a47266fcacc5a5aabf3cb6c481e22d72f41992827db47301851766c4fd77ac21a4f081d + checksum: 96e4731b9ec8050cbb56ab684e8c48d6c33f7826b755802d14e3ebfdc51c57afeece3ea39bc6b09acc359e4363525388b915e16640c1378053820f5e70d0f27d languageName: node linkType: hard "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" - checksum: c57cf9dd0791e2f18a5ee9c1a299ae6e801ff58fee96dc8bfd0dcb4738a6ce58dd252a3605b1c93c6418fe4f9d5093b28ffbf4d66648cb2a9c67eaef9679be2f + checksum: 594754e1303672171cc04e50f6c398ae16128eb134a88f801bf5354fd96f205320f23536a045d9abd8b51024a149696e51231565891d4efdab8846021ecf88e6 languageName: node linkType: hard @@ -2305,41 +2519,41 @@ __metadata: version: 1.2.0 resolution: "chuhai@npm:1.2.0" dependencies: - benchmark: ^2.1.0 - bluebird: ^3.4.0 - debug: ^2.2.0 - fn-name: ^2.0.1 - lodash: ^4.13.1 - stack-utils: ^0.4.0 - checksum: 3f80f954f400eaec62064cbf902aaa68028c842fc25d89a960f4aa416fe707984f4d9c92abd59ea48f585ba57a212fb265f47f0861fd8882f99c0522484aeb2a + benchmark: "npm:^2.1.0" + bluebird: "npm:^3.4.0" + debug: "npm:^2.2.0" + fn-name: "npm:^2.0.1" + lodash: "npm:^4.13.1" + stack-utils: "npm:^0.4.0" + checksum: af4683162bbd33c17d67d31eddbdacb48188d148b0e8eaa012555c5a58c80d67dd0692966704910799e5dc1f18e7db906ec2d9bdaca4260ffeba2987a987e6ea languageName: node linkType: hard "chunkd@npm:^2.0.1": version: 2.0.1 resolution: "chunkd@npm:2.0.1" - checksum: bab8cc08c752a3648984385dc6f61d751e89dbeef648d22a3b661e1d470eaa0f5182f0b4303710f13ae83d2f85144f8eb2dde7a975861d9021b5c56b881f457b + checksum: 4e0c5aac6048ecedfa4cd0a5f6c4f010c70a7b7645aeca7bfeb47cb0733c3463054f0ced3f2667b2e0e67edd75d68a8e05481b01115ba3f8a952a93026254504 languageName: node linkType: hard -"ci-info@npm:^3.6.1": - version: 3.7.1 - resolution: "ci-info@npm:3.7.1" - checksum: 72d93d5101ea1c186511277fbd8d06ae8a6e028cc2fb94361e92bf735b39c5ebd192e8d15a66ff8c4e3ed569f87c2f844e96f90e141b2de5c649f77ec34ff601 +"ci-info@npm:^4.0.0": + version: 4.0.0 + resolution: "ci-info@npm:4.0.0" + checksum: ecc003e5b60580bd081d83dd61d398ddb8607537f916313e40af4667f9c92a1243bd8e8a591a5aa78e418afec245dbe8e90a0e26e39ca0825129a99b978dd3f9 languageName: node linkType: hard "ci-parallel-vars@npm:^1.0.1": version: 1.0.1 resolution: "ci-parallel-vars@npm:1.0.1" - checksum: ae859831f7e8e3585db731b8306c336616e37bd709dad1d7775ea4c0731aefd94741dabb48201edc6827d000008fd7fb72cb977967614ee2d99d6b499f0c35fe + checksum: 80952f699cbbc146092b077b4f3e28d085620eb4e6be37f069b4dbb3db0ee70e8eec3beef4ebe70ff60631e9fc743b9d0869678489f167442cac08b260e5ac08 languageName: node linkType: hard "clean-stack@npm:^2.0.0": version: 2.2.0 resolution: "clean-stack@npm:2.2.0" - checksum: 2ac8cd2b2f5ec986a3c743935ec85b07bc174d5421a5efc8017e1f146a1cf5f781ae962618f416352103b32c9cd7e203276e8c28241bbe946160cab16149fb68 + checksum: 1f90262d5f6230a17e27d0c190b09d47ebe7efdd76a03b5a1127863f7b3c9aec4c3e6c8bb3a7bbf81d553d56a1fd35728f5a8ef4c63f867ac8d690109742a8c1 languageName: node linkType: hard @@ -2347,15 +2561,8 @@ __metadata: version: 4.2.0 resolution: "clean-stack@npm:4.2.0" dependencies: - escape-string-regexp: 5.0.0 - checksum: 373f656a31face5c615c0839213b9b542a0a48057abfb1df66900eab4dc2a5c6097628e4a0b5aa559cdfc4e66f8a14ea47be9681773165a44470ef5fb8ccc172 - languageName: node - linkType: hard - -"clean-yaml-object@npm:^0.1.0": - version: 0.1.0 - resolution: "clean-yaml-object@npm:0.1.0" - checksum: 0374ad2f1fbd4984ecf56ebc62200092f6372b9ccf1b7971bb979c328fb12fe76e759fb1e8adc491c80b7b1861f9f00c7f19813dd2a0f49c88231422c70451f4 + escape-string-regexp: "npm:5.0.0" + checksum: 2bdf981a0fef0a23c14255df693b30eb9ae27eedf212470d8c400a0c0b6fb82fbf1ff8c5216ccd5721e3670b700389c886b1dce5070776dc9fbcc040957758c0 languageName: node linkType: hard @@ -2363,9 +2570,9 @@ __metadata: version: 4.1.2 resolution: "clear-module@npm:4.1.2" dependencies: - parent-module: ^2.0.0 - resolve-from: ^5.0.0 - checksum: 4931f0c461f5d7b9b79f62c2d1bc31c37f7f1d33b4e95eef7080a83955c0374f4c180f5a96cc4d63bbefc64a9aa5d12b155641109e8e489dfa50fd5820e5101f + parent-module: "npm:^2.0.0" + resolve-from: "npm:^5.0.0" + checksum: 73207f06af256e3c8901ceaa74f7e4468a777aa68dedc7f745db4116861a7f8e69c558e16dbdf7b3d2295675d5896f916ba55b5dc737dda81792dbeee1488127 languageName: node linkType: hard @@ -2373,32 +2580,32 @@ __metadata: version: 3.1.0 resolution: "cli-cursor@npm:3.1.0" dependencies: - restore-cursor: ^3.1.0 - checksum: 2692784c6cd2fd85cfdbd11f53aea73a463a6d64a77c3e098b2b4697a20443f430c220629e1ca3b195ea5ac4a97a74c2ee411f3807abf6df2b66211fec0c0a29 + restore-cursor: "npm:^3.1.0" + checksum: 92a2f98ff9037d09be3dfe1f0d749664797fb674bf388375a2207a1203b69d41847abf16434203e0089212479e47a358b13a0222ab9fccfe8e2644a7ccebd111 languageName: node linkType: hard "cli-spinners@npm:^2.5.0": - version: 2.7.0 - resolution: "cli-spinners@npm:2.7.0" - checksum: a9afaf73f58d1f951fb23742f503631b3cf513f43f4c7acb1b640100eb76bfa16efbcd1994d149ffc6603a6d75dd3d4a516a76f125f90dce437de9b16fd0ee6f + version: 2.9.2 + resolution: "cli-spinners@npm:2.9.2" + checksum: 907a1c227ddf0d7a101e7ab8b300affc742ead4b4ebe920a5bf1bc6d45dce2958fcd195eb28fa25275062fe6fa9b109b93b63bc8033396ed3bcb50297008b3a3 languageName: node linkType: hard -"cli-truncate@npm:^3.1.0": - version: 3.1.0 - resolution: "cli-truncate@npm:3.1.0" +"cli-truncate@npm:^4.0.0": + version: 4.0.0 + resolution: "cli-truncate@npm:4.0.0" dependencies: - slice-ansi: ^5.0.0 - string-width: ^5.0.0 - checksum: c3243e41974445691c63f8b405df1d5a24049dc33d324fe448dc572e561a7b772ae982692900b1a5960901cc4fc7def25a629b9c69a4208ee89d12ab3332617a + slice-ansi: "npm:^5.0.0" + string-width: "npm:^7.0.0" + checksum: d7f0b73e3d9b88cb496e6c086df7410b541b56a43d18ade6a573c9c18bd001b1c3fba1ad578f741a4218fdc794d042385f8ac02c25e1c295a2d8b9f3cb86eb4c languageName: node linkType: hard "cli-width@npm:^3.0.0": version: 3.0.0 resolution: "cli-width@npm:3.0.0" - checksum: 4c94af3769367a70e11ed69aa6095f1c600c0ff510f3921ab4045af961820d57c0233acfa8b6396037391f31b4c397e1f614d234294f979ff61430a6c166c3f6 + checksum: 125a62810e59a2564268c80fdff56c23159a7690c003e34aeb2e68497dccff26911998ff49c33916fcfdf71e824322cc3953e3f7b48b27267c7a062c81348a9a languageName: node linkType: hard @@ -2406,10 +2613,10 @@ __metadata: version: 7.0.4 resolution: "cliui@npm:7.0.4" dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.0 - wrap-ansi: ^7.0.0 - checksum: ce2e8f578a4813806788ac399b9e866297740eecd4ad1823c27fd344d78b22c5f8597d548adbcc46f0573e43e21e751f39446c5a5e804a12aace402b7a315d7f + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.0" + wrap-ansi: "npm:^7.0.0" + checksum: 6035f5daf7383470cef82b3d3db00bec70afb3423538c50394386ffbbab135e26c3689c41791f911fa71b62d13d3863c712fdd70f0fbdffd938a1e6fd09aac00 languageName: node linkType: hard @@ -2417,17 +2624,17 @@ __metadata: version: 8.0.1 resolution: "cliui@npm:8.0.1" dependencies: - string-width: ^4.2.0 - strip-ansi: ^6.0.1 - wrap-ansi: ^7.0.0 - checksum: 79648b3b0045f2e285b76fb2e24e207c6db44323581e421c3acbd0e86454cba1b37aea976ab50195a49e7384b871e6dfb2247ad7dec53c02454ac6497394cb56 + string-width: "npm:^4.2.0" + strip-ansi: "npm:^6.0.1" + wrap-ansi: "npm:^7.0.0" + checksum: 4bda0f09c340cbb6dfdc1ed508b3ca080f12992c18d68c6be4d9cf51756033d5266e61ec57529e610dacbf4da1c634423b0c1b11037709cc6b09045cbd815df5 languageName: node linkType: hard "clone@npm:^1.0.2": version: 1.0.4 resolution: "clone@npm:1.0.4" - checksum: d06418b7335897209e77bdd430d04f882189582e67bd1f75a04565f3f07f5b3f119a9d670c943b6697d0afb100f03b866b3b8a1f91d4d02d72c4ecf2bb64b5dd + checksum: 2176952b3649293473999a95d7bebfc9dc96410f6cbd3d2595cf12fd401f63a4bf41a7adbfd3ab2ff09ed60cb9870c58c6acdd18b87767366fabfc163700f13b languageName: node linkType: hard @@ -2435,8 +2642,8 @@ __metadata: version: 4.0.0 resolution: "code-excerpt@npm:4.0.0" dependencies: - convert-to-spaces: ^2.0.1 - checksum: d57137d8f4825879283a828cc02a1115b56858dc54ed06c625c8f67d6685d1becd2fbaa7f0ab19ecca1f5cca03f8c97bbc1f013cab40261e4d3275032e65efe9 + convert-to-spaces: "npm:^2.0.1" + checksum: b6c5a06e039cecd2ab6a0e10ee0831de8362107d1f298ca3558b5f9004cb8e0260b02dd6c07f57b9a0e346c76864d2873311ee1989809fdeb05bd5fbbadde773 languageName: node linkType: hard @@ -2444,8 +2651,8 @@ __metadata: version: 1.9.3 resolution: "color-convert@npm:1.9.3" dependencies: - color-name: 1.1.3 - checksum: fd7a64a17cde98fb923b1dd05c5f2e6f7aefda1b60d67e8d449f9328b4e53b228a428fd38bfeaeb2db2ff6b6503a776a996150b80cdf224062af08a5c8a3a203 + color-name: "npm:1.1.3" + checksum: 5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c languageName: node linkType: hard @@ -2453,59 +2660,66 @@ __metadata: version: 2.0.1 resolution: "color-convert@npm:2.0.1" dependencies: - color-name: ~1.1.4 - checksum: 79e6bdb9fd479a205c71d89574fccfb22bd9053bd98c6c4d870d65c132e5e904e6034978e55b43d69fcaa7433af2016ee203ce76eeba9cfa554b373e7f7db336 + color-name: "npm:~1.1.4" + checksum: 37e1150172f2e311fe1b2df62c6293a342ee7380da7b9cfdba67ea539909afbd74da27033208d01d6d5cfc65ee7868a22e18d7e7648e004425441c0f8a15a7d7 languageName: node linkType: hard "color-name@npm:1.1.3": version: 1.1.3 resolution: "color-name@npm:1.1.3" - checksum: 09c5d3e33d2105850153b14466501f2bfb30324a2f76568a408763a3b7433b0e50e5b4ab1947868e65cb101bb7cb75029553f2c333b6d4b8138a73fcc133d69d + checksum: 566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 languageName: node linkType: hard "color-name@npm:^1.1.4, color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" - checksum: b0445859521eb4021cd0fb0cc1a75cecf67fceecae89b63f62b201cca8d345baf8b952c966862a9d9a2632987d4f6581f0ec8d957dfacece86f0a7919316f610 + checksum: a1a3f914156960902f46f7f56bc62effc6c94e84b2cae157a526b1c1f74b677a47ec602bf68a61abfa2b42d15b7c5651c6dbe72a43af720bc588dff885b10f95 languageName: node linkType: hard -"color-support@npm:^1.1.3": +"color-support@npm:^1.1.2": version: 1.1.3 resolution: "color-support@npm:1.1.3" bin: color-support: bin.js - checksum: 9b7356817670b9a13a26ca5af1c21615463b500783b739b7634a0c2047c16cef4b2865d7576875c31c3cddf9dd621fa19285e628f20198b233a5cfdda6d0793b + checksum: 8ffeaa270a784dc382f62d9be0a98581db43e11eee301af14734a6d089bd456478b1a8b3e7db7ca7dc5b18a75f828f775c44074020b51c05fc00e6d0992b1cc6 languageName: node linkType: hard "colors@npm:~1.2.1": version: 1.2.5 resolution: "colors@npm:1.2.5" - checksum: b6e23de735f68b72d5cdf6fd854ca43d1b66d82dcf54bda0b788083b910164a040f2c4edf23c670d36a7a2d8f1b7d6e62e3292703e4642691e6ccaa1c62d8f74 + checksum: f4acebf2d2da9b4f8afb770361d14c01034bcb43add4cae493e7d186dcd7e0c5e2b440520fbfdf636e872606a0eb86b1f69fcf2f087df2876a4e222612539ee0 + languageName: node + linkType: hard + +"commander@npm:^11.0.0, commander@npm:^11.1.0": + version: 11.1.0 + resolution: "commander@npm:11.1.0" + checksum: 13cc6ac875e48780250f723fb81c1c1178d35c5decb1abb1b628b3177af08a8554e76b2c0f29de72d69eef7c864d12613272a71fabef8047922bc622ab75a179 languageName: node linkType: hard "commander@npm:^2.16.0, commander@npm:^2.20.3, commander@npm:^2.8.1": version: 2.20.3 resolution: "commander@npm:2.20.3" - checksum: ab8c07884e42c3a8dbc5dd9592c606176c7eb5c1ca5ff274bcf907039b2c41de3626f684ea75ccf4d361ba004bbaff1f577d5384c155f3871e456bdf27becf9e + checksum: 74c781a5248c2402a0a3e966a0a2bba3c054aad144f5c023364be83265e796b20565aa9feff624132ff629aa64e16999fa40a743c10c12f7c61e96a794b99288 languageName: node linkType: hard "commander@npm:^7.2.0": version: 7.2.0 resolution: "commander@npm:7.2.0" - checksum: 53501cbeee61d5157546c0bef0fedb6cdfc763a882136284bed9a07225f09a14b82d2a84e7637edfd1a679fb35ed9502fd58ef1d091e6287f60d790147f68ddc + checksum: 8d690ff13b0356df7e0ebbe6c59b4712f754f4b724d4f473d3cc5b3fdcf978e3a5dc3078717858a2ceb50b0f84d0660a7f22a96cdc50fb877d0c9bb31593d23a languageName: node linkType: hard -"commander@npm:^9.4.1": +"commander@npm:^9.4.1, commander@npm:^9.5.0": version: 9.5.0 resolution: "commander@npm:9.5.0" - checksum: c7a3e27aa59e913b54a1bafd366b88650bc41d6651f0cbe258d4ff09d43d6a7394232a4dadd0bf518b3e696fdf595db1028a0d82c785b88bd61f8a440cecfade + checksum: 5f7784fbda2aaec39e89eb46f06a999e00224b3763dc65976e05929ec486e174fe9aac2655f03ba6a5e83875bd173be5283dc19309b7c65954701c02025b3c1d languageName: node linkType: hard @@ -2513,52 +2727,52 @@ __metadata: version: 4.2.3 resolution: "comment-json@npm:4.2.3" dependencies: - array-timsort: ^1.0.3 - core-util-is: ^1.0.3 - esprima: ^4.0.1 - has-own-prop: ^2.0.0 - repeat-string: ^1.6.1 - checksum: 7f8d26266b0d49de9661f6365cbcc373fee4f4d0f422a203dfb17ad8f3d84c5be5ded444874935a197cd03cff297c53fe48910256cb4171cb2e52a3e6b9d317c + array-timsort: "npm:^1.0.3" + core-util-is: "npm:^1.0.3" + esprima: "npm:^4.0.1" + has-own-prop: "npm:^2.0.0" + repeat-string: "npm:^1.6.1" + checksum: e8a0d3a6d75d92551f9a7e6fefa31f3d831dc33117b0b9432f061f45a571c85c16143e4110693d450f6eca20841db43f5429ac0d801673bcf03e9973ab1c31af languageName: node linkType: hard "commitizen@npm:^4.0.3": - version: 4.2.6 - resolution: "commitizen@npm:4.2.6" - dependencies: - cachedir: 2.3.0 - cz-conventional-changelog: 3.3.0 - dedent: 0.7.0 - detect-indent: 6.1.0 - find-node-modules: ^2.1.2 - find-root: 1.1.0 - fs-extra: 9.1.0 - glob: 7.2.3 - inquirer: 8.2.4 - is-utf8: ^0.2.1 - lodash: 4.17.21 - minimist: 1.2.6 - strip-bom: 4.0.0 - strip-json-comments: 3.1.1 + version: 4.3.0 + resolution: "commitizen@npm:4.3.0" + dependencies: + cachedir: "npm:2.3.0" + cz-conventional-changelog: "npm:3.3.0" + dedent: "npm:0.7.0" + detect-indent: "npm:6.1.0" + find-node-modules: "npm:^2.1.2" + find-root: "npm:1.1.0" + fs-extra: "npm:9.1.0" + glob: "npm:7.2.3" + inquirer: "npm:8.2.5" + is-utf8: "npm:^0.2.1" + lodash: "npm:4.17.21" + minimist: "npm:1.2.7" + strip-bom: "npm:4.0.0" + strip-json-comments: "npm:3.1.1" bin: commitizen: bin/commitizen cz: bin/git-cz git-cz: bin/git-cz - checksum: 4423b25900a02d10e6a6aa98d58404bad0c0c2a68bbeff1ef2379c1ef04344a1fecdaaac3e773988d460de93c8ed4325d1afc186a01f904f7f27edcffcccfd49 + checksum: 889d2d28e3029e397a77ee05f123eab92148fa2880f904f973307a5156cb991e7361ff1e32ccf9608895672dced84a3038a9cafa7e687fbcaf4b2df1e4ae3142 languageName: node linkType: hard "common-path-prefix@npm:^3.0.0": version: 3.0.0 resolution: "common-path-prefix@npm:3.0.0" - checksum: fdb3c4f54e51e70d417ccd950c07f757582de800c0678ca388aedefefc84982039f346f9fd9a1252d08d2da9e9ef4019f580a1d1d3a10da031e4bb3c924c5818 + checksum: c4a74294e1b1570f4a8ab435285d185a03976c323caa16359053e749db4fde44e3e6586c29cd051100335e11895767cbbd27ea389108e327d62f38daf4548fdb languageName: node linkType: hard "commondir@npm:^1.0.1": version: 1.0.1 resolution: "commondir@npm:1.0.1" - checksum: 59715f2fc456a73f68826285718503340b9f0dd89bfffc42749906c5cf3d4277ef11ef1cca0350d0e79204f00f1f6d83851ececc9095dc88512a697ac0b9bdcb + checksum: 33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 languageName: node linkType: hard @@ -2566,16 +2780,16 @@ __metadata: version: 2.0.0 resolution: "compare-func@npm:2.0.0" dependencies: - array-ify: ^1.0.0 - dot-prop: ^5.1.0 - checksum: fb71d70632baa1e93283cf9d80f30ac97f003aabee026e0b4426c9716678079ef5fea7519b84d012cbed938c476493866a38a79760564a9e21ae9433e40e6f0d + array-ify: "npm:^1.0.0" + dot-prop: "npm:^5.1.0" + checksum: 78bd4dd4ed311a79bd264c9e13c36ed564cde657f1390e699e0f04b8eee1fc06ffb8698ce2dfb5fbe7342d509579c82d4e248f08915b708f77f7b72234086cc3 languageName: node linkType: hard "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" - checksum: 902a9f5d8967a3e2faf138d5cb784b9979bad2e6db5357c5b21c568df4ebe62bcb15108af1b2253744844eb964fc023fbd9afbbbb6ddd0bcc204c6fb5b7bf3af + checksum: c996b1cfdf95b6c90fee4dae37e332c8b6eb7d106430c17d538034c0ad9a1630cb194d2ab37293b1bdd4d779494beee7786d586a50bd9376fd6f7bcc2bd4c98f languageName: node linkType: hard @@ -2583,11 +2797,11 @@ __metadata: version: 2.0.0 resolution: "concat-stream@npm:2.0.0" dependencies: - buffer-from: ^1.0.0 - inherits: ^2.0.3 - readable-stream: ^3.0.2 - typedarray: ^0.0.6 - checksum: d7f75d48f0ecd356c1545d87e22f57b488172811b1181d96021c7c4b14ab8855f5313280263dca44bb06e5222f274d047da3e290a38841ef87b59719bde967c7 + buffer-from: "npm:^1.0.0" + inherits: "npm:^2.0.3" + readable-stream: "npm:^3.0.2" + typedarray: "npm:^0.0.6" + checksum: 29565dd9198fe1d8cf57f6cc71527dbc6ad67e12e4ac9401feb389c53042b2dceedf47034cbe702dfc4fd8df3ae7e6bfeeebe732cc4fa2674e484c13f04c219a languageName: node linkType: hard @@ -2595,36 +2809,35 @@ __metadata: version: 5.0.4 resolution: "concordance@npm:5.0.4" dependencies: - date-time: ^3.1.0 - esutils: ^2.0.3 - fast-diff: ^1.2.0 - js-string-escape: ^1.0.1 - lodash: ^4.17.15 - md5-hex: ^3.0.1 - semver: ^7.3.2 - well-known-symbols: ^2.0.0 - checksum: 749153ba711492feb7c3d2f5bb04c107157440b3e39509bd5dd19ee7b3ac751d1e4cd75796d9f702e0a713312dbc661421c68aa4a2c34d5f6d91f47e3a1c64a6 + date-time: "npm:^3.1.0" + esutils: "npm:^2.0.3" + fast-diff: "npm:^1.2.0" + js-string-escape: "npm:^1.0.1" + lodash: "npm:^4.17.15" + md5-hex: "npm:^3.0.1" + semver: "npm:^7.3.2" + well-known-symbols: "npm:^2.0.0" + checksum: 59b440f330df3a7c9aa148ba588b3e99aed86acab225b4f01ffcea34ace4cf11f817e31153254e8f38ed48508998dad40b9106951a743c334d751f7ab21afb8a languageName: node linkType: hard -"configstore@npm:^5.0.1": - version: 5.0.1 - resolution: "configstore@npm:5.0.1" +"configstore@npm:^6.0.0": + version: 6.0.0 + resolution: "configstore@npm:6.0.0" dependencies: - dot-prop: ^5.2.0 - graceful-fs: ^4.1.2 - make-dir: ^3.0.0 - unique-string: ^2.0.0 - write-file-atomic: ^3.0.0 - xdg-basedir: ^4.0.0 - checksum: 60ef65d493b63f96e14b11ba7ec072fdbf3d40110a94fb7199d1c287761bdea5c5244e76b2596325f30c1b652213aa75de96ea20afd4a5f82065e61ea090988e + dot-prop: "npm:^6.0.1" + graceful-fs: "npm:^4.2.6" + unique-string: "npm:^3.0.0" + write-file-atomic: "npm:^3.0.3" + xdg-basedir: "npm:^5.0.1" + checksum: 6681a96038ab3e0397cbdf55e6e1624ac3dfa3afe955e219f683df060188a418bda043c9114a59a337e7aec9562b0a0c838ed7db24289e6d0c266bc8313b9580 languageName: node linkType: hard -"console-control-strings@npm:^1.1.0": +"console-control-strings@npm:^1.0.0, console-control-strings@npm:^1.1.0": version: 1.1.0 resolution: "console-control-strings@npm:1.1.0" - checksum: 8755d76787f94e6cf79ce4666f0c5519906d7f5b02d4b884cf41e11dcd759ed69c57da0670afd9236d229a46e0f9cf519db0cd829c6dca820bb5a5c3def584ed + checksum: 7ab51d30b52d461412cd467721bb82afe695da78fff8f29fe6f6b9cbaac9a2328e27a22a966014df9532100f6dd85370460be8130b9c677891ba36d96a343f50 languageName: node linkType: hard @@ -2632,15 +2845,15 @@ __metadata: version: 0.5.4 resolution: "content-disposition@npm:0.5.4" dependencies: - safe-buffer: 5.2.1 - checksum: afb9d545e296a5171d7574fcad634b2fdf698875f4006a9dd04a3e1333880c5c0c98d47b560d01216fb6505a54a2ba6a843ee3a02ec86d7e911e8315255f56c3 + safe-buffer: "npm:5.2.1" + checksum: bac0316ebfeacb8f381b38285dc691c9939bf0a78b0b7c2d5758acadad242d04783cee5337ba7d12a565a19075af1b3c11c728e1e4946de73c6ff7ce45f3f1bb languageName: node linkType: hard "content-type@npm:~1.0.4": - version: 1.0.4 - resolution: "content-type@npm:1.0.4" - checksum: 3d93585fda985d1554eca5ebd251994327608d2e200978fdbfba21c0c679914d5faf266d17027de44b34a72c7b0745b18584ecccaa7e1fdfb6a68ac7114f12e0 + version: 1.0.5 + resolution: "content-type@npm:1.0.5" + checksum: b76ebed15c000aee4678c3707e0860cb6abd4e680a598c0a26e17f0bfae723ec9cc2802f0ff1bc6e4d80603719010431d2231018373d4dde10f9ccff9dadf5af languageName: node linkType: hard @@ -2648,9 +2861,9 @@ __metadata: version: 5.0.13 resolution: "conventional-changelog-angular@npm:5.0.13" dependencies: - compare-func: ^2.0.0 - q: ^1.5.1 - checksum: 6ed4972fce25a50f9f038c749cc9db501363131b0fb2efc1fccecba14e4b1c80651d0d758d4c350a609f32010c66fa343eefd49c02e79e911884be28f53f3f90 + compare-func: "npm:^2.0.0" + q: "npm:^1.5.1" + checksum: bca711b835fe01d75e3500b738f6525c91a12096218e917e9fd81bf9accf157f904fee16f88c523fd5462fb2a7cb1d060eb79e9bc9a3ccb04491f0c383b43231 languageName: node linkType: hard @@ -2658,8 +2871,8 @@ __metadata: version: 2.0.8 resolution: "conventional-changelog-atom@npm:2.0.8" dependencies: - q: ^1.5.1 - checksum: 12ecbd928f8c261f9afaac067fcc0cf10ff6ac8505e4285dc3d9959ee072a8937ac942d505e850dce27c4527046009adb22b498ba0b10802916d2c7d2dc1f7bc + q: "npm:^1.5.1" + checksum: 1c7e971e8ba58564397c2dfc9a7522f46bad315844ae782db66e27b2d584f22c21a757a429400657c2eef915690e8fd04bddfc3f8e9504d1fadccd8d0758217b languageName: node linkType: hard @@ -2667,15 +2880,15 @@ __metadata: version: 2.0.8 resolution: "conventional-changelog-codemirror@npm:2.0.8" dependencies: - q: ^1.5.1 - checksum: cf331db40cc54c2353b0189aba26a2b959cb08b059bf2a81245272027371519c9acc90d574295782985829c50f0c52da60c952c70ec6dbd70e9e17affeb61453 + q: "npm:^1.5.1" + checksum: 467c8c0daec0424acad6b30aa8897ea5e07c327352d3daae50f3a5427584bcb47d5ac5a3167eb7aeb818ebb856e2e81b19cab9a256fe6f21ad96e4a751599325 languageName: node linkType: hard "conventional-changelog-config-spec@npm:2.1.0": version: 2.1.0 resolution: "conventional-changelog-config-spec@npm:2.1.0" - checksum: 1c3bec23e3558e25ba0f2884ef1c1266afa70084f156b90045dde654504af3d8f3e88ad1c0dd6c1aaf2f394069d6e8b39da8cab319bc2d8ca0c80e8042a8a33c + checksum: 9448758697bbb1119df87815d8422940d14a656adb86e063c88d3d13533b61fb94a617cea7e6b58513640b6bd4c4a65af9cab63607cdcb971c405fb0b9256399 languageName: node linkType: hard @@ -2683,10 +2896,10 @@ __metadata: version: 4.6.3 resolution: "conventional-changelog-conventionalcommits@npm:4.6.3" dependencies: - compare-func: ^2.0.0 - lodash: ^4.17.15 - q: ^1.5.1 - checksum: 7b8e8a21ebb56f9aaa510e12917b7c609202072c3e71089e0a09630c37c2e8146cdb04364809839b0e3eb55f807fe84d03b2079500b37f6186d505848be5c562 + compare-func: "npm:^2.0.0" + lodash: "npm:^4.17.15" + q: "npm:^1.5.1" + checksum: f3b5e6132ec03dad4aa4a2b5ac47ee0e2ae8be6d0fa53a131c722412ce7c02a742c190790f15b5ab4983a31ce90b7066ce1f3f3d5cc4253aa3484ee414259bd2 languageName: node linkType: hard @@ -2694,21 +2907,21 @@ __metadata: version: 4.2.4 resolution: "conventional-changelog-core@npm:4.2.4" dependencies: - add-stream: ^1.0.0 - conventional-changelog-writer: ^5.0.0 - conventional-commits-parser: ^3.2.0 - dateformat: ^3.0.0 - get-pkg-repo: ^4.0.0 - git-raw-commits: ^2.0.8 - git-remote-origin-url: ^2.0.0 - git-semver-tags: ^4.1.1 - lodash: ^4.17.15 - normalize-package-data: ^3.0.0 - q: ^1.5.1 - read-pkg: ^3.0.0 - read-pkg-up: ^3.0.0 - through2: ^4.0.0 - checksum: 56d5194040495ea316e53fd64cb3614462c318f0fe54b1bf25aba6fba9b3d51cb9fdf7ac5b766f17e5529a3f90e317257394e00b0a9a5ce42caf3a59f82afb3a + add-stream: "npm:^1.0.0" + conventional-changelog-writer: "npm:^5.0.0" + conventional-commits-parser: "npm:^3.2.0" + dateformat: "npm:^3.0.0" + get-pkg-repo: "npm:^4.0.0" + git-raw-commits: "npm:^2.0.8" + git-remote-origin-url: "npm:^2.0.0" + git-semver-tags: "npm:^4.1.1" + lodash: "npm:^4.17.15" + normalize-package-data: "npm:^3.0.0" + q: "npm:^1.5.1" + read-pkg: "npm:^3.0.0" + read-pkg-up: "npm:^3.0.0" + through2: "npm:^4.0.0" + checksum: 4c9f30350250298d9bbb56988b3093ec7de593499a796609c5877115533362815434ff6df3493649e20b1b40399fef3d42032f39e8279bb8df192b89e6e32e69 languageName: node linkType: hard @@ -2716,8 +2929,8 @@ __metadata: version: 2.0.9 resolution: "conventional-changelog-ember@npm:2.0.9" dependencies: - q: ^1.5.1 - checksum: 30c7bd48ce995e39fc91bcd8c719b2bee10cb408c246a6a7de6cec44a3ca12afe5a86f57f55aa1fd2c64beb484c68013d16658047e6273f130c1c80e7dad38e9 + q: "npm:^1.5.1" + checksum: bc37a1ec320b56f9831ec6a156d77444743944cdc06ff23b1175a3a23063b907b31fad402566a281b722da1bc9fd687db993cc8dbe9a9baf6e38af24541ccfbc languageName: node linkType: hard @@ -2725,8 +2938,8 @@ __metadata: version: 3.0.9 resolution: "conventional-changelog-eslint@npm:3.0.9" dependencies: - q: ^1.5.1 - checksum: 402ae73a8c5390405d4f902819f630f56fa7dfa8f6bef77b3b5f2fb7c8bd17f64ad83edbacc030cfef5b84400ab722d4f166dd906296a4d286e66205c1bd8a3f + q: "npm:^1.5.1" + checksum: 340b3be510e6713e37f641f0efcb2d8d2bc0b2c1bc38e7c1e2107f69432606290661d43cbc5971b418dd87cd92c2acb86af857264643a607cd8f29887e28683d languageName: node linkType: hard @@ -2734,8 +2947,8 @@ __metadata: version: 2.0.6 resolution: "conventional-changelog-express@npm:2.0.6" dependencies: - q: ^1.5.1 - checksum: c139fa9878971455cce9904a195d92f770679d24a88ef07a016a6954e28f0f237ec59e45f2591b2fc9b8e10fd46c30150ddf0ce50a2cb03be85cae0ee64d4cdd + q: "npm:^1.5.1" + checksum: 11a02868847d7d1c585bd38cdd7e39636aefde3ef83138044d859d31c23afc1a82a3cab26c8b8aaae2f536b457b011232325c3ed3f2d6a9ec564522dae265ae2 languageName: node linkType: hard @@ -2743,8 +2956,8 @@ __metadata: version: 3.0.11 resolution: "conventional-changelog-jquery@npm:3.0.11" dependencies: - q: ^1.5.1 - checksum: df1145467c75e8e61f35ed24d7539e8b7dcdc810b86267b0173420c8955590cca139eb51f89ac255d70c632433d996b0ed227cb1acdf59537f3d2f4ad9c770d3 + q: "npm:^1.5.1" + checksum: 5662ff1bee271f6f7f2ca893b84942ec01e4a48299701b3323383dde3e461301c65f248dbcfa8219742258e96b1547ba5f21e66f4785fbc39cbe3074d46d71a4 languageName: node linkType: hard @@ -2752,16 +2965,16 @@ __metadata: version: 2.0.9 resolution: "conventional-changelog-jshint@npm:2.0.9" dependencies: - compare-func: ^2.0.0 - q: ^1.5.1 - checksum: ec96144b75fdb84c4a6f7db9b671dc258d964cd7aa35f9b00539e42bbe05601a9127c17cf0dcc315ae81a0dd20fe795d9d41dd90373928d24b33f065728eb2e2 + compare-func: "npm:^2.0.0" + q: "npm:^1.5.1" + checksum: 3048c3a02b173836f5c2f9c326bac7e80386e7591b9734d4f3a91e7dfe87329fde03414c62fdebe718a82f29e61b1122343186180e7173a47513487b3cfb463d languageName: node linkType: hard "conventional-changelog-preset-loader@npm:^2.3.4": version: 2.3.4 resolution: "conventional-changelog-preset-loader@npm:2.3.4" - checksum: 23a889b7fcf6fe7653e61f32a048877b2f954dcc1e0daa2848c5422eb908e6f24c78372f8d0d2130b5ed941c02e7010c599dccf44b8552602c6c8db9cb227453 + checksum: a978bcd5fc2eb12b56bc03ec59705af32e521fd27b98a209a26767c2078d423e7d8e30c09d45547371631790f0387453434c73c4541521a7473dce14d5360c7d languageName: node linkType: hard @@ -2769,18 +2982,18 @@ __metadata: version: 5.0.1 resolution: "conventional-changelog-writer@npm:5.0.1" dependencies: - conventional-commits-filter: ^2.0.7 - dateformat: ^3.0.0 - handlebars: ^4.7.7 - json-stringify-safe: ^5.0.1 - lodash: ^4.17.15 - meow: ^8.0.0 - semver: ^6.0.0 - split: ^1.0.0 - through2: ^4.0.0 + conventional-commits-filter: "npm:^2.0.7" + dateformat: "npm:^3.0.0" + handlebars: "npm:^4.7.7" + json-stringify-safe: "npm:^5.0.1" + lodash: "npm:^4.17.15" + meow: "npm:^8.0.0" + semver: "npm:^6.0.0" + split: "npm:^1.0.0" + through2: "npm:^4.0.0" bin: conventional-changelog-writer: cli.js - checksum: 5c0129db44577f14b1f8de225b62a392a9927ba7fe3422cb21ad71a771b8472bd03badb7c87cb47419913abc3f2ce3759b69f59550cdc6f7a7b0459015b3b44c + checksum: 268b56a3e4db07ad24da7134788c889ecd024cf2e7c0bfe8ca76f83e5db79f057538c45500b052a77b7933c4d0f47e2e807c6e756cbd5ad9db365744c9ce0e7f languageName: node linkType: hard @@ -2788,25 +3001,25 @@ __metadata: version: 3.1.25 resolution: "conventional-changelog@npm:3.1.25" dependencies: - conventional-changelog-angular: ^5.0.12 - conventional-changelog-atom: ^2.0.8 - conventional-changelog-codemirror: ^2.0.8 - conventional-changelog-conventionalcommits: ^4.5.0 - conventional-changelog-core: ^4.2.1 - conventional-changelog-ember: ^2.0.9 - conventional-changelog-eslint: ^3.0.9 - conventional-changelog-express: ^2.0.6 - conventional-changelog-jquery: ^3.0.11 - conventional-changelog-jshint: ^2.0.9 - conventional-changelog-preset-loader: ^2.3.4 - checksum: 1ea18378120cca9fd459f58ed2cf59170773cbfb2fcecad2504c7c44af076c368950013fa16f5e9428f1d723bea4c16e0c48170e152568b73b254a9c1bb93287 + conventional-changelog-angular: "npm:^5.0.12" + conventional-changelog-atom: "npm:^2.0.8" + conventional-changelog-codemirror: "npm:^2.0.8" + conventional-changelog-conventionalcommits: "npm:^4.5.0" + conventional-changelog-core: "npm:^4.2.1" + conventional-changelog-ember: "npm:^2.0.9" + conventional-changelog-eslint: "npm:^3.0.9" + conventional-changelog-express: "npm:^2.0.6" + conventional-changelog-jquery: "npm:^3.0.11" + conventional-changelog-jshint: "npm:^2.0.9" + conventional-changelog-preset-loader: "npm:^2.3.4" + checksum: 8065d5d742a400ab6d73ea5a42af746c3ec51e081e5ea542b00ebb220f904828002a04ae5841d5588a242773f8112f28bc353bf700fb0b2bda182fac6505c7a7 languageName: node linkType: hard "conventional-commit-types@npm:^3.0.0": version: 3.0.0 resolution: "conventional-commit-types@npm:3.0.0" - checksum: b9552de6a310c91a271ee57a890ed70d2d94340e710fc33856aaca5b24928fb2162f04dda5484d155b68c1fbaa042d904014d7fad0b6751a6d68052a0616015d + checksum: 609703fea60b55549de8ef07052a95a894b48cefa4d187f4500a632284f20e799becf18689689e9eccefc1457860d031c77600169e5df49c679d29ae436c3422 languageName: node linkType: hard @@ -2814,9 +3027,9 @@ __metadata: version: 2.0.7 resolution: "conventional-commits-filter@npm:2.0.7" dependencies: - lodash.ismatch: ^4.4.0 - modify-values: ^1.0.0 - checksum: feb567f680a6da1baaa1ef3cff393b3c56a5828f77ab9df5e70626475425d109a6fee0289b4979223c62bbd63bf9c98ef532baa6fcb1b66ee8b5f49077f5d46c + lodash.ismatch: "npm:^4.4.0" + modify-values: "npm:^1.0.0" + checksum: df06fb29285b473614f5094e983d26fcc14cd0f64b2cbb2f65493fc8bd47c077c2310791d26f4b2b719e9585aaade95370e73230bff6647163164a18b9dfaa07 languageName: node linkType: hard @@ -2824,15 +3037,15 @@ __metadata: version: 3.2.4 resolution: "conventional-commits-parser@npm:3.2.4" dependencies: - JSONStream: ^1.0.4 - is-text-path: ^1.0.1 - lodash: ^4.17.15 - meow: ^8.0.0 - split2: ^3.0.0 - through2: ^4.0.0 + JSONStream: "npm:^1.0.4" + is-text-path: "npm:^1.0.1" + lodash: "npm:^4.17.15" + meow: "npm:^8.0.0" + split2: "npm:^3.0.0" + through2: "npm:^4.0.0" bin: conventional-commits-parser: cli.js - checksum: 1627ff203bc9586d89e47a7fe63acecf339aba74903b9114e23d28094f79d4e2d6389bf146ae561461dcba8fc42e7bc228165d2b173f15756c43f1d32bc50bfd + checksum: 122d7d7f991a04c8e3f703c0e4e9a25b2ecb20906f497e4486cb5c2acd9c68f6d9af745f7e79cb407538f50e840b33399274ac427b20971b98b335d1b66d3d17 languageName: node linkType: hard @@ -2840,132 +3053,121 @@ __metadata: version: 6.1.0 resolution: "conventional-recommended-bump@npm:6.1.0" dependencies: - concat-stream: ^2.0.0 - conventional-changelog-preset-loader: ^2.3.4 - conventional-commits-filter: ^2.0.7 - conventional-commits-parser: ^3.2.0 - git-raw-commits: ^2.0.8 - git-semver-tags: ^4.1.1 - meow: ^8.0.0 - q: ^1.5.1 + concat-stream: "npm:^2.0.0" + conventional-changelog-preset-loader: "npm:^2.3.4" + conventional-commits-filter: "npm:^2.0.7" + conventional-commits-parser: "npm:^3.2.0" + git-raw-commits: "npm:^2.0.8" + git-semver-tags: "npm:^4.1.1" + meow: "npm:^8.0.0" + q: "npm:^1.5.1" bin: conventional-recommended-bump: cli.js - checksum: da1d7a5f3b9f7706bede685cdcb3db67997fdaa43c310fd5bf340955c84a4b85dbb9427031522ee06dad290b730a54be987b08629d79c73720dbad3a2531146b + checksum: 649e6230be7e96e057a542a2695710aeaee356297d307691b3398e0f18d596b4a5b3ba56307755e779d8687a13b2466844300c649eb23f44fe5f1db9f923f3f4 languageName: node linkType: hard -"convert-source-map@npm:^1.6.0": - version: 1.9.0 - resolution: "convert-source-map@npm:1.9.0" - checksum: dc55a1f28ddd0e9485ef13565f8f756b342f9a46c4ae18b843fe3c30c675d058d6a4823eff86d472f187b176f0adf51ea7b69ea38be34be4a63cbbf91b0593c8 +"convert-source-map@npm:^2.0.0": + version: 2.0.0 + resolution: "convert-source-map@npm:2.0.0" + checksum: 8f2f7a27a1a011cc6cc88cc4da2d7d0cfa5ee0369508baae3d98c260bb3ac520691464e5bbe4ae7cdf09860c1d69ecc6f70c63c6e7c7f7e3f18ec08484dc7d9b languageName: node linkType: hard "convert-to-spaces@npm:^2.0.1": version: 2.0.1 resolution: "convert-to-spaces@npm:2.0.1" - checksum: bbb324e5916fe9866f65c0ff5f9c1ea933764d0bdb09fccaf59542e40545ed483db6b2339c6d9eb56a11965a58f1a6038f3174f0e2fb7601343c7107ca5e2751 + checksum: d90aa0e3b6a27f9d5265a8d32def3c5c855b3e823a9db1f26d772f8146d6b91020a2fdfd905ce8048a73fad3aaf836fef8188c67602c374405e2ae8396c4ac46 languageName: node linkType: hard "cookie-signature@npm:1.0.6": version: 1.0.6 resolution: "cookie-signature@npm:1.0.6" - checksum: f4e1b0a98a27a0e6e66fd7ea4e4e9d8e038f624058371bf4499cfcd8f3980be9a121486995202ba3fca74fbed93a407d6d54d43a43f96fd28d0bd7a06761591a + checksum: b36fd0d4e3fef8456915fcf7742e58fbfcc12a17a018e0eb9501c9d5ef6893b596466f03b0564b81af29ff2538fd0aa4b9d54fe5ccbfb4c90ea50ad29fe2d221 languageName: node linkType: hard "cookie@npm:0.5.0": version: 0.5.0 resolution: "cookie@npm:0.5.0" - checksum: 1f4bd2ca5765f8c9689a7e8954183f5332139eb72b6ff783d8947032ec1fdf43109852c178e21a953a30c0dd42257828185be01b49d1eb1a67fd054ca588a180 + checksum: c01ca3ef8d7b8187bae434434582288681273b5a9ed27521d4d7f9f7928fe0c920df0decd9f9d3bbd2d14ac432b8c8cf42b98b3bdd5bfe0e6edddeebebe8b61d languageName: node linkType: hard "core-util-is@npm:^1.0.3, core-util-is@npm:~1.0.0": version: 1.0.3 resolution: "core-util-is@npm:1.0.3" - checksum: 9de8597363a8e9b9952491ebe18167e3b36e7707569eed0ebf14f8bba773611376466ae34575bca8cfe3c767890c859c74056084738f09d4e4a6f902b2ad7d99 + checksum: 90a0e40abbddfd7618f8ccd63a74d88deea94e77d0e8dbbea059fa7ebebb8fbb4e2909667fe26f3a467073de1a542ebe6ae4c73a73745ac5833786759cd906c9 languageName: node linkType: hard -"cosmiconfig-typescript-loader@npm:^4.0.0": - version: 4.3.0 - resolution: "cosmiconfig-typescript-loader@npm:4.3.0" +"cosmiconfig-typescript-loader@npm:^5.0.0": + version: 5.0.0 + resolution: "cosmiconfig-typescript-loader@npm:5.0.0" + dependencies: + jiti: "npm:^1.19.1" peerDependencies: "@types/node": "*" - cosmiconfig: ">=7" - ts-node: ">=10" - typescript: ">=3" - checksum: ea61dfd8e112cf2bb18df0ef89280bd3ae3dd5b997b4a9fc22bbabdc02513aadfbc6d4e15e922b6a9a5d987e9dad42286fa38caf77a9b8dcdbe7d4ce1c9db4fb + cosmiconfig: ">=8.2" + typescript: ">=4" + checksum: 0eb1a767a589cf092e68729e184d5917ae0b167b6f5d908bc58cee221d66b937430fc58df64029795ef98bb8e85c575da6e3819c5f9679c721de7bdbb4bde719 languageName: node linkType: hard -"cosmiconfig@npm:8.0.0, cosmiconfig@npm:^8.0.0": - version: 8.0.0 - resolution: "cosmiconfig@npm:8.0.0" +"cosmiconfig@npm:^8.3.6": + version: 8.3.6 + resolution: "cosmiconfig@npm:8.3.6" dependencies: - import-fresh: ^3.2.1 - js-yaml: ^4.1.0 - parse-json: ^5.0.0 - path-type: ^4.0.0 - checksum: ff4cdf89ac1ae52e7520816622c21a9e04380d04b82d653f5139ec581aa4f7f29e096d46770bc76c4a63c225367e88a1dfa233ea791669a35101f5f9b972c7d1 + import-fresh: "npm:^3.3.0" + js-yaml: "npm:^4.1.0" + parse-json: "npm:^5.2.0" + path-type: "npm:^4.0.0" + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: 0382a9ed13208f8bfc22ca2f62b364855207dffdb73dc26e150ade78c3093f1cf56172df2dd460c8caf2afa91c0ed4ec8a88c62f8f9cd1cf423d26506aa8797a languageName: node linkType: hard -"cp-file@npm:^9.1.0": - version: 9.1.0 - resolution: "cp-file@npm:9.1.0" +"cp-file@npm:^10.0.0": + version: 10.0.0 + resolution: "cp-file@npm:10.0.0" dependencies: - graceful-fs: ^4.1.2 - make-dir: ^3.0.0 - nested-error-stacks: ^2.0.0 - p-event: ^4.1.0 - checksum: 0ba0fb568baf502676fe15d0869f06703fc108d892bc2dd42097f9019c0215b83b4663b0ee4af5c1048c6d52530c67dfcfe855474be3532b559c4e0f549acb7a + graceful-fs: "npm:^4.2.10" + nested-error-stacks: "npm:^2.1.1" + p-event: "npm:^5.0.1" + checksum: acff14b4d267c4179daa4fb913b974d9e6a3d9de9a55283712eaf7c8e05488cd50214d58173d38e0cb5b8111773afbd7755fe912d4147862009d695a51db7393 languageName: node linkType: hard -"cpy-cli@npm:^4.2.0": - version: 4.2.0 - resolution: "cpy-cli@npm:4.2.0" +"cpy-cli@npm:^5.0.0": + version: 5.0.0 + resolution: "cpy-cli@npm:5.0.0" dependencies: - cpy: ^9.0.0 - meow: ^10.1.2 + cpy: "npm:^10.1.0" + meow: "npm:^12.0.1" bin: cpy: cli.js - checksum: 883b142133fad9b57f10cf36483870c28e99bff34d4c166946e7bc26de1ec2786fca2e5102a061f7ff1fc73e5beaf90191f8a72eabdc3a4c97bd7f93e1fd793e - languageName: node - linkType: hard - -"cpy@npm:^9.0.0": - version: 9.0.1 - resolution: "cpy@npm:9.0.1" - dependencies: - arrify: ^3.0.0 - cp-file: ^9.1.0 - globby: ^13.1.1 - junk: ^4.0.0 - micromatch: ^4.0.4 - nested-error-stacks: ^2.1.0 - p-filter: ^3.0.0 - p-map: ^5.3.0 - checksum: 5139dfc07d181caefe3ec62c956340a1d02c4afeb794f8c199ddfc7e0cb0bdf5f5e4989ec08d6c07984be119bbb07eb323f21e8edb0733051ddf125a1084b565 - languageName: node - linkType: hard - -"create-require@npm:^1.1.0": - version: 1.1.1 - resolution: "create-require@npm:1.1.1" - checksum: a9a1503d4390d8b59ad86f4607de7870b39cad43d929813599a23714831e81c520bddf61bcdd1f8e30f05fd3a2b71ae8538e946eb2786dc65c2bbc520f692eff + checksum: f309f2c2ee4d38a830154fb08e2b6485c621cca73b48c61ba43a0a4b9d49d4c011b8a71d31a48edf0379e0b48325ebf8f436a82f783a4a0e751addd641b65eb8 languageName: node linkType: hard -"cross-fetch@npm:3.1.5": - version: 3.1.5 - resolution: "cross-fetch@npm:3.1.5" +"cpy@npm:^10.1.0": + version: 10.1.0 + resolution: "cpy@npm:10.1.0" dependencies: - node-fetch: 2.6.7 - checksum: f6b8c6ee3ef993ace6277fd789c71b6acf1b504fd5f5c7128df4ef2f125a429e29cd62dc8c127523f04a5f2fa4771ed80e3f3d9695617f441425045f505cf3bb + arrify: "npm:^3.0.0" + cp-file: "npm:^10.0.0" + globby: "npm:^13.1.4" + junk: "npm:^4.0.1" + micromatch: "npm:^4.0.5" + nested-error-stacks: "npm:^2.1.1" + p-filter: "npm:^3.0.0" + p-map: "npm:^6.0.0" + checksum: 17ba53784c7da2b7d6c74cf38b84dc4fd3ff036842d7137fb66538715b6ad2436cebb56284570ec532022ebe677da9a3faa5525299aef126c60d1789ae89fa3b languageName: node linkType: hard @@ -2973,17 +3175,10 @@ __metadata: version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: - path-key: ^3.1.0 - shebang-command: ^2.0.0 - which: ^2.0.1 - checksum: 671cc7c7288c3a8406f3c69a3ae2fc85555c04169e9d611def9a675635472614f1c0ed0ef80955d5b6d4e724f6ced67f0ad1bb006c2ea643488fcfef994d7f52 - languageName: node - linkType: hard - -"crypto-random-string@npm:^2.0.0": - version: 2.0.0 - resolution: "crypto-random-string@npm:2.0.0" - checksum: 0283879f55e7c16fdceacc181f87a0a65c53bc16ffe1d58b9d19a6277adcd71900d02bb2c4843dd55e78c51e30e89b0fec618a7f170ebcc95b33182c28f05fd6 + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 languageName: node linkType: hard @@ -2991,131 +3186,143 @@ __metadata: version: 4.0.0 resolution: "crypto-random-string@npm:4.0.0" dependencies: - type-fest: ^1.0.1 - checksum: 91f148f27bcc8582798f0fb3e75a09d9174557f39c3c40a89dd1bd70fb5a14a02548245aa26fa7d663c426ac5026f4729841231c84f9e30e8c8ece5e38656741 - languageName: node - linkType: hard - -"cspell-dictionary@npm:6.18.1": - version: 6.18.1 - resolution: "cspell-dictionary@npm:6.18.1" - dependencies: - "@cspell/cspell-pipe": 6.18.1 - "@cspell/cspell-types": 6.18.1 - cspell-trie-lib: 6.18.1 - fast-equals: ^4.0.3 - gensequence: ^4.0.3 - checksum: f6c90ba9356fcf61361474126588988b5cd535b21751ced7b8af64e22eff33a53459b89ba7d54a80a7f8fe6babd59c6224e334bdf734c17a9ad85d09387908a1 + type-fest: "npm:^1.0.1" + checksum: 16e11a3c8140398f5408b7fded35a961b9423c5dac39a60cbbd08bd3f0e07d7de130e87262adea7db03ec1a7a4b7551054e0db07ee5408b012bac5400cfc07a5 languageName: node linkType: hard -"cspell-gitignore@npm:6.18.1": - version: 6.18.1 - resolution: "cspell-gitignore@npm:6.18.1" +"cspell-config-lib@npm:8.3.2": + version: 8.3.2 + resolution: "cspell-config-lib@npm:8.3.2" dependencies: - cspell-glob: 6.18.1 - find-up: ^5.0.0 - bin: - cspell-gitignore: bin.js - checksum: f9b3141fbe435fdd7003bc3ba3586bfc40ac304d6cc44c19326660e678cc251379e7c2bd689a6ea985be743ca840bb56f58b41d9e3d3bf847bfe064b63ff883b + "@cspell/cspell-types": "npm:8.3.2" + comment-json: "npm:^4.2.3" + yaml: "npm:^2.3.4" + checksum: 96358891b869860eff302345fb5166bfb763520b31bb54ef5118cc70abb46fb269697c51ce4918a836712ceeb8f2af01e003ace8e2014a2afe6039ac1c189ea2 languageName: node linkType: hard -"cspell-glob@npm:6.18.1": - version: 6.18.1 - resolution: "cspell-glob@npm:6.18.1" +"cspell-dictionary@npm:8.3.2": + version: 8.3.2 + resolution: "cspell-dictionary@npm:8.3.2" dependencies: - micromatch: ^4.0.5 - checksum: d2ffde4df6dc41b0ae728b96dab45db0b908deac143928ac5f028e0c02b2beae6c7dd6a105d79e05ad54cd2ff0d845dde27d17dbbaf4230ad9af185258b7f861 + "@cspell/cspell-pipe": "npm:8.3.2" + "@cspell/cspell-types": "npm:8.3.2" + cspell-trie-lib: "npm:8.3.2" + fast-equals: "npm:^5.0.1" + gensequence: "npm:^6.0.0" + checksum: 355cbe0cecedf1e975dc341735314bbc858d4e63bbec11c7ebbde2ae8f41e8c1947af360f4df0b7ec5adc44b0a4816f1c7f514fab55d732f89c6fbd33cfe972d languageName: node linkType: hard -"cspell-grammar@npm:6.18.1": - version: 6.18.1 - resolution: "cspell-grammar@npm:6.18.1" +"cspell-gitignore@npm:8.3.2": + version: 8.3.2 + resolution: "cspell-gitignore@npm:8.3.2" dependencies: - "@cspell/cspell-pipe": 6.18.1 - "@cspell/cspell-types": 6.18.1 + cspell-glob: "npm:8.3.2" + find-up-simple: "npm:^1.0.0" bin: - cspell-grammar: bin.js - checksum: fc7120d20ea5e04df9b35f28502d6d550a1a1b298ab1cda56a3bf302ea85fafeeb8aff19d3f4411ba950b9ff1ae26b23d6de9ceab39217dc04ea144cbcd33e5b + cspell-gitignore: bin.mjs + checksum: ffd85846108020347dd59476c7a0763212421d7c2a4e2feab4428f25d516b72b2d5751eb6f39f27a7cc7b8182b198fa91b6ef2af1942a551f481a5570404250f languageName: node linkType: hard -"cspell-io@npm:6.18.1": - version: 6.18.1 - resolution: "cspell-io@npm:6.18.1" +"cspell-glob@npm:8.3.2": + version: 8.3.2 + resolution: "cspell-glob@npm:8.3.2" dependencies: - "@cspell/cspell-service-bus": 6.18.1 - node-fetch: ^2.6.7 - checksum: 1374c78d8a091a14684b1c0fbf6fb84fdabe28430ad9282f0111d2de8c04d261bf809c9c8f8deaa4628f6db63ae93247a532b093ec13771a2ecd10d6fb696313 + micromatch: "npm:^4.0.5" + checksum: 8c7e43f45ff3801dfa733518e61de01b24ccc89a102c5d41da8f4c5092454ee8659945b2c418d81a3527c420269ef4b469123a71325f4034a03e5da1c4c59e86 languageName: node linkType: hard -"cspell-lib@npm:6.18.1": - version: 6.18.1 - resolution: "cspell-lib@npm:6.18.1" - dependencies: - "@cspell/cspell-bundled-dicts": 6.18.1 - "@cspell/cspell-pipe": 6.18.1 - "@cspell/cspell-types": 6.18.1 - "@cspell/strong-weak-map": 6.18.1 - clear-module: ^4.1.2 - comment-json: ^4.2.3 - configstore: ^5.0.1 - cosmiconfig: ^8.0.0 - cspell-dictionary: 6.18.1 - cspell-glob: 6.18.1 - cspell-grammar: 6.18.1 - cspell-io: 6.18.1 - cspell-trie-lib: 6.18.1 - fast-equals: ^4.0.3 - find-up: ^5.0.0 - fs-extra: ^11.1.0 - gensequence: ^4.0.3 - import-fresh: ^3.3.0 - resolve-from: ^5.0.0 - resolve-global: ^1.0.0 - vscode-languageserver-textdocument: ^1.0.8 - vscode-uri: ^3.0.7 - checksum: 4927cb1f06af6046972e00a3178e10be1c53f519c49be2aaabd4d9339e0cb302420268022a4f0d7fd2781f45af67cb3e449355bc489f188026d5bebc43cbb78c - languageName: node - linkType: hard - -"cspell-trie-lib@npm:6.18.1": - version: 6.18.1 - resolution: "cspell-trie-lib@npm:6.18.1" +"cspell-grammar@npm:8.3.2": + version: 8.3.2 + resolution: "cspell-grammar@npm:8.3.2" dependencies: - "@cspell/cspell-pipe": 6.18.1 - "@cspell/cspell-types": 6.18.1 - fs-extra: ^11.1.0 - gensequence: ^4.0.3 - checksum: 11916cec6e23e971f18e84678b306fcb630cbd6b459d392cf888841b234ade665dd053cc1b5a692b7341c33f3c3abd5966ed48ee6df82fa4a26569dcc1b4b179 - languageName: node - linkType: hard - -"cspell@npm:^6.18.1": - version: 6.18.1 - resolution: "cspell@npm:6.18.1" - dependencies: - "@cspell/cspell-pipe": 6.18.1 - chalk: ^4.1.2 - commander: ^9.4.1 - cspell-gitignore: 6.18.1 - cspell-glob: 6.18.1 - cspell-lib: 6.18.1 - fast-json-stable-stringify: ^2.1.0 - file-entry-cache: ^6.0.1 - fs-extra: ^11.1.0 - get-stdin: ^8.0.0 - glob: ^8.0.3 - imurmurhash: ^0.1.4 - semver: ^7.3.8 - strip-ansi: ^6.0.1 - vscode-uri: ^3.0.7 + "@cspell/cspell-pipe": "npm:8.3.2" + "@cspell/cspell-types": "npm:8.3.2" + bin: + cspell-grammar: bin.mjs + checksum: 5298c7319a28eb5746c6842157cea1f6d760b1846745c07a056515c66fc29572e4d6f0a3700b6eb9ef212e532a8ebe539d06e1249186a5f91e625c5069ad645f + languageName: node + linkType: hard + +"cspell-io@npm:8.3.2": + version: 8.3.2 + resolution: "cspell-io@npm:8.3.2" + dependencies: + "@cspell/cspell-service-bus": "npm:8.3.2" + checksum: c402c4bcbf4d3a596dd8b202c5628c379c114346723fd07462bd5909739eaa85e95c82420f6eb1bbe878ffd6896c366ca855ea609b561bbfdbbf317f5a25e713 + languageName: node + linkType: hard + +"cspell-lib@npm:8.3.2": + version: 8.3.2 + resolution: "cspell-lib@npm:8.3.2" + dependencies: + "@cspell/cspell-bundled-dicts": "npm:8.3.2" + "@cspell/cspell-pipe": "npm:8.3.2" + "@cspell/cspell-resolver": "npm:8.3.2" + "@cspell/cspell-types": "npm:8.3.2" + "@cspell/dynamic-import": "npm:8.3.2" + "@cspell/strong-weak-map": "npm:8.3.2" + clear-module: "npm:^4.1.2" + comment-json: "npm:^4.2.3" + configstore: "npm:^6.0.0" + cspell-config-lib: "npm:8.3.2" + cspell-dictionary: "npm:8.3.2" + cspell-glob: "npm:8.3.2" + cspell-grammar: "npm:8.3.2" + cspell-io: "npm:8.3.2" + cspell-trie-lib: "npm:8.3.2" + fast-equals: "npm:^5.0.1" + gensequence: "npm:^6.0.0" + import-fresh: "npm:^3.3.0" + resolve-from: "npm:^5.0.0" + vscode-languageserver-textdocument: "npm:^1.0.11" + vscode-uri: "npm:^3.0.8" + checksum: 6bd6f3fd376755217999488accebb3f4b11419c043816c697a53dd73fe94442a8386d647a08708015a4af1222343706459f16b87d52dabea151b3215a16251f1 + languageName: node + linkType: hard + +"cspell-trie-lib@npm:8.3.2": + version: 8.3.2 + resolution: "cspell-trie-lib@npm:8.3.2" + dependencies: + "@cspell/cspell-pipe": "npm:8.3.2" + "@cspell/cspell-types": "npm:8.3.2" + gensequence: "npm:^6.0.0" + checksum: c2e74b2fe1f99fbe4cc35cd5d933926936432dd7ab261580f04b6dba91c9e24ce123f5a10e600e346ee370130a3179a79690d9f388757333f20898ccf77aaa0d + languageName: node + linkType: hard + +"cspell@npm:^8.3.2": + version: 8.3.2 + resolution: "cspell@npm:8.3.2" + dependencies: + "@cspell/cspell-json-reporter": "npm:8.3.2" + "@cspell/cspell-pipe": "npm:8.3.2" + "@cspell/cspell-types": "npm:8.3.2" + "@cspell/dynamic-import": "npm:8.3.2" + chalk: "npm:^5.3.0" + chalk-template: "npm:^1.1.0" + commander: "npm:^11.1.0" + cspell-gitignore: "npm:8.3.2" + cspell-glob: "npm:8.3.2" + cspell-io: "npm:8.3.2" + cspell-lib: "npm:8.3.2" + fast-glob: "npm:^3.3.2" + fast-json-stable-stringify: "npm:^2.1.0" + file-entry-cache: "npm:^8.0.0" + get-stdin: "npm:^9.0.0" + semver: "npm:^7.5.4" + strip-ansi: "npm:^7.1.0" + vscode-uri: "npm:^3.0.8" bin: - cspell: bin.js - checksum: 44cda81bd43d8453f4f081d63203290f84356c573e6e09a40a63c690367071cb5b2a335881c627d537df6cf9f39da93ffab1153dd46b715e5d257418bf4275fe + cspell: bin.mjs + cspell-esm: bin.mjs + checksum: ca181c535dfd260c647ec6b8e248c584e1f2197492e3152b0c05a526d37a59d9d57ea669e9425552fca78dd2c1d2f741193b37e20d7e2d45d30f054216c2b7ec languageName: node linkType: hard @@ -3123,8 +3330,8 @@ __metadata: version: 0.4.1 resolution: "currently-unhandled@npm:0.4.1" dependencies: - array-find-index: ^1.0.1 - checksum: 1f59fe10b5339b54b1a1eee110022f663f3495cf7cf2f480686e89edc7fa8bfe42dbab4b54f85034bc8b092a76cc7becbc2dad4f9adad332ab5831bec39ad540 + array-find-index: "npm:^1.0.1" + checksum: 32d197689ec32f035910202c1abb0dc6424dce01d7b51779c685119b380d98535c110ffff67a262fc7e367612a7dfd30d3d3055f9a6634b5a9dd1302de7ef11c languageName: node linkType: hard @@ -3132,24 +3339,24 @@ __metadata: version: 3.3.0 resolution: "cz-conventional-changelog@npm:3.3.0" dependencies: - "@commitlint/load": ">6.1.1" - chalk: ^2.4.1 - commitizen: ^4.0.3 - conventional-commit-types: ^3.0.0 - lodash.map: ^4.5.1 - longest: ^2.0.1 - word-wrap: ^1.0.3 + "@commitlint/load": "npm:>6.1.1" + chalk: "npm:^2.4.1" + commitizen: "npm:^4.0.3" + conventional-commit-types: "npm:^3.0.0" + lodash.map: "npm:^4.5.1" + longest: "npm:^2.0.1" + word-wrap: "npm:^1.0.3" dependenciesMeta: "@commitlint/load": optional: true - checksum: 8b766712092142ecec86c5c8a2a7206d0b2da46ae16e137303c6d75b42c048acd831c734fd542b9c3cbeb0fd8e7d1f5391494ed629dfba4459fee2d6f5d2c0ca + checksum: 895d64bb60b7014ec98fdbc211b454e3a1d585b10a818a4a3cf4c0f4b8576712d2daf4f8eb670e6c68e10bbb72ed73ab73b1a9e4673be41405591454e5bf5734 languageName: node linkType: hard "dargs@npm:^7.0.0": version: 7.0.0 resolution: "dargs@npm:7.0.0" - checksum: b8f1e3cba59c42e1f13a114ad4848c3fc1cf7470f633ee9e9f1043762429bc97d91ae31b826fb135eefde203a3fdb20deb0c0a0222ac29d937b8046085d668d1 + checksum: ec7f6a8315a8fa2f8b12d39207615bdf62b4d01f631b96fbe536c8ad5469ab9ed710d55811e564d0d5c1d548fc8cb6cc70bf0939f2415790159f5a75e0f96c92 languageName: node linkType: hard @@ -3157,36 +3364,36 @@ __metadata: version: 3.1.0 resolution: "date-time@npm:3.1.0" dependencies: - time-zone: ^1.0.0 - checksum: f9cfcd1b15dfeabab15c0b9d18eb9e4e2d9d4371713564178d46a8f91ad577a290b5178b80050718d02d9c0cf646f8a875011e12d1ed05871e9f72c72c8a8fe6 + time-zone: "npm:^1.0.0" + checksum: aa3e2e930d74b0b9e90f69de7a16d3376e30f21f1f4ce9a2311d8fec32d760e776efea752dafad0ce188187265235229013036202be053fc2d7979813bfb6ded languageName: node linkType: hard "dateformat@npm:^3.0.0": version: 3.0.3 resolution: "dateformat@npm:3.0.3" - checksum: ca4911148abb09887bd9bdcd632c399b06f3ecad709a18eb594d289a1031982f441e08e281db77ffebcb2cbcbfa1ac578a7cbfbf8743f41009aa5adc1846ed34 + checksum: 2effb8bef52ff912f87a05e4adbeacff46353e91313ad1ea9ed31412db26849f5a0fcc7e3ce36dbfb84fc6c881a986d5694f84838ad0da7000d5150693e78678 languageName: node linkType: hard -"debug@npm:2.6.9, debug@npm:^2.2.0, debug@npm:^2.6.9": +"debug@npm:2.6.9, debug@npm:^2.2.0": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: - ms: 2.0.0 - checksum: d2f51589ca66df60bf36e1fa6e4386b318c3f1e06772280eea5b1ae9fd3d05e9c2b7fd8a7d862457d00853c75b00451aa2d7459b924629ee385287a650f58fe6 + ms: "npm:2.0.0" + checksum: 121908fb839f7801180b69a7e218a40b5a0b718813b886b7d6bdb82001b931c938e2941d1e4450f33a1b1df1da653f5f7a0440c197f29fbf8a6e9d45ff6ef589 languageName: node linkType: hard -"debug@npm:4, debug@npm:4.3.4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": +"debug@npm:4, debug@npm:^4.0.0, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: - ms: 2.1.2 + ms: "npm:2.1.2" peerDependenciesMeta: supports-color: optional: true - checksum: 3dbad3f94ea64f34431a9cbf0bafb61853eda57bff2880036153438f50fb5a84f27683ba0d8e5426bf41a8c6ff03879488120cf5b3a761e77953169c0600a708 + checksum: cedbec45298dd5c501d01b92b119cd3faebe5438c3917ff11ae1bff86a6c722930ac9c8659792824013168ba6db7c4668225d845c633fbdafbbf902a6389f736 languageName: node linkType: hard @@ -3194,8 +3401,8 @@ __metadata: version: 3.2.7 resolution: "debug@npm:3.2.7" dependencies: - ms: ^2.1.1 - checksum: b3d8c5940799914d30314b7c3304a43305fd0715581a919dacb8b3176d024a782062368405b47491516d2091d6462d4d11f2f4974a405048094f8bfebfa3071c + ms: "npm:^2.1.1" + checksum: 37d96ae42cbc71c14844d2ae3ba55adf462ec89fd3a999459dec3833944cd999af6007ff29c780f1c61153bcaaf2c842d1e4ce1ec621e4fc4923244942e4a02a languageName: node linkType: hard @@ -3203,58 +3410,68 @@ __metadata: version: 1.1.1 resolution: "decamelize-keys@npm:1.1.1" dependencies: - decamelize: ^1.1.0 - map-obj: ^1.0.0 - checksum: fc645fe20b7bda2680bbf9481a3477257a7f9304b1691036092b97ab04c0ab53e3bf9fcc2d2ae382536568e402ec41fb11e1d4c3836a9abe2d813dd9ef4311e0 + decamelize: "npm:^1.1.0" + map-obj: "npm:^1.0.0" + checksum: 4ca385933127437658338c65fb9aead5f21b28d3dd3ccd7956eb29aab0953b5d3c047fbc207111672220c71ecf7a4d34f36c92851b7bbde6fca1a02c541bdd7d languageName: node linkType: hard "decamelize@npm:^1.1.0": version: 1.2.0 resolution: "decamelize@npm:1.2.0" - checksum: ad8c51a7e7e0720c70ec2eeb1163b66da03e7616d7b98c9ef43cce2416395e84c1e9548dd94f5f6ffecfee9f8b94251fc57121a8b021f2ff2469b2bae247b8aa - languageName: node - linkType: hard - -"decamelize@npm:^5.0.0": - version: 5.0.1 - resolution: "decamelize@npm:5.0.1" - checksum: 7c3b1ed4b3e60e7fbc00a35fb248298527c1cdfe603e41dfcf05e6c4a8cb9efbee60630deb677ed428908fb4e74e322966c687a094d1478ddc9c3a74e9dc7140 + checksum: 85c39fe8fbf0482d4a1e224ef0119db5c1897f8503bcef8b826adff7a1b11414972f6fef2d7dec2ee0b4be3863cf64ac1439137ae9e6af23a3d8dcbe26a5b4b2 languageName: node linkType: hard "dedent@npm:0.7.0": version: 0.7.0 resolution: "dedent@npm:0.7.0" - checksum: 87de191050d9a40dd70cad01159a0bcf05ecb59750951242070b6abf9569088684880d00ba92a955b4058804f16eeaf91d604f283929b4f614d181cd7ae633d2 + checksum: 7c3aa00ddfe3e5fcd477958e156156a5137e3bb6ff1493ca05edff4decf29a90a057974cc77e75951f8eb801c1816cb45aea1f52d628cdd000b82b36ab839d1b languageName: node linkType: hard "deep-extend@npm:^0.6.0": version: 0.6.0 resolution: "deep-extend@npm:0.6.0" - checksum: 7be7e5a8d468d6b10e6a67c3de828f55001b6eb515d014f7aeb9066ce36bd5717161eb47d6a0f7bed8a9083935b465bc163ee2581c8b128d29bf61092fdf57a7 + checksum: 1c6b0abcdb901e13a44c7d699116d3d4279fdb261983122a3783e7273844d5f2537dc2e1c454a23fcf645917f93fbf8d07101c1d03c015a87faa662755212566 languageName: node linkType: hard -"deep-is@npm:^0.1.3, deep-is@npm:~0.1.3": +"deep-is@npm:^0.1.3": version: 0.1.4 resolution: "deep-is@npm:0.1.4" - checksum: edb65dd0d7d1b9c40b2f50219aef30e116cedd6fc79290e740972c132c09106d2e80aa0bc8826673dd5a00222d4179c84b36a790eef63a4c4bca75a37ef90804 + checksum: 7f0ee496e0dff14a573dc6127f14c95061b448b87b995fc96c017ce0a1e66af1675e73f1d6064407975bc4ea6ab679497a29fff7b5b9c4e99cb10797c1ad0b4c languageName: node linkType: hard -"deepmerge-ts@npm:^4.0.3": - version: 4.2.2 - resolution: "deepmerge-ts@npm:4.2.2" - checksum: 137c3650519d9b1a220db7e23a3f56304cd02e7f97b2b8392e2767251055a29318425bacdb2ab2ff175a4645f7179643acf0e038d5dafbfdbc11bdf322f79697 +"deepmerge-ts@npm:^5.1.0": + version: 5.1.0 + resolution: "deepmerge-ts@npm:5.1.0" + checksum: 28f810e6f3c638020922c3abfb4f20bc8fff00262dbc5a1f5283ecae0b8ffd3b3b95aaca3c8992d8680eb5754c11d87edff1915235e145c5afdc53102665418f languageName: node linkType: hard "deepmerge@npm:^4.2.2": - version: 4.2.2 - resolution: "deepmerge@npm:4.2.2" - checksum: a8c43a1ed8d6d1ed2b5bf569fa4c8eb9f0924034baf75d5d406e47e157a451075c4db353efea7b6bcc56ec48116a8ce72fccf867b6e078e7c561904b5897530b + version: 4.3.1 + resolution: "deepmerge@npm:4.3.1" + checksum: e53481aaf1aa2c4082b5342be6b6d8ad9dfe387bc92ce197a66dea08bd4265904a087e75e464f14d1347cf2ac8afe1e4c16b266e0561cc5df29382d3c5f80044 + languageName: node + linkType: hard + +"default-browser-id@npm:^5.0.0": + version: 5.0.0 + resolution: "default-browser-id@npm:5.0.0" + checksum: 957fb886502594c8e645e812dfe93dba30ed82e8460d20ce39c53c5b0f3e2afb6ceaec2249083b90bdfbb4cb0f34e1f73fde3d68cac00becdbcfd894156b5ead + languageName: node + linkType: hard + +"default-browser@npm:^5.2.1": + version: 5.2.1 + resolution: "default-browser@npm:5.2.1" + dependencies: + bundle-name: "npm:^4.1.0" + default-browser-id: "npm:^5.0.0" + checksum: 73f17dc3c58026c55bb5538749597db31f9561c0193cd98604144b704a981c95a466f8ecc3c2db63d8bfd04fb0d426904834cfc91ae510c6aeb97e13c5167c4d languageName: node linkType: hard @@ -3262,105 +3479,101 @@ __metadata: version: 1.0.4 resolution: "defaults@npm:1.0.4" dependencies: - clone: ^1.0.2 - checksum: 3a88b7a587fc076b84e60affad8b85245c01f60f38fc1d259e7ac1d89eb9ce6abb19e27215de46b98568dd5bc48471730b327637e6f20b0f1bc85cf00440c80a + clone: "npm:^1.0.2" + checksum: 9cfbe498f5c8ed733775db62dfd585780387d93c17477949e1670bfcfb9346e0281ce8c4bf9f4ac1fc0f9b851113bd6dc9e41182ea1644ccd97de639fa13c35a languageName: node linkType: hard -"define-lazy-prop@npm:^2.0.0": - version: 2.0.0 - resolution: "define-lazy-prop@npm:2.0.0" - checksum: 0115fdb065e0490918ba271d7339c42453d209d4cb619dfe635870d906731eff3e1ade8028bb461ea27ce8264ec5e22c6980612d332895977e89c1bbc80fcee2 +"define-data-property@npm:^1.0.1, define-data-property@npm:^1.1.1": + version: 1.1.1 + resolution: "define-data-property@npm:1.1.1" + dependencies: + get-intrinsic: "npm:^1.2.1" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + checksum: 77ef6e0bceb515e05b5913ab635a84d537cee84f8a7c37c77fdcb31fc5b80f6dbe81b33375e4b67d96aa04e6a0d8d4ea099e431d83f089af8d93adfb584bcb94 languageName: node linkType: hard -"define-properties@npm:^1.1.3, define-properties@npm:^1.1.4": - version: 1.1.4 - resolution: "define-properties@npm:1.1.4" - dependencies: - has-property-descriptors: ^1.0.0 - object-keys: ^1.1.1 - checksum: ce0aef3f9eb193562b5cfb79b2d2c86b6a109dfc9fdcb5f45d680631a1a908c06824ddcdb72b7573b54e26ace07f0a23420aaba0d5c627b34d2c1de8ef527e2b +"define-lazy-prop@npm:^3.0.0": + version: 3.0.0 + resolution: "define-lazy-prop@npm:3.0.0" + checksum: 5ab0b2bf3fa58b3a443140bbd4cd3db1f91b985cc8a246d330b9ac3fc0b6a325a6d82bddc0b055123d745b3f9931afeea74a5ec545439a1630b9c8512b0eeb49 languageName: node linkType: hard -"del@npm:^7.0.0": - version: 7.0.0 - resolution: "del@npm:7.0.0" +"define-properties@npm:^1.1.3, define-properties@npm:^1.2.0, define-properties@npm:^1.2.1": + version: 1.2.1 + resolution: "define-properties@npm:1.2.1" dependencies: - globby: ^13.1.2 - graceful-fs: ^4.2.10 - is-glob: ^4.0.3 - is-path-cwd: ^3.0.0 - is-path-inside: ^4.0.0 - p-map: ^5.5.0 - rimraf: ^3.0.2 - slash: ^4.0.0 - checksum: 33e5077f18b5dfbe81971d1f8a2cd8bf676dd5ede491bab85ec17a4a1d59001bd3ec47fd38e9a4ae01a3c98c07b98c7b3dc56190b86d88926798802d7858d827 + define-data-property: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + object-keys: "npm:^1.1.1" + checksum: 88a152319ffe1396ccc6ded510a3896e77efac7a1bfbaa174a7b00414a1747377e0bb525d303794a47cf30e805c2ec84e575758512c6e44a993076d29fd4e6c3 languageName: node linkType: hard "delegates@npm:^1.0.0": version: 1.0.0 resolution: "delegates@npm:1.0.0" - checksum: a51744d9b53c164ba9c0492471a1a2ffa0b6727451bdc89e31627fdf4adda9d51277cfcbfb20f0a6f08ccb3c436f341df3e92631a3440226d93a8971724771fd + checksum: ba05874b91148e1db4bf254750c042bf2215febd23a6d3cda2e64896aef79745fbd4b9996488bd3cafb39ce19dbce0fd6e3b6665275638befffe1c9b312b91b5 languageName: node linkType: hard "depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" - checksum: abbe19c768c97ee2eed6282d8ce3031126662252c58d711f646921c9623f9052e3e1906443066beec1095832f534e57c523b7333f8e7e0d93051ab6baef5ab3a - languageName: node - linkType: hard - -"depd@npm:^1.1.2": - version: 1.1.2 - resolution: "depd@npm:1.1.2" - checksum: 6b406620d269619852885ce15965272b829df6f409724415e0002c8632ab6a8c0a08ec1f0bd2add05dc7bd7507606f7e2cc034fa24224ab829580040b835ecd9 + checksum: 58bd06ec20e19529b06f7ad07ddab60e504d9e0faca4bd23079fac2d279c3594334d736508dc350e06e510aba5e22e4594483b3a6562ce7c17dd797f4cc4ad2c languageName: node linkType: hard -"dependency-tree@npm:^8.1.1": - version: 8.1.2 - resolution: "dependency-tree@npm:8.1.2" +"dependency-tree@npm:^9.0.0": + version: 9.0.0 + resolution: "dependency-tree@npm:9.0.0" dependencies: - commander: ^2.20.3 - debug: ^4.3.1 - filing-cabinet: ^3.0.1 - precinct: ^8.0.0 - typescript: ^3.9.7 + commander: "npm:^2.20.3" + debug: "npm:^4.3.1" + filing-cabinet: "npm:^3.0.1" + precinct: "npm:^9.0.0" + typescript: "npm:^4.0.0" bin: dependency-tree: bin/cli.js - checksum: e26dffd0332b80ac6303fa4073dcd8f3df05c1584e26fe8fd15f59572f0427e8618757e9797d8963578648f80eb9d4f4496f25bbbb5984329b4c55e49e51d7be + checksum: 129d727df2d992e826ca9f002b1566bd12112e233a9fa061a832fa48fbf2c0e6d078f8e69296fe5dd72ab897b7dfc2dbf3c1c5118ee55c3c5248d4a253fd616b languageName: node linkType: hard "destroy@npm:1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" - checksum: 0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 + checksum: bd7633942f57418f5a3b80d5cb53898127bcf53e24cdf5d5f4396be471417671f0fee48a4ebe9a1e9defbde2a31280011af58a57e090ff822f589b443ed4e643 languageName: node linkType: hard "detect-file@npm:^1.0.0": version: 1.0.0 resolution: "detect-file@npm:1.0.0" - checksum: 1861e4146128622e847abe0e1ed80fef01e78532665858a792267adf89032b7a9c698436137707fcc6f02956c2a6a0052d6a0cef5be3d4b76b1ff0da88e2158a + checksum: c782a5f992047944c39d337c82f5d1d21d65d1378986d46c354df9d9ec6d5f356bca0182969c11b08b9b8a7af8727b3c2d5a9fad0b022be4a3bf4c216f63ed07 languageName: node linkType: hard "detect-indent@npm:6.1.0, detect-indent@npm:^6.0.0": version: 6.1.0 resolution: "detect-indent@npm:6.1.0" - checksum: ab953a73c72dbd4e8fc68e4ed4bfd92c97eb6c43734af3900add963fd3a9316f3bc0578b018b24198d4c31a358571eff5f0656e81a1f3b9ad5c547d58b2d093d + checksum: dd83cdeda9af219cf77f5e9a0dc31d828c045337386cfb55ce04fad94ba872ee7957336834154f7647b89b899c3c7acc977c57a79b7c776b506240993f97acc7 + languageName: node + linkType: hard + +"detect-libc@npm:^2.0.0": + version: 2.0.2 + resolution: "detect-libc@npm:2.0.2" + checksum: a9f4ffcd2701525c589617d98afe5a5d0676c8ea82bcc4ed6f3747241b79f781d36437c59a5e855254c864d36a3e9f8276568b6b531c28d6e53b093a15703f11 languageName: node linkType: hard "detect-newline@npm:^3.1.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" - checksum: ae6cd429c41ad01b164c59ea36f264a2c479598e61cba7c99da24175a7ab80ddf066420f2bec9a1c57a6bead411b4655ff15ad7d281c000a89791f48cbe939e7 + checksum: c38cfc8eeb9fda09febb44bcd85e467c970d4e3bf526095394e5a4f18bc26dd0cf6b22c69c1fa9969261521c593836db335c2795218f6d781a512aea2fb8209d languageName: node linkType: hard @@ -3368,13 +3581,27 @@ __metadata: version: 3.1.2 resolution: "detective-amd@npm:3.1.2" dependencies: - ast-module-types: ^3.0.0 - escodegen: ^2.0.0 - get-amd-module-type: ^3.0.0 - node-source-walk: ^4.2.0 + ast-module-types: "npm:^3.0.0" + escodegen: "npm:^2.0.0" + get-amd-module-type: "npm:^3.0.0" + node-source-walk: "npm:^4.2.0" + bin: + detective-amd: bin/cli.js + checksum: 553d6df8a4f378d3da6045acdba95cc08d65c0623661f76938bbc4ee9943b47ccbd0298a2322acd4e7a6344579990d1af69eb58f1989a317cd7df0e1fdad3883 + languageName: node + linkType: hard + +"detective-amd@npm:^4.0.1, detective-amd@npm:^4.1.0": + version: 4.2.0 + resolution: "detective-amd@npm:4.2.0" + dependencies: + ast-module-types: "npm:^4.0.0" + escodegen: "npm:^2.0.0" + get-amd-module-type: "npm:^4.1.0" + node-source-walk: "npm:^5.0.1" bin: detective-amd: bin/cli.js - checksum: 0b71555edad8e85c9a2ae85e2799d5faf2bdfe0de969587c9288ca76e717494678e34f444dffe32ffdd432e85ce50ca7017a5d0441a4855677a45a40c4590c74 + checksum: 7f91862f5b26d8cdd96c09d3a7512a76e3d1f6d70b5a963dc210883d97e3c336b452cbe9df3b96714e5c3fa1255d31fd78b72ef6c2deaef2437a777b53671f60 languageName: node linkType: hard @@ -3382,18 +3609,37 @@ __metadata: version: 3.1.3 resolution: "detective-cjs@npm:3.1.3" dependencies: - ast-module-types: ^3.0.0 - node-source-walk: ^4.0.0 - checksum: a691cb4afbbfea59d9aae0ee00752ec1a825a7ef18fc9178b53664975f162f3b537268590def009d9ce1cccfc5bc4f38cf775df08d0872aaacc05d96c72de85a + ast-module-types: "npm:^3.0.0" + node-source-walk: "npm:^4.0.0" + checksum: 990c5cfa6311012c0c15b9734ecd928174bfa7786ccc374891232bed5f64ba8a5849a3f1dec9d8142524380675bf3d5f68a0bece111b9a8276523916b1d0d5a5 + languageName: node + linkType: hard + +"detective-cjs@npm:^4.0.0, detective-cjs@npm:^4.1.0": + version: 4.1.0 + resolution: "detective-cjs@npm:4.1.0" + dependencies: + ast-module-types: "npm:^4.0.0" + node-source-walk: "npm:^5.0.1" + checksum: 09fbc378a4a206c6bbae39107b6e32b3c4f1570d8c0b4bdbd002f0fd5ad325219a63352df5129ad5ad5366d8bfa31888f5dfbfa9d815a629970dab30c7dedce9 languageName: node linkType: hard -"detective-es6@npm:^2.2.0, detective-es6@npm:^2.2.1": +"detective-es6@npm:^2.2.1": version: 2.2.2 resolution: "detective-es6@npm:2.2.2" dependencies: - node-source-walk: ^4.0.0 - checksum: 9ee9909c089f5dcd1f89eccd347d509197996280ba24e2e08742bbc5ca3eef655ff07b4edfd76b52d6b4376ba03b8ec17d621c9f9c4382a6ba233dc1b1d00d33 + node-source-walk: "npm:^4.0.0" + checksum: 9d07cc6af25367e36fcca52b9623c15154d30928a2182e6ec80f7d9adf62da8598085e73edd09303330058a26b4b5fc4312a703c3431e89cdb2b7afe94607147 + languageName: node + linkType: hard + +"detective-es6@npm:^3.0.0, detective-es6@npm:^3.0.1": + version: 3.0.1 + resolution: "detective-es6@npm:3.0.1" + dependencies: + node-source-walk: "npm:^5.0.0" + checksum: 52d6efd9f22d9f46c62b5949ce63a07aa667bb272cdeba50b0a6286bfea93e94169bf69ad7eca22c50c379a61fd5c9684fa0c6f02b200292705030702f2c1011 languageName: node linkType: hard @@ -3401,10 +3647,10 @@ __metadata: version: 1.0.2 resolution: "detective-less@npm:1.0.2" dependencies: - debug: ^4.0.0 - gonzales-pe: ^4.2.3 - node-source-walk: ^4.0.0 - checksum: 858936fbad87423bd5d7502ff5fafca023e7c99e4006ed01b31c12c4b5ff8697edce91419798479d857efec68ee8f022fcac64de5530db6a64012be600a2249e + debug: "npm:^4.0.0" + gonzales-pe: "npm:^4.2.3" + node-source-walk: "npm:^4.0.0" + checksum: 0ef20606840ec521bcf00cae7edfa9b28a804669b1183b6ce0b8ca937d4af2a32b350b643d052991bd1387c3dd6241c3be92a5bdd692b0dc65bcc27f8a8c2c2e languageName: node linkType: hard @@ -3412,22 +3658,22 @@ __metadata: version: 4.0.0 resolution: "detective-postcss@npm:4.0.0" dependencies: - debug: ^4.1.1 - is-url: ^1.2.4 - postcss: ^8.1.7 - postcss-values-parser: ^2.0.1 - checksum: e4c9fed31613df43466357fb104c4c5cdaf45a12909f7c1174161a45ebb2ebe77bb0843b3c0c117b68f55c9acb4e0578668298594c7f0108dfb73e54aaec8513 + debug: "npm:^4.1.1" + is-url: "npm:^1.2.4" + postcss: "npm:^8.1.7" + postcss-values-parser: "npm:^2.0.1" + checksum: f6a134c29c6e3b6cb2f0d6164c2300ec5d1a1f24912ea8be0740add30022c6da8b8e6a8b6a0db8aebd89169b0702e062d1052db9950e3a25121d6685e6a1c51d languageName: node linkType: hard -"detective-postcss@npm:^5.0.0": - version: 5.1.3 - resolution: "detective-postcss@npm:5.1.3" +"detective-postcss@npm:^6.1.0, detective-postcss@npm:^6.1.1": + version: 6.1.3 + resolution: "detective-postcss@npm:6.1.3" dependencies: - is-url: ^1.2.4 - postcss: ^8.4.6 - postcss-values-parser: ^5.0.0 - checksum: 7310e3fa9995d10d97d3d6995a89df72195cba8a6420c661b8b6100c0bbbf466887c29e6a166a93e76ede395b290c24d7837c2a0c644b5cd415d9834db77d8cf + is-url: "npm:^1.2.4" + postcss: "npm:^8.4.23" + postcss-values-parser: "npm:^6.0.2" + checksum: 7ad2eb7113927930f5d17d97bc3dcfa2d38ea62f65263ecefc4b2289138dd6f7b07e561a23fb05b8befa56d521a49f601caf45794f1a17c3dfc3bf1c1199affe languageName: node linkType: hard @@ -3435,9 +3681,19 @@ __metadata: version: 3.0.2 resolution: "detective-sass@npm:3.0.2" dependencies: - gonzales-pe: ^4.3.0 - node-source-walk: ^4.0.0 - checksum: 7489e5ae7dbed2eba89855cea21ad32321e8e92bd9f2d3b925e7feec0dd9aa8b4b865296525275938e573a3be9759715490038103cbc970570a1c48c4f2fd23d + gonzales-pe: "npm:^4.3.0" + node-source-walk: "npm:^4.0.0" + checksum: b7f1df65e387bc15d2939e533dfbe1d925740ba139a5cbb7dfc9195dcb845298a62b7614cabdf487e6119533359cb74537b486942200e5b661c971d8d34399c4 + languageName: node + linkType: hard + +"detective-sass@npm:^4.0.1, detective-sass@npm:^4.1.1": + version: 4.1.3 + resolution: "detective-sass@npm:4.1.3" + dependencies: + gonzales-pe: "npm:^4.3.0" + node-source-walk: "npm:^5.0.1" + checksum: ecfc77d18ca7717da382aaa49ad4c7635f86ac1965fb9e85e0376bb55a9184ecb22cb1299d3b9327b67da93787eda21d98b4880854c152bdcc94ab0fe671a039 languageName: node linkType: hard @@ -3445,16 +3701,40 @@ __metadata: version: 2.0.2 resolution: "detective-scss@npm:2.0.2" dependencies: - gonzales-pe: ^4.3.0 - node-source-walk: ^4.0.0 - checksum: 515ff1b8946ec92baead48ef435efe1ea0f33ee1d98a7537dd700f1d06dd192f9ea0971c10343adcb08b561ab296d01c18a1f62d0b63163a8f4c09885a956e1a + gonzales-pe: "npm:^4.3.0" + node-source-walk: "npm:^4.0.0" + checksum: 04fea8dd22906ea5fee43c18683b1efb7078b3d75f6a5063b6091d7e4c23f38b41ca2fa97f806a46364337c7e21e4f8711b15e8d9ad54f9ed9a99be2d0dea30f + languageName: node + linkType: hard + +"detective-scss@npm:^3.0.0, detective-scss@npm:^3.0.1": + version: 3.1.1 + resolution: "detective-scss@npm:3.1.1" + dependencies: + gonzales-pe: "npm:^4.3.0" + node-source-walk: "npm:^5.0.1" + checksum: 53d5e10fe4a29e2a8a7a4adda2f8f999d0b6605fd6ffdb410b50ca0abb6de8038fa661d0190ccd545a2220b1f718e6832635a0abd22ab542e8dd0fe693b1a558 languageName: node linkType: hard "detective-stylus@npm:^1.0.0": version: 1.0.3 resolution: "detective-stylus@npm:1.0.3" - checksum: 2723da93545f3a55a2a7eaa76b50712457af3c93c2b003e95d02f4c240d5e5206a5df99209a4f5b54128c11fc4270c2de1d7316b4f7d02b359483ae74f5a6637 + checksum: bf7b1aa06934dfbc5564d1eee5ccd48bd539afc697ea2eaa0ec437fafa6ce35690b015aea71fe1a489e385ccbb01565d0274abca4c89a2d897562b2662890567 + languageName: node + linkType: hard + +"detective-stylus@npm:^2.0.1": + version: 2.0.1 + resolution: "detective-stylus@npm:2.0.1" + checksum: 3af267855c7761e625b6a33155603394b4406d33fc4da43a9fbc446d86c40862f66a392ed848595e72d4bc63d9ec3a7e972fbef66533a68eb6025e9fb3349096 + languageName: node + linkType: hard + +"detective-stylus@npm:^3.0.0": + version: 3.0.0 + resolution: "detective-stylus@npm:3.0.0" + checksum: 7badcae3ae0e6b56f0e8ab826eedb06d38ca841f79b9d7dc2be1dc99e044a15ff2c462792da283264f4e5e40e0dc9846ffb8aa3d2a5b3202865ada12c945c504 languageName: node linkType: hard @@ -3462,25 +3742,23 @@ __metadata: version: 7.0.2 resolution: "detective-typescript@npm:7.0.2" dependencies: - "@typescript-eslint/typescript-estree": ^4.33.0 - ast-module-types: ^2.7.1 - node-source-walk: ^4.2.0 - typescript: ^3.9.10 - checksum: 77703410baa242029dc5e7d02cca7a26278dea498ec1c3320f92efa08a85263affc3b102fc2b09952ece1d2c851a3808733d7bfa9ed11944a7c0f39920e33ec9 - languageName: node - linkType: hard - -"devtools-protocol@npm:0.0.1068969": - version: 0.0.1068969 - resolution: "devtools-protocol@npm:0.0.1068969" - checksum: 53b9c8d661e4148eaf8e990f03902fb3a2cceb06044f661013b6c92dd48ece397ef49fd18401775823c9a33069b4b535502f2559d4f99c74a6bdcb71582b6c8a + "@typescript-eslint/typescript-estree": "npm:^4.33.0" + ast-module-types: "npm:^2.7.1" + node-source-walk: "npm:^4.2.0" + typescript: "npm:^3.9.10" + checksum: 19fa578e408b5b538699169786f30cfa822d2941c313858617fcc4c67fbba1b682ec70c9e9b33933ca2087de9e736976b61030f634a7b86b2356068cdc750df9 languageName: node linkType: hard -"diff@npm:^4.0.1": - version: 4.0.2 - resolution: "diff@npm:4.0.2" - checksum: f2c09b0ce4e6b301c221addd83bf3f454c0bc00caa3dd837cf6c127d6edf7223aa2bbe3b688feea110b7f262adbfc845b757c44c8a9f8c0c5b15d8fa9ce9d20d +"detective-typescript@npm:^9.0.0, detective-typescript@npm:^9.1.1": + version: 9.1.1 + resolution: "detective-typescript@npm:9.1.1" + dependencies: + "@typescript-eslint/typescript-estree": "npm:^5.55.0" + ast-module-types: "npm:^4.0.0" + node-source-walk: "npm:^5.0.1" + typescript: "npm:^4.9.5" + checksum: 21f444b33b9b7cbee06410a0be04ba099d041118beefc53a1b472f10a4dc7ebfde026b586dd2b7862de8b8b2c020f31d50412c434f3cc91c06243b6ab5a81990 languageName: node linkType: hard @@ -3488,8 +3766,8 @@ __metadata: version: 3.0.1 resolution: "dir-glob@npm:3.0.1" dependencies: - path-type: ^4.0.0 - checksum: fa05e18324510d7283f55862f3161c6759a3f2f8dbce491a2fc14c8324c498286c54282c1f0e933cb930da8419b30679389499b919122952a4f8592362ef4615 + path-type: "npm:^4.0.0" + checksum: dcac00920a4d503e38bb64001acb19df4efc14536ada475725e12f52c16777afdee4db827f55f13a908ee7efc0cb282e2e3dbaeeb98c0993dd93d1802d3bf00c languageName: node linkType: hard @@ -3497,8 +3775,8 @@ __metadata: version: 2.1.0 resolution: "doctrine@npm:2.1.0" dependencies: - esutils: ^2.0.2 - checksum: a45e277f7feaed309fe658ace1ff286c6e2002ac515af0aaf37145b8baa96e49899638c7cd47dccf84c3d32abfc113246625b3ac8f552d1046072adee13b0dc8 + esutils: "npm:^2.0.2" + checksum: b6416aaff1f380bf56c3b552f31fdf7a69b45689368deca72d28636f41c16bb28ec3ebc40ace97db4c1afc0ceeb8120e8492fe0046841c94c2933b2e30a7d5ac languageName: node linkType: hard @@ -3506,17 +3784,26 @@ __metadata: version: 3.0.0 resolution: "doctrine@npm:3.0.0" dependencies: - esutils: ^2.0.2 - checksum: fd7673ca77fe26cd5cba38d816bc72d641f500f1f9b25b83e8ce28827fe2da7ad583a8da26ab6af85f834138cf8dae9f69b0cd6ab925f52ddab1754db44d99ce + esutils: "npm:^2.0.2" + checksum: c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 languageName: node linkType: hard -"dot-prop@npm:^5.1.0, dot-prop@npm:^5.2.0": +"dot-prop@npm:^5.1.0": version: 5.3.0 resolution: "dot-prop@npm:5.3.0" dependencies: - is-obj: ^2.0.0 - checksum: d5775790093c234ef4bfd5fbe40884ff7e6c87573e5339432870616331189f7f5d86575c5b5af2dcf0f61172990f4f734d07844b1f23482fff09e3c4bead05ea + is-obj: "npm:^2.0.0" + checksum: 93f0d343ef87fe8869320e62f2459f7e70f49c6098d948cc47e060f4a3f827d0ad61e83cb82f2bd90cd5b9571b8d334289978a43c0f98fea4f0e99ee8faa0599 + languageName: node + linkType: hard + +"dot-prop@npm:^6.0.1": + version: 6.0.1 + resolution: "dot-prop@npm:6.0.1" + dependencies: + is-obj: "npm:^2.0.0" + checksum: 30e51ec6408978a6951b21e7bc4938aad01a86f2fdf779efe52330205c6bb8a8ea12f35925c2029d6dc9d1df22f916f32f828ce1e9b259b1371c580541c22b5a languageName: node linkType: hard @@ -3524,16 +3811,16 @@ __metadata: version: 2.1.0 resolution: "dotgitignore@npm:2.1.0" dependencies: - find-up: ^3.0.0 - minimatch: ^3.0.4 - checksum: 67589446765ddc25539f414b7649442a649f047343030342f309ba69172beb916b9e54feb7d552db422111265f9e93344f31b5697e8e6c81ffc13d33c0d910a0 + find-up: "npm:^3.0.0" + minimatch: "npm:^3.0.4" + checksum: 92b7992423428ed80d79e38bbe699fbdff39189f4e7ce3c0d31ef2d8efce1438e6201dff2f8e9ce9b14fea78a90778648e4046ab7832220bc79d13ac85639fef languageName: node linkType: hard "eastasianwidth@npm:^0.2.0": version: 0.2.0 resolution: "eastasianwidth@npm:0.2.0" - checksum: 7d00d7cd8e49b9afa762a813faac332dee781932d6f2c848dc348939c4253f1d4564341b7af1d041853bc3f32c2ef141b58e0a4d9862c17a7f08f68df1e0f1ed + checksum: 26f364ebcdb6395f95124fda411f63137a4bfb5d3a06453f7f23dfe52502905bd84e0488172e0f9ec295fdc45f05c23d5d91baf16bd26f0fe9acd777a188dc39 languageName: node linkType: hard @@ -3541,16 +3828,16 @@ __metadata: version: 1.0.6 resolution: "ecurve@npm:1.0.6" dependencies: - bigi: ^1.1.0 - safe-buffer: ^5.0.1 - checksum: 11185533d4d204f3b419df2c3ff2123187cc30c098d792c7f139f0c02a11a84181de185c2b18501d505242f1f1a6d27f693ff4ea5e8b9348fc27bae509dda618 + bigi: "npm:^1.1.0" + safe-buffer: "npm:^5.0.1" + checksum: f480e5731a67864f4b9b43c9cedd15727452bc5b99fa94f97b3576e2612fc76ce89c6c77a3cf828bf5cb38c3a17ffca46ecd47d08d34437e88bcdd2008fe8404 languageName: node linkType: hard "ee-first@npm:1.1.1": version: 1.1.1 resolution: "ee-first@npm:1.1.1" - checksum: 1b4cac778d64ce3b582a7e26b218afe07e207a0f9bfe13cc7395a6d307849cfe361e65033c3251e00c27dd060cab43014c2d6b2647676135e18b77d2d05b3f4f + checksum: b5bb125ee93161bc16bfe6e56c6b04de5ad2aa44234d8f644813cc95d861a6910903132b05093706de2b706599367c4130eb6d170f6b46895686b95f87d017b7 languageName: node linkType: hard @@ -3558,42 +3845,49 @@ __metadata: version: 6.5.4 resolution: "elliptic@npm:6.5.4" dependencies: - bn.js: ^4.11.9 - brorand: ^1.1.0 - hash.js: ^1.0.0 - hmac-drbg: ^1.0.1 - inherits: ^2.0.4 - minimalistic-assert: ^1.0.1 - minimalistic-crypto-utils: ^1.0.1 - checksum: d56d21fd04e97869f7ffcc92e18903b9f67f2d4637a23c860492fbbff5a3155fd9ca0184ce0c865dd6eb2487d234ce9551335c021c376cd2d3b7cb749c7d10f4 + bn.js: "npm:^4.11.9" + brorand: "npm:^1.1.0" + hash.js: "npm:^1.0.0" + hmac-drbg: "npm:^1.0.1" + inherits: "npm:^2.0.4" + minimalistic-assert: "npm:^1.0.1" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 5f361270292c3b27cf0843e84526d11dec31652f03c2763c6c2b8178548175ff5eba95341dd62baff92b2265d1af076526915d8af6cc9cb7559c44a62f8ca6e2 languageName: node linkType: hard "emittery@npm:^1.0.1": version: 1.0.1 resolution: "emittery@npm:1.0.1" - checksum: d95faee6ffb2e023cadaa6804265fea5298c53d079f170112af8dfae3e141761363ea4510966128259346418e3ec7639310fd75059ecce2423bf8afd07004226 + checksum: 2587f2f42bb5e004ba1cde61352d2151f4dd4f29eb79ad36f82e200da2faec9742d7bfca1492a024d60396e001e4b07d9b2b9c43be33547ff751ba8ff87c42ce + languageName: node + linkType: hard + +"emoji-regex@npm:^10.3.0": + version: 10.3.0 + resolution: "emoji-regex@npm:10.3.0" + checksum: b4838e8dcdceb44cf47f59abe352c25ff4fe7857acaf5fb51097c427f6f75b44d052eb907a7a3b86f86bc4eae3a93f5c2b7460abe79c407307e6212d65c91163 languageName: node linkType: hard "emoji-regex@npm:^8.0.0": version: 8.0.0 resolution: "emoji-regex@npm:8.0.0" - checksum: d4c5c39d5a9868b5fa152f00cada8a936868fd3367f33f71be515ecee4c803132d11b31a6222b2571b1e5f7e13890156a94880345594d0ce7e3c9895f560f192 + checksum: b6053ad39951c4cf338f9092d7bfba448cdfd46fe6a2a034700b149ac9ffbc137e361cbd3c442297f86bed2e5f7576c1b54cc0a6bf8ef5106cc62f496af35010 languageName: node linkType: hard "emoji-regex@npm:^9.2.2": version: 9.2.2 resolution: "emoji-regex@npm:9.2.2" - checksum: 8487182da74aabd810ac6d6f1994111dfc0e331b01271ae01ec1eb0ad7b5ecc2bbbbd2f053c05cb55a1ac30449527d819bbfbf0e3de1023db308cbcb47f86601 + checksum: af014e759a72064cf66e6e694a7fc6b0ed3d8db680427b021a89727689671cefe9d04151b2cad51dbaf85d5ba790d061cd167f1cf32eb7b281f6368b3c181639 languageName: node linkType: hard "encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" - checksum: e50e3d508cdd9c4565ba72d2012e65038e5d71bdc9198cb125beb6237b5b1ade6c0d343998da9e170fb2eae52c1bed37d4d6d98a46ea423a0cddbed5ac3f780c + checksum: f6c2387379a9e7c1156c1c3d4f9cb7bb11cf16dd4c1682e1f6746512564b053df5781029b6061296832b59fb22f459dbe250386d217c2f6e203601abb2ee0bec languageName: node linkType: hard @@ -3601,41 +3895,32 @@ __metadata: version: 0.1.13 resolution: "encoding@npm:0.1.13" dependencies: - iconv-lite: ^0.6.2 - checksum: bb98632f8ffa823996e508ce6a58ffcf5856330fde839ae42c9e1f436cc3b5cc651d4aeae72222916545428e54fd0f6aa8862fd8d25bdbcc4589f1e3f3715e7f - languageName: node - linkType: hard - -"end-of-stream@npm:^1.1.0, end-of-stream@npm:^1.4.1": - version: 1.4.4 - resolution: "end-of-stream@npm:1.4.4" - dependencies: - once: ^1.4.0 - checksum: 530a5a5a1e517e962854a31693dbb5c0b2fc40b46dad2a56a2deec656ca040631124f4795823acc68238147805f8b021abbe221f4afed5ef3c8e8efc2024908b + iconv-lite: "npm:^0.6.2" + checksum: 36d938712ff00fe1f4bac88b43bcffb5930c1efa57bbcdca9d67e1d9d6c57cfb1200fb01efe0f3109b2ce99b231f90779532814a81370a1bd3274a0f58585039 languageName: node linkType: hard "enhanced-resolve@npm:^5.8.3": - version: 5.12.0 - resolution: "enhanced-resolve@npm:5.12.0" + version: 5.15.0 + resolution: "enhanced-resolve@npm:5.15.0" dependencies: - graceful-fs: ^4.2.4 - tapable: ^2.2.0 - checksum: bf3f787facaf4ce3439bef59d148646344e372bef5557f0d37ea8aa02c51f50a925cd1f07b8d338f18992c29f544ec235a8c64bcdb56030196c48832a5494174 + graceful-fs: "npm:^4.2.4" + tapable: "npm:^2.2.0" + checksum: 69984a7990913948b4150855aed26a84afb4cb1c5a94fb8e3a65bd00729a73fc2eaff6871fb8e345377f294831afe349615c93560f2f54d61b43cdfdf668f19a languageName: node linkType: hard "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" - checksum: 65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e + checksum: 285325677bf00e30845e330eec32894f5105529db97496ee3f598478e50f008c5352a41a30e5e72ec9de8a542b5a570b85699cd63bd2bc646dbcb9f311d83bc4 languageName: node linkType: hard "err-code@npm:^2.0.2": version: 2.0.3 resolution: "err-code@npm:2.0.3" - checksum: 8b7b1be20d2de12d2255c0bc2ca638b7af5171142693299416e6a9339bd7d88fc8d7707d913d78e0993176005405a236b066b45666b27b797252c771156ace54 + checksum: b642f7b4dd4a376e954947550a3065a9ece6733ab8e51ad80db727aaae0817c2e99b02a97a3d6cecc648a97848305e728289cf312d09af395403a90c9d4d8a66 languageName: node linkType: hard @@ -3643,68 +3928,75 @@ __metadata: version: 1.3.2 resolution: "error-ex@npm:1.3.2" dependencies: - is-arrayish: ^0.2.1 - checksum: c1c2b8b65f9c91b0f9d75f0debaa7ec5b35c266c2cac5de412c1a6de86d4cbae04ae44e510378cb14d032d0645a36925d0186f8bb7367bcc629db256b743a001 - languageName: node - linkType: hard - -"es-abstract@npm:^1.19.0, es-abstract@npm:^1.20.4": - version: 1.21.0 - resolution: "es-abstract@npm:1.21.0" - dependencies: - call-bind: ^1.0.2 - es-set-tostringtag: ^2.0.0 - es-to-primitive: ^1.2.1 - function-bind: ^1.1.1 - function.prototype.name: ^1.1.5 - get-intrinsic: ^1.1.3 - get-symbol-description: ^1.0.0 - globalthis: ^1.0.3 - gopd: ^1.0.1 - has: ^1.0.3 - has-property-descriptors: ^1.0.0 - has-proto: ^1.0.1 - has-symbols: ^1.0.3 - internal-slot: ^1.0.4 - is-array-buffer: ^3.0.0 - is-callable: ^1.2.7 - is-negative-zero: ^2.0.2 - is-regex: ^1.1.4 - is-shared-array-buffer: ^1.0.2 - is-string: ^1.0.7 - is-typed-array: ^1.1.10 - is-weakref: ^1.0.2 - object-inspect: ^1.12.2 - object-keys: ^1.1.1 - object.assign: ^4.1.4 - regexp.prototype.flags: ^1.4.3 - safe-regex-test: ^1.0.0 - string.prototype.trimend: ^1.0.6 - string.prototype.trimstart: ^1.0.6 - typed-array-length: ^1.0.4 - unbox-primitive: ^1.0.2 - which-typed-array: ^1.1.9 - checksum: 52305b52aff6505c9d8cebfa727835dd8871af76de151868d1db7baf6d21f13a81586316ac513601eec9b46e2947cab044fc2a131db68bfa05daf37aa153dbd9 - languageName: node - linkType: hard - -"es-set-tostringtag@npm:^2.0.0": - version: 2.0.1 - resolution: "es-set-tostringtag@npm:2.0.1" + is-arrayish: "npm:^0.2.1" + checksum: ba827f89369b4c93382cfca5a264d059dfefdaa56ecc5e338ffa58a6471f5ed93b71a20add1d52290a4873d92381174382658c885ac1a2305f7baca363ce9cce + languageName: node + linkType: hard + +"es-abstract@npm:^1.22.1": + version: 1.22.3 + resolution: "es-abstract@npm:1.22.3" + dependencies: + array-buffer-byte-length: "npm:^1.0.0" + arraybuffer.prototype.slice: "npm:^1.0.2" + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.5" + es-set-tostringtag: "npm:^2.0.1" + es-to-primitive: "npm:^1.2.1" + function.prototype.name: "npm:^1.1.6" + get-intrinsic: "npm:^1.2.2" + get-symbol-description: "npm:^1.0.0" + globalthis: "npm:^1.0.3" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + internal-slot: "npm:^1.0.5" + is-array-buffer: "npm:^3.0.2" + is-callable: "npm:^1.2.7" + is-negative-zero: "npm:^2.0.2" + is-regex: "npm:^1.1.4" + is-shared-array-buffer: "npm:^1.0.2" + is-string: "npm:^1.0.7" + is-typed-array: "npm:^1.1.12" + is-weakref: "npm:^1.0.2" + object-inspect: "npm:^1.13.1" + object-keys: "npm:^1.1.1" + object.assign: "npm:^4.1.4" + regexp.prototype.flags: "npm:^1.5.1" + safe-array-concat: "npm:^1.0.1" + safe-regex-test: "npm:^1.0.0" + string.prototype.trim: "npm:^1.2.8" + string.prototype.trimend: "npm:^1.0.7" + string.prototype.trimstart: "npm:^1.0.7" + typed-array-buffer: "npm:^1.0.0" + typed-array-byte-length: "npm:^1.0.0" + typed-array-byte-offset: "npm:^1.0.0" + typed-array-length: "npm:^1.0.4" + unbox-primitive: "npm:^1.0.2" + which-typed-array: "npm:^1.1.13" + checksum: da31ec43b1c8eb47ba8a17693cac143682a1078b6c3cd883ce0e2062f135f532e93d873694ef439670e1f6ca03195118f43567ba6f33fb0d6c7daae750090236 + languageName: node + linkType: hard + +"es-set-tostringtag@npm:^2.0.1": + version: 2.0.2 + resolution: "es-set-tostringtag@npm:2.0.2" dependencies: - get-intrinsic: ^1.1.3 - has: ^1.0.3 - has-tostringtag: ^1.0.0 - checksum: ec416a12948cefb4b2a5932e62093a7cf36ddc3efd58d6c58ca7ae7064475ace556434b869b0bbeb0c365f1032a8ccd577211101234b69837ad83ad204fff884 + get-intrinsic: "npm:^1.2.2" + has-tostringtag: "npm:^1.0.0" + hasown: "npm:^2.0.0" + checksum: 176d6bd1be31dd0145dcceee62bb78d4a5db7f81db437615a18308a6f62bcffe45c15081278413455e8cf0aad4ea99079de66f8de389605942dfdacbad74c2d5 languageName: node linkType: hard "es-shim-unscopables@npm:^1.0.0": - version: 1.0.0 - resolution: "es-shim-unscopables@npm:1.0.0" + version: 1.0.2 + resolution: "es-shim-unscopables@npm:1.0.2" dependencies: - has: ^1.0.3 - checksum: 83e95cadbb6ee44d3644dfad60dcad7929edbc42c85e66c3e99aefd68a3a5c5665f2686885cddb47dfeabfd77bd5ea5a7060f2092a955a729bbd8834f0d86fa1 + hasown: "npm:^2.0.0" + checksum: f495af7b4b7601a4c0cfb893581c352636e5c08654d129590386a33a0432cf13a7bdc7b6493801cadd990d838e2839b9013d1de3b880440cb537825e834fe783 languageName: node linkType: hard @@ -3712,121 +4004,120 @@ __metadata: version: 1.2.1 resolution: "es-to-primitive@npm:1.2.1" dependencies: - is-callable: ^1.1.4 - is-date-object: ^1.0.1 - is-symbol: ^1.0.2 - checksum: 4ead6671a2c1402619bdd77f3503991232ca15e17e46222b0a41a5d81aebc8740a77822f5b3c965008e631153e9ef0580540007744521e72de8e33599fca2eed + is-callable: "npm:^1.1.4" + is-date-object: "npm:^1.0.1" + is-symbol: "npm:^1.0.2" + checksum: 0886572b8dc075cb10e50c0af62a03d03a68e1e69c388bd4f10c0649ee41b1fbb24840a1b7e590b393011b5cdbe0144b776da316762653685432df37d6de60f1 languageName: node linkType: hard "escalade@npm:^3.1.1": version: 3.1.1 resolution: "escalade@npm:3.1.1" - checksum: a3e2a99f07acb74b3ad4989c48ca0c3140f69f923e56d0cba0526240ee470b91010f9d39001f2a4a313841d237ede70a729e92125191ba5d21e74b106800b133 + checksum: afd02e6ca91ffa813e1108b5e7756566173d6bc0d1eb951cb44d6b21702ec17c1cf116cfe75d4a2b02e05acb0b808a7a9387d0d1ca5cf9c04ad03a8445c3e46d languageName: node linkType: hard "escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" - checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 + checksum: 524c739d776b36c3d29fa08a22e03e8824e3b2fd57500e5e44ecf3cc4707c34c60f9ca0781c0e33d191f2991161504c295e98f68c78fe7baa6e57081ec6ac0a3 languageName: node linkType: hard "escape-string-regexp@npm:5.0.0, escape-string-regexp@npm:^5.0.0": version: 5.0.0 resolution: "escape-string-regexp@npm:5.0.0" - checksum: 20daabe197f3cb198ec28546deebcf24b3dbb1a5a269184381b3116d12f0532e06007f4bc8da25669d6a7f8efb68db0758df4cd981f57bc5b57f521a3e12c59e + checksum: 6366f474c6f37a802800a435232395e04e9885919873e382b157ab7e8f0feb8fed71497f84a6f6a81a49aab41815522f5839112bd38026d203aea0c91622df95 languageName: node linkType: hard "escape-string-regexp@npm:^1.0.5": version: 1.0.5 resolution: "escape-string-regexp@npm:1.0.5" - checksum: 6092fda75c63b110c706b6a9bfde8a612ad595b628f0bd2147eea1d3406723020810e591effc7db1da91d80a71a737a313567c5abb3813e8d9c71f4aa595b410 + checksum: a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 languageName: node linkType: hard "escape-string-regexp@npm:^2.0.0": version: 2.0.0 resolution: "escape-string-regexp@npm:2.0.0" - checksum: 9f8a2d5743677c16e85c810e3024d54f0c8dea6424fad3c79ef6666e81dd0846f7437f5e729dfcdac8981bc9e5294c39b4580814d114076b8d36318f46ae4395 + checksum: 2530479fe8db57eace5e8646c9c2a9c80fa279614986d16dcc6bcaceb63ae77f05a851ba6c43756d816c61d7f4534baf56e3c705e3e0d884818a46808811c507 languageName: node linkType: hard "escape-string-regexp@npm:^4.0.0": version: 4.0.0 resolution: "escape-string-regexp@npm:4.0.0" - checksum: 98b48897d93060f2322108bf29db0feba7dd774be96cd069458d1453347b25ce8682ecc39859d4bca2203cc0ab19c237bcc71755eff49a0f8d90beadeeba5cc5 + checksum: 9497d4dd307d845bd7f75180d8188bb17ea8c151c1edbf6b6717c100e104d629dc2dfb687686181b0f4b7d732c7dfdc4d5e7a8ff72de1b0ca283a75bbb3a9cd9 languageName: node linkType: hard "escodegen@npm:^2.0.0": - version: 2.0.0 - resolution: "escodegen@npm:2.0.0" + version: 2.1.0 + resolution: "escodegen@npm:2.1.0" dependencies: - esprima: ^4.0.1 - estraverse: ^5.2.0 - esutils: ^2.0.2 - optionator: ^0.8.1 - source-map: ~0.6.1 + esprima: "npm:^4.0.1" + estraverse: "npm:^5.2.0" + esutils: "npm:^2.0.2" + source-map: "npm:~0.6.1" dependenciesMeta: source-map: optional: true bin: escodegen: bin/escodegen.js esgenerate: bin/esgenerate.js - checksum: 5aa6b2966fafe0545e4e77936300cc94ad57cfe4dc4ebff9950492eaba83eef634503f12d7e3cbd644ecc1bab388ad0e92b06fd32222c9281a75d1cf02ec6cef + checksum: e1450a1f75f67d35c061bf0d60888b15f62ab63aef9df1901cffc81cffbbb9e8b3de237c5502cf8613a017c1df3a3003881307c78835a1ab54d8c8d2206e01d3 languageName: node linkType: hard -"eslint-config-bitauth@npm:^3.1.2": - version: 3.1.2 - resolution: "eslint-config-bitauth@npm:3.1.2" - dependencies: - "@typescript-eslint/eslint-plugin": 5.28.0 - eslint-config-prettier: ^8.5.0 +"eslint-config-bitauth@portal:./config/eslint-config-bitauth::locator=%40bitauth%2Flibauth%40workspace%3A.": + version: 0.0.0-use.local + resolution: "eslint-config-bitauth@portal:./config/eslint-config-bitauth::locator=%40bitauth%2Flibauth%40workspace%3A." peerDependencies: - "@typescript-eslint/parser": ">=5.9" + "@typescript-eslint/eslint-plugin": ">=6" + "@typescript-eslint/parser": ">=6" eslint: ">=8" - eslint-plugin-eslint-comments: ">=3.2" - eslint-plugin-functional: ">=4" - eslint-plugin-import: ">=2.25" - typescript: ">=4.5" - checksum: 2ab16014fac327a1d22598a4a5559cc64a188e21fc65633a794fe7694908cdc530f4271676ac2491810baa0d945b81816e53766ac5ef27692ad35de6bb54acf5 + eslint-config-prettier: ">=9" + eslint-plugin-eslint-comments: ">=3" + eslint-plugin-functional: ">=6" + eslint-plugin-import: ">=2" + eslint-plugin-tsdoc: ">=0.2" + typescript: ">=5" languageName: node - linkType: hard + linkType: soft -"eslint-config-prettier@npm:^8.5.0, eslint-config-prettier@npm:^8.6.0": - version: 8.6.0 - resolution: "eslint-config-prettier@npm:8.6.0" +"eslint-config-prettier@npm:^9.1.0": + version: 9.1.0 + resolution: "eslint-config-prettier@npm:9.1.0" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: ff0d0dfc839a556355422293428637e8d35693de58dabf8638bf0b6529131a109d0b2ade77521aa6e54573bb842d7d9d322e465dd73dd61c7590fa3834c3fa81 + checksum: 6d332694b36bc9ac6fdb18d3ca2f6ac42afa2ad61f0493e89226950a7091e38981b66bac2b47ba39d15b73fff2cd32c78b850a9cf9eed9ca9a96bfb2f3a2f10d languageName: node linkType: hard -"eslint-import-resolver-node@npm:^0.3.6": - version: 0.3.6 - resolution: "eslint-import-resolver-node@npm:0.3.6" +"eslint-import-resolver-node@npm:^0.3.9": + version: 0.3.9 + resolution: "eslint-import-resolver-node@npm:0.3.9" dependencies: - debug: ^3.2.7 - resolve: ^1.20.0 - checksum: 6266733af1e112970e855a5bcc2d2058fb5ae16ad2a6d400705a86b29552b36131ffc5581b744c23d550de844206fb55e9193691619ee4dbf225c4bde526b1c8 + debug: "npm:^3.2.7" + is-core-module: "npm:^2.13.0" + resolve: "npm:^1.22.4" + checksum: 0ea8a24a72328a51fd95aa8f660dcca74c1429806737cf10261ab90cfcaaf62fd1eff664b76a44270868e0a932711a81b250053942595bcd00a93b1c1575dd61 languageName: node linkType: hard -"eslint-module-utils@npm:^2.7.3": - version: 2.7.4 - resolution: "eslint-module-utils@npm:2.7.4" +"eslint-module-utils@npm:^2.8.0": + version: 2.8.0 + resolution: "eslint-module-utils@npm:2.8.0" dependencies: - debug: ^3.2.7 + debug: "npm:^3.2.7" peerDependenciesMeta: eslint: optional: true - checksum: 5da13645daff145a5c922896b258f8bba560722c3767254e458d894ff5fbb505d6dfd945bffa932a5b0ae06714da2379bd41011c4c20d2d59cc83e23895360f7 + checksum: c7a8d1a58d76ec8217a8fea49271ec8132d1b9390965a75f6a4ecbc9e5983d742195b46d2e4378231d2186801439fe1aa5700714b0bfd4eb17aac6e1b65309df languageName: node linkType: hard @@ -3834,70 +4125,58 @@ __metadata: version: 3.2.0 resolution: "eslint-plugin-eslint-comments@npm:3.2.0" dependencies: - escape-string-regexp: ^1.0.5 - ignore: ^5.0.5 + escape-string-regexp: "npm:^1.0.5" + ignore: "npm:^5.0.5" peerDependencies: eslint: ">=4.19.1" - checksum: c9fe273dd56699abdf7e416cfad0344eb50aa01564a5a9133e72d982defb89310bc2e9b0b148ce19c5190d7ff641223b0ba9e667a194bc48467c3dd0d471e657 + checksum: c71db824592dc8ea498021572a0bd33d763ef26126bdb3b84a027ca75a1adbe0894ec95024f7de39ef12308560e62cbf8af0d06ffe472be5ba8bd9169c928e96 languageName: node linkType: hard -"eslint-plugin-functional@npm:^4.4.1": - version: 4.4.1 - resolution: "eslint-plugin-functional@npm:4.4.1" - dependencies: - "@typescript-eslint/utils": ^5.10.2 - deepmerge-ts: ^4.0.3 - escape-string-regexp: ^4.0.0 - semver: ^7.3.7 +"eslint-plugin-functional@npm:^6.0.0": + version: 6.0.0 + resolution: "eslint-plugin-functional@npm:6.0.0" + dependencies: + "@typescript-eslint/utils": "npm:^6.2.0" + deepmerge-ts: "npm:^5.1.0" + escape-string-regexp: "npm:^4.0.0" + is-immutable-type: "npm:^2.0.1" + semver: "npm:^7.5.4" + ts-api-utils: "npm:^1.0.1" peerDependencies: eslint: ^8.0.0 - tsutils: ^3.0.0 - typescript: ^3.4.1 || ^4.0.0 + typescript: ">=4.3.5" peerDependenciesMeta: - tsutils: - optional: true typescript: optional: true - checksum: 00a6001e86db6294f93ba409a5fb9a88d218049460fdf2cfbd4d67ce08884382cf84b66cf536154d764d5db5c51e1747bbaa257cec17a602575d1a9fa9b91db8 - languageName: node - linkType: hard - -"eslint-plugin-import@npm:^2.26.0": - version: 2.26.0 - resolution: "eslint-plugin-import@npm:2.26.0" - dependencies: - array-includes: ^3.1.4 - array.prototype.flat: ^1.2.5 - debug: ^2.6.9 - doctrine: ^2.1.0 - eslint-import-resolver-node: ^0.3.6 - eslint-module-utils: ^2.7.3 - has: ^1.0.3 - is-core-module: ^2.8.1 - is-glob: ^4.0.3 - minimatch: ^3.1.2 - object.values: ^1.1.5 - resolve: ^1.22.0 - tsconfig-paths: ^3.14.1 - peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 0bf77ad80339554481eafa2b1967449e1f816b94c7a6f9614ce33fb4083c4e6c050f10d241dd50b4975d47922880a34de1e42ea9d8e6fd663ebb768baa67e655 - languageName: node - linkType: hard - -"eslint-plugin-prettier@npm:^4.2.1": - version: 4.2.1 - resolution: "eslint-plugin-prettier@npm:4.2.1" - dependencies: - prettier-linter-helpers: ^1.0.0 + checksum: e08e744ae74ee95a59af5c44cf9e4a4cce60568e64b84e331afff5e2cdb430c5ae1d0f0c3127370e574ee800dfcb42d7b47fd44c44d4773d076b281a23103f95 + languageName: node + linkType: hard + +"eslint-plugin-import@npm:^2.29.1": + version: 2.29.1 + resolution: "eslint-plugin-import@npm:2.29.1" + dependencies: + array-includes: "npm:^3.1.7" + array.prototype.findlastindex: "npm:^1.2.3" + array.prototype.flat: "npm:^1.3.2" + array.prototype.flatmap: "npm:^1.3.2" + debug: "npm:^3.2.7" + doctrine: "npm:^2.1.0" + eslint-import-resolver-node: "npm:^0.3.9" + eslint-module-utils: "npm:^2.8.0" + hasown: "npm:^2.0.0" + is-core-module: "npm:^2.13.1" + is-glob: "npm:^4.0.3" + minimatch: "npm:^3.1.2" + object.fromentries: "npm:^2.0.7" + object.groupby: "npm:^1.0.1" + object.values: "npm:^1.1.7" + semver: "npm:^6.3.1" + tsconfig-paths: "npm:^3.15.0" peerDependencies: - eslint: ">=7.28.0" - prettier: ">=2.0.0" - peerDependenciesMeta: - eslint-config-prettier: - optional: true - checksum: b9e839d2334ad8ec7a5589c5cb0f219bded260839a857d7a486997f9870e95106aa59b8756ff3f37202085ebab658de382b0267cae44c3a7f0eb0bcc03a4f6d6 + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + checksum: 5f35dfbf4e8e67f741f396987de9504ad125c49f4144508a93282b4ea0127e052bde65ab6def1f31b6ace6d5d430be698333f75bdd7dca3bc14226c92a083196 languageName: node linkType: hard @@ -3905,114 +4184,92 @@ __metadata: version: 0.2.17 resolution: "eslint-plugin-tsdoc@npm:0.2.17" dependencies: - "@microsoft/tsdoc": 0.14.2 - "@microsoft/tsdoc-config": 0.16.2 - checksum: d143a5f1c5967812d75f246ae2776cb030f6e7966b981406c9df9352a9ab02b035f294cedb30054eac2c4a217ee4ab2ed9fb76292bdccda9438e54d2d7b0146e - languageName: node - linkType: hard - -"eslint-scope@npm:^5.1.1": - version: 5.1.1 - resolution: "eslint-scope@npm:5.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^4.1.1 - checksum: 47e4b6a3f0cc29c7feedee6c67b225a2da7e155802c6ea13bbef4ac6b9e10c66cd2dcb987867ef176292bf4e64eccc680a49e35e9e9c669f4a02bac17e86abdb - languageName: node - linkType: hard - -"eslint-scope@npm:^7.1.1": - version: 7.1.1 - resolution: "eslint-scope@npm:7.1.1" - dependencies: - esrecurse: ^4.3.0 - estraverse: ^5.2.0 - checksum: 9f6e974ab2db641ca8ab13508c405b7b859e72afe9f254e8131ff154d2f40c99ad4545ce326fd9fde3212ff29707102562a4834f1c48617b35d98c71a97fbf3e + "@microsoft/tsdoc": "npm:0.14.2" + "@microsoft/tsdoc-config": "npm:0.16.2" + checksum: 26cad40b22f3dc0adfb06b1ea12f7d3c9cb257ac8bb56ad6a023e3b3bdfc6144d95a8b01323563e75283cca90baaf4d68816f5cea6994c6cd660a642e820847a languageName: node linkType: hard -"eslint-utils@npm:^3.0.0": - version: 3.0.0 - resolution: "eslint-utils@npm:3.0.0" +"eslint-scope@npm:^7.2.2": + version: 7.2.2 + resolution: "eslint-scope@npm:7.2.2" dependencies: - eslint-visitor-keys: ^2.0.0 - peerDependencies: - eslint: ">=5" - checksum: 0668fe02f5adab2e5a367eee5089f4c39033af20499df88fe4e6aba2015c20720404d8c3d6349b6f716b08fdf91b9da4e5d5481f265049278099c4c836ccb619 + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 languageName: node linkType: hard "eslint-visitor-keys@npm:^2.0.0": version: 2.1.0 resolution: "eslint-visitor-keys@npm:2.1.0" - checksum: e3081d7dd2611a35f0388bbdc2f5da60b3a3c5b8b6e928daffff7391146b434d691577aa95064c8b7faad0b8a680266bcda0a42439c18c717b80e6718d7e267d - languageName: node - linkType: hard - -"eslint-visitor-keys@npm:^3.3.0": - version: 3.3.0 - resolution: "eslint-visitor-keys@npm:3.3.0" - checksum: d59e68a7c5a6d0146526b0eec16ce87fbf97fe46b8281e0d41384224375c4e52f5ffb9e16d48f4ea50785cde93f766b0c898e31ab89978d88b0e1720fbfb7808 - languageName: node - linkType: hard - -"eslint@npm:8.31.0": - version: 8.31.0 - resolution: "eslint@npm:8.31.0" - dependencies: - "@eslint/eslintrc": ^1.4.1 - "@humanwhocodes/config-array": ^0.11.8 - "@humanwhocodes/module-importer": ^1.0.1 - "@nodelib/fs.walk": ^1.2.8 - ajv: ^6.10.0 - chalk: ^4.0.0 - cross-spawn: ^7.0.2 - debug: ^4.3.2 - doctrine: ^3.0.0 - escape-string-regexp: ^4.0.0 - eslint-scope: ^7.1.1 - eslint-utils: ^3.0.0 - eslint-visitor-keys: ^3.3.0 - espree: ^9.4.0 - esquery: ^1.4.0 - esutils: ^2.0.2 - fast-deep-equal: ^3.1.3 - file-entry-cache: ^6.0.1 - find-up: ^5.0.0 - glob-parent: ^6.0.2 - globals: ^13.19.0 - grapheme-splitter: ^1.0.4 - ignore: ^5.2.0 - import-fresh: ^3.0.0 - imurmurhash: ^0.1.4 - is-glob: ^4.0.0 - is-path-inside: ^3.0.3 - js-sdsl: ^4.1.4 - js-yaml: ^4.1.0 - json-stable-stringify-without-jsonify: ^1.0.1 - levn: ^0.4.1 - lodash.merge: ^4.6.2 - minimatch: ^3.1.2 - natural-compare: ^1.4.0 - optionator: ^0.9.1 - regexpp: ^3.2.0 - strip-ansi: ^6.0.1 - strip-json-comments: ^3.1.0 - text-table: ^0.2.0 + checksum: 9f0e3a2db751d84067d15977ac4b4472efd6b303e369e6ff241a99feac04da758f46d5add022c33d06b53596038dbae4b4aceb27c7e68b8dfc1055b35e495787 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": + version: 3.4.3 + resolution: "eslint-visitor-keys@npm:3.4.3" + checksum: 92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 + languageName: node + linkType: hard + +"eslint@npm:8.56.0": + version: 8.56.0 + resolution: "eslint@npm:8.56.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.56.0" + "@humanwhocodes/config-array": "npm:^0.11.13" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" bin: eslint: bin/eslint.js - checksum: 5e5688bb864edc6b12d165849994812eefa67fb3fc44bb26f53659b63edcd8bcc68389d27cc6cc9e5b79ee22f24b6f311fa3ed047bddcafdec7d84c1b5561e4f + checksum: 2be598f7da1339d045ad933ffd3d4742bee610515cd2b0d9a2b8b729395a01d4e913552fff555b559fccaefd89d7b37632825789d1b06470608737ae69ab43fb languageName: node linkType: hard -"espree@npm:^9.4.0": - version: 9.4.1 - resolution: "espree@npm:9.4.1" +"espree@npm:^9.6.0, espree@npm:^9.6.1": + version: 9.6.1 + resolution: "espree@npm:9.6.1" dependencies: - acorn: ^8.8.0 - acorn-jsx: ^5.3.2 - eslint-visitor-keys: ^3.3.0 - checksum: 4d266b0cf81c7dfe69e542c7df0f246e78d29f5b04dda36e514eb4c7af117ee6cfbd3280e560571ed82ff6c9c3f0003c05b82583fc7a94006db7497c4fe4270e + acorn: "npm:^8.9.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^3.4.1" + checksum: 1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 languageName: node linkType: hard @@ -4022,16 +4279,16 @@ __metadata: bin: esparse: ./bin/esparse.js esvalidate: ./bin/esvalidate.js - checksum: b45bc805a613dbea2835278c306b91aff6173c8d034223fa81498c77dcbce3b2931bf6006db816f62eacd9fd4ea975dfd85a5b7f3c6402cfd050d4ca3c13a628 + checksum: ad4bab9ead0808cf56501750fd9d3fb276f6b105f987707d059005d57e182d18a7c9ec7f3a01794ebddcca676773e42ca48a32d67a250c9d35e009ca613caba3 languageName: node linkType: hard -"esquery@npm:^1.4.0": - version: 1.4.0 - resolution: "esquery@npm:1.4.0" +"esquery@npm:^1.4.2": + version: 1.5.0 + resolution: "esquery@npm:1.5.0" dependencies: - estraverse: ^5.1.0 - checksum: a0807e17abd7fbe5fbd4fab673038d6d8a50675cdae6b04fbaa520c34581be0c5fa24582990e8acd8854f671dd291c78bb2efb9e0ed5b62f33bac4f9cf820210 + estraverse: "npm:^5.1.0" + checksum: a084bd049d954cc88ac69df30534043fb2aee5555b56246493f42f27d1e168f00d9e5d4192e46f10290d312dc30dc7d58994d61a609c579c1219d636996f9213 languageName: node linkType: hard @@ -4039,67 +4296,53 @@ __metadata: version: 4.3.0 resolution: "esrecurse@npm:4.3.0" dependencies: - estraverse: ^5.2.0 - checksum: ebc17b1a33c51cef46fdc28b958994b1dc43cd2e86237515cbc3b4e5d2be6a811b2315d0a1a4d9d340b6d2308b15322f5c8291059521cc5f4802f65e7ec32837 - languageName: node - linkType: hard - -"estraverse@npm:^4.1.1": - version: 4.3.0 - resolution: "estraverse@npm:4.3.0" - checksum: a6299491f9940bb246124a8d44b7b7a413a8336f5436f9837aaa9330209bd9ee8af7e91a654a3545aee9c54b3308e78ee360cef1d777d37cfef77d2fa33b5827 + estraverse: "npm:^5.2.0" + checksum: 81a37116d1408ded88ada45b9fb16dbd26fba3aadc369ce50fcaf82a0bac12772ebd7b24cd7b91fc66786bf2c1ac7b5f196bc990a473efff972f5cb338877cf5 languageName: node linkType: hard "estraverse@npm:^5.1.0, estraverse@npm:^5.2.0": version: 5.3.0 resolution: "estraverse@npm:5.3.0" - checksum: 072780882dc8416ad144f8fe199628d2b3e7bbc9989d9ed43795d2c90309a2047e6bc5979d7e2322a341163d22cfad9e21f4110597fe487519697389497e4e2b - languageName: node - linkType: hard - -"estree-walker@npm:^1.0.1": - version: 1.0.1 - resolution: "estree-walker@npm:1.0.1" - checksum: 7e70da539691f6db03a08e7ce94f394ce2eef4180e136d251af299d41f92fb2d28ebcd9a6e393e3728d7970aeb5358705ddf7209d52fbcb2dd4693f95dcf925f + checksum: 1ff9447b96263dec95d6d67431c5e0771eb9776427421260a3e2f0fdd5d6bd4f8e37a7338f5ad2880c9f143450c9b1e4fc2069060724570a49cf9cf0312bd107 languageName: node linkType: hard -"estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2": +"estree-walker@npm:2.0.2, estree-walker@npm:^2.0.1, estree-walker@npm:^2.0.2": version: 2.0.2 resolution: "estree-walker@npm:2.0.2" - checksum: 6151e6f9828abe2259e57f5fd3761335bb0d2ebd76dc1a01048ccee22fabcfef3c0859300f6d83ff0d1927849368775ec5a6d265dde2f6de5a1be1721cd94efc + checksum: 53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af languageName: node linkType: hard "esutils@npm:^2.0.2, esutils@npm:^2.0.3": version: 2.0.3 resolution: "esutils@npm:2.0.3" - checksum: 22b5b08f74737379a840b8ed2036a5fb35826c709ab000683b092d9054e5c2a82c27818f12604bfc2a9a76b90b6834ef081edbc1c7ae30d1627012e067c6ec87 + checksum: 9a2fe69a41bfdade834ba7c42de4723c97ec776e40656919c62cbd13607c45e127a003f05f724a1ea55e5029a4cf2de444b13009f2af71271e42d93a637137c7 languageName: node linkType: hard "etag@npm:~1.8.1": version: 1.8.1 resolution: "etag@npm:1.8.1" - checksum: 571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff + checksum: 12be11ef62fb9817314d790089a0a49fae4e1b50594135dcb8076312b7d7e470884b5100d249b28c18581b7fd52f8b485689ffae22a11ed9ec17377a33a08f84 languageName: node linkType: hard -"execa@npm:^5.1.1": - version: 5.1.1 - resolution: "execa@npm:5.1.1" +"execa@npm:^7.1.1": + version: 7.2.0 + resolution: "execa@npm:7.2.0" dependencies: - cross-spawn: ^7.0.3 - get-stream: ^6.0.0 - human-signals: ^2.1.0 - is-stream: ^2.0.0 - merge-stream: ^2.0.0 - npm-run-path: ^4.0.1 - onetime: ^5.1.2 - signal-exit: ^3.0.3 - strip-final-newline: ^2.0.0 - checksum: fba9022c8c8c15ed862847e94c252b3d946036d7547af310e344a527e59021fd8b6bb0723883ea87044dc4f0201f949046993124a42ccb0855cae5bf8c786343 + cross-spawn: "npm:^7.0.3" + get-stream: "npm:^6.0.1" + human-signals: "npm:^4.3.0" + is-stream: "npm:^3.0.0" + merge-stream: "npm:^2.0.0" + npm-run-path: "npm:^5.1.0" + onetime: "npm:^6.0.0" + signal-exit: "npm:^3.0.7" + strip-final-newline: "npm:^3.0.0" + checksum: 098cd6a1bc26d509e5402c43f4971736450b84d058391820c6f237aeec6436963e006fd8423c9722f148c53da86aa50045929c7278b5522197dff802d10f9885 languageName: node linkType: hard @@ -4107,8 +4350,15 @@ __metadata: version: 2.0.2 resolution: "expand-tilde@npm:2.0.2" dependencies: - homedir-polyfill: ^1.0.1 - checksum: 2efe6ed407d229981b1b6ceb552438fbc9e5c7d6a6751ad6ced3e0aa5cf12f0b299da695e90d6c2ac79191b5c53c613e508f7149e4573abfbb540698ddb7301a + homedir-polyfill: "npm:^1.0.1" + checksum: 205a60497422746d1c3acbc1d65bd609b945066f239a2b785e69a7a651ac4cbeb4e08555b1ea0023abbe855e6fcb5bbf27d0b371367fdccd303d4fb2b4d66845 + languageName: node + linkType: hard + +"exponential-backoff@npm:^3.1.1": + version: 3.1.1 + resolution: "exponential-backoff@npm:3.1.1" + checksum: 160456d2d647e6019640bd07111634d8c353038d9fa40176afb7cd49b0548bdae83b56d05e907c2cce2300b81cae35d800ef92fefb9d0208e190fa3b7d6bb579 languageName: node linkType: hard @@ -4116,38 +4366,38 @@ __metadata: version: 4.18.2 resolution: "express@npm:4.18.2" dependencies: - accepts: ~1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.1 - content-disposition: 0.5.4 - content-type: ~1.0.4 - cookie: 0.5.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - etag: ~1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: ~1.1.2 - on-finished: 2.4.1 - parseurl: ~1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: ~2.0.7 - qs: 6.11.0 - range-parser: ~1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: ~1.6.18 - utils-merge: 1.0.1 - vary: ~1.1.2 - checksum: 3c4b9b076879442f6b968fe53d85d9f1eeacbb4f4c41e5f16cc36d77ce39a2b0d81b3f250514982110d815b2f7173f5561367f9110fcc541f9371948e8c8b037 + accepts: "npm:~1.3.8" + array-flatten: "npm:1.1.1" + body-parser: "npm:1.20.1" + content-disposition: "npm:0.5.4" + content-type: "npm:~1.0.4" + cookie: "npm:0.5.0" + cookie-signature: "npm:1.0.6" + debug: "npm:2.6.9" + depd: "npm:2.0.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + finalhandler: "npm:1.2.0" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + merge-descriptors: "npm:1.0.1" + methods: "npm:~1.1.2" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + path-to-regexp: "npm:0.1.7" + proxy-addr: "npm:~2.0.7" + qs: "npm:6.11.0" + range-parser: "npm:~1.2.1" + safe-buffer: "npm:5.2.1" + send: "npm:0.18.0" + serve-static: "npm:1.15.0" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + type-is: "npm:~1.6.18" + utils-merge: "npm:1.0.1" + vary: "npm:~1.1.2" + checksum: 75af556306b9241bc1d7bdd40c9744b516c38ce50ae3210658efcbf96e3aed4ab83b3432f06215eae5610c123bc4136957dc06e50dfc50b7d4d775af56c4c59c languageName: node linkType: hard @@ -4155,77 +4405,60 @@ __metadata: version: 3.1.0 resolution: "external-editor@npm:3.1.0" dependencies: - chardet: ^0.7.0 - iconv-lite: ^0.4.24 - tmp: ^0.0.33 - checksum: 1c2a616a73f1b3435ce04030261bed0e22d4737e14b090bb48e58865da92529c9f2b05b893de650738d55e692d071819b45e1669259b2b354bc3154d27a698c7 - languageName: node - linkType: hard - -"extract-zip@npm:2.0.1": - version: 2.0.1 - resolution: "extract-zip@npm:2.0.1" - dependencies: - "@types/yauzl": ^2.9.1 - debug: ^4.1.1 - get-stream: ^5.1.0 - yauzl: ^2.10.0 - dependenciesMeta: - "@types/yauzl": - optional: true - bin: - extract-zip: cli.js - checksum: 8cbda9debdd6d6980819cc69734d874ddd71051c9fe5bde1ef307ebcedfe949ba57b004894b585f758b7c9eeeea0e3d87f2dda89b7d25320459c2c9643ebb635 + chardet: "npm:^0.7.0" + iconv-lite: "npm:^0.4.24" + tmp: "npm:^0.0.33" + checksum: c98f1ba3efdfa3c561db4447ff366a6adb5c1e2581462522c56a18bf90dfe4da382f9cd1feee3e330108c3595a854b218272539f311ba1b3298f841eb0fbf339 languageName: node linkType: hard -"fast-check@npm:^3.0.0, fast-check@npm:^3.5.0": - version: 3.5.0 - resolution: "fast-check@npm:3.5.0" +"fast-check@npm:^3.0.0, fast-check@npm:^3.15.0": + version: 3.15.0 + resolution: "fast-check@npm:3.15.0" dependencies: - pure-rand: ^5.0.2 - checksum: 5725ef677919bec3982c7187534a6f8e2369659c1f187ec6eb79a4e94d8e09c6d713bf447be47269c11254c876431c93115c873a72b4174f9b15f164402149af + pure-rand: "npm:^6.0.0" + checksum: eabd8203f2d95fcd6dc37eb1a381d3f1320f3b15de18056c6648e046fe1a751c22a866c96fc5fb2a7d477d3886183275c6ea6d24230263f158d53c55391395f6 languageName: node linkType: hard "fast-deep-equal@npm:^2.0.1": version: 2.0.1 resolution: "fast-deep-equal@npm:2.0.1" - checksum: b701835a87985e0ec4925bdf1f0c1e7eb56309b5d12d534d5b4b69d95a54d65bb16861c081781ead55f73f12d6c60ba668713391ee7fbf6b0567026f579b7b0b + checksum: 1602e0d6ed63493c865cc6b03f9070d6d3926e8cd086a123060b58f80a295f3f08b1ecfb479ae7c45b7fd45535202aea7cf5b49bc31bffb81c20b1502300be84 languageName: node linkType: hard "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" - checksum: e21a9d8d84f53493b6aa15efc9cfd53dd5b714a1f23f67fb5dc8f574af80df889b3bce25dc081887c6d25457cce704e636395333abad896ccdec03abaf1f3f9d + checksum: 40dedc862eb8992c54579c66d914635afbec43350afbbe991235fdcb4e3a8d5af1b23ae7e79bef7d4882d0ecee06c3197488026998fb19f72dc95acff1d1b1d0 languageName: node linkType: hard -"fast-diff@npm:^1.1.2, fast-diff@npm:^1.2.0": - version: 1.2.0 - resolution: "fast-diff@npm:1.2.0" - checksum: 1b5306eaa9e826564d9e5ffcd6ebd881eb5f770b3f977fcbf38f05c824e42172b53c79920e8429c54eb742ce15a0caf268b0fdd5b38f6de52234c4a8368131ae +"fast-diff@npm:^1.2.0": + version: 1.3.0 + resolution: "fast-diff@npm:1.3.0" + checksum: 5c19af237edb5d5effda008c891a18a585f74bf12953be57923f17a3a4d0979565fc64dbc73b9e20926b9d895f5b690c618cbb969af0cf022e3222471220ad29 languageName: node linkType: hard -"fast-equals@npm:^4.0.3": - version: 4.0.3 - resolution: "fast-equals@npm:4.0.3" - checksum: 3d5935b757f9f2993e59b5164a7a9eeda0de149760495375cde14a4ed725186a7e6c1c0d58f7d42d2f91deb97f3fce1e0aad5591916ef0984278199a85c87c87 +"fast-equals@npm:^5.0.1": + version: 5.0.1 + resolution: "fast-equals@npm:5.0.1" + checksum: d7077b8b681036c2840ed9860a3048e44fc268fad2b525b8f25b43458be0c8ad976152eb4b475de9617170423c5b802121ebb61ed6641c3ac035fadaf805c8c0 languageName: node linkType: hard -"fast-glob@npm:^3.2.11, fast-glob@npm:^3.2.9": - version: 3.2.12 - resolution: "fast-glob@npm:3.2.12" +"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2": + version: 3.3.2 + resolution: "fast-glob@npm:3.3.2" dependencies: - "@nodelib/fs.stat": ^2.0.2 - "@nodelib/fs.walk": ^1.2.3 - glob-parent: ^5.1.2 - merge2: ^1.3.0 - micromatch: ^4.0.4 - checksum: 0b1990f6ce831c7e28c4d505edcdaad8e27e88ab9fa65eedadb730438cfc7cde4910d6c975d6b7b8dc8a73da4773702ebcfcd6e3518e73938bb1383badfe01c2 + "@nodelib/fs.stat": "npm:^2.0.2" + "@nodelib/fs.walk": "npm:^1.2.3" + glob-parent: "npm:^5.1.2" + merge2: "npm:^1.3.0" + micromatch: "npm:^4.0.4" + checksum: 42baad7b9cd40b63e42039132bde27ca2cb3a4950d0a0f9abe4639ea1aa9d3e3b40f98b1fe31cbc0cc17b664c9ea7447d911a152fa34ec5b72977b125a6fc845 languageName: node linkType: hard @@ -4233,40 +4466,31 @@ __metadata: version: 2.2.1 resolution: "fast-json-patch@npm:2.2.1" dependencies: - fast-deep-equal: ^2.0.1 - checksum: 955aebb3f873d1fb0452a5d8c34865ce4c3c6cdafeb7d3ad98d43b467de9a5a0d304132f8595fd2b373f8f4d200605947e865286b180f3a55e8377a634893164 + fast-deep-equal: "npm:^2.0.1" + checksum: 3200148b8244081ac628e8044a3ba6c42bbe26542d1586b0e87221bff8d5ef58252a2dd846a709ff4683cf826e89123025c2708729933dde859430a40f0d321e languageName: node linkType: hard "fast-json-stable-stringify@npm:^2.0.0, fast-json-stable-stringify@npm:^2.1.0": version: 2.1.0 resolution: "fast-json-stable-stringify@npm:2.1.0" - checksum: b191531e36c607977e5b1c47811158733c34ccb3bfde92c44798929e9b4154884378536d26ad90dfecd32e1ffc09c545d23535ad91b3161a27ddbb8ebe0cbecb + checksum: 7f081eb0b8a64e0057b3bb03f974b3ef00135fbf36c1c710895cd9300f13c94ba809bb3a81cf4e1b03f6e5285610a61abbd7602d0652de423144dfee5a389c9b languageName: node linkType: hard -"fast-levenshtein@npm:^2.0.6, fast-levenshtein@npm:~2.0.6": +"fast-levenshtein@npm:^2.0.6": version: 2.0.6 resolution: "fast-levenshtein@npm:2.0.6" - checksum: 92cfec0a8dfafd9c7a15fba8f2cc29cd0b62b85f056d99ce448bbcd9f708e18ab2764bda4dd5158364f4145a7c72788538994f0d1787b956ef0d1062b0f7c24c + checksum: 111972b37338bcb88f7d9e2c5907862c280ebf4234433b95bc611e518d192ccb2d38119c4ac86e26b668d75f7f3894f4ff5c4982899afced7ca78633b08287c4 languageName: node linkType: hard "fastq@npm:^1.6.0": - version: 1.15.0 - resolution: "fastq@npm:1.15.0" - dependencies: - reusify: ^1.0.4 - checksum: 0170e6bfcd5d57a70412440b8ef600da6de3b2a6c5966aeaf0a852d542daff506a0ee92d6de7679d1de82e644bce69d7a574a6c93f0b03964b5337eed75ada1a - languageName: node - linkType: hard - -"fd-slicer@npm:~1.1.0": - version: 1.1.0 - resolution: "fd-slicer@npm:1.1.0" + version: 1.16.0 + resolution: "fastq@npm:1.16.0" dependencies: - pend: ~1.2.0 - checksum: c8585fd5713f4476eb8261150900d2cb7f6ff2d87f8feb306ccc8a1122efd152f1783bdb2b8dc891395744583436bfd8081d8e63ece0ec8687eeefea394d4ff2 + reusify: "npm:^1.0.4" + checksum: 38c1b49adba639af020727284a02af021acab764efd7f088bc31364e8a5b01ce9031eb6c5f7f304019b8267c3b7c236e79d6904884f50f94f83b1700b8a6619a languageName: node linkType: hard @@ -4274,18 +4498,17 @@ __metadata: version: 3.2.0 resolution: "figures@npm:3.2.0" dependencies: - escape-string-regexp: ^1.0.5 - checksum: 85a6ad29e9aca80b49b817e7c89ecc4716ff14e3779d9835af554db91bac41c0f289c418923519392a1e582b4d10482ad282021330cd045bb7b80c84152f2a2b + escape-string-regexp: "npm:^1.0.5" + checksum: 9c421646ede432829a50bc4e55c7a4eb4bcb7cc07b5bab2f471ef1ab9a344595bbebb6c5c21470093fbb730cd81bbca119624c40473a125293f656f49cb47629 languageName: node linkType: hard -"figures@npm:^5.0.0": - version: 5.0.0 - resolution: "figures@npm:5.0.0" +"figures@npm:^6.0.1": + version: 6.0.1 + resolution: "figures@npm:6.0.1" dependencies: - escape-string-regexp: ^5.0.0 - is-unicode-supported: ^1.2.0 - checksum: e6e8b6d1df2f554d4effae4a5ceff5d796f9449f6d4e912d74dab7d5f25916ecda6c305b9084833157d56485a0c78b37164430ddc5675bcee1330e346710669e + is-unicode-supported: "npm:^2.0.0" + checksum: 1bd53404e49b16dc4c930f8b01d0b97233e2f9e217365e7b7d15db1097d219a3db6739c17853affec034ef6461751b0e426f9fa82e2199b9340358e13eadca93 languageName: node linkType: hard @@ -4293,42 +4516,58 @@ __metadata: version: 6.0.1 resolution: "file-entry-cache@npm:6.0.1" dependencies: - flat-cache: ^3.0.4 - checksum: f49701feaa6314c8127c3c2f6173cfefff17612f5ed2daaafc6da13b5c91fd43e3b2a58fd0d63f9f94478a501b167615931e7200e31485e320f74a33885a9c74 + flat-cache: "npm:^3.0.4" + checksum: 58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + languageName: node + linkType: hard + +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" + dependencies: + flat-cache: "npm:^4.0.0" + checksum: 9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 languageName: node linkType: hard -"file-type@npm:^18.0.0": - version: 18.0.0 - resolution: "file-type@npm:18.0.0" +"file-type@npm:^18.7.0": + version: 18.7.0 + resolution: "file-type@npm:18.7.0" dependencies: - readable-web-to-node-stream: ^3.0.2 - strtok3: ^7.0.0 - token-types: ^5.0.1 - checksum: 67f5a927b8030e35a4faf9dd9dea9e17bcb042fb61b9851b7dd1b1b3bb3ecfdd9f83bc3bc72686316ea2bac70df652c61e10affa9b5957b1a3d731df4925e3cb + readable-web-to-node-stream: "npm:^3.0.2" + strtok3: "npm:^7.0.0" + token-types: "npm:^5.0.1" + checksum: bd06a5a5b2ba13892e8690f01eaacdad1136e0cd8fcc92a2c558a76c0192e8b95e7dddebd3c996f1124ca009ec2f7562537682f361df519e4a369b55b40926a7 + languageName: node + linkType: hard + +"file-uri-to-path@npm:1.0.0": + version: 1.0.0 + resolution: "file-uri-to-path@npm:1.0.0" + checksum: 3b545e3a341d322d368e880e1c204ef55f1d45cdea65f7efc6c6ce9e0c4d22d802d5629320eb779d006fe59624ac17b0e848d83cc5af7cd101f206cb704f5519 languageName: node linkType: hard "filing-cabinet@npm:^3.0.1": - version: 3.3.0 - resolution: "filing-cabinet@npm:3.3.0" - dependencies: - app-module-path: ^2.2.0 - commander: ^2.20.3 - debug: ^4.3.3 - enhanced-resolve: ^5.8.3 - is-relative-path: ^1.0.2 - module-definition: ^3.3.1 - module-lookup-amd: ^7.0.1 - resolve: ^1.21.0 - resolve-dependency-path: ^2.0.0 - sass-lookup: ^3.0.0 - stylus-lookup: ^3.0.1 - tsconfig-paths: ^3.10.1 - typescript: ^3.9.7 + version: 3.3.1 + resolution: "filing-cabinet@npm:3.3.1" + dependencies: + app-module-path: "npm:^2.2.0" + commander: "npm:^2.20.3" + debug: "npm:^4.3.3" + enhanced-resolve: "npm:^5.8.3" + is-relative-path: "npm:^1.0.2" + module-definition: "npm:^3.3.1" + module-lookup-amd: "npm:^7.0.1" + resolve: "npm:^1.21.0" + resolve-dependency-path: "npm:^2.0.0" + sass-lookup: "npm:^3.0.0" + stylus-lookup: "npm:^3.0.1" + tsconfig-paths: "npm:^3.10.1" + typescript: "npm:^3.9.7" bin: filing-cabinet: bin/cli.js - checksum: fbf4dfabf22c28233f79124e097148d28786120a456d1a164f9f716968cd2b1286f72355a27aeb99d1026d9deb174bddaec73a210223f3623ceddc7853e4a72a + checksum: fef434fd0fed76ecea3c21b3e4d030c030825a94c76af48502dc88570a85c927c280f8264f7a1f28d120e4d99bc35f4ba25ad3b99558d2c8a02be67d5980c99d languageName: node linkType: hard @@ -4336,8 +4575,8 @@ __metadata: version: 7.0.1 resolution: "fill-range@npm:7.0.1" dependencies: - to-regex-range: ^5.0.1 - checksum: cc283f4e65b504259e64fd969bcf4def4eb08d85565e906b7d36516e87819db52029a76b6363d0f02d0d532f0033c9603b9e2d943d56ee3b0d4f7ad3328ff917 + to-regex-range: "npm:^5.0.1" + checksum: 7cdad7d426ffbaadf45aeb5d15ec675bbd77f7597ad5399e3d2766987ed20bda24d5fac64b3ee79d93276f5865608bb22344a26b9b1ae6c4d00bd94bf611623f languageName: node linkType: hard @@ -4345,14 +4584,14 @@ __metadata: version: 1.2.0 resolution: "finalhandler@npm:1.2.0" dependencies: - debug: 2.6.9 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - on-finished: 2.4.1 - parseurl: ~1.3.3 - statuses: 2.0.1 - unpipe: ~1.0.0 - checksum: 92effbfd32e22a7dff2994acedbd9bcc3aa646a3e919ea6a53238090e87097f8ef07cced90aa2cc421abdf993aefbdd5b00104d55c7c5479a8d00ed105b45716 + debug: "npm:2.6.9" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + on-finished: "npm:2.4.1" + parseurl: "npm:~1.3.3" + statuses: "npm:2.0.1" + unpipe: "npm:~1.0.0" + checksum: 64b7e5ff2ad1fcb14931cd012651631b721ce657da24aedb5650ddde9378bf8e95daa451da43398123f5de161a81e79ff5affe4f9f2a6d2df4a813d6d3e254b7 languageName: node linkType: hard @@ -4360,16 +4599,23 @@ __metadata: version: 2.1.3 resolution: "find-node-modules@npm:2.1.3" dependencies: - findup-sync: ^4.0.0 - merge: ^2.1.1 - checksum: 4b8a194ffd56ccf1a1033de35e2ee8209869b05cce68ff7c4ab0dbf04e63fd7196283383eee4c84596c7b311755b2836815209d558234cadc330a87881e5a3f4 + findup-sync: "npm:^4.0.0" + merge: "npm:^2.1.1" + checksum: 61fd8300635f6b6237985f05ef9ba01dbd29482c625c8c34a321fe5e9e69a48f4ab9e03c3026cd22eb2b6618d01309b515a7cf73dd886fc2cf099f2e4ecaf598 languageName: node linkType: hard "find-root@npm:1.1.0": version: 1.1.0 resolution: "find-root@npm:1.1.0" - checksum: b2a59fe4b6c932eef36c45a048ae8f93c85640212ebe8363164814990ee20f154197505965f3f4f102efc33bfb1cbc26fd17c4a2fc739ebc51b886b137cbefaf + checksum: 1abc7f3bf2f8d78ff26d9e00ce9d0f7b32e5ff6d1da2857bcdf4746134c422282b091c672cde0572cac3840713487e0a7a636af9aa1b74cb11894b447a521efa + languageName: node + linkType: hard + +"find-up-simple@npm:^1.0.0": + version: 1.0.0 + resolution: "find-up-simple@npm:1.0.0" + checksum: de1ad5e55c8c162f5600fe3297bb55a3da5cd9cb8c6755e463ec1d52c4c15a84e312a68397fb5962d13263b3dbd4ea294668c465ccacc41291d7cc97588769f9 languageName: node linkType: hard @@ -4377,8 +4623,8 @@ __metadata: version: 2.1.0 resolution: "find-up@npm:2.1.0" dependencies: - locate-path: ^2.0.0 - checksum: 43284fe4da09f89011f08e3c32cd38401e786b19226ea440b75386c1b12a4cb738c94969808d53a84f564ede22f732c8409e3cfc3f7fb5b5c32378ad0bbf28bd + locate-path: "npm:^2.0.0" + checksum: c080875c9fe28eb1962f35cbe83c683796a0321899f1eed31a37577800055539815de13d53495049697d3ba313013344f843bb9401dd337a1b832be5edfc6840 languageName: node linkType: hard @@ -4386,8 +4632,8 @@ __metadata: version: 3.0.0 resolution: "find-up@npm:3.0.0" dependencies: - locate-path: ^3.0.0 - checksum: 38eba3fe7a66e4bc7f0f5a1366dc25508b7cfc349f852640e3678d26ad9a6d7e2c43eff0a472287de4a9753ef58f066a0ea892a256fa3636ad51b3fe1e17fae9 + locate-path: "npm:^3.0.0" + checksum: 2c2e7d0a26db858e2f624f39038c74739e38306dee42b45f404f770db357947be9d0d587f1cac72d20c114deb38aa57316e879eb0a78b17b46da7dab0a3bd6e3 languageName: node linkType: hard @@ -4395,9 +4641,9 @@ __metadata: version: 4.1.0 resolution: "find-up@npm:4.1.0" dependencies: - locate-path: ^5.0.0 - path-exists: ^4.0.0 - checksum: 4c172680e8f8c1f78839486e14a43ef82e9decd0e74145f40707cc42e7420506d5ec92d9a11c22bd2c48fb0c384ea05dd30e10dd152fefeec6f2f75282a8b844 + locate-path: "npm:^5.0.0" + path-exists: "npm:^4.0.0" + checksum: 0406ee89ebeefa2d507feb07ec366bebd8a6167ae74aa4e34fb4c4abd06cf782a3ce26ae4194d70706f72182841733f00551c209fe575cb00bd92104056e78c1 languageName: node linkType: hard @@ -4405,19 +4651,9 @@ __metadata: version: 5.0.0 resolution: "find-up@npm:5.0.0" dependencies: - locate-path: ^6.0.0 - path-exists: ^4.0.0 - checksum: 07955e357348f34660bde7920783204ff5a26ac2cafcaa28bace494027158a97b9f56faaf2d89a6106211a8174db650dd9f503f9c0d526b1202d5554a00b9095 - languageName: node - linkType: hard - -"find-up@npm:^6.0.0": - version: 6.3.0 - resolution: "find-up@npm:6.3.0" - dependencies: - locate-path: ^7.1.0 - path-exists: ^5.0.0 - checksum: 9a21b7f9244a420e54c6df95b4f6fc3941efd3c3e5476f8274eb452f6a85706e7a6a90de71353ee4f091fcb4593271a6f92810a324ec542650398f928783c280 + locate-path: "npm:^6.0.0" + path-exists: "npm:^4.0.0" + checksum: 062c5a83a9c02f53cdd6d175a37ecf8f87ea5bbff1fdfb828f04bfa021441bc7583e8ebc0872a4c1baab96221fb8a8a275a19809fb93fbc40bd69ec35634069a languageName: node linkType: hard @@ -4425,42 +4661,54 @@ __metadata: version: 4.0.0 resolution: "findup-sync@npm:4.0.0" dependencies: - detect-file: ^1.0.0 - is-glob: ^4.0.0 - micromatch: ^4.0.2 - resolve-dir: ^1.0.1 - checksum: 94131e1107ad63790ed00c4c39ca131a93ea602607bd97afeffd92b69a9a63cf2c6f57d6db88cb753fe748ac7fde79e1e76768ff784247026b7c5ebf23ede3a0 + detect-file: "npm:^1.0.0" + is-glob: "npm:^4.0.0" + micromatch: "npm:^4.0.2" + resolve-dir: "npm:^1.0.1" + checksum: 3e7de4d0afda35ecdd6260ce9d31524161817466ad6218b092dc73554848ce9618b69ec0f841dc82e320a4b3bfaba19c71c154f5b249ffed28143ba95a743d37 languageName: node linkType: hard "flat-cache@npm:^3.0.4": - version: 3.0.4 - resolution: "flat-cache@npm:3.0.4" + version: 3.2.0 + resolution: "flat-cache@npm:3.2.0" dependencies: - flatted: ^3.1.0 - rimraf: ^3.0.2 - checksum: 4fdd10ecbcbf7d520f9040dd1340eb5dfe951e6f0ecf2252edeec03ee68d989ec8b9a20f4434270e71bcfd57800dc09b3344fca3966b2eb8f613072c7d9a2365 + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.3" + rimraf: "npm:^3.0.2" + checksum: b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 languageName: node linkType: hard -"flatted@npm:^3.1.0": - version: 3.2.7 - resolution: "flatted@npm:3.2.7" - checksum: 427633049d55bdb80201c68f7eb1cbd533e03eac541f97d3aecab8c5526f12a20ccecaeede08b57503e772c769e7f8680b37e8d482d1e5f8d7e2194687f9ea35 +"flat-cache@npm:^4.0.0": + version: 4.0.0 + resolution: "flat-cache@npm:4.0.0" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.4" + rimraf: "npm:^5.0.5" + checksum: 8f99e27bb3de94e91e7b4ca5120488cdc2b7f8cd952a538f1a566101963057eb42ca318e9fac0d36987dcca34316ff04b61c1dc3dcc8084f6f5e801a52a8e547 + languageName: node + linkType: hard + +"flatted@npm:^3.2.9": + version: 3.2.9 + resolution: "flatted@npm:3.2.9" + checksum: 5c91c5a0a21bbc0b07b272231e5b4efe6b822bcb4ad317caf6bb06984be4042a9e9045026307da0fdb4583f1f545e317a67ef1231a59e71f7fced3cc429cfc53 languageName: node linkType: hard "flatten@npm:^1.0.2": version: 1.0.3 resolution: "flatten@npm:1.0.3" - checksum: 5c57379816f1692aaa79fbc6390e0a0644e5e8442c5783ed57c6d315468eddbc53a659eaa03c9bb1e771b0f4a9bd8dd8a2620286bf21fd6538a7857321fdfb20 + checksum: 9f9b1f3dcd05be057bb83ec27f2513da5306e7bfc0cf8bd839ab423eb1b0f99683a25c97b48fafd5959819159659ce9f1397623a46f89a8577ba095fcf5fb753 languageName: node linkType: hard "fn-name@npm:^2.0.1": version: 2.0.1 resolution: "fn-name@npm:2.0.1" - checksum: ea06f4a99be824edf774f8314be9b1e7eeef62a9e462f243f452b1422c73f7b98a5dafe734256e57212239d1ac1204a7b79fdb8cc920af1ec414684a1b00ae66 + checksum: e9fc78915b536e57f26d29d4209da6c548e10c4cf2005d4c2eb3621dce9b92a03746034d93d6877e2c71a17bccc2d8d98a97cd0a0012fac1abc7822f4926ebee languageName: node linkType: hard @@ -4468,39 +4716,32 @@ __metadata: version: 0.3.3 resolution: "for-each@npm:0.3.3" dependencies: - is-callable: ^1.1.3 - checksum: 6c48ff2bc63362319c65e2edca4a8e1e3483a2fabc72fbe7feaf8c73db94fc7861bd53bc02c8a66a0c1dd709da6b04eec42e0abdd6b40ce47305ae92a25e5d28 + is-callable: "npm:^1.1.3" + checksum: 22330d8a2db728dbf003ec9182c2d421fbcd2969b02b4f97ec288721cda63eb28f2c08585ddccd0f77cb2930af8d958005c9e72f47141dc51816127a118f39aa languageName: node linkType: hard -"foreground-child@npm:^2.0.0": - version: 2.0.0 - resolution: "foreground-child@npm:2.0.0" +"foreground-child@npm:^3.1.0, foreground-child@npm:^3.1.1": + version: 3.1.1 + resolution: "foreground-child@npm:3.1.1" dependencies: - cross-spawn: ^7.0.0 - signal-exit: ^3.0.2 - checksum: f77ec9aff621abd6b754cb59e690743e7639328301fbea6ff09df27d2befaf7dd5b77cec51c32323d73a81a7d91caaf9413990d305cbe3d873eec4fe58960956 + cross-spawn: "npm:^7.0.0" + signal-exit: "npm:^4.0.1" + checksum: 9700a0285628abaeb37007c9a4d92bd49f67210f09067638774338e146c8e9c825c5c877f072b2f75f41dc6a2d0be8664f79ffc03f6576649f54a84fb9b47de0 languageName: node linkType: hard "forwarded@npm:0.2.0": version: 0.2.0 resolution: "forwarded@npm:0.2.0" - checksum: fd27e2394d8887ebd16a66ffc889dc983fbbd797d5d3f01087c020283c0f019a7d05ee85669383d8e0d216b116d720fc0cef2f6e9b7eb9f4c90c6e0bc7fd28e6 + checksum: 9b67c3fac86acdbc9ae47ba1ddd5f2f81526fa4c8226863ede5600a3f7c7416ef451f6f1e240a3cc32d0fd79fcfe6beb08fd0da454f360032bde70bf80afbb33 languageName: node linkType: hard "fresh@npm:0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" - checksum: 13ea8b08f91e669a64e3ba3a20eb79d7ca5379a81f1ff7f4310d54e2320645503cc0c78daedc93dfb6191287295f6479544a649c64d8e41a1c0fb0c221552346 - languageName: node - linkType: hard - -"fs-constants@npm:^1.0.0": - version: 1.0.0 - resolution: "fs-constants@npm:1.0.0" - checksum: 18f5b718371816155849475ac36c7d0b24d39a11d91348cfcb308b4494824413e03572c403c86d3a260e049465518c4f0d5bd00f0371cdfcad6d4f30a85b350d + checksum: c6d27f3ed86cc5b601404822f31c900dd165ba63fff8152a3ef714e2012e7535027063bc67ded4cb5b3a49fa596495d46cacd9f47d6328459cf570f08b7d9e5a languageName: node linkType: hard @@ -4508,22 +4749,11 @@ __metadata: version: 9.1.0 resolution: "fs-extra@npm:9.1.0" dependencies: - at-least-node: ^1.0.0 - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: ba71ba32e0faa74ab931b7a0031d1523c66a73e225de7426e275e238e312d07313d2da2d33e34a52aa406c8763ade5712eb3ec9ba4d9edce652bcacdc29e6b20 - languageName: node - linkType: hard - -"fs-extra@npm:^11.1.0": - version: 11.1.0 - resolution: "fs-extra@npm:11.1.0" - dependencies: - graceful-fs: ^4.2.0 - jsonfile: ^6.0.1 - universalify: ^2.0.0 - checksum: 5ca476103fa1f5ff4a9b3c4f331548f8a3c1881edaae323a4415d3153b5dc11dc6a981c8d1dd93eec8367ceee27b53f8bd27eecbbf66ffcdd04927510c171e7f + at-least-node: "npm:^1.0.0" + graceful-fs: "npm:^4.2.0" + jsonfile: "npm:^6.0.1" + universalify: "npm:^2.0.0" + checksum: 9b808bd884beff5cb940773018179a6b94a966381d005479f00adda6b44e5e3d4abf765135773d849cc27efe68c349e4a7b86acd7d3306d5932c14f3a4b17a92 languageName: node linkType: hard @@ -4531,101 +4761,123 @@ __metadata: version: 7.0.1 resolution: "fs-extra@npm:7.0.1" dependencies: - graceful-fs: ^4.1.2 - jsonfile: ^4.0.0 - universalify: ^0.1.0 - checksum: 141b9dccb23b66a66cefdd81f4cda959ff89282b1d721b98cea19ba08db3dcbe6f862f28841f3cf24bb299e0b7e6c42303908f65093cb7e201708e86ea5a8dcf + graceful-fs: "npm:^4.1.2" + jsonfile: "npm:^4.0.0" + universalify: "npm:^0.1.0" + checksum: 1943bb2150007e3739921b8d13d4109abdc3cc481e53b97b7ea7f77eda1c3c642e27ae49eac3af074e3496ea02fde30f411ef410c760c70a38b92e656e5da784 languageName: node linkType: hard -"fs-minipass@npm:^2.0.0, fs-minipass@npm:^2.1.0": +"fs-minipass@npm:^2.0.0": version: 2.1.0 resolution: "fs-minipass@npm:2.1.0" dependencies: - minipass: ^3.0.0 - checksum: 1b8d128dae2ac6cc94230cc5ead341ba3e0efaef82dab46a33d171c044caaa6ca001364178d42069b2809c35a1c3c35079a32107c770e9ffab3901b59af8c8b1 + minipass: "npm:^3.0.0" + checksum: 703d16522b8282d7299337539c3ed6edddd1afe82435e4f5b76e34a79cd74e488a8a0e26a636afc2440e1a23b03878e2122e3a2cfe375a5cf63c37d92b86a004 + languageName: node + linkType: hard + +"fs-minipass@npm:^3.0.0": + version: 3.0.3 + resolution: "fs-minipass@npm:3.0.3" + dependencies: + minipass: "npm:^7.0.3" + checksum: 63e80da2ff9b621e2cb1596abcb9207f1cf82b968b116ccd7b959e3323144cce7fb141462200971c38bbf2ecca51695069db45265705bed09a7cd93ae5b89f94 languageName: node linkType: hard "fs.realpath@npm:^1.0.0": version: 1.0.0 resolution: "fs.realpath@npm:1.0.0" - checksum: 99ddea01a7e75aa276c250a04eedeffe5662bce66c65c07164ad6264f9de18fb21be9433ead460e54cff20e31721c811f4fb5d70591799df5f85dce6d6746fd0 + checksum: 444cf1291d997165dfd4c0d58b69f0e4782bfd9149fd72faa4fe299e68e0e93d6db941660b37dd29153bf7186672ececa3b50b7e7249477b03fdf850f287c948 languageName: node linkType: hard -"fsevents@npm:~2.3.2": +"fsevents@npm:2.3.2": version: 2.3.2 resolution: "fsevents@npm:2.3.2" dependencies: - node-gyp: latest - checksum: 97ade64e75091afee5265e6956cb72ba34db7819b4c3e94c431d4be2b19b8bb7a2d4116da417950c3425f17c8fe693d25e20212cac583ac1521ad066b77ae31f + node-gyp: "npm:latest" + checksum: be78a3efa3e181cda3cf7a4637cb527bcebb0bd0ea0440105a3bb45b86f9245b307dc10a2507e8f4498a7d4ec349d1910f4d73e4d4495b16103106e07eee735b conditions: os=darwin languageName: node linkType: hard -"fsevents@patch:fsevents@~2.3.2#~builtin": - version: 2.3.2 - resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" +"fsevents@npm:~2.3.2": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" dependencies: - node-gyp: latest + node-gyp: "npm:latest" + checksum: a1f0c44595123ed717febbc478aa952e47adfc28e2092be66b8ab1635147254ca6cfe1df792a8997f22716d4cbafc73309899ff7bfac2ac3ad8cf2e4ecc3ec60 conditions: os=darwin languageName: node linkType: hard -"function-bind@npm:^1.1.1": - version: 1.1.1 - resolution: "function-bind@npm:1.1.1" - checksum: b32fbaebb3f8ec4969f033073b43f5c8befbb58f1a79e12f1d7490358150359ebd92f49e72ff0144f65f2c48ea2a605bff2d07965f548f6474fd8efd95bf361a +"fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin": + version: 2.3.2 + resolution: "fsevents@patch:fsevents@npm%3A2.3.2#optional!builtin::version=2.3.2&hash=df0bf1" + dependencies: + node-gyp: "npm:latest" + conditions: os=darwin languageName: node linkType: hard -"function.prototype.name@npm:^1.1.5": - version: 1.1.5 - resolution: "function.prototype.name@npm:1.1.5" +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - es-abstract: ^1.19.0 - functions-have-names: ^1.2.2 - checksum: acd21d733a9b649c2c442f067567743214af5fa248dbeee69d8278ce7df3329ea5abac572be9f7470b4ec1cd4d8f1040e3c5caccf98ebf2bf861a0deab735c27 + node-gyp: "npm:latest" + conditions: os=darwin languageName: node linkType: hard -"functional-red-black-tree@npm:^1.0.1": - version: 1.0.1 - resolution: "functional-red-black-tree@npm:1.0.1" - checksum: ca6c170f37640e2d94297da8bb4bf27a1d12bea3e00e6a3e007fd7aa32e37e000f5772acf941b4e4f3cf1c95c3752033d0c509af157ad8f526e7f00723b9eb9f +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: d8680ee1e5fcd4c197e4ac33b2b4dce03c71f4d91717292785703db200f5c21f977c568d28061226f9b5900cbcd2c84463646134fd5337e7925e0942bc3f46d5 + languageName: node + linkType: hard + +"function.prototype.name@npm:^1.1.6": + version: 1.1.6 + resolution: "function.prototype.name@npm:1.1.6" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + functions-have-names: "npm:^1.2.3" + checksum: 9eae11294905b62cb16874adb4fc687927cda3162285e0ad9612e6a1d04934005d46907362ea9cdb7428edce05a2f2c3dabc3b2d21e9fd343e9bb278230ad94b languageName: node linkType: hard -"functions-have-names@npm:^1.2.2": +"functions-have-names@npm:^1.2.3": version: 1.2.3 resolution: "functions-have-names@npm:1.2.3" - checksum: c3f1f5ba20f4e962efb71344ce0a40722163e85bee2101ce25f88214e78182d2d2476aa85ef37950c579eb6cf6ee811c17b3101bb84004bb75655f3e33f3fdb5 + checksum: 33e77fd29bddc2d9bb78ab3eb854c165909201f88c75faa8272e35899e2d35a8a642a15e7420ef945e1f64a9670d6aa3ec744106b2aa42be68ca5114025954ca languageName: node linkType: hard -"gauge@npm:^4.0.3": - version: 4.0.4 - resolution: "gauge@npm:4.0.4" +"gauge@npm:^3.0.0": + version: 3.0.2 + resolution: "gauge@npm:3.0.2" dependencies: - aproba: ^1.0.3 || ^2.0.0 - color-support: ^1.1.3 - console-control-strings: ^1.1.0 - has-unicode: ^2.0.1 - signal-exit: ^3.0.7 - string-width: ^4.2.3 - strip-ansi: ^6.0.1 - wide-align: ^1.1.5 - checksum: 788b6bfe52f1dd8e263cda800c26ac0ca2ff6de0b6eee2fe0d9e3abf15e149b651bd27bf5226be10e6e3edb5c4e5d5985a5a1a98137e7a892f75eff76467ad2d + aproba: "npm:^1.0.3 || ^2.0.0" + color-support: "npm:^1.1.2" + console-control-strings: "npm:^1.0.0" + has-unicode: "npm:^2.0.1" + object-assign: "npm:^4.1.1" + signal-exit: "npm:^3.0.0" + string-width: "npm:^4.2.3" + strip-ansi: "npm:^6.0.1" + wide-align: "npm:^1.1.2" + checksum: 75230ccaf216471e31025c7d5fcea1629596ca20792de50c596eb18ffb14d8404f927cd55535aab2eeecd18d1e11bd6f23ec3c2e9878d2dda1dc74bccc34b913 languageName: node linkType: hard -"gensequence@npm:^4.0.3": - version: 4.0.3 - resolution: "gensequence@npm:4.0.3" - checksum: 541824a242bb0a64e7e58b595c753a5a9cd07c02a1c6c41928e0d6e09f16047e774deab470ae484e4aded29cfe03a6325a3090dd6e5a0c32ff3726606b09ffc4 +"gensequence@npm:^6.0.0": + version: 6.0.0 + resolution: "gensequence@npm:6.0.0" + checksum: 85c6928299a99d4df15ea689b5b02b322a120ad9a9d3802c090b06a3e541169f1579f15c6f77165f02d2c3e59a18bb87abad92da8c2c9ddeb053619d3b4669c2 languageName: node linkType: hard @@ -4633,34 +4885,52 @@ __metadata: version: 3.0.2 resolution: "get-amd-module-type@npm:3.0.2" dependencies: - ast-module-types: ^3.0.0 - node-source-walk: ^4.2.2 - checksum: d16fac5037f63027992e6ebd2d642e6d4feef2f8fa71ff3da6aa76006e05b3dcd4aa6044b4c5966f13ba5d412fd7c1367d910df86b58f9c13f53cbb35d2e4b72 + ast-module-types: "npm:^3.0.0" + node-source-walk: "npm:^4.2.2" + checksum: 1017d6e8122bc1f47a1cc27c287ef9a69a4ea43b06f0f745be5e5c4154dd419d9463868d161a259eeca766f58ab47f8e1ddbda8abb4383ec4182e0ec449fd811 + languageName: node + linkType: hard + +"get-amd-module-type@npm:^4.1.0": + version: 4.1.0 + resolution: "get-amd-module-type@npm:4.1.0" + dependencies: + ast-module-types: "npm:^4.0.0" + node-source-walk: "npm:^5.0.1" + checksum: 3d011da95f696aebcd9e2547952a80e683d7733b7fc6575eed998671a14e9e1124ecf180b7612ec1c1d1637a8345e5311440b316172bb6863be6f2db6bdabdc5 languageName: node linkType: hard "get-caller-file@npm:^2.0.5": version: 2.0.5 resolution: "get-caller-file@npm:2.0.5" - checksum: b9769a836d2a98c3ee734a88ba712e62703f1df31b94b784762c433c27a386dd6029ff55c2a920c392e33657d80191edbf18c61487e198844844516f843496b9 + checksum: c6c7b60271931fa752aeb92f2b47e355eac1af3a2673f47c9589e8f8a41adc74d45551c1bc57b5e66a80609f10ffb72b6f575e4370d61cc3f7f3aaff01757cde languageName: node linkType: hard -"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3": - version: 1.1.3 - resolution: "get-intrinsic@npm:1.1.3" +"get-east-asian-width@npm:^1.0.0": + version: 1.2.0 + resolution: "get-east-asian-width@npm:1.2.0" + checksum: 914b1e217cf38436c24b4c60b4c45289e39a45bf9e65ef9fd343c2815a1a02b8a0215aeec8bf9c07c516089004b6e3826332481f40a09529fcadbf6e579f286b + languageName: node + linkType: hard + +"get-intrinsic@npm:^1.0.2, get-intrinsic@npm:^1.1.1, get-intrinsic@npm:^1.1.3, get-intrinsic@npm:^1.2.0, get-intrinsic@npm:^1.2.1, get-intrinsic@npm:^1.2.2": + version: 1.2.2 + resolution: "get-intrinsic@npm:1.2.2" dependencies: - function-bind: ^1.1.1 - has: ^1.0.3 - has-symbols: ^1.0.3 - checksum: 152d79e87251d536cf880ba75cfc3d6c6c50e12b3a64e1ea960e73a3752b47c69f46034456eae1b0894359ce3bc64c55c186f2811f8a788b75b638b06fab228a + function-bind: "npm:^1.1.2" + has-proto: "npm:^1.0.1" + has-symbols: "npm:^1.0.3" + hasown: "npm:^2.0.0" + checksum: 4e7fb8adc6172bae7c4fe579569b4d5238b3667c07931cd46b4eee74bbe6ff6b91329bec311a638d8e60f5b51f44fe5445693c6be89ae88d4b5c49f7ff12db0b languageName: node linkType: hard "get-own-enumerable-property-symbols@npm:^3.0.0": version: 3.0.2 resolution: "get-own-enumerable-property-symbols@npm:3.0.2" - checksum: 8f0331f14159f939830884799f937343c8c0a2c330506094bc12cbee3665d88337fe97a4ea35c002cc2bdba0f5d9975ad7ec3abb925015cdf2a93e76d4759ede + checksum: 103999855f3d1718c631472437161d76962cbddcd95cc642a34c07bfb661ed41b6c09a9c669ccdff89ee965beb7126b80eec7b2101e20e31e9cc6c4725305e10 languageName: node linkType: hard @@ -4668,43 +4938,27 @@ __metadata: version: 4.2.1 resolution: "get-pkg-repo@npm:4.2.1" dependencies: - "@hutson/parse-repository-url": ^3.0.0 - hosted-git-info: ^4.0.0 - through2: ^2.0.0 - yargs: ^16.2.0 + "@hutson/parse-repository-url": "npm:^3.0.0" + hosted-git-info: "npm:^4.0.0" + through2: "npm:^2.0.0" + yargs: "npm:^16.2.0" bin: get-pkg-repo: src/cli.js - checksum: 5abf169137665e45b09a857b33ad2fdcf2f4a09f0ecbd0ebdd789a7ce78c39186a21f58621127eb724d2d4a3a7ee8e6bd4ac7715efda01ad5200665afc218e0d - languageName: node - linkType: hard - -"get-stdin@npm:^8.0.0": - version: 8.0.0 - resolution: "get-stdin@npm:8.0.0" - checksum: 40128b6cd25781ddbd233344f1a1e4006d4284906191ed0a7d55ec2c1a3e44d650f280b2c9eeab79c03ac3037da80257476c0e4e5af38ddfb902d6ff06282d77 + checksum: 1338d2e048a594da4a34e7dd69d909376d72784f5ba50963a242b4b35db77533786f618b3f6a9effdee2af20af4917a3b7cf12533b4575d7f9c163886be1fb62 languageName: node linkType: hard "get-stdin@npm:^9.0.0": version: 9.0.0 resolution: "get-stdin@npm:9.0.0" - checksum: 5972bc34d05932b45512c8e2d67b040f1c1ca8afb95c56cbc480985f2d761b7e37fe90dc8abd22527f062cc5639a6930ff346e9952ae4c11a2d4275869459594 + checksum: 7ef2edc0c81a0644ca9f051aad8a96ae9373d901485abafaabe59fd347a1c378689d8a3d8825fb3067415d1d09dfcaa43cb9b9516ecac6b74b3138b65a8ccc6b languageName: node linkType: hard -"get-stream@npm:^5.1.0": - version: 5.2.0 - resolution: "get-stream@npm:5.2.0" - dependencies: - pump: ^3.0.0 - checksum: 8bc1a23174a06b2b4ce600df38d6c98d2ef6d84e020c1ddad632ad75bac4e092eeb40e4c09e0761c35fc2dbc5e7fff5dab5e763a383582c4a167dd69a905bd12 - languageName: node - linkType: hard - -"get-stream@npm:^6.0.0": +"get-stream@npm:^6.0.1": version: 6.0.1 resolution: "get-stream@npm:6.0.1" - checksum: e04ecece32c92eebf5b8c940f51468cd53554dcbb0ea725b2748be583c9523d00128137966afce410b9b051eb2ef16d657cd2b120ca8edafcf5a65e81af63cad + checksum: 49825d57d3fd6964228e6200a58169464b8e8970489b3acdc24906c782fb7f01f9f56f8e6653c4a50713771d6658f7cfe051e5eb8c12e334138c9c918b296341 languageName: node linkType: hard @@ -4712,9 +4966,9 @@ __metadata: version: 1.0.0 resolution: "get-symbol-description@npm:1.0.0" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.1 - checksum: 9ceff8fe968f9270a37a1f73bf3f1f7bda69ca80f4f80850670e0e7b9444ff99323f7ac52f96567f8b5f5fbe7ac717a0d81d3407c7313e82810c6199446a5247 + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.1.1" + checksum: 23bc3b44c221cdf7669a88230c62f4b9e30393b61eb21ba4400cb3e346801bd8f95fe4330ee78dbae37aecd874646d53e3e76a17a654d0c84c77f6690526d6bb languageName: node linkType: hard @@ -4722,14 +4976,14 @@ __metadata: version: 2.0.11 resolution: "git-raw-commits@npm:2.0.11" dependencies: - dargs: ^7.0.0 - lodash: ^4.17.15 - meow: ^8.0.0 - split2: ^3.0.0 - through2: ^4.0.0 + dargs: "npm:^7.0.0" + lodash: "npm:^4.17.15" + meow: "npm:^8.0.0" + split2: "npm:^3.0.0" + through2: "npm:^4.0.0" bin: git-raw-commits: cli.js - checksum: c178af43633684106179793b6e3473e1d2bb50bb41d04e2e285ea4eef342ca4090fee6bc8a737552fde879d22346c90de5c49f18c719a0f38d4c934f258a0f79 + checksum: c9cee7ce11a6703098f028d7e47986d5d3e4147d66640086734d6ee2472296b8711f91b40ad458e95acac1bc33cf2898059f1dc890f91220ff89c5fcc609ab64 languageName: node linkType: hard @@ -4737,9 +4991,9 @@ __metadata: version: 2.0.0 resolution: "git-remote-origin-url@npm:2.0.0" dependencies: - gitconfiglocal: ^1.0.0 - pify: ^2.3.0 - checksum: 85263a09c044b5f4fe2acc45cbb3c5331ab2bd4484bb53dfe7f3dd593a4bf90a9786a2e00b9884524331f50b3da18e8c924f01c2944087fc7f342282c4437b73 + gitconfiglocal: "npm:^1.0.0" + pify: "npm:^2.3.0" + checksum: 3a846ce98ed36b2d0b801e8ec1ab299a236cfc6fa264bfdf9f42301abfdfd8715c946507fd83a10b9db449eb609ac6f8a2a341daf52e3af0000367487f486355 languageName: node linkType: hard @@ -4747,11 +5001,11 @@ __metadata: version: 4.1.1 resolution: "git-semver-tags@npm:4.1.1" dependencies: - meow: ^8.0.0 - semver: ^6.0.0 + meow: "npm:^8.0.0" + semver: "npm:^6.0.0" bin: git-semver-tags: cli.js - checksum: e16d02a515c0f88289a28b5bf59bf42c0dc053765922d3b617ae4b50546bd4f74a25bf3ad53b91cb6c1159319a2e92533b160c573b856c2629125c8b26b3b0e3 + checksum: cd8c91c666901f8dd6381f4cef2aec32aa3f39e517bd8d8491f9133adf956dde9e0487d510fa0f12042fa474f21a8a88b4aa56db8b473979c7491109c57b7016 languageName: node linkType: hard @@ -4759,17 +5013,17 @@ __metadata: version: 1.0.0 resolution: "gitconfiglocal@npm:1.0.0" dependencies: - ini: ^1.3.2 - checksum: e6d2764c15bbab6d1d1000d1181bb907f6b3796bb04f63614dba571b18369e0ecb1beaf27ce8da5b24307ef607e3a5f262a67cb9575510b9446aac697d421beb + ini: "npm:^1.3.2" + checksum: cfcb16344834113199f209f2758ced778dc30e075ddb49b5dde659b4dd2deadee824db0a1b77e1303cb594d9e8b2240da18c67705f657aa76affb444aa349005 languageName: node linkType: hard -"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": +"glob-parent@npm:^5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" dependencies: - is-glob: ^4.0.1 - checksum: f4f2bfe2425296e8a47e36864e4f42be38a996db40420fe434565e4480e3322f18eb37589617a98640c5dc8fdec1a387007ee18dbb1f3f5553409c34d17f425e + is-glob: "npm:^4.0.1" + checksum: cab87638e2112bee3f839ef5f6e0765057163d39c66be8ec1602f3823da4692297ad4e972de876ea17c44d652978638d2fd583c6713d0eb6591706825020c9ee languageName: node linkType: hard @@ -4777,8 +5031,8 @@ __metadata: version: 6.0.2 resolution: "glob-parent@npm:6.0.2" dependencies: - is-glob: ^4.0.3 - checksum: c13ee97978bef4f55106b71e66428eb1512e71a7466ba49025fc2aec59a5bfb0954d5abd58fc5ee6c9b076eef4e1f6d3375c2e964b88466ca390da4419a786a8 + is-glob: "npm:^4.0.3" + checksum: 317034d88654730230b3f43bb7ad4f7c90257a426e872ea0bf157473ac61c99bf5d205fad8f0185f989be8d2fa6d3c7dce1645d99d545b6ea9089c39f838e7f8 languageName: node linkType: hard @@ -4786,26 +5040,50 @@ __metadata: version: 7.2.3 resolution: "glob@npm:7.2.3" dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^3.1.1 - once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^3.1.1" + once: "npm:^1.3.0" + path-is-absolute: "npm:^1.0.0" + checksum: 65676153e2b0c9095100fe7f25a778bf45608eeb32c6048cf307f579649bcc30353277b3b898a3792602c65764e5baa4f643714dfbdfd64ea271d210c7a425fe + languageName: node + linkType: hard + +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": + version: 10.3.10 + resolution: "glob@npm:10.3.10" + dependencies: + foreground-child: "npm:^3.1.0" + jackspeak: "npm:^2.3.5" + minimatch: "npm:^9.0.1" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + path-scurry: "npm:^1.10.1" + bin: + glob: dist/esm/bin.mjs + checksum: 13d8a1feb7eac7945f8c8480e11cd4a44b24d26503d99a8d8ac8d5aefbf3e9802a2b6087318a829fad04cb4e829f25c5f4f1110c68966c498720dd261c7e344d + languageName: node + linkType: hard + +"glob@npm:^8.0.3": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: "npm:^1.0.0" + inflight: "npm:^1.0.4" + inherits: "npm:2" + minimatch: "npm:^5.0.1" + once: "npm:^1.3.0" + checksum: cb0b5cab17a59c57299376abe5646c7070f8acb89df5595b492dba3bfb43d301a46c01e5695f01154e6553168207cb60d4eaf07d3be4bc3eb9b0457c5c561d0f languageName: node linkType: hard -"glob@npm:^8.0.1, glob@npm:^8.0.3": - version: 8.0.3 - resolution: "glob@npm:8.0.3" +"global-directory@npm:^4.0.1": + version: 4.0.1 + resolution: "global-directory@npm:4.0.1" dependencies: - fs.realpath: ^1.0.0 - inflight: ^1.0.4 - inherits: 2 - minimatch: ^5.0.1 - once: ^1.3.0 - checksum: 50bcdea19d8e79d8de5f460b1939ffc2b3299eac28deb502093fdca22a78efebc03e66bf54f0abc3d3d07d8134d19a32850288b7440d77e072aa55f9d33b18c5 + ini: "npm:4.1.1" + checksum: f9cbeef41db4876f94dd0bac1c1b4282a7de9c16350ecaaf83e7b2dd777b32704cc25beeb1170b5a63c42a2c9abfade74d46357fe0133e933218bc89e613d4b2 languageName: node linkType: hard @@ -4813,8 +5091,8 @@ __metadata: version: 0.1.1 resolution: "global-dirs@npm:0.1.1" dependencies: - ini: ^1.3.4 - checksum: 10624f5a8ddb8634c22804c6b24f93fb591c3639a6bc78e3584e01a238fc6f7b7965824184e57d63f6df36980b6c191484ad7bc6c35a1599b8f1d64be64c2a4a + ini: "npm:^1.3.4" + checksum: 3608072e58962396c124ad5a1cfb3f99ee76c998654a3432d82977b3c3eeb09dc8a5a2a9849b2b8113906c8d0aad89ce362c22e97cec5fe34405bbf4f3cdbe7a languageName: node linkType: hard @@ -4822,10 +5100,10 @@ __metadata: version: 1.0.0 resolution: "global-modules@npm:1.0.0" dependencies: - global-prefix: ^1.0.1 - is-windows: ^1.0.1 - resolve-dir: ^1.0.0 - checksum: 10be68796c1e1abc1e2ba87ec4ea507f5629873b119ab0cd29c07284ef2b930f1402d10df01beccb7391dedd9cd479611dd6a24311c71be58937beaf18edf85e + global-prefix: "npm:^1.0.1" + is-windows: "npm:^1.0.1" + resolve-dir: "npm:^1.0.0" + checksum: 7d91ecf78d4fcbc966b2d89c1400df273afea795bc8cadf39857ee1684e442065621fd79413ff5fcd9e90c6f1b2dc0123e644fa0b7811f987fd54c6b9afad858 languageName: node linkType: hard @@ -4833,21 +5111,21 @@ __metadata: version: 1.0.2 resolution: "global-prefix@npm:1.0.2" dependencies: - expand-tilde: ^2.0.2 - homedir-polyfill: ^1.0.1 - ini: ^1.3.4 - is-windows: ^1.0.1 - which: ^1.2.14 - checksum: 061b43470fe498271bcd514e7746e8a8535032b17ab9570517014ae27d700ff0dca749f76bbde13ba384d185be4310d8ba5712cb0e74f7d54d59390db63dd9a0 + expand-tilde: "npm:^2.0.2" + homedir-polyfill: "npm:^1.0.1" + ini: "npm:^1.3.4" + is-windows: "npm:^1.0.1" + which: "npm:^1.2.14" + checksum: d8037e300f1dc04d5d410d16afa662e71bfad22dcceba6c9727bb55cc273b8988ca940b3402f62e5392fd261dd9924a9a73a865ef2000219461f31f3fc86be06 languageName: node linkType: hard "globals@npm:^13.19.0": - version: 13.19.0 - resolution: "globals@npm:13.19.0" + version: 13.24.0 + resolution: "globals@npm:13.24.0" dependencies: - type-fest: ^0.20.2 - checksum: a000dbd00bcf28f0941d8a29c3522b1c3b8e4bfe4e60e262c477a550c3cbbe8dbe2925a6905f037acd40f9a93c039242e1f7079c76b0fd184bc41dcc3b5c8e2e + type-fest: "npm:^0.20.2" + checksum: d3c11aeea898eb83d5ec7a99508600fbe8f83d2cf00cbb77f873dbf2bcb39428eff1b538e4915c993d8a3b3473fa71eeebfe22c9bb3a3003d1e26b1f2c8a42cd languageName: node linkType: hard @@ -4855,8 +5133,8 @@ __metadata: version: 1.0.3 resolution: "globalthis@npm:1.0.3" dependencies: - define-properties: ^1.1.3 - checksum: fbd7d760dc464c886d0196166d92e5ffb4c84d0730846d6621a39fbbc068aeeb9c8d1421ad330e94b7bca4bb4ea092f5f21f3d36077812af5d098b4dc006c998 + define-properties: "npm:^1.1.3" + checksum: 0db6e9af102a5254630351557ac15e6909bc7459d3e3f6b001e59fe784c96d31108818f032d9095739355a88467459e6488ff16584ee6250cd8c27dec05af4b0 languageName: node linkType: hard @@ -4864,26 +5142,40 @@ __metadata: version: 11.1.0 resolution: "globby@npm:11.1.0" dependencies: - array-union: ^2.1.0 - dir-glob: ^3.0.1 - fast-glob: ^3.2.9 - ignore: ^5.2.0 - merge2: ^1.4.1 - slash: ^3.0.0 - checksum: b4be8885e0cfa018fc783792942d53926c35c50b3aefd3fdcfb9d22c627639dc26bd2327a40a0b74b074100ce95bb7187bfeae2f236856aa3de183af7a02aea6 + array-union: "npm:^2.1.0" + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.2.9" + ignore: "npm:^5.2.0" + merge2: "npm:^1.4.1" + slash: "npm:^3.0.0" + checksum: b39511b4afe4bd8a7aead3a27c4ade2b9968649abab0a6c28b1a90141b96ca68ca5db1302f7c7bd29eab66bf51e13916b8e0a3d0ac08f75e1e84a39b35691189 languageName: node linkType: hard -"globby@npm:^13.1.1, globby@npm:^13.1.2": - version: 13.1.3 - resolution: "globby@npm:13.1.3" +"globby@npm:^13.1.4": + version: 13.2.2 + resolution: "globby@npm:13.2.2" dependencies: - dir-glob: ^3.0.1 - fast-glob: ^3.2.11 - ignore: ^5.2.0 - merge2: ^1.4.1 - slash: ^4.0.0 - checksum: 93f06e02002cdf368f7e3d55bd59e7b00784c7cc8fe92c7ee5082cc7171ff6109fda45e1c97a80bb48bc811dedaf7843c7c9186f5f84bde4883ab630e13c43df + dir-glob: "npm:^3.0.1" + fast-glob: "npm:^3.3.0" + ignore: "npm:^5.2.4" + merge2: "npm:^1.4.1" + slash: "npm:^4.0.0" + checksum: a8d7cc7cbe5e1b2d0f81d467bbc5bc2eac35f74eaded3a6c85fc26d7acc8e6de22d396159db8a2fc340b8a342e74cac58de8f4aee74146d3d146921a76062664 + languageName: node + linkType: hard + +"globby@npm:^14.0.0": + version: 14.0.0 + resolution: "globby@npm:14.0.0" + dependencies: + "@sindresorhus/merge-streams": "npm:^1.0.0" + fast-glob: "npm:^3.3.2" + ignore: "npm:^5.2.4" + path-type: "npm:^5.0.0" + slash: "npm:^5.1.0" + unicorn-magic: "npm:^0.1.0" + checksum: 6d98738a419f948ef23da019275b15ca5c65bb7e354ecea52a3015f4dae6b28a713fcf73bf3aab1c04039f4f62da71cff191a7ececc37c0e4c9b4320a047505f languageName: node linkType: hard @@ -4891,10 +5183,10 @@ __metadata: version: 4.3.0 resolution: "gonzales-pe@npm:4.3.0" dependencies: - minimist: ^1.2.5 + minimist: "npm:^1.2.5" bin: gonzales: bin/gonzales.js - checksum: 49d60fc49ad35639e5d55923c1516d3ec2e4de5e6e5913ec3458a479b66623e54a060d568295349b0bb9f96ee970c473ff984d4b82a5cfeaf736c55f0d6dc3b7 + checksum: b99a6ef4bf28ca0b0adcc0b42fd0179676ee8bfe1d3e3c0025d7d38ba35a3f2d5b1d4beb16101a7fc7cb2dbda1ec045bbce0932697095df41d729bac1703476f languageName: node linkType: hard @@ -4902,107 +5194,98 @@ __metadata: version: 1.0.1 resolution: "gopd@npm:1.0.1" dependencies: - get-intrinsic: ^1.1.3 - checksum: a5ccfb8806e0917a94e0b3de2af2ea4979c1da920bc381667c260e00e7cafdbe844e2cb9c5bcfef4e5412e8bf73bab837285bc35c7ba73aaaf0134d4583393a6 + get-intrinsic: "npm:^1.1.3" + checksum: 505c05487f7944c552cee72087bf1567debb470d4355b1335f2c262d218ebbff805cd3715448fe29b4b380bae6912561d0467233e4165830efd28da241418c63 languageName: node linkType: hard -"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6": - version: 4.2.10 - resolution: "graceful-fs@npm:4.2.10" - checksum: 3f109d70ae123951905d85032ebeae3c2a5a7a997430df00ea30df0e3a6c60cf6689b109654d6fdacd28810a053348c4d14642da1d075049e6be1ba5216218da - languageName: node - linkType: hard - -"grapheme-splitter@npm:^1.0.4": - version: 1.0.4 - resolution: "grapheme-splitter@npm:1.0.4" - checksum: 0c22ec54dee1b05cd480f78cf14f732cb5b108edc073572c4ec205df4cd63f30f8db8025afc5debc8835a8ddeacf648a1c7992fe3dcd6ad38f9a476d84906620 +"graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.10, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": + version: 4.2.11 + resolution: "graceful-fs@npm:4.2.11" + checksum: 386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 languageName: node linkType: hard -"graphviz@npm:0.0.9": - version: 0.0.9 - resolution: "graphviz@npm:0.0.9" - dependencies: - temp: ~0.4.0 - checksum: fb414f89763d568646f2d899f9a2baa19e1cdf1b97db831f64f2b3f7322609ca1e4e43bcb3d2e3bfc992b9e0f657803559d7a98e289d5aa6dc549d578939d599 +"graphemer@npm:^1.4.0": + version: 1.4.0 + resolution: "graphemer@npm:1.4.0" + checksum: e951259d8cd2e0d196c72ec711add7115d42eb9a8146c8eeda5b8d3ac91e5dd816b9cd68920726d9fd4490368e7ed86e9c423f40db87e2d8dfafa00fa17c3a31 languageName: node linkType: hard "handlebars@npm:^4.7.7": - version: 4.7.7 - resolution: "handlebars@npm:4.7.7" - dependencies: - minimist: ^1.2.5 - neo-async: ^2.6.0 - source-map: ^0.6.1 - uglify-js: ^3.1.4 - wordwrap: ^1.0.0 + version: 4.7.8 + resolution: "handlebars@npm:4.7.8" + dependencies: + minimist: "npm:^1.2.5" + neo-async: "npm:^2.6.2" + source-map: "npm:^0.6.1" + uglify-js: "npm:^3.1.4" + wordwrap: "npm:^1.0.0" dependenciesMeta: uglify-js: optional: true bin: handlebars: bin/handlebars - checksum: 1e79a43f5e18d15742977cb987923eab3e2a8f44f2d9d340982bcb69e1735ed049226e534d7c1074eaddaf37e4fb4f471a8adb71cddd5bc8cf3f894241df5cee + checksum: 7aff423ea38a14bb379316f3857fe0df3c5d66119270944247f155ba1f08e07a92b340c58edaa00cfe985c21508870ee5183e0634dcb53dd405f35c93ef7f10d languageName: node linkType: hard "hard-rejection@npm:^2.1.0": version: 2.1.0 resolution: "hard-rejection@npm:2.1.0" - checksum: 7baaf80a0c7fff4ca79687b4060113f1529589852152fa935e6787a2bc96211e784ad4588fb3048136ff8ffc9dfcf3ae385314a5b24db32de20bea0d1597f9dc + checksum: febc3343a1ad575aedcc112580835b44a89a89e01f400b4eda6e8110869edfdab0b00cd1bd4c3bfec9475a57e79e0b355aecd5be46454b6a62b9a359af60e564 languageName: node linkType: hard "has-bigints@npm:^1.0.1, has-bigints@npm:^1.0.2": version: 1.0.2 resolution: "has-bigints@npm:1.0.2" - checksum: 390e31e7be7e5c6fe68b81babb73dfc35d413604d7ee5f56da101417027a4b4ce6a27e46eff97ad040c835b5d228676eae99a9b5c3bc0e23c8e81a49241ff45b + checksum: 724eb1485bfa3cdff6f18d95130aa190561f00b3fcf9f19dc640baf8176b5917c143b81ec2123f8cddb6c05164a198c94b13e1377c497705ccc8e1a80306e83b languageName: node linkType: hard "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" - checksum: 4a15638b454bf086c8148979aae044dd6e39d63904cd452d970374fa6a87623423da485dfb814e7be882e05c096a7ccf1ebd48e7e7501d0208d8384ff4dea73b + checksum: 1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 languageName: node linkType: hard "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" - checksum: 261a1357037ead75e338156b1f9452c016a37dcd3283a972a30d9e4a87441ba372c8b81f818cd0fbcd9c0354b4ae7e18b9e1afa1971164aef6d18c2b6095a8ad + checksum: 2e789c61b7888d66993e14e8331449e525ef42aac53c627cc53d1c3334e768bcb6abdc4f5f0de1478a25beec6f0bd62c7549058b7ac53e924040d4f301f02fd1 languageName: node linkType: hard "has-own-prop@npm:^2.0.0": version: 2.0.0 resolution: "has-own-prop@npm:2.0.0" - checksum: ca6336e85ead2295c9603880cbc199e2d3ff7eaea0e9035d68fbc79892e9cf681abc62c0909520f112c671dad9961be2173b21dff951358cc98425c560e789e0 + checksum: 2745497283d80228b5c5fbb8c63ab1029e604bce7db8d4b36255e427b3695b2153dc978b176674d0dd2a23f132809e04d7ef41fefc0ab85870a5caa918c5c0d9 languageName: node linkType: hard "has-property-descriptors@npm:^1.0.0": - version: 1.0.0 - resolution: "has-property-descriptors@npm:1.0.0" + version: 1.0.1 + resolution: "has-property-descriptors@npm:1.0.1" dependencies: - get-intrinsic: ^1.1.1 - checksum: a6d3f0a266d0294d972e354782e872e2fe1b6495b321e6ef678c9b7a06a40408a6891817350c62e752adced73a94ac903c54734fee05bf65b1905ee1368194bb + get-intrinsic: "npm:^1.2.2" + checksum: d62ba94b40150b00d621bc64a6aedb5bf0ee495308b4b7ed6bac856043db3cdfb1db553ae81cec91c9d2bd82057ff0e94145e7fa25d5aa5985ed32e0921927f6 languageName: node linkType: hard "has-proto@npm:^1.0.1": version: 1.0.1 resolution: "has-proto@npm:1.0.1" - checksum: febc5b5b531de8022806ad7407935e2135f1cc9e64636c3916c6842bd7995994ca3b29871ecd7954bd35f9e2986c17b3b227880484d22259e2f8e6ce63fd383e + checksum: c8a8fe411f810b23a564bd5546a8f3f0fff6f1b692740eb7a2fdc9df716ef870040806891e2f23ff4653f1083e3895bf12088703dd1a0eac3d9202d3a4768cd0 languageName: node linkType: hard "has-symbols@npm:^1.0.2, has-symbols@npm:^1.0.3": version: 1.0.3 resolution: "has-symbols@npm:1.0.3" - checksum: a054c40c631c0d5741a8285010a0777ea0c068f99ed43e5d6eb12972da223f8af553a455132fdb0801bdcfa0e0f443c0c03a68d8555aa529b3144b446c3f2410 + checksum: e6922b4345a3f37069cdfe8600febbca791c94988c01af3394d86ca3360b4b93928bbf395859158f88099cb10b19d98e3bbab7c9ff2c1bd09cf665ee90afa2c3 languageName: node linkType: hard @@ -5010,34 +5293,34 @@ __metadata: version: 1.0.0 resolution: "has-tostringtag@npm:1.0.0" dependencies: - has-symbols: ^1.0.2 - checksum: cc12eb28cb6ae22369ebaad3a8ab0799ed61270991be88f208d508076a1e99abe4198c965935ce85ea90b60c94ddda73693b0920b58e7ead048b4a391b502c1c + has-symbols: "npm:^1.0.2" + checksum: 1cdba76b7d13f65198a92b8ca1560ba40edfa09e85d182bf436d928f3588a9ebd260451d569f0ed1b849c4bf54f49c862aa0d0a77f9552b1855bb6deb526c011 languageName: node linkType: hard "has-unicode@npm:^2.0.1": version: 2.0.1 resolution: "has-unicode@npm:2.0.1" - checksum: 1eab07a7436512db0be40a710b29b5dc21fa04880b7f63c9980b706683127e3c1b57cb80ea96d47991bdae2dfe479604f6a1ba410106ee1046a41d1bd0814400 + checksum: ebdb2f4895c26bb08a8a100b62d362e49b2190bcfd84b76bc4be1a3bd4d254ec52d0dd9f2fbcc093fc5eb878b20c52146f9dfd33e2686ed28982187be593b47c languageName: node linkType: hard -"has@npm:^1.0.3": - version: 1.0.3 - resolution: "has@npm:1.0.3" +"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3, hash.js@npm:^1.1.7": + version: 1.1.7 + resolution: "hash.js@npm:1.1.7" dependencies: - function-bind: ^1.1.1 - checksum: b9ad53d53be4af90ce5d1c38331e712522417d017d5ef1ebd0507e07c2fbad8686fffb8e12ddecd4c39ca9b9b47431afbb975b8abf7f3c3b82c98e9aad052792 + inherits: "npm:^2.0.3" + minimalistic-assert: "npm:^1.0.1" + checksum: 41ada59494eac5332cfc1ce6b7ebdd7b88a3864a6d6b08a3ea8ef261332ed60f37f10877e0c825aaa4bddebf164fbffa618286aeeec5296675e2671cbfa746c4 languageName: node linkType: hard -"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3, hash.js@npm:^1.1.7": - version: 1.1.7 - resolution: "hash.js@npm:1.1.7" +"hasown@npm:^2.0.0": + version: 2.0.0 + resolution: "hasown@npm:2.0.0" dependencies: - inherits: ^2.0.3 - minimalistic-assert: ^1.0.1 - checksum: e350096e659c62422b85fa508e4b3669017311aa4c49b74f19f8e1bc7f3a54a584fdfd45326d4964d6011f2b2d882e38bea775a96046f2a61b7779a979629d8f + function-bind: "npm:^1.1.2" + checksum: 5d415b114f410661208c95e7ab4879f1cc2765b8daceff4dc8718317d1cb7b9ffa7c5d1eafd9a4389c9aab7445d6ea88e05f3096cb1e529618b55304956b87fc languageName: node linkType: hard @@ -5045,10 +5328,10 @@ __metadata: version: 1.0.1 resolution: "hmac-drbg@npm:1.0.1" dependencies: - hash.js: ^1.0.3 - minimalistic-assert: ^1.0.0 - minimalistic-crypto-utils: ^1.0.1 - checksum: bd30b6a68d7f22d63f10e1888aee497d7c2c5c0bb469e66bbdac99f143904d1dfe95f8131f95b3e86c86dd239963c9d972fcbe147e7cffa00e55d18585c43fe0 + hash.js: "npm:^1.0.3" + minimalistic-assert: "npm:^1.0.0" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: f3d9ba31b40257a573f162176ac5930109816036c59a09f901eb2ffd7e5e705c6832bedfff507957125f2086a0ab8f853c0df225642a88bf1fcaea945f20600d languageName: node linkType: hard @@ -5056,15 +5339,15 @@ __metadata: version: 1.0.3 resolution: "homedir-polyfill@npm:1.0.3" dependencies: - parse-passwd: ^1.0.0 - checksum: 18dd4db87052c6a2179d1813adea0c4bfcfa4f9996f0e226fefb29eb3d548e564350fa28ec46b0bf1fbc0a1d2d6922ceceb80093115ea45ff8842a4990139250 + parse-passwd: "npm:^1.0.0" + checksum: 3c099844f94b8b438f124bd5698bdcfef32b2d455115fb8050d7148e7f7b95fc89ba9922586c491f0e1cdebf437b1053c84ecddb8d596e109e9ac69c5b4a9e27 languageName: node linkType: hard "hosted-git-info@npm:^2.1.4": version: 2.8.9 resolution: "hosted-git-info@npm:2.8.9" - checksum: c955394bdab888a1e9bb10eb33029e0f7ce5a2ac7b3f158099dc8c486c99e73809dca609f5694b223920ca2174db33d32b12f9a2a47141dc59607c29da5a62dd + checksum: 317cbc6b1bbbe23c2a40ae23f3dafe9fa349ce42a89a36f930e3f9c0530c179a3882d2ef1e4141a4c3674d6faaea862138ec55b43ad6f75e387fda2483a13c70 languageName: node linkType: hard @@ -5072,22 +5355,22 @@ __metadata: version: 4.1.0 resolution: "hosted-git-info@npm:4.1.0" dependencies: - lru-cache: ^6.0.0 - checksum: c3f87b3c2f7eb8c2748c8f49c0c2517c9a95f35d26f4bf54b2a8cba05d2e668f3753548b6ea366b18ec8dadb4e12066e19fa382a01496b0ffa0497eb23cbe461 + lru-cache: "npm:^6.0.0" + checksum: 150fbcb001600336d17fdbae803264abed013548eea7946c2264c49ebe2ebd8c4441ba71dd23dd8e18c65de79d637f98b22d4760ba5fb2e0b15d62543d0fff07 languageName: node linkType: hard "html-escaper@npm:^2.0.0": version: 2.0.2 resolution: "html-escaper@npm:2.0.2" - checksum: d2df2da3ad40ca9ee3a39c5cc6475ef67c8f83c234475f24d8e9ce0dc80a2c82df8e1d6fa78ddd1e9022a586ea1bd247a615e80a5cd9273d90111ddda7d9e974 + checksum: 208e8a12de1a6569edbb14544f4567e6ce8ecc30b9394fcaa4e7bb1e60c12a7c9a1ed27e31290817157e8626f3a4f29e76c8747030822eb84a6abb15c255f0a0 languageName: node linkType: hard -"http-cache-semantics@npm:^4.1.0": - version: 4.1.0 - resolution: "http-cache-semantics@npm:4.1.0" - checksum: 974de94a81c5474be07f269f9fd8383e92ebb5a448208223bfb39e172a9dbc26feff250192ecc23b9593b3f92098e010406b0f24bd4d588d631f80214648ed42 +"http-cache-semantics@npm:^4.1.1": + version: 4.1.1 + resolution: "http-cache-semantics@npm:4.1.1" + checksum: ce1319b8a382eb3cbb4a37c19f6bfe14e5bb5be3d09079e885e8c513ab2d3cd9214902f8a31c9dc4e37022633ceabfc2d697405deeaf1b8f3552bb4ed996fdfc languageName: node linkType: hard @@ -5095,49 +5378,49 @@ __metadata: version: 2.0.0 resolution: "http-errors@npm:2.0.0" dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - checksum: 9b0a3782665c52ce9dc658a0d1560bcb0214ba5699e4ea15aefb2a496e2ca83db03ebc42e1cce4ac1f413e4e0d2d736a3fd755772c556a9a06853ba2a0b7d920 + depd: "npm:2.0.0" + inherits: "npm:2.0.4" + setprototypeof: "npm:1.2.0" + statuses: "npm:2.0.1" + toidentifier: "npm:1.0.1" + checksum: fc6f2715fe188d091274b5ffc8b3657bd85c63e969daa68ccb77afb05b071a4b62841acb7a21e417b5539014dff2ebf9550f0b14a9ff126f2734a7c1387f8e19 languageName: node linkType: hard -"http-proxy-agent@npm:^5.0.0": - version: 5.0.0 - resolution: "http-proxy-agent@npm:5.0.0" +"http-proxy-agent@npm:^7.0.0": + version: 7.0.0 + resolution: "http-proxy-agent@npm:7.0.0" dependencies: - "@tootallnate/once": 2 - agent-base: 6 - debug: 4 - checksum: e2ee1ff1656a131953839b2a19cd1f3a52d97c25ba87bd2559af6ae87114abf60971e498021f9b73f9fd78aea8876d1fb0d4656aac8a03c6caa9fc175f22b786 + agent-base: "npm:^7.1.0" + debug: "npm:^4.3.4" + checksum: a11574ff39436cee3c7bc67f259444097b09474605846ddd8edf0bf4ad8644be8533db1aa463426e376865047d05dc22755e638632819317c0c2f1b2196657c8 languageName: node linkType: hard -"https-proxy-agent@npm:5.0.1, https-proxy-agent@npm:^5.0.0": +"https-proxy-agent@npm:^5.0.0": version: 5.0.1 resolution: "https-proxy-agent@npm:5.0.1" dependencies: - agent-base: 6 - debug: 4 - checksum: 571fccdf38184f05943e12d37d6ce38197becdd69e58d03f43637f7fa1269cf303a7d228aa27e5b27bbd3af8f09fd938e1c91dcfefff2df7ba77c20ed8dfc765 + agent-base: "npm:6" + debug: "npm:4" + checksum: 6dd639f03434003577c62b27cafdb864784ef19b2de430d8ae2a1d45e31c4fd60719e5637b44db1a88a046934307da7089e03d6089ec3ddacc1189d8de8897d1 languageName: node linkType: hard -"human-signals@npm:^2.1.0": - version: 2.1.0 - resolution: "human-signals@npm:2.1.0" - checksum: b87fd89fce72391625271454e70f67fe405277415b48bcc0117ca73d31fa23a4241787afdc8d67f5a116cf37258c052f59ea82daffa72364d61351423848e3b8 +"https-proxy-agent@npm:^7.0.1": + version: 7.0.2 + resolution: "https-proxy-agent@npm:7.0.2" + dependencies: + agent-base: "npm:^7.0.2" + debug: "npm:4" + checksum: 7735eb90073db087e7e79312e3d97c8c04baf7ea7ca7b013382b6a45abbaa61b281041a98f4e13c8c80d88f843785bcc84ba189165b4b4087b1e3496ba656d77 languageName: node linkType: hard -"humanize-ms@npm:^1.2.1": - version: 1.2.1 - resolution: "humanize-ms@npm:1.2.1" - dependencies: - ms: ^2.0.0 - checksum: 9c7a74a2827f9294c009266c82031030eae811ca87b0da3dceb8d6071b9bde22c9f3daef0469c3c533cc67a97d8a167cd9fc0389350e5f415f61a79b171ded16 +"human-signals@npm:^4.3.0": + version: 4.3.1 + resolution: "human-signals@npm:4.3.1" + checksum: 40498b33fe139f5cc4ef5d2f95eb1803d6318ac1b1c63eaf14eeed5484d26332c828de4a5a05676b6c83d7b9e57727c59addb4b1dea19cb8d71e83689e5b336c languageName: node linkType: hard @@ -5145,8 +5428,8 @@ __metadata: version: 0.4.24 resolution: "iconv-lite@npm:0.4.24" dependencies: - safer-buffer: ">= 2.1.2 < 3" - checksum: bd9f120f5a5b306f0bc0b9ae1edeb1577161503f5f8252a20f1a9e56ef8775c9959fd01c55f2d3a39d9a8abaf3e30c1abeb1895f367dcbbe0a8fd1c9ca01c4f6 + safer-buffer: "npm:>= 2.1.2 < 3" + checksum: c6886a24cc00f2a059767440ec1bc00d334a89f250db8e0f7feb4961c8727118457e27c495ba94d082e51d3baca378726cd110aaf7ded8b9bbfd6a44760cf1d4 languageName: node linkType: hard @@ -5154,29 +5437,29 @@ __metadata: version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: - safer-buffer: ">= 2.1.2 < 3.0.0" - checksum: 3f60d47a5c8fc3313317edfd29a00a692cc87a19cac0159e2ce711d0ebc9019064108323b5e493625e25594f11c6236647d8e256fbe7a58f4a3b33b89e6d30bf + safer-buffer: "npm:>= 2.1.2 < 3.0.0" + checksum: 98102bc66b33fcf5ac044099d1257ba0b7ad5e3ccd3221f34dd508ab4070edff183276221684e1e0555b145fce0850c9f7d2b60a9fcac50fbb4ea0d6e845a3b1 languageName: node linkType: hard "ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" - checksum: 5144c0c9815e54ada181d80a0b810221a253562422e7c6c3a60b1901154184f49326ec239d618c416c1c5945a2e197107aee8d986a3dd836b53dffefd99b5e7e + checksum: b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb languageName: node linkType: hard "ignore-by-default@npm:^2.1.0": version: 2.1.0 resolution: "ignore-by-default@npm:2.1.0" - checksum: 2b2df4622b6a07a3e91893987be8f060dc553f7736b67e72aa2312041c450a6fa8371733d03c42f45a02e47ec824e961c2fba63a3d94fc59cbd669220a5b0d7a + checksum: 3a6040dac25ed9da39dee73bf1634fdd1e15b0eb7cf52a6bdec81c310565782d8811c104ce40acb3d690d61c5fc38a91c78e6baee830a8a2232424dbc6b66981 languageName: node linkType: hard -"ignore@npm:^5.0.5, ignore@npm:^5.2.0": - version: 5.2.4 - resolution: "ignore@npm:5.2.4" - checksum: 3d4c309c6006e2621659311783eaea7ebcd41fe4ca1d78c91c473157ad6666a57a2df790fe0d07a12300d9aac2888204d7be8d59f9aaf665b1c7fcdb432517ef +"ignore@npm:^5.0.5, ignore@npm:^5.2.0, ignore@npm:^5.2.4": + version: 5.3.0 + resolution: "ignore@npm:5.3.0" + checksum: dc06bea5c23aae65d0725a957a0638b57e235ae4568dda51ca142053ed2c352de7e3bc93a69b2b32ac31966a1952e9a93c5ef2e2ab7c6b06aef9808f6b55b571 languageName: node linkType: hard @@ -5184,51 +5467,51 @@ __metadata: version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: - parent-module: ^1.0.0 - resolve-from: ^4.0.0 - checksum: 2cacfad06e652b1edc50be650f7ec3be08c5e5a6f6d12d035c440a42a8cc028e60a5b99ca08a77ab4d6b1346da7d971915828f33cdab730d3d42f08242d09baa + parent-module: "npm:^1.0.0" + resolve-from: "npm:^4.0.0" + checksum: 7f882953aa6b740d1f0e384d0547158bc86efbf2eea0f1483b8900a6f65c5a5123c2cf09b0d542cc419d0b98a759ecaeb394237e97ea427f2da221dc3cd80cc3 languageName: node linkType: hard "import-lazy@npm:~4.0.0": version: 4.0.0 resolution: "import-lazy@npm:4.0.0" - checksum: 22f5e51702134aef78890156738454f620e5fe7044b204ebc057c614888a1dd6fdf2ede0fdcca44d5c173fd64f65c985f19a51775b06967ef58cc3d26898df07 + checksum: a3520313e2c31f25c0b06aa66d167f329832b68a4f957d7c9daf6e0fa41822b6e84948191648b9b9d8ca82f94740cdf15eecf2401a5b42cd1c33fd84f2225cca + languageName: node + linkType: hard + +"import-meta-resolve@npm:^4.0.0": + version: 4.0.0 + resolution: "import-meta-resolve@npm:4.0.0" + checksum: 709375e01f8c3a87b7870991ca29c630d71bb7e22b7bb0f622613173d87b41b4043b4a983800e6d38ab3867496a46f82d30df0cbc2e55792c91c23193eea67a1 languageName: node linkType: hard "imurmurhash@npm:^0.1.4": version: 0.1.4 resolution: "imurmurhash@npm:0.1.4" - checksum: 7cae75c8cd9a50f57dadd77482359f659eaebac0319dd9368bcd1714f55e65badd6929ca58569da2b6494ef13fdd5598cd700b1eba23f8b79c5f19d195a3ecf7 + checksum: 8b51313850dd33605c6c9d3fd9638b714f4c4c40250cff658209f30d40da60f78992fb2df5dabee4acf589a6a82bbc79ad5486550754bd9ec4e3fc0d4a57d6a6 languageName: node linkType: hard "indent-string@npm:^4.0.0": version: 4.0.0 resolution: "indent-string@npm:4.0.0" - checksum: 824cfb9929d031dabf059bebfe08cf3137365e112019086ed3dcff6a0a7b698cb80cf67ccccde0e25b9e2d7527aa6cc1fed1ac490c752162496caba3e6699612 + checksum: 1e1904ddb0cb3d6cce7cd09e27a90184908b7a5d5c21b92e232c93579d314f0b83c246ffb035493d0504b1e9147ba2c9b21df0030f48673fba0496ecd698161f languageName: node linkType: hard "indent-string@npm:^5.0.0": version: 5.0.0 resolution: "indent-string@npm:5.0.0" - checksum: e466c27b6373440e6d84fbc19e750219ce25865cb82d578e41a6053d727e5520dc5725217d6eb1cc76005a1bb1696a0f106d84ce7ebda3033b963a38583fb3b3 + checksum: 8ee77b57d92e71745e133f6f444d6fa3ed503ad0e1bcd7e80c8da08b42375c07117128d670589725ed07b1978065803fa86318c309ba45415b7fe13e7f170220 languageName: node linkType: hard "indexes-of@npm:^1.0.1": version: 1.0.1 resolution: "indexes-of@npm:1.0.1" - checksum: 4f9799b1739a62f3e02d09f6f4162cf9673025282af7fa36e790146e7f4e216dad3e776a25b08536c093209c9fcb5ea7bd04b082d42686a45f58ff401d6da32e - languageName: node - linkType: hard - -"infer-owner@npm:^1.0.4": - version: 1.0.4 - resolution: "infer-owner@npm:1.0.4" - checksum: 181e732764e4a0611576466b4b87dac338972b839920b2a8cde43642e4ed6bd54dc1fb0b40874728f2a2df9a1b097b8ff83b56d5f8f8e3927f837fdcb47d8a89 + checksum: 1ea1d2d00173fa38f728acfa00303657e1115361481e52f6cbae47c5d603219006c9357abf6bc323f1fb0fbe937e363bbb19e5c66c12578eea6ec6b7e892bdba languageName: node linkType: hard @@ -5236,103 +5519,110 @@ __metadata: version: 1.0.6 resolution: "inflight@npm:1.0.6" dependencies: - once: ^1.3.0 - wrappy: 1 - checksum: f4f76aa072ce19fae87ce1ef7d221e709afb59d445e05d47fba710e85470923a75de35bfae47da6de1b18afc3ce83d70facf44cfb0aff89f0a3f45c0a0244dfd + once: "npm:^1.3.0" + wrappy: "npm:1" + checksum: 7faca22584600a9dc5b9fca2cd5feb7135ac8c935449837b315676b4c90aa4f391ec4f42240178244b5a34e8bede1948627fda392ca3191522fc46b34e985ab2 languageName: node linkType: hard "inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3": version: 2.0.4 resolution: "inherits@npm:2.0.4" - checksum: 4a48a733847879d6cf6691860a6b1e3f0f4754176e4d71494c41f3475553768b10f84b5ce1d40fbd0e34e6bfbb864ee35858ad4dd2cf31e02fc4a154b724d7f1 + checksum: 4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 languageName: node linkType: hard "inherits@npm:=2.0.1": version: 2.0.1 resolution: "inherits@npm:2.0.1" - checksum: 6536b9377296d4ce8ee89c5c543cb75030934e61af42dba98a428e7d026938c5985ea4d1e3b87743a5b834f40ed1187f89c2d7479e9d59e41d2d1051aefba07b + checksum: bfc7b37c21a2cddb272adc65b053b1716612d408bb2c9a4e5c32679dc2b08032aadd67880c405be3dff060a62e45b353fc3d9fa79a3067ad7a3deb6a283cc5c6 + languageName: node + linkType: hard + +"ini@npm:4.1.1": + version: 4.1.1 + resolution: "ini@npm:4.1.1" + checksum: 7fddc8dfd3e63567d4fdd5d999d1bf8a8487f1479d0b34a1d01f28d391a9228d261e19abc38e1a6a1ceb3400c727204fce05725d5eb598dfcf2077a1e3afe211 languageName: node linkType: hard "ini@npm:^1.3.2, ini@npm:^1.3.4, ini@npm:~1.3.0": version: 1.3.8 resolution: "ini@npm:1.3.8" - checksum: dfd98b0ca3a4fc1e323e38a6c8eb8936e31a97a918d3b377649ea15bdb15d481207a0dda1021efbd86b464cae29a0d33c1d7dcaf6c5672bee17fa849bc50a1b3 + checksum: ec93838d2328b619532e4f1ff05df7909760b6f66d9c9e2ded11e5c1897d6f2f9980c54dd638f88654b00919ce31e827040631eab0a3969e4d1abefa0719516a languageName: node linkType: hard -"inquirer@npm:8.2.4": - version: 8.2.4 - resolution: "inquirer@npm:8.2.4" +"inquirer@npm:8.2.5": + version: 8.2.5 + resolution: "inquirer@npm:8.2.5" dependencies: - ansi-escapes: ^4.2.1 - chalk: ^4.1.1 - cli-cursor: ^3.1.0 - cli-width: ^3.0.0 - external-editor: ^3.0.3 - figures: ^3.0.0 - lodash: ^4.17.21 - mute-stream: 0.0.8 - ora: ^5.4.1 - run-async: ^2.4.0 - rxjs: ^7.5.5 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - through: ^2.3.6 - wrap-ansi: ^7.0.0 - checksum: dfcb6529d3af443dfea2241cb471508091b51f5121a088fdb8728b23ec9b349ef0a5e13a0ef2c8e19457b0bed22f7cbbcd561f7a4529d084c562a58c605e2655 + ansi-escapes: "npm:^4.2.1" + chalk: "npm:^4.1.1" + cli-cursor: "npm:^3.1.0" + cli-width: "npm:^3.0.0" + external-editor: "npm:^3.0.3" + figures: "npm:^3.0.0" + lodash: "npm:^4.17.21" + mute-stream: "npm:0.0.8" + ora: "npm:^5.4.1" + run-async: "npm:^2.4.0" + rxjs: "npm:^7.5.5" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + through: "npm:^2.3.6" + wrap-ansi: "npm:^7.0.0" + checksum: e3e64e10f5daeeb8f770f1310acceb4aab593c10d693e7676ecd4a5b023d5b865b484fec7ead516e5e394db70eff687ef85459f75890f11a99ceadc0f4adce18 languageName: node linkType: hard -"internal-slot@npm:^1.0.4": - version: 1.0.4 - resolution: "internal-slot@npm:1.0.4" +"internal-slot@npm:^1.0.5": + version: 1.0.6 + resolution: "internal-slot@npm:1.0.6" dependencies: - get-intrinsic: ^1.1.3 - has: ^1.0.3 - side-channel: ^1.0.4 - checksum: 8974588d06bab4f675573a3b52975370facf6486df51bc0567a982c7024fa29495f10b76c0d4dc742dd951d1b72024fdc1e31bb0bedf1678dc7aacacaf5a4f73 + get-intrinsic: "npm:^1.2.2" + hasown: "npm:^2.0.0" + side-channel: "npm:^1.0.4" + checksum: aa37cafc8ffbf513a340de58f40d5017b4949d99722d7e4f0e24b182455bdd258000d4bb1d7b4adcf9f8979b97049b99fe9defa9db8e18a78071d2637ac143fb languageName: node linkType: hard "ip@npm:^2.0.0": version: 2.0.0 resolution: "ip@npm:2.0.0" - checksum: cfcfac6b873b701996d71ec82a7dd27ba92450afdb421e356f44044ed688df04567344c36cbacea7d01b1c39a4c732dc012570ebe9bebfb06f27314bca625349 + checksum: 8d186cc5585f57372847ae29b6eba258c68862055e18a75cc4933327232cb5c107f89800ce29715d542eef2c254fbb68b382e780a7414f9ee7caf60b7a473958 languageName: node linkType: hard "ipaddr.js@npm:1.9.1": version: 1.9.1 resolution: "ipaddr.js@npm:1.9.1" - checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 + checksum: 0486e775047971d3fdb5fb4f063829bac45af299ae0b82dcf3afa2145338e08290563a2a70f34b732d795ecc8311902e541a8530eeb30d75860a78ff4e94ce2a languageName: node linkType: hard "irregular-plurals@npm:^3.3.0": - version: 3.3.0 - resolution: "irregular-plurals@npm:3.3.0" - checksum: 1282d8adfb00a9718655ce21e5b096d4b31d2115c817a30e1e3254648ae4ac0f84d706cd0cad2a93c64f4bb5c5572ea8f63fcc9766f005a5362031c56d9e77b5 + version: 3.5.0 + resolution: "irregular-plurals@npm:3.5.0" + checksum: 7c033bbe7325e5a6e0a26949cc6863b6ce273403d4cd5b93bd99b33fecb6605b0884097c4259c23ed0c52c2133bf7d1cdcdd7a0630e8c325161fe269b3447918 languageName: node linkType: hard -"is-array-buffer@npm:^3.0.0": - version: 3.0.1 - resolution: "is-array-buffer@npm:3.0.1" +"is-array-buffer@npm:^3.0.1, is-array-buffer@npm:^3.0.2": + version: 3.0.2 + resolution: "is-array-buffer@npm:3.0.2" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.3 - is-typed-array: ^1.1.10 - checksum: f26ab87448e698285daf707e52a533920449f7abf63714140ffab9d5571aa5a71ac2fa2677e8b793ad0d5d3e40078d4d2c8a0ab39c957e3cfc6513bb6c9dfdc9 + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.0" + is-typed-array: "npm:^1.1.10" + checksum: 40ed13a5f5746ac3ae2f2e463687d9b5a3f5fd0086f970fb4898f0253c2a5ec2e3caea2d664dd8f54761b1c1948609702416921a22faebe160c7640a9217c80e languageName: node linkType: hard "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" - checksum: eef4417e3c10e60e2c810b6084942b3ead455af16c4509959a27e490e7aee87cfb3f38e01bbde92220b528a0ee1a18d52b787e1458ee86174d8c7f0e58cd488f + checksum: e7fb686a739068bb70f860b39b67afc62acc62e36bb61c5f965768abce1873b379c563e61dd2adad96ebb7edf6651111b385e490cf508378959b0ed4cac4e729 languageName: node linkType: hard @@ -5340,17 +5630,8 @@ __metadata: version: 1.0.4 resolution: "is-bigint@npm:1.0.4" dependencies: - has-bigints: ^1.0.1 - checksum: c56edfe09b1154f8668e53ebe8252b6f185ee852a50f9b41e8d921cb2bed425652049fbe438723f6cb48a63ca1aa051e948e7e401e093477c99c84eba244f666 - languageName: node - linkType: hard - -"is-binary-path@npm:~2.1.0": - version: 2.1.0 - resolution: "is-binary-path@npm:2.1.0" - dependencies: - binary-extensions: ^2.0.0 - checksum: 84192eb88cff70d320426f35ecd63c3d6d495da9d805b19bc65b518984b7c0760280e57dbf119b7e9be6b161784a5a673ab2c6abe83abb5198a432232ad5b35c + has-bigints: "npm:^1.0.1" + checksum: eb9c88e418a0d195ca545aff2b715c9903d9b0a5033bc5922fec600eb0c3d7b1ee7f882dbf2e0d5a6e694e42391be3683e4368737bd3c4a77f8ac293e7773696 languageName: node linkType: hard @@ -5358,34 +5639,34 @@ __metadata: version: 1.1.2 resolution: "is-boolean-object@npm:1.1.2" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: c03b23dbaacadc18940defb12c1c0e3aaece7553ef58b162a0f6bba0c2a7e1551b59f365b91e00d2dbac0522392d576ef322628cb1d036a0fe51eb466db67222 + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: 6090587f8a8a8534c0f816da868bc94f32810f08807aa72fa7e79f7e11c466d281486ffe7a788178809c2aa71fe3e700b167fe80dd96dad68026bfff8ebf39f7 languageName: node linkType: hard -"is-builtin-module@npm:^3.2.0": - version: 3.2.0 - resolution: "is-builtin-module@npm:3.2.0" +"is-builtin-module@npm:^3.2.1": + version: 3.2.1 + resolution: "is-builtin-module@npm:3.2.1" dependencies: - builtin-modules: ^3.3.0 - checksum: 0315751b898feff0646511c896e88b608a755c5025d0ce9a3ad25783de50be870e47dafb838cebbb06fbb2a948b209ea55348eee267836c9dd40d3a11ec717d3 + builtin-modules: "npm:^3.3.0" + checksum: 5a66937a03f3b18803381518f0ef679752ac18cdb7dd53b5e23ee8df8d440558737bd8dcc04d2aae555909d2ecb4a81b5c0d334d119402584b61e6a003e31af1 languageName: node linkType: hard "is-callable@npm:^1.1.3, is-callable@npm:^1.1.4, is-callable@npm:^1.2.7": version: 1.2.7 resolution: "is-callable@npm:1.2.7" - checksum: 61fd57d03b0d984e2ed3720fb1c7a897827ea174bd44402878e059542ea8c4aeedee0ea0985998aa5cc2736b2fa6e271c08587addb5b3959ac52cf665173d1ac + checksum: ceebaeb9d92e8adee604076971dd6000d38d6afc40bb843ea8e45c5579b57671c3f3b50d7f04869618242c6cee08d1b67806a8cb8edaaaf7c0748b3720d6066f languageName: node linkType: hard -"is-core-module@npm:^2.1.0, is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.1, is-core-module@npm:^2.9.0": - version: 2.11.0 - resolution: "is-core-module@npm:2.11.0" +"is-core-module@npm:^2.1.0, is-core-module@npm:^2.13.0, is-core-module@npm:^2.13.1, is-core-module@npm:^2.5.0": + version: 2.13.1 + resolution: "is-core-module@npm:2.13.1" dependencies: - has: ^1.0.3 - checksum: f96fd490c6b48eb4f6d10ba815c6ef13f410b0ba6f7eb8577af51697de523e5f2cd9de1c441b51d27251bf0e4aebc936545e33a5d26d5d51f28d25698d4a8bab + hasown: "npm:^2.0.0" + checksum: 2cba9903aaa52718f11c4896dabc189bab980870aae86a62dc0d5cedb546896770ee946fb14c84b7adf0735f5eaea4277243f1b95f5cefa90054f92fbcac2518 languageName: node linkType: hard @@ -5393,82 +5674,99 @@ __metadata: version: 1.0.5 resolution: "is-date-object@npm:1.0.5" dependencies: - has-tostringtag: ^1.0.0 - checksum: baa9077cdf15eb7b58c79398604ca57379b2fc4cf9aa7a9b9e295278648f628c9b201400c01c5e0f7afae56507d741185730307cbe7cad3b9f90a77e5ee342fc + has-tostringtag: "npm:^1.0.0" + checksum: eed21e5dcc619c48ccef804dfc83a739dbb2abee6ca202838ee1bd5f760fe8d8a93444f0d49012ad19bb7c006186e2884a1b92f6e1c056da7fd23d0a9ad5992e languageName: node linkType: hard -"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": - version: 2.2.1 - resolution: "is-docker@npm:2.2.1" +"is-docker@npm:^3.0.0": + version: 3.0.0 + resolution: "is-docker@npm:3.0.0" bin: is-docker: cli.js - checksum: 3fef7ddbf0be25958e8991ad941901bf5922ab2753c46980b60b05c1bf9c9c2402d35e6dc32e4380b980ef5e1970a5d9d5e5aa2e02d77727c3b6b5e918474c56 - languageName: node - linkType: hard - -"is-error@npm:^2.2.2": - version: 2.2.2 - resolution: "is-error@npm:2.2.2" - checksum: a97b39587150f0d38f9f93f64699807fe3020fe5edbd63548f234dc2ba96fd7c776d66c062bf031dfeb93c7f48db563ff6bde588418ca041da37c659a416f055 + checksum: d2c4f8e6d3e34df75a5defd44991b6068afad4835bb783b902fa12d13ebdb8f41b2a199dcb0b5ed2cb78bfee9e4c0bbdb69c2d9646f4106464674d3e697a5856 languageName: node linkType: hard "is-extglob@npm:^2.1.1": version: 2.1.1 resolution: "is-extglob@npm:2.1.1" - checksum: df033653d06d0eb567461e58a7a8c9f940bd8c22274b94bf7671ab36df5719791aae15eef6d83bbb5e23283967f2f984b8914559d4449efda578c775c4be6f85 + checksum: 5487da35691fbc339700bbb2730430b07777a3c21b9ebaecb3072512dfd7b4ba78ac2381a87e8d78d20ea08affb3f1971b4af629173a6bf435ff8a4c47747912 languageName: node linkType: hard "is-fullwidth-code-point@npm:^3.0.0": version: 3.0.0 resolution: "is-fullwidth-code-point@npm:3.0.0" - checksum: 44a30c29457c7fb8f00297bce733f0a64cd22eca270f83e58c105e0d015e45c019491a4ab2faef91ab51d4738c670daff901c799f6a700e27f7314029e99e348 + checksum: bb11d825e049f38e04c06373a8d72782eee0205bda9d908cc550ccb3c59b99d750ff9537982e01733c1c94a58e35400661f57042158ff5e8f3e90cf936daf0fc languageName: node linkType: hard "is-fullwidth-code-point@npm:^4.0.0": version: 4.0.0 resolution: "is-fullwidth-code-point@npm:4.0.0" - checksum: 8ae89bf5057bdf4f57b346fb6c55e9c3dd2549983d54191d722d5c739397a903012cc41a04ee3403fd872e811243ef91a7c5196da7b5841dc6b6aae31a264a8d + checksum: df2a717e813567db0f659c306d61f2f804d480752526886954a2a3e2246c7745fd07a52b5fecf2b68caf0a6c79dcdace6166fdf29cc76ed9975cc334f0a018b8 languageName: node linkType: hard -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: - is-extglob: ^2.1.1 - checksum: d381c1319fcb69d341cc6e6c7cd588e17cd94722d9a32dbd60660b993c4fb7d0f19438674e68dfec686d09b7c73139c9166b47597f846af387450224a8101ab4 + is-extglob: "npm:^2.1.1" + checksum: 17fb4014e22be3bbecea9b2e3a76e9e34ff645466be702f1693e8f1ee1adac84710d0be0bd9f967d6354036fd51ab7c2741d954d6e91dae6bb69714de92c197a + languageName: node + linkType: hard + +"is-immutable-type@npm:^2.0.1": + version: 2.0.1 + resolution: "is-immutable-type@npm:2.0.1" + dependencies: + "@typescript-eslint/type-utils": "npm:^6.0.0" + ts-api-utils: "npm:^1.0.1" + peerDependencies: + eslint: "*" + typescript: ">=4.7.4" + checksum: 1ce7e6ea31e8da9ee2e1bb1ee4bf7dfdb8bbab77fe6b36ec2198b70977168b0c102afe297d12b6a2597ee9166f70cc3ee8ff4898baa3f481e632c74d1fd60adc + languageName: node + linkType: hard + +"is-inside-container@npm:^1.0.0": + version: 1.0.0 + resolution: "is-inside-container@npm:1.0.0" + dependencies: + is-docker: "npm:^3.0.0" + bin: + is-inside-container: cli.js + checksum: a8efb0e84f6197e6ff5c64c52890fa9acb49b7b74fed4da7c95383965da6f0fa592b4dbd5e38a79f87fc108196937acdbcd758fcefc9b140e479b39ce1fcd1cd languageName: node linkType: hard "is-interactive@npm:^1.0.0": version: 1.0.0 resolution: "is-interactive@npm:1.0.0" - checksum: 824808776e2d468b2916cdd6c16acacebce060d844c35ca6d82267da692e92c3a16fdba624c50b54a63f38bdc4016055b6f443ce57d7147240de4f8cdabaf6f9 + checksum: dd47904dbf286cd20aa58c5192161be1a67138485b9836d5a70433b21a45442e9611b8498b8ab1f839fc962c7620667a50535fdfb4a6bc7989b8858645c06b4d languageName: node linkType: hard "is-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" - checksum: 93a32f01940220532e5948538699ad610d5924ac86093fcee83022252b363eb0cc99ba53ab084a04e4fb62bf7b5731f55496257a4c38adf87af9c4d352c71c35 + checksum: 85fee098ae62ba6f1e24cf22678805473c7afd0fb3978a3aa260e354cb7bcb3a5806cf0a98403188465efedec41ab4348e8e4e79305d409601323855b3839d4d languageName: node linkType: hard "is-module@npm:^1.0.0": version: 1.0.0 resolution: "is-module@npm:1.0.0" - checksum: 8cd5390730c7976fb4e8546dd0b38865ee6f7bacfa08dfbb2cc07219606755f0b01709d9361e01f13009bbbd8099fa2927a8ed665118a6105d66e40f1b838c3f + checksum: 795a3914bcae7c26a1c23a1e5574c42eac13429625045737bf3e324ce865c0601d61aee7a5afbca1bee8cb300c7d9647e7dc98860c9bdbc3b7fdc51d8ac0bffc languageName: node linkType: hard "is-negative-zero@npm:^2.0.2": version: 2.0.2 resolution: "is-negative-zero@npm:2.0.2" - checksum: f3232194c47a549da60c3d509c9a09be442507616b69454716692e37ae9f37c4dea264fb208ad0c9f3efd15a796a46b79df07c7e53c6227c32170608b809149a + checksum: eda024c158f70f2017f3415e471b818d314da5ef5be68f801b16314d4a4b6304a74cbed778acf9e2f955bb9c1c5f2935c1be0c7c99e1ad12286f45366217b6a3 languageName: node linkType: hard @@ -5476,80 +5774,66 @@ __metadata: version: 1.0.7 resolution: "is-number-object@npm:1.0.7" dependencies: - has-tostringtag: ^1.0.0 - checksum: d1e8d01bb0a7134c74649c4e62da0c6118a0bfc6771ea3c560914d52a627873e6920dd0fd0ebc0e12ad2ff4687eac4c308f7e80320b973b2c8a2c8f97a7524f7 + has-tostringtag: "npm:^1.0.0" + checksum: aad266da1e530f1804a2b7bd2e874b4869f71c98590b3964f9d06cc9869b18f8d1f4778f838ecd2a11011bce20aeecb53cb269ba916209b79c24580416b74b1b languageName: node linkType: hard "is-number@npm:^7.0.0": version: 7.0.0 resolution: "is-number@npm:7.0.0" - checksum: 456ac6f8e0f3111ed34668a624e45315201dff921e5ac181f8ec24923b99e9f32ca1a194912dc79d539c97d33dba17dc635202ff0b2cf98326f608323276d27a + checksum: b4686d0d3053146095ccd45346461bc8e53b80aeb7671cc52a4de02dbbf7dc0d1d2a986e2fe4ae206984b4d34ef37e8b795ebc4f4295c978373e6575e295d811 languageName: node linkType: hard "is-obj@npm:^1.0.1": version: 1.0.1 resolution: "is-obj@npm:1.0.1" - checksum: 3ccf0efdea12951e0b9c784e2b00e77e87b2f8bd30b42a498548a8afcc11b3287342a2030c308e473e93a7a19c9ea7854c99a8832a476591c727df2a9c79796c + checksum: 5003acba0af7aa47dfe0760e545a89bbac89af37c12092c3efadc755372cdaec034f130e7a3653a59eb3c1843cfc72ca71eaf1a6c3bafe5a0bab3611a47f9945 languageName: node linkType: hard "is-obj@npm:^2.0.0": version: 2.0.0 resolution: "is-obj@npm:2.0.0" - checksum: c9916ac8f4621962a42f5e80e7ffdb1d79a3fab7456ceaeea394cd9e0858d04f985a9ace45be44433bf605673c8be8810540fe4cc7f4266fc7526ced95af5a08 - languageName: node - linkType: hard - -"is-path-cwd@npm:^3.0.0": - version: 3.0.0 - resolution: "is-path-cwd@npm:3.0.0" - checksum: bc34d13b6a03dfca4a3ab6a8a5ba78ae4b24f4f1db4b2b031d2760c60d0913bd16a4b980dcb4e590adfc906649d5f5132684079a3972bd219da49deebb9adea8 + checksum: 85044ed7ba8bd169e2c2af3a178cacb92a97aa75de9569d02efef7f443a824b5e153eba72b9ae3aca6f8ce81955271aa2dc7da67a8b720575d3e38104208cb4e languageName: node linkType: hard "is-path-inside@npm:^3.0.3": version: 3.0.3 resolution: "is-path-inside@npm:3.0.3" - checksum: abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - -"is-path-inside@npm:^4.0.0": - version: 4.0.0 - resolution: "is-path-inside@npm:4.0.0" - checksum: 8810fa11c58e6360b82c3e0d6cd7d9c7d0392d3ac9eb10f980b81f9839f40ac6d1d6d6f05d069db0d227759801228f0b072e1b6c343e4469b065ab5fe0b68fe5 + checksum: cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 languageName: node linkType: hard "is-plain-obj@npm:^1.1.0": version: 1.1.0 resolution: "is-plain-obj@npm:1.1.0" - checksum: 0ee04807797aad50859652a7467481816cbb57e5cc97d813a7dcd8915da8195dc68c436010bf39d195226cde6a2d352f4b815f16f26b7bf486a5754290629931 + checksum: daaee1805add26f781b413fdf192fc91d52409583be30ace35c82607d440da63cc4cac0ac55136716688d6c0a2c6ef3edb2254fecbd1fe06056d6bd15975ee8c languageName: node linkType: hard "is-plain-object@npm:^5.0.0": version: 5.0.0 resolution: "is-plain-object@npm:5.0.0" - checksum: e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c + checksum: 893e42bad832aae3511c71fd61c0bf61aa3a6d853061c62a307261842727d0d25f761ce9379f7ba7226d6179db2a3157efa918e7fe26360f3bf0842d9f28942c languageName: node linkType: hard "is-promise@npm:^4.0.0": version: 4.0.0 resolution: "is-promise@npm:4.0.0" - checksum: 0b46517ad47b00b6358fd6553c83ec1f6ba9acd7ffb3d30a0bf519c5c69e7147c132430452351b8a9fc198f8dd6c4f76f8e6f5a7f100f8c77d57d9e0f4261a8a + checksum: ebd5c672d73db781ab33ccb155fb9969d6028e37414d609b115cc534654c91ccd061821d5b987eefaa97cf4c62f0b909bb2f04db88306de26e91bfe8ddc01503 languageName: node linkType: hard -"is-reference@npm:^1.2.1": +"is-reference@npm:1.2.1": version: 1.2.1 resolution: "is-reference@npm:1.2.1" dependencies: - "@types/estree": "*" - checksum: e7b48149f8abda2c10849ea51965904d6a714193d68942ad74e30522231045acf06cbfae5a4be2702fede5d232e61bf50b3183acdc056e6e3afe07fcf4f4b2bc + "@types/estree": "npm:*" + checksum: 7dc819fc8de7790264a0a5d531164f9f5b9ef5aa1cd05f35322d14db39c8a2ec78fd5d4bf57f9789f3ddd2b3abeea7728432b759636157a42db12a9e8c3b549b languageName: node linkType: hard @@ -5557,23 +5841,23 @@ __metadata: version: 1.1.4 resolution: "is-regex@npm:1.1.4" dependencies: - call-bind: ^1.0.2 - has-tostringtag: ^1.0.0 - checksum: 362399b33535bc8f386d96c45c9feb04cf7f8b41c182f54174c1a45c9abbbe5e31290bbad09a458583ff6bf3b2048672cdb1881b13289569a7c548370856a652 + call-bind: "npm:^1.0.2" + has-tostringtag: "npm:^1.0.0" + checksum: bb72aae604a69eafd4a82a93002058c416ace8cde95873589a97fc5dac96a6c6c78a9977d487b7b95426a8f5073969124dd228f043f9f604f041f32fcc465fc1 languageName: node linkType: hard "is-regexp@npm:^1.0.0": version: 1.0.0 resolution: "is-regexp@npm:1.0.0" - checksum: be692828e24cba479ec33644326fa98959ec68ba77965e0291088c1a741feaea4919d79f8031708f85fd25e39de002b4520622b55460660b9c369e6f7187faef + checksum: 34cacda1901e00f6e44879378f1d2fa96320ea956c1bec27713130aaf1d44f6e7bd963eed28945bfe37e600cb27df1cf5207302680dad8bdd27b9baff8ecf611 languageName: node linkType: hard "is-relative-path@npm:^1.0.2": version: 1.0.2 resolution: "is-relative-path@npm:1.0.2" - checksum: 6c2ccffd3c0a3e3990535d0571370883d558b825b51940085f3446ec338857f4552f44521dfec3e83b7e067de08c0b0369de290208a91200bcae2c569533e340 + checksum: aaa1129bacb8cf89c03b6b5772916688d19fb3e83a9d74cc352294eb68219926dfd3e83489d2590f8aaf6551606531579ec9acfcb3af082fef718e34f4dd0aa9 languageName: node linkType: hard @@ -5581,22 +5865,15 @@ __metadata: version: 1.0.2 resolution: "is-shared-array-buffer@npm:1.0.2" dependencies: - call-bind: ^1.0.2 - checksum: 9508929cf14fdc1afc9d61d723c6e8d34f5e117f0bffda4d97e7a5d88c3a8681f633a74f8e3ad1fe92d5113f9b921dc5ca44356492079612f9a247efbce7032a - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": - version: 2.0.1 - resolution: "is-stream@npm:2.0.1" - checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 + call-bind: "npm:^1.0.2" + checksum: cfeee6f171f1b13e6cbc6f3b6cc44e192b93df39f3fcb31aa66ffb1d2df3b91e05664311659f9701baba62f5e98c83b0673c628e7adc30f55071c4874fcdccec languageName: node linkType: hard "is-stream@npm:^3.0.0": version: 3.0.0 resolution: "is-stream@npm:3.0.0" - checksum: 172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 + checksum: eb2f7127af02ee9aa2a0237b730e47ac2de0d4e76a4a905a50a11557f2339df5765eaea4ceb8029f1efa978586abe776908720bfcb1900c20c6ec5145f6f29d8 languageName: node linkType: hard @@ -5604,8 +5881,8 @@ __metadata: version: 1.0.7 resolution: "is-string@npm:1.0.7" dependencies: - has-tostringtag: ^1.0.0 - checksum: 323b3d04622f78d45077cf89aab783b2f49d24dc641aa89b5ad1a72114cfeff2585efc8c12ef42466dff32bde93d839ad321b26884cf75e5a7892a938b089989 + has-tostringtag: "npm:^1.0.0" + checksum: 905f805cbc6eedfa678aaa103ab7f626aac9ebbdc8737abb5243acaa61d9820f8edc5819106b8fcd1839e33db21de9f0116ae20de380c8382d16dc2a601921f6 languageName: node linkType: hard @@ -5613,8 +5890,8 @@ __metadata: version: 1.0.4 resolution: "is-symbol@npm:1.0.4" dependencies: - has-symbols: ^1.0.2 - checksum: 92805812ef590738d9de49d677cd17dfd486794773fb6fa0032d16452af46e9b91bb43ffe82c983570f015b37136f4b53b28b8523bfb10b0ece7a66c31a54510 + has-symbols: "npm:^1.0.2" + checksum: 9381dd015f7c8906154dbcbf93fad769de16b4b961edc94f88d26eb8c555935caa23af88bda0c93a18e65560f6d7cca0fd5a3f8a8e1df6f1abbb9bead4502ef7 languageName: node linkType: hard @@ -5622,63 +5899,59 @@ __metadata: version: 1.0.1 resolution: "is-text-path@npm:1.0.1" dependencies: - text-extensions: ^1.0.0 - checksum: fb5d78752c22b3f73a7c9540768f765ffcfa38c9e421e2b9af869565307fa1ae5e3d3a2ba016a43549742856846566d327da406e94a5846ec838a288b1704fd2 + text-extensions: "npm:^1.0.0" + checksum: 61c8650c29548febb6bf69e9541fc11abbbb087a0568df7bc471ba264e95fb254def4e610631cbab4ddb0a1a07949d06416f4ebeaf37875023fb184cdb87ee84 languageName: node linkType: hard -"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.9": - version: 1.1.10 - resolution: "is-typed-array@npm:1.1.10" +"is-typed-array@npm:^1.1.10, is-typed-array@npm:^1.1.12, is-typed-array@npm:^1.1.9": + version: 1.1.12 + resolution: "is-typed-array@npm:1.1.12" dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - for-each: ^0.3.3 - gopd: ^1.0.1 - has-tostringtag: ^1.0.0 - checksum: aac6ecb59d4c56a1cdeb69b1f129154ef462bbffe434cb8a8235ca89b42f258b7ae94073c41b3cb7bce37f6a1733ad4499f07882d5d5093a7ba84dfc4ebb8017 + which-typed-array: "npm:^1.1.11" + checksum: 9863e9cc7223c6fc1c462a2c3898a7beff6b41b1ee0fabb03b7d278ae7de670b5bcbc8627db56bb66ed60902fa37d53fe5cce0fd2f7d73ac64fe5da6f409b6ae languageName: node linkType: hard "is-typedarray@npm:^1.0.0": version: 1.0.0 resolution: "is-typedarray@npm:1.0.0" - checksum: 3508c6cd0a9ee2e0df2fa2e9baabcdc89e911c7bd5cf64604586697212feec525aa21050e48affb5ffc3df20f0f5d2e2cf79b08caa64e1ccc9578e251763aef7 + checksum: 4c096275ba041a17a13cca33ac21c16bc4fd2d7d7eb94525e7cd2c2f2c1a3ab956e37622290642501ff4310601e413b675cf399ad6db49855527d2163b3eeeec languageName: node linkType: hard "is-unicode-supported@npm:^0.1.0": version: 0.1.0 resolution: "is-unicode-supported@npm:0.1.0" - checksum: a2aab86ee7712f5c2f999180daaba5f361bdad1efadc9610ff5b8ab5495b86e4f627839d085c6530363c6d6d4ecbde340fb8e54bdb83da4ba8e0865ed5513c52 + checksum: 00cbe3455c3756be68d2542c416cab888aebd5012781d6819749fefb15162ff23e38501fe681b3d751c73e8ff561ac09a5293eba6f58fdf0178462ce6dcb3453 languageName: node linkType: hard -"is-unicode-supported@npm:^1.2.0": - version: 1.3.0 - resolution: "is-unicode-supported@npm:1.3.0" - checksum: 20a1fc161afafaf49243551a5ac33b6c4cf0bbcce369fcd8f2951fbdd000c30698ce320de3ee6830497310a8f41880f8066d440aa3eb0a853e2aa4836dd89abc +"is-unicode-supported@npm:^2.0.0": + version: 2.0.0 + resolution: "is-unicode-supported@npm:2.0.0" + checksum: 3013dfb8265fe9f9a0d1e9433fc4e766595631a8d85d60876c457b4bedc066768dab1477c553d02e2f626d88a4e019162706e04263c94d74994ef636a33b5f94 languageName: node linkType: hard "is-url-superb@npm:^4.0.0": version: 4.0.0 resolution: "is-url-superb@npm:4.0.0" - checksum: fd55e91c96349acb0d688f95fcb1ac67450e5db934976e3a8ff13ef446841e779a6f4d18b15f02331f05a3429c8fdaba2382ac1ab444059e86e9ffcde1ec8db0 + checksum: 354ea8246d5b5a828e41bb4ed66c539a7b74dc878ee4fa84b148df312b14b08118579d64f0893b56a0094e3b4b1e6082d2fbe2e3792998d7edffde1c0f3dfdd9 languageName: node linkType: hard "is-url@npm:^1.2.4": version: 1.2.4 resolution: "is-url@npm:1.2.4" - checksum: 100e74b3b1feab87a43ef7653736e88d997eb7bd32e71fd3ebc413e58c1cbe56269699c776aaea84244b0567f2a7d68dfaa512a062293ed2f9fdecb394148432 + checksum: 0157a79874f8f95fdd63540e3f38c8583c2ef572661cd0693cda80ae3e42dfe8e9a4a972ec1b827f861d9a9acf75b37f7d58a37f94a8a053259642912c252bc3 languageName: node linkType: hard "is-utf8@npm:^0.2.1": version: 0.2.1 resolution: "is-utf8@npm:0.2.1" - checksum: 167ccd2be869fc228cc62c1a28df4b78c6b5485d15a29027d3b5dceb09b383e86a3522008b56dcac14b592b22f0a224388718c2505027a994fd8471465de54b3 + checksum: 3ed45e5b4ddfa04ed7e32c63d29c61b980ecd6df74698f45978b8c17a54034943bcbffb6ae243202e799682a66f90fef526f465dd39438745e9fe70794c1ef09 languageName: node linkType: hard @@ -5686,101 +5959,130 @@ __metadata: version: 1.0.2 resolution: "is-weakref@npm:1.0.2" dependencies: - call-bind: ^1.0.2 - checksum: 95bd9a57cdcb58c63b1c401c60a474b0f45b94719c30f548c891860f051bc2231575c290a6b420c6bc6e7ed99459d424c652bd5bf9a1d5259505dc35b4bf83de + call-bind: "npm:^1.0.2" + checksum: 1545c5d172cb690c392f2136c23eec07d8d78a7f57d0e41f10078aa4f5daf5d7f57b6513a67514ab4f073275ad00c9822fc8935e00229d0a2089e1c02685d4b1 languageName: node linkType: hard "is-windows@npm:^1.0.1": version: 1.0.2 resolution: "is-windows@npm:1.0.2" - checksum: 438b7e52656fe3b9b293b180defb4e448088e7023a523ec21a91a80b9ff8cdb3377ddb5b6e60f7c7de4fa8b63ab56e121b6705fe081b3cf1b828b0a380009ad7 + checksum: b32f418ab3385604a66f1b7a3ce39d25e8881dee0bd30816dc8344ef6ff9df473a732bcc1ec4e84fe99b2f229ae474f7133e8e93f9241686cfcf7eebe53ba7a5 languageName: node linkType: hard -"is-wsl@npm:^2.2.0": - version: 2.2.0 - resolution: "is-wsl@npm:2.2.0" +"is-wsl@npm:^3.1.0": + version: 3.1.0 + resolution: "is-wsl@npm:3.1.0" dependencies: - is-docker: ^2.0.0 - checksum: 20849846ae414997d290b75e16868e5261e86ff5047f104027026fd61d8b5a9b0b3ade16239f35e1a067b3c7cc02f70183cb661010ed16f4b6c7c93dad1b19d8 + is-inside-container: "npm:^1.0.0" + checksum: d3317c11995690a32c362100225e22ba793678fe8732660c6de511ae71a0ff05b06980cf21f98a6bf40d7be0e9e9506f859abe00a1118287d63e53d0a3d06947 + languageName: node + linkType: hard + +"isarray@npm:^2.0.5": + version: 2.0.5 + resolution: "isarray@npm:2.0.5" + checksum: 4199f14a7a13da2177c66c31080008b7124331956f47bca57dd0b6ea9f11687aa25e565a2c7a2b519bc86988d10398e3049a1f5df13c9f6b7664154690ae79fd languageName: node linkType: hard "isarray@npm:~1.0.0": version: 1.0.0 resolution: "isarray@npm:1.0.0" - checksum: f032df8e02dce8ec565cf2eb605ea939bdccea528dbcf565cdf92bfa2da9110461159d86a537388ef1acef8815a330642d7885b29010e8f7eac967c9993b65ab + checksum: 18b5be6669be53425f0b84098732670ed4e727e3af33bc7f948aac01782110eb9a18b3b329c5323bcdd3acdaae547ee077d3951317e7f133bff7105264b3003d languageName: node linkType: hard "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" - checksum: 26bf6c5480dda5161c820c5b5c751ae1e766c587b1f951ea3fcfc973bafb7831ae5b54a31a69bd670220e42e99ec154475025a468eae58ea262f813fdc8d1c62 + checksum: 228cfa503fadc2c31596ab06ed6aa82c9976eec2bfd83397e7eaf06d0ccf42cd1dfd6743bf9aeb01aebd4156d009994c5f76ea898d2832c1fe342da923ca457d + languageName: node + linkType: hard + +"isexe@npm:^3.1.1": + version: 3.1.1 + resolution: "isexe@npm:3.1.1" + checksum: 9ec257654093443eb0a528a9c8cbba9c0ca7616ccb40abd6dde7202734d96bb86e4ac0d764f0f8cd965856aacbff2f4ce23e730dc19dfb41e3b0d865ca6fdcc7 languageName: node linkType: hard "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": - version: 3.2.0 - resolution: "istanbul-lib-coverage@npm:3.2.0" - checksum: a2a545033b9d56da04a8571ed05c8120bf10e9bce01cf8633a3a2b0d1d83dff4ac4fe78d6d5673c27fc29b7f21a41d75f83a36be09f82a61c367b56aa73c1ff9 + version: 3.2.2 + resolution: "istanbul-lib-coverage@npm:3.2.2" + checksum: 6c7ff2106769e5f592ded1fb418f9f73b4411fd5a084387a5410538332b6567cd1763ff6b6cadca9b9eb2c443cce2f7ea7d7f1b8d315f9ce58539793b1e0922b languageName: node linkType: hard -"istanbul-lib-report@npm:^3.0.0": - version: 3.0.0 - resolution: "istanbul-lib-report@npm:3.0.0" +"istanbul-lib-report@npm:^3.0.0, istanbul-lib-report@npm:^3.0.1": + version: 3.0.1 + resolution: "istanbul-lib-report@npm:3.0.1" + dependencies: + istanbul-lib-coverage: "npm:^3.0.0" + make-dir: "npm:^4.0.0" + supports-color: "npm:^7.1.0" + checksum: 84323afb14392de8b6a5714bd7e9af845cfbd56cfe71ed276cda2f5f1201aea673c7111901227ee33e68e4364e288d73861eb2ed48f6679d1e69a43b6d9b3ba7 + languageName: node + linkType: hard + +"istanbul-reports@npm:^3.1.6": + version: 3.1.6 + resolution: "istanbul-reports@npm:3.1.6" + dependencies: + html-escaper: "npm:^2.0.0" + istanbul-lib-report: "npm:^3.0.0" + checksum: ec3f1bdbc51b3e0b325a5b9f4ad31a247697f31001df4e81075f7980413f14da1b5adfec574fd156efd3b0464023f61320f6718efc66ee72b32d89611cef99dd + languageName: node + linkType: hard + +"jackspeak@npm:^2.3.5": + version: 2.3.6 + resolution: "jackspeak@npm:2.3.6" dependencies: - istanbul-lib-coverage: ^3.0.0 - make-dir: ^3.0.0 - supports-color: ^7.1.0 - checksum: 3f29eb3f53c59b987386e07fe772d24c7f58c6897f34c9d7a296f4000de7ae3de9eb95c3de3df91dc65b134c84dee35c54eee572a56243e8907c48064e34ff1b + "@isaacs/cliui": "npm:^8.0.2" + "@pkgjs/parseargs": "npm:^0.11.0" + dependenciesMeta: + "@pkgjs/parseargs": + optional: true + checksum: f01d8f972d894cd7638bc338e9ef5ddb86f7b208ce177a36d718eac96ec86638a6efa17d0221b10073e64b45edc2ce15340db9380b1f5d5c5d000cbc517dc111 languageName: node linkType: hard -"istanbul-reports@npm:^3.1.4": - version: 3.1.5 - resolution: "istanbul-reports@npm:3.1.5" - dependencies: - html-escaper: ^2.0.0 - istanbul-lib-report: ^3.0.0 - checksum: 7867228f83ed39477b188ea07e7ccb9b4f5320b6f73d1db93a0981b7414fa4ef72d3f80c4692c442f90fc250d9406e71d8d7ab65bb615cb334e6292b73192b89 +"jiti@npm:^1.19.1": + version: 1.21.0 + resolution: "jiti@npm:1.21.0" + bin: + jiti: bin/jiti.js + checksum: 7f361219fe6c7a5e440d5f1dba4ab763a5538d2df8708cdc22561cf25ea3e44b837687931fca7cdd8cdd9f567300e90be989dd1321650045012d8f9ed6aab07f languageName: node linkType: hard "jju@npm:~1.4.0": version: 1.4.0 resolution: "jju@npm:1.4.0" - checksum: 3790481bd2b7827dd6336e6e3dc2dcc6d425679ba7ebde7b679f61dceb4457ea0cda330972494de608571f4973c6dfb5f70fab6f3c5037dbab19ac449a60424f - languageName: node - linkType: hard - -"js-sdsl@npm:^4.1.4": - version: 4.2.0 - resolution: "js-sdsl@npm:4.2.0" - checksum: 2cd0885f7212afb355929d72ca105cb37de7e95ad6031e6a32619eaefa46735a7d0fb682641a0ba666e1519cb138fe76abc1eea8a34e224140c9d94c995171f1 + checksum: f3f444557e4364cfc06b1abf8331bf3778b26c0c8552ca54429bc0092652172fdea26cbffe33e1017b303d5aa506f7ede8571857400efe459cb7439180e2acad languageName: node linkType: hard "js-sha256@npm:^0.9.0": version: 0.9.0 resolution: "js-sha256@npm:0.9.0" - checksum: ffad54b3373f81581e245866abfda50a62c483803a28176dd5c28fd2d313e0bdf830e77dac7ff8afd193c53031618920f3d98daf21cbbe80082753ab639c0365 + checksum: f20b9245f6ebe666f42ca05536f777301132fb1aa7fbc22f10578fa302717a6cca507344894efdeaf40a011256eb2f7d517b94ac7105bd5cf087fa61551ad634 languageName: node linkType: hard "js-string-escape@npm:^1.0.1": version: 1.0.1 resolution: "js-string-escape@npm:1.0.1" - checksum: f11e0991bf57e0c183b55c547acec85bd2445f043efc9ea5aa68b41bd2a3e7d3ce94636cb233ae0d84064ba4c1a505d32e969813c5b13f81e7d4be12c59256fe + checksum: 2c33b9ff1ba6b84681c51ca0997e7d5a1639813c95d5b61cb7ad47e55cc28fa4a0b1935c3d218710d8e6bcee5d0cd8c44755231e3a4e45fc604534d9595a3628 languageName: node linkType: hard "js-tokens@npm:^4.0.0": version: 4.0.0 resolution: "js-tokens@npm:4.0.0" - checksum: 8a95213a5a77deb6cbe94d86340e8d9ace2b93bc367790b260101d2f36a2eaf4e4e22d9fa9cf459b38af3a32fb4190e638024cf82ec95ef708680e405ea7cc78 + checksum: e248708d377aa058eacf2037b07ded847790e6de892bbad3dac0abba2e759cb9f121b00099a65195616badcb6eca8d14d975cb3e89eb1cfda644756402c8aeed languageName: node linkType: hard @@ -5788,11 +6090,11 @@ __metadata: version: 3.14.1 resolution: "js-yaml@npm:3.14.1" dependencies: - argparse: ^1.0.7 - esprima: ^4.0.0 + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" bin: js-yaml: bin/js-yaml.js - checksum: bef146085f472d44dee30ec34e5cf36bf89164f5d585435a3d3da89e52622dff0b188a580e4ad091c3341889e14cb88cac6e4deb16dc5b1e9623bb0601fc255c + checksum: 6746baaaeac312c4db8e75fa22331d9a04cccb7792d126ed8ce6a0bbcfef0cedaddd0c5098fade53db067c09fe00aa1c957674b4765610a8b06a5a189e46433b languageName: node linkType: hard @@ -5800,10 +6102,10 @@ __metadata: version: 4.1.0 resolution: "js-yaml@npm:4.1.0" dependencies: - argparse: ^2.0.1 + argparse: "npm:^2.0.1" bin: js-yaml: bin/js-yaml.js - checksum: c7830dfd456c3ef2c6e355cc5a92e6700ceafa1d14bba54497b34a99f0376cecbb3e9ac14d3e5849b426d5a5140709a66237a8c991c675431271c4ce5504151a + checksum: 184a24b4eaacfce40ad9074c64fd42ac83cf74d8c8cd137718d456ced75051229e5061b8633c3366b8aada17945a7a356b337828c19da92b51ae62126575018f languageName: node linkType: hard @@ -5811,25 +6113,32 @@ __metadata: version: 3.13.1 resolution: "js-yaml@npm:3.13.1" dependencies: - argparse: ^1.0.7 - esprima: ^4.0.0 + argparse: "npm:^1.0.7" + esprima: "npm:^4.0.0" bin: js-yaml: bin/js-yaml.js - checksum: 7511b764abb66d8aa963379f7d2a404f078457d106552d05a7b556d204f7932384e8477513c124749fa2de52eb328961834562bd09924902c6432e40daa408bc + checksum: 6a4f78b998d2eb58964cc5e051c031865bf292dc3c156a8057cf468d9e60a8739f4e8f607a267e97f09eb8d08263b8262df57eddb16b920ec5a04a259c3b4960 + languageName: node + linkType: hard + +"json-buffer@npm:3.0.1": + version: 3.0.1 + resolution: "json-buffer@npm:3.0.1" + checksum: 0d1c91569d9588e7eef2b49b59851f297f3ab93c7b35c7c221e288099322be6b562767d11e4821da500f3219542b9afd2e54c5dc573107c1126ed1080f8e96d7 languageName: node linkType: hard "json-parse-better-errors@npm:^1.0.1": version: 1.0.2 resolution: "json-parse-better-errors@npm:1.0.2" - checksum: ff2b5ba2a70e88fd97a3cb28c1840144c5ce8fae9cbeeddba15afa333a5c407cf0e42300cd0a2885dbb055227fe68d405070faad941beeffbfde9cf3b2c78c5d + checksum: 2f1287a7c833e397c9ddd361a78638e828fc523038bb3441fd4fc144cfd2c6cd4963ffb9e207e648cf7b692600f1e1e524e965c32df5152120910e4903a47dcb languageName: node linkType: hard "json-parse-even-better-errors@npm:^2.3.0": version: 2.3.1 resolution: "json-parse-even-better-errors@npm:2.3.1" - checksum: 798ed4cf3354a2d9ccd78e86d2169515a0097a5c133337807cdf7f1fc32e1391d207ccfc276518cc1d7d8d4db93288b8a50ba4293d212ad1336e52a8ec0a941f + checksum: 140932564c8f0b88455432e0f33c4cb4086b8868e37524e07e723f4eaedb9425bdc2bafd71bd1d9765bd15fd1e2d126972bc83990f55c467168c228c24d665f3 languageName: node linkType: hard @@ -5837,63 +6146,63 @@ __metadata: version: 2.0.0 resolution: "json-schema-migrate@npm:2.0.0" dependencies: - ajv: ^8.0.0 - checksum: 21537305f3a5102695cfeeab997d565516297b240ee560bf7fe5c01ea4d56b65e0fbc4e9a4f9a32819e2cb1874daf43b06eb580e623d0aade0cf50d03ae40418 + ajv: "npm:^8.0.0" + checksum: 9d14970cd1cab496b0a5dc52c3a69a0346dc2bd4ce3135a3561739eddb46cb7696dc815ff9ddcd015c4c4532b56495a1ec5db4b141b77e6d2c9c7b492cd02c6a languageName: node linkType: hard "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" - checksum: 7486074d3ba247769fda17d5181b345c9fb7d12e0da98b22d1d71a5db9698d8b4bd900a3ec1a4ffdd60846fc2556274a5c894d0c48795f14cb03aeae7b55260b + checksum: 108fa90d4cc6f08243aedc6da16c408daf81793bf903e9fd5ab21983cda433d5d2da49e40711da016289465ec2e62e0324dcdfbc06275a607fe3233fde4942ce languageName: node linkType: hard "json-schema-traverse@npm:^1.0.0": version: 1.0.0 resolution: "json-schema-traverse@npm:1.0.0" - checksum: 02f2f466cdb0362558b2f1fd5e15cce82ef55d60cd7f8fa828cf35ba74330f8d767fcae5c5c2adb7851fa811766c694b9405810879bc4e1ddd78a7c0e03658ad + checksum: 71e30015d7f3d6dc1c316d6298047c8ef98a06d31ad064919976583eb61e1018a60a0067338f0f79cabc00d84af3fcc489bd48ce8a46ea165d9541ba17fb30c6 languageName: node linkType: hard "json-stable-stringify-without-jsonify@npm:^1.0.1": version: 1.0.1 resolution: "json-stable-stringify-without-jsonify@npm:1.0.1" - checksum: cff44156ddce9c67c44386ad5cddf91925fe06b1d217f2da9c4910d01f358c6e3989c4d5a02683c7a5667f9727ff05831f7aa8ae66c8ff691c556f0884d49215 + checksum: cb168b61fd4de83e58d09aaa6425ef71001bae30d260e2c57e7d09a5fd82223e2f22a042dedaab8db23b7d9ae46854b08bb1f91675a8be11c5cffebef5fb66a5 languageName: node linkType: hard "json-stringify-safe@npm:^5.0.1": version: 5.0.1 resolution: "json-stringify-safe@npm:5.0.1" - checksum: 48ec0adad5280b8a96bb93f4563aa1667fd7a36334f79149abd42446d0989f2ddc58274b479f4819f1f00617957e6344c886c55d05a4e15ebb4ab931e4a6a8ee + checksum: 7dbf35cd0411d1d648dceb6d59ce5857ec939e52e4afc37601aa3da611f0987d5cee5b38d58329ceddf3ed48bd7215229c8d52059ab01f2444a338bf24ed0f37 languageName: node linkType: hard -"json5@npm:^1.0.1": +"json5@npm:^1.0.2": version: 1.0.2 resolution: "json5@npm:1.0.2" dependencies: - minimist: ^1.2.0 + minimist: "npm:^1.2.0" bin: json5: lib/cli.js - checksum: 866458a8c58a95a49bef3adba929c625e82532bcff1fe93f01d29cb02cac7c3fe1f4b79951b7792c2da9de0b32871a8401a6e3c5b36778ad852bf5b8a61165d7 + checksum: 9ee316bf21f000b00752e6c2a3b79ecf5324515a5c60ee88983a1910a45426b643a4f3461657586e8aeca87aaf96f0a519b0516d2ae527a6c3e7eed80f68717f languageName: node linkType: hard -"json5@npm:^2.1.3, json5@npm:^2.2.1": +"json5@npm:^2.1.3, json5@npm:^2.2.3": version: 2.2.3 resolution: "json5@npm:2.2.3" bin: json5: lib/cli.js - checksum: 2a7436a93393830bce797d4626275152e37e877b265e94ca69c99e3d20c2b9dab021279146a39cdb700e71b2dd32a4cebd1514cd57cee102b1af906ce5040349 + checksum: 5a04eed94810fa55c5ea138b2f7a5c12b97c3750bc63d11e511dcecbfef758003861522a070c2272764ee0f4e3e323862f386945aeb5b85b87ee43f084ba586c languageName: node linkType: hard "jsonc-parser@npm:^3.2.0": version: 3.2.0 resolution: "jsonc-parser@npm:3.2.0" - checksum: 946dd9a5f326b745aa326d48a7257e3f4a4b62c5e98ec8e49fa2bdd8d96cef7e6febf1399f5c7016114fd1f68a1c62c6138826d5d90bc650448e3cf0951c53c7 + checksum: 5a12d4d04dad381852476872a29dcee03a57439574e4181d91dca71904fcdcc5e8e4706c0a68a2c61ad9810e1e1c5806b5100d52d3e727b78f5cdc595401045b languageName: node linkType: hard @@ -5901,11 +6210,11 @@ __metadata: version: 4.0.0 resolution: "jsonfile@npm:4.0.0" dependencies: - graceful-fs: ^4.1.6 + graceful-fs: "npm:^4.1.6" dependenciesMeta: graceful-fs: optional: true - checksum: 6447d6224f0d31623eef9b51185af03ac328a7553efcee30fa423d98a9e276ca08db87d71e17f2310b0263fd3ffa6c2a90a6308367f661dc21580f9469897c9e + checksum: 7dc94b628d57a66b71fb1b79510d460d662eb975b5f876d723f81549c2e9cd316d58a2ddf742b2b93a4fa6b17b2accaf1a738a0e2ea114bdfb13a32e5377e480 languageName: node linkType: hard @@ -5913,33 +6222,42 @@ __metadata: version: 6.1.0 resolution: "jsonfile@npm:6.1.0" dependencies: - graceful-fs: ^4.1.6 - universalify: ^2.0.0 + graceful-fs: "npm:^4.1.6" + universalify: "npm:^2.0.0" dependenciesMeta: graceful-fs: optional: true - checksum: 7af3b8e1ac8fe7f1eccc6263c6ca14e1966fcbc74b618d3c78a0a2075579487547b94f72b7a1114e844a1e15bb00d440e5d1720bfc4612d790a6f285d5ea8354 + checksum: 4f95b5e8a5622b1e9e8f33c96b7ef3158122f595998114d1e7f03985649ea99cb3cd99ce1ed1831ae94c8c8543ab45ebd044207612f31a56fd08462140e46865 languageName: node linkType: hard "jsonparse@npm:^1.2.0": version: 1.3.1 resolution: "jsonparse@npm:1.3.1" - checksum: 6514a7be4674ebf407afca0eda3ba284b69b07f9958a8d3113ef1005f7ec610860c312be067e450c569aab8b89635e332cee3696789c750692bb60daba627f4d + checksum: 89bc68080cd0a0e276d4b5ab1b79cacd68f562467008d176dc23e16e97d4efec9e21741d92ba5087a8433526a45a7e6a9d5ef25408696c402ca1cfbc01a90bf0 languageName: node linkType: hard -"junk@npm:^4.0.0": - version: 4.0.0 - resolution: "junk@npm:4.0.0" - checksum: af79841fbdc0f3a8ec328a4bf68381013c7f52a78821184855a4b19ef95713edb3c30cd144c6393e6159e1b7dfb76b3f682dc983aafb54e52ff321ab1b4a9983 +"junk@npm:^4.0.1": + version: 4.0.1 + resolution: "junk@npm:4.0.1" + checksum: 091117a5dcf65b19a3e4b8506d95d6ab152b5b5fe6f10e8998de950b0f9d689f14d9b63bb07863b8c86c18511fd1b9a21e9a16e686246436558338ed2e8a4548 + languageName: node + linkType: hard + +"keyv@npm:^4.5.3, keyv@npm:^4.5.4": + version: 4.5.4 + resolution: "keyv@npm:4.5.4" + dependencies: + json-buffer: "npm:3.0.1" + checksum: aa52f3c5e18e16bb6324876bb8b59dd02acf782a4b789c7b2ae21107fab95fab3890ed448d4f8dba80ce05391eeac4bfabb4f02a20221342982f806fa2cf271e languageName: node linkType: hard "kind-of@npm:^6.0.3": version: 6.0.3 resolution: "kind-of@npm:6.0.3" - checksum: 3ab01e7b1d440b22fe4c31f23d8d38b4d9b91d9f291df683476576493d5dfd2e03848a8b05813dd0c3f0e835bc63f433007ddeceb71f05cb25c45ae1b19c6d3b + checksum: 61cdff9623dabf3568b6445e93e31376bee1cdb93f8ba7033d86022c2a9b1791a1d9510e026e6465ebd701a6dd2f7b0808483ad8838341ac52f003f512e0b4c4 languageName: node linkType: hard @@ -5947,26 +6265,16 @@ __metadata: version: 0.4.1 resolution: "levn@npm:0.4.1" dependencies: - prelude-ls: ^1.2.1 - type-check: ~0.4.0 - checksum: 12c5021c859bd0f5248561bf139121f0358285ec545ebf48bb3d346820d5c61a4309535c7f387ed7d84361cf821e124ce346c6b7cef8ee09a67c1473b46d0fc4 - languageName: node - linkType: hard - -"levn@npm:~0.3.0": - version: 0.3.0 - resolution: "levn@npm:0.3.0" - dependencies: - prelude-ls: ~1.1.2 - type-check: ~0.3.2 - checksum: 0d084a524231a8246bb10fec48cdbb35282099f6954838604f3c7fc66f2e16fa66fd9cc2f3f20a541a113c4dafdf181e822c887c8a319c9195444e6c64ac395e + prelude-ls: "npm:^1.2.1" + type-check: "npm:~0.4.0" + checksum: effb03cad7c89dfa5bd4f6989364bfc79994c2042ec5966cb9b95990e2edee5cd8969ddf42616a0373ac49fac1403437deaf6e9050fbbaa3546093a59b9ac94e languageName: node linkType: hard "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" - checksum: 0c37f9f7fa212b38912b7145e1cd16a5f3cd34d782441c3e6ca653485d326f58b3caccda66efce1c5812bde4961bbde3374fae4b0d11bf1226152337f3894aa5 + checksum: 3da6ee62d4cd9f03f5dc90b4df2540fb85b352081bee77fe4bbcd12c9000ead7f35e0a38b8d09a9bb99b13223446dd8689ff3c4959807620726d788701a83d2d languageName: node linkType: hard @@ -5974,25 +6282,18 @@ __metadata: version: 4.0.0 resolution: "load-json-file@npm:4.0.0" dependencies: - graceful-fs: ^4.1.2 - parse-json: ^4.0.0 - pify: ^3.0.0 - strip-bom: ^3.0.0 - checksum: 8f5d6d93ba64a9620445ee9bde4d98b1eac32cf6c8c2d20d44abfa41a6945e7969456ab5f1ca2fb06ee32e206c9769a20eec7002fe290de462e8c884b6b8b356 + graceful-fs: "npm:^4.1.2" + parse-json: "npm:^4.0.0" + pify: "npm:^3.0.0" + strip-bom: "npm:^3.0.0" + checksum: 6b48f6a0256bdfcc8970be2c57f68f10acb2ee7e63709b386b2febb6ad3c86198f840889cdbe71d28f741cbaa2f23a7771206b138cd1bdd159564511ca37c1d5 languageName: node linkType: hard -"load-json-file@npm:^7.0.0": +"load-json-file@npm:^7.0.1": version: 7.0.1 resolution: "load-json-file@npm:7.0.1" - checksum: a560288da6891778321ef993e4bdbdf05374a4f3a3aeedd5ba6b64672798c830d748cfc59a2ec9891a3db30e78b3d04172e0dcb0d4828168289a393147ca0e74 - languageName: node - linkType: hard - -"loady@npm:~0.0.5": - version: 0.0.5 - resolution: "loady@npm:0.0.5" - checksum: 3cba2ffa8cef8a082b3d23f22c1269a339e9f268105c30229bb3fed9123bb79830c0c7f3fa79f52286e1de9303b87e4eb3236952a6ee3fcffa83e7c576f7a8f5 + checksum: 7117459608a0b6329c7f78e6e1f541b3162dd901c29dd5af721fec8b270177d2e3d7999c971f344fff04daac368d052732e2c7146014bc84d15e0b636975e19a languageName: node linkType: hard @@ -6000,9 +6301,9 @@ __metadata: version: 2.0.0 resolution: "locate-path@npm:2.0.0" dependencies: - p-locate: ^2.0.0 - path-exists: ^3.0.0 - checksum: 02d581edbbbb0fa292e28d96b7de36b5b62c2fa8b5a7e82638ebb33afa74284acf022d3b1e9ae10e3ffb7658fbc49163fcd5e76e7d1baaa7801c3e05a81da755 + p-locate: "npm:^2.0.0" + path-exists: "npm:^3.0.0" + checksum: 24efa0e589be6aa3c469b502f795126b26ab97afa378846cb508174211515633b770aa0ba610cab113caedab8d2a4902b061a08aaed5297c12ab6f5be4df0133 languageName: node linkType: hard @@ -6010,9 +6311,9 @@ __metadata: version: 3.0.0 resolution: "locate-path@npm:3.0.0" dependencies: - p-locate: ^3.0.0 - path-exists: ^3.0.0 - checksum: 53db3996672f21f8b0bf2a2c645ae2c13ffdae1eeecfcd399a583bce8516c0b88dcb4222ca6efbbbeb6949df7e46860895be2c02e8d3219abd373ace3bfb4e11 + p-locate: "npm:^3.0.0" + path-exists: "npm:^3.0.0" + checksum: 3db394b7829a7fe2f4fbdd25d3c4689b85f003c318c5da4052c7e56eed697da8f1bce5294f685c69ff76e32cba7a33629d94396976f6d05fb7f4c755c5e2ae8b languageName: node linkType: hard @@ -6020,8 +6321,8 @@ __metadata: version: 5.0.0 resolution: "locate-path@npm:5.0.0" dependencies: - p-locate: ^4.1.0 - checksum: 83e51725e67517287d73e1ded92b28602e3ae5580b301fe54bfb76c0c723e3f285b19252e375712316774cf52006cb236aed5704692c32db0d5d089b69696e30 + p-locate: "npm:^4.1.0" + checksum: 33a1c5247e87e022f9713e6213a744557a3e9ec32c5d0b5efb10aa3a38177615bf90221a5592674857039c1a0fd2063b82f285702d37b792d973e9e72ace6c59 languageName: node linkType: hard @@ -6029,80 +6330,71 @@ __metadata: version: 6.0.0 resolution: "locate-path@npm:6.0.0" dependencies: - p-locate: ^5.0.0 - checksum: 72eb661788a0368c099a184c59d2fee760b3831c9c1c33955e8a19ae4a21b4116e53fa736dc086cdeb9fce9f7cc508f2f92d2d3aae516f133e16a2bb59a39f5a - languageName: node - linkType: hard - -"locate-path@npm:^7.1.0": - version: 7.1.1 - resolution: "locate-path@npm:7.1.1" - dependencies: - p-locate: ^6.0.0 - checksum: 1d88af5b512d6e6398026252e17382907126683ab09ae5d6b8918d0bc72ca2642e1ad6e2fe635c5920840e369618e5d748c08deb57ba537fdd3f78e87ca993e0 + p-locate: "npm:^5.0.0" + checksum: d3972ab70dfe58ce620e64265f90162d247e87159b6126b01314dd67be43d50e96a50b517bce2d9452a79409c7614054c277b5232377de50416564a77ac7aad3 languageName: node linkType: hard "lodash.get@npm:^4.4.2": version: 4.4.2 resolution: "lodash.get@npm:4.4.2" - checksum: e403047ddb03181c9d0e92df9556570e2b67e0f0a930fcbbbd779370972368f5568e914f913e93f3b08f6d492abc71e14d4e9b7a18916c31fa04bd2306efe545 + checksum: 48f40d471a1654397ed41685495acb31498d5ed696185ac8973daef424a749ca0c7871bf7b665d5c14f5cc479394479e0307e781f61d5573831769593411be6e languageName: node linkType: hard "lodash.isequal@npm:^4.5.0": version: 4.5.0 resolution: "lodash.isequal@npm:4.5.0" - checksum: da27515dc5230eb1140ba65ff8de3613649620e8656b19a6270afe4866b7bd461d9ba2ac8a48dcc57f7adac4ee80e1de9f965d89d4d81a0ad52bb3eec2609644 + checksum: dfdb2356db19631a4b445d5f37868a095e2402292d59539a987f134a8778c62a2810c2452d11ae9e6dcac71fc9de40a6fedcb20e2952a15b431ad8b29e50e28f languageName: node linkType: hard "lodash.ismatch@npm:^4.4.0": version: 4.4.0 resolution: "lodash.ismatch@npm:4.4.0" - checksum: a393917578842705c7fc1a30fb80613d1ac42d20b67eb26a2a6004d6d61ee90b419f9eb320508ddcd608e328d91eeaa2651411727eaa9a12534ed6ccb02fc705 + checksum: 8f96a5dc4b8d3fc5a033dcb259d0c3148a1044fa4d02b4a0e8dce0fa1f2ef3ec4ac131e20b5cb2c985a4e9bcb1c37c0aa5af2cef70094959389617347b8fc645 languageName: node linkType: hard "lodash.isplainobject@npm:^4.0.6": version: 4.0.6 resolution: "lodash.isplainobject@npm:4.0.6" - checksum: 29c6351f281e0d9a1d58f1a4c8f4400924b4c79f18dfc4613624d7d54784df07efaff97c1ff2659f3e085ecf4fff493300adc4837553104cef2634110b0d5337 + checksum: afd70b5c450d1e09f32a737bed06ff85b873ecd3d3d3400458725283e3f2e0bb6bf48e67dbe7a309eb371a822b16a26cca4a63c8c52db3fc7dc9d5f9dd324cbb languageName: node linkType: hard "lodash.map@npm:^4.5.1": version: 4.6.0 resolution: "lodash.map@npm:4.6.0" - checksum: 7369a41d7d24d15ce3bbd02a7faa3a90f6266c38184e64932571b9b21b758bd10c04ffd117d1859be1a44156f29b94df5045eff172bf8a97fddf68bf1002d12f + checksum: 919fe767fa58d3f8369ddd84346636eda71c88a8ef6bde1ca0d87dd37e71614da2ed8bcfc3018ca5b7741ebaf7c01c2d7078b510dca8ab6a0d0ecafd3dc1abcb languageName: node linkType: hard "lodash.merge@npm:^4.6.2": version: 4.6.2 resolution: "lodash.merge@npm:4.6.2" - checksum: ad580b4bdbb7ca1f7abf7e1bce63a9a0b98e370cf40194b03380a46b4ed799c9573029599caebc1b14e3f24b111aef72b96674a56cfa105e0f5ac70546cdc005 + checksum: 402fa16a1edd7538de5b5903a90228aa48eb5533986ba7fa26606a49db2572bf414ff73a2c9f5d5fd36b31c46a5d5c7e1527749c07cbcf965ccff5fbdf32c506 languageName: node linkType: hard "lodash.mergewith@npm:^4.6.2": version: 4.6.2 resolution: "lodash.mergewith@npm:4.6.2" - checksum: a6db2a9339752411f21b956908c404ec1e088e783a65c8b29e30ae5b3b6384f82517662d6f425cc97c2070b546cc2c7daaa8d33f78db7b6e9be06cd834abdeb8 + checksum: 4adbed65ff96fd65b0b3861f6899f98304f90fd71e7f1eb36c1270e05d500ee7f5ec44c02ef979b5ddbf75c0a0b9b99c35f0ad58f4011934c4d4e99e5200b3b5 languageName: node linkType: hard "lodash.uniq@npm:^4.5.0": version: 4.5.0 resolution: "lodash.uniq@npm:4.5.0" - checksum: a4779b57a8d0f3c441af13d9afe7ecff22dd1b8ce1129849f71d9bbc8e8ee4e46dfb4b7c28f7ad3d67481edd6e51126e4e2a6ee276e25906d10f7140187c392d + checksum: 262d400bb0952f112162a320cc4a75dea4f66078b9e7e3075ffbc9c6aa30b3e9df3cf20e7da7d566105e1ccf7804e4fbd7d804eee0b53de05d83f16ffbf41c5e languageName: node linkType: hard "lodash@npm:4.17.21, lodash@npm:^4.13.1, lodash@npm:^4.17.15, lodash@npm:^4.17.20, lodash@npm:^4.17.21, lodash@npm:^4.17.4, lodash@npm:~4.17.15": version: 4.17.21 resolution: "lodash@npm:4.17.21" - checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 + checksum: d8cbea072bb08655bb4c989da418994b073a608dffa608b09ac04b43a791b12aeae7cd7ad919aa4c925f33b48490b5cfe6c1f71d827956071dae2e7bb3a6b74c languageName: node linkType: hard @@ -6110,16 +6402,23 @@ __metadata: version: 4.1.0 resolution: "log-symbols@npm:4.1.0" dependencies: - chalk: ^4.1.0 - is-unicode-supported: ^0.1.0 - checksum: fce1497b3135a0198803f9f07464165e9eb83ed02ceb2273930a6f8a508951178d8cf4f0378e9d28300a2ed2bc49050995d2bd5f53ab716bb15ac84d58c6ef74 + chalk: "npm:^4.1.0" + is-unicode-supported: "npm:^0.1.0" + checksum: 67f445a9ffa76db1989d0fa98586e5bc2fd5247260dafb8ad93d9f0ccd5896d53fb830b0e54dade5ad838b9de2006c826831a3c528913093af20dff8bd24aca6 languageName: node linkType: hard "longest@npm:^2.0.1": version: 2.0.1 resolution: "longest@npm:2.0.1" - checksum: 9587c153919a883ecbcc33e9439bc2592aa6fdbbd2d343f8ab17d8d3e0373c4e4350e3b428566fd689d704800a23f2b4d145cbdcca4ef3fd35742e5927f919a9 + checksum: f381993a55acfbb76c7f75cfc14f45502b323e2a9881db6a834a3082f5587f8cd375f1334e562d8b7dcb1f91d10782af5f768c404774acc7ac42c0cefd9f25f8 + languageName: node + linkType: hard + +"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": + version: 10.1.0 + resolution: "lru-cache@npm:10.1.0" + checksum: 778bc8b2626daccd75f24c4b4d10632496e21ba064b126f526c626fbdbc5b28c472013fccd45d7646b9e1ef052444824854aed617b59cd570d01a8b7d651fc1e languageName: node linkType: hard @@ -6127,135 +6426,121 @@ __metadata: version: 6.0.0 resolution: "lru-cache@npm:6.0.0" dependencies: - yallist: ^4.0.0 - checksum: f97f499f898f23e4585742138a22f22526254fdba6d75d41a1c2526b3b6cc5747ef59c5612ba7375f42aca4f8461950e925ba08c991ead0651b4918b7c978297 - languageName: node - linkType: hard - -"lru-cache@npm:^7.7.1": - version: 7.14.1 - resolution: "lru-cache@npm:7.14.1" - checksum: d72c6713c6a6d86836a7a6523b3f1ac6764768cca47ec99341c3e76db06aacd4764620e5e2cda719a36848785a52a70e531822dc2b33fb071fa709683746c104 + yallist: "npm:^4.0.0" + checksum: cb53e582785c48187d7a188d3379c181b5ca2a9c78d2bce3e7dee36f32761d1c42983da3fe12b55cb74e1779fa94cdc2e5367c028a9b35317184ede0c07a30a9 languageName: node linkType: hard "lunr@npm:^2.3.9": version: 2.3.9 resolution: "lunr@npm:2.3.9" - checksum: 176719e24fcce7d3cf1baccce9dd5633cd8bdc1f41ebe6a180112e5ee99d80373fe2454f5d4624d437e5a8319698ca6837b9950566e15d2cae5f2a543a3db4b8 + checksum: 77d7dbb4fbd602aac161e2b50887d8eda28c0fa3b799159cee380fbb311f1e614219126ecbbd2c3a9c685f1720a8109b3c1ca85cc893c39b6c9cc6a62a1d8a8b languageName: node linkType: hard -"madge@npm:^5.0.1": - version: 5.0.1 - resolution: "madge@npm:5.0.1" - dependencies: - chalk: ^4.1.1 - commander: ^7.2.0 - commondir: ^1.0.1 - debug: ^4.3.1 - dependency-tree: ^8.1.1 - detective-amd: ^3.1.0 - detective-cjs: ^3.1.1 - detective-es6: ^2.2.0 - detective-less: ^1.0.2 - detective-postcss: ^5.0.0 - detective-sass: ^3.0.1 - detective-scss: ^2.0.1 - detective-stylus: ^1.0.0 - detective-typescript: ^7.0.0 - graphviz: 0.0.9 - ora: ^5.4.1 - pluralize: ^8.0.0 - precinct: ^8.1.0 - pretty-ms: ^7.0.1 - rc: ^1.2.7 - typescript: ^3.9.5 - walkdir: ^0.4.1 +"madge@npm:^6.1.0": + version: 6.1.0 + resolution: "madge@npm:6.1.0" + dependencies: + chalk: "npm:^4.1.1" + commander: "npm:^7.2.0" + commondir: "npm:^1.0.1" + debug: "npm:^4.3.1" + dependency-tree: "npm:^9.0.0" + detective-amd: "npm:^4.0.1" + detective-cjs: "npm:^4.0.0" + detective-es6: "npm:^3.0.0" + detective-less: "npm:^1.0.2" + detective-postcss: "npm:^6.1.0" + detective-sass: "npm:^4.0.1" + detective-scss: "npm:^3.0.0" + detective-stylus: "npm:^2.0.1" + detective-typescript: "npm:^9.0.0" + ora: "npm:^5.4.1" + pluralize: "npm:^8.0.0" + precinct: "npm:^8.1.0" + pretty-ms: "npm:^7.0.1" + rc: "npm:^1.2.7" + stream-to-array: "npm:^2.3.0" + ts-graphviz: "npm:^1.5.0" + walkdir: "npm:^0.4.1" + peerDependencies: + typescript: ^3.9.5 || ^4.9.5 || ^5 + peerDependenciesMeta: + typescript: + optional: true bin: madge: bin/cli.js - checksum: 821db88fdcb6259cf4bf1665abb976dd859fb7157a712886468d4172ab6d758f3446212fcd3fa92be21e9e2b408854f96e9495b7119d7387e6fe5690bd9786c4 + checksum: 2761d27af4a0ebef8118ae18b1e4c7347774503245827954eae0bcb071fa57fd30eeb5ff2c24b2d295e4553e3d75619f0307667757760542c0fd2c93c01c95c9 languageName: node linkType: hard -"magic-string@npm:^0.25.7": - version: 0.25.9 - resolution: "magic-string@npm:0.25.9" +"magic-string@npm:^0.30.3": + version: 0.30.5 + resolution: "magic-string@npm:0.30.5" dependencies: - sourcemap-codec: ^1.4.8 - checksum: 9a0e55a15c7303fc360f9572a71cffba1f61451bc92c5602b1206c9d17f492403bf96f946dfce7483e66822d6b74607262e24392e87b0ac27b786e69a40e9b1a + "@jridgewell/sourcemap-codec": "npm:^1.4.15" + checksum: 38ac220ca7539e96da7ea2f38d85796bdf5c69b6bcae728c4bc2565084e6dc326b9174ee9770bea345cf6c9b3a24041b767167874fab5beca874d2356a9d1520 languageName: node linkType: hard -"make-dir@npm:^3.0.0": +"make-dir@npm:^3.1.0": version: 3.1.0 resolution: "make-dir@npm:3.1.0" dependencies: - semver: ^6.0.0 - checksum: 484200020ab5a1fdf12f393fe5f385fc8e4378824c940fba1729dcd198ae4ff24867bc7a5646331e50cead8abff5d9270c456314386e629acec6dff4b8016b78 - languageName: node - linkType: hard - -"make-error@npm:^1.1.1": - version: 1.3.6 - resolution: "make-error@npm:1.3.6" - checksum: b86e5e0e25f7f777b77fabd8e2cbf15737972869d852a22b7e73c17623928fccb826d8e46b9951501d3f20e51ad74ba8c59ed584f610526a48f8ccf88aaec402 + semver: "npm:^6.0.0" + checksum: 56aaafefc49c2dfef02c5c95f9b196c4eb6988040cf2c712185c7fe5c99b4091591a7fc4d4eafaaefa70ff763a26f6ab8c3ff60b9e75ea19876f49b18667ecaa languageName: node linkType: hard -"make-fetch-happen@npm:^10.0.3": - version: 10.2.1 - resolution: "make-fetch-happen@npm:10.2.1" +"make-dir@npm:^4.0.0": + version: 4.0.0 + resolution: "make-dir@npm:4.0.0" dependencies: - agentkeepalive: ^4.2.1 - cacache: ^16.1.0 - http-cache-semantics: ^4.1.0 - http-proxy-agent: ^5.0.0 - https-proxy-agent: ^5.0.0 - is-lambda: ^1.0.1 - lru-cache: ^7.7.1 - minipass: ^3.1.6 - minipass-collect: ^1.0.2 - minipass-fetch: ^2.0.3 - minipass-flush: ^1.0.5 - minipass-pipeline: ^1.2.4 - negotiator: ^0.6.3 - promise-retry: ^2.0.1 - socks-proxy-agent: ^7.0.0 - ssri: ^9.0.0 - checksum: 2332eb9a8ec96f1ffeeea56ccefabcb4193693597b132cd110734d50f2928842e22b84cfa1508e921b8385cdfd06dda9ad68645fed62b50fff629a580f5fb72c + semver: "npm:^7.5.3" + checksum: 69b98a6c0b8e5c4fe9acb61608a9fbcfca1756d910f51e5dbe7a9e5cfb74fca9b8a0c8a0ffdf1294a740826c1ab4871d5bf3f62f72a3049e5eac6541ddffed68 languageName: node linkType: hard -"map-age-cleaner@npm:^0.1.3": - version: 0.1.3 - resolution: "map-age-cleaner@npm:0.1.3" +"make-fetch-happen@npm:^13.0.0": + version: 13.0.0 + resolution: "make-fetch-happen@npm:13.0.0" dependencies: - p-defer: ^1.0.0 - checksum: cb2804a5bcb3cbdfe4b59066ea6d19f5e7c8c196cd55795ea4c28f792b192e4c442426ae52524e5e1acbccf393d3bddacefc3d41f803e66453f6c4eda3650bc1 + "@npmcli/agent": "npm:^2.0.0" + cacache: "npm:^18.0.0" + http-cache-semantics: "npm:^4.1.1" + is-lambda: "npm:^1.0.1" + minipass: "npm:^7.0.2" + minipass-fetch: "npm:^3.0.0" + minipass-flush: "npm:^1.0.5" + minipass-pipeline: "npm:^1.2.4" + negotiator: "npm:^0.6.3" + promise-retry: "npm:^2.0.1" + ssri: "npm:^10.0.0" + checksum: 43b9f6dcbc6fe8b8604cb6396957c3698857a15ba4dbc38284f7f0e61f248300585ef1eb8cc62df54e9c724af977e45b5cdfd88320ef7f53e45070ed3488da55 languageName: node linkType: hard "map-obj@npm:^1.0.0": version: 1.0.1 resolution: "map-obj@npm:1.0.1" - checksum: 9949e7baec2a336e63b8d4dc71018c117c3ce6e39d2451ccbfd3b8350c547c4f6af331a4cbe1c83193d7c6b786082b6256bde843db90cb7da2a21e8fcc28afed + checksum: ccca88395e7d38671ed9f5652ecf471ecd546924be2fb900836b9da35e068a96687d96a5f93dcdfa94d9a27d649d2f10a84595590f89a347fb4dda47629dcc52 languageName: node linkType: hard -"map-obj@npm:^4.0.0, map-obj@npm:^4.1.0": +"map-obj@npm:^4.0.0": version: 4.3.0 resolution: "map-obj@npm:4.3.0" - checksum: fbc554934d1a27a1910e842bc87b177b1a556609dd803747c85ece420692380827c6ae94a95cce4407c054fa0964be3bf8226f7f2cb2e9eeee432c7c1985684e + checksum: 1c19e1c88513c8abdab25c316367154c6a0a6a0f77e3e8c391bb7c0e093aefed293f539d026dc013d86219e5e4c25f23b0003ea588be2101ccd757bacc12d43b languageName: node linkType: hard -"marked@npm:^4.2.5": - version: 4.2.5 - resolution: "marked@npm:4.2.5" +"marked@npm:^4.3.0": + version: 4.3.0 + resolution: "marked@npm:4.3.0" bin: marked: bin/marked.js - checksum: dd7da20a3983c66b516463fad5dc8d15dc70e137d20b6dc491e134f671e84bd2ed5f859e2c35f21e56830a122e4356b9e574bcde49b72b7ad6bc121a215a1a98 + checksum: 0013463855e31b9c88d8bb2891a611d10ef1dc79f2e3cbff1bf71ba389e04c5971298c886af0be799d7fa9aa4593b086a136062d59f1210b0480b026a8c5dc47 languageName: node linkType: hard @@ -6263,8 +6548,8 @@ __metadata: version: 5.0.0 resolution: "matcher@npm:5.0.0" dependencies: - escape-string-regexp: ^5.0.0 - checksum: 28f191c2d23fee0f6f32fd0181d9fe173b0ab815a919edba55605438a2f9fa40372e002574a1b17add981b0a8669c75bc6194318d065ed2dceffd8b160c38118 + escape-string-regexp: "npm:^5.0.0" + checksum: eda5471fc9d5b7264d63c81727824adc3585ddb5cfdc5fce5a9b7c86f946ff181610735d330b1c37a84811df872d1290bf4e9401d2be2a414204343701144b18 languageName: node linkType: hard @@ -6272,45 +6557,31 @@ __metadata: version: 3.0.1 resolution: "md5-hex@npm:3.0.1" dependencies: - blueimp-md5: ^2.10.0 - checksum: 6799a19e8bdd3e0c2861b94c1d4d858a89220488d7885c1fa236797e367d0c2e5f2b789e05309307083503f85be3603a9686a5915568a473137d6b4117419cc2 + blueimp-md5: "npm:^2.10.0" + checksum: ee2b4d8da16b527b3a3fe4d7a96720f43afd07b46a82d49421208b5a126235fb75cfb30b80d4029514772c8844273f940bddfbf4155c787f968f3be4060d01e4 languageName: node linkType: hard "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" - checksum: af1b38516c28ec95d6b0826f6c8f276c58aec391f76be42aa07646b4e39d317723e869700933ca6995b056db4b09a78c92d5440dc23657e6764be5d28874bba1 + checksum: d160f31246907e79fed398470285f21bafb45a62869dc469b1c8877f3f064f5eabc4bcc122f9479b8b605bc5c76187d7871cf84c4ee3ecd3e487da1993279928 languageName: node linkType: hard -"mem@npm:^9.0.2": - version: 9.0.2 - resolution: "mem@npm:9.0.2" +"memoize@npm:^10.0.0": + version: 10.0.0 + resolution: "memoize@npm:10.0.0" dependencies: - map-age-cleaner: ^0.1.3 - mimic-fn: ^4.0.0 - checksum: 07829bb182af0e3ecf748dc2edb1c3b10a256ef10458f7e24d06561a2adc2b3ef34d14abe81678bbcedb46faa477e7370223f118b1a5e1252da5fe43496f3967 + mimic-function: "npm:^5.0.0" + checksum: 1584351834564be66b21d47b7afe495851f622669ad49e2f4fa4f35d5633471b93176cf602130a95f71fa0aee65a20179817ffac2dd11fa354aa19a8109a14e8 languageName: node linkType: hard -"meow@npm:^10.1.2, meow@npm:^10.1.5": - version: 10.1.5 - resolution: "meow@npm:10.1.5" - dependencies: - "@types/minimist": ^1.2.2 - camelcase-keys: ^7.0.0 - decamelize: ^5.0.0 - decamelize-keys: ^1.1.0 - hard-rejection: ^2.1.0 - minimist-options: 4.1.0 - normalize-package-data: ^3.0.2 - read-pkg-up: ^8.0.0 - redent: ^4.0.0 - trim-newlines: ^4.0.2 - type-fest: ^1.2.2 - yargs-parser: ^20.2.9 - checksum: dd5f0caa4af18517813547dc66741dcbf52c4c23def5062578d39b11189fd9457aee5c1f2263a5cd6592a465023df8357e8ac876b685b64dbcf545e3f66c23a7 +"meow@npm:^12.0.1, meow@npm:^12.1.1": + version: 12.1.1 + resolution: "meow@npm:12.1.1" + checksum: a125ca99a32e2306e2f4cbe651a0d27f6eb67918d43a075f6e80b35e9bf372ebf0fc3a9fbc201cbbc9516444b6265fb3c9f80c5b7ebd32f548aa93eb7c28e088 languageName: node linkType: hard @@ -6318,53 +6589,53 @@ __metadata: version: 8.1.2 resolution: "meow@npm:8.1.2" dependencies: - "@types/minimist": ^1.2.0 - camelcase-keys: ^6.2.2 - decamelize-keys: ^1.1.0 - hard-rejection: ^2.1.0 - minimist-options: 4.1.0 - normalize-package-data: ^3.0.0 - read-pkg-up: ^7.0.1 - redent: ^3.0.0 - trim-newlines: ^3.0.0 - type-fest: ^0.18.0 - yargs-parser: ^20.2.3 - checksum: bc23bf1b4423ef6a821dff9734406bce4b91ea257e7f10a8b7f896f45b59649f07adc0926e2917eacd8cf1df9e4cd89c77623cf63dfd0f8bf54de07a32ee5a85 + "@types/minimist": "npm:^1.2.0" + camelcase-keys: "npm:^6.2.2" + decamelize-keys: "npm:^1.1.0" + hard-rejection: "npm:^2.1.0" + minimist-options: "npm:4.1.0" + normalize-package-data: "npm:^3.0.0" + read-pkg-up: "npm:^7.0.1" + redent: "npm:^3.0.0" + trim-newlines: "npm:^3.0.0" + type-fest: "npm:^0.18.0" + yargs-parser: "npm:^20.2.3" + checksum: 9a8d90e616f783650728a90f4ea1e5f763c1c5260369e6596b52430f877f4af8ecbaa8c9d952c93bbefd6d5bda4caed6a96a20ba7d27b511d2971909b01922a2 languageName: node linkType: hard "merge-descriptors@npm:1.0.1": version: 1.0.1 resolution: "merge-descriptors@npm:1.0.1" - checksum: 5abc259d2ae25bb06d19ce2b94a21632583c74e2a9109ee1ba7fd147aa7362b380d971e0251069f8b3eb7d48c21ac839e21fa177b335e82c76ec172e30c31a26 + checksum: b67d07bd44cfc45cebdec349bb6e1f7b077ee2fd5beb15d1f7af073849208cb6f144fe403e29a36571baf3f4e86469ac39acf13c318381e958e186b2766f54ec languageName: node linkType: hard "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" - checksum: 6fa4dcc8d86629705cea944a4b88ef4cb0e07656ebf223fa287443256414283dd25d91c1cd84c77987f2aec5927af1a9db6085757cb43d90eb170ebf4b47f4f4 + checksum: 867fdbb30a6d58b011449b8885601ec1690c3e41c759ecd5a9d609094f7aed0096c37823ff4a7190ef0b8f22cc86beb7049196ff68c016e3b3c671d0dac91ce5 languageName: node linkType: hard "merge2@npm:^1.3.0, merge2@npm:^1.4.1": version: 1.4.1 resolution: "merge2@npm:1.4.1" - checksum: 7268db63ed5169466540b6fb947aec313200bcf6d40c5ab722c22e242f651994619bcd85601602972d3c85bd2cc45a358a4c61937e9f11a061919a1da569b0c2 + checksum: 254a8a4605b58f450308fc474c82ac9a094848081bf4c06778200207820e5193726dc563a0d2c16468810516a5c97d9d3ea0ca6585d23c58ccfff2403e8dbbeb languageName: node linkType: hard "merge@npm:^2.1.1": version: 2.1.1 resolution: "merge@npm:2.1.1" - checksum: 9c36b0e25aa53b3f7305d7cf0f330397f1142cf311802b681e5619f12e986a790019b8246c1c0df21701c8652449f9046b0129551030097ef563d1958c823249 + checksum: 9e722a88f661fb4d32bfbab37dcc10c2057d3e3ec7bda5325a13cbfb82a59916963ec99374cca7f5bd3ff8c65a6ffbd9e1061bc0c45c6e3bf211c78af659cb44 languageName: node linkType: hard "methods@npm:~1.1.2": version: 1.1.2 resolution: "methods@npm:1.1.2" - checksum: 0917ff4041fa8e2f2fda5425a955fe16ca411591fbd123c0d722fcf02b73971ed6f764d85f0a6f547ce49ee0221ce2c19a5fa692157931cecb422984f1dcd13a + checksum: bdf7cc72ff0a33e3eede03708c08983c4d7a173f91348b4b1e4f47d4cdbf734433ad971e7d1e8c77247d9e5cd8adb81ea4c67b0a2db526b758b2233d7814b8b2 languageName: node linkType: hard @@ -6372,16 +6643,16 @@ __metadata: version: 4.0.5 resolution: "micromatch@npm:4.0.5" dependencies: - braces: ^3.0.2 - picomatch: ^2.3.1 - checksum: 02a17b671c06e8fefeeb6ef996119c1e597c942e632a21ef589154f23898c9c6a9858526246abb14f8bca6e77734aa9dcf65476fca47cedfb80d9577d52843fc + braces: "npm:^3.0.2" + picomatch: "npm:^2.3.1" + checksum: 3d6505b20f9fa804af5d8c596cb1c5e475b9b0cd05f652c5b56141cf941bd72adaeb7a436fda344235cef93a7f29b7472efc779fcdb83b478eab0867b95cdeff languageName: node linkType: hard "mime-db@npm:1.52.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" - checksum: 0d99a03585f8b39d68182803b12ac601d9c01abfa28ec56204fa330bc9f3d1c5e14beb049bafadb3dbdf646dfb94b87e24d4ec7b31b7279ef906a8ea9b6a513f + checksum: 0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa languageName: node linkType: hard @@ -6389,8 +6660,8 @@ __metadata: version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: - mime-db: 1.52.0 - checksum: 89a5b7f1def9f3af5dad6496c5ed50191ae4331cc5389d7c521c8ad28d5fdad2d06fd81baf38fed813dc4e46bb55c8145bb0ff406330818c9cf712fb2e9b3836 + mime-db: "npm:1.52.0" + checksum: 82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 languageName: node linkType: hard @@ -6399,42 +6670,58 @@ __metadata: resolution: "mime@npm:1.6.0" bin: mime: cli.js - checksum: fef25e39263e6d207580bdc629f8872a3f9772c923c7f8c7e793175cee22777bbe8bba95e5d509a40aaa292d8974514ce634ae35769faa45f22d17edda5e8557 + checksum: b92cd0adc44888c7135a185bfd0dddc42c32606401c72896a842ae15da71eb88858f17669af41e498b463cd7eb998f7b48939a25b08374c7924a9c8a6f8a81b0 languageName: node linkType: hard "mimic-fn@npm:^2.1.0": version: 2.1.0 resolution: "mimic-fn@npm:2.1.0" - checksum: d2421a3444848ce7f84bd49115ddacff29c15745db73f54041edc906c14b131a38d05298dae3081667627a59b2eb1ca4b436ff2e1b80f69679522410418b478a + checksum: b26f5479d7ec6cc2bce275a08f146cf78f5e7b661b18114e2506dd91ec7ec47e7a25bf4360e5438094db0560bcc868079fb3b1fb3892b833c1ecbf63f80c95a4 languageName: node linkType: hard "mimic-fn@npm:^4.0.0": version: 4.0.0 resolution: "mimic-fn@npm:4.0.0" - checksum: 995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 + checksum: de9cc32be9996fd941e512248338e43407f63f6d497abe8441fa33447d922e927de54d4cc3c1a3c6d652857acd770389d5a3823f311a744132760ce2be15ccbf + languageName: node + linkType: hard + +"mimic-function@npm:^5.0.0": + version: 5.0.0 + resolution: "mimic-function@npm:5.0.0" + checksum: d822af182e4f71e8659efdbc2a40f63425413b96c3ebad1b5c082bbc2a39171203b9db8e31fb00e30e6b413eb4f42defef3bf379c5d4f24b147659e9b6ec1200 languageName: node linkType: hard -"min-indent@npm:^1.0.0, min-indent@npm:^1.0.1": +"min-indent@npm:^1.0.0": version: 1.0.1 resolution: "min-indent@npm:1.0.1" - checksum: bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 + checksum: 7e207bd5c20401b292de291f02913230cb1163abca162044f7db1d951fa245b174dc00869d40dd9a9f32a885ad6a5f3e767ee104cf278f399cb4e92d3f582d5c languageName: node linkType: hard "minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": version: 1.0.1 resolution: "minimalistic-assert@npm:1.0.1" - checksum: cc7974a9268fbf130fb055aff76700d7e2d8be5f761fb5c60318d0ed010d839ab3661a533ad29a5d37653133385204c503bfac995aaa4236f4e847461ea32ba7 + checksum: 96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd languageName: node linkType: hard "minimalistic-crypto-utils@npm:^1.0.1": version: 1.0.1 resolution: "minimalistic-crypto-utils@npm:1.0.1" - checksum: 6e8a0422b30039406efd4c440829ea8f988845db02a3299f372fceba56ffa94994a9c0f2fd70c17f9969eedfbd72f34b5070ead9656a34d3f71c0bd72583a0ed + checksum: 790ecec8c5c73973a4fbf2c663d911033e8494d5fb0960a4500634766ab05d6107d20af896ca2132e7031741f19888154d44b2408ada0852446705441383e9f8 + languageName: node + linkType: hard + +"minimatch@npm:9.0.3, minimatch@npm:^9.0.1, minimatch@npm:^9.0.3": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 85f407dcd38ac3e180f425e86553911d101455ca3ad5544d6a7cec16286657e4f8a9aa6695803025c55e31e35a91a2252b5dc8e7d527211278b8b65b4dbd5eac languageName: node linkType: hard @@ -6442,17 +6729,17 @@ __metadata: version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: - brace-expansion: ^1.1.7 - checksum: c154e566406683e7bcb746e000b84d74465b3a832c45d59912b9b55cd50dee66e5c4b1e5566dba26154040e51672f9aa450a9aef0c97cfc7336b78b7afb9540a + brace-expansion: "npm:^1.1.7" + checksum: 0262810a8fc2e72cca45d6fd86bd349eee435eb95ac6aa45c9ea2180e7ee875ef44c32b55b5973ceabe95ea12682f6e3725cbb63d7a2d1da3ae1163c8b210311 languageName: node linkType: hard -"minimatch@npm:^5.0.1, minimatch@npm:^5.1.2": - version: 5.1.2 - resolution: "minimatch@npm:5.1.2" +"minimatch@npm:^5.0.1": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" dependencies: - brace-expansion: ^2.0.1 - checksum: 32ffda25b9fb8270a1c1beafdb7489dc0e411af553495136509a945691f63c9b6b000eeeaaf8bffe3efa609c1d6d3bc0f5a106f6c3443b5c05da649100ded964 + brace-expansion: "npm:^2.0.1" + checksum: 3defdfd230914f22a8da203747c42ee3c405c39d4d37ffda284dac5e45b7e1f6c49aa8be606509002898e73091ff2a3bbfc59c2c6c71d4660609f63aa92f98e3 languageName: node linkType: hard @@ -6460,48 +6747,48 @@ __metadata: version: 4.1.0 resolution: "minimist-options@npm:4.1.0" dependencies: - arrify: ^1.0.1 - is-plain-obj: ^1.1.0 - kind-of: ^6.0.3 - checksum: 8c040b3068811e79de1140ca2b708d3e203c8003eb9a414c1ab3cd467fc5f17c9ca02a5aef23bedc51a7f8bfbe77f87e9a7e31ec81fba304cda675b019496f4e + arrify: "npm:^1.0.1" + is-plain-obj: "npm:^1.1.0" + kind-of: "npm:^6.0.3" + checksum: 7871f9cdd15d1e7374e5b013e2ceda3d327a06a8c7b38ae16d9ef941e07d985e952c589e57213f7aa90a8744c60aed9524c0d85e501f5478382d9181f2763f54 languageName: node linkType: hard -"minimist@npm:1.2.6": - version: 1.2.6 - resolution: "minimist@npm:1.2.6" - checksum: d15428cd1e11eb14e1233bcfb88ae07ed7a147de251441d61158619dfb32c4d7e9061d09cab4825fdee18ecd6fce323228c8c47b5ba7cd20af378ca4048fb3fb +"minimist@npm:1.2.7": + version: 1.2.7 + resolution: "minimist@npm:1.2.7" + checksum: 8808da67ca50ee19ab2d69051d77ee78572e67297fd8a1635ecc757a15106ccdfb5b8c4d11d84750120142f1684e5329a141295728c755e5d149eedd73cc6572 languageName: node linkType: hard "minimist@npm:^1.2.0, minimist@npm:^1.2.5, minimist@npm:^1.2.6": - version: 1.2.7 - resolution: "minimist@npm:1.2.7" - checksum: 7346574a1038ca23c32e02252f603801f09384dd1d78b69a943a4e8c2c28730b80e96193882d3d3b22a063445f460e48316b29b8a25addca2d7e5e8f75478bec + version: 1.2.8 + resolution: "minimist@npm:1.2.8" + checksum: 19d3fcdca050087b84c2029841a093691a91259a47def2f18222f41e7645a0b7c44ef4b40e88a1e58a40c84d2ef0ee6047c55594d298146d0eb3f6b737c20ce6 languageName: node linkType: hard -"minipass-collect@npm:^1.0.2": - version: 1.0.2 - resolution: "minipass-collect@npm:1.0.2" +"minipass-collect@npm:^2.0.1": + version: 2.0.1 + resolution: "minipass-collect@npm:2.0.1" dependencies: - minipass: ^3.0.0 - checksum: 14df761028f3e47293aee72888f2657695ec66bd7d09cae7ad558da30415fdc4752bbfee66287dcc6fd5e6a2fa3466d6c484dc1cbd986525d9393b9523d97f10 + minipass: "npm:^7.0.3" + checksum: 5167e73f62bb74cc5019594709c77e6a742051a647fe9499abf03c71dca75515b7959d67a764bdc4f8b361cf897fbf25e2d9869ee039203ed45240f48b9aa06e languageName: node linkType: hard -"minipass-fetch@npm:^2.0.3": - version: 2.1.2 - resolution: "minipass-fetch@npm:2.1.2" +"minipass-fetch@npm:^3.0.0": + version: 3.0.4 + resolution: "minipass-fetch@npm:3.0.4" dependencies: - encoding: ^0.1.13 - minipass: ^3.1.6 - minipass-sized: ^1.0.3 - minizlib: ^2.1.2 + encoding: "npm:^0.1.13" + minipass: "npm:^7.0.3" + minipass-sized: "npm:^1.0.3" + minizlib: "npm:^2.1.2" dependenciesMeta: encoding: optional: true - checksum: 3f216be79164e915fc91210cea1850e488793c740534985da017a4cbc7a5ff50506956d0f73bb0cb60e4fe91be08b6b61ef35101706d3ef5da2c8709b5f08f91 + checksum: 1b63c1f3313e88eeac4689f1b71c9f086598db9a189400e3ee960c32ed89e06737fa23976c9305c2d57464fb3fcdc12749d3378805c9d6176f5569b0d0ee8a75 languageName: node linkType: hard @@ -6509,8 +6796,8 @@ __metadata: version: 1.0.5 resolution: "minipass-flush@npm:1.0.5" dependencies: - minipass: ^3.0.0 - checksum: 56269a0b22bad756a08a94b1ffc36b7c9c5de0735a4dd1ab2b06c066d795cfd1f0ac44a0fcae13eece5589b908ecddc867f04c745c7009be0b566421ea0944cf + minipass: "npm:^3.0.0" + checksum: 2a51b63feb799d2bb34669205eee7c0eaf9dce01883261a5b77410c9408aa447e478efd191b4de6fc1101e796ff5892f8443ef20d9544385819093dbb32d36bd languageName: node linkType: hard @@ -6518,8 +6805,8 @@ __metadata: version: 1.2.4 resolution: "minipass-pipeline@npm:1.2.4" dependencies: - minipass: ^3.0.0 - checksum: b14240dac0d29823c3d5911c286069e36d0b81173d7bdf07a7e4a91ecdef92cdff4baaf31ea3746f1c61e0957f652e641223970870e2353593f382112257971b + minipass: "npm:^3.0.0" + checksum: cbda57cea20b140b797505dc2cac71581a70b3247b84480c1fed5ca5ba46c25ecc25f68bfc9e6dcb1a6e9017dab5c7ada5eab73ad4f0a49d84e35093e0c643f2 languageName: node linkType: hard @@ -6527,26 +6814,31 @@ __metadata: version: 1.0.3 resolution: "minipass-sized@npm:1.0.3" dependencies: - minipass: ^3.0.0 - checksum: 79076749fcacf21b5d16dd596d32c3b6bf4d6e62abb43868fac21674078505c8b15eaca4e47ed844985a4514854f917d78f588fcd029693709417d8f98b2bd60 + minipass: "npm:^3.0.0" + checksum: 298f124753efdc745cfe0f2bdfdd81ba25b9f4e753ca4a2066eb17c821f25d48acea607dfc997633ee5bf7b6dfffb4eee4f2051eb168663f0b99fad2fa4829cb languageName: node linkType: hard -"minipass@npm:^3.0.0, minipass@npm:^3.1.1, minipass@npm:^3.1.6": +"minipass@npm:^3.0.0": version: 3.3.6 resolution: "minipass@npm:3.3.6" dependencies: - yallist: ^4.0.0 - checksum: a30d083c8054cee83cdcdc97f97e4641a3f58ae743970457b1489ce38ee1167b3aaf7d815cd39ec7a99b9c40397fd4f686e83750e73e652b21cb516f6d845e48 + yallist: "npm:^4.0.0" + checksum: a114746943afa1dbbca8249e706d1d38b85ed1298b530f5808ce51f8e9e941962e2a5ad2e00eae7dd21d8a4aae6586a66d4216d1a259385e9d0358f0c1eba16c languageName: node linkType: hard -"minipass@npm:^4.0.0": - version: 4.0.0 - resolution: "minipass@npm:4.0.0" - dependencies: - yallist: ^4.0.0 - checksum: 7a609afbf394abfcf9c48e6c90226f471676c8f2a67f07f6838871afb03215ede431d1433feffe1b855455bcb13ef0eb89162841b9796109d6fed8d89790f381 +"minipass@npm:^5.0.0": + version: 5.0.0 + resolution: "minipass@npm:5.0.0" + checksum: a91d8043f691796a8ac88df039da19933ef0f633e3d7f0d35dcd5373af49131cf2399bfc355f41515dc495e3990369c3858cd319e5c2722b4753c90bf3152462 + languageName: node + linkType: hard + +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": + version: 7.0.4 + resolution: "minipass@npm:7.0.4" + checksum: 6c7370a6dfd257bf18222da581ba89a5eaedca10e158781232a8b5542a90547540b4b9b7e7f490e4cda43acfbd12e086f0453728ecf8c19e0ef6921bc5958ac5 languageName: node linkType: hard @@ -6554,32 +6846,25 @@ __metadata: version: 2.1.2 resolution: "minizlib@npm:2.1.2" dependencies: - minipass: ^3.0.0 - yallist: ^4.0.0 - checksum: f1fdeac0b07cf8f30fcf12f4b586795b97be856edea22b5e9072707be51fc95d41487faec3f265b42973a304fe3a64acd91a44a3826a963e37b37bafde0212c3 - languageName: node - linkType: hard - -"mkdirp-classic@npm:^0.5.2": - version: 0.5.3 - resolution: "mkdirp-classic@npm:0.5.3" - checksum: 3f4e088208270bbcc148d53b73e9a5bd9eef05ad2cbf3b3d0ff8795278d50dd1d11a8ef1875ff5aea3fa888931f95bfcb2ad5b7c1061cfefd6284d199e6776ac + minipass: "npm:^3.0.0" + yallist: "npm:^4.0.0" + checksum: 64fae024e1a7d0346a1102bb670085b17b7f95bf6cfdf5b128772ec8faf9ea211464ea4add406a3a6384a7d87a0cd1a96263692134323477b4fb43659a6cab78 languageName: node linkType: hard -"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": +"mkdirp@npm:^1.0.3": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" bin: mkdirp: bin/cmd.js - checksum: a96865108c6c3b1b8e1d5e9f11843de1e077e57737602de1b82030815f311be11f96f09cce59bd5b903d0b29834733e5313f9301e3ed6d6f6fba2eae0df4298f + checksum: 46ea0f3ffa8bc6a5bc0c7081ffc3907777f0ed6516888d40a518c5111f8366d97d2678911ad1a6882bf592fa9de6c784fea32e1687bb94e1f4944170af48a5cf languageName: node linkType: hard "modify-values@npm:^1.0.0": version: 1.0.1 resolution: "modify-values@npm:1.0.1" - checksum: 8296610c608bc97b03c2cf889c6cdf4517e32fa2d836440096374c2209f6b7b3e256c209493a0b32584b9cb32d528e99d0dd19dcd9a14d2d915a312d391cc7e9 + checksum: 6acb1b82aaf7a02f9f7b554b20cbfc159f223a79c66b0a257511c5933d50b85e12ea1220b0a90a2af6f80bc29ff784f929a52a51881867a93ae6a12ce87a729a languageName: node linkType: hard @@ -6587,11 +6872,23 @@ __metadata: version: 3.4.0 resolution: "module-definition@npm:3.4.0" dependencies: - ast-module-types: ^3.0.0 - node-source-walk: ^4.0.0 + ast-module-types: "npm:^3.0.0" + node-source-walk: "npm:^4.0.0" + bin: + module-definition: bin/cli.js + checksum: be8582e61b475b3913452564e2264ff931e109a8da8ed0d7d04c570ab08cb34931a162076e4500f92efe8dd06b731639b75a56dbfaae839d83f3a0f9b1a495ea + languageName: node + linkType: hard + +"module-definition@npm:^4.1.0": + version: 4.1.0 + resolution: "module-definition@npm:4.1.0" + dependencies: + ast-module-types: "npm:^4.0.0" + node-source-walk: "npm:^5.0.1" bin: module-definition: bin/cli.js - checksum: 5cbfd38aab1a9169b5c31924e208e430a87a1b1512ab9736a9a368d950e3cc8e2f5cf642e37fe74123e25402cae50bfb8fdf1f5f0fd3d4d9270df705a2360bfa + checksum: 199b8cec8eb68f1a5d824b22b377bdb95e1d01198fe637113a811464525617c8562dd53f964139ac6c45be61cec0012c93925e076aa2317018b4db57857000e3 languageName: node linkType: hard @@ -6599,140 +6896,133 @@ __metadata: version: 7.0.1 resolution: "module-lookup-amd@npm:7.0.1" dependencies: - commander: ^2.8.1 - debug: ^4.1.0 - glob: ^7.1.6 - requirejs: ^2.3.5 - requirejs-config-file: ^4.0.0 + commander: "npm:^2.8.1" + debug: "npm:^4.1.0" + glob: "npm:^7.1.6" + requirejs: "npm:^2.3.5" + requirejs-config-file: "npm:^4.0.0" bin: lookup-amd: bin/cli.js - checksum: 911abd6b8fb1d82cfae4ef38050981d4eb7e710bfeba898903c5c49a4d3a44b3cacb6201ddf9930a39fae3473faf9b96d39930cfa8766dbf0da86689108895b1 + checksum: 25038b4b188ff4b030105d44c3efcaa7e80dbf5659fbb540ee4a58240b89804b406280157b5e6132c79ed280927de5eb0a165c202c7ee4925d106993a89233e5 languageName: node linkType: hard "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" - checksum: 0e6a22b8b746d2e0b65a430519934fefd41b6db0682e3477c10f60c76e947c4c0ad06f63ffdf1d78d335f83edee8c0aa928aa66a36c7cd95b69b26f468d527f4 + checksum: f8fda810b39fd7255bbdc451c46286e549794fcc700dc9cd1d25658bbc4dc2563a5de6fe7c60f798a16a60c6ceb53f033cb353f493f0cf63e5199b702943159d languageName: node linkType: hard "ms@npm:2.1.2": version: 2.1.2 resolution: "ms@npm:2.1.2" - checksum: 673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f + checksum: a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": +"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" - checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d + checksum: d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 languageName: node linkType: hard "mute-stream@npm:0.0.8": version: 0.0.8 resolution: "mute-stream@npm:0.0.8" - checksum: ff48d251fc3f827e5b1206cda0ffdaec885e56057ee86a3155e1951bc940fd5f33531774b1cc8414d7668c10a8907f863f6561875ee6e8768931a62121a531a1 + checksum: 18d06d92e5d6d45e2b63c0e1b8f25376af71748ac36f53c059baa8b76ffac31c5ab225480494e7d35d30215ecdb18fed26ec23cafcd2f7733f2f14406bcd19e2 languageName: node linkType: hard -"nanoid@npm:^3.3.4": - version: 3.3.4 - resolution: "nanoid@npm:3.3.4" +"nanoid@npm:^3.3.7": + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" bin: nanoid: bin/nanoid.cjs - checksum: 2fddd6dee994b7676f008d3ffa4ab16035a754f4bb586c61df5a22cf8c8c94017aadd360368f47d653829e0569a92b129979152ff97af23a558331e47e37cd9c - languageName: node - linkType: hard - -"natural-compare-lite@npm:^1.4.0": - version: 1.4.0 - resolution: "natural-compare-lite@npm:1.4.0" - checksum: 5222ac3986a2b78dd6069ac62cbb52a7bf8ffc90d972ab76dfe7b01892485d229530ed20d0c62e79a6b363a663b273db3bde195a1358ce9e5f779d4453887225 + checksum: e3fb661aa083454f40500473bb69eedb85dc160e763150b9a2c567c7e9ff560ce028a9f833123b618a6ea742e311138b591910e795614a629029e86e180660f3 languageName: node linkType: hard "natural-compare@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare@npm:1.4.0" - checksum: 23ad088b08f898fc9b53011d7bb78ec48e79de7627e01ab5518e806033861bef68d5b0cd0e2205c2f36690ac9571ff6bcb05eb777ced2eeda8d4ac5b44592c3d + checksum: f5f9a7974bfb28a91afafa254b197f0f22c684d4a1731763dda960d2c8e375b36c7d690e0d9dc8fba774c537af14a7e979129bca23d88d052fbeb9466955e447 languageName: node linkType: hard "negotiator@npm:0.6.3, negotiator@npm:^0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" - checksum: b8ffeb1e262eff7968fc90a2b6767b04cfd9842582a9d0ece0af7049537266e7b2506dfb1d107a32f06dd849ab2aea834d5830f7f4d0e5cb7d36e1ae55d021d9 + checksum: 3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 languageName: node linkType: hard -"neo-async@npm:^2.6.0": +"neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" - checksum: deac9f8d00eda7b2e5cd1b2549e26e10a0faa70adaa6fdadca701cc55f49ee9018e427f424bac0c790b7c7e2d3068db97f3093f1093975f2acb8f8818b936ed9 + checksum: c2f5a604a54a8ec5438a342e1f356dff4bc33ccccdb6dc668d94fe8e5eccfc9d2c2eea6064b0967a767ba63b33763f51ccf2cd2441b461a7322656c1f06b3f5d languageName: node linkType: hard -"nested-error-stacks@npm:^2.0.0, nested-error-stacks@npm:^2.1.0": +"nested-error-stacks@npm:^2.1.1": version: 2.1.1 resolution: "nested-error-stacks@npm:2.1.1" - checksum: 5f452fad75db8480b4db584e1602894ff5977f8bf3d2822f7ba5cb7be80e89adf1fffa34dada3347ef313a4288850b4486eb0635b315c32bdfb505577e8880e3 + checksum: feec00417e4778661cfbbe657e6add6ca9918dcc026cd697ac330b4a56a79e4882b36dde8abc138167566b1ce4c5baa17d2d4df727a96f8b96aebace1c3ffca7 languageName: node linkType: hard -"node-addon-api@npm:^2.0.0": - version: 2.0.2 - resolution: "node-addon-api@npm:2.0.2" +"node-addon-api@npm:^5.0.0": + version: 5.1.0 + resolution: "node-addon-api@npm:5.1.0" dependencies: - node-gyp: latest - checksum: 31fb22d674648204f8dd94167eb5aac896c841b84a9210d614bf5d97c74ef059cc6326389cf0c54d2086e35312938401d4cc82e5fcd679202503eb8ac84814f8 + node-gyp: "npm:latest" + checksum: 0eb269786124ba6fad9df8007a149e03c199b3e5a3038125dfb3e747c2d5113d406a4e33f4de1ea600aa2339be1f137d55eba1a73ee34e5fff06c52a5c296d1d languageName: node linkType: hard -"node-fetch@npm:2.6.7, node-fetch@npm:^2.6.7": - version: 2.6.7 - resolution: "node-fetch@npm:2.6.7" +"node-fetch@npm:^2.6.7": + version: 2.7.0 + resolution: "node-fetch@npm:2.7.0" dependencies: - whatwg-url: ^5.0.0 + whatwg-url: "npm:^5.0.0" peerDependencies: encoding: ^0.1.0 peerDependenciesMeta: encoding: optional: true - checksum: 8d816ffd1ee22cab8301c7756ef04f3437f18dace86a1dae22cf81db8ef29c0bf6655f3215cb0cdb22b420b6fe141e64b26905e7f33f9377a7fa59135ea3e10b + checksum: b55786b6028208e6fbe594ccccc213cab67a72899c9234eb59dba51062a299ea853210fcf526998eaa2867b0963ad72338824450905679ff0fa304b8c5093ae8 languageName: node linkType: hard -"node-gyp-build@npm:^4.2.0": - version: 4.6.0 - resolution: "node-gyp-build@npm:4.6.0" +"node-gyp-build@npm:^4.2.0, node-gyp-build@npm:^4.2.2": + version: 4.7.1 + resolution: "node-gyp-build@npm:4.7.1" bin: node-gyp-build: bin.js node-gyp-build-optional: optional.js node-gyp-build-test: build-test.js - checksum: 25d78c5ef1f8c24291f4a370c47ba52fcea14f39272041a90a7894cd50d766f7c8cb8fb06c0f42bf6f69b204b49d9be3c8fc344aac09714d5bdb95965499eb15 + checksum: b8e4a3f889237cd08edde3775e2b4e1e39a0571580584e33e29979f0c532a254ce3c5ec9435bd526254ad0b3f0b4a7e7fe14e53bd400f6ea9445f3bfd88a6b1e languageName: node linkType: hard "node-gyp@npm:latest": - version: 9.3.1 - resolution: "node-gyp@npm:9.3.1" - dependencies: - env-paths: ^2.2.0 - glob: ^7.1.4 - graceful-fs: ^4.2.6 - make-fetch-happen: ^10.0.3 - nopt: ^6.0.0 - npmlog: ^6.0.0 - rimraf: ^3.0.2 - semver: ^7.3.5 - tar: ^6.1.2 - which: ^2.0.2 + version: 10.0.1 + resolution: "node-gyp@npm:10.0.1" + dependencies: + env-paths: "npm:^2.2.0" + exponential-backoff: "npm:^3.1.1" + glob: "npm:^10.3.10" + graceful-fs: "npm:^4.2.6" + make-fetch-happen: "npm:^13.0.0" + nopt: "npm:^7.0.0" + proc-log: "npm:^3.0.0" + semver: "npm:^7.3.5" + tar: "npm:^6.1.2" + which: "npm:^4.0.0" bin: node-gyp: bin/node-gyp.js - checksum: b860e9976fa645ca0789c69e25387401b4396b93c8375489b5151a6c55cf2640a3b6183c212b38625ef7c508994930b72198338e3d09b9d7ade5acc4aaf51ea7 + checksum: abddfff7d873312e4ed4a5fb75ce893a5c4fb69e7fcb1dfa71c28a6b92a7f1ef6b62790dffb39181b5a82728ba8f2f32d229cf8cbe66769fe02cea7db4a555aa languageName: node linkType: hard @@ -6740,26 +7030,46 @@ __metadata: version: 4.3.0 resolution: "node-source-walk@npm:4.3.0" dependencies: - "@babel/parser": ^7.0.0 - checksum: 124bcec61f73141a5f13e63f773beb00c9a9620e9eec6d7505b9de8fa884797f3eb0b9e9d225bb324930234ae03b28a4a7a231e2c2f23d71405d4a562b404e34 + "@babel/parser": "npm:^7.0.0" + checksum: ad209382068aa4f5755c120f449f090db78573ed14cc974fd501cd38ac93ce9983025f1450562770dbcad2a86388982d90ec01f984f787caa418b1d9eb377a67 + languageName: node + linkType: hard + +"node-source-walk@npm:^5.0.0, node-source-walk@npm:^5.0.1": + version: 5.0.2 + resolution: "node-source-walk@npm:5.0.2" + dependencies: + "@babel/parser": "npm:^7.21.4" + checksum: 2be6236f9103911b2f186fd082ee84f956ffd872190542840b06ae130f76bf0b762c43d7d276d6b8bdd84524ac4cec75a7f8d0bdb3832985fd82df1b8b2a9465 languageName: node linkType: hard "nofilter@npm:^3.1.0": version: 3.1.0 resolution: "nofilter@npm:3.1.0" - checksum: 58aa85a5b4b35cbb6e42de8a8591c5e338061edc9f3e7286f2c335e9e9b9b8fa7c335ae45daa8a1f3433164dc0b9a3d187fa96f9516e04a17a1f9ce722becc4f + checksum: 92459f3864a067b347032263f0b536223cbfc98153913b5dce350cb39c8470bc1813366e41993f22c33cc6400c0f392aa324a4b51e24c22040635c1cdb046499 languageName: node linkType: hard -"nopt@npm:^6.0.0": - version: 6.0.0 - resolution: "nopt@npm:6.0.0" +"nopt@npm:^5.0.0": + version: 5.0.0 + resolution: "nopt@npm:5.0.0" + dependencies: + abbrev: "npm:1" + bin: + nopt: bin/nopt.js + checksum: fc5c4f07155cb455bf5fc3dd149fac421c1a40fd83c6bfe83aa82b52f02c17c5e88301321318adaa27611c8a6811423d51d29deaceab5fa158b585a61a551061 + languageName: node + linkType: hard + +"nopt@npm:^7.0.0": + version: 7.2.0 + resolution: "nopt@npm:7.2.0" dependencies: - abbrev: ^1.0.0 + abbrev: "npm:^2.0.0" bin: nopt: bin/nopt.js - checksum: 82149371f8be0c4b9ec2f863cc6509a7fd0fa729929c009f3a58e4eb0c9e4cae9920e8f1f8eb46e7d032fec8fb01bede7f0f41a67eb3553b7b8e14fa53de1dac + checksum: 9bd7198df6f16eb29ff16892c77bcf7f0cc41f9fb5c26280ac0def2cf8cf319f3b821b3af83eba0e74c85807cc430a16efe0db58fe6ae1f41e69519f585b6aff languageName: node linkType: hard @@ -6767,88 +7077,118 @@ __metadata: version: 2.5.0 resolution: "normalize-package-data@npm:2.5.0" dependencies: - hosted-git-info: ^2.1.4 - resolve: ^1.10.0 - semver: 2 || 3 || 4 || 5 - validate-npm-package-license: ^3.0.1 - checksum: 7999112efc35a6259bc22db460540cae06564aa65d0271e3bdfa86876d08b0e578b7b5b0028ee61b23f1cae9fc0e7847e4edc0948d3068a39a2a82853efc8499 + hosted-git-info: "npm:^2.1.4" + resolve: "npm:^1.10.0" + semver: "npm:2 || 3 || 4 || 5" + validate-npm-package-license: "npm:^3.0.1" + checksum: 357cb1646deb42f8eb4c7d42c4edf0eec312f3628c2ef98501963cc4bbe7277021b2b1d977f982b2edce78f5a1014613ce9cf38085c3df2d76730481357ca504 languageName: node linkType: hard -"normalize-package-data@npm:^3.0.0, normalize-package-data@npm:^3.0.2": +"normalize-package-data@npm:^3.0.0": version: 3.0.3 resolution: "normalize-package-data@npm:3.0.3" dependencies: - hosted-git-info: ^4.0.1 - is-core-module: ^2.5.0 - semver: ^7.3.4 - validate-npm-package-license: ^3.0.1 - checksum: bbcee00339e7c26fdbc760f9b66d429258e2ceca41a5df41f5df06cc7652de8d82e8679ff188ca095cad8eff2b6118d7d866af2b68400f74602fbcbce39c160a + hosted-git-info: "npm:^4.0.1" + is-core-module: "npm:^2.5.0" + semver: "npm:^7.3.4" + validate-npm-package-license: "npm:^3.0.1" + checksum: e5d0f739ba2c465d41f77c9d950e291ea4af78f8816ddb91c5da62257c40b76d8c83278b0d08ffbcd0f187636ebddad20e181e924873916d03e6e5ea2ef026be languageName: node linkType: hard -"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": +"normalize-path@npm:^3.0.0": version: 3.0.0 resolution: "normalize-path@npm:3.0.0" - checksum: 88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 + checksum: e008c8142bcc335b5e38cf0d63cfd39d6cf2d97480af9abdbe9a439221fd4d749763bab492a8ee708ce7a194bb00c9da6d0a115018672310850489137b3da046 languageName: node linkType: hard -"npm-run-path@npm:^4.0.1": - version: 4.0.1 - resolution: "npm-run-path@npm:4.0.1" +"npm-run-path@npm:^5.1.0": + version: 5.2.0 + resolution: "npm-run-path@npm:5.2.0" dependencies: - path-key: ^3.0.0 - checksum: 5374c0cea4b0bbfdfae62da7bbdf1e1558d338335f4cacf2515c282ff358ff27b2ecb91ffa5330a8b14390ac66a1e146e10700440c1ab868208430f56b5f4d23 + path-key: "npm:^4.0.0" + checksum: 7963c1f98e42afebe9524a08b0881477ec145aab34f6018842a315422b25ad40e015bdee709b697571e5efda2ecfa2640ee917d92674e4de1166fa3532a211b1 languageName: node linkType: hard -"npmlog@npm:^6.0.0": - version: 6.0.2 - resolution: "npmlog@npm:6.0.2" +"npmlog@npm:^5.0.1": + version: 5.0.1 + resolution: "npmlog@npm:5.0.1" dependencies: - are-we-there-yet: ^3.0.0 - console-control-strings: ^1.1.0 - gauge: ^4.0.3 - set-blocking: ^2.0.0 - checksum: ae238cd264a1c3f22091cdd9e2b106f684297d3c184f1146984ecbe18aaa86343953f26b9520dedd1b1372bc0316905b736c1932d778dbeb1fcf5a1001390e2a + are-we-there-yet: "npm:^2.0.0" + console-control-strings: "npm:^1.1.0" + gauge: "npm:^3.0.0" + set-blocking: "npm:^2.0.0" + checksum: 489ba519031013001135c463406f55491a17fc7da295c18a04937fe3a4d523fd65e88dd418a28b967ab743d913fdeba1e29838ce0ad8c75557057c481f7d49fa + languageName: node + linkType: hard + +"object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 languageName: node linkType: hard -"object-inspect@npm:^1.12.2, object-inspect@npm:^1.9.0": - version: 1.12.2 - resolution: "object-inspect@npm:1.12.2" - checksum: a534fc1b8534284ed71f25ce3a496013b7ea030f3d1b77118f6b7b1713829262be9e6243acbcb3ef8c626e2b64186112cb7f6db74e37b2789b9c789ca23048b2 +"object-inspect@npm:^1.13.1, object-inspect@npm:^1.9.0": + version: 1.13.1 + resolution: "object-inspect@npm:1.13.1" + checksum: fad603f408e345c82e946abdf4bfd774260a5ed3e5997a0b057c44153ac32c7271ff19e3a5ae39c858da683ba045ccac2f65245c12763ce4e8594f818f4a648d languageName: node linkType: hard "object-keys@npm:^1.1.1": version: 1.1.1 resolution: "object-keys@npm:1.1.1" - checksum: b363c5e7644b1e1b04aa507e88dcb8e3a2f52b6ffd0ea801e4c7a62d5aa559affe21c55a07fd4b1fd55fc03a33c610d73426664b20032405d7b92a1414c34d6a + checksum: b11f7ccdbc6d406d1f186cdadb9d54738e347b2692a14439ca5ac70c225fa6db46db809711b78589866d47b25fc3e8dee0b4c722ac751e11180f9380e3d8601d languageName: node linkType: hard "object.assign@npm:^4.1.4": - version: 4.1.4 - resolution: "object.assign@npm:4.1.4" + version: 4.1.5 + resolution: "object.assign@npm:4.1.5" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - has-symbols: ^1.0.3 - object-keys: ^1.1.1 - checksum: 76cab513a5999acbfe0ff355f15a6a125e71805fcf53de4e9d4e082e1989bdb81d1e329291e1e4e0ae7719f0e4ef80e88fb2d367ae60500d79d25a6224ac8864 + call-bind: "npm:^1.0.5" + define-properties: "npm:^1.2.1" + has-symbols: "npm:^1.0.3" + object-keys: "npm:^1.1.1" + checksum: 60108e1fa2706f22554a4648299b0955236c62b3685c52abf4988d14fffb0e7731e00aa8c6448397e3eb63d087dcc124a9f21e1980f36d0b2667f3c18bacd469 languageName: node linkType: hard -"object.values@npm:^1.1.5": - version: 1.1.6 - resolution: "object.values@npm:1.1.6" +"object.fromentries@npm:^2.0.7": + version: 2.0.7 + resolution: "object.fromentries@npm:2.0.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 071745c21f6fc9e6c914691f2532c1fb60ad967e5ddc52801d09958b5de926566299d07ae14466452a7efd29015f9145d6c09c573d93a0dc6f1683ee0ec2b93b + languageName: node + linkType: hard + +"object.groupby@npm:^1.0.1": + version: 1.0.1 + resolution: "object.groupby@npm:1.0.1" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + get-intrinsic: "npm:^1.2.1" + checksum: 61e41fbf08cc04ed860363db9629eedeaa590fce243c0960e948fd7b11f78a9d4350065c339936d118a2dd8775d7259e26207340cc8ce688bec66cb615fec6fe + languageName: node + linkType: hard + +"object.values@npm:^1.1.7": + version: 1.1.7 + resolution: "object.values@npm:1.1.7" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: f6fff9fd817c24cfd8107f50fb33061d81cd11bacc4e3dbb3852e9ff7692fde4dbce823d4333ea27cd9637ef1b6690df5fbb61f1ed314fa2959598dc3ae23d8e + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: e869d6a37fb7afdd0054dea49036d6ccebb84854a8848a093bbd1bc516f53e690bba88f0bc3e83fdfa74c601469ee6989c9b13359cda9604144c6e732fad3b6b languageName: node linkType: hard @@ -6856,80 +7196,76 @@ __metadata: version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: - ee-first: 1.1.1 - checksum: d20929a25e7f0bb62f937a425b5edeb4e4cde0540d77ba146ec9357f00b0d497cdb3b9b05b9c8e46222407d1548d08166bff69cc56dfa55ba0e4469228920ff0 + ee-first: "npm:1.1.1" + checksum: 46fb11b9063782f2d9968863d9cbba33d77aa13c17f895f56129c274318b86500b22af3a160fe9995aa41317efcd22941b6eba747f718ced08d9a73afdb087b4 languageName: node linkType: hard -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": +"once@npm:^1.3.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: - wrappy: 1 - checksum: cd0a88501333edd640d95f0d2700fbde6bff20b3d4d9bdc521bdd31af0656b5706570d6c6afe532045a20bb8dc0849f8332d6f2a416e0ba6d3d3b98806c7db68 + wrappy: "npm:1" + checksum: 5d48aca287dfefabd756621c5dfce5c91a549a93e9fdb7b8246bc4c4790aa2ec17b34a260530474635147aeb631a2dcc8b32c613df0675f96041cbb8244517d0 languageName: node linkType: hard -"onetime@npm:^5.1.0, onetime@npm:^5.1.2": +"onetime@npm:^5.1.0": version: 5.1.2 resolution: "onetime@npm:5.1.2" dependencies: - mimic-fn: ^2.1.0 - checksum: 2478859ef817fc5d4e9c2f9e5728512ddd1dbc9fb7829ad263765bb6d3b91ce699d6e2332eef6b7dff183c2f490bd3349f1666427eaba4469fba0ac38dfd0d34 + mimic-fn: "npm:^2.1.0" + checksum: ffcef6fbb2692c3c40749f31ea2e22677a876daea92959b8a80b521d95cca7a668c884d8b2045d1d8ee7d56796aa405c405462af112a1477594cc63531baeb8f languageName: node linkType: hard -"open-cli@npm:^7.1.0": - version: 7.1.0 - resolution: "open-cli@npm:7.1.0" +"onetime@npm:^6.0.0": + version: 6.0.0 + resolution: "onetime@npm:6.0.0" dependencies: - file-type: ^18.0.0 - get-stdin: ^9.0.0 - meow: ^10.1.5 - open: ^8.4.0 - tempy: ^3.0.0 - bin: - open-cli: cli.js - checksum: 65b87a9119b1137730c7dc881e04df5e6eadd3ca83efacc837cc0aa587d7e7a331dcf63005e5f28b374f1bc3bfdec089d27ee1ec7f3cf10181d227aac9e72266 + mimic-fn: "npm:^4.0.0" + checksum: 4eef7c6abfef697dd4479345a4100c382d73c149d2d56170a54a07418c50816937ad09500e1ed1e79d235989d073a9bade8557122aee24f0576ecde0f392bb6c languageName: node linkType: hard -"open@npm:^8.4.0": - version: 8.4.0 - resolution: "open@npm:8.4.0" +"open-cli@npm:^8.0.0": + version: 8.0.0 + resolution: "open-cli@npm:8.0.0" dependencies: - define-lazy-prop: ^2.0.0 - is-docker: ^2.1.1 - is-wsl: ^2.2.0 - checksum: e9545bec64cdbf30a0c35c1bdc310344adf8428a117f7d8df3c0af0a0a24c513b304916a6d9b11db0190ff7225c2d578885080b761ed46a3d5f6f1eebb98b63c + file-type: "npm:^18.7.0" + get-stdin: "npm:^9.0.0" + meow: "npm:^12.1.1" + open: "npm:^10.0.0" + tempy: "npm:^3.1.0" + bin: + open-cli: cli.js + checksum: cbde1defbc8a4b6b7de61ff801c4b7d19e6f6c3e38c8d309d5fa3c054236fb98e92a6e9961ec4dfc20a8392b0661e8ce560648f4eec722a974222b2347085b9b languageName: node linkType: hard -"optionator@npm:^0.8.1": - version: 0.8.3 - resolution: "optionator@npm:0.8.3" +"open@npm:^10.0.0": + version: 10.0.2 + resolution: "open@npm:10.0.2" dependencies: - deep-is: ~0.1.3 - fast-levenshtein: ~2.0.6 - levn: ~0.3.0 - prelude-ls: ~1.1.2 - type-check: ~0.3.2 - word-wrap: ~1.2.3 - checksum: b8695ddf3d593203e25ab0900e265d860038486c943ff8b774f596a310f8ceebdb30c6832407a8198ba3ec9debe1abe1f51d4aad94843612db3b76d690c61d34 + default-browser: "npm:^5.2.1" + define-lazy-prop: "npm:^3.0.0" + is-inside-container: "npm:^1.0.0" + is-wsl: "npm:^3.1.0" + checksum: fbbc5d4921eb97d1a786022f7b6540911f427bf0f59729131cf71162d990f4d7c27ed82f95f2dc791a5946c79e2c4f24fb68f69d72e78e0e9364f115bcc69d3d languageName: node linkType: hard -"optionator@npm:^0.9.1": - version: 0.9.1 - resolution: "optionator@npm:0.9.1" +"optionator@npm:^0.9.3": + version: 0.9.3 + resolution: "optionator@npm:0.9.3" dependencies: - deep-is: ^0.1.3 - fast-levenshtein: ^2.0.6 - levn: ^0.4.1 - prelude-ls: ^1.2.1 - type-check: ^0.4.0 - word-wrap: ^1.2.3 - checksum: dbc6fa065604b24ea57d734261914e697bd73b69eff7f18e967e8912aa2a40a19a9f599a507fa805be6c13c24c4eae8c71306c239d517d42d4c041c942f508a0 + "@aashutoshrathi/word-wrap": "npm:^1.2.3" + deep-is: "npm:^0.1.3" + fast-levenshtein: "npm:^2.0.6" + levn: "npm:^0.4.1" + prelude-ls: "npm:^1.2.1" + type-check: "npm:^0.4.0" + checksum: 66fba794d425b5be51353035cf3167ce6cfa049059cbb93229b819167687e0f48d2bc4603fcb21b091c99acb516aae1083624675b15c4765b2e4693a085e959c languageName: node linkType: hard @@ -6937,39 +7273,23 @@ __metadata: version: 5.4.1 resolution: "ora@npm:5.4.1" dependencies: - bl: ^4.1.0 - chalk: ^4.1.0 - cli-cursor: ^3.1.0 - cli-spinners: ^2.5.0 - is-interactive: ^1.0.0 - is-unicode-supported: ^0.1.0 - log-symbols: ^4.1.0 - strip-ansi: ^6.0.0 - wcwidth: ^1.0.1 - checksum: 28d476ee6c1049d68368c0dc922e7225e3b5600c3ede88fade8052837f9ed342625fdaa84a6209302587c8ddd9b664f71f0759833cbdb3a4cf81344057e63c63 + bl: "npm:^4.1.0" + chalk: "npm:^4.1.0" + cli-cursor: "npm:^3.1.0" + cli-spinners: "npm:^2.5.0" + is-interactive: "npm:^1.0.0" + is-unicode-supported: "npm:^0.1.0" + log-symbols: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + wcwidth: "npm:^1.0.1" + checksum: 10ff14aace236d0e2f044193362b22edce4784add08b779eccc8f8ef97195cae1248db8ec1ec5f5ff076f91acbe573f5f42a98c19b78dba8c54eefff983cae85 languageName: node linkType: hard "os-tmpdir@npm:~1.0.2": version: 1.0.2 resolution: "os-tmpdir@npm:1.0.2" - checksum: 5666560f7b9f10182548bf7013883265be33620b1c1b4a4d405c25be2636f970c5488ff3e6c48de75b55d02bde037249fe5dbfbb4c0fb7714953d56aed062e6d - languageName: node - linkType: hard - -"p-defer@npm:^1.0.0": - version: 1.0.0 - resolution: "p-defer@npm:1.0.0" - checksum: 4271b935c27987e7b6f229e5de4cdd335d808465604644cb7b4c4c95bef266735859a93b16415af8a41fd663ee9e3b97a1a2023ca9def613dba1bad2a0da0c7b - languageName: node - linkType: hard - -"p-event@npm:^4.1.0": - version: 4.2.0 - resolution: "p-event@npm:4.2.0" - dependencies: - p-timeout: ^3.1.0 - checksum: 8a3588f7a816a20726a3262dfeee70a631e3997e4773d23219176333eda55cce9a76219e3d2b441b331eb746e14fdb381eb2694ab9ff2fcf87c846462696fe89 + checksum: f438450224f8e2687605a8dd318f0db694b6293c5d835ae509a69e97c8de38b6994645337e5577f5001115470414638978cc49da1cdcc25106dad8738dc69990 languageName: node linkType: hard @@ -6977,8 +7297,8 @@ __metadata: version: 5.0.1 resolution: "p-event@npm:5.0.1" dependencies: - p-timeout: ^5.0.2 - checksum: 3bdd8df6092e6b149f25e9c2eb1c0843b3b4279b07be2a2c72c02b65b267a8908c2040fefd606f2497b0f2bcefcd214f8ca5a74f0c883515d400ccf1d88d5683 + p-timeout: "npm:^5.0.2" + checksum: 2317171489537f316661fa863f3bb711b2ceb89182937238422cec10223cbb958c432d6c26a238446a622d788187bdd295b1d8ecedbe2e467e045930d60202b0 languageName: node linkType: hard @@ -6986,15 +7306,8 @@ __metadata: version: 3.0.0 resolution: "p-filter@npm:3.0.0" dependencies: - p-map: ^5.1.0 - checksum: aacc36820f0531c01963334edc6debf5038b47c83a1c2255b7c14f6964a9a5fc1887ce0b93e72d137727403253bcc9bb26eed9bb79896ece1fa9f52d979bb97b - languageName: node - linkType: hard - -"p-finally@npm:^1.0.0": - version: 1.0.0 - resolution: "p-finally@npm:1.0.0" - checksum: 93a654c53dc805dd5b5891bab16eb0ea46db8f66c4bfd99336ae929323b1af2b70a8b0654f8f1eae924b2b73d037031366d645f1fd18b3d30cbd15950cc4b1d4 + p-map: "npm:^5.1.0" + checksum: 32e375fa6b3afd8b5eb65915746b75a471a3bedf38264dc9d738d6b1b8a0b2797b06b363f637b3387e766e0c7c6fab316cb1119e353baf7936da3ba6d8a4ac8d languageName: node linkType: hard @@ -7002,8 +7315,8 @@ __metadata: version: 1.3.0 resolution: "p-limit@npm:1.3.0" dependencies: - p-try: ^1.0.0 - checksum: 281c1c0b8c82e1ac9f81acd72a2e35d402bf572e09721ce5520164e9de07d8274451378a3470707179ad13240535558f4b277f02405ad752e08c7d5b0d54fbfd + p-try: "npm:^1.0.0" + checksum: 5c1b1d53d180b2c7501efb04b7c817448e10efe1ba46f4783f8951994d5027e4cd88f36ad79af50546682594c4ebd11702ac4b9364c47f8074890e2acad0edee languageName: node linkType: hard @@ -7011,8 +7324,8 @@ __metadata: version: 2.3.0 resolution: "p-limit@npm:2.3.0" dependencies: - p-try: ^2.0.0 - checksum: 84ff17f1a38126c3314e91ecfe56aecbf36430940e2873dadaa773ffe072dc23b7af8e46d4b6485d302a11673fe94c6b67ca2cfbb60c989848b02100d0594ac1 + p-try: "npm:^2.0.0" + checksum: 8da01ac53efe6a627080fafc127c873da40c18d87b3f5d5492d465bb85ec7207e153948df6b9cbaeb130be70152f874229b8242ee2be84c0794082510af97f12 languageName: node linkType: hard @@ -7020,17 +7333,8 @@ __metadata: version: 3.1.0 resolution: "p-limit@npm:3.1.0" dependencies: - yocto-queue: ^0.1.0 - checksum: 7c3690c4dbf62ef625671e20b7bdf1cbc9534e83352a2780f165b0d3ceba21907e77ad63401708145ca4e25bfc51636588d89a8c0aeb715e6c37d1c066430360 - languageName: node - linkType: hard - -"p-limit@npm:^4.0.0": - version: 4.0.0 - resolution: "p-limit@npm:4.0.0" - dependencies: - yocto-queue: ^1.0.0 - checksum: 01d9d70695187788f984226e16c903475ec6a947ee7b21948d6f597bed788e3112cc7ec2e171c1d37125057a5f45f3da21d8653e04a3a793589e12e9e80e756b + yocto-queue: "npm:^0.1.0" + checksum: 9db675949dbdc9c3763c89e748d0ef8bdad0afbb24d49ceaf4c46c02c77d30db4e0652ed36d0a0a7a95154335fab810d95c86153105bb73b3a90448e2bb14e1a languageName: node linkType: hard @@ -7038,8 +7342,8 @@ __metadata: version: 2.0.0 resolution: "p-locate@npm:2.0.0" dependencies: - p-limit: ^1.1.0 - checksum: e2dceb9b49b96d5513d90f715780f6f4972f46987dc32a0e18bc6c3fc74a1a5d73ec5f81b1398af5e58b99ea1ad03fd41e9181c01fa81b4af2833958696e3081 + p-limit: "npm:^1.1.0" + checksum: 82da4be88fb02fd29175e66021610c881938d3cc97c813c71c1a605fac05617d57fd5d3b337494a6106c0edb2a37c860241430851411f1b265108cead34aee67 languageName: node linkType: hard @@ -7047,8 +7351,8 @@ __metadata: version: 3.0.0 resolution: "p-locate@npm:3.0.0" dependencies: - p-limit: ^2.0.0 - checksum: 83991734a9854a05fe9dbb29f707ea8a0599391f52daac32b86f08e21415e857ffa60f0e120bfe7ce0cc4faf9274a50239c7895fc0d0579d08411e513b83a4ae + p-limit: "npm:^2.0.0" + checksum: 7b7f06f718f19e989ce6280ed4396fb3c34dabdee0df948376483032f9d5ec22fdf7077ec942143a75827bb85b11da72016497fc10dac1106c837ed593969ee8 languageName: node linkType: hard @@ -7056,8 +7360,8 @@ __metadata: version: 4.1.0 resolution: "p-locate@npm:4.1.0" dependencies: - p-limit: ^2.2.0 - checksum: 513bd14a455f5da4ebfcb819ef706c54adb09097703de6aeaa5d26fe5ea16df92b48d1ac45e01e3944ce1e6aa2a66f7f8894742b8c9d6e276e16cd2049a2b870 + p-limit: "npm:^2.2.0" + checksum: 1b476ad69ad7f6059744f343b26d51ce091508935c1dbb80c4e0a2f397ffce0ca3a1f9f5cd3c7ce19d7929a09719d5c65fe70d8ee289c3f267cd36f2881813e9 languageName: node linkType: hard @@ -7065,17 +7369,8 @@ __metadata: version: 5.0.0 resolution: "p-locate@npm:5.0.0" dependencies: - p-limit: ^3.0.2 - checksum: 1623088f36cf1cbca58e9b61c4e62bf0c60a07af5ae1ca99a720837356b5b6c5ba3eb1b2127e47a06865fee59dd0453cad7cc844cda9d5a62ac1a5a51b7c86d3 - languageName: node - linkType: hard - -"p-locate@npm:^6.0.0": - version: 6.0.0 - resolution: "p-locate@npm:6.0.0" - dependencies: - p-limit: ^4.0.0 - checksum: 2bfe5234efa5e7a4e74b30a5479a193fdd9236f8f6b4d2f3f69e3d286d9a7d7ab0c118a2a50142efcf4e41625def635bd9332d6cbf9cc65d85eb0718c579ab38 + p-limit: "npm:^3.0.2" + checksum: 2290d627ab7903b8b70d11d384fee714b797f6040d9278932754a6860845c4d3190603a0772a663c8cb5a7b21d1b16acb3a6487ebcafa9773094edc3dfe6009a languageName: node linkType: hard @@ -7083,47 +7378,55 @@ __metadata: version: 4.0.0 resolution: "p-map@npm:4.0.0" dependencies: - aggregate-error: ^3.0.0 - checksum: cb0ab21ec0f32ddffd31dfc250e3afa61e103ef43d957cc45497afe37513634589316de4eb88abdfd969fe6410c22c0b93ab24328833b8eb1ccc087fc0442a1c + aggregate-error: "npm:^3.0.0" + checksum: 592c05bd6262c466ce269ff172bb8de7c6975afca9b50c975135b974e9bdaafbfe80e61aaaf5be6d1200ba08b30ead04b88cfa7e25ff1e3b93ab28c9f62a2c75 languageName: node linkType: hard -"p-map@npm:^5.1.0, p-map@npm:^5.3.0, p-map@npm:^5.5.0": +"p-map@npm:^5.1.0": version: 5.5.0 resolution: "p-map@npm:5.5.0" dependencies: - aggregate-error: ^4.0.0 - checksum: 065cb6fca6b78afbd070dd9224ff160dc23eea96e57863c09a0c8ea7ce921043f76854be7ee0abc295cff1ac9adcf700e79a1fbe3b80b625081087be58e7effb + aggregate-error: "npm:^4.0.0" + checksum: 410bce846b1e3db6bb2ccab6248372ecf4e635fc2b31331c8f56478e73fec9e146e8b4547585e635703160a3d252a6a65b8f855834aebc2c3408eb5789630cc4 languageName: node linkType: hard -"p-timeout@npm:^3.1.0": - version: 3.2.0 - resolution: "p-timeout@npm:3.2.0" - dependencies: - p-finally: ^1.0.0 - checksum: 3dd0eaa048780a6f23e5855df3dd45c7beacff1f820476c1d0d1bcd6648e3298752ba2c877aa1c92f6453c7dd23faaf13d9f5149fc14c0598a142e2c5e8d649c +"p-map@npm:^6.0.0": + version: 6.0.0 + resolution: "p-map@npm:6.0.0" + checksum: 3fcfccf464d0f4a9a8c8a2d48f3f0933bdbdb0628158c1fb3c240dc0bbf20c0cf8115dea57300aa82baefff7b9bd1b9daf13a11a6578f15a629fc5bda78d780d languageName: node linkType: hard "p-timeout@npm:^5.0.2": version: 5.1.0 resolution: "p-timeout@npm:5.1.0" - checksum: f5cd4e17301ff1ff1d8dbf2817df0ad88c6bba99349fc24d8d181827176ad4f8aca649190b8a5b1a428dfd6ddc091af4606835d3e0cb0656e04045da5c9e270c + checksum: 1b026cf9d5878c64bec4341ca9cda8ec6b8b3aea8a57885ca0fe2b35753a20d767fb6f9d3aa41e1252f42bc95432c05ea33b6b18f271fb10bfb0789591850a41 languageName: node linkType: hard "p-try@npm:^1.0.0": version: 1.0.0 resolution: "p-try@npm:1.0.0" - checksum: 3b5303f77eb7722144154288bfd96f799f8ff3e2b2b39330efe38db5dd359e4fb27012464cd85cb0a76e9b7edd1b443568cb3192c22e7cffc34989df0bafd605 + checksum: 757ba31de5819502b80c447826fac8be5f16d3cb4fbf9bc8bc4971dba0682e84ac33e4b24176ca7058c69e29f64f34d8d9e9b08e873b7b7bb0aa89d620fa224a languageName: node linkType: hard "p-try@npm:^2.0.0": version: 2.2.0 resolution: "p-try@npm:2.2.0" - checksum: f8a8e9a7693659383f06aec604ad5ead237c7a261c18048a6e1b5b85a5f8a067e469aa24f5bc009b991ea3b058a87f5065ef4176793a200d4917349881216cae + checksum: c36c19907734c904b16994e6535b02c36c2224d433e01a2f1ab777237f4d86e6289fd5fd464850491e940379d4606ed850c03e0f9ab600b0ebddb511312e177f + languageName: node + linkType: hard + +"package-config@npm:^5.0.0": + version: 5.0.0 + resolution: "package-config@npm:5.0.0" + dependencies: + find-up-simple: "npm:^1.0.0" + load-json-file: "npm:^7.0.1" + checksum: f6c48930700b73a41d839bf2898b628d23665827488a4f34aed2d05e4a99d7a70a70ada115c3546765947fbc8accff94c0779da21ea084b25df47cb774531eeb languageName: node linkType: hard @@ -7131,8 +7434,8 @@ __metadata: version: 1.0.1 resolution: "parent-module@npm:1.0.1" dependencies: - callsites: ^3.0.0 - checksum: 6ba8b255145cae9470cf5551eb74be2d22281587af787a2626683a6c20fbb464978784661478dd2a3f1dad74d1e802d403e1b03c1a31fab310259eec8ac560ff + callsites: "npm:^3.0.0" + checksum: c63d6e80000d4babd11978e0d3fee386ca7752a02b035fd2435960ffaa7219dc42146f07069fb65e6e8bf1caef89daf9af7535a39bddf354d78bf50d8294f556 languageName: node linkType: hard @@ -7140,8 +7443,8 @@ __metadata: version: 2.0.0 resolution: "parent-module@npm:2.0.0" dependencies: - callsites: ^3.1.0 - checksum: f131f13d687a938556a01033561fb1b274b39921eb4425c7a691f0d91dcfbe9b19759c2b8d425a3ee7c8a46874e57fa418a690643880c3c7c56827aba12f78dd + callsites: "npm:^3.1.0" + checksum: e4c5e34102c709df1932e1065dee53764fbd869f5a673beb8c3b4bcbbd4a7be16e3595f8846b24f52a77b9e96d8d499e68736ec690b108e55d95a5315f41e073 languageName: node linkType: hard @@ -7149,9 +7452,9 @@ __metadata: version: 4.0.0 resolution: "parse-json@npm:4.0.0" dependencies: - error-ex: ^1.3.1 - json-parse-better-errors: ^1.0.1 - checksum: 0fe227d410a61090c247e34fa210552b834613c006c2c64d9a05cfe9e89cf8b4246d1246b1a99524b53b313e9ac024438d0680f67e33eaed7e6f38db64cfe7b5 + error-ex: "npm:^1.3.1" + json-parse-better-errors: "npm:^1.0.1" + checksum: 8d80790b772ccb1bcea4e09e2697555e519d83d04a77c2b4237389b813f82898943a93ffff7d0d2406203bdd0c30dcf95b1661e3a53f83d0e417f053957bef32 languageName: node linkType: hard @@ -7159,88 +7462,98 @@ __metadata: version: 5.2.0 resolution: "parse-json@npm:5.2.0" dependencies: - "@babel/code-frame": ^7.0.0 - error-ex: ^1.3.1 - json-parse-even-better-errors: ^2.3.0 - lines-and-columns: ^1.1.6 - checksum: 62085b17d64da57f40f6afc2ac1f4d95def18c4323577e1eced571db75d9ab59b297d1d10582920f84b15985cbfc6b6d450ccbf317644cfa176f3ed982ad87e2 + "@babel/code-frame": "npm:^7.0.0" + error-ex: "npm:^1.3.1" + json-parse-even-better-errors: "npm:^2.3.0" + lines-and-columns: "npm:^1.1.6" + checksum: 77947f2253005be7a12d858aedbafa09c9ae39eb4863adf330f7b416ca4f4a08132e453e08de2db46459256fb66afaac5ee758b44fe6541b7cdaf9d252e59585 languageName: node linkType: hard "parse-ms@npm:^2.1.0": version: 2.1.0 resolution: "parse-ms@npm:2.1.0" - checksum: d5c66c76cca8df5bd0574e2d11b9c3752893b59b466e74308d4a2f09760dc5436a1633f549cad300fc8c3c19154d14959a3b8333d3b2f7bd75898fe18149d564 + checksum: 9c5c0a95c6267c84085685556a6e102ee806c3147ec11cbb9b98e35998eb4a48a757bd6ea7bfd930062de65909a33d24985055b4394e70aa0b65ee40cef16911 languageName: node linkType: hard "parse-ms@npm:^3.0.0": version: 3.0.0 resolution: "parse-ms@npm:3.0.0" - checksum: fc602bba093835562321a67a9d6c8c9687ca4f26a09459a77e07ebd7efddd1a5766725ec60eb0c83a2abe67f7a23808f7deb1c1226727776eaf7f9607ae09db2 + checksum: 056b4a32a9d3749f3f4cfffefb45c45540491deaa8e1d8ad43c2ddde7ba04edd076bd1b298f521238bb5fb084a9b2c4a2ebb78aefa651afbc4c2b0af4232fc54 languageName: node linkType: hard "parse-passwd@npm:^1.0.0": version: 1.0.0 resolution: "parse-passwd@npm:1.0.0" - checksum: 4e55e0231d58f828a41d0f1da2bf2ff7bcef8f4cb6146e69d16ce499190de58b06199e6bd9b17fbf0d4d8aef9052099cdf8c4f13a6294b1a522e8e958073066e + checksum: 1c05c05f95f184ab9ca604841d78e4fe3294d46b8e3641d305dcc28e930da0e14e602dbda9f3811cd48df5b0e2e27dbef7357bf0d7c40e41b18c11c3a8b8d17b languageName: node linkType: hard "parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" - checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 + checksum: 90dd4760d6f6174adb9f20cf0965ae12e23879b5f5464f38e92fce8073354341e4b3b76fa3d878351efe7d01e617121955284cfd002ab087fba1a0726ec0b4f5 languageName: node linkType: hard "path-exists@npm:^3.0.0": version: 3.0.0 resolution: "path-exists@npm:3.0.0" - checksum: 96e92643aa34b4b28d0de1cd2eba52a1c5313a90c6542d03f62750d82480e20bfa62bc865d5cfc6165f5fcd5aeb0851043c40a39be5989646f223300021bae0a + checksum: 17d6a5664bc0a11d48e2b2127d28a0e58822c6740bde30403f08013da599182289c56518bec89407e3f31d3c2b6b296a4220bc3f867f0911fee6952208b04167 languageName: node linkType: hard "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" - checksum: 505807199dfb7c50737b057dd8d351b82c033029ab94cb10a657609e00c1bc53b951cfdbccab8de04c5584d5eff31128ce6afd3db79281874a5ef2adbba55ed1 - languageName: node - linkType: hard - -"path-exists@npm:^5.0.0": - version: 5.0.0 - resolution: "path-exists@npm:5.0.0" - checksum: 8ca842868cab09423994596eb2c5ec2a971c17d1a3cb36dbf060592c730c725cd524b9067d7d2a1e031fef9ba7bd2ac6dc5ec9fb92aa693265f7be3987045254 + checksum: 8c0bd3f5238188197dc78dced15207a4716c51cc4e3624c44fc97acf69558f5ebb9a2afff486fe1b4ee148e0c133e96c5e11a9aa5c48a3006e3467da070e5e1b languageName: node linkType: hard "path-is-absolute@npm:^1.0.0": version: 1.0.1 resolution: "path-is-absolute@npm:1.0.1" - checksum: 060840f92cf8effa293bcc1bea81281bd7d363731d214cbe5c227df207c34cd727430f70c6037b5159c8a870b9157cba65e775446b0ab06fd5ecc7e54615a3b8 + checksum: 127da03c82172a2a50099cddbf02510c1791fc2cc5f7713ddb613a56838db1e8168b121a920079d052e0936c23005562059756d653b7c544c53185efe53be078 languageName: node linkType: hard -"path-key@npm:^3.0.0, path-key@npm:^3.1.0": +"path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" - checksum: 55cd7a9dd4b343412a8386a743f9c746ef196e57c823d90ca3ab917f90ab9f13dd0ded27252ba49dbdfcab2b091d998bc446f6220cd3cea65db407502a740020 + checksum: 748c43efd5a569c039d7a00a03b58eecd1d75f3999f5a28303d75f521288df4823bc057d8784eb72358b2895a05f29a070bc9f1f17d28226cc4e62494cc58c4c + languageName: node + linkType: hard + +"path-key@npm:^4.0.0": + version: 4.0.0 + resolution: "path-key@npm:4.0.0" + checksum: 794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3 languageName: node linkType: hard "path-parse@npm:^1.0.6, path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" - checksum: 49abf3d81115642938a8700ec580da6e830dde670be21893c62f4e10bd7dd4c3742ddc603fe24f898cba7eb0c6bc1777f8d9ac14185d34540c6d4d80cd9cae8a + checksum: 11ce261f9d294cc7a58d6a574b7f1b935842355ec66fba3c3fd79e0f036462eaf07d0aa95bb74ff432f9afef97ce1926c720988c6a7451d8a584930ae7de86e1 + languageName: node + linkType: hard + +"path-scurry@npm:^1.10.1": + version: 1.10.1 + resolution: "path-scurry@npm:1.10.1" + dependencies: + lru-cache: "npm:^9.1.1 || ^10.0.0" + minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" + checksum: e5dc78a7348d25eec61ab166317e9e9c7b46818aa2c2b9006c507a6ff48c672d011292d9662527213e558f5652ce0afcc788663a061d8b59ab495681840c0c1e languageName: node linkType: hard "path-to-regexp@npm:0.1.7": version: 0.1.7 resolution: "path-to-regexp@npm:0.1.7" - checksum: 69a14ea24db543e8b0f4353305c5eac6907917031340e5a8b37df688e52accd09e3cebfe1660b70d76b6bd89152f52183f28c74813dbf454ba1a01c82a38abce + checksum: 50a1ddb1af41a9e68bd67ca8e331a705899d16fb720a1ea3a41e310480948387daf603abb14d7b0826c58f10146d49050a1291ba6a82b78a382d1c02c0b8f905 languageName: node linkType: hard @@ -7248,74 +7561,95 @@ __metadata: version: 3.0.0 resolution: "path-type@npm:3.0.0" dependencies: - pify: ^3.0.0 - checksum: 735b35e256bad181f38fa021033b1c33cfbe62ead42bb2222b56c210e42938eecb272ae1949f3b6db4ac39597a61b44edd8384623ec4d79bfdc9a9c0f12537a6 + pify: "npm:^3.0.0" + checksum: 1332c632f1cac15790ebab8dd729b67ba04fc96f81647496feb1c2975d862d046f41e4b975dbd893048999b2cc90721f72924ad820acc58c78507ba7141a8e56 languageName: node linkType: hard "path-type@npm:^4.0.0": version: 4.0.0 resolution: "path-type@npm:4.0.0" - checksum: 5b1e2daa247062061325b8fdbfd1fb56dde0a448fb1455453276ea18c60685bdad23a445dc148cf87bc216be1573357509b7d4060494a6fd768c7efad833ee45 + checksum: 666f6973f332f27581371efaf303fd6c272cc43c2057b37aa99e3643158c7e4b2626549555d88626e99ea9e046f82f32e41bbde5f1508547e9a11b149b52387c languageName: node linkType: hard -"peek-readable@npm:^5.0.0": +"path-type@npm:^5.0.0": version: 5.0.0 - resolution: "peek-readable@npm:5.0.0" - checksum: bef5ceb50586eb42e14efba274ac57ffe97f0ed272df9239ce029f688f495d9bf74b2886fa27847c706a9db33acda4b7d23bbd09a2d21eb4c2a54da915117414 + resolution: "path-type@npm:5.0.0" + checksum: e8f4b15111bf483900c75609e5e74e3fcb79f2ddb73e41470028fcd3e4b5162ec65da9907be077ee5012c18801ff7fffb35f9f37a077f3f81d85a0b7d6578efd languageName: node linkType: hard -"pend@npm:~1.2.0": - version: 1.2.0 - resolution: "pend@npm:1.2.0" - checksum: 6c72f5243303d9c60bd98e6446ba7d30ae29e3d56fdb6fae8767e8ba6386f33ee284c97efe3230a0d0217e2b1723b8ab490b1bbf34fcbb2180dbc8a9de47850d +"peek-readable@npm:^5.0.0": + version: 5.0.0 + resolution: "peek-readable@npm:5.0.0" + checksum: 060aece3a907a157b4839aa923b61b664b59cac7296dc8d8e0ddcc39065a4f1e328dd2f171c8a49e869aabc6e076a1be59f939183fb0ababc81f3c870006d672 languageName: node linkType: hard "picocolors@npm:^1.0.0": version: 1.0.0 resolution: "picocolors@npm:1.0.0" - checksum: a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 + checksum: 20a5b249e331c14479d94ec6817a182fd7a5680debae82705747b2db7ec50009a5f6648d0621c561b0572703f84dbef0858abcbd5856d3c5511426afcb1961f7 languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.3.1": +"picomatch@npm:^2.2.2, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" - checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf + checksum: 26c02b8d06f03206fc2ab8d16f19960f2ff9e81a658f831ecb656d8f17d9edc799e8364b1f4a7873e89d9702dff96204be0fa26fe4181f6843f040f819dac4be + languageName: node + linkType: hard + +"picomatch@npm:^3.0.1": + version: 3.0.1 + resolution: "picomatch@npm:3.0.1" + checksum: 70ec738569f1864658378b7abdab8939d15dae0718c1df994eae3346fd33daf6a3c1ff4e0c1a0cd1e2c0319130985b63a2cff34d192f2f2acbb78aca76111736 languageName: node linkType: hard "pify@npm:^2.3.0": version: 2.3.0 resolution: "pify@npm:2.3.0" - checksum: 9503aaeaf4577acc58642ad1d25c45c6d90288596238fb68f82811c08104c800e5a7870398e9f015d82b44ecbcbef3dc3d4251a1cbb582f6e5959fe09884b2ba + checksum: 551ff8ab830b1052633f59cb8adc9ae8407a436e06b4a9718bcb27dc5844b83d535c3a8512b388b6062af65a98c49bdc0dd523d8b2617b188f7c8fee457158dc languageName: node linkType: hard "pify@npm:^3.0.0": version: 3.0.0 resolution: "pify@npm:3.0.0" - checksum: 6cdcbc3567d5c412450c53261a3f10991665d660961e06605decf4544a61a97a54fefe70a68d5c37080ff9d6f4cf51444c90198d1ba9f9309a6c0d6e9f5c4fde - languageName: node - linkType: hard - -"pkg-conf@npm:^4.0.0": - version: 4.0.0 - resolution: "pkg-conf@npm:4.0.0" - dependencies: - find-up: ^6.0.0 - load-json-file: ^7.0.0 - checksum: 6da0c064a74f6c7ae80d7d68c5853e14f7e762a2a80c6ca9e0aa827002b90b69c86fefe3bac830b10a6f1739e7f96a1f728637f2a141e50b0fdafe92a2c3eab6 + checksum: fead19ed9d801f1b1fcd0638a1ac53eabbb0945bf615f2f8806a8b646565a04a1b0e7ef115c951d225f042cca388fdc1cd3add46d10d1ed6951c20bd2998af10 languageName: node linkType: hard "platform@npm:^1.3.3": version: 1.3.6 resolution: "platform@npm:1.3.6" - checksum: 6f472a09c61d418c7e26c1c16d0bdc029549d512dbec6526216a1e59ec68100d07007d0097dcba69dddad883d6f2a83361b4bdfe0094a3d9a2af24158643d85e + checksum: 69f2eb692e15f1a343dd0d9347babd9ca933824c8673096be746ff66f99f2bdc909fadd8609076132e6ec768349080babb7362299f2a7f885b98f1254ae6224b + languageName: node + linkType: hard + +"playwright-core@npm:1.40.1": + version: 1.40.1 + resolution: "playwright-core@npm:1.40.1" + bin: + playwright-core: cli.js + checksum: 56c283012974982313a6ae583b975ee4af76d52059fb9a25d9cc616a11224685ec64682b391910c795d2b12d2ab5c7eec31124722c75c0b1703a76ac9b6fd1c2 + languageName: node + linkType: hard + +"playwright@npm:1.40.1": + version: 1.40.1 + resolution: "playwright@npm:1.40.1" + dependencies: + fsevents: "npm:2.3.2" + playwright-core: "npm:1.40.1" + dependenciesMeta: + fsevents: + optional: true + bin: + playwright: cli.js + checksum: 5dae164d1f69162da8d7eee52da651296fb885c76a8b36049f216975c751a0a826ff05795a1c0902dc0bd193fe606ae17d5def655f4cbcccb8d8b71afb74b950 languageName: node linkType: hard @@ -7323,15 +7657,15 @@ __metadata: version: 5.1.0 resolution: "plur@npm:5.1.0" dependencies: - irregular-plurals: ^3.3.0 - checksum: 57e400dc4b926768fb0abab7f8688fe17e85673712134546e7beaaee188bae7e0504976e847d7e41d0d6103ff2fd61204095f03c2a45de19a8bad15aecb45cc1 + irregular-plurals: "npm:^3.3.0" + checksum: 26bb622b8545fcfd47bbf56fbcca66c08693708a232e403fa3589e00003c56c14231ac57c7588ca5db83ef4be1f61383402c4ea954000768f779f8aef6eb6da8 languageName: node linkType: hard "pluralize@npm:^8.0.0": version: 8.0.0 resolution: "pluralize@npm:8.0.0" - checksum: 08931d4a6a4a5561a7f94f67a31c17e6632cb21e459ab3ff4f6f629d9a822984cf8afef2311d2005fbea5d7ef26016ebb090db008e2d8bce39d0a9a9d218736e + checksum: 2044cfc34b2e8c88b73379ea4a36fc577db04f651c2909041b054c981cd863dd5373ebd030123ab058d194ae615d3a97cfdac653991e499d10caf592e8b3dc33 languageName: node linkType: hard @@ -7339,89 +7673,95 @@ __metadata: version: 2.0.1 resolution: "postcss-values-parser@npm:2.0.1" dependencies: - flatten: ^1.0.2 - indexes-of: ^1.0.1 - uniq: ^1.0.1 - checksum: 050877880937e15af8d18bf48902e547e2123d7cc32c1f215b392642bc5e2598a87a341995d62f38e450aab4186b8afeb2c9541934806d458ad8b117020b2ebf + flatten: "npm:^1.0.2" + indexes-of: "npm:^1.0.1" + uniq: "npm:^1.0.1" + checksum: 2ac07c134abc1c1f79f3188afa028db4b0f58421b3eb13b8ad5e3c79542735810d70b24a49d274237f9315b13d970ce81790b3c5a676543e0717228a66f9e703 languageName: node linkType: hard -"postcss-values-parser@npm:^5.0.0": - version: 5.0.0 - resolution: "postcss-values-parser@npm:5.0.0" +"postcss-values-parser@npm:^6.0.2": + version: 6.0.2 + resolution: "postcss-values-parser@npm:6.0.2" dependencies: - color-name: ^1.1.4 - is-url-superb: ^4.0.0 - quote-unquote: ^1.0.0 + color-name: "npm:^1.1.4" + is-url-superb: "npm:^4.0.0" + quote-unquote: "npm:^1.0.0" peerDependencies: - postcss: ^8.0.9 - checksum: d45bde8606fdb721cf7fc1f971bc635b0da156fd75a1b706b0503af00416d5699afc477d028781229eabab56fa543b17f15b5b13807cfb8c5ba0e442281eb463 + postcss: ^8.2.9 + checksum: 633b8bc7c46f7b6e2b1cb1f33aa0222a5cacb7f485eb41e6f902b5f37ab9884cd8e7e7b0706afb7e3c7766d85096b59e65f59a1eaefac55e2fc952a24f23bcb8 languageName: node linkType: hard -"postcss@npm:^8.1.7, postcss@npm:^8.4.6": - version: 8.4.21 - resolution: "postcss@npm:8.4.21" +"postcss@npm:^8.1.7, postcss@npm:^8.4.23": + version: 8.4.33 + resolution: "postcss@npm:8.4.33" dependencies: - nanoid: ^3.3.4 - picocolors: ^1.0.0 - source-map-js: ^1.0.2 - checksum: e39ac60ccd1542d4f9d93d894048aac0d686b3bb38e927d8386005718e6793dbbb46930f0a523fe382f1bbd843c6d980aaea791252bf5e176180e5a4336d9679 + nanoid: "npm:^3.3.7" + picocolors: "npm:^1.0.0" + source-map-js: "npm:^1.0.2" + checksum: 16eda83458fcd8a91bece287b5920c7f57164c3ea293e6c80d0ea71ce7843007bcd8592260a5160b9a7f02693e6ac93e2495b02d8c7596d3f3f72c1447e3ba79 languageName: node linkType: hard -"precinct@npm:^8.0.0, precinct@npm:^8.1.0": +"precinct@npm:^8.1.0": version: 8.3.1 resolution: "precinct@npm:8.3.1" dependencies: - commander: ^2.20.3 - debug: ^4.3.3 - detective-amd: ^3.1.0 - detective-cjs: ^3.1.1 - detective-es6: ^2.2.1 - detective-less: ^1.0.2 - detective-postcss: ^4.0.0 - detective-sass: ^3.0.1 - detective-scss: ^2.0.1 - detective-stylus: ^1.0.0 - detective-typescript: ^7.0.0 - module-definition: ^3.3.1 - node-source-walk: ^4.2.0 + commander: "npm:^2.20.3" + debug: "npm:^4.3.3" + detective-amd: "npm:^3.1.0" + detective-cjs: "npm:^3.1.1" + detective-es6: "npm:^2.2.1" + detective-less: "npm:^1.0.2" + detective-postcss: "npm:^4.0.0" + detective-sass: "npm:^3.0.1" + detective-scss: "npm:^2.0.1" + detective-stylus: "npm:^1.0.0" + detective-typescript: "npm:^7.0.0" + module-definition: "npm:^3.3.1" + node-source-walk: "npm:^4.2.0" + bin: + precinct: bin/cli.js + checksum: 90ef84805e3fd704a198ca4e6688752b50882aef4afb8914d3616916a019334195474f6d637697f4fabc2fc3af7a1c8d2853390d4f5a45ca523f26e1763aa139 + languageName: node + linkType: hard + +"precinct@npm:^9.0.0": + version: 9.2.1 + resolution: "precinct@npm:9.2.1" + dependencies: + "@dependents/detective-less": "npm:^3.0.1" + commander: "npm:^9.5.0" + detective-amd: "npm:^4.1.0" + detective-cjs: "npm:^4.1.0" + detective-es6: "npm:^3.0.1" + detective-postcss: "npm:^6.1.1" + detective-sass: "npm:^4.1.1" + detective-scss: "npm:^3.0.1" + detective-stylus: "npm:^3.0.0" + detective-typescript: "npm:^9.1.1" + module-definition: "npm:^4.1.0" + node-source-walk: "npm:^5.0.1" bin: precinct: bin/cli.js - checksum: 16ba57e545fc53481b3a194f9d7843cefd562ce5e847280355eed360ca4c55def4d03d501776fb49fdf79bfe84a03ec6138003d8387c0426f6a68e1931688399 + checksum: 16b26755613b61c78641570accb6902531a93304f5f879f47f5149c59057d72871a355693780082b24d09c9aa5c9431fc562a6055c0e84c63af3ef8c9c58bbf7 languageName: node linkType: hard "prelude-ls@npm:^1.2.1": version: 1.2.1 resolution: "prelude-ls@npm:1.2.1" - checksum: cd192ec0d0a8e4c6da3bb80e4f62afe336df3f76271ac6deb0e6a36187133b6073a19e9727a1ff108cd8b9982e4768850d413baa71214dd80c7979617dca827a - languageName: node - linkType: hard - -"prelude-ls@npm:~1.1.2": - version: 1.1.2 - resolution: "prelude-ls@npm:1.1.2" - checksum: c4867c87488e4a0c233e158e4d0d5565b609b105d75e4c05dc760840475f06b731332eb93cc8c9cecb840aa8ec323ca3c9a56ad7820ad2e63f0261dadcb154e4 - languageName: node - linkType: hard - -"prettier-linter-helpers@npm:^1.0.0": - version: 1.0.0 - resolution: "prettier-linter-helpers@npm:1.0.0" - dependencies: - fast-diff: ^1.1.2 - checksum: 00ce8011cf6430158d27f9c92cfea0a7699405633f7f1d4a45f07e21bf78e99895911cbcdc3853db3a824201a7c745bd49bfea8abd5fb9883e765a90f74f8392 + checksum: b00d617431e7886c520a6f498a2e14c75ec58f6d93ba48c3b639cf241b54232d90daa05d83a9e9b9fef6baa63cb7e1e4602c2372fea5bc169668401eb127d0cd languageName: node linkType: hard -"prettier@npm:^2.8.2": - version: 2.8.2 - resolution: "prettier@npm:2.8.2" +"prettier@npm:^3.1.1": + version: 3.1.1 + resolution: "prettier@npm:3.1.1" bin: - prettier: bin-prettier.js - checksum: 740c56c2128d587d656ea1dde9bc9c3503dfc94db4f3ac387259215eeb2e216680bdad9d18a0c9feecc6b42cfa188d6fa777df4c36c1d00cedd4199074fbfbd2 + prettier: bin/prettier.cjs + checksum: facc944ba20e194ff4db765e830ffbcb642803381f0d2033ed397e79904fa4ccc877dc25ad68f42d36985c01d051c990ca1b905fb83d2d7d65fe69e4386fa1a3 languageName: node linkType: hard @@ -7429,8 +7769,8 @@ __metadata: version: 7.0.1 resolution: "pretty-ms@npm:7.0.1" dependencies: - parse-ms: ^2.1.0 - checksum: d76c4920283b48be91f1d3797a2ce4bd51187d58d2a609ae993c028f73c92d16439449d857af57ccad91ae3a38b30c87307f5589749a056102ebb494c686957e + parse-ms: "npm:^2.1.0" + checksum: 069aec9d939e7903846b3db53b020bed92e3dc5909e0fef09ec8ab104a0b7f9a846605a1633c60af900d288582fb333f6f30469e59d6487a2330301fad35a89c languageName: node linkType: hard @@ -7438,118 +7778,63 @@ __metadata: version: 8.0.0 resolution: "pretty-ms@npm:8.0.0" dependencies: - parse-ms: ^3.0.0 - checksum: b7d2a8182887af0e5ab93f9df331f10db9b8eda86855e2de115eb01a6c501bde5631a8813b1b0abdd7d045e79b08ae875369a8fd279a3dacd6d9e572bdd3bfa6 - languageName: node - linkType: hard - -"process-nextick-args@npm:~2.0.0": - version: 2.0.1 - resolution: "process-nextick-args@npm:2.0.1" - checksum: 1d38588e520dab7cea67cbbe2efdd86a10cc7a074c09657635e34f035277b59fbb57d09d8638346bf7090f8e8ebc070c96fa5fd183b777fff4f5edff5e9466cf + parse-ms: "npm:^3.0.0" + checksum: e960d633ecca45445cf5c6dffc0f5e4bef6744c92449ab0e8c6c704800675ab71e181c5e02ece5265e02137a33e313d3f3e355fbf8ea30b4b5b23de423329f8d languageName: node linkType: hard -"progress@npm:2.0.3": - version: 2.0.3 - resolution: "progress@npm:2.0.3" - checksum: f67403fe7b34912148d9252cb7481266a354bd99ce82c835f79070643bb3c6583d10dbcfda4d41e04bbc1d8437e9af0fb1e1f2135727878f5308682a579429b7 +"proc-log@npm:^3.0.0": + version: 3.0.0 + resolution: "proc-log@npm:3.0.0" + checksum: f66430e4ff947dbb996058f6fd22de2c66612ae1a89b097744e17fb18a4e8e7a86db99eda52ccf15e53f00b63f4ec0b0911581ff2aac0355b625c8eac509b0dc languageName: node linkType: hard -"promise-inflight@npm:^1.0.1": - version: 1.0.1 - resolution: "promise-inflight@npm:1.0.1" - checksum: 22749483091d2c594261517f4f80e05226d4d5ecc1fc917e1886929da56e22b5718b7f2a75f3807e7a7d471bc3be2907fe92e6e8f373ddf5c64bae35b5af3981 +"process-nextick-args@npm:~2.0.0": + version: 2.0.1 + resolution: "process-nextick-args@npm:2.0.1" + checksum: bec089239487833d46b59d80327a1605e1c5287eaad770a291add7f45fda1bb5e28b38e0e061add0a1d0ee0984788ce74fa394d345eed1c420cacf392c554367 languageName: node linkType: hard "promise-retry@npm:^2.0.1": version: 2.0.1 - resolution: "promise-retry@npm:2.0.1" - dependencies: - err-code: ^2.0.2 - retry: ^0.12.0 - checksum: f96a3f6d90b92b568a26f71e966cbbc0f63ab85ea6ff6c81284dc869b41510e6cdef99b6b65f9030f0db422bf7c96652a3fff9f2e8fb4a0f069d8f4430359429 - languageName: node - linkType: hard - -"proxy-addr@npm:~2.0.7": - version: 2.0.7 - resolution: "proxy-addr@npm:2.0.7" - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - checksum: 29c6990ce9364648255454842f06f8c46fcd124d3e6d7c5066df44662de63cdc0bad032e9bf5a3d653ff72141cc7b6019873d685708ac8210c30458ad99f2b74 - languageName: node - linkType: hard - -"proxy-from-env@npm:1.1.0": - version: 1.1.0 - resolution: "proxy-from-env@npm:1.1.0" - checksum: ed7fcc2ba0a33404958e34d95d18638249a68c430e30fcb6c478497d72739ba64ce9810a24f53a7d921d0c065e5b78e3822759800698167256b04659366ca4d4 - languageName: node - linkType: hard - -"pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" - dependencies: - end-of-stream: ^1.1.0 - once: ^1.3.1 - checksum: e42e9229fba14732593a718b04cb5e1cfef8254544870997e0ecd9732b189a48e1256e4e5478148ecb47c8511dca2b09eae56b4d0aad8009e6fac8072923cfc9 - languageName: node - linkType: hard - -"punycode@npm:^2.1.0": - version: 2.1.1 - resolution: "punycode@npm:2.1.1" - checksum: 823bf443c6dd14f669984dea25757b37993f67e8d94698996064035edd43bed8a5a17a9f12e439c2b35df1078c6bec05a6c86e336209eb1061e8025c481168e8 + resolution: "promise-retry@npm:2.0.1" + dependencies: + err-code: "npm:^2.0.2" + retry: "npm:^0.12.0" + checksum: 9c7045a1a2928094b5b9b15336dcd2a7b1c052f674550df63cc3f36cd44028e5080448175b6f6ca32b642de81150f5e7b1a98b728f15cb069f2dd60ac2616b96 languageName: node linkType: hard -"puppeteer-core@npm:19.5.0": - version: 19.5.0 - resolution: "puppeteer-core@npm:19.5.0" +"proxy-addr@npm:~2.0.7": + version: 2.0.7 + resolution: "proxy-addr@npm:2.0.7" dependencies: - cross-fetch: 3.1.5 - debug: 4.3.4 - devtools-protocol: 0.0.1068969 - extract-zip: 2.0.1 - https-proxy-agent: 5.0.1 - proxy-from-env: 1.1.0 - rimraf: 3.0.2 - tar-fs: 2.1.1 - unbzip2-stream: 1.4.3 - ws: 8.11.0 - checksum: 0cdac5c54dc9933f4e819ed57ecaa7dc93861937606ba1fab87365c4935a4709543f472e4c9f7eb3c09bf414dceee61acf41c983ab000f06bcf7339615082cd1 + forwarded: "npm:0.2.0" + ipaddr.js: "npm:1.9.1" + checksum: c3eed999781a35f7fd935f398b6d8920b6fb00bbc14287bc6de78128ccc1a02c89b95b56742bf7cf0362cc333c61d138532049c7dedc7a328ef13343eff81210 languageName: node linkType: hard -"puppeteer@npm:^19.5.0": - version: 19.5.0 - resolution: "puppeteer@npm:19.5.0" - dependencies: - cosmiconfig: 8.0.0 - https-proxy-agent: 5.0.1 - progress: 2.0.3 - proxy-from-env: 1.1.0 - puppeteer-core: 19.5.0 - checksum: 4193e7e5f6b8bb42fae823f836e37058410d14fd92e384fcd1a361dbeab9a753065f97bcecad29bdd5e574404b75ccaf26e8a7598514c8e36265a3b1d9663eec +"punycode@npm:^2.1.0": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 languageName: node linkType: hard -"pure-rand@npm:^5.0.2": - version: 5.0.5 - resolution: "pure-rand@npm:5.0.5" - checksum: 824b906f7f66695c15ed9a898ff650e925723515e999de0360b0726ebad924ce41a74cc2ac60409dc6c55f5781008855f32ecd0fe0a1f40fbce293d48bd11dd1 +"pure-rand@npm:^6.0.0": + version: 6.0.4 + resolution: "pure-rand@npm:6.0.4" + checksum: 0fe7b12f25b10ea5b804598a6f37e4bcf645d2be6d44fe963741f014bf0095bdb6ff525106d6da6e76addc8142358fd380f1a9b8c62ea4d5516bf26a96a37c95 languageName: node linkType: hard "q@npm:^1.5.1": version: 1.5.1 resolution: "q@npm:1.5.1" - checksum: 147baa93c805bc1200ed698bdf9c72e9e42c05f96d007e33a558b5fdfd63e5ea130e99313f28efc1783e90e6bdb4e48b67a36fcc026b7b09202437ae88a1fb12 + checksum: 7855fbdba126cb7e92ef3a16b47ba998c0786ec7fface236e3eb0135b65df36429d91a86b1fff3ab0927b4ac4ee88a2c44527c7c3b8e2a37efbec9fe34803df4 languageName: node linkType: hard @@ -7557,36 +7842,29 @@ __metadata: version: 6.11.0 resolution: "qs@npm:6.11.0" dependencies: - side-channel: ^1.0.4 - checksum: 6e1f29dd5385f7488ec74ac7b6c92f4d09a90408882d0c208414a34dd33badc1a621019d4c799a3df15ab9b1d0292f97c1dd71dc7c045e69f81a8064e5af7297 + side-channel: "npm:^1.0.4" + checksum: 4e4875e4d7c7c31c233d07a448e7e4650f456178b9dd3766b7cfa13158fdb24ecb8c4f059fa91e820dc6ab9f2d243721d071c9c0378892dcdad86e9e9a27c68f languageName: node linkType: hard "queue-microtask@npm:^1.2.2": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" - checksum: b676f8c040cdc5b12723ad2f91414d267605b26419d5c821ff03befa817ddd10e238d22b25d604920340fd73efd8ba795465a0377c4adf45a4a41e4234e42dc4 + checksum: 900a93d3cdae3acd7d16f642c29a642aea32c2026446151f0778c62ac089d4b8e6c986811076e1ae180a694cedf077d453a11b58ff0a865629a4f82ab558e102 languageName: node linkType: hard "quick-lru@npm:^4.0.1": version: 4.0.1 resolution: "quick-lru@npm:4.0.1" - checksum: bea46e1abfaa07023e047d3cf1716a06172c4947886c053ede5c50321893711577cb6119360f810cc3ffcd70c4d7db4069c3cee876b358ceff8596e062bd1154 - languageName: node - linkType: hard - -"quick-lru@npm:^5.1.1": - version: 5.1.1 - resolution: "quick-lru@npm:5.1.1" - checksum: a516faa25574be7947969883e6068dbe4aa19e8ef8e8e0fd96cddd6d36485e9106d85c0041a27153286b0770b381328f4072aa40d3b18a19f5f7d2b78b94b5ed + checksum: f9b1596fa7595a35c2f9d913ac312fede13d37dc8a747a51557ab36e11ce113bbe88ef4c0154968845559a7709cb6a7e7cbe75f7972182451cd45e7f057a334d languageName: node linkType: hard "quote-unquote@npm:^1.0.0": version: 1.0.0 resolution: "quote-unquote@npm:1.0.0" - checksum: 955a2ead534f5b6a3f8d4dc5a4b95ac6468213d3fb11f8c1592a0a56345c45a3d14d5ca04d3de2bc9891493fcac38c03dfa91c48a6159aef50124e9c5afcea49 + checksum: eba86bb7f68ada486f5608c5c71cc155235f0408b8a0a180436cdf2457ae86f56a17de6b0bc5a1b7ae5f27735b3b789662cdf7f3b8195ac816cd0289085129ec languageName: node linkType: hard @@ -7594,15 +7872,15 @@ __metadata: version: 2.1.0 resolution: "randombytes@npm:2.1.0" dependencies: - safe-buffer: ^5.1.0 - checksum: d779499376bd4cbb435ef3ab9a957006c8682f343f14089ed5f27764e4645114196e75b7f6abf1cbd84fd247c0cb0651698444df8c9bf30e62120fbbc52269d6 + safe-buffer: "npm:^5.1.0" + checksum: 50395efda7a8c94f5dffab564f9ff89736064d32addf0cc7e8bf5e4166f09f8ded7a0849ca6c2d2a59478f7d90f78f20d8048bca3cdf8be09d8e8a10790388f3 languageName: node linkType: hard "range-parser@npm:~1.2.1": version: 1.2.1 resolution: "range-parser@npm:1.2.1" - checksum: 0a268d4fea508661cf5743dfe3d5f47ce214fd6b7dec1de0da4d669dd4ef3d2144468ebe4179049eff253d9d27e719c88dae55be64f954e80135a0cada804ec9 + checksum: 96c032ac2475c8027b7a4e9fe22dc0dfe0f6d90b85e496e0f016fbdb99d6d066de0112e680805075bd989905e2123b3b3d002765149294dce0c1f7f01fcc2ea0 languageName: node linkType: hard @@ -7610,11 +7888,11 @@ __metadata: version: 2.5.1 resolution: "raw-body@npm:2.5.1" dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - checksum: 5362adff1575d691bb3f75998803a0ffed8c64eabeaa06e54b4ada25a0cd1b2ae7f4f5ec46565d1bec337e08b5ac90c76eaa0758de6f72a633f025d754dec29e + bytes: "npm:3.1.2" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.4.24" + unpipe: "npm:1.0.0" + checksum: 5dad5a3a64a023b894ad7ab4e5c7c1ce34d3497fc7138d02f8c88a3781e68d8a55aa7d4fd3a458616fa8647cc228be314a1c03fb430a07521de78b32c4dd09d2 languageName: node linkType: hard @@ -7622,13 +7900,13 @@ __metadata: version: 1.2.8 resolution: "rc@npm:1.2.8" dependencies: - deep-extend: ^0.6.0 - ini: ~1.3.0 - minimist: ^1.2.0 - strip-json-comments: ~2.0.1 + deep-extend: "npm:^0.6.0" + ini: "npm:~1.3.0" + minimist: "npm:^1.2.0" + strip-json-comments: "npm:~2.0.1" bin: rc: ./cli.js - checksum: 2e26e052f8be2abd64e6d1dabfbd7be03f80ec18ccbc49562d31f617d0015fbdbcf0f9eed30346ea6ab789e0fdfe4337f033f8016efdbee0df5354751842080e + checksum: 24a07653150f0d9ac7168e52943cc3cb4b7a22c0e43c7dff3219977c2fdca5a2760a304a029c20811a0e79d351f57d46c9bde216193a0f73978496afc2b85b15 languageName: node linkType: hard @@ -7636,9 +7914,9 @@ __metadata: version: 3.0.0 resolution: "read-pkg-up@npm:3.0.0" dependencies: - find-up: ^2.0.0 - read-pkg: ^3.0.0 - checksum: 16175573f2914ab9788897bcbe2a62b5728d0075e62285b3680cebe97059e2911e0134a062cf6e51ebe3e3775312bc788ac2039ed6af38ec68d2c10c6f2b30fb + find-up: "npm:^2.0.0" + read-pkg: "npm:^3.0.0" + checksum: 2cd0a180260b0d235990e6e9c8c2330a03882d36bc2eba8930e437ef23ee52a68a894e7e1ccb1c33f03bcceb270a861ee5f7eac686f238857755e2cddfb48ffd languageName: node linkType: hard @@ -7646,21 +7924,10 @@ __metadata: version: 7.0.1 resolution: "read-pkg-up@npm:7.0.1" dependencies: - find-up: ^4.1.0 - read-pkg: ^5.2.0 - type-fest: ^0.8.1 - checksum: e4e93ce70e5905b490ca8f883eb9e48b5d3cebc6cd4527c25a0d8f3ae2903bd4121c5ab9c5a3e217ada0141098eeb661313c86fa008524b089b8ed0b7f165e44 - languageName: node - linkType: hard - -"read-pkg-up@npm:^8.0.0": - version: 8.0.0 - resolution: "read-pkg-up@npm:8.0.0" - dependencies: - find-up: ^5.0.0 - read-pkg: ^6.0.0 - type-fest: ^1.0.1 - checksum: fe4c80401656b40b408884457fffb5a8015c03b1018cfd8e48f8d82a5e9023e24963603aeb2755608d964593e046c15b34d29b07d35af9c7aa478be81805209c + find-up: "npm:^4.1.0" + read-pkg: "npm:^5.2.0" + type-fest: "npm:^0.8.1" + checksum: 82b3ac9fd7c6ca1bdc1d7253eb1091a98ff3d195ee0a45386582ce3e69f90266163c34121e6a0a02f1630073a6c0585f7880b3865efcae9c452fa667f02ca385 languageName: node linkType: hard @@ -7668,10 +7935,10 @@ __metadata: version: 3.0.0 resolution: "read-pkg@npm:3.0.0" dependencies: - load-json-file: ^4.0.0 - normalize-package-data: ^2.3.2 - path-type: ^3.0.0 - checksum: 398903ebae6c7e9965419a1062924436cc0b6f516c42c4679a90290d2f87448ed8f977e7aa2dbba4aa1ac09248628c43e493ac25b2bc76640e946035200e34c6 + load-json-file: "npm:^4.0.0" + normalize-package-data: "npm:^2.3.2" + path-type: "npm:^3.0.0" + checksum: 65acf2df89fbcd506b48b7ced56a255ba00adf7ecaa2db759c86cc58212f6fd80f1f0b7a85c848551a5d0685232e9b64f45c1fd5b48d85df2761a160767eeb93 languageName: node linkType: hard @@ -7679,49 +7946,37 @@ __metadata: version: 5.2.0 resolution: "read-pkg@npm:5.2.0" dependencies: - "@types/normalize-package-data": ^2.4.0 - normalize-package-data: ^2.5.0 - parse-json: ^5.0.0 - type-fest: ^0.6.0 - checksum: eb696e60528b29aebe10e499ba93f44991908c57d70f2d26f369e46b8b9afc208ef11b4ba64f67630f31df8b6872129e0a8933c8c53b7b4daf0eace536901222 - languageName: node - linkType: hard - -"read-pkg@npm:^6.0.0": - version: 6.0.0 - resolution: "read-pkg@npm:6.0.0" - dependencies: - "@types/normalize-package-data": ^2.4.0 - normalize-package-data: ^3.0.2 - parse-json: ^5.2.0 - type-fest: ^1.0.1 - checksum: 0cebdff381128e923815c643074a87011070e5fc352bee575d327d6485da3317fab6d802a7b03deeb0be7be8d3ad1640397b3d5d2f044452caf4e8d1736bf94f + "@types/normalize-package-data": "npm:^2.4.0" + normalize-package-data: "npm:^2.5.0" + parse-json: "npm:^5.0.0" + type-fest: "npm:^0.6.0" + checksum: b51a17d4b51418e777029e3a7694c9bd6c578a5ab99db544764a0b0f2c7c0f58f8a6bc101f86a6fceb8ba6d237d67c89acf6170f6b98695d0420ddc86cf109fb languageName: node linkType: hard -"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.2, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": - version: 3.6.0 - resolution: "readable-stream@npm:3.6.0" +"readable-stream@npm:3, readable-stream@npm:^3.0.0, readable-stream@npm:^3.0.2, readable-stream@npm:^3.4.0, readable-stream@npm:^3.6.0": + version: 3.6.2 + resolution: "readable-stream@npm:3.6.2" dependencies: - inherits: ^2.0.3 - string_decoder: ^1.1.1 - util-deprecate: ^1.0.1 - checksum: d4ea81502d3799439bb955a3a5d1d808592cf3133350ed352aeaa499647858b27b1c4013984900238b0873ec8d0d8defce72469fb7a83e61d53f5ad61cb80dc8 + inherits: "npm:^2.0.3" + string_decoder: "npm:^1.1.1" + util-deprecate: "npm:^1.0.1" + checksum: e37be5c79c376fdd088a45fa31ea2e423e5d48854be7a22a58869b4e84d25047b193f6acb54f1012331e1bcd667ffb569c01b99d36b0bd59658fb33f513511b7 languageName: node linkType: hard "readable-stream@npm:~2.3.6": - version: 2.3.7 - resolution: "readable-stream@npm:2.3.7" + version: 2.3.8 + resolution: "readable-stream@npm:2.3.8" dependencies: - core-util-is: ~1.0.0 - inherits: ~2.0.3 - isarray: ~1.0.0 - process-nextick-args: ~2.0.0 - safe-buffer: ~5.1.1 - string_decoder: ~1.1.1 - util-deprecate: ~1.0.1 - checksum: e4920cf7549a60f8aaf694d483a0e61b2a878b969d224f89b3bc788b8d920075132c4b55a7494ee944c7b6a9a0eada28a7f6220d80b0312ece70bbf08eeca755 + core-util-is: "npm:~1.0.0" + inherits: "npm:~2.0.3" + isarray: "npm:~1.0.0" + process-nextick-args: "npm:~2.0.0" + safe-buffer: "npm:~5.1.1" + string_decoder: "npm:~1.1.1" + util-deprecate: "npm:~1.0.1" + checksum: 7efdb01f3853bc35ac62ea25493567bf588773213f5f4a79f9c365e1ad13bab845ac0dae7bc946270dc40c3929483228415e92a3fc600cc7e4548992f41ee3fa languageName: node linkType: hard @@ -7729,17 +7984,8 @@ __metadata: version: 3.0.2 resolution: "readable-web-to-node-stream@npm:3.0.2" dependencies: - readable-stream: ^3.6.0 - checksum: 8c56cc62c68513425ddfa721954875b382768f83fa20e6b31e365ee00cbe7a3d6296f66f7f1107b16cd3416d33aa9f1680475376400d62a081a88f81f0ea7f9c - languageName: node - linkType: hard - -"readdirp@npm:~3.6.0": - version: 3.6.0 - resolution: "readdirp@npm:3.6.0" - dependencies: - picomatch: ^2.2.1 - checksum: 1ced032e6e45670b6d7352d71d21ce7edf7b9b928494dcaba6f11fba63180d9da6cd7061ebc34175ffda6ff529f481818c962952004d273178acd70f7059b320 + readable-stream: "npm:^3.6.0" + checksum: 533d5cd1580232a2c753e52a245be13fc552e6f82c5053a8a8da7ea1063d73a34f936a86b3d4433cdb4a13dd683835cfc87f230936cb96d329a1e28b6040f42e languageName: node linkType: hard @@ -7747,58 +7993,41 @@ __metadata: version: 3.0.0 resolution: "redent@npm:3.0.0" dependencies: - indent-string: ^4.0.0 - strip-indent: ^3.0.0 - checksum: fa1ef20404a2d399235e83cc80bd55a956642e37dd197b4b612ba7327bf87fa32745aeb4a1634b2bab25467164ab4ed9c15be2c307923dd08b0fe7c52431ae6b - languageName: node - linkType: hard - -"redent@npm:^4.0.0": - version: 4.0.0 - resolution: "redent@npm:4.0.0" - dependencies: - indent-string: ^5.0.0 - strip-indent: ^4.0.0 - checksum: 6944e7b1d8f3fd28c2515f5c605b9f7f0ea0f4edddf41890bbbdd4d9ee35abb7540c3b278f03ff827bd278bb6ff4a5bd8692ca406b748c5c1c3ce7355e9fbf8f + indent-string: "npm:^4.0.0" + strip-indent: "npm:^3.0.0" + checksum: d64a6b5c0b50eb3ddce3ab770f866658a2b9998c678f797919ceb1b586bab9259b311407280bd80b804e2a7c7539b19238ae6a2a20c843f1a7fcff21d48c2eae languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.4.3": - version: 1.4.3 - resolution: "regexp.prototype.flags@npm:1.4.3" +"regexp.prototype.flags@npm:^1.5.1": + version: 1.5.1 + resolution: "regexp.prototype.flags@npm:1.5.1" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.3 - functions-have-names: ^1.2.2 - checksum: 51228bae732592adb3ededd5e15426be25f289e9c4ef15212f4da73f4ec3919b6140806374b8894036a86020d054a8d2657d3fee6bb9b4d35d8939c20030b7a6 - languageName: node - linkType: hard - -"regexpp@npm:^3.2.0": - version: 3.2.0 - resolution: "regexpp@npm:3.2.0" - checksum: a78dc5c7158ad9ddcfe01aa9144f46e192ddbfa7b263895a70a5c6c73edd9ce85faf7c0430e59ac38839e1734e275b9c3de5c57ee3ab6edc0e0b1bdebefccef8 + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + set-function-name: "npm:^2.0.0" + checksum: 1de7d214c0a726c7c874a7023e47b0e27b9f7fdb64175bfe1861189de1704aaeca05c3d26c35aa375432289b99946f3cf86651a92a8f7601b90d8c226a23bcd8 languageName: node linkType: hard "repeat-string@npm:^1.6.1": version: 1.6.1 resolution: "repeat-string@npm:1.6.1" - checksum: 1b809fc6db97decdc68f5b12c4d1a671c8e3f65ec4a40c238bc5200e44e85bcc52a54f78268ab9c29fcf5fe4f1343e805420056d1f30fa9a9ee4c2d93e3cc6c0 + checksum: 87fa21bfdb2fbdedc44b9a5b118b7c1239bdd2c2c1e42742ef9119b7d412a5137a1d23f1a83dc6bb686f4f27429ac6f542e3d923090b44181bafa41e8ac0174d languageName: node linkType: hard "require-directory@npm:^2.1.1": version: 2.1.1 resolution: "require-directory@npm:2.1.1" - checksum: fb47e70bf0001fdeabdc0429d431863e9475e7e43ea5f94ad86503d918423c1543361cc5166d713eaa7029dd7a3d34775af04764bebff99ef413111a5af18c80 + checksum: 83aa76a7bc1531f68d92c75a2ca2f54f1b01463cb566cf3fbc787d0de8be30c9dbc211d1d46be3497dac5785fe296f2dd11d531945ac29730643357978966e99 languageName: node linkType: hard "require-from-string@npm:^2.0.2": version: 2.0.2 resolution: "require-from-string@npm:2.0.2" - checksum: a03ef6895445f33a4015300c426699bc66b2b044ba7b670aa238610381b56d3f07c686251740d575e22f4c87531ba662d06937508f0f3c0f1ddc04db3130560b + checksum: aaa267e0c5b022fc5fd4eef49d8285086b15f2a1c54b28240fdf03599cbd9c26049fee3eab894f2e1f6ca65e513b030a7c264201e3f005601e80c49fb2937ce2 languageName: node linkType: hard @@ -7806,9 +8035,9 @@ __metadata: version: 4.0.0 resolution: "requirejs-config-file@npm:4.0.0" dependencies: - esprima: ^4.0.0 - stringify-object: ^3.2.1 - checksum: 61ac1c419a8978df9484211827047f0a43d48a97e242ebca9628a2e52da8c739ee068bd67dc4d5dc5fd7be6d1c9a863006bb02df691c86914921fe12713fbebb + esprima: "npm:^4.0.0" + stringify-object: "npm:^3.2.1" + checksum: 18ea5b39a63be043c94103e97a880e68a48534cab6a90a202163b9c7935097638f3d6e9b44c28f62541d35cc3e738a6558359b6b21b42c466623b18eccc65635 languageName: node linkType: hard @@ -7818,7 +8047,7 @@ __metadata: bin: r.js: ./bin/r.js r_js: ./bin/r.js - checksum: 7c3c006bf5e1887d93ac7adb7f600328918d23cf3d28282a505a2873d4ddde499c7ec560e55cee3440d17fe1205cb4dcb72b07f35b39e8940372eca850e49b62 + checksum: 945faa9a6dc96b534a6ab25871e8578ddb93e87c6f2cf32cecf5f33d80e62086f47b8bfae49742150979a16432d8056b00e222b1f24fd2154c066fd65709889b languageName: node linkType: hard @@ -7826,15 +8055,15 @@ __metadata: version: 3.0.0 resolution: "resolve-cwd@npm:3.0.0" dependencies: - resolve-from: ^5.0.0 - checksum: 546e0816012d65778e580ad62b29e975a642989108d9a3c5beabfb2304192fa3c9f9146fbdfe213563c6ff51975ae41bac1d3c6e047dd9572c94863a057b4d81 + resolve-from: "npm:^5.0.0" + checksum: e608a3ebd15356264653c32d7ecbc8fd702f94c6703ea4ac2fb81d9c359180cba0ae2e6b71faa446631ed6145454d5a56b227efc33a2d40638ac13f8beb20ee4 languageName: node linkType: hard "resolve-dependency-path@npm:^2.0.0": version: 2.0.0 resolution: "resolve-dependency-path@npm:2.0.0" - checksum: 161296969a0a7853ebb7710847154ffb5bd11a51c370b67a0d0c89cacfcb57063d204587617fd030ea227bfd19a3c4af79d39e9d20ae0fbe354c27598d1ea8a8 + checksum: f5466505cc5f57d71ac9a4571255919ae9757c68df5174bdbdb776b2eff3fad74a9aeab1849b966c0b65723a400fc12f07200571c4496842e87f923b7045ebb3 languageName: node linkType: hard @@ -7842,23 +8071,23 @@ __metadata: version: 1.0.1 resolution: "resolve-dir@npm:1.0.1" dependencies: - expand-tilde: ^2.0.0 - global-modules: ^1.0.0 - checksum: ef736b8ed60d6645c3b573da17d329bfb50ec4e1d6c5ffd6df49e3497acef9226f9810ea6823b8ece1560e01dcb13f77a9f6180d4f242d00cc9a8f4de909c65c + expand-tilde: "npm:^2.0.0" + global-modules: "npm:^1.0.0" + checksum: 8197ed13e4a51d9cd786ef6a09fc83450db016abe7ef3311ca39389b3e508d77c26fe0cf0483a9b407b8caa2764bb5ccc52cf6a017ded91492a416475a56066f languageName: node linkType: hard "resolve-from@npm:^4.0.0": version: 4.0.0 resolution: "resolve-from@npm:4.0.0" - checksum: f4ba0b8494846a5066328ad33ef8ac173801a51739eb4d63408c847da9a2e1c1de1e6cbbf72699211f3d13f8fc1325648b169bd15eb7da35688e30a5fb0e4a7f + checksum: 8408eec31a3112ef96e3746c37be7d64020cda07c03a920f5024e77290a218ea758b26ca9529fd7b1ad283947f34b2291c1c0f6aa0ed34acfdda9c6014c8d190 languageName: node linkType: hard "resolve-from@npm:^5.0.0": version: 5.0.0 resolution: "resolve-from@npm:5.0.0" - checksum: 4ceeb9113e1b1372d0cd969f3468fa042daa1dd9527b1b6bb88acb6ab55d8b9cd65dbf18819f9f9ddf0db804990901dcdaade80a215e7b2c23daae38e64f5bdf + checksum: b21cb7f1fb746de8107b9febab60095187781137fd803e6a59a76d421444b1531b641bba5857f5dc011974d8a5c635d61cec49e6bd3b7fc20e01f0fafc4efbf2 languageName: node linkType: hard @@ -7866,30 +8095,21 @@ __metadata: version: 1.0.0 resolution: "resolve-global@npm:1.0.0" dependencies: - global-dirs: ^0.1.1 - checksum: c4e11d33e84bde7516b824503ffbe4b6cce863d5ce485680fd3db997b7c64da1df98321b1fd0703b58be8bc9bc83bc96bd83043f96194386b45eb47229efb6b6 + global-dirs: "npm:^0.1.1" + checksum: fda6ba81a07a0124756ce956dd871ca83763973326d8617143dab38d9c9afc666926604bfe8f0bfd046a9a285347568f32ceb3d4c55a1cb9de5614cca001a21c languageName: node linkType: hard -"resolve@npm:^1.10.0, resolve@npm:^1.17.0, resolve@npm:^1.20.0, resolve@npm:^1.21.0, resolve@npm:^1.22.0, resolve@npm:^1.22.1, resolve@npm:~1.22.1": - version: 1.22.1 - resolution: "resolve@npm:1.22.1" +"resolve@npm:^1.10.0, resolve@npm:^1.21.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:~1.22.1": + version: 1.22.8 + resolution: "resolve@npm:1.22.8" dependencies: - is-core-module: ^2.9.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 07af5fc1e81aa1d866cbc9e9460fbb67318a10fa3c4deadc35c3ad8a898ee9a71a86a65e4755ac3195e0ea0cfbe201eb323ebe655ce90526fd61917313a34e4e - languageName: node - linkType: hard - -"resolve@npm:~1.17.0": - version: 1.17.0 - resolution: "resolve@npm:1.17.0" - dependencies: - path-parse: ^1.0.6 - checksum: 9ceaf83b3429f2d7ff5d0281b8d8f18a1f05b6ca86efea7633e76b8f76547f33800799dfdd24434942dec4fbd9e651ed3aef577d9a6b5ec87ad89c1060e24759 + checksum: 07e179f4375e1fd072cfb72ad66d78547f86e6196c4014b31cb0b8bb1db5f7ca871f922d08da0fbc05b94e9fd42206f819648fa3b5b873ebbc8e1dc68fec433a languageName: node linkType: hard @@ -7897,41 +8117,32 @@ __metadata: version: 1.19.0 resolution: "resolve@npm:1.19.0" dependencies: - is-core-module: ^2.1.0 - path-parse: ^1.0.6 - checksum: a05b356e47b85ad3613d9e2a39a824f3c27f4fcad9c9ff6c7cc71a2e314c5904a90ab37481ad0069d03cab9eaaac6eb68aca1bc3355fdb05f1045cd50e2aacea + is-core-module: "npm:^2.1.0" + path-parse: "npm:^1.0.6" + checksum: 1c8afdfb88c9adab0a19b6f16756d47f5917f64047bf5a38c17aa543aae5ccca2a0631671b19ce8460a7a3e65ead98ee70e046d3056ec173d3377a27487848a8 languageName: node linkType: hard -"resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.21.0#~builtin, resolve@patch:resolve@^1.22.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@~1.22.1#~builtin": - version: 1.22.1 - resolution: "resolve@patch:resolve@npm%3A1.22.1#~builtin::version=1.22.1&hash=c3c19d" +"resolve@patch:resolve@npm%3A^1.10.0#optional!builtin, resolve@patch:resolve@npm%3A^1.21.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.1#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin, resolve@patch:resolve@npm%3A~1.22.1#optional!builtin": + version: 1.22.8 + resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: - is-core-module: ^2.9.0 - path-parse: ^1.0.7 - supports-preserve-symlinks-flag: ^1.0.0 + is-core-module: "npm:^2.13.0" + path-parse: "npm:^1.0.7" + supports-preserve-symlinks-flag: "npm:^1.0.0" bin: resolve: bin/resolve - checksum: 5656f4d0bedcf8eb52685c1abdf8fbe73a1603bb1160a24d716e27a57f6cecbe2432ff9c89c2bd57542c3a7b9d14b1882b73bfe2e9d7849c9a4c0b8b39f02b8b - languageName: node - linkType: hard - -"resolve@patch:resolve@~1.17.0#~builtin": - version: 1.17.0 - resolution: "resolve@patch:resolve@npm%3A1.17.0#~builtin::version=1.17.0&hash=c3c19d" - dependencies: - path-parse: ^1.0.6 - checksum: 6fd799f282ddf078c4bc20ce863e3af01fa8cb218f0658d9162c57161a2dbafe092b13015b9a4c58d0e1e801cf7aa7a4f13115fea9db98c3f9a0c43e429bad6f + checksum: 0446f024439cd2e50c6c8fa8ba77eaa8370b4180f401a96abf3d1ebc770ac51c1955e12764cde449fde3fff480a61f84388e3505ecdbab778f4bef5f8212c729 languageName: node linkType: hard -"resolve@patch:resolve@~1.19.0#~builtin": +"resolve@patch:resolve@npm%3A~1.19.0#optional!builtin": version: 1.19.0 - resolution: "resolve@patch:resolve@npm%3A1.19.0#~builtin::version=1.19.0&hash=c3c19d" + resolution: "resolve@patch:resolve@npm%3A1.19.0#optional!builtin::version=1.19.0&hash=c3c19d" dependencies: - is-core-module: ^2.1.0 - path-parse: ^1.0.6 - checksum: 2443b94d347e6946c87c85faf13071f605e609e0b54784829b0ed2b917d050bfc1cbaf4ecc6453f224cfa7d0c5dcd97cbb273454cd210bee68e4af15c1a5abc9 + is-core-module: "npm:^2.1.0" + path-parse: "npm:^1.0.6" + checksum: 254980f60dd9fdb28b34a511e70df6e3027d9627efce86a40757eea9b87252d172829c84517554560c4541ebfe207868270c19a0f086997b41209367aa8ef74f languageName: node linkType: hard @@ -7939,55 +8150,113 @@ __metadata: version: 3.1.0 resolution: "restore-cursor@npm:3.1.0" dependencies: - onetime: ^5.1.0 - signal-exit: ^3.0.2 - checksum: f877dd8741796b909f2a82454ec111afb84eb45890eb49ac947d87991379406b3b83ff9673a46012fca0d7844bb989f45cc5b788254cf1a39b6b5a9659de0630 + onetime: "npm:^5.1.0" + signal-exit: "npm:^3.0.2" + checksum: 8051a371d6aa67ff21625fa94e2357bd81ffdc96267f3fb0fc4aaf4534028343836548ef34c240ffa8c25b280ca35eb36be00b3cb2133fa4f51896d7e73c6b4f languageName: node linkType: hard "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" - checksum: 623bd7d2e5119467ba66202d733ec3c2e2e26568074923bc0585b6b99db14f357e79bdedb63cab56cec47491c4a0da7e6021a7465ca6dc4f481d3898fdd3158c + checksum: 59933e8501727ba13ad73ef4a04d5280b3717fd650408460c987392efe9d7be2040778ed8ebe933c5cbd63da3dcc37919c141ef8af0a54a6e4fca5a2af177bfe languageName: node linkType: hard "reusify@npm:^1.0.4": version: 1.0.4 resolution: "reusify@npm:1.0.4" - checksum: c3076ebcc22a6bc252cb0b9c77561795256c22b757f40c0d8110b1300723f15ec0fc8685e8d4ea6d7666f36c79ccc793b1939c748bf36f18f542744a4e379fcc + checksum: c19ef26e4e188f408922c46f7ff480d38e8dfc55d448310dfb518736b23ed2c4f547fb64a6ed5bdba92cd7e7ddc889d36ff78f794816d5e71498d645ef476107 languageName: node linkType: hard -"rimraf@npm:3.0.2, rimraf@npm:^3.0.2": +"rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" dependencies: - glob: ^7.1.3 + glob: "npm:^7.1.3" bin: rimraf: bin.js - checksum: 87f4164e396f0171b0a3386cc1877a817f572148ee13a7e113b238e48e8a9f2f31d009a92ec38a591ff1567d9662c6b67fd8818a2dbbaed74bc26a87a2a4a9a0 + checksum: 9cb7757acb489bd83757ba1a274ab545eafd75598a9d817e0c3f8b164238dd90eba50d6b848bd4dcc5f3040912e882dc7ba71653e35af660d77b25c381d402e8 languageName: node linkType: hard -"rollup@npm:^2.79.1": - version: 2.79.1 - resolution: "rollup@npm:2.79.1" +"rimraf@npm:^5.0.5": + version: 5.0.5 + resolution: "rimraf@npm:5.0.5" dependencies: - fsevents: ~2.3.2 + glob: "npm:^10.3.7" + bin: + rimraf: dist/esm/bin.mjs + checksum: d50dbe724f33835decd88395b25ed35995077c60a50ae78ded06e0185418914e555817aad1b4243edbff2254548c2f6ad6f70cc850040bebb4da9e8cc016f586 + languageName: node + linkType: hard + +"rollup@npm:^4.9.2": + version: 4.9.3 + resolution: "rollup@npm:4.9.3" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.9.3" + "@rollup/rollup-android-arm64": "npm:4.9.3" + "@rollup/rollup-darwin-arm64": "npm:4.9.3" + "@rollup/rollup-darwin-x64": "npm:4.9.3" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.9.3" + "@rollup/rollup-linux-arm64-gnu": "npm:4.9.3" + "@rollup/rollup-linux-arm64-musl": "npm:4.9.3" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.9.3" + "@rollup/rollup-linux-x64-gnu": "npm:4.9.3" + "@rollup/rollup-linux-x64-musl": "npm:4.9.3" + "@rollup/rollup-win32-arm64-msvc": "npm:4.9.3" + "@rollup/rollup-win32-ia32-msvc": "npm:4.9.3" + "@rollup/rollup-win32-x64-msvc": "npm:4.9.3" + "@types/estree": "npm:1.0.5" + fsevents: "npm:~2.3.2" dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true fsevents: optional: true bin: rollup: dist/bin/rollup - checksum: 6a2bf167b3587d4df709b37d149ad0300692cc5deb510f89ac7bdc77c8738c9546ae3de9322b0968e1ed2b0e984571f5f55aae28fa7de4cfcb1bc5402a4e2be6 + checksum: 012467cf185b43848531dcd6801a204c826b469d09bae7d559b162b9fb258f0009a8189311482cd33e68c5da3722be0d3c01114690608629564aa13f7d4070c1 + languageName: node + linkType: hard + +"run-applescript@npm:^7.0.0": + version: 7.0.0 + resolution: "run-applescript@npm:7.0.0" + checksum: bd821bbf154b8e6c8ecffeaf0c33cebbb78eb2987476c3f6b420d67ab4c5301faa905dec99ded76ebb3a7042b4e440189ae6d85bbbd3fc6e8d493347ecda8bfe languageName: node linkType: hard "run-async@npm:^2.4.0": version: 2.4.1 resolution: "run-async@npm:2.4.1" - checksum: a2c88aa15df176f091a2878eb840e68d0bdee319d8d97bbb89112223259cebecb94bc0defd735662b83c2f7a30bed8cddb7d1674eb48ae7322dc602b22d03797 + checksum: 35a68c8f1d9664f6c7c2e153877ca1d6e4f886e5ca067c25cdd895a6891ff3a1466ee07c63d6a9be306e9619ff7d509494e6d9c129516a36b9fd82263d579ee1 languageName: node linkType: hard @@ -7995,56 +8264,68 @@ __metadata: version: 1.2.0 resolution: "run-parallel@npm:1.2.0" dependencies: - queue-microtask: ^1.2.2 - checksum: cb4f97ad25a75ebc11a8ef4e33bb962f8af8516bb2001082ceabd8902e15b98f4b84b4f8a9b222e5d57fc3bd1379c483886ed4619367a7680dad65316993021d + queue-microtask: "npm:^1.2.2" + checksum: 200b5ab25b5b8b7113f9901bfe3afc347e19bb7475b267d55ad0eb86a62a46d77510cb0f232507c9e5d497ebda569a08a9867d0d14f57a82ad5564d991588b39 languageName: node linkType: hard "rxjs@npm:^7.5.5": - version: 7.8.0 - resolution: "rxjs@npm:7.8.0" + version: 7.8.1 + resolution: "rxjs@npm:7.8.1" + dependencies: + tslib: "npm:^2.1.0" + checksum: 3c49c1ecd66170b175c9cacf5cef67f8914dcbc7cd0162855538d365c83fea631167cacb644b3ce533b2ea0e9a4d0b12175186985f89d75abe73dbd8f7f06f68 + languageName: node + linkType: hard + +"safe-array-concat@npm:^1.0.1": + version: 1.0.1 + resolution: "safe-array-concat@npm:1.0.1" dependencies: - tslib: ^2.1.0 - checksum: 61b4d4fd323c1043d8d6ceb91f24183b28bcf5def4f01ca111511d5c6b66755bc5578587fe714ef5d67cf4c9f2e26f4490d4e1d8cabf9bd5967687835e9866a2 + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.1" + has-symbols: "npm:^1.0.3" + isarray: "npm:^2.0.5" + checksum: 4b15ce5fce5ce4d7e744a63592cded88d2f27806ed229eadb2e42629cbcd40e770f7478608e75f455e7fe341acd8c0a01bdcd7146b10645ea7411c5e3c1d1dd8 languageName: node linkType: hard "safe-buffer@npm:5.2.1, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" - checksum: b99c4b41fdd67a6aaf280fcd05e9ffb0813654894223afb78a31f14a19ad220bba8aba1cb14eddce1fcfb037155fe6de4e861784eb434f7d11ed58d1e70dd491 + checksum: 6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 languageName: node linkType: hard "safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" - checksum: f2f1f7943ca44a594893a852894055cf619c1fbcb611237fc39e461ae751187e7baf4dc391a72125e0ac4fb2d8c5c0b3c71529622e6a58f46b960211e704903c + checksum: 780ba6b5d99cc9a40f7b951d47152297d0e260f0df01472a1b99d4889679a4b94a13d644f7dbc4f022572f09ae9005fa2fbb93bbbd83643316f365a3e9a45b21 languageName: node linkType: hard "safe-regex-test@npm:^1.0.0": - version: 1.0.0 - resolution: "safe-regex-test@npm:1.0.0" + version: 1.0.1 + resolution: "safe-regex-test@npm:1.0.1" dependencies: - call-bind: ^1.0.2 - get-intrinsic: ^1.1.3 - is-regex: ^1.1.4 - checksum: bc566d8beb8b43c01b94e67de3f070fd2781685e835959bbbaaec91cc53381145ca91f69bd837ce6ec244817afa0a5e974fc4e40a2957f0aca68ac3add1ddd34 + call-bind: "npm:^1.0.5" + get-intrinsic: "npm:^1.2.2" + is-regex: "npm:^1.1.4" + checksum: abd426f19c2f46f810199751156e3644233845a0c8b00b74552fa3f42fd3bb3982fd944213ddbd9d7a4ae372aadbcaa0db6c8bf919a045b0dad0a3b6b92c72cc languageName: node linkType: hard -"safe-stable-stringify@npm:^2.4.1": - version: 2.4.2 - resolution: "safe-stable-stringify@npm:2.4.2" - checksum: 0324ba2e40f78cae63e31a02b1c9bdf1b786621f9e8760845608eb9e81aef401944ac2078e5c9c1533cf516aea34d08fa8052ca853637ced84b791caaf1e394e +"safe-stable-stringify@npm:^2.4.3": + version: 2.4.3 + resolution: "safe-stable-stringify@npm:2.4.3" + checksum: 81dede06b8f2ae794efd868b1e281e3c9000e57b39801c6c162267eb9efda17bd7a9eafa7379e1f1cacd528d4ced7c80d7460ad26f62ada7c9e01dec61b2e768 languageName: node linkType: hard "safer-buffer@npm:>= 2.1.2 < 3, safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" - checksum: cab8f25ae6f1434abee8d80023d7e72b598cf1327164ddab31003c51215526801e40b66c5e65d658a0af1e9d6478cadcb4c745f4bd6751f97d8644786c0978b0 + checksum: 7e3c8b2e88a1841c9671094bbaeebd94448111dd90a81a1f606f3f67708a6ec57763b3b47f06da09fc6054193e0e6709e77325415dc8422b04497a8070fa02d4 languageName: node linkType: hard @@ -8052,51 +8333,51 @@ __metadata: version: 3.0.0 resolution: "sass-lookup@npm:3.0.0" dependencies: - commander: ^2.16.0 + commander: "npm:^2.16.0" bin: sass-lookup: bin/cli.js - checksum: fd4bf1ad9c54111617dec30dd90aff083e87c96aef50aff6cec443ad2fbbfa65da09f6e67a7e5ef99fa39dff65c937dc7358f18d319e083c6031f21def85ce6d + checksum: 1e3f0887affb476af42bae2a1edf40b6799da0fb775b7dcf05438cf9646fd85ec764c694202df872bc1350d01c2b191cc07b6e5bfefe7b47ea74724a27d8278c languageName: node linkType: hard -"secp256k1@npm:^4.0.3": - version: 4.0.3 - resolution: "secp256k1@npm:4.0.3" +"secp256k1@npm:^5.0.0": + version: 5.0.0 + resolution: "secp256k1@npm:5.0.0" dependencies: - elliptic: ^6.5.4 - node-addon-api: ^2.0.0 - node-gyp: latest - node-gyp-build: ^4.2.0 - checksum: 21e219adc0024fbd75021001358780a3cc6ac21273c3fcaef46943af73969729709b03f1df7c012a0baab0830fb9a06ccc6b42f8d50050c665cb98078eab477b + elliptic: "npm:^6.5.4" + node-addon-api: "npm:^5.0.0" + node-gyp: "npm:latest" + node-gyp-build: "npm:^4.2.0" + checksum: b9ab4c952babfe6103978b2f656265041ebe09b8a91b26a796cbcbe04d2252e28e12ec50d5ed3006bf2ca5feef6edcbd71c7c85122615f5ffbcd1acdd564f77f languageName: node linkType: hard "semver@npm:2 || 3 || 4 || 5": - version: 5.7.1 - resolution: "semver@npm:5.7.1" + version: 5.7.2 + resolution: "semver@npm:5.7.2" bin: - semver: ./bin/semver - checksum: 57fd0acfd0bac382ee87cd52cd0aaa5af086a7dc8d60379dfe65fea491fb2489b6016400813930ecd61fd0952dae75c115287a1b16c234b1550887117744dfaf + semver: bin/semver + checksum: e4cf10f86f168db772ae95d86ba65b3fd6c5967c94d97c708ccb463b778c2ee53b914cd7167620950fc07faf5a564e6efe903836639e512a1aa15fbc9667fa25 languageName: node linkType: hard -"semver@npm:^6.0.0": - version: 6.3.0 - resolution: "semver@npm:6.3.0" +"semver@npm:^6.0.0, semver@npm:^6.3.1": + version: 6.3.1 + resolution: "semver@npm:6.3.1" bin: - semver: ./bin/semver.js - checksum: 1b26ecf6db9e8292dd90df4e781d91875c0dcc1b1909e70f5d12959a23c7eebb8f01ea581c00783bbee72ceeaad9505797c381756326073850dc36ed284b21b9 + semver: bin/semver.js + checksum: e3d79b609071caa78bcb6ce2ad81c7966a46a7431d9d58b8800cfa9cb6a63699b3899a0e4bcce36167a284578212d9ae6942b6929ba4aa5015c079a67751d42d languageName: node linkType: hard -"semver@npm:^7.1.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:~7.3.0": - version: 7.3.8 - resolution: "semver@npm:7.3.8" +"semver@npm:^7.1.1, semver@npm:^7.3.2, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:~7.5.4": + version: 7.5.4 + resolution: "semver@npm:7.5.4" dependencies: - lru-cache: ^6.0.0 + lru-cache: "npm:^6.0.0" bin: semver: bin/semver.js - checksum: ba9c7cbbf2b7884696523450a61fee1a09930d888b7a8d7579025ad93d459b2d1949ee5bbfeb188b2be5f4ac163544c5e98491ad6152df34154feebc2cc337c1 + checksum: 5160b06975a38b11c1ab55950cb5b8a23db78df88275d3d8a42ccf1f29e55112ac995b3a26a522c36e3b5f76b0445f1eef70d696b8c7862a2b4303d7b0e7609e languageName: node linkType: hard @@ -8104,20 +8385,20 @@ __metadata: version: 0.18.0 resolution: "send@npm:0.18.0" dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - etag: ~1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: ~1.2.1 - statuses: 2.0.1 - checksum: 74fc07ebb58566b87b078ec63e5a3e41ecd987e4272ba67b7467e86c6ad51bc6b0b0154133b6d8b08a2ddda360464f71382f7ef864700f34844a76c8027817a8 + debug: "npm:2.6.9" + depd: "npm:2.0.0" + destroy: "npm:1.2.0" + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + etag: "npm:~1.8.1" + fresh: "npm:0.5.2" + http-errors: "npm:2.0.0" + mime: "npm:1.6.0" + ms: "npm:2.1.3" + on-finished: "npm:2.4.1" + range-parser: "npm:~1.2.1" + statuses: "npm:2.0.1" + checksum: 0eb134d6a51fc13bbcb976a1f4214ea1e33f242fae046efc311e80aff66c7a43603e26a79d9d06670283a13000e51be6e0a2cb80ff0942eaf9f1cd30b7ae736a languageName: node linkType: hard @@ -8125,8 +8406,8 @@ __metadata: version: 7.0.1 resolution: "serialize-error@npm:7.0.1" dependencies: - type-fest: ^0.13.1 - checksum: e0aba4dca2fc9fe74ae1baf38dbd99190e1945445a241ba646290f2176cdb2032281a76443b02ccf0caf30da5657d510746506368889a593b9835a497fc0732e + type-fest: "npm:^0.13.1" + checksum: 7982937d578cd901276c8ab3e2c6ed8a4c174137730f1fb0402d005af209a0e84d04acc874e317c936724c7b5b26c7a96ff7e4b8d11a469f4924a4b0ea814c05 languageName: node linkType: hard @@ -8134,25 +8415,48 @@ __metadata: version: 1.15.0 resolution: "serve-static@npm:1.15.0" dependencies: - encodeurl: ~1.0.2 - escape-html: ~1.0.3 - parseurl: ~1.3.3 - send: 0.18.0 - checksum: af57fc13be40d90a12562e98c0b7855cf6e8bd4c107fe9a45c212bf023058d54a1871b1c89511c3958f70626fff47faeb795f5d83f8cf88514dbaeb2b724464d + encodeurl: "npm:~1.0.2" + escape-html: "npm:~1.0.3" + parseurl: "npm:~1.3.3" + send: "npm:0.18.0" + checksum: fa9f0e21a540a28f301258dfe1e57bb4f81cd460d28f0e973860477dd4acef946a1f41748b5bd41c73b621bea2029569c935faa38578fd34cd42a9b4947088ba languageName: node linkType: hard "set-blocking@npm:^2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" - checksum: 6e65a05f7cf7ebdf8b7c75b101e18c0b7e3dff4940d480efed8aad3a36a4005140b660fa1d804cb8bce911cac290441dc728084a30504d3516ac2ff7ad607b02 + checksum: 9f8c1b2d800800d0b589de1477c753492de5c1548d4ade52f57f1d1f5e04af5481554d75ce5e5c43d4004b80a3eb714398d6907027dc0534177b7539119f4454 + languageName: node + linkType: hard + +"set-function-length@npm:^1.1.1": + version: 1.1.1 + resolution: "set-function-length@npm:1.1.1" + dependencies: + define-data-property: "npm:^1.1.1" + get-intrinsic: "npm:^1.2.1" + gopd: "npm:^1.0.1" + has-property-descriptors: "npm:^1.0.0" + checksum: a29e255c116c29e3323b851c4f46c58c91be9bb8b065f191e2ea1807cb2c839df56e3175732a498e0c6d54626ba6b6fef896bf699feb7ab70c42dc47eb247c95 + languageName: node + linkType: hard + +"set-function-name@npm:^2.0.0": + version: 2.0.1 + resolution: "set-function-name@npm:2.0.1" + dependencies: + define-data-property: "npm:^1.0.1" + functions-have-names: "npm:^1.2.3" + has-property-descriptors: "npm:^1.0.0" + checksum: 6be7d3e15be47f4db8a5a563a35c60b5e7c4af91cc900e8972ffad33d3aaa227900faa55f60121cdb04b85866a734bb7fe4cd91f654c632861cc86121a48312a languageName: node linkType: hard "setprototypeof@npm:1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" - checksum: be18cbbf70e7d8097c97f713a2e76edf84e87299b40d085c6bf8b65314e994cc15e2e317727342fa6996e38e1f52c59720b53fe621e2eb593a6847bf0356db89 + checksum: 68733173026766fa0d9ecaeb07f0483f4c2dc70ca376b3b7c40b7cda909f94b0918f6c5ad5ce27a9160bdfb475efaa9d5e705a11d8eaae18f9835d20976028bc languageName: node linkType: hard @@ -8160,26 +8464,27 @@ __metadata: version: 2.0.0 resolution: "shebang-command@npm:2.0.0" dependencies: - shebang-regex: ^3.0.0 - checksum: 6b52fe87271c12968f6a054e60f6bde5f0f3d2db483a1e5c3e12d657c488a15474121a1d55cd958f6df026a54374ec38a4a963988c213b7570e1d51575cea7fa + shebang-regex: "npm:^3.0.0" + checksum: a41692e7d89a553ef21d324a5cceb5f686d1f3c040759c50aab69688634688c5c327f26f3ecf7001ebfd78c01f3c7c0a11a7c8bfd0a8bc9f6240d4f40b224e4e languageName: node linkType: hard "shebang-regex@npm:^3.0.0": version: 3.0.0 resolution: "shebang-regex@npm:3.0.0" - checksum: 1a2bcae50de99034fcd92ad4212d8e01eedf52c7ec7830eedcf886622804fe36884278f2be8be0ea5fde3fd1c23911643a4e0f726c8685b61871c8908af01222 + checksum: 1dbed0726dd0e1152a92696c76c7f06084eb32a90f0528d11acd764043aacf76994b2fb30aa1291a21bd019d6699164d048286309a278855ee7bec06cf6fb690 languageName: node linkType: hard -"shiki@npm:^0.12.1": - version: 0.12.1 - resolution: "shiki@npm:0.12.1" +"shiki@npm:^0.14.7": + version: 0.14.7 + resolution: "shiki@npm:0.14.7" dependencies: - jsonc-parser: ^3.2.0 - vscode-oniguruma: ^1.7.0 - vscode-textmate: ^8.0.0 - checksum: a5d78a79d282f5c5168786980c66e82f075e91fa015097456486624fc5775688d685ad9b1972b0617d7f1ef50927d21b61dca476247a6f6c6b7042046e89a979 + ansi-sequence-parser: "npm:^1.1.0" + jsonc-parser: "npm:^3.2.0" + vscode-oniguruma: "npm:^1.7.0" + vscode-textmate: "npm:^8.0.0" + checksum: 5c7fcbb870d0facccc7ae2f3410a28121f8e0b3f298e4e956de817ad6ab60a4c7e20a9184edfe50a93447addbb88b95b69e6ef88ac16ac6ca3e94c50771a6459 languageName: node linkType: hard @@ -8187,31 +8492,45 @@ __metadata: version: 1.0.4 resolution: "side-channel@npm:1.0.4" dependencies: - call-bind: ^1.0.0 - get-intrinsic: ^1.0.2 - object-inspect: ^1.9.0 - checksum: 351e41b947079c10bd0858364f32bb3a7379514c399edb64ab3dce683933483fc63fb5e4efe0a15a2e8a7e3c436b6a91736ddb8d8c6591b0460a24bb4a1ee245 + call-bind: "npm:^1.0.0" + get-intrinsic: "npm:^1.0.2" + object-inspect: "npm:^1.9.0" + checksum: 054a5d23ee35054b2c4609b9fd2a0587760737782b5d765a9c7852264710cc39c6dcb56a9bbd6c12cd84071648aea3edb2359d2f6e560677eedadce511ac1da5 languageName: node linkType: hard -"signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": +"signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" - checksum: a2f098f247adc367dffc27845853e9959b9e88b01cb301658cfe4194352d8d2bb32e18467c786a7fe15f1d44b233ea35633d076d5e737870b7139949d1ab6318 + checksum: 25d272fa73e146048565e08f3309d5b942c1979a6f4a58a8c59d5fa299728e9c2fcd1a759ec870863b1fd38653670240cd420dad2ad9330c71f36608a6a1c912 + languageName: node + linkType: hard + +"signal-exit@npm:^4.0.1": + version: 4.1.0 + resolution: "signal-exit@npm:4.1.0" + checksum: 41602dce540e46d599edba9d9860193398d135f7ff72cab629db5171516cfae628d21e7bfccde1bbfdf11c48726bc2a6d1a8fb8701125852fbfda7cf19c6aa83 languageName: node linkType: hard "slash@npm:^3.0.0": version: 3.0.0 resolution: "slash@npm:3.0.0" - checksum: 94a93fff615f25a999ad4b83c9d5e257a7280c90a32a7cb8b4a87996e4babf322e469c42b7f649fd5796edd8687652f3fb452a86dc97a816f01113183393f11c + checksum: e18488c6a42bdfd4ac5be85b2ced3ccd0224773baae6ad42cfbb9ec74fc07f9fa8396bd35ee638084ead7a2a0818eb5e7151111544d4731ce843019dab4be47b languageName: node linkType: hard "slash@npm:^4.0.0": version: 4.0.0 resolution: "slash@npm:4.0.0" - checksum: da8e4af73712253acd21b7853b7e0dbba776b786e82b010a5bfc8b5051a1db38ed8aba8e1e8f400dd2c9f373be91eb1c42b66e91abb407ff42b10feece5e1d2d + checksum: b522ca75d80d107fd30d29df0549a7b2537c83c4c4ecd12cd7d4ea6c8aaca2ab17ada002e7a1d78a9d736a0261509f26ea5b489082ee443a3a810586ef8eff18 + languageName: node + linkType: hard + +"slash@npm:^5.1.0": + version: 5.1.0 + resolution: "slash@npm:5.1.0" + checksum: eb48b815caf0bdc390d0519d41b9e0556a14380f6799c72ba35caf03544d501d18befdeeef074bc9c052acf69654bc9e0d79d7f1de0866284137a40805299eb3 languageName: node linkType: hard @@ -8219,44 +8538,44 @@ __metadata: version: 5.0.0 resolution: "slice-ansi@npm:5.0.0" dependencies: - ansi-styles: ^6.0.0 - is-fullwidth-code-point: ^4.0.0 - checksum: 7e600a2a55e333a21ef5214b987c8358fe28bfb03c2867ff2cbf919d62143d1812ac27b4297a077fdaf27a03da3678e49551c93e35f9498a3d90221908a1180e + ansi-styles: "npm:^6.0.0" + is-fullwidth-code-point: "npm:^4.0.0" + checksum: 2d4d40b2a9d5cf4e8caae3f698fe24ae31a4d778701724f578e984dcb485ec8c49f0c04dab59c401821e80fcdfe89cace9c66693b0244e40ec485d72e543914f languageName: node linkType: hard "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" - checksum: b5167a7142c1da704c0e3af85c402002b597081dd9575031a90b4f229ca5678e9a36e8a374f1814c8156a725d17008ae3bde63b92f9cfd132526379e580bec8b + checksum: a16775323e1404dd43fabafe7460be13a471e021637bc7889468eb45ce6a6b207261f454e4e530a19500cc962c4cc5348583520843b363f4193cee5c00e1e539 languageName: node linkType: hard -"socks-proxy-agent@npm:^7.0.0": - version: 7.0.0 - resolution: "socks-proxy-agent@npm:7.0.0" +"socks-proxy-agent@npm:^8.0.1": + version: 8.0.2 + resolution: "socks-proxy-agent@npm:8.0.2" dependencies: - agent-base: ^6.0.2 - debug: ^4.3.3 - socks: ^2.6.2 - checksum: 720554370154cbc979e2e9ce6a6ec6ced205d02757d8f5d93fe95adae454fc187a5cbfc6b022afab850a5ce9b4c7d73e0f98e381879cf45f66317a4895953846 + agent-base: "npm:^7.0.2" + debug: "npm:^4.3.4" + socks: "npm:^2.7.1" + checksum: a842402fc9b8848a31367f2811ca3cd14c4106588b39a0901cd7a69029998adfc6456b0203617c18ed090542ad0c24ee4e9d4c75a0c4b75071e214227c177eb7 languageName: node linkType: hard -"socks@npm:^2.6.2": +"socks@npm:^2.7.1": version: 2.7.1 resolution: "socks@npm:2.7.1" dependencies: - ip: ^2.0.0 - smart-buffer: ^4.2.0 - checksum: 259d9e3e8e1c9809a7f5c32238c3d4d2a36b39b83851d0f573bfde5f21c4b1288417ce1af06af1452569cd1eb0841169afd4998f0e04ba04656f6b7f0e46d748 + ip: "npm:^2.0.0" + smart-buffer: "npm:^4.2.0" + checksum: 43f69dbc9f34fc8220bc51c6eea1c39715ab3cfdb115d6e3285f6c7d1a603c5c75655668a5bbc11e3c7e2c99d60321fb8d7ab6f38cda6a215fadd0d6d0b52130 languageName: node linkType: hard "source-map-js@npm:^1.0.2": version: 1.0.2 resolution: "source-map-js@npm:1.0.2" - checksum: c049a7fc4deb9a7e9b481ae3d424cc793cb4845daa690bc5a05d428bf41bf231ced49b4cf0c9e77f9d42fdb3d20d6187619fc586605f5eabe995a316da8d377c + checksum: 32f2dfd1e9b7168f9a9715eb1b4e21905850f3b50cf02cf476e47e4eebe8e6b762b63a64357896aa29b37e24922b4282df0f492e0d2ace572b43d15525976ff8 languageName: node linkType: hard @@ -8264,40 +8583,33 @@ __metadata: version: 0.5.21 resolution: "source-map-support@npm:0.5.21" dependencies: - buffer-from: ^1.0.0 - source-map: ^0.6.0 - checksum: 43e98d700d79af1d36f859bdb7318e601dfc918c7ba2e98456118ebc4c4872b327773e5a1df09b0524e9e5063bb18f0934538eace60cca2710d1fa687645d137 + buffer-from: "npm:^1.0.0" + source-map: "npm:^0.6.0" + checksum: 9ee09942f415e0f721d6daad3917ec1516af746a8120bba7bb56278707a37f1eb8642bde456e98454b8a885023af81a16e646869975f06afc1a711fb90484e7d languageName: node linkType: hard "source-map@npm:^0.6.0, source-map@npm:^0.6.1, source-map@npm:~0.6.1": version: 0.6.1 resolution: "source-map@npm:0.6.1" - checksum: 59ce8640cf3f3124f64ac289012c2b8bd377c238e316fb323ea22fbfe83da07d81e000071d7242cad7a23cd91c7de98e4df8830ec3f133cb6133a5f6e9f67bc2 - languageName: node - linkType: hard - -"sourcemap-codec@npm:^1.4.8": - version: 1.4.8 - resolution: "sourcemap-codec@npm:1.4.8" - checksum: b57981c05611afef31605732b598ccf65124a9fcb03b833532659ac4d29ac0f7bfacbc0d6c5a28a03e84c7510e7e556d758d0bb57786e214660016fb94279316 + checksum: ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 languageName: node linkType: hard "spdx-correct@npm:^3.0.0": - version: 3.1.1 - resolution: "spdx-correct@npm:3.1.1" + version: 3.2.0 + resolution: "spdx-correct@npm:3.2.0" dependencies: - spdx-expression-parse: ^3.0.0 - spdx-license-ids: ^3.0.0 - checksum: 77ce438344a34f9930feffa61be0eddcda5b55fc592906ef75621d4b52c07400a97084d8701557b13f7d2aae0cb64f808431f469e566ef3fe0a3a131dcb775a6 + spdx-expression-parse: "npm:^3.0.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 49208f008618b9119208b0dadc9208a3a55053f4fd6a0ae8116861bd22696fc50f4142a35ebfdb389e05ccf2de8ad142573fefc9e26f670522d899f7b2fe7386 languageName: node linkType: hard "spdx-exceptions@npm:^2.1.0": version: 2.3.0 resolution: "spdx-exceptions@npm:2.3.0" - checksum: cb69a26fa3b46305637123cd37c85f75610e8c477b6476fa7354eb67c08128d159f1d36715f19be6f9daf4b680337deb8c65acdcae7f2608ba51931540687ac0 + checksum: 83089e77d2a91cb6805a5c910a2bedb9e50799da091f532c2ba4150efdef6e53f121523d3e2dc2573a340dc0189e648b03157097f65465b3a0c06da1f18d7e8a languageName: node linkType: hard @@ -8305,16 +8617,16 @@ __metadata: version: 3.0.1 resolution: "spdx-expression-parse@npm:3.0.1" dependencies: - spdx-exceptions: ^2.1.0 - spdx-license-ids: ^3.0.0 - checksum: a1c6e104a2cbada7a593eaa9f430bd5e148ef5290d4c0409899855ce8b1c39652bcc88a725259491a82601159d6dc790bedefc9016c7472f7de8de7361f8ccde + spdx-exceptions: "npm:^2.1.0" + spdx-license-ids: "npm:^3.0.0" + checksum: 6f8a41c87759fa184a58713b86c6a8b028250f158159f1d03ed9d1b6ee4d9eefdc74181c8ddc581a341aa971c3e7b79e30b59c23b05d2436d5de1c30bdef7171 languageName: node linkType: hard "spdx-license-ids@npm:^3.0.0": - version: 3.0.12 - resolution: "spdx-license-ids@npm:3.0.12" - checksum: 92a4dddce62ce1db6fe54a7a839cf85e06abc308fc83b776a55b44e4f1906f02e7ebd506120847039e976bbbad359ea8bdfafb7925eae5cd7e73255f02e0b7d6 + version: 3.0.16 + resolution: "spdx-license-ids@npm:3.0.16" + checksum: 7d88b8f01308948bb3ea69c066448f2776cf3d35a410d19afb836743086ced1566f6824ee8e6d67f8f25aa81fa86d8076a666c60ac4528caecd55e93edb5114e languageName: node linkType: hard @@ -8322,8 +8634,8 @@ __metadata: version: 3.2.2 resolution: "split2@npm:3.2.2" dependencies: - readable-stream: ^3.0.0 - checksum: 8127ddbedd0faf31f232c0e9192fede469913aa8982aa380752e0463b2e31c2359ef6962eb2d24c125bac59eeec76873678d723b1c7ff696216a1cd071e3994a + readable-stream: "npm:^3.0.0" + checksum: 2dad5603c52b353939befa3e2f108f6e3aff42b204ad0f5f16dd12fd7c2beab48d117184ce6f7c8854f9ee5ffec6faae70d243711dd7d143a9f635b4a285de4e languageName: node linkType: hard @@ -8331,31 +8643,31 @@ __metadata: version: 1.0.1 resolution: "split@npm:1.0.1" dependencies: - through: 2 - checksum: 12f4554a5792c7e98bb3e22b53c63bfa5ef89aa704353e1db608a55b51f5b12afaad6e4a8ecf7843c15f273f43cdadd67b3705cc43d48a75c2cf4641d51f7e7a + through: "npm:2" + checksum: 7f489e7ed5ff8a2e43295f30a5197ffcb2d6202c9cf99357f9690d645b19c812bccf0be3ff336fea5054cda17ac96b91d67147d95dbfc31fbb5804c61962af85 languageName: node linkType: hard "sprintf-js@npm:~1.0.2": version: 1.0.3 resolution: "sprintf-js@npm:1.0.3" - checksum: 19d79aec211f09b99ec3099b5b2ae2f6e9cdefe50bc91ac4c69144b6d3928a640bb6ae5b3def70c2e85a2c3d9f5ec2719921e3a59d3ca3ef4b2fd1a4656a0df3 + checksum: ecadcfe4c771890140da5023d43e190b7566d9cf8b2d238600f31bec0fc653f328da4450eb04bd59a431771a8e9cc0e118f0aa3974b683a4981b4e07abc2a5bb languageName: node linkType: hard -"ssri@npm:^9.0.0": - version: 9.0.1 - resolution: "ssri@npm:9.0.1" +"ssri@npm:^10.0.0": + version: 10.0.5 + resolution: "ssri@npm:10.0.5" dependencies: - minipass: ^3.1.1 - checksum: fb58f5e46b6923ae67b87ad5ef1c5ab6d427a17db0bead84570c2df3cd50b4ceb880ebdba2d60726588272890bae842a744e1ecce5bd2a2a582fccd5068309eb + minipass: "npm:^7.0.3" + checksum: b091f2ae92474183c7ac5ed3f9811457e1df23df7a7e70c9476eaa9a0c4a0c8fc190fb45acefbf023ca9ee864dd6754237a697dc52a0fb182afe65d8e77443d8 languageName: node linkType: hard "stack-utils@npm:^0.4.0": version: 0.4.0 resolution: "stack-utils@npm:0.4.0" - checksum: 4f57cc33ffe18846657fb083bc93b1d51941ab18de20e7610e3cc2fccbb2ca7127f10acb2e2d68240f8f16fba0240aca165ee55a8feabab61de97c59b2cde539 + checksum: febb0ed190d6128c8d45c8c9311785a0ec5cf48c5c8f8e74fbc4ddf0732534f9b6d6284f24c9d69e9637619a6180e86453d5c7defcbc6bc8ed25e92622a6a5aa languageName: node linkType: hard @@ -8363,8 +8675,8 @@ __metadata: version: 2.0.6 resolution: "stack-utils@npm:2.0.6" dependencies: - escape-string-regexp: ^2.0.0 - checksum: 052bf4d25bbf5f78e06c1d5e67de2e088b06871fa04107ca8d3f0e9d9263326e2942c8bedee3545795fc77d787d443a538345eef74db2f8e35db3558c6f91ff7 + escape-string-regexp: "npm:^2.0.0" + checksum: 651c9f87667e077584bbe848acaecc6049bc71979f1e9a46c7b920cad4431c388df0f51b8ad7cfd6eed3db97a2878d0fc8b3122979439ea8bac29c61c95eec8a languageName: node linkType: hard @@ -8372,81 +8684,112 @@ __metadata: version: 9.5.0 resolution: "standard-version@npm:9.5.0" dependencies: - chalk: ^2.4.2 - conventional-changelog: 3.1.25 - conventional-changelog-config-spec: 2.1.0 - conventional-changelog-conventionalcommits: 4.6.3 - conventional-recommended-bump: 6.1.0 - detect-indent: ^6.0.0 - detect-newline: ^3.1.0 - dotgitignore: ^2.1.0 - figures: ^3.1.0 - find-up: ^5.0.0 - git-semver-tags: ^4.0.0 - semver: ^7.1.1 - stringify-package: ^1.0.1 - yargs: ^16.0.0 + chalk: "npm:^2.4.2" + conventional-changelog: "npm:3.1.25" + conventional-changelog-config-spec: "npm:2.1.0" + conventional-changelog-conventionalcommits: "npm:4.6.3" + conventional-recommended-bump: "npm:6.1.0" + detect-indent: "npm:^6.0.0" + detect-newline: "npm:^3.1.0" + dotgitignore: "npm:^2.1.0" + figures: "npm:^3.1.0" + find-up: "npm:^5.0.0" + git-semver-tags: "npm:^4.0.0" + semver: "npm:^7.1.1" + stringify-package: "npm:^1.0.1" + yargs: "npm:^16.0.0" bin: standard-version: bin/cli.js - checksum: 55003206f7eca18ee9962566e5222d3930a1fa3c4692615d64e88f08873b9685837d669dc58361831bd3f211b6687c1681ad6a1749edf346b2db3e4564b4933c + checksum: 22aab8f4768b3d1126dae8cc74131119de140e760e7cb67b7278ae192d700fe51ffc153691de1dd1c6e1589f9828d052981684e7b9b6b9b8a30e5681e624dbc5 languageName: node linkType: hard "statuses@npm:2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" - checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb + checksum: 34378b207a1620a24804ce8b5d230fea0c279f00b18a7209646d5d47e419d1cc23e7cbf33a25a1e51ac38973dc2ac2e1e9c647a8e481ef365f77668d72becfd0 + languageName: node + linkType: hard + +"stream-to-array@npm:^2.3.0": + version: 2.3.0 + resolution: "stream-to-array@npm:2.3.0" + dependencies: + any-promise: "npm:^1.1.0" + checksum: 19d66e4e3c12e0aadd8755027edf7d90b696bd978eec5111a5cd2b67befa8851afd8c1b618121c3059850165c4ee4afc307f84869cf6db7fb24708d3523958f8 languageName: node linkType: hard "string-argv@npm:~0.3.1": - version: 0.3.1 - resolution: "string-argv@npm:0.3.1" - checksum: efbd0289b599bee808ce80820dfe49c9635610715429c6b7cc50750f0437e3c2f697c81e5c390208c13b5d5d12d904a1546172a88579f6ee5cbaaaa4dc9ec5cf + version: 0.3.2 + resolution: "string-argv@npm:0.3.2" + checksum: 75c02a83759ad1722e040b86823909d9a2fc75d15dd71ec4b537c3560746e33b5f5a07f7332d1e3f88319909f82190843aa2f0a0d8c8d591ec08e93d5b8dec82 languageName: node linkType: hard -"string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": +"string-width-cjs@npm:string-width@^4.2.0, string-width@npm:^1.0.2 || 2 || 3 || 4, string-width@npm:^4.1.0, string-width@npm:^4.2.0, string-width@npm:^4.2.3": version: 4.2.3 resolution: "string-width@npm:4.2.3" dependencies: - emoji-regex: ^8.0.0 - is-fullwidth-code-point: ^3.0.0 - strip-ansi: ^6.0.1 - checksum: e52c10dc3fbfcd6c3a15f159f54a90024241d0f149cf8aed2982a2d801d2e64df0bf1dc351cf8e95c3319323f9f220c16e740b06faecd53e2462df1d2b5443fb + emoji-regex: "npm:^8.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + strip-ansi: "npm:^6.0.1" + checksum: 1e525e92e5eae0afd7454086eed9c818ee84374bb80328fc41217ae72ff5f065ef1c9d7f72da41de40c75fa8bb3dee63d92373fd492c84260a552c636392a47b languageName: node linkType: hard -"string-width@npm:^5.0.0": +"string-width@npm:^5.0.1, string-width@npm:^5.1.2": version: 5.1.2 resolution: "string-width@npm:5.1.2" dependencies: - eastasianwidth: ^0.2.0 - emoji-regex: ^9.2.2 - strip-ansi: ^7.0.1 - checksum: 7369deaa29f21dda9a438686154b62c2c5f661f8dda60449088f9f980196f7908fc39fdd1803e3e01541970287cf5deae336798337e9319a7055af89dafa7193 + eastasianwidth: "npm:^0.2.0" + emoji-regex: "npm:^9.2.2" + strip-ansi: "npm:^7.0.1" + checksum: ab9c4264443d35b8b923cbdd513a089a60de339216d3b0ed3be3ba57d6880e1a192b70ae17225f764d7adbf5994e9bb8df253a944736c15a0240eff553c678ca languageName: node linkType: hard -"string.prototype.trimend@npm:^1.0.6": - version: 1.0.6 - resolution: "string.prototype.trimend@npm:1.0.6" +"string-width@npm:^7.0.0": + version: 7.0.0 + resolution: "string-width@npm:7.0.0" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 0fdc34645a639bd35179b5a08227a353b88dc089adf438f46be8a7c197fc3f22f8514c1c9be4629b3cd29c281582730a8cbbad6466c60f76b5f99cf2addb132e + emoji-regex: "npm:^10.3.0" + get-east-asian-width: "npm:^1.0.0" + strip-ansi: "npm:^7.1.0" + checksum: 8ffaeeccf4a56ccce5b6235d0b99ee3a581e3e3e5d453708efe7aa8e264fa3a858b4fe2244310cb71c6a20d8c05921cedc8b2ccd88cbaad9f5c92051ff68edc6 languageName: node linkType: hard -"string.prototype.trimstart@npm:^1.0.6": - version: 1.0.6 - resolution: "string.prototype.trimstart@npm:1.0.6" +"string.prototype.trim@npm:^1.2.8": + version: 1.2.8 + resolution: "string.prototype.trim@npm:1.2.8" dependencies: - call-bind: ^1.0.2 - define-properties: ^1.1.4 - es-abstract: ^1.20.4 - checksum: 89080feef416621e6ef1279588994305477a7a91648d9436490d56010a1f7adc39167cddac7ce0b9884b8cdbef086987c4dcb2960209f2af8bac0d23ceff4f41 + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 4f76c583908bcde9a71208ddff38f67f24c9ec8093631601666a0df8b52fad44dad2368c78895ce83eb2ae8e7068294cc96a02fc971ab234e4d5c9bb61ea4e34 + languageName: node + linkType: hard + +"string.prototype.trimend@npm:^1.0.7": + version: 1.0.7 + resolution: "string.prototype.trimend@npm:1.0.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 53c24911c7c4d8d65f5ef5322de23a3d5b6b4db73273e05871d5ab4571ae5638f38f7f19d71d09116578fb060e5a145cc6a208af2d248c8baf7a34f44d32ce57 + languageName: node + linkType: hard + +"string.prototype.trimstart@npm:^1.0.7": + version: 1.0.7 + resolution: "string.prototype.trimstart@npm:1.0.7" + dependencies: + call-bind: "npm:^1.0.2" + define-properties: "npm:^1.2.0" + es-abstract: "npm:^1.22.1" + checksum: 0bcf391b41ea16d4fda9c9953d0a7075171fe090d33b4cf64849af94944c50862995672ac03e0c5dba2940a213ad7f53515a668dac859ce22a0276289ae5cf4f languageName: node linkType: hard @@ -8454,8 +8797,8 @@ __metadata: version: 1.3.0 resolution: "string_decoder@npm:1.3.0" dependencies: - safe-buffer: ~5.2.0 - checksum: 8417646695a66e73aefc4420eb3b84cc9ffd89572861fe004e6aeb13c7bc00e2f616247505d2dbbef24247c372f70268f594af7126f43548565c68c117bdeb56 + safe-buffer: "npm:~5.2.0" + checksum: 810614ddb030e271cd591935dcd5956b2410dd079d64ff92a1844d6b7588bf992b3e1b69b0f4d34a3e06e0bd73046ac646b5264c1987b20d0601f81ef35d731d languageName: node linkType: hard @@ -8463,8 +8806,8 @@ __metadata: version: 1.1.1 resolution: "string_decoder@npm:1.1.1" dependencies: - safe-buffer: ~5.1.0 - checksum: 9ab7e56f9d60a28f2be697419917c50cac19f3e8e6c28ef26ed5f4852289fe0de5d6997d29becf59028556f2c62983790c1d9ba1e2a3cc401768ca12d5183a5b + safe-buffer: "npm:~5.1.0" + checksum: b4f89f3a92fd101b5653ca3c99550e07bdf9e13b35037e9e2a1c7b47cec4e55e06ff3fc468e314a0b5e80bfbaf65c1ca5a84978764884ae9413bec1fc6ca924e languageName: node linkType: hard @@ -8472,56 +8815,56 @@ __metadata: version: 3.3.0 resolution: "stringify-object@npm:3.3.0" dependencies: - get-own-enumerable-property-symbols: ^3.0.0 - is-obj: ^1.0.1 - is-regexp: ^1.0.0 - checksum: 6827a3f35975cfa8572e8cd3ed4f7b262def260af18655c6fde549334acdac49ddba69f3c861ea5a6e9c5a4990fe4ae870b9c0e6c31019430504c94a83b7a154 + get-own-enumerable-property-symbols: "npm:^3.0.0" + is-obj: "npm:^1.0.1" + is-regexp: "npm:^1.0.0" + checksum: ba8078f84128979ee24b3de9a083489cbd3c62cb8572a061b47d4d82601a8ae4b4d86fa8c54dd955593da56bb7c16a6de51c27221fdc6b7139bb4f29d815f35b languageName: node linkType: hard "stringify-package@npm:^1.0.1": version: 1.0.1 resolution: "stringify-package@npm:1.0.1" - checksum: 462036085a0cf7ae073d9b88a2bbf7efb3792e3df3e1fd436851f64196eb0234c8f8ffac436357e355687d6030b7af42e98af9515929e41a6a5c8653aa62a5aa + checksum: d531d27f29f31680d0d80ae7d4f4515b2a5988550f40f5f73bfc812f89c5fd2ea91a2ceb2361d04b03cfd8b49ee5715191fab252eea3618eee0b6c6ad9d882c8 languageName: node linkType: hard -"strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1, strip-ansi@npm:^6.0.0, strip-ansi@npm:^6.0.1": version: 6.0.1 resolution: "strip-ansi@npm:6.0.1" dependencies: - ansi-regex: ^5.0.1 - checksum: f3cd25890aef3ba6e1a74e20896c21a46f482e93df4a06567cebf2b57edabb15133f1f94e57434e0a958d61186087b1008e89c94875d019910a213181a14fc8c + ansi-regex: "npm:^5.0.1" + checksum: 1ae5f212a126fe5b167707f716942490e3933085a5ff6c008ab97ab2f272c8025d3aa218b7bd6ab25729ca20cc81cddb252102f8751e13482a5199e873680952 languageName: node linkType: hard -"strip-ansi@npm:^7.0.1": - version: 7.0.1 - resolution: "strip-ansi@npm:7.0.1" +"strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": + version: 7.1.0 + resolution: "strip-ansi@npm:7.1.0" dependencies: - ansi-regex: ^6.0.1 - checksum: 257f78fa433520e7f9897722731d78599cb3fce29ff26a20a5e12ba4957463b50a01136f37c43707f4951817a75e90820174853d6ccc240997adc5df8f966039 + ansi-regex: "npm:^6.0.1" + checksum: a198c3762e8832505328cbf9e8c8381de14a4fa50a4f9b2160138158ea88c0f5549fb50cb13c651c3088f47e63a108b34622ec18c0499b6c8c3a5ddf6b305ac4 languageName: node linkType: hard "strip-bom@npm:4.0.0": version: 4.0.0 resolution: "strip-bom@npm:4.0.0" - checksum: 9dbcfbaf503c57c06af15fe2c8176fb1bf3af5ff65003851a102749f875a6dbe0ab3b30115eccf6e805e9d756830d3e40ec508b62b3f1ddf3761a20ebe29d3f3 + checksum: 26abad1172d6bc48985ab9a5f96c21e440f6e7e476686de49be813b5a59b3566dccb5c525b831ec54fe348283b47f3ffb8e080bc3f965fde12e84df23f6bb7ef languageName: node linkType: hard "strip-bom@npm:^3.0.0": version: 3.0.0 resolution: "strip-bom@npm:3.0.0" - checksum: 8d50ff27b7ebe5ecc78f1fe1e00fcdff7af014e73cf724b46fb81ef889eeb1015fc5184b64e81a2efe002180f3ba431bdd77e300da5c6685d702780fbf0c8d5b + checksum: 51201f50e021ef16672593d7434ca239441b7b760e905d9f33df6e4f3954ff54ec0e0a06f100d028af0982d6f25c35cd5cda2ce34eaebccd0250b8befb90d8f1 languageName: node linkType: hard -"strip-final-newline@npm:^2.0.0": - version: 2.0.0 - resolution: "strip-final-newline@npm:2.0.0" - checksum: 69412b5e25731e1938184b5d489c32e340605bb611d6140344abc3421b7f3c6f9984b21dff296dfcf056681b82caa3bb4cc996a965ce37bcfad663e92eae9c64 +"strip-final-newline@npm:^3.0.0": + version: 3.0.0 + resolution: "strip-final-newline@npm:3.0.0" + checksum: a771a17901427bac6293fd416db7577e2bc1c34a19d38351e9d5478c3c415f523f391003b42ed475f27e33a78233035df183525395f731d3bfb8cdcbd4da08ce languageName: node linkType: hard @@ -8529,31 +8872,22 @@ __metadata: version: 3.0.0 resolution: "strip-indent@npm:3.0.0" dependencies: - min-indent: ^1.0.0 - checksum: 18f045d57d9d0d90cd16f72b2313d6364fd2cb4bf85b9f593523ad431c8720011a4d5f08b6591c9d580f446e78855c5334a30fb91aa1560f5d9f95ed1b4a0530 - languageName: node - linkType: hard - -"strip-indent@npm:^4.0.0": - version: 4.0.0 - resolution: "strip-indent@npm:4.0.0" - dependencies: - min-indent: ^1.0.1 - checksum: 06cbcd93da721c46bc13caeb1c00af93a9b18146a1c95927672d2decab6a25ad83662772417cea9317a2507fb143253ecc23c4415b64f5828cef9b638a744598 + min-indent: "npm:^1.0.0" + checksum: ae0deaf41c8d1001c5d4fbe16cb553865c1863da4fae036683b474fa926af9fc121e155cb3fc57a68262b2ae7d5b8420aa752c97a6428c315d00efe2a3875679 languageName: node linkType: hard -"strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.1.0, strip-json-comments@npm:^3.1.1, strip-json-comments@npm:~3.1.1": +"strip-json-comments@npm:3.1.1, strip-json-comments@npm:^3.1.1, strip-json-comments@npm:~3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" - checksum: 492f73e27268f9b1c122733f28ecb0e7e8d8a531a6662efbd08e22cccb3f9475e90a1b82cab06a392f6afae6d2de636f977e231296400d0ec5304ba70f166443 + checksum: 9681a6257b925a7fa0f285851c0e613cc934a50661fa7bb41ca9cbbff89686bb4a0ee366e6ecedc4daafd01e83eee0720111ab294366fe7c185e935475ebcecd languageName: node linkType: hard "strip-json-comments@npm:~2.0.1": version: 2.0.1 resolution: "strip-json-comments@npm:2.0.1" - checksum: 1074ccb63270d32ca28edfb0a281c96b94dc679077828135141f27d52a5a398ef5e78bcf22809d23cadc2b81dfbe345eb5fd8699b385c8b1128907dec4a7d1e1 + checksum: b509231cbdee45064ff4f9fd73609e2bcc4e84a4d508e9dd0f31f70356473fde18abfb5838c17d56fb236f5a06b102ef115438de0600b749e818a35fbbc48c43 languageName: node linkType: hard @@ -8561,9 +8895,9 @@ __metadata: version: 7.0.0 resolution: "strtok3@npm:7.0.0" dependencies: - "@tokenizer/token": ^0.3.0 - peek-readable: ^5.0.0 - checksum: 2ebe7ad8f2aea611dec6742cf6a42e82764892a362907f7ce493faf334501bf981ce21c828dcc300457e6d460dc9c34d644ededb3b01dcb9e37559203cf1748c + "@tokenizer/token": "npm:^0.3.0" + peek-readable: "npm:^5.0.0" + checksum: 63a72b10a302719242bfd31ca53955a06bb091dfec46ef14ca10c4b17ab15780ed8365cd5b270cfbde92d571f677539957add436e4bf9cccdf9977b40d762583 languageName: node linkType: hard @@ -8571,11 +8905,11 @@ __metadata: version: 3.0.2 resolution: "stylus-lookup@npm:3.0.2" dependencies: - commander: ^2.8.1 - debug: ^4.1.0 + commander: "npm:^2.8.1" + debug: "npm:^4.1.0" bin: stylus-lookup: bin/cli.js - checksum: 460e9b6e7e662e2cf98d41ee670cb5da9ec8b8dbc1d4574de29ac422c632d5c7933772822fc12792f2ee9f9c2f62b3f60ed5850690e7c780ab7b6f07010199e4 + checksum: cf387d99e1bf0f5e9a13ef3332b261ef902bc0846e417aeb2a33c19b6ce634386efa26c13c0c73fc66b32ba9ff51d27f3f9051354c94902662d258ab9ea15da2 languageName: node linkType: hard @@ -8583,11 +8917,11 @@ __metadata: version: 3.0.1 resolution: "supertap@npm:3.0.1" dependencies: - indent-string: ^5.0.0 - js-yaml: ^3.14.1 - serialize-error: ^7.0.1 - strip-ansi: ^7.0.1 - checksum: ee3d71c1d25f7f15d4a849e72b0c5f430df7cd8f702cf082fdbec5642a9546be6557766745655fa3a3e9c88f7c7eed849f2d74457b5b72cb9d94a779c0c8a948 + indent-string: "npm:^5.0.0" + js-yaml: "npm:^3.14.1" + serialize-error: "npm:^7.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 8164674f2e280cab875f0fef5bb36c15553c13e29697ff92f4e0d6bc62149f0303a89eee47535413ed145ea72e14a24d065bab233059d48a499ec5ebb4566b0f languageName: node linkType: hard @@ -8595,8 +8929,8 @@ __metadata: version: 5.5.0 resolution: "supports-color@npm:5.5.0" dependencies: - has-flag: ^3.0.0 - checksum: 95f6f4ba5afdf92f495b5a912d4abee8dcba766ae719b975c56c084f5004845f6f5a5f7769f52d53f40e21952a6d87411bafe34af4a01e65f9926002e38e1dac + has-flag: "npm:^3.0.0" + checksum: 6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 languageName: node linkType: hard @@ -8604,94 +8938,55 @@ __metadata: version: 7.2.0 resolution: "supports-color@npm:7.2.0" dependencies: - has-flag: ^4.0.0 - checksum: 3dda818de06ebbe5b9653e07842d9479f3555ebc77e9a0280caf5a14fb877ffee9ed57007c3b78f5a6324b8dbeec648d9e97a24e2ed9fdb81ddc69ea07100f4a + has-flag: "npm:^4.0.0" + checksum: afb4c88521b8b136b5f5f95160c98dee7243dc79d5432db7efc27efb219385bbc7d9427398e43dd6cc730a0f87d5085ce1652af7efbe391327bc0a7d0f7fc124 languageName: node linkType: hard "supports-preserve-symlinks-flag@npm:^1.0.0": version: 1.0.0 resolution: "supports-preserve-symlinks-flag@npm:1.0.0" - checksum: 53b1e247e68e05db7b3808b99b892bd36fb096e6fba213a06da7fab22045e97597db425c724f2bbd6c99a3c295e1e73f3e4de78592289f38431049e1277ca0ae + checksum: 6c4032340701a9950865f7ae8ef38578d8d7053f5e10518076e6554a9381fa91bd9c6850193695c141f32b21f979c985db07265a758867bac95de05f7d8aeb39 languageName: node linkType: hard "tapable@npm:^2.2.0": version: 2.2.1 resolution: "tapable@npm:2.2.1" - checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51 - languageName: node - linkType: hard - -"tar-fs@npm:2.1.1": - version: 2.1.1 - resolution: "tar-fs@npm:2.1.1" - dependencies: - chownr: ^1.1.1 - mkdirp-classic: ^0.5.2 - pump: ^3.0.0 - tar-stream: ^2.1.4 - checksum: f5b9a70059f5b2969e65f037b4e4da2daf0fa762d3d232ffd96e819e3f94665dbbbe62f76f084f1acb4dbdcce16c6e4dac08d12ffc6d24b8d76720f4d9cf032d - languageName: node - linkType: hard - -"tar-stream@npm:^2.1.4": - version: 2.2.0 - resolution: "tar-stream@npm:2.2.0" - dependencies: - bl: ^4.0.3 - end-of-stream: ^1.4.1 - fs-constants: ^1.0.0 - inherits: ^2.0.3 - readable-stream: ^3.1.1 - checksum: 699831a8b97666ef50021c767f84924cfee21c142c2eb0e79c63254e140e6408d6d55a065a2992548e72b06de39237ef2b802b99e3ece93ca3904a37622a66f3 + checksum: bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 languageName: node linkType: hard "tar@npm:^6.1.11, tar@npm:^6.1.2": - version: 6.1.13 - resolution: "tar@npm:6.1.13" + version: 6.2.0 + resolution: "tar@npm:6.2.0" dependencies: - chownr: ^2.0.0 - fs-minipass: ^2.0.0 - minipass: ^4.0.0 - minizlib: ^2.1.1 - mkdirp: ^1.0.3 - yallist: ^4.0.0 - checksum: 8a278bed123aa9f53549b256a36b719e317c8b96fe86a63406f3c62887f78267cea9b22dc6f7007009738509800d4a4dccc444abd71d762287c90f35b002eb1c - languageName: node - linkType: hard - -"temp-dir@npm:^2.0.0": - version: 2.0.0 - resolution: "temp-dir@npm:2.0.0" - checksum: cc4f0404bf8d6ae1a166e0e64f3f409b423f4d1274d8c02814a59a5529f07db6cd070a749664141b992b2c1af337fa9bb451a460a43bb9bcddc49f235d3115aa + chownr: "npm:^2.0.0" + fs-minipass: "npm:^2.0.0" + minipass: "npm:^5.0.0" + minizlib: "npm:^2.1.1" + mkdirp: "npm:^1.0.3" + yallist: "npm:^4.0.0" + checksum: 02ca064a1a6b4521fef88c07d389ac0936730091f8c02d30ea60d472e0378768e870769ab9e986d87807bfee5654359cf29ff4372746cc65e30cbddc352660d8 languageName: node linkType: hard "temp-dir@npm:^3.0.0": version: 3.0.0 resolution: "temp-dir@npm:3.0.0" - checksum: 577211e995d1d584dd60f1469351d45e8a5b4524e4a9e42d3bdd12cfde1d0bb8f5898311bef24e02aaafb69514c1feb58c7b4c33dcec7129da3b0861a4ca935b - languageName: node - linkType: hard - -"temp@npm:~0.4.0": - version: 0.4.0 - resolution: "temp@npm:0.4.0" - checksum: 8b83f98833b7f6cd03a1f523d17f8b06fe687cbdfc5654ae41edacdf640e71f1057c3cf2534ac44e265834c1af6270d9a0b9baeee6b86ccb2ef379e43dbc0d0a + checksum: a86978a400984cd5f315b77ebf3fe53bb58c61f192278cafcb1f3fb32d584a21dc8e08b93171d7874b7cc972234d3455c467306cc1bfc4524b622e5ad3bfd671 languageName: node linkType: hard -"tempy@npm:^3.0.0": - version: 3.0.0 - resolution: "tempy@npm:3.0.0" +"tempy@npm:^3.1.0": + version: 3.1.0 + resolution: "tempy@npm:3.1.0" dependencies: - is-stream: ^3.0.0 - temp-dir: ^2.0.0 - type-fest: ^2.12.2 - unique-string: ^3.0.0 - checksum: 52138bfda3854b09cef5b4ded773e4daeebc910888d5d3bbc348adcc5f935661e07b1b1ba291e3bbb5b4f42c6e04f912b80a0d37812cf8940bdf271f18f7364d + is-stream: "npm:^3.0.0" + temp-dir: "npm:^3.0.0" + type-fest: "npm:^2.12.2" + unique-string: "npm:^3.0.0" + checksum: b88e70baa8d935ba8f0e0372b59ad1a961121f098da5fb4a6e05bec98ec32a49026b553532fb75c1c102ec782fd4c6a6bde0d46cbe87013fa324451ce476fb76 languageName: node linkType: hard @@ -8699,24 +8994,24 @@ __metadata: version: 6.0.0 resolution: "test-exclude@npm:6.0.0" dependencies: - "@istanbuljs/schema": ^0.1.2 - glob: ^7.1.4 - minimatch: ^3.0.4 - checksum: 3b34a3d77165a2cb82b34014b3aba93b1c4637a5011807557dc2f3da826c59975a5ccad765721c4648b39817e3472789f9b0fa98fc854c5c1c7a1e632aacdc28 + "@istanbuljs/schema": "npm:^0.1.2" + glob: "npm:^7.1.4" + minimatch: "npm:^3.0.4" + checksum: 019d33d81adff3f9f1bfcff18125fb2d3c65564f437d9be539270ee74b994986abb8260c7c2ce90e8f30162178b09dbbce33c6389273afac4f36069c48521f57 languageName: node linkType: hard "text-extensions@npm:^1.0.0": version: 1.9.0 resolution: "text-extensions@npm:1.9.0" - checksum: 56a9962c1b62d39b2bcb369b7558ca85c1b55e554b38dfd725edcc0a1babe5815782a60c17ff6b839093b163dfebb92b804208aaaea616ec7571c8059ae0cf44 + checksum: 9ad5a9f723a871e2d884e132d7e93f281c60b5759c95f3f6b04704856548715d93a36c10dbaf5f12b91bf405f0cf3893bf169d4d143c0f5509563b992d385443 languageName: node linkType: hard "text-table@npm:^0.2.0": version: 0.2.0 resolution: "text-table@npm:0.2.0" - checksum: b6937a38c80c7f84d9c11dd75e49d5c44f71d95e810a3250bd1f1797fc7117c57698204adf676b71497acc205d769d65c16ae8fa10afad832ae1322630aef10a + checksum: 02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c languageName: node linkType: hard @@ -8724,9 +9019,9 @@ __metadata: version: 2.0.5 resolution: "through2@npm:2.0.5" dependencies: - readable-stream: ~2.3.6 - xtend: ~4.0.1 - checksum: beb0f338aa2931e5660ec7bf3ad949e6d2e068c31f4737b9525e5201b824ac40cac6a337224856b56bd1ddd866334bbfb92a9f57cd6f66bc3f18d3d86fc0fe50 + readable-stream: "npm:~2.3.6" + xtend: "npm:~4.0.1" + checksum: cbfe5b57943fa12b4f8c043658c2a00476216d79c014895cef1ac7a1d9a8b31f6b438d0e53eecbb81054b93128324a82ecd59ec1a4f91f01f7ac113dcb14eade languageName: node linkType: hard @@ -8734,22 +9029,22 @@ __metadata: version: 4.0.2 resolution: "through2@npm:4.0.2" dependencies: - readable-stream: 3 - checksum: ac7430bd54ccb7920fd094b1c7ff3e1ad6edd94202e5528331253e5fde0cc56ceaa690e8df9895de2e073148c52dfbe6c4db74cacae812477a35660090960cc0 + readable-stream: "npm:3" + checksum: 3741564ae99990a4a79097fe7a4152c22348adc4faf2df9199a07a66c81ed2011da39f631e479fdc56483996a9d34a037ad64e76d79f18c782ab178ea9b6778c languageName: node linkType: hard -"through@npm:2, through@npm:>=2.2.7 <3, through@npm:^2.3.6, through@npm:^2.3.8": +"through@npm:2, through@npm:>=2.2.7 <3, through@npm:^2.3.6": version: 2.3.8 resolution: "through@npm:2.3.8" - checksum: a38c3e059853c494af95d50c072b83f8b676a9ba2818dcc5b108ef252230735c54e0185437618596c790bbba8fcdaef5b290405981ffa09dce67b1f1bf190cbd + checksum: 4b09f3774099de0d4df26d95c5821a62faee32c7e96fb1f4ebd54a2d7c11c57fe88b0a0d49cf375de5fee5ae6bf4eb56dbbf29d07366864e2ee805349970d3cc languageName: node linkType: hard "time-zone@npm:^1.0.0": version: 1.0.0 resolution: "time-zone@npm:1.0.0" - checksum: e46f5a69b8c236dcd8e91e29d40d4e7a3495ed4f59888c3f84ce1d9678e20461421a6ba41233509d47dd94bc18f1a4377764838b21b584663f942b3426dcbce8 + checksum: d00ebd885039109011b6e2423ebbf225160927333c2ade6d833e9cc4676db20759f1f3855fafde00d1bd668c243a6aa68938ce71fe58aab0d514e820d59c1d81 languageName: node linkType: hard @@ -8757,15 +9052,15 @@ __metadata: version: 0.0.33 resolution: "tmp@npm:0.0.33" dependencies: - os-tmpdir: ~1.0.2 - checksum: 902d7aceb74453ea02abbf58c203f4a8fc1cead89b60b31e354f74ed5b3fb09ea817f94fb310f884a5d16987dd9fa5a735412a7c2dd088dd3d415aa819ae3a28 + os-tmpdir: "npm:~1.0.2" + checksum: 69863947b8c29cabad43fe0ce65cec5bb4b481d15d4b4b21e036b060b3edbf3bc7a5541de1bacb437bb3f7c4538f669752627fdf9b4aaf034cebd172ba373408 languageName: node linkType: hard "to-fast-properties@npm:^2.0.0": version: 2.0.0 resolution: "to-fast-properties@npm:2.0.0" - checksum: be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 + checksum: b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 languageName: node linkType: hard @@ -8773,15 +9068,15 @@ __metadata: version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" dependencies: - is-number: ^7.0.0 - checksum: f76fa01b3d5be85db6a2a143e24df9f60dd047d151062d0ba3df62953f2f697b16fe5dad9b0ac6191c7efc7b1d9dcaa4b768174b7b29da89d4428e64bc0a20ed + is-number: "npm:^7.0.0" + checksum: 487988b0a19c654ff3e1961b87f471702e708fa8a8dd02a298ef16da7206692e8552a0250e8b3e8759270f62e9d8314616f6da274734d3b558b1fc7b7724e892 languageName: node linkType: hard "toidentifier@npm:1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1" - checksum: 952c29e2a85d7123239b5cfdd889a0dde47ab0497f0913d70588f19c53f7e0b5327c95f4651e413c74b785147f9637b17410ac8c846d5d4a20a5a33eb6dc3a45 + checksum: 93937279934bd66cc3270016dd8d0afec14fb7c94a05c72dc57321f8bd1fa97e5bea6d1f7c89e728d077ca31ea125b78320a616a6c6cd0e6b9cb94cb864381c1 languageName: node linkType: hard @@ -8789,111 +9084,82 @@ __metadata: version: 5.0.1 resolution: "token-types@npm:5.0.1" dependencies: - "@tokenizer/token": ^0.3.0 - ieee754: ^1.2.1 - checksum: 32780123bc6ce8b6a2231d860445c994a02a720abf38df5583ea957aa6626873cd1c4dd8af62314da4cf16ede00c379a765707a3b06f04b8808c38efdae1c785 + "@tokenizer/token": "npm:^0.3.0" + ieee754: "npm:^1.2.1" + checksum: cb671b2b52271362816d22b7a076082b0da033cd7807992b81ae53cfd8541bd013ac29e455c3c7a8bb4f88aa1c5315a12353c3599b7f568df238d3c1723f9d8d languageName: node linkType: hard "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" - checksum: 726321c5eaf41b5002e17ffbd1fb7245999a073e8979085dacd47c4b4e8068ff5777142fc6726d6ca1fd2ff16921b48788b87225cbc57c72636f6efa8efbffe3 + checksum: 047cb209a6b60c742f05c9d3ace8fa510bff609995c129a37ace03476a9b12db4dbf975e74600830ef0796e18882b2381fb5fb1f6b4f96b832c374de3ab91a11 languageName: node linkType: hard "trim-newlines@npm:^3.0.0": version: 3.0.1 resolution: "trim-newlines@npm:3.0.1" - checksum: b530f3fadf78e570cf3c761fb74fef655beff6b0f84b29209bac6c9622db75ad1417f4a7b5d54c96605dcd72734ad44526fef9f396807b90839449eb543c6206 + checksum: 03cfefde6c59ff57138412b8c6be922ecc5aec30694d784f2a65ef8dcbd47faef580b7de0c949345abdc56ec4b4abf64dd1e5aea619b200316e471a3dd5bf1f6 languageName: node linkType: hard -"trim-newlines@npm:^4.0.2": - version: 4.0.2 - resolution: "trim-newlines@npm:4.0.2" - checksum: 1eef206eb77361856dff0b827e5811baf64574bb21e81b7ad643fe321c5c19b0a452dd83e9afc31206993fcff9bb90a379925d7b5915f887de1ca7da5b57933a +"ts-api-utils@npm:^1.0.1": + version: 1.0.3 + resolution: "ts-api-utils@npm:1.0.3" + peerDependencies: + typescript: ">=4.2.0" + checksum: 9408338819c3aca2a709f0bc54e3f874227901506cacb1163612a6c8a43df224174feb965a5eafdae16f66fc68fd7bfee8d3275d0fa73fbb8699e03ed26520c9 languageName: node linkType: hard -"ts-json-schema-generator@npm:^1.2.0": - version: 1.2.0 - resolution: "ts-json-schema-generator@npm:1.2.0" - dependencies: - "@types/json-schema": ^7.0.11 - commander: ^9.4.1 - glob: ^8.0.3 - json5: ^2.2.1 - normalize-path: ^3.0.0 - safe-stable-stringify: ^2.4.1 - typescript: ~4.9.3 +"ts-graphviz@npm:^1.5.0": + version: 1.8.1 + resolution: "ts-graphviz@npm:1.8.1" + checksum: 3dcb0896758e87912130f7a4f1853eee741955a1346ef07d67efacbea9827187d5746cebc4270bdc0d8e1008db30f9cc8dfb922db97a80679cc62ae498c0f68e + languageName: node + linkType: hard + +"ts-json-schema-generator@npm:^1.5.0": + version: 1.5.0 + resolution: "ts-json-schema-generator@npm:1.5.0" + dependencies: + "@types/json-schema": "npm:^7.0.12" + commander: "npm:^11.0.0" + glob: "npm:^8.0.3" + json5: "npm:^2.2.3" + normalize-path: "npm:^3.0.0" + safe-stable-stringify: "npm:^2.4.3" + typescript: "npm:~5.3.2" bin: ts-json-schema-generator: bin/ts-json-schema-generator - checksum: 855615d442f4834f03a2761955a350255f29f0b4197e2101a30a250062ca0fb793d8c1244ee313f716e075981ffe43d24c1d1fe6a7c23d62a6c05d0a3ba28ada - languageName: node - linkType: hard - -"ts-node@npm:^10.8.1": - version: 10.9.1 - resolution: "ts-node@npm:10.9.1" - dependencies: - "@cspotcode/source-map-support": ^0.8.0 - "@tsconfig/node10": ^1.0.7 - "@tsconfig/node12": ^1.0.7 - "@tsconfig/node14": ^1.0.0 - "@tsconfig/node16": ^1.0.2 - acorn: ^8.4.1 - acorn-walk: ^8.1.1 - arg: ^4.1.0 - create-require: ^1.1.0 - diff: ^4.0.1 - make-error: ^1.1.1 - v8-compile-cache-lib: ^3.0.1 - yn: 3.1.1 - peerDependencies: - "@swc/core": ">=1.2.50" - "@swc/wasm": ">=1.2.50" - "@types/node": "*" - typescript: ">=2.7" - peerDependenciesMeta: - "@swc/core": - optional: true - "@swc/wasm": - optional: true - bin: - ts-node: dist/bin.js - ts-node-cwd: dist/bin-cwd.js - ts-node-esm: dist/bin-esm.js - ts-node-script: dist/bin-script.js - ts-node-transpile-only: dist/bin-transpile.js - ts-script: dist/bin-script-deprecated.js - checksum: 090adff1302ab20bd3486e6b4799e90f97726ed39e02b39e566f8ab674fd5bd5f727f43615debbfc580d33c6d9d1c6b1b3ce7d8e3cca3e20530a145ffa232c35 + checksum: 7868e8920c218ba47ff0c05f6b8fd4d32d20b52327b05ad1f554788092073e0735f3c2baf08420f6408096c0c5c43e2c568b86d59fc1d8dc3c1ecb265e7596b3 languageName: node linkType: hard -"tsconfig-paths@npm:^3.10.1, tsconfig-paths@npm:^3.14.1": - version: 3.14.1 - resolution: "tsconfig-paths@npm:3.14.1" +"tsconfig-paths@npm:^3.10.1, tsconfig-paths@npm:^3.15.0": + version: 3.15.0 + resolution: "tsconfig-paths@npm:3.15.0" dependencies: - "@types/json5": ^0.0.29 - json5: ^1.0.1 - minimist: ^1.2.6 - strip-bom: ^3.0.0 - checksum: 8afa01c673ebb4782ba53d3a12df97fa837ce524f8ad38ee4e2b2fd57f5ac79abc21c574e9e9eb014d93efe7fe8214001b96233b5c6ea75bd1ea82afe17a4c6d + "@types/json5": "npm:^0.0.29" + json5: "npm:^1.0.2" + minimist: "npm:^1.2.6" + strip-bom: "npm:^3.0.0" + checksum: 5b4f301a2b7a3766a986baf8fc0e177eb80bdba6e396792ff92dc23b5bca8bb279fc96517dcaaef63a3b49bebc6c4c833653ec58155780bc906bdbcf7dda0ef5 languageName: node linkType: hard "tslib@npm:^1.8.1": version: 1.14.1 resolution: "tslib@npm:1.14.1" - checksum: dbe628ef87f66691d5d2959b3e41b9ca0045c3ee3c7c7b906cc1e328b39f199bb1ad9e671c39025bd56122ac57dfbf7385a94843b1cc07c60a4db74795829acd + checksum: 69ae09c49eea644bc5ebe1bca4fa4cc2c82b7b3e02f43b84bd891504edf66dbc6b2ec0eef31a957042de2269139e4acff911e6d186a258fb14069cd7f6febce2 languageName: node linkType: hard "tslib@npm:^2.1.0": - version: 2.4.1 - resolution: "tslib@npm:2.4.1" - checksum: 19480d6e0313292bd6505d4efe096a6b31c70e21cf08b5febf4da62e95c265c8f571f7b36fcc3d1a17e068032f59c269fab3459d6cd3ed6949eafecf64315fca + version: 2.6.2 + resolution: "tslib@npm:2.6.2" + checksum: e03a8a4271152c8b26604ed45535954c0a45296e32445b4b87f8a5abdb2421f40b59b4ca437c4346af0f28179780d604094eb64546bee2019d903d01c6c19bdb languageName: node linkType: hard @@ -8901,10 +9167,10 @@ __metadata: version: 3.21.0 resolution: "tsutils@npm:3.21.0" dependencies: - tslib: ^1.8.1 + tslib: "npm:^1.8.1" peerDependencies: typescript: ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - checksum: 1843f4c1b2e0f975e08c4c21caa4af4f7f65a12ac1b81b3b8489366826259323feb3fc7a243123453d2d1a02314205a7634e048d4a8009921da19f99755cdc48 + checksum: 02f19e458ec78ead8fffbf711f834ad8ecd2cc6ade4ec0320790713dccc0a412b99e7fd907c4cda2a1dc602c75db6f12e0108e87a5afad4b2f9e90a24cabd5a2 languageName: node linkType: hard @@ -8912,73 +9178,64 @@ __metadata: version: 0.4.0 resolution: "type-check@npm:0.4.0" dependencies: - prelude-ls: ^1.2.1 - checksum: ec688ebfc9c45d0c30412e41ca9c0cdbd704580eb3a9ccf07b9b576094d7b86a012baebc95681999dd38f4f444afd28504cb3a89f2ef16b31d4ab61a0739025a - languageName: node - linkType: hard - -"type-check@npm:~0.3.2": - version: 0.3.2 - resolution: "type-check@npm:0.3.2" - dependencies: - prelude-ls: ~1.1.2 - checksum: dd3b1495642731bc0e1fc40abe5e977e0263005551ac83342ecb6f4f89551d106b368ec32ad3fb2da19b3bd7b2d1f64330da2ea9176d8ddbfe389fb286eb5124 + prelude-ls: "npm:^1.2.1" + checksum: 7b3fd0ed43891e2080bf0c5c504b418fbb3e5c7b9708d3d015037ba2e6323a28152ec163bcb65212741fa5d2022e3075ac3c76440dbd344c9035f818e8ecee58 languageName: node linkType: hard "type-fest@npm:^0.13.1": version: 0.13.1 resolution: "type-fest@npm:0.13.1" - checksum: e6bf2e3c449f27d4ef5d56faf8b86feafbc3aec3025fc9a5fbe2db0a2587c44714521f9c30d8516a833c8c506d6263f5cc11267522b10c6ccdb6cc55b0a9d1c4 + checksum: 0c0fa07ae53d4e776cf4dac30d25ad799443e9eef9226f9fddbb69242db86b08584084a99885cfa5a9dfe4c063ebdc9aa7b69da348e735baede8d43f1aeae93b languageName: node linkType: hard "type-fest@npm:^0.18.0": version: 0.18.1 resolution: "type-fest@npm:0.18.1" - checksum: e96dcee18abe50ec82dab6cbc4751b3a82046da54c52e3b2d035b3c519732c0b3dd7a2fa9df24efd1a38d953d8d4813c50985f215f1957ee5e4f26b0fe0da395 + checksum: 303f5ecf40d03e1d5b635ce7660de3b33c18ed8ebc65d64920c02974d9e684c72483c23f9084587e9dd6466a2ece1da42ddc95b412a461794dd30baca95e2bac languageName: node linkType: hard "type-fest@npm:^0.20.2": version: 0.20.2 resolution: "type-fest@npm:0.20.2" - checksum: 4fb3272df21ad1c552486f8a2f8e115c09a521ad7a8db3d56d53718d0c907b62c6e9141ba5f584af3f6830d0872c521357e512381f24f7c44acae583ad517d73 + checksum: dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 languageName: node linkType: hard "type-fest@npm:^0.21.3": version: 0.21.3 resolution: "type-fest@npm:0.21.3" - checksum: e6b32a3b3877f04339bae01c193b273c62ba7bfc9e325b8703c4ee1b32dc8fe4ef5dfa54bf78265e069f7667d058e360ae0f37be5af9f153b22382cd55a9afe0 + checksum: 902bd57bfa30d51d4779b641c2bc403cdf1371fb9c91d3c058b0133694fcfdb817aef07a47f40faf79039eecbaa39ee9d3c532deff244f3a19ce68cea71a61e8 languageName: node linkType: hard "type-fest@npm:^0.6.0": version: 0.6.0 resolution: "type-fest@npm:0.6.0" - checksum: b2188e6e4b21557f6e92960ec496d28a51d68658018cba8b597bd3ef757721d1db309f120ae987abeeda874511d14b776157ff809f23c6d1ce8f83b9b2b7d60f + checksum: 0c585c26416fce9ecb5691873a1301b5aff54673c7999b6f925691ed01f5b9232db408cdbb0bd003d19f5ae284322523f44092d1f81ca0a48f11f7cf0be8cd38 languageName: node linkType: hard "type-fest@npm:^0.8.1": version: 0.8.1 resolution: "type-fest@npm:0.8.1" - checksum: d61c4b2eba24009033ae4500d7d818a94fd6d1b481a8111612ee141400d5f1db46f199c014766b9fa9b31a6a7374d96fc748c6d688a78a3ce5a33123839becb7 + checksum: dffbb99329da2aa840f506d376c863bd55f5636f4741ad6e65e82f5ce47e6914108f44f340a0b74009b0cb5d09d6752ae83203e53e98b1192cf80ecee5651636 languageName: node linkType: hard -"type-fest@npm:^1.0.1, type-fest@npm:^1.2.1, type-fest@npm:^1.2.2": +"type-fest@npm:^1.0.1": version: 1.4.0 resolution: "type-fest@npm:1.4.0" - checksum: b011c3388665b097ae6a109a437a04d6f61d81b7357f74cbcb02246f2f5bd72b888ae33631b99871388122ba0a87f4ff1c94078e7119ff22c70e52c0ff828201 + checksum: a3c0f4ee28ff6ddf800d769eafafcdeab32efa38763c1a1b8daeae681920f6e345d7920bf277245235561d8117dab765cb5f829c76b713b4c9de0998a5397141 languageName: node linkType: hard "type-fest@npm:^2.12.2": version: 2.19.0 resolution: "type-fest@npm:2.19.0" - checksum: a4ef07ece297c9fba78fc1bd6d85dff4472fe043ede98bd4710d2615d15776902b595abf62bd78339ed6278f021235fb28a96361f8be86ed754f778973a0d278 + checksum: a5a7ecf2e654251613218c215c7493574594951c08e52ab9881c9df6a6da0aeca7528c213c622bc374b4e0cb5c443aa3ab758da4e3c959783ce884c3194e12cb languageName: node linkType: hard @@ -8986,9 +9243,45 @@ __metadata: version: 1.6.18 resolution: "type-is@npm:1.6.18" dependencies: - media-typer: 0.3.0 - mime-types: ~2.1.24 - checksum: 2c8e47675d55f8b4e404bcf529abdf5036c537a04c2b20177bcf78c9e3c1da69da3942b1346e6edb09e823228c0ee656ef0e033765ec39a70d496ef601a0c657 + media-typer: "npm:0.3.0" + mime-types: "npm:~2.1.24" + checksum: a23daeb538591b7efbd61ecf06b6feb2501b683ffdc9a19c74ef5baba362b4347e42f1b4ed81f5882a8c96a3bfff7f93ce3ffaf0cbbc879b532b04c97a55db9d + languageName: node + linkType: hard + +"typed-array-buffer@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-buffer@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + get-intrinsic: "npm:^1.2.1" + is-typed-array: "npm:^1.1.10" + checksum: ebad66cdf00c96b1395dffc7873169cf09801fca5954507a484f41f253feb1388d815db297b0b3bb8ce7421eac6f7ff45e2ec68450a3d68408aa4ae02fcf3a6c + languageName: node + linkType: hard + +"typed-array-byte-length@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-length@npm:1.0.0" + dependencies: + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + has-proto: "npm:^1.0.1" + is-typed-array: "npm:^1.1.10" + checksum: 6696435d53ce0e704ff6760c57ccc35138aec5f87859e03eb2a3246336d546feae367952dbc918116f3f0dffbe669734e3cbd8960283c2fa79aac925db50d888 + languageName: node + linkType: hard + +"typed-array-byte-offset@npm:^1.0.0": + version: 1.0.0 + resolution: "typed-array-byte-offset@npm:1.0.0" + dependencies: + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + has-proto: "npm:^1.0.1" + is-typed-array: "npm:^1.1.10" + checksum: 4036ce007ae9752931bed3dd61e0d6de2a3e5f6a5a85a05f3adb35388d2c0728f9b1a1e638d75579f168e49c289bfb5417f00e96d4ab081f38b647fc854ff7a5 languageName: node linkType: hard @@ -8996,10 +9289,10 @@ __metadata: version: 1.0.4 resolution: "typed-array-length@npm:1.0.4" dependencies: - call-bind: ^1.0.2 - for-each: ^0.3.3 - is-typed-array: ^1.1.9 - checksum: 2228febc93c7feff142b8c96a58d4a0d7623ecde6c7a24b2b98eb3170e99f7c7eff8c114f9b283085cd59dcd2bd43aadf20e25bba4b034a53c5bb292f71f8956 + call-bind: "npm:^1.0.2" + for-each: "npm:^0.3.3" + is-typed-array: "npm:^1.1.9" + checksum: c5163c0103d07fefc8a2ad0fc151f9ca9a1f6422098c00f695d55f9896e4d63614cd62cf8d8a031c6cee5f418e8980a533796597174da4edff075b3d275a7e23 languageName: node linkType: hard @@ -9007,91 +9300,91 @@ __metadata: version: 3.1.5 resolution: "typedarray-to-buffer@npm:3.1.5" dependencies: - is-typedarray: ^1.0.0 - checksum: 99c11aaa8f45189fcfba6b8a4825fd684a321caa9bd7a76a27cf0c7732c174d198b99f449c52c3818107430b5f41c0ccbbfb75cb2ee3ca4a9451710986d61a60 + is-typedarray: "npm:^1.0.0" + checksum: 4ac5b7a93d604edabf3ac58d3a2f7e07487e9f6e98195a080e81dbffdc4127817f470f219d794a843b87052cedef102b53ac9b539855380b8c2172054b7d5027 languageName: node linkType: hard "typedarray@npm:^0.0.6": version: 0.0.6 resolution: "typedarray@npm:0.0.6" - checksum: 33b39f3d0e8463985eeaeeacc3cb2e28bc3dfaf2a5ed219628c0b629d5d7b810b0eb2165f9f607c34871d5daa92ba1dc69f49051cf7d578b4cbd26c340b9d1b1 + checksum: 6005cb31df50eef8b1f3c780eb71a17925f3038a100d82f9406ac2ad1de5eb59f8e6decbdc145b3a1f8e5836e17b0c0002fb698b9fe2516b8f9f9ff602d36412 languageName: node linkType: hard -"typedoc@npm:^0.23.24": - version: 0.23.24 - resolution: "typedoc@npm:0.23.24" +"typedoc@npm:^0.25.6": + version: 0.25.6 + resolution: "typedoc@npm:0.25.6" dependencies: - lunr: ^2.3.9 - marked: ^4.2.5 - minimatch: ^5.1.2 - shiki: ^0.12.1 + lunr: "npm:^2.3.9" + marked: "npm:^4.3.0" + minimatch: "npm:^9.0.3" + shiki: "npm:^0.14.7" peerDependencies: - typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x bin: typedoc: bin/typedoc - checksum: b04f9afcba9a38d35631b08ca345f52700f9138f59b9729d7bfecf127c2a75dd6a053594db68f3141e4d7e63b701ffa5421cbdeb95f86b254257e05e240f4da0 + checksum: 4819d118d7795f237ae9ddc8cb0b2fd12493ea0a3c11d47114a2fa90700a0425233ea7e75f364d35663d9076af1e022caa04f6cbf7a999d19f0dc868b575d508 languageName: node linkType: hard -"typescript@npm:^3.9.10, typescript@npm:^3.9.5, typescript@npm:^3.9.7": - version: 3.9.10 - resolution: "typescript@npm:3.9.10" +"typescript@npm:5.3.3, typescript@npm:^5.3.3, typescript@npm:~5.3.2": + version: 5.3.3 + resolution: "typescript@npm:5.3.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 46c842e2cd4797b88b66ef06c9c41dd21da48b95787072ccf39d5f2aa3124361bc4c966aa1c7f709fae0509614d76751455b5231b12dbb72eb97a31369e1ff92 + checksum: e33cef99d82573624fc0f854a2980322714986bc35b9cb4d1ce736ed182aeab78e2cb32b385efa493b2a976ef52c53e20d6c6918312353a91850e2b76f1ea44f languageName: node linkType: hard -"typescript@npm:^4.6.4, typescript@npm:^4.9.4, typescript@npm:~4.9.3": - version: 4.9.4 - resolution: "typescript@npm:4.9.4" +"typescript@npm:^3.9.10, typescript@npm:^3.9.7": + version: 3.9.10 + resolution: "typescript@npm:3.9.10" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: e782fb9e0031cb258a80000f6c13530288c6d63f1177ed43f770533fdc15740d271554cdae86701c1dd2c83b082cea808b07e97fd68b38a172a83dbf9e0d0ef9 + checksum: 863cc06070fa18a0f9c6a83265fb4922a8b51bf6f2c6760fb0b73865305ce617ea4bc6477381f9f4b7c3a8cb4a455b054f5469e6e41307733fe6a2bd9aae82f8 languageName: node linkType: hard -"typescript@npm:~4.8.4": - version: 4.8.4 - resolution: "typescript@npm:4.8.4" +"typescript@npm:^4.0.0, typescript@npm:^4.9.5": + version: 4.9.5 + resolution: "typescript@npm:4.9.5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 3e4f061658e0c8f36c820802fa809e0fd812b85687a9a2f5430bc3d0368e37d1c9605c3ce9b39df9a05af2ece67b1d844f9f6ea8ff42819f13bcb80f85629af0 + checksum: 5f6cad2e728a8a063521328e612d7876e12f0d8a8390d3b3aaa452a6a65e24e9ac8ea22beb72a924fd96ea0a49ea63bb4e251fb922b12eedfb7f7a26475e5c56 languageName: node linkType: hard -"typescript@patch:typescript@^3.9.10#~builtin, typescript@patch:typescript@^3.9.5#~builtin, typescript@patch:typescript@^3.9.7#~builtin": - version: 3.9.10 - resolution: "typescript@patch:typescript@npm%3A3.9.10#~builtin::version=3.9.10&hash=3bd3d3" +"typescript@patch:typescript@npm%3A5.3.3#optional!builtin, typescript@patch:typescript@npm%3A^5.3.3#optional!builtin, typescript@patch:typescript@npm%3A~5.3.2#optional!builtin": + version: 5.3.3 + resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: dc7141ab555b23a8650a6787f98845fc11692063d02b75ff49433091b3af2fe3d773650dea18389d7c21f47d620fb3b110ea363dab4ab039417a6ccbbaf96fc2 + checksum: 1d0a5f4ce496c42caa9a30e659c467c5686eae15d54b027ee7866744952547f1be1262f2d40de911618c242b510029d51d43ff605dba8fb740ec85ca2d3f9500 languageName: node linkType: hard -"typescript@patch:typescript@^4.6.4#~builtin, typescript@patch:typescript@^4.9.4#~builtin, typescript@patch:typescript@~4.9.3#~builtin": - version: 4.9.4 - resolution: "typescript@patch:typescript@npm%3A4.9.4#~builtin::version=4.9.4&hash=ad5954" +"typescript@patch:typescript@npm%3A^3.9.10#optional!builtin, typescript@patch:typescript@npm%3A^3.9.7#optional!builtin": + version: 3.9.10 + resolution: "typescript@patch:typescript@npm%3A3.9.10#optional!builtin::version=3.9.10&hash=3bd3d3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 1caaea6cb7f813e64345190fddc4e6c924d0b698ab81189b503763c4a18f7f5501c69362979d36e19c042d89d936443e768a78b0675690b35eb663d19e0eae71 + checksum: 9041fb3886e7d6a560f985227b8c941d17a750f2edccb5f9b3a15a2480574654d9be803ad4a14aabcc2f2553c4d272a25fd698a7c42692f03f66b009fb46883c languageName: node linkType: hard -"typescript@patch:typescript@~4.8.4#~builtin": - version: 4.8.4 - resolution: "typescript@patch:typescript@npm%3A4.8.4#~builtin::version=4.8.4&hash=0102e9" +"typescript@patch:typescript@npm%3A^4.0.0#optional!builtin, typescript@patch:typescript@npm%3A^4.9.5#optional!builtin": + version: 4.9.5 + resolution: "typescript@patch:typescript@npm%3A4.9.5#optional!builtin::version=4.9.5&hash=289587" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 301459fc3eb3b1a38fe91bf96d98eb55da88a9cb17b4ef80b4d105d620f4d547ba776cc27b44cc2ef58b66eda23fe0a74142feb5e79a6fb99f54fc018a696afa + checksum: e3333f887c6829dfe0ab6c1dbe0dd1e3e2aeb56c66460cb85c5440c566f900c833d370ca34eb47558c0c69e78ced4bfe09b8f4f98b6de7afed9b84b8d1dd06a1 languageName: node linkType: hard @@ -9100,7 +9393,7 @@ __metadata: resolution: "uglify-js@npm:3.17.4" bin: uglifyjs: bin/uglifyjs - checksum: 7b3897df38b6fc7d7d9f4dcd658599d81aa2b1fb0d074829dd4e5290f7318dbca1f4af2f45acb833b95b1fe0ed4698662ab61b87e94328eb4c0a0d3435baf924 + checksum: 8b7fcdca69deb284fed7d2025b73eb747ce37f9aca6af53422844f46427152d5440601b6e2a033e77856a2f0591e4167153d5a21b68674ad11f662034ec13ced languageName: node linkType: hard @@ -9108,55 +9401,50 @@ __metadata: version: 1.0.2 resolution: "unbox-primitive@npm:1.0.2" dependencies: - call-bind: ^1.0.2 - has-bigints: ^1.0.2 - has-symbols: ^1.0.3 - which-boxed-primitive: ^1.0.2 - checksum: b7a1cf5862b5e4b5deb091672ffa579aa274f648410009c81cca63fed3b62b610c4f3b773f912ce545bb4e31edc3138975b5bc777fc6e4817dca51affb6380e9 + call-bind: "npm:^1.0.2" + has-bigints: "npm:^1.0.2" + has-symbols: "npm:^1.0.3" + which-boxed-primitive: "npm:^1.0.2" + checksum: 81ca2e81134167cc8f75fa79fbcc8a94379d6c61de67090986a2273850989dd3bae8440c163121b77434b68263e34787a675cbdcb34bb2f764c6b9c843a11b66 languageName: node linkType: hard -"unbzip2-stream@npm:1.4.3": - version: 1.4.3 - resolution: "unbzip2-stream@npm:1.4.3" - dependencies: - buffer: ^5.2.1 - through: ^2.3.8 - checksum: 0e67c4a91f4fa0fc7b4045f8b914d3498c2fc2e8c39c359977708ec85ac6d6029840e97f508675fdbdf21fcb8d276ca502043406f3682b70f075e69aae626d1d +"undici-types@npm:~5.26.4": + version: 5.26.5 + resolution: "undici-types@npm:5.26.5" + checksum: bb673d7876c2d411b6eb6c560e0c571eef4a01c1c19925175d16e3a30c4c428181fb8d7ae802a261f283e4166a0ac435e2f505743aa9e45d893f9a3df017b501 languageName: node linkType: hard -"uniq@npm:^1.0.1": - version: 1.0.1 - resolution: "uniq@npm:1.0.1" - checksum: 8206535f83745ea83f9da7035f3b983fd6ed5e35b8ed7745441944e4065b616bc67cf0d0a23a86b40ee0074426f0607f0a138f9b78e124eb6a7a6a6966055709 +"unicorn-magic@npm:^0.1.0": + version: 0.1.0 + resolution: "unicorn-magic@npm:0.1.0" + checksum: e4ed0de05b0a05e735c7d8a2930881e5efcfc3ec897204d5d33e7e6247f4c31eac92e383a15d9a6bccb7319b4271ee4bea946e211bf14951fec6ff2cbbb66a92 languageName: node linkType: hard -"unique-filename@npm:^2.0.0": - version: 2.0.1 - resolution: "unique-filename@npm:2.0.1" - dependencies: - unique-slug: ^3.0.0 - checksum: 807acf3381aff319086b64dc7125a9a37c09c44af7620bd4f7f3247fcd5565660ac12d8b80534dcbfd067e6fe88a67e621386dd796a8af828d1337a8420a255f +"uniq@npm:^1.0.1": + version: 1.0.1 + resolution: "uniq@npm:1.0.1" + checksum: 369dca4a07fdd8de9e48378b9d4b6861722ca71d5f496e91687916bd4b48b8cf3d6db1677be1b40eea63bc6d4728efb4b4e0bd7a89c5fd2d23e7a2cff8009c7a languageName: node linkType: hard -"unique-slug@npm:^3.0.0": +"unique-filename@npm:^3.0.0": version: 3.0.0 - resolution: "unique-slug@npm:3.0.0" + resolution: "unique-filename@npm:3.0.0" dependencies: - imurmurhash: ^0.1.4 - checksum: 49f8d915ba7f0101801b922062ee46b7953256c93ceca74303bd8e6413ae10aa7e8216556b54dc5382895e8221d04f1efaf75f945c2e4a515b4139f77aa6640c + unique-slug: "npm:^4.0.0" + checksum: 6363e40b2fa758eb5ec5e21b3c7fb83e5da8dcfbd866cc0c199d5534c42f03b9ea9ab069769cc388e1d7ab93b4eeef28ef506ab5f18d910ef29617715101884f languageName: node linkType: hard -"unique-string@npm:^2.0.0": - version: 2.0.0 - resolution: "unique-string@npm:2.0.0" +"unique-slug@npm:^4.0.0": + version: 4.0.0 + resolution: "unique-slug@npm:4.0.0" dependencies: - crypto-random-string: ^2.0.0 - checksum: ef68f639136bcfe040cf7e3cd7a8dff076a665288122855148a6f7134092e6ed33bf83a7f3a9185e46c98dddc445a0da6ac25612afa1a7c38b8b654d6c02498e + imurmurhash: "npm:^0.1.4" + checksum: cb811d9d54eb5821b81b18205750be84cb015c20a4a44280794e915f5a0a70223ce39066781a354e872df3572e8155c228f43ff0cce94c7cbf4da2cc7cbdd635 languageName: node linkType: hard @@ -9164,29 +9452,29 @@ __metadata: version: 3.0.0 resolution: "unique-string@npm:3.0.0" dependencies: - crypto-random-string: ^4.0.0 - checksum: 1a1e2e7d02eab1bb10f720475da735e1990c8a5ff34edd1a3b6bc31590cb4210b7a1233d779360cc622ce11c211e43afa1628dd658f35d3e6a89964b622940df + crypto-random-string: "npm:^4.0.0" + checksum: b35ea034b161b2a573666ec16c93076b4b6106b8b16c2415808d747ab3a0566b5db0c4be231d4b11cfbc16d7fd915c9d8a45884bff0e2db11b799775b2e1e017 languageName: node linkType: hard "universalify@npm:^0.1.0": version: 0.1.2 resolution: "universalify@npm:0.1.2" - checksum: 40cdc60f6e61070fe658ca36016a8f4ec216b29bf04a55dce14e3710cc84c7448538ef4dad3728d0bfe29975ccd7bfb5f414c45e7b78883567fb31b246f02dff + checksum: e70e0339f6b36f34c9816f6bf9662372bd241714dc77508d231d08386d94f2c4aa1ba1318614f92015f40d45aae1b9075cd30bd490efbe39387b60a76ca3f045 languageName: node linkType: hard "universalify@npm:^2.0.0": - version: 2.0.0 - resolution: "universalify@npm:2.0.0" - checksum: 2406a4edf4a8830aa6813278bab1f953a8e40f2f63a37873ffa9a3bc8f9745d06cc8e88f3572cb899b7e509013f7f6fcc3e37e8a6d914167a5381d8440518c44 + version: 2.0.1 + resolution: "universalify@npm:2.0.1" + checksum: 73e8ee3809041ca8b818efb141801a1004e3fc0002727f1531f4de613ea281b494a40909596dae4a042a4fb6cd385af5d4db2e137b1362e0e91384b828effd3a languageName: node linkType: hard "unpipe@npm:1.0.0, unpipe@npm:~1.0.0": version: 1.0.0 resolution: "unpipe@npm:1.0.0" - checksum: 4fa18d8d8d977c55cb09715385c203197105e10a6d220087ec819f50cb68870f02942244f1017565484237f1f8c5d3cd413631b1ae104d3096f24fdfde1b4aa2 + checksum: 193400255bd48968e5c5383730344fbb4fa114cdedfab26e329e50dd2d81b134244bb8a72c6ac1b10ab0281a58b363d06405632c9d49ca9dfd5e90cbd7d0f32c languageName: node linkType: hard @@ -9194,40 +9482,33 @@ __metadata: version: 4.4.1 resolution: "uri-js@npm:4.4.1" dependencies: - punycode: ^2.1.0 - checksum: 7167432de6817fe8e9e0c9684f1d2de2bb688c94388f7569f7dbdb1587c9f4ca2a77962f134ec90be0cc4d004c939ff0d05acc9f34a0db39a3c797dada262633 + punycode: "npm:^2.1.0" + checksum: 4ef57b45aa820d7ac6496e9208559986c665e49447cb072744c13b66925a362d96dd5a46c4530a6b8e203e5db5fe849369444440cb22ecfc26c679359e5dfa3c languageName: node linkType: hard "util-deprecate@npm:^1.0.1, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" - checksum: 474acf1146cb2701fe3b074892217553dfcf9a031280919ba1b8d651a068c9b15d863b7303cb15bd00a862b498e6cf4ad7b4a08fb134edd5a6f7641681cb54a2 + checksum: 41a5bdd214df2f6c3ecf8622745e4a366c4adced864bc3c833739791aeeeb1838119af7daed4ba36428114b5c67dcda034a79c882e97e43c03e66a4dd7389942 languageName: node linkType: hard "utils-merge@npm:1.0.1": version: 1.0.1 resolution: "utils-merge@npm:1.0.1" - checksum: c81095493225ecfc28add49c106ca4f09cdf56bc66731aa8dabc2edbbccb1e1bfe2de6a115e5c6a380d3ea166d1636410b62ef216bb07b3feb1cfde1d95d5080 - languageName: node - linkType: hard - -"v8-compile-cache-lib@npm:^3.0.1": - version: 3.0.1 - resolution: "v8-compile-cache-lib@npm:3.0.1" - checksum: 78089ad549e21bcdbfca10c08850022b22024cdcc2da9b168bcf5a73a6ed7bf01a9cebb9eac28e03cd23a684d81e0502797e88f3ccd27a32aeab1cfc44c39da0 + checksum: 02ba649de1b7ca8854bfe20a82f1dfbdda3fb57a22ab4a8972a63a34553cf7aa51bc9081cf7e001b035b88186d23689d69e71b510e610a09a4c66f68aa95b672 languageName: node linkType: hard "v8-to-istanbul@npm:^9.0.0": - version: 9.0.1 - resolution: "v8-to-istanbul@npm:9.0.1" + version: 9.2.0 + resolution: "v8-to-istanbul@npm:9.2.0" dependencies: - "@jridgewell/trace-mapping": ^0.3.12 - "@types/istanbul-lib-coverage": ^2.0.1 - convert-source-map: ^1.6.0 - checksum: a49c34bf0a3af0c11041a3952a2600913904a983bd1bc87148b5c033bc5c1d02d5a13620fcdbfa2c60bc582a2e2970185780f0c844b4c3a220abf405f8af6311 + "@jridgewell/trace-mapping": "npm:^0.3.12" + "@types/istanbul-lib-coverage": "npm:^2.0.1" + convert-source-map: "npm:^2.0.0" + checksum: e691ba4dd0dea4a884e52c37dbda30cce6f9eeafe9b26721e449429c6bb0f4b6d1e33fabe7711d0f67f7a34c3bfd56c873f7375bba0b1534e6a2843ce99550e5 languageName: node linkType: hard @@ -9235,58 +9516,58 @@ __metadata: version: 3.0.4 resolution: "validate-npm-package-license@npm:3.0.4" dependencies: - spdx-correct: ^3.0.0 - spdx-expression-parse: ^3.0.0 - checksum: 35703ac889d419cf2aceef63daeadbe4e77227c39ab6287eeb6c1b36a746b364f50ba22e88591f5d017bc54685d8137bc2d328d0a896e4d3fd22093c0f32a9ad + spdx-correct: "npm:^3.0.0" + spdx-expression-parse: "npm:^3.0.0" + checksum: 7b91e455a8de9a0beaa9fe961e536b677da7f48c9a493edf4d4d4a87fd80a7a10267d438723364e432c2fcd00b5650b5378275cded362383ef570276e6312f4f languageName: node linkType: hard "validator@npm:^13.7.0": - version: 13.7.0 - resolution: "validator@npm:13.7.0" - checksum: 2b83283de1222ca549a7ef57f46e8d49c6669213348db78b7045bce36a3b5843ff1e9f709ebf74574e06223461ee1f264f8cc9a26a0060a79a27de079d8286ef + version: 13.11.0 + resolution: "validator@npm:13.11.0" + checksum: 0107da3add5a4ebc6391dac103c55f6d8ed055bbcc29a4c9cbf89eacfc39ba102a5618c470bdc33c6487d30847771a892134a8c791f06ef0962dd4b7a60ae0f5 languageName: node linkType: hard "vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" - checksum: ae0123222c6df65b437669d63dfa8c36cee20a504101b2fcd97b8bf76f91259c17f9f2b4d70a1e3c6bbcee7f51b28392833adb6b2770b23b01abec84e369660b + checksum: f15d588d79f3675135ba783c91a4083dcd290a2a5be9fcb6514220a1634e23df116847b1cc51f66bfb0644cf9353b2abb7815ae499bab06e46dd33c1a6bf1f4f languageName: node linkType: hard -"vscode-languageserver-textdocument@npm:^1.0.8": - version: 1.0.8 - resolution: "vscode-languageserver-textdocument@npm:1.0.8" - checksum: d6b685456ceca2736793d7fc1924d78a8483997c96c6ec4900d90e64115730da6c0c03e3fbc2c5d031a4592f2acd9cca2ca58a651b696c4f40b8690a48538c06 +"vscode-languageserver-textdocument@npm:^1.0.11": + version: 1.0.11 + resolution: "vscode-languageserver-textdocument@npm:1.0.11" + checksum: 1996a38e24571e05aa21dd4f46e0a6849e22301c9a66996762e77d9c6df3622de0bd31cd5742a0c0c47fb9dfd00b310ad08c44d08241873ea571edacd5238da6 languageName: node linkType: hard "vscode-oniguruma@npm:^1.7.0": version: 1.7.0 resolution: "vscode-oniguruma@npm:1.7.0" - checksum: 53519d91d90593e6fb080260892e87d447e9b200c4964d766772b5053f5699066539d92100f77f1302c91e8fc5d9c772fbe40fe4c90f3d411a96d5a9b1e63f42 + checksum: bef0073c665ddf8c86e51da94529c905856559e9aba97a9882f951acd572da560384775941ab6e7e8db94d9c578b25fefb951e4b73c37e8712e16b0231de2689 languageName: node linkType: hard "vscode-textmate@npm:^8.0.0": version: 8.0.0 resolution: "vscode-textmate@npm:8.0.0" - checksum: 127780dfea89559d70b8326df6ec344cfd701312dd7f3f591a718693812b7852c30b6715e3cfc8b3200a4e2515b4c96f0843c0eacc0a3020969b5de262c2a4bb + checksum: 836f7fe73fc94998a38ca193df48173a2b6eab08b4943d83c8cac9a2a0c3546cfdab4cf1b10b890ec4a4374c5bee03a885ef0e83e7fd2bd618cf00781c017c04 languageName: node linkType: hard -"vscode-uri@npm:^3.0.7": - version: 3.0.7 - resolution: "vscode-uri@npm:3.0.7" - checksum: c899a0334f9f6ba53021328e083f6307978c09b94407d7e5fe86fcd8fcb8f1da0cb344123a335e55769055007a46d51aff83f9ee1dfc0296ee54b78f34ef0e4f +"vscode-uri@npm:^3.0.8": + version: 3.0.8 + resolution: "vscode-uri@npm:3.0.8" + checksum: f7f217f526bf109589969fe6e66b71e70b937de1385a1d7bb577ca3ee7c5e820d3856a86e9ff2fa9b7a0bc56a3dd8c3a9a557d3fedd7df414bc618d5e6b567f9 languageName: node linkType: hard "walkdir@npm:^0.4.1": version: 0.4.1 resolution: "walkdir@npm:0.4.1" - checksum: 71045c21dc19aae3321f897b6e9e507cf8039202665c35a0b908eecccaf25636aab769b31cbd61ef8267237fe22fc316923a691ecc2d9d38840a15c59c0f2594 + checksum: 88e635aa9303e9196e4dc15013d2bd4afca4c8c8b4bb27722ca042bad213bb882d3b9141b3b0cca6bfb274f7889b30cf58d6374844094abec0016f335c5414dc languageName: node linkType: hard @@ -9294,22 +9575,22 @@ __metadata: version: 1.0.1 resolution: "wcwidth@npm:1.0.1" dependencies: - defaults: ^1.0.3 - checksum: 814e9d1ddcc9798f7377ffa448a5a3892232b9275ebb30a41b529607691c0491de47cba426e917a4d08ded3ee7e9ba2f3fe32e62ee3cd9c7d3bafb7754bd553c + defaults: "npm:^1.0.3" + checksum: 5b61ca583a95e2dd85d7078400190efd452e05751a64accb8c06ce4db65d7e0b0cde9917d705e826a2e05cc2548f61efde115ffa374c3e436d04be45c889e5b4 languageName: node linkType: hard "webidl-conversions@npm:^3.0.0": version: 3.0.1 resolution: "webidl-conversions@npm:3.0.1" - checksum: c92a0a6ab95314bde9c32e1d0a6dfac83b578f8fa5f21e675bc2706ed6981bc26b7eb7e6a1fab158e5ce4adf9caa4a0aee49a52505d4d13c7be545f15021b17c + checksum: 5612d5f3e54760a797052eb4927f0ddc01383550f542ccd33d5238cfd65aeed392a45ad38364970d0a0f4fea32e1f4d231b3d8dac4a3bdd385e5cf802ae097db languageName: node linkType: hard "well-known-symbols@npm:^2.0.0": version: 2.0.0 resolution: "well-known-symbols@npm:2.0.0" - checksum: 4f54bbc3012371cb4d228f436891b8e7536d34ac61a57541890257e96788608e096231e0121ac24d08ef2f908b3eb2dc0adba35023eaeb2a7df655da91415402 + checksum: cb6c12e98877e8952ec28d13ae6f4fdb54ae1cb49b16a728720276dadd76c930e6cb0e174af3a4620054dd2752546f842540122920c6e31410208abd4958ee6b languageName: node linkType: hard @@ -9317,9 +9598,9 @@ __metadata: version: 5.0.0 resolution: "whatwg-url@npm:5.0.0" dependencies: - tr46: ~0.0.3 - webidl-conversions: ^3.0.0 - checksum: b8daed4ad3356cc4899048a15b2c143a9aed0dfae1f611ebd55073310c7b910f522ad75d727346ad64203d7e6c79ef25eafd465f4d12775ca44b90fa82ed9e2c + tr46: "npm:~0.0.3" + webidl-conversions: "npm:^3.0.0" + checksum: 1588bed84d10b72d5eec1d0faa0722ba1962f1821e7539c535558fb5398d223b0c50d8acab950b8c488b4ba69043fd833cc2697056b167d8ad46fac3995a55d5 languageName: node linkType: hard @@ -9327,26 +9608,25 @@ __metadata: version: 1.0.2 resolution: "which-boxed-primitive@npm:1.0.2" dependencies: - is-bigint: ^1.0.1 - is-boolean-object: ^1.1.0 - is-number-object: ^1.0.4 - is-string: ^1.0.5 - is-symbol: ^1.0.3 - checksum: 53ce774c7379071729533922adcca47220228405e1895f26673bbd71bdf7fb09bee38c1d6399395927c6289476b5ae0629863427fd151491b71c4b6cb04f3a5e + is-bigint: "npm:^1.0.1" + is-boolean-object: "npm:^1.1.0" + is-number-object: "npm:^1.0.4" + is-string: "npm:^1.0.5" + is-symbol: "npm:^1.0.3" + checksum: 0a62a03c00c91dd4fb1035b2f0733c341d805753b027eebd3a304b9cb70e8ce33e25317add2fe9b5fea6f53a175c0633ae701ff812e604410ddd049777cd435e languageName: node linkType: hard -"which-typed-array@npm:^1.1.9": - version: 1.1.9 - resolution: "which-typed-array@npm:1.1.9" +"which-typed-array@npm:^1.1.11, which-typed-array@npm:^1.1.13": + version: 1.1.13 + resolution: "which-typed-array@npm:1.1.13" dependencies: - available-typed-arrays: ^1.0.5 - call-bind: ^1.0.2 - for-each: ^0.3.3 - gopd: ^1.0.1 - has-tostringtag: ^1.0.0 - is-typed-array: ^1.1.10 - checksum: fe0178ca44c57699ca2c0e657b64eaa8d2db2372a4e2851184f568f98c478ae3dc3fdb5f7e46c384487046b0cf9e23241423242b277e03e8ba3dabc7c84c98ef + available-typed-arrays: "npm:^1.0.5" + call-bind: "npm:^1.0.4" + for-each: "npm:^0.3.3" + gopd: "npm:^1.0.1" + has-tostringtag: "npm:^1.0.0" + checksum: 9f5f1c42918df3d5b91c4315ed0051d5d874370998bf095c9ae0df374f0881f85094e3c384b8fb08ab7b4d4f54ba81c0aff75da6226e7c0589b83dfbec1cd4c9 languageName: node linkType: hard @@ -9354,141 +9634,155 @@ __metadata: version: 1.3.1 resolution: "which@npm:1.3.1" dependencies: - isexe: ^2.0.0 + isexe: "npm:^2.0.0" bin: which: ./bin/which - checksum: f2e185c6242244b8426c9df1510e86629192d93c1a986a7d2a591f2c24869e7ffd03d6dac07ca863b2e4c06f59a4cc9916c585b72ee9fa1aa609d0124df15e04 + checksum: e945a8b6bbf6821aaaef7f6e0c309d4b615ef35699576d5489b4261da9539f70393c6b2ce700ee4321c18f914ebe5644bc4631b15466ffbaad37d83151f6af59 languageName: node linkType: hard -"which@npm:^2.0.1, which@npm:^2.0.2": +"which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" dependencies: - isexe: ^2.0.0 + isexe: "npm:^2.0.0" bin: node-which: ./bin/node-which - checksum: 1a5c563d3c1b52d5f893c8b61afe11abc3bab4afac492e8da5bde69d550de701cf9806235f20a47b5c8fa8a1d6a9135841de2596535e998027a54589000e66d1 + checksum: 66522872a768b60c2a65a57e8ad184e5372f5b6a9ca6d5f033d4b0dc98aff63995655a7503b9c0a2598936f532120e81dd8cc155e2e92ed662a2b9377cc4374f languageName: node linkType: hard -"wide-align@npm:^1.1.5": +"which@npm:^4.0.0": + version: 4.0.0 + resolution: "which@npm:4.0.0" + dependencies: + isexe: "npm:^3.1.1" + bin: + node-which: bin/which.js + checksum: 449fa5c44ed120ccecfe18c433296a4978a7583bf2391c50abce13f76878d2476defde04d0f79db8165bdf432853c1f8389d0485ca6e8ebce3bbcded513d5e6a + languageName: node + linkType: hard + +"wide-align@npm:^1.1.2": version: 1.1.5 resolution: "wide-align@npm:1.1.5" dependencies: - string-width: ^1.0.2 || 2 || 3 || 4 - checksum: d5fc37cd561f9daee3c80e03b92ed3e84d80dde3365a8767263d03dacfc8fa06b065ffe1df00d8c2a09f731482fcacae745abfbb478d4af36d0a891fad4834d3 + string-width: "npm:^1.0.2 || 2 || 3 || 4" + checksum: 1d9c2a3e36dfb09832f38e2e699c367ef190f96b82c71f809bc0822c306f5379df87bab47bed27ea99106d86447e50eb972d3c516c2f95782807a9d082fbea95 languageName: node linkType: hard -"word-wrap@npm:^1.0.3, word-wrap@npm:^1.2.3, word-wrap@npm:~1.2.3": - version: 1.2.3 - resolution: "word-wrap@npm:1.2.3" - checksum: 30b48f91fcf12106ed3186ae4fa86a6a1842416df425be7b60485de14bec665a54a68e4b5156647dec3a70f25e84d270ca8bc8cd23182ed095f5c7206a938c1f +"word-wrap@npm:^1.0.3": + version: 1.2.5 + resolution: "word-wrap@npm:1.2.5" + checksum: e0e4a1ca27599c92a6ca4c32260e8a92e8a44f4ef6ef93f803f8ed823f486e0889fc0b93be4db59c8d51b3064951d25e43d434e95dc8c960cc3a63d65d00ba20 languageName: node linkType: hard "wordwrap@npm:^1.0.0": version: 1.0.0 resolution: "wordwrap@npm:1.0.0" - checksum: 2a44b2788165d0a3de71fd517d4880a8e20ea3a82c080ce46e294f0b68b69a2e49cff5f99c600e275c698a90d12c5ea32aff06c311f0db2eb3f1201f3e7b2a04 + checksum: 7ed2e44f3c33c5c3e3771134d2b0aee4314c9e49c749e37f464bf69f2bcdf0cbf9419ca638098e2717cff4875c47f56a007532f6111c3319f557a2ca91278e92 languageName: node linkType: hard -"wrap-ansi@npm:^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" dependencies: - ansi-styles: ^4.0.0 - string-width: ^4.1.0 - strip-ansi: ^6.0.0 - checksum: a790b846fd4505de962ba728a21aaeda189b8ee1c7568ca5e817d85930e06ef8d1689d49dbf0e881e8ef84436af3a88bc49115c2e2788d841ff1b8b5b51a608b + ansi-styles: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + checksum: d15fc12c11e4cbc4044a552129ebc75ee3f57aa9c1958373a4db0292d72282f54373b536103987a4a7594db1ef6a4f10acf92978f79b98c49306a4b58c77d4da + languageName: node + linkType: hard + +"wrap-ansi@npm:^8.1.0": + version: 8.1.0 + resolution: "wrap-ansi@npm:8.1.0" + dependencies: + ansi-styles: "npm:^6.1.0" + string-width: "npm:^5.0.1" + strip-ansi: "npm:^7.0.1" + checksum: 138ff58a41d2f877eae87e3282c0630fc2789012fc1af4d6bd626eeb9a2f9a65ca92005e6e69a75c7b85a68479fe7443c7dbe1eb8fbaa681a4491364b7c55c60 languageName: node linkType: hard "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" - checksum: 159da4805f7e84a3d003d8841557196034155008f817172d4e986bd591f74aa82aa7db55929a54222309e01079a65a92a9e6414da5a6aa4b01ee44a511ac3ee5 + checksum: 56fece1a4018c6a6c8e28fbc88c87e0fbf4ea8fd64fc6c63b18f4acc4bd13e0ad2515189786dd2c30d3eec9663d70f4ecf699330002f8ccb547e4a18231fc9f0 languageName: node linkType: hard -"write-file-atomic@npm:^3.0.0": +"write-file-atomic@npm:^3.0.3": version: 3.0.3 resolution: "write-file-atomic@npm:3.0.3" dependencies: - imurmurhash: ^0.1.4 - is-typedarray: ^1.0.0 - signal-exit: ^3.0.2 - typedarray-to-buffer: ^3.1.5 - checksum: c55b24617cc61c3a4379f425fc62a386cc51916a9b9d993f39734d005a09d5a4bb748bc251f1304e7abd71d0a26d339996c275955f527a131b1dcded67878280 + imurmurhash: "npm:^0.1.4" + is-typedarray: "npm:^1.0.0" + signal-exit: "npm:^3.0.2" + typedarray-to-buffer: "npm:^3.1.5" + checksum: 7fb67affd811c7a1221bed0c905c26e28f0041e138fb19ccf02db57a0ef93ea69220959af3906b920f9b0411d1914474cdd90b93a96e5cd9e8368d9777caac0e languageName: node linkType: hard -"write-file-atomic@npm:^5.0.0": - version: 5.0.0 - resolution: "write-file-atomic@npm:5.0.0" +"write-file-atomic@npm:^5.0.1": + version: 5.0.1 + resolution: "write-file-atomic@npm:5.0.1" dependencies: - imurmurhash: ^0.1.4 - signal-exit: ^3.0.7 - checksum: 6ee16b195572386cb1c905f9d29808f77f4de2fd063d74a6f1ab6b566363832d8906a493b764ee715e57ab497271d5fc91642a913724960e8e845adf504a9837 - languageName: node - linkType: hard - -"ws@npm:8.11.0": - version: 8.11.0 - resolution: "ws@npm:8.11.0" - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - checksum: 316b33aba32f317cd217df66dbfc5b281a2f09ff36815de222bc859e3424d83766d9eb2bd4d667de658b6ab7be151f258318fb1da812416b30be13103e5b5c67 + imurmurhash: "npm:^0.1.4" + signal-exit: "npm:^4.0.1" + checksum: e8c850a8e3e74eeadadb8ad23c9d9d63e4e792bd10f4836ed74189ef6e996763959f1249c5650e232f3c77c11169d239cbfc8342fc70f3fe401407d23810505d languageName: node linkType: hard -"xdg-basedir@npm:^4.0.0": - version: 4.0.0 - resolution: "xdg-basedir@npm:4.0.0" - checksum: 0073d5b59a37224ed3a5ac0dd2ec1d36f09c49f0afd769008a6e9cd3cd666bd6317bd1c7ce2eab47e1de285a286bad11a9b038196413cd753b79770361855f3c +"xdg-basedir@npm:^5.0.1": + version: 5.1.0 + resolution: "xdg-basedir@npm:5.1.0" + checksum: c88efabc71ffd996ba9ad8923a8cc1c7c020a03e2c59f0ffa72e06be9e724ad2a0fccef488757bc6ed3d8849d753dd25082d1035d95cb179e79eae4d034d0b80 languageName: node linkType: hard "xtend@npm:~4.0.1": version: 4.0.2 resolution: "xtend@npm:4.0.2" - checksum: ac5dfa738b21f6e7f0dd6e65e1b3155036d68104e67e5d5d1bde74892e327d7e5636a076f625599dc394330a731861e87343ff184b0047fef1360a7ec0a5a36a + checksum: 366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e languageName: node linkType: hard "y18n@npm:^5.0.5": version: 5.0.8 resolution: "y18n@npm:5.0.8" - checksum: 54f0fb95621ee60898a38c572c515659e51cc9d9f787fb109cef6fde4befbe1c4602dc999d30110feee37456ad0f1660fa2edcfde6a9a740f86a290999550d30 + checksum: 4df2842c36e468590c3691c894bc9cdbac41f520566e76e24f59401ba7d8b4811eb1e34524d57e54bc6d864bcb66baab7ffd9ca42bf1eda596618f9162b91249 languageName: node linkType: hard "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0" - checksum: 343617202af32df2a15a3be36a5a8c0c8545208f3d3dfbc6bb7c3e3b7e8c6f8e7485432e4f3b88da3031a6e20afa7c711eded32ddfb122896ac5d914e75848d5 + checksum: 2286b5e8dbfe22204ab66e2ef5cc9bbb1e55dfc873bbe0d568aa943eb255d131890dfd5bf243637273d31119b870f49c18fcde2c6ffbb7a7a092b870dc90625a languageName: node linkType: hard -"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3, yargs-parser@npm:^20.2.9": +"yaml@npm:^2.3.4": + version: 2.3.4 + resolution: "yaml@npm:2.3.4" + checksum: cf03b68f8fef5e8516b0f0b54edaf2459f1648317fc6210391cf606d247e678b449382f4bd01f77392538429e306c7cba8ff46ff6b37cac4de9a76aff33bd9e1 + languageName: node + linkType: hard + +"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.3": version: 20.2.9 resolution: "yargs-parser@npm:20.2.9" - checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 + checksum: 0685a8e58bbfb57fab6aefe03c6da904a59769bd803a722bb098bd5b0f29d274a1357762c7258fb487512811b8063fb5d2824a3415a0a4540598335b3b086c72 languageName: node linkType: hard "yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" - checksum: ed2d96a616a9e3e1cc7d204c62ecc61f7aaab633dcbfab2c6df50f7f87b393993fe6640d017759fe112d0cb1e0119f2b4150a87305cc873fd90831c6a58ccf1c + checksum: f84b5e48169479d2f402239c59f084cfd1c3acc197a05c59b98bab067452e6b3ea46d4dd8ba2985ba7b3d32a343d77df0debd6b343e5dae3da2aab2cdf5886b2 languageName: node linkType: hard @@ -9496,60 +9790,36 @@ __metadata: version: 16.2.0 resolution: "yargs@npm:16.2.0" dependencies: - cliui: ^7.0.2 - escalade: ^3.1.1 - get-caller-file: ^2.0.5 - require-directory: ^2.1.1 - string-width: ^4.2.0 - y18n: ^5.0.5 - yargs-parser: ^20.2.2 - checksum: b14afbb51e3251a204d81937c86a7e9d4bdbf9a2bcee38226c900d00f522969ab675703bee2a6f99f8e20103f608382936034e64d921b74df82b63c07c5e8f59 - languageName: node - linkType: hard - -"yargs@npm:^17.6.2": - version: 17.6.2 - resolution: "yargs@npm:17.6.2" - dependencies: - cliui: ^8.0.1 - escalade: ^3.1.1 - get-caller-file: ^2.0.5 - require-directory: ^2.1.1 - string-width: ^4.2.3 - y18n: ^5.0.5 - yargs-parser: ^21.1.1 - checksum: 47da1b0d854fa16d45a3ded57b716b013b2179022352a5f7467409da5a04a1eef5b3b3d97a2dfc13e8bbe5f2ffc0afe3bc6a4a72f8254e60f5a4bd7947138643 + cliui: "npm:^7.0.2" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.0" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^20.2.2" + checksum: b1dbfefa679848442454b60053a6c95d62f2d2e21dd28def92b647587f415969173c6e99a0f3bab4f1b67ee8283bf735ebe3544013f09491186ba9e8a9a2b651 languageName: node linkType: hard -"yauzl@npm:^2.10.0": - version: 2.10.0 - resolution: "yauzl@npm:2.10.0" +"yargs@npm:^17.7.2": + version: 17.7.2 + resolution: "yargs@npm:17.7.2" dependencies: - buffer-crc32: ~0.2.3 - fd-slicer: ~1.1.0 - checksum: 7f21fe0bbad6e2cb130044a5d1d0d5a0e5bf3d8d4f8c4e6ee12163ce798fee3de7388d22a7a0907f563ac5f9d40f8699a223d3d5c1718da90b0156da6904022b - languageName: node - linkType: hard - -"yn@npm:3.1.1": - version: 3.1.1 - resolution: "yn@npm:3.1.1" - checksum: 2c487b0e149e746ef48cda9f8bad10fc83693cd69d7f9dcd8be4214e985de33a29c9e24f3c0d6bcf2288427040a8947406ab27f7af67ee9456e6b84854f02dd6 + cliui: "npm:^8.0.1" + escalade: "npm:^3.1.1" + get-caller-file: "npm:^2.0.5" + require-directory: "npm:^2.1.1" + string-width: "npm:^4.2.3" + y18n: "npm:^5.0.5" + yargs-parser: "npm:^21.1.1" + checksum: ccd7e723e61ad5965fffbb791366db689572b80cca80e0f96aad968dfff4156cd7cd1ad18607afe1046d8241e6fb2d6c08bf7fa7bfb5eaec818735d8feac8f05 languageName: node linkType: hard "yocto-queue@npm:^0.1.0": version: 0.1.0 resolution: "yocto-queue@npm:0.1.0" - checksum: f77b3d8d00310def622123df93d4ee654fc6a0096182af8bd60679ddcdfb3474c56c6c7190817c84a2785648cdee9d721c0154eb45698c62176c322fb46fc700 - languageName: node - linkType: hard - -"yocto-queue@npm:^1.0.0": - version: 1.0.0 - resolution: "yocto-queue@npm:1.0.0" - checksum: 2cac84540f65c64ccc1683c267edce396b26b1e931aa429660aefac8fbe0188167b7aee815a3c22fa59a28a58d898d1a2b1825048f834d8d629f4c2a5d443801 + checksum: dceb44c28578b31641e13695d200d34ec4ab3966a5729814d5445b194933c096b7ced71494ce53a0e8820685d1d010df8b2422e5bf2cdea7e469d97ffbea306f languageName: node linkType: hard @@ -9557,15 +9827,15 @@ __metadata: version: 5.0.5 resolution: "z-schema@npm:5.0.5" dependencies: - commander: ^9.4.1 - lodash.get: ^4.4.2 - lodash.isequal: ^4.5.0 - validator: ^13.7.0 + commander: "npm:^9.4.1" + lodash.get: "npm:^4.4.2" + lodash.isequal: "npm:^4.5.0" + validator: "npm:^13.7.0" dependenciesMeta: commander: optional: true bin: z-schema: bin/z-schema - checksum: 8a1d66817ae4384dc3f63311f0cccaadd95cc9640eaade5fd3fbf91aa80d6bb82fb95d9b9171fa82ac371a0155b32b7f5f77bbe84dabaca611b66f74c628f0b8 + checksum: e4c812cfe6468c19b2a21d07d4ff8fb70359062d33400b45f89017eaa3efe9d51e85963f2b115eaaa99a16b451782249bf9b1fa8b31d35cc473e7becb3e44264 languageName: node linkType: hard