From 4d3d73e24c9378e102f2977b0d2c3854fd58954a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Swen=20Sch=C3=A4ferjohann?= <42959314+SwenSchaeferjohann@users.noreply.github.com> Date: Tue, 30 Apr 2024 01:13:43 +0100 Subject: [PATCH] chore: improving cli startup times (#645) * remove circ dep rpc and testrpc adapt transfer.test to test for merkleproof integrity reproduced invalid merkleproofs wip add rpc-interop tests rpc impl 0.12.0 endpoints add new methods to testrpc wip: test cov rpc interop wip: added rem. methods, debug signature calls debug: reproduce sig bug in getSignaturesForOwner getMultipleCompressedAccountProofs upped tx amount to produce failure make executedTxs counter more robust 0.14.0 inline doc rpc, rpc-interface, test-rpc createRpc doc web works test-rpc compressed-token bundled for web rebuilt, pub c-token update readme ctoken wip wip 0.2.1 fix init urls, builds, release versions add maintainers to pkg update readme cli v cli deps v, apachev2 move axios to deps, cli version bump to 0.2.1 bump required node version in readme cli: strict photon version at runtime add: --relax-indexer-version-constraint, upd: --skip-indexer, --skip-prover upd readme bump 0.2.2 dynamic awaits for server startup 12s startup wip * prettier * rm dupe import * rm prove and verify cmds. fix initTestEnv --- cli/README.md | 50 +++-- cli/package.json | 33 ++-- cli/src/commands/prove/index.ts | 52 ----- cli/src/commands/test-validator/index.ts | 27 +-- cli/src/commands/verify/index.ts | 62 ------ cli/src/utils/initTestEnv.ts | 87 ++++++++- cli/src/utils/processProverServer.ts | 4 +- cli/test/commands/prove/index.test.ts | 36 ---- cli/test/commands/verify/index.test.ts | 64 ------ js/stateless.js/src/rpc.ts | 2 +- .../src/test-helpers/test-rpc/test-rpc.ts | 8 +- js/stateless.js/tests/e2e/test-rpc.test.ts | 1 - pnpm-lock.yaml | 184 ++++++++++++++---- scripts/clean.sh | 2 +- 14 files changed, 302 insertions(+), 310 deletions(-) delete mode 100644 cli/src/commands/prove/index.ts delete mode 100644 cli/src/commands/verify/index.ts delete mode 100644 cli/test/commands/prove/index.test.ts delete mode 100644 cli/test/commands/verify/index.test.ts diff --git a/cli/README.md b/cli/README.md index 6eb7db3e18..155fdd1974 100644 --- a/cli/README.md +++ b/cli/README.md @@ -1,10 +1,10 @@ -# Light CLI +# ZK Compression CLI CLI to interact with Light Protocol and ZK compression. ## Requirements -- Ensure you have Node.js (v19.4.0 or later) and npm installed on your machine. +- Ensure you have Node >= v20.9.0 installed on your machine. - You will need a valid Solana filesystem wallet set up at `~/.config/solana/id.json`. If you don't have one yet, visit the [Solana documentation](https://docs.solanalabs.com/cli/wallets/file-system) for details. @@ -12,6 +12,17 @@ CLI to interact with Light Protocol and ZK compression. ## Installation +### Using npm + +```bash +npm install -g @lightprotocol/cli +``` + +### Building from source + +If you prefer to build the CLI from source, follow the steps below to install +the necessary prerequesites. + **1. Activate the Development Environment** Ensure you are at the root of the monorepo. @@ -30,25 +41,37 @@ Ensure you are at the root of the monorepo. ./scripts/build.sh ``` +**3. Make your CLI available globally** + +```bash +pnpm link --global +``` + +```bash +# Verify the CLI was correctly installed +which light +``` + ## Usage -**1. Navigate to the CLI directory and start the Light test validator** +**1. Once globally installed, start the Light test validator** ```bash -cd cli && light test-validator +light test-validator ``` -This starts a Solana test-validator with the Light system programs and accounts, a prover server, and a photon indexer as background processes against a clean ledger. +This starts a Solana test-validator with the Light system programs and accounts, a prover server, and the Photon indexer as background processes against a clean ledger. ```bash -# Pass the -i flag to start without the indexer -light test-validator -i +# Pass --skip-indexer to start without the indexer +light test-validator --skip-indexer + +# Pass --skip-prover to start without the prover +light test-validator --skip-prover -# Pass the -p flag to start without the prover -light test-validator -p ``` -> **Note:** The CLI currently expects the photon indexer to run at port: `8784` and the gnark-prover at port: `3001` +> **Note:** The CLI currently runs the photon indexer and gnark-prover as background processes at port: `8784` and `3001` respectively. **2. Ensure you have sufficient localnet funds** @@ -61,7 +84,6 @@ solana address # Print your balance solana balance - ``` Now you're all set up to run CLI commands :) @@ -130,6 +152,8 @@ FLAGS #### Compress native SOL +> **Note:** Ensure the SOL omnibus account of the Light system program is already initialized by running: `light init-sol-pool` + ```bash light compress-sol --amount 1000 --to "YOUR_WALLET_ADDRESS_BASE58" ``` @@ -161,5 +185,5 @@ FLAGS ### Support - Always feel free to join the [Developer Discord](https://discord.gg/D2cEphnvcY) for help! -- For more info about the canonical indexer implementation built by Helius, refer to the [Photon codebase](https://github.com/helius-labs/photon). -- For more info about Light and ZK compression, refer to the [documentation](https://docs.lightprotocol.com/). +- For more info about the canonical indexer implementation built and maintained by Helius Labs, refer to the [Photon codebase](https://github.com/helius-labs/photon). +- For more info about Light, refer to the [documentation](https://docs.lightprotocol.com/). diff --git a/cli/package.json b/cli/package.json index 3775d2ef76..f1a743e1d0 100644 --- a/cli/package.json +++ b/cli/package.json @@ -1,16 +1,23 @@ { "name": "@lightprotocol/cli", - "version": "0.1.1-alpha.23", - "description": "Light Protocol CLI", - "author": "@ananas-block, @shigoto-dev19, @sleepyqadir ", + "version": "0.2.2", + "description": "ZK Compression: Secure Scaling of State on Solana", + "maintainers": [ + { + "name": "Light Protocol maintainers", + "email": "friends@lightprotocol.com" + } + ], "bin": { "light": "./test_bin/run" }, - "license": "GPL-3.0", + "license": "Apache-2.0", "main": "dist/index.js", "files": [ "/accounts", + "/bin", "/dist", + "/test_bin", "./config.json", "/npm-shrinkwrap.json", "/oclif.manifest.json" @@ -18,7 +25,6 @@ "dependencies": { "@coral-xyz/anchor": "0.28.0", "@lightprotocol/compressed-token": "workspace:*", - "@lightprotocol/hasher.rs": "workspace:*", "@lightprotocol/stateless.js": "workspace:*", "@oclif/core": "^3.26.2", "@oclif/plugin-autocomplete": "^3.0.13", @@ -29,28 +35,24 @@ "@solana-developers/helpers": "^1.5.1", "@solana/spl-token": "^0.3.11", "@solana/web3.js": "^1.91.4", - "@typescript-eslint/eslint-plugin": "^7.6.0", - "@typescript-eslint/parser": "^7.6.0", + "axios": "^1.6.8", "buffer": "^6.0.3", "case-anything": "^2.1.13", - "chai": "^4.4.1", "cli-progress": "^3.12.0", "cli-spinners": "^2.9.2", "dotenv": "^16.4.5", "ffjavascript": "^0.2.63", "find-process": "^1.4.7", - "fs": "0.0.1-security", "node-fetch": "^3.3.2", "path": "^0.12.7", "snake-case": "^3.0.4", "tar": "^6.2.1", - "ts-mocha": "^10.0.0", "tweetnacl": "^1.0.3", + "wait-on": "^7.2.0", "which": "^4.0.0", "zlib": "^1.0.5" }, "devDependencies": { - "@lightprotocol/programs": "workspace:*", "@oclif/test": "2.3.9", "@types/bn.js": "^5.1.5", "@types/chai": "^4.3.14", @@ -59,8 +61,9 @@ "@types/node": "^20.12.7", "@types/tar": "^6.1.12", "@types/which": "^3.0.3", - "axios": "^1.6.8", - "chai": "^4.3.10", + "@typescript-eslint/eslint-plugin": "^7.6.0", + "@typescript-eslint/parser": "^7.6.0", + "chai": "^4.4.1", "eslint": "8.57.0", "eslint-config-oclif": "5.1.1", "eslint-config-oclif-typescript": "3.1.4", @@ -69,6 +72,7 @@ "oclif": "4.8.0", "prettier": "^3.0.3", "shx": "^0.3.4", + "ts-mocha": "^10.0.0", "ts-node": "^10.9.2", "tslib": "^2.6.2", "typescript": "5.3.2" @@ -95,7 +99,6 @@ "postpack": "shx rm -f oclif.manifest.json", "prepack": "pnpm build && oclif manifest && oclif readme", "test-utils": "mocha ./test/utils/index.test.ts -t 10000000 --exit", - "test-prove": "mocha ./test/commands/prove/index.test.ts -t 10000000 --exit", "test-config": "mocha ./test/commands/config/index.test.ts -t 10000000 --exit", "test-create-mint": "mocha ./test/commands/create-mint/index.test.ts -t 10000000 --exit", "test-mint-to": "mocha ./test/commands/mint-to/index.test.ts -t 10000000 --exit", @@ -107,7 +110,7 @@ "test-decompress-spl": "mocha ./test/commands/decompress-spl/index.test.ts -t 10000000 --exit", "kill": "killall solana-test-validator || true && killall solana-test-val || true && sleep 1", "test-cli": "pnpm test-config && pnpm kill", - "test": "pnpm kill && pnpm test-prove && pnpm test-cli && pnpm test-utils && pnpm test-create-mint && pnpm test-mint-to && pnpm test-transfer && pnpm test-compress-spl && pnpm test-decompress-spl && pnpm test-balance && pnpm test-compress-sol && pnpm test-decompress-sol", + "test": "pnpm kill && pnpm test-cli && pnpm test-utils && pnpm test-create-mint && pnpm test-mint-to && pnpm test-transfer && pnpm test-compress-spl && pnpm test-decompress-spl && pnpm test-balance && pnpm test-compress-sol && pnpm test-decompress-sol", "install-local": "pnpm build && pnpm global remove @lightprotocol/cli || true && pnpm global add $PWD", "version": "oclif readme && git add README.md" }, diff --git a/cli/src/commands/prove/index.ts b/cli/src/commands/prove/index.ts deleted file mode 100644 index 9d7f5013c4..0000000000 --- a/cli/src/commands/prove/index.ts +++ /dev/null @@ -1,52 +0,0 @@ -// import { Command, Flags } from "@oclif/core"; -// import { CustomLoader } from "../../utils/index"; -// import { execute } from "../../psp-utils"; -// import { provingArgs } from "../../utils/proverUtils"; -// -// class ProveCommand extends Command { -// static examples = [ -// `$ light prove -i '{"roots":["0x1ebf5c4eb04bf878b46937be63d12308bb14841813441f041812ea54ecb7b2d5"],"inPathIndices":[0],"inPathElements":[["0x0","0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864","0x1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1","0x18f43331537ee2af2e3d758d50f72106467c6eea50371dd528d57eb2b856d238","0x7f9d837cb17b0d36320ffe93ba52345f1b728571a568265caac97559dbc952a","0x2b94cf5e8746b3f5c9631f4c5df32907a699c58c94b2ad4d7b5cec1639183f55","0x2dee93c5a666459646ea7d22cca9e1bcfed71e6951b953611d11dda32ea09d78","0x78295e5a22b84e982cf601eb639597b8b0515a88cb5ac7fa8a4aabe3c87349d","0x2fa5e5f18f6027a6501bec864564472a616b2e274a41211a444cbe3a99f3cc61","0xe884376d0d8fd21ecb780389e941f66e45e7acce3e228ab3e2156a614fcd747","0x1b7201da72494f1e28717ad1a52eb469f95892f957713533de6175e5da190af2","0x1f8d8822725e36385200c0b201249819a6e6e1e4650808b5bebc6bface7d7636","0x2c5d82f66c914bafb9701589ba8cfcfb6162b0a12acf88a8d0879a0471b5f85a","0x14c54148a0940bb820957f5adf3fa1134ef5c4aaa113f4646458f270e0bfbfd0","0x190d33b12f986f961e10c0ee44d8b9af11be25588cad89d416118e4bf4ebe80c","0x22f98aa9ce704152ac17354914ad73ed1167ae6596af510aa5b3649325e06c92","0x2a7c7c9b6ce5880b9f6f228d72bf6a575a526f29c66ecceef8b753d38bba7323","0x2e8186e558698ec1c67af9c14d463ffc470043c9c2988b954d75dd643f36b992","0xf57c5571e9a4eab49e2c8cf050dae948aef6ead647392273546249d1c1ff10f","0x1830ee67b5fb554ad5f63d4388800e1cfe78e310697d46e43c9ce36134f72cca","0x2134e76ac5d21aab186c2be1dd8f84ee880a1e46eaf712f9d371b6df22191f3e","0x19df90ec844ebc4ffeebd866f33859b0c051d8c958ee3aa88f8f8df3db91a5b1","0x18cca2a66b5c0787981e69aefd84852d74af0e93ef4912b4648c05f722efe52b","0x2388909415230d1b4d1304d2d54f473a628338f2efad83fadf05644549d2538d","0x27171fb4a97b6cc0e9e8f543b5294de866a2af2c9c8d0b1d96e673e4529ed540","0x2ff6650540f629fd5711a0bc74fc0d28dcb230b9392583e5f8d59696dde6ae21"]],"leaves":["0x29176100eaa962bdc1fe6c654d6a3c130e96a4d1168b33848b897dc502820133"]}'`, -// ]; -// -// static description = "Make a proof of inclusion for a leaf in a Merkle tree."; -// -// static flags = { -// inputs: Flags.string({ -// char: "i", -// description: "Input parameters to make a proof", -// default: "", -// required: true, -// }), -// }; -// -// async run() { -// const { flags } = await this.parse(ProveCommand); -// -// const loader = new CustomLoader("Proving...\n"); -// loader.start(); -// -// const inputs = flags.inputs; -// if (inputs.trim() === "") { -// this.log("Invalid input"); -// loader.stop(false); -// return; -// } -// const proof = await this.prove(inputs); -// if (proof.trim() === "") { -// this.log("Prove failed"); -// loader.stop(false); -// return; -// } -// console.log("\x1b[1mProof:\x1b[0m ", proof); -// this.log("\nProve completed successfully \x1b[32m✔\x1b[0m"); -// loader.stop(false); -// } -// -// async prove(inputs: string) { -// const args = provingArgs(inputs); -// const proof = await execute(args); -// return proof; -// } -// } -// -// export default ProveCommand; diff --git a/cli/src/commands/test-validator/index.ts b/cli/src/commands/test-validator/index.ts index fc6c5235ee..7be00f086b 100644 --- a/cli/src/commands/test-validator/index.ts +++ b/cli/src/commands/test-validator/index.ts @@ -10,18 +10,16 @@ class SetupCommand extends Command { } static flags = { - "without-indexer": Flags.boolean({ - char: "i", - description: "Runs a test validator without indexer service.", + "skip-indexer": Flags.boolean({ + description: "Runs a test validator without starting a new indexer.", default: false, }), - "without-prover": Flags.boolean({ - char: "p", - description: "Runs a test validator without prover service.", + "skip-prover": Flags.boolean({ + description: + "Runs a test validator without starting a new prover service.", default: false, }), "skip-system-accounts": Flags.boolean({ - char: "s", description: "Runs a test validator without initialized light system accounts.", default: false, @@ -29,12 +27,18 @@ class SetupCommand extends Command { "prove-compressed-accounts": Flags.boolean({ description: "Enable proving of compressed accounts.", default: true, - exclusive: ["without-prover"], + exclusive: ["skip-prover"], }), "prove-new-addresses": Flags.boolean({ description: "Enable proving of new addresses.", default: false, - exclusive: ["without-prover"], + exclusive: ["skip-prover"], + }), + "relax-indexer-version-constraint": Flags.boolean({ + description: + "Disables indexer version check. Only use if you know what you are doing.", + default: false, + exclusive: ["skip-indexer"], }), }; @@ -45,10 +49,11 @@ class SetupCommand extends Command { loader.start(); await initTestEnv({ skipSystemAccounts: flags["skip-system-accounts"], - indexer: !flags["without-indexer"], - prover: !flags["without-prover"], + indexer: !flags["skip-indexer"], + prover: !flags["skip-prover"], proveCompressedAccounts: flags["prove-compressed-accounts"], proveNewAddresses: flags["prove-new-addresses"], + checkPhotonVersion: !flags["relax-indexer-version-constraint"], }); this.log("\nSetup tasks completed successfully \x1b[32m✔\x1b[0m"); diff --git a/cli/src/commands/verify/index.ts b/cli/src/commands/verify/index.ts deleted file mode 100644 index bf257d9660..0000000000 --- a/cli/src/commands/verify/index.ts +++ /dev/null @@ -1,62 +0,0 @@ -// import { Command, Flags } from "@oclif/core"; -// import { CustomLoader } from "../../utils/index"; -// import { verifyingArgs } from "../../utils/proverUtils"; -// import { execute } from "../../psp-utils"; -// class VerifyCommand extends Command { -// static description = "Verify a proof of inclusion of a leaf in a Merkle tree"; -// -// static examples = [ -// `$ light verify --roots "0x1ebf5c4eb04bf878b46937be63d12308bb14841813441f041812ea54ecb7b2d5" --leafs "0x29176100eaa962bdc1fe6c654d6a3c130e96a4d1168b33848b897dc502820133" --proof '{"ar":["0x2e16973b22414e43e99d8240045a1919063f31caf5a2d260f7840b6b5969a73f","0x1872024e8c1b30063914cb428bfb4e975d62b69853976614f74af7374cf9b184"],"bs":[["0x8ac1ec150a0f9244de332d2becebd31c33619b79d6d40647e4d0f1b73e12d8","0xdc42af00fdee64eeaf34d766ea9ff5365bc6756525de25707b4c917acedeea0"],["0x2ffd42f088ae2290ba0e206fc5102a4f017fed0cb019b618f54d54ee5033c425","0x2f26212f5e71c2b2973c01359e7e78ca1d36961d1d883d3db79e454b39794483"]],"krs":["0x1c015d1b7283f4caa5a8e4fbffc4316e10ee0855a5561564c3f07648246fcb4","0x1f35f1de13b684ebe6d41eb75075210e05d5875feea25edc8882c8fcb59c1c55"]}'`, -// ]; -// -// static flags = { -// roots: Flags.string({ -// char: "r", -// description: "Array of roots", -// default: "", -// }), -// leafs: Flags.string({ -// char: "l", -// description: "Array of leafs", -// default: "", -// }), -// proof: Flags.string({ -// char: "p", -// description: "The proof", -// default: "", -// }), -// }; -// async run() { -// const { flags } = await this.parse(VerifyCommand); -// -// const loader = new CustomLoader("Verifying...\n"); -// loader.start(); -// -// const roots: string[] = flags.roots.split(","); -// const leafs: string[] = flags.leafs.split(","); -// const proof = flags.proof; -// -// if (roots.length === 0 || leafs.length === 0 || proof === "") { -// this.log("Verify failed: invalid input"); -// loader.stop(false); -// return; -// } -// const result = await this.verify(proof, roots, leafs); -// if (result.trim() === "") { -// this.log("Verify failed"); -// loader.stop(false); -// return; -// } -// console.log("\x1b[1mVerified:\x1b[0m ", result); -// this.log("\nVerified successfully \x1b[32m✔\x1b[0m"); -// loader.stop(false); -// } -// -// async verify(proof: string, roots: string[], leafs: string[]) { -// const args = verifyingArgs(proof, roots, leafs); -// const result = await execute(args); -// return result; -// } -// } -// -// export default VerifyCommand; diff --git a/cli/src/utils/initTestEnv.ts b/cli/src/utils/initTestEnv.ts index f1aca0d3f6..409bc3a2c7 100644 --- a/cli/src/utils/initTestEnv.ts +++ b/cli/src/utils/initTestEnv.ts @@ -1,4 +1,4 @@ -import { airdropSol, sleep } from "@lightprotocol/stateless.js"; +import { airdropSol } from "@lightprotocol/stateless.js"; import { getPayer, setAnchorProvider } from "./utils"; import { LIGHT_MERKLE_TREE_PROGRAM_TAG, @@ -6,15 +6,80 @@ import { } from "./constants"; import path from "path"; import fs from "fs"; +import util from "util"; import which from "which"; -import { spawn } from "child_process"; import { downloadBinIfNotExists } from "../psp-utils"; import { executeCommand } from "./process"; import { startProver } from "./processProverServer"; +import { spawn, exec } from "child_process"; +import axios from "axios"; + const find = require("find-process"); +const waitOn = require("wait-on"); +const execAsync = util.promisify(exec); const LIGHT_PROTOCOL_PROGRAMS_DIR_ENV = "LIGHT_PROTOCOL_PROGRAMS_DIR"; const BASE_PATH = "../../bin/"; +const PHOTON_VERSION = "0.15.0"; + +async function isExpectedPhotonVersion( + requiredVersion: string, +): Promise { + try { + const { stdout } = await execAsync("photon --version"); + const version = stdout.trim(); + return version.includes(requiredVersion); + } catch (error) { + console.error("Error checking Photon version:", error); + return false; + } +} + +// Solana test validator can be unreliable when starting up. +async function confirmServerStability(url: string, attempts: number = 20) { + try { + for (let i = 0; i < attempts; i++) { + const response = await axios.get(url); + if (response.status !== 200) { + throw new Error("Server failed stability check"); + } + await new Promise((resolve) => setTimeout(resolve, 300)); + } + console.log("Server has passed stability checks."); + } catch (error) { + console.error("Server stability check failed:", error); + throw error; + } +} + +export async function waitForServers( + servers: { port: number; path: string }[], +) { + const opts = { + resources: servers.map( + ({ port, path }) => `http-get://127.0.0.1:${port}${path}`, + ), + delay: 1000, + timeout: 15000, + interval: 300, + simultaneous: 2, + validateStatus: function (status: number) { + return ( + (status >= 200 && status < 300) || status === 404 || status === 405 + ); + }, + }; + + try { + await waitOn(opts); + servers.forEach((server) => { + console.log(`${server.port} is up!`); + }); + } catch (err) { + console.error("Error waiting for server to start:", err); + throw err; + } +} export async function initTestEnv({ additionalPrograms, @@ -23,6 +88,7 @@ export async function initTestEnv({ prover = true, proveCompressedAccounts = true, proveNewAddresses = false, + checkPhotonVersion = true, }: { additionalPrograms?: { address: string; path: string }[]; skipSystemAccounts?: boolean; @@ -30,6 +96,7 @@ export async function initTestEnv({ prover: boolean; proveCompressedAccounts?: boolean; proveNewAddresses?: boolean; + checkPhotonVersion?: boolean; }) { console.log("Performing setup tasks...\n"); @@ -42,20 +109,26 @@ export async function initTestEnv({ recipientPublicKey: payer.publicKey, }); }; + // We cannot await this promise directly because it will hang the process startTestValidator({ additionalPrograms, skipSystemAccounts }); - await sleep(10000); + await waitForServers([{ port: 8899, path: "/health" }]); + await confirmServerStability("http://127.0.0.1:8899/health"); await initAccounts(); + if (indexer) { await killIndexer(); const resolvedOrNull = which.sync("photon", { nothrow: true }); - if (resolvedOrNull === null) { - const message = - "Photon indexer not found. Please install it by running `cargo install photon-indexer --version 0.15.0`"; + + if ( + resolvedOrNull === null || + (checkPhotonVersion && !(await isExpectedPhotonVersion(PHOTON_VERSION))) + ) { + const message = `Photon indexer not found. Please install it by running \`cargo install photon-indexer --version ${PHOTON_VERSION}\``; console.log(message); throw new Error(message); } else { spawnBinary("photon", false); - await sleep(5000); + await waitForServers([{ port: 8784, path: "/getIndexerHealth" }]); } } diff --git a/cli/src/utils/processProverServer.ts b/cli/src/utils/processProverServer.ts index f417f327e4..b7c9fc4247 100644 --- a/cli/src/utils/processProverServer.ts +++ b/cli/src/utils/processProverServer.ts @@ -2,7 +2,7 @@ import path from "path"; import { killProcessByName, killProcessByPort, spawnBinary } from "./process"; import { LIGHT_PROVER_PROCESS_NAME } from "./constants"; import { sleep } from "@lightprotocol/stateless.js"; -import { killProcess } from "./initTestEnv"; +import { killProcess, waitForServers } from "./initTestEnv"; const KEYS_DIR = "proving-keys/"; @@ -35,8 +35,8 @@ export async function startProver( console.log("Starting prover..."); spawnBinary(getProverNameByArch(), true, args); + await waitForServers([{ port: 3001, path: "/" }]); console.log("Prover started successfully!"); - await sleep(2000); } export function getProverNameByArch(): string { diff --git a/cli/test/commands/prove/index.test.ts b/cli/test/commands/prove/index.test.ts deleted file mode 100644 index a0c2ee94cf..0000000000 --- a/cli/test/commands/prove/index.test.ts +++ /dev/null @@ -1,36 +0,0 @@ -// import { expect, test } from "@oclif/test"; -// import { initTestEnvIfNeeded } from "../../../src/utils/initTestEnv"; -// -// describe("prove", () => { -// before(async () => { -// await initTestEnvIfNeeded({ prover: true }); -// }); -// const correctInputs = -// '{"roots":["0x1ebf5c4eb04bf878b46937be63d12308bb14841813441f041812ea54ecb7b2d5"],"inPathIndices":[0],"inPathElements":[["0x0","0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864","0x1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1","0x18f43331537ee2af2e3d758d50f72106467c6eea50371dd528d57eb2b856d238","0x7f9d837cb17b0d36320ffe93ba52345f1b728571a568265caac97559dbc952a","0x2b94cf5e8746b3f5c9631f4c5df32907a699c58c94b2ad4d7b5cec1639183f55","0x2dee93c5a666459646ea7d22cca9e1bcfed71e6951b953611d11dda32ea09d78","0x78295e5a22b84e982cf601eb639597b8b0515a88cb5ac7fa8a4aabe3c87349d","0x2fa5e5f18f6027a6501bec864564472a616b2e274a41211a444cbe3a99f3cc61","0xe884376d0d8fd21ecb780389e941f66e45e7acce3e228ab3e2156a614fcd747","0x1b7201da72494f1e28717ad1a52eb469f95892f957713533de6175e5da190af2","0x1f8d8822725e36385200c0b201249819a6e6e1e4650808b5bebc6bface7d7636","0x2c5d82f66c914bafb9701589ba8cfcfb6162b0a12acf88a8d0879a0471b5f85a","0x14c54148a0940bb820957f5adf3fa1134ef5c4aaa113f4646458f270e0bfbfd0","0x190d33b12f986f961e10c0ee44d8b9af11be25588cad89d416118e4bf4ebe80c","0x22f98aa9ce704152ac17354914ad73ed1167ae6596af510aa5b3649325e06c92","0x2a7c7c9b6ce5880b9f6f228d72bf6a575a526f29c66ecceef8b753d38bba7323","0x2e8186e558698ec1c67af9c14d463ffc470043c9c2988b954d75dd643f36b992","0xf57c5571e9a4eab49e2c8cf050dae948aef6ead647392273546249d1c1ff10f","0x1830ee67b5fb554ad5f63d4388800e1cfe78e310697d46e43c9ce36134f72cca","0x2134e76ac5d21aab186c2be1dd8f84ee880a1e46eaf712f9d371b6df22191f3e","0x19df90ec844ebc4ffeebd866f33859b0c051d8c958ee3aa88f8f8df3db91a5b1","0x18cca2a66b5c0787981e69aefd84852d74af0e93ef4912b4648c05f722efe52b","0x2388909415230d1b4d1304d2d54f473a628338f2efad83fadf05644549d2538d","0x27171fb4a97b6cc0e9e8f543b5294de866a2af2c9c8d0b1d96e673e4529ed540","0x2ff6650540f629fd5711a0bc74fc0d28dcb230b9392583e5f8d59696dde6ae21"]],"leaves":["0x29176100eaa962bdc1fe6c654d6a3c130e96a4d1168b33848b897dc502820133"]}'; -// const invalidInputs = -// '{"roots":["0x0"],"inPathIndices":[0],"inPathElements":[["0x0","0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864","0x1069673dcdb12263df301a6ff584a7ec261a44cb9dc68df067a4774460b1f1e1","0x18f43331537ee2af2e3d758d50f72106467c6eea50371dd528d57eb2b856d238","0x7f9d837cb17b0d36320ffe93ba52345f1b728571a568265caac97559dbc952a","0x2b94cf5e8746b3f5c9631f4c5df32907a699c58c94b2ad4d7b5cec1639183f55","0x2dee93c5a666459646ea7d22cca9e1bcfed71e6951b953611d11dda32ea09d78","0x78295e5a22b84e982cf601eb639597b8b0515a88cb5ac7fa8a4aabe3c87349d","0x2fa5e5f18f6027a6501bec864564472a616b2e274a41211a444cbe3a99f3cc61","0xe884376d0d8fd21ecb780389e941f66e45e7acce3e228ab3e2156a614fcd747","0x1b7201da72494f1e28717ad1a52eb469f95892f957713533de6175e5da190af2","0x1f8d8822725e36385200c0b201249819a6e6e1e4650808b5bebc6bface7d7636","0x2c5d82f66c914bafb9701589ba8cfcfb6162b0a12acf88a8d0879a0471b5f85a","0x14c54148a0940bb820957f5adf3fa1134ef5c4aaa113f4646458f270e0bfbfd0","0x190d33b12f986f961e10c0ee44d8b9af11be25588cad89d416118e4bf4ebe80c","0x22f98aa9ce704152ac17354914ad73ed1167ae6596af510aa5b3649325e06c92","0x2a7c7c9b6ce5880b9f6f228d72bf6a575a526f29c66ecceef8b753d38bba7323","0x2e8186e558698ec1c67af9c14d463ffc470043c9c2988b954d75dd643f36b992","0xf57c5571e9a4eab49e2c8cf050dae948aef6ead647392273546249d1c1ff10f","0x1830ee67b5fb554ad5f63d4388800e1cfe78e310697d46e43c9ce36134f72cca","0x2134e76ac5d21aab186c2be1dd8f84ee880a1e46eaf712f9d371b6df22191f3e","0x19df90ec844ebc4ffeebd866f33859b0c051d8c958ee3aa88f8f8df3db91a5b1","0x18cca2a66b5c0787981e69aefd84852d74af0e93ef4912b4648c05f722efe52b","0x2388909415230d1b4d1304d2d54f473a628338f2efad83fadf05644549d2538d","0x27171fb4a97b6cc0e9e8f543b5294de866a2af2c9c8d0b1d96e673e4529ed540","0x2ff6650540f629fd5711a0bc74fc0d28dcb230b9392583e5f8d59696dde6ae21"]],"leaf":["0x29176100eaa962bdc1fe6c654d6a3c130e96a4d1168b33848b897dc502820133"]}'; -// const invalidTreeHeightInputs = -// '{"roots":["0x0"],"inPathIndices":[0],"inPathElements":[["0x0"]],"leaves":["0x0"]}'; -// -// test -// .stdout({ print: true }) -// .command(["prove", `--inputs=${correctInputs}`]) -// .it("Prove with correct inputs", (ctx) => { -// console.log(ctx.stdout); -// expect(ctx.stdout).to.contain("Prove completed successfully"); -// }); -// -// test -// .stdout() -// .command(["prove", `--inputs=${invalidInputs}`]) -// .it("Prove with invalid inputs", (ctx) => { -// expect(ctx.stdout).to.contain("Prove failed"); -// }); -// -// test -// .stdout() -// .command(["prove", `--inputs=${invalidTreeHeightInputs}`]) -// .it("Prove with invalid tree height", (ctx) => { -// expect(ctx.stdout).to.contain("Prove failed"); -// }); -// }); diff --git a/cli/test/commands/verify/index.test.ts b/cli/test/commands/verify/index.test.ts deleted file mode 100644 index 4937b68c13..0000000000 --- a/cli/test/commands/verify/index.test.ts +++ /dev/null @@ -1,64 +0,0 @@ -// import { expect, test } from "@oclif/test"; -// import { initTestEnvIfNeeded } from "../../../src/utils/initTestEnv"; -// -// describe("verify proof", () => { -// before(async () => { -// await initTestEnvIfNeeded({ prover: true }); -// }); -// const correctProof: string = -// '{"ar":["0x2e58dac48029ecd8a5f2bc7dd1f8a3a7866e14cbd5f0763560893b201536f2b1","0xdc2d824a82967859f640c55d867303498a578a53d330374366ca55b9274c54d"],"bs":[["0x17cdea7a8ff87155793c981b8addc0d342b9ab4cd287db27756689a24cb98928","0x2ed89d16470679a7b2e03bc8b9a755fc94a0272dea04784789f751a5c7fd3a07"],["0x23c2d66d108196e0c6a246cc536d7e16e89440d25592532766c59742805ccae4","0x2ed33e32827e395076714e6035f1ee13b67ff92bc208595cb0fd061ebff1eaf7"]],"krs":["0x1e59b89a83220ee69e974a03d6026f88e21ba65bf2ec9f7cdc0d8a321df99e48","0x1a965b2d5645fd9f892415df1e9b1d1d4036291b7111cc86a3c36d4def54cbf9"]}'; -// const invalidProof: string = -// '{"ar":["0x0","0xdc2d824a82967859f640c55d867303498a578a53d330374366ca55b9274c54d"],"bs":[["0x17cdea7a8ff87155793c981b8addc0d342b9ab4cd287db27756689a24cb98928","0x2ed89d16470679a7b2e03bc8b9a755fc94a0272dea04784789f751a5c7fd3a07"],["0x23c2d66d108196e0c6a246cc536d7e16e89440d25592532766c59742805ccae4","0x2ed33e32827e395076714e6035f1ee13b67ff92bc208595cb0fd061ebff1eaf7"]],"krs":["0x1e59b89a83220ee69e974a03d6026f88e21ba65bf2ec9f7cdc0d8a321df99e48","0x1a965b2d5645fd9f892415df1e9b1d1d4036291b7111cc86a3c36d4def54cbf9"]}'; -// const roots = -// '"0x1ebf5c4eb04bf878b46937be63d12308bb14841813441f041812ea54ecb7b2d5"'; -// const leafs = -// '"0x29176100eaa962bdc1fe6c654d6a3c130e96a4d1168b33848b897dc502820133"'; -// -// test -// .stdout() -// .command([ -// "verify", -// `--proof=${correctProof}`, -// `--roots=${roots}`, -// `--leafs=${leafs}`, -// ]) -// .it("Verify proof with correct inputs", (ctx) => { -// expect(ctx.stdout).to.contain("Verified successfully"); -// }); -// -// test -// .stdout() -// .command([ -// "verify", -// `--proof=${correctProof}`, -// `--roots="0x0"`, -// `--leafs=${leafs}`, -// ]) -// .it("Verify proof with correct proof and invalid roots", (ctx) => { -// expect(ctx.stdout).to.contain("Verify failed"); -// }); -// -// test -// .stdout() -// .command([ -// "verify", -// `--proof=${correctProof}`, -// `--roots="${roots}"`, -// `--leafs="0"`, -// ]) -// .it("Verify proof with correct proof and invalid leafs", (ctx) => { -// expect(ctx.stdout).to.contain("Verify failed"); -// }); -// -// test -// .stdout() -// .command([ -// "verify", -// `--proof=${invalidProof}`, -// `--roots="${roots}"`, -// `--leafs="0"`, -// ]) -// .it("Verify proof with invalid proof and correct inputs", (ctx) => { -// expect(ctx.stdout).to.contain("Verify failed"); -// }); -// }); diff --git a/js/stateless.js/src/rpc.ts b/js/stateless.js/src/rpc.ts index 1900a80e88..b838e9582d 100644 --- a/js/stateless.js/src/rpc.ts +++ b/js/stateless.js/src/rpc.ts @@ -16,6 +16,7 @@ import { CompressionApiInterface, GetCompressedTokenAccountsByOwnerOrDelegateOptions, HealthResult, + HexInputsForProver, MerkeProofResult, MultipleCompressedAccountsResult, NativeBalanceResult, @@ -27,7 +28,6 @@ import { TokenBalanceListResult, jsonRpcResult, jsonRpcResultAndContext, - HexInputsForProver, HexBatchInputsForProver, } from './rpc-interface'; import { diff --git a/js/stateless.js/src/test-helpers/test-rpc/test-rpc.ts b/js/stateless.js/src/test-helpers/test-rpc/test-rpc.ts index f5da86b897..b329fd5eeb 100644 --- a/js/stateless.js/src/test-helpers/test-rpc/test-rpc.ts +++ b/js/stateless.js/src/test-helpers/test-rpc/test-rpc.ts @@ -114,14 +114,14 @@ export class TestRpc extends Connection implements CompressionApiInterface { /** * Establish a Compression-compatible JSON RPC mock-connection * - * @param endpoint endpoint to the solana cluster (use for - * localnet only) - * @param hasher light wasm hasher instance + * @param endpoint endpoint to the solana cluster (use for + * localnet only) + * @param hasher light wasm hasher instance * @param compressionApiEndpoint Endpoint to the compression server. * @param proverEndpoint Endpoint to the prover server. defaults * to endpoint * @param connectionConfig Optional connection config - * @param testRpcConfig Config for the mock rpc + * @param testRpcConfig Config for the mock rpc */ constructor( endpoint: string, diff --git a/js/stateless.js/tests/e2e/test-rpc.test.ts b/js/stateless.js/tests/e2e/test-rpc.test.ts index 744a64a8e3..efa76729b9 100644 --- a/js/stateless.js/tests/e2e/test-rpc.test.ts +++ b/js/stateless.js/tests/e2e/test-rpc.test.ts @@ -11,7 +11,6 @@ import { bn, CompressedAccountWithMerkleContext } from '../../src/state'; import { TestRpc, getTestRpc } from '../../src/test-helpers'; /// TODO: add test case for payer != address - describe('test-rpc', () => { const { merkleTree } = defaultTestStateTreeAccounts(); let rpc: TestRpc; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f42fc23e39..8f1405d60d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -168,9 +168,6 @@ importers: '@lightprotocol/compressed-token': specifier: workspace:* version: link:../js/compressed-token - '@lightprotocol/hasher.rs': - specifier: workspace:* - version: link:../hasher.rs '@lightprotocol/stateless.js': specifier: workspace:* version: link:../js/stateless.js @@ -201,21 +198,15 @@ importers: '@solana/web3.js': specifier: ^1.91.4 version: 1.91.4 - '@typescript-eslint/eslint-plugin': - specifier: ^7.6.0 - version: 7.6.0(@typescript-eslint/parser@7.6.0)(eslint@8.57.0)(typescript@5.3.2) - '@typescript-eslint/parser': - specifier: ^7.6.0 - version: 7.6.0(eslint@8.57.0)(typescript@5.3.2) + axios: + specifier: ^1.6.8 + version: 1.6.8 buffer: specifier: ^6.0.3 version: 6.0.3 case-anything: specifier: ^2.1.13 version: 2.1.13 - chai: - specifier: ^4.4.1 - version: 4.4.1 cli-progress: specifier: ^3.12.0 version: 3.12.0 @@ -231,9 +222,6 @@ importers: find-process: specifier: ^1.4.7 version: 1.4.7 - fs: - specifier: 0.0.1-security - version: 0.0.1-security node-fetch: specifier: ^3.3.2 version: 3.3.2 @@ -246,12 +234,12 @@ importers: tar: specifier: ^6.2.1 version: 6.2.1 - ts-mocha: - specifier: ^10.0.0 - version: 10.0.0(mocha@10.2.0) tweetnacl: specifier: ^1.0.3 version: 1.0.3 + wait-on: + specifier: ^7.2.0 + version: 7.2.0 which: specifier: ^4.0.0 version: 4.0.0 @@ -259,9 +247,6 @@ importers: specifier: ^1.0.5 version: 1.0.5 devDependencies: - '@lightprotocol/programs': - specifier: workspace:* - version: link:../programs '@oclif/test': specifier: 2.3.9 version: 2.3.9(@types/node@20.12.7)(typescript@5.3.2) @@ -286,9 +271,15 @@ importers: '@types/which': specifier: ^3.0.3 version: 3.0.3 - axios: - specifier: ^1.6.8 - version: 1.6.8 + '@typescript-eslint/eslint-plugin': + specifier: ^7.6.0 + version: 7.6.0(@typescript-eslint/parser@7.6.0)(eslint@8.57.0)(typescript@5.3.2) + '@typescript-eslint/parser': + specifier: ^7.6.0 + version: 7.6.0(eslint@8.57.0)(typescript@5.3.2) + chai: + specifier: ^4.4.1 + version: 4.4.1 eslint: specifier: 8.57.0 version: 8.57.0 @@ -313,6 +304,9 @@ importers: shx: specifier: ^0.3.4 version: 0.3.4 + ts-mocha: + specifier: ^10.0.0 + version: 10.0.0(mocha@10.2.0) ts-node: specifier: ^10.9.2 version: 10.9.2(@types/node@20.12.7)(typescript@5.3.2) @@ -484,6 +478,10 @@ importers: specifier: ^0.34.6 version: 0.34.6(@vitest/browser@0.34.6)(playwright@1.40.1) + hasher.rs/src/main/wasm: {} + + hasher.rs/src/main/wasm-simd: {} + js/compressed-token: dependencies: '@coral-xyz/anchor': @@ -808,6 +806,7 @@ packages: /@aashutoshrathi/word-wrap@1.2.6: resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} engines: {node: '>=0.10.0'} + dev: true /@ampproject/remapping@2.2.1: resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} @@ -3496,10 +3495,12 @@ packages: dependencies: eslint: 8.57.0 eslint-visitor-keys: 3.4.3 + dev: true /@eslint-community/regexpp@4.10.0: resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true /@eslint-community/regexpp@4.8.1: resolution: {integrity: sha512-PWiOzLIUAjN/w5K17PoF4n6sKBw0gqLHPhywmYHP4t1VFQQVYeb1yWsJwnMVEMl3tUHME7X/SJPZLmtG7XBDxQ==} @@ -3521,6 +3522,7 @@ packages: strip-json-comments: 3.1.1 transitivePeerDependencies: - supports-color + dev: true /@eslint/js@8.55.0: resolution: {integrity: sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==} @@ -3530,6 +3532,7 @@ packages: /@eslint/js@8.57.0: resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true /@ethersproject/abi@5.7.0: resolution: {integrity: sha512-351ktp42TiRcYB3H1OP8yajPeAQstMW/yCFokj/AthP9bLHzQFPlOrxOcwYEDkUAICmOHljvN4K39OMTMUa9RA==} @@ -3846,10 +3849,12 @@ packages: minimatch: 3.1.2 transitivePeerDependencies: - supports-color + dev: true /@humanwhocodes/module-importer@1.0.1: resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} + dev: true /@humanwhocodes/object-schema@2.0.1: resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} @@ -3857,6 +3862,7 @@ packages: /@humanwhocodes/object-schema@2.0.3: resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + dev: true /@iden3/bigarray@0.0.2: resolution: {integrity: sha512-Xzdyxqm1bOFF6pdIsiHLLl3HkSLjbhqJHVyqaTxXt3RqXBEnmsUmEW47H7VOi/ak7TdkRpNkxjyK5Zbkm+y52g==} @@ -5937,11 +5943,12 @@ packages: /@types/json-schema@7.0.15: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: false + dev: true /@types/json5@0.0.29: resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} requiresBuild: true + dev: true /@types/lodash@4.14.199: resolution: {integrity: sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg==} @@ -6026,7 +6033,7 @@ packages: /@types/semver@7.5.8: resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: false + dev: true /@types/sinon@10.0.16: resolution: {integrity: sha512-j2Du5SYpXZjJVJtXBokASpPRj+e2z+VUhCPHmM6WMfe3dpHu6iVKJMU6AiBcMp/XTAYnEj6Wc1trJUWwZ0QaAQ==} @@ -6168,7 +6175,7 @@ packages: typescript: 5.3.2 transitivePeerDependencies: - supports-color - dev: false + dev: true /@typescript-eslint/parser@6.21.0(eslint@8.55.0)(typescript@5.3.2): resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} @@ -6252,6 +6259,7 @@ packages: typescript: 5.3.2 transitivePeerDependencies: - supports-color + dev: true /@typescript-eslint/scope-manager@6.21.0: resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} @@ -6283,6 +6291,7 @@ packages: dependencies: '@typescript-eslint/types': 7.6.0 '@typescript-eslint/visitor-keys': 7.6.0 + dev: true /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.3.2): resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} @@ -6342,7 +6351,7 @@ packages: typescript: 5.3.2 transitivePeerDependencies: - supports-color - dev: false + dev: true /@typescript-eslint/types@6.21.0: resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} @@ -6362,6 +6371,7 @@ packages: /@typescript-eslint/types@7.6.0: resolution: {integrity: sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==} engines: {node: ^18.18.0 || >=20.0.0} + dev: true /@typescript-eslint/typescript-estree@6.21.0(typescript@5.3.2): resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} @@ -6448,6 +6458,7 @@ packages: typescript: 5.3.2 transitivePeerDependencies: - supports-color + dev: true /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.3.2): resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} @@ -6523,7 +6534,7 @@ packages: transitivePeerDependencies: - supports-color - typescript - dev: false + dev: true /@typescript-eslint/visitor-keys@6.21.0: resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} @@ -6555,6 +6566,7 @@ packages: dependencies: '@typescript-eslint/types': 7.6.0 eslint-visitor-keys: 3.4.3 + dev: true /@ungap/promise-all-settled@1.1.2: resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} @@ -6562,6 +6574,7 @@ packages: /@ungap/structured-clone@1.2.0: resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true /@vitest/browser@0.34.6(esbuild@0.18.20)(rollup@4.6.1)(vitest@0.34.6): resolution: {integrity: sha512-XCIGROVgw3L+PwYw/T2l+HP/SPrXvh2MfmQNU3aULl5ekE+QVj9A1RYu/1mcYXdac9ES4ahxUz6n4wgcVd9tbA==} @@ -6689,6 +6702,7 @@ packages: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 dependencies: acorn: 8.10.0 + dev: true /acorn-walk@8.2.0: resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} @@ -6699,6 +6713,7 @@ packages: resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} engines: {node: '>=0.4.0'} hasBin: true + dev: true /acorn@8.11.3: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} @@ -6721,6 +6736,7 @@ packages: fast-json-stable-stringify: 2.1.0 json-schema-traverse: 0.4.1 uri-js: 4.4.1 + dev: true /anser@1.4.10: resolution: {integrity: sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww==} @@ -6729,6 +6745,7 @@ packages: /ansi-colors@4.1.1: resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} engines: {node: '>=6'} + dev: true /ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} @@ -6810,6 +6827,7 @@ packages: /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true /aria-query@5.3.0: resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} @@ -6896,6 +6914,7 @@ packages: /arrify@1.0.1: resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} engines: {node: '>=0.10.0'} + dev: true /asap@2.0.6: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} @@ -6903,6 +6922,7 @@ packages: /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true /ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} @@ -6951,7 +6971,6 @@ packages: /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: true /available-typed-arrays@1.0.5: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} @@ -6991,7 +7010,7 @@ packages: proxy-from-env: 1.1.0 transitivePeerDependencies: - debug - dev: true + dev: false /axobject-query@3.2.1: resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} @@ -7142,6 +7161,7 @@ packages: /binary-extensions@2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} engines: {node: '>=8'} + dev: true /bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} @@ -7218,6 +7238,7 @@ packages: /browser-stdout@1.3.1: resolution: {integrity: sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==} + dev: true /browserslist@4.22.1: resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} @@ -7346,6 +7367,7 @@ packages: /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + dev: true /camel-case@4.1.2: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} @@ -7419,6 +7441,7 @@ packages: loupe: 2.3.6 pathval: 1.1.1 type-detect: 4.0.8 + dev: true /chalk@2.4.2: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} @@ -7461,6 +7484,7 @@ packages: resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} dependencies: get-func-name: 2.0.2 + dev: true /check-types@11.2.3: resolution: {integrity: sha512-+67P1GkJRaxQD6PKK0Et9DhwQB+vGg3PM5+aavopCpZT1lj9jeqfvpgTLAWErNj8qApkkmXlu/Ug74kmhagkXg==} @@ -7482,6 +7506,7 @@ packages: readdirp: 3.6.0 optionalDependencies: fsevents: 2.3.3 + dev: true /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} @@ -7592,6 +7617,7 @@ packages: string-width: 4.2.3 strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + dev: true /cliui@8.0.1: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} @@ -7654,7 +7680,6 @@ packages: engines: {node: '>= 0.8'} dependencies: delayed-stream: 1.0.0 - dev: true /command-exists@1.2.9: resolution: {integrity: sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==} @@ -7872,6 +7897,7 @@ packages: /decamelize@4.0.0: resolution: {integrity: sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==} engines: {node: '>=10'} + dev: true /decompress-response@6.0.0: resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} @@ -7885,6 +7911,7 @@ packages: engines: {node: '>=6'} dependencies: type-detect: 4.0.8 + dev: true /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -7933,7 +7960,6 @@ packages: /delayed-stream@1.0.0: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} - dev: true /denodeify@1.2.1: resolution: {integrity: sha512-KNTihKNmQENUZeKu5fzfpzRqR5S2VMp4gl9RFHiWzj9DfvYQPMJ6XHKNaQxaGCXwPk6y9yme3aUoaiAe+KX+vg==} @@ -7980,6 +8006,7 @@ packages: /diff@3.5.0: resolution: {integrity: sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==} engines: {node: '>=0.3.1'} + dev: true /diff@4.0.2: resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} @@ -7989,6 +8016,7 @@ packages: /diff@5.0.0: resolution: {integrity: sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==} engines: {node: '>=0.3.1'} + dev: true /dir-glob@3.0.1: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} @@ -8008,6 +8036,7 @@ packages: engines: {node: '>=6.0.0'} dependencies: esutils: 2.0.3 + dev: true /dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} @@ -8945,6 +8974,7 @@ packages: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 + dev: true /eslint-utils@2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} @@ -8976,6 +9006,7 @@ packages: /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true /eslint@8.55.0: resolution: {integrity: sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==} @@ -9069,6 +9100,7 @@ packages: text-table: 0.2.0 transitivePeerDependencies: - supports-color + dev: true /espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} @@ -9077,6 +9109,7 @@ packages: acorn: 8.10.0 acorn-jsx: 5.3.2(acorn@8.10.0) eslint-visitor-keys: 3.4.3 + dev: true /esprima@1.2.2: resolution: {integrity: sha512-+JpPZam9w5DuJ3Q67SqsMGtiHKENSMRVoxvArfJZK01/BfLEObtZ6orJa/MtoGNR/rfMgp5837T41PAmTwAv/A==} @@ -9093,12 +9126,14 @@ packages: engines: {node: '>=0.10'} dependencies: estraverse: 5.3.0 + dev: true /esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} dependencies: estraverse: 5.3.0 + dev: true /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} @@ -9107,6 +9142,7 @@ packages: /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + dev: true /estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -9216,6 +9252,7 @@ packages: /fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: true /fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} @@ -9229,6 +9266,7 @@ packages: /fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true /fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} @@ -9325,6 +9363,7 @@ packages: engines: {node: ^10.12.0 || >=12.0.0} dependencies: flat-cache: 3.1.0 + dev: true /file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} @@ -9409,13 +9448,16 @@ packages: flatted: 3.2.9 keyv: 4.5.3 rimraf: 3.0.2 + dev: true /flat@5.0.2: resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} hasBin: true + dev: true /flatted@3.2.9: resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true /flow-enums-runtime@0.0.5: resolution: {integrity: sha512-PSZF9ZuaZD03sT9YaIs0FrGJ7lSUw7rHZIex+73UYVXg46eL/wxN5PaVcPJFudE2cJu5f0fezitV5aBkLHPUOQ==} @@ -9448,7 +9490,6 @@ packages: peerDependenciesMeta: debug: optional: true - dev: true /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -9476,7 +9517,6 @@ packages: asynckit: 0.4.0 combined-stream: 1.0.8 mime-types: 2.1.35 - dev: true /formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} @@ -9520,10 +9560,6 @@ packages: /fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - /fs@0.0.1-security: - resolution: {integrity: sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w==} - dev: false - /fsevents@2.3.2: resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -9570,6 +9606,7 @@ packages: /get-func-name@2.0.2: resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true /get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} @@ -9626,6 +9663,7 @@ packages: engines: {node: '>=10.13.0'} dependencies: is-glob: 4.0.3 + dev: true /glob@10.3.10: resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} @@ -9659,6 +9697,7 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 + dev: true /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -9697,6 +9736,7 @@ packages: engines: {node: '>=8'} dependencies: type-fest: 0.20.2 + dev: true /globalthis@1.0.3: resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} @@ -9769,6 +9809,7 @@ packages: /graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true /growl@1.10.5: resolution: {integrity: sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==} @@ -9833,6 +9874,7 @@ packages: /he@1.2.0: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + dev: true /header-case@2.0.4: resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} @@ -10009,6 +10051,7 @@ packages: /ignore@5.3.1: resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} engines: {node: '>= 4'} + dev: true /image-size@1.0.2: resolution: {integrity: sha512-xfOoWjceHntRb3qFCrh5ZFORYH8XCdYpASltMhZ/Q0KZiOwjdE/Yl2QCiWdwD+lygV5bMCvauzgu5PxBX/Yerg==} @@ -10032,6 +10075,7 @@ packages: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 + dev: true /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} @@ -10118,6 +10162,7 @@ packages: engines: {node: '>=8'} dependencies: binary-extensions: 2.2.0 + dev: true /is-boolean-object@1.1.2: resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} @@ -10230,6 +10275,7 @@ packages: /is-path-inside@3.0.3: resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} engines: {node: '>=8'} + dev: true /is-plain-obj@2.1.0: resolution: {integrity: sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==} @@ -10552,6 +10598,7 @@ packages: hasBin: true dependencies: argparse: 2.0.1 + dev: true /jsc-android@250231.0.0: resolution: {integrity: sha512-rS46PvsjYmdmuz1OAWXY/1kCYG7pnf1TBqeTiOJr1iDz7s5DLxxC9n/ZMknLDxzYzNVfI7R95MH10emSSG1Wuw==} @@ -10608,6 +10655,7 @@ packages: /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true /json-parse-better-errors@1.0.2: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} @@ -10618,9 +10666,11 @@ packages: /json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true /json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true /json-stringify-safe@5.0.1: resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} @@ -10631,6 +10681,7 @@ packages: requiresBuild: true dependencies: minimist: 1.2.8 + dev: true /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} @@ -10679,6 +10730,7 @@ packages: resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} dependencies: json-buffer: 3.0.1 + dev: true /kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} @@ -10718,6 +10770,7 @@ packages: dependencies: prelude-ls: 1.2.1 type-check: 0.4.0 + dev: true /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -10763,6 +10816,7 @@ packages: /lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true /lodash.template@4.5.0: resolution: {integrity: sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==} @@ -10783,7 +10837,6 @@ packages: /lodash@4.17.21: resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true /log-symbols@4.1.0: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} @@ -10814,6 +10867,7 @@ packages: resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} dependencies: get-func-name: 2.0.2 + dev: true /lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -10862,6 +10916,7 @@ packages: /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true /makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} @@ -11271,6 +11326,7 @@ packages: engines: {node: '>=10'} dependencies: brace-expansion: 2.0.1 + dev: true /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} @@ -11372,6 +11428,7 @@ packages: yargs: 16.2.0 yargs-parser: 20.2.4 yargs-unparser: 2.0.0 + dev: true /mocha@9.2.2: resolution: {integrity: sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==} @@ -11454,6 +11511,7 @@ packages: resolution: {integrity: sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + dev: true /nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} @@ -11466,6 +11524,7 @@ packages: /natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true /natural-orderby@2.0.3: resolution: {integrity: sha512-p7KTHxU0CUrcOXe62Zfrb5Z13nLvPhSWR/so3kFulUQU0sgUll2Z0LwpsLN351eOOD+hRGu/F1g+6xDfPeD++Q==} @@ -12008,6 +12067,7 @@ packages: levn: 0.4.1 prelude-ls: 1.2.1 type-check: 0.4.0 + dev: true /ora@5.4.1: resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} @@ -12085,6 +12145,7 @@ packages: engines: {node: '>=6'} dependencies: callsites: 3.1.0 + dev: true /parse-json@4.0.0: resolution: {integrity: sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==} @@ -12178,6 +12239,7 @@ packages: /pathval@1.1.1: resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true /picocolors@1.0.0: resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} @@ -12274,6 +12336,7 @@ packages: /prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} + dev: true /prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} @@ -12350,11 +12413,11 @@ packages: /proxy-from-env@1.1.0: resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - dev: true /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} engines: {node: '>=6'} + dev: true /pure-rand@6.0.4: resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} @@ -12406,6 +12469,7 @@ packages: resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} dependencies: safe-buffer: 5.2.1 + dev: true /range-parser@1.2.1: resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} @@ -12569,6 +12633,7 @@ packages: engines: {node: '>=8.10.0'} dependencies: picomatch: 2.3.1 + dev: true /readline@1.3.0: resolution: {integrity: sha512-k2d6ACCkiNYz222Fs/iNze30rRJ1iIicW7JuX/7/cozvih6YCkFZH+J6mAFDVgv0dRBaAyr4jDqC95R2y4IADg==} @@ -12701,6 +12766,7 @@ packages: /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + dev: true /resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -12837,6 +12903,12 @@ packages: dependencies: queue-microtask: 1.2.3 + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 + dev: false + /safe-array-concat@1.0.1: resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} engines: {node: '>=0.4'} @@ -12952,6 +13024,7 @@ packages: resolution: {integrity: sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==} dependencies: randombytes: 2.1.0 + dev: true /serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -13345,6 +13418,7 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} requiresBuild: true + dev: true /strip-bom@4.0.0: resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} @@ -13366,6 +13440,7 @@ packages: /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + dev: true /strip-literal@1.3.0: resolution: {integrity: sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==} @@ -13535,6 +13610,7 @@ packages: /text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true /throat@5.0.0: resolution: {integrity: sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==} @@ -13631,6 +13707,7 @@ packages: typescript: '>=4.2.0' dependencies: typescript: 5.3.2 + dev: true /ts-mocha@10.0.0(mocha@10.2.0): resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} @@ -13643,6 +13720,7 @@ packages: ts-node: 7.0.1 optionalDependencies: tsconfig-paths: 3.15.0 + dev: true /ts-mocha@10.0.0(mocha@9.2.2): resolution: {integrity: sha512-VRfgDO+iiuJFlNB18tzOfypJ21xn2xbuZyDvJvqpTbWgkAgD17ONGr8t+Tl8rcBtOBdjXp5e/Rk+d39f7XBHRw==} @@ -13794,6 +13872,7 @@ packages: mkdirp: 0.5.6 source-map-support: 0.5.21 yn: 2.0.0 + dev: true /ts-toolbelt@9.6.0: resolution: {integrity: sha512-nsZd8ZeNUzukXPlJmTBwUAuABDe/9qtVDelJeT/qW0ow3ZS3BsQJtNkan1802aM9Uf68/Y8ljw86Hu0h5IUW3w==} @@ -13817,6 +13896,7 @@ packages: json5: 1.0.2 minimist: 1.2.8 strip-bom: 3.0.0 + dev: true /tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} @@ -13866,6 +13946,7 @@ packages: engines: {node: '>= 0.8.0'} dependencies: prelude-ls: 1.2.1 + dev: true /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} @@ -13874,6 +13955,7 @@ packages: /type-fest@0.20.2: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} + dev: true /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} @@ -14046,6 +14128,7 @@ packages: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: punycode: 2.3.0 + dev: true /url-join@4.0.1: resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} @@ -14324,6 +14407,20 @@ packages: resolution: {integrity: sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==} dev: false + /wait-on@7.2.0: + resolution: {integrity: sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==} + engines: {node: '>=12.0.0'} + hasBin: true + dependencies: + axios: 1.6.8 + joi: 17.11.0 + lodash: 4.17.21 + minimist: 1.2.8 + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + dev: false + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: @@ -14472,6 +14569,7 @@ packages: /workerpool@6.2.1: resolution: {integrity: sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==} + dev: true /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} @@ -14597,6 +14695,7 @@ packages: /yargs-parser@20.2.4: resolution: {integrity: sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==} engines: {node: '>=10'} + dev: true /yargs-parser@21.1.1: resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} @@ -14610,6 +14709,7 @@ packages: decamelize: 4.0.0 flat: 5.0.2 is-plain-obj: 2.1.0 + dev: true /yargs@15.4.1: resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} @@ -14639,6 +14739,7 @@ packages: string-width: 4.2.3 y18n: 5.0.8 yargs-parser: 20.2.4 + dev: true /yargs@17.7.2: resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} @@ -14655,6 +14756,7 @@ packages: /yn@2.0.0: resolution: {integrity: sha512-uTv8J/wiWTgUTg+9vLTi//leUl5vDQS6uii/emeTb2ssY7vl6QWf2fFbIIGjnhjvbdKlU0ed7QPgY1htTC86jQ==} engines: {node: '>=4'} + dev: true /yn@3.1.1: resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} diff --git a/scripts/clean.sh b/scripts/clean.sh index dd69489e62..4251db0b43 100755 --- a/scripts/clean.sh +++ b/scripts/clean.sh @@ -1,5 +1,5 @@ #!/usr/bin/env sh -find . -type d \( -name "test-ledger" \) -exec rm -rf {} + +find . -type d -name "test-ledger" -exec sh -c 'echo "Deleting {}"; rm -rf "{}"' \; npx nx reset \ No newline at end of file