From 02f487f3eb5a4dca588d23ccebb875e2c1a67b45 Mon Sep 17 00:00:00 2001 From: includenull <15929809+includenull@users.noreply.github.com> Date: Tue, 24 Mar 2026 19:21:00 +0000 Subject: [PATCH 01/22] Initial commit --- packages/light-api/.editorconfig | 12 + packages/light-api/.github/workflows/test.yml | 23 + packages/light-api/.gitignore | 7 + packages/light-api/.prettierrc | 8 + packages/light-api/Makefile | 75 + packages/light-api/README.md | 38 + packages/light-api/eslint.config.mjs | 50 + packages/light-api/package.json | 58 + packages/light-api/rollup.config.mjs | 59 + packages/light-api/src/endpoints.ts | 132 + packages/light-api/src/index.ts | 3 + packages/light-api/src/types.ts | 239 ++ packages/light-api/test/api.ts | 182 + ...cb3b36356fb75b563d6a5f088431f4c70d21d.json | 22 + ...27bdc95fa6a3889434584bafe3e8cb4af4c81.json | 298 ++ ...be23ce7a56b8c7bf84fcaa5759641deb5e78d.json | 22 + ...01183282b9727c1ff570bbec292ff43db6d10.json | 12 + ...aec66ce3187d286dbfc625c3aa025e5387550.json | 63 + ...c0e0b21b9a54be659beeb221221550b135e5f.json | 254 ++ ...4f2ba75bf179e6ca304b0a5331ff89c338d17.json | 308 ++ ...27138e2999199dbae79e68222c2eac162a9e8.json | 532 +++ ...9e20488f6064fd59e355db1f640baa491b34e.json | 32 + ...5bb48e9f50a77651818282bbc44930b7cf26a.json | 33 + ...21bb81dca5afcffe02c519146744e0a739a55.json | 53 + ...ccf7201f03407312a7ef95d40fe838c235c74.json | 12 + ...4daa214c5daf5b52e7935e6fdc1b809087b37.json | 68 + ...c5198194b7a845ea8ab791294b081b4a93b10.json | 53 + ...05f9de102415a27ac61c316fee37de0c03535.json | 12 + ...23eace094f9c3dd9713915c5d4550e361cc72.json | 38 + packages/light-api/test/rollup.config.mjs | 117 + packages/light-api/test/tsconfig.json | 15 + packages/light-api/tsconfig.json | 17 + packages/light-api/yarn.lock | 3040 +++++++++++++++++ 33 files changed, 5887 insertions(+) create mode 100644 packages/light-api/.editorconfig create mode 100644 packages/light-api/.github/workflows/test.yml create mode 100644 packages/light-api/.gitignore create mode 100644 packages/light-api/.prettierrc create mode 100644 packages/light-api/Makefile create mode 100644 packages/light-api/README.md create mode 100644 packages/light-api/eslint.config.mjs create mode 100644 packages/light-api/package.json create mode 100644 packages/light-api/rollup.config.mjs create mode 100644 packages/light-api/src/endpoints.ts create mode 100644 packages/light-api/src/index.ts create mode 100644 packages/light-api/src/types.ts create mode 100644 packages/light-api/test/api.ts create mode 100644 packages/light-api/test/data/149cb3b36356fb75b563d6a5f088431f4c70d21d.json create mode 100644 packages/light-api/test/data/22927bdc95fa6a3889434584bafe3e8cb4af4c81.json create mode 100644 packages/light-api/test/data/2cabe23ce7a56b8c7bf84fcaa5759641deb5e78d.json create mode 100644 packages/light-api/test/data/32301183282b9727c1ff570bbec292ff43db6d10.json create mode 100644 packages/light-api/test/data/34faec66ce3187d286dbfc625c3aa025e5387550.json create mode 100644 packages/light-api/test/data/360c0e0b21b9a54be659beeb221221550b135e5f.json create mode 100644 packages/light-api/test/data/3ba4f2ba75bf179e6ca304b0a5331ff89c338d17.json create mode 100644 packages/light-api/test/data/40f27138e2999199dbae79e68222c2eac162a9e8.json create mode 100644 packages/light-api/test/data/5529e20488f6064fd59e355db1f640baa491b34e.json create mode 100644 packages/light-api/test/data/6785bb48e9f50a77651818282bbc44930b7cf26a.json create mode 100644 packages/light-api/test/data/6c221bb81dca5afcffe02c519146744e0a739a55.json create mode 100644 packages/light-api/test/data/8aaccf7201f03407312a7ef95d40fe838c235c74.json create mode 100644 packages/light-api/test/data/abd4daa214c5daf5b52e7935e6fdc1b809087b37.json create mode 100644 packages/light-api/test/data/dcbc5198194b7a845ea8ab791294b081b4a93b10.json create mode 100644 packages/light-api/test/data/dea05f9de102415a27ac61c316fee37de0c03535.json create mode 100644 packages/light-api/test/data/e2123eace094f9c3dd9713915c5d4550e361cc72.json create mode 100644 packages/light-api/test/rollup.config.mjs create mode 100644 packages/light-api/test/tsconfig.json create mode 100644 packages/light-api/tsconfig.json create mode 100644 packages/light-api/yarn.lock diff --git a/packages/light-api/.editorconfig b/packages/light-api/.editorconfig new file mode 100644 index 00000000..779f99a1 --- /dev/null +++ b/packages/light-api/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/packages/light-api/.github/workflows/test.yml b/packages/light-api/.github/workflows/test.yml new file mode 100644 index 00000000..28557614 --- /dev/null +++ b/packages/light-api/.github/workflows/test.yml @@ -0,0 +1,23 @@ +name: Tests +on: [push, pull_request] +jobs: + test-node: + strategy: + fail-fast: false + matrix: + node-version: [20, 22, 24] + name: Node.js v${{ matrix.node-version }} + runs-on: ubuntu-latest + steps: + - name: Setup Node.js + uses: actions/setup-node@v1 + with: + node-version: "${{ matrix.node-version }}" + - name: Checkout code + uses: actions/checkout@v2 + - name: Install dependencies + run: make node_modules + - name: Run checks + run: make check + - name: Run tests + run: make ci-test diff --git a/packages/light-api/.gitignore b/packages/light-api/.gitignore new file mode 100644 index 00000000..22485cbc --- /dev/null +++ b/packages/light-api/.gitignore @@ -0,0 +1,7 @@ +node_modules/ +lib/ +coverage/ +.nyc_output/ +test/browser.html +site/ +docs_build/ diff --git a/packages/light-api/.prettierrc b/packages/light-api/.prettierrc new file mode 100644 index 00000000..1fa71917 --- /dev/null +++ b/packages/light-api/.prettierrc @@ -0,0 +1,8 @@ +arrowParens: "always" +bracketSpacing: false +endOfLine: "lf" +printWidth: 100 +semi: false +singleQuote: true +tabWidth: 4 +trailingComma: "es5" diff --git a/packages/light-api/Makefile b/packages/light-api/Makefile new file mode 100644 index 00000000..c52a03af --- /dev/null +++ b/packages/light-api/Makefile @@ -0,0 +1,75 @@ +SRC_FILES := $(shell find src -name '*.ts') +TEST_FILES := $(wildcard test/*.ts) +BIN := ./node_modules/.bin +MOCHA_OPTS := -u tdd -r ts-node/register -r tsconfig-paths/register --extension ts + +lib: ${SRC_FILES} package.json tsconfig.json node_modules rollup.config.mjs + @${BIN}/rollup -c && touch lib + +.PHONY: test +test: lib node_modules + @TS_NODE_PROJECT='./test/tsconfig.json' MOCK_DIR='./test/data' \ + ${BIN}/mocha ${MOCHA_OPTS} test/*.ts --grep '$(grep)' + +.PHONY: test-coverage +test-coverage: lib node_modules + @TS_NODE_PROJECT='./test/tsconfig.json' MOCK_DIR='./test/data' \ + ${BIN}/nyc --reporter=html \ + ${BIN}/mocha ${MOCHA_OPTS} -R nyan test/*.ts + +.PHONY: coverage +coverage: test-coverage + @open coverage/index.html + +.PHONY: ci-test +ci-test: lib node_modules + @TS_NODE_PROJECT='./test/tsconfig.json' MOCK_DIR='./test/data' \ + ${BIN}/nyc --reporter=text \ + ${BIN}/mocha ${MOCHA_OPTS} -R list test/*.ts + +.PHONY: check +check: node_modules + @${BIN}/eslint src --ext .ts --max-warnings 0 && echo "Ok" + +.PHONY: format +format: node_modules + @${BIN}/eslint src --ext .ts --fix + +test/browser.html: lib $(TEST_FILES) test/rollup.config.mjs node_modules + @${BIN}/rollup -c test/rollup.config.mjs + +.PHONY: browser-test +browser-test: test/browser.html + @open test/browser.html + +node_modules: + yarn install --non-interactive --frozen-lockfile --ignore-scripts + +.PHONY: publish +publish: | distclean node_modules + @git diff-index --quiet HEAD || (echo "Uncommitted changes, please commit first" && exit 1) + @git fetch origin && git diff origin/master --quiet || (echo "Changes not pushed to origin, please push first" && exit 1) + @yarn config set version-tag-prefix "" && yarn config set version-git-message "Version %s" + @yarn publish && git push && git push --tags + +docs_build: $(SRC_FILES) node_modules + @${BIN}/typedoc --out docs_build \ + --excludeInternal --excludePrivate --excludeProtected \ + --includeVersion --readme none \ + src/index.ts + +.PHONY: deploy-site +deploy-site: | clean docs_build test/browser.html test-coverage + @mkdir -p site + @cp -r docs_build/* site/ + @cp -r test/browser.html site/tests.html + @cp -r coverage/ site/coverage/ + @${BIN}/gh-pages -d site + +.PHONY: clean +clean: + rm -rf lib/ coverage/ docs_build/ site/ test/browser.html + +.PHONY: distclean +distclean: clean + rm -rf node_modules/ diff --git a/packages/light-api/README.md b/packages/light-api/README.md new file mode 100644 index 00000000..bfc00095 --- /dev/null +++ b/packages/light-api/README.md @@ -0,0 +1,38 @@ +# wharfkit-light-api + +API client for the Light API service. + +## Installing + +```sh +yarn add wharfkit-light-api +``` + +## Usage + +```ts +import {APIClient, FetchProvider} from '@wharfkit/antelope' +import {LightAPIClient} from 'wharfkit-light-api' + +const client = new APIClient({ + provider: new FetchProvider('https://eos.light-api.net'), +}) + +const lightapi = new LightAPIClient(client) + +const account = await lightapi.get_account('eos', 'teamgreymass') +const balances = await lightapi.get_balances('eos', 'teamgreymass') +const status = await lightapi.get_status() +``` + +## Running Tests + +```sh +make test +``` + +Running tests against a live Light API server: + +```sh +MOCK='overwrite' make test +``` diff --git a/packages/light-api/eslint.config.mjs b/packages/light-api/eslint.config.mjs new file mode 100644 index 00000000..73bbcea5 --- /dev/null +++ b/packages/light-api/eslint.config.mjs @@ -0,0 +1,50 @@ +import eslintConfigPrettier from 'eslint-config-prettier' +import esx from 'eslint-plugin-es-x' +import prettierPlugin from 'eslint-plugin-prettier' +import tseslint from '@typescript-eslint/eslint-plugin' + +const tsRecommended = tseslint.configs['flat/recommended'].map((config) => ({ + ...config, + files: ['src/**/*.ts'], +})) + +export default [ + { + ignores: ['lib/*', 'node_modules/**'], + }, + ...tsRecommended, + { + files: ['src/**/*.ts'], + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + }, + plugins: { + 'es-x': esx, + prettier: prettierPlugin, + }, + rules: { + ...eslintConfigPrettier.rules, + ...esx.configs['flat/no-new-in-es2020'].rules, + 'prettier/prettier': 'warn', + 'no-console': 'warn', + 'sort-imports': [ + 'warn', + { + ignoreCase: true, + ignoreDeclarationSort: true, + }, + ], + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + '@typescript-eslint/no-namespace': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-empty-function': 'warn', + '@typescript-eslint/no-this-alias': 'off', + 'no-inner-declarations': 'off', + 'es-x/no-optional-chaining': 'error', + 'es-x/no-class-fields': 'off', + 'es-x/no-export-ns-from': 'off', + }, + }, +] diff --git a/packages/light-api/package.json b/packages/light-api/package.json new file mode 100644 index 00000000..48e0059b --- /dev/null +++ b/packages/light-api/package.json @@ -0,0 +1,58 @@ +{ + "name": "wharfkit-light-api", + "description": "API client for the Light API service", + "version": "1.0.0", + "homepage": "https://github.com/includenull/light-api", + "main": "lib/light-api.js", + "module": "lib/light-api.m.js", + "types": "lib/light-api.d.ts", + "browser": { + "buffer": false, + "crypto": false + }, + "sideEffects": false, + "files": [ + "lib/*", + "src/*" + ], + "scripts": { + "prepare": "make" + }, + "dependencies": { + "@wharfkit/antelope": "^1.1.1", + "tslib": "^2.8.1" + }, + "devDependencies": { + "@rollup/plugin-alias": "^6.0.0", + "@rollup/plugin-commonjs": "^29.0.2", + "@rollup/plugin-json": "^6.1.0", + "@rollup/plugin-node-resolve": "^16.0.3", + "@rollup/plugin-replace": "^6.0.3", + "@rollup/plugin-terser": "^1.0.0", + "@rollup/plugin-typescript": "^12.3.0", + "@rollup/plugin-virtual": "^3.0.2", + "@types/bn.js": "^5.2.0", + "@types/elliptic": "^6.4.18", + "@types/mocha": "^10.0.10", + "@types/node": "^25.5.0", + "@typescript-eslint/eslint-plugin": "^8.57.2", + "@typescript-eslint/parser": "^8.57.2", + "@wharfkit/mock-data": "^1.3.1", + "chai": "^6.2.2", + "eslint": "^10.1.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-es-x": "^9.6.0", + "eslint-plugin-prettier": "^5.5.5", + "gh-pages": "^6.3.0", + "mocha": "^11.7.5", + "node-fetch": "^3.3.2", + "nyc": "^18.0.0", + "prettier": "^3.8.1", + "rollup": "^4.60.0", + "rollup-plugin-dts": "^6.4.1", + "ts-node": "^10.9.2", + "tsconfig-paths": "^4.2.0", + "typedoc": "^0.28.18", + "typescript": "~5.9.0" + } +} \ No newline at end of file diff --git a/packages/light-api/rollup.config.mjs b/packages/light-api/rollup.config.mjs new file mode 100644 index 00000000..4f456350 --- /dev/null +++ b/packages/light-api/rollup.config.mjs @@ -0,0 +1,59 @@ +import fs from 'fs' +import path from 'path' +import {fileURLToPath} from 'url' + +import dts from 'rollup-plugin-dts' +import typescript from '@rollup/plugin-typescript' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const pkg = JSON.parse(fs.readFileSync(path.join(__dirname, 'package.json'))) + +const external = Object.keys(pkg.dependencies) + +export default [ + { + input: 'src/index.ts', + output: { + file: pkg.main, + format: 'cjs', + sourcemap: true, + }, + plugins: [typescript({target: 'es6'})], + external, + onwarn, + }, + { + input: 'src/index.ts', + output: { + file: pkg.module, + format: 'esm', + sourcemap: true, + }, + plugins: [typescript({target: 'es2020'})], + external, + onwarn, + }, + { + input: 'src/index.ts', + output: {file: pkg.types, format: 'esm'}, + onwarn, + plugins: [dts()], + }, +] + +function onwarn(warning, rollupWarn) { + if (warning.code === 'CIRCULAR_DEPENDENCY') { + // unnecessary warning + return + } + if ( + warning.code === 'UNUSED_EXTERNAL_IMPORT' && + warning.source === 'tslib' && + warning.names[0] === '__read' + ) { + // when using ts with importHelpers: true rollup complains about this + // seems safe to ignore since __read is not actually imported or used anywhere in the resulting bundles + return + } + rollupWarn(warning) +} diff --git a/packages/light-api/src/endpoints.ts b/packages/light-api/src/endpoints.ts new file mode 100644 index 00000000..766a5f25 --- /dev/null +++ b/packages/light-api/src/endpoints.ts @@ -0,0 +1,132 @@ +import {ABISerializableConstructor, APIClient, NameType} from '@wharfkit/antelope' +import * as Types from './types' + +export class LightAPIClient { + constructor(private client: APIClient) {} + + get_networks() { + return this.callJson('/api/networks') + } + + get_account(network: string, account: NameType | string) { + return this.callStruct( + `/api/account/${this.encodeSegment(network)}/${this.encodeSegment(account)}`, + Types.AccountResponse + ) + } + + get_accinfo(network: string, account: NameType | string) { + return this.callStruct( + `/api/accinfo/${this.encodeSegment(network)}/${this.encodeSegment(account)}`, + Types.AccountInfoResponse + ) + } + + get_balances(network: string, account: NameType | string) { + return this.callStruct( + `/api/balances/${this.encodeSegment(network)}/${this.encodeSegment(account)}`, + Types.BalancesResponse + ) + } + + get_rexbalance(network: string, account: NameType | string) { + return this.callStruct( + `/api/rexbalance/${this.encodeSegment(network)}/${this.encodeSegment(account)}`, + Types.RexBalanceResponse + ) + } + + get_rexraw(network: string, account: NameType | string) { + return this.callStruct( + `/api/rexraw/${this.encodeSegment(network)}/${this.encodeSegment(account)}`, + Types.RexRawResponse + ) + } + + get_tokenbalance( + network: string, + account: NameType | string, + contract: NameType | string, + token: string + ) { + return this.callText( + `/api/tokenbalance/${this.encodeSegment(network)}/${this.encodeSegment( + account + )}/${this.encodeSegment(contract)}/${this.encodeSegment(token)}` + ) + } + + get_key(key: string) { + return this.callJson(`/api/key/${this.encodeSegment(key)}`) + } + + get_codehash(hash: string) { + return this.callJson(`/api/codehash/${this.encodeSegment(hash)}`) + } + + get_topholders(network: string, contract: NameType | string, token: string, count: number) { + return this.callJson( + `/api/topholders/${this.encodeSegment(network)}/${this.encodeSegment( + contract + )}/${this.encodeSegment(token)}/${this.encodeSegment(count)}` + ) + } + + get_holdercount(network: string, contract: NameType | string, token: string) { + return this.callText( + `/api/holdercount/${this.encodeSegment(network)}/${this.encodeSegment( + contract + )}/${this.encodeSegment(token)}` + ) + } + + get_usercount(network: string) { + return this.callText(`/api/usercount/${this.encodeSegment(network)}`) + } + + get_topram(network: string, count: number) { + return this.callJson( + `/api/topram/${this.encodeSegment(network)}/${this.encodeSegment(count)}` + ) + } + + get_topstake(network: string, count: number) { + return this.callJson( + `/api/topstake/${this.encodeSegment(network)}/${this.encodeSegment(count)}` + ) + } + + get_sync(network: string) { + return this.callText(`/api/sync/${this.encodeSegment(network)}`) + } + + get_status() { + return this.callText('/api/status') + } + + private callStruct(path: string, responseType: T) { + return this.client.call({ + path, + method: 'GET', + responseType, + }) + } + + private callJson(path: string) { + return this.client.call({ + path, + method: 'GET', + }) + } + + private callText(path: string) { + return this.client.call({ + path, + method: 'GET', + }) + } + + private encodeSegment(value: string | number | NameType) { + return encodeURIComponent(String(value)) + } +} diff --git a/packages/light-api/src/index.ts b/packages/light-api/src/index.ts new file mode 100644 index 00000000..057cab95 --- /dev/null +++ b/packages/light-api/src/index.ts @@ -0,0 +1,3 @@ +// Export both endpoints and types +export * from './endpoints' +export * as Types from './types' diff --git a/packages/light-api/src/types.ts b/packages/light-api/src/types.ts new file mode 100644 index 00000000..a2694f32 --- /dev/null +++ b/packages/light-api/src/types.ts @@ -0,0 +1,239 @@ +import { + Checksum256, + Int64, + Name, + PublicKey, + Struct, + UInt32, + UInt64, + UInt8, +} from '@wharfkit/antelope' + +export interface ChainInfoLike { + block_num: number + block_time: string + chainid: string + decimals: number + description: string + network: string + production: number + rex_enabled?: number + sync: number + systoken: string +} + +export interface PermissionAuthKeyLike { + public_key: string + pubkey: string + weight: number +} + +export interface PermissionAuthAccountLike { + actor: string + permission: string + weight: number +} + +export interface PermissionAuthLike { + accounts: PermissionAuthAccountLike[] + keys: PermissionAuthKeyLike[] + threshold?: number +} + +export interface PermissionLike { + auth: PermissionAuthLike + perm: string + threshold?: number +} + +export interface CodeHashAccountLike { + account_name: string + code_hash: string +} + +export type NetworkInfo = ChainInfoLike[] +export type TopHolderRow = [string, string] +export type TopRamRow = [string, number] +export type TopStakeRow = [string, number, number] +export type KeyLookupResponse = Record< + string, + { + chain?: ChainInfoLike + accounts?: Record + } +> +export type CodeHashResponse = Record< + string, + { + chain?: ChainInfoLike + accounts?: Record + } +> + +@Struct.type('chain_info') +export class ChainInfo extends Struct { + @Struct.field(UInt64) declare block_num: UInt64 + @Struct.field('string') declare block_time: string + @Struct.field(Checksum256) declare chainid: Checksum256 + @Struct.field(UInt32) declare decimals: UInt32 + @Struct.field('string') declare description: string + @Struct.field('string') declare network: string + @Struct.field(UInt8) declare production: UInt8 + @Struct.field(UInt8, {optional: true}) declare rex_enabled?: UInt8 + @Struct.field(Int64) declare sync: Int64 + @Struct.field('string') declare systoken: string +} + +@Struct.type('permission_auth_key') +export class PermissionAuthKey extends Struct { + @Struct.field(PublicKey) declare public_key: PublicKey + @Struct.field('string') declare pubkey: string + @Struct.field(UInt32) declare weight: UInt32 +} + +@Struct.type('permission_auth_account') +export class PermissionAuthAccount extends Struct { + @Struct.field(Name) declare actor: Name + @Struct.field(Name) declare permission: Name + @Struct.field(UInt32) declare weight: UInt32 +} + +@Struct.type('permission_auth') +export class PermissionAuth extends Struct { + @Struct.field(PermissionAuthAccount, {array: true}) declare accounts: PermissionAuthAccount[] + @Struct.field(PermissionAuthKey, {array: true}) declare keys: PermissionAuthKey[] + @Struct.field(UInt32, {optional: true}) declare threshold?: UInt32 +} + +@Struct.type('permission') +export class Permission extends Struct { + @Struct.field(PermissionAuth) declare auth: PermissionAuth + @Struct.field(Name) declare perm: Name + @Struct.field(UInt32, {optional: true}) declare threshold?: UInt32 +} + +@Struct.type('link_auth') +export class LinkAuth extends Struct { + @Struct.field(Name) declare code: Name + @Struct.field(Name) declare requirement: Name + @Struct.field('string') declare type: string +} + +@Struct.type('delegated_bandwidth_from') +export class DelegatedBandwidthFrom extends Struct { + @Struct.field(Name) declare del_from: Name + @Struct.field(Int64) declare net_weight: Int64 + @Struct.field(Int64) declare cpu_weight: Int64 +} + +@Struct.type('delegated_bandwidth_to') +export class DelegatedBandwidthTo extends Struct { + @Struct.field(Name) declare account_name: Name + @Struct.field(Int64) declare cpu_weight: Int64 + @Struct.field(Int64) declare net_weight: Int64 +} + +@Struct.type('resource_info') +export class ResourceInfo extends Struct { + @Struct.field(Int64) declare cpu_weight: Int64 + @Struct.field(Int64) declare net_weight: Int64 + @Struct.field(UInt64) declare ram_bytes: UInt64 +} + +@Struct.type('balance_entry') +export class BalanceEntry extends Struct { + @Struct.field('string') declare amount: string + @Struct.field('string') declare contract: string + @Struct.field('string') declare currency: string + @Struct.field('string') declare decimals: string +} + +@Struct.type('code_hash_entry') +export class CodeHashEntry extends Struct { + @Struct.field(Checksum256) declare code_hash: Checksum256 +} + +@Struct.type('rex_display_balances') +export class RexDisplayBalances extends Struct { + @Struct.field('string') declare fund: string + @Struct.field('string') declare matured: string + @Struct.field('string') declare maturing: string + @Struct.field('string') declare savings: string +} + +@Struct.type('rex_pool') +export class RexPool extends Struct { + @Struct.field(UInt64) declare loan_num: UInt64 + @Struct.field('string') declare namebid_proceeds: string + @Struct.field('string') declare total_lendable: string + @Struct.field('string') declare total_lent: string + @Struct.field('string') declare total_rex: string + @Struct.field('string') declare total_rent: string + @Struct.field('string') declare total_unlent: string +} + +@Struct.type('rex_raw_balance') +export class RexRawBalance extends Struct { + @Struct.field('string', {optional: true}) declare matured_rex?: string + @Struct.field('string', {optional: true}) declare rex_balance?: string + @Struct.field('any', {optional: true}) declare rex_maturities?: any + @Struct.field('string', {optional: true}) declare vote_stake?: string +} + +@Struct.type('rex_raw') +export class RexRaw extends Struct { + @Struct.field(RexRawBalance, {optional: true}) declare bal?: RexRawBalance + @Struct.field('string') declare fund: string + @Struct.field(RexPool) declare pool: RexPool +} + +@Struct.type('account_info_response') +export class AccountInfoResponse extends Struct { + @Struct.field(Name) declare account_name: Name + @Struct.field(ChainInfo) declare chain: ChainInfo + @Struct.field(DelegatedBandwidthFrom, {array: true}) + declare delegated_from: DelegatedBandwidthFrom[] + @Struct.field(DelegatedBandwidthTo, {array: true}) + declare delegated_to: DelegatedBandwidthTo[] + @Struct.field(LinkAuth, {array: true}) declare linkauth: LinkAuth[] + @Struct.field(Permission, {array: true}) declare permissions: Permission[] + @Struct.field(ResourceInfo) declare resources: ResourceInfo + @Struct.field(CodeHashEntry, {optional: true}) declare code?: CodeHashEntry +} + +@Struct.type('balances_response') +export class BalancesResponse extends Struct { + @Struct.field(Name) declare account_name: Name + @Struct.field(BalanceEntry, {array: true}) declare balances: BalanceEntry[] + @Struct.field(ChainInfo) declare chain: ChainInfo +} + +@Struct.type('rex_balance_response') +export class RexBalanceResponse extends Struct { + @Struct.field(Name) declare account_name: Name + @Struct.field(ChainInfo) declare chain: ChainInfo + @Struct.field(RexDisplayBalances) declare rex: RexDisplayBalances +} + +@Struct.type('rex_raw_response') +export class RexRawResponse extends Struct { + @Struct.field(Name) declare account_name: Name + @Struct.field(ChainInfo) declare chain: ChainInfo + @Struct.field(RexRaw) declare rexraw: RexRaw +} + +@Struct.type('account_response') +export class AccountResponse extends Struct { + @Struct.field(Name) declare account_name: Name + @Struct.field(BalanceEntry, {array: true}) declare balances: BalanceEntry[] + @Struct.field(ChainInfo) declare chain: ChainInfo + @Struct.field(CodeHashEntry, {optional: true}) declare code?: CodeHashEntry + @Struct.field(DelegatedBandwidthFrom, {array: true}) + declare delegated_from: DelegatedBandwidthFrom[] + @Struct.field(DelegatedBandwidthTo, {array: true}) + declare delegated_to: DelegatedBandwidthTo[] + @Struct.field(LinkAuth, {array: true}) declare linkauth: LinkAuth[] + @Struct.field(Permission, {array: true}) declare permissions: Permission[] + @Struct.field(RexDisplayBalances) declare rex: RexDisplayBalances + @Struct.field(ResourceInfo) declare resources: ResourceInfo +} diff --git a/packages/light-api/test/api.ts b/packages/light-api/test/api.ts new file mode 100644 index 00000000..f576f615 --- /dev/null +++ b/packages/light-api/test/api.ts @@ -0,0 +1,182 @@ +import {assert} from 'chai' + +import { + APIClient, + Checksum256, + FetchProvider, + Int64, + Name, + PublicKey, + UInt64, +} from '@wharfkit/antelope' +import {mockFetch} from '@wharfkit/mock-data' + +import {LightAPIClient, Types} from '$lib' + +const client = new APIClient({ + provider: new FetchProvider('https://eos.light-api.net', {fetch: mockFetch}), +}) + +const lightapi = new LightAPIClient(client) + +suite('Light API', function () { + this.slow(200) + this.timeout(10 * 10000) + + test('get_networks', async function () { + const response = await lightapi.get_networks() + + assert.isArray(response) + assert.equal(response.length, 5) + assert.equal(response[0].network, 'eos') + assert.equal(response[0].systoken, 'EOS') + assert.equal( + response[0].chainid, + 'aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906' + ) + }) + + test('get_account', async function () { + const response = await lightapi.get_account('eos', 'teamgreymass') + + assert.instanceOf(response, Types.AccountResponse) + assert.instanceOf(response.account_name, Name) + assert.equal(String(response.account_name), 'teamgreymass') + assert.instanceOf(response.chain.chainid, Checksum256) + assert.instanceOf(response.permissions[0].perm, Name) + assert.instanceOf(response.permissions[0].auth.keys[0].public_key, PublicKey) + assert.instanceOf(response.resources.ram_bytes, UInt64) + assert.equal(response.balances.length, 45) + assert.equal(response.rex.fund, '0.0000 EOS') + }) + + test('get_accinfo', async function () { + const response = await lightapi.get_accinfo('eos', 'teamgreymass') + + assert.instanceOf(response, Types.AccountInfoResponse) + assert.instanceOf(response.account_name, Name) + assert.equal(String(response.account_name), 'teamgreymass') + assert.instanceOf(response.permissions[0].auth.keys[0].public_key, PublicKey) + assert.instanceOf(response.delegated_from[0].net_weight, Int64) + assert.equal(response.linkauth.length, 12) + assert.equal(String(response.permissions[0].perm), 'active') + }) + + test('get_balances', async function () { + const response = await lightapi.get_balances('eos', 'teamgreymass') + + assert.instanceOf(response, Types.BalancesResponse) + assert.instanceOf(response.account_name, Name) + assert.equal(response.balances.length, 45) + assert.equal(response.balances[14].contract, 'eosio.token') + assert.equal(response.balances[14].amount, '5292.4309') + assert.equal(response.balances[14].decimals, '4') + }) + + test('get_rexbalance', async function () { + const response = await lightapi.get_rexbalance('eos', 'teamgreymass') + + assert.instanceOf(response, Types.RexBalanceResponse) + assert.instanceOf(response.account_name, Name) + assert.equal(response.rex.fund, '0.0000 EOS') + assert.equal(response.rex.maturing, '0.0000 EOS') + assert.instanceOf(response.chain.chainid, Checksum256) + }) + + test('get_rexraw', async function () { + const response = await lightapi.get_rexraw('eos', 'teamgreymass') + + assert.instanceOf(response, Types.RexRawResponse) + assert.instanceOf(response.account_name, Name) + assert.instanceOf(response.rexraw.pool.loan_num, UInt64) + assert.equal(response.rexraw.fund, '0.000000000000000000000000') + assert.equal(response.rexraw.pool.total_rex, '587072315799.259000000000000000000000') + }) + + test('get_tokenbalance', async function () { + const response = await lightapi.get_tokenbalance( + 'eos', + 'teamgreymass', + 'eosio.token', + 'EOS' + ) + + assert.equal(response, '5292.4309') + }) + + test('get_key', async function () { + const response = await lightapi.get_key( + 'PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN' + ) + + assert.equal(response.eos.chain?.network, 'eos') + assert.isArray(response.eos.accounts?.teamgreymass) + assert.equal(response.eos.accounts?.teamgreymass[5].perm, 'owner') + assert.equal( + response.eos.accounts?.teamgreymass[5].auth.keys[0].public_key, + 'PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN' + ) + assert.equal(response.telos.chain?.network, 'telos') + }) + + test('get_codehash', async function () { + const response = await lightapi.get_codehash( + '0a16e1dac533c4558698c8754f41219839ba2a2b75e517e65ea2537f76681f49' + ) + + assert.equal(response.eos.chain?.network, 'eos') + assert.equal(response.eos.accounts?.['eosio.token'].account_name, 'eosio.token') + assert.equal( + response.eos.accounts?.['eosio.token'].code_hash, + '0a16e1dac533c4558698c8754f41219839ba2a2b75e517e65ea2537f76681f49' + ) + }) + + test('get_topholders', async function () { + const response = await lightapi.get_topholders('eos', 'eosio.token', 'EOS', 10) + + assert.isArray(response) + assert.equal(response.length, 10) + assert.deepEqual(response[0], ['core.vaulta', '1035816036.0540']) + }) + + test('get_holdercount', async function () { + const response = await lightapi.get_holdercount('eos', 'eosio.token', 'EOS') + + assert.equal(response, '1653061') + }) + + test('get_usercount', async function () { + const response = await lightapi.get_usercount('eos') + + assert.equal(response, '6404414') + }) + + test('get_topram', async function () { + const response = await lightapi.get_topram('eos', 10) + + assert.isArray(response) + assert.equal(response.length, 10) + assert.deepEqual(response[0], ['utxomng.xsat', 132071612727]) + }) + + test('get_topstake', async function () { + const response = await lightapi.get_topstake('eos', 10) + + assert.isArray(response) + assert.equal(response.length, 10) + assert.deepEqual(response[0], ['eosio.reserv', 363786986211796, 95432101211517]) + }) + + test('get_sync', async function () { + const response = await lightapi.get_sync('eos') + + assert.equal(response, '0 OK') + }) + + test('get_status', async function () { + const response = await lightapi.get_status() + + assert.equal(response, 'OK ') + }) +}) diff --git a/packages/light-api/test/data/149cb3b36356fb75b563d6a5f088431f4c70d21d.json b/packages/light-api/test/data/149cb3b36356fb75b563d6a5f088431f4c70d21d.json new file mode 100644 index 00000000..8acfe0df --- /dev/null +++ b/packages/light-api/test/data/149cb3b36356fb75b563d6a5f088431f4c70d21d.json @@ -0,0 +1,22 @@ +{ + "request": { + "path": "https://eos.light-api.net/api/sync/eos", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "headers": { + "access-control-allow-headers": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", + "access-control-allow-methods": "GET", + "access-control-allow-origin": "*", + "access-control-expose-headers": "Content-Length,Content-Range", + "connection": "keep-alive", + "content-type": "text/plain", + "date": "Tue, 24 Mar 2026 19:52:05 GMT", + "server": "nginx/1.18.0 (Ubuntu)", + "transfer-encoding": "chunked" + }, + "text": "0 OK" +} diff --git a/packages/light-api/test/data/22927bdc95fa6a3889434584bafe3e8cb4af4c81.json b/packages/light-api/test/data/22927bdc95fa6a3889434584bafe3e8cb4af4c81.json new file mode 100644 index 00000000..69ab3787 --- /dev/null +++ b/packages/light-api/test/data/22927bdc95fa6a3889434584bafe3e8cb4af4c81.json @@ -0,0 +1,298 @@ +{ + "request": { + "path": "https://eos.light-api.net/api/balances/eos/teamgreymass", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "json": { + "balances": [ + { + "amount": "45245.6267", + "contract": "betkingtoken", + "decimals": "4", + "currency": "BKT" + }, + { + "contract": "bgbgbgbgbgbg", + "decimals": "4", + "amount": "0.1000", + "currency": "BG" + }, + { + "currency": "BINGO", + "contract": "bingobetoken", + "decimals": "4", + "amount": "1000.0000" + }, + { + "amount": "103.9999", + "contract": "biteyebiteye", + "decimals": "4", + "currency": "BITI" + }, + { + "amount": "0.0012", + "decimals": "4", + "contract": "blockbasetkn", + "currency": "BBT" + }, + { + "currency": "ADE", + "contract": "buildertoken", + "decimals": "4", + "amount": "32351.8580" + }, + { + "currency": "ADE", + "contract": "cadeositoken", + "decimals": "6", + "amount": "32358.858000" + }, + { + "contract": "core.ogx", + "decimals": "8", + "amount": "0.00000100", + "currency": "OBTC" + }, + { + "currency": "A", + "amount": "15004.7481", + "decimals": "4", + "contract": "core.vaulta" + }, + { + "amount": "18.0000", + "contract": "dhbonetokens", + "decimals": "4", + "currency": "DHB" + }, + { + "currency": "EAPP", + "amount": "2.0000", + "contract": "eappeappp.tp", + "decimals": "4" + }, + { + "currency": "EMOON", + "contract": "emoonnetwork", + "decimals": "2", + "amount": "1000010000.00" + }, + { + "amount": "0.0080", + "decimals": "4", + "contract": "eosbtextoken", + "currency": "BT" + }, + { + "currency": "CCC", + "amount": "202.0000", + "decimals": "4", + "contract": "eoscccdotcom" + }, + { + "amount": "5292.4309", + "decimals": "4", + "contract": "eosio.token", + "currency": "EOS" + }, + { + "currency": "POW", + "amount": "3.26194299", + "decimals": "8", + "contract": "eosiopowcoin" + }, + { + "amount": "100.0000", + "decimals": "4", + "contract": "eostory12345", + "currency": "ERCT" + }, + { + "currency": "EPRA", + "decimals": "4", + "contract": "epraofficial", + "amount": "0.0001" + }, + { + "amount": "5000.0000", + "contract": "ethsidechain", + "decimals": "4", + "currency": "EETH" + }, + { + "contract": "everipediaiq", + "decimals": "3", + "amount": "0.001", + "currency": "IQ" + }, + { + "contract": "gamelordcoin", + "decimals": "4", + "amount": "1.0000", + "currency": "LORD" + }, + { + "currency": "HBGO", + "amount": "0.1914", + "decimals": "4", + "contract": "hashbabycoin" + }, + { + "amount": "19908.0137", + "contract": "hirevibeshvt", + "decimals": "4", + "currency": "HVT" + }, + { + "currency": "MVC", + "amount": "0.0001", + "contract": "mvcoin.x", + "decimals": "4" + }, + { + "currency": "CZB", + "amount": "2.00000000", + "contract": "okkkkkkkkkkk", + "decimals": "8" + }, + { + "currency": "LED", + "contract": "okkkkkkkkkkk", + "decimals": "6", + "amount": "53.660000" + }, + { + "amount": "280000.0000", + "contract": "onessusblock", + "decimals": "4", + "currency": "VOID" + }, + { + "currency": "IPOS", + "decimals": "4", + "contract": "oo1122334455", + "amount": "2000.0000" + }, + { + "amount": "479.605", + "contract": "openbrmeos11", + "decimals": "3", + "currency": "BRM" + }, + { + "currency": "PIZZA", + "contract": "pizzatotoken", + "decimals": "4", + "amount": "47.4718" + }, + { + "currency": "PLAY", + "contract": "play.pomelo", + "decimals": "4", + "amount": "100.0000" + }, + { + "currency": "PLO", + "amount": "11438.5283", + "contract": "playeronetkn", + "decimals": "4" + }, + { + "currency": "PUML", + "decimals": "4", + "contract": "pumlhealthio", + "amount": "12.7777" + }, + { + "currency": "RWC", + "decimals": "4", + "contract": "realworldcpn", + "amount": "5.0000" + }, + { + "amount": "1.0000", + "contract": "stipsoculus1", + "decimals": "4", + "currency": "STIPS" + }, + { + "currency": "TOOK", + "amount": "47988.8846", + "contract": "taketooktook", + "decimals": "4" + }, + { + "contract": "tethertether", + "decimals": "4", + "amount": "0.0000", + "currency": "USDT" + }, + { + "amount": "100.0000", + "contract": "theforcegrou", + "decimals": "4", + "currency": "EFOR" + }, + { + "currency": "PEOS", + "amount": "14380.2999", + "decimals": "4", + "contract": "thepeostoken" + }, + { + "currency": "ZEOS", + "amount": "68450.2273", + "decimals": "4", + "contract": "thezeostoken" + }, + { + "contract": "token.rms", + "decimals": "0", + "amount": "1", + "currency": "V" + }, + { + "currency": "LIBRA", + "amount": "16100.0000", + "decimals": "4", + "contract": "usdcoinchain" + }, + { + "contract": "vig111111111", + "decimals": "4", + "amount": "375000.0000", + "currency": "VIG" + }, + { + "currency": "RED", + "amount": "1", + "decimals": "0", + "contract": "visionfintec" + }, + { + "currency": "CDOG", + "amount": "914665.7776", + "contract": "zerotoone.en", + "decimals": "4" + } + ], + "chain": { + "chainid": "aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906", + "decimals": 4, + "production": 1, + "sync": 0, + "block_time": "2026-03-24 19:56:48", + "description": "EOS Mainnet", + "network": "eos", + "systoken": "EOS", + "rex_enabled": 1, + "block_num": 490174681 + }, + "account_name": "teamgreymass" + }, + "text": "{\"balances\":[{\"amount\":\"45245.6267\",\"contract\":\"betkingtoken\",\"decimals\":\"4\",\"currency\":\"BKT\"},{\"contract\":\"bgbgbgbgbgbg\",\"decimals\":\"4\",\"amount\":\"0.1000\",\"currency\":\"BG\"},{\"currency\":\"BINGO\",\"contract\":\"bingobetoken\",\"decimals\":\"4\",\"amount\":\"1000.0000\"},{\"amount\":\"103.9999\",\"contract\":\"biteyebiteye\",\"decimals\":\"4\",\"currency\":\"BITI\"},{\"amount\":\"0.0012\",\"decimals\":\"4\",\"contract\":\"blockbasetkn\",\"currency\":\"BBT\"},{\"currency\":\"ADE\",\"contract\":\"buildertoken\",\"decimals\":\"4\",\"amount\":\"32351.8580\"},{\"currency\":\"ADE\",\"contract\":\"cadeositoken\",\"decimals\":\"6\",\"amount\":\"32358.858000\"},{\"contract\":\"core.ogx\",\"decimals\":\"8\",\"amount\":\"0.00000100\",\"currency\":\"OBTC\"},{\"currency\":\"A\",\"amount\":\"15004.7481\",\"decimals\":\"4\",\"contract\":\"core.vaulta\"},{\"amount\":\"18.0000\",\"contract\":\"dhbonetokens\",\"decimals\":\"4\",\"currency\":\"DHB\"},{\"currency\":\"EAPP\",\"amount\":\"2.0000\",\"contract\":\"eappeappp.tp\",\"decimals\":\"4\"},{\"currency\":\"EMOON\",\"contract\":\"emoonnetwork\",\"decimals\":\"2\",\"amount\":\"1000010000.00\"},{\"amount\":\"0.0080\",\"decimals\":\"4\",\"contract\":\"eosbtextoken\",\"currency\":\"BT\"},{\"currency\":\"CCC\",\"amount\":\"202.0000\",\"decimals\":\"4\",\"contract\":\"eoscccdotcom\"},{\"amount\":\"5292.4309\",\"decimals\":\"4\",\"contract\":\"eosio.token\",\"currency\":\"EOS\"},{\"currency\":\"POW\",\"amount\":\"3.26194299\",\"decimals\":\"8\",\"contract\":\"eosiopowcoin\"},{\"amount\":\"100.0000\",\"decimals\":\"4\",\"contract\":\"eostory12345\",\"currency\":\"ERCT\"},{\"currency\":\"EPRA\",\"decimals\":\"4\",\"contract\":\"epraofficial\",\"amount\":\"0.0001\"},{\"amount\":\"5000.0000\",\"contract\":\"ethsidechain\",\"decimals\":\"4\",\"currency\":\"EETH\"},{\"contract\":\"everipediaiq\",\"decimals\":\"3\",\"amount\":\"0.001\",\"currency\":\"IQ\"},{\"contract\":\"gamelordcoin\",\"decimals\":\"4\",\"amount\":\"1.0000\",\"currency\":\"LORD\"},{\"currency\":\"HBGO\",\"amount\":\"0.1914\",\"decimals\":\"4\",\"contract\":\"hashbabycoin\"},{\"amount\":\"19908.0137\",\"contract\":\"hirevibeshvt\",\"decimals\":\"4\",\"currency\":\"HVT\"},{\"currency\":\"MVC\",\"amount\":\"0.0001\",\"contract\":\"mvcoin.x\",\"decimals\":\"4\"},{\"currency\":\"CZB\",\"amount\":\"2.00000000\",\"contract\":\"okkkkkkkkkkk\",\"decimals\":\"8\"},{\"currency\":\"LED\",\"contract\":\"okkkkkkkkkkk\",\"decimals\":\"6\",\"amount\":\"53.660000\"},{\"amount\":\"280000.0000\",\"contract\":\"onessusblock\",\"decimals\":\"4\",\"currency\":\"VOID\"},{\"currency\":\"IPOS\",\"decimals\":\"4\",\"contract\":\"oo1122334455\",\"amount\":\"2000.0000\"},{\"amount\":\"479.605\",\"contract\":\"openbrmeos11\",\"decimals\":\"3\",\"currency\":\"BRM\"},{\"currency\":\"PIZZA\",\"contract\":\"pizzatotoken\",\"decimals\":\"4\",\"amount\":\"47.4718\"},{\"currency\":\"PLAY\",\"contract\":\"play.pomelo\",\"decimals\":\"4\",\"amount\":\"100.0000\"},{\"currency\":\"PLO\",\"amount\":\"11438.5283\",\"contract\":\"playeronetkn\",\"decimals\":\"4\"},{\"currency\":\"PUML\",\"decimals\":\"4\",\"contract\":\"pumlhealthio\",\"amount\":\"12.7777\"},{\"currency\":\"RWC\",\"decimals\":\"4\",\"contract\":\"realworldcpn\",\"amount\":\"5.0000\"},{\"amount\":\"1.0000\",\"contract\":\"stipsoculus1\",\"decimals\":\"4\",\"currency\":\"STIPS\"},{\"currency\":\"TOOK\",\"amount\":\"47988.8846\",\"contract\":\"taketooktook\",\"decimals\":\"4\"},{\"contract\":\"tethertether\",\"decimals\":\"4\",\"amount\":\"0.0000\",\"currency\":\"USDT\"},{\"amount\":\"100.0000\",\"contract\":\"theforcegrou\",\"decimals\":\"4\",\"currency\":\"EFOR\"},{\"currency\":\"PEOS\",\"amount\":\"14380.2999\",\"decimals\":\"4\",\"contract\":\"thepeostoken\"},{\"currency\":\"ZEOS\",\"amount\":\"68450.2273\",\"decimals\":\"4\",\"contract\":\"thezeostoken\"},{\"contract\":\"token.rms\",\"decimals\":\"0\",\"amount\":\"1\",\"currency\":\"V\"},{\"currency\":\"LIBRA\",\"amount\":\"16100.0000\",\"decimals\":\"4\",\"contract\":\"usdcoinchain\"},{\"contract\":\"vig111111111\",\"decimals\":\"4\",\"amount\":\"375000.0000\",\"currency\":\"VIG\"},{\"currency\":\"RED\",\"amount\":\"1\",\"decimals\":\"0\",\"contract\":\"visionfintec\"},{\"currency\":\"CDOG\",\"amount\":\"914665.7776\",\"contract\":\"zerotoone.en\",\"decimals\":\"4\"}],\"chain\":{\"chainid\":\"aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906\",\"decimals\":4,\"production\":1,\"sync\":0,\"block_time\":\"2026-03-24 19:56:48\",\"description\":\"EOS Mainnet\",\"network\":\"eos\",\"systoken\":\"EOS\",\"rex_enabled\":1,\"block_num\":490174681},\"account_name\":\"teamgreymass\"}" +} \ No newline at end of file diff --git a/packages/light-api/test/data/2cabe23ce7a56b8c7bf84fcaa5759641deb5e78d.json b/packages/light-api/test/data/2cabe23ce7a56b8c7bf84fcaa5759641deb5e78d.json new file mode 100644 index 00000000..e71f845c --- /dev/null +++ b/packages/light-api/test/data/2cabe23ce7a56b8c7bf84fcaa5759641deb5e78d.json @@ -0,0 +1,22 @@ +{ + "request": { + "path": "https://eos.light-api.net/api/status", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "headers": { + "access-control-allow-headers": "DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range", + "access-control-allow-methods": "GET", + "access-control-allow-origin": "*", + "access-control-expose-headers": "Content-Length,Content-Range", + "connection": "keep-alive", + "content-type": "text/plain", + "date": "Tue, 24 Mar 2026 19:52:05 GMT", + "server": "nginx/1.18.0 (Ubuntu)", + "transfer-encoding": "chunked" + }, + "text": "OK " +} diff --git a/packages/light-api/test/data/32301183282b9727c1ff570bbec292ff43db6d10.json b/packages/light-api/test/data/32301183282b9727c1ff570bbec292ff43db6d10.json new file mode 100644 index 00000000..e6bbc8a6 --- /dev/null +++ b/packages/light-api/test/data/32301183282b9727c1ff570bbec292ff43db6d10.json @@ -0,0 +1,12 @@ +{ + "request": { + "path": "https://eos.light-api.net/api/holdercount/eos/eosio.token/EOS", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "json": 1653061, + "text": "1653061" +} \ No newline at end of file diff --git a/packages/light-api/test/data/34faec66ce3187d286dbfc625c3aa025e5387550.json b/packages/light-api/test/data/34faec66ce3187d286dbfc625c3aa025e5387550.json new file mode 100644 index 00000000..2e070da4 --- /dev/null +++ b/packages/light-api/test/data/34faec66ce3187d286dbfc625c3aa025e5387550.json @@ -0,0 +1,63 @@ +{ + "request": { + "path": "https://eos.light-api.net/api/topstake/eos/10", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "json": [ + [ + "eosio.reserv", + 363786986211796, + 95432101211517 + ], + [ + "res.xsat", + 3436900878430, + 277254184 + ], + [ + "1aaaann.sat", + 2299999999977, + 114999977 + ], + [ + "marleysprite", + 995852795232, + 458179406 + ], + [ + "dallasarcher", + 995852795232, + 458179406 + ], + [ + "bloodyvanity", + 995852795232, + 458179406 + ], + [ + "suguspowders", + 995852795233, + 458179297 + ], + [ + "eosmandelgod", + 995852795233, + 458179297 + ], + [ + "1aaaaim.sat", + 399999999996, + 19999996 + ], + [ + "bankres.xsat", + 382074128175, + 1254552 + ] + ], + "text": "[[\"eosio.reserv\",363786986211796,95432101211517],[\"res.xsat\",3436900878430,277254184],[\"1aaaann.sat\",2299999999977,114999977],[\"marleysprite\",995852795232,458179406],[\"dallasarcher\",995852795232,458179406],[\"bloodyvanity\",995852795232,458179406],[\"suguspowders\",995852795233,458179297],[\"eosmandelgod\",995852795233,458179297],[\"1aaaaim.sat\",399999999996,19999996],[\"bankres.xsat\",382074128175,1254552]]" +} \ No newline at end of file diff --git a/packages/light-api/test/data/360c0e0b21b9a54be659beeb221221550b135e5f.json b/packages/light-api/test/data/360c0e0b21b9a54be659beeb221221550b135e5f.json new file mode 100644 index 00000000..b32e57a2 --- /dev/null +++ b/packages/light-api/test/data/360c0e0b21b9a54be659beeb221221550b135e5f.json @@ -0,0 +1,254 @@ +{ + "request": { + "path": "https://eos.light-api.net/api/accinfo/eos/teamgreymass", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "json": { + "chain": { + "chainid": "aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906", + "decimals": 4, + "production": 1, + "network": "eos", + "description": "EOS Mainnet", + "systoken": "EOS", + "rex_enabled": 1, + "block_time": "2026-03-24 19:56:47", + "sync": 0, + "block_num": 490174680 + }, + "resources": { + "cpu_weight": 0, + "ram_bytes": 818870, + "net_weight": 2 + }, + "delegated_to": [ + { + "account_name": "teamgreymass", + "cpu_weight": 0, + "net_weight": 1 + } + ], + "linkauth": [ + { + "code": "core.vaulta", + "type": "claimrewards", + "requirement": "claim" + }, + { + "type": "transfer", + "requirement": "transfer", + "code": "core.vaulta" + }, + { + "type": "", + "requirement": "decentium", + "code": "decentiumorg" + }, + { + "requirement": "oracle", + "type": "write", + "code": "delphioracle" + }, + { + "code": "eosio", + "type": "claimrewards", + "requirement": "claim" + }, + { + "type": "unregprod", + "requirement": "killswitch", + "code": "eosio" + }, + { + "code": "eosio", + "requirement": "vote", + "type": "voteproducer" + }, + { + "requirement": "claim", + "type": "claimrewards", + "code": "eosio.bpay" + }, + { + "code": "eosio.forum", + "type": "unvote", + "requirement": "voting" + }, + { + "type": "vote", + "requirement": "voting", + "code": "eosio.forum" + }, + { + "requirement": "transfer", + "type": "transfer", + "code": "eosio.token" + }, + { + "code": "producerjson", + "requirement": "producerjson", + "type": "set" + } + ], + "permissions": [ + { + "auth": { + "accounts": [], + "keys": [ + { + "pubkey": "EOS6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQ9kXZK1", + "public_key": "PUB_K1_6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQBdT2GF", + "weight": 1 + } + ] + }, + "threshold": 1, + "perm": "active" + }, + { + "perm": "claim", + "auth": { + "accounts": [], + "keys": [ + { + "weight": 1, + "public_key": "PUB_K1_6DLD9HxMcwn73U41jjdGsNe9vDFRKB26um6qTAqrtYcJFFzdpw", + "pubkey": "EOS6DLD9HxMcwn73U41jjdGsNe9vDFRKB26um6qTAqrtYcJFtED4C" + } + ] + }, + "threshold": 1 + }, + { + "perm": "decentium", + "threshold": 1, + "auth": { + "keys": [ + { + "weight": 1, + "pubkey": "EOS7knG7M5TUEdRv1bkVjTPddVoDQnwS7oEZXAgFk3A4hhocA3eJf", + "public_key": "PUB_K1_7knG7M5TUEdRv1bkVjTPddVoDQnwS7oEZXAgFk3A4hhoXjv3GL" + } + ], + "accounts": [] + } + }, + { + "perm": "killswitch", + "auth": { + "keys": [ + { + "weight": 1, + "pubkey": "EOS7CjC7GL71msPzAuAzd2WwiBEAzTcPL47ACrjSuiNmnnGGufYSn", + "public_key": "PUB_K1_7CjC7GL71msPzAuAzd2WwiBEAzTcPL47ACrjSuiNmnnGHEHtup" + } + ], + "accounts": [] + }, + "threshold": 1 + }, + { + "perm": "oracle", + "threshold": 1, + "auth": { + "accounts": [], + "keys": [ + { + "weight": 1, + "pubkey": "EOS88VqmDmJJ9S23eNqdeWYf2zySxv3ckQrWBKy7EvVRCUuhSU4f3", + "public_key": "PUB_K1_88VqmDmJJ9S23eNqdeWYf2zySxv3ckQrWBKy7EvVRCUuhEDJJt" + } + ] + } + }, + { + "auth": { + "accounts": [], + "keys": [ + { + "pubkey": "EOS8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5RgwKN82", + "public_key": "PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN", + "weight": 1 + } + ] + }, + "threshold": 1, + "perm": "owner" + }, + { + "auth": { + "keys": [ + { + "pubkey": "EOS5JCEciUdfXnQmTyj85T98bXTAZZ1g7Nmajseu7ZWB8DrDa6Etp", + "public_key": "PUB_K1_5JCEciUdfXnQmTyj85T98bXTAZZ1g7Nmajseu7ZWB8DrGVwUnM", + "weight": 1 + } + ], + "accounts": [] + }, + "threshold": 1, + "perm": "producerjson" + }, + { + "perm": "transfer", + "auth": { + "accounts": [], + "keys": [ + { + "weight": 1, + "pubkey": "EOS7qZ8nnmn6KBnjQL4oukyZFWCj8DmC9nJE2nkAYAZbwgKhMu8cW", + "public_key": "PUB_K1_7qZ8nnmn6KBnjQL4oukyZFWCj8DmC9nJE2nkAYAZbwgKm7MD7V" + } + ] + }, + "threshold": 1 + }, + { + "perm": "vote", + "auth": { + "accounts": [], + "keys": [ + { + "pubkey": "EOS65NrHPVXaV4voxepQREmYCmnMJm4tAWdxPaK46CbUN1rrVmRzg", + "public_key": "PUB_K1_65NrHPVXaV4voxepQREmYCmnMJm4tAWdxPaK46CbUN1rrkfmPY", + "weight": 1 + } + ] + }, + "threshold": 1 + }, + { + "perm": "voting", + "threshold": 1, + "auth": { + "accounts": [], + "keys": [ + { + "public_key": "PUB_K1_7pn6P5FftyNAKRfx9VcUzBFMvC4UitNbnoKbfxNe8SShE8XTzQ", + "pubkey": "EOS7pn6P5FftyNAKRfx9VcUzBFMvC4UitNbnoKbfxNe8SShELo2it", + "weight": 1 + } + ] + } + } + ], + "account_name": "teamgreymass", + "delegated_from": [ + { + "net_weight": 1, + "del_from": "eos42freedom", + "cpu_weight": 0 + }, + { + "net_weight": 1, + "del_from": "teamgreymass", + "cpu_weight": 0 + } + ] + }, + "text": "{\"chain\":{\"chainid\":\"aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906\",\"decimals\":4,\"production\":1,\"network\":\"eos\",\"description\":\"EOS Mainnet\",\"systoken\":\"EOS\",\"rex_enabled\":1,\"block_time\":\"2026-03-24 19:56:47\",\"sync\":0,\"block_num\":490174680},\"resources\":{\"cpu_weight\":0,\"ram_bytes\":818870,\"net_weight\":2},\"delegated_to\":[{\"account_name\":\"teamgreymass\",\"cpu_weight\":0,\"net_weight\":1}],\"linkauth\":[{\"code\":\"core.vaulta\",\"type\":\"claimrewards\",\"requirement\":\"claim\"},{\"type\":\"transfer\",\"requirement\":\"transfer\",\"code\":\"core.vaulta\"},{\"type\":\"\",\"requirement\":\"decentium\",\"code\":\"decentiumorg\"},{\"requirement\":\"oracle\",\"type\":\"write\",\"code\":\"delphioracle\"},{\"code\":\"eosio\",\"type\":\"claimrewards\",\"requirement\":\"claim\"},{\"type\":\"unregprod\",\"requirement\":\"killswitch\",\"code\":\"eosio\"},{\"code\":\"eosio\",\"requirement\":\"vote\",\"type\":\"voteproducer\"},{\"requirement\":\"claim\",\"type\":\"claimrewards\",\"code\":\"eosio.bpay\"},{\"code\":\"eosio.forum\",\"type\":\"unvote\",\"requirement\":\"voting\"},{\"type\":\"vote\",\"requirement\":\"voting\",\"code\":\"eosio.forum\"},{\"requirement\":\"transfer\",\"type\":\"transfer\",\"code\":\"eosio.token\"},{\"code\":\"producerjson\",\"requirement\":\"producerjson\",\"type\":\"set\"}],\"permissions\":[{\"auth\":{\"accounts\":[],\"keys\":[{\"pubkey\":\"EOS6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQ9kXZK1\",\"public_key\":\"PUB_K1_6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQBdT2GF\",\"weight\":1}]},\"threshold\":1,\"perm\":\"active\"},{\"perm\":\"claim\",\"auth\":{\"accounts\":[],\"keys\":[{\"weight\":1,\"public_key\":\"PUB_K1_6DLD9HxMcwn73U41jjdGsNe9vDFRKB26um6qTAqrtYcJFFzdpw\",\"pubkey\":\"EOS6DLD9HxMcwn73U41jjdGsNe9vDFRKB26um6qTAqrtYcJFtED4C\"}]},\"threshold\":1},{\"perm\":\"decentium\",\"threshold\":1,\"auth\":{\"keys\":[{\"weight\":1,\"pubkey\":\"EOS7knG7M5TUEdRv1bkVjTPddVoDQnwS7oEZXAgFk3A4hhocA3eJf\",\"public_key\":\"PUB_K1_7knG7M5TUEdRv1bkVjTPddVoDQnwS7oEZXAgFk3A4hhoXjv3GL\"}],\"accounts\":[]}},{\"perm\":\"killswitch\",\"auth\":{\"keys\":[{\"weight\":1,\"pubkey\":\"EOS7CjC7GL71msPzAuAzd2WwiBEAzTcPL47ACrjSuiNmnnGGufYSn\",\"public_key\":\"PUB_K1_7CjC7GL71msPzAuAzd2WwiBEAzTcPL47ACrjSuiNmnnGHEHtup\"}],\"accounts\":[]},\"threshold\":1},{\"perm\":\"oracle\",\"threshold\":1,\"auth\":{\"accounts\":[],\"keys\":[{\"weight\":1,\"pubkey\":\"EOS88VqmDmJJ9S23eNqdeWYf2zySxv3ckQrWBKy7EvVRCUuhSU4f3\",\"public_key\":\"PUB_K1_88VqmDmJJ9S23eNqdeWYf2zySxv3ckQrWBKy7EvVRCUuhEDJJt\"}]}},{\"auth\":{\"accounts\":[],\"keys\":[{\"pubkey\":\"EOS8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5RgwKN82\",\"public_key\":\"PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN\",\"weight\":1}]},\"threshold\":1,\"perm\":\"owner\"},{\"auth\":{\"keys\":[{\"pubkey\":\"EOS5JCEciUdfXnQmTyj85T98bXTAZZ1g7Nmajseu7ZWB8DrDa6Etp\",\"public_key\":\"PUB_K1_5JCEciUdfXnQmTyj85T98bXTAZZ1g7Nmajseu7ZWB8DrGVwUnM\",\"weight\":1}],\"accounts\":[]},\"threshold\":1,\"perm\":\"producerjson\"},{\"perm\":\"transfer\",\"auth\":{\"accounts\":[],\"keys\":[{\"weight\":1,\"pubkey\":\"EOS7qZ8nnmn6KBnjQL4oukyZFWCj8DmC9nJE2nkAYAZbwgKhMu8cW\",\"public_key\":\"PUB_K1_7qZ8nnmn6KBnjQL4oukyZFWCj8DmC9nJE2nkAYAZbwgKm7MD7V\"}]},\"threshold\":1},{\"perm\":\"vote\",\"auth\":{\"accounts\":[],\"keys\":[{\"pubkey\":\"EOS65NrHPVXaV4voxepQREmYCmnMJm4tAWdxPaK46CbUN1rrVmRzg\",\"public_key\":\"PUB_K1_65NrHPVXaV4voxepQREmYCmnMJm4tAWdxPaK46CbUN1rrkfmPY\",\"weight\":1}]},\"threshold\":1},{\"perm\":\"voting\",\"threshold\":1,\"auth\":{\"accounts\":[],\"keys\":[{\"public_key\":\"PUB_K1_7pn6P5FftyNAKRfx9VcUzBFMvC4UitNbnoKbfxNe8SShE8XTzQ\",\"pubkey\":\"EOS7pn6P5FftyNAKRfx9VcUzBFMvC4UitNbnoKbfxNe8SShELo2it\",\"weight\":1}]}}],\"account_name\":\"teamgreymass\",\"delegated_from\":[{\"net_weight\":1,\"del_from\":\"eos42freedom\",\"cpu_weight\":0},{\"net_weight\":1,\"del_from\":\"teamgreymass\",\"cpu_weight\":0}]}" +} \ No newline at end of file diff --git a/packages/light-api/test/data/3ba4f2ba75bf179e6ca304b0a5331ff89c338d17.json b/packages/light-api/test/data/3ba4f2ba75bf179e6ca304b0a5331ff89c338d17.json new file mode 100644 index 00000000..ce2c21bd --- /dev/null +++ b/packages/light-api/test/data/3ba4f2ba75bf179e6ca304b0a5331ff89c338d17.json @@ -0,0 +1,308 @@ +{ + "request": { + "path": "https://eos.light-api.net/api/key/PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "json": { + "telos": { + "accounts": { + "locktimerv11": [ + { + "threshold": 1, + "auth": { + "accounts": [], + "keys": [ + { + "pubkey": "EOS8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5RgwKN82", + "public_key": "PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN", + "weight": 1 + } + ] + }, + "perm": "active" + }, + { + "perm": "owner", + "threshold": 1, + "auth": { + "accounts": [], + "keys": [ + { + "weight": 1, + "pubkey": "EOS8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5RgwKN82", + "public_key": "PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN" + } + ] + } + } + ], + "teamgreymass": [ + { + "threshold": 1, + "auth": { + "keys": [ + { + "weight": 1, + "pubkey": "EOS6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQ9kXZK1", + "public_key": "PUB_K1_6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQBdT2GF" + } + ], + "accounts": [] + }, + "perm": "active" + }, + { + "perm": "claim", + "threshold": 1, + "auth": { + "keys": [ + { + "pubkey": "EOS6DLD9HxMcwn73U41jjdGsNe9vDFRKB26um6qTAqrtYcJFtED4C", + "public_key": "PUB_K1_6DLD9HxMcwn73U41jjdGsNe9vDFRKB26um6qTAqrtYcJFFzdpw", + "weight": 1 + } + ], + "accounts": [] + } + }, + { + "auth": { + "accounts": [], + "keys": [ + { + "public_key": "PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN", + "pubkey": "EOS8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5RgwKN82", + "weight": 1 + } + ] + }, + "threshold": 1, + "perm": "owner" + }, + { + "auth": { + "keys": [ + { + "weight": 1, + "pubkey": "EOS5JCEciUdfXnQmTyj85T98bXTAZZ1g7Nmajseu7ZWB8DrDa6Etp", + "public_key": "PUB_K1_5JCEciUdfXnQmTyj85T98bXTAZZ1g7Nmajseu7ZWB8DrGVwUnM" + } + ], + "accounts": [] + }, + "threshold": 1, + "perm": "producerjson" + } + ] + }, + "chain": { + "block_num": 458754402, + "sync": 0, + "block_time": "2026-03-24 19:56:52", + "rex_enabled": 1, + "description": "Telos Mainnet", + "network": "telos", + "systoken": "TLOS", + "production": 1, + "decimals": 4, + "chainid": "4667b205c6838ef70ff7988f6e8257e8be0e1284a2f59699054a018f743b1d11" + } + }, + "eos": { + "accounts": { + "teamgreymass": [ + { + "auth": { + "keys": [ + { + "weight": 1, + "pubkey": "EOS6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQ9kXZK1", + "public_key": "PUB_K1_6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQBdT2GF" + } + ], + "accounts": [] + }, + "threshold": 1, + "perm": "active" + }, + { + "threshold": 1, + "auth": { + "accounts": [], + "keys": [ + { + "weight": 1, + "pubkey": "EOS6DLD9HxMcwn73U41jjdGsNe9vDFRKB26um6qTAqrtYcJFtED4C", + "public_key": "PUB_K1_6DLD9HxMcwn73U41jjdGsNe9vDFRKB26um6qTAqrtYcJFFzdpw" + } + ] + }, + "perm": "claim" + }, + { + "perm": "decentium", + "auth": { + "keys": [ + { + "pubkey": "EOS7knG7M5TUEdRv1bkVjTPddVoDQnwS7oEZXAgFk3A4hhocA3eJf", + "public_key": "PUB_K1_7knG7M5TUEdRv1bkVjTPddVoDQnwS7oEZXAgFk3A4hhoXjv3GL", + "weight": 1 + } + ], + "accounts": [] + }, + "threshold": 1 + }, + { + "auth": { + "keys": [ + { + "weight": 1, + "pubkey": "EOS7CjC7GL71msPzAuAzd2WwiBEAzTcPL47ACrjSuiNmnnGGufYSn", + "public_key": "PUB_K1_7CjC7GL71msPzAuAzd2WwiBEAzTcPL47ACrjSuiNmnnGHEHtup" + } + ], + "accounts": [] + }, + "threshold": 1, + "perm": "killswitch" + }, + { + "perm": "oracle", + "auth": { + "accounts": [], + "keys": [ + { + "public_key": "PUB_K1_88VqmDmJJ9S23eNqdeWYf2zySxv3ckQrWBKy7EvVRCUuhEDJJt", + "pubkey": "EOS88VqmDmJJ9S23eNqdeWYf2zySxv3ckQrWBKy7EvVRCUuhSU4f3", + "weight": 1 + } + ] + }, + "threshold": 1 + }, + { + "perm": "owner", + "auth": { + "accounts": [], + "keys": [ + { + "weight": 1, + "pubkey": "EOS8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5RgwKN82", + "public_key": "PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN" + } + ] + }, + "threshold": 1 + }, + { + "auth": { + "keys": [ + { + "public_key": "PUB_K1_5JCEciUdfXnQmTyj85T98bXTAZZ1g7Nmajseu7ZWB8DrGVwUnM", + "pubkey": "EOS5JCEciUdfXnQmTyj85T98bXTAZZ1g7Nmajseu7ZWB8DrDa6Etp", + "weight": 1 + } + ], + "accounts": [] + }, + "threshold": 1, + "perm": "producerjson" + }, + { + "threshold": 1, + "auth": { + "accounts": [], + "keys": [ + { + "pubkey": "EOS7qZ8nnmn6KBnjQL4oukyZFWCj8DmC9nJE2nkAYAZbwgKhMu8cW", + "public_key": "PUB_K1_7qZ8nnmn6KBnjQL4oukyZFWCj8DmC9nJE2nkAYAZbwgKm7MD7V", + "weight": 1 + } + ] + }, + "perm": "transfer" + }, + { + "threshold": 1, + "auth": { + "accounts": [], + "keys": [ + { + "weight": 1, + "public_key": "PUB_K1_65NrHPVXaV4voxepQREmYCmnMJm4tAWdxPaK46CbUN1rrkfmPY", + "pubkey": "EOS65NrHPVXaV4voxepQREmYCmnMJm4tAWdxPaK46CbUN1rrVmRzg" + } + ] + }, + "perm": "vote" + }, + { + "perm": "voting", + "auth": { + "accounts": [], + "keys": [ + { + "weight": 1, + "public_key": "PUB_K1_7pn6P5FftyNAKRfx9VcUzBFMvC4UitNbnoKbfxNe8SShE8XTzQ", + "pubkey": "EOS7pn6P5FftyNAKRfx9VcUzBFMvC4UitNbnoKbfxNe8SShELo2it" + } + ] + }, + "threshold": 1 + } + ], + "teamgraymass": [ + { + "auth": { + "accounts": [], + "keys": [ + { + "pubkey": "EOS6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQ9kXZK1", + "public_key": "PUB_K1_6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQBdT2GF", + "weight": 1 + } + ] + }, + "threshold": 1, + "perm": "active" + }, + { + "perm": "owner", + "auth": { + "accounts": [], + "keys": [ + { + "public_key": "PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN", + "pubkey": "EOS8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5RgwKN82", + "weight": 1 + } + ] + }, + "threshold": 1 + } + ] + }, + "chain": { + "network": "eos", + "systoken": "EOS", + "description": "EOS Mainnet", + "rex_enabled": 1, + "sync": 0, + "block_time": "2026-03-24 19:56:52", + "block_num": 490174690, + "chainid": "aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906", + "decimals": 4, + "production": 1 + } + }, + "wax": { + "accounts": {} + } + }, + "text": "{\"telos\":{\"accounts\":{\"locktimerv11\":[{\"threshold\":1,\"auth\":{\"accounts\":[],\"keys\":[{\"pubkey\":\"EOS8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5RgwKN82\",\"public_key\":\"PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN\",\"weight\":1}]},\"perm\":\"active\"},{\"perm\":\"owner\",\"threshold\":1,\"auth\":{\"accounts\":[],\"keys\":[{\"weight\":1,\"pubkey\":\"EOS8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5RgwKN82\",\"public_key\":\"PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN\"}]}}],\"teamgreymass\":[{\"threshold\":1,\"auth\":{\"keys\":[{\"weight\":1,\"pubkey\":\"EOS6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQ9kXZK1\",\"public_key\":\"PUB_K1_6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQBdT2GF\"}],\"accounts\":[]},\"perm\":\"active\"},{\"perm\":\"claim\",\"threshold\":1,\"auth\":{\"keys\":[{\"pubkey\":\"EOS6DLD9HxMcwn73U41jjdGsNe9vDFRKB26um6qTAqrtYcJFtED4C\",\"public_key\":\"PUB_K1_6DLD9HxMcwn73U41jjdGsNe9vDFRKB26um6qTAqrtYcJFFzdpw\",\"weight\":1}],\"accounts\":[]}},{\"auth\":{\"accounts\":[],\"keys\":[{\"public_key\":\"PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN\",\"pubkey\":\"EOS8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5RgwKN82\",\"weight\":1}]},\"threshold\":1,\"perm\":\"owner\"},{\"auth\":{\"keys\":[{\"weight\":1,\"pubkey\":\"EOS5JCEciUdfXnQmTyj85T98bXTAZZ1g7Nmajseu7ZWB8DrDa6Etp\",\"public_key\":\"PUB_K1_5JCEciUdfXnQmTyj85T98bXTAZZ1g7Nmajseu7ZWB8DrGVwUnM\"}],\"accounts\":[]},\"threshold\":1,\"perm\":\"producerjson\"}]},\"chain\":{\"block_num\":458754402,\"sync\":0,\"block_time\":\"2026-03-24 19:56:52\",\"rex_enabled\":1,\"description\":\"Telos Mainnet\",\"network\":\"telos\",\"systoken\":\"TLOS\",\"production\":1,\"decimals\":4,\"chainid\":\"4667b205c6838ef70ff7988f6e8257e8be0e1284a2f59699054a018f743b1d11\"}},\"eos\":{\"accounts\":{\"teamgreymass\":[{\"auth\":{\"keys\":[{\"weight\":1,\"pubkey\":\"EOS6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQ9kXZK1\",\"public_key\":\"PUB_K1_6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQBdT2GF\"}],\"accounts\":[]},\"threshold\":1,\"perm\":\"active\"},{\"threshold\":1,\"auth\":{\"accounts\":[],\"keys\":[{\"weight\":1,\"pubkey\":\"EOS6DLD9HxMcwn73U41jjdGsNe9vDFRKB26um6qTAqrtYcJFtED4C\",\"public_key\":\"PUB_K1_6DLD9HxMcwn73U41jjdGsNe9vDFRKB26um6qTAqrtYcJFFzdpw\"}]},\"perm\":\"claim\"},{\"perm\":\"decentium\",\"auth\":{\"keys\":[{\"pubkey\":\"EOS7knG7M5TUEdRv1bkVjTPddVoDQnwS7oEZXAgFk3A4hhocA3eJf\",\"public_key\":\"PUB_K1_7knG7M5TUEdRv1bkVjTPddVoDQnwS7oEZXAgFk3A4hhoXjv3GL\",\"weight\":1}],\"accounts\":[]},\"threshold\":1},{\"auth\":{\"keys\":[{\"weight\":1,\"pubkey\":\"EOS7CjC7GL71msPzAuAzd2WwiBEAzTcPL47ACrjSuiNmnnGGufYSn\",\"public_key\":\"PUB_K1_7CjC7GL71msPzAuAzd2WwiBEAzTcPL47ACrjSuiNmnnGHEHtup\"}],\"accounts\":[]},\"threshold\":1,\"perm\":\"killswitch\"},{\"perm\":\"oracle\",\"auth\":{\"accounts\":[],\"keys\":[{\"public_key\":\"PUB_K1_88VqmDmJJ9S23eNqdeWYf2zySxv3ckQrWBKy7EvVRCUuhEDJJt\",\"pubkey\":\"EOS88VqmDmJJ9S23eNqdeWYf2zySxv3ckQrWBKy7EvVRCUuhSU4f3\",\"weight\":1}]},\"threshold\":1},{\"perm\":\"owner\",\"auth\":{\"accounts\":[],\"keys\":[{\"weight\":1,\"pubkey\":\"EOS8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5RgwKN82\",\"public_key\":\"PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN\"}]},\"threshold\":1},{\"auth\":{\"keys\":[{\"public_key\":\"PUB_K1_5JCEciUdfXnQmTyj85T98bXTAZZ1g7Nmajseu7ZWB8DrGVwUnM\",\"pubkey\":\"EOS5JCEciUdfXnQmTyj85T98bXTAZZ1g7Nmajseu7ZWB8DrDa6Etp\",\"weight\":1}],\"accounts\":[]},\"threshold\":1,\"perm\":\"producerjson\"},{\"threshold\":1,\"auth\":{\"accounts\":[],\"keys\":[{\"pubkey\":\"EOS7qZ8nnmn6KBnjQL4oukyZFWCj8DmC9nJE2nkAYAZbwgKhMu8cW\",\"public_key\":\"PUB_K1_7qZ8nnmn6KBnjQL4oukyZFWCj8DmC9nJE2nkAYAZbwgKm7MD7V\",\"weight\":1}]},\"perm\":\"transfer\"},{\"threshold\":1,\"auth\":{\"accounts\":[],\"keys\":[{\"weight\":1,\"public_key\":\"PUB_K1_65NrHPVXaV4voxepQREmYCmnMJm4tAWdxPaK46CbUN1rrkfmPY\",\"pubkey\":\"EOS65NrHPVXaV4voxepQREmYCmnMJm4tAWdxPaK46CbUN1rrVmRzg\"}]},\"perm\":\"vote\"},{\"perm\":\"voting\",\"auth\":{\"accounts\":[],\"keys\":[{\"weight\":1,\"public_key\":\"PUB_K1_7pn6P5FftyNAKRfx9VcUzBFMvC4UitNbnoKbfxNe8SShE8XTzQ\",\"pubkey\":\"EOS7pn6P5FftyNAKRfx9VcUzBFMvC4UitNbnoKbfxNe8SShELo2it\"}]},\"threshold\":1}],\"teamgraymass\":[{\"auth\":{\"accounts\":[],\"keys\":[{\"pubkey\":\"EOS6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQ9kXZK1\",\"public_key\":\"PUB_K1_6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQBdT2GF\",\"weight\":1}]},\"threshold\":1,\"perm\":\"active\"},{\"perm\":\"owner\",\"auth\":{\"accounts\":[],\"keys\":[{\"public_key\":\"PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN\",\"pubkey\":\"EOS8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5RgwKN82\",\"weight\":1}]},\"threshold\":1}]},\"chain\":{\"network\":\"eos\",\"systoken\":\"EOS\",\"description\":\"EOS Mainnet\",\"rex_enabled\":1,\"sync\":0,\"block_time\":\"2026-03-24 19:56:52\",\"block_num\":490174690,\"chainid\":\"aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906\",\"decimals\":4,\"production\":1}},\"wax\":{\"accounts\":{}}}" +} \ No newline at end of file diff --git a/packages/light-api/test/data/40f27138e2999199dbae79e68222c2eac162a9e8.json b/packages/light-api/test/data/40f27138e2999199dbae79e68222c2eac162a9e8.json new file mode 100644 index 00000000..dde454c1 --- /dev/null +++ b/packages/light-api/test/data/40f27138e2999199dbae79e68222c2eac162a9e8.json @@ -0,0 +1,532 @@ +{ + "request": { + "path": "https://eos.light-api.net/api/account/eos/teamgreymass", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "json": { + "delegated_from": [ + { + "cpu_weight": 0, + "del_from": "eos42freedom", + "net_weight": 1 + }, + { + "cpu_weight": 0, + "del_from": "teamgreymass", + "net_weight": 1 + } + ], + "balances": [ + { + "currency": "BKT", + "amount": "45245.6267", + "decimals": "4", + "contract": "betkingtoken" + }, + { + "decimals": "4", + "contract": "bgbgbgbgbgbg", + "amount": "0.1000", + "currency": "BG" + }, + { + "amount": "1000.0000", + "contract": "bingobetoken", + "decimals": "4", + "currency": "BINGO" + }, + { + "currency": "BITI", + "amount": "103.9999", + "decimals": "4", + "contract": "biteyebiteye" + }, + { + "currency": "BBT", + "decimals": "4", + "contract": "blockbasetkn", + "amount": "0.0012" + }, + { + "currency": "ADE", + "contract": "buildertoken", + "decimals": "4", + "amount": "32351.8580" + }, + { + "amount": "32358.858000", + "decimals": "6", + "contract": "cadeositoken", + "currency": "ADE" + }, + { + "currency": "OBTC", + "amount": "0.00000100", + "contract": "core.ogx", + "decimals": "8" + }, + { + "amount": "15004.7481", + "contract": "core.vaulta", + "decimals": "4", + "currency": "A" + }, + { + "amount": "18.0000", + "contract": "dhbonetokens", + "decimals": "4", + "currency": "DHB" + }, + { + "currency": "EAPP", + "amount": "2.0000", + "decimals": "4", + "contract": "eappeappp.tp" + }, + { + "currency": "EMOON", + "amount": "1000010000.00", + "contract": "emoonnetwork", + "decimals": "2" + }, + { + "currency": "BT", + "amount": "0.0080", + "contract": "eosbtextoken", + "decimals": "4" + }, + { + "currency": "CCC", + "amount": "202.0000", + "contract": "eoscccdotcom", + "decimals": "4" + }, + { + "currency": "EOS", + "amount": "5292.4309", + "decimals": "4", + "contract": "eosio.token" + }, + { + "currency": "POW", + "contract": "eosiopowcoin", + "decimals": "8", + "amount": "3.26194299" + }, + { + "currency": "ERCT", + "decimals": "4", + "contract": "eostory12345", + "amount": "100.0000" + }, + { + "amount": "0.0001", + "decimals": "4", + "contract": "epraofficial", + "currency": "EPRA" + }, + { + "currency": "EETH", + "amount": "5000.0000", + "decimals": "4", + "contract": "ethsidechain" + }, + { + "amount": "0.001", + "decimals": "3", + "contract": "everipediaiq", + "currency": "IQ" + }, + { + "currency": "LORD", + "contract": "gamelordcoin", + "decimals": "4", + "amount": "1.0000" + }, + { + "amount": "0.1914", + "decimals": "4", + "contract": "hashbabycoin", + "currency": "HBGO" + }, + { + "currency": "HVT", + "amount": "19908.0137", + "decimals": "4", + "contract": "hirevibeshvt" + }, + { + "currency": "MVC", + "amount": "0.0001", + "decimals": "4", + "contract": "mvcoin.x" + }, + { + "decimals": "8", + "contract": "okkkkkkkkkkk", + "amount": "2.00000000", + "currency": "CZB" + }, + { + "contract": "okkkkkkkkkkk", + "decimals": "6", + "amount": "53.660000", + "currency": "LED" + }, + { + "amount": "280000.0000", + "contract": "onessusblock", + "decimals": "4", + "currency": "VOID" + }, + { + "decimals": "4", + "contract": "oo1122334455", + "amount": "2000.0000", + "currency": "IPOS" + }, + { + "currency": "BRM", + "amount": "479.605", + "decimals": "3", + "contract": "openbrmeos11" + }, + { + "currency": "PIZZA", + "amount": "47.4718", + "contract": "pizzatotoken", + "decimals": "4" + }, + { + "currency": "PLAY", + "amount": "100.0000", + "contract": "play.pomelo", + "decimals": "4" + }, + { + "amount": "11438.5283", + "decimals": "4", + "contract": "playeronetkn", + "currency": "PLO" + }, + { + "decimals": "4", + "contract": "pumlhealthio", + "amount": "12.7777", + "currency": "PUML" + }, + { + "currency": "RWC", + "amount": "5.0000", + "decimals": "4", + "contract": "realworldcpn" + }, + { + "amount": "1.0000", + "contract": "stipsoculus1", + "decimals": "4", + "currency": "STIPS" + }, + { + "currency": "TOOK", + "amount": "47988.8846", + "decimals": "4", + "contract": "taketooktook" + }, + { + "amount": "0.0000", + "decimals": "4", + "contract": "tethertether", + "currency": "USDT" + }, + { + "currency": "EFOR", + "contract": "theforcegrou", + "decimals": "4", + "amount": "100.0000" + }, + { + "decimals": "4", + "contract": "thepeostoken", + "amount": "14380.2999", + "currency": "PEOS" + }, + { + "currency": "ZEOS", + "amount": "68450.2273", + "contract": "thezeostoken", + "decimals": "4" + }, + { + "amount": "1", + "contract": "token.rms", + "decimals": "0", + "currency": "V" + }, + { + "currency": "LIBRA", + "contract": "usdcoinchain", + "decimals": "4", + "amount": "16100.0000" + }, + { + "currency": "VIG", + "amount": "375000.0000", + "contract": "vig111111111", + "decimals": "4" + }, + { + "decimals": "0", + "contract": "visionfintec", + "amount": "1", + "currency": "RED" + }, + { + "amount": "914665.7776", + "decimals": "4", + "contract": "zerotoone.en", + "currency": "CDOG" + } + ], + "linkauth": [ + { + "type": "claimrewards", + "requirement": "claim", + "code": "core.vaulta" + }, + { + "code": "core.vaulta", + "type": "transfer", + "requirement": "transfer" + }, + { + "code": "decentiumorg", + "requirement": "decentium", + "type": "" + }, + { + "requirement": "oracle", + "type": "write", + "code": "delphioracle" + }, + { + "type": "claimrewards", + "requirement": "claim", + "code": "eosio" + }, + { + "code": "eosio", + "requirement": "killswitch", + "type": "unregprod" + }, + { + "requirement": "vote", + "type": "voteproducer", + "code": "eosio" + }, + { + "type": "claimrewards", + "requirement": "claim", + "code": "eosio.bpay" + }, + { + "requirement": "voting", + "type": "unvote", + "code": "eosio.forum" + }, + { + "type": "vote", + "requirement": "voting", + "code": "eosio.forum" + }, + { + "code": "eosio.token", + "requirement": "transfer", + "type": "transfer" + }, + { + "type": "set", + "requirement": "producerjson", + "code": "producerjson" + } + ], + "permissions": [ + { + "auth": { + "keys": [ + { + "pubkey": "EOS6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQ9kXZK1", + "public_key": "PUB_K1_6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQBdT2GF", + "weight": 1 + } + ], + "accounts": [] + }, + "threshold": 1, + "perm": "active" + }, + { + "auth": { + "accounts": [], + "keys": [ + { + "public_key": "PUB_K1_6DLD9HxMcwn73U41jjdGsNe9vDFRKB26um6qTAqrtYcJFFzdpw", + "pubkey": "EOS6DLD9HxMcwn73U41jjdGsNe9vDFRKB26um6qTAqrtYcJFtED4C", + "weight": 1 + } + ] + }, + "threshold": 1, + "perm": "claim" + }, + { + "perm": "decentium", + "threshold": 1, + "auth": { + "keys": [ + { + "public_key": "PUB_K1_7knG7M5TUEdRv1bkVjTPddVoDQnwS7oEZXAgFk3A4hhoXjv3GL", + "pubkey": "EOS7knG7M5TUEdRv1bkVjTPddVoDQnwS7oEZXAgFk3A4hhocA3eJf", + "weight": 1 + } + ], + "accounts": [] + } + }, + { + "perm": "killswitch", + "auth": { + "accounts": [], + "keys": [ + { + "weight": 1, + "pubkey": "EOS7CjC7GL71msPzAuAzd2WwiBEAzTcPL47ACrjSuiNmnnGGufYSn", + "public_key": "PUB_K1_7CjC7GL71msPzAuAzd2WwiBEAzTcPL47ACrjSuiNmnnGHEHtup" + } + ] + }, + "threshold": 1 + }, + { + "perm": "oracle", + "auth": { + "keys": [ + { + "weight": 1, + "public_key": "PUB_K1_88VqmDmJJ9S23eNqdeWYf2zySxv3ckQrWBKy7EvVRCUuhEDJJt", + "pubkey": "EOS88VqmDmJJ9S23eNqdeWYf2zySxv3ckQrWBKy7EvVRCUuhSU4f3" + } + ], + "accounts": [] + }, + "threshold": 1 + }, + { + "auth": { + "keys": [ + { + "weight": 1, + "pubkey": "EOS8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5RgwKN82", + "public_key": "PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN" + } + ], + "accounts": [] + }, + "threshold": 1, + "perm": "owner" + }, + { + "auth": { + "accounts": [], + "keys": [ + { + "weight": 1, + "public_key": "PUB_K1_5JCEciUdfXnQmTyj85T98bXTAZZ1g7Nmajseu7ZWB8DrGVwUnM", + "pubkey": "EOS5JCEciUdfXnQmTyj85T98bXTAZZ1g7Nmajseu7ZWB8DrDa6Etp" + } + ] + }, + "threshold": 1, + "perm": "producerjson" + }, + { + "perm": "transfer", + "auth": { + "accounts": [], + "keys": [ + { + "weight": 1, + "public_key": "PUB_K1_7qZ8nnmn6KBnjQL4oukyZFWCj8DmC9nJE2nkAYAZbwgKm7MD7V", + "pubkey": "EOS7qZ8nnmn6KBnjQL4oukyZFWCj8DmC9nJE2nkAYAZbwgKhMu8cW" + } + ] + }, + "threshold": 1 + }, + { + "threshold": 1, + "auth": { + "keys": [ + { + "weight": 1, + "public_key": "PUB_K1_65NrHPVXaV4voxepQREmYCmnMJm4tAWdxPaK46CbUN1rrkfmPY", + "pubkey": "EOS65NrHPVXaV4voxepQREmYCmnMJm4tAWdxPaK46CbUN1rrVmRzg" + } + ], + "accounts": [] + }, + "perm": "vote" + }, + { + "perm": "voting", + "auth": { + "accounts": [], + "keys": [ + { + "public_key": "PUB_K1_7pn6P5FftyNAKRfx9VcUzBFMvC4UitNbnoKbfxNe8SShE8XTzQ", + "pubkey": "EOS7pn6P5FftyNAKRfx9VcUzBFMvC4UitNbnoKbfxNe8SShELo2it", + "weight": 1 + } + ] + }, + "threshold": 1 + } + ], + "account_name": "teamgreymass", + "delegated_to": [ + { + "net_weight": 1, + "account_name": "teamgreymass", + "cpu_weight": 0 + } + ], + "rex": { + "fund": "0.0000 EOS", + "matured": "0.0000 EOS", + "savings": "0.0000 EOS", + "maturing": "0.0000 EOS" + }, + "chain": { + "chainid": "aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906", + "decimals": 4, + "production": 1, + "description": "EOS Mainnet", + "systoken": "EOS", + "network": "eos", + "rex_enabled": 1, + "block_time": "2026-03-24 19:56:46", + "sync": -1, + "block_num": 490174677 + }, + "resources": { + "net_weight": 2, + "ram_bytes": 818870, + "cpu_weight": 0 + } + }, + "text": "{\"delegated_from\":[{\"cpu_weight\":0,\"del_from\":\"eos42freedom\",\"net_weight\":1},{\"cpu_weight\":0,\"del_from\":\"teamgreymass\",\"net_weight\":1}],\"balances\":[{\"currency\":\"BKT\",\"amount\":\"45245.6267\",\"decimals\":\"4\",\"contract\":\"betkingtoken\"},{\"decimals\":\"4\",\"contract\":\"bgbgbgbgbgbg\",\"amount\":\"0.1000\",\"currency\":\"BG\"},{\"amount\":\"1000.0000\",\"contract\":\"bingobetoken\",\"decimals\":\"4\",\"currency\":\"BINGO\"},{\"currency\":\"BITI\",\"amount\":\"103.9999\",\"decimals\":\"4\",\"contract\":\"biteyebiteye\"},{\"currency\":\"BBT\",\"decimals\":\"4\",\"contract\":\"blockbasetkn\",\"amount\":\"0.0012\"},{\"currency\":\"ADE\",\"contract\":\"buildertoken\",\"decimals\":\"4\",\"amount\":\"32351.8580\"},{\"amount\":\"32358.858000\",\"decimals\":\"6\",\"contract\":\"cadeositoken\",\"currency\":\"ADE\"},{\"currency\":\"OBTC\",\"amount\":\"0.00000100\",\"contract\":\"core.ogx\",\"decimals\":\"8\"},{\"amount\":\"15004.7481\",\"contract\":\"core.vaulta\",\"decimals\":\"4\",\"currency\":\"A\"},{\"amount\":\"18.0000\",\"contract\":\"dhbonetokens\",\"decimals\":\"4\",\"currency\":\"DHB\"},{\"currency\":\"EAPP\",\"amount\":\"2.0000\",\"decimals\":\"4\",\"contract\":\"eappeappp.tp\"},{\"currency\":\"EMOON\",\"amount\":\"1000010000.00\",\"contract\":\"emoonnetwork\",\"decimals\":\"2\"},{\"currency\":\"BT\",\"amount\":\"0.0080\",\"contract\":\"eosbtextoken\",\"decimals\":\"4\"},{\"currency\":\"CCC\",\"amount\":\"202.0000\",\"contract\":\"eoscccdotcom\",\"decimals\":\"4\"},{\"currency\":\"EOS\",\"amount\":\"5292.4309\",\"decimals\":\"4\",\"contract\":\"eosio.token\"},{\"currency\":\"POW\",\"contract\":\"eosiopowcoin\",\"decimals\":\"8\",\"amount\":\"3.26194299\"},{\"currency\":\"ERCT\",\"decimals\":\"4\",\"contract\":\"eostory12345\",\"amount\":\"100.0000\"},{\"amount\":\"0.0001\",\"decimals\":\"4\",\"contract\":\"epraofficial\",\"currency\":\"EPRA\"},{\"currency\":\"EETH\",\"amount\":\"5000.0000\",\"decimals\":\"4\",\"contract\":\"ethsidechain\"},{\"amount\":\"0.001\",\"decimals\":\"3\",\"contract\":\"everipediaiq\",\"currency\":\"IQ\"},{\"currency\":\"LORD\",\"contract\":\"gamelordcoin\",\"decimals\":\"4\",\"amount\":\"1.0000\"},{\"amount\":\"0.1914\",\"decimals\":\"4\",\"contract\":\"hashbabycoin\",\"currency\":\"HBGO\"},{\"currency\":\"HVT\",\"amount\":\"19908.0137\",\"decimals\":\"4\",\"contract\":\"hirevibeshvt\"},{\"currency\":\"MVC\",\"amount\":\"0.0001\",\"decimals\":\"4\",\"contract\":\"mvcoin.x\"},{\"decimals\":\"8\",\"contract\":\"okkkkkkkkkkk\",\"amount\":\"2.00000000\",\"currency\":\"CZB\"},{\"contract\":\"okkkkkkkkkkk\",\"decimals\":\"6\",\"amount\":\"53.660000\",\"currency\":\"LED\"},{\"amount\":\"280000.0000\",\"contract\":\"onessusblock\",\"decimals\":\"4\",\"currency\":\"VOID\"},{\"decimals\":\"4\",\"contract\":\"oo1122334455\",\"amount\":\"2000.0000\",\"currency\":\"IPOS\"},{\"currency\":\"BRM\",\"amount\":\"479.605\",\"decimals\":\"3\",\"contract\":\"openbrmeos11\"},{\"currency\":\"PIZZA\",\"amount\":\"47.4718\",\"contract\":\"pizzatotoken\",\"decimals\":\"4\"},{\"currency\":\"PLAY\",\"amount\":\"100.0000\",\"contract\":\"play.pomelo\",\"decimals\":\"4\"},{\"amount\":\"11438.5283\",\"decimals\":\"4\",\"contract\":\"playeronetkn\",\"currency\":\"PLO\"},{\"decimals\":\"4\",\"contract\":\"pumlhealthio\",\"amount\":\"12.7777\",\"currency\":\"PUML\"},{\"currency\":\"RWC\",\"amount\":\"5.0000\",\"decimals\":\"4\",\"contract\":\"realworldcpn\"},{\"amount\":\"1.0000\",\"contract\":\"stipsoculus1\",\"decimals\":\"4\",\"currency\":\"STIPS\"},{\"currency\":\"TOOK\",\"amount\":\"47988.8846\",\"decimals\":\"4\",\"contract\":\"taketooktook\"},{\"amount\":\"0.0000\",\"decimals\":\"4\",\"contract\":\"tethertether\",\"currency\":\"USDT\"},{\"currency\":\"EFOR\",\"contract\":\"theforcegrou\",\"decimals\":\"4\",\"amount\":\"100.0000\"},{\"decimals\":\"4\",\"contract\":\"thepeostoken\",\"amount\":\"14380.2999\",\"currency\":\"PEOS\"},{\"currency\":\"ZEOS\",\"amount\":\"68450.2273\",\"contract\":\"thezeostoken\",\"decimals\":\"4\"},{\"amount\":\"1\",\"contract\":\"token.rms\",\"decimals\":\"0\",\"currency\":\"V\"},{\"currency\":\"LIBRA\",\"contract\":\"usdcoinchain\",\"decimals\":\"4\",\"amount\":\"16100.0000\"},{\"currency\":\"VIG\",\"amount\":\"375000.0000\",\"contract\":\"vig111111111\",\"decimals\":\"4\"},{\"decimals\":\"0\",\"contract\":\"visionfintec\",\"amount\":\"1\",\"currency\":\"RED\"},{\"amount\":\"914665.7776\",\"decimals\":\"4\",\"contract\":\"zerotoone.en\",\"currency\":\"CDOG\"}],\"linkauth\":[{\"type\":\"claimrewards\",\"requirement\":\"claim\",\"code\":\"core.vaulta\"},{\"code\":\"core.vaulta\",\"type\":\"transfer\",\"requirement\":\"transfer\"},{\"code\":\"decentiumorg\",\"requirement\":\"decentium\",\"type\":\"\"},{\"requirement\":\"oracle\",\"type\":\"write\",\"code\":\"delphioracle\"},{\"type\":\"claimrewards\",\"requirement\":\"claim\",\"code\":\"eosio\"},{\"code\":\"eosio\",\"requirement\":\"killswitch\",\"type\":\"unregprod\"},{\"requirement\":\"vote\",\"type\":\"voteproducer\",\"code\":\"eosio\"},{\"type\":\"claimrewards\",\"requirement\":\"claim\",\"code\":\"eosio.bpay\"},{\"requirement\":\"voting\",\"type\":\"unvote\",\"code\":\"eosio.forum\"},{\"type\":\"vote\",\"requirement\":\"voting\",\"code\":\"eosio.forum\"},{\"code\":\"eosio.token\",\"requirement\":\"transfer\",\"type\":\"transfer\"},{\"type\":\"set\",\"requirement\":\"producerjson\",\"code\":\"producerjson\"}],\"permissions\":[{\"auth\":{\"keys\":[{\"pubkey\":\"EOS6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQ9kXZK1\",\"public_key\":\"PUB_K1_6gqJ7sdPgjHLFLtks9cRPs5qYHa9U3CwK4P2JasTLWKQBdT2GF\",\"weight\":1}],\"accounts\":[]},\"threshold\":1,\"perm\":\"active\"},{\"auth\":{\"accounts\":[],\"keys\":[{\"public_key\":\"PUB_K1_6DLD9HxMcwn73U41jjdGsNe9vDFRKB26um6qTAqrtYcJFFzdpw\",\"pubkey\":\"EOS6DLD9HxMcwn73U41jjdGsNe9vDFRKB26um6qTAqrtYcJFtED4C\",\"weight\":1}]},\"threshold\":1,\"perm\":\"claim\"},{\"perm\":\"decentium\",\"threshold\":1,\"auth\":{\"keys\":[{\"public_key\":\"PUB_K1_7knG7M5TUEdRv1bkVjTPddVoDQnwS7oEZXAgFk3A4hhoXjv3GL\",\"pubkey\":\"EOS7knG7M5TUEdRv1bkVjTPddVoDQnwS7oEZXAgFk3A4hhocA3eJf\",\"weight\":1}],\"accounts\":[]}},{\"perm\":\"killswitch\",\"auth\":{\"accounts\":[],\"keys\":[{\"weight\":1,\"pubkey\":\"EOS7CjC7GL71msPzAuAzd2WwiBEAzTcPL47ACrjSuiNmnnGGufYSn\",\"public_key\":\"PUB_K1_7CjC7GL71msPzAuAzd2WwiBEAzTcPL47ACrjSuiNmnnGHEHtup\"}]},\"threshold\":1},{\"perm\":\"oracle\",\"auth\":{\"keys\":[{\"weight\":1,\"public_key\":\"PUB_K1_88VqmDmJJ9S23eNqdeWYf2zySxv3ckQrWBKy7EvVRCUuhEDJJt\",\"pubkey\":\"EOS88VqmDmJJ9S23eNqdeWYf2zySxv3ckQrWBKy7EvVRCUuhSU4f3\"}],\"accounts\":[]},\"threshold\":1},{\"auth\":{\"keys\":[{\"weight\":1,\"pubkey\":\"EOS8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5RgwKN82\",\"public_key\":\"PUB_K1_8QzGtCea2thiqcTVeXGdyRZpdKYptQznbcWSMj73FD5Rgra4mN\"}],\"accounts\":[]},\"threshold\":1,\"perm\":\"owner\"},{\"auth\":{\"accounts\":[],\"keys\":[{\"weight\":1,\"public_key\":\"PUB_K1_5JCEciUdfXnQmTyj85T98bXTAZZ1g7Nmajseu7ZWB8DrGVwUnM\",\"pubkey\":\"EOS5JCEciUdfXnQmTyj85T98bXTAZZ1g7Nmajseu7ZWB8DrDa6Etp\"}]},\"threshold\":1,\"perm\":\"producerjson\"},{\"perm\":\"transfer\",\"auth\":{\"accounts\":[],\"keys\":[{\"weight\":1,\"public_key\":\"PUB_K1_7qZ8nnmn6KBnjQL4oukyZFWCj8DmC9nJE2nkAYAZbwgKm7MD7V\",\"pubkey\":\"EOS7qZ8nnmn6KBnjQL4oukyZFWCj8DmC9nJE2nkAYAZbwgKhMu8cW\"}]},\"threshold\":1},{\"threshold\":1,\"auth\":{\"keys\":[{\"weight\":1,\"public_key\":\"PUB_K1_65NrHPVXaV4voxepQREmYCmnMJm4tAWdxPaK46CbUN1rrkfmPY\",\"pubkey\":\"EOS65NrHPVXaV4voxepQREmYCmnMJm4tAWdxPaK46CbUN1rrVmRzg\"}],\"accounts\":[]},\"perm\":\"vote\"},{\"perm\":\"voting\",\"auth\":{\"accounts\":[],\"keys\":[{\"public_key\":\"PUB_K1_7pn6P5FftyNAKRfx9VcUzBFMvC4UitNbnoKbfxNe8SShE8XTzQ\",\"pubkey\":\"EOS7pn6P5FftyNAKRfx9VcUzBFMvC4UitNbnoKbfxNe8SShELo2it\",\"weight\":1}]},\"threshold\":1}],\"account_name\":\"teamgreymass\",\"delegated_to\":[{\"net_weight\":1,\"account_name\":\"teamgreymass\",\"cpu_weight\":0}],\"rex\":{\"fund\":\"0.0000 EOS\",\"matured\":\"0.0000 EOS\",\"savings\":\"0.0000 EOS\",\"maturing\":\"0.0000 EOS\"},\"chain\":{\"chainid\":\"aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906\",\"decimals\":4,\"production\":1,\"description\":\"EOS Mainnet\",\"systoken\":\"EOS\",\"network\":\"eos\",\"rex_enabled\":1,\"block_time\":\"2026-03-24 19:56:46\",\"sync\":-1,\"block_num\":490174677},\"resources\":{\"net_weight\":2,\"ram_bytes\":818870,\"cpu_weight\":0}}" +} \ No newline at end of file diff --git a/packages/light-api/test/data/5529e20488f6064fd59e355db1f640baa491b34e.json b/packages/light-api/test/data/5529e20488f6064fd59e355db1f640baa491b34e.json new file mode 100644 index 00000000..17993445 --- /dev/null +++ b/packages/light-api/test/data/5529e20488f6064fd59e355db1f640baa491b34e.json @@ -0,0 +1,32 @@ +{ + "request": { + "path": "https://eos.light-api.net/api/rexbalance/eos/teamgreymass", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "json": { + "account_name": "teamgreymass", + "chain": { + "chainid": "aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906", + "production": 1, + "decimals": 4, + "block_num": 490174681, + "description": "EOS Mainnet", + "network": "eos", + "systoken": "EOS", + "rex_enabled": 1, + "block_time": "2026-03-24 19:56:48", + "sync": 0 + }, + "rex": { + "maturing": "0.0000 EOS", + "matured": "0.0000 EOS", + "savings": "0.0000 EOS", + "fund": "0.0000 EOS" + } + }, + "text": "{\"account_name\":\"teamgreymass\",\"chain\":{\"chainid\":\"aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906\",\"production\":1,\"decimals\":4,\"block_num\":490174681,\"description\":\"EOS Mainnet\",\"network\":\"eos\",\"systoken\":\"EOS\",\"rex_enabled\":1,\"block_time\":\"2026-03-24 19:56:48\",\"sync\":0},\"rex\":{\"maturing\":\"0.0000 EOS\",\"matured\":\"0.0000 EOS\",\"savings\":\"0.0000 EOS\",\"fund\":\"0.0000 EOS\"}}" +} \ No newline at end of file diff --git a/packages/light-api/test/data/6785bb48e9f50a77651818282bbc44930b7cf26a.json b/packages/light-api/test/data/6785bb48e9f50a77651818282bbc44930b7cf26a.json new file mode 100644 index 00000000..1746665d --- /dev/null +++ b/packages/light-api/test/data/6785bb48e9f50a77651818282bbc44930b7cf26a.json @@ -0,0 +1,33 @@ +{ + "request": { + "path": "https://eos.light-api.net/api/codehash/0a16e1dac533c4558698c8754f41219839ba2a2b75e517e65ea2537f76681f49", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "json": { + "eos": { + "accounts": { + "eosio.token": { + "account_name": "eosio.token", + "code_hash": "0a16e1dac533c4558698c8754f41219839ba2a2b75e517e65ea2537f76681f49" + } + }, + "chain": { + "chainid": "aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906", + "production": 1, + "decimals": 4, + "block_num": 490174690, + "block_time": "2026-03-24 19:56:52", + "sync": 0, + "systoken": "EOS", + "description": "EOS Mainnet", + "rex_enabled": 1, + "network": "eos" + } + } + }, + "text": "{\"eos\":{\"accounts\":{\"eosio.token\":{\"account_name\":\"eosio.token\",\"code_hash\":\"0a16e1dac533c4558698c8754f41219839ba2a2b75e517e65ea2537f76681f49\"}},\"chain\":{\"chainid\":\"aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906\",\"production\":1,\"decimals\":4,\"block_num\":490174690,\"block_time\":\"2026-03-24 19:56:52\",\"sync\":0,\"systoken\":\"EOS\",\"description\":\"EOS Mainnet\",\"rex_enabled\":1,\"network\":\"eos\"}}}" +} \ No newline at end of file diff --git a/packages/light-api/test/data/6c221bb81dca5afcffe02c519146744e0a739a55.json b/packages/light-api/test/data/6c221bb81dca5afcffe02c519146744e0a739a55.json new file mode 100644 index 00000000..d80f2a37 --- /dev/null +++ b/packages/light-api/test/data/6c221bb81dca5afcffe02c519146744e0a739a55.json @@ -0,0 +1,53 @@ +{ + "request": { + "path": "https://eos.light-api.net/api/topholders/eos/eosio.token/EOS/10", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "json": [ + [ + "core.vaulta", + "1035816036.0540" + ], + [ + "eosio", + "469320647.0673" + ], + [ + "eosio.rex", + "273740418.5797" + ], + [ + "eosio.stake", + "109961016.8048" + ], + [ + "aslkggpoerss", + "29705844.7001" + ], + [ + "kjhbgvcfghfd", + "27249789.7943" + ], + [ + "eosio.ram", + "23933530.1365" + ], + [ + "vcxydi5dfufx", + "15874425.2354" + ], + [ + "ixhu2a4twcnu", + "11526480.4604" + ], + [ + "csg2ys5bznni", + "11059379.9642" + ] + ], + "text": "[[\"core.vaulta\",\"1035816036.0540\"],[\"eosio\",\"469320647.0673\"],[\"eosio.rex\",\"273740418.5797\"],[\"eosio.stake\",\"109961016.8048\"],[\"aslkggpoerss\",\"29705844.7001\"],[\"kjhbgvcfghfd\",\"27249789.7943\"],[\"eosio.ram\",\"23933530.1365\"],[\"vcxydi5dfufx\",\"15874425.2354\"],[\"ixhu2a4twcnu\",\"11526480.4604\"],[\"csg2ys5bznni\",\"11059379.9642\"]]" +} \ No newline at end of file diff --git a/packages/light-api/test/data/8aaccf7201f03407312a7ef95d40fe838c235c74.json b/packages/light-api/test/data/8aaccf7201f03407312a7ef95d40fe838c235c74.json new file mode 100644 index 00000000..db7e183d --- /dev/null +++ b/packages/light-api/test/data/8aaccf7201f03407312a7ef95d40fe838c235c74.json @@ -0,0 +1,12 @@ +{ + "request": { + "path": "https://eos.light-api.net/api/usercount/eos", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "json": 6404414, + "text": "6404414" +} \ No newline at end of file diff --git a/packages/light-api/test/data/abd4daa214c5daf5b52e7935e6fdc1b809087b37.json b/packages/light-api/test/data/abd4daa214c5daf5b52e7935e6fdc1b809087b37.json new file mode 100644 index 00000000..63e8deea --- /dev/null +++ b/packages/light-api/test/data/abd4daa214c5daf5b52e7935e6fdc1b809087b37.json @@ -0,0 +1,68 @@ +{ + "request": { + "path": "https://eos.light-api.net/api/networks", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "json": [ + { + "network": "eos", + "description": "EOS Mainnet", + "systoken": "EOS", + "sync": 0, + "block_time": "2026-03-24 19:56:45", + "block_num": 490174676, + "decimals": 4, + "production": 1, + "chainid": "aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906" + }, + { + "production": 1, + "decimals": 4, + "chainid": "38b1d7815474d0c60683ecbea321d723e83f5da6ae5f1c1f9fecc69d9ba96465", + "block_num": 234577035, + "block_time": "2026-03-24 19:56:46", + "sync": -1, + "systoken": "LIBRE", + "description": "Libre", + "network": "libre" + }, + { + "block_time": "2026-03-24 19:56:46", + "sync": -1, + "description": "Proton", + "systoken": "SYS", + "network": "proton", + "block_num": 373393006, + "decimals": 4, + "production": 1, + "chainid": "384da888112027f0321850a169f737c33e53b388aad48b5adace4bab97f437e0" + }, + { + "production": 1, + "decimals": 4, + "chainid": "4667b205c6838ef70ff7988f6e8257e8be0e1284a2f59699054a018f743b1d11", + "block_num": 458754388, + "network": "telos", + "description": "Telos Mainnet", + "systoken": "TLOS", + "block_time": "2026-03-24 19:56:45", + "sync": 0 + }, + { + "block_num": 425800206, + "description": "WAX", + "systoken": "WAX", + "network": "wax", + "block_time": "2026-03-24 19:56:46", + "sync": -1, + "production": 1, + "decimals": 8, + "chainid": "1064487b3cd1a897ce03ae5b6a865651747e2e152090f99c1d19d44e01aea5a4" + } + ], + "text": "[{\"network\":\"eos\",\"description\":\"EOS Mainnet\",\"systoken\":\"EOS\",\"sync\":0,\"block_time\":\"2026-03-24 19:56:45\",\"block_num\":490174676,\"decimals\":4,\"production\":1,\"chainid\":\"aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906\"},{\"production\":1,\"decimals\":4,\"chainid\":\"38b1d7815474d0c60683ecbea321d723e83f5da6ae5f1c1f9fecc69d9ba96465\",\"block_num\":234577035,\"block_time\":\"2026-03-24 19:56:46\",\"sync\":-1,\"systoken\":\"LIBRE\",\"description\":\"Libre\",\"network\":\"libre\"},{\"block_time\":\"2026-03-24 19:56:46\",\"sync\":-1,\"description\":\"Proton\",\"systoken\":\"SYS\",\"network\":\"proton\",\"block_num\":373393006,\"decimals\":4,\"production\":1,\"chainid\":\"384da888112027f0321850a169f737c33e53b388aad48b5adace4bab97f437e0\"},{\"production\":1,\"decimals\":4,\"chainid\":\"4667b205c6838ef70ff7988f6e8257e8be0e1284a2f59699054a018f743b1d11\",\"block_num\":458754388,\"network\":\"telos\",\"description\":\"Telos Mainnet\",\"systoken\":\"TLOS\",\"block_time\":\"2026-03-24 19:56:45\",\"sync\":0},{\"block_num\":425800206,\"description\":\"WAX\",\"systoken\":\"WAX\",\"network\":\"wax\",\"block_time\":\"2026-03-24 19:56:46\",\"sync\":-1,\"production\":1,\"decimals\":8,\"chainid\":\"1064487b3cd1a897ce03ae5b6a865651747e2e152090f99c1d19d44e01aea5a4\"}]" +} \ No newline at end of file diff --git a/packages/light-api/test/data/dcbc5198194b7a845ea8ab791294b081b4a93b10.json b/packages/light-api/test/data/dcbc5198194b7a845ea8ab791294b081b4a93b10.json new file mode 100644 index 00000000..8555a7ec --- /dev/null +++ b/packages/light-api/test/data/dcbc5198194b7a845ea8ab791294b081b4a93b10.json @@ -0,0 +1,53 @@ +{ + "request": { + "path": "https://eos.light-api.net/api/topram/eos/10", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "json": [ + [ + "utxomng.xsat", + 132071612727 + ], + [ + "bank.rms", + 68719482353 + ], + [ + "fund.wram", + 45181398797 + ], + [ + "eosiseosbest", + 8724350455 + ], + [ + "eosholdereos", + 4626710307 + ], + [ + "eosio.evm", + 3382328498 + ], + [ + "honeybull.gm", + 2827247853 + ], + [ + "admin.grants", + 2812889744 + ], + [ + "he1lexwltone", + 2034954695 + ], + [ + "bitbnsglobal", + 1799117676 + ] + ], + "text": "[[\"utxomng.xsat\",132071612727],[\"bank.rms\",68719482353],[\"fund.wram\",45181398797],[\"eosiseosbest\",8724350455],[\"eosholdereos\",4626710307],[\"eosio.evm\",3382328498],[\"honeybull.gm\",2827247853],[\"admin.grants\",2812889744],[\"he1lexwltone\",2034954695],[\"bitbnsglobal\",1799117676]]" +} \ No newline at end of file diff --git a/packages/light-api/test/data/dea05f9de102415a27ac61c316fee37de0c03535.json b/packages/light-api/test/data/dea05f9de102415a27ac61c316fee37de0c03535.json new file mode 100644 index 00000000..b5cadea7 --- /dev/null +++ b/packages/light-api/test/data/dea05f9de102415a27ac61c316fee37de0c03535.json @@ -0,0 +1,12 @@ +{ + "request": { + "path": "https://eos.light-api.net/api/tokenbalance/eos/teamgreymass/eosio.token/EOS", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "json": 5292.4309, + "text": "5292.4309" +} \ No newline at end of file diff --git a/packages/light-api/test/data/e2123eace094f9c3dd9713915c5d4550e361cc72.json b/packages/light-api/test/data/e2123eace094f9c3dd9713915c5d4550e361cc72.json new file mode 100644 index 00000000..9061121a --- /dev/null +++ b/packages/light-api/test/data/e2123eace094f9c3dd9713915c5d4550e361cc72.json @@ -0,0 +1,38 @@ +{ + "request": { + "path": "https://eos.light-api.net/api/rexraw/eos/teamgreymass", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "json": { + "rexraw": { + "fund": "0.000000000000000000000000", + "pool": { + "total_rent": "3796.235300000000000000000000", + "namebid_proceeds": "0.000000000000000000000000", + "total_lendable": "59394726.320200000000000000000000", + "total_rex": "587072315799.259000000000000000000000", + "total_lent": "7435673.204700000000000000000000", + "total_unlent": "51959053.115500000000000000000000", + "loan_num": 496487 + } + }, + "chain": { + "chainid": "aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906", + "production": 1, + "decimals": 4, + "block_num": 490174685, + "sync": 0, + "block_time": "2026-03-24 19:56:50", + "rex_enabled": 1, + "network": "eos", + "systoken": "EOS", + "description": "EOS Mainnet" + }, + "account_name": "teamgreymass" + }, + "text": "{\"rexraw\":{\"fund\":\"0.000000000000000000000000\",\"pool\":{\"total_rent\":\"3796.235300000000000000000000\",\"namebid_proceeds\":\"0.000000000000000000000000\",\"total_lendable\":\"59394726.320200000000000000000000\",\"total_rex\":\"587072315799.259000000000000000000000\",\"total_lent\":\"7435673.204700000000000000000000\",\"total_unlent\":\"51959053.115500000000000000000000\",\"loan_num\":496487}},\"chain\":{\"chainid\":\"aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906\",\"production\":1,\"decimals\":4,\"block_num\":490174685,\"sync\":0,\"block_time\":\"2026-03-24 19:56:50\",\"rex_enabled\":1,\"network\":\"eos\",\"systoken\":\"EOS\",\"description\":\"EOS Mainnet\"},\"account_name\":\"teamgreymass\"}" +} \ No newline at end of file diff --git a/packages/light-api/test/rollup.config.mjs b/packages/light-api/test/rollup.config.mjs new file mode 100644 index 00000000..e999124b --- /dev/null +++ b/packages/light-api/test/rollup.config.mjs @@ -0,0 +1,117 @@ +/* eslint-disable no-undef */ + +import fs from 'fs' +import path from 'path' + +import terser from '@rollup/plugin-terser' +import alias from '@rollup/plugin-alias' +import commonjs from '@rollup/plugin-commonjs' +import json from '@rollup/plugin-json' +import replace from '@rollup/plugin-replace' +import resolve from '@rollup/plugin-node-resolve' +import typescript from '@rollup/plugin-typescript' +import virtual from '@rollup/plugin-virtual' + +// eslint-disable-next-line es-x/no-import-meta +const __dirname = path.dirname(new URL(import.meta.url).pathname) + +const mockData = Object.fromEntries( + fs + .readdirSync(path.join(__dirname, 'data')) + .map((f) => path.join(__dirname, 'data', f)) + .map((f) => [path.basename(f), JSON.parse(fs.readFileSync(f))]) +) + +const testFiles = fs + .readdirSync(__dirname) + .filter((f) => f.match(/\.ts$/)) + .map((f) => path.join(__dirname, f)) + .sort() + +const template = ` + + + + + Tests + + + + +
+ + + + + + + +` + +function inline() { + return { + name: 'Inliner', + generateBundle(opts, bundle) { + const file = path.basename(opts.file) + const output = bundle[file] + delete bundle[file] + const code = `${output.code}` + this.emitFile({ + type: 'asset', + fileName: file, + source: template.replace('%%tests%%', code), + }) + }, + } +} + +/** @type {import('rollup').RollupOptions} */ +export default [ + { + input: 'tests.ts', + output: { + file: 'test/browser.html', + format: 'iife', + sourcemap: 'inline', + globals: { + chai: 'chai', + mocha: 'mocha', + util: 'undefined', + crypto: 'undefined', + }, + }, + external: ['chai', 'mocha', 'crypto', 'util'], + plugins: [ + virtual({ + 'tests.ts': testFiles.map((f) => `import '${f.slice(0, -3)}'`).join('\n'), + }), + alias({ + entries: [ + { + find: '@wharfkit/antelope', + replacement: path.join(__dirname, '..', 'lib/antelope.m.js'), + }, + {find: './utils/mock-provider', replacement: './utils/browser-provider.ts'}, + ], + }), + typescript({target: 'es6', module: 'esnext', tsconfig: './test/tsconfig.json'}), + replace({'global.MOCK_DATA': JSON.stringify(mockData), preventAssignment: true}), + resolve({browser: true}), + commonjs(), + json(), + terser({ + mangle: false, + format: { + beautify: true, + }, + compress: false, + }), + inline(), + ], + }, +] diff --git a/packages/light-api/test/tsconfig.json b/packages/light-api/test/tsconfig.json new file mode 100644 index 00000000..6216a8d3 --- /dev/null +++ b/packages/light-api/test/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "isolatedModules": false, + "resolveJsonModule": true, + "module": "commonjs", + "target": "es6", + "types": ["mocha", "node"], + "baseUrl": "..", + "paths": { + "$lib": ["."] + }, + }, + "include": ["*.ts", "**/*.ts"] +} diff --git a/packages/light-api/tsconfig.json b/packages/light-api/tsconfig.json new file mode 100644 index 00000000..bb54e351 --- /dev/null +++ b/packages/light-api/tsconfig.json @@ -0,0 +1,17 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "experimentalDecorators": true, + "importHelpers": true, + "isolatedModules": true, + "lib": ["dom", "esnext"], + "module": "esnext", + "moduleResolution": "node", + "noImplicitAny": false, + "sourceMap": true, + "strict": true, + "useUnknownInCatchVariables": false, + "target": "es2020" + }, + "include": ["src/**/*"] +} diff --git a/packages/light-api/yarn.lock b/packages/light-api/yarn.lock new file mode 100644 index 00000000..c59a1d9d --- /dev/null +++ b/packages/light-api/yarn.lock @@ -0,0 +1,3040 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@babel/code-frame@^7.28.6", "@babel/code-frame@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.29.0.tgz#7cd7a59f15b3cc0dcd803038f7792712a7d0b15c" + integrity sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw== + dependencies: + "@babel/helper-validator-identifier" "^7.28.5" + js-tokens "^4.0.0" + picocolors "^1.1.1" + +"@babel/compat-data@^7.28.6": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.29.0.tgz#00d03e8c0ac24dd9be942c5370990cbe1f17d88d" + integrity sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg== + +"@babel/core@^7.23.9": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.29.0.tgz#5286ad785df7f79d656e88ce86e650d16ca5f322" + integrity sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" + "@babel/helper-compilation-targets" "^7.28.6" + "@babel/helper-module-transforms" "^7.28.6" + "@babel/helpers" "^7.28.6" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/traverse" "^7.29.0" + "@babel/types" "^7.29.0" + "@jridgewell/remapping" "^2.3.5" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.29.0": + version "7.29.1" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.29.1.tgz#d09876290111abbb00ef962a7b83a5307fba0d50" + integrity sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw== + dependencies: + "@babel/parser" "^7.29.0" + "@babel/types" "^7.29.0" + "@jridgewell/gen-mapping" "^0.3.12" + "@jridgewell/trace-mapping" "^0.3.28" + jsesc "^3.0.2" + +"@babel/helper-compilation-targets@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz#32c4a3f41f12ed1532179b108a4d746e105c2b25" + integrity sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA== + dependencies: + "@babel/compat-data" "^7.28.6" + "@babel/helper-validator-option" "^7.27.1" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-globals@^7.28.0": + version "7.28.0" + resolved "https://registry.yarnpkg.com/@babel/helper-globals/-/helper-globals-7.28.0.tgz#b9430df2aa4e17bc28665eadeae8aa1d985e6674" + integrity sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw== + +"@babel/helper-module-imports@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz#60632cbd6ffb70b22823187201116762a03e2d5c" + integrity sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw== + dependencies: + "@babel/traverse" "^7.28.6" + "@babel/types" "^7.28.6" + +"@babel/helper-module-transforms@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz#9312d9d9e56edc35aeb6e95c25d4106b50b9eb1e" + integrity sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA== + dependencies: + "@babel/helper-module-imports" "^7.28.6" + "@babel/helper-validator-identifier" "^7.28.5" + "@babel/traverse" "^7.28.6" + +"@babel/helper-string-parser@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz#54da796097ab19ce67ed9f88b47bb2ec49367687" + integrity sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA== + +"@babel/helper-validator-identifier@^7.28.5": + version "7.28.5" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz#010b6938fab7cb7df74aa2bbc06aa503b8fe5fb4" + integrity sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q== + +"@babel/helper-validator-option@^7.27.1": + version "7.27.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz#fa52f5b1e7db1ab049445b421c4471303897702f" + integrity sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg== + +"@babel/helpers@^7.28.6": + version "7.29.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.29.2.tgz#9cfbccb02b8e229892c0b07038052cc1a8709c49" + integrity sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw== + dependencies: + "@babel/template" "^7.28.6" + "@babel/types" "^7.29.0" + +"@babel/parser@^7.23.9", "@babel/parser@^7.28.6", "@babel/parser@^7.29.0": + version "7.29.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.2.tgz#58bd50b9a7951d134988a1ae177a35ef9a703ba1" + integrity sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA== + dependencies: + "@babel/types" "^7.29.0" + +"@babel/template@^7.28.6": + version "7.28.6" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.28.6.tgz#0e7e56ecedb78aeef66ce7972b082fce76a23e57" + integrity sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ== + dependencies: + "@babel/code-frame" "^7.28.6" + "@babel/parser" "^7.28.6" + "@babel/types" "^7.28.6" + +"@babel/traverse@^7.28.6", "@babel/traverse@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.29.0.tgz#f323d05001440253eead3c9c858adbe00b90310a" + integrity sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA== + dependencies: + "@babel/code-frame" "^7.29.0" + "@babel/generator" "^7.29.0" + "@babel/helper-globals" "^7.28.0" + "@babel/parser" "^7.29.0" + "@babel/template" "^7.28.6" + "@babel/types" "^7.29.0" + debug "^4.3.1" + +"@babel/types@^7.28.6", "@babel/types@^7.29.0": + version "7.29.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.29.0.tgz#9f5b1e838c446e72cf3cd4b918152b8c605e37c7" + integrity sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A== + dependencies: + "@babel/helper-string-parser" "^7.27.1" + "@babel/helper-validator-identifier" "^7.28.5" + +"@cspotcode/source-map-support@^0.8.0": + version "0.8.1" + resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" + integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== + dependencies: + "@jridgewell/trace-mapping" "0.3.9" + +"@eslint-community/eslint-utils@^4.1.2": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/eslint-utils@^4.7.0", "@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": + version "4.9.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz#4e90af67bc51ddee6cdef5284edf572ec376b595" + integrity sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2": + version "4.12.2" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" + integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== + +"@eslint/config-array@^0.23.3": + version "0.23.3" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.23.3.tgz#3f4a93dd546169c09130cbd10f2415b13a20a219" + integrity sha512-j+eEWmB6YYLwcNOdlwQ6L2OsptI/LO6lNBuLIqe5R7RetD658HLoF+Mn7LzYmAWWNNzdC6cqP+L6r8ujeYXWLw== + dependencies: + "@eslint/object-schema" "^3.0.3" + debug "^4.3.1" + minimatch "^10.2.4" + +"@eslint/config-helpers@^0.5.3": + version "0.5.3" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.5.3.tgz#721fe6bbb90d74b0c80d6ff2428e5bbcb002becb" + integrity sha512-lzGN0onllOZCGroKJmRwY6QcEHxbjBw1gwB8SgRSqK8YbbtEXMvKynsXc3553ckIEBxsbMBU7oOZXKIPGZNeZw== + dependencies: + "@eslint/core" "^1.1.1" + +"@eslint/core@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-1.1.1.tgz#450f3d2be2d463ccd51119544092256b4e88df32" + integrity sha512-QUPblTtE51/7/Zhfv8BDwO0qkkzQL7P/aWWbqcf4xWLEYn1oKjdO0gglQBB4GAsu7u6wjijbCmzsUTy6mnk6oQ== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/object-schema@^3.0.3": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-3.0.3.tgz#5bf671e52e382e4adc47a9906f2699374637db6b" + integrity sha512-iM869Pugn9Nsxbh/YHRqYiqd23AmIbxJOcpUMOuWCVNdoQJ5ZtwL6h3t0bcZzJUlC3Dq9jCFCESBZnX0GTv7iQ== + +"@eslint/plugin-kit@^0.6.1": + version "0.6.1" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.6.1.tgz#eb9e6689b56ce8bc1855bb33090e63f3fc115e8e" + integrity sha512-iH1B076HoAshH1mLpHMgwdGeTs0CYwL0SPMkGuSebZrwBp16v415e9NZXg2jtrqPVQjf6IANe2Vtlr5KswtcZQ== + dependencies: + "@eslint/core" "^1.1.1" + levn "^0.4.1" + +"@gerrit0/mini-shiki@^3.23.0": + version "3.23.0" + resolved "https://registry.yarnpkg.com/@gerrit0/mini-shiki/-/mini-shiki-3.23.0.tgz#d9414f3080b88303b18f3a311846e37e424d800c" + integrity sha512-bEMORlG0cqdjVyCEuU0cDQbORWX+kYCeo0kV1lbxF5bt4r7SID2l9bqsxJEM0zndaxpOUT7riCyIVEuqq/Ynxg== + dependencies: + "@shikijs/engine-oniguruma" "^3.23.0" + "@shikijs/langs" "^3.23.0" + "@shikijs/themes" "^3.23.0" + "@shikijs/types" "^3.23.0" + "@shikijs/vscode-textmate" "^10.0.2" + +"@humanfs/core@^0.19.1": + version "0.19.1" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.1.tgz#17c55ca7d426733fe3c561906b8173c336b40a77" + integrity sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA== + +"@humanfs/node@^0.16.6": + version "0.16.7" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.7.tgz#822cb7b3a12c5a240a24f621b5a2413e27a45f26" + integrity sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ== + dependencies: + "@humanfs/core" "^0.19.1" + "@humanwhocodes/retry" "^0.4.0" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== + +"@isaacs/cliui@^8.0.2": + version "8.0.2" + resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" + integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA== + dependencies: + string-width "^5.1.2" + string-width-cjs "npm:string-width@^4.2.0" + strip-ansi "^7.0.1" + strip-ansi-cjs "npm:strip-ansi@^6.0.1" + wrap-ansi "^8.1.0" + wrap-ansi-cjs "npm:wrap-ansi@^7.0.0" + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz#fd3db1d59ecf7cf121e80650bb86712f9b55eced" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2", "@istanbuljs/schema@^0.1.3": + version "0.1.3" + resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jridgewell/gen-mapping@^0.3.0": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/gen-mapping@^0.3.12", "@jridgewell/gen-mapping@^0.3.5": + version "0.3.13" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz#6342a19f44347518c93e43b1ac69deb3c4656a1f" + integrity sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.0" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.5.tgz#a3bb4d5c6825aab0d281268f47f6ad5853431e91" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/sourcemap-codec@^1.5.0", "@jridgewell/sourcemap-codec@^1.5.5": + version "1.5.5" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz#6912b00d2c631c0d15ce1a7ab57cd657f2a8f8ba" + integrity sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og== + +"@jridgewell/trace-mapping@0.3.9": + version "0.3.9" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" + integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== + dependencies: + "@jridgewell/resolve-uri" "^3.0.3" + "@jridgewell/sourcemap-codec" "^1.4.10" + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.28": + version "0.3.31" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz#db15d6781c931f3a251a3dac39501c98a6082fd0" + integrity sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@jridgewell/trace-mapping@^0.3.9": + version "0.3.19" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz#f8a3249862f91be48d3127c3cfe992f79b4b8811" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3": + version "1.2.8" + resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pkgjs/parseargs@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33" + integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg== + +"@pkgr/core@^0.2.9": + version "0.2.9" + resolved "https://registry.yarnpkg.com/@pkgr/core/-/core-0.2.9.tgz#d229a7b7f9dac167a156992ef23c7f023653f53b" + integrity sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA== + +"@rollup/plugin-alias@^6.0.0": + version "6.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-alias/-/plugin-alias-6.0.0.tgz#f7fa8c806db9c073baa6b00e4b1c396edef9beb2" + integrity sha512-tPCzJOtS7uuVZd+xPhoy5W4vThe6KWXNmsFCNktaAh5RTqcLiSfT4huPQIXkgJ6YCOjJHvecOAzQxLFhPxKr+g== + +"@rollup/plugin-commonjs@^29.0.2": + version "29.0.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-commonjs/-/plugin-commonjs-29.0.2.tgz#d2d84c49d0983d071f2ab96f4cfe02fe80abd602" + integrity sha512-S/ggWH1LU7jTyi9DxZOKyxpVd4hF/OZ0JrEbeLjXk/DFXwRny0tjD2c992zOUYQobLrVkRVMDdmHP16HKP7GRg== + dependencies: + "@rollup/pluginutils" "^5.0.1" + commondir "^1.0.1" + estree-walker "^2.0.2" + fdir "^6.2.0" + is-reference "1.2.1" + magic-string "^0.30.3" + picomatch "^4.0.2" + +"@rollup/plugin-json@^6.1.0": + version "6.1.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-json/-/plugin-json-6.1.0.tgz#fbe784e29682e9bb6dee28ea75a1a83702e7b805" + integrity sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA== + dependencies: + "@rollup/pluginutils" "^5.1.0" + +"@rollup/plugin-node-resolve@^16.0.3": + version "16.0.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-node-resolve/-/plugin-node-resolve-16.0.3.tgz#0988e6f2cbb13316b0f5e7213f757bc9ed44928f" + integrity sha512-lUYM3UBGuM93CnMPG1YocWu7X802BrNF3jW2zny5gQyLQgRFJhV1Sq0Zi74+dh/6NBx1DxFC4b4GXg9wUCG5Qg== + dependencies: + "@rollup/pluginutils" "^5.0.1" + "@types/resolve" "1.20.2" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.22.1" + +"@rollup/plugin-replace@^6.0.3": + version "6.0.3" + resolved "https://registry.yarnpkg.com/@rollup/plugin-replace/-/plugin-replace-6.0.3.tgz#0f82e41d81f6586ab0f81a1b48bd7fd92fcfb9a2" + integrity sha512-J4RZarRvQAm5IF0/LwUUg+obsm+xZhYnbMXmXROyoSE1ATJe3oXSb9L5MMppdxP2ylNSjv6zFBwKYjcKMucVfA== + dependencies: + "@rollup/pluginutils" "^5.0.1" + magic-string "^0.30.3" + +"@rollup/plugin-terser@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-terser/-/plugin-terser-1.0.0.tgz#dabbc4414d127aa7d43fc5e7ea8699b9c3bc59e5" + integrity sha512-FnCxhTBx6bMOYQrar6C8h3scPt8/JwIzw3+AJ2K++6guogH5fYaIFia+zZuhqv0eo1RN7W1Pz630SyvLbDjhtQ== + dependencies: + serialize-javascript "^7.0.3" + smob "^1.0.0" + terser "^5.17.4" + +"@rollup/plugin-typescript@^12.3.0": + version "12.3.0" + resolved "https://registry.yarnpkg.com/@rollup/plugin-typescript/-/plugin-typescript-12.3.0.tgz#cc51b830973bc14c9456fe6532f322f2a40f5f12" + integrity sha512-7DP0/p7y3t67+NabT9f8oTBFE6gGkto4SA6Np2oudYmZE/m1dt8RB0SjL1msMxFpLo631qjRCcBlAbq1ml/Big== + dependencies: + "@rollup/pluginutils" "^5.1.0" + resolve "^1.22.1" + +"@rollup/plugin-virtual@^3.0.2": + version "3.0.2" + resolved "https://registry.yarnpkg.com/@rollup/plugin-virtual/-/plugin-virtual-3.0.2.tgz#17e17eeecb4c9fa1c0a6e72c9e5f66382fddbb82" + integrity sha512-10monEYsBp3scM4/ND4LNH5Rxvh3e/cVeL3jWTgZ2SrQ+BmUoQcopVQvnaMcOnykb1VkxUFuDAN+0FnpTFRy2A== + +"@rollup/pluginutils@^5.0.1": + version "5.0.4" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.0.4.tgz#74f808f9053d33bafec0cc98e7b835c9667d32ba" + integrity sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^2.3.1" + +"@rollup/pluginutils@^5.1.0": + version "5.3.0" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-5.3.0.tgz#57ba1b0cbda8e7a3c597a4853c807b156e21a7b4" + integrity sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q== + dependencies: + "@types/estree" "^1.0.0" + estree-walker "^2.0.2" + picomatch "^4.0.2" + +"@rollup/rollup-android-arm-eabi@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.0.tgz#7e158ddfc16f78da99c0d5ccbae6cae403ef3284" + integrity sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A== + +"@rollup/rollup-android-arm64@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.0.tgz#49f4ae0e22b6f9ffbcd3818b9a0758fa2d10b1cd" + integrity sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw== + +"@rollup/rollup-darwin-arm64@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.0.tgz#bb200269069acf5c1c4d79ad142524f77e8b8236" + integrity sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA== + +"@rollup/rollup-darwin-x64@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.0.tgz#1bf7a92b27ebdd5e0d1d48503c7811160773be1a" + integrity sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw== + +"@rollup/rollup-freebsd-arm64@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.0.tgz#5ccf537b99c5175008444702193ad0b1c36f7f16" + integrity sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw== + +"@rollup/rollup-freebsd-x64@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.0.tgz#1196ecd7bf4e128624ef83cd1f9d785114474a77" + integrity sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA== + +"@rollup/rollup-linux-arm-gnueabihf@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.0.tgz#cc147633a4af229fee83a737bf2334fbac3dc28e" + integrity sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g== + +"@rollup/rollup-linux-arm-musleabihf@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.0.tgz#3559f9f060153ea54594a42c3b87a297bedcc26e" + integrity sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ== + +"@rollup/rollup-linux-arm64-gnu@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.0.tgz#e91f887b154123485cfc4b59befe2080fcd8f2df" + integrity sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A== + +"@rollup/rollup-linux-arm64-musl@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.0.tgz#660752f040df9ba44a24765df698928917c0bf21" + integrity sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ== + +"@rollup/rollup-linux-loong64-gnu@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.0.tgz#cb0e939a5fa479ccef264f3f45b31971695f869c" + integrity sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw== + +"@rollup/rollup-linux-loong64-musl@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.0.tgz#42f86fbc82cd1a81be2d346476dd3231cf5ee442" + integrity sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog== + +"@rollup/rollup-linux-ppc64-gnu@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.0.tgz#39776a647a789dc95ea049277c5ef8f098df77f9" + integrity sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ== + +"@rollup/rollup-linux-ppc64-musl@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.0.tgz#466f20029a8e8b3bb2954c7ddebc9586420cac2c" + integrity sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg== + +"@rollup/rollup-linux-riscv64-gnu@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.0.tgz#cff9877c78f12e7aa6246f6902ad913e99edb2b7" + integrity sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA== + +"@rollup/rollup-linux-riscv64-musl@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.0.tgz#9a762fb99b5a82a921017f56491b7e892b9fb17d" + integrity sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ== + +"@rollup/rollup-linux-s390x-gnu@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.0.tgz#9d25ad8ac7dab681935baf78ac5ea92d14629cdf" + integrity sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ== + +"@rollup/rollup-linux-x64-gnu@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.0.tgz#5e5139e11819fa38a052368da79422cb4afcf466" + integrity sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg== + +"@rollup/rollup-linux-x64-musl@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.0.tgz#b6211d46e11b1f945f5504cc794fce839331ed08" + integrity sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw== + +"@rollup/rollup-openbsd-x64@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.0.tgz#e6e09eebaa7012bb9c7331b437a9e992bd94ca35" + integrity sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw== + +"@rollup/rollup-openharmony-arm64@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.0.tgz#f7d99ae857032498e57a5e7259fb7100fd24a87e" + integrity sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA== + +"@rollup/rollup-win32-arm64-msvc@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.0.tgz#41e392f5d9f3bf1253fdaf2f6d6f6b1bfc452856" + integrity sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ== + +"@rollup/rollup-win32-ia32-msvc@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.0.tgz#f41b0490be0e5d3cf459b4dc076a192b532adea9" + integrity sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w== + +"@rollup/rollup-win32-x64-gnu@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.0.tgz#0fcf9f1fcb750f0317b13aac3b3231687e6397a5" + integrity sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA== + +"@rollup/rollup-win32-x64-msvc@4.60.0": + version "4.60.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.0.tgz#3afdb30405f6d4248df5e72e1ca86c5eab55fab8" + integrity sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w== + +"@shikijs/engine-oniguruma@^3.23.0": + version "3.23.0" + resolved "https://registry.yarnpkg.com/@shikijs/engine-oniguruma/-/engine-oniguruma-3.23.0.tgz#789421048d66ac1b33613169d6d18b9cc6e340ed" + integrity sha512-1nWINwKXxKKLqPibT5f4pAFLej9oZzQTsby8942OTlsJzOBZ0MWKiwzMsd+jhzu8YPCHAswGnnN1YtQfirL35g== + dependencies: + "@shikijs/types" "3.23.0" + "@shikijs/vscode-textmate" "^10.0.2" + +"@shikijs/langs@^3.23.0": + version "3.23.0" + resolved "https://registry.yarnpkg.com/@shikijs/langs/-/langs-3.23.0.tgz#00959d8b16c7f671221ae79b3ad8cde7e6a5c112" + integrity sha512-2Ep4W3Re5aB1/62RSYQInK9mM3HsLeB91cHqznAJMuylqjzNVAVCMnNWRHFtcNHXsoNRayP9z1qj4Sq3nMqYXg== + dependencies: + "@shikijs/types" "3.23.0" + +"@shikijs/themes@^3.23.0": + version "3.23.0" + resolved "https://registry.yarnpkg.com/@shikijs/themes/-/themes-3.23.0.tgz#fd96ca5ad52639057995bc2093682884e1846f27" + integrity sha512-5qySYa1ZgAT18HR/ypENL9cUSGOeI2x+4IvYJu4JgVJdizn6kG4ia5Q1jDEOi7gTbN4RbuYtmHh0W3eccOrjMA== + dependencies: + "@shikijs/types" "3.23.0" + +"@shikijs/types@3.23.0", "@shikijs/types@^3.23.0": + version "3.23.0" + resolved "https://registry.yarnpkg.com/@shikijs/types/-/types-3.23.0.tgz#d441571a058641926018ae3de99866f39e5bbdf2" + integrity sha512-3JZ5HXOZfYjsYSk0yPwBrkupyYSLpAE26Qc0HLghhZNGTZg/SKxXIIgoxOpmmeQP0RRSDJTk1/vPfw9tbw+jSQ== + dependencies: + "@shikijs/vscode-textmate" "^10.0.2" + "@types/hast" "^3.0.4" + +"@shikijs/vscode-textmate@^10.0.2": + version "10.0.2" + resolved "https://registry.yarnpkg.com/@shikijs/vscode-textmate/-/vscode-textmate-10.0.2.tgz#a90ab31d0cc1dfb54c66a69e515bf624fa7b2224" + integrity sha512-83yeghZ2xxin3Nj8z1NMd/NCuca+gsYXswywDy5bHvwlWL8tpTQmzGeUuHd9FC3E/SBEMvzJRwWEOz5gGes9Qg== + +"@tsconfig/node10@^1.0.7": + version "1.0.9" + resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.9.tgz#df4907fc07a886922637b15e02d4cebc4c0021b2" + integrity sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA== + +"@tsconfig/node12@^1.0.7": + version "1.0.11" + resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" + integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== + +"@tsconfig/node14@^1.0.0": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" + integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== + +"@tsconfig/node16@^1.0.2": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== + +"@types/bn.js@*": + version "5.1.2" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.1.2.tgz#162f5238c46f4bcbac07a98561724eca1fcf0c5e" + integrity sha512-dkpZu0szUtn9UXTmw+e0AJFd4D2XAxDnsCLdc05SfqpqzPEBft8eQr8uaFitfo/dUUOZERaLec2hHMG87A4Dxg== + dependencies: + "@types/node" "*" + +"@types/bn.js@^5.2.0": + version "5.2.0" + resolved "https://registry.yarnpkg.com/@types/bn.js/-/bn.js-5.2.0.tgz#4349b9710e98f9ab3cdc50f1c5e4dcbd8ef29c80" + integrity sha512-DLbJ1BPqxvQhIGbeu8VbUC1DiAiahHtAYvA0ZEAa4P31F7IaArc8z3C3BRQdWX4mtLQuABG4yzp76ZrS02Ui1Q== + dependencies: + "@types/node" "*" + +"@types/elliptic@^6.4.18": + version "6.4.18" + resolved "https://registry.yarnpkg.com/@types/elliptic/-/elliptic-6.4.18.tgz#bc96e26e1ccccbabe8b6f0e409c85898635482e1" + integrity sha512-UseG6H5vjRiNpQvrhy4VF/JXdA3V/Fp5amvveaL+fs28BZ6xIKJBPnUPRlEaZpysD9MbpfaLi8lbl7PGUAkpWw== + dependencies: + "@types/bn.js" "*" + +"@types/esrecurse@^4.3.1": + version "4.3.1" + resolved "https://registry.yarnpkg.com/@types/esrecurse/-/esrecurse-4.3.1.tgz#6f636af962fbe6191b830bd676ba5986926bccec" + integrity sha512-xJBAbDifo5hpffDBuHl0Y8ywswbiAp/Wi7Y/GtAgSlZyIABppyurxVueOPE8LUQOxdlgi6Zqce7uoEpqNTeiUw== + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + +"@types/estree@1.0.8", "@types/estree@^1.0.6", "@types/estree@^1.0.8": + version "1.0.8" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.8.tgz#958b91c991b1867ced318bedea0e215ee050726e" + integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w== + +"@types/hast@^3.0.4": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/hast/-/hast-3.0.4.tgz#1d6b39993b82cea6ad783945b0508c25903e15aa" + integrity sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ== + dependencies: + "@types/unist" "*" + +"@types/json-schema@^7.0.15": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/mocha@^10.0.10": + version "10.0.10" + resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-10.0.10.tgz#91f62905e8d23cbd66225312f239454a23bebfa0" + integrity sha512-xPyYSz1cMPnJQhl0CLMH68j3gprKZaTjG3s5Vi+fDgx+uhG9NOXwbVt52eFS8ECyXhyKcjDLCBEqBExKuiZb7Q== + +"@types/node@*": + version "20.6.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.6.2.tgz#a065925409f59657022e9063275cd0b9bd7e1b12" + integrity sha512-Y+/1vGBHV/cYk6OI1Na/LHzwnlNCAfU3ZNGrc1LdRe/LAIbdDPTTv/HU3M7yXN448aTVDq3eKRm2cg7iKLb8gw== + +"@types/node@^25.5.0": + version "25.5.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-25.5.0.tgz#5c99f37c443d9ccc4985866913f1ed364217da31" + integrity sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw== + dependencies: + undici-types "~7.18.0" + +"@types/resolve@1.20.2": + version "1.20.2" + resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.20.2.tgz#97d26e00cd4a0423b4af620abecf3e6f442b7975" + integrity sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q== + +"@types/unist@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/unist/-/unist-3.0.3.tgz#acaab0f919ce69cce629c2d4ed2eb4adc1b6c20c" + integrity sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q== + +"@typescript-eslint/eslint-plugin@^8.57.2": + version "8.57.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.57.2.tgz#ad0dcefeca9c2ecbe09f730d478063666aee010b" + integrity sha512-NZZgp0Fm2IkD+La5PR81sd+g+8oS6JwJje+aRWsDocxHkjyRw0J5L5ZTlN3LI1LlOcGL7ph3eaIUmTXMIjLk0w== + dependencies: + "@eslint-community/regexpp" "^4.12.2" + "@typescript-eslint/scope-manager" "8.57.2" + "@typescript-eslint/type-utils" "8.57.2" + "@typescript-eslint/utils" "8.57.2" + "@typescript-eslint/visitor-keys" "8.57.2" + ignore "^7.0.5" + natural-compare "^1.4.0" + ts-api-utils "^2.4.0" + +"@typescript-eslint/parser@^8.57.2": + version "8.57.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.57.2.tgz#b819955e39f976c0d4f95b5ed67fe22f85cd6898" + integrity sha512-30ScMRHIAD33JJQkgfGW1t8CURZtjc2JpTrq5n2HFhOefbAhb7ucc7xJwdWcrEtqUIYJ73Nybpsggii6GtAHjA== + dependencies: + "@typescript-eslint/scope-manager" "8.57.2" + "@typescript-eslint/types" "8.57.2" + "@typescript-eslint/typescript-estree" "8.57.2" + "@typescript-eslint/visitor-keys" "8.57.2" + debug "^4.4.3" + +"@typescript-eslint/project-service@8.57.2": + version "8.57.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.57.2.tgz#dfbc7777f9f633f2b06b558cda3836e76f856e3c" + integrity sha512-FuH0wipFywXRTHf+bTTjNyuNQQsQC3qh/dYzaM4I4W0jrCqjCVuUh99+xd9KamUfmCGPvbO8NDngo/vsnNVqgw== + dependencies: + "@typescript-eslint/tsconfig-utils" "^8.57.2" + "@typescript-eslint/types" "^8.57.2" + debug "^4.4.3" + +"@typescript-eslint/scope-manager@8.57.2": + version "8.57.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.57.2.tgz#734dcde40677f430b5d963108337295bdbc09dae" + integrity sha512-snZKH+W4WbWkrBqj4gUNRIGb/jipDW3qMqVJ4C9rzdFc+wLwruxk+2a5D+uoFcKPAqyqEnSb4l2ULuZf95eSkw== + dependencies: + "@typescript-eslint/types" "8.57.2" + "@typescript-eslint/visitor-keys" "8.57.2" + +"@typescript-eslint/tsconfig-utils@8.57.2", "@typescript-eslint/tsconfig-utils@^8.57.2": + version "8.57.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.57.2.tgz#cf82dc11e884103ec13188a7352591efaa1a887e" + integrity sha512-3Lm5DSM+DCowsUOJC+YqHHnKEfFh5CoGkj5Z31NQSNF4l5wdOwqGn99wmwN/LImhfY3KJnmordBq/4+VDe2eKw== + +"@typescript-eslint/type-utils@8.57.2": + version "8.57.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.57.2.tgz#3ec65a94e73776252991a3cf0a15d220734c28f5" + integrity sha512-Co6ZCShm6kIbAM/s+oYVpKFfW7LBc6FXoPXjTRQ449PPNBY8U0KZXuevz5IFuuUj2H9ss40atTaf9dlGLzbWZg== + dependencies: + "@typescript-eslint/types" "8.57.2" + "@typescript-eslint/typescript-estree" "8.57.2" + "@typescript-eslint/utils" "8.57.2" + debug "^4.4.3" + ts-api-utils "^2.4.0" + +"@typescript-eslint/types@8.57.2", "@typescript-eslint/types@^8.57.2": + version "8.57.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.57.2.tgz#efe0da4c28b505ed458f113aa960dce2c5c671f4" + integrity sha512-/iZM6FnM4tnx9csuTxspMW4BOSegshwX5oBDznJ7S4WggL7Vczz5d2W11ecc4vRrQMQHXRSxzrCsyG5EsPPTbA== + +"@typescript-eslint/typescript-estree@8.57.2": + version "8.57.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.57.2.tgz#432e61a6cf2ab565837da387e5262c159672abea" + integrity sha512-2MKM+I6g8tJxfSmFKOnHv2t8Sk3T6rF20A1Puk0svLK+uVapDZB/4pfAeB7nE83uAZrU6OxW+HmOd5wHVdXwXA== + dependencies: + "@typescript-eslint/project-service" "8.57.2" + "@typescript-eslint/tsconfig-utils" "8.57.2" + "@typescript-eslint/types" "8.57.2" + "@typescript-eslint/visitor-keys" "8.57.2" + debug "^4.4.3" + minimatch "^10.2.2" + semver "^7.7.3" + tinyglobby "^0.2.15" + ts-api-utils "^2.4.0" + +"@typescript-eslint/utils@8.57.2": + version "8.57.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.57.2.tgz#46a8974c24326fb8899486728428a0f1a3115014" + integrity sha512-krRIbvPK1ju1WBKIefiX+bngPs+odIQUtR7kymzPfo1POVw3jlF+nLkmexdSSd4UCbDcQn+wMBATOOmpBbqgKg== + dependencies: + "@eslint-community/eslint-utils" "^4.9.1" + "@typescript-eslint/scope-manager" "8.57.2" + "@typescript-eslint/types" "8.57.2" + "@typescript-eslint/typescript-estree" "8.57.2" + +"@typescript-eslint/visitor-keys@8.57.2": + version "8.57.2" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.57.2.tgz#a5c9605774247336c0412beb7dc288ab2a07c11e" + integrity sha512-zhahknjobV2FiD6Ee9iLbS7OV9zi10rG26odsQdfBO/hjSzUQbkIYgda+iNKK1zNiW2ey+Lf8MU5btN17V3dUw== + dependencies: + "@typescript-eslint/types" "8.57.2" + eslint-visitor-keys "^5.0.0" + +"@wharfkit/abicache@^1.2.1": + version "1.2.2" + resolved "https://registry.yarnpkg.com/@wharfkit/abicache/-/abicache-1.2.2.tgz#c3d83485e3e3782ac94ced460915bad1ceee0be9" + integrity sha512-yOsYz2qQpQy7Nb8XZj62pZqp8YnmWDqFlrenYksBb9jl+1aWIpFhWd+14VEez4tUAezRH4UWW+w1SX5vhmUY9A== + dependencies: + "@wharfkit/antelope" "^1.0.2" + "@wharfkit/signing-request" "^3.1.0" + pako "^2.0.4" + tslib "^2.1.0" + +"@wharfkit/antelope@^1.0.11", "@wharfkit/antelope@^1.0.2", "@wharfkit/antelope@^1.0.5", "@wharfkit/antelope@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@wharfkit/antelope/-/antelope-1.1.1.tgz#f54c4ed7ddd758f4a8aa643a81dc3e4575058d45" + integrity sha512-zOetZJG0T4/WRCIC8Ui2DGv+RxrSkdXOq/q8sUqUcuKei+aJo4/9Xk37VULPt2qe0NpTm93ajYV9cYdD9m5Fgg== + dependencies: + bn.js "^4.11.9" + brorand "^1.1.0" + elliptic "^6.5.4" + hash.js "^1.0.0" + pako "^2.1.0" + tslib "^2.0.3" + +"@wharfkit/common@^1.2.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@wharfkit/common/-/common-1.5.0.tgz#66023ade5acc7e768ec2cd1c040c3043ec5cc59d" + integrity sha512-eqXkOy+vshcEzK8kED+EsoTPJjlBKHYglgV9CBnZQgIlGrWIRXWH4YaXH3W7EbI/nCRJCaNqxm5fC+pgpFcp8g== + dependencies: + tslib "^2.1.0" + +"@wharfkit/mock-data@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@wharfkit/mock-data/-/mock-data-1.3.1.tgz#f031bff8037e21d815679971de88d28f6f47661a" + integrity sha512-V+VRu07wCGLmxc6bPXKCavcHaEsFvMDlK4Q0sFJglwo4fsHr7dww6XsCoOGltY/XC1c0XpzeQ6v6eM352v95sA== + dependencies: + "@wharfkit/antelope" "^1.0.5" + "@wharfkit/session" "^1.2.7" + "@wharfkit/wallet-plugin-privatekey" "^1.1.0" + node-fetch "^2.6.1" + tslib "^2.1.0" + +"@wharfkit/session@^1.2.7": + version "1.6.1" + resolved "https://registry.yarnpkg.com/@wharfkit/session/-/session-1.6.1.tgz#087856dc547fea7b5aff547ca9c984a772da9239" + integrity sha512-k6ntDGOe8bvD/Ps0erTPTFMdYVFrw5cRvPcEwxytlmRRcNV/M8xWcpCYWdmGDxa8QYqynf/hAkbVh1PSwRGl5A== + dependencies: + "@wharfkit/abicache" "^1.2.1" + "@wharfkit/antelope" "^1.0.11" + "@wharfkit/common" "^1.2.0" + "@wharfkit/signing-request" "^3.1.0" + pako "^2.0.4" + tslib "^2.1.0" + +"@wharfkit/signing-request@^3.1.0": + version "3.4.0" + resolved "https://registry.yarnpkg.com/@wharfkit/signing-request/-/signing-request-3.4.0.tgz#ac433e5c3af3a084643e6c8a32c5b9b15a6978dc" + integrity sha512-WstXfmR9i5pKaYXDUwNFNCgBIvN6u5IRGWSfj5O3XzthbtJUmRoJNtjGMaNnUqZ1MMx5YY4/JpY3b2e6LbpXLw== + dependencies: + "@wharfkit/antelope" "^1.1.1" + tslib "^2.0.3" + +"@wharfkit/wallet-plugin-privatekey@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@wharfkit/wallet-plugin-privatekey/-/wallet-plugin-privatekey-1.1.0.tgz#5985bff61895c54d2afbef359cd42da4f3871c7d" + integrity sha512-45LPj7AOVDm4RugDEhy0fnQX/BcMffeJPjGUCUrLazJ2S0Sti8nNk4nqiJqyme84c/0gq7d65vvwlmVfGtPVEg== + dependencies: + tslib "^2.1.0" + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.1.1: + version "8.2.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.16.0: + version "8.16.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.16.0.tgz#4ce79c89be40afe7afe8f3adb902a1f1ce9ac08a" + integrity sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw== + +acorn@^8.4.1, acorn@^8.8.2: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +aggregate-error@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" + integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA== + dependencies: + clean-stack "^2.0.0" + indent-string "^4.0.0" + +ajv@^6.14.0: + version "6.14.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.14.0.tgz#fd067713e228210636ebb08c60bd3765d6dbe73a" + integrity sha512-IWrosm/yrn43eiKqkfkHis7QioDleaXQHdDVPKg0FSwwd/DuvyX79TZnFOnYpB7dcsFAMmtFztZuXPDvSePkFw== + 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" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" + integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^6.1.0: + version "6.2.3" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041" + integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg== + +append-transform@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-2.0.0.tgz#99d9d29c7b38391e6f428d28ce136551f0b77e12" + integrity sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg== + dependencies: + default-require-extensions "^3.0.0" + +archy@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" + integrity sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw== + +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +async@^3.2.4: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +balanced-match@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-4.0.4.tgz#bfb10662feed8196a2c62e7c68e17720c274179a" + integrity sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA== + +baseline-browser-mapping@^2.9.0: + version "2.10.10" + resolved "https://registry.yarnpkg.com/baseline-browser-mapping/-/baseline-browser-mapping-2.10.10.tgz#e74bd066724c1d8d7d8ea75fc3be25389a7a5c56" + integrity sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ== + +bn.js@^4.11.9: + version "4.12.0" + resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-4.12.0.tgz#775b3f278efbb9718eec7361f483fb36fbbfea88" + integrity sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA== + +brace-expansion@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== + dependencies: + balanced-match "^1.0.0" + +brace-expansion@^5.0.2: + version "5.0.5" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.5.tgz#dcc3a37116b79f3e1b46db994ced5d570e930fdb" + integrity sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ== + dependencies: + balanced-match "^4.0.2" + +braces@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +brorand@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz#12c25efe40a45e3c323eb8675a0a0ce57b22371f" + integrity sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w== + +browser-stdout@^1.3.1: + version "1.3.1" + resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" + integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== + +browserslist@^4.24.0: + version "4.28.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.28.1.tgz#7f534594628c53c63101079e27e40de490456a95" + integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA== + dependencies: + baseline-browser-mapping "^2.9.0" + caniuse-lite "^1.0.30001759" + electron-to-chromium "^1.5.263" + node-releases "^2.0.27" + update-browserslist-db "^1.2.0" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +caching-transform@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/caching-transform/-/caching-transform-4.0.0.tgz#00d297a4206d71e2163c39eaffa8157ac0651f0f" + integrity sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA== + dependencies: + hasha "^5.0.0" + make-dir "^3.0.0" + package-hash "^4.0.0" + write-file-atomic "^3.0.0" + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.0.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-lite@^1.0.30001759: + version "1.0.30001781" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001781.tgz#344b47c03eb8168b79c3c158b872bcfbdd02a400" + integrity sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw== + +chai@^6.2.2: + version "6.2.2" + resolved "https://registry.yarnpkg.com/chai/-/chai-6.2.2.tgz#ae41b52c9aca87734505362717f3255facda360e" + integrity sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg== + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chokidar@^4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-4.0.3.tgz#7be37a4c03c9aee1ecfe862a4a23b2c70c205d30" + integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== + dependencies: + readdirp "^4.0.1" + +clean-stack@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b" + integrity sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A== + +cliui@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz#511d702c0c4e41ca156d7d0e96021f23e13225b1" + integrity sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^6.2.0" + +cliui@^8.0.1: + version "8.0.1" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" + integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +commander@^13.0.0: + version "13.1.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-13.1.0.tgz#776167db68c78f38dcce1f9b8d7b8b9a488abf46" + integrity sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + +cross-spawn@^7.0.0, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +data-uri-to-buffer@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^4.3.1, debug@^4.3.5, debug@^4.4.3: + version "4.4.3" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a" + integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA== + dependencies: + ms "^2.1.3" + +decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decamelize@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-4.0.0.tgz#aa472d7bf660eb15f3494efd531cab7f2a709837" + integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.4.tgz#a6f2dce612fadd2ef1f519b73551f17e85199831" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-require-extensions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-3.0.1.tgz#bfae00feeaeada68c2ae256c62540f60b80625bd" + integrity sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw== + dependencies: + strip-bom "^4.0.0" + +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +diff@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/diff/-/diff-7.0.0.tgz#3fb34d387cd76d803f6eebea67b921dab0182a9a" + integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +eastasianwidth@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb" + integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== + +electron-to-chromium@^1.5.263: + version "1.5.322" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.322.tgz#9c24e49f7098ca19bc87c0e9c7e0ad6ffe4fddca" + integrity sha512-vFU34OcrvMcH66T+dYC3G4nURmgfDVewMIu6Q2urXpumAPSMmzvcn04KVVV8Opikq8Vs5nUbO/8laNhNRqSzYw== + +elliptic@^6.5.4: + version "6.5.4" + resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.4.tgz#da37cebd31e79a1367e941b592ed1fbebd58abbb" + integrity sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ== + 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" + +email-addresses@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/email-addresses/-/email-addresses-5.0.0.tgz#7ae9e7f58eef7d5e3e2c2c2d3ea49b78dc854fa6" + integrity sha512-4OIPYlA6JXqtVn8zpHpGiI7vE6EQOAg16aGnDMIAlZVinnoZ8208tW1hAbjWydgN/4PLTT9q+O1K6AH/vALJGw== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +entities@^4.4.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +es6-error@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" + integrity sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg== + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-string-regexp@^1.0.2: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +eslint-config-prettier@^10.1.8: + version "10.1.8" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" + integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== + +eslint-plugin-es-x@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-es-x/-/eslint-plugin-es-x-9.6.0.tgz#d0108e83bffb24b7abde3c35900f137c66787dd3" + integrity sha512-F74Ceu0n+EuANGyZyt9jFsawVC88rhyXXqVkKr/+9S54n5omZvUqe5yTCuAUhBk37yRCOKS45Os9IuxJpiVYGw== + dependencies: + "@eslint-community/eslint-utils" "^4.1.2" + "@eslint-community/regexpp" "^4.12.1" + eslint-type-tracer "^0.5.1" + +eslint-plugin-prettier@^5.5.5: + version "5.5.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-5.5.5.tgz#9eae11593faa108859c26f9a9c367d619a0769c0" + integrity sha512-hscXkbqUZ2sPithAuLm5MXL+Wph+U7wHngPBv9OMWwlP8iaflyxpjTYZkmdgB4/vPIhemRlBEoLrH7UC1n7aUw== + dependencies: + prettier-linter-helpers "^1.0.1" + synckit "^0.11.12" + +eslint-scope@^9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-9.1.2.tgz#b9de6ace2fab1cff24d2e58d85b74c8fcea39802" + integrity sha512-xS90H51cKw0jltxmvmHy2Iai1LIqrfbw57b79w/J7MfvDfkIkFZ+kj6zC3BjtUwh150HsSSdxXZcsuv72miDFQ== + dependencies: + "@types/esrecurse" "^4.3.1" + "@types/estree" "^1.0.8" + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-type-tracer@^0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/eslint-type-tracer/-/eslint-type-tracer-0.5.2.tgz#187e376dcc04a0b2a5254904ca388793d0bd22e5" + integrity sha512-YiJmgk6OD1suPB4UC3M/PB+oxahf145jQQ5gFXFk9F9Y7puWwnqGYC2BtTB+FoHqdOohImeTt0rNk0lhhECNaQ== + dependencies: + "@eslint-community/eslint-utils" "^4.7.0" + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + +eslint-visitor-keys@^5.0.0, eslint-visitor-keys@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" + integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== + +eslint@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-10.1.0.tgz#9ca98e654e642ab2e1af6d1e9d8613857ac341b4" + integrity sha512-S9jlY/ELKEUwwQnqWDO+f+m6sercqOPSqXM5Go94l7DOmxHVDgmSFGWEzeE/gwgTAr0W103BWt0QLe/7mabIvA== + dependencies: + "@eslint-community/eslint-utils" "^4.8.0" + "@eslint-community/regexpp" "^4.12.2" + "@eslint/config-array" "^0.23.3" + "@eslint/config-helpers" "^0.5.3" + "@eslint/core" "^1.1.1" + "@eslint/plugin-kit" "^0.6.1" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + ajv "^6.14.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^9.1.2" + eslint-visitor-keys "^5.0.1" + espree "^11.2.0" + esquery "^1.7.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + minimatch "^10.2.4" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-11.2.0.tgz#01d5e47dc332aaba3059008362454a8cc34ccaa5" + integrity sha512-7p3DrVEIopW1B1avAGLuCSh1jubc01H2JHc8B4qqGblmg5gI9yumBgACjWo4JlIc04ufug4xJ3SQI8HkS/Rgzw== + dependencies: + acorn "^8.16.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^5.0.1" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" + integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^5.1.0, estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.2.9: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + 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" + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fdir@^6.2.0, fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.2.0" + resolved "https://registry.yarnpkg.com/fetch-blob/-/fetch-blob-3.2.0.tgz#f09b8d4bbd45adc6f0c20b7e787e793e309dcce9" + integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + +filename-reserved-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz#abf73dfab735d045440abfea2d91f389ebbfa229" + integrity sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ== + +filenamify@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/filenamify/-/filenamify-4.3.0.tgz#62391cb58f02b09971c9d4f9d63b3cf9aba03106" + integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== + dependencies: + filename-reserved-regex "^2.0.0" + strip-outer "^1.0.1" + trim-repeated "^1.0.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@^3.2.0, find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.2.tgz#b30c5b6eff0730731aea9bbd9dbecbd80256d64b" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flatted@^3.2.9: + version "3.4.2" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.4.2.tgz#f5c23c107f0f37de8dbdf24f13722b3b98d52726" + integrity sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA== + +foreground-child@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-2.0.0.tgz#71b32800c9f15aa8f2f83f4a6bd9bff35d861a53" + integrity sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA== + dependencies: + cross-spawn "^7.0.0" + signal-exit "^3.0.2" + +foreground-child@^3.1.0, foreground-child@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== + dependencies: + cross-spawn "^7.0.6" + signal-exit "^4.0.1" + +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.yarnpkg.com/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz#24807c31c9d402e002ab3d8c720144ceb8848423" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + +fromentries@^1.2.0: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a" + integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg== + +fs-extra@^11.1.1: + version "11.3.4" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.3.4.tgz#ab6934eca8bcf6f7f6b82742e33591f86301d6fc" + integrity sha512-CTXd6rk/M3/ULNQj8FBqBWHYBVYybQ3VPBw0xGKFe3tuH7ytT6ACnvzpIQ3UZtB8yvUKC2cXn1a+x+5EVQLovA== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/get-package-type/-/get-package-type-0.1.0.tgz#8de2d803cff44df3bc6c456e6668b36c3926e11a" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +gh-pages@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-6.3.0.tgz#a5b9476dd4385ceaf85c6467b2e05397093e7613" + integrity sha512-Ot5lU6jK0Eb+sszG8pciXdjMXdBJ5wODvgjR+imihTqsUWF2K6dJ9HST55lgqcs8wWcw6o6wAsUzfcYRhJPXbA== + dependencies: + async "^3.2.4" + commander "^13.0.0" + email-addresses "^5.0.0" + filenamify "^4.3.0" + find-cache-dir "^3.3.1" + fs-extra "^11.1.1" + globby "^11.1.0" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob@^10.4.5: + version "10.5.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz#8ec0355919cd3338c28428a23d4f24ecc5fe738c" + integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg== + dependencies: + foreground-child "^3.1.0" + jackspeak "^3.1.2" + minimatch "^9.0.4" + minipass "^7.1.2" + package-json-from-dist "^1.0.0" + path-scurry "^1.11.1" + +glob@^13.0.3, glob@^13.0.6: + version "13.0.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-13.0.6.tgz#078666566a425147ccacfbd2e332deb66a2be71d" + integrity sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw== + dependencies: + minimatch "^10.2.2" + minipass "^7.1.3" + path-scurry "^2.0.2" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + 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" + +graceful-fs@^4.1.15, graceful-fs@^4.1.6, graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hash.js@^1.0.0, hash.js@^1.0.3: + version "1.1.7" + resolved "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz#0babca538e8d4ee4a0f8988d68866537a003cf42" + integrity sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA== + dependencies: + inherits "^2.0.3" + minimalistic-assert "^1.0.1" + +hasha@^5.0.0: + version "5.2.2" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== + dependencies: + is-stream "^2.0.0" + type-fest "^0.8.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hmac-drbg@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" + integrity sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg== + dependencies: + hash.js "^1.0.3" + minimalistic-assert "^1.0.0" + minimalistic-crypto-utils "^1.0.1" + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +ignore@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.5.tgz#4cb5f6cd7d4c7ab0365738c7aea888baa6d7efd9" + integrity sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg== + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inherits@^2.0.3, inherits@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +is-core-module@^2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.0.tgz#bb52aa6e2cbd49a30c2ba68c42bf3435ba6072db" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + dependencies: + has "^1.0.3" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" + integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== + +is-reference@1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" + integrity sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ== + dependencies: + "@types/estree" "*" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-windows@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" + integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-hook@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz#8f84c9434888cc6b1d0a9d7092a76d239ebf0cc6" + integrity sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ== + dependencies: + append-transform "^2.0.0" + +istanbul-lib-instrument@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz#fa15401df6c15874bcb2105f773325d78c666765" + integrity sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q== + dependencies: + "@babel/core" "^7.23.9" + "@babel/parser" "^7.23.9" + "@istanbuljs/schema" "^0.1.3" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-processinfo@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/istanbul-lib-processinfo/-/istanbul-lib-processinfo-3.0.0.tgz#1b95ce9ccbac979a718de17ab33b940e2ce5b75f" + integrity sha512-P7nLXRRlo7Sqinty6lNa7+4o9jBUYGpqtejqCOZKfgXlRoxY/QArflcB86YO500Ahj4pDJEG34JjMRbQgePLnQ== + dependencies: + archy "^1.0.0" + cross-spawn "^7.0.3" + istanbul-lib-coverage "^3.2.0" + p-map "^3.0.0" + rimraf "^6.1.3" + uuid "^8.3.2" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz#895f3a709fcfba34c6de5a42939022f3e4358551" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.0.2: + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jackspeak@^3.1.2: + version "3.4.3" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a" + integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw== + dependencies: + "@isaacs/cliui" "^8.0.2" + optionalDependencies: + "@pkgjs/parseargs" "^0.11.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^2.2.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.2.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.2.0.tgz#7c265bd1b65de6977478300087c99f1c84383f62" + integrity sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +keyv@^4.5.4: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== + dependencies: + json-buffer "3.0.1" + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +linkify-it@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-5.0.0.tgz#9ef238bfa6dc70bd8e7f9572b52d369af569b421" + integrity sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ== + dependencies: + uc.micro "^2.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-6.0.0.tgz#55321eb309febbc59c4801d931a72452a681d286" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.flattendeep@^4.4.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" + integrity sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.1.0.tgz#3fbdbb95b4683ac9fc785111e792e558d4abd503" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +lru-cache@^10.2.0: + version "10.4.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119" + integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ== + +lru-cache@^11.0.0: + version "11.2.7" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.7.tgz#9127402617f34cd6767b96daee98c28e74458d35" + integrity sha512-aY/R+aEsRelme17KGQa/1ZSIpLpNYYrhcrepKTZgE+W3WM16YMCaPwOHLHsmopZHELU0Ojin1lPVxKR0MihncA== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lunr@^2.3.9: + version "2.3.9" + resolved "https://registry.yarnpkg.com/lunr/-/lunr-2.3.9.tgz#18b123142832337dd6e964df1a5a7707b25d35e1" + integrity sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow== + +magic-string@^0.30.21, magic-string@^0.30.3: + version "0.30.21" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.21.tgz#56763ec09a0fa8091df27879fd94d19078c00d91" + integrity sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ== + dependencies: + "@jridgewell/sourcemap-codec" "^1.5.5" + +make-dir@^3.0.0, make-dir@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== + dependencies: + semver "^7.5.3" + +make-error@^1.1.1: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== + +markdown-it@^14.1.1: + version "14.1.1" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-14.1.1.tgz#856f90b66fc39ae70affd25c1b18b581d7deee1f" + integrity sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA== + dependencies: + argparse "^2.0.1" + entities "^4.4.0" + linkify-it "^5.0.0" + mdurl "^2.0.0" + punycode.js "^2.3.1" + uc.micro "^2.1.0" + +mdurl@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-2.0.0.tgz#80676ec0433025dd3e17ee983d0fe8de5a2237e0" + integrity sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +minimalistic-assert@^1.0.0, minimalistic-assert@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz#2e194de044626d4a10e7f7fbc00ce73e83e4d5c7" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimalistic-crypto-utils@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" + integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg== + +minimatch@^10.2.2, minimatch@^10.2.4: + version "10.2.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.4.tgz#465b3accbd0218b8281f5301e27cedc697f96fde" + integrity sha512-oRjTw/97aTBN0RHbYCdtF1MQfvusSIBQM0IZEgzl6426+8jSC0nF1a/GmnVLpfB9yyr6g6FTqWqiZVbxrtaCIg== + dependencies: + brace-expansion "^5.0.2" + +minimatch@^9.0.4, minimatch@^9.0.5: + version "9.0.9" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.9.tgz#9b0cb9fcb78087f6fd7eababe2511c4d3d60574e" + integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg== + dependencies: + brace-expansion "^2.0.2" + +minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2, minipass@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b" + integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A== + +mocha@^11.7.5: + version "11.7.5" + resolved "https://registry.yarnpkg.com/mocha/-/mocha-11.7.5.tgz#58f5bbfa5e0211ce7e5ee6128107cefc2515a627" + integrity sha512-mTT6RgopEYABzXWFx+GcJ+ZQ32kp4fMf0xvpZIIfSq9Z8lC/++MtcCnQ9t5FP2veYEP95FIYSvW+U9fV4xrlig== + dependencies: + browser-stdout "^1.3.1" + chokidar "^4.0.1" + debug "^4.3.5" + diff "^7.0.0" + escape-string-regexp "^4.0.0" + find-up "^5.0.0" + glob "^10.4.5" + he "^1.2.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + log-symbols "^4.1.0" + minimatch "^9.0.5" + ms "^2.1.3" + picocolors "^1.1.1" + serialize-javascript "^6.0.2" + strip-json-comments "^3.1.1" + supports-color "^8.1.1" + workerpool "^9.2.0" + yargs "^17.7.2" + yargs-parser "^21.1.1" + yargs-unparser "^2.0.0" + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + +node-fetch@^2.6.1: + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== + dependencies: + whatwg-url "^5.0.0" + +node-fetch@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.2.tgz#d1e889bacdf733b4ff3b2b243eb7a12866a0b78b" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + +node-preload@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/node-preload/-/node-preload-0.2.1.tgz#c03043bb327f417a18fee7ab7ee57b408a144301" + integrity sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ== + dependencies: + process-on-spawn "^1.0.0" + +node-releases@^2.0.27: + version "2.0.36" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.36.tgz#99fd6552aaeda9e17c4713b57a63964a2e325e9d" + integrity sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA== + +nyc@^18.0.0: + version "18.0.0" + resolved "https://registry.yarnpkg.com/nyc/-/nyc-18.0.0.tgz#644c75c5cba4e8c571674016ac7f714fb143f20c" + integrity sha512-G5UyHinFkB1BxqGTrmZdB6uIYH0+v7ZnVssuflUDi+J+RhKWyAhRT1RCehBSI6jLFLuUUgFDyLt49mUtdO1XeQ== + dependencies: + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + caching-transform "^4.0.0" + convert-source-map "^1.7.0" + decamelize "^1.2.0" + find-cache-dir "^3.2.0" + find-up "^4.1.0" + foreground-child "^3.3.0" + get-package-type "^0.1.0" + glob "^13.0.6" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-hook "^3.0.0" + istanbul-lib-instrument "^6.0.2" + istanbul-lib-processinfo "^3.0.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.0.2" + make-dir "^3.0.0" + node-preload "^0.2.1" + p-map "^3.0.0" + process-on-spawn "^1.0.0" + resolve-from "^5.0.0" + rimraf "^6.1.3" + signal-exit "^3.0.2" + spawn-wrap "^3.0.0" + test-exclude "^8.0.0" + yargs "^15.0.2" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-5.0.0.tgz#83c8315c6785005e3bd021839411c9e110e6d834" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-map@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz#d704d9af8a2ba684e2600d9a215983d4141a979d" + integrity sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ== + dependencies: + aggregate-error "^3.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +package-hash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/package-hash/-/package-hash-4.0.0.tgz#3537f654665ec3cc38827387fc904c163c54f506" + integrity sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ== + dependencies: + graceful-fs "^4.1.15" + hasha "^5.0.0" + lodash.flattendeep "^4.4.0" + release-zalgo "^1.0.0" + +package-json-from-dist@^1.0.0, package-json-from-dist@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505" + integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw== + +pako@^2.0.4, pako@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" + integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-scurry@^1.11.1: + version "1.11.1" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2" + integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA== + dependencies: + lru-cache "^10.2.0" + minipass "^5.0.0 || ^6.0.2 || ^7.0.0" + +path-scurry@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-2.0.2.tgz#6be0d0ee02a10d9e0de7a98bae65e182c9061f85" + integrity sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg== + dependencies: + lru-cache "^11.0.0" + minipass "^7.1.2" + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +picomatch@^4.0.2, picomatch@^4.0.3: + version "4.0.4" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.4.tgz#fd6f5e00a143086e074dffe4c924b8fb293b0589" + integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== + +pkg-dir@^4.1.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz#6a31f88a4bad6c7adda253de12ba4edaea80ebcd" + integrity sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg== + dependencies: + fast-diff "^1.1.2" + +prettier@^3.8.1: + version "3.8.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.8.1.tgz#edf48977cf991558f4fcbd8a3ba6015ba2a3a173" + integrity sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg== + +process-on-spawn@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/process-on-spawn/-/process-on-spawn-1.0.0.tgz#95b05a23073d30a17acfdc92a440efd2baefdc93" + integrity sha512-1WsPDsUSMmZH5LeMLegqkPDrsGgsWwk1Exipy2hvB0o/F0ASzbpIctSCcZIK1ykJvtTJULEH+20WOFjMvGnCTg== + dependencies: + fromentries "^1.2.0" + +punycode.js@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode.js/-/punycode.js-2.3.1.tgz#6b53e56ad75588234e79f4affa90972c7dd8cdb7" + integrity sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA== + +punycode@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readdirp@^4.0.1: + version "4.1.2" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-4.1.2.tgz#eb85801435fbf2a7ee58f19e0921b068fc69948d" + integrity sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg== + +release-zalgo@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/release-zalgo/-/release-zalgo-1.0.0.tgz#09700b7e5074329739330e535c5a90fb67851730" + integrity sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA== + dependencies: + es6-error "^4.0.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve@^1.22.1: + version "1.22.6" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.6.tgz#dd209739eca3aef739c626fea1b4f3c506195362" + integrity sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@^6.1.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-6.1.3.tgz#afbee236b3bd2be331d4e7ce4493bac1718981af" + integrity sha512-LKg+Cr2ZF61fkcaK1UdkH2yEBBKnYjTyWzTJT6KNPcSPaiT7HSdhtMXQuN5wkTX0Xu72KQ1l8S42rlmexS2hSA== + dependencies: + glob "^13.0.3" + package-json-from-dist "^1.0.1" + +rollup-plugin-dts@^6.4.1: + version "6.4.1" + resolved "https://registry.yarnpkg.com/rollup-plugin-dts/-/rollup-plugin-dts-6.4.1.tgz#9bec10f1b796ed022f76ff799429123c33aa88b7" + integrity sha512-l//F3Zf7ID5GoOfLfD8kroBjQKEKpy1qfhtAdnpibFZMffPaylrg1CoDC2vGkPeTeyxUe4bVFCln2EFuL7IGGg== + dependencies: + "@jridgewell/remapping" "^2.3.5" + "@jridgewell/sourcemap-codec" "^1.5.5" + convert-source-map "^2.0.0" + magic-string "^0.30.21" + optionalDependencies: + "@babel/code-frame" "^7.29.0" + +rollup@^4.60.0: + version "4.60.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.60.0.tgz#d7d68c8cda873e96e08b2443505609b7e7be9eb8" + integrity sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ== + dependencies: + "@types/estree" "1.0.8" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.60.0" + "@rollup/rollup-android-arm64" "4.60.0" + "@rollup/rollup-darwin-arm64" "4.60.0" + "@rollup/rollup-darwin-x64" "4.60.0" + "@rollup/rollup-freebsd-arm64" "4.60.0" + "@rollup/rollup-freebsd-x64" "4.60.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.60.0" + "@rollup/rollup-linux-arm-musleabihf" "4.60.0" + "@rollup/rollup-linux-arm64-gnu" "4.60.0" + "@rollup/rollup-linux-arm64-musl" "4.60.0" + "@rollup/rollup-linux-loong64-gnu" "4.60.0" + "@rollup/rollup-linux-loong64-musl" "4.60.0" + "@rollup/rollup-linux-ppc64-gnu" "4.60.0" + "@rollup/rollup-linux-ppc64-musl" "4.60.0" + "@rollup/rollup-linux-riscv64-gnu" "4.60.0" + "@rollup/rollup-linux-riscv64-musl" "4.60.0" + "@rollup/rollup-linux-s390x-gnu" "4.60.0" + "@rollup/rollup-linux-x64-gnu" "4.60.0" + "@rollup/rollup-linux-x64-musl" "4.60.0" + "@rollup/rollup-openbsd-x64" "4.60.0" + "@rollup/rollup-openharmony-arm64" "4.60.0" + "@rollup/rollup-win32-arm64-msvc" "4.60.0" + "@rollup/rollup-win32-ia32-msvc" "4.60.0" + "@rollup/rollup-win32-x64-gnu" "4.60.0" + "@rollup/rollup-win32-x64-msvc" "4.60.0" + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +semver@^6.0.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.5.3: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +semver@^7.5.4, semver@^7.7.3: + version "7.7.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.4.tgz#28464e36060e991fa7a11d0279d2d3f3b57a7e8a" + integrity sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA== + +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^7.0.3: + version "7.0.4" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-7.0.4.tgz#c517735bd5b7631dd1fc191ee19cbb713ff8e05c" + integrity sha512-DuGdB+Po43Q5Jxwpzt1lhyFSYKryqoNjQSA9M92tyw0lyHIOur+XCalOUe0KTJpyqzT8+fQ5A0Jf7vCx/NKmIg== + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +signal-exit@^3.0.2: + version "3.0.7" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +signal-exit@^4.0.1: + version "4.1.0" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" + integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +smob@^1.0.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/smob/-/smob-1.4.0.tgz#ac9751fe54b1fc1fc8286a628d4e7f824273b95a" + integrity sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.6.0, source-map@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spawn-wrap@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-3.0.0.tgz#8f8c3e69e7f6afcf9404beacaa3241f645d6ea5c" + integrity sha512-z+s5vv4KzFPJVddGab0xX2n7kQPGMdNUX5l9T8EJqsXdKTWpcxmAqWHpsgHEXoC1taGBCc7b79bi62M5kdbrxQ== + dependencies: + cross-spawn "^7.0.6" + foreground-child "^2.0.0" + is-windows "^1.0.2" + make-dir "^3.0.0" + rimraf "^6.1.3" + signal-exit "^3.0.2" + which "^2.0.1" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +"string-width-cjs@npm:string-width@^4.2.0": + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string-width@^5.0.1, string-width@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" + integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== + dependencies: + eastasianwidth "^0.2.0" + emoji-regex "^9.2.2" + strip-ansi "^7.0.1" + +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz#d22a269522836a627af8d04b5c3fd2c7fa3e32e3" + integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w== + dependencies: + ansi-regex "^6.2.2" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +strip-outer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/strip-outer/-/strip-outer-1.0.1.tgz#b2fd2abf6604b9d1e6013057195df836b8a9d631" + integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== + dependencies: + escape-string-regexp "^1.0.2" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.1.1: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +synckit@^0.11.12: + version "0.11.12" + resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.11.12.tgz#abe74124264fbc00a48011b0d98bdc1cffb64a7b" + integrity sha512-Bh7QjT8/SuKUIfObSXNHNSK6WHo6J1tHCqJsuaFDP7gP0fkzSfTxI8y85JrppZ0h8l0maIgc2tfuZQ6/t3GtnQ== + dependencies: + "@pkgr/core" "^0.2.9" + +terser@^5.17.4: + version "5.19.4" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.19.4.tgz#941426fa482bf9b40a0308ab2b3cd0cf7c775ebd" + integrity sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-8.0.0.tgz#85891add3fa46bb822b1b1579c7f8c9a3d04ebd8" + integrity sha512-ZOffsNrXYggvU1mDGHk54I96r26P8SyMjO5slMKSc7+IWmtB/MQKnEC2fP51imB3/pT6YK5cT5E8f+Dd9KdyOQ== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^13.0.6" + minimatch "^10.2.2" + +tinyglobby@^0.2.15: + version "0.2.15" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" + integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.3" + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/trim-repeated/-/trim-repeated-1.0.0.tgz#e3646a2ea4e891312bf7eace6cfb05380bc01c21" + integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== + dependencies: + escape-string-regexp "^1.0.2" + +ts-api-utils@^2.4.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz#4acd4a155e22734990a5ed1fe9e97f113bcb37c1" + integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== + +ts-node@^10.9.2: + version "10.9.2" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" + integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== + dependencies: + "@cspotcode/source-map-support" "^0.8.0" + "@tsconfig/node10" "^1.0.7" + "@tsconfig/node12" "^1.0.7" + "@tsconfig/node14" "^1.0.0" + "@tsconfig/node16" "^1.0.2" + acorn "^8.4.1" + acorn-walk "^8.1.1" + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + v8-compile-cache-lib "^3.0.1" + yn "3.1.1" + +tsconfig-paths@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c" + integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg== + dependencies: + json5 "^2.2.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^2.0.3, tslib@^2.1.0: + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tslib@^2.8.1: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz#07b8203bfa7056c0657050e3ccd2c37730bab8f1" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-fest@^0.8.0: + version "0.8.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +typedoc@^0.28.18: + version "0.28.18" + resolved "https://registry.yarnpkg.com/typedoc/-/typedoc-0.28.18.tgz#f7578fd9aa3ace83db8cce9bf1e8d41b88ec0b94" + integrity sha512-NTWTUOFRQ9+SGKKTuWKUioUkjxNwtS3JDRPVKZAXGHZy2wCA8bdv2iJiyeePn0xkmK+TCCqZFT0X7+2+FLjngA== + dependencies: + "@gerrit0/mini-shiki" "^3.23.0" + lunr "^2.3.9" + markdown-it "^14.1.1" + minimatch "^10.2.4" + yaml "^2.8.2" + +typescript@~5.9.0: + version "5.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== + +uc.micro@^2.0.0, uc.micro@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-2.1.0.tgz#f8d3f7d0ec4c3dea35a7e3c8efa4cb8b45c9e7ee" + integrity sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A== + +undici-types@~7.18.0: + version "7.18.2" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-7.18.2.tgz#29357a89e7b7ca4aef3bf0fd3fd0cd73884229e9" + integrity sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w== + +universalify@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== + +update-browserslist-db@^1.2.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz#64d76db58713136acbeb4c49114366cc6cc2e80d" + integrity sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache-lib@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" + integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== + +web-streams-polyfill@^3.0.3: + version "3.3.3" + resolved "https://registry.yarnpkg.com/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz#2073b91a2fdb1fbfbd401e7de0ac9f8214cecb4b" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +workerpool@^9.2.0: + version "9.3.4" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-9.3.4.tgz#f6c92395b2141afd78e2a889e80cb338fe9fca41" + integrity sha512-TmPRQYYSAnnDiEB0P/Ytip7bFGvqnSU6I2BcuSw7Hx+JSg/DsUi5ebYfc8GYaSdpuvOcEs6dXxPurOYpe9QFwg== + +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" + integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== + dependencies: + ansi-styles "^6.1.0" + string-width "^5.0.1" + strip-ansi "^7.0.1" + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-3.0.3.tgz#56bd5c5a5c70481cd19c571bd39ab965a5de56e8" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^2.8.2: + version "2.8.3" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.8.3.tgz#a0d6bd2efb3dd03c59370223701834e60409bd7d" + integrity sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg== + +yargs-parser@^18.1.2: + version "18.1.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" + integrity sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs-unparser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/yargs-unparser/-/yargs-unparser-2.0.0.tgz#f131f9226911ae5d9ad38c432fe809366c2325eb" + integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== + dependencies: + camelcase "^6.0.0" + decamelize "^4.0.0" + flat "^5.0.2" + is-plain-obj "^2.1.0" + +yargs@^15.0.2: + version "15.4.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8" + integrity sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A== + dependencies: + cliui "^6.0.0" + decamelize "^1.2.0" + find-up "^4.1.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^4.2.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^18.1.2" + +yargs@^17.7.2: + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + 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" + +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== From e89e49254c7f5ce13d7576ead39a88c885092571 Mon Sep 17 00:00:00 2001 From: on-a-t-break Date: Mon, 31 Aug 2026 22:09:14 -0700 Subject: [PATCH 02/22] Initial release of the TackleBox wallet plugin for Wharfkit A WalletPlugin for @wharfkit/session that logs in and signs transactions with TackleBox over the anchor-link protocol it speaks: ESR identity requests presented paste-first (QR, copy button and esr: link), buoy callbacks, and sealed transaction requests pushed straight into the wallet's announced channel, with a manual QR/paste fallback when no channel exists. Based on the wharfkit/wallet-plugin-template structure and modeled on wharfkit/wallet-plugin-anchor (BSD-3-Clause, Greymass Inc). Co-Authored-By: Claude Fable 5 --- .../wallet-plugin-tacklebox/.editorconfig | 12 + packages/wallet-plugin-tacklebox/.eslintrc | 28 + .../wallet-plugin-tacklebox/.gitattributes | 1 + .../.github/workflows/test.yml | 25 + packages/wallet-plugin-tacklebox/.gitignore | 3 + packages/wallet-plugin-tacklebox/.mocharc.js | 11 + packages/wallet-plugin-tacklebox/.prettierrc | 8 + packages/wallet-plugin-tacklebox/LICENSE | 31 + packages/wallet-plugin-tacklebox/Makefile | 34 + packages/wallet-plugin-tacklebox/README.md | 99 + .../wallet-plugin-tacklebox/package-lock.json | 4933 +++++++++++++++++ packages/wallet-plugin-tacklebox/package.json | 66 + .../wallet-plugin-tacklebox/rollup.config.js | 52 + packages/wallet-plugin-tacklebox/src/index.ts | 404 ++ packages/wallet-plugin-tacklebox/src/logo.ts | 10 + .../src/translations/en.json | 25 + .../src/translations/index.ts | 5 + ...1de03f2a7ee6c133465c8c6b2b286704a5d8f.json | 33 + ...14e8a151304a30043198b7b9e9df34a14aaeb.json | 18 + .../test/tests/common.ts | 51 + .../test/tests/login.ts | 155 + .../test/tests/sign.ts | 149 + .../test/tsconfig.json | 18 + .../test/utils/mock-esr.ts | 88 + .../test/utils/mock-ui.ts | 88 + .../wallet-plugin-tacklebox/tsconfig.json | 18 + 26 files changed, 6365 insertions(+) create mode 100644 packages/wallet-plugin-tacklebox/.editorconfig create mode 100644 packages/wallet-plugin-tacklebox/.eslintrc create mode 100644 packages/wallet-plugin-tacklebox/.gitattributes create mode 100644 packages/wallet-plugin-tacklebox/.github/workflows/test.yml create mode 100644 packages/wallet-plugin-tacklebox/.gitignore create mode 100644 packages/wallet-plugin-tacklebox/.mocharc.js create mode 100644 packages/wallet-plugin-tacklebox/.prettierrc create mode 100644 packages/wallet-plugin-tacklebox/LICENSE create mode 100644 packages/wallet-plugin-tacklebox/Makefile create mode 100644 packages/wallet-plugin-tacklebox/README.md create mode 100644 packages/wallet-plugin-tacklebox/package-lock.json create mode 100644 packages/wallet-plugin-tacklebox/package.json create mode 100644 packages/wallet-plugin-tacklebox/rollup.config.js create mode 100644 packages/wallet-plugin-tacklebox/src/index.ts create mode 100644 packages/wallet-plugin-tacklebox/src/logo.ts create mode 100644 packages/wallet-plugin-tacklebox/src/translations/en.json create mode 100644 packages/wallet-plugin-tacklebox/src/translations/index.ts create mode 100644 packages/wallet-plugin-tacklebox/test/data/a041de03f2a7ee6c133465c8c6b2b286704a5d8f.json create mode 100644 packages/wallet-plugin-tacklebox/test/data/ed314e8a151304a30043198b7b9e9df34a14aaeb.json create mode 100644 packages/wallet-plugin-tacklebox/test/tests/common.ts create mode 100644 packages/wallet-plugin-tacklebox/test/tests/login.ts create mode 100644 packages/wallet-plugin-tacklebox/test/tests/sign.ts create mode 100644 packages/wallet-plugin-tacklebox/test/tsconfig.json create mode 100644 packages/wallet-plugin-tacklebox/test/utils/mock-esr.ts create mode 100644 packages/wallet-plugin-tacklebox/test/utils/mock-ui.ts create mode 100644 packages/wallet-plugin-tacklebox/tsconfig.json diff --git a/packages/wallet-plugin-tacklebox/.editorconfig b/packages/wallet-plugin-tacklebox/.editorconfig new file mode 100644 index 00000000..779f99a1 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +indent_style = space +indent_size = 4 +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/packages/wallet-plugin-tacklebox/.eslintrc b/packages/wallet-plugin-tacklebox/.eslintrc new file mode 100644 index 00000000..dd19f97a --- /dev/null +++ b/packages/wallet-plugin-tacklebox/.eslintrc @@ -0,0 +1,28 @@ +{ + "root": true, + "ignorePatterns": ["lib/*", "node_modules/**"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "plugin:prettier/recommended" + ], + "rules": { + "prettier/prettier": "warn", + "no-console": "warn", + "sort-imports": [ + "warn", + { + "ignoreCase": true, + "ignoreDeclarationSort": true + } + ], + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/no-namespace": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-empty-function": "warn", + "@typescript-eslint/no-unused-vars": ["warn", {"caughtErrors": "none"}], + "no-inner-declarations": "off" + } +} diff --git a/packages/wallet-plugin-tacklebox/.gitattributes b/packages/wallet-plugin-tacklebox/.gitattributes new file mode 100644 index 00000000..6313b56c --- /dev/null +++ b/packages/wallet-plugin-tacklebox/.gitattributes @@ -0,0 +1 @@ +* text=auto eol=lf diff --git a/packages/wallet-plugin-tacklebox/.github/workflows/test.yml b/packages/wallet-plugin-tacklebox/.github/workflows/test.yml new file mode 100644 index 00000000..c91d42d1 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/.github/workflows/test.yml @@ -0,0 +1,25 @@ +name: Tests +on: push +jobs: + test: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + node-version: [18, 20, 22] + name: Node.js v${{ matrix.node-version }} + steps: + - name: Checkout code + uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + - name: Install dependencies + run: npm ci --ignore-scripts + - name: Build + run: npm run build + - name: Run checks + run: npm run lint + - name: Run tests + run: npm test diff --git a/packages/wallet-plugin-tacklebox/.gitignore b/packages/wallet-plugin-tacklebox/.gitignore new file mode 100644 index 00000000..ae18ac9b --- /dev/null +++ b/packages/wallet-plugin-tacklebox/.gitignore @@ -0,0 +1,3 @@ +node_modules/ +lib/ +build/ diff --git a/packages/wallet-plugin-tacklebox/.mocharc.js b/packages/wallet-plugin-tacklebox/.mocharc.js new file mode 100644 index 00000000..1f2e9425 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/.mocharc.js @@ -0,0 +1,11 @@ +process.env.TS_NODE_PROJECT = process.env.TS_NODE_PROJECT || './test/tsconfig.json' +process.env.MOCK_DIR = process.env.MOCK_DIR || './test/data' + +module.exports = { + ui: 'tdd', + require: ['ts-node/register', 'tsconfig-paths/register'], + extension: ['ts'], + spec: ['test/tests/**/*.ts'], + timeout: 120000, + slow: 5000, +} diff --git a/packages/wallet-plugin-tacklebox/.prettierrc b/packages/wallet-plugin-tacklebox/.prettierrc new file mode 100644 index 00000000..1fa71917 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/.prettierrc @@ -0,0 +1,8 @@ +arrowParens: "always" +bracketSpacing: false +endOfLine: "lf" +printWidth: 100 +semi: false +singleQuote: true +tabWidth: 4 +trailingComma: "es5" diff --git a/packages/wallet-plugin-tacklebox/LICENSE b/packages/wallet-plugin-tacklebox/LICENSE new file mode 100644 index 00000000..dfc3fea0 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/LICENSE @@ -0,0 +1,31 @@ +Copyright (c) 2026 on-a-t-break. All Rights Reserved. +Copyright (c) 2023 Greymass Inc. All Rights Reserved. + +Portions of this software are derived from the Wharfkit wallet plugin template +and the Anchor wallet plugin (https://github.com/wharfkit), used under the +BSD-3-Clause license. + +Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + +1. Redistribution of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +2. Redistribution in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/packages/wallet-plugin-tacklebox/Makefile b/packages/wallet-plugin-tacklebox/Makefile new file mode 100644 index 00000000..f76dc75e --- /dev/null +++ b/packages/wallet-plugin-tacklebox/Makefile @@ -0,0 +1,34 @@ +SHELL := /bin/bash +SRC_FILES := $(shell find src -name '*.ts' -o -name '*.json') +TEST_FILES := $(shell find test -name '*.ts') +BIN := ./node_modules/.bin + +lib: ${SRC_FILES} package.json tsconfig.json node_modules rollup.config.js + @${BIN}/rollup -c && touch lib + +.PHONY: test +test: node_modules + @npm test + +.PHONY: coverage +coverage: node_modules + @npm run coverage + +.PHONY: check +check: node_modules + @npm run lint && echo "Ok" + +.PHONY: format +format: node_modules + @npm run format + +node_modules: + npm install + +.PHONY: clean +clean: + rm -rf lib/ build/ + +.PHONY: distclean +distclean: clean + rm -rf node_modules/ diff --git a/packages/wallet-plugin-tacklebox/README.md b/packages/wallet-plugin-tacklebox/README.md new file mode 100644 index 00000000..5afd0ce9 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/README.md @@ -0,0 +1,99 @@ +# wallet-plugin-tacklebox + +A `WalletPlugin` for use with [`@wharfkit/session`](https://github.com/wharfkit/session) that lets +dapps login and sign transactions with [TackleBox](https://github.com/on-a-t-break/tacklebox), +the native wallet and block explorer for Antelope blockchains (EOS/Vaulta, WAX, Telos, and +friends). + +> TackleBox's dapp-link support is currently marked **experimental** in the wallet itself. The +> protocol is the anchor-link protocol (ESR identity requests, buoy callbacks, sealed push +> channels), so this plugin will keep working as the wallet feature matures. + +## How it works + +TackleBox is a desktop-first native app that does not register an `esr://` URL handler, so the +flow is paste-first: + +1. **Login** — the plugin renders an ESR identity request as a QR code, a **Copy login request** + button and an `esr:` link. The user pastes it into TackleBox under + **Contracts → ESR → CONNECT AS LOGIN** (or scans the QR with TackleBox on another device) and + approves the connection. TackleBox answers over a [buoy](https://github.com/greymass/buoy) + callback and announces its sealed push channel (`link_ch` / `link_key` / `link_name`). +2. **Transact** — signing requests are sealed to the wallet's session key and pushed straight + into TackleBox over that channel. Every request still passes TackleBox's whitelist guard, + contract-hash verification and signing review before a signature is produced and returned via + callback. A **Sign manually instead** fallback shows the request as QR/copyable text. + +## Installation + +Not yet published to npm; install straight from the repository: + +```bash +npm install github:on-a-t-break/wallet-plugin-tacklebox +``` + +Once published: `npm install wallet-plugin-tacklebox`. + +## Usage + +Include the plugin in the `walletPlugins` list when initializing the `SessionKit`: + +```ts +import {SessionKit} from '@wharfkit/session' +import {WebRenderer} from '@wharfkit/web-renderer' +import {WalletPluginTackleBox} from 'wallet-plugin-tacklebox' + +const sessionKit = new SessionKit({ + appName: 'myapp', + chains: [ + { + id: 'aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906', + url: 'https://eos.greymass.com', + }, + ], + ui: new WebRenderer(), + walletPlugins: [new WalletPluginTackleBox()], +}) + +const {session} = await sessionKit.login() +await session.transact({action}) +``` + +### Options + +```ts +new WalletPluginTackleBox({ + // Buoy callback-forwarder used for this dapp's callbacks. + // TackleBox's own listening channel is announced by the wallet at login. + buoyUrl: 'https://cb.anchor.link', + // WebSocket constructor override (defaults to isomorphic-ws). + buoyWs: WebSocket, +}) +``` + +## Developing + +You need [Node.js](https://nodejs.org/) 18 or newer. + +```bash +npm install # install dependencies (also builds lib/) +npm run build # bundle to lib/ (cjs, esm and types) +npm test # run the mocha test suite +npm run lint # eslint + prettier checks +``` + +A `Makefile` with the same targets (`make lib`, `make test`, `make check`) is included for +consistency with the rest of the Wharfkit ecosystem. + +Tests replay recorded API responses from `test/data`; delete a file there to re-record it +against a live endpoint. + +## Credits + +Based on the [Wharfkit wallet plugin template](https://github.com/wharfkit/wallet-plugin-template) +and modeled on the [Anchor wallet plugin](https://github.com/wharfkit/wallet-plugin-anchor) by +[Greymass](https://greymass.com), whose anchor-link protocol TackleBox speaks. + +## License + +[BSD-3-Clause](./LICENSE) diff --git a/packages/wallet-plugin-tacklebox/package-lock.json b/packages/wallet-plugin-tacklebox/package-lock.json new file mode 100644 index 00000000..a3502ccf --- /dev/null +++ b/packages/wallet-plugin-tacklebox/package-lock.json @@ -0,0 +1,4933 @@ +{ + "name": "wallet-plugin-tacklebox", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "wallet-plugin-tacklebox", + "version": "0.1.0", + "license": "BSD-3-Clause", + "dependencies": { + "@greymass/buoy": "^1.0.3", + "@wharfkit/antelope": "^1.0.5", + "@wharfkit/protocol-esr": "^1.6.1", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.1.0", + "ws": "^8.13.0" + }, + "devDependencies": { + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-typescript": "^10.0.1", + "@types/chai": "^4.3.1", + "@types/mocha": "^9.0.0", + "@types/node": "^18.7.18", + "@typescript-eslint/eslint-plugin": "^5.20.0", + "@typescript-eslint/parser": "^5.20.0", + "@wharfkit/mock-data": "^1.3.0", + "@wharfkit/session": "^1.7.0", + "chai": "^4.3.4", + "eslint": "^8.13.0", + "eslint-config-prettier": "^8.1.0", + "eslint-plugin-prettier": "^4.0.0", + "mocha": "^10.0.0", + "nyc": "^15.1.0", + "pako": "^2.1.0", + "prettier": "^2.2.1", + "rollup": "^2.70.2", + "rollup-plugin-dts": "^4.2.1", + "sinon": "^15.0.1", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.1.1", + "typescript": "^4.9.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@wharfkit/session": "^1.7.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.29.7", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/template": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.8.tgz", + "integrity": "sha512-I5z7H3bf/41ktsNVLtpN0wAa336HkqIHQ5BuPLEhTkt1jVSyZpeNKIzTgEWmlxjdg81R0IgUCcaE+Ok3NvrfZg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.8", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.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" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@greymass/buoy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@greymass/buoy/-/buoy-1.0.4.tgz", + "integrity": "sha512-/O9EsjWJw81TiJcvKqMKxjrJpEfHKh8WcUK07gFT+uS0+JUKfoVrYVQn1qNOAdYWU+AZrhZJop8xP/LYmKfGHg==", + "license": "BSD-3-Clause", + "dependencies": { + "eventemitter3": "^4.0.7", + "tslib": "^2.1.0" + } + }, + "node_modules/@greymass/miniaes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@greymass/miniaes/-/miniaes-1.0.0.tgz", + "integrity": "sha512-xKYTnAyyoq3gpJS11JvU4dkju28M8Zbp06CuP3aKR4DMH6B2z64LauGGGzKksKh5Qd770JA/dzhLbImnBlymbg==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.3", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { + "version": "3.15.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.15.2.tgz", + "integrity": "sha512-6EuL879VkRA+1Cz578mKMiKvjPNEuk6+r1JaFzoSWejZmtf7xWbIyw1e3KkxlkzTIt9Taw6JBhEppG7utc1P+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.6.tgz", + "integrity": "sha512-+Sg6GCR/wy1oSmQDFq4LQDAhm3ETKnorxN+y5nbLULOR3P0c14f2Wurzj3/xqPXtasLFfHd5iRFQ7AJt4KH2cw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/plugin-json": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-4.1.0.tgz", + "integrity": "sha512-yfLbTdNS6amI/2OpmbiBoW12vngr5NW2jCJVZSBEz+H5KfUJZ2M7sDjk0U6GOOdCWFVScShte29o9NezJ53TPw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^3.0.8" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/plugin-typescript": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-10.0.1.tgz", + "integrity": "sha512-wBykxRLlX7EzL8BmUqMqk5zpx2onnmRMSw/l9M1sVfkJvdwfxogZQVNUM9gVMJbjRLDR5H6U0OMOrlDGmIV45A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "resolve": "^1.22.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^2.14.0||^3.0.0", + "tslib": "*", + "typescript": ">=3.7.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + }, + "tslib": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript/node_modules/@rollup/pluginutils": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.4.0.tgz", + "integrity": "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-typescript/node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-typescript/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/plugin-typescript/node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@sinonjs/commons": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", + "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/commons/node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", + "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0" + } + }, + "node_modules/@sinonjs/samsam": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-8.0.3.tgz", + "integrity": "sha512-hw6HbX+GyVZzmaYNh82Ecj1vdGZrqVIn/keDTg63IgAwiQPO+xCz99uG6Woqgb4tM0mUiFENKZ4cqd7IX94AXQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1", + "type-detect": "^4.1.0" + } + }, + "node_modules/@sinonjs/text-encoding": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", + "deprecated": "Deprecated: no longer maintained and no longer used by Sinon packages. See\n https://github.com/sinonjs/nise/issues/243 for replacement details.", + "dev": true, + "license": "(Unlicense OR Apache-2.0)" + }, + "node_modules/@tsconfig/node10": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.13.tgz", + "integrity": "sha512-gcLdvR9HO1ZJBypsOGqaP6TFEzb6vIta0KSTLt9NAQ6pXQO3cRgSVyCN6pzYqI9DlJgY71XKO0dpDhCf08b3pg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true, + "license": "MIT" + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "4.3.20", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.20.tgz", + "integrity": "sha512-/pC9HAB5I/xMlc5FP77qjCnI16ChlJfW0tGa0IUcFn38VJrTV6DeZ60NU5KZBtaOZqjdpwTWohz5HU1RrhiYxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "18.19.130", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", + "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/semver": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.8.0.tgz", + "integrity": "sha512-1mAINjtQCXXeLkJ9ehXkwOcBpqtLxiVtKhpUf83DdRNdQKV0iXZpaHYqRr7nj+wvxuJzoAmAwXI+sCNMv1CzLQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", + "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz", + "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/@wharfkit/abicache": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@wharfkit/abicache/-/abicache-1.2.4.tgz", + "integrity": "sha512-DeIPotkMyOXZgLFOmmTXXbynNE1OF2bbEQlaUrqB1kGmNL3WJB1Y09NZ3huvFJylfqD928ZqIdGxB4KJ3iIcGw==", + "license": "BSD-3-Clause", + "dependencies": { + "@wharfkit/antelope": "^1.0.2", + "@wharfkit/signing-request": "^3.1.0", + "pako": "^2.0.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@wharfkit/antelope": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@wharfkit/antelope/-/antelope-1.2.0.tgz", + "integrity": "sha512-9q0nvM8yUtjKTQlukKZODAhUN2S2/cfSlIYdh2mPnaOCSH8KOLJ2gYCPuQVvH1FE9AKu312lM5TzhkRccf1VjQ==", + "license": "BSD-3-Clause-No-Military-License", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "elliptic": "^6.5.4", + "hash.js": "^1.0.0", + "pako": "^2.1.0", + "tslib": "^2.0.3" + } + }, + "node_modules/@wharfkit/common": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@wharfkit/common/-/common-1.5.0.tgz", + "integrity": "sha512-eqXkOy+vshcEzK8kED+EsoTPJjlBKHYglgV9CBnZQgIlGrWIRXWH4YaXH3W7EbI/nCRJCaNqxm5fC+pgpFcp8g==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@wharfkit/antelope": "^1.0.0" + } + }, + "node_modules/@wharfkit/mock-data": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@wharfkit/mock-data/-/mock-data-1.3.1.tgz", + "integrity": "sha512-V+VRu07wCGLmxc6bPXKCavcHaEsFvMDlK4Q0sFJglwo4fsHr7dww6XsCoOGltY/XC1c0XpzeQ6v6eM352v95sA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@wharfkit/antelope": "^1.0.5", + "@wharfkit/session": "^1.2.7", + "@wharfkit/wallet-plugin-privatekey": "^1.1.0", + "node-fetch": "^2.6.1", + "tslib": "^2.1.0" + } + }, + "node_modules/@wharfkit/protocol-esr": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@wharfkit/protocol-esr/-/protocol-esr-1.6.1.tgz", + "integrity": "sha512-m6B28f56Jh+CEB/MI6VkdR+3sMihsdbQULCM5wg17DsorNBXbpwVGsAzJonmLrymhbp8sUDUkXlq0yWqoX7tuQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@greymass/buoy": "^1.0.3", + "@wharfkit/antelope": "^1.1.0", + "@wharfkit/sealed-messages": "^1.2.0", + "isomorphic-ws": "^5.0.0", + "ws": "^8.13.0" + }, + "peerDependencies": { + "@wharfkit/session": "^1.2.7" + } + }, + "node_modules/@wharfkit/sealed-messages": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@wharfkit/sealed-messages/-/sealed-messages-1.2.0.tgz", + "integrity": "sha512-AnJJY1U6gOLyhcw7HTJUb0t6uSb/cO3FACuOMnKBmKtp8AFrhEDntwgm5yF8kBh/eoreLDvILlAPANOsig8JGA==", + "license": "BSD-3-Clause", + "dependencies": { + "@greymass/miniaes": "^1.0.0", + "@wharfkit/antelope": "^1.1.0" + } + }, + "node_modules/@wharfkit/session": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@wharfkit/session/-/session-1.7.0.tgz", + "integrity": "sha512-mLfa62RAqk2o05P7qkp8TScRrN7mlimxHy92E5QEiQHpvIVz/KacZmjMBpWd0SueqrWGdpMbjx4WkjypPcRWgg==", + "license": "BSD-3-Clause", + "dependencies": { + "@wharfkit/abicache": "^1.2.1", + "@wharfkit/antelope": "^1.0.11", + "@wharfkit/common": "^1.2.0", + "@wharfkit/signing-request": "^3.1.0", + "pako": "^2.0.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@wharfkit/signing-request": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@wharfkit/signing-request/-/signing-request-3.4.0.tgz", + "integrity": "sha512-WstXfmR9i5pKaYXDUwNFNCgBIvN6u5IRGWSfj5O3XzthbtJUmRoJNtjGMaNnUqZ1MMx5YY4/JpY3b2e6LbpXLw==", + "license": "MIT", + "dependencies": { + "@wharfkit/antelope": "^1.1.1", + "tslib": "^2.0.3" + } + }, + "node_modules/@wharfkit/wallet-plugin-privatekey": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@wharfkit/wallet-plugin-privatekey/-/wallet-plugin-privatekey-1.1.0.tgz", + "integrity": "sha512-45LPj7AOVDm4RugDEhy0fnQX/BcMffeJPjGUCUrLazJ2S0Sti8nNk4nqiJqyme84c/0gq7d65vvwlmVfGtPVEg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@wharfkit/session": "^1.1.0" + } + }, + "node_modules/acorn": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz", + "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.5", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.5.tgz", + "integrity": "sha512-HEHNfbars9v4pgpW6SO1KSPkfoS0xVOM/9UzkJltjlsHZmJasxg8aXkuZa7SMf8vKGIBhpUsPluQSqhJFCqebw==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/append-transform": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-2.0.0.tgz", + "integrity": "sha512-7yeyCEurROLQJFv5Xj4lEGTy0borxepjFv1g22oAdqFu//SrAlDl1O1Nxx15SH1RoliUml6p8dwJW9jvZughhg==", + "dev": true, + "license": "MIT", + "dependencies": { + "default-require-extensions": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true, + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.11.20", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz", + "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.cjs" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bn.js": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.18", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", + "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" + }, + "node_modules/browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true, + "license": "ISC" + }, + "node_modules/browserslist": { + "version": "4.28.8", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.8.tgz", + "integrity": "sha512-V2NpofLblG64mfOtSgDhOJESZEGogzDMBv/q+W6oc4LXWP/q75eOXoOaaOu1EOadB9U4Bwx/e0yzbvwKH8zalA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.11.12", + "caniuse-lite": "^1.0.30001809", + "electron-to-chromium": "^1.5.402", + "node-releases": "^2.0.53", + "update-browserslist-db": "^1.3.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/caching-transform": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", + "integrity": "sha512-kpqOvwXnjjN44D89K5ccQC+RUrsy7jB/XLlRrx0D7/2HNcTPqzsb6XgYoErwko6QsV184CA2YgS1fxDiiDZMWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasha": "^5.0.0", + "make-dir": "^3.0.0", + "package-hash": "^4.0.0", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001810", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz", + "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chai": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", + "pathval": "^1.1.1", + "type-detect": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/check-error": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.2" + }, + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true, + "license": "MIT" + }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-eql": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.4.tgz", + "integrity": "sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-detect": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/default-require-extensions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "strip-bom": "^4.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/diff": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.2.tgz", + "integrity": "sha512-vtcDfH3TOjP8UekytvnHH1o1P4FcUdt4eQ1Y+Abap1tk/OB2MWQvcwS2ClCd1zuIhc3JKOx6p3kod8Vfys3E+A==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.418", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.418.tgz", + "integrity": "sha512-UzS26r3AEbG5wSoGVpJKqwHIU9zwQN7LHdVIThDrJpS0I5KdlXFMEb8543fhc9dVnIIAST6ar8rhwa00AL5MlA==", + "dev": true, + "license": "ISC" + }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es6-error": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", + "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.10.2", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.2.tgz", + "integrity": "sha512-/IGJ6+Dka158JnP5n5YFMOszjDWrXggGz1LaK/guZq9vZTmniaKlHcsscvkAhn9y4U+BU3JuUdYvtAMcv30y4A==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.5.tgz", + "integrity": "sha512-9Ni+xgemM2IWLq6aXEpP2+V/V30GeA/46Ar629vcMqVPodFFWC9skHu/D1phvuqtS8bJCFnNf01/qcmqYEwNfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.7.0.tgz", + "integrity": "sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==", + "dev": true, + "license": "MIT" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "license": "MIT" + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fastq": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "license": "MIT", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.4.4", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.4.tgz", + "integrity": "sha512-5+ybhBZANEJxaH3X5evAFatUxLfEHSr7n6kYJ+1Qd0mUqr4eu9gIf6GDbWHf8RJijHrjjO8G+la14SlL2SeS1Q==", + "dev": true, + "license": "ISC" + }, + "node_modules/foreground-child": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-2.0.0.tgz", + "integrity": "sha512-dCIq9FpEcyQyXKCkyzmlPTFNgrCzPudOe+mhvJU5zAtlBnGVy2yKxtfsxK2tQBThwq225jcvBjpw1Gr40uzZCA==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/fromentries": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fromentries/-/fromentries-1.3.2.tgz", + "integrity": "sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true, + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-func-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/glob": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true, + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hasha": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", + "integrity": "sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-stream": "^2.0.0", + "type-fest": "^0.8.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasha/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "dev": true, + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "dev": true, + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.16.2", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.2.tgz", + "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "hasown": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "license": "MIT", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-hook": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-3.0.0.tgz", + "integrity": "sha512-Pt/uge1Q9s+5VAZ+pCo16TYMWPBIl+oaNIjgLQxcX0itS6ueeaA+pEfThZpH8WxhFgCiEb8sAJY6MdUKgiIWaQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "append-transform": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-processinfo": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-processinfo/-/istanbul-lib-processinfo-2.0.3.tgz", + "integrity": "sha512-NkwHbo3E00oybX6NGJi6ar0B29vxyvNwoC7eJ4G4Yq28UfY758Hgn/heV8VRFhevPED4LXfFz0DQ8z/0kw9zMg==", + "dev": true, + "license": "ISC", + "dependencies": { + "archy": "^1.0.0", + "cross-spawn": "^7.0.3", + "istanbul-lib-coverage": "^3.2.0", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^4.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-reports": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", + "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/just-extend": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-6.2.0.tgz", + "integrity": "sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/loupe": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.7.tgz", + "integrity": "sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==", + "dev": true, + "license": "MIT", + "dependencies": { + "get-func-name": "^2.0.1" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.26.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", + "integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", + "dev": true, + "license": "MIT", + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true, + "license": "ISC" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "license": "MIT" + }, + "node_modules/minimatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mocha": { + "version": "10.8.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.8.2.tgz", + "integrity": "sha512-VZlYo/WE8t1tstuRmqgeyBgCbJc/lEdopaa+axcKzTBJ+UIdlAB9XnmvTCAH4pwR4ElNInaedhEBmZD8iCSVEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-colors": "^4.1.3", + "browser-stdout": "^1.3.1", + "chokidar": "^3.5.3", + "debug": "^4.3.5", + "diff": "^5.2.0", + "escape-string-regexp": "^4.0.0", + "find-up": "^5.0.0", + "glob": "^8.1.0", + "he": "^1.2.0", + "js-yaml": "^4.1.0", + "log-symbols": "^4.1.0", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "serialize-javascript": "^6.0.2", + "strip-json-comments": "^3.1.1", + "supports-color": "^8.1.1", + "workerpool": "^6.5.1", + "yargs": "^16.2.0", + "yargs-parser": "^20.2.9", + "yargs-unparser": "^2.0.0" + }, + "bin": { + "_mocha": "bin/_mocha", + "mocha": "bin/mocha.js" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/mocha/node_modules/brace-expansion": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", + "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/mocha/node_modules/minimatch": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.9.tgz", + "integrity": "sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mocha/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/nise": { + "version": "5.1.9", + "resolved": "https://registry.npmjs.org/nise/-/nise-5.1.9.tgz", + "integrity": "sha512-qOnoujW4SV6e40dYxJOb3uvuoPHtmLzIk4TFo+j0jPJoC+5Z9xja5qH5JZobEPsa8+YYphMrOSwnrshEhG2qww==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^11.2.2", + "@sinonjs/text-encoding": "^0.7.2", + "just-extend": "^6.2.0", + "path-to-regexp": "^6.2.1" + } + }, + "node_modules/nise/node_modules/@sinonjs/fake-timers": { + "version": "11.3.1", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-11.3.1.tgz", + "integrity": "sha512-EVJO7nW5M/F5Tur0Rf2z/QoMo+1Ia963RiMtapiQrEWvY0iBUvADo8Beegwjpnle5BHkyHuoxSTW3jF43H1XRA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.1" + } + }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, + "node_modules/node-preload": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/node-preload/-/node-preload-0.2.1.tgz", + "integrity": "sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "process-on-spawn": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/node-releases": { + "version": "2.0.54", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz", + "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nyc": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", + "integrity": "sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "caching-transform": "^4.0.0", + "convert-source-map": "^1.7.0", + "decamelize": "^1.2.0", + "find-cache-dir": "^3.2.0", + "find-up": "^4.1.0", + "foreground-child": "^2.0.0", + "get-package-type": "^0.1.0", + "glob": "^7.1.6", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-hook": "^3.0.0", + "istanbul-lib-instrument": "^4.0.0", + "istanbul-lib-processinfo": "^2.0.2", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.2", + "make-dir": "^3.0.0", + "node-preload": "^0.2.1", + "p-map": "^3.0.0", + "process-on-spawn": "^1.0.0", + "resolve-from": "^5.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "spawn-wrap": "^2.0.0", + "test-exclude": "^6.0.0", + "yargs": "^15.0.2" + }, + "bin": { + "nyc": "bin/nyc.js" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/nyc/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/nyc/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/nyc/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nyc/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/nyc/node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nyc/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "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.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-hash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-4.0.0.tgz", + "integrity": "sha512-whdkPIooSu/bASggZ96BWVvZTRMOFxnyUG5PnTSGKoJE2gd5mbVNmR2Nj20QFzxYYgAXpoqC+AiXzl+UMRh7zQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "graceful-fs": "^4.1.15", + "hasha": "^5.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pako": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.2.0.tgz", + "integrity": "sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "(MIT AND Zlib)" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/process-on-spawn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/process-on-spawn/-/process-on-spawn-1.1.0.tgz", + "integrity": "sha512-JOnOPQ/8TZgjs1JIH/m9ni7FfimjNa/PRx7y/Wb5qdItsnhO0jE4AT7fC0HjC28DUQWDr50dwSYZLdRMlqDq3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "fromentries": "^1.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha512-gUAyHVHPPC5wdqX/LG4LWtRYtgjxyX78oanFNTMMyFEfOqdC54s3eE82imuWKbOeqYht2CrNf64Qb8vgmmtZGA==", + "dev": true, + "license": "ISC", + "dependencies": { + "es6-error": "^4.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", + "dev": true, + "license": "ISC" + }, + "node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dev": true, + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.80.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.80.0.tgz", + "integrity": "sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==", + "dev": true, + "license": "MIT", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-dts": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/rollup-plugin-dts/-/rollup-plugin-dts-4.2.3.tgz", + "integrity": "sha512-jlcpItqM2efqfIiKzDB/IKOS9E9fDvbkJSGw5GtK/PqPGS9eC3R3JKyw2VvpTktZA+TNgJRMu1NTv244aTUzzQ==", + "dev": true, + "license": "LGPL-3.0", + "dependencies": { + "magic-string": "^0.26.6" + }, + "engines": { + "node": ">=v12.22.12" + }, + "funding": { + "url": "https://github.com/sponsors/Swatinem" + }, + "optionalDependencies": { + "@babel/code-frame": "^7.18.6" + }, + "peerDependencies": { + "rollup": "^2.55", + "typescript": "^4.1" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/semver": { + "version": "7.8.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", + "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", + "dev": true, + "license": "ISC" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/sinon": { + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-15.2.0.tgz", + "integrity": "sha512-nPS85arNqwBXaIsFCkolHjGIkFo+Oxu9vbgmBJizLAhqe6P2o3Qmj3KCUoRkfhHtvgDhZdWD3risLHAUJ8npjw==", + "deprecated": "16.1.1", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "@sinonjs/commons": "^3.0.0", + "@sinonjs/fake-timers": "^10.3.0", + "@sinonjs/samsam": "^8.0.0", + "diff": "^5.1.0", + "nise": "^5.1.4", + "supports-color": "^7.2.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/sinon" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead", + "dev": true, + "license": "MIT" + }, + "node_modules/spawn-wrap": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", + "integrity": "sha512-EeajNjfN9zMnULLwhZZQU3GWBoFNkbngTUPfaawT4RkMiviTxcX0qfhVbGey39mfctfDHkWtuecgQ8NJcyQWHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^2.0.0", + "is-windows": "^1.0.2", + "make-dir": "^3.0.0", + "rimraf": "^3.0.0", + "signal-exit": "^3.0.2", + "which": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "license": "ISC", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/test-exclude/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me", + "dev": true, + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true, + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "dev": true, + "license": "MIT" + }, + "node_modules/ts-node": { + "version": "10.9.2", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", + "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.4.tgz", + "integrity": "sha512-X07nttJQkwkfKfvTPG/KSnE2OMdcUCao6+eXF3wmnIQRn2aPAHH3VxDbDOdegkd6JbPsXqShpvEOHfAT+nCNwQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tsconfig-paths/node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true, + "license": "0BSD" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz", + "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "deprecated": "uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028).", + "dev": true, + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true, + "license": "MIT" + }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "dev": true, + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", + "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workerpool": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", + "integrity": "sha512-Fs4dNYcsdpYSAfVxhnl1L5zTksjvOJxtC5hzMNl+1t9B8hTJTdKDyZ5ju7ztgPy+ft9tBFXoOlDNiOT9WUXZlA==", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true, + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "8.21.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.3.tgz", + "integrity": "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "node_modules/yargs": { + "version": "16.2.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.2.tgz", + "integrity": "sha512-Nt9ZJjXTv5R8MHbqby/wXQ6Gi0Bb3TcYZkR1bzuL4yB2OxWPkXknz513gEF0GoA6tn00UpbPvERW8rzCuWCA6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", + "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "camelcase": "^6.0.0", + "decamelize": "^4.0.0", + "flat": "^5.0.2", + "is-plain-obj": "^2.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs-unparser/node_modules/decamelize": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", + "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/packages/wallet-plugin-tacklebox/package.json b/packages/wallet-plugin-tacklebox/package.json new file mode 100644 index 00000000..260bc4a4 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/package.json @@ -0,0 +1,66 @@ +{ + "name": "wallet-plugin-tacklebox", + "description": "A TackleBox wallet plugin for use with @wharfkit/session.", + "version": "0.1.0", + "homepage": "https://github.com/on-a-t-break/wallet-plugin-tacklebox", + "license": "BSD-3-Clause", + "main": "lib/wallet-plugin-tacklebox.js", + "module": "lib/wallet-plugin-tacklebox.m.js", + "types": "lib/wallet-plugin-tacklebox.d.ts", + "sideEffects": false, + "repository": { + "type": "git", + "url": "git+https://github.com/on-a-t-break/wallet-plugin-tacklebox.git" + }, + "files": [ + "lib/*", + "src/*" + ], + "scripts": { + "prepare": "npm run build", + "build": "rollup -c", + "lint": "eslint src --ext .ts --max-warnings 0", + "format": "eslint src test --ext .ts --fix", + "test": "mocha", + "coverage": "nyc --temp-dir build/nyc_output --report-dir build/coverage --reporter=text mocha" + }, + "engines": { + "node": ">=18" + }, + "dependencies": { + "@greymass/buoy": "^1.0.3", + "@wharfkit/antelope": "^1.0.5", + "@wharfkit/protocol-esr": "^1.6.1", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.1.0", + "ws": "^8.13.0" + }, + "peerDependencies": { + "@wharfkit/session": "^1.7.0" + }, + "devDependencies": { + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-typescript": "^10.0.1", + "@types/chai": "^4.3.1", + "@types/mocha": "^9.0.0", + "@types/node": "^18.7.18", + "@typescript-eslint/eslint-plugin": "^5.20.0", + "@typescript-eslint/parser": "^5.20.0", + "@wharfkit/mock-data": "^1.3.0", + "@wharfkit/session": "^1.7.0", + "chai": "^4.3.4", + "eslint": "^8.13.0", + "eslint-config-prettier": "^8.1.0", + "eslint-plugin-prettier": "^4.0.0", + "mocha": "^10.0.0", + "nyc": "^15.1.0", + "pako": "^2.1.0", + "prettier": "^2.2.1", + "rollup": "^2.70.2", + "rollup-plugin-dts": "^4.2.1", + "sinon": "^15.0.1", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.1.1", + "typescript": "^4.9.5" + } +} diff --git a/packages/wallet-plugin-tacklebox/rollup.config.js b/packages/wallet-plugin-tacklebox/rollup.config.js new file mode 100644 index 00000000..bb0932c3 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/rollup.config.js @@ -0,0 +1,52 @@ +import fs from 'fs' +import dts from 'rollup-plugin-dts' +import json from '@rollup/plugin-json' +import typescript from '@rollup/plugin-typescript' + +import pkg from './package.json' + +const name = pkg.name +const license = fs.readFileSync('LICENSE').toString('utf-8').trim() +const banner = ` +/** + * ${name} v${pkg.version} + * ${pkg.homepage} + * + * @license + * ${license.replace(/\n/g, '\n * ')} + */ +`.trim() + +const external = [...Object.keys(pkg.dependencies), ...Object.keys(pkg.peerDependencies)] + +/** @type {import('rollup').RollupOptions} */ +export default [ + { + input: 'src/index.ts', + output: { + banner, + file: pkg.main, + format: 'cjs', + sourcemap: true, + exports: 'named', + }, + plugins: [typescript({target: 'es6'}), json()], + external, + }, + { + input: 'src/index.ts', + output: { + banner, + file: pkg.module, + format: 'esm', + sourcemap: true, + }, + plugins: [typescript({target: 'es2020'}), json()], + external, + }, + { + input: 'src/index.ts', + output: {banner, file: pkg.types, format: 'esm'}, + plugins: [dts()], + }, +] diff --git a/packages/wallet-plugin-tacklebox/src/index.ts b/packages/wallet-plugin-tacklebox/src/index.ts new file mode 100644 index 00000000..f318b830 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/src/index.ts @@ -0,0 +1,404 @@ +import { + AbstractWalletPlugin, + CallbackPayload, + Cancelable, + Checksum256, + LoginContext, + PermissionLevel, + PrivateKey, + PromptElement, + PromptResponse, + PublicKey, + ResolvedSigningRequest, + Serializer, + TransactContext, + WalletPluginConfig, + WalletPluginLoginResponse, + WalletPluginMetadata, + WalletPluginSignResponse, +} from '@wharfkit/session' +import { + createIdentityRequest, + extractSignaturesFromCallback, + isCallback, + isKnownMobile, + LinkInfo, + sealMessage, + setTransactionCallback, + verifyLoginCallbackResponse, + waitForCallback, +} from '@wharfkit/protocol-esr' +import {send} from '@greymass/buoy' +import WebSocket from 'isomorphic-ws' + +import defaultTranslations from './translations' +import {tackleboxLogo} from './logo' + +/** Options for the TackleBox wallet plugin. */ +export interface WalletPluginTackleBoxOptions { + /** + * Buoy callback-forwarder service used for this dapp's callbacks. + * + * TackleBox's own listening channel is announced by the wallet at login + * (`link_ch`) and does not depend on this value. + */ + buoyUrl?: string + /** WebSocket constructor override forwarded to buoy callback handling. */ + buoyWs?: WebSocket +} + +/** Default buoy service, shared with the rest of the anchor-link ecosystem. */ +export const DEFAULT_BUOY_URL = 'https://cb.anchor.link' + +/** + * A @wharfkit/session WalletPlugin for TackleBox, the native wallet and block + * explorer for Antelope blockchains (https://github.com/on-a-t-break/tacklebox). + * + * TackleBox speaks the anchor-link protocol: the login prompt presents an ESR + * identity request the user pastes into TackleBox (Contracts → ESR → CONNECT AS + * LOGIN) or scans as a QR code. TackleBox answers over a buoy callback and + * opens a sealed push channel; subsequent transactions are pushed straight into + * the wallet, where each request still passes TackleBox's whitelist guard and + * signing review. + */ +export class WalletPluginTackleBox extends AbstractWalletPlugin { + buoyUrl: string + buoyWs: WebSocket | undefined + + /** + * The unique identifier for the wallet plugin. + */ + get id(): string { + return 'tacklebox' + } + + /** + * The translations for this plugin. + */ + translations = defaultTranslations + + constructor(options?: WalletPluginTackleBoxOptions) { + super() + this.buoyUrl = options?.buoyUrl || DEFAULT_BUOY_URL + this.buoyWs = options?.buoyWs || WebSocket + } + + /** + * The logic configuration for the wallet plugin. + */ + readonly config: WalletPluginConfig = { + // TackleBox resolves the chain from the request (or asks the user), + // so the UI never needs a chain selector. + requiresChainSelect: false, + // The user picks the account inside TackleBox. + requiresPermissionSelect: false, + } + + /** + * The metadata for the wallet plugin to be displayed in the user interface. + */ + readonly metadata: WalletPluginMetadata = WalletPluginMetadata.from({ + name: 'TackleBox', + description: 'A native wallet and block explorer for Antelope blockchains.', + logo: tackleboxLogo, + homepage: 'https://github.com/on-a-t-break/tacklebox', + download: 'https://github.com/on-a-t-break/tacklebox/releases', + }) + + login(context: LoginContext): Promise { + return this.handleLogin(context) + } + + private async handleLogin(context: LoginContext): Promise { + if (!context.ui) { + throw new Error('The TackleBox wallet plugin requires a UI to be present.') + } + + const t = context.ui.getTranslate(this.id) + + const {callback, request, requestKey, privateKey} = await createIdentityRequest( + context, + this.buoyUrl + ) + + const encodedRequest = request.encode(true, true, 'esr:') + + const prompt = (copied: boolean) => { + const elements: PromptElement[] = [ + { + type: 'button', + label: t('login.copy', {default: 'Copy login request'}), + data: { + label: t('login.copy', {default: 'Copy login request'}), + variant: 'primary', + onClick: () => { + copyToClipboard(encodedRequest).then( + (ok) => ok && !copied && prompt(true) + ) + }, + }, + }, + { + type: 'link', + label: t('login.link', {default: 'Open esr: link'}), + data: { + href: encodedRequest, + label: t('login.link', {default: 'Open esr: link'}), + }, + }, + ] + + // The QR code only helps when this device is not the one running + // the wallet - hide it on known-mobile dapp devices. + if (!isKnownMobile()) { + elements.unshift({ + type: 'qr', + data: encodedRequest, + }) + } + + const promptPromise = context.ui!.prompt({ + title: t('login.title', {default: 'Connect with TackleBox'}), + body: copied + ? t('login.copied', { + default: + 'Request copied. In TackleBox, open Contracts → ESR → CONNECT AS LOGIN and paste it to continue.', + }) + : t('login.body', { + default: + 'Copy the login request and paste it into TackleBox (Contracts → ESR → CONNECT AS LOGIN), or scan the QR code with TackleBox on another device.', + }), + elements, + }) + // The modal closing is handled by the session kit; swallow the rejection. + promptPromise.catch(() => undefined) + } + + prompt(false) + + const callbackResponse: CallbackPayload = await waitForCallback(callback, this.buoyWs, t) + + verifyLoginCallbackResponse(callbackResponse, context) + + if (!callbackResponse.cid || !callbackResponse.sa || !callbackResponse.sp) { + throw new Error( + t('error.invalid_response', { + default: + 'Invalid response from TackleBox, it must contain the cid, sa and sp fields.', + }) + ) + } + + // TackleBox always opens a push channel on login; store it so transact + // requests can be pushed straight into the wallet. + if (callbackResponse.link_ch && callbackResponse.link_key && callbackResponse.link_name) { + this.data.requestKey = requestKey + this.data.privateKey = privateKey + this.data.signerKey = PublicKey.from(callbackResponse.link_key) + this.data.channelUrl = callbackResponse.link_ch + this.data.channelName = callbackResponse.link_name + } + + const resolvedResponse = await ResolvedSigningRequest.fromPayload( + callbackResponse, + context.esrOptions + ) + + return { + chain: Checksum256.from(callbackResponse.cid), + permissionLevel: PermissionLevel.from({ + actor: callbackResponse.sa, + permission: callbackResponse.sp, + }), + identityProof: resolvedResponse.getIdentityProof(callbackResponse.sig), + } + } + + sign( + resolved: ResolvedSigningRequest, + context: TransactContext + ): Promise { + return this.handleSign(resolved, context) + } + + private async handleSign( + resolved: ResolvedSigningRequest, + context: TransactContext + ): Promise { + if (!context.ui) { + throw new Error('The TackleBox wallet plugin requires a UI to be present.') + } + + const t = context.ui.getTranslate(this.id) + + const expiration = resolved.transaction.expiration.toDate() + const expiresIn = Math.max(0, expiration.getTime() - Date.now()) + + // Re-create the request through the session so the wallet resolves it + // against fresh TAPOS values, and tag it with its expiration. + const modifiedRequest = await context.createRequest({transaction: resolved.transaction}) + modifiedRequest.setInfoKey('link', LinkInfo.from({expiration})) + + const callback = setTransactionCallback(modifiedRequest, this.buoyUrl) + const encodedRequest = modifiedRequest.encode(true, true, 'esr:') + + // Track every prompt shown for this signature so the first one the + // user dismisses cancels the flow, whichever variant is on screen. + const prompts: Cancelable[] = [] + let onPromptSettled: (p: Cancelable) => void = () => undefined + const promptSettled = new Promise((resolve, reject) => { + onPromptSettled = (p) => { + prompts.push(p) + p.then(resolve, reject) + } + }) + + const countdown: PromptElement = { + type: 'countdown', + data: { + label: t('transact.await', {default: 'Waiting for TackleBox'}), + end: expiration.toISOString(), + }, + } + + const promptManual = (copied: boolean) => { + const elements: PromptElement[] = [ + { + type: 'button', + label: t('transact.copy', {default: 'Copy signing request'}), + data: { + label: t('transact.copy', {default: 'Copy signing request'}), + variant: 'primary', + onClick: () => { + copyToClipboard(encodedRequest).then( + (ok) => ok && !copied && promptManual(true) + ) + }, + }, + }, + countdown, + ] + if (!isKnownMobile()) { + elements.unshift({ + type: 'qr', + data: encodedRequest, + }) + } + onPromptSettled( + context.ui!.prompt({ + title: t('transact.title_manual', {default: 'Sign with TackleBox'}), + body: copied + ? t('transact.copied', { + default: + 'Request copied. In TackleBox, open Contracts → ESR and paste it to continue.', + }) + : t('transact.body_manual', { + default: + 'Copy the signing request and paste it into TackleBox (Contracts → ESR), or scan the QR code with TackleBox on another device.', + }), + elements, + }) + ) + } + + if (this.data.channelUrl) { + onPromptSettled( + context.ui.prompt({ + title: t('transact.title', {default: 'Sign with TackleBox'}), + body: t('transact.body', { + channelName: this.data.channelName, + default: `Review and approve this transaction in TackleBox ("${this.data.channelName}").`, + }), + elements: [ + countdown, + { + type: 'button', + label: t('transact.manual', {default: 'Sign manually instead'}), + data: { + label: t('transact.manual', {default: 'Sign manually instead'}), + onClick: () => promptManual(false), + }, + }, + ], + }) + ) + } else { + promptManual(false) + } + + const timer = setTimeout(() => { + prompts.forEach((p) => + p.cancel(t('error.expired', {default: 'The request expired, please try again.'})) + ) + }, expiresIn) + + const callbackPromise = waitForCallback(callback, this.buoyWs, t) + + if (this.data.channelUrl) { + // Seal the request to the wallet's session key and push it into + // TackleBox over its buoy channel. + const service = new URL(this.data.channelUrl).origin + const channel = new URL(this.data.channelUrl).pathname.substring(1) + const sealedMessage = await sealMessage( + encodedRequest, + PrivateKey.from(this.data.privateKey), + PublicKey.from(this.data.signerKey) + ) + send(Serializer.encode({object: sealedMessage}).array, {service, channel}) + } + + const callbackResponse = await Promise.race([callbackPromise, promptSettled]).finally( + () => { + clearTimeout(timer) + prompts.forEach((p) => p.cancel()) + } + ) + + if ( + isCallback(callbackResponse) && + extractSignaturesFromCallback(callbackResponse).length + ) { + const resolvedRequest = await ResolvedSigningRequest.fromPayload( + callbackResponse, + context.esrOptions + ) + return { + signatures: extractSignaturesFromCallback(callbackResponse), + resolved: resolvedRequest, + } + } + + throw new Error(t('error.not_completed', {default: 'The request was not completed.'})) + } +} + +/** + * Best-effort clipboard write; resolves true when the text was copied. + */ +export async function copyToClipboard(text: string): Promise { + try { + if (typeof navigator !== 'undefined' && navigator.clipboard) { + await navigator.clipboard.writeText(text) + return true + } + } catch (error) { + // Permission denied or insecure context; try the legacy path below. + } + try { + if (typeof document !== 'undefined' && document.body) { + const element = document.createElement('textarea') + element.value = text + element.setAttribute('readonly', '') + element.style.position = 'absolute' + element.style.left = '-9999px' + document.body.appendChild(element) + element.select() + const copied = document.execCommand('copy') + document.body.removeChild(element) + return copied + } + } catch (error) { + // Nothing else to fall back to. + } + return false +} diff --git a/packages/wallet-plugin-tacklebox/src/logo.ts b/packages/wallet-plugin-tacklebox/src/logo.ts new file mode 100644 index 00000000..fef171c8 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/src/logo.ts @@ -0,0 +1,10 @@ +import {Logo} from '@wharfkit/session' + +/** + * The TackleBox mark: a tackle box on a deep-sea badge. The `light` variant is + * rendered on light interfaces, the `dark` variant on dark interfaces. + */ +export const tackleboxLogo = Logo.from({ + light: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0nMTYwJyBoZWlnaHQ9JzE2MCcgdmlld0JveD0nMCAwIDE2MCAxNjAnIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PGNpcmNsZSBjeD0nODAnIGN5PSc4MCcgcj0nODAnIGZpbGw9JyMwQjRGNkMnLz48cGF0aCBkPSdNNjAgNjJ2LTlhMTAgMTAgMCAwIDEgMTAtMTBoMjBhMTAgMTAgMCAwIDEgMTAgMTB2OScgc3Ryb2tlPScjRkJGREZGJyBzdHJva2Utd2lkdGg9JzknIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgZmlsbD0nbm9uZScvPjxyZWN0IHg9JzM2JyB5PSc2Micgd2lkdGg9Jzg4JyBoZWlnaHQ9JzU1JyByeD0nOScgZmlsbD0nI0ZCRkRGRicvPjxyZWN0IHg9JzM2JyB5PSc4Mycgd2lkdGg9Jzg4JyBoZWlnaHQ9JzUnIGZpbGw9JyMwQjRGNkMnLz48cmVjdCB4PSc3MCcgeT0nNzUnIHdpZHRoPScyMCcgaGVpZ2h0PScyMScgcng9JzQnIGZpbGw9JyNGNEEyNTknLz48cmVjdCB4PSc3NScgeT0nODMnIHdpZHRoPScxMCcgaGVpZ2h0PSc1JyBmaWxsPScjMEI0RjZDJyBvcGFjaXR5PScwLjM1Jy8+PC9zdmc+', + dark: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0nMTYwJyBoZWlnaHQ9JzE2MCcgdmlld0JveD0nMCAwIDE2MCAxNjAnIGZpbGw9J25vbmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc+PGNpcmNsZSBjeD0nODAnIGN5PSc4MCcgcj0nODAnIGZpbGw9JyNGQkZERkYnLz48cGF0aCBkPSdNNjAgNjJ2LTlhMTAgMTAgMCAwIDEgMTAtMTBoMjBhMTAgMTAgMCAwIDEgMTAgMTB2OScgc3Ryb2tlPScjMEI0RjZDJyBzdHJva2Utd2lkdGg9JzknIHN0cm9rZS1saW5lY2FwPSdyb3VuZCcgZmlsbD0nbm9uZScvPjxyZWN0IHg9JzM2JyB5PSc2Micgd2lkdGg9Jzg4JyBoZWlnaHQ9JzU1JyByeD0nOScgZmlsbD0nIzBCNEY2QycvPjxyZWN0IHg9JzM2JyB5PSc4Mycgd2lkdGg9Jzg4JyBoZWlnaHQ9JzUnIGZpbGw9JyNGQkZERkYnLz48cmVjdCB4PSc3MCcgeT0nNzUnIHdpZHRoPScyMCcgaGVpZ2h0PScyMScgcng9JzQnIGZpbGw9JyNGNEEyNTknLz48cmVjdCB4PSc3NScgeT0nODMnIHdpZHRoPScxMCcgaGVpZ2h0PSc1JyBmaWxsPScjRkJGREZGJyBvcGFjaXR5PScwLjM1Jy8+PC9zdmc+', +}) diff --git a/packages/wallet-plugin-tacklebox/src/translations/en.json b/packages/wallet-plugin-tacklebox/src/translations/en.json new file mode 100644 index 00000000..9a16fcf3 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/src/translations/en.json @@ -0,0 +1,25 @@ +{ + "login": { + "title": "Connect with TackleBox", + "body": "Copy the login request and paste it into TackleBox (Contracts → ESR → CONNECT AS LOGIN), or scan the QR code with TackleBox on another device.", + "copied": "Request copied. In TackleBox, open Contracts → ESR → CONNECT AS LOGIN and paste it to continue.", + "copy": "Copy login request", + "link": "Open esr: link" + }, + "transact": { + "title": "Sign with TackleBox", + "title_manual": "Sign with TackleBox", + "body": "Review and approve this transaction in TackleBox (\"{{channelName}}\").", + "body_manual": "Copy the signing request and paste it into TackleBox (Contracts → ESR), or scan the QR code with TackleBox on another device.", + "copied": "Request copied. In TackleBox, open Contracts → ESR and paste it to continue.", + "copy": "Copy signing request", + "manual": "Sign manually instead", + "await": "Waiting for TackleBox" + }, + "error": { + "expired": "The request expired, please try again.", + "invalid_response": "Invalid response from TackleBox, it must contain the cid, sa and sp fields.", + "not_completed": "The request was not completed.", + "cancelled": "The request was declined in TackleBox." + } +} diff --git a/packages/wallet-plugin-tacklebox/src/translations/index.ts b/packages/wallet-plugin-tacklebox/src/translations/index.ts new file mode 100644 index 00000000..54df1211 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/src/translations/index.ts @@ -0,0 +1,5 @@ +import en from './en.json' + +export default { + en, +} diff --git a/packages/wallet-plugin-tacklebox/test/data/a041de03f2a7ee6c133465c8c6b2b286704a5d8f.json b/packages/wallet-plugin-tacklebox/test/data/a041de03f2a7ee6c133465c8c6b2b286704a5d8f.json new file mode 100644 index 00000000..9ca01bae --- /dev/null +++ b/packages/wallet-plugin-tacklebox/test/data/a041de03f2a7ee6c133465c8c6b2b286704a5d8f.json @@ -0,0 +1,33 @@ +{ + "request": { + "path": "https://jungle4.greymass.com/v1/chain/get_info", + "params": { + "method": "GET", + "headers": {} + } + }, + "status": 200, + "json": { + "server_version": "13356212", + "chain_id": "73e4385a2708e6d7048834fbc1079f2fabb17b3c125b146af438971e90716c4d", + "head_block_num": 284535949, + "last_irreversible_block_num": 284535947, + "last_irreversible_block_id": "10f5ac8bd27f37626e13d55497f27512fee8b9477c1d7028bfb43478c060b8aa", + "head_block_id": "10f5ac8d9738a5d3fdffbff2c5d39aaf4627bb66afbc09391b38fef6f098155d", + "head_block_time": "2026-09-01T05:08:41.500", + "head_block_producer": "batinthedark", + "virtual_block_cpu_limit": 200000, + "virtual_block_net_limit": 1048576000, + "block_cpu_limit": 200000, + "block_net_limit": 1048576, + "server_version_string": "v1.1.5", + "fork_db_head_block_num": 284535949, + "fork_db_head_block_id": "10f5ac8d9738a5d3fdffbff2c5d39aaf4627bb66afbc09391b38fef6f098155d", + "server_full_version_string": "v1.1.5-13356212245054c35b1e1e7e20a9bd43ced48c4d", + "total_cpu_weight": "120573521296917", + "total_net_weight": "117540230729142", + "earliest_available_block_num": 284360852, + "last_irreversible_block_time": "2026-09-01T05:08:40.500" + }, + "text": "{\"server_version\":\"13356212\",\"chain_id\":\"73e4385a2708e6d7048834fbc1079f2fabb17b3c125b146af438971e90716c4d\",\"head_block_num\":284535949,\"last_irreversible_block_num\":284535947,\"last_irreversible_block_id\":\"10f5ac8bd27f37626e13d55497f27512fee8b9477c1d7028bfb43478c060b8aa\",\"head_block_id\":\"10f5ac8d9738a5d3fdffbff2c5d39aaf4627bb66afbc09391b38fef6f098155d\",\"head_block_time\":\"2026-09-01T05:08:41.500\",\"head_block_producer\":\"batinthedark\",\"virtual_block_cpu_limit\":200000,\"virtual_block_net_limit\":1048576000,\"block_cpu_limit\":200000,\"block_net_limit\":1048576,\"server_version_string\":\"v1.1.5\",\"fork_db_head_block_num\":284535949,\"fork_db_head_block_id\":\"10f5ac8d9738a5d3fdffbff2c5d39aaf4627bb66afbc09391b38fef6f098155d\",\"server_full_version_string\":\"v1.1.5-13356212245054c35b1e1e7e20a9bd43ced48c4d\",\"total_cpu_weight\":\"120573521296917\",\"total_net_weight\":\"117540230729142\",\"earliest_available_block_num\":284360852,\"last_irreversible_block_time\":\"2026-09-01T05:08:40.500\"}" +} \ No newline at end of file diff --git a/packages/wallet-plugin-tacklebox/test/data/ed314e8a151304a30043198b7b9e9df34a14aaeb.json b/packages/wallet-plugin-tacklebox/test/data/ed314e8a151304a30043198b7b9e9df34a14aaeb.json new file mode 100644 index 00000000..69cd7cd9 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/test/data/ed314e8a151304a30043198b7b9e9df34a14aaeb.json @@ -0,0 +1,18 @@ +{ + "request": { + "path": "https://jungle4.greymass.com/v1/chain/get_raw_abi", + "params": { + "method": "POST", + "body": "{\"account_name\":\"eosio.token\"}", + "headers": {} + } + }, + "status": 200, + "json": { + "account_name": "eosio.token", + "code_hash": "0a16e1dac533c4558698c8754f41219839ba2a2b75e517e65ea2537f76681f49", + "abi_hash": "4ddeabf8085f6a6045ec75a100d93b21f6979668d2f7ade18812a5698c6613ce", + "abi": "DmVvc2lvOjphYmkvMS4yAAoHYWNjb3VudAABB2JhbGFuY2UFYXNzZXQFY2xvc2UAAgVvd25lcgRuYW1lBnN5bWJvbAZzeW1ib2wGY3JlYXRlAAIGaXNzdWVyBG5hbWUObWF4aW11bV9zdXBwbHkFYXNzZXQOY3VycmVuY3lfc3RhdHMAAwZzdXBwbHkFYXNzZXQKbWF4X3N1cHBseQVhc3NldAZpc3N1ZXIEbmFtZQVpc3N1ZQADAnRvBG5hbWUIcXVhbnRpdHkFYXNzZXQEbWVtbwZzdHJpbmcKaXNzdWVmaXhlZAADAnRvBG5hbWUGc3VwcGx5BWFzc2V0BG1lbW8Gc3RyaW5nBG9wZW4AAwVvd25lcgRuYW1lBnN5bWJvbAZzeW1ib2wJcmFtX3BheWVyBG5hbWUGcmV0aXJlAAIIcXVhbnRpdHkFYXNzZXQEbWVtbwZzdHJpbmcMc2V0bWF4c3VwcGx5AAIGaXNzdWVyBG5hbWUObWF4aW11bV9zdXBwbHkFYXNzZXQIdHJhbnNmZXIABARmcm9tBG5hbWUCdG8EbmFtZQhxdWFudGl0eQVhc3NldARtZW1vBnN0cmluZwgAAAAAAIVpRAVjbG9zZfkDLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogQ2xvc2UgVG9rZW4gQmFsYW5jZQpzdW1tYXJ5OiAnQ2xvc2Uge3tub3dyYXAgb3duZXJ9feKAmXMgemVybyBxdWFudGl0eSBiYWxhbmNlJwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvdG9rZW4ucG5nIzIwN2ZmNjhiMDQwNmVhYTU2NjE4YjA4YmRhODFkNmEwOTU0NTQzZjM2YWRjMzI4YWIzMDY1ZjMxYTVjNWQ2NTQKLS0tCgp7e293bmVyfX0gYWdyZWVzIHRvIGNsb3NlIHRoZWlyIHplcm8gcXVhbnRpdHkgYmFsYW5jZSBmb3IgdGhlIHt7c3ltYm9sX3RvX3N5bWJvbF9jb2RlIHN5bWJvbH19IHRva2VuLgoKUkFNIHdpbGwgYmUgcmVmdW5kZWQgdG8gdGhlIFJBTSBwYXllciBvZiB0aGUge3tzeW1ib2xfdG9fc3ltYm9sX2NvZGUgc3ltYm9sfX0gdG9rZW4gYmFsYW5jZSBmb3Ige3tvd25lcn19LgAAAACobNRFBmNyZWF0ZZoFLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogQ3JlYXRlIE5ldyBUb2tlbgpzdW1tYXJ5OiAnQ3JlYXRlIGEgbmV3IHRva2VuJwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvdG9rZW4ucG5nIzIwN2ZmNjhiMDQwNmVhYTU2NjE4YjA4YmRhODFkNmEwOTU0NTQzZjM2YWRjMzI4YWIzMDY1ZjMxYTVjNWQ2NTQKLS0tCgp7eyRhY3Rpb24uYWNjb3VudH19IGFncmVlcyB0byBjcmVhdGUgYSBuZXcgdG9rZW4gd2l0aCBzeW1ib2wge3thc3NldF90b19zeW1ib2xfY29kZSBtYXhpbXVtX3N1cHBseX19IHRvIGJlIG1hbmFnZWQgYnkge3tpc3N1ZXJ9fS4KClRoaXMgYWN0aW9uIHdpbGwgbm90IHJlc3VsdCBhbnkgYW55IHRva2VucyBiZWluZyBpc3N1ZWQgaW50byBjaXJjdWxhdGlvbi4KCnt7aXNzdWVyfX0gd2lsbCBiZSBhbGxvd2VkIHRvIGlzc3VlIHRva2VucyBpbnRvIGNpcmN1bGF0aW9uLCB1cCB0byBhIG1heGltdW0gc3VwcGx5IG9mIHt7bWF4aW11bV9zdXBwbHl9fS4KClJBTSB3aWxsIGRlZHVjdGVkIGZyb20ge3skYWN0aW9uLmFjY291bnR9feKAmXMgcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHJlY29yZHMuAAAAAAClMXYFaXNzdWXuBy0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IElzc3VlIFRva2VucyBpbnRvIENpcmN1bGF0aW9uCnN1bW1hcnk6ICdJc3N1ZSB7e25vd3JhcCBxdWFudGl0eX19IGludG8gY2lyY3VsYXRpb24gYW5kIHRyYW5zZmVyIGludG8ge3tub3dyYXAgdG99feKAmXMgYWNjb3VudCcKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL3Rva2VuLnBuZyMyMDdmZjY4YjA0MDZlYWE1NjYxOGIwOGJkYTgxZDZhMDk1NDU0M2YzNmFkYzMyOGFiMzA2NWYzMWE1YzVkNjU0Ci0tLQoKVGhlIHRva2VuIG1hbmFnZXIgYWdyZWVzIHRvIGlzc3VlIHt7cXVhbnRpdHl9fSBpbnRvIGNpcmN1bGF0aW9uLCBhbmQgdHJhbnNmZXIgaXQgaW50byB7e3RvfX3igJlzIGFjY291bnQuCgp7eyNpZiBtZW1vfX1UaGVyZSBpcyBhIG1lbW8gYXR0YWNoZWQgdG8gdGhlIHRyYW5zZmVyIHN0YXRpbmc6Cnt7bWVtb319Cnt7L2lmfX0KCklmIHt7dG99fSBkb2VzIG5vdCBoYXZlIGEgYmFsYW5jZSBmb3Ige3thc3NldF90b19zeW1ib2xfY29kZSBxdWFudGl0eX19LCBvciB0aGUgdG9rZW4gbWFuYWdlciBkb2VzIG5vdCBoYXZlIGEgYmFsYW5jZSBmb3Ige3thc3NldF90b19zeW1ib2xfY29kZSBxdWFudGl0eX19LCB0aGUgdG9rZW4gbWFuYWdlciB3aWxsIGJlIGRlc2lnbmF0ZWQgYXMgdGhlIFJBTSBwYXllciBvZiB0aGUge3thc3NldF90b19zeW1ib2xfY29kZSBxdWFudGl0eX19IHRva2VuIGJhbGFuY2UgZm9yIHt7dG99fS4gQXMgYSByZXN1bHQsIFJBTSB3aWxsIGJlIGRlZHVjdGVkIGZyb20gdGhlIHRva2VuIG1hbmFnZXLigJlzIHJlc291cmNlcyB0byBjcmVhdGUgdGhlIG5lY2Vzc2FyeSByZWNvcmRzLgoKVGhpcyBhY3Rpb24gZG9lcyBub3QgYWxsb3cgdGhlIHRvdGFsIHF1YW50aXR5IHRvIGV4Y2VlZCB0aGUgbWF4IGFsbG93ZWQgc3VwcGx5IG9mIHRoZSB0b2tlbi4AQFLdLaUxdgppc3N1ZWZpeGVkoQgtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBJc3N1ZSBGaXhlZCBTdXBwbHkgb2YgVG9rZW5zIGludG8gQ2lyY3VsYXRpb24Kc3VtbWFyeTogJ0lzc3VlIHVwIHRvIHt7bm93cmFwIHN1cHBseX19IHN1cHBseSBpbnRvIGNpcmN1bGF0aW9uIGFuZCB0cmFuc2ZlciBpbnRvIHt7bm93cmFwIHRvfX3igJlzIGFjY291bnQnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy90b2tlbi5wbmcjMjA3ZmY2OGIwNDA2ZWFhNTY2MThiMDhiZGE4MWQ2YTA5NTQ1NDNmMzZhZGMzMjhhYjMwNjVmMzFhNWM1ZDY1NAotLS0KClRoZSB0b2tlbiBtYW5hZ2VyIGFncmVlcyB0byBpc3N1ZSB0b2tlbnMgdXAgdG8ge3tzdXBwbHl9fSBmaXhlZCBzdXBwbHkgaW50byBjaXJjdWxhdGlvbiwgYW5kIHRyYW5zZmVyIGl0IGludG8ge3t0b3194oCZcyBhY2NvdW50LgoKe3sjaWYgbWVtb319VGhlcmUgaXMgYSBtZW1vIGF0dGFjaGVkIHRvIHRoZSB0cmFuc2ZlciBzdGF0aW5nOgp7e21lbW99fQp7ey9pZn19CgpJZiB7e3RvfX0gZG9lcyBub3QgaGF2ZSBhIGJhbGFuY2UgZm9yIHt7YXNzZXRfdG9fc3ltYm9sX2NvZGUgcXVhbnRpdHl9fSwgb3IgdGhlIHRva2VuIG1hbmFnZXIgZG9lcyBub3QgaGF2ZSBhIGJhbGFuY2UgZm9yIHt7YXNzZXRfdG9fc3ltYm9sX2NvZGUgcXVhbnRpdHl9fSwgdGhlIHRva2VuIG1hbmFnZXIgd2lsbCBiZSBkZXNpZ25hdGVkIGFzIHRoZSBSQU0gcGF5ZXIgb2YgdGhlIHt7YXNzZXRfdG9fc3ltYm9sX2NvZGUgcXVhbnRpdHl9fSB0b2tlbiBiYWxhbmNlIGZvciB7e3RvfX0uIEFzIGEgcmVzdWx0LCBSQU0gd2lsbCBiZSBkZWR1Y3RlZCBmcm9tIHRoZSB0b2tlbiBtYW5hZ2Vy4oCZcyByZXNvdXJjZXMgdG8gY3JlYXRlIHRoZSBuZWNlc3NhcnkgcmVjb3Jkcy4KClRoaXMgYWN0aW9uIGRvZXMgbm90IGFsbG93IHRoZSB0b3RhbCBxdWFudGl0eSB0byBleGNlZWQgdGhlIG1heCBhbGxvd2VkIHN1cHBseSBvZiB0aGUgdG9rZW4uAAAAAAAwVaUEb3BlbsYFLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogT3BlbiBUb2tlbiBCYWxhbmNlCnN1bW1hcnk6ICdPcGVuIGEgemVybyBxdWFudGl0eSBiYWxhbmNlIGZvciB7e25vd3JhcCBvd25lcn19JwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvdG9rZW4ucG5nIzIwN2ZmNjhiMDQwNmVhYTU2NjE4YjA4YmRhODFkNmEwOTU0NTQzZjM2YWRjMzI4YWIzMDY1ZjMxYTVjNWQ2NTQKLS0tCgp7e3JhbV9wYXllcn19IGFncmVlcyB0byBlc3RhYmxpc2ggYSB6ZXJvIHF1YW50aXR5IGJhbGFuY2UgZm9yIHt7b3duZXJ9fSBmb3IgdGhlIHt7c3ltYm9sX3RvX3N5bWJvbF9jb2RlIHN5bWJvbH19IHRva2VuLgoKSWYge3tvd25lcn19IGRvZXMgbm90IGhhdmUgYSBiYWxhbmNlIGZvciB7e3N5bWJvbF90b19zeW1ib2xfY29kZSBzeW1ib2x9fSwge3tyYW1fcGF5ZXJ9fSB3aWxsIGJlIGRlc2lnbmF0ZWQgYXMgdGhlIFJBTSBwYXllciBvZiB0aGUge3tzeW1ib2xfdG9fc3ltYm9sX2NvZGUgc3ltYm9sfX0gdG9rZW4gYmFsYW5jZSBmb3Ige3tvd25lcn19LiBBcyBhIHJlc3VsdCwgUkFNIHdpbGwgYmUgZGVkdWN0ZWQgZnJvbSB7e3JhbV9wYXllcn194oCZcyByZXNvdXJjZXMgdG8gY3JlYXRlIHRoZSBuZWNlc3NhcnkgcmVjb3Jkcy4AAAAAqOuyugZyZXRpcmXcAy0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IFJlbW92ZSBUb2tlbnMgZnJvbSBDaXJjdWxhdGlvbgpzdW1tYXJ5OiAnUmVtb3ZlIHt7bm93cmFwIHF1YW50aXR5fX0gZnJvbSBjaXJjdWxhdGlvbicKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL3Rva2VuLnBuZyMyMDdmZjY4YjA0MDZlYWE1NjYxOGIwOGJkYTgxZDZhMDk1NDU0M2YzNmFkYzMyOGFiMzA2NWYzMWE1YzVkNjU0Ci0tLQoKVGhlIHRva2VuIG1hbmFnZXIgYWdyZWVzIHRvIHJlbW92ZSB7e3F1YW50aXR5fX0gZnJvbSBjaXJjdWxhdGlvbiwgdGFrZW4gZnJvbSB0aGVpciBvd24gYWNjb3VudC4KCnt7I2lmIG1lbW99fSBUaGVyZSBpcyBhIG1lbW8gYXR0YWNoZWQgdG8gdGhlIGFjdGlvbiBzdGF0aW5nOgp7e21lbW99fQp7ey9pZn194GOtGncjs8IMc2V0bWF4c3VwcGx5wAMtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBTZXQgTWF4IFN1cHBseQpzdW1tYXJ5OiAnU2V0IG1heCBzdXBwbHkgZm9yIHRva2VuJwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvdG9rZW4ucG5nIzIwN2ZmNjhiMDQwNmVhYTU2NjE4YjA4YmRhODFkNmEwOTU0NTQzZjM2YWRjMzI4YWIzMDY1ZjMxYTVjNWQ2NTQKLS0tCgp7e2lzc3Vlcn19IHdpbGwgYmUgYWxsb3dlZCB0byBpc3N1ZSB0b2tlbnMgaW50byBjaXJjdWxhdGlvbiwgdXAgdG8gYSBtYXhpbXVtIHN1cHBseSBvZiB7e21heGltdW1fc3VwcGx5fX0uCgpUaGlzIGFjdGlvbiB3aWxsIG5vdCByZXN1bHQgYW55IGFueSB0b2tlbnMgYmVpbmcgaXNzdWVkIGludG8gY2lyY3VsYXRpb24uAAAAVy08zc0IdHJhbnNmZXK2By0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IFRyYW5zZmVyIFRva2VucwpzdW1tYXJ5OiAnU2VuZCB7e25vd3JhcCBxdWFudGl0eX19IGZyb20ge3tub3dyYXAgZnJvbX19IHRvIHt7bm93cmFwIHRvfX0nCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy90cmFuc2Zlci5wbmcjNWRmYWQwZGY3Mjc3MmVlMWNjYzE1NWU2NzBjMWQxMjRmNWM1MTIyZjFkNTAyNzU2NWRmMzhiNDE4MDQyZDFkZAotLS0KCnt7ZnJvbX19IGFncmVlcyB0byBzZW5kIHt7cXVhbnRpdHl9fSB0byB7e3RvfX0uCgp7eyNpZiBtZW1vfX1UaGVyZSBpcyBhIG1lbW8gYXR0YWNoZWQgdG8gdGhlIHRyYW5zZmVyIHN0YXRpbmc6Cnt7bWVtb319Cnt7L2lmfX0KCklmIHt7ZnJvbX19IGlzIG5vdCBhbHJlYWR5IHRoZSBSQU0gcGF5ZXIgb2YgdGhlaXIge3thc3NldF90b19zeW1ib2xfY29kZSBxdWFudGl0eX19IHRva2VuIGJhbGFuY2UsIHt7ZnJvbX19IHdpbGwgYmUgZGVzaWduYXRlZCBhcyBzdWNoLiBBcyBhIHJlc3VsdCwgUkFNIHdpbGwgYmUgZGVkdWN0ZWQgZnJvbSB7e2Zyb219feKAmXMgcmVzb3VyY2VzIHRvIHJlZnVuZCB0aGUgb3JpZ2luYWwgUkFNIHBheWVyLgoKSWYge3t0b319IGRvZXMgbm90IGhhdmUgYSBiYWxhbmNlIGZvciB7e2Fzc2V0X3RvX3N5bWJvbF9jb2RlIHF1YW50aXR5fX0sIHt7ZnJvbX19IHdpbGwgYmUgZGVzaWduYXRlZCBhcyB0aGUgUkFNIHBheWVyIG9mIHRoZSB7e2Fzc2V0X3RvX3N5bWJvbF9jb2RlIHF1YW50aXR5fX0gdG9rZW4gYmFsYW5jZSBmb3Ige3t0b319LiBBcyBhIHJlc3VsdCwgUkFNIHdpbGwgYmUgZGVkdWN0ZWQgZnJvbSB7e2Zyb219feKAmXMgcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHJlY29yZHMuAgAAADhPTREyA2k2NAAAB2FjY291bnQAAAAAAJBNxgNpNjQAAA5jdXJyZW5jeV9zdGF0cwAAAAA=" + }, + "text": "{\"account_name\":\"eosio.token\",\"code_hash\":\"0a16e1dac533c4558698c8754f41219839ba2a2b75e517e65ea2537f76681f49\",\"abi_hash\":\"4ddeabf8085f6a6045ec75a100d93b21f6979668d2f7ade18812a5698c6613ce\",\"abi\":\"DmVvc2lvOjphYmkvMS4yAAoHYWNjb3VudAABB2JhbGFuY2UFYXNzZXQFY2xvc2UAAgVvd25lcgRuYW1lBnN5bWJvbAZzeW1ib2wGY3JlYXRlAAIGaXNzdWVyBG5hbWUObWF4aW11bV9zdXBwbHkFYXNzZXQOY3VycmVuY3lfc3RhdHMAAwZzdXBwbHkFYXNzZXQKbWF4X3N1cHBseQVhc3NldAZpc3N1ZXIEbmFtZQVpc3N1ZQADAnRvBG5hbWUIcXVhbnRpdHkFYXNzZXQEbWVtbwZzdHJpbmcKaXNzdWVmaXhlZAADAnRvBG5hbWUGc3VwcGx5BWFzc2V0BG1lbW8Gc3RyaW5nBG9wZW4AAwVvd25lcgRuYW1lBnN5bWJvbAZzeW1ib2wJcmFtX3BheWVyBG5hbWUGcmV0aXJlAAIIcXVhbnRpdHkFYXNzZXQEbWVtbwZzdHJpbmcMc2V0bWF4c3VwcGx5AAIGaXNzdWVyBG5hbWUObWF4aW11bV9zdXBwbHkFYXNzZXQIdHJhbnNmZXIABARmcm9tBG5hbWUCdG8EbmFtZQhxdWFudGl0eQVhc3NldARtZW1vBnN0cmluZwgAAAAAAIVpRAVjbG9zZfkDLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogQ2xvc2UgVG9rZW4gQmFsYW5jZQpzdW1tYXJ5OiAnQ2xvc2Uge3tub3dyYXAgb3duZXJ9feKAmXMgemVybyBxdWFudGl0eSBiYWxhbmNlJwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvdG9rZW4ucG5nIzIwN2ZmNjhiMDQwNmVhYTU2NjE4YjA4YmRhODFkNmEwOTU0NTQzZjM2YWRjMzI4YWIzMDY1ZjMxYTVjNWQ2NTQKLS0tCgp7e293bmVyfX0gYWdyZWVzIHRvIGNsb3NlIHRoZWlyIHplcm8gcXVhbnRpdHkgYmFsYW5jZSBmb3IgdGhlIHt7c3ltYm9sX3RvX3N5bWJvbF9jb2RlIHN5bWJvbH19IHRva2VuLgoKUkFNIHdpbGwgYmUgcmVmdW5kZWQgdG8gdGhlIFJBTSBwYXllciBvZiB0aGUge3tzeW1ib2xfdG9fc3ltYm9sX2NvZGUgc3ltYm9sfX0gdG9rZW4gYmFsYW5jZSBmb3Ige3tvd25lcn19LgAAAACobNRFBmNyZWF0ZZoFLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogQ3JlYXRlIE5ldyBUb2tlbgpzdW1tYXJ5OiAnQ3JlYXRlIGEgbmV3IHRva2VuJwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvdG9rZW4ucG5nIzIwN2ZmNjhiMDQwNmVhYTU2NjE4YjA4YmRhODFkNmEwOTU0NTQzZjM2YWRjMzI4YWIzMDY1ZjMxYTVjNWQ2NTQKLS0tCgp7eyRhY3Rpb24uYWNjb3VudH19IGFncmVlcyB0byBjcmVhdGUgYSBuZXcgdG9rZW4gd2l0aCBzeW1ib2wge3thc3NldF90b19zeW1ib2xfY29kZSBtYXhpbXVtX3N1cHBseX19IHRvIGJlIG1hbmFnZWQgYnkge3tpc3N1ZXJ9fS4KClRoaXMgYWN0aW9uIHdpbGwgbm90IHJlc3VsdCBhbnkgYW55IHRva2VucyBiZWluZyBpc3N1ZWQgaW50byBjaXJjdWxhdGlvbi4KCnt7aXNzdWVyfX0gd2lsbCBiZSBhbGxvd2VkIHRvIGlzc3VlIHRva2VucyBpbnRvIGNpcmN1bGF0aW9uLCB1cCB0byBhIG1heGltdW0gc3VwcGx5IG9mIHt7bWF4aW11bV9zdXBwbHl9fS4KClJBTSB3aWxsIGRlZHVjdGVkIGZyb20ge3skYWN0aW9uLmFjY291bnR9feKAmXMgcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHJlY29yZHMuAAAAAAClMXYFaXNzdWXuBy0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IElzc3VlIFRva2VucyBpbnRvIENpcmN1bGF0aW9uCnN1bW1hcnk6ICdJc3N1ZSB7e25vd3JhcCBxdWFudGl0eX19IGludG8gY2lyY3VsYXRpb24gYW5kIHRyYW5zZmVyIGludG8ge3tub3dyYXAgdG99feKAmXMgYWNjb3VudCcKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL3Rva2VuLnBuZyMyMDdmZjY4YjA0MDZlYWE1NjYxOGIwOGJkYTgxZDZhMDk1NDU0M2YzNmFkYzMyOGFiMzA2NWYzMWE1YzVkNjU0Ci0tLQoKVGhlIHRva2VuIG1hbmFnZXIgYWdyZWVzIHRvIGlzc3VlIHt7cXVhbnRpdHl9fSBpbnRvIGNpcmN1bGF0aW9uLCBhbmQgdHJhbnNmZXIgaXQgaW50byB7e3RvfX3igJlzIGFjY291bnQuCgp7eyNpZiBtZW1vfX1UaGVyZSBpcyBhIG1lbW8gYXR0YWNoZWQgdG8gdGhlIHRyYW5zZmVyIHN0YXRpbmc6Cnt7bWVtb319Cnt7L2lmfX0KCklmIHt7dG99fSBkb2VzIG5vdCBoYXZlIGEgYmFsYW5jZSBmb3Ige3thc3NldF90b19zeW1ib2xfY29kZSBxdWFudGl0eX19LCBvciB0aGUgdG9rZW4gbWFuYWdlciBkb2VzIG5vdCBoYXZlIGEgYmFsYW5jZSBmb3Ige3thc3NldF90b19zeW1ib2xfY29kZSBxdWFudGl0eX19LCB0aGUgdG9rZW4gbWFuYWdlciB3aWxsIGJlIGRlc2lnbmF0ZWQgYXMgdGhlIFJBTSBwYXllciBvZiB0aGUge3thc3NldF90b19zeW1ib2xfY29kZSBxdWFudGl0eX19IHRva2VuIGJhbGFuY2UgZm9yIHt7dG99fS4gQXMgYSByZXN1bHQsIFJBTSB3aWxsIGJlIGRlZHVjdGVkIGZyb20gdGhlIHRva2VuIG1hbmFnZXLigJlzIHJlc291cmNlcyB0byBjcmVhdGUgdGhlIG5lY2Vzc2FyeSByZWNvcmRzLgoKVGhpcyBhY3Rpb24gZG9lcyBub3QgYWxsb3cgdGhlIHRvdGFsIHF1YW50aXR5IHRvIGV4Y2VlZCB0aGUgbWF4IGFsbG93ZWQgc3VwcGx5IG9mIHRoZSB0b2tlbi4AQFLdLaUxdgppc3N1ZWZpeGVkoQgtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBJc3N1ZSBGaXhlZCBTdXBwbHkgb2YgVG9rZW5zIGludG8gQ2lyY3VsYXRpb24Kc3VtbWFyeTogJ0lzc3VlIHVwIHRvIHt7bm93cmFwIHN1cHBseX19IHN1cHBseSBpbnRvIGNpcmN1bGF0aW9uIGFuZCB0cmFuc2ZlciBpbnRvIHt7bm93cmFwIHRvfX3igJlzIGFjY291bnQnCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy90b2tlbi5wbmcjMjA3ZmY2OGIwNDA2ZWFhNTY2MThiMDhiZGE4MWQ2YTA5NTQ1NDNmMzZhZGMzMjhhYjMwNjVmMzFhNWM1ZDY1NAotLS0KClRoZSB0b2tlbiBtYW5hZ2VyIGFncmVlcyB0byBpc3N1ZSB0b2tlbnMgdXAgdG8ge3tzdXBwbHl9fSBmaXhlZCBzdXBwbHkgaW50byBjaXJjdWxhdGlvbiwgYW5kIHRyYW5zZmVyIGl0IGludG8ge3t0b3194oCZcyBhY2NvdW50LgoKe3sjaWYgbWVtb319VGhlcmUgaXMgYSBtZW1vIGF0dGFjaGVkIHRvIHRoZSB0cmFuc2ZlciBzdGF0aW5nOgp7e21lbW99fQp7ey9pZn19CgpJZiB7e3RvfX0gZG9lcyBub3QgaGF2ZSBhIGJhbGFuY2UgZm9yIHt7YXNzZXRfdG9fc3ltYm9sX2NvZGUgcXVhbnRpdHl9fSwgb3IgdGhlIHRva2VuIG1hbmFnZXIgZG9lcyBub3QgaGF2ZSBhIGJhbGFuY2UgZm9yIHt7YXNzZXRfdG9fc3ltYm9sX2NvZGUgcXVhbnRpdHl9fSwgdGhlIHRva2VuIG1hbmFnZXIgd2lsbCBiZSBkZXNpZ25hdGVkIGFzIHRoZSBSQU0gcGF5ZXIgb2YgdGhlIHt7YXNzZXRfdG9fc3ltYm9sX2NvZGUgcXVhbnRpdHl9fSB0b2tlbiBiYWxhbmNlIGZvciB7e3RvfX0uIEFzIGEgcmVzdWx0LCBSQU0gd2lsbCBiZSBkZWR1Y3RlZCBmcm9tIHRoZSB0b2tlbiBtYW5hZ2Vy4oCZcyByZXNvdXJjZXMgdG8gY3JlYXRlIHRoZSBuZWNlc3NhcnkgcmVjb3Jkcy4KClRoaXMgYWN0aW9uIGRvZXMgbm90IGFsbG93IHRoZSB0b3RhbCBxdWFudGl0eSB0byBleGNlZWQgdGhlIG1heCBhbGxvd2VkIHN1cHBseSBvZiB0aGUgdG9rZW4uAAAAAAAwVaUEb3BlbsYFLS0tCnNwZWNfdmVyc2lvbjogIjAuMi4wIgp0aXRsZTogT3BlbiBUb2tlbiBCYWxhbmNlCnN1bW1hcnk6ICdPcGVuIGEgemVybyBxdWFudGl0eSBiYWxhbmNlIGZvciB7e25vd3JhcCBvd25lcn19JwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvdG9rZW4ucG5nIzIwN2ZmNjhiMDQwNmVhYTU2NjE4YjA4YmRhODFkNmEwOTU0NTQzZjM2YWRjMzI4YWIzMDY1ZjMxYTVjNWQ2NTQKLS0tCgp7e3JhbV9wYXllcn19IGFncmVlcyB0byBlc3RhYmxpc2ggYSB6ZXJvIHF1YW50aXR5IGJhbGFuY2UgZm9yIHt7b3duZXJ9fSBmb3IgdGhlIHt7c3ltYm9sX3RvX3N5bWJvbF9jb2RlIHN5bWJvbH19IHRva2VuLgoKSWYge3tvd25lcn19IGRvZXMgbm90IGhhdmUgYSBiYWxhbmNlIGZvciB7e3N5bWJvbF90b19zeW1ib2xfY29kZSBzeW1ib2x9fSwge3tyYW1fcGF5ZXJ9fSB3aWxsIGJlIGRlc2lnbmF0ZWQgYXMgdGhlIFJBTSBwYXllciBvZiB0aGUge3tzeW1ib2xfdG9fc3ltYm9sX2NvZGUgc3ltYm9sfX0gdG9rZW4gYmFsYW5jZSBmb3Ige3tvd25lcn19LiBBcyBhIHJlc3VsdCwgUkFNIHdpbGwgYmUgZGVkdWN0ZWQgZnJvbSB7e3JhbV9wYXllcn194oCZcyByZXNvdXJjZXMgdG8gY3JlYXRlIHRoZSBuZWNlc3NhcnkgcmVjb3Jkcy4AAAAAqOuyugZyZXRpcmXcAy0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IFJlbW92ZSBUb2tlbnMgZnJvbSBDaXJjdWxhdGlvbgpzdW1tYXJ5OiAnUmVtb3ZlIHt7bm93cmFwIHF1YW50aXR5fX0gZnJvbSBjaXJjdWxhdGlvbicKaWNvbjogaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2Vvc25ldHdvcmtmb3VuZGF0aW9uL2Vvcy1zeXN0ZW0tY29udHJhY3RzL21haW4vY29udHJhY3RzL2ljb25zL3Rva2VuLnBuZyMyMDdmZjY4YjA0MDZlYWE1NjYxOGIwOGJkYTgxZDZhMDk1NDU0M2YzNmFkYzMyOGFiMzA2NWYzMWE1YzVkNjU0Ci0tLQoKVGhlIHRva2VuIG1hbmFnZXIgYWdyZWVzIHRvIHJlbW92ZSB7e3F1YW50aXR5fX0gZnJvbSBjaXJjdWxhdGlvbiwgdGFrZW4gZnJvbSB0aGVpciBvd24gYWNjb3VudC4KCnt7I2lmIG1lbW99fSBUaGVyZSBpcyBhIG1lbW8gYXR0YWNoZWQgdG8gdGhlIGFjdGlvbiBzdGF0aW5nOgp7e21lbW99fQp7ey9pZn194GOtGncjs8IMc2V0bWF4c3VwcGx5wAMtLS0Kc3BlY192ZXJzaW9uOiAiMC4yLjAiCnRpdGxlOiBTZXQgTWF4IFN1cHBseQpzdW1tYXJ5OiAnU2V0IG1heCBzdXBwbHkgZm9yIHRva2VuJwppY29uOiBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vZW9zbmV0d29ya2ZvdW5kYXRpb24vZW9zLXN5c3RlbS1jb250cmFjdHMvbWFpbi9jb250cmFjdHMvaWNvbnMvdG9rZW4ucG5nIzIwN2ZmNjhiMDQwNmVhYTU2NjE4YjA4YmRhODFkNmEwOTU0NTQzZjM2YWRjMzI4YWIzMDY1ZjMxYTVjNWQ2NTQKLS0tCgp7e2lzc3Vlcn19IHdpbGwgYmUgYWxsb3dlZCB0byBpc3N1ZSB0b2tlbnMgaW50byBjaXJjdWxhdGlvbiwgdXAgdG8gYSBtYXhpbXVtIHN1cHBseSBvZiB7e21heGltdW1fc3VwcGx5fX0uCgpUaGlzIGFjdGlvbiB3aWxsIG5vdCByZXN1bHQgYW55IGFueSB0b2tlbnMgYmVpbmcgaXNzdWVkIGludG8gY2lyY3VsYXRpb24uAAAAVy08zc0IdHJhbnNmZXK2By0tLQpzcGVjX3ZlcnNpb246ICIwLjIuMCIKdGl0bGU6IFRyYW5zZmVyIFRva2VucwpzdW1tYXJ5OiAnU2VuZCB7e25vd3JhcCBxdWFudGl0eX19IGZyb20ge3tub3dyYXAgZnJvbX19IHRvIHt7bm93cmFwIHRvfX0nCmljb246IGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9lb3NuZXR3b3JrZm91bmRhdGlvbi9lb3Mtc3lzdGVtLWNvbnRyYWN0cy9tYWluL2NvbnRyYWN0cy9pY29ucy90cmFuc2Zlci5wbmcjNWRmYWQwZGY3Mjc3MmVlMWNjYzE1NWU2NzBjMWQxMjRmNWM1MTIyZjFkNTAyNzU2NWRmMzhiNDE4MDQyZDFkZAotLS0KCnt7ZnJvbX19IGFncmVlcyB0byBzZW5kIHt7cXVhbnRpdHl9fSB0byB7e3RvfX0uCgp7eyNpZiBtZW1vfX1UaGVyZSBpcyBhIG1lbW8gYXR0YWNoZWQgdG8gdGhlIHRyYW5zZmVyIHN0YXRpbmc6Cnt7bWVtb319Cnt7L2lmfX0KCklmIHt7ZnJvbX19IGlzIG5vdCBhbHJlYWR5IHRoZSBSQU0gcGF5ZXIgb2YgdGhlaXIge3thc3NldF90b19zeW1ib2xfY29kZSBxdWFudGl0eX19IHRva2VuIGJhbGFuY2UsIHt7ZnJvbX19IHdpbGwgYmUgZGVzaWduYXRlZCBhcyBzdWNoLiBBcyBhIHJlc3VsdCwgUkFNIHdpbGwgYmUgZGVkdWN0ZWQgZnJvbSB7e2Zyb219feKAmXMgcmVzb3VyY2VzIHRvIHJlZnVuZCB0aGUgb3JpZ2luYWwgUkFNIHBheWVyLgoKSWYge3t0b319IGRvZXMgbm90IGhhdmUgYSBiYWxhbmNlIGZvciB7e2Fzc2V0X3RvX3N5bWJvbF9jb2RlIHF1YW50aXR5fX0sIHt7ZnJvbX19IHdpbGwgYmUgZGVzaWduYXRlZCBhcyB0aGUgUkFNIHBheWVyIG9mIHRoZSB7e2Fzc2V0X3RvX3N5bWJvbF9jb2RlIHF1YW50aXR5fX0gdG9rZW4gYmFsYW5jZSBmb3Ige3t0b319LiBBcyBhIHJlc3VsdCwgUkFNIHdpbGwgYmUgZGVkdWN0ZWQgZnJvbSB7e2Zyb219feKAmXMgcmVzb3VyY2VzIHRvIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5IHJlY29yZHMuAgAAADhPTREyA2k2NAAAB2FjY291bnQAAAAAAJBNxgNpNjQAAA5jdXJyZW5jeV9zdGF0cwAAAAA=\"}" +} \ No newline at end of file diff --git a/packages/wallet-plugin-tacklebox/test/tests/common.ts b/packages/wallet-plugin-tacklebox/test/tests/common.ts new file mode 100644 index 00000000..5629f4b9 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/test/tests/common.ts @@ -0,0 +1,51 @@ +import {assert} from 'chai' +import {AbstractWalletPlugin} from '@wharfkit/session' + +import {copyToClipboard, DEFAULT_BUOY_URL, WalletPluginTackleBox} from '$lib' + +suite('plugin surface', function () { + test('is a wallet plugin with the expected id', function () { + const plugin = new WalletPluginTackleBox() + assert.instanceOf(plugin, AbstractWalletPlugin as any) + assert.equal(plugin.id, 'tacklebox') + }) + + test('lets the wallet pick the chain and permission', function () { + const plugin = new WalletPluginTackleBox() + assert.isFalse(plugin.config.requiresChainSelect) + assert.isFalse(plugin.config.requiresPermissionSelect) + assert.isUndefined(plugin.config.supportedChains) + }) + + test('carries TackleBox metadata', function () { + const {metadata} = new WalletPluginTackleBox() + assert.equal(metadata.name, 'TackleBox') + assert.equal(metadata.homepage, 'https://github.com/on-a-t-break/tacklebox') + assert.equal(metadata.download, 'https://github.com/on-a-t-break/tacklebox/releases') + assert.exists(metadata.logo) + assert.isTrue(String(metadata.logo!.getVariant('light')).startsWith('data:image/svg+xml')) + assert.isTrue(String(metadata.logo!.getVariant('dark')).startsWith('data:image/svg+xml')) + }) + + test('defaults to the shared buoy service', function () { + const plugin = new WalletPluginTackleBox() + assert.equal(plugin.buoyUrl, DEFAULT_BUOY_URL) + assert.equal(DEFAULT_BUOY_URL, 'https://cb.anchor.link') + }) + + test('accepts a custom buoy service', function () { + const plugin = new WalletPluginTackleBox({buoyUrl: 'https://buoy.example.com'}) + assert.equal(plugin.buoyUrl, 'https://buoy.example.com') + }) + + test('ships english translations', function () { + const plugin = new WalletPluginTackleBox() + assert.exists(plugin.translations) + assert.equal(plugin.translations!.en.login.title, 'Connect with TackleBox') + assert.exists(plugin.translations!.en.error.cancelled) + }) + + test('clipboard helper degrades gracefully outside a browser', async function () { + assert.isFalse(await copyToClipboard('esr://test')) + }) +}) diff --git a/packages/wallet-plugin-tacklebox/test/tests/login.ts b/packages/wallet-plugin-tacklebox/test/tests/login.ts new file mode 100644 index 00000000..a19c416e --- /dev/null +++ b/packages/wallet-plugin-tacklebox/test/tests/login.ts @@ -0,0 +1,155 @@ +import {assert} from 'chai' +import sinon from 'sinon' +import zlib from 'pako' +import * as buoy from '@greymass/buoy' +import { + ChainDefinition, + LoginContext, + PermissionLevel, + PromptElement, + SigningRequest, +} from '@wharfkit/session' +import {mockChainDefinition, mockChainId, mockFetch, mockPermissionLevel} from '@wharfkit/mock-data' + +import {WalletPluginTackleBox} from '$lib' +import {makeMockUI} from '$test/utils/mock-ui' +import {makeLoginCallbackPayload, mockChannelUrl, mockPublicKey} from '$test/utils/mock-esr' + +const chain = ChainDefinition.from(mockChainDefinition) + +function makeLoginContext(ui: any): LoginContext { + return { + chain, + chains: [chain], + ui, + fetch: mockFetch, + hooks: {}, + appName: 'unittest', + permissionLevel: PermissionLevel.from(mockPermissionLevel), + walletPlugins: [], + arbitrary: {}, + uiRequirements: {}, + addHook: () => undefined, + getClient: () => undefined, + esrOptions: {zlib}, + } as unknown as LoginContext +} + +suite('login', function () { + teardown(function () { + sinon.restore() + }) + + test('completes a login answered over the buoy channel', async function () { + sinon.stub(buoy, 'receive').resolves(JSON.stringify(makeLoginCallbackPayload())) + + const plugin = new WalletPluginTackleBox() + const ui = makeMockUI() + const response = await plugin.login(makeLoginContext(ui)) + + assert.equal(String(response.chain), mockChainId) + assert.equal(String(response.permissionLevel), mockPermissionLevel) + assert.exists(response.identityProof) + }) + + test('stores the wallet push channel for later signing', async function () { + sinon.stub(buoy, 'receive').resolves(JSON.stringify(makeLoginCallbackPayload())) + + const plugin = new WalletPluginTackleBox() + await plugin.login(makeLoginContext(makeMockUI())) + + assert.equal(plugin.data.channelUrl, mockChannelUrl) + assert.equal(plugin.data.channelName, 'TackleBox') + assert.equal(String(plugin.data.signerKey), mockPublicKey) + assert.exists(plugin.data.privateKey) + assert.exists(plugin.data.requestKey) + }) + + test('session data survives a JSON round trip for restores', async function () { + sinon.stub(buoy, 'receive').resolves(JSON.stringify(makeLoginCallbackPayload())) + + const plugin = new WalletPluginTackleBox() + await plugin.login(makeLoginContext(makeMockUI())) + + const restored = JSON.parse(JSON.stringify(plugin.data)) + assert.equal(restored.channelUrl, mockChannelUrl) + assert.equal(restored.channelName, 'TackleBox') + assert.equal(String(restored.signerKey), mockPublicKey) + assert.isString(restored.privateKey) + }) + + test('still logs in when the wallet announces no channel', async function () { + sinon + .stub(buoy, 'receive') + .resolves(JSON.stringify(makeLoginCallbackPayload({channel: false}))) + + const plugin = new WalletPluginTackleBox() + const response = await plugin.login(makeLoginContext(makeMockUI())) + + assert.equal(String(response.chain), mockChainId) + assert.isUndefined(plugin.data.channelUrl) + }) + + test('prompts with a paste-first flow: QR, copy button and esr link', async function () { + sinon.stub(buoy, 'receive').resolves(JSON.stringify(makeLoginCallbackPayload())) + + const plugin = new WalletPluginTackleBox() + const ui = makeMockUI() + await plugin.login(makeLoginContext(ui)) + + const args = ui.prompts[0] + assert.exists(args) + assert.equal(args.title, 'Connect with TackleBox') + const elements = args.elements as PromptElement[] + assert.deepEqual( + elements.map((e) => e.type), + ['qr', 'button', 'link'] + ) + + // The rendered request is a valid ESR identity request. + const qr: any = elements.find((e) => e.type === 'qr') + assert.isTrue(String(qr.data).startsWith('esr://')) + const request = SigningRequest.from(String(qr.data), {zlib}) + assert.isTrue(request.isIdentity()) + }) + + test('listens for the callback on the configured buoy service', async function () { + const receiveStub = sinon + .stub(buoy, 'receive') + .resolves(JSON.stringify(makeLoginCallbackPayload())) + + const plugin = new WalletPluginTackleBox({buoyUrl: 'https://buoy.example.com'}) + await plugin.login(makeLoginContext(makeMockUI())) + + const receiveOptions: any = receiveStub.firstCall.args[0] + assert.equal(receiveOptions.service, 'https://buoy.example.com') + assert.isString(receiveOptions.channel) + }) + + test('rejects when the wallet declines the request', async function () { + sinon.stub(buoy, 'receive').resolves(JSON.stringify({})) + + const plugin = new WalletPluginTackleBox() + let error: Error | undefined + try { + await plugin.login(makeLoginContext(makeMockUI())) + } catch (err) { + error = err as Error + } + assert.exists(error) + assert.match(String(error!.message), /cancelled|declined/i) + }) + + test('requires a UI', async function () { + const plugin = new WalletPluginTackleBox() + const context = {...makeLoginContext(makeMockUI()), ui: undefined} as any + let error: Error | undefined + try { + await plugin.login(context) + } catch (err) { + error = err as Error + } + assert.exists(error) + assert.match(String(error!.message), /requires a UI/) + }) +}) diff --git a/packages/wallet-plugin-tacklebox/test/tests/sign.ts b/packages/wallet-plugin-tacklebox/test/tests/sign.ts new file mode 100644 index 00000000..d38737bd --- /dev/null +++ b/packages/wallet-plugin-tacklebox/test/tests/sign.ts @@ -0,0 +1,149 @@ +import {assert} from 'chai' +import sinon from 'sinon' +import * as buoy from '@greymass/buoy' +import {PermissionLevel, SessionKit} from '@wharfkit/session' +import { + mockChainId, + mockPermissionLevel, + mockSessionKitArgs, + mockSessionKitOptions, + MockStorage, +} from '@wharfkit/mock-data' + +import {WalletPluginTackleBox} from '$lib' +import {makeMockUI, RecordingUserInterface} from '$test/utils/mock-ui' +import { + makeLoginCallbackPayload, + makeTransactCallbackPayload, + mockChannelId, +} from '$test/utils/mock-esr' + +const transferAction = { + authorization: [PermissionLevel.from(mockPermissionLevel)], + account: 'eosio.token', + name: 'transfer', + data: { + from: 'wharfkit1111', + to: 'wharfkittest', + quantity: '0.0001 EOS', + memo: 'wallet-plugin-tacklebox test', + }, +} + +function makeKit(plugin: WalletPluginTackleBox, ui: RecordingUserInterface) { + return new SessionKit( + { + ...mockSessionKitArgs, + ui, + walletPlugins: [plugin], + }, + { + ...mockSessionKitOptions, + storage: new MockStorage(), + } + ) +} + +suite('sign', function () { + this.timeout(120 * 1000) + this.slow(5 * 1000) + + teardown(function () { + sinon.restore() + }) + + test('pushes the sealed request over the wallet channel and returns its signature', async function () { + const receiveStub = sinon.stub(buoy, 'receive') + const sendStub = sinon.stub(buoy, 'send') + receiveStub.onFirstCall().resolves(JSON.stringify(makeLoginCallbackPayload())) + receiveStub + .onSecondCall() + .callsFake(async () => + JSON.stringify(await makeTransactCallbackPayload(transferAction)) + ) + + const plugin = new WalletPluginTackleBox() + const ui = makeMockUI() + const kit = makeKit(plugin, ui) + + const {session} = await kit.login({ + chain: mockChainId, + permissionLevel: mockPermissionLevel, + }) + assert.equal(String(session.actor), 'wharfkit1111') + assert.equal(String(session.permission), 'test') + + const result = await session.transact({action: transferAction}, {broadcast: false}) + + assert.equal(result.signatures.length, 1) + assert.exists(result.resolved) + assert.equal(String(result.signer), mockPermissionLevel) + + // The request went out sealed, addressed to the wallet's channel. + assert.isTrue(sendStub.calledOnce) + const [message, destination] = sendStub.firstCall.args as any[] + assert.instanceOf(message, Uint8Array) + assert.isAbove(message.length, 0) + assert.equal(destination.service, 'https://cb.anchor.link') + assert.equal(destination.channel, mockChannelId) + }) + + test('shows the channel prompt with a countdown and a manual fallback', async function () { + const receiveStub = sinon.stub(buoy, 'receive') + sinon.stub(buoy, 'send') + receiveStub.onFirstCall().resolves(JSON.stringify(makeLoginCallbackPayload())) + receiveStub + .onSecondCall() + .callsFake(async () => + JSON.stringify(await makeTransactCallbackPayload(transferAction)) + ) + + const plugin = new WalletPluginTackleBox() + const ui = makeMockUI() + const kit = makeKit(plugin, ui) + const {session} = await kit.login({ + chain: mockChainId, + permissionLevel: mockPermissionLevel, + }) + await session.transact({action: transferAction}, {broadcast: false}) + + const prompt = ui.prompts[ui.prompts.length - 1] + assert.equal(prompt.title, 'Sign with TackleBox') + assert.match(String(prompt.body), /TackleBox/) + assert.deepEqual( + (prompt.elements as any[]).map((e) => e.type), + ['countdown', 'button'] + ) + }) + + test('falls back to the paste flow when no channel was announced', async function () { + const receiveStub = sinon.stub(buoy, 'receive') + const sendStub = sinon.stub(buoy, 'send') + receiveStub + .onFirstCall() + .resolves(JSON.stringify(makeLoginCallbackPayload({channel: false}))) + receiveStub + .onSecondCall() + .callsFake(async () => + JSON.stringify(await makeTransactCallbackPayload(transferAction)) + ) + + const plugin = new WalletPluginTackleBox() + const ui = makeMockUI() + const kit = makeKit(plugin, ui) + const {session} = await kit.login({ + chain: mockChainId, + permissionLevel: mockPermissionLevel, + }) + const result = await session.transact({action: transferAction}, {broadcast: false}) + + assert.equal(result.signatures.length, 1) + assert.isTrue(sendStub.notCalled, 'nothing is pushed without a channel') + + const prompt = ui.prompts[ui.prompts.length - 1] + const types = (prompt.elements as any[]).map((e) => e.type) + assert.deepEqual(types, ['qr', 'button', 'countdown']) + const qr: any = (prompt.elements as any[]).find((e) => e.type === 'qr') + assert.isTrue(String(qr.data).startsWith('esr://')) + }) +}) diff --git a/packages/wallet-plugin-tacklebox/test/tsconfig.json b/packages/wallet-plugin-tacklebox/test/tsconfig.json new file mode 100644 index 00000000..ed3bb624 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/test/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "isolatedModules": false, + "resolveJsonModule": true, + "module": "commonjs", + "target": "es6", + "types": ["mocha", "node"], + "baseUrl": "..", + "paths": { + "$lib": ["src"], + "$lib/*": ["src/*"], + "$test": ["test"], + "$test/*": ["test/*"] + } + }, + "include": ["*.ts", "**/*.ts"] +} diff --git a/packages/wallet-plugin-tacklebox/test/utils/mock-esr.ts b/packages/wallet-plugin-tacklebox/test/utils/mock-esr.ts new file mode 100644 index 00000000..b05c1014 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/test/utils/mock-esr.ts @@ -0,0 +1,88 @@ +import zlib from 'pako' +import {APIClient, FetchProvider} from '@wharfkit/antelope' +import { + ABICache, + CallbackPayload, + PermissionLevel, + PrivateKey, + SigningRequest, +} from '@wharfkit/session' +import { + mockChainId, + mockFetch, + mockPermissionLevel, + mockPrivateKey, + mockUrl, +} from '@wharfkit/mock-data' + +export const mockPublicKey = String(PrivateKey.from(mockPrivateKey).toPublic()) +export const mockChannelId = '00000000-0000-0000-0000-00000000cafe' +export const mockChannelUrl = `https://cb.anchor.link/${mockChannelId}` + +const client = new APIClient({provider: new FetchProvider(mockUrl, {fetch: mockFetch})}) +const abiCache = new ABICache(client) + +const mockTapos = { + expiration: '2035-01-01T00:00:00', + ref_block_num: 0, + ref_block_prefix: 0, +} + +function signAndBuildPayload(resolved): CallbackPayload { + const signature = PrivateKey.from(mockPrivateKey).signDigest( + resolved.transaction.signingDigest(mockChainId) + ) + const callback = resolved.getCallback([signature]) + if (!callback) { + throw new Error('mock request has no callback') + } + return {...callback.payload} +} + +/** + * Build the callback payload TackleBox POSTs after the user accepts a login + * request: the signed identity plus the link session announcement. + */ +export function makeLoginCallbackPayload(options: {channel?: boolean} = {}): CallbackPayload { + const request = SigningRequest.identity( + { + callback: {url: 'https://cb.anchor.link/login-channel', background: true}, + scope: 'unittest', + chainId: mockChainId, + }, + {zlib} + ) + const resolved = request.resolve( + new Map(), + PermissionLevel.from(mockPermissionLevel), + mockTapos + ) + const payload = signAndBuildPayload(resolved) + if (options.channel !== false) { + payload.link_ch = mockChannelUrl + payload.link_key = mockPublicKey + payload.link_name = 'TackleBox' + } + return payload +} + +/** + * Build the callback payload TackleBox POSTs after signing a pushed + * transaction request. + */ +export async function makeTransactCallbackPayload(action): Promise { + const request = await SigningRequest.create( + { + action, + chainId: mockChainId, + broadcast: false, + callback: {url: 'https://cb.anchor.link/transact-channel', background: true}, + }, + {zlib, abiProvider: abiCache} + ) + const abis = await request.fetchAbis(abiCache) + const resolved = request.resolve(abis, PermissionLevel.from(mockPermissionLevel), mockTapos) + const payload = signAndBuildPayload(resolved) + payload.link_name = 'TackleBox' + return payload +} diff --git a/packages/wallet-plugin-tacklebox/test/utils/mock-ui.ts b/packages/wallet-plugin-tacklebox/test/utils/mock-ui.ts new file mode 100644 index 00000000..0b9e6adb --- /dev/null +++ b/packages/wallet-plugin-tacklebox/test/utils/mock-ui.ts @@ -0,0 +1,88 @@ +import { + Cancelable, + PromptArgs, + PromptElement, + PromptResponse, + UserInterface, +} from '@wharfkit/session' + +export interface RecordingUserInterface extends UserInterface { + prompts: PromptArgs[] + statuses: string[] + lastPrompt(): PromptArgs | undefined + clickButton(index: number): void + close(reason?: string): void +} + +/** A UserInterface that records every prompt and lets tests drive buttons. */ +export function makeMockUI(): RecordingUserInterface { + const prompts: PromptArgs[] = [] + const statuses: string[] = [] + let rejectCurrent: ((reason: Error) => void) | undefined + + const ui: any = { + prompts, + statuses, + lastPrompt() { + return prompts[prompts.length - 1] + }, + clickButton(index: number) { + const args = ui.lastPrompt() + if (!args) { + throw new Error('No prompt has been shown') + } + const buttons = (args.elements as PromptElement[]).filter((e) => e.type === 'button') + const button: any = buttons[index] + if (!button) { + throw new Error(`No button at index ${index} (found ${buttons.length})`) + } + button.data.onClick() + }, + close(reason = 'Modal closed') { + if (rejectCurrent) { + rejectCurrent(new Error(reason)) + rejectCurrent = undefined + } + }, + status(message: string) { + statuses.push(message) + return Promise.resolve() + }, + prompt(args: PromptArgs): Cancelable { + prompts.push(args) + const promise = new Promise((resolve, reject) => { + rejectCurrent = reject + }) + // Swallow the default unhandled rejection; tests assert on the caller's handling. + promise.catch(() => undefined) + return Object.assign(promise, { + cancel: (reason?: string) => { + ui.close(reason) + return promise as Cancelable + }, + }) as Cancelable + }, + getTranslate() { + return (key: string, options?: Record) => + (options && options.default) || key + }, + translate(key: string) { + return key + }, + addTranslations() { + // Translations are not rendered by the mock. + }, + onLogin: () => Promise.resolve(), + onLoginComplete: () => Promise.resolve(), + onTransact: () => Promise.resolve(), + onTransactComplete: () => Promise.resolve(), + onSign: () => Promise.resolve(), + onSignComplete: () => Promise.resolve(), + onBroadcast: () => Promise.resolve(), + onBroadcastComplete: () => Promise.resolve(), + onAccountCreate: () => Promise.resolve(), + onAccountCreateComplete: () => Promise.resolve(), + onError: () => Promise.resolve(), + } + return ui as RecordingUserInterface +} diff --git a/packages/wallet-plugin-tacklebox/tsconfig.json b/packages/wallet-plugin-tacklebox/tsconfig.json new file mode 100644 index 00000000..81afc1b9 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/tsconfig.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "downlevelIteration": true, + "esModuleInterop": true, + "experimentalDecorators": true, + "importHelpers": true, + "isolatedModules": true, + "lib": ["dom", "es2020"], + "module": "es2020", + "moduleResolution": "node", + "noImplicitAny": false, + "resolveJsonModule": true, + "sourceMap": true, + "strict": true, + "target": "es2020" + }, + "include": ["src/**/*"] +} From e64fd8823e3eae0e51e58113fe4846be247f6d40 Mon Sep 17 00:00:00 2001 From: on-a-t-break Date: Mon, 31 Aug 2026 22:12:58 -0700 Subject: [PATCH 03/22] Fix node compatibility in the QR gate and pin test time to the fixtures protocol-esr's isKnownMobile dereferences navigator, which only exists as a global from Node 21 - guard it so SSR and Node 18/20 work. Clamp the expiry timer below the 2^31-1ms setTimeout ceiling so far-future expirations do not fire immediately. The sign suite now pins Date to the recorded chain head so TAPOS-derived expirations stay in the future no matter when the tests run. Co-Authored-By: Claude Fable 5 --- packages/wallet-plugin-tacklebox/src/index.ts | 16 +++++++++--- .../test/tests/sign.ts | 25 +++++++++++++++++++ 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/packages/wallet-plugin-tacklebox/src/index.ts b/packages/wallet-plugin-tacklebox/src/index.ts index f318b830..8fa4d0de 100644 --- a/packages/wallet-plugin-tacklebox/src/index.ts +++ b/packages/wallet-plugin-tacklebox/src/index.ts @@ -150,7 +150,7 @@ export class WalletPluginTackleBox extends AbstractWalletPlugin { // The QR code only helps when this device is not the one running // the wallet - hide it on known-mobile dapp devices. - if (!isKnownMobile()) { + if (!onMobileDevice()) { elements.unshift({ type: 'qr', data: encodedRequest, @@ -278,7 +278,7 @@ export class WalletPluginTackleBox extends AbstractWalletPlugin { }, countdown, ] - if (!isKnownMobile()) { + if (!onMobileDevice()) { elements.unshift({ type: 'qr', data: encodedRequest, @@ -326,11 +326,12 @@ export class WalletPluginTackleBox extends AbstractWalletPlugin { promptManual(false) } + // Timeouts above 2^31-1ms fire immediately; clamp far-future expiries. const timer = setTimeout(() => { prompts.forEach((p) => p.cancel(t('error.expired', {default: 'The request expired, please try again.'})) ) - }, expiresIn) + }, Math.min(expiresIn, 0x7fffffff)) const callbackPromise = waitForCallback(callback, this.buoyWs, t) @@ -372,6 +373,15 @@ export class WalletPluginTackleBox extends AbstractWalletPlugin { } } +/** + * Whether the dapp is running on a known mobile device (where a QR code is of + * no use). protocol-esr's isKnownMobile assumes a browser environment, so + * guard it for SSR and node. + */ +function onMobileDevice(): boolean { + return typeof navigator !== 'undefined' && isKnownMobile() +} + /** * Best-effort clipboard write; resolves true when the text was copied. */ diff --git a/packages/wallet-plugin-tacklebox/test/tests/sign.ts b/packages/wallet-plugin-tacklebox/test/tests/sign.ts index d38737bd..e96a9fc8 100644 --- a/packages/wallet-plugin-tacklebox/test/tests/sign.ts +++ b/packages/wallet-plugin-tacklebox/test/tests/sign.ts @@ -1,3 +1,5 @@ +import fs from 'fs' +import path from 'path' import {assert} from 'chai' import sinon from 'sinon' import * as buoy from '@greymass/buoy' @@ -30,6 +32,19 @@ const transferAction = { }, } +/** The chain head time captured in the recorded get_info fixture. */ +function fixtureHeadTime(): number { + const dir = path.join(__dirname, '..', 'data') + for (const file of fs.readdirSync(dir)) { + const recorded = JSON.parse(fs.readFileSync(path.join(dir, file), 'utf8')) + const head = recorded.json && recorded.json.head_block_time + if (head) { + return new Date(head + 'Z').getTime() + } + } + throw new Error('No recorded get_info fixture found in test/data') +} + function makeKit(plugin: WalletPluginTackleBox, ui: RecordingUserInterface) { return new SessionKit( { @@ -48,7 +63,17 @@ suite('sign', function () { this.timeout(120 * 1000) this.slow(5 * 1000) + let clock: sinon.SinonFakeTimers | undefined + + setup(function () { + // TAPOS in these tests comes from the recorded chain head; pin "now" + // right after it so request expirations stay in the future no matter + // when the suite actually runs. Timers stay real. + clock = sinon.useFakeTimers({now: fixtureHeadTime() + 1000, toFake: ['Date']}) + }) + teardown(function () { + clock?.restore() sinon.restore() }) From 7b9a0239ecc0d773114bd065093a3a79939a54da Mon Sep 17 00:00:00 2001 From: on-a-t-break Date: Tue, 1 Sep 2026 10:58:53 -0700 Subject: [PATCH 04/22] Add a minimal example dapp for live testing against a real wallet Vite + web-renderer + the plugin from file:../..: login, self-transfer on the linked chain, session restore and logout. Verified in a browser that the real WebRenderer renders the paste-first login prompt (QR, copy button with copied-feedback re-prompt, esr: link) exactly as the mocked UI tests describe. Co-Authored-By: Claude Fable 5 --- .../.claude/launch.json | 11 + packages/wallet-plugin-tacklebox/.gitignore | 1 + packages/wallet-plugin-tacklebox/README.md | 9 + .../examples/dapp/README.md | 23 + .../examples/dapp/index.html | 62 + .../examples/dapp/package-lock.json | 1258 +++++++++++++++++ .../examples/dapp/package.json | 19 + .../examples/dapp/src/main.ts | 137 ++ 8 files changed, 1520 insertions(+) create mode 100644 packages/wallet-plugin-tacklebox/.claude/launch.json create mode 100644 packages/wallet-plugin-tacklebox/examples/dapp/README.md create mode 100644 packages/wallet-plugin-tacklebox/examples/dapp/index.html create mode 100644 packages/wallet-plugin-tacklebox/examples/dapp/package-lock.json create mode 100644 packages/wallet-plugin-tacklebox/examples/dapp/package.json create mode 100644 packages/wallet-plugin-tacklebox/examples/dapp/src/main.ts diff --git a/packages/wallet-plugin-tacklebox/.claude/launch.json b/packages/wallet-plugin-tacklebox/.claude/launch.json new file mode 100644 index 00000000..79bb3cc9 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/.claude/launch.json @@ -0,0 +1,11 @@ +{ + "version": "0.0.1", + "configurations": [ + { + "name": "example-dapp", + "runtimeExecutable": "npm", + "runtimeArgs": ["--prefix", "examples/dapp", "run", "dev"], + "port": 5173 + } + ] +} diff --git a/packages/wallet-plugin-tacklebox/.gitignore b/packages/wallet-plugin-tacklebox/.gitignore index ae18ac9b..87534054 100644 --- a/packages/wallet-plugin-tacklebox/.gitignore +++ b/packages/wallet-plugin-tacklebox/.gitignore @@ -1,3 +1,4 @@ node_modules/ lib/ build/ +dist/ diff --git a/packages/wallet-plugin-tacklebox/README.md b/packages/wallet-plugin-tacklebox/README.md index 5afd0ce9..4cb6dff0 100644 --- a/packages/wallet-plugin-tacklebox/README.md +++ b/packages/wallet-plugin-tacklebox/README.md @@ -71,6 +71,15 @@ new WalletPluginTackleBox({ }) ``` +## Trying it live + +[`examples/dapp`](./examples/dapp) is a minimal browser dapp (login, self-transfer, restore, +logout) for exercising the plugin against a real TackleBox build: + +```bash +npm install && cd examples/dapp && npm install && npm run dev +``` + ## Developing You need [Node.js](https://nodejs.org/) 18 or newer. diff --git a/packages/wallet-plugin-tacklebox/examples/dapp/README.md b/packages/wallet-plugin-tacklebox/examples/dapp/README.md new file mode 100644 index 00000000..4b9ffc34 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/examples/dapp/README.md @@ -0,0 +1,23 @@ +# Example dapp + +A minimal browser dapp for exercising the plugin against a real TackleBox build: +login, a self-transfer, session restore and logout. + +```bash +# from the repository root: build the plugin first +npm install + +# then run the example +cd examples/dapp +npm install +npm run dev +``` + +Open the printed URL, click **Login**, copy the request from the modal and paste it into +TackleBox under **Contracts → ESR → CONNECT AS LOGIN**. After that, **Transfer to self** +pushes a signing request straight into the wallet over the link channel — approve it in +TackleBox's review modal, or whitelist `eosio.token::transfer` for the account with a +pinned auto-sign rule to watch it complete with no wallet interaction at all. + +Jungle4 testnet is the first chain in the list — a throwaway jungle4 account is the +safest way to run the full flow. diff --git a/packages/wallet-plugin-tacklebox/examples/dapp/index.html b/packages/wallet-plugin-tacklebox/examples/dapp/index.html new file mode 100644 index 00000000..fcdd635c --- /dev/null +++ b/packages/wallet-plugin-tacklebox/examples/dapp/index.html @@ -0,0 +1,62 @@ + + + + + + wallet-plugin-tacklebox example + + + +

wallet-plugin-tacklebox example

+

+ Login opens the Wharfkit modal with the ESR login request: copy it and paste it into + TackleBox under Contracts → ESR → CONNECT AS LOGIN. Transfer sends + 0.0001 of the core token to yourself, pushed straight into the wallet over the link + channel — with a matching pinned auto-sign whitelist rule it completes without + touching the wallet. +

+
Not logged in.
+ + + +
--
+ + + diff --git a/packages/wallet-plugin-tacklebox/examples/dapp/package-lock.json b/packages/wallet-plugin-tacklebox/examples/dapp/package-lock.json new file mode 100644 index 00000000..e32ff388 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/examples/dapp/package-lock.json @@ -0,0 +1,1258 @@ +{ + "name": "wallet-plugin-tacklebox-example", + "version": "0.1.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "wallet-plugin-tacklebox-example", + "version": "0.1.0", + "dependencies": { + "@wharfkit/session": "^1.7.0", + "@wharfkit/web-renderer": "^1.4.3", + "wallet-plugin-tacklebox": "file:../.." + }, + "devDependencies": { + "vite": "^5.4.0" + } + }, + "../..": { + "version": "0.1.0", + "license": "BSD-3-Clause", + "dependencies": { + "@greymass/buoy": "^1.0.3", + "@wharfkit/antelope": "^1.0.5", + "@wharfkit/protocol-esr": "^1.6.1", + "isomorphic-ws": "^5.0.0", + "tslib": "^2.1.0", + "ws": "^8.13.0" + }, + "devDependencies": { + "@rollup/plugin-json": "^4.1.0", + "@rollup/plugin-typescript": "^10.0.1", + "@types/chai": "^4.3.1", + "@types/mocha": "^9.0.0", + "@types/node": "^18.7.18", + "@typescript-eslint/eslint-plugin": "^5.20.0", + "@typescript-eslint/parser": "^5.20.0", + "@wharfkit/mock-data": "^1.3.0", + "@wharfkit/session": "^1.7.0", + "chai": "^4.3.4", + "eslint": "^8.13.0", + "eslint-config-prettier": "^8.1.0", + "eslint-plugin-prettier": "^4.0.0", + "mocha": "^10.0.0", + "nyc": "^15.1.0", + "pako": "^2.1.0", + "prettier": "^2.2.1", + "rollup": "^2.70.2", + "rollup-plugin-dts": "^4.2.1", + "sinon": "^15.0.1", + "ts-node": "^10.9.1", + "tsconfig-paths": "^4.1.1", + "typescript": "^4.9.5" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@wharfkit/session": "^1.7.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz", + "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz", + "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz", + "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz", + "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz", + "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz", + "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz", + "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz", + "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz", + "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz", + "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz", + "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz", + "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz", + "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz", + "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz", + "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz", + "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz", + "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz", + "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz", + "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz", + "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz", + "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz", + "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz", + "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz", + "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz", + "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@wharfkit/abicache": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@wharfkit/abicache/-/abicache-1.2.4.tgz", + "integrity": "sha512-DeIPotkMyOXZgLFOmmTXXbynNE1OF2bbEQlaUrqB1kGmNL3WJB1Y09NZ3huvFJylfqD928ZqIdGxB4KJ3iIcGw==", + "license": "BSD-3-Clause", + "dependencies": { + "@wharfkit/antelope": "^1.0.2", + "@wharfkit/signing-request": "^3.1.0", + "pako": "^2.0.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@wharfkit/antelope": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@wharfkit/antelope/-/antelope-1.2.0.tgz", + "integrity": "sha512-9q0nvM8yUtjKTQlukKZODAhUN2S2/cfSlIYdh2mPnaOCSH8KOLJ2gYCPuQVvH1FE9AKu312lM5TzhkRccf1VjQ==", + "license": "BSD-3-Clause-No-Military-License", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "elliptic": "^6.5.4", + "hash.js": "^1.0.0", + "pako": "^2.1.0", + "tslib": "^2.0.3" + } + }, + "node_modules/@wharfkit/common": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@wharfkit/common/-/common-1.5.0.tgz", + "integrity": "sha512-eqXkOy+vshcEzK8kED+EsoTPJjlBKHYglgV9CBnZQgIlGrWIRXWH4YaXH3W7EbI/nCRJCaNqxm5fC+pgpFcp8g==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@wharfkit/antelope": "^1.0.0" + } + }, + "node_modules/@wharfkit/session": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/@wharfkit/session/-/session-1.7.0.tgz", + "integrity": "sha512-mLfa62RAqk2o05P7qkp8TScRrN7mlimxHy92E5QEiQHpvIVz/KacZmjMBpWd0SueqrWGdpMbjx4WkjypPcRWgg==", + "license": "BSD-3-Clause", + "dependencies": { + "@wharfkit/abicache": "^1.2.1", + "@wharfkit/antelope": "^1.0.11", + "@wharfkit/common": "^1.2.0", + "@wharfkit/signing-request": "^3.1.0", + "pako": "^2.0.4", + "tslib": "^2.1.0" + } + }, + "node_modules/@wharfkit/signing-request": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@wharfkit/signing-request/-/signing-request-3.4.0.tgz", + "integrity": "sha512-WstXfmR9i5pKaYXDUwNFNCgBIvN6u5IRGWSfj5O3XzthbtJUmRoJNtjGMaNnUqZ1MMx5YY4/JpY3b2e6LbpXLw==", + "license": "MIT", + "dependencies": { + "@wharfkit/antelope": "^1.1.1", + "tslib": "^2.0.3" + } + }, + "node_modules/@wharfkit/web-renderer": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/@wharfkit/web-renderer/-/web-renderer-1.4.3.tgz", + "integrity": "sha512-rNmToX67Rv/QOLj8USrS9wDH0OKXq5H6jGqJu5BIcLnc1Equ/hzMHdQ3oW830Bd0AEqjI57JK8nxESC0Q/w4Sw==", + "license": "BSD-3-Clause", + "peerDependencies": { + "@wharfkit/session": "^1.4.0" + } + }, + "node_modules/bn.js": { + "version": "4.12.5", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.5.tgz", + "integrity": "sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==", + "license": "MIT" + }, + "node_modules/brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", + "license": "MIT" + }, + "node_modules/elliptic": { + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", + "license": "MIT", + "dependencies": { + "bn.js": "^4.11.9", + "brorand": "^1.1.0", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.1", + "inherits": "^2.0.4", + "minimalistic-assert": "^1.0.1", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "node_modules/hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", + "license": "MIT", + "dependencies": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "license": "ISC" + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "license": "ISC" + }, + "node_modules/minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.18", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", + "integrity": "sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/pako": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/pako/-/pako-2.2.0.tgz", + "integrity": "sha512-zJq6RP/5q+TO2OpFV3FHzlPnFjmkb7Nc99a5SNjJE+uu/PkpChs+NIZSSzbBoD+6kjiISXjfYdwj1ZRQ81dz/w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], + "license": "(MIT AND Zlib)" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/postcss": { + "version": "8.5.26", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.26.tgz", + "integrity": "sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.17", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.63.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz", + "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.1", + "@rollup/rollup-android-arm64": "4.63.1", + "@rollup/rollup-darwin-arm64": "4.63.1", + "@rollup/rollup-darwin-x64": "4.63.1", + "@rollup/rollup-freebsd-arm64": "4.63.1", + "@rollup/rollup-freebsd-x64": "4.63.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.1", + "@rollup/rollup-linux-arm-musleabihf": "4.63.1", + "@rollup/rollup-linux-arm64-gnu": "4.63.1", + "@rollup/rollup-linux-arm64-musl": "4.63.1", + "@rollup/rollup-linux-loong64-gnu": "4.63.1", + "@rollup/rollup-linux-loong64-musl": "4.63.1", + "@rollup/rollup-linux-ppc64-gnu": "4.63.1", + "@rollup/rollup-linux-ppc64-musl": "4.63.1", + "@rollup/rollup-linux-riscv64-gnu": "4.63.1", + "@rollup/rollup-linux-riscv64-musl": "4.63.1", + "@rollup/rollup-linux-s390x-gnu": "4.63.1", + "@rollup/rollup-linux-x64-gnu": "4.63.1", + "@rollup/rollup-linux-x64-musl": "4.63.1", + "@rollup/rollup-openbsd-x64": "4.63.1", + "@rollup/rollup-openharmony-arm64": "4.63.1", + "@rollup/rollup-win32-arm64-msvc": "4.63.1", + "@rollup/rollup-win32-ia32-msvc": "4.63.1", + "@rollup/rollup-win32-x64-gnu": "4.63.1", + "@rollup/rollup-win32-x64-msvc": "4.63.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/vite": { + "version": "5.4.21", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.21.tgz", + "integrity": "sha512-o5a9xKjbtuhY6Bi5S3+HvbRERmouabWbyUcpXXUA1u+GNUKoROi9byOJ8M0nHbHYHkYICiMlqxkg1KkYmm25Sw==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.21.3", + "postcss": "^8.4.43", + "rollup": "^4.20.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/wallet-plugin-tacklebox": { + "resolved": "../..", + "link": true + } + } +} diff --git a/packages/wallet-plugin-tacklebox/examples/dapp/package.json b/packages/wallet-plugin-tacklebox/examples/dapp/package.json new file mode 100644 index 00000000..4e793b95 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/examples/dapp/package.json @@ -0,0 +1,19 @@ +{ + "name": "wallet-plugin-tacklebox-example", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@wharfkit/session": "^1.7.0", + "@wharfkit/web-renderer": "^1.4.3", + "wallet-plugin-tacklebox": "file:../.." + }, + "devDependencies": { + "vite": "^5.4.0" + } +} diff --git a/packages/wallet-plugin-tacklebox/examples/dapp/src/main.ts b/packages/wallet-plugin-tacklebox/examples/dapp/src/main.ts new file mode 100644 index 00000000..83a0fb6c --- /dev/null +++ b/packages/wallet-plugin-tacklebox/examples/dapp/src/main.ts @@ -0,0 +1,137 @@ +import {Asset, Session, SessionKit} from '@wharfkit/session' +import {WebRenderer} from '@wharfkit/web-renderer' +import {WalletPluginTackleBox} from 'wallet-plugin-tacklebox' + +// Core token per supported chain, for the self-transfer demo action. +const CORE_TOKEN: Record = { + // Jungle4 testnet - the recommended chain for a first run. + '73e4385a2708e6d7048834fbc1079f2fabb17b3c125b146af438971e90716c4d': { + contract: 'eosio.token', + symbol: '4,EOS', + }, + // EOS / Vaulta + aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906: { + contract: 'eosio.token', + symbol: '4,EOS', + }, + // WAX + '1064487b3cd1a897ce03ae5b6a865651747e2e152090f99c1d19d44e01aea5a4': { + contract: 'eosio.token', + symbol: '8,WAX', + }, + // Telos + '4667b205c6838ef70ff7988f6e8257e8be0e1284a2f59699054a018f743b1d11': { + contract: 'eosio.token', + symbol: '4,TLOS', + }, +} + +const sessionKit = new SessionKit({ + appName: 'tacklebox-example', + chains: [ + { + id: '73e4385a2708e6d7048834fbc1079f2fabb17b3c125b146af438971e90716c4d', + url: 'https://jungle4.greymass.com', + }, + { + id: 'aca376f206b8fc25a6ed44dbdc66547c36c6c33e3a119ffbeaef943642f0e906', + url: 'https://eos.greymass.com', + }, + { + id: '1064487b3cd1a897ce03ae5b6a865651747e2e152090f99c1d19d44e01aea5a4', + url: 'https://wax.greymass.com', + }, + { + id: '4667b205c6838ef70ff7988f6e8257e8be0e1284a2f59699054a018f743b1d11', + url: 'https://telos.greymass.com', + }, + ], + ui: new WebRenderer(), + walletPlugins: [new WalletPluginTackleBox()], +}) + +let session: Session | undefined + +const el = (id: string) => document.getElementById(id) as HTMLButtonElement +const output = document.getElementById('output') as HTMLPreElement +const status = document.getElementById('status') as HTMLDivElement + +function render() { + if (session) { + status.textContent = `Logged in as ${session.actor}@${session.permission} (chain ${String( + session.chain.id + ).slice(0, 8)}…)` + } else { + status.textContent = 'Not logged in.' + } + el('login').disabled = Boolean(session) + el('transfer').disabled = !session + el('logout').disabled = !session +} + +function show(value: unknown) { + output.textContent = + value instanceof Error ? `Error: ${value.message}` : JSON.stringify(value, null, 2) +} + +el('login').addEventListener('click', async () => { + try { + const result = await sessionKit.login() + session = result.session + show({connected: String(result.response.permissionLevel)}) + } catch (error) { + show(error) + } + render() +}) + +el('logout').addEventListener('click', async () => { + if (session) { + await sessionKit.logout(session) + session = undefined + show('Logged out.') + } + render() +}) + +el('transfer').addEventListener('click', async () => { + if (!session) return + const core = CORE_TOKEN[String(session.chain.id)] + if (!core) { + show(new Error('No core token configured for this chain')) + return + } + try { + const result = await session.transact({ + action: { + account: core.contract, + name: 'transfer', + authorization: [session.permissionLevel], + data: { + from: session.actor, + to: session.actor, + quantity: Asset.fromUnits(1, core.symbol), + memo: 'wallet-plugin-tacklebox example', + }, + }, + }) + show({ + transaction_id: result.resolved?.transaction.id + ? String(result.resolved.transaction.id) + : undefined, + signatures: result.signatures.map(String), + }) + } catch (error) { + show(error) + } +}) + +sessionKit.restore().then((restored) => { + if (restored) { + session = restored + show('Session restored.') + } + render() +}) + +render() From d0ace2c13c877a33414cba7ee2172109dc00dcee Mon Sep 17 00:00:00 2001 From: on-a-t-break Date: Tue, 1 Sep 2026 11:26:32 -0700 Subject: [PATCH 05/22] Open TackleBox directly, anchor-style, and wear its dark Tron theme Login now fires a tacklebox://request/ deep link that opens the wallet with the identity request (channel-less signing does the same); the prompt keeps a Launch TackleBox link, the QR code and copy-paste as fallbacks, and a disableAutoLaunch option opts out. The wallet's own scheme is used because esr: may belong to Anchor on the same machine - verified live against an Anchor install. Channel signing does not navigate; TackleBox raises its own window when the push arrives. While a TackleBox prompt is up, the session modal wears the wallet's theme - deep-void navy, cyan light lines, restrained glow - via a stylesheet injected into the web renderer's shadow root, scoped behind a host attribute so other wallets' prompts keep the stock look, and feature-detected so non-web-renderer UIs are untouched. Co-Authored-By: Claude Fable 5 --- packages/wallet-plugin-tacklebox/README.md | 31 +- .../examples/dapp/index.html | 11 +- packages/wallet-plugin-tacklebox/package.json | 2 +- packages/wallet-plugin-tacklebox/src/index.ts | 382 +++++++++++------- packages/wallet-plugin-tacklebox/src/theme.ts | 166 ++++++++ .../src/translations/en.json | 7 +- .../test/tests/common.ts | 29 +- .../test/tests/login.ts | 49 ++- .../test/tests/sign.ts | 69 +++- .../test/tests/theme.ts | 84 ++++ 10 files changed, 652 insertions(+), 178 deletions(-) create mode 100644 packages/wallet-plugin-tacklebox/src/theme.ts create mode 100644 packages/wallet-plugin-tacklebox/test/tests/theme.ts diff --git a/packages/wallet-plugin-tacklebox/README.md b/packages/wallet-plugin-tacklebox/README.md index 4cb6dff0..4cf52d07 100644 --- a/packages/wallet-plugin-tacklebox/README.md +++ b/packages/wallet-plugin-tacklebox/README.md @@ -11,18 +11,24 @@ friends). ## How it works -TackleBox is a desktop-first native app that does not register an `esr://` URL handler, so the -flow is paste-first: - -1. **Login** — the plugin renders an ESR identity request as a QR code, a **Copy login request** - button and an `esr:` link. The user pastes it into TackleBox under - **Contracts → ESR → CONNECT AS LOGIN** (or scans the QR with TackleBox on another device) and - approves the connection. TackleBox answers over a [buoy](https://github.com/greymass/buoy) - callback and announces its sealed push channel (`link_ch` / `link_key` / `link_name`). +The flow mirrors Anchor's: requests open the wallet directly, with QR and copy-paste fallbacks. + +1. **Login** — the plugin fires a `tacklebox://request/…` deep link that opens TackleBox with + the ESR identity request (the wallet registers the `tacklebox:` scheme per user, and claims + `esr:` only when no other wallet owns it — so an Anchor install keeps its links). The prompt + keeps a **Launch TackleBox** link, a QR code and a **Copy login request** fallback + (paste target: **Contracts → ESR → CONNECT AS LOGIN**). TackleBox answers over a + [buoy](https://github.com/greymass/buoy) callback and announces its sealed push channel + (`link_ch` / `link_key` / `link_name`). 2. **Transact** — signing requests are sealed to the wallet's session key and pushed straight - into TackleBox over that channel. Every request still passes TackleBox's whitelist guard, - contract-hash verification and signing review before a signature is produced and returned via - callback. A **Sign manually instead** fallback shows the request as QR/copyable text. + into TackleBox over that channel; the wallet raises its own window for review. Every request + still passes TackleBox's whitelist guard, contract-hash verification and signing review + before a signature is produced and returned via callback. **Open TackleBox** and + **Sign manually instead** fallbacks cover a closed wallet or another device. + +While a TackleBox prompt is up, the Wharfkit modal wears the wallet's own dark theme — +deep-void navy, cyan light lines, restrained glow — scoped so other wallets' prompts keep the +stock look (and skipped entirely on non-web-renderer UIs). ## Installation @@ -68,6 +74,9 @@ new WalletPluginTackleBox({ buoyUrl: 'https://cb.anchor.link', // WebSocket constructor override (defaults to isomorphic-ws). buoyWs: WebSocket, + // Keep the tacklebox: deep link from firing automatically on login and + // manual signing; the prompt's launch link and fallbacks remain. + disableAutoLaunch: false, }) ``` diff --git a/packages/wallet-plugin-tacklebox/examples/dapp/index.html b/packages/wallet-plugin-tacklebox/examples/dapp/index.html index fcdd635c..c075d9b8 100644 --- a/packages/wallet-plugin-tacklebox/examples/dapp/index.html +++ b/packages/wallet-plugin-tacklebox/examples/dapp/index.html @@ -46,11 +46,12 @@

wallet-plugin-tacklebox example

- Login opens the Wharfkit modal with the ESR login request: copy it and paste it into - TackleBox under Contracts → ESR → CONNECT AS LOGIN. Transfer sends - 0.0001 of the core token to yourself, pushed straight into the wallet over the link - channel — with a matching pinned auto-sign whitelist rule it completes without - touching the wallet. + Login fires a tacklebox:// deep link that opens the wallet with the ESR + login request (QR and copy-paste into + Contracts → ESR → CONNECT AS LOGIN remain as fallbacks). Transfer + sends 0.0001 of the core token to yourself, pushed straight into the wallet over the + link channel — TackleBox raises its own window for review, and with a matching + pinned auto-sign whitelist rule it completes without touching the wallet.

Not logged in.
diff --git a/packages/wallet-plugin-tacklebox/package.json b/packages/wallet-plugin-tacklebox/package.json index 260bc4a4..96ce31ac 100644 --- a/packages/wallet-plugin-tacklebox/package.json +++ b/packages/wallet-plugin-tacklebox/package.json @@ -1,7 +1,7 @@ { "name": "wallet-plugin-tacklebox", "description": "A TackleBox wallet plugin for use with @wharfkit/session.", - "version": "0.1.0", + "version": "0.2.0", "homepage": "https://github.com/on-a-t-break/wallet-plugin-tacklebox", "license": "BSD-3-Clause", "main": "lib/wallet-plugin-tacklebox.js", diff --git a/packages/wallet-plugin-tacklebox/src/index.ts b/packages/wallet-plugin-tacklebox/src/index.ts index 8fa4d0de..f92553bf 100644 --- a/packages/wallet-plugin-tacklebox/src/index.ts +++ b/packages/wallet-plugin-tacklebox/src/index.ts @@ -11,6 +11,7 @@ import { PublicKey, ResolvedSigningRequest, Serializer, + SigningRequest, TransactContext, WalletPluginConfig, WalletPluginLoginResponse, @@ -33,6 +34,7 @@ import WebSocket from 'isomorphic-ws' import defaultTranslations from './translations' import {tackleboxLogo} from './logo' +import {applyModalTheme} from './theme' /** Options for the TackleBox wallet plugin. */ export interface WalletPluginTackleBoxOptions { @@ -45,6 +47,12 @@ export interface WalletPluginTackleBoxOptions { buoyUrl?: string /** WebSocket constructor override forwarded to buoy callback handling. */ buoyWs?: WebSocket + /** + * Skip firing the `tacklebox:` deep link that opens the wallet app + * automatically on login and manual signing. The prompt always keeps the + * launch link, QR code and copy fallbacks. + */ + disableAutoLaunch?: boolean } /** Default buoy service, shared with the rest of the anchor-link ecosystem. */ @@ -54,16 +62,17 @@ export const DEFAULT_BUOY_URL = 'https://cb.anchor.link' * A @wharfkit/session WalletPlugin for TackleBox, the native wallet and block * explorer for Antelope blockchains (https://github.com/on-a-t-break/tacklebox). * - * TackleBox speaks the anchor-link protocol: the login prompt presents an ESR - * identity request the user pastes into TackleBox (Contracts → ESR → CONNECT AS - * LOGIN) or scans as a QR code. TackleBox answers over a buoy callback and - * opens a sealed push channel; subsequent transactions are pushed straight into - * the wallet, where each request still passes TackleBox's whitelist guard and - * signing review. + * TackleBox speaks the anchor-link protocol. Logging in fires a `tacklebox:` + * deep link that opens the wallet with the ESR identity request (with QR code + * and copy-paste fallbacks in the prompt); TackleBox answers over a buoy + * callback and opens a sealed push channel. Transactions are then pushed + * straight into the wallet, which raises its own window for review - every + * request still passes TackleBox's whitelist guard and signing review. */ export class WalletPluginTackleBox extends AbstractWalletPlugin { buoyUrl: string buoyWs: WebSocket | undefined + autoLaunch: boolean /** * The unique identifier for the wallet plugin. @@ -81,6 +90,7 @@ export class WalletPluginTackleBox extends AbstractWalletPlugin { super() this.buoyUrl = options?.buoyUrl || DEFAULT_BUOY_URL this.buoyWs = options?.buoyWs || WebSocket + this.autoLaunch = !options?.disableAutoLaunch } /** @@ -115,102 +125,119 @@ export class WalletPluginTackleBox extends AbstractWalletPlugin { } const t = context.ui.getTranslate(this.id) - - const {callback, request, requestKey, privateKey} = await createIdentityRequest( - context, - this.buoyUrl - ) - - const encodedRequest = request.encode(true, true, 'esr:') - - const prompt = (copied: boolean) => { - const elements: PromptElement[] = [ - { - type: 'button', - label: t('login.copy', {default: 'Copy login request'}), - data: { - label: t('login.copy', {default: 'Copy login request'}), - variant: 'primary', - onClick: () => { - copyToClipboard(encodedRequest).then( - (ok) => ok && !copied && prompt(true) - ) + const revertTheme = applyModalTheme(context.ui) + + try { + const {callback, request, sameDeviceRequest, requestKey, privateKey} = + await createIdentityRequest(context, this.buoyUrl) + + const encodedRequest = request.encode(true, true, 'esr:') + const launchUrl = tackleboxDeepLink(sameDeviceRequest) + + const prompt = (copied: boolean) => { + const elements: PromptElement[] = [ + { + type: 'link', + label: t('login.launch', {default: 'Launch TackleBox'}), + data: { + href: launchUrl, + label: t('login.launch', {default: 'Launch TackleBox'}), + variant: 'primary', }, }, - }, - { - type: 'link', - label: t('login.link', {default: 'Open esr: link'}), - data: { - href: encodedRequest, - label: t('login.link', {default: 'Open esr: link'}), + { + type: 'button', + label: t('login.copy', {default: 'Copy login request'}), + data: { + label: t('login.copy', {default: 'Copy login request'}), + onClick: () => { + copyToClipboard(encodedRequest).then( + (ok) => ok && !copied && prompt(true) + ) + }, + }, }, - }, - ] - - // The QR code only helps when this device is not the one running - // the wallet - hide it on known-mobile dapp devices. - if (!onMobileDevice()) { - elements.unshift({ - type: 'qr', - data: encodedRequest, + ] + + // The QR code only helps when this device is not the one + // running the wallet - hide it on known-mobile dapp devices. + if (!onMobileDevice()) { + elements.unshift({ + type: 'qr', + data: encodedRequest, + }) + } + + const promptPromise = context.ui!.prompt({ + title: t('login.title', {default: 'Connect with TackleBox'}), + body: copied + ? t('login.copied', { + default: + 'Request copied. In TackleBox, open Contracts → ESR → CONNECT AS LOGIN and paste it to continue.', + }) + : t('login.body', { + default: + 'TackleBox should open with this login request - approve the connection there. If nothing opens, launch it with the button, copy the request into TackleBox (Contracts → ESR → CONNECT AS LOGIN), or scan the QR code.', + }), + elements, }) + // The modal closing is handled by the session kit; swallow the rejection. + promptPromise.catch(() => undefined) } - const promptPromise = context.ui!.prompt({ - title: t('login.title', {default: 'Connect with TackleBox'}), - body: copied - ? t('login.copied', { - default: - 'Request copied. In TackleBox, open Contracts → ESR → CONNECT AS LOGIN and paste it to continue.', - }) - : t('login.body', { - default: - 'Copy the login request and paste it into TackleBox (Contracts → ESR → CONNECT AS LOGIN), or scan the QR code with TackleBox on another device.', - }), - elements, - }) - // The modal closing is handled by the session kit; swallow the rejection. - promptPromise.catch(() => undefined) - } + prompt(false) - prompt(false) + // Open the wallet directly with the request, anchor-style. + if (this.autoLaunch) { + openDeepLink(launchUrl) + } - const callbackResponse: CallbackPayload = await waitForCallback(callback, this.buoyWs, t) + const callbackResponse: CallbackPayload = await waitForCallback( + callback, + this.buoyWs, + t + ) - verifyLoginCallbackResponse(callbackResponse, context) + verifyLoginCallbackResponse(callbackResponse, context) - if (!callbackResponse.cid || !callbackResponse.sa || !callbackResponse.sp) { - throw new Error( - t('error.invalid_response', { - default: - 'Invalid response from TackleBox, it must contain the cid, sa and sp fields.', - }) - ) - } + if (!callbackResponse.cid || !callbackResponse.sa || !callbackResponse.sp) { + throw new Error( + t('error.invalid_response', { + default: + 'Invalid response from TackleBox, it must contain the cid, sa and sp fields.', + }) + ) + } - // TackleBox always opens a push channel on login; store it so transact - // requests can be pushed straight into the wallet. - if (callbackResponse.link_ch && callbackResponse.link_key && callbackResponse.link_name) { - this.data.requestKey = requestKey - this.data.privateKey = privateKey - this.data.signerKey = PublicKey.from(callbackResponse.link_key) - this.data.channelUrl = callbackResponse.link_ch - this.data.channelName = callbackResponse.link_name - } + // TackleBox always opens a push channel on login; store it so + // transact requests can be pushed straight into the wallet. + if ( + callbackResponse.link_ch && + callbackResponse.link_key && + callbackResponse.link_name + ) { + this.data.requestKey = requestKey + this.data.privateKey = privateKey + this.data.signerKey = PublicKey.from(callbackResponse.link_key) + this.data.channelUrl = callbackResponse.link_ch + this.data.channelName = callbackResponse.link_name + } + + const resolvedResponse = await ResolvedSigningRequest.fromPayload( + callbackResponse, + context.esrOptions + ) - const resolvedResponse = await ResolvedSigningRequest.fromPayload( - callbackResponse, - context.esrOptions - ) - - return { - chain: Checksum256.from(callbackResponse.cid), - permissionLevel: PermissionLevel.from({ - actor: callbackResponse.sa, - permission: callbackResponse.sp, - }), - identityProof: resolvedResponse.getIdentityProof(callbackResponse.sig), + return { + chain: Checksum256.from(callbackResponse.cid), + permissionLevel: PermissionLevel.from({ + actor: callbackResponse.sa, + permission: callbackResponse.sp, + }), + identityProof: resolvedResponse.getIdentityProof(callbackResponse.sig), + } + } finally { + revertTheme() } } @@ -230,6 +257,7 @@ export class WalletPluginTackleBox extends AbstractWalletPlugin { } const t = context.ui.getTranslate(this.id) + const revertTheme = applyModalTheme(context.ui) const expiration = resolved.transaction.expiration.toDate() const expiresIn = Math.max(0, expiration.getTime() - Date.now()) @@ -241,6 +269,7 @@ export class WalletPluginTackleBox extends AbstractWalletPlugin { const callback = setTransactionCallback(modifiedRequest, this.buoyUrl) const encodedRequest = modifiedRequest.encode(true, true, 'esr:') + const launchUrl = tackleboxDeepLink(modifiedRequest) // Track every prompt shown for this signature so the first one the // user dismisses cancels the flow, whichever variant is on screen. @@ -261,14 +290,23 @@ export class WalletPluginTackleBox extends AbstractWalletPlugin { }, } + const launchElement: PromptElement = { + type: 'link', + label: t('transact.launch', {default: 'Open TackleBox'}), + data: { + href: launchUrl, + label: t('transact.launch', {default: 'Open TackleBox'}), + }, + } + const promptManual = (copied: boolean) => { const elements: PromptElement[] = [ + launchElement, { type: 'button', label: t('transact.copy', {default: 'Copy signing request'}), data: { label: t('transact.copy', {default: 'Copy signing request'}), - variant: 'primary', onClick: () => { copyToClipboard(encodedRequest).then( (ok) => ok && !copied && promptManual(true) @@ -294,82 +332,120 @@ export class WalletPluginTackleBox extends AbstractWalletPlugin { }) : t('transact.body_manual', { default: - 'Copy the signing request and paste it into TackleBox (Contracts → ESR), or scan the QR code with TackleBox on another device.', + 'TackleBox should open with this signing request. If nothing opens, launch it with the button, copy the request into TackleBox (Contracts → ESR), or scan the QR code.', }), elements, }) ) } - if (this.data.channelUrl) { - onPromptSettled( - context.ui.prompt({ - title: t('transact.title', {default: 'Sign with TackleBox'}), - body: t('transact.body', { - channelName: this.data.channelName, - default: `Review and approve this transaction in TackleBox ("${this.data.channelName}").`, - }), - elements: [ - countdown, - { - type: 'button', - label: t('transact.manual', {default: 'Sign manually instead'}), - data: { + try { + if (this.data.channelUrl) { + onPromptSettled( + context.ui.prompt({ + title: t('transact.title', {default: 'Sign with TackleBox'}), + body: t('transact.body', { + channelName: this.data.channelName, + default: `Review and approve this transaction in TackleBox ("${this.data.channelName}").`, + }), + elements: [ + countdown, + launchElement, + { + type: 'button', label: t('transact.manual', {default: 'Sign manually instead'}), - onClick: () => promptManual(false), + data: { + label: t('transact.manual', { + default: 'Sign manually instead', + }), + onClick: () => promptManual(false), + }, }, - }, - ], - }) - ) - } else { - promptManual(false) - } - - // Timeouts above 2^31-1ms fire immediately; clamp far-future expiries. - const timer = setTimeout(() => { - prompts.forEach((p) => - p.cancel(t('error.expired', {default: 'The request expired, please try again.'})) - ) - }, Math.min(expiresIn, 0x7fffffff)) - - const callbackPromise = waitForCallback(callback, this.buoyWs, t) - - if (this.data.channelUrl) { - // Seal the request to the wallet's session key and push it into - // TackleBox over its buoy channel. - const service = new URL(this.data.channelUrl).origin - const channel = new URL(this.data.channelUrl).pathname.substring(1) - const sealedMessage = await sealMessage( - encodedRequest, - PrivateKey.from(this.data.privateKey), - PublicKey.from(this.data.signerKey) - ) - send(Serializer.encode({object: sealedMessage}).array, {service, channel}) - } + ], + }) + ) + } else { + promptManual(false) + // No push channel: open the wallet directly with the request. + if (this.autoLaunch) { + openDeepLink(launchUrl) + } + } - const callbackResponse = await Promise.race([callbackPromise, promptSettled]).finally( - () => { - clearTimeout(timer) - prompts.forEach((p) => p.cancel()) + // Timeouts above 2^31-1ms fire immediately; clamp far-future expiries. + const timer = setTimeout(() => { + prompts.forEach((p) => + p.cancel( + t('error.expired', {default: 'The request expired, please try again.'}) + ) + ) + }, Math.min(expiresIn, 0x7fffffff)) + + const callbackPromise = waitForCallback(callback, this.buoyWs, t) + + if (this.data.channelUrl) { + // Seal the request to the wallet's session key and push it + // into TackleBox over its buoy channel; the wallet raises its + // own window when the request arrives. + const service = new URL(this.data.channelUrl).origin + const channel = new URL(this.data.channelUrl).pathname.substring(1) + const sealedMessage = await sealMessage( + encodedRequest, + PrivateKey.from(this.data.privateKey), + PublicKey.from(this.data.signerKey) + ) + send(Serializer.encode({object: sealedMessage}).array, {service, channel}) } - ) - if ( - isCallback(callbackResponse) && - extractSignaturesFromCallback(callbackResponse).length - ) { - const resolvedRequest = await ResolvedSigningRequest.fromPayload( - callbackResponse, - context.esrOptions + const callbackResponse = await Promise.race([callbackPromise, promptSettled]).finally( + () => { + clearTimeout(timer) + prompts.forEach((p) => p.cancel()) + } ) - return { - signatures: extractSignaturesFromCallback(callbackResponse), - resolved: resolvedRequest, + + if ( + isCallback(callbackResponse) && + extractSignaturesFromCallback(callbackResponse).length + ) { + const resolvedRequest = await ResolvedSigningRequest.fromPayload( + callbackResponse, + context.esrOptions + ) + return { + signatures: extractSignaturesFromCallback(callbackResponse), + resolved: resolvedRequest, + } } + + throw new Error(t('error.not_completed', {default: 'The request was not completed.'})) + } finally { + revertTheme() } + } +} - throw new Error(t('error.not_completed', {default: 'The request was not completed.'})) +/** + * The `tacklebox:` deep link that opens the wallet app with a signing request. + * + * TackleBox registers the `tacklebox:` scheme (and claims `esr:` only when no + * other wallet has it), so plugin-fired links use its own scheme - on machines + * where Anchor owns `esr:`, a plain esr link would open the wrong wallet. The + * payload is the request body without the scheme, which the wallet turns back + * into an `esr://` URI. + */ +export function tackleboxDeepLink(request: SigningRequest): string { + const encoded = request.encode(true, false, 'esr:') + return `tacklebox://request/${encoded.slice('esr:'.length)}` +} + +function openDeepLink(url: string) { + try { + if (typeof window !== 'undefined' && window.location) { + window.location.href = url + } + } catch (error) { + // Leaving the prompt's launch link as the way in. } } @@ -412,3 +488,5 @@ export async function copyToClipboard(text: string): Promise { } return false } + +export {applyModalTheme, tackleboxModalStyles} from './theme' diff --git a/packages/wallet-plugin-tacklebox/src/theme.ts b/packages/wallet-plugin-tacklebox/src/theme.ts new file mode 100644 index 00000000..bf853084 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/src/theme.ts @@ -0,0 +1,166 @@ +/** + * The TackleBox look for the session modal: deep-void navy, cyan light lines, + * restrained glow - matching the wallet's own ImGui theme. + * + * The Wharfkit web renderer keeps its styles inside a closed shadow root, but + * exposes the root (`ui.shadow`) and its host element (`ui.element`) as public + * fields. We inject one stylesheet into the shadow root, scoped behind a + * `data-tacklebox` attribute on the host, and only set that attribute while a + * TackleBox prompt is on screen - other wallets' prompts keep the stock look. + * Everything is feature-detected: with a different UserInterface the theme + * simply does not apply. + */ + +const STYLE_ID = 'wallet-plugin-tacklebox-theme' +const HOST_ATTRIBUTE = 'data-tacklebox' + +// TackleBox palette (src/ui/theme.hpp in the wallet). +const VOID = '#04070c' +const BG = '#070b14' +const PANEL = '#0a121f' +const PANEL_HI = '#0e1828' +const INSET = '#060d18' +const HAIRLINE = '#14273b' +const HAIR_HI = '#25567c' +const CYAN = '#00e0ff' +const CYAN_DIM = '#0e7a96' +const ICE = '#d9f2ff' +const STEEL = '#7a96ac' +const SLATE = '#455c72' +const DANGER = '#ff3d5f' + +export const tackleboxModalStyles = ` +:host([${HOST_ATTRIBUTE}]) dialog { + color-scheme: dark; + + /* Brand hooks the renderer derives accents from. */ + --wharf-blue: ${CYAN}; + --reef-turquoise: ${CYAN}; + --seafoam-mint: ${CYAN}; + --swell-mist: ${PANEL_HI}; + + /* Primary scale: navy voids and panels. */ + --color-primary-50: ${ICE}; + --color-primary-100: #c3e4f7; + --color-primary-200: #9cc0d6; + --color-primary-300: ${STEEL}; + --color-primary-400: #5f7e97; + --color-primary-500: ${SLATE}; + --color-primary-600: #2e4459; + --color-primary-700: ${VOID}; + --color-primary-800: ${PANEL_HI}; + --color-primary-900: ${INSET}; + --color-primary-990: ${PANEL}; + + /* Secondary scale: the cyan line-light. */ + --color-secondary-200: ${CYAN}; + --color-secondary-300: ${CYAN}; + --color-secondary-400: #33e7ff; + --color-secondary-500: rgba(0, 224, 255, 0.16); + + --color-custom-2: rgba(0, 224, 255, 0.28); + --color-custom-3: ${CYAN_DIM}; + --color-custom-4: #0c1b2e; + --color-custom-6: ${HAIR_HI}; + --color-custom-8: ${PANEL_HI}; + --color-neutral-300: ${STEEL}; + + /* Body and header. */ + --body-background-color: ${PANEL}; + --body-text-color: ${ICE}; + --body-text-color-variant: ${STEEL}; + --header-background-color: ${VOID}; + --header-text-color: ${ICE}; + --header-button-background: ${VOID}; + --header-button-outline: ${HAIRLINE}; + + /* Buttons: dark wells behind cyan hairlines. */ + --button-text-color: ${ICE}; + --button-text-color-active: ${CYAN}; + --button-outline: inset 0 0 0 1px rgba(0, 224, 255, 0.38); + --button-outline-active: inset 0 0 0 2px ${CYAN}; + --button-primary-background: rgba(0, 224, 255, 0.16); + --button-primary-background-hover: rgba(0, 224, 255, 0.26); + --button-primary-background-active: rgba(0, 224, 255, 0.32); + --button-primary-outline-hover: inset 0 0 0 1px ${CYAN}; + --button-secondary-background: ${PANEL_HI}; + --button-secondary-background-hover: ${PANEL_HI}; + --button-secondary-background-active: ${INSET}; + --button-secondary-outline-hover: inset 0 0 0 1px ${HAIR_HI}; + --button-outlined-background-active: ${PANEL_HI}; + --button-outlined-outline: inset 0 0 0 1px ${HAIRLINE}; + --button-outlined-outline-hover: inset 0 0 0 1px ${HAIR_HI}; + --button-tertiary-color: ${STEEL}; + + /* Inputs and text wells. */ + --input-placeholder-color: ${SLATE}; + --input-background-focus: #0c1b2e; + --input-border-color: ${HAIRLINE}; + --input-border-color-hover: ${HAIR_HI}; + --input-border-color-focus: ${CYAN}; + --text-area-background: ${INSET}; + --text-area-text-color: ${ICE}; + + /* Details. */ + --qr-border-color: inset 0 0 0 1px rgba(0, 224, 255, 0.35); + --checkbox-stroke: ${CYAN}; + --checkbox-fill: ${CYAN_DIM}; + --error-color: ${DANGER}; + --list-item-background-color-hover: ${PANEL_HI}; + --list-item-text-color-hover: #33e7ff; + --list-divider-color: rgba(20, 39, 59, 0.6); + --loading-circle-color: ${CYAN}; + --loading-circle-track-color: rgba(0, 224, 255, 0.08); + --wave-foreground-color: ${PANEL}; + --wave-midground-color: ${PANEL_HI}; + --wave-background-color: ${HAIRLINE}; + + /* The card itself: hard navy edge, restrained cyan glow. */ + background: linear-gradient(180deg, ${PANEL} 0%, ${BG} 100%); + border: 1px solid ${HAIR_HI}; + box-shadow: 0 0 0 1px rgba(0, 224, 255, 0.1), 0 0 28px rgba(0, 224, 255, 0.1), + 0 28px 80px rgba(0, 0, 0, 0.65); +} +` + +// Balanced apply/revert across overlapping prompts. +let themeDepth = 0 + +/** + * Skin the web renderer's modal with the TackleBox theme while a TackleBox + * prompt is up. Returns a revert function; both directions are no-ops when the + * UserInterface is not the Wharfkit web renderer. + */ +export function applyModalTheme(ui: unknown): () => void { + try { + const renderer = ui as {shadow?: ShadowRoot; element?: Element} + const shadow = renderer?.shadow + const host = renderer?.element + if (!shadow || !host || typeof host.setAttribute !== 'function') { + return () => undefined + } + if (!shadow.getElementById || !shadow.getElementById(STYLE_ID)) { + const style = document.createElement('style') + style.id = STYLE_ID + style.textContent = tackleboxModalStyles + shadow.appendChild(style) + } + host.setAttribute(HOST_ATTRIBUTE, '') + themeDepth++ + let reverted = false + return () => { + if (reverted) return + reverted = true + themeDepth = Math.max(0, themeDepth - 1) + if (themeDepth === 0) { + try { + host.removeAttribute(HOST_ATTRIBUTE) + } catch (error) { + // Never let styling interfere with the session flow. + } + } + } + } catch (error) { + return () => undefined + } +} diff --git a/packages/wallet-plugin-tacklebox/src/translations/en.json b/packages/wallet-plugin-tacklebox/src/translations/en.json index 9a16fcf3..1dd87c75 100644 --- a/packages/wallet-plugin-tacklebox/src/translations/en.json +++ b/packages/wallet-plugin-tacklebox/src/translations/en.json @@ -1,19 +1,20 @@ { "login": { "title": "Connect with TackleBox", - "body": "Copy the login request and paste it into TackleBox (Contracts → ESR → CONNECT AS LOGIN), or scan the QR code with TackleBox on another device.", + "body": "TackleBox should open with this login request - approve the connection there. If nothing opens, launch it with the button, copy the request into TackleBox (Contracts → ESR → CONNECT AS LOGIN), or scan the QR code.", "copied": "Request copied. In TackleBox, open Contracts → ESR → CONNECT AS LOGIN and paste it to continue.", "copy": "Copy login request", - "link": "Open esr: link" + "launch": "Launch TackleBox" }, "transact": { "title": "Sign with TackleBox", "title_manual": "Sign with TackleBox", "body": "Review and approve this transaction in TackleBox (\"{{channelName}}\").", - "body_manual": "Copy the signing request and paste it into TackleBox (Contracts → ESR), or scan the QR code with TackleBox on another device.", + "body_manual": "TackleBox should open with this signing request. If nothing opens, launch it with the button, copy the request into TackleBox (Contracts → ESR), or scan the QR code.", "copied": "Request copied. In TackleBox, open Contracts → ESR and paste it to continue.", "copy": "Copy signing request", "manual": "Sign manually instead", + "launch": "Open TackleBox", "await": "Waiting for TackleBox" }, "error": { diff --git a/packages/wallet-plugin-tacklebox/test/tests/common.ts b/packages/wallet-plugin-tacklebox/test/tests/common.ts index 5629f4b9..5ada34ff 100644 --- a/packages/wallet-plugin-tacklebox/test/tests/common.ts +++ b/packages/wallet-plugin-tacklebox/test/tests/common.ts @@ -1,7 +1,9 @@ import {assert} from 'chai' -import {AbstractWalletPlugin} from '@wharfkit/session' +import zlib from 'pako' +import {AbstractWalletPlugin, SigningRequest} from '@wharfkit/session' +import {mockChainId} from '@wharfkit/mock-data' -import {copyToClipboard, DEFAULT_BUOY_URL, WalletPluginTackleBox} from '$lib' +import {copyToClipboard, DEFAULT_BUOY_URL, tackleboxDeepLink, WalletPluginTackleBox} from '$lib' suite('plugin surface', function () { test('is a wallet plugin with the expected id', function () { @@ -48,4 +50,27 @@ suite('plugin surface', function () { test('clipboard helper degrades gracefully outside a browser', async function () { assert.isFalse(await copyToClipboard('esr://test')) }) + + test('deep links carry the request payload on the tacklebox scheme', function () { + const request = SigningRequest.identity( + { + callback: {url: 'https://cb.anchor.link/unittest', background: true}, + scope: 'unittest', + chainId: mockChainId, + }, + {zlib} + ) + const link = tackleboxDeepLink(request) + assert.isTrue(link.startsWith('tacklebox://request/')) + + const payload = link.slice('tacklebox://request/'.length) + const roundTrip = SigningRequest.from(`esr://${payload}`, {zlib}) + assert.isTrue(roundTrip.isIdentity()) + assert.equal(String(roundTrip.getIdentityScope()), 'unittest') + }) + + test('auto-launch can be disabled by option', function () { + assert.isTrue(new WalletPluginTackleBox().autoLaunch) + assert.isFalse(new WalletPluginTackleBox({disableAutoLaunch: true}).autoLaunch) + }) }) diff --git a/packages/wallet-plugin-tacklebox/test/tests/login.ts b/packages/wallet-plugin-tacklebox/test/tests/login.ts index a19c416e..ed73ac0f 100644 --- a/packages/wallet-plugin-tacklebox/test/tests/login.ts +++ b/packages/wallet-plugin-tacklebox/test/tests/login.ts @@ -35,8 +35,21 @@ function makeLoginContext(ui: any): LoginContext { } as unknown as LoginContext } +function stubBrowserWindow(): {location: {href: string}} { + const fakeWindow = {location: {href: 'http://localhost/unittest'}} + ;(global as any).window = fakeWindow + ;(global as any).navigator = {userAgent: 'mocha-unittest'} + return fakeWindow +} + +function unstubBrowserWindow() { + delete (global as any).window + delete (global as any).navigator +} + suite('login', function () { teardown(function () { + unstubBrowserWindow() sinon.restore() }) @@ -90,7 +103,7 @@ suite('login', function () { assert.isUndefined(plugin.data.channelUrl) }) - test('prompts with a paste-first flow: QR, copy button and esr link', async function () { + test('prompts with a QR code, a launch link and a copy fallback', async function () { sinon.stub(buoy, 'receive').resolves(JSON.stringify(makeLoginCallbackPayload())) const plugin = new WalletPluginTackleBox() @@ -103,9 +116,13 @@ suite('login', function () { const elements = args.elements as PromptElement[] assert.deepEqual( elements.map((e) => e.type), - ['qr', 'button', 'link'] + ['qr', 'link', 'button'] ) + // The launch link targets the wallet's own scheme. + const link: any = elements.find((e) => e.type === 'link') + assert.isTrue(String(link.data.href).startsWith('tacklebox://request/')) + // The rendered request is a valid ESR identity request. const qr: any = elements.find((e) => e.type === 'qr') assert.isTrue(String(qr.data).startsWith('esr://')) @@ -113,6 +130,34 @@ suite('login', function () { assert.isTrue(request.isIdentity()) }) + test('opens TackleBox directly when a window exists', async function () { + sinon.stub(buoy, 'receive').resolves(JSON.stringify(makeLoginCallbackPayload())) + const fakeWindow = stubBrowserWindow() + + const plugin = new WalletPluginTackleBox() + await plugin.login(makeLoginContext(makeMockUI())) + + assert.isTrue(fakeWindow.location.href.startsWith('tacklebox://request/')) + // The deep link payload decodes back into the identity request. + const payload = fakeWindow.location.href.slice('tacklebox://request/'.length) + const request = SigningRequest.from(`esr://${payload}`, {zlib}) + assert.isTrue(request.isIdentity()) + }) + + test('honors the disableAutoLaunch option', async function () { + sinon.stub(buoy, 'receive').resolves(JSON.stringify(makeLoginCallbackPayload())) + const fakeWindow = stubBrowserWindow() + + const plugin = new WalletPluginTackleBox({disableAutoLaunch: true}) + const ui = makeMockUI() + await plugin.login(makeLoginContext(ui)) + + assert.equal(fakeWindow.location.href, 'http://localhost/unittest') + // The launch link stays available in the prompt. + const elements = ui.prompts[0].elements as PromptElement[] + assert.isTrue(elements.some((e) => e.type === 'link')) + }) + test('listens for the callback on the configured buoy service', async function () { const receiveStub = sinon .stub(buoy, 'receive') diff --git a/packages/wallet-plugin-tacklebox/test/tests/sign.ts b/packages/wallet-plugin-tacklebox/test/tests/sign.ts index e96a9fc8..ea6d3d16 100644 --- a/packages/wallet-plugin-tacklebox/test/tests/sign.ts +++ b/packages/wallet-plugin-tacklebox/test/tests/sign.ts @@ -137,8 +137,10 @@ suite('sign', function () { assert.match(String(prompt.body), /TackleBox/) assert.deepEqual( (prompt.elements as any[]).map((e) => e.type), - ['countdown', 'button'] + ['countdown', 'link', 'button'] ) + const link: any = (prompt.elements as any[]).find((e) => e.type === 'link') + assert.isTrue(String(link.data.href).startsWith('tacklebox://request/')) }) test('falls back to the paste flow when no channel was announced', async function () { @@ -167,8 +169,71 @@ suite('sign', function () { const prompt = ui.prompts[ui.prompts.length - 1] const types = (prompt.elements as any[]).map((e) => e.type) - assert.deepEqual(types, ['qr', 'button', 'countdown']) + assert.deepEqual(types, ['qr', 'link', 'button', 'countdown']) const qr: any = (prompt.elements as any[]).find((e) => e.type === 'qr') assert.isTrue(String(qr.data).startsWith('esr://')) }) + + test('opens TackleBox directly for channel-less signing when a window exists', async function () { + const receiveStub = sinon.stub(buoy, 'receive') + sinon.stub(buoy, 'send') + receiveStub + .onFirstCall() + .resolves(JSON.stringify(makeLoginCallbackPayload({channel: false}))) + receiveStub + .onSecondCall() + .callsFake(async () => + JSON.stringify(await makeTransactCallbackPayload(transferAction)) + ) + + const fakeWindow = {location: {href: 'http://localhost/unittest'}} + ;(global as any).window = fakeWindow + ;(global as any).navigator = {userAgent: 'mocha-unittest'} + try { + const plugin = new WalletPluginTackleBox() + const kit = makeKit(plugin, makeMockUI()) + const {session} = await kit.login({ + chain: mockChainId, + permissionLevel: mockPermissionLevel, + }) + fakeWindow.location.href = 'http://localhost/after-login' + + await session.transact({action: transferAction}, {broadcast: false}) + assert.isTrue(fakeWindow.location.href.startsWith('tacklebox://request/')) + } finally { + delete (global as any).window + delete (global as any).navigator + } + }) + + test('does not navigate when signing over the wallet channel', async function () { + const receiveStub = sinon.stub(buoy, 'receive') + sinon.stub(buoy, 'send') + receiveStub.onFirstCall().resolves(JSON.stringify(makeLoginCallbackPayload())) + receiveStub + .onSecondCall() + .callsFake(async () => + JSON.stringify(await makeTransactCallbackPayload(transferAction)) + ) + + const fakeWindow = {location: {href: 'http://localhost/unittest'}} + ;(global as any).window = fakeWindow + ;(global as any).navigator = {userAgent: 'mocha-unittest'} + try { + const plugin = new WalletPluginTackleBox() + const kit = makeKit(plugin, makeMockUI()) + const {session} = await kit.login({ + chain: mockChainId, + permissionLevel: mockPermissionLevel, + }) + fakeWindow.location.href = 'http://localhost/after-login' + + await session.transact({action: transferAction}, {broadcast: false}) + // The wallet raises itself on the channel push; the page stays put. + assert.equal(fakeWindow.location.href, 'http://localhost/after-login') + } finally { + delete (global as any).window + delete (global as any).navigator + } + }) }) diff --git a/packages/wallet-plugin-tacklebox/test/tests/theme.ts b/packages/wallet-plugin-tacklebox/test/tests/theme.ts new file mode 100644 index 00000000..8252d308 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/test/tests/theme.ts @@ -0,0 +1,84 @@ +import {assert} from 'chai' + +import {applyModalTheme, tackleboxModalStyles} from '$lib' + +function makeFakeRenderer() { + const styles: any[] = [] + const attributes = new Map() + return { + styles, + attributes, + ui: { + shadow: { + getElementById: (id: string) => styles.find((s) => s.id === id) || null, + appendChild: (node: any) => styles.push(node), + }, + element: { + setAttribute: (key: string, value: string) => attributes.set(key, value), + removeAttribute: (key: string) => attributes.delete(key), + }, + }, + } +} + +suite('modal theme', function () { + setup(function () { + ;(global as any).document = { + createElement: () => ({id: '', textContent: ''}), + } + }) + + teardown(function () { + delete (global as any).document + }) + + test('styles carry the TackleBox palette, scoped to the host attribute', function () { + assert.include(tackleboxModalStyles, ':host([data-tacklebox]) dialog') + assert.include(tackleboxModalStyles, '#00e0ff', 'cyan light lines') + assert.include(tackleboxModalStyles, '#04070c', 'void navy') + assert.notInclude(tackleboxModalStyles, '.svelte-', 'no build-hashed selectors') + }) + + test('applies the theme to the web renderer while a prompt is up', function () { + const fake = makeFakeRenderer() + const revert = applyModalTheme(fake.ui) + + assert.isTrue(fake.attributes.has('data-tacklebox')) + assert.equal(fake.styles.length, 1) + assert.equal(fake.styles[0].id, 'wallet-plugin-tacklebox-theme') + assert.include(fake.styles[0].textContent, '--body-background-color') + + revert() + assert.isFalse(fake.attributes.has('data-tacklebox')) + }) + + test('injects the stylesheet only once across prompts', function () { + const fake = makeFakeRenderer() + applyModalTheme(fake.ui)() + applyModalTheme(fake.ui)() + assert.equal(fake.styles.length, 1) + }) + + test('keeps the attribute while any overlapping prompt is active', function () { + const fake = makeFakeRenderer() + const revertLogin = applyModalTheme(fake.ui) + const revertSign = applyModalTheme(fake.ui) + + revertLogin() + assert.isTrue(fake.attributes.has('data-tacklebox'), 'second prompt still active') + revertSign() + assert.isFalse(fake.attributes.has('data-tacklebox')) + + // A stale double-revert must not strip a newly applied theme. + const revertAgain = applyModalTheme(fake.ui) + revertSign() + assert.isTrue(fake.attributes.has('data-tacklebox')) + revertAgain() + }) + + test('degrades to a no-op for other user interfaces', function () { + assert.doesNotThrow(() => applyModalTheme({})()) + assert.doesNotThrow(() => applyModalTheme(undefined)()) + assert.doesNotThrow(() => applyModalTheme({shadow: {}, element: {}})()) + }) +}) From f287981af192af19d000868526f87c7c03b8b2b2 Mon Sep 17 00:00:00 2001 From: on-a-t-break Date: Tue, 1 Sep 2026 23:31:18 -0700 Subject: [PATCH 06/22] Ready the 0.2.0 release: npm install instructions, keywords, author Co-Authored-By: Claude Fable 5 --- packages/wallet-plugin-tacklebox/README.md | 6 ++---- packages/wallet-plugin-tacklebox/package.json | 9 +++++++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/wallet-plugin-tacklebox/README.md b/packages/wallet-plugin-tacklebox/README.md index 4cf52d07..7b36aa01 100644 --- a/packages/wallet-plugin-tacklebox/README.md +++ b/packages/wallet-plugin-tacklebox/README.md @@ -32,13 +32,11 @@ stock look (and skipped entirely on non-web-renderer UIs). ## Installation -Not yet published to npm; install straight from the repository: - ```bash -npm install github:on-a-t-break/wallet-plugin-tacklebox +npm install wallet-plugin-tacklebox ``` -Once published: `npm install wallet-plugin-tacklebox`. +Or straight from the repository: `npm install github:on-a-t-break/wallet-plugin-tacklebox`. ## Usage diff --git a/packages/wallet-plugin-tacklebox/package.json b/packages/wallet-plugin-tacklebox/package.json index 96ce31ac..e5cde135 100644 --- a/packages/wallet-plugin-tacklebox/package.json +++ b/packages/wallet-plugin-tacklebox/package.json @@ -4,6 +4,15 @@ "version": "0.2.0", "homepage": "https://github.com/on-a-t-break/wallet-plugin-tacklebox", "license": "BSD-3-Clause", + "author": "on-a-t-break", + "keywords": [ + "antelope", + "eosio", + "esr", + "tacklebox", + "wallet", + "wharfkit" + ], "main": "lib/wallet-plugin-tacklebox.js", "module": "lib/wallet-plugin-tacklebox.m.js", "types": "lib/wallet-plugin-tacklebox.d.ts", From 932e6fac2929faf4b3c18080af4192c60d611876 Mon Sep 17 00:00:00 2001 From: on-a-t-break Date: Tue, 1 Sep 2026 23:38:52 -0700 Subject: [PATCH 07/22] Install from GitHub: npm publication happens upstream in Wharfkit This repository is the upstream source; the plugin is meant to be forked into the official Wharfkit plugin collection, which is where an npm package would be published. Co-Authored-By: Claude Fable 5 --- packages/wallet-plugin-tacklebox/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/wallet-plugin-tacklebox/README.md b/packages/wallet-plugin-tacklebox/README.md index 7b36aa01..60c5e9a2 100644 --- a/packages/wallet-plugin-tacklebox/README.md +++ b/packages/wallet-plugin-tacklebox/README.md @@ -33,10 +33,13 @@ stock look (and skipped entirely on non-web-renderer UIs). ## Installation ```bash -npm install wallet-plugin-tacklebox +npm install github:on-a-t-break/wallet-plugin-tacklebox ``` -Or straight from the repository: `npm install github:on-a-t-break/wallet-plugin-tacklebox`. +This repository is the upstream source for the plugin: the intent is for it to be adopted into +the official [Wharfkit](https://github.com/wharfkit) plugin collection, which is where npm +publication would happen (as `@wharfkit/wallet-plugin-tacklebox`). It deliberately follows the +Wharfkit wallet-plugin template structure and tooling to keep that adoption a clean fork. ## Usage From d8432819963767ca34dfb74abb3bca2207b8fe2e Mon Sep 17 00:00:00 2001 From: on-a-t-break Date: Mon, 7 Sep 2026 13:36:01 -0700 Subject: [PATCH 08/22] Adopt the official TackleBox icon The angular navy tacklebox with teal lid, cyan circuit accents and hook emblem replaces the placeholder mark: plugin logo (both variants), README header, example dapp favicon, and the SVG source in assets/. Co-Authored-By: Claude Fable 5 --- packages/wallet-plugin-tacklebox/README.md | 2 ++ .../wallet-plugin-tacklebox/assets/tacklebox.svg | 15 +++++++++++++++ .../examples/dapp/index.html | 1 + .../examples/dapp/public/tacklebox.svg | 15 +++++++++++++++ packages/wallet-plugin-tacklebox/package.json | 2 +- packages/wallet-plugin-tacklebox/src/logo.ts | 13 +++++++++---- 6 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 packages/wallet-plugin-tacklebox/assets/tacklebox.svg create mode 100644 packages/wallet-plugin-tacklebox/examples/dapp/public/tacklebox.svg diff --git a/packages/wallet-plugin-tacklebox/README.md b/packages/wallet-plugin-tacklebox/README.md index 60c5e9a2..bfccbdcc 100644 --- a/packages/wallet-plugin-tacklebox/README.md +++ b/packages/wallet-plugin-tacklebox/README.md @@ -1,3 +1,5 @@ +TackleBox + # wallet-plugin-tacklebox A `WalletPlugin` for use with [`@wharfkit/session`](https://github.com/wharfkit/session) that lets diff --git a/packages/wallet-plugin-tacklebox/assets/tacklebox.svg b/packages/wallet-plugin-tacklebox/assets/tacklebox.svg new file mode 100644 index 00000000..32e11662 --- /dev/null +++ b/packages/wallet-plugin-tacklebox/assets/tacklebox.svg @@ -0,0 +1,15 @@ + + Tacklebox + An angular navy tacklebox with a teal lid, cyan circuit accents, twin latches, and a fishing hook emblem. + + + + + + + + + + + + diff --git a/packages/wallet-plugin-tacklebox/examples/dapp/index.html b/packages/wallet-plugin-tacklebox/examples/dapp/index.html index c075d9b8..c97a7a12 100644 --- a/packages/wallet-plugin-tacklebox/examples/dapp/index.html +++ b/packages/wallet-plugin-tacklebox/examples/dapp/index.html @@ -3,6 +3,7 @@ + wallet-plugin-tacklebox example