From 676f673dfbcb14f5351a0068aef9ad9fa4ebf879 Mon Sep 17 00:00:00 2001 From: Gregorio Juliana Date: Mon, 9 Dec 2024 13:34:42 +0100 Subject: [PATCH] feat: PXE in the browser (#10353) PXE running in a browser via a vite app. In order to achieve this, several things had to be implemented/altered: - Original LMDB storage was not compatible with the browser. Also its very nature made most get operations synchronous, which is pretty weird for a DB. A new `AztecAsyncKVStore` has been created, offering *almost* the same interface but with async methods for everything. This store is backed by IndexedDB, which is compatible with most modern browsers. The LMDB backed store has been updated to also support the async interface, so now `PxeKvDatabase` can run with either. - In order to support testing in the browser, `@aztec/kv-store` tests have been moved from jest to mocha - Most imports of `fs/promises` have been replaced with `import { promises as fs } from 'fs';` which can be polyfilled by [vite-plugin-node-polyfills](https://www.npmjs.com/package/vite-plugin-node-polyfills). - Several packages (such as `simulator`) have been split to allow importing the minimal set of APIs required for PXE to do its client side thing, avoiding unneeded (and browser-incompatible) APIs and files. - PXE package now generates a static info file (version and name) at compilation time, to avoid reading it from the package.json file (which cannot be done in the browser). A bundler was considered, but this is simpler and more flexible. - A new flag has been added to the sandbox, so it can run without a PXE (`--sandbox.noPXE`). This is very useful to deploy a "network in a box" that can be used to test apps that provide their own PXE implementation. - The vite box is very rough and mostly mimics what the `react` one does, but shows how a hypothetical dapp could be bundled. --------- Co-authored-by: Alex Gherghisan --- avm-transpiler/Cargo.lock | 1 - boxes/boxes/vite/.gitignore | 27 + boxes/boxes/vite/README.md | 50 + boxes/boxes/vite/eslint.config.js | 28 + boxes/boxes/vite/index.html | 25 + boxes/boxes/vite/package.json | 48 + boxes/boxes/vite/src/App.css | 42 + boxes/boxes/vite/src/App.tsx | 35 + boxes/boxes/vite/src/config.ts | 101 + boxes/boxes/vite/src/contracts/Nargo.toml | 9 + boxes/boxes/vite/src/contracts/src/main.nr | 48 + boxes/boxes/vite/src/hooks/useContract.tsx | 40 + boxes/boxes/vite/src/hooks/useNumber.tsx | 48 + boxes/boxes/vite/src/index.css | 68 + boxes/boxes/vite/src/main.tsx | 10 + boxes/boxes/vite/src/pages/contract.tsx | 49 + boxes/boxes/vite/src/pages/home.tsx | 18 + boxes/boxes/vite/src/vite-env.d.ts | 1 + boxes/boxes/vite/tsconfig.json | 25 + boxes/boxes/vite/vite.config.ts | 39 + boxes/yarn.lock | 3439 ++++++++++++----- .../contract_artifacts_store.test.ts | 2 +- .../kv_archiver_store.test.ts | 2 +- yarn-project/archiver/src/factory.ts | 2 +- .../aztec-node/src/aztec-node/server.ts | 2 +- .../aztec/src/cli/aztec_start_options.ts | 6 + yarn-project/aztec/src/cli/cli.ts | 8 +- .../aztec/src/cli/cmds/start_archiver.ts | 2 +- yarn-project/bb-prover/src/bb/cli.ts | 2 +- yarn-project/bb-prover/src/bb/execute.ts | 2 +- .../src/prover/bb_private_kernel_prover.ts | 2 +- .../bb-prover/src/prover/bb_prover.ts | 2 +- .../verification_key/verification_key_data.ts | 2 +- .../bb-prover/src/verifier/bb_verifier.ts | 2 +- .../src/structs/client_ivc_proof.ts | 2 +- .../composed/integration_l1_publisher.test.ts | 2 +- .../src/fixtures/get_acvm_config.ts | 2 +- yarn-project/foundation/src/config/env_var.ts | 1 + yarn-project/foundation/src/fs/run_in_dir.ts | 2 +- yarn-project/foundation/src/iterable/index.ts | 1 + .../foundation/src/iterable/toArray.ts | 7 + .../src/avm_integration.test.ts | 2 +- .../src/native_client_ivc_integration.test.ts | 2 +- .../src/scripts/generate_ts_from_abi.ts | 2 +- yarn-project/key-store/src/key_store.test.ts | 2 +- yarn-project/key-store/src/key_store.ts | 70 +- yarn-project/kv-store/.gitignore | 5 + yarn-project/kv-store/.mocharc.json | 13 + yarn-project/kv-store/package.json | 87 +- yarn-project/kv-store/package.local.json | 5 + .../kv-store/src/indexeddb/array.test.ts | 7 + yarn-project/kv-store/src/indexeddb/array.ts | 118 + yarn-project/kv-store/src/indexeddb/index.ts | 37 + .../kv-store/src/indexeddb/map.test.ts | 7 + yarn-project/kv-store/src/indexeddb/map.ts | 142 + .../kv-store/src/indexeddb/set.test.ts | 7 + yarn-project/kv-store/src/indexeddb/set.ts | 37 + .../kv-store/src/indexeddb/singleton.test.ts | 7 + .../kv-store/src/indexeddb/singleton.ts | 49 + .../kv-store/src/indexeddb/store.test.ts | 12 + yarn-project/kv-store/src/indexeddb/store.ts | 192 + yarn-project/kv-store/src/interfaces/array.ts | 60 +- .../src/interfaces/array_test_suite.ts | 126 + .../kv-store/src/interfaces/counter.ts | 24 +- yarn-project/kv-store/src/interfaces/map.ts | 83 +- .../kv-store/src/interfaces/map_test_suite.ts | 154 + yarn-project/kv-store/src/interfaces/set.ts | 33 +- .../kv-store/src/interfaces/set_test_suite.ts | 77 + .../kv-store/src/interfaces/singleton.ts | 20 +- .../src/interfaces/singleton_test_suite.ts | 42 + yarn-project/kv-store/src/interfaces/store.ts | 86 +- .../src/interfaces/store_test_suite.ts | 52 + yarn-project/kv-store/src/interfaces/utils.ts | 20 + yarn-project/kv-store/src/lmdb/array.test.ts | 93 +- yarn-project/kv-store/src/lmdb/array.ts | 28 +- .../kv-store/src/lmdb/counter.test.ts | 30 +- yarn-project/kv-store/src/lmdb/counter.ts | 16 +- yarn-project/kv-store/src/lmdb/index.ts | 36 + yarn-project/kv-store/src/lmdb/map.test.ts | 101 +- yarn-project/kv-store/src/lmdb/map.ts | 36 +- yarn-project/kv-store/src/lmdb/set.test.ts | 56 +- yarn-project/kv-store/src/lmdb/set.ts | 14 +- .../kv-store/src/lmdb/singleton.test.ts | 27 +- yarn-project/kv-store/src/lmdb/singleton.ts | 8 +- yarn-project/kv-store/src/lmdb/store.test.ts | 41 +- yarn-project/kv-store/src/lmdb/store.ts | 47 +- .../kv-store/src/stores/l2_tips_store.test.ts | 32 +- .../kv-store/src/stores/l2_tips_store.ts | 32 +- yarn-project/kv-store/src/utils.ts | 45 +- .../kv-store/web-test-runner.config.mjs | 24 + .../snapshots/append_only_snapshot.test.ts | 2 +- .../src/snapshots/full_snapshot.test.ts | 2 +- .../snapshots/indexed_tree_snapshot.test.ts | 2 +- .../src/sparse_tree/sparse_tree.test.ts | 2 +- .../test/standard_indexed_tree.test.ts | 2 +- .../src/standard_tree/standard_tree.test.ts | 2 +- .../src/test/standard_based_test_suite.ts | 2 +- .../merkle-tree/src/test/test_suite.ts | 2 +- .../merkle-tree/src/unbalanced_tree.test.ts | 2 +- .../generate_private_kernel_reset_data.ts | 2 +- .../src/scripts/generate_ts_from_abi.ts | 2 +- .../src/scripts/generate_vk_hashes.ts | 2 +- yarn-project/p2p-bootstrap/src/index.ts | 2 +- yarn-project/p2p/src/client/index.ts | 2 +- .../p2p/src/client/p2p_client.test.ts | 2 +- .../tx_pool/aztec_kv_tx_pool.test.ts | 2 +- yarn-project/p2p/src/mocks/index.ts | 2 +- .../p2p/src/service/discv5_service.test.ts | 2 +- .../reqresp/reqresp.integration.test.ts | 2 +- yarn-project/p2p/src/utils.test.ts | 2 +- .../src/scripts/generate_data.ts | 2 +- .../prover-client/src/mocks/fixtures.ts | 2 +- .../prover-client/src/mocks/test_context.ts | 2 +- .../src/proving_broker/proving_broker.test.ts | 2 +- .../prover-node/src/prover-node.test.ts | 2 +- yarn-project/pxe/.gitignore | 1 + yarn-project/pxe/package.json | 16 +- yarn-project/pxe/package.local.json | 7 + .../pxe/scripts/generate_package_info.js | 14 + yarn-project/pxe/src/bin/index.ts | 2 +- yarn-project/pxe/src/config/index.ts | 14 - .../pxe/src/contract_data_oracle/index.ts | 2 +- .../pxe/src/database/incoming_note_dao.ts | 2 +- .../pxe/src/database/kv_pxe_database.test.ts | 6 +- .../pxe/src/database/kv_pxe_database.ts | 466 +-- yarn-project/pxe/src/database/pxe_database.ts | 8 +- .../src/database/pxe_database_test_suite.ts | 16 +- yarn-project/pxe/src/index.ts | 1 + yarn-project/pxe/src/kernel_prover/index.ts | 2 + .../add_public_values_to_payload.ts | 2 +- .../brute_force_note_info.ts | 2 +- .../produce_note_daos.ts | 2 +- .../produce_note_daos_for_key.ts | 2 +- .../pxe/src/pxe_service/create_pxe_service.ts | 4 +- .../pxe/src/pxe_service/error_enriching.ts | 2 +- yarn-project/pxe/src/pxe_service/index.ts | 1 - .../pxe/src/pxe_service/pxe_service.ts | 7 +- .../src/pxe_service/test/pxe_service.test.ts | 10 +- yarn-project/pxe/src/simulator/index.ts | 2 +- .../pxe/src/simulator_oracle/index.ts | 7 +- .../simulator_oracle/simulator_oracle.test.ts | 6 +- .../pxe/src/synchronizer/synchronizer.test.ts | 8 +- .../pxe/src/synchronizer/synchronizer.ts | 10 +- yarn-project/pxe/src/utils/index.ts | 67 + yarn-project/simulator/package.json | 3 + .../simulator/src/avm/avm_simulator.test.ts | 2 +- .../simulator/src/avm/avm_tree.test.ts | 2 +- .../src/client/private_execution.test.ts | 2 +- .../simulator/src/providers/acvm_native.ts | 2 +- .../simulator/src/providers/factory.ts | 2 +- .../simulator/src/public/fixtures/index.ts | 2 +- .../src/public/public_tx_simulator.test.ts | 2 +- yarn-project/txe/src/oracle/txe_oracle.ts | 2 +- .../txe/src/txe_service/txe_service.ts | 2 +- yarn-project/txe/src/util/txe_database.ts | 10 +- .../world-state/src/synchronizer/factory.ts | 2 +- .../src/world-state-db/merkle_trees.ts | 2 +- yarn-project/yarn.lock | 1655 +++++++- 158 files changed, 7010 insertions(+), 1869 deletions(-) create mode 100644 boxes/boxes/vite/.gitignore create mode 100644 boxes/boxes/vite/README.md create mode 100644 boxes/boxes/vite/eslint.config.js create mode 100644 boxes/boxes/vite/index.html create mode 100644 boxes/boxes/vite/package.json create mode 100644 boxes/boxes/vite/src/App.css create mode 100644 boxes/boxes/vite/src/App.tsx create mode 100644 boxes/boxes/vite/src/config.ts create mode 100644 boxes/boxes/vite/src/contracts/Nargo.toml create mode 100644 boxes/boxes/vite/src/contracts/src/main.nr create mode 100644 boxes/boxes/vite/src/hooks/useContract.tsx create mode 100644 boxes/boxes/vite/src/hooks/useNumber.tsx create mode 100644 boxes/boxes/vite/src/index.css create mode 100644 boxes/boxes/vite/src/main.tsx create mode 100644 boxes/boxes/vite/src/pages/contract.tsx create mode 100644 boxes/boxes/vite/src/pages/home.tsx create mode 100644 boxes/boxes/vite/src/vite-env.d.ts create mode 100644 boxes/boxes/vite/tsconfig.json create mode 100644 boxes/boxes/vite/vite.config.ts create mode 100644 yarn-project/foundation/src/iterable/toArray.ts create mode 100644 yarn-project/kv-store/.gitignore create mode 100644 yarn-project/kv-store/.mocharc.json create mode 100644 yarn-project/kv-store/package.local.json create mode 100644 yarn-project/kv-store/src/indexeddb/array.test.ts create mode 100644 yarn-project/kv-store/src/indexeddb/array.ts create mode 100644 yarn-project/kv-store/src/indexeddb/index.ts create mode 100644 yarn-project/kv-store/src/indexeddb/map.test.ts create mode 100644 yarn-project/kv-store/src/indexeddb/map.ts create mode 100644 yarn-project/kv-store/src/indexeddb/set.test.ts create mode 100644 yarn-project/kv-store/src/indexeddb/set.ts create mode 100644 yarn-project/kv-store/src/indexeddb/singleton.test.ts create mode 100644 yarn-project/kv-store/src/indexeddb/singleton.ts create mode 100644 yarn-project/kv-store/src/indexeddb/store.test.ts create mode 100644 yarn-project/kv-store/src/indexeddb/store.ts create mode 100644 yarn-project/kv-store/src/interfaces/array_test_suite.ts create mode 100644 yarn-project/kv-store/src/interfaces/map_test_suite.ts create mode 100644 yarn-project/kv-store/src/interfaces/set_test_suite.ts create mode 100644 yarn-project/kv-store/src/interfaces/singleton_test_suite.ts create mode 100644 yarn-project/kv-store/src/interfaces/store_test_suite.ts create mode 100644 yarn-project/kv-store/src/interfaces/utils.ts create mode 100644 yarn-project/kv-store/web-test-runner.config.mjs create mode 100644 yarn-project/pxe/.gitignore create mode 100644 yarn-project/pxe/package.local.json create mode 100644 yarn-project/pxe/scripts/generate_package_info.js create mode 100644 yarn-project/pxe/src/utils/index.ts diff --git a/avm-transpiler/Cargo.lock b/avm-transpiler/Cargo.lock index bdac1771a70..4da74e41190 100644 --- a/avm-transpiler/Cargo.lock +++ b/avm-transpiler/Cargo.lock @@ -948,7 +948,6 @@ dependencies = [ "acvm", "iter-extended", "jsonrpc", - "regex", "serde", "serde_json", "thiserror", diff --git a/boxes/boxes/vite/.gitignore b/boxes/boxes/vite/.gitignore new file mode 100644 index 00000000000..4137dee7a54 --- /dev/null +++ b/boxes/boxes/vite/.gitignore @@ -0,0 +1,27 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +artifacts/* +codegenCache.json diff --git a/boxes/boxes/vite/README.md b/boxes/boxes/vite/README.md new file mode 100644 index 00000000000..74872fd4af6 --- /dev/null +++ b/boxes/boxes/vite/README.md @@ -0,0 +1,50 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default tseslint.config({ + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` +- Optionally add `...tseslint.configs.stylisticTypeChecked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: + +```js +// eslint.config.js +import react from 'eslint-plugin-react' + +export default tseslint.config({ + // Set the react version + settings: { react: { version: '18.3' } }, + plugins: { + // Add the react plugin + react, + }, + rules: { + // other rules... + // Enable its recommended rules + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + }, +}) +``` diff --git a/boxes/boxes/vite/eslint.config.js b/boxes/boxes/vite/eslint.config.js new file mode 100644 index 00000000000..092408a9f09 --- /dev/null +++ b/boxes/boxes/vite/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/boxes/boxes/vite/index.html b/boxes/boxes/vite/index.html new file mode 100644 index 00000000000..f6f53a86ef9 --- /dev/null +++ b/boxes/boxes/vite/index.html @@ -0,0 +1,25 @@ + + + + + + Private Token Noir Smart Contract + + + +
+ + + diff --git a/boxes/boxes/vite/package.json b/boxes/boxes/vite/package.json new file mode 100644 index 00000000000..cbc2f139190 --- /dev/null +++ b/boxes/boxes/vite/package.json @@ -0,0 +1,48 @@ +{ + "name": "vite", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "compile": "cd src/contracts && ${AZTEC_NARGO:-aztec-nargo} compile --silence-warnings", + "codegen": "${AZTEC_BUILDER:-aztec} codegen src/contracts/target -o artifacts", + "clean": "rm -rf ./dist .tsbuildinfo ./artifacts ./src/contracts/target", + "prep": "yarn clean && yarn compile && yarn codegen", + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@aztec/accounts": "portal:../../../yarn-project/accounts", + "@aztec/aztec.js": "portal:../../../yarn-project/aztec.js", + "@aztec/circuit-types": "portal:../../../yarn-project/circuit-types", + "@aztec/key-store": "link:../../../yarn-project/key-store", + "@aztec/kv-store": "portal:../../../yarn-project/kv-store", + "@aztec/pxe": "link:../../../yarn-project/pxe", + "@noir-lang/acvm_js": "link:../../../noir/packages/acvm_js", + "@noir-lang/noirc_abi": "link:../../../noir/packages/noirc_abi", + "buffer": "^6.0.3", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-toastify": "^10.0.6" + }, + "devDependencies": { + "@eslint/js": "^9.13.0", + "@types/react": "^18.3.12", + "@types/react-dom": "^18.3.1", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^9.13.0", + "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-react-refresh": "^0.4.14", + "globals": "^15.11.0", + "memfs": "^4.14.0", + "node-stdlib-browser": "^1.3.0", + "typescript": "~5.6.2", + "typescript-eslint": "^8.11.0", + "vite": "^5.4.10", + "vite-plugin-externalize-deps": "^0.8.0", + "vite-plugin-node-polyfills": "^0.22.0", + "vite-plugin-top-level-await": "^1.4.4" + } +} diff --git a/boxes/boxes/vite/src/App.css b/boxes/boxes/vite/src/App.css new file mode 100644 index 00000000000..b9d355df2a5 --- /dev/null +++ b/boxes/boxes/vite/src/App.css @@ -0,0 +1,42 @@ +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} diff --git a/boxes/boxes/vite/src/App.tsx b/boxes/boxes/vite/src/App.tsx new file mode 100644 index 00000000000..daf6f6d9d8d --- /dev/null +++ b/boxes/boxes/vite/src/App.tsx @@ -0,0 +1,35 @@ +import { ToastContainer } from "react-toastify"; +import "react-toastify/dist/ReactToastify.css"; +import "./App.css"; +import { Home } from "./pages/home"; +import { useEffect, useState } from "react"; +import initACVM from "@noir-lang/acvm_js/web/acvm_js"; +import initABI from "@noir-lang/noirc_abi/web/noirc_abi_wasm"; +import acvmURL from "@noir-lang/acvm_js/web/acvm_js_bg.wasm?url"; +import abiURL from "@noir-lang/noirc_abi/web/noirc_abi_wasm_bg.wasm?url"; + +const InitWasm = ({ children }: any) => { + const [init, setInit] = useState(false); + useEffect(() => { + (async () => { + await Promise.all([ + initACVM(new URL(acvmURL, import.meta.url).toString()), + initABI(new URL(abiURL, import.meta.url).toString()), + ]); + setInit(true); + })(); + }, []); + + return
{init && children}
; +}; + +function App() { + return ( + + + + + ); +} + +export default App; diff --git a/boxes/boxes/vite/src/config.ts b/boxes/boxes/vite/src/config.ts new file mode 100644 index 00000000000..0052072e235 --- /dev/null +++ b/boxes/boxes/vite/src/config.ts @@ -0,0 +1,101 @@ +import { + AztecNode, + Fr, + createDebugLogger, + deriveMasterIncomingViewingSecretKey, +} from "@aztec/aztec.js"; +import { BoxReactContractArtifact } from "../artifacts/BoxReact"; +import { AccountManager } from "@aztec/aztec.js/account"; +import { SingleKeyAccountContract } from "@aztec/accounts/single_key"; +import { createAztecNodeClient } from "@aztec/aztec.js"; +import { PXEService } from "@aztec/pxe/service"; +import { PXEServiceConfig, getPXEServiceConfig } from "@aztec/pxe/config"; +import { KVPxeDatabase } from "@aztec/pxe/database"; +import { TestPrivateKernelProver } from "@aztec/pxe/kernel_prover"; +import { KeyStore } from "@aztec/key-store"; +import { PrivateKernelProver } from "@aztec/circuit-types"; +import { L2TipsStore } from "@aztec/kv-store/stores"; +import { createStore } from "@aztec/kv-store/indexeddb"; + +const SECRET_KEY = Fr.random(); + +export class PrivateEnv { + pxe; + accountContract; + account: AccountManager; + + constructor( + private secretKey: Fr, + private nodeURL: string, + ) {} + + async init() { + const config = getPXEServiceConfig(); + config.dataDirectory = "pxe"; + const aztecNode = await createAztecNodeClient(this.nodeURL); + const proofCreator = new TestPrivateKernelProver(); + this.pxe = await this.createPXEService(aztecNode, config, proofCreator); + const encryptionPrivateKey = deriveMasterIncomingViewingSecretKey( + this.secretKey, + ); + this.accountContract = new SingleKeyAccountContract(encryptionPrivateKey); + this.account = new AccountManager( + this.pxe, + this.secretKey, + this.accountContract, + ); + } + + async createPXEService( + aztecNode: AztecNode, + config: PXEServiceConfig, + proofCreator?: PrivateKernelProver, + ) { + const l1Contracts = await aztecNode.getL1ContractAddresses(); + const configWithContracts = { + ...config, + l1Contracts, + } as PXEServiceConfig; + + const store = await createStore( + "pxe_data", + configWithContracts, + createDebugLogger("aztec:pxe:data:indexeddb"), + ); + + const keyStore = new KeyStore(store); + + const db = await KVPxeDatabase.create(store); + const tips = new L2TipsStore(store, "pxe"); + + const server = new PXEService( + keyStore, + aztecNode, + db, + tips, + proofCreator, + config, + ); + await server.start(); + return server; + } + + async getWallet() { + // taking advantage that register is no-op if already registered + return await this.account.register(); + } +} + +export const deployerEnv = new PrivateEnv( + SECRET_KEY, + process.env.PXE_URL || "http://localhost:8080", +); + +const IGNORE_FUNCTIONS = [ + "constructor", + "compute_note_hash_and_optionally_a_nullifier", + "sync_notes", +]; +export const filteredInterface = BoxReactContractArtifact.functions.filter( + (f) => !IGNORE_FUNCTIONS.includes(f.name), +); diff --git a/boxes/boxes/vite/src/contracts/Nargo.toml b/boxes/boxes/vite/src/contracts/Nargo.toml new file mode 100644 index 00000000000..9058cbde9a3 --- /dev/null +++ b/boxes/boxes/vite/src/contracts/Nargo.toml @@ -0,0 +1,9 @@ +[package] +name = "boxreact" +authors = [""] +compiler_version = ">=0.18.0" +type = "contract" + +[dependencies] +aztec = { path = "../../../../../noir-projects/aztec-nr/aztec" } +value_note = { path = "../../../../../noir-projects/aztec-nr/value-note" } diff --git a/boxes/boxes/vite/src/contracts/src/main.nr b/boxes/boxes/vite/src/contracts/src/main.nr new file mode 100644 index 00000000000..f4924981e8e --- /dev/null +++ b/boxes/boxes/vite/src/contracts/src/main.nr @@ -0,0 +1,48 @@ +use dep::aztec::macros::aztec; + +#[aztec] +contract BoxReact { + use dep::aztec::{ + protocol_types::public_keys::OvpkM, + keys::getters::get_public_keys, + prelude::{AztecAddress, PrivateMutable, Map, NoteInterface, NoteHeader, Point}, + encrypted_logs::encrypted_note_emission::encode_and_encrypt_note, + macros::{storage::storage, functions::{private, public, initializer}} + }; + use dep::value_note::value_note::ValueNote; + + #[storage] + struct Storage { + numbers: Map, Context>, + } + + #[private] + #[initializer] + fn constructor( + number: Field, + owner: AztecAddress + ) { + let numbers = storage.numbers; + let mut new_number = ValueNote::new(number, owner); + + let owner_ovpk_m = get_public_keys(owner).ovpk_m; + numbers.at(owner).initialize(&mut new_number).emit(encode_and_encrypt_note(&mut context, owner_ovpk_m, owner, context.msg_sender())); + } + + #[private] + fn setNumber( + number: Field, + owner: AztecAddress + ) { + let numbers = storage.numbers; + let mut new_number = ValueNote::new(number, owner); + + let owner_ovpk_m = get_public_keys(owner).ovpk_m; + numbers.at(owner).replace(&mut new_number).emit(encode_and_encrypt_note(&mut context, owner_ovpk_m, owner, context.msg_sender())); + } + + unconstrained fn getNumber(owner: AztecAddress) -> pub ValueNote { + let numbers = storage.numbers; + numbers.at(owner).view_note() + } +} diff --git a/boxes/boxes/vite/src/hooks/useContract.tsx b/boxes/boxes/vite/src/hooks/useContract.tsx new file mode 100644 index 00000000000..526081ab850 --- /dev/null +++ b/boxes/boxes/vite/src/hooks/useContract.tsx @@ -0,0 +1,40 @@ +import { useState } from "react"; +import { deployerEnv } from "../config"; + +import { Contract, Fr } from "@aztec/aztec.js"; +import { BoxReactContract } from "../../artifacts/BoxReact"; +import { toast } from "react-toastify"; + +export function useContract() { + const [wait, setWait] = useState(false); + const [contract, setContract] = useState(); + + const deploy = async (e: React.FormEvent) => { + e.preventDefault(); + + setWait(true); + await deployerEnv.init(); + const wallet = await deployerEnv.getWallet(); + const salt = Fr.random(); + + const tx = await BoxReactContract.deploy( + wallet, + Fr.random(), + wallet.getCompleteAddress().address, + ).send({ + contractAddressSalt: salt, + }); + const contract = await toast.promise(tx.deployed(), { + pending: "Deploying contract...", + success: { + render: ({ data }) => `Address: ${data.address}`, + }, + error: "Error deploying contract", + }); + + setContract(contract); + setWait(false); + }; + + return { deploy, contract, wait }; +} diff --git a/boxes/boxes/vite/src/hooks/useNumber.tsx b/boxes/boxes/vite/src/hooks/useNumber.tsx new file mode 100644 index 00000000000..c9f7bce59de --- /dev/null +++ b/boxes/boxes/vite/src/hooks/useNumber.tsx @@ -0,0 +1,48 @@ +import { useState } from 'react'; +import { Contract } from '@aztec/aztec.js'; +import { toast } from 'react-toastify'; +import { deployerEnv } from '../config'; + +export function useNumber({ contract }: { contract: Contract }) { + const [wait, setWait] = useState(false); + + const getNumber = async (e: React.FormEvent) => { + e.preventDefault(); + + setWait(true); + const deployerWallet = await deployerEnv.getWallet(); + const viewTxReceipt = await contract!.methods.getNumber(deployerWallet.getCompleteAddress().address).simulate(); + toast(`Number is: ${viewTxReceipt.value}`); + setWait(false); + }; + + const setNumber = async (e: React.FormEvent) => { + e.preventDefault(); + + const el = e.currentTarget.elements.namedItem('numberToSet') as HTMLInputElement; + if (el) { + setWait(true); + + const value = BigInt(el.value); + const deployerWallet = await deployerEnv.getWallet(); + + await toast.promise( + contract!.methods + .setNumber( + value, + deployerWallet.getCompleteAddress().address, + ) + .send() + .wait(), + { + pending: 'Setting number...', + success: `Number set to: ${value}`, + error: 'Error setting number', + }, + ); + setWait(false); + } + }; + + return { getNumber, setNumber, wait }; +} diff --git a/boxes/boxes/vite/src/index.css b/boxes/boxes/vite/src/index.css new file mode 100644 index 00000000000..6119ad9a8fa --- /dev/null +++ b/boxes/boxes/vite/src/index.css @@ -0,0 +1,68 @@ +:root { + font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; + line-height: 1.5; + font-weight: 400; + + color-scheme: light dark; + color: rgba(255, 255, 255, 0.87); + background-color: #242424; + + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +a { + font-weight: 500; + color: #646cff; + text-decoration: inherit; +} +a:hover { + color: #535bf2; +} + +body { + margin: 0; + display: flex; + place-items: center; + min-width: 320px; + min-height: 100vh; +} + +h1 { + font-size: 3.2em; + line-height: 1.1; +} + +button { + border-radius: 8px; + border: 1px solid transparent; + padding: 0.6em 1.2em; + font-size: 1em; + font-weight: 500; + font-family: inherit; + background-color: #1a1a1a; + cursor: pointer; + transition: border-color 0.25s; +} +button:hover { + border-color: #646cff; +} +button:focus, +button:focus-visible { + outline: 4px auto -webkit-focus-ring-color; +} + +@media (prefers-color-scheme: light) { + :root { + color: #213547; + background-color: #ffffff; + } + a:hover { + color: #747bff; + } + button { + background-color: #f9f9f9; + } +} diff --git a/boxes/boxes/vite/src/main.tsx b/boxes/boxes/vite/src/main.tsx new file mode 100644 index 00000000000..eff7ccc6776 --- /dev/null +++ b/boxes/boxes/vite/src/main.tsx @@ -0,0 +1,10 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import "./index.css"; +import App from "./App.tsx"; + +createRoot(document.getElementById("root")!).render( + + + , +); diff --git a/boxes/boxes/vite/src/pages/contract.tsx b/boxes/boxes/vite/src/pages/contract.tsx new file mode 100644 index 00000000000..93d398ef1f4 --- /dev/null +++ b/boxes/boxes/vite/src/pages/contract.tsx @@ -0,0 +1,49 @@ +import { useState } from 'react'; +import { Contract } from '@aztec/aztec.js'; +import { useNumber } from '../hooks/useNumber'; +import { filteredInterface } from '../config'; + +export function ContractComponent({ contract }: { contract: Contract }) { + const [showInput, setShowInput] = useState(true); + const { wait, getNumber, setNumber } = useNumber({ contract }); + + return ( +
+

Your Contract

+
+ + + +
+ +
+ + + + +
+
+ ); +} diff --git a/boxes/boxes/vite/src/pages/home.tsx b/boxes/boxes/vite/src/pages/home.tsx new file mode 100644 index 00000000000..ba41f15cebf --- /dev/null +++ b/boxes/boxes/vite/src/pages/home.tsx @@ -0,0 +1,18 @@ +import { ContractComponent } from './contract'; +import { useContract } from '../hooks/useContract'; + +export function Home() { + const { contract, deploy, wait } = useContract(); + + if (!contract) { + return ( +
+ +
+ ); + } + + return ; +} diff --git a/boxes/boxes/vite/src/vite-env.d.ts b/boxes/boxes/vite/src/vite-env.d.ts new file mode 100644 index 00000000000..11f02fe2a00 --- /dev/null +++ b/boxes/boxes/vite/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/boxes/boxes/vite/tsconfig.json b/boxes/boxes/vite/tsconfig.json new file mode 100644 index 00000000000..e00f93d6591 --- /dev/null +++ b/boxes/boxes/vite/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + "composite": true, + + /* Bundler mode */ + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + }, + "include": [ + "src/**/*.ts*", + "tests/**/*.ts", + "src/contracts/target/*.json", + "artifacts/**/*.ts" + ] +} diff --git a/boxes/boxes/vite/vite.config.ts b/boxes/boxes/vite/vite.config.ts new file mode 100644 index 00000000000..eb101d8e821 --- /dev/null +++ b/boxes/boxes/vite/vite.config.ts @@ -0,0 +1,39 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react-swc"; +import { PolyfillOptions, nodePolyfills } from "vite-plugin-node-polyfills"; +import topLevelAwait from "vite-plugin-top-level-await"; + +// Unfortunate, but needed due to https://github.com/davidmyersdev/vite-plugin-node-polyfills/issues/81 +// Suspected to be because of the yarn workspace setup, but not sure +const nodePolyfillsFix = (options?: PolyfillOptions | undefined): Plugin => { + return { + ...nodePolyfills(options), + /* @ts-ignore */ + resolveId(source: string) { + const m = + /^vite-plugin-node-polyfills\/shims\/(buffer|global|process)$/.exec( + source, + ); + if (m) { + return `../../node_modules/vite-plugin-node-polyfills/shims/${m[1]}/dist/index.cjs`; + } + }, + }; +}; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + react(), + nodePolyfillsFix({ + overrides: { + fs: "memfs", + buffer: "buffer/", + }, + }), + topLevelAwait(), + ], + optimizeDeps: { + exclude: ["@noir-lang/acvm_js", "@noir-lang/noirc_abi"], + }, +}); diff --git a/boxes/yarn.lock b/boxes/yarn.lock index f3726279f96..5be00301898 100644 --- a/boxes/yarn.lock +++ b/boxes/yarn.lock @@ -5,7 +5,7 @@ __metadata: version: 8 cacheKey: 10c0 -"@ampproject/remapping@npm:^2.2.0, @ampproject/remapping@npm:^2.3.0": +"@ampproject/remapping@npm:^2.2.0": version: 2.3.0 resolution: "@ampproject/remapping@npm:2.3.0" dependencies: @@ -28,24 +28,60 @@ __metadata: linkType: soft "@aztec/builder@npm:latest": - version: 0.52.0 - resolution: "@aztec/builder@npm:0.52.0" + version: 0.63.1 + resolution: "@aztec/builder@npm:0.63.1" dependencies: - "@aztec/foundation": "npm:0.52.0" - "@aztec/types": "npm:0.52.0" + "@aztec/foundation": "npm:0.63.1" + "@aztec/types": "npm:0.63.1" commander: "npm:^12.1.0" bin: aztec-builder: dest/bin/cli.js - checksum: 2207259255fc3e2ffbbd08829f2a4adc9070befaf09e0541213beaf378632a501c29104e447f310aebbf65a21e3cb77b99259a4122e9253640ee232ce4413675 + checksum: c373e3c44cd08a460773458c5f19f8e7b884b5fc83252dcbe6f751a3319e04a7a600c219d7ab7af6bfaef9ccea6bf32bce11cbde861fe839ed0742c4c8f2c95a languageName: node linkType: hard +"@aztec/circuit-types@link:../yarn-project/circuit-types::locator=aztec-app%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@aztec/circuit-types@link:../yarn-project/circuit-types::locator=aztec-app%40workspace%3A." + languageName: node + linkType: soft + +"@aztec/ethereum@link:../yarn-project/ethereum::locator=aztec-app%40workspace%3A.": + version: 0.0.0-use.local + resolution: "@aztec/ethereum@link:../yarn-project/ethereum::locator=aztec-app%40workspace%3A." + languageName: node + linkType: soft + "@aztec/foundation@link:../yarn-project/foundation::locator=aztec-app%40workspace%3A.": version: 0.0.0-use.local resolution: "@aztec/foundation@link:../yarn-project/foundation::locator=aztec-app%40workspace%3A." languageName: node linkType: soft +"@aztec/key-store@link:../../../yarn-project/key-store::locator=vite%40workspace%3Aboxes%2Fvite": + version: 0.0.0-use.local + resolution: "@aztec/key-store@link:../../../yarn-project/key-store::locator=vite%40workspace%3Aboxes%2Fvite" + languageName: node + linkType: soft + +"@aztec/kv-store@portal:../../../yarn-project/kv-store::locator=vite%40workspace%3Aboxes%2Fvite": + version: 0.0.0-use.local + resolution: "@aztec/kv-store@portal:../../../yarn-project/kv-store::locator=vite%40workspace%3Aboxes%2Fvite" + dependencies: + "@aztec/circuit-types": "workspace:^" + "@aztec/ethereum": "workspace:^" + "@aztec/foundation": "workspace:^" + idb: "npm:^8.0.0" + lmdb: "npm:^3.0.6" + languageName: node + linkType: soft + +"@aztec/pxe@link:../../../yarn-project/pxe::locator=vite%40workspace%3Aboxes%2Fvite": + version: 0.0.0-use.local + resolution: "@aztec/pxe@link:../../../yarn-project/pxe::locator=vite%40workspace%3Aboxes%2Fvite" + languageName: node + linkType: soft + "@aztec/react@workspace:boxes/react": version: 0.0.0-use.local resolution: "@aztec/react@workspace:boxes/react" @@ -125,163 +161,142 @@ __metadata: languageName: unknown linkType: soft -"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/code-frame@npm:7.24.7" +"@babel/code-frame@npm:^7.0.0, @babel/code-frame@npm:^7.12.13, @babel/code-frame@npm:^7.25.9, @babel/code-frame@npm:^7.26.0": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" dependencies: - "@babel/highlight": "npm:^7.24.7" + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" picocolors: "npm:^1.0.0" - checksum: ab0af539473a9f5aeaac7047e377cb4f4edd255a81d84a76058595f8540784cc3fbe8acf73f1e073981104562490aabfb23008cd66dc677a456a4ed5390fdde6 + checksum: 7d79621a6849183c415486af99b1a20b84737e8c11cd55b6544f688c51ce1fd710e6d869c3dd21232023da272a79b91efb3e83b5bc2dc65c1187c5fcd1b72ea8 languageName: node linkType: hard -"@babel/compat-data@npm:^7.25.2": - version: 7.25.4 - resolution: "@babel/compat-data@npm:7.25.4" - checksum: 50d79734d584a28c69d6f5b99adfaa064d0f41609a378aef04eb06accc5b44f8520e68549eba3a082478180957b7d5783f1bfb1672e4ae8574e797ce8bae79fa +"@babel/compat-data@npm:^7.25.9": + version: 7.26.2 + resolution: "@babel/compat-data@npm:7.26.2" + checksum: c9b5f3724828d17f728a778f9d66c19b55c018d0d76de6d731178cca64f182c22b71400a73bf2b65dcc4fcfe52b630088a94d5902911b54206aa90e3ffe07d12 languageName: node linkType: hard "@babel/core@npm:^7.11.6, @babel/core@npm:^7.12.3, @babel/core@npm:^7.23.9": - version: 7.25.2 - resolution: "@babel/core@npm:7.25.2" + version: 7.26.0 + resolution: "@babel/core@npm:7.26.0" dependencies: "@ampproject/remapping": "npm:^2.2.0" - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.0" - "@babel/helper-compilation-targets": "npm:^7.25.2" - "@babel/helper-module-transforms": "npm:^7.25.2" - "@babel/helpers": "npm:^7.25.0" - "@babel/parser": "npm:^7.25.0" - "@babel/template": "npm:^7.25.0" - "@babel/traverse": "npm:^7.25.2" - "@babel/types": "npm:^7.25.2" + "@babel/code-frame": "npm:^7.26.0" + "@babel/generator": "npm:^7.26.0" + "@babel/helper-compilation-targets": "npm:^7.25.9" + "@babel/helper-module-transforms": "npm:^7.26.0" + "@babel/helpers": "npm:^7.26.0" + "@babel/parser": "npm:^7.26.0" + "@babel/template": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.26.0" convert-source-map: "npm:^2.0.0" debug: "npm:^4.1.0" gensync: "npm:^1.0.0-beta.2" json5: "npm:^2.2.3" semver: "npm:^6.3.1" - checksum: a425fa40e73cb72b6464063a57c478bc2de9dbcc19c280f1b55a3d88b35d572e87e8594e7d7b4880331addb6faef641bbeb701b91b41b8806cd4deae5d74f401 + checksum: 91de73a7ff5c4049fbc747930aa039300e4d2670c2a91f5aa622f1b4868600fc89b01b6278385fbcd46f9574186fa3d9b376a9e7538e50f8d118ec13cfbcb63e languageName: node linkType: hard -"@babel/generator@npm:^7.25.0, @babel/generator@npm:^7.25.6, @babel/generator@npm:^7.7.2": - version: 7.25.6 - resolution: "@babel/generator@npm:7.25.6" +"@babel/generator@npm:^7.25.9, @babel/generator@npm:^7.26.0, @babel/generator@npm:^7.7.2": + version: 7.26.2 + resolution: "@babel/generator@npm:7.26.2" dependencies: - "@babel/types": "npm:^7.25.6" + "@babel/parser": "npm:^7.26.2" + "@babel/types": "npm:^7.26.0" "@jridgewell/gen-mapping": "npm:^0.3.5" "@jridgewell/trace-mapping": "npm:^0.3.25" - jsesc: "npm:^2.5.1" - checksum: f89282cce4ddc63654470b98086994d219407d025497f483eb03ba102086e11e2b685b27122f6ff2e1d93b5b5fa0c3a6b7e974fbf2e4a75b685041a746a4291e + jsesc: "npm:^3.0.2" + checksum: 167ebce8977142f5012fad6bd91da51ac52bcd752f2261a54b7ab605d928aebe57e21636cdd2a9c7757e552652c68d9fcb5d40b06fcb66e02d9ee7526e118a5c languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-compilation-targets@npm:7.25.2" +"@babel/helper-compilation-targets@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-compilation-targets@npm:7.25.9" dependencies: - "@babel/compat-data": "npm:^7.25.2" - "@babel/helper-validator-option": "npm:^7.24.8" - browserslist: "npm:^4.23.1" + "@babel/compat-data": "npm:^7.25.9" + "@babel/helper-validator-option": "npm:^7.25.9" + browserslist: "npm:^4.24.0" lru-cache: "npm:^5.1.1" semver: "npm:^6.3.1" - checksum: de10e986b5322c9f807350467dc845ec59df9e596a5926a3b5edbb4710d8e3b8009d4396690e70b88c3844fe8ec4042d61436dd4b92d1f5f75655cf43ab07e99 + checksum: a6b26a1e4222e69ef8e62ee19374308f060b007828bc11c65025ecc9e814aba21ff2175d6d3f8bf53c863edd728ee8f94ba7870f8f90a37d39552ad9933a8aaa languageName: node linkType: hard -"@babel/helper-module-imports@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-module-imports@npm:7.24.7" +"@babel/helper-module-imports@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-module-imports@npm:7.25.9" dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 97c57db6c3eeaea31564286e328a9fb52b0313c5cfcc7eee4bc226aebcf0418ea5b6fe78673c0e4a774512ec6c86e309d0f326e99d2b37bfc16a25a032498af0 + "@babel/traverse": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: 078d3c2b45d1f97ffe6bb47f61961be4785d2342a4156d8b42c92ee4e1b7b9e365655dd6cb25329e8fe1a675c91eeac7e3d04f0c518b67e417e29d6e27b6aa70 languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.25.2": - version: 7.25.2 - resolution: "@babel/helper-module-transforms@npm:7.25.2" +"@babel/helper-module-transforms@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helper-module-transforms@npm:7.26.0" dependencies: - "@babel/helper-module-imports": "npm:^7.24.7" - "@babel/helper-simple-access": "npm:^7.24.7" - "@babel/helper-validator-identifier": "npm:^7.24.7" - "@babel/traverse": "npm:^7.25.2" + "@babel/helper-module-imports": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@babel/traverse": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0 - checksum: adaa15970ace0aee5934b5a633789b5795b6229c6a9cf3e09a7e80aa33e478675eee807006a862aa9aa517935d81f88a6db8a9f5936e3a2a40ec75f8062bc329 - languageName: node - linkType: hard - -"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.24.8, @babel/helper-plugin-utils@npm:^7.8.0": - version: 7.24.8 - resolution: "@babel/helper-plugin-utils@npm:7.24.8" - checksum: 0376037f94a3bfe6b820a39f81220ac04f243eaee7193774b983e956c1750883ff236b30785795abbcda43fac3ece74750566830c2daa4d6e3870bb0dff34c2d - languageName: node - linkType: hard - -"@babel/helper-simple-access@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-simple-access@npm:7.24.7" - dependencies: - "@babel/traverse": "npm:^7.24.7" - "@babel/types": "npm:^7.24.7" - checksum: 7230e419d59a85f93153415100a5faff23c133d7442c19e0cd070da1784d13cd29096ee6c5a5761065c44e8164f9f80e3a518c41a0256df39e38f7ad6744fed7 + checksum: ee111b68a5933481d76633dad9cdab30c41df4479f0e5e1cc4756dc9447c1afd2c9473b5ba006362e35b17f4ebddd5fca090233bef8dfc84dca9d9127e56ec3a languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-string-parser@npm:7.24.8" - checksum: 6361f72076c17fabf305e252bf6d580106429014b3ab3c1f5c4eb3e6d465536ea6b670cc0e9a637a77a9ad40454d3e41361a2909e70e305116a23d68ce094c08 +"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.25.9, @babel/helper-plugin-utils@npm:^7.8.0": + version: 7.25.9 + resolution: "@babel/helper-plugin-utils@npm:7.25.9" + checksum: 483066a1ba36ff16c0116cd24f93de05de746a603a777cd695ac7a1b034928a65a4ecb35f255761ca56626435d7abdb73219eba196f9aa83b6c3c3169325599d languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-validator-identifier@npm:7.24.7" - checksum: 87ad608694c9477814093ed5b5c080c2e06d44cb1924ae8320474a74415241223cc2a725eea2640dd783ff1e3390e5f95eede978bc540e870053152e58f1d651 +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 7244b45d8e65f6b4338a6a68a8556f2cb161b782343e97281a5f2b9b93e420cad0d9f5773a59d79f61d0c448913d06f6a2358a87f2e203cf112e3c5b53522ee6 languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.24.8": - version: 7.24.8 - resolution: "@babel/helper-validator-option@npm:7.24.8" - checksum: 73db93a34ae89201351288bee7623eed81a54000779462a986105b54ffe82069e764afd15171a428b82e7c7a9b5fec10b5d5603b216317a414062edf5c67a21f +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 4fc6f830177b7b7e887ad3277ddb3b91d81e6c4a24151540d9d1023e8dc6b1c0505f0f0628ae653601eb4388a8db45c1c14b2c07a9173837aef7e4116456259d languageName: node linkType: hard -"@babel/helpers@npm:^7.25.0": - version: 7.25.6 - resolution: "@babel/helpers@npm:7.25.6" - dependencies: - "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.6" - checksum: 448c1cdabccca42fd97a252f73f1e4bcd93776dbf24044f3b4f49b756bf2ece73ee6df05177473bb74ea7456dddd18d6f481e4d96d2cc7839d078900d48c696c +"@babel/helper-validator-option@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-option@npm:7.25.9" + checksum: 27fb195d14c7dcb07f14e58fe77c44eea19a6a40a74472ec05c441478fa0bb49fa1c32b2d64be7a38870ee48ef6601bdebe98d512f0253aea0b39756c4014f3e languageName: node linkType: hard -"@babel/highlight@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/highlight@npm:7.24.7" +"@babel/helpers@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/helpers@npm:7.26.0" dependencies: - "@babel/helper-validator-identifier": "npm:^7.24.7" - chalk: "npm:^2.4.2" - js-tokens: "npm:^4.0.0" - picocolors: "npm:^1.0.0" - checksum: 674334c571d2bb9d1c89bdd87566383f59231e16bcdcf5bb7835babdf03c9ae585ca0887a7b25bdf78f303984af028df52831c7989fecebb5101cc132da9393a + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.26.0" + checksum: 343333cced6946fe46617690a1d0789346960910225ce359021a88a60a65bc0d791f0c5d240c0ed46cf8cc63b5fd7df52734ff14e43b9c32feae2b61b1647097 languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.6": - version: 7.25.6 - resolution: "@babel/parser@npm:7.25.6" +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.20.7, @babel/parser@npm:^7.23.9, @babel/parser@npm:^7.25.9, @babel/parser@npm:^7.26.0, @babel/parser@npm:^7.26.2": + version: 7.26.2 + resolution: "@babel/parser@npm:7.26.2" dependencies: - "@babel/types": "npm:^7.25.6" + "@babel/types": "npm:^7.26.0" bin: parser: ./bin/babel-parser.js - checksum: f88a0e895dbb096fd37c4527ea97d12b5fc013720602580a941ac3a339698872f0c911e318c292b184c36b5fbe23b612f05aff9d24071bc847c7b1c21552c41d + checksum: 751a743087b3a9172a7599f1421830d44c38f065ef781588d2bfb1c98f9b461719a226feb13c868d7a284783eee120c88ea522593118f2668f46ebfb1105c4d7 languageName: node linkType: hard @@ -330,13 +345,13 @@ __metadata: linkType: hard "@babel/plugin-syntax-import-attributes@npm:^7.24.7": - version: 7.25.6 - resolution: "@babel/plugin-syntax-import-attributes@npm:7.25.6" + version: 7.26.0 + resolution: "@babel/plugin-syntax-import-attributes@npm:7.26.0" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 0e9359cf2d117476310961dfcfd7204ed692e933707da10d6194153d3996cd2ea5b7635fc90d720dce3612083af89966bb862561064a509c350320dc98644751 + checksum: e594c185b12bfe0bbe7ca78dfeebe870e6d569a12128cac86f3164a075fe0ff70e25ddbd97fd0782906b91f65560c9dc6957716b7b4a68aba2516c9b7455e352 languageName: node linkType: hard @@ -363,13 +378,13 @@ __metadata: linkType: hard "@babel/plugin-syntax-jsx@npm:^7.7.2": - version: 7.24.7 - resolution: "@babel/plugin-syntax-jsx@npm:7.24.7" + version: 7.25.9 + resolution: "@babel/plugin-syntax-jsx@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.7" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: f44d927a9ae8d5ef016ff5b450e1671e56629ddc12e56b938e41fd46e141170d9dfc9a53d6cb2b9a20a7dd266a938885e6a3981c60c052a2e1daed602ac80e51 + checksum: d56597aff4df39d3decda50193b6dfbe596ca53f437ff2934622ce19a743bf7f43492d3fb3308b0289f5cee2b825d99ceb56526a2b9e7b68bf04901546c5618c languageName: node linkType: hard @@ -462,50 +477,49 @@ __metadata: linkType: hard "@babel/plugin-syntax-typescript@npm:^7.7.2": - version: 7.25.4 - resolution: "@babel/plugin-syntax-typescript@npm:7.25.4" + version: 7.25.9 + resolution: "@babel/plugin-syntax-typescript@npm:7.25.9" dependencies: - "@babel/helper-plugin-utils": "npm:^7.24.8" + "@babel/helper-plugin-utils": "npm:^7.25.9" peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 199919d44c73e5edee9ffd311cf638f88d26a810189e32d338c46c7600441fd5c4a2e431f9be377707cbf318410895304e90b83bf8d9011d205150fa7f260e63 + checksum: 5192ebe11bd46aea68b7a60fd9555465c59af7e279e71126788e59121b86e00b505816685ab4782abe159232b0f73854e804b54449820b0d950b397ee158caa2 languageName: node linkType: hard -"@babel/template@npm:^7.25.0, @babel/template@npm:^7.3.3": - version: 7.25.0 - resolution: "@babel/template@npm:7.25.0" +"@babel/template@npm:^7.25.9, @babel/template@npm:^7.3.3": + version: 7.25.9 + resolution: "@babel/template@npm:7.25.9" dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/parser": "npm:^7.25.0" - "@babel/types": "npm:^7.25.0" - checksum: 4e31afd873215744c016e02b04f43b9fa23205d6d0766fb2e93eb4091c60c1b88897936adb895fb04e3c23de98dfdcbe31bc98daaa1a4e0133f78bb948e1209b + "@babel/code-frame": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" + checksum: ebe677273f96a36c92cc15b7aa7b11cc8bc8a3bb7a01d55b2125baca8f19cae94ff3ce15f1b1880fb8437f3a690d9f89d4e91f16fc1dc4d3eb66226d128983ab languageName: node linkType: hard -"@babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.25.2": - version: 7.25.6 - resolution: "@babel/traverse@npm:7.25.6" +"@babel/traverse@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/traverse@npm:7.25.9" dependencies: - "@babel/code-frame": "npm:^7.24.7" - "@babel/generator": "npm:^7.25.6" - "@babel/parser": "npm:^7.25.6" - "@babel/template": "npm:^7.25.0" - "@babel/types": "npm:^7.25.6" + "@babel/code-frame": "npm:^7.25.9" + "@babel/generator": "npm:^7.25.9" + "@babel/parser": "npm:^7.25.9" + "@babel/template": "npm:^7.25.9" + "@babel/types": "npm:^7.25.9" debug: "npm:^4.3.1" globals: "npm:^11.1.0" - checksum: 964304c6fa46bd705428ba380bf73177eeb481c3f26d82ea3d0661242b59e0dd4329d23886035e9ca9a4ceb565c03a76fd615109830687a27bcd350059d6377e + checksum: e90be586a714da4adb80e6cb6a3c5cfcaa9b28148abdafb065e34cc109676fc3db22cf98cd2b2fff66ffb9b50c0ef882cab0f466b6844be0f6c637b82719bba1 languageName: node linkType: hard -"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.24.7, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.2, @babel/types@npm:^7.25.6, @babel/types@npm:^7.3.3": - version: 7.25.6 - resolution: "@babel/types@npm:7.25.6" +"@babel/types@npm:^7.0.0, @babel/types@npm:^7.20.7, @babel/types@npm:^7.25.9, @babel/types@npm:^7.26.0, @babel/types@npm:^7.3.3": + version: 7.26.0 + resolution: "@babel/types@npm:7.26.0" dependencies: - "@babel/helper-string-parser": "npm:^7.24.8" - "@babel/helper-validator-identifier": "npm:^7.24.7" - to-fast-properties: "npm:^2.0.0" - checksum: 89d45fbee24e27a05dca2d08300a26b905bd384a480448823f6723c72d3a30327c517476389b7280ce8cb9a2c48ef8f47da7f9f6d326faf6f53fd6b68237bdc4 + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: b694f41ad1597127e16024d766c33a641508aad037abd08d0d1f73af753e1119fa03b4a107d04b5f92cc19c095a594660547ae9bead1db2299212d644b0a5cb8 languageName: node linkType: hard @@ -694,20 +708,38 @@ __metadata: linkType: hard "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" + version: 4.4.1 + resolution: "@eslint-community/eslint-utils@npm:4.4.1" dependencies: - eslint-visitor-keys: "npm:^3.3.0" + eslint-visitor-keys: "npm:^3.4.3" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 7e559c4ce59cd3a06b1b5a517b593912e680a7f981ae7affab0d01d709e99cd5647019be8fafa38c350305bc32f1f7d42c7073edde2ab536c745e365f37b607e + checksum: 2aa0ac2fc50ff3f234408b10900ed4f1a0b19352f21346ad4cc3d83a1271481bdda11097baa45d484dd564c895e0762a27a8240be7a256b3ad47129e96528252 + languageName: node + linkType: hard + +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.12.1, @eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 + languageName: node + linkType: hard + +"@eslint/config-array@npm:^0.19.0": + version: 0.19.0 + resolution: "@eslint/config-array@npm:0.19.0" + dependencies: + "@eslint/object-schema": "npm:^2.1.4" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: def23c6c67a8f98dc88f1b87e17a5668e5028f5ab9459661aabfe08e08f2acd557474bbaf9ba227be0921ae4db232c62773dbb7739815f8415678eb8f592dbf5 languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.5.1, @eslint-community/regexpp@npm:^4.6.1": - version: 4.11.0 - resolution: "@eslint-community/regexpp@npm:4.11.0" - checksum: 0f6328869b2741e2794da4ad80beac55cba7de2d3b44f796a60955b0586212ec75e6b0253291fd4aad2100ad471d1480d8895f2b54f1605439ba4c875e05e523 +"@eslint/core@npm:^0.9.0": + version: 0.9.0 + resolution: "@eslint/core@npm:0.9.0" + checksum: 6d8e8e0991cef12314c49425d8d2d9394f5fb1a36753ff82df7c03185a4646cb7c8736cf26638a4a714782cedf4b23cfc17667d282d3e5965b3920a0e7ce20d4 languageName: node linkType: hard @@ -728,21 +760,78 @@ __metadata: languageName: node linkType: hard -"@eslint/js@npm:8.57.0": - version: 8.57.0 - resolution: "@eslint/js@npm:8.57.0" - checksum: 9a518bb8625ba3350613903a6d8c622352ab0c6557a59fe6ff6178bf882bf57123f9d92aa826ee8ac3ee74b9c6203fe630e9ee00efb03d753962dcf65ee4bd94 +"@eslint/eslintrc@npm:^3.2.0": + version: 3.2.0 + resolution: "@eslint/eslintrc@npm:3.2.0" + dependencies: + ajv: "npm:^6.12.4" + debug: "npm:^4.3.2" + espree: "npm:^10.0.1" + globals: "npm:^14.0.0" + ignore: "npm:^5.2.0" + import-fresh: "npm:^3.2.1" + js-yaml: "npm:^4.1.0" + minimatch: "npm:^3.1.2" + strip-json-comments: "npm:^3.1.1" + checksum: 43867a07ff9884d895d9855edba41acf325ef7664a8df41d957135a81a477ff4df4196f5f74dc3382627e5cc8b7ad6b815c2cea1b58f04a75aced7c43414ab8b + languageName: node + linkType: hard + +"@eslint/js@npm:8.57.1": + version: 8.57.1 + resolution: "@eslint/js@npm:8.57.1" + checksum: b489c474a3b5b54381c62e82b3f7f65f4b8a5eaaed126546520bf2fede5532a8ed53212919fed1e9048dcf7f37167c8561d58d0ba4492a4244004e7793805223 + languageName: node + linkType: hard + +"@eslint/js@npm:9.15.0, @eslint/js@npm:^9.13.0": + version: 9.15.0 + resolution: "@eslint/js@npm:9.15.0" + checksum: 56552966ab1aa95332f70d0e006db5746b511c5f8b5e0c6a9b2d6764ff6d964e0b2622731877cbc4e3f0e74c5b39191290d5f48147be19175292575130d499ab + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/object-schema@npm:2.1.4" + checksum: e9885532ea70e483fb007bf1275968b05bb15ebaa506d98560c41a41220d33d342e19023d5f2939fed6eb59676c1bda5c847c284b4b55fce521d282004da4dda + languageName: node + linkType: hard + +"@eslint/plugin-kit@npm:^0.2.3": + version: 0.2.3 + resolution: "@eslint/plugin-kit@npm:0.2.3" + dependencies: + levn: "npm:^0.4.1" + checksum: 89a8035976bb1780e3fa8ffe682df013bd25f7d102d991cecd3b7c297f4ce8c1a1b6805e76dd16465b5353455b670b545eff2b4ec3133e0eab81a5f9e99bd90f + languageName: node + linkType: hard + +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: aa4e0152171c07879b458d0e8a704b8c3a89a8c0541726c6b65b81e84fd8b7564b5d6c633feadc6598307d34564bd53294b533491424e8e313d7ab6c7bc5dc67 + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.6": + version: 0.16.6 + resolution: "@humanfs/node@npm:0.16.6" + dependencies: + "@humanfs/core": "npm:^0.19.1" + "@humanwhocodes/retry": "npm:^0.3.0" + checksum: 8356359c9f60108ec204cbd249ecd0356667359b2524886b357617c4a7c3b6aace0fd5a369f63747b926a762a88f8a25bc066fa1778508d110195ce7686243e1 languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.11.14": - version: 0.11.14 - resolution: "@humanwhocodes/config-array@npm:0.11.14" +"@humanwhocodes/config-array@npm:^0.13.0": + version: 0.13.0 + resolution: "@humanwhocodes/config-array@npm:0.13.0" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.2" + "@humanwhocodes/object-schema": "npm:^2.0.3" debug: "npm:^4.3.1" minimatch: "npm:^3.0.5" - checksum: 66f725b4ee5fdd8322c737cb5013e19fac72d4d69c8bf4b7feb192fcb83442b035b92186f8e9497c220e58b2d51a080f28a73f7899bc1ab288c3be172c467541 + checksum: 205c99e756b759f92e1f44a3dc6292b37db199beacba8f26c2165d4051fe73a4ae52fdcfd08ffa93e7e5cb63da7c88648f0e84e197d154bbbbe137b2e0dd332e languageName: node linkType: hard @@ -753,13 +842,27 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.2": +"@humanwhocodes/object-schema@npm:^2.0.3": version: 2.0.3 resolution: "@humanwhocodes/object-schema@npm:2.0.3" checksum: 80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c languageName: node linkType: hard +"@humanwhocodes/retry@npm:^0.3.0": + version: 0.3.1 + resolution: "@humanwhocodes/retry@npm:0.3.1" + checksum: f0da1282dfb45e8120480b9e2e275e2ac9bbe1cf016d046fdad8e27cc1285c45bb9e711681237944445157b430093412b4446c1ab3fc4bb037861b5904101d3b + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.4.1": + version: 0.4.1 + resolution: "@humanwhocodes/retry@npm:0.4.1" + checksum: be7bb6841c4c01d0b767d9bb1ec1c9359ee61421ce8ba66c249d035c5acdfd080f32d55a5c9e859cdd7868788b8935774f65b2caf24ec0b7bd7bf333791f063b + languageName: node + linkType: hard + "@iarna/toml@npm:^2.2.5": version: 2.2.5 resolution: "@iarna/toml@npm:2.2.5" @@ -778,30 +881,29 @@ __metadata: linkType: hard "@inquirer/core@npm:^9.1.0": - version: 9.1.0 - resolution: "@inquirer/core@npm:9.1.0" + version: 9.2.1 + resolution: "@inquirer/core@npm:9.2.1" dependencies: - "@inquirer/figures": "npm:^1.0.5" - "@inquirer/type": "npm:^1.5.3" + "@inquirer/figures": "npm:^1.0.6" + "@inquirer/type": "npm:^2.0.0" "@types/mute-stream": "npm:^0.0.4" - "@types/node": "npm:^22.5.2" + "@types/node": "npm:^22.5.5" "@types/wrap-ansi": "npm:^3.0.0" ansi-escapes: "npm:^4.3.2" - cli-spinners: "npm:^2.9.2" cli-width: "npm:^4.1.0" mute-stream: "npm:^1.0.0" signal-exit: "npm:^4.1.0" strip-ansi: "npm:^6.0.1" wrap-ansi: "npm:^6.2.0" yoctocolors-cjs: "npm:^2.1.2" - checksum: c86cbd1980788dee4151002ed717b5664a79eec1d925e1b38896bbad079647af5c423eaaa39a2291ba4fdf78a33c541ea3f69cbbf030f03815eb523fa05230f8 + checksum: 11c14be77a9fa85831de799a585721b0a49ab2f3b7d8fd1780c48ea2b29229c6bdc94e7892419086d0f7734136c2ba87b6a32e0782571eae5bbd655b1afad453 languageName: node linkType: hard -"@inquirer/figures@npm:^1.0.5": - version: 1.0.5 - resolution: "@inquirer/figures@npm:1.0.5" - checksum: ec9ba23db42cb33fa18eb919abf2a18e750e739e64c1883ce4a98345cd5711c60cac12d1faf56a859f52d387deb221c8d3dfe60344ee07955a9a262f8b821fe3 +"@inquirer/figures@npm:^1.0.5, @inquirer/figures@npm:^1.0.6": + version: 1.0.8 + resolution: "@inquirer/figures@npm:1.0.8" + checksum: 34d287ff1fd16476c58bbd5b169db315f8319b5ffb09f81a1bb9aabd4165114e7406b1f418d021fd9cd48923008446e3eec274bb818f378ea132a0450bbc91d4 languageName: node linkType: hard @@ -829,11 +931,20 @@ __metadata: linkType: hard "@inquirer/type@npm:^1.5.3": - version: 1.5.3 - resolution: "@inquirer/type@npm:1.5.3" + version: 1.5.5 + resolution: "@inquirer/type@npm:1.5.5" + dependencies: + mute-stream: "npm:^1.0.0" + checksum: 4c41736c09ba9426b5a9e44993bdd54e8f532e791518802e33866f233a2a6126a25c1c82c19d1abbf1df627e57b1b957dd3f8318ea96073d8bfc32193943bcb3 + languageName: node + linkType: hard + +"@inquirer/type@npm:^2.0.0": + version: 2.0.0 + resolution: "@inquirer/type@npm:2.0.0" dependencies: mute-stream: "npm:^1.0.0" - checksum: da92a7410efcb20cf12422558fb8e00136e2ff1746ae1d17ea05511e77139bf2044527d37a70e77f188f158099f7751ed808ca3f82769cbe99c1052509481e95 + checksum: 8c663d52beb2b89a896d3c3d5cc3d6d024fa149e565555bcb42fa640cbe23fba7ff2c51445342cef1fe6e46305e2d16c1590fa1d11ad0ddf93a67b655ef41f0a languageName: node linkType: hard @@ -1163,6 +1274,38 @@ __metadata: languageName: node linkType: hard +"@jsonjoy.com/base64@npm:^1.1.1": + version: 1.1.2 + resolution: "@jsonjoy.com/base64@npm:1.1.2" + peerDependencies: + tslib: 2 + checksum: 88717945f66dc89bf58ce75624c99fe6a5c9a0c8614e26d03e406447b28abff80c69fb37dabe5aafef1862cf315071ae66e5c85f6018b437d95f8d13d235e6eb + languageName: node + linkType: hard + +"@jsonjoy.com/json-pack@npm:^1.0.3": + version: 1.1.0 + resolution: "@jsonjoy.com/json-pack@npm:1.1.0" + dependencies: + "@jsonjoy.com/base64": "npm:^1.1.1" + "@jsonjoy.com/util": "npm:^1.1.2" + hyperdyperid: "npm:^1.2.0" + thingies: "npm:^1.20.0" + peerDependencies: + tslib: 2 + checksum: cdf5cb567a7f2e703d4966a3e3a5f7f7b54ee40a2102aa0ede5c79bcf2060c8465d82f39de8583db4cf1d8415bec8e57dfb1156ef663567b846cdea45813d9d1 + languageName: node + linkType: hard + +"@jsonjoy.com/util@npm:^1.1.2, @jsonjoy.com/util@npm:^1.3.0": + version: 1.5.0 + resolution: "@jsonjoy.com/util@npm:1.5.0" + peerDependencies: + tslib: 2 + checksum: 0065ae12c4108d8aede01a479c8d2b5a39bce99e9a449d235befc753f57e8385d9c1115720529f26597840b7398d512898155423d9859fd638319fb0c827365d + languageName: node + linkType: hard + "@leichtgewicht/ip-codec@npm:^2.0.1": version: 2.0.5 resolution: "@leichtgewicht/ip-codec@npm:2.0.5" @@ -1170,6 +1313,90 @@ __metadata: languageName: node linkType: hard +"@lmdb/lmdb-darwin-arm64@npm:3.1.6": + version: 3.1.6 + resolution: "@lmdb/lmdb-darwin-arm64@npm:3.1.6" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@lmdb/lmdb-darwin-x64@npm:3.1.6": + version: 3.1.6 + resolution: "@lmdb/lmdb-darwin-x64@npm:3.1.6" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@lmdb/lmdb-linux-arm64@npm:3.1.6": + version: 3.1.6 + resolution: "@lmdb/lmdb-linux-arm64@npm:3.1.6" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@lmdb/lmdb-linux-arm@npm:3.1.6": + version: 3.1.6 + resolution: "@lmdb/lmdb-linux-arm@npm:3.1.6" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@lmdb/lmdb-linux-x64@npm:3.1.6": + version: 3.1.6 + resolution: "@lmdb/lmdb-linux-x64@npm:3.1.6" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@lmdb/lmdb-win32-x64@npm:3.1.6": + version: 3.1.6 + resolution: "@lmdb/lmdb-win32-x64@npm:3.1.6" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@msgpackr-extract/msgpackr-extract-darwin-arm64@npm:3.0.3": + version: 3.0.3 + resolution: "@msgpackr-extract/msgpackr-extract-darwin-arm64@npm:3.0.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@msgpackr-extract/msgpackr-extract-darwin-x64@npm:3.0.3": + version: 3.0.3 + resolution: "@msgpackr-extract/msgpackr-extract-darwin-x64@npm:3.0.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@msgpackr-extract/msgpackr-extract-linux-arm64@npm:3.0.3": + version: 3.0.3 + resolution: "@msgpackr-extract/msgpackr-extract-linux-arm64@npm:3.0.3" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + +"@msgpackr-extract/msgpackr-extract-linux-arm@npm:3.0.3": + version: 3.0.3 + resolution: "@msgpackr-extract/msgpackr-extract-linux-arm@npm:3.0.3" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@msgpackr-extract/msgpackr-extract-linux-x64@npm:3.0.3": + version: 3.0.3 + resolution: "@msgpackr-extract/msgpackr-extract-linux-x64@npm:3.0.3" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + +"@msgpackr-extract/msgpackr-extract-win32-x64@npm:3.0.3": + version: 3.0.3 + resolution: "@msgpackr-extract/msgpackr-extract-win32-x64@npm:3.0.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -1197,6 +1424,18 @@ __metadata: languageName: node linkType: hard +"@noir-lang/acvm_js@link:../../../noir/packages/acvm_js::locator=vite%40workspace%3Aboxes%2Fvite": + version: 0.0.0-use.local + resolution: "@noir-lang/acvm_js@link:../../../noir/packages/acvm_js::locator=vite%40workspace%3Aboxes%2Fvite" + languageName: node + linkType: soft + +"@noir-lang/noirc_abi@link:../../../noir/packages/noirc_abi::locator=vite%40workspace%3Aboxes%2Fvite": + version: 0.0.0-use.local + resolution: "@noir-lang/noirc_abi@link:../../../noir/packages/noirc_abi::locator=vite%40workspace%3Aboxes%2Fvite" + languageName: node + linkType: soft + "@nolyfill/is-core-module@npm:1.0.39": version: 1.0.39 resolution: "@nolyfill/is-core-module@npm:1.0.39" @@ -1251,114 +1490,172 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.21.2": - version: 4.21.2 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.21.2" +"@rollup/plugin-inject@npm:^5.0.5": + version: 5.0.5 + resolution: "@rollup/plugin-inject@npm:5.0.5" + dependencies: + "@rollup/pluginutils": "npm:^5.0.1" + estree-walker: "npm:^2.0.2" + magic-string: "npm:^0.30.3" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 22d10cf44fa56a6683d5ac4df24a9003379b3dcaae9897f5c30c844afc2ebca83cfaa5557f13a1399b1c8a0d312c3217bcacd508b7ebc4b2cbee401bd1ec8be2 + languageName: node + linkType: hard + +"@rollup/plugin-virtual@npm:^3.0.2": + version: 3.0.2 + resolution: "@rollup/plugin-virtual@npm:3.0.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 7115edb7989096d1ce334939fcf6e1ba365586b487bf61b2dd4f915386197f350db70904030342c0720fe58f5a52828975c645c4d415c1d432d9b1b6760a22ef + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^5.0.1": + version: 5.1.3 + resolution: "@rollup/pluginutils@npm:5.1.3" + dependencies: + "@types/estree": "npm:^1.0.0" + estree-walker: "npm:^2.0.2" + picomatch: "npm:^4.0.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: ba46ad588733fb01d184ee3bc7a127d626158bc840b5874a94c129ff62689d12f16f537530709c54da6f3b71f67d705c4e09235b1dc9542e9d47ee8f2d0b8b9e + languageName: node + linkType: hard + +"@rollup/rollup-android-arm-eabi@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.27.3" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.21.2": - version: 4.21.2 - resolution: "@rollup/rollup-android-arm64@npm:4.21.2" +"@rollup/rollup-android-arm64@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-android-arm64@npm:4.27.3" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.21.2": - version: 4.21.2 - resolution: "@rollup/rollup-darwin-arm64@npm:4.21.2" +"@rollup/rollup-darwin-arm64@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-darwin-arm64@npm:4.27.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.21.2": - version: 4.21.2 - resolution: "@rollup/rollup-darwin-x64@npm:4.21.2" +"@rollup/rollup-darwin-x64@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-darwin-x64@npm:4.27.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.21.2": - version: 4.21.2 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.21.2" +"@rollup/rollup-freebsd-arm64@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.27.3" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-freebsd-x64@npm:4.27.3" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.27.3" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.21.2": - version: 4.21.2 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.21.2" +"@rollup/rollup-linux-arm-musleabihf@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.27.3" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.21.2": - version: 4.21.2 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.21.2" +"@rollup/rollup-linux-arm64-gnu@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.27.3" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.21.2": - version: 4.21.2 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.21.2" +"@rollup/rollup-linux-arm64-musl@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.27.3" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.2": - version: 4.21.2 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.21.2" +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.27.3" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.21.2": - version: 4.21.2 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.21.2" +"@rollup/rollup-linux-riscv64-gnu@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.27.3" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.21.2": - version: 4.21.2 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.21.2" +"@rollup/rollup-linux-s390x-gnu@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.27.3" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.21.2": - version: 4.21.2 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.21.2" +"@rollup/rollup-linux-x64-gnu@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.27.3" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.21.2": - version: 4.21.2 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.21.2" +"@rollup/rollup-linux-x64-musl@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.27.3" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.21.2": - version: 4.21.2 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.21.2" +"@rollup/rollup-win32-arm64-msvc@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.27.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.21.2": - version: 4.21.2 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.21.2" +"@rollup/rollup-win32-ia32-msvc@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.27.3" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.21.2": - version: 4.21.2 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.21.2" +"@rollup/rollup-win32-x64-msvc@npm:4.27.3": + version: 4.27.3 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.27.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -1395,6 +1692,138 @@ __metadata: languageName: node linkType: hard +"@swc/core-darwin-arm64@npm:1.9.3": + version: 1.9.3 + resolution: "@swc/core-darwin-arm64@npm:1.9.3" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-darwin-x64@npm:1.9.3": + version: 1.9.3 + resolution: "@swc/core-darwin-x64@npm:1.9.3" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@swc/core-linux-arm-gnueabihf@npm:1.9.3": + version: 1.9.3 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.9.3" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@swc/core-linux-arm64-gnu@npm:1.9.3": + version: 1.9.3 + resolution: "@swc/core-linux-arm64-gnu@npm:1.9.3" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-arm64-musl@npm:1.9.3": + version: 1.9.3 + resolution: "@swc/core-linux-arm64-musl@npm:1.9.3" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@swc/core-linux-x64-gnu@npm:1.9.3": + version: 1.9.3 + resolution: "@swc/core-linux-x64-gnu@npm:1.9.3" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@swc/core-linux-x64-musl@npm:1.9.3": + version: 1.9.3 + resolution: "@swc/core-linux-x64-musl@npm:1.9.3" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@swc/core-win32-arm64-msvc@npm:1.9.3": + version: 1.9.3 + resolution: "@swc/core-win32-arm64-msvc@npm:1.9.3" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@swc/core-win32-ia32-msvc@npm:1.9.3": + version: 1.9.3 + resolution: "@swc/core-win32-ia32-msvc@npm:1.9.3" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@swc/core-win32-x64-msvc@npm:1.9.3": + version: 1.9.3 + resolution: "@swc/core-win32-x64-msvc@npm:1.9.3" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@swc/core@npm:^1.7.0, @swc/core@npm:^1.7.26": + version: 1.9.3 + resolution: "@swc/core@npm:1.9.3" + dependencies: + "@swc/core-darwin-arm64": "npm:1.9.3" + "@swc/core-darwin-x64": "npm:1.9.3" + "@swc/core-linux-arm-gnueabihf": "npm:1.9.3" + "@swc/core-linux-arm64-gnu": "npm:1.9.3" + "@swc/core-linux-arm64-musl": "npm:1.9.3" + "@swc/core-linux-x64-gnu": "npm:1.9.3" + "@swc/core-linux-x64-musl": "npm:1.9.3" + "@swc/core-win32-arm64-msvc": "npm:1.9.3" + "@swc/core-win32-ia32-msvc": "npm:1.9.3" + "@swc/core-win32-x64-msvc": "npm:1.9.3" + "@swc/counter": "npm:^0.1.3" + "@swc/types": "npm:^0.1.17" + peerDependencies: + "@swc/helpers": "*" + dependenciesMeta: + "@swc/core-darwin-arm64": + optional: true + "@swc/core-darwin-x64": + optional: true + "@swc/core-linux-arm-gnueabihf": + optional: true + "@swc/core-linux-arm64-gnu": + optional: true + "@swc/core-linux-arm64-musl": + optional: true + "@swc/core-linux-x64-gnu": + optional: true + "@swc/core-linux-x64-musl": + optional: true + "@swc/core-win32-arm64-msvc": + optional: true + "@swc/core-win32-ia32-msvc": + optional: true + "@swc/core-win32-x64-msvc": + optional: true + peerDependenciesMeta: + "@swc/helpers": + optional: true + checksum: a9507a5be580518d51cf7f41821a89e1044be6f72930efbdf3877366c27e9ff1dbca3e1a7f18698679f8c345b6698f43cd80d7dfa24ba30dcab493de9b7a336e + languageName: node + linkType: hard + +"@swc/counter@npm:^0.1.3": + version: 0.1.3 + resolution: "@swc/counter@npm:0.1.3" + checksum: 8424f60f6bf8694cfd2a9bca45845bce29f26105cda8cf19cdb9fd3e78dc6338699e4db77a89ae449260bafa1cc6bec307e81e7fb96dbf7dcfce0eea55151356 + languageName: node + linkType: hard + +"@swc/types@npm:^0.1.17": + version: 0.1.17 + resolution: "@swc/types@npm:0.1.17" + dependencies: + "@swc/counter": "npm:^0.1.3" + checksum: 29f5c8933a16042956f1adb7383e836ed7646cbf679826e78b53fdd0c08e8572cb42152e527b6b530a9bd1052d33d0972f90f589761ccd252c12652c9b7a72fc + languageName: node + linkType: hard + "@tsconfig/node10@npm:^1.0.7": version: 1.0.11 resolution: "@tsconfig/node10@npm:1.0.11" @@ -1502,26 +1931,70 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.5, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.5": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: b3b0e334288ddb407c7b3357ca67dbee75ee22db242ca7c56fe27db4e1a31989cb8af48a84dd401deb787fe10cc6b2ab1ee82dc4783be87ededbe3d53c79c70d +"@types/eslint-scope@npm:^3.7.7": + version: 3.7.7 + resolution: "@types/eslint-scope@npm:3.7.7" + dependencies: + "@types/eslint": "npm:*" + "@types/estree": "npm:*" + checksum: a0ecbdf2f03912679440550817ff77ef39a30fa8bfdacaf6372b88b1f931828aec392f52283240f0d648cf3055c5ddc564544a626bcf245f3d09fcb099ebe3cc languageName: node linkType: hard -"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^4.17.33": - version: 4.19.5 - resolution: "@types/express-serve-static-core@npm:4.19.5" +"@types/eslint@npm:*": + version: 9.6.1 + resolution: "@types/eslint@npm:9.6.1" + dependencies: + "@types/estree": "npm:*" + "@types/json-schema": "npm:*" + checksum: 69ba24fee600d1e4c5abe0df086c1a4d798abf13792d8cfab912d76817fe1a894359a1518557d21237fbaf6eda93c5ab9309143dee4c59ef54336d1b3570420e + languageName: node + linkType: hard + +"@types/estree@npm:*, @types/estree@npm:1.0.6, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: cdfd751f6f9065442cd40957c07fd80361c962869aa853c1c2fd03e101af8b9389d8ff4955a43a6fcfa223dd387a089937f95be0f3eec21ca527039fd2d9859a + languageName: node + linkType: hard + +"@types/express-serve-static-core@npm:*, @types/express-serve-static-core@npm:^5.0.0": + version: 5.0.1 + resolution: "@types/express-serve-static-core@npm:5.0.1" + dependencies: + "@types/node": "npm:*" + "@types/qs": "npm:*" + "@types/range-parser": "npm:*" + "@types/send": "npm:*" + checksum: 42919f9de55e9fd1524dc72c2f06a3f3e7fbd21f42ccc6e71ea2d530c8942cc0004d468f09e8557bf51c585d9673efd455b9668c2cd2416f5d61e70dc1bc49ac + languageName: node + linkType: hard + +"@types/express-serve-static-core@npm:^4.17.33": + version: 4.19.6 + resolution: "@types/express-serve-static-core@npm:4.19.6" dependencies: "@types/node": "npm:*" "@types/qs": "npm:*" "@types/range-parser": "npm:*" "@types/send": "npm:*" - checksum: ba8d8d976ab797b2602c60e728802ff0c98a00f13d420d82770f3661b67fa36ea9d3be0b94f2ddd632afe1fbc6e41620008b01db7e4fabdd71a2beb5539b0725 + checksum: 4281f4ead71723f376b3ddf64868ae26244d434d9906c101cf8d436d4b5c779d01bd046e4ea0ed1a394d3e402216fabfa22b1fa4dba501061cd7c81c54045983 languageName: node linkType: hard -"@types/express@npm:*, @types/express@npm:^4.17.13": +"@types/express@npm:*": + version: 5.0.0 + resolution: "@types/express@npm:5.0.0" + dependencies: + "@types/body-parser": "npm:*" + "@types/express-serve-static-core": "npm:^5.0.0" + "@types/qs": "npm:*" + "@types/serve-static": "npm:*" + checksum: 0d74b53aefa69c3b3817ee9b5145fd50d7dbac52a8986afc2d7500085c446656d0b6dc13158c04e2d9f18f4324d4d93b0452337c5ff73dd086dca3e4ff11f47b + languageName: node + linkType: hard + +"@types/express@npm:^4.17.13": version: 4.17.21 resolution: "@types/express@npm:4.17.21" dependencies: @@ -1601,16 +2074,16 @@ __metadata: linkType: hard "@types/jest@npm:^29.5.0": - version: 29.5.12 - resolution: "@types/jest@npm:29.5.12" + version: 29.5.14 + resolution: "@types/jest@npm:29.5.14" dependencies: expect: "npm:^29.0.0" pretty-format: "npm:^29.0.0" - checksum: 25fc8e4c611fa6c4421e631432e9f0a6865a8cb07c9815ec9ac90d630271cad773b2ee5fe08066f7b95bebd18bb967f8ce05d018ee9ab0430f9dfd1d84665b6f + checksum: 18e0712d818890db8a8dab3d91e9ea9f7f19e3f83c2e50b312f557017dc81466207a71f3ed79cf4428e813ba939954fa26ffa0a9a7f153181ba174581b1c2aed languageName: node linkType: hard -"@types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.12, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.8, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db @@ -1649,35 +2122,35 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:^22.5.2": - version: 22.5.2 - resolution: "@types/node@npm:22.5.2" +"@types/node@npm:*, @types/node@npm:^22.5.5": + version: 22.9.1 + resolution: "@types/node@npm:22.9.1" dependencies: - undici-types: "npm:~6.19.2" - checksum: 624a7fd76229eacc6c158eb3b9afd55b811d7f01976c5f92c630d5b9d47047cc218928c343988484a165ac400e5eb6fe70ea300fc7242deeb0e920c7724290f6 + undici-types: "npm:~6.19.8" + checksum: ea489ae603aa8874e4e88980aab6f2dad09c755da779c88dd142983bfe9609803c89415ca7781f723072934066f63daf2b3339ef084a8ad1a8079cf3958be243 languageName: node linkType: hard "@types/node@npm:^20.11.17, @types/node@npm:^20.5.9": - version: 20.16.3 - resolution: "@types/node@npm:20.16.3" + version: 20.17.6 + resolution: "@types/node@npm:20.17.6" dependencies: undici-types: "npm:~6.19.2" - checksum: 907c01d58ae36695fbed0b101e7a14cc2e0c5b9b2ba7904ef21cef093e4aac0649ac2a7a283fc94e19311dd0551d778445dd45fcf2d8bd45c494c9ecd802de69 + checksum: 5918c7ff8368bbe6d06d5e739c8ae41a9db41628f28760c60cda797be7d233406f07c4d0e6fdd960a0a342ec4173c2217eb6624e06bece21c1f1dd1b92805c15 languageName: node linkType: hard "@types/prop-types@npm:*": - version: 15.7.12 - resolution: "@types/prop-types@npm:15.7.12" - checksum: 1babcc7db6a1177779f8fde0ccc78d64d459906e6ef69a4ed4dd6339c920c2e05b074ee5a92120fe4e9d9f1a01c952f843ebd550bee2332fc2ef81d1706878f8 + version: 15.7.13 + resolution: "@types/prop-types@npm:15.7.13" + checksum: 1b20fc67281902c6743379960247bc161f3f0406ffc0df8e7058745a85ea1538612109db0406290512947f9632fe9e10e7337bf0ce6338a91d6c948df16a7c61 languageName: node linkType: hard "@types/qs@npm:*": - version: 6.9.15 - resolution: "@types/qs@npm:6.9.15" - checksum: 49c5ff75ca3adb18a1939310042d273c9fc55920861bd8e5100c8a923b3cda90d759e1a95e18334092da1c8f7b820084687770c83a1ccef04fb2c6908117c823 + version: 6.9.17 + resolution: "@types/qs@npm:6.9.17" + checksum: a183fa0b3464267f8f421e2d66d960815080e8aab12b9aadab60479ba84183b1cdba8f4eff3c06f76675a8e42fe6a3b1313ea76c74f2885c3e25d32499c17d1b languageName: node linkType: hard @@ -1688,22 +2161,22 @@ __metadata: languageName: node linkType: hard -"@types/react-dom@npm:^18.2.7": - version: 18.3.0 - resolution: "@types/react-dom@npm:18.3.0" +"@types/react-dom@npm:^18.2.7, @types/react-dom@npm:^18.3.1": + version: 18.3.1 + resolution: "@types/react-dom@npm:18.3.1" dependencies: "@types/react": "npm:*" - checksum: 6c90d2ed72c5a0e440d2c75d99287e4b5df3e7b011838cdc03ae5cd518ab52164d86990e73246b9d812eaf02ec351d74e3b4f5bd325bf341e13bf980392fd53b + checksum: 8b416551c60bb6bd8ec10e198c957910cfb271bc3922463040b0d57cf4739cdcd24b13224f8d68f10318926e1ec3cd69af0af79f0291b599a992f8c80d47f1eb languageName: node linkType: hard -"@types/react@npm:*, @types/react@npm:^18.2.15": - version: 18.3.5 - resolution: "@types/react@npm:18.3.5" +"@types/react@npm:*, @types/react@npm:^18.2.15, @types/react@npm:^18.3.12": + version: 18.3.12 + resolution: "@types/react@npm:18.3.12" dependencies: "@types/prop-types": "npm:*" csstype: "npm:^3.0.2" - checksum: 548b1d3d7c2f0242fbfdbbd658731b4ce69a134be072fa83e6ab516f2840402a3f20e3e7f72e95133b23d4880ef24a6d864050dc8e1f7c68f39fa87ca8445917 + checksum: 8bae8d9a41619804561574792e29112b413044eb0d53746dde2b9720c1f9a59f71c895bbd7987cd8ce9500b00786e53bc032dced38cddf42910458e145675290 languageName: node linkType: hard @@ -1775,11 +2248,11 @@ __metadata: linkType: hard "@types/ws@npm:^8.5.5": - version: 8.5.12 - resolution: "@types/ws@npm:8.5.12" + version: 8.5.13 + resolution: "@types/ws@npm:8.5.13" dependencies: "@types/node": "npm:*" - checksum: 3fd77c9e4e05c24ce42bfc7647f7506b08c40a40fe2aea236ef6d4e96fc7cb4006a81ed1b28ec9c457e177a74a72924f4768b7b4652680b42dfd52bc380e15f9 + checksum: a5430aa479bde588e69cb9175518d72f9338b6999e3b2ae16fc03d3bdcff8347e486dc031e4ed14601260463c07e1f9a0d7511dfc653712b047c439c680b0b34 languageName: node linkType: hard @@ -1799,6 +2272,29 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/eslint-plugin@npm:8.15.0": + version: 8.15.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.15.0" + dependencies: + "@eslint-community/regexpp": "npm:^4.10.0" + "@typescript-eslint/scope-manager": "npm:8.15.0" + "@typescript-eslint/type-utils": "npm:8.15.0" + "@typescript-eslint/utils": "npm:8.15.0" + "@typescript-eslint/visitor-keys": "npm:8.15.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.3.1" + natural-compare: "npm:^1.4.0" + ts-api-utils: "npm:^1.3.0" + peerDependencies: + "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 + eslint: ^8.57.0 || ^9.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 90ef10cc7d37a81abec4f4a3ffdfc3a0da8e99d949e03c75437e96e8ab2e896e34b85ab64718690180a7712581031b8611c5d8e7666d6ed4d60b9ace834d58e3 + languageName: node + linkType: hard + "@typescript-eslint/eslint-plugin@npm:^6.0.0": version: 6.21.0 resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" @@ -1824,6 +2320,24 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/parser@npm:8.15.0": + version: 8.15.0 + resolution: "@typescript-eslint/parser@npm:8.15.0" + dependencies: + "@typescript-eslint/scope-manager": "npm:8.15.0" + "@typescript-eslint/types": "npm:8.15.0" + "@typescript-eslint/typescript-estree": "npm:8.15.0" + "@typescript-eslint/visitor-keys": "npm:8.15.0" + debug: "npm:^4.3.4" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 19c25aea0dc51faa758701a5319a89950fd30494d9d645db8ced84fb60714c5e7d4b51fc4ee8ccb07ddefec88c51ee307ee7e49addd6330ee8f3e7ee9ba329fc + languageName: node + linkType: hard + "@typescript-eslint/parser@npm:^6.0.0": version: 6.21.0 resolution: "@typescript-eslint/parser@npm:6.21.0" @@ -1852,6 +2366,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/scope-manager@npm:8.15.0": + version: 8.15.0 + resolution: "@typescript-eslint/scope-manager@npm:8.15.0" + dependencies: + "@typescript-eslint/types": "npm:8.15.0" + "@typescript-eslint/visitor-keys": "npm:8.15.0" + checksum: c27dfdcea4100cc2d6fa967f857067cbc93155b55e648f9f10887a1b9372bb76cf864f7c804f3fa48d7868d9461cdef10bcea3dab7637d5337e8aa8042dc08b9 + languageName: node + linkType: hard + "@typescript-eslint/type-utils@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/type-utils@npm:6.21.0" @@ -1869,6 +2393,23 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/type-utils@npm:8.15.0": + version: 8.15.0 + resolution: "@typescript-eslint/type-utils@npm:8.15.0" + dependencies: + "@typescript-eslint/typescript-estree": "npm:8.15.0" + "@typescript-eslint/utils": "npm:8.15.0" + debug: "npm:^4.3.4" + ts-api-utils: "npm:^1.3.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 20f09c79c83b38a962cf7eff10d47a2c01bcc0bab7bf6d762594221cd89023ef8c7aec26751c47b524f53f5c8d38bba55a282529b3df82d5f5ab4350496316f9 + languageName: node + linkType: hard + "@typescript-eslint/types@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/types@npm:6.21.0" @@ -1876,6 +2417,13 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/types@npm:8.15.0": + version: 8.15.0 + resolution: "@typescript-eslint/types@npm:8.15.0" + checksum: 84abc6fd954aff13822a76ac49efdcb90a55c0025c20eee5d8cebcfb68faff33b79bbc711ea524e0209cecd90c5ee3a5f92babc7083c081d3a383a0710264a41 + languageName: node + linkType: hard + "@typescript-eslint/typescript-estree@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" @@ -1895,6 +2443,25 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/typescript-estree@npm:8.15.0": + version: 8.15.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.15.0" + dependencies: + "@typescript-eslint/types": "npm:8.15.0" + "@typescript-eslint/visitor-keys": "npm:8.15.0" + debug: "npm:^4.3.4" + fast-glob: "npm:^3.3.2" + is-glob: "npm:^4.0.3" + minimatch: "npm:^9.0.4" + semver: "npm:^7.6.0" + ts-api-utils: "npm:^1.3.0" + peerDependenciesMeta: + typescript: + optional: true + checksum: 3af5c129532db3575349571bbf64d32aeccc4f4df924ac447f5d8f6af8b387148df51965eb2c9b99991951d3dadef4f2509d7ce69bf34a2885d013c040762412 + languageName: node + linkType: hard + "@typescript-eslint/utils@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/utils@npm:6.21.0" @@ -1912,6 +2479,23 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/utils@npm:8.15.0": + version: 8.15.0 + resolution: "@typescript-eslint/utils@npm:8.15.0" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.4.0" + "@typescript-eslint/scope-manager": "npm:8.15.0" + "@typescript-eslint/types": "npm:8.15.0" + "@typescript-eslint/typescript-estree": "npm:8.15.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 65743f51845a1f6fd2d21f66ca56182ba33e966716bdca73d30b7a67c294e47889c322de7d7b90ab0818296cd33c628e5eeeb03cec7ef2f76c47de7a453eeda2 + languageName: node + linkType: hard + "@typescript-eslint/visitor-keys@npm:6.21.0": version: 6.21.0 resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" @@ -1922,6 +2506,16 @@ __metadata: languageName: node linkType: hard +"@typescript-eslint/visitor-keys@npm:8.15.0": + version: 8.15.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.15.0" + dependencies: + "@typescript-eslint/types": "npm:8.15.0" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 02a954c3752c4328482a884eb1da06ca8fb72ae78ef28f1d854b18f3779406ed47263af22321cf3f65a637ec7584e5f483e34a263b5c8cec60ec85aebc263574 + languageName: node + linkType: hard + "@ungap/structured-clone@npm:^1.2.0": version: 1.2.0 resolution: "@ungap/structured-clone@npm:1.2.0" @@ -1929,217 +2523,246 @@ __metadata: languageName: node linkType: hard -"@vitest/expect@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/expect@npm:2.0.5" +"@vitejs/plugin-react-swc@npm:^3.5.0": + version: 3.7.1 + resolution: "@vitejs/plugin-react-swc@npm:3.7.1" dependencies: - "@vitest/spy": "npm:2.0.5" - "@vitest/utils": "npm:2.0.5" - chai: "npm:^5.1.1" + "@swc/core": "npm:^1.7.26" + peerDependencies: + vite: ^4 || ^5 + checksum: 2d613e69c0d0b809c94df80ca2b0caf39c50f0b98aa1f8599fd086bc37dac1449898eb6572000e1c133313137cac93440c4cb0861e05820c78bd2c07a52e64a8 + languageName: node + linkType: hard + +"@vitest/expect@npm:2.1.5": + version: 2.1.5 + resolution: "@vitest/expect@npm:2.1.5" + dependencies: + "@vitest/spy": "npm:2.1.5" + "@vitest/utils": "npm:2.1.5" + chai: "npm:^5.1.2" tinyrainbow: "npm:^1.2.0" - checksum: 08cb1b0f106d16a5b60db733e3d436fa5eefc68571488eb570dfe4f599f214ab52e4342273b03dbe12331cc6c0cdc325ac6c94f651ad254cd62f3aa0e3d185aa + checksum: 68f7011e7883dea1d1974fa05d30d7a1eff72f08741312e84f1b138f474e75e9db7ff7ced23a50fc16605baa123a2f10ef9a834b418e03dbeed23d1e0043fc90 + languageName: node + linkType: hard + +"@vitest/mocker@npm:2.1.5": + version: 2.1.5 + resolution: "@vitest/mocker@npm:2.1.5" + dependencies: + "@vitest/spy": "npm:2.1.5" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.12" + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 57034aa3476768133042c6b4193d71dbd4ace98c39241ae2c1fa21c33d5afd6d469de86511cdc59a0d7dd5585c05ac605406c60b0ae3cfbf3f650326642d4aca languageName: node linkType: hard -"@vitest/pretty-format@npm:2.0.5, @vitest/pretty-format@npm:^2.0.5": - version: 2.0.5 - resolution: "@vitest/pretty-format@npm:2.0.5" +"@vitest/pretty-format@npm:2.1.5, @vitest/pretty-format@npm:^2.1.5": + version: 2.1.5 + resolution: "@vitest/pretty-format@npm:2.1.5" dependencies: tinyrainbow: "npm:^1.2.0" - checksum: 236c0798c5170a0b5ad5d4bd06118533738e820b4dd30079d8fbcb15baee949d41c60f42a9f769906c4a5ce366d7ef11279546070646c0efc03128c220c31f37 + checksum: d6667f1e5d272f557f8cca440af65645346b5aa74a04041466859087f14a78a296e3f1928caa05de0cc558880cc8a49ce14696fef7b8f5dbc3eb856d672b0abf languageName: node linkType: hard -"@vitest/runner@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/runner@npm:2.0.5" +"@vitest/runner@npm:2.1.5": + version: 2.1.5 + resolution: "@vitest/runner@npm:2.1.5" dependencies: - "@vitest/utils": "npm:2.0.5" + "@vitest/utils": "npm:2.1.5" pathe: "npm:^1.1.2" - checksum: d0ed3302a7e015bf44b7c0df9d8f7da163659e082d86f9406944b5a31a61ab9ddc1de530e06176d1f4ef0bde994b44bff4c7dab62aacdc235c8fc04b98e4a72a + checksum: d39ea4c6f8805aa3e52130ac0a3d325506a4d4bb97d0d7ac80734beb21d9a496ee50586de9801f4b66f2dc8ff38f27a75065a258fd3633bc1cfe68bd9c1dd73e languageName: node linkType: hard -"@vitest/snapshot@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/snapshot@npm:2.0.5" +"@vitest/snapshot@npm:2.1.5": + version: 2.1.5 + resolution: "@vitest/snapshot@npm:2.1.5" dependencies: - "@vitest/pretty-format": "npm:2.0.5" - magic-string: "npm:^0.30.10" + "@vitest/pretty-format": "npm:2.1.5" + magic-string: "npm:^0.30.12" pathe: "npm:^1.1.2" - checksum: 7bf38474248f5ae0aac6afad511785d2b7a023ac5158803c2868fd172b5b9c1a569fb1dd64a09a49e43fd342cab71ea485ada89b7f08d37b1622a5a0ac00271d + checksum: 3dc44b5a043acbbd15e08c3c0519ef5a344d06ade10ee9522b4e4305f4826f2be8353b58d0b6e11aa272078ba42ff0d2ffa62368b6e0cf996ad0d7977df9f22f languageName: node linkType: hard -"@vitest/spy@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/spy@npm:2.0.5" +"@vitest/spy@npm:2.1.5": + version: 2.1.5 + resolution: "@vitest/spy@npm:2.1.5" dependencies: - tinyspy: "npm:^3.0.0" - checksum: 70634c21921eb271b54d2986c21d7ab6896a31c0f4f1d266940c9bafb8ac36237846d6736638cbf18b958bd98e5261b158a6944352742accfde50b7818ff655e + tinyspy: "npm:^3.0.2" + checksum: c5222cc7074db5705573e5da674b8488f9e46d61a2bd64e992f5f5819feff35f015e8d0236c7e07d1870bddf5d36dc0622f674c071ab4ca8fa4f4f5d02172315 languageName: node linkType: hard -"@vitest/utils@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/utils@npm:2.0.5" +"@vitest/utils@npm:2.1.5": + version: 2.1.5 + resolution: "@vitest/utils@npm:2.1.5" dependencies: - "@vitest/pretty-format": "npm:2.0.5" - estree-walker: "npm:^3.0.3" - loupe: "npm:^3.1.1" + "@vitest/pretty-format": "npm:2.1.5" + loupe: "npm:^3.1.2" tinyrainbow: "npm:^1.2.0" - checksum: 0d1de748298f07a50281e1ba058b05dcd58da3280c14e6f016265e950bd79adab6b97822de8f0ea82d3070f585654801a9b1bcf26db4372e51cf7746bf86d73b + checksum: 3d1e65025e418948b215b8856548a91856522660d898b872485a91acf397e085e90968ee9c3f521589b5274717da32e954ef8a549aa60cc1c3338224fdfb4c5e languageName: node linkType: hard -"@webassemblyjs/ast@npm:1.12.1, @webassemblyjs/ast@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/ast@npm:1.12.1" +"@webassemblyjs/ast@npm:1.14.1, @webassemblyjs/ast@npm:^1.12.1": + version: 1.14.1 + resolution: "@webassemblyjs/ast@npm:1.14.1" dependencies: - "@webassemblyjs/helper-numbers": "npm:1.11.6" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - checksum: ba7f2b96c6e67e249df6156d02c69eb5f1bd18d5005303cdc42accb053bebbbde673826e54db0437c9748e97abd218366a1d13fa46859b23cde611b6b409998c + "@webassemblyjs/helper-numbers": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + checksum: 67a59be8ed50ddd33fbb2e09daa5193ac215bf7f40a9371be9a0d9797a114d0d1196316d2f3943efdb923a3d809175e1563a3cb80c814fb8edccd1e77494972b languageName: node linkType: hard -"@webassemblyjs/floating-point-hex-parser@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.11.6" - checksum: 37fe26f89e18e4ca0e7d89cfe3b9f17cfa327d7daf906ae01400416dbb2e33c8a125b4dc55ad7ff405e5fcfb6cf0d764074c9bc532b9a31a71e762be57d2ea0a +"@webassemblyjs/floating-point-hex-parser@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/floating-point-hex-parser@npm:1.13.2" + checksum: 0e88bdb8b50507d9938be64df0867f00396b55eba9df7d3546eb5dc0ca64d62e06f8d881ec4a6153f2127d0f4c11d102b6e7d17aec2f26bb5ff95a5e60652412 languageName: node linkType: hard -"@webassemblyjs/helper-api-error@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-api-error@npm:1.11.6" - checksum: a681ed51863e4ff18cf38d223429f414894e5f7496856854d9a886eeddcee32d7c9f66290f2919c9bb6d2fc2b2fae3f989b6a1e02a81e829359738ea0c4d371a +"@webassemblyjs/helper-api-error@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-api-error@npm:1.13.2" + checksum: 31be497f996ed30aae4c08cac3cce50c8dcd5b29660383c0155fce1753804fc55d47fcba74e10141c7dd2899033164e117b3bcfcda23a6b043e4ded4f1003dfb languageName: node linkType: hard -"@webassemblyjs/helper-buffer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-buffer@npm:1.12.1" - checksum: 0270724afb4601237410f7fd845ab58ccda1d5456a8783aadfb16eaaf3f2c9610c28e4a5bcb6ad880cde5183c82f7f116d5ccfc2310502439d33f14b6888b48a +"@webassemblyjs/helper-buffer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-buffer@npm:1.14.1" + checksum: 0d54105dc373c0fe6287f1091e41e3a02e36cdc05e8cf8533cdc16c59ff05a646355415893449d3768cda588af451c274f13263300a251dc11a575bc4c9bd210 languageName: node linkType: hard -"@webassemblyjs/helper-numbers@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-numbers@npm:1.11.6" +"@webassemblyjs/helper-numbers@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-numbers@npm:1.13.2" dependencies: - "@webassemblyjs/floating-point-hex-parser": "npm:1.11.6" - "@webassemblyjs/helper-api-error": "npm:1.11.6" + "@webassemblyjs/floating-point-hex-parser": "npm:1.13.2" + "@webassemblyjs/helper-api-error": "npm:1.13.2" "@xtuc/long": "npm:4.2.2" - checksum: c7d5afc0ff3bd748339b466d8d2f27b908208bf3ff26b2e8e72c39814479d486e0dca6f3d4d776fd9027c1efe05b5c0716c57a23041eb34473892b2731c33af3 + checksum: 9c46852f31b234a8fb5a5a9d3f027bc542392a0d4de32f1a9c0075d5e8684aa073cb5929b56df565500b3f9cc0a2ab983b650314295b9bf208d1a1651bfc825a languageName: node linkType: hard -"@webassemblyjs/helper-wasm-bytecode@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.11.6" - checksum: 79d2bebdd11383d142745efa32781249745213af8e022651847382685ca76709f83e1d97adc5f0d3c2b8546bf02864f8b43a531fdf5ca0748cb9e4e0ef2acaa5 +"@webassemblyjs/helper-wasm-bytecode@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/helper-wasm-bytecode@npm:1.13.2" + checksum: c4355d14f369b30cf3cbdd3acfafc7d0488e086be6d578e3c9780bd1b512932352246be96e034e2a7fcfba4f540ec813352f312bfcbbfe5bcfbf694f82ccc682 languageName: node linkType: hard -"@webassemblyjs/helper-wasm-section@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/helper-wasm-section@npm:1.12.1" +"@webassemblyjs/helper-wasm-section@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/helper-wasm-section@npm:1.14.1" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - checksum: 0546350724d285ae3c26e6fc444be4c3b5fb824f3be0ec8ceb474179dc3f4430336dd2e36a44b3e3a1a6815960e5eec98cd9b3a8ec66dc53d86daedd3296a6a2 + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + checksum: 1f9b33731c3c6dbac3a9c483269562fa00d1b6a4e7133217f40e83e975e636fd0f8736e53abd9a47b06b66082ecc976c7384391ab0a68e12d509ea4e4b948d64 languageName: node linkType: hard -"@webassemblyjs/ieee754@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/ieee754@npm:1.11.6" +"@webassemblyjs/ieee754@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/ieee754@npm:1.13.2" dependencies: "@xtuc/ieee754": "npm:^1.2.0" - checksum: 59de0365da450322c958deadade5ec2d300c70f75e17ae55de3c9ce564deff5b429e757d107c7ec69bd0ba169c6b6cc2ff66293ab7264a7053c829b50ffa732f + checksum: 2e732ca78c6fbae3c9b112f4915d85caecdab285c0b337954b180460290ccd0fb00d2b1dc4bb69df3504abead5191e0d28d0d17dfd6c9d2f30acac8c4961c8a7 languageName: node linkType: hard -"@webassemblyjs/leb128@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/leb128@npm:1.11.6" +"@webassemblyjs/leb128@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/leb128@npm:1.13.2" dependencies: "@xtuc/long": "npm:4.2.2" - checksum: cb344fc04f1968209804de4da018679c5d4708a03b472a33e0fa75657bb024978f570d3ccf9263b7f341f77ecaa75d0e051b9cd4b7bb17a339032cfd1c37f96e + checksum: dad5ef9e383c8ab523ce432dfd80098384bf01c45f70eb179d594f85ce5db2f80fa8c9cba03adafd85684e6d6310f0d3969a882538975989919329ac4c984659 languageName: node linkType: hard -"@webassemblyjs/utf8@npm:1.11.6": - version: 1.11.6 - resolution: "@webassemblyjs/utf8@npm:1.11.6" - checksum: 14d6c24751a89ad9d801180b0d770f30a853c39f035a15fbc96266d6ac46355227abd27a3fd2eeaa97b4294ced2440a6b012750ae17bafe1a7633029a87b6bee +"@webassemblyjs/utf8@npm:1.13.2": + version: 1.13.2 + resolution: "@webassemblyjs/utf8@npm:1.13.2" + checksum: d3fac9130b0e3e5a1a7f2886124a278e9323827c87a2b971e6d0da22a2ba1278ac9f66a4f2e363ecd9fac8da42e6941b22df061a119e5c0335f81006de9ee799 languageName: node linkType: hard "@webassemblyjs/wasm-edit@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-edit@npm:1.12.1" + version: 1.14.1 + resolution: "@webassemblyjs/wasm-edit@npm:1.14.1" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/helper-wasm-section": "npm:1.12.1" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - "@webassemblyjs/wasm-opt": "npm:1.12.1" - "@webassemblyjs/wasm-parser": "npm:1.12.1" - "@webassemblyjs/wast-printer": "npm:1.12.1" - checksum: 972f5e6c522890743999e0ed45260aae728098801c6128856b310dd21f1ee63435fc7b518e30e0ba1cdafd0d1e38275829c1e4451c3536a1d9e726e07a5bba0b + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/helper-wasm-section": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-opt": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + "@webassemblyjs/wast-printer": "npm:1.14.1" + checksum: 5ac4781086a2ca4b320bdbfd965a209655fe8a208ca38d89197148f8597e587c9a2c94fb6bd6f1a7dbd4527c49c6844fcdc2af981f8d793a97bf63a016aa86d2 languageName: node linkType: hard -"@webassemblyjs/wasm-gen@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-gen@npm:1.12.1" +"@webassemblyjs/wasm-gen@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-gen@npm:1.14.1" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/ieee754": "npm:1.11.6" - "@webassemblyjs/leb128": "npm:1.11.6" - "@webassemblyjs/utf8": "npm:1.11.6" - checksum: 1e257288177af9fa34c69cab94f4d9036ebed611f77f3897c988874e75182eeeec759c79b89a7a49dd24624fc2d3d48d5580b62b67c4a1c9bfbdcd266b281c16 + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: d678810d7f3f8fecb2e2bdadfb9afad2ec1d2bc79f59e4711ab49c81cec578371e22732d4966f59067abe5fba8e9c54923b57060a729d28d408e608beef67b10 languageName: node linkType: hard -"@webassemblyjs/wasm-opt@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-opt@npm:1.12.1" +"@webassemblyjs/wasm-opt@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-opt@npm:1.14.1" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-buffer": "npm:1.12.1" - "@webassemblyjs/wasm-gen": "npm:1.12.1" - "@webassemblyjs/wasm-parser": "npm:1.12.1" - checksum: 992a45e1f1871033c36987459436ab4e6430642ca49328e6e32a13de9106fe69ae6c0ac27d7050efd76851e502d11cd1ac0e06b55655dfa889ad82f11a2712fb + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-buffer": "npm:1.14.1" + "@webassemblyjs/wasm-gen": "npm:1.14.1" + "@webassemblyjs/wasm-parser": "npm:1.14.1" + checksum: 515bfb15277ee99ba6b11d2232ddbf22aed32aad6d0956fe8a0a0a004a1b5a3a277a71d9a3a38365d0538ac40d1b7b7243b1a244ad6cd6dece1c1bb2eb5de7ee languageName: node linkType: hard -"@webassemblyjs/wasm-parser@npm:1.12.1, @webassemblyjs/wasm-parser@npm:^1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wasm-parser@npm:1.12.1" +"@webassemblyjs/wasm-parser@npm:1.14.1, @webassemblyjs/wasm-parser@npm:^1.12.1": + version: 1.14.1 + resolution: "@webassemblyjs/wasm-parser@npm:1.14.1" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" - "@webassemblyjs/helper-api-error": "npm:1.11.6" - "@webassemblyjs/helper-wasm-bytecode": "npm:1.11.6" - "@webassemblyjs/ieee754": "npm:1.11.6" - "@webassemblyjs/leb128": "npm:1.11.6" - "@webassemblyjs/utf8": "npm:1.11.6" - checksum: e85cec1acad07e5eb65b92d37c8e6ca09c6ca50d7ca58803a1532b452c7321050a0328c49810c337cc2dfd100c5326a54d5ebd1aa5c339ebe6ef10c250323a0e + "@webassemblyjs/ast": "npm:1.14.1" + "@webassemblyjs/helper-api-error": "npm:1.13.2" + "@webassemblyjs/helper-wasm-bytecode": "npm:1.13.2" + "@webassemblyjs/ieee754": "npm:1.13.2" + "@webassemblyjs/leb128": "npm:1.13.2" + "@webassemblyjs/utf8": "npm:1.13.2" + checksum: 95427b9e5addbd0f647939bd28e3e06b8deefdbdadcf892385b5edc70091bf9b92fa5faac3fce8333554437c5d85835afef8c8a7d9d27ab6ba01ffab954db8c6 languageName: node linkType: hard -"@webassemblyjs/wast-printer@npm:1.12.1": - version: 1.12.1 - resolution: "@webassemblyjs/wast-printer@npm:1.12.1" +"@webassemblyjs/wast-printer@npm:1.14.1": + version: 1.14.1 + resolution: "@webassemblyjs/wast-printer@npm:1.14.1" dependencies: - "@webassemblyjs/ast": "npm:1.12.1" + "@webassemblyjs/ast": "npm:1.14.1" "@xtuc/long": "npm:4.2.2" - checksum: 39bf746eb7a79aa69953f194943bbc43bebae98bd7cadd4d8bc8c0df470ca6bf9d2b789effaa180e900fab4e2691983c1f7d41571458bd2a26267f2f0c73705a + checksum: 8d7768608996a052545251e896eac079c98e0401842af8dd4de78fba8d90bd505efb6c537e909cd6dae96e09db3fa2e765a6f26492553a675da56e2db51f9d24 languageName: node linkType: hard @@ -2223,15 +2846,6 @@ __metadata: languageName: node linkType: hard -"acorn-import-attributes@npm:^1.9.5": - version: 1.9.5 - resolution: "acorn-import-attributes@npm:1.9.5" - peerDependencies: - acorn: ^8 - checksum: 5926eaaead2326d5a86f322ff1b617b0f698aa61dc719a5baa0e9d955c9885cc71febac3fb5bacff71bbf2c4f9c12db2056883c68c53eb962c048b952e1e013d - languageName: node - linkType: hard - "acorn-jsx@npm:^5.3.2": version: 5.3.2 resolution: "acorn-jsx@npm:5.3.2" @@ -2242,20 +2856,20 @@ __metadata: linkType: hard "acorn-walk@npm:^8.1.1": - version: 8.3.3 - resolution: "acorn-walk@npm:8.3.3" + version: 8.3.4 + resolution: "acorn-walk@npm:8.3.4" dependencies: acorn: "npm:^8.11.0" - checksum: 4a9e24313e6a0a7b389e712ba69b66b455b4cb25988903506a8d247e7b126f02060b05a8a5b738a9284214e4ca95f383dd93443a4ba84f1af9b528305c7f243b + checksum: 76537ac5fb2c37a64560feaf3342023dadc086c46da57da363e64c6148dc21b57d49ace26f949e225063acb6fb441eabffd89f7a3066de5ad37ab3e328927c62 languageName: node linkType: hard -"acorn@npm:^8.11.0, acorn@npm:^8.4.1, acorn@npm:^8.7.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": - version: 8.12.1 - resolution: "acorn@npm:8.12.1" +"acorn@npm:^8.11.0, acorn@npm:^8.14.0, acorn@npm:^8.4.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" bin: acorn: bin/acorn - checksum: 51fb26cd678f914e13287e886da2d7021f8c2bc0ccc95e03d3e0447ee278dd3b40b9c57dc222acd5881adcf26f3edc40901a4953403232129e3876793cd17386 + checksum: 6d4ee461a7734b2f48836ee0fbb752903606e576cc100eb49340295129ca0b452f3ba91ddd4424a1d4406a98adfb2ebb6bd0ff4c49d7a0930c10e462719bbfd7 languageName: node linkType: hard @@ -2399,18 +3013,9 @@ __metadata: linkType: hard "ansi-regex@npm:^6.0.1": - version: 6.0.1 - resolution: "ansi-regex@npm:6.0.1" - checksum: cbe16dbd2c6b2735d1df7976a7070dd277326434f0212f43abf6d87674095d247968209babdaad31bb00882fa68807256ba9be340eec2f1004de14ca75f52a08 - languageName: node - linkType: hard - -"ansi-styles@npm:^3.2.1": - version: 3.2.1 - resolution: "ansi-styles@npm:3.2.1" - dependencies: - color-convert: "npm:^1.9.0" - checksum: ece5a8ef069fcc5298f67e3f4771a663129abd174ea2dfa87923a2be2abf6cd367ef72ac87942da00ce85bd1d651d4cd8595aebdb1b385889b89b205860e977b + version: 6.1.0 + resolution: "ansi-regex@npm:6.1.0" + checksum: a91daeddd54746338478eef88af3439a7edf30f8e23196e2d6ed182da9add559c601266dbef01c2efa46a958ad6f1f8b176799657616c702b5b02e799e7fd8dc languageName: node linkType: hard @@ -2576,7 +3181,18 @@ __metadata: languageName: node linkType: hard -"assert@npm:^2.1.0": +"asn1.js@npm:^4.10.1": + version: 4.10.1 + resolution: "asn1.js@npm:4.10.1" + dependencies: + bn.js: "npm:^4.0.0" + inherits: "npm:^2.0.1" + minimalistic-assert: "npm:^1.0.0" + checksum: afa7f3ab9e31566c80175a75b182e5dba50589dcc738aa485be42bdd787e2a07246a4b034d481861123cbe646a7656f318f4f1cad2e9e5e808a210d5d6feaa88 + languageName: node + linkType: hard + +"assert@npm:^2.0.0, assert@npm:^2.1.0": version: 2.1.0 resolution: "assert@npm:2.1.0" dependencies: @@ -2783,9 +3399,23 @@ __metadata: languageName: node linkType: hard -"body-parser@npm:1.20.2": - version: 1.20.2 - resolution: "body-parser@npm:1.20.2" +"bn.js@npm:^4.0.0, bn.js@npm:^4.1.0, bn.js@npm:^4.11.9": + version: 4.12.1 + resolution: "bn.js@npm:4.12.1" + checksum: b7f37a0cd5e4b79142b6f4292d518b416be34ae55d6dd6b0f66f96550c8083a50ffbbf8bda8d0ab471158cb81aa74ea4ee58fe33c7802e4a30b13810e98df116 + languageName: node + linkType: hard + +"bn.js@npm:^5.2.1": + version: 5.2.1 + resolution: "bn.js@npm:5.2.1" + checksum: bed3d8bd34ec89dbcf9f20f88bd7d4a49c160fda3b561c7bb227501f974d3e435a48fb9b61bc3de304acab9215a3bda0803f7017ffb4d0016a0c3a740a283caa + languageName: node + linkType: hard + +"body-parser@npm:1.20.3": + version: 1.20.3 + resolution: "body-parser@npm:1.20.3" dependencies: bytes: "npm:3.1.2" content-type: "npm:~1.0.5" @@ -2795,21 +3425,21 @@ __metadata: http-errors: "npm:2.0.0" iconv-lite: "npm:0.4.24" on-finished: "npm:2.4.1" - qs: "npm:6.11.0" + qs: "npm:6.13.0" raw-body: "npm:2.5.2" type-is: "npm:~1.6.18" unpipe: "npm:1.0.0" - checksum: 06f1438fff388a2e2354c96aa3ea8147b79bfcb1262dfcc2aae68ec13723d01d5781680657b74e9f83c808266d5baf52804032fbde2b7382b89bd8cdb273ace9 + checksum: 0a9a93b7518f222885498dcecaad528cf010dd109b071bf471c93def4bfe30958b83e03496eb9c1ad4896db543d999bb62be1a3087294162a88cfa1b42c16310 languageName: node linkType: hard "bonjour-service@npm:^1.0.11": - version: 1.2.1 - resolution: "bonjour-service@npm:1.2.1" + version: 1.3.0 + resolution: "bonjour-service@npm:1.3.0" dependencies: fast-deep-equal: "npm:^3.1.3" multicast-dns: "npm:^7.2.5" - checksum: 953cbfc27fc9e36e6f988012993ab2244817d82426603e0390d4715639031396c932b6657b1aa4ec30dbb5fa903d6b2c7f1be3af7a8ba24165c93e987c849730 + checksum: 5721fd9f9bb968e9cc16c1e8116d770863dd2329cb1f753231de1515870648c225142b7eefa71f14a5c22bc7b37ddd7fdeb018700f28a8c936d50d4162d433c7 languageName: node linkType: hard @@ -2864,17 +3494,108 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.10, browserslist@npm:^4.23.1, browserslist@npm:^4.23.3": - version: 4.23.3 - resolution: "browserslist@npm:4.23.3" +"brorand@npm:^1.0.1, brorand@npm:^1.1.0": + version: 1.1.0 + resolution: "brorand@npm:1.1.0" + checksum: 6f366d7c4990f82c366e3878492ba9a372a73163c09871e80d82fb4ae0d23f9f8924cb8a662330308206e6b3b76ba1d528b4601c9ef73c2166b440b2ea3b7571 + languageName: node + linkType: hard + +"browser-resolve@npm:^2.0.0": + version: 2.0.0 + resolution: "browser-resolve@npm:2.0.0" dependencies: - caniuse-lite: "npm:^1.0.30001646" - electron-to-chromium: "npm:^1.5.4" + resolve: "npm:^1.17.0" + checksum: 06c43adf3cb1939825ab9a4ac355b23272820ee421a20d04f62e0dabd9ea305e497b97f3ac027f87d53c366483aafe8673bbe1aaa5e41cd69eeafa65ac5fda6e + languageName: node + linkType: hard + +"browserify-aes@npm:^1.0.4, browserify-aes@npm:^1.2.0": + version: 1.2.0 + resolution: "browserify-aes@npm:1.2.0" + dependencies: + buffer-xor: "npm:^1.0.3" + cipher-base: "npm:^1.0.0" + create-hash: "npm:^1.1.0" + evp_bytestokey: "npm:^1.0.3" + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + checksum: 967f2ae60d610b7b252a4cbb55a7a3331c78293c94b4dd9c264d384ca93354c089b3af9c0dd023534efdc74ffbc82510f7ad4399cf82bc37bc07052eea485f18 + languageName: node + linkType: hard + +"browserify-cipher@npm:^1.0.1": + version: 1.0.1 + resolution: "browserify-cipher@npm:1.0.1" + dependencies: + browserify-aes: "npm:^1.0.4" + browserify-des: "npm:^1.0.0" + evp_bytestokey: "npm:^1.0.0" + checksum: aa256dcb42bc53a67168bbc94ab85d243b0a3b56109dee3b51230b7d010d9b78985ffc1fb36e145c6e4db151f888076c1cfc207baf1525d3e375cbe8187fe27d + languageName: node + linkType: hard + +"browserify-des@npm:^1.0.0": + version: 1.0.2 + resolution: "browserify-des@npm:1.0.2" + dependencies: + cipher-base: "npm:^1.0.1" + des.js: "npm:^1.0.0" + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: 943eb5d4045eff80a6cde5be4e5fbb1f2d5002126b5a4789c3c1aae3cdddb1eb92b00fb92277f512288e5c6af330730b1dbabcf7ce0923e749e151fcee5a074d + languageName: node + linkType: hard + +"browserify-rsa@npm:^4.0.0, browserify-rsa@npm:^4.1.0": + version: 4.1.1 + resolution: "browserify-rsa@npm:4.1.1" + dependencies: + bn.js: "npm:^5.2.1" + randombytes: "npm:^2.1.0" + safe-buffer: "npm:^5.2.1" + checksum: b650ee1192e3d7f3d779edc06dd96ed8720362e72ac310c367b9d7fe35f7e8dbb983c1829142b2b3215458be8bf17c38adc7224920843024ed8cf39e19c513c0 + languageName: node + linkType: hard + +"browserify-sign@npm:^4.2.3": + version: 4.2.3 + resolution: "browserify-sign@npm:4.2.3" + dependencies: + bn.js: "npm:^5.2.1" + browserify-rsa: "npm:^4.1.0" + create-hash: "npm:^1.2.0" + create-hmac: "npm:^1.1.7" + elliptic: "npm:^6.5.5" + hash-base: "npm:~3.0" + inherits: "npm:^2.0.4" + parse-asn1: "npm:^5.1.7" + readable-stream: "npm:^2.3.8" + safe-buffer: "npm:^5.2.1" + checksum: 30c0eba3f5970a20866a4d3fbba2c5bd1928cd24f47faf995f913f1499214c6f3be14bb4d6ec1ab5c6cafb1eca9cb76ba1c2e1c04ed018370634d4e659c77216 + languageName: node + linkType: hard + +"browserify-zlib@npm:^0.2.0": + version: 0.2.0 + resolution: "browserify-zlib@npm:0.2.0" + dependencies: + pako: "npm:~1.0.5" + checksum: 9ab10b6dc732c6c5ec8ebcbe5cb7fe1467f97402c9b2140113f47b5f187b9438f93a8e065d8baf8b929323c18324fbf1105af479ee86d9d36cab7d7ef3424ad9 + languageName: node + linkType: hard + +"browserslist@npm:^4.23.3, browserslist@npm:^4.24.0": + version: 4.24.2 + resolution: "browserslist@npm:4.24.2" + dependencies: + caniuse-lite: "npm:^1.0.30001669" + electron-to-chromium: "npm:^1.5.41" node-releases: "npm:^2.0.18" - update-browserslist-db: "npm:^1.1.0" + update-browserslist-db: "npm:^1.1.1" bin: browserslist: cli.js - checksum: 3063bfdf812815346447f4796c8f04601bf5d62003374305fd323c2a463e42776475bcc5309264e39bcf9a8605851e53560695991a623be988138b3ff8c66642 + checksum: d747c9fb65ed7b4f1abcae4959405707ed9a7b835639f8a9ba0da2911995a6ab9b0648fd05baf2a4d4e3cf7f9fdbad56d3753f91881e365992c1d49c8d88ff7a languageName: node linkType: hard @@ -2903,6 +3624,23 @@ __metadata: languageName: node linkType: hard +"buffer-xor@npm:^1.0.3": + version: 1.0.3 + resolution: "buffer-xor@npm:1.0.3" + checksum: fd269d0e0bf71ecac3146187cfc79edc9dbb054e2ee69b4d97dfb857c6d997c33de391696d04bdd669272751fa48e7872a22f3a6c7b07d6c0bc31dbe02a4075c + languageName: node + linkType: hard + +"buffer@npm:^5.7.1": + version: 5.7.1 + resolution: "buffer@npm:5.7.1" + dependencies: + base64-js: "npm:^1.3.1" + ieee754: "npm:^1.1.13" + checksum: 27cac81cff434ed2876058d72e7c4789d11ff1120ef32c9de48f59eab58179b66710c488987d295ae89a228f835fc66d088652dffeb8e3ba8659f80eb091d55e + languageName: node + linkType: hard + "buffer@npm:^6.0.3": version: 6.0.3 resolution: "buffer@npm:6.0.3" @@ -2913,6 +3651,13 @@ __metadata: languageName: node linkType: hard +"builtin-status-codes@npm:^3.0.0": + version: 3.0.0 + resolution: "builtin-status-codes@npm:3.0.0" + checksum: c37bbba11a34c4431e56bd681b175512e99147defbe2358318d8152b3a01df7bf25e0305873947e5b350073d5ef41a364a22b37e48f1fb6d2fe6d5286a0f348c + languageName: node + linkType: hard + "bytes@npm:3.0.0": version: 3.0.0 resolution: "bytes@npm:3.0.0" @@ -3005,23 +3750,23 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001646": - version: 1.0.30001655 - resolution: "caniuse-lite@npm:1.0.30001655" - checksum: fff0c0c3ffcba89828bfa6b99f118e82c064f46f15bb8655b9f2a352a3f552ccac0b87a9fe9532f8c5a29e284aae5579791e196480ec717d11ef1d1a1c2e3ff9 +"caniuse-lite@npm:^1.0.30001646, caniuse-lite@npm:^1.0.30001669": + version: 1.0.30001683 + resolution: "caniuse-lite@npm:1.0.30001683" + checksum: 0ca7f4f2fbd0c71fde5a14ca2e29bb1dcb84c095d7a3d88e47371e062f276f1dc31da3f10931ec134ef7fb096259c0d67c9ffb843a9ec4a040a85eb2fea0bdec languageName: node linkType: hard -"chai@npm:^5.1.1": - version: 5.1.1 - resolution: "chai@npm:5.1.1" +"chai@npm:^5.1.2": + version: 5.1.2 + resolution: "chai@npm:5.1.2" dependencies: assertion-error: "npm:^2.0.1" check-error: "npm:^2.1.1" deep-eql: "npm:^5.0.1" loupe: "npm:^3.1.0" pathval: "npm:^2.0.0" - checksum: e7f00e5881e3d5224f08fe63966ed6566bd9fdde175863c7c16dd5240416de9b34c4a0dd925f4fd64ad56256ca6507d32cf6131c49e1db65c62578eb31d4566c + checksum: 6c04ff8495b6e535df9c1b062b6b094828454e9a3c9493393e55b2f4dbff7aa2a29a4645133cad160fb00a16196c4dc03dc9bb37e1f4ba9df3b5f50d7533a736 languageName: node linkType: hard @@ -3041,17 +3786,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^2.4.2": - version: 2.4.2 - resolution: "chalk@npm:2.4.2" - dependencies: - ansi-styles: "npm:^3.2.1" - escape-string-regexp: "npm:^1.0.5" - supports-color: "npm:^5.3.0" - checksum: e6543f02ec877732e3a2d1c3c3323ddb4d39fbab687c23f526e25bd4c6a9bf3b83a696e8c769d078e04e5754921648f7821b2a2acfd16c550435fd630026e073 - languageName: node - linkType: hard - "chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.2": version: 4.1.2 resolution: "chalk@npm:4.1.2" @@ -3123,10 +3857,20 @@ __metadata: languageName: node linkType: hard +"cipher-base@npm:^1.0.0, cipher-base@npm:^1.0.1, cipher-base@npm:^1.0.3": + version: 1.0.5 + resolution: "cipher-base@npm:1.0.5" + dependencies: + inherits: "npm:^2.0.4" + safe-buffer: "npm:^5.2.1" + checksum: 064a7f9323ba5416c8f4ab98bd0fca7234f05b39b0784b8131429e84ac5c735e7fc9f87e2bd39b278a0121d833ca20fa9f5b4dd11fbe289191e7d29471bb3f5b + languageName: node + linkType: hard + "cjs-module-lexer@npm:^1.0.0": - version: 1.4.0 - resolution: "cjs-module-lexer@npm:1.4.0" - checksum: b5ef03e10297c24f0db56b13d7d2f92e377499c83d7bf9352ec73df544b5310e024dfb1779a6b810e7a06eb18caa6a0e2da5f11df8116af73306f362e67fb61a + version: 1.4.1 + resolution: "cjs-module-lexer@npm:1.4.1" + checksum: 5a7d8279629c9ba8ccf38078c2fed75b7737973ced22b9b5a54180efa57fb2fe2bb7bec6aec55e3b8f3f5044f5d7b240347ad9bd285e7c3d0ee5b0a1d0504dfc languageName: node linkType: hard @@ -3237,15 +3981,6 @@ __metadata: languageName: node linkType: hard -"color-convert@npm:^1.9.0": - version: 1.9.3 - resolution: "color-convert@npm:1.9.3" - dependencies: - color-name: "npm:1.1.3" - checksum: 5ad3c534949a8c68fca8fbc6f09068f435f0ad290ab8b2f76841b9e6af7e0bb57b98cb05b0e19fe33f5d91e5a8611ad457e5f69e0a484caad1f7487fd0e8253c - languageName: node - linkType: hard - "color-convert@npm:^2.0.1": version: 2.0.1 resolution: "color-convert@npm:2.0.1" @@ -3255,13 +3990,6 @@ __metadata: languageName: node linkType: hard -"color-name@npm:1.1.3": - version: 1.1.3 - resolution: "color-name@npm:1.1.3" - checksum: 566a3d42cca25b9b3cd5528cd7754b8e89c0eb646b7f214e8e2eaddb69994ac5f0557d9c175eb5d8f0ad73531140d9c47525085ee752a91a2ab15ab459caf6d6 - languageName: node - linkType: hard - "color-name@npm:~1.1.4": version: 1.1.4 resolution: "color-name@npm:1.1.4" @@ -3320,7 +4048,7 @@ __metadata: languageName: node linkType: hard -"compressible@npm:~2.0.16": +"compressible@npm:~2.0.16, compressible@npm:~2.0.18": version: 2.0.18 resolution: "compressible@npm:2.0.18" dependencies: @@ -3329,7 +4057,7 @@ __metadata: languageName: node linkType: hard -"compression@npm:1.7.4, compression@npm:^1.7.4": +"compression@npm:1.7.4": version: 1.7.4 resolution: "compression@npm:1.7.4" dependencies: @@ -3344,6 +4072,21 @@ __metadata: languageName: node linkType: hard +"compression@npm:^1.7.4": + version: 1.7.5 + resolution: "compression@npm:1.7.5" + dependencies: + bytes: "npm:3.1.2" + compressible: "npm:~2.0.18" + debug: "npm:2.6.9" + negotiator: "npm:~0.6.4" + on-headers: "npm:~1.0.2" + safe-buffer: "npm:5.2.1" + vary: "npm:~1.1.2" + checksum: 35c9d2d57c86d8107eab5e637f2146fcefec8475a2ff3e162f5eb0982ff856d385fb5d8c9823c3d50e075f2d9304bc622dac3df27bfef0355309c0a5307861c5 + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -3358,6 +4101,20 @@ __metadata: languageName: node linkType: hard +"console-browserify@npm:^1.1.0": + version: 1.2.0 + resolution: "console-browserify@npm:1.2.0" + checksum: 89b99a53b7d6cee54e1e64fa6b1f7ac24b844b4019c5d39db298637e55c1f4ffa5c165457ad984864de1379df2c8e1886cbbdac85d9dbb6876a9f26c3106f226 + languageName: node + linkType: hard + +"constants-browserify@npm:^1.0.0": + version: 1.0.0 + resolution: "constants-browserify@npm:1.0.0" + checksum: ab49b1d59a433ed77c964d90d19e08b2f77213fb823da4729c0baead55e3c597f8f97ebccfdfc47bd896d43854a117d114c849a6f659d9986420e97da0f83ac5 + languageName: node + linkType: hard + "content-disposition@npm:0.5.2": version: 0.5.2 resolution: "content-disposition@npm:0.5.2" @@ -3395,10 +4152,10 @@ __metadata: languageName: node linkType: hard -"cookie@npm:0.6.0": - version: 0.6.0 - resolution: "cookie@npm:0.6.0" - checksum: f2318b31af7a31b4ddb4a678d024514df5e705f9be5909a192d7f116cfb6d45cbacf96a473fa733faa95050e7cff26e7832bb3ef94751592f1387b71c8956686 +"cookie@npm:0.7.1": + version: 0.7.1 + resolution: "cookie@npm:0.7.1" + checksum: 5de60c67a410e7c8dc8a46a4b72eb0fe925871d057c9a5d2c0e8145c4270a4f81076de83410c4d397179744b478e33cd80ccbcc457abf40a9409ad27dcd21dde languageName: node linkType: hard @@ -3442,6 +4199,43 @@ __metadata: languageName: node linkType: hard +"create-ecdh@npm:^4.0.4": + version: 4.0.4 + resolution: "create-ecdh@npm:4.0.4" + dependencies: + bn.js: "npm:^4.1.0" + elliptic: "npm:^6.5.3" + checksum: 77b11a51360fec9c3bce7a76288fc0deba4b9c838d5fb354b3e40c59194d23d66efe6355fd4b81df7580da0661e1334a235a2a5c040b7569ba97db428d466e7f + languageName: node + linkType: hard + +"create-hash@npm:^1.1.0, create-hash@npm:^1.1.2, create-hash@npm:^1.2.0": + version: 1.2.0 + resolution: "create-hash@npm:1.2.0" + dependencies: + cipher-base: "npm:^1.0.1" + inherits: "npm:^2.0.1" + md5.js: "npm:^1.3.4" + ripemd160: "npm:^2.0.1" + sha.js: "npm:^2.4.0" + checksum: d402e60e65e70e5083cb57af96d89567954d0669e90550d7cec58b56d49c4b193d35c43cec8338bc72358198b8cbf2f0cac14775b651e99238e1cf411490f915 + languageName: node + linkType: hard + +"create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": + version: 1.1.7 + resolution: "create-hmac@npm:1.1.7" + dependencies: + cipher-base: "npm:^1.0.3" + create-hash: "npm:^1.1.0" + inherits: "npm:^2.0.1" + ripemd160: "npm:^2.0.0" + safe-buffer: "npm:^5.0.1" + sha.js: "npm:^2.4.8" + checksum: 24332bab51011652a9a0a6d160eed1e8caa091b802335324ae056b0dcb5acbc9fcf173cf10d128eba8548c3ce98dfa4eadaa01bd02f44a34414baee26b651835 + languageName: node + linkType: hard + "create-jest@npm:^29.7.0": version: 29.7.0 resolution: "create-jest@npm:29.7.0" @@ -3459,21 +4253,41 @@ __metadata: languageName: node linkType: hard -"create-require@npm:^1.1.0": +"create-require@npm:^1.1.0, create-require@npm:^1.1.1": version: 1.1.1 resolution: "create-require@npm:1.1.1" checksum: 157cbc59b2430ae9a90034a5f3a1b398b6738bf510f713edc4d4e45e169bc514d3d99dd34d8d01ca7ae7830b5b8b537e46ae8f3c8f932371b0875c0151d7ec91 languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.5": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" dependencies: path-key: "npm:^3.1.0" shebang-command: "npm:^2.0.0" which: "npm:^2.0.1" - checksum: 5738c312387081c98d69c98e105b6327b069197f864a60593245d64c8089c8a0a744e16349281210d56835bb9274130d825a78b2ad6853ca13cfbeffc0c31750 + checksum: 053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + languageName: node + linkType: hard + +"crypto-browserify@npm:^3.11.0": + version: 3.12.1 + resolution: "crypto-browserify@npm:3.12.1" + dependencies: + browserify-cipher: "npm:^1.0.1" + browserify-sign: "npm:^4.2.3" + create-ecdh: "npm:^4.0.4" + create-hash: "npm:^1.2.0" + create-hmac: "npm:^1.1.7" + diffie-hellman: "npm:^5.0.3" + hash-base: "npm:~3.0.4" + inherits: "npm:^2.0.4" + pbkdf2: "npm:^3.1.2" + public-encrypt: "npm:^4.0.3" + randombytes: "npm:^2.1.0" + randomfill: "npm:^1.0.4" + checksum: 184a2def7b16628e79841243232ab5497f18d8e158ac21b7ce90ab172427d0a892a561280adc08f9d4d517bce8db2a5b335dc21abb970f787f8e874bd7b9db7d languageName: node linkType: hard @@ -3586,15 +4400,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5": - version: 4.3.6 - resolution: "debug@npm:4.3.6" +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.5, debug@npm:^4.3.7": + version: 4.3.7 + resolution: "debug@npm:4.3.7" dependencies: - ms: "npm:2.1.2" + ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 3293416bff072389c101697d4611c402a6bacd1900ac20c0492f61a9cdd6b3b29750fc7f5e299f8058469ef60ff8fb79b86395a30374fbd2490113c1c7112285 + checksum: 1471db19c3b06d485a622d62f65947a19a23fbd0dd73f7fd3eafb697eec5360cde447fb075919987899b1a2096e85d35d4eb5a4de09a57600ac9cf7e6c8e768b languageName: node linkType: hard @@ -3713,6 +4527,16 @@ __metadata: languageName: node linkType: hard +"des.js@npm:^1.0.0": + version: 1.1.0 + resolution: "des.js@npm:1.1.0" + dependencies: + inherits: "npm:^2.0.1" + minimalistic-assert: "npm:^1.0.0" + checksum: 671354943ad67493e49eb4c555480ab153edd7cee3a51c658082fcde539d2690ed2a4a0b5d1f401f9cde822edf3939a6afb2585f32c091f2d3a1b1665cd45236 + languageName: node + linkType: hard + "destroy@npm:1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" @@ -3720,6 +4544,13 @@ __metadata: languageName: node linkType: hard +"detect-libc@npm:^2.0.1": + version: 2.0.3 + resolution: "detect-libc@npm:2.0.3" + checksum: 88095bda8f90220c95f162bf92cad70bd0e424913e655c20578600e35b91edc261af27531cf160a331e185c0ced93944bc7e09939143225f56312d7fd800fdb7 + languageName: node + linkType: hard + "detect-newline@npm:^3.0.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -3748,6 +4579,17 @@ __metadata: languageName: node linkType: hard +"diffie-hellman@npm:^5.0.3": + version: 5.0.3 + resolution: "diffie-hellman@npm:5.0.3" + dependencies: + bn.js: "npm:^4.1.0" + miller-rabin: "npm:^4.0.0" + randombytes: "npm:^2.0.0" + checksum: ce53ccafa9ca544b7fc29b08a626e23a9b6562efc2a98559a0c97b4718937cebaa9b5d7d0a05032cc9c1435e9b3c1532b9e9bf2e0ede868525922807ad6e1ecf + languageName: node + linkType: hard + "dir-glob@npm:^3.0.1": version: 3.0.1 resolution: "dir-glob@npm:3.0.1" @@ -3804,6 +4646,13 @@ __metadata: languageName: node linkType: hard +"domain-browser@npm:4.22.0": + version: 4.22.0 + resolution: "domain-browser@npm:4.22.0" + checksum: 2ef7eda6d2161038fda0c9aa4c9e18cc7a0baa89ea6be975d449527c2eefd4b608425db88508e2859acc472f46f402079274b24bd75e3fb506f28c5dba203129 + languageName: node + linkType: hard + "domelementtype@npm:^2.0.1, domelementtype@npm:^2.2.0": version: 2.3.0 resolution: "domelementtype@npm:2.3.0" @@ -3866,10 +4715,25 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.5.4": - version: 1.5.13 - resolution: "electron-to-chromium@npm:1.5.13" - checksum: 1d88ac39447e1d718c4296f92fe89836df4688daf2d362d6c49108136795f05a56dd9c950f1c6715e0395fa037c3b5f5ea686c543fdc90e6d74a005877c45022 +"electron-to-chromium@npm:^1.5.41": + version: 1.5.64 + resolution: "electron-to-chromium@npm:1.5.64" + checksum: 331c2160cc37ef85317b44f2078af8ff16f068fc95d4af2210fe943b567f20b1445a7faa40c05d290bc229102ef1b662371464ba2725d10ff6c8543af6d40adf + languageName: node + linkType: hard + +"elliptic@npm:^6.5.3, elliptic@npm:^6.5.5": + version: 6.6.1 + resolution: "elliptic@npm:6.6.1" + dependencies: + bn.js: "npm:^4.11.9" + brorand: "npm:^1.1.0" + hash.js: "npm:^1.0.0" + hmac-drbg: "npm:^1.0.1" + inherits: "npm:^2.0.4" + minimalistic-assert: "npm:^1.0.1" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: 8b24ef782eec8b472053793ea1e91ae6bee41afffdfcb78a81c0a53b191e715cbe1292aa07165958a9bbe675bd0955142560b1a007ffce7d6c765bcaf951a867 languageName: node linkType: hard @@ -3908,6 +4772,13 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 5d317306acb13e6590e28e27924c754163946a2480de11865c991a3a7eed4315cd3fba378b543ca145829569eefe9b899f3d84bb09870f675ae60bc924b01ceb + languageName: node + linkType: hard + "encoding@npm:^0.1.13": version: 0.1.13 resolution: "encoding@npm:0.1.13" @@ -3960,11 +4831,11 @@ __metadata: linkType: hard "envinfo@npm:^7.7.3": - version: 7.13.0 - resolution: "envinfo@npm:7.13.0" + version: 7.14.0 + resolution: "envinfo@npm:7.14.0" bin: envinfo: dist/cli.js - checksum: 9c279213cbbb353b3171e8e333fd2ed564054abade08ab3d735fe136e10a0e14e0588e1ce77e6f01285f2462eaca945d64f0778be5ae3d9e82804943e36a4411 + checksum: 059a031eee101e056bd9cc5cbfe25c2fab433fe1780e86cf0a82d24a000c6931e327da6a8ffb3dce528a24f83f256e7efc0b36813113eff8fdc6839018efe327 languageName: node linkType: hard @@ -3984,9 +4855,9 @@ __metadata: languageName: node linkType: hard -"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2": - version: 1.23.3 - resolution: "es-abstract@npm:1.23.3" +"es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.1, es-abstract@npm:^1.23.2": + version: 1.23.5 + resolution: "es-abstract@npm:1.23.5" dependencies: array-buffer-byte-length: "npm:^1.0.1" arraybuffer.prototype.slice: "npm:^1.0.3" @@ -4003,7 +4874,7 @@ __metadata: function.prototype.name: "npm:^1.1.6" get-intrinsic: "npm:^1.2.4" get-symbol-description: "npm:^1.0.2" - globalthis: "npm:^1.0.3" + globalthis: "npm:^1.0.4" gopd: "npm:^1.0.1" has-property-descriptors: "npm:^1.0.2" has-proto: "npm:^1.0.3" @@ -4019,10 +4890,10 @@ __metadata: is-string: "npm:^1.0.7" is-typed-array: "npm:^1.1.13" is-weakref: "npm:^1.0.2" - object-inspect: "npm:^1.13.1" + object-inspect: "npm:^1.13.3" object-keys: "npm:^1.1.1" object.assign: "npm:^4.1.5" - regexp.prototype.flags: "npm:^1.5.2" + regexp.prototype.flags: "npm:^1.5.3" safe-array-concat: "npm:^1.1.2" safe-regex-test: "npm:^1.0.3" string.prototype.trim: "npm:^1.2.9" @@ -4034,7 +4905,7 @@ __metadata: typed-array-length: "npm:^1.0.6" unbox-primitive: "npm:^1.0.2" which-typed-array: "npm:^1.1.15" - checksum: d27e9afafb225c6924bee9971a7f25f20c314f2d6cb93a63cada4ac11dcf42040896a6c22e5fb8f2a10767055ed4ddf400be3b1eb12297d281726de470b75666 + checksum: 1f6f91da9cf7ee2c81652d57d3046621d598654d1d1b05c1578bafe5c4c2d3d69513901679bdca2de589f620666ec21de337e4935cec108a4ed0871d5ef04a5d languageName: node linkType: hard @@ -4054,7 +4925,7 @@ __metadata: languageName: node linkType: hard -"es-module-lexer@npm:^1.2.1": +"es-module-lexer@npm:^1.2.1, es-module-lexer@npm:^1.5.4": version: 1.5.4 resolution: "es-module-lexer@npm:1.5.4" checksum: 300a469488c2f22081df1e4c8398c78db92358496e639b0df7f89ac6455462aaf5d8893939087c1a1cbcbf20eed4610c70e0bcb8f3e4b0d80a5d2611c539408c @@ -4181,7 +5052,7 @@ __metadata: languageName: node linkType: hard -"escalade@npm:^3.1.1, escalade@npm:^3.1.2": +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": version: 3.2.0 resolution: "escalade@npm:3.2.0" checksum: ced4dd3a78e15897ed3be74e635110bbf3b08877b0a41be50dcb325ee0e0b5f65fc2d50e9845194d7c4633f327e2e1c6cce00a71b617c5673df0374201d67f65 @@ -4195,13 +5066,6 @@ __metadata: languageName: node linkType: hard -"escape-string-regexp@npm:^1.0.5": - version: 1.0.5 - resolution: "escape-string-regexp@npm:1.0.5" - checksum: a968ad453dd0c2724e14a4f20e177aaf32bb384ab41b674a8454afe9a41c5e6fe8903323e0a1052f56289d04bd600f81278edf140b0fcc02f5cac98d0f5b5371 - languageName: node - linkType: hard - "escape-string-regexp@npm:^2.0.0": version: 2.0.0 resolution: "escape-string-regexp@npm:2.0.0" @@ -4263,21 +5127,21 @@ __metadata: languageName: node linkType: hard -"eslint-module-utils@npm:^2.8.1, eslint-module-utils@npm:^2.9.0": - version: 2.9.0 - resolution: "eslint-module-utils@npm:2.9.0" +"eslint-module-utils@npm:^2.12.0, eslint-module-utils@npm:^2.8.1": + version: 2.12.0 + resolution: "eslint-module-utils@npm:2.12.0" dependencies: debug: "npm:^3.2.7" peerDependenciesMeta: eslint: optional: true - checksum: 7c45c5b54402a969e99315890c10e9bf8c8bee16c7890573343af05dfa04566d61546585678c413e5228af0550e39461be47e35a8ff0d1863e113bdbb28d1d29 + checksum: 4d8b46dcd525d71276f9be9ffac1d2be61c9d54cc53c992e6333cf957840dee09381842b1acbbb15fc6b255ebab99cd481c5007ab438e5455a14abe1a0468558 languageName: node linkType: hard "eslint-plugin-import@npm:^2.27.5": - version: 2.30.0 - resolution: "eslint-plugin-import@npm:2.30.0" + version: 2.31.0 + resolution: "eslint-plugin-import@npm:2.31.0" dependencies: "@rtsao/scc": "npm:^1.1.0" array-includes: "npm:^3.1.8" @@ -4287,7 +5151,7 @@ __metadata: debug: "npm:^3.2.7" doctrine: "npm:^2.1.0" eslint-import-resolver-node: "npm:^0.3.9" - eslint-module-utils: "npm:^2.9.0" + eslint-module-utils: "npm:^2.12.0" hasown: "npm:^2.0.2" is-core-module: "npm:^2.15.1" is-glob: "npm:^4.0.3" @@ -4296,10 +5160,11 @@ __metadata: object.groupby: "npm:^1.0.3" object.values: "npm:^1.2.0" semver: "npm:^6.3.1" + string.prototype.trimend: "npm:^1.0.8" tsconfig-paths: "npm:^3.15.0" peerDependencies: - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - checksum: 4c9dcb1f27505c4d5dd891d2b551f56c70786d136aa3992a77e785bdc67c9f60200a2c7fb0ce55b7647fe550b12bc433d5dfa59e2c00ab44227791c5ab86badf + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9 + checksum: e21d116ddd1900e091ad120b3eb68c5dd5437fe2c930f1211781cd38b246f090a6b74d5f3800b8255a0ed29782591521ad44eb21c5534960a8f1fb4040fd913a languageName: node linkType: hard @@ -4332,12 +5197,21 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react-refresh@npm:^0.4.3": - version: 0.4.11 - resolution: "eslint-plugin-react-refresh@npm:0.4.11" +"eslint-plugin-react-hooks@npm:^5.0.0": + version: 5.0.0 + resolution: "eslint-plugin-react-hooks@npm:5.0.0" + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 + checksum: bcb74b421f32e4203a7100405b57aab85526be4461e5a1da01bc537969a30012d2ee209a2c2a6cac543833a27188ce1e6ad71e4628d0bb4a2e5365cad86c5002 + languageName: node + linkType: hard + +"eslint-plugin-react-refresh@npm:^0.4.14, eslint-plugin-react-refresh@npm:^0.4.3": + version: 0.4.14 + resolution: "eslint-plugin-react-refresh@npm:0.4.14" peerDependencies: eslint: ">=7" - checksum: 0c7d4ce30a70fbd6460ea9ca45b029b1cc806fd922d308ad332315d0e1725a37a578283809913bf7a7c84c613e3313e891dde7692a8e6ef2979dbff7edf45901 + checksum: 427108008ffcc2e0be36897398e61a2fae54c5bf092af0171bc4cf1927080d40619bb07be02ecd7c515372210228cf849023997cfa0252d37115f9b0c0debcd2 languageName: node linkType: hard @@ -4361,58 +5235,135 @@ __metadata: languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-scope@npm:^8.2.0": + version: 8.2.0 + resolution: "eslint-scope@npm:8.2.0" + dependencies: + esrecurse: "npm:^4.3.0" + estraverse: "npm:^5.2.0" + checksum: 8d2d58e2136d548ac7e0099b1a90d9fab56f990d86eb518de1247a7066d38c908be2f3df477a79cf60d70b30ba18735d6c6e70e9914dca2ee515a729975d70d6 + languageName: node + linkType: hard + +"eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 languageName: node linkType: hard -"eslint@npm:^8.21.0": - version: 8.57.0 - resolution: "eslint@npm:8.57.0" +"eslint-visitor-keys@npm:^4.2.0": + version: 4.2.0 + resolution: "eslint-visitor-keys@npm:4.2.0" + checksum: 2ed81c663b147ca6f578312919483eb040295bbab759e5a371953456c636c5b49a559883e2677112453728d66293c0a4c90ab11cab3428cf02a0236d2e738269 + languageName: node + linkType: hard + +"eslint@npm:^8.21.0": + version: 8.57.1 + resolution: "eslint@npm:8.57.1" + dependencies: + "@eslint-community/eslint-utils": "npm:^4.2.0" + "@eslint-community/regexpp": "npm:^4.6.1" + "@eslint/eslintrc": "npm:^2.1.4" + "@eslint/js": "npm:8.57.1" + "@humanwhocodes/config-array": "npm:^0.13.0" + "@humanwhocodes/module-importer": "npm:^1.0.1" + "@nodelib/fs.walk": "npm:^1.2.8" + "@ungap/structured-clone": "npm:^1.2.0" + ajv: "npm:^6.12.4" + chalk: "npm:^4.0.0" + cross-spawn: "npm:^7.0.2" + debug: "npm:^4.3.2" + doctrine: "npm:^3.0.0" + escape-string-regexp: "npm:^4.0.0" + eslint-scope: "npm:^7.2.2" + eslint-visitor-keys: "npm:^3.4.3" + espree: "npm:^9.6.1" + esquery: "npm:^1.4.2" + esutils: "npm:^2.0.2" + fast-deep-equal: "npm:^3.1.3" + file-entry-cache: "npm:^6.0.1" + find-up: "npm:^5.0.0" + glob-parent: "npm:^6.0.2" + globals: "npm:^13.19.0" + graphemer: "npm:^1.4.0" + ignore: "npm:^5.2.0" + imurmurhash: "npm:^0.1.4" + is-glob: "npm:^4.0.0" + is-path-inside: "npm:^3.0.3" + js-yaml: "npm:^4.1.0" + json-stable-stringify-without-jsonify: "npm:^1.0.1" + levn: "npm:^0.4.1" + lodash.merge: "npm:^4.6.2" + minimatch: "npm:^3.1.2" + natural-compare: "npm:^1.4.0" + optionator: "npm:^0.9.3" + strip-ansi: "npm:^6.0.1" + text-table: "npm:^0.2.0" + bin: + eslint: bin/eslint.js + checksum: 1fd31533086c1b72f86770a4d9d7058ee8b4643fd1cfd10c7aac1ecb8725698e88352a87805cf4b2ce890aa35947df4b4da9655fb7fdfa60dbb448a43f6ebcf1 + languageName: node + linkType: hard + +"eslint@npm:^9.13.0": + version: 9.15.0 + resolution: "eslint@npm:9.15.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.57.0" - "@humanwhocodes/config-array": "npm:^0.11.14" + "@eslint-community/regexpp": "npm:^4.12.1" + "@eslint/config-array": "npm:^0.19.0" + "@eslint/core": "npm:^0.9.0" + "@eslint/eslintrc": "npm:^3.2.0" + "@eslint/js": "npm:9.15.0" + "@eslint/plugin-kit": "npm:^0.2.3" + "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" - "@nodelib/fs.walk": "npm:^1.2.8" - "@ungap/structured-clone": "npm:^1.2.0" + "@humanwhocodes/retry": "npm:^0.4.1" + "@types/estree": "npm:^1.0.6" + "@types/json-schema": "npm:^7.0.15" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.2" + cross-spawn: "npm:^7.0.5" debug: "npm:^4.3.2" - doctrine: "npm:^3.0.0" escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.2.2" - eslint-visitor-keys: "npm:^3.4.3" - espree: "npm:^9.6.1" - esquery: "npm:^1.4.2" + eslint-scope: "npm:^8.2.0" + eslint-visitor-keys: "npm:^4.2.0" + espree: "npm:^10.3.0" + esquery: "npm:^1.5.0" esutils: "npm:^2.0.2" fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^6.0.1" + file-entry-cache: "npm:^8.0.0" find-up: "npm:^5.0.0" glob-parent: "npm:^6.0.2" - globals: "npm:^13.19.0" - graphemer: "npm:^1.4.0" ignore: "npm:^5.2.0" imurmurhash: "npm:^0.1.4" is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" - js-yaml: "npm:^4.1.0" json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" lodash.merge: "npm:^4.6.2" minimatch: "npm:^3.1.2" natural-compare: "npm:^1.4.0" optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true bin: eslint: bin/eslint.js - checksum: 00bb96fd2471039a312435a6776fe1fd557c056755eaa2b96093ef3a8508c92c8775d5f754768be6b1dddd09fdd3379ddb231eeb9b6c579ee17ea7d68000a529 + checksum: d0d7606f36bfcccb1c3703d0a24df32067b207a616f17efe5fb1765a91d13f085afffc4fc97ecde4ab9c9f4edd64d9b4ce750e13ff7937a25074b24bee15b20f + languageName: node + linkType: hard + +"espree@npm:^10.0.1, espree@npm:^10.3.0": + version: 10.3.0 + resolution: "espree@npm:10.3.0" + dependencies: + acorn: "npm:^8.14.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 272beeaca70d0a1a047d61baff64db04664a33d7cfb5d144f84bc8a5c6194c6c8ebe9cc594093ca53add88baa23e59b01e69e8a0160ab32eac570482e165c462 languageName: node linkType: hard @@ -4437,7 +5388,7 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2": +"esquery@npm:^1.4.2, esquery@npm:^1.5.0": version: 1.6.0 resolution: "esquery@npm:1.6.0" dependencies: @@ -4469,6 +5420,13 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^2.0.2": + version: 2.0.2 + resolution: "estree-walker@npm:2.0.2" + checksum: 53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af + languageName: node + linkType: hard + "estree-walker@npm:^3.0.3": version: 3.0.3 resolution: "estree-walker@npm:3.0.3" @@ -4506,13 +5464,24 @@ __metadata: languageName: node linkType: hard -"events@npm:^3.2.0, events@npm:^3.3.0": +"events@npm:^3.0.0, events@npm:^3.2.0, events@npm:^3.3.0": version: 3.3.0 resolution: "events@npm:3.3.0" checksum: d6b6f2adbccbcda74ddbab52ed07db727ef52e31a61ed26db9feb7dc62af7fc8e060defa65e5f8af9449b86b52cc1a1f6a79f2eafcf4e62add2b7a1fa4a432f6 languageName: node linkType: hard +"evp_bytestokey@npm:^1.0.0, evp_bytestokey@npm:^1.0.3": + version: 1.0.3 + resolution: "evp_bytestokey@npm:1.0.3" + dependencies: + md5.js: "npm:^1.3.4" + node-gyp: "npm:latest" + safe-buffer: "npm:^5.1.1" + checksum: 77fbe2d94a902a80e9b8f5a73dcd695d9c14899c5e82967a61b1fc6cbbb28c46552d9b127cff47c45fcf684748bdbcfa0a50410349109de87ceb4b199ef6ee99 + languageName: node + linkType: hard + "execa@npm:^5.0.0, execa@npm:^5.1.1": version: 5.1.1 resolution: "execa@npm:5.1.1" @@ -4530,23 +5499,6 @@ __metadata: languageName: node linkType: hard -"execa@npm:^8.0.1": - version: 8.0.1 - resolution: "execa@npm:8.0.1" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^8.0.1" - human-signals: "npm:^5.0.0" - is-stream: "npm:^3.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^5.1.0" - onetime: "npm:^6.0.0" - signal-exit: "npm:^4.1.0" - strip-final-newline: "npm:^3.0.0" - checksum: 2c52d8775f5bf103ce8eec9c7ab3059909ba350a5164744e9947ed14a53f51687c040a250bda833f906d1283aa8803975b84e6c8f7a7c42f99dc8ef80250d1af - languageName: node - linkType: hard - "exit@npm:^0.1.2": version: 0.1.2 resolution: "exit@npm:0.1.2" @@ -4554,6 +5506,13 @@ __metadata: languageName: node linkType: hard +"expect-type@npm:^1.1.0": + version: 1.1.0 + resolution: "expect-type@npm:1.1.0" + checksum: 5af0febbe8fe18da05a6d51e3677adafd75213512285408156b368ca471252565d5ca6e59e4bddab25121f3cfcbbebc6a5489f8cc9db131cc29e69dcdcc7ae15 + languageName: node + linkType: hard + "expect@npm:^29.0.0, expect@npm:^29.7.0": version: 29.7.0 resolution: "expect@npm:29.7.0" @@ -4575,41 +5534,41 @@ __metadata: linkType: hard "express@npm:^4.17.3": - version: 4.19.2 - resolution: "express@npm:4.19.2" + version: 4.21.1 + resolution: "express@npm:4.21.1" dependencies: accepts: "npm:~1.3.8" array-flatten: "npm:1.1.1" - body-parser: "npm:1.20.2" + body-parser: "npm:1.20.3" content-disposition: "npm:0.5.4" content-type: "npm:~1.0.4" - cookie: "npm:0.6.0" + cookie: "npm:0.7.1" cookie-signature: "npm:1.0.6" debug: "npm:2.6.9" depd: "npm:2.0.0" - encodeurl: "npm:~1.0.2" + encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" etag: "npm:~1.8.1" - finalhandler: "npm:1.2.0" + finalhandler: "npm:1.3.1" fresh: "npm:0.5.2" http-errors: "npm:2.0.0" - merge-descriptors: "npm:1.0.1" + merge-descriptors: "npm:1.0.3" methods: "npm:~1.1.2" on-finished: "npm:2.4.1" parseurl: "npm:~1.3.3" - path-to-regexp: "npm:0.1.7" + path-to-regexp: "npm:0.1.10" proxy-addr: "npm:~2.0.7" - qs: "npm:6.11.0" + qs: "npm:6.13.0" range-parser: "npm:~1.2.1" safe-buffer: "npm:5.2.1" - send: "npm:0.18.0" - serve-static: "npm:1.15.0" + send: "npm:0.19.0" + serve-static: "npm:1.16.2" setprototypeof: "npm:1.2.0" statuses: "npm:2.0.1" type-is: "npm:~1.6.18" utils-merge: "npm:1.0.1" vary: "npm:~1.1.2" - checksum: e82e2662ea9971c1407aea9fc3c16d6b963e55e3830cd0ef5e00b533feda8b770af4e3be630488ef8a752d7c75c4fcefb15892868eeaafe7353cb9e3e269fdcb + checksum: 0c287867e5f6129d3def1edd9b63103a53c40d4dc8628839d4b6827e35eb8f0de5a4656f9d85f4457eba584f9871ebb2ad26c750b36bd75d9bbb8bcebdc4892c languageName: node linkType: hard @@ -4676,18 +5635,9 @@ __metadata: linkType: hard "fast-uri@npm:^3.0.1": - version: 3.0.1 - resolution: "fast-uri@npm:3.0.1" - checksum: 3cd46d6006083b14ca61ffe9a05b8eef75ef87e9574b6f68f2e17ecf4daa7aaadeff44e3f0f7a0ef4e0f7e7c20fc07beec49ff14dc72d0b500f00386592f2d10 - languageName: node - linkType: hard - -"fast-url-parser@npm:1.1.3": - version: 1.1.3 - resolution: "fast-url-parser@npm:1.1.3" - dependencies: - punycode: "npm:^1.3.2" - checksum: d85c5c409cf0215417380f98a2d29c23a95004d93ff0d8bdf1af5f1a9d1fc608ac89ac6ffe863783d2c73efb3850dd35390feb1de3296f49877bfee0392eb5d3 + version: 3.0.3 + resolution: "fast-uri@npm:3.0.3" + checksum: 4b2c5ce681a062425eae4f15cdc8fc151fd310b2f69b1f96680677820a8b49c3cd6e80661a406e19d50f0c40a3f8bffdd458791baf66f4a879d80be28e10a320 languageName: node linkType: hard @@ -4734,6 +5684,15 @@ __metadata: languageName: node linkType: hard +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" + dependencies: + flat-cache: "npm:^4.0.0" + checksum: 9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 + languageName: node + linkType: hard + "filelist@npm:^1.0.4": version: 1.0.4 resolution: "filelist@npm:1.0.4" @@ -4752,18 +5711,18 @@ __metadata: languageName: node linkType: hard -"finalhandler@npm:1.2.0": - version: 1.2.0 - resolution: "finalhandler@npm:1.2.0" +"finalhandler@npm:1.3.1": + version: 1.3.1 + resolution: "finalhandler@npm:1.3.1" dependencies: debug: "npm:2.6.9" - encodeurl: "npm:~1.0.2" + encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" on-finished: "npm:2.4.1" parseurl: "npm:~1.3.3" statuses: "npm:2.0.1" unpipe: "npm:~1.0.0" - checksum: 64b7e5ff2ad1fcb14931cd012651631b721ce657da24aedb5650ddde9378bf8e95daa451da43398123f5de161a81e79ff5affe4f9f2a6d2df4a813d6d3e254b7 + checksum: d38035831865a49b5610206a3a9a9aae4e8523cbbcd01175d0480ffbf1278c47f11d89be3ca7f617ae6d94f29cf797546a4619cd84dd109009ef33f12f69019f languageName: node linkType: hard @@ -4798,6 +5757,16 @@ __metadata: languageName: node linkType: hard +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" + dependencies: + flatted: "npm:^3.2.9" + keyv: "npm:^4.5.4" + checksum: 2c59d93e9faa2523e4fda6b4ada749bed432cfa28c8e251f33b25795e426a1c6dbada777afb1f74fcfff33934fdbdea921ee738fcc33e71adc9d6eca984a1cfc + languageName: node + linkType: hard + "flat@npm:^5.0.2": version: 5.0.2 resolution: "flat@npm:5.0.2" @@ -4808,19 +5777,19 @@ __metadata: linkType: hard "flatted@npm:^3.2.9": - version: 3.3.1 - resolution: "flatted@npm:3.3.1" - checksum: 324166b125ee07d4ca9bcf3a5f98d915d5db4f39d711fba640a3178b959919aae1f7cfd8aabcfef5826ed8aa8a2aa14cc85b2d7d18ff638ddf4ae3df39573eaf + version: 3.3.2 + resolution: "flatted@npm:3.3.2" + checksum: 24cc735e74d593b6c767fe04f2ef369abe15b62f6906158079b9874bdb3ee5ae7110bb75042e70cd3f99d409d766f357caf78d5ecee9780206f5fdc5edbad334 languageName: node linkType: hard "follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.6": - version: 1.15.6 - resolution: "follow-redirects@npm:1.15.6" + version: 1.15.9 + resolution: "follow-redirects@npm:1.15.9" peerDependenciesMeta: debug: optional: true - checksum: 9ff767f0d7be6aa6870c82ac79cf0368cd73e01bbc00e9eb1c2a16fbb198ec105e3c9b6628bb98e9f3ac66fe29a957b9645bcb9a490bb7aa0d35f908b6b85071 + checksum: 5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f languageName: node linkType: hard @@ -4844,13 +5813,13 @@ __metadata: linkType: hard "form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" + version: 4.0.1 + resolution: "form-data@npm:4.0.1" dependencies: asynckit: "npm:^0.4.0" combined-stream: "npm:^1.0.8" mime-types: "npm:^2.1.12" - checksum: cb6f3ac49180be03ff07ba3ff125f9eba2ff0b277fb33c7fc47569fc5e616882c5b1c69b9904c4c4187e97dd0419dd03b134174756f296dec62041e6527e2c6e + checksum: bb102d570be8592c23f4ea72d7df9daa50c7792eb0cf1c5d7e506c1706e7426a4e4ae48a35b109e91c85f1c0ec63774a21ae252b66f4eb981cb8efef7d0463c8 languageName: node linkType: hard @@ -5022,16 +5991,9 @@ __metadata: linkType: hard "get-east-asian-width@npm:^1.0.0": - version: 1.2.0 - resolution: "get-east-asian-width@npm:1.2.0" - checksum: 914b1e217cf38436c24b4c60b4c45289e39a45bf9e65ef9fd343c2815a1a02b8a0215aeec8bf9c07c516089004b6e3826332481f40a09529fcadbf6e579f286b - languageName: node - linkType: hard - -"get-func-name@npm:^2.0.1": - version: 2.0.2 - resolution: "get-func-name@npm:2.0.2" - checksum: 89830fd07623fa73429a711b9daecdb304386d237c71268007f788f113505ef1d4cc2d0b9680e072c5082490aec9df5d7758bf5ac6f1c37062855e8e3dc0b9df + version: 1.3.0 + resolution: "get-east-asian-width@npm:1.3.0" + checksum: 1a049ba697e0f9a4d5514c4623781c5246982bdb61082da6b5ae6c33d838e52ce6726407df285cdbb27ec1908b333cf2820989bd3e986e37bb20979437fdf34b languageName: node linkType: hard @@ -5062,13 +6024,6 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^8.0.1": - version: 8.0.1 - resolution: "get-stream@npm:8.0.1" - checksum: 5c2181e98202b9dae0bb4a849979291043e5892eb40312b47f0c22b9414fc9b28a3b6063d2375705eb24abc41ecf97894d9a51f64ff021511b504477b27b4290 - languageName: node - linkType: hard - "get-symbol-description@npm:^1.0.2": version: 1.0.2 resolution: "get-symbol-description@npm:1.0.2" @@ -5081,11 +6036,11 @@ __metadata: linkType: hard "get-tsconfig@npm:^4.7.5": - version: 4.8.0 - resolution: "get-tsconfig@npm:4.8.0" + version: 4.8.1 + resolution: "get-tsconfig@npm:4.8.1" dependencies: resolve-pkg-maps: "npm:^1.0.0" - checksum: 943721c996d9a77351aa7c07956de77baece97f997bd30f3247f46907e4b743f7b9da02c7b3692a36f0884d3724271faeb88ed1c3aca3aba2afe3f27d6c4aeb3 + checksum: 536ee85d202f604f4b5fb6be81bcd6e6d9a96846811e83e9acc6de4a04fb49506edea0e1b8cf1d5ee7af33e469916ec2809d4c5445ab8ae015a7a51fbd1572f9 languageName: node linkType: hard @@ -5160,7 +6115,21 @@ __metadata: languageName: node linkType: hard -"globalthis@npm:^1.0.3": +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: b96ff42620c9231ad468d4c58ff42afee7777ee1c963013ff8aabe095a451d0ceeb8dcd8ef4cbd64d2538cef45f787a78ba3a9574f4a634438963e334471302d + languageName: node + linkType: hard + +"globals@npm:^15.11.0": + version: 15.12.0 + resolution: "globals@npm:15.12.0" + checksum: f34e0a1845b694f45188331742af9f488b07ba7440a06e9d2039fce0386fbbfc24afdbb9846ebdccd4092d03644e43081c49eb27b30f4b88e43af156e1c1dc34 + languageName: node + linkType: hard + +"globalthis@npm:^1.0.3, globalthis@npm:^1.0.4": version: 1.0.4 resolution: "globalthis@npm:1.0.4" dependencies: @@ -5248,13 +6217,6 @@ __metadata: languageName: node linkType: hard -"has-flag@npm:^3.0.0": - version: 3.0.0 - resolution: "has-flag@npm:3.0.0" - checksum: 1c6c83b14b8b1b3c25b0727b8ba3e3b647f99e9e6e13eb7322107261de07a4c1be56fc0d45678fc376e09772a3a1642ccdaf8fc69bdf123b6c086598397ce473 - languageName: node - linkType: hard - "has-flag@npm:^4.0.0": version: 4.0.0 resolution: "has-flag@npm:4.0.0" @@ -5294,6 +6256,37 @@ __metadata: languageName: node linkType: hard +"hash-base@npm:^3.0.0": + version: 3.1.0 + resolution: "hash-base@npm:3.1.0" + dependencies: + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.6.0" + safe-buffer: "npm:^5.2.0" + checksum: 663eabcf4173326fbb65a1918a509045590a26cc7e0964b754eef248d281305c6ec9f6b31cb508d02ffca383ab50028180ce5aefe013e942b44a903ac8dc80d0 + languageName: node + linkType: hard + +"hash-base@npm:~3.0, hash-base@npm:~3.0.4": + version: 3.0.4 + resolution: "hash-base@npm:3.0.4" + dependencies: + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + checksum: a13357dccb3827f0bb0b56bf928da85c428dc8670f6e4a1c7265e4f1653ce02d69030b40fd01b0f1d218a995a066eea279cded9cec72d207b593bcdfe309c2f0 + languageName: node + linkType: hard + +"hash.js@npm:^1.0.0, hash.js@npm:^1.0.3": + version: 1.1.7 + resolution: "hash.js@npm:1.1.7" + dependencies: + inherits: "npm:^2.0.3" + minimalistic-assert: "npm:^1.0.1" + checksum: 41ada59494eac5332cfc1ce6b7ebdd7b88a3864a6d6b08a3ea8ef261332ed60f37f10877e0c825aaa4bddebf164fbffa618286aeeec5296675e2671cbfa746c4 + languageName: node + linkType: hard + "hasown@npm:^2.0.0, hasown@npm:^2.0.1, hasown@npm:^2.0.2": version: 2.0.2 resolution: "hasown@npm:2.0.2" @@ -5319,6 +6312,17 @@ __metadata: languageName: node linkType: hard +"hmac-drbg@npm:^1.0.1": + version: 1.0.1 + resolution: "hmac-drbg@npm:1.0.1" + dependencies: + hash.js: "npm:^1.0.3" + minimalistic-assert: "npm:^1.0.0" + minimalistic-crypto-utils: "npm:^1.0.1" + checksum: f3d9ba31b40257a573f162176ac5930109816036c59a09f901eb2ffd7e5e705c6832bedfff507957125f2086a0ab8f853c0df225642a88bf1fcaea945f20600d + languageName: node + linkType: hard + "hoist-non-react-statics@npm:^3.3.0": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" @@ -5372,8 +6376,8 @@ __metadata: linkType: hard "html-webpack-plugin@npm:^5.6.0": - version: 5.6.0 - resolution: "html-webpack-plugin@npm:5.6.0" + version: 5.6.3 + resolution: "html-webpack-plugin@npm:5.6.3" dependencies: "@types/html-minifier-terser": "npm:^6.0.0" html-minifier-terser: "npm:^6.0.2" @@ -5388,7 +6392,7 @@ __metadata: optional: true webpack: optional: true - checksum: 50d1a0f90d512463ea8d798985d91a7ccc9d5e461713dedb240125b2ff0671f58135dd9355f7969af341ff4725e73b2defbc0984cfdce930887a48506d970002 + checksum: 25a21f83a8823d3711396dd8050bc0080c0ae55537352d432903eff58a7d9838fc811e3c26462419036190720357e67c7977efd106fb9a252770632824f0cc25 languageName: node linkType: hard @@ -5461,8 +6465,8 @@ __metadata: linkType: hard "http-proxy-middleware@npm:^2.0.3": - version: 2.0.6 - resolution: "http-proxy-middleware@npm:2.0.6" + version: 2.0.7 + resolution: "http-proxy-middleware@npm:2.0.7" dependencies: "@types/http-proxy": "npm:^1.17.8" http-proxy: "npm:^1.18.1" @@ -5474,7 +6478,7 @@ __metadata: peerDependenciesMeta: "@types/express": optional: true - checksum: 25a0e550dd1900ee5048a692e0e9b2b6339d06d487a705d90c47e359e9c6561d648cd7862d001d090e651c9efffa1b6e5160fcf1f299b5fa4935f76e9754eb11 + checksum: 8d00a61eb215b83826460b07489d8bb095368ec16e02a9d63e228dcf7524e7c20d61561e5476de1391aecd4ec32ea093279cdc972115b311f8e0a95a24c9e47e languageName: node linkType: hard @@ -5489,6 +6493,13 @@ __metadata: languageName: node linkType: hard +"https-browserify@npm:^1.0.0": + version: 1.0.0 + resolution: "https-browserify@npm:1.0.0" + checksum: e17b6943bc24ea9b9a7da5714645d808670af75a425f29baffc3284962626efdc1eb3aa9bbffaa6e64028a6ad98af5b09fabcb454a8f918fb686abfdc9e9b8ae + languageName: node + linkType: hard + "https-proxy-agent@npm:5.0.0": version: 5.0.0 resolution: "https-proxy-agent@npm:5.0.0" @@ -5516,10 +6527,10 @@ __metadata: languageName: node linkType: hard -"human-signals@npm:^5.0.0": - version: 5.0.0 - resolution: "human-signals@npm:5.0.0" - checksum: 5a9359073fe17a8b58e5a085e9a39a950366d9f00217c4ff5878bd312e09d80f460536ea6a3f260b5943a01fe55c158d1cea3fc7bee3d0520aeef04f6d915c82 +"hyperdyperid@npm:^1.2.0": + version: 1.2.0 + resolution: "hyperdyperid@npm:1.2.0" + checksum: 885ba3177c7181d315a856ee9c0005ff8eb5dcb1ce9e9d61be70987895d934d84686c37c981cceeb53216d4c9c15c1cc25f1804e84cc6a74a16993c5d7fd0893 languageName: node linkType: hard @@ -5550,14 +6561,21 @@ __metadata: languageName: node linkType: hard -"ieee754@npm:^1.2.1": +"idb@npm:^8.0.0": + version: 8.0.0 + resolution: "idb@npm:8.0.0" + checksum: d27547e03939d3d269cea38c3d4528569621ec134c717ebfc1ff816dce18e4f77372dba1d930384a9949ac56dc600e3790f98f1812a4164004e71fec302ee491 + languageName: node + linkType: hard + +"ieee754@npm:^1.1.13, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" checksum: b0782ef5e0935b9f12883a2e2aa37baa75da6e66ce6515c168697b42160807d9330de9a32ec1ed73149aea02e0d822e572bca6f1e22bdcbd2149e13b050b17bb languageName: node linkType: hard -"ignore@npm:^5.2.0, ignore@npm:^5.2.4": +"ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": version: 5.3.2 resolution: "ignore@npm:5.3.2" checksum: f9f652c957983634ded1e7f02da3b559a0d4cc210fca3792cb67f1b153623c9c42efdc1c4121af171e295444459fc4a9201101fb041b1104a3c000bccb188337 @@ -5610,7 +6628,7 @@ __metadata: languageName: node linkType: hard -"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:~2.0.3, inherits@npm:~2.0.4": +"inherits@npm:2, inherits@npm:2.0.4, inherits@npm:^2.0.1, inherits@npm:^2.0.3, inherits@npm:^2.0.4, inherits@npm:~2.0.3, inherits@npm:~2.0.4": version: 2.0.4 resolution: "inherits@npm:2.0.4" checksum: 4e531f648b29039fb7426fb94075e6545faa1eb9fe83c29f0b6d9e7263aceb4289d2d4557db0d428188eeb449cc7c5e77b0a0b2c4e248ff2a65933a0dee49ef2 @@ -5700,6 +6718,15 @@ __metadata: languageName: node linkType: hard +"is-async-function@npm:^2.0.0": + version: 2.0.0 + resolution: "is-async-function@npm:2.0.0" + dependencies: + has-tostringtag: "npm:^1.0.0" + checksum: 787bc931576aad525d751fc5ce211960fe91e49ac84a5c22d6ae0bc9541945fbc3f686dc590c3175722ce4f6d7b798a93f6f8ff4847fdb2199aea6f4baf5d668 + languageName: node + linkType: hard + "is-bigint@npm:^1.0.1": version: 1.0.4 resolution: "is-bigint@npm:1.0.4" @@ -5729,11 +6756,11 @@ __metadata: linkType: hard "is-bun-module@npm:^1.0.2": - version: 1.1.0 - resolution: "is-bun-module@npm:1.1.0" + version: 1.2.1 + resolution: "is-bun-module@npm:1.2.1" dependencies: semver: "npm:^7.6.3" - checksum: 17cae968c3fe08e2bd66f8477e4d5a166d6299b5e7ce5c7558355551c50267f77dd386297fada6b68e4a32f01ce8920b0423e4d258242ea463b45901ec474beb + checksum: 819e63cd4468265a3e89cdc241554e37aeb85e40375a56dd559c022f4395491273267a0f843274fda6cad1eac3b0f8dc6d9e06cc349e33e2bf45098761184736 languageName: node linkType: hard @@ -5762,7 +6789,7 @@ __metadata: languageName: node linkType: hard -"is-date-object@npm:^1.0.1": +"is-date-object@npm:^1.0.1, is-date-object@npm:^1.0.5": version: 1.0.5 resolution: "is-date-object@npm:1.0.5" dependencies: @@ -5787,6 +6814,15 @@ __metadata: languageName: node linkType: hard +"is-finalizationregistry@npm:^1.0.2": + version: 1.0.2 + resolution: "is-finalizationregistry@npm:1.0.2" + dependencies: + call-bind: "npm:^1.0.2" + checksum: 81caecc984d27b1a35c68741156fc651fb1fa5e3e6710d21410abc527eb226d400c0943a167922b2e920f6b3e58b0dede9aa795882b038b85f50b3a4b877db86 + languageName: node + linkType: hard + "is-fullwidth-code-point@npm:^3.0.0": version: 3.0.0 resolution: "is-fullwidth-code-point@npm:3.0.0" @@ -5801,7 +6837,7 @@ __metadata: languageName: node linkType: hard -"is-generator-function@npm:^1.0.7": +"is-generator-function@npm:^1.0.10, is-generator-function@npm:^1.0.7": version: 1.0.10 resolution: "is-generator-function@npm:1.0.10" dependencies: @@ -5833,6 +6869,13 @@ __metadata: languageName: node linkType: hard +"is-map@npm:^2.0.3": + version: 2.0.3 + resolution: "is-map@npm:2.0.3" + checksum: 2c4d431b74e00fdda7162cd8e4b763d6f6f217edf97d4f8538b94b8702b150610e2c64961340015fe8df5b1fcee33ccd2e9b62619c4a8a3a155f8de6d6d355fc + languageName: node + linkType: hard + "is-nan@npm:^1.3.2": version: 1.3.2 resolution: "is-nan@npm:1.3.2" @@ -5906,6 +6949,13 @@ __metadata: languageName: node linkType: hard +"is-set@npm:^2.0.3": + version: 2.0.3 + resolution: "is-set@npm:2.0.3" + checksum: f73732e13f099b2dc879c2a12341cfc22ccaca8dd504e6edae26484bd5707a35d503fba5b4daad530a9b088ced1ae6c9d8200fd92e09b428fe14ea79ce8080b7 + languageName: node + linkType: hard + "is-shared-array-buffer@npm:^1.0.2, is-shared-array-buffer@npm:^1.0.3": version: 1.0.3 resolution: "is-shared-array-buffer@npm:1.0.3" @@ -5922,13 +6972,6 @@ __metadata: languageName: node linkType: hard -"is-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "is-stream@npm:3.0.0" - checksum: eb2f7127af02ee9aa2a0237b730e47ac2de0d4e76a4a905a50a11557f2339df5765eaea4ceb8029f1efa978586abe776908720bfcb1900c20c6ec5145f6f29d8 - languageName: node - linkType: hard - "is-string@npm:^1.0.5, is-string@npm:^1.0.7": version: 1.0.7 resolution: "is-string@npm:1.0.7" @@ -5964,9 +7007,16 @@ __metadata: linkType: hard "is-unicode-supported@npm:^2.0.0": - version: 2.0.0 - resolution: "is-unicode-supported@npm:2.0.0" - checksum: 3013dfb8265fe9f9a0d1e9433fc4e766595631a8d85d60876c457b4bedc066768dab1477c553d02e2f626d88a4e019162706e04263c94d74994ef636a33b5f94 + version: 2.1.0 + resolution: "is-unicode-supported@npm:2.1.0" + checksum: a0f53e9a7c1fdbcf2d2ef6e40d4736fdffff1c9f8944c75e15425118ff3610172c87bf7bc6c34d3903b04be59790bb2212ddbe21ee65b5a97030fc50370545a5 + languageName: node + linkType: hard + +"is-weakmap@npm:^2.0.2": + version: 2.0.2 + resolution: "is-weakmap@npm:2.0.2" + checksum: 443c35bb86d5e6cc5929cd9c75a4024bb0fff9586ed50b092f94e700b89c43a33b186b76dbc6d54f3d3d09ece689ab38dcdc1af6a482cbe79c0f2da0a17f1299 languageName: node linkType: hard @@ -5979,6 +7029,16 @@ __metadata: languageName: node linkType: hard +"is-weakset@npm:^2.0.3": + version: 2.0.3 + resolution: "is-weakset@npm:2.0.3" + dependencies: + call-bind: "npm:^1.0.7" + get-intrinsic: "npm:^1.2.4" + checksum: 8ad6141b6a400e7ce7c7442a13928c676d07b1f315ab77d9912920bf5f4170622f43126f111615788f26c3b1871158a6797c862233124507db0bcc33a9537d1a + languageName: node + linkType: hard + "is-wsl@npm:^2.2.0": version: 2.2.0 resolution: "is-wsl@npm:2.2.0" @@ -6023,6 +7083,13 @@ __metadata: languageName: node linkType: hard +"isomorphic-timers-promises@npm:^1.0.1": + version: 1.0.1 + resolution: "isomorphic-timers-promises@npm:1.0.1" + checksum: 3b4761d0012ebe6b6382246079fc667f3513f36fe4042638f2bfb7db1557e4f1acd33a9c9907706c04270890ec6434120f132f3f300161a42a7dd8628926c8a4 + languageName: node + linkType: hard + "istanbul-lib-coverage@npm:^3.0.0, istanbul-lib-coverage@npm:^3.2.0": version: 3.2.2 resolution: "istanbul-lib-coverage@npm:3.2.2" @@ -6618,12 +7685,12 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^2.5.1": - version: 2.5.2 - resolution: "jsesc@npm:2.5.2" +"jsesc@npm:^3.0.2": + version: 3.0.2 + resolution: "jsesc@npm:3.0.2" bin: jsesc: bin/jsesc - checksum: dbf59312e0ebf2b4405ef413ec2b25abb5f8f4d9bc5fb8d9f90381622ebca5f2af6a6aa9a8578f65903f9e33990a6dc798edd0ce5586894bf0e9e31803a1de88 + checksum: ef22148f9e793180b14d8a145ee6f9f60f301abf443288117b4b6c53d0ecd58354898dc506ccbb553a5f7827965cd38bc5fb726575aae93c5e8915e2de8290e1 languageName: node linkType: hard @@ -6695,7 +7762,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.3": +"keyv@npm:^4.5.3, keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -6719,12 +7786,12 @@ __metadata: linkType: hard "launch-editor@npm:^2.6.0": - version: 2.8.2 - resolution: "launch-editor@npm:2.8.2" + version: 2.9.1 + resolution: "launch-editor@npm:2.9.1" dependencies: picocolors: "npm:^1.0.0" shell-quote: "npm:^1.8.1" - checksum: 61f5465b2f4bc9fe88f29248a38e5e1c1e17eb7c85a8a2fa12f661fed5aabb9dfab2c55e4203a94c7768c2c67b5061e116cdadf54f56a9f2a3ae5beca42ea997 + checksum: 891f1d136ed8e4ea12e16c196a0d2e07f23c7b983e3ab532b2be1775fb244909581507cce97c50f9d5ca92680b53e4a75c72ddcf20184aa6c4da6ebbe87703f5 languageName: node linkType: hard @@ -6752,6 +7819,41 @@ __metadata: languageName: node linkType: hard +"lmdb@npm:^3.0.6": + version: 3.1.6 + resolution: "lmdb@npm:3.1.6" + dependencies: + "@lmdb/lmdb-darwin-arm64": "npm:3.1.6" + "@lmdb/lmdb-darwin-x64": "npm:3.1.6" + "@lmdb/lmdb-linux-arm": "npm:3.1.6" + "@lmdb/lmdb-linux-arm64": "npm:3.1.6" + "@lmdb/lmdb-linux-x64": "npm:3.1.6" + "@lmdb/lmdb-win32-x64": "npm:3.1.6" + msgpackr: "npm:^1.11.2" + node-addon-api: "npm:^6.1.0" + node-gyp: "npm:latest" + node-gyp-build-optional-packages: "npm:5.2.2" + ordered-binary: "npm:^1.5.3" + weak-lru-cache: "npm:^1.2.2" + dependenciesMeta: + "@lmdb/lmdb-darwin-arm64": + optional: true + "@lmdb/lmdb-darwin-x64": + optional: true + "@lmdb/lmdb-linux-arm": + optional: true + "@lmdb/lmdb-linux-arm64": + optional: true + "@lmdb/lmdb-linux-x64": + optional: true + "@lmdb/lmdb-win32-x64": + optional: true + bin: + download-lmdb-prebuilds: bin/download-prebuilds.js + checksum: 081804f72aab6eb0f712654e3bbb2d454dd455bbfe09f223e10728971f201cfc166d4d6dd6a3099aabf79e4fd62e9c2a5eb9117bd5f2153ec5a419333f69a338 + languageName: node + linkType: hard + "loader-runner@npm:^4.2.0": version: 4.3.0 resolution: "loader-runner@npm:4.3.0" @@ -6826,12 +7928,10 @@ __metadata: languageName: node linkType: hard -"loupe@npm:^3.1.0, loupe@npm:^3.1.1": - version: 3.1.1 - resolution: "loupe@npm:3.1.1" - dependencies: - get-func-name: "npm:^2.0.1" - checksum: 99f88badc47e894016df0c403de846fedfea61154aadabbf776c8428dd59e8d8378007135d385d737de32ae47980af07d22ba7bec5ef7beebd721de9baa0a0af +"loupe@npm:^3.1.0, loupe@npm:^3.1.2": + version: 3.1.2 + resolution: "loupe@npm:3.1.2" + checksum: b13c02e3ddd6a9d5f8bf84133b3242de556512d824dddeea71cce2dbd6579c8f4d672381c4e742d45cf4423d0701765b4a6e5fbc24701def16bc2b40f8daa96a languageName: node linkType: hard @@ -6860,12 +7960,12 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.10": - version: 0.30.11 - resolution: "magic-string@npm:0.30.11" +"magic-string@npm:^0.30.12, magic-string@npm:^0.30.3": + version: 0.30.13 + resolution: "magic-string@npm:0.30.13" dependencies: "@jridgewell/sourcemap-codec": "npm:^1.5.0" - checksum: b9eb370773d0bd90ca11a848753409d8e5309b1ad56d2a1aa49d6649da710a6d2fe7237ad1a643c5a5d3800de2b9946ed9690acdfc00e6cc1aeafff3ab1752c4 + checksum: a275faeca1564c545019b4742c38a42ca80226c8c9e0805c32d1a1cc58b0e6ff7bbd914ed885fd10043858a7da0f732cb8f49c8975c3ecebde9cad4b57db5115 languageName: node linkType: hard @@ -6914,6 +8014,17 @@ __metadata: languageName: node linkType: hard +"md5.js@npm:^1.3.4": + version: 1.3.5 + resolution: "md5.js@npm:1.3.5" + dependencies: + hash-base: "npm:^3.0.0" + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: b7bd75077f419c8e013fc4d4dada48be71882e37d69a44af65a2f2804b91e253441eb43a0614423a1c91bb830b8140b0dc906bc797245e2e275759584f4efcc5 + languageName: node + linkType: hard + "media-typer@npm:0.3.0": version: 0.3.0 resolution: "media-typer@npm:0.3.0" @@ -6930,10 +8041,22 @@ __metadata: languageName: node linkType: hard -"merge-descriptors@npm:1.0.1": - version: 1.0.1 - resolution: "merge-descriptors@npm:1.0.1" - checksum: b67d07bd44cfc45cebdec349bb6e1f7b077ee2fd5beb15d1f7af073849208cb6f144fe403e29a36571baf3f4e86469ac39acf13c318381e958e186b2766f54ec +"memfs@npm:^4.14.0": + version: 4.14.0 + resolution: "memfs@npm:4.14.0" + dependencies: + "@jsonjoy.com/json-pack": "npm:^1.0.3" + "@jsonjoy.com/util": "npm:^1.3.0" + tree-dump: "npm:^1.0.1" + tslib: "npm:^2.0.0" + checksum: d1de2e4b3c269f5b5f27b63f60bb8ea9ae5800843776e0bed4548f2957dcd55237ac5eab3a5ffe0d561a6be53e42c055a7bc79efc1613563b14e14c287ef3b0a + languageName: node + linkType: hard + +"merge-descriptors@npm:1.0.3": + version: 1.0.3 + resolution: "merge-descriptors@npm:1.0.3" + checksum: 866b7094afd9293b5ea5dcd82d71f80e51514bed33b4c4e9f516795dc366612a4cbb4dc94356e943a8a6914889a914530badff27f397191b9b75cda20b6bae93 languageName: node linkType: hard @@ -6968,6 +8091,18 @@ __metadata: languageName: node linkType: hard +"miller-rabin@npm:^4.0.0": + version: 4.0.1 + resolution: "miller-rabin@npm:4.0.1" + dependencies: + bn.js: "npm:^4.0.0" + brorand: "npm:^1.0.1" + bin: + miller-rabin: bin/miller-rabin + checksum: 26b2b96f6e49dbcff7faebb78708ed2f5f9ae27ac8cbbf1d7c08f83cf39bed3d418c0c11034dce997da70d135cc0ff6f3a4c15dc452f8e114c11986388a64346 + languageName: node + linkType: hard + "mime-db@npm:1.52.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" @@ -7023,13 +8158,6 @@ __metadata: languageName: node linkType: hard -"mimic-fn@npm:^4.0.0": - version: 4.0.0 - resolution: "mimic-fn@npm:4.0.0" - checksum: de9cc32be9996fd941e512248338e43407f63f6d497abe8441fa33447d922e927de54d4cc3c1a3c6d652857acd770389d5a3823f311a744132760ce2be15ccbf - languageName: node - linkType: hard - "mimic-function@npm:^5.0.0": version: 5.0.1 resolution: "mimic-function@npm:5.0.1" @@ -7037,13 +8165,20 @@ __metadata: languageName: node linkType: hard -"minimalistic-assert@npm:^1.0.0": +"minimalistic-assert@npm:^1.0.0, minimalistic-assert@npm:^1.0.1": version: 1.0.1 resolution: "minimalistic-assert@npm:1.0.1" checksum: 96730e5601cd31457f81a296f521eb56036e6f69133c0b18c13fe941109d53ad23a4204d946a0d638d7f3099482a0cec8c9bb6d642604612ce43ee536be3dddd languageName: node linkType: hard +"minimalistic-crypto-utils@npm:^1.0.1": + version: 1.0.1 + resolution: "minimalistic-crypto-utils@npm:1.0.1" + checksum: 790ecec8c5c73973a4fbf2c663d911033e8494d5fb0960a4500634766ab05d6107d20af896ca2132e7031741f19888154d44b2408ada0852446705441383e9f8 + languageName: node + linkType: hard + "minimatch@npm:3.1.2, minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -7194,20 +8329,56 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: a437714e2f90dbf881b5191d35a6db792efbca5badf112f87b9e1c712aace4b4b9b742dd6537f3edf90fd6f684de897cec230abde57e87883766712ddda297cc - languageName: node - linkType: hard - -"ms@npm:2.1.3, ms@npm:^2.1.1": +"ms@npm:2.1.3, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: d924b57e7312b3b63ad21fc5b3dc0af5e78d61a1fc7cfb5457edaf26326bf62be5307cc87ffb6862ef1c2b33b0233cdb5d4f01c4c958cc0d660948b65a287a48 languageName: node linkType: hard +"msgpackr-extract@npm:^3.0.2": + version: 3.0.3 + resolution: "msgpackr-extract@npm:3.0.3" + dependencies: + "@msgpackr-extract/msgpackr-extract-darwin-arm64": "npm:3.0.3" + "@msgpackr-extract/msgpackr-extract-darwin-x64": "npm:3.0.3" + "@msgpackr-extract/msgpackr-extract-linux-arm": "npm:3.0.3" + "@msgpackr-extract/msgpackr-extract-linux-arm64": "npm:3.0.3" + "@msgpackr-extract/msgpackr-extract-linux-x64": "npm:3.0.3" + "@msgpackr-extract/msgpackr-extract-win32-x64": "npm:3.0.3" + node-gyp: "npm:latest" + node-gyp-build-optional-packages: "npm:5.2.2" + dependenciesMeta: + "@msgpackr-extract/msgpackr-extract-darwin-arm64": + optional: true + "@msgpackr-extract/msgpackr-extract-darwin-x64": + optional: true + "@msgpackr-extract/msgpackr-extract-linux-arm": + optional: true + "@msgpackr-extract/msgpackr-extract-linux-arm64": + optional: true + "@msgpackr-extract/msgpackr-extract-linux-x64": + optional: true + "@msgpackr-extract/msgpackr-extract-win32-x64": + optional: true + bin: + download-msgpackr-prebuilds: bin/download-prebuilds.js + checksum: e504fd8bf86a29d7527c83776530ee6dc92dcb0273bb3679fd4a85173efead7f0ee32fb82c8410a13c33ef32828c45f81118ffc0fbed5d6842e72299894623b4 + languageName: node + linkType: hard + +"msgpackr@npm:^1.11.2": + version: 1.11.2 + resolution: "msgpackr@npm:1.11.2" + dependencies: + msgpackr-extract: "npm:^3.0.2" + dependenciesMeta: + msgpackr-extract: + optional: true + checksum: 7d2e81ca82c397b2352d470d6bc8f4a967fe4fe14f8fc1fc9906b23009fdfb543999b1ad29c700b8861581e0b6bf903d6f0fefb69a09375cbca6d4d802e6c906 + languageName: node + linkType: hard + "multicast-dns@npm:^7.2.5": version: 7.2.5 resolution: "multicast-dns@npm:7.2.5" @@ -7243,13 +8414,20 @@ __metadata: languageName: node linkType: hard -"negotiator@npm:0.6.3, negotiator@npm:^0.6.3": +"negotiator@npm:0.6.3": version: 0.6.3 resolution: "negotiator@npm:0.6.3" checksum: 3ec9fd413e7bf071c937ae60d572bc67155262068ed522cf4b3be5edbe6ddf67d095ec03a3a14ebf8fc8e95f8e1d61be4869db0dbb0de696f6b837358bd43fc2 languageName: node linkType: hard +"negotiator@npm:^0.6.3, negotiator@npm:~0.6.4": + version: 0.6.4 + resolution: "negotiator@npm:0.6.4" + checksum: 3e677139c7fb7628a6f36335bf11a885a62c21d5390204590a1a214a5631fcbe5ea74ef6a610b60afe84b4d975cbe0566a23f20ee17c77c73e74b80032108dea + languageName: node + linkType: hard + "neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" @@ -7267,6 +8445,15 @@ __metadata: languageName: node linkType: hard +"node-addon-api@npm:^6.1.0": + version: 6.1.0 + resolution: "node-addon-api@npm:6.1.0" + dependencies: + node-gyp: "npm:latest" + checksum: d2699c4ad15740fd31482a3b6fca789af7723ab9d393adc6ac45250faaee72edad8f0b10b2b9d087df0de93f1bdc16d97afdd179b26b9ebc9ed68b569faa4bac + languageName: node + linkType: hard + "node-forge@npm:^1": version: 1.3.1 resolution: "node-forge@npm:1.3.1" @@ -7274,6 +8461,19 @@ __metadata: languageName: node linkType: hard +"node-gyp-build-optional-packages@npm:5.2.2": + version: 5.2.2 + resolution: "node-gyp-build-optional-packages@npm:5.2.2" + dependencies: + detect-libc: "npm:^2.0.1" + bin: + node-gyp-build-optional-packages: bin.js + node-gyp-build-optional-packages-optional: optional.js + node-gyp-build-optional-packages-test: build-test.js + checksum: c81128c6f91873381be178c5eddcbdf66a148a6a89a427ce2bcd457593ce69baf2a8662b6d22cac092d24aa9c43c230dec4e69b3a0da604503f4777cd77e282b + languageName: node + linkType: hard + "node-gyp@npm:latest": version: 10.2.0 resolution: "node-gyp@npm:10.2.0" @@ -7308,6 +8508,41 @@ __metadata: languageName: node linkType: hard +"node-stdlib-browser@npm:^1.2.0, node-stdlib-browser@npm:^1.3.0": + version: 1.3.0 + resolution: "node-stdlib-browser@npm:1.3.0" + dependencies: + assert: "npm:^2.0.0" + browser-resolve: "npm:^2.0.0" + browserify-zlib: "npm:^0.2.0" + buffer: "npm:^5.7.1" + console-browserify: "npm:^1.1.0" + constants-browserify: "npm:^1.0.0" + create-require: "npm:^1.1.1" + crypto-browserify: "npm:^3.11.0" + domain-browser: "npm:4.22.0" + events: "npm:^3.0.0" + https-browserify: "npm:^1.0.0" + isomorphic-timers-promises: "npm:^1.0.1" + os-browserify: "npm:^0.3.0" + path-browserify: "npm:^1.0.1" + pkg-dir: "npm:^5.0.0" + process: "npm:^0.11.10" + punycode: "npm:^1.4.1" + querystring-es3: "npm:^0.2.1" + readable-stream: "npm:^3.6.0" + stream-browserify: "npm:^3.0.0" + stream-http: "npm:^3.2.0" + string_decoder: "npm:^1.0.0" + timers-browserify: "npm:^2.0.4" + tty-browserify: "npm:0.0.1" + url: "npm:^0.11.4" + util: "npm:^0.12.4" + vm-browserify: "npm:^1.0.1" + checksum: e617f92f6af5a031fb9e670a04e1cf5d74e09ac46e182c784c5d5fff44c36d47f208ac01f267ec75d83c125a30e2c006090f676cd71d35e99a4c8a196a90cfff + languageName: node + linkType: hard + "nopt@npm:^7.0.0": version: 7.2.1 resolution: "nopt@npm:7.2.1" @@ -7342,15 +8577,6 @@ __metadata: languageName: node linkType: hard -"npm-run-path@npm:^5.1.0": - version: 5.3.0 - resolution: "npm-run-path@npm:5.3.0" - dependencies: - path-key: "npm:^4.0.0" - checksum: 124df74820c40c2eb9a8612a254ea1d557ddfab1581c3e751f825e3e366d9f00b0d76a3c94ecd8398e7f3eee193018622677e95816e8491f0797b21e30b2deba - languageName: node - linkType: hard - "nth-check@npm:^2.0.1": version: 2.1.1 resolution: "nth-check@npm:2.1.1" @@ -7360,10 +8586,10 @@ __metadata: languageName: node linkType: hard -"object-inspect@npm:^1.13.1": - version: 1.13.2 - resolution: "object-inspect@npm:1.13.2" - checksum: b97835b4c91ec37b5fd71add84f21c3f1047d1d155d00c0fcd6699516c256d4fcc6ff17a1aced873197fe447f91a3964178fd2a67a1ee2120cdaf60e81a050b4 +"object-inspect@npm:^1.13.1, object-inspect@npm:^1.13.3": + version: 1.13.3 + resolution: "object-inspect@npm:1.13.3" + checksum: cc3f15213406be89ffdc54b525e115156086796a515410a8d390215915db9f23c8eab485a06f1297402f440a33715fe8f71a528c1dcbad6e1a3bcaf5a46921d4 languageName: node linkType: hard @@ -7478,15 +8704,6 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^6.0.0": - version: 6.0.0 - resolution: "onetime@npm:6.0.0" - dependencies: - mimic-fn: "npm:^4.0.0" - checksum: 4eef7c6abfef697dd4479345a4100c382d73c149d2d56170a54a07418c50816937ad09500e1ed1e79d235989d073a9bade8557122aee24f0576ecde0f392bb6c - languageName: node - linkType: hard - "onetime@npm:^7.0.0": version: 7.0.0 resolution: "onetime@npm:7.0.0" @@ -7522,8 +8739,8 @@ __metadata: linkType: hard "ora@npm:^8.0.1": - version: 8.1.0 - resolution: "ora@npm:8.1.0" + version: 8.1.1 + resolution: "ora@npm:8.1.1" dependencies: chalk: "npm:^5.3.0" cli-cursor: "npm:^5.0.0" @@ -7534,7 +8751,21 @@ __metadata: stdin-discarder: "npm:^0.2.2" string-width: "npm:^7.2.0" strip-ansi: "npm:^7.1.0" - checksum: 4ac9a6dd7fe915a354680f33ced21ee96d13d3c5ab0dc00b3c3ba9e3695ed141b1d045222990f5a71a9a91f801042a0b0d32e58dfc5509ff9b81efdd3fcf6339 + checksum: 996a81a9e997481339de3a7996c56131ea292c0a0e9e42d1cd454e2390f1ce7015ec925dcdd29e3d74dc5d037a4aa1877e575b491555507bcd9f219df760a63f + languageName: node + linkType: hard + +"ordered-binary@npm:^1.5.3": + version: 1.5.3 + resolution: "ordered-binary@npm:1.5.3" + checksum: 2b67c90c79071f54344762fcecac256c3c6fe02a3ce1d349c7cab38a55a6137320b13022d6dd26faac462d887f48a32e04693a3ae30592185f290c793b92de03 + languageName: node + linkType: hard + +"os-browserify@npm:^0.3.0": + version: 0.3.0 + resolution: "os-browserify@npm:0.3.0" + checksum: 6ff32cb1efe2bc6930ad0fd4c50e30c38010aee909eba8d65be60af55efd6cbb48f0287e3649b4e3f3a63dce5a667b23c187c4293a75e557f0d5489d735bcf52 languageName: node linkType: hard @@ -7601,9 +8832,16 @@ __metadata: linkType: hard "package-json-from-dist@npm:^1.0.0": - version: 1.0.0 - resolution: "package-json-from-dist@npm:1.0.0" - checksum: e3ffaf6ac1040ab6082a658230c041ad14e72fabe99076a2081bb1d5d41210f11872403fc09082daf4387fc0baa6577f96c9c0e94c90c394fd57794b66aa4033 + version: 1.0.1 + resolution: "package-json-from-dist@npm:1.0.1" + checksum: 62ba2785eb655fec084a257af34dbe24292ab74516d6aecef97ef72d4897310bc6898f6c85b5cd22770eaa1ce60d55a0230e150fb6a966e3ecd6c511e23d164b + languageName: node + linkType: hard + +"pako@npm:~1.0.5": + version: 1.0.11 + resolution: "pako@npm:1.0.11" + checksum: 86dd99d8b34c3930345b8bbeb5e1cd8a05f608eeb40967b293f72fe469d0e9c88b783a8777e4cc7dc7c91ce54c5e93d88ff4b4f060e6ff18408fd21030d9ffbe languageName: node linkType: hard @@ -7626,6 +8864,20 @@ __metadata: languageName: node linkType: hard +"parse-asn1@npm:^5.0.0, parse-asn1@npm:^5.1.7": + version: 5.1.7 + resolution: "parse-asn1@npm:5.1.7" + dependencies: + asn1.js: "npm:^4.10.1" + browserify-aes: "npm:^1.2.0" + evp_bytestokey: "npm:^1.0.3" + hash-base: "npm:~3.0" + pbkdf2: "npm:^3.1.2" + safe-buffer: "npm:^5.2.1" + checksum: 05eb5937405c904eb5a7f3633bab1acc11f4ae3478a07ef5c6d81ce88c3c0e505ff51f9c7b935ebc1265c868343793698fc91025755a895d0276f620f95e8a82 + languageName: node + linkType: hard + "parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" @@ -7655,6 +8907,13 @@ __metadata: languageName: node linkType: hard +"path-browserify@npm:^1.0.1": + version: 1.0.1 + resolution: "path-browserify@npm:1.0.1" + checksum: 8b8c3fd5c66bd340272180590ae4ff139769e9ab79522e2eb82e3d571a89b8117c04147f65ad066dccfb42fcad902e5b7d794b3d35e0fd840491a8ddbedf8c66 + languageName: node + linkType: hard + "path-exists@npm:^4.0.0": version: 4.0.0 resolution: "path-exists@npm:4.0.0" @@ -7683,13 +8942,6 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^4.0.0": - version: 4.0.0 - resolution: "path-key@npm:4.0.0" - checksum: 794efeef32863a65ac312f3c0b0a99f921f3e827ff63afa5cb09a377e202c262b671f7b3832a4e64731003fa94af0263713962d317b9887bd1e0c48a342efba3 - languageName: node - linkType: hard - "path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" @@ -7707,17 +8959,17 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:0.1.7": - version: 0.1.7 - resolution: "path-to-regexp@npm:0.1.7" - checksum: 50a1ddb1af41a9e68bd67ca8e331a705899d16fb720a1ea3a41e310480948387daf603abb14d7b0826c58f10146d49050a1291ba6a82b78a382d1c02c0b8f905 +"path-to-regexp@npm:0.1.10": + version: 0.1.10 + resolution: "path-to-regexp@npm:0.1.10" + checksum: 34196775b9113ca6df88e94c8d83ba82c0e1a2063dd33bfe2803a980da8d49b91db8104f49d5191b44ea780d46b8670ce2b7f4a5e349b0c48c6779b653f1afe4 languageName: node linkType: hard -"path-to-regexp@npm:2.2.1": - version: 2.2.1 - resolution: "path-to-regexp@npm:2.2.1" - checksum: f4b51090a73dad5ce0720f13ce8528ac77914bc927d72cc4ba05ab32770ad3a8d2e431962734b688b9ed863d4098d858da6ff4746037e4e24259cbd3b2c32b79 +"path-to-regexp@npm:3.3.0": + version: 3.3.0 + resolution: "path-to-regexp@npm:3.3.0" + checksum: ffa0ebe7088d38d435a8d08b0fe6e8c93ceb2a81a65d4dd1d9a538f52e09d5e3474ed5f553cb3b180d894b0caa10698a68737ab599fd1e56b4663d1a64c9f77b languageName: node linkType: hard @@ -7742,10 +8994,23 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1": - version: 1.1.0 - resolution: "picocolors@npm:1.1.0" - checksum: 86946f6032148801ef09c051c6fb13b5cf942eaf147e30ea79edb91dd32d700934edebe782a1078ff859fb2b816792e97ef4dab03d7f0b804f6b01a0df35e023 +"pbkdf2@npm:^3.1.2": + version: 3.1.2 + resolution: "pbkdf2@npm:3.1.2" + dependencies: + create-hash: "npm:^1.1.2" + create-hmac: "npm:^1.1.4" + ripemd160: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + sha.js: "npm:^2.4.8" + checksum: 5a30374e87d33fa080a92734d778cf172542cc7e41b96198c4c88763997b62d7850de3fbda5c3111ddf79805ee7c1da7046881c90ac4920b5e324204518b05fd + languageName: node + linkType: hard + +"picocolors@npm:^1.0.0, picocolors@npm:^1.0.1, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 languageName: node linkType: hard @@ -7756,6 +9021,13 @@ __metadata: languageName: node linkType: hard +"picomatch@npm:^4.0.2": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: 7c51f3ad2bb42c776f49ebf964c644958158be30d0a510efd5a395e8d49cb5acfed5b82c0c5b365523ce18e6ab85013c9ebe574f60305892ec3fa8eee8304ccc + languageName: node + linkType: hard + "pino-abstract-transport@npm:^1.0.0, pino-abstract-transport@npm:^1.2.0": version: 1.2.0 resolution: "pino-abstract-transport@npm:1.2.0" @@ -7834,6 +9106,15 @@ __metadata: languageName: node linkType: hard +"pkg-dir@npm:^5.0.0": + version: 5.0.0 + resolution: "pkg-dir@npm:5.0.0" + dependencies: + find-up: "npm:^5.0.0" + checksum: 793a496d685dc55bbbdbbb22d884535c3b29241e48e3e8d37e448113a71b9e42f5481a61fdc672d7322de12fbb2c584dd3a68bf89b18fffce5c48a390f911bc5 + languageName: node + linkType: hard + "playwright-core@npm:1.46.1": version: 1.46.1 resolution: "playwright-core@npm:1.46.1" @@ -7889,26 +9170,26 @@ __metadata: linkType: hard "postcss-modules-local-by-default@npm:^4.0.5": - version: 4.0.5 - resolution: "postcss-modules-local-by-default@npm:4.0.5" + version: 4.1.0 + resolution: "postcss-modules-local-by-default@npm:4.1.0" dependencies: icss-utils: "npm:^5.0.0" - postcss-selector-parser: "npm:^6.0.2" + postcss-selector-parser: "npm:^7.0.0" postcss-value-parser: "npm:^4.1.0" peerDependencies: postcss: ^8.1.0 - checksum: f4ad35abeb685ecb25f80c93d9fe23c8b89ee45ac4185f3560e701b4d7372f9b798577e79c5ed03b6d9c80bc923b001210c127c04ced781f43cda9e32b202a5b + checksum: d6e47d2488c6fcde2c91696d15ef094e6b1cdd8d5dcdf20c6ac72567fcc4778f5f80b8381839232b37242f200b4d83e98a947bf3b3315b0bf673ea42528a3caf languageName: node linkType: hard "postcss-modules-scope@npm:^3.2.0": - version: 3.2.0 - resolution: "postcss-modules-scope@npm:3.2.0" + version: 3.2.1 + resolution: "postcss-modules-scope@npm:3.2.1" dependencies: - postcss-selector-parser: "npm:^6.0.4" + postcss-selector-parser: "npm:^7.0.0" peerDependencies: postcss: ^8.1.0 - checksum: a2f5ffe372169b3feb8628cd785eb748bf12e344cfa57bce9e5cdc4fa5adcdb40d36daa86bb35dad53427703b185772aad08825b5783f745fcb1b6039454a84b + checksum: bd2d81f79e3da0ef6365b8e2c78cc91469d05b58046b4601592cdeef6c4050ed8fe1478ae000a1608042fc7e692cb51fecbd2d9bce3f4eace4d32e883ffca10b languageName: node linkType: hard @@ -7923,13 +9204,13 @@ __metadata: languageName: node linkType: hard -"postcss-selector-parser@npm:^6.0.2, postcss-selector-parser@npm:^6.0.4": - version: 6.1.2 - resolution: "postcss-selector-parser@npm:6.1.2" +"postcss-selector-parser@npm:^7.0.0": + version: 7.0.0 + resolution: "postcss-selector-parser@npm:7.0.0" dependencies: cssesc: "npm:^3.0.0" util-deprecate: "npm:^1.0.2" - checksum: 523196a6bd8cf660bdf537ad95abd79e546d54180f9afb165a4ab3e651ac705d0f8b8ce6b3164fb9e3279ce482c5f751a69eb2d3a1e8eb0fd5e82294fb3ef13e + checksum: e96e096afcce70bf5c97789f5ea09d7415ae5eb701d82b05b5e8532885d31363b484fcb1ca9488c9a331f30508d9e5bb6c3109eb2eb5067ef3d3919f9928cd9d languageName: node linkType: hard @@ -7940,14 +9221,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.29, postcss@npm:^8.4.33, postcss@npm:^8.4.41": - version: 8.4.44 - resolution: "postcss@npm:8.4.44" +"postcss@npm:^8.4.29, postcss@npm:^8.4.33, postcss@npm:^8.4.43": + version: 8.4.49 + resolution: "postcss@npm:8.4.49" dependencies: nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.1" - source-map-js: "npm:^1.2.0" - checksum: 53c33338261a3d4f4198f8893e9dfe8b828d8d9186142ee85f02d228f04245c5bbe31239411a357a556ad20ed96f28db24d0921d63edc428fdc9133289371a1d + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: f1b3f17aaf36d136f59ec373459f18129908235e65dbdc3aee5eef8eba0756106f52de5ec4682e29a2eab53eb25170e7e871b3e4b52a8f1de3d344a514306be3 languageName: node linkType: hard @@ -8069,17 +9350,31 @@ __metadata: languageName: node linkType: hard +"public-encrypt@npm:^4.0.3": + version: 4.0.3 + resolution: "public-encrypt@npm:4.0.3" + dependencies: + bn.js: "npm:^4.1.0" + browserify-rsa: "npm:^4.0.0" + create-hash: "npm:^1.1.0" + parse-asn1: "npm:^5.0.0" + randombytes: "npm:^2.0.1" + safe-buffer: "npm:^5.1.2" + checksum: 6c2cc19fbb554449e47f2175065d6b32f828f9b3badbee4c76585ac28ae8641aafb9bb107afc430c33c5edd6b05dbe318df4f7d6d7712b1093407b11c4280700 + languageName: node + linkType: hard + "pump@npm:^3.0.0": - version: 3.0.0 - resolution: "pump@npm:3.0.0" + version: 3.0.2 + resolution: "pump@npm:3.0.2" dependencies: end-of-stream: "npm:^1.1.0" once: "npm:^1.3.1" - checksum: bbdeda4f747cdf47db97428f3a135728669e56a0ae5f354a9ac5b74556556f5446a46f720a8f14ca2ece5be9b4d5d23c346db02b555f46739934cc6c093a5478 + checksum: 5ad655cb2a7738b4bcf6406b24ad0970d680649d996b55ad20d1be8e0c02394034e4c45ff7cd105d87f1e9b96a0e3d06fd28e11fae8875da26e7f7a8e2c9726f languageName: node linkType: hard -"punycode@npm:^1.3.2": +"punycode@npm:^1.4.1": version: 1.4.1 resolution: "punycode@npm:1.4.1" checksum: 354b743320518aef36f77013be6e15da4db24c2b4f62c5f1eb0529a6ed02fbaf1cb52925785f6ab85a962f2b590d9cd5ad730b70da72b5f180e2556b8bd3ca08 @@ -8100,12 +9395,28 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.11.0": - version: 6.11.0 - resolution: "qs@npm:6.11.0" +"qs@npm:6.13.0": + version: 6.13.0 + resolution: "qs@npm:6.13.0" dependencies: - side-channel: "npm:^1.0.4" - checksum: 4e4875e4d7c7c31c233d07a448e7e4650f456178b9dd3766b7cfa13158fdb24ecb8c4f059fa91e820dc6ab9f2d243721d071c9c0378892dcdad86e9e9a27c68f + side-channel: "npm:^1.0.6" + checksum: 62372cdeec24dc83a9fb240b7533c0fdcf0c5f7e0b83343edd7310f0ab4c8205a5e7c56406531f2e47e1b4878a3821d652be4192c841de5b032ca83619d8f860 + languageName: node + linkType: hard + +"qs@npm:^6.12.3": + version: 6.13.1 + resolution: "qs@npm:6.13.1" + dependencies: + side-channel: "npm:^1.0.6" + checksum: 5ef527c0d62ffca5501322f0832d800ddc78eeb00da3b906f1b260ca0492721f8cdc13ee4b8fd8ac314a6ec37b948798c7b603ccc167e954088df392092f160c + languageName: node + linkType: hard + +"querystring-es3@npm:^0.2.1": + version: 0.2.1 + resolution: "querystring-es3@npm:0.2.1" + checksum: 476938c1adb45c141f024fccd2ffd919a3746e79ed444d00e670aad68532977b793889648980e7ca7ff5ffc7bfece623118d0fbadcaf217495eeb7059ae51580 languageName: node linkType: hard @@ -8123,7 +9434,7 @@ __metadata: languageName: node linkType: hard -"randombytes@npm:^2.1.0": +"randombytes@npm:^2.0.0, randombytes@npm:^2.0.1, randombytes@npm:^2.0.5, randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" dependencies: @@ -8132,6 +9443,16 @@ __metadata: languageName: node linkType: hard +"randomfill@npm:^1.0.4": + version: 1.0.4 + resolution: "randomfill@npm:1.0.4" + dependencies: + randombytes: "npm:^2.0.5" + safe-buffer: "npm:^5.1.0" + checksum: 11aeed35515872e8f8a2edec306734e6b74c39c46653607f03c68385ab8030e2adcc4215f76b5e4598e028c4750d820afd5c65202527d831d2a5f207fe2bc87c + languageName: node + linkType: hard + "range-parser@npm:1.2.0": version: 1.2.0 resolution: "range-parser@npm:1.2.0" @@ -8172,7 +9493,7 @@ __metadata: languageName: node linkType: hard -"react-dom@npm:^18.2.0": +"react-dom@npm:^18.2.0, react-dom@npm:^18.3.1": version: 18.3.1 resolution: "react-dom@npm:18.3.1" dependencies: @@ -8205,19 +9526,19 @@ __metadata: languageName: node linkType: hard -"react-toastify@npm:^10.0.4": - version: 10.0.5 - resolution: "react-toastify@npm:10.0.5" +"react-toastify@npm:^10.0.4, react-toastify@npm:^10.0.6": + version: 10.0.6 + resolution: "react-toastify@npm:10.0.6" dependencies: clsx: "npm:^2.1.0" peerDependencies: react: ">=18" react-dom: ">=18" - checksum: 66c68ec3d6c017d9f32652d73bb925224921c6a80b629b9d481430d5b4fd504abb7a99995a64b9aef0fc31326c74f3cbe088b3287b978dd0c355079c4bbf4158 + checksum: 4042b716d008295d0feab32488d1e88ec655a1b7a9176fa7d253c70387578a8a0c04aca0ff86d20e1722f3b4baadae8970f50f462940d67a90453c307dd350a9 languageName: node linkType: hard -"react@npm:^18.2.0": +"react@npm:^18.2.0, react@npm:^18.3.1": version: 18.3.1 resolution: "react@npm:18.3.1" dependencies: @@ -8226,7 +9547,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^2.0.1": +"readable-stream@npm:^2.0.1, readable-stream@npm:^2.3.8": version: 2.3.8 resolution: "readable-stream@npm:2.3.8" dependencies: @@ -8241,7 +9562,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.0.6, readable-stream@npm:^3.5.0": +"readable-stream@npm:^3.0.6, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -8290,15 +9611,30 @@ __metadata: languageName: node linkType: hard -"regexp.prototype.flags@npm:^1.5.2": - version: 1.5.2 - resolution: "regexp.prototype.flags@npm:1.5.2" +"reflect.getprototypeof@npm:^1.0.6": + version: 1.0.6 + resolution: "reflect.getprototypeof@npm:1.0.6" dependencies: - call-bind: "npm:^1.0.6" + call-bind: "npm:^1.0.7" + define-properties: "npm:^1.2.1" + es-abstract: "npm:^1.23.1" + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.4" + globalthis: "npm:^1.0.3" + which-builtin-type: "npm:^1.1.3" + checksum: baf4ef8ee6ff341600f4720b251cf5a6cb552d6a6ab0fdc036988c451bf16f920e5feb0d46bd4f530a5cce568f1f7aca2d77447ca798920749cfc52783c39b55 + languageName: node + linkType: hard + +"regexp.prototype.flags@npm:^1.5.3": + version: 1.5.3 + resolution: "regexp.prototype.flags@npm:1.5.3" + dependencies: + call-bind: "npm:^1.0.7" define-properties: "npm:^1.2.1" es-errors: "npm:^1.3.0" - set-function-name: "npm:^2.0.1" - checksum: 0f3fc4f580d9c349f8b560b012725eb9c002f36daa0041b3fbf6f4238cb05932191a4d7d5db3b5e2caa336d5150ad0402ed2be81f711f9308fe7e1a9bf9bd552 + set-function-name: "npm:^2.0.2" + checksum: e1a7c7dc42cc91abf73e47a269c4b3a8f225321b7f617baa25821f6a123a91d23a73b5152f21872c566e699207e1135d075d2251cd3e84cc96d82a910adf6020 languageName: node linkType: hard @@ -8410,7 +9746,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.20.0, resolve@npm:^1.22.4": +"resolve@npm:^1.17.0, resolve@npm:^1.20.0, resolve@npm:^1.22.4": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -8423,7 +9759,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": +"resolve@patch:resolve@npm%3A^1.17.0#optional!builtin, resolve@patch:resolve@npm%3A^1.20.0#optional!builtin, resolve@patch:resolve@npm%3A^1.22.4#optional!builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#optional!builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -8478,27 +9814,39 @@ __metadata: languageName: node linkType: hard +"ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": + version: 2.0.2 + resolution: "ripemd160@npm:2.0.2" + dependencies: + hash-base: "npm:^3.0.0" + inherits: "npm:^2.0.1" + checksum: f6f0df78817e78287c766687aed4d5accbebc308a8e7e673fb085b9977473c1f139f0c5335d353f172a915bb288098430755d2ad3c4f30612f4dd0c901cd2c3a + languageName: node + linkType: hard + "rollup@npm:^4.20.0": - version: 4.21.2 - resolution: "rollup@npm:4.21.2" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.21.2" - "@rollup/rollup-android-arm64": "npm:4.21.2" - "@rollup/rollup-darwin-arm64": "npm:4.21.2" - "@rollup/rollup-darwin-x64": "npm:4.21.2" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.21.2" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.21.2" - "@rollup/rollup-linux-arm64-gnu": "npm:4.21.2" - "@rollup/rollup-linux-arm64-musl": "npm:4.21.2" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.21.2" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.21.2" - "@rollup/rollup-linux-s390x-gnu": "npm:4.21.2" - "@rollup/rollup-linux-x64-gnu": "npm:4.21.2" - "@rollup/rollup-linux-x64-musl": "npm:4.21.2" - "@rollup/rollup-win32-arm64-msvc": "npm:4.21.2" - "@rollup/rollup-win32-ia32-msvc": "npm:4.21.2" - "@rollup/rollup-win32-x64-msvc": "npm:4.21.2" - "@types/estree": "npm:1.0.5" + version: 4.27.3 + resolution: "rollup@npm:4.27.3" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.27.3" + "@rollup/rollup-android-arm64": "npm:4.27.3" + "@rollup/rollup-darwin-arm64": "npm:4.27.3" + "@rollup/rollup-darwin-x64": "npm:4.27.3" + "@rollup/rollup-freebsd-arm64": "npm:4.27.3" + "@rollup/rollup-freebsd-x64": "npm:4.27.3" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.27.3" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.27.3" + "@rollup/rollup-linux-arm64-gnu": "npm:4.27.3" + "@rollup/rollup-linux-arm64-musl": "npm:4.27.3" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.27.3" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.27.3" + "@rollup/rollup-linux-s390x-gnu": "npm:4.27.3" + "@rollup/rollup-linux-x64-gnu": "npm:4.27.3" + "@rollup/rollup-linux-x64-musl": "npm:4.27.3" + "@rollup/rollup-win32-arm64-msvc": "npm:4.27.3" + "@rollup/rollup-win32-ia32-msvc": "npm:4.27.3" + "@rollup/rollup-win32-x64-msvc": "npm:4.27.3" + "@types/estree": "npm:1.0.6" fsevents: "npm:~2.3.2" dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -8509,6 +9857,10 @@ __metadata: optional: true "@rollup/rollup-darwin-x64": optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true "@rollup/rollup-linux-arm-gnueabihf": optional: true "@rollup/rollup-linux-arm-musleabihf": @@ -8537,7 +9889,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: c9d97f7a21cde110371b2e890a31a996fee09b81e639e79372b962a9638ae653d2d24186b94632fc5dfab8a0582e1d0639dfe34b8b75051facd86915a9585a5f + checksum: 789885d3f852ed7ca45bed14194a2ac7a2cf16b6b62b54f691c79e27d5557d31a2d612d3680c26c527a1957e0bd6811806ddd765e0dae589404cf24544ff2838 languageName: node linkType: hard @@ -8569,7 +9921,7 @@ __metadata: languageName: node linkType: hard -"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:~5.2.0": +"safe-buffer@npm:5.2.1, safe-buffer@npm:>=5.1.0, safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.1, safe-buffer@npm:^5.1.2, safe-buffer@npm:^5.2.0, safe-buffer@npm:^5.2.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" checksum: 6501914237c0a86e9675d4e51d89ca3c21ffd6a31642efeba25ad65720bce6921c9e7e974e5be91a786b25aa058b5303285d3c15dbabf983a919f5f630d349f3 @@ -8666,7 +10018,7 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.3": +"semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": version: 7.6.3 resolution: "semver@npm:7.6.3" bin: @@ -8675,9 +10027,9 @@ __metadata: languageName: node linkType: hard -"send@npm:0.18.0": - version: 0.18.0 - resolution: "send@npm:0.18.0" +"send@npm:0.19.0": + version: 0.19.0 + resolution: "send@npm:0.19.0" dependencies: debug: "npm:2.6.9" depd: "npm:2.0.0" @@ -8692,7 +10044,7 @@ __metadata: on-finished: "npm:2.4.1" range-parser: "npm:~1.2.1" statuses: "npm:2.0.1" - checksum: 0eb134d6a51fc13bbcb976a1f4214ea1e33f242fae046efc311e80aff66c7a43603e26a79d9d06670283a13000e51be6e0a2cb80ff0942eaf9f1cd30b7ae736a + checksum: ea3f8a67a8f0be3d6bf9080f0baed6d2c51d11d4f7b4470de96a5029c598a7011c497511ccc28968b70ef05508675cebff27da9151dd2ceadd60be4e6cf845e3 languageName: node linkType: hard @@ -8705,19 +10057,18 @@ __metadata: languageName: node linkType: hard -"serve-handler@npm:6.1.5": - version: 6.1.5 - resolution: "serve-handler@npm:6.1.5" +"serve-handler@npm:6.1.6": + version: 6.1.6 + resolution: "serve-handler@npm:6.1.6" dependencies: bytes: "npm:3.0.0" content-disposition: "npm:0.5.2" - fast-url-parser: "npm:1.1.3" mime-types: "npm:2.1.18" minimatch: "npm:3.1.2" path-is-inside: "npm:1.0.2" - path-to-regexp: "npm:2.2.1" + path-to-regexp: "npm:3.3.0" range-parser: "npm:1.2.0" - checksum: 6fd393ae37a0305107e634ca545322b00605322189fe70d8f1a4a90a101c4e354768c610efe5a7ef1af3820cec5c33d97467c88151f35a3cb41d8ff2075ef802 + checksum: 1e1cb6bbc51ee32bc1505f2e0605bdc2e96605c522277c977b67f83be9d66bd1eec8604388714a4d728e036d86b629bc9aec02120ea030d3d2c3899d44696503 languageName: node linkType: hard @@ -8736,21 +10087,21 @@ __metadata: languageName: node linkType: hard -"serve-static@npm:1.15.0": - version: 1.15.0 - resolution: "serve-static@npm:1.15.0" +"serve-static@npm:1.16.2": + version: 1.16.2 + resolution: "serve-static@npm:1.16.2" dependencies: - encodeurl: "npm:~1.0.2" + encodeurl: "npm:~2.0.0" escape-html: "npm:~1.0.3" parseurl: "npm:~1.3.3" - send: "npm:0.18.0" - checksum: fa9f0e21a540a28f301258dfe1e57bb4f81cd460d28f0e973860477dd4acef946a1f41748b5bd41c73b621bea2029569c935faa38578fd34cd42a9b4947088ba + send: "npm:0.19.0" + checksum: 528fff6f5e12d0c5a391229ad893910709bc51b5705962b09404a1d813857578149b8815f35d3ee5752f44cd378d0f31669d4b1d7e2d11f41e08283d5134bd1f languageName: node linkType: hard "serve@npm:^14.2.1": - version: 14.2.3 - resolution: "serve@npm:14.2.3" + version: 14.2.4 + resolution: "serve@npm:14.2.4" dependencies: "@zeit/schemas": "npm:2.36.0" ajv: "npm:8.12.0" @@ -8761,11 +10112,11 @@ __metadata: clipboardy: "npm:3.0.0" compression: "npm:1.7.4" is-port-reachable: "npm:4.0.0" - serve-handler: "npm:6.1.5" + serve-handler: "npm:6.1.6" update-check: "npm:1.5.4" bin: serve: build/main.js - checksum: b03c683f02ad99852b5ec9ce88b26a1dee6276b26d89c7b85c23a487a75cee7ddd63fec38c2b7d7563803b223d3bd8a2cd1996c286188f9e4b1276876bc0faad + checksum: 93abecd6214228d529065040f7c0cbe541c1cc321c6a94b8a968f45a519bd9c46a9fd5e45a9b24a1f5736c5b547b8fa60d5414ebc78f870e29431b64165c1d06 languageName: node linkType: hard @@ -8783,7 +10134,7 @@ __metadata: languageName: node linkType: hard -"set-function-name@npm:^2.0.1": +"set-function-name@npm:^2.0.2": version: 2.0.2 resolution: "set-function-name@npm:2.0.2" dependencies: @@ -8795,6 +10146,13 @@ __metadata: languageName: node linkType: hard +"setimmediate@npm:^1.0.4": + version: 1.0.5 + resolution: "setimmediate@npm:1.0.5" + checksum: 5bae81bfdbfbd0ce992893286d49c9693c82b1bcc00dcaaf3a09c8f428fdeacf4190c013598b81875dfac2b08a572422db7df779a99332d0fce186d15a3e4d49 + languageName: node + linkType: hard + "setprototypeof@npm:1.1.0": version: 1.1.0 resolution: "setprototypeof@npm:1.1.0" @@ -8809,6 +10167,18 @@ __metadata: languageName: node linkType: hard +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": + version: 2.4.11 + resolution: "sha.js@npm:2.4.11" + dependencies: + inherits: "npm:^2.0.1" + safe-buffer: "npm:^5.0.1" + bin: + sha.js: ./bin.js + checksum: b7a371bca8821c9cc98a0aeff67444a03d48d745cb103f17228b96793f455f0eb0a691941b89ea1e60f6359207e36081d9be193252b0f128e0daf9cfea2815a5 + languageName: node + linkType: hard + "shallow-clone@npm:^3.0.0": version: 3.0.1 resolution: "shallow-clone@npm:3.0.1" @@ -8841,7 +10211,7 @@ __metadata: languageName: node linkType: hard -"side-channel@npm:^1.0.4": +"side-channel@npm:^1.0.4, side-channel@npm:^1.0.6": version: 1.0.6 resolution: "side-channel@npm:1.0.6" dependencies: @@ -8943,10 +10313,10 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.2.0": - version: 1.2.0 - resolution: "source-map-js@npm:1.2.0" - checksum: 7e5f896ac10a3a50fe2898e5009c58ff0dc102dcb056ed27a354623a0ece8954d4b2649e1a1b2b52ef2e161d26f8859c7710350930751640e71e374fe2d321a4 +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf languageName: node linkType: hard @@ -9071,10 +10441,10 @@ __metadata: languageName: node linkType: hard -"std-env@npm:^3.7.0": - version: 3.7.0 - resolution: "std-env@npm:3.7.0" - checksum: 60edf2d130a4feb7002974af3d5a5f3343558d1ccf8d9b9934d225c638606884db4a20d2fe6440a09605bca282af6b042ae8070a10490c0800d69e82e478f41e +"std-env@npm:^3.8.0": + version: 3.8.0 + resolution: "std-env@npm:3.8.0" + checksum: f560a2902fd0fa3d648d7d0acecbd19d664006f7372c1fba197ed4c216b4c9e48db6e2769b5fe1616d42a9333c9f066c5011935035e85c59f45dc4f796272040 languageName: node linkType: hard @@ -9095,6 +10465,18 @@ __metadata: languageName: node linkType: hard +"stream-http@npm:^3.2.0": + version: 3.2.0 + resolution: "stream-http@npm:3.2.0" + dependencies: + builtin-status-codes: "npm:^3.0.0" + inherits: "npm:^2.0.4" + readable-stream: "npm:^3.6.0" + xtend: "npm:^4.0.2" + checksum: f128fb8076d60cd548f229554b6a1a70c08a04b7b2afd4dbe7811d20f27f7d4112562eb8bce86d72a8691df3b50573228afcf1271e55e81f981536c67498bc41 + languageName: node + linkType: hard + "string-length@npm:^4.0.1": version: 4.0.2 resolution: "string-length@npm:4.0.2" @@ -9172,7 +10554,7 @@ __metadata: languageName: node linkType: hard -"string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": +"string_decoder@npm:^1.0.0, string_decoder@npm:^1.1.1, string_decoder@npm:^1.3.0": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" dependencies: @@ -9229,13 +10611,6 @@ __metadata: languageName: node linkType: hard -"strip-final-newline@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-final-newline@npm:3.0.0" - checksum: a771a17901427bac6293fd416db7577e2bc1c34a19d38351e9d5478c3c415f523f391003b42ed475f27e33a78233035df183525395f731d3bfb8cdcbd4da08ce - languageName: node - linkType: hard - "strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -9259,15 +10634,6 @@ __metadata: languageName: node linkType: hard -"supports-color@npm:^5.3.0": - version: 5.5.0 - resolution: "supports-color@npm:5.5.0" - dependencies: - has-flag: "npm:^3.0.0" - checksum: 6ae5ff319bfbb021f8a86da8ea1f8db52fac8bd4d499492e30ec17095b58af11f0c55f8577390a749b1c4dde691b6a0315dab78f5f54c9b3d83f8fb5905c1c05 - languageName: node - linkType: hard - "supports-color@npm:^7.1.0": version: 7.2.0 resolution: "supports-color@npm:7.2.0" @@ -9294,12 +10660,12 @@ __metadata: linkType: hard "synckit@npm:^0.9.1": - version: 0.9.1 - resolution: "synckit@npm:0.9.1" + version: 0.9.2 + resolution: "synckit@npm:0.9.2" dependencies: "@pkgr/core": "npm:^0.1.0" tslib: "npm:^2.6.2" - checksum: d8b89e1bf30ba3ffb469d8418c836ad9c0c062bf47028406b4d06548bc66af97155ea2303b96c93bf5c7c0f0d66153a6fbd6924c76521b434e6a9898982abc2e + checksum: e0c262817444e5b872708adb6f5ad37951ba33f6b2d1d4477d45db1f57573a784618ceed5e6614e0225db330632b1f6b95bb74d21e4d013e45ad4bde03d0cb59 languageName: node linkType: hard @@ -9347,8 +10713,8 @@ __metadata: linkType: hard "terser@npm:^5.10.0, terser@npm:^5.26.0": - version: 5.31.6 - resolution: "terser@npm:5.31.6" + version: 5.36.0 + resolution: "terser@npm:5.36.0" dependencies: "@jridgewell/source-map": "npm:^0.3.3" acorn: "npm:^8.8.2" @@ -9356,7 +10722,7 @@ __metadata: source-map-support: "npm:~0.5.20" bin: terser: bin/terser - checksum: b17d02b65a52a5041430572b3c514475820f5e7590fa93773c0f5b4be601ccf3f6d745bf5a79f3ee58187cf85edf61c24ddf4345783839fccb44c9c8fa9b427e + checksum: f4ed2bead19f64789ddcfb85b7cef78f3942f967b8890c54f57d1e35bc7d547d551c6a4c32210bce6ba45b1c738314bbfac6acbc6c762a45cd171777d0c120d9 languageName: node linkType: hard @@ -9378,6 +10744,15 @@ __metadata: languageName: node linkType: hard +"thingies@npm:^1.20.0": + version: 1.21.0 + resolution: "thingies@npm:1.21.0" + peerDependencies: + tslib: ^2 + checksum: 7570ee855aecb73185a672ecf3eb1c287a6512bf5476449388433b2d4debcf78100bc8bfd439b0edd38d2bc3bfb8341de5ce85b8557dec66d0f27b962c9a8bc1 + languageName: node + linkType: hard + "thread-stream@npm:^2.6.0": version: 2.7.0 resolution: "thread-stream@npm:2.7.0" @@ -9414,6 +10789,15 @@ __metadata: languageName: node linkType: hard +"timers-browserify@npm:^2.0.4": + version: 2.0.12 + resolution: "timers-browserify@npm:2.0.12" + dependencies: + setimmediate: "npm:^1.0.4" + checksum: 98e84db1a685bc8827c117a8bc62aac811ad56a995d07938fc7ed8cdc5bf3777bfe2d4e5da868847194e771aac3749a20f6cdd22091300fe889a76fe214a4641 + languageName: node + linkType: hard + "tiny-case@npm:^1.0.3": version: 1.0.3 resolution: "tiny-case@npm:1.0.3" @@ -9438,17 +10822,24 @@ __metadata: languageName: node linkType: hard -"tinybench@npm:^2.8.0": +"tinybench@npm:^2.9.0": version: 2.9.0 resolution: "tinybench@npm:2.9.0" checksum: c3500b0f60d2eb8db65250afe750b66d51623057ee88720b7f064894a6cb7eb93360ca824a60a31ab16dab30c7b1f06efe0795b352e37914a9d4bad86386a20c languageName: node linkType: hard -"tinypool@npm:^1.0.0": - version: 1.0.1 - resolution: "tinypool@npm:1.0.1" - checksum: 90939d6a03f1519c61007bf416632dc1f0b9c1a9dd673c179ccd9e36a408437384f984fc86555a5d040d45b595abc299c3bb39d354439e98a090766b5952e73d +"tinyexec@npm:^0.3.1": + version: 0.3.1 + resolution: "tinyexec@npm:0.3.1" + checksum: 11e7a7c5d8b3bddf8b5cbe82a9290d70a6fad84d528421d5d18297f165723cb53d2e737d8f58dcce5ca56f2e4aa2d060f02510b1f8971784f97eb3e9aec28f09 + languageName: node + linkType: hard + +"tinypool@npm:^1.0.1": + version: 1.0.2 + resolution: "tinypool@npm:1.0.2" + checksum: 31ac184c0ff1cf9a074741254fe9ea6de95026749eb2b8ec6fd2b9d8ca94abdccda731f8e102e7f32e72ed3b36d32c6975fd5f5523df3f1b6de6c3d8dfd95e63 languageName: node linkType: hard @@ -9459,10 +10850,10 @@ __metadata: languageName: node linkType: hard -"tinyspy@npm:^3.0.0": - version: 3.0.0 - resolution: "tinyspy@npm:3.0.0" - checksum: eb0dec264aa5370efd3d29743825eb115ed7f1ef8a72a431e9a75d5c9e7d67e99d04b0d61d86b8cd70c79ec27863f241ad0317bc453f78762e0cbd76d2c332d0 +"tinyspy@npm:^3.0.2": + version: 3.0.2 + resolution: "tinyspy@npm:3.0.2" + checksum: 55ffad24e346622b59292e097c2ee30a63919d5acb7ceca87fc0d1c223090089890587b426e20054733f97a58f20af2c349fb7cc193697203868ab7ba00bcea0 languageName: node linkType: hard @@ -9473,13 +10864,6 @@ __metadata: languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: b214d21dbfb4bce3452b6244b336806ffea9c05297148d32ebb428d5c43ce7545bdfc65a1ceb58c9ef4376a65c0cb2854d645f33961658b3e3b4f84910ddcdd7 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -9503,12 +10887,21 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^1.0.1": - version: 1.3.0 - resolution: "ts-api-utils@npm:1.3.0" +"tree-dump@npm:^1.0.1": + version: 1.0.2 + resolution: "tree-dump@npm:1.0.2" + peerDependencies: + tslib: 2 + checksum: d1d180764e9c691b28332dbd74226c6b6af361dfb1e134bb11e60e17cb11c215894adee50ffc578da5dcf546006693947be8b6665eb1269b56e2f534926f1c1f + languageName: node + linkType: hard + +"ts-api-utils@npm:^1.0.1, ts-api-utils@npm:^1.3.0": + version: 1.4.0 + resolution: "ts-api-utils@npm:1.4.0" peerDependencies: typescript: ">=4.2.0" - checksum: f54a0ba9ed56ce66baea90a3fa087a484002e807f28a8ccb2d070c75e76bde64bd0f6dce98b3802834156306050871b67eec325cb4e918015a360a3f0868c77c + checksum: 1b2bfa50ea52771d564bb143bb69010d25cda03ed573095fbac9b86f717012426443af6647e00e3db70fca60360482a30c1be7cf73c3521c321f6bf5e3594ea0 languageName: node linkType: hard @@ -9623,9 +11016,16 @@ __metadata: linkType: hard "tslib@npm:^2.0.0, tslib@npm:^2.0.3, tslib@npm:^2.6.2": - version: 2.7.0 - resolution: "tslib@npm:2.7.0" - checksum: 469e1d5bf1af585742128827000711efa61010b699cb040ab1800bcd3ccdd37f63ec30642c9e07c4439c1db6e46345582614275daca3e0f4abae29b0083f04a6 + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 9c4759110a19c53f992d9aae23aac5ced636e99887b51b9e61def52611732872ff7668757d4e4c61f19691e36f4da981cd9485e869b4a7408d689f6bf1f14e62 + languageName: node + linkType: hard + +"tty-browserify@npm:0.0.1": + version: 0.0.1 + resolution: "tty-browserify@npm:0.0.1" + checksum: 5e34883388eb5f556234dae75b08e069b9e62de12bd6d87687f7817f5569430a6dfef550b51dbc961715ae0cd0eb5a059e6e3fc34dc127ea164aa0f9b5bb033d languageName: node linkType: hard @@ -9701,8 +11101,8 @@ __metadata: linkType: hard "typed-array-byte-offset@npm:^1.0.2": - version: 1.0.2 - resolution: "typed-array-byte-offset@npm:1.0.2" + version: 1.0.3 + resolution: "typed-array-byte-offset@npm:1.0.3" dependencies: available-typed-arrays: "npm:^1.0.7" call-bind: "npm:^1.0.7" @@ -9710,7 +11110,8 @@ __metadata: gopd: "npm:^1.0.1" has-proto: "npm:^1.0.3" is-typed-array: "npm:^1.1.13" - checksum: d2628bc739732072e39269389a758025f75339de2ed40c4f91357023c5512d237f255b633e3106c461ced41907c1bf9a533c7e8578066b0163690ca8bc61b22f + reflect.getprototypeof: "npm:^1.0.6" + checksum: 5da29585f96671c0521475226d3227000b3e01d1e99208b66bb05b75c7c8f4d0e9cc2e79920f3bfbc792a00102df1daa2608a2753e3f291b671d5a80245bde5b languageName: node linkType: hard @@ -9728,23 +11129,39 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.0.4": - version: 5.5.4 - resolution: "typescript@npm:5.5.4" +"typescript-eslint@npm:^8.11.0": + version: 8.15.0 + resolution: "typescript-eslint@npm:8.15.0" + dependencies: + "@typescript-eslint/eslint-plugin": "npm:8.15.0" + "@typescript-eslint/parser": "npm:8.15.0" + "@typescript-eslint/utils": "npm:8.15.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + peerDependenciesMeta: + typescript: + optional: true + checksum: 589aebf0d0b9b79db1cd0b7c2ea08c6b5727c1db095d39077d070c332066c7d549a0eb2ef60b0d41619720c317c1955236c5c8ee6320bc7c6ae475add7223b55 + languageName: node + linkType: hard + +"typescript@npm:^5.0.4, typescript@npm:~5.6.2": + version: 5.6.3 + resolution: "typescript@npm:5.6.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 422be60f89e661eab29ac488c974b6cc0a660fb2228003b297c3d10c32c90f3bcffc1009b43876a082515a3c376b1eefcce823d6e78982e6878408b9a923199c + checksum: 44f61d3fb15c35359bc60399cb8127c30bae554cd555b8e2b46d68fa79d680354b83320ad419ff1b81a0bdf324197b29affe6cc28988cd6a74d4ac60c94f9799 languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.0.4#optional!builtin": - version: 5.5.4 - resolution: "typescript@patch:typescript@npm%3A5.5.4#optional!builtin::version=5.5.4&hash=e012d7" +"typescript@patch:typescript@npm%3A^5.0.4#optional!builtin, typescript@patch:typescript@npm%3A~5.6.2#optional!builtin": + version: 5.6.3 + resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=e012d7" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10dd9881baba22763de859e8050d6cb6e2db854197495c6f1929b08d1eb2b2b00d0b5d9b0bcee8472f1c3f4a7ef6a5d7ebe0cfd703f853aa5ae465b8404bc1ba + checksum: ac8307bb06bbfd08ae7137da740769b7d8c3ee5943188743bb622c621f8ad61d244767480f90fbd840277fbf152d8932aa20c33f867dea1bb5e79b187ca1a92f languageName: node linkType: hard @@ -9760,7 +11177,7 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.19.2": +"undici-types@npm:~6.19.2, undici-types@npm:~6.19.8": version: 6.19.8 resolution: "undici-types@npm:6.19.8" checksum: 078afa5990fba110f6824823ace86073b4638f1d5112ee26e790155f481f2a868cc3e0615505b6f4282bdf74a3d8caad715fd809e870c2bb0704e3ea6082f344 @@ -9799,17 +11216,17 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.1.0": - version: 1.1.0 - resolution: "update-browserslist-db@npm:1.1.0" +"update-browserslist-db@npm:^1.1.1": + version: 1.1.1 + resolution: "update-browserslist-db@npm:1.1.1" dependencies: - escalade: "npm:^3.1.2" - picocolors: "npm:^1.0.1" + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.0" peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: a7452de47785842736fb71547651c5bbe5b4dc1e3722ccf48a704b7b34e4dcf633991eaa8e4a6a517ffb738b3252eede3773bef673ef9021baa26b056d63a5b9 + checksum: 536a2979adda2b4be81b07e311bd2f3ad5e978690987956bc5f514130ad50cac87cd22c710b686d79731e00fbee8ef43efe5fcd72baa241045209195d43dcc80 languageName: node linkType: hard @@ -9832,6 +11249,16 @@ __metadata: languageName: node linkType: hard +"url@npm:^0.11.4": + version: 0.11.4 + resolution: "url@npm:0.11.4" + dependencies: + punycode: "npm:^1.4.1" + qs: "npm:^6.12.3" + checksum: cc93405ae4a9b97a2aa60ca67f1cb1481c0221cb4725a7341d149be5e2f9cfda26fd432d64dbbec693d16593b68b8a46aad8e5eab21f814932134c9d8620c662 + languageName: node + linkType: hard + "util-deprecate@npm:^1.0.1, util-deprecate@npm:^1.0.2, util-deprecate@npm:~1.0.1": version: 1.0.2 resolution: "util-deprecate@npm:1.0.2" @@ -9839,7 +11266,7 @@ __metadata: languageName: node linkType: hard -"util@npm:^0.12.5": +"util@npm:^0.12.4, util@npm:^0.12.5": version: 0.12.5 resolution: "util@npm:0.12.5" dependencies: @@ -9866,6 +11293,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^10.0.0": + version: 10.0.0 + resolution: "uuid@npm:10.0.0" + bin: + uuid: dist/bin/uuid + checksum: eab18c27fe4ab9fb9709a5d5f40119b45f2ec8314f8d4cf12ce27e4c6f4ffa4a6321dc7db6c515068fa373c075b49691ba969f0010bf37f44c37ca40cd6bf7fe + languageName: node + linkType: hard + "uuid@npm:^8.3.2": version: 8.3.2 resolution: "uuid@npm:8.3.2" @@ -9900,28 +11336,62 @@ __metadata: languageName: node linkType: hard -"vite-node@npm:2.0.5": - version: 2.0.5 - resolution: "vite-node@npm:2.0.5" +"vite-node@npm:2.1.5": + version: 2.1.5 + resolution: "vite-node@npm:2.1.5" dependencies: cac: "npm:^6.7.14" - debug: "npm:^4.3.5" + debug: "npm:^4.3.7" + es-module-lexer: "npm:^1.5.4" pathe: "npm:^1.1.2" - tinyrainbow: "npm:^1.2.0" vite: "npm:^5.0.0" bin: vite-node: vite-node.mjs - checksum: affcc58ae8d45bce3e8bc3b5767acd57c24441634e2cd967cf97f4e5ed2bcead1714b60150cdf7ee153ebad47659c5cd419883207e1a95b69790331e3243749f + checksum: 4ebe6bdf52f5ed65cb6f18af087faa87d8dca8e1a87413d1dbb8ead141d6e5d359ae006bd6c5e8f8c89cd5d90499bbf1d3f9e9a161dcc4bc86ec526862c01360 + languageName: node + linkType: hard + +"vite-plugin-externalize-deps@npm:^0.8.0": + version: 0.8.0 + resolution: "vite-plugin-externalize-deps@npm:0.8.0" + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + checksum: 0ed0d2a85f96e6470b700c1a598de9e3b189b186f7a3d05e4e945c0381bb2717dce5a40de5d6b485ec8e30f31ff33b17d56d487f618395d7b55ad7ef74d35ca3 languageName: node linkType: hard -"vite@npm:^5.0.0": - version: 5.4.2 - resolution: "vite@npm:5.4.2" +"vite-plugin-node-polyfills@npm:^0.22.0": + version: 0.22.0 + resolution: "vite-plugin-node-polyfills@npm:0.22.0" + dependencies: + "@rollup/plugin-inject": "npm:^5.0.5" + node-stdlib-browser: "npm:^1.2.0" + peerDependencies: + vite: ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 + checksum: f8ddc452eb6fba280977d037f8a6406aa522e69590641ce72ce5bb31c3498856a9f63ab3671bc6a822dcd1ff9ba5cac02cacef4a0e170fd8500cdeeb38c81675 + languageName: node + linkType: hard + +"vite-plugin-top-level-await@npm:^1.4.4": + version: 1.4.4 + resolution: "vite-plugin-top-level-await@npm:1.4.4" + dependencies: + "@rollup/plugin-virtual": "npm:^3.0.2" + "@swc/core": "npm:^1.7.0" + uuid: "npm:^10.0.0" + peerDependencies: + vite: ">=2.8" + checksum: 013e7b2e28632d93d04c4061187198e699064fc208a1657c100354b32da30921fa835879fc17779d5e0b074855237408da2fadd720fa0f4571137427a1efd5e3 + languageName: node + linkType: hard + +"vite@npm:^5.0.0, vite@npm:^5.4.10": + version: 5.4.11 + resolution: "vite@npm:5.4.11" dependencies: esbuild: "npm:^0.21.3" fsevents: "npm:~2.3.3" - postcss: "npm:^8.4.41" + postcss: "npm:^8.4.43" rollup: "npm:^4.20.0" peerDependencies: "@types/node": ^18.0.0 || >=20.0.0 @@ -9954,38 +11424,74 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 23e347ca8aa6f0a774227e4eb7abae228f12c6806a727b046aa75e7ee37ffc2d68cff74360e12a42c347f79adc294e2363bc723b957bf4b382b5a8fb39e4df9d + checksum: d536bb7af57dd0eca2a808f95f5ff1d7b7ffb8d86e17c6893087680a0448bd0d15e07475270c8a6de65cb5115592d037130a1dd979dc76bcef8c1dda202a1874 languageName: node linkType: hard +"vite@workspace:boxes/vite": + version: 0.0.0-use.local + resolution: "vite@workspace:boxes/vite" + dependencies: + "@aztec/accounts": "portal:../../../yarn-project/accounts" + "@aztec/aztec.js": "portal:../../../yarn-project/aztec.js" + "@aztec/circuit-types": "portal:../../../yarn-project/circuit-types" + "@aztec/key-store": "link:../../../yarn-project/key-store" + "@aztec/kv-store": "portal:../../../yarn-project/kv-store" + "@aztec/pxe": "link:../../../yarn-project/pxe" + "@eslint/js": "npm:^9.13.0" + "@noir-lang/acvm_js": "link:../../../noir/packages/acvm_js" + "@noir-lang/noirc_abi": "link:../../../noir/packages/noirc_abi" + "@types/react": "npm:^18.3.12" + "@types/react-dom": "npm:^18.3.1" + "@vitejs/plugin-react-swc": "npm:^3.5.0" + buffer: "npm:^6.0.3" + eslint: "npm:^9.13.0" + eslint-plugin-react-hooks: "npm:^5.0.0" + eslint-plugin-react-refresh: "npm:^0.4.14" + globals: "npm:^15.11.0" + memfs: "npm:^4.14.0" + node-stdlib-browser: "npm:^1.3.0" + react: "npm:^18.3.1" + react-dom: "npm:^18.3.1" + react-toastify: "npm:^10.0.6" + typescript: "npm:~5.6.2" + typescript-eslint: "npm:^8.11.0" + vite: "npm:^5.4.10" + vite-plugin-externalize-deps: "npm:^0.8.0" + vite-plugin-node-polyfills: "npm:^0.22.0" + vite-plugin-top-level-await: "npm:^1.4.4" + languageName: unknown + linkType: soft + "vitest@npm:^2.0.5": - version: 2.0.5 - resolution: "vitest@npm:2.0.5" - dependencies: - "@ampproject/remapping": "npm:^2.3.0" - "@vitest/expect": "npm:2.0.5" - "@vitest/pretty-format": "npm:^2.0.5" - "@vitest/runner": "npm:2.0.5" - "@vitest/snapshot": "npm:2.0.5" - "@vitest/spy": "npm:2.0.5" - "@vitest/utils": "npm:2.0.5" - chai: "npm:^5.1.1" - debug: "npm:^4.3.5" - execa: "npm:^8.0.1" - magic-string: "npm:^0.30.10" + version: 2.1.5 + resolution: "vitest@npm:2.1.5" + dependencies: + "@vitest/expect": "npm:2.1.5" + "@vitest/mocker": "npm:2.1.5" + "@vitest/pretty-format": "npm:^2.1.5" + "@vitest/runner": "npm:2.1.5" + "@vitest/snapshot": "npm:2.1.5" + "@vitest/spy": "npm:2.1.5" + "@vitest/utils": "npm:2.1.5" + chai: "npm:^5.1.2" + debug: "npm:^4.3.7" + expect-type: "npm:^1.1.0" + magic-string: "npm:^0.30.12" pathe: "npm:^1.1.2" - std-env: "npm:^3.7.0" - tinybench: "npm:^2.8.0" - tinypool: "npm:^1.0.0" + std-env: "npm:^3.8.0" + tinybench: "npm:^2.9.0" + tinyexec: "npm:^0.3.1" + tinypool: "npm:^1.0.1" tinyrainbow: "npm:^1.2.0" vite: "npm:^5.0.0" - vite-node: "npm:2.0.5" + vite-node: "npm:2.1.5" why-is-node-running: "npm:^2.3.0" peerDependencies: "@edge-runtime/vm": "*" "@types/node": ^18.0.0 || >=20.0.0 - "@vitest/browser": 2.0.5 - "@vitest/ui": 2.0.5 + "@vitest/browser": 2.1.5 + "@vitest/ui": 2.1.5 happy-dom: "*" jsdom: "*" peerDependenciesMeta: @@ -10003,7 +11509,14 @@ __metadata: optional: true bin: vitest: vitest.mjs - checksum: b4e6cca00816bf967a8589111ded72faa12f92f94ccdd0dcd0698ffcfdfc52ec662753f66b387549c600ac699b993fd952efbd99dc57fcf4d1c69a2f1022b259 + checksum: 1befb842da0826eed8761fe6cbd6ecae6b38d1ae83ac6619b994544d07e47905feaff2b254210315aa8e9b86645174c71a63b5d809799a289679a0063381c9a4 + languageName: node + linkType: hard + +"vm-browserify@npm:^1.0.1": + version: 1.1.2 + resolution: "vm-browserify@npm:1.1.2" + checksum: 0cc1af6e0d880deb58bc974921320c187f9e0a94f25570fca6b1bd64e798ce454ab87dfd797551b1b0cc1849307421aae0193cedf5f06bdb5680476780ee344b languageName: node linkType: hard @@ -10035,6 +11548,13 @@ __metadata: languageName: node linkType: hard +"weak-lru-cache@npm:^1.2.2": + version: 1.2.2 + resolution: "weak-lru-cache@npm:1.2.2" + checksum: 744847bd5b96ca86db1cb40d0aea7e92c02bbdb05f501181bf9c581e82fa2afbda32a327ffbe75749302b8492ab449f1c657ca02410d725f5d412d1e6c607d72 + languageName: node + linkType: hard + "webpack-cli@npm:^5.1.4": version: 5.1.4 resolution: "webpack-cli@npm:5.1.4" @@ -10148,16 +11668,16 @@ __metadata: linkType: hard "webpack@npm:^5.88.2, webpack@npm:^5.90.1": - version: 5.94.0 - resolution: "webpack@npm:5.94.0" + version: 5.96.1 + resolution: "webpack@npm:5.96.1" dependencies: - "@types/estree": "npm:^1.0.5" + "@types/eslint-scope": "npm:^3.7.7" + "@types/estree": "npm:^1.0.6" "@webassemblyjs/ast": "npm:^1.12.1" "@webassemblyjs/wasm-edit": "npm:^1.12.1" "@webassemblyjs/wasm-parser": "npm:^1.12.1" - acorn: "npm:^8.7.1" - acorn-import-attributes: "npm:^1.9.5" - browserslist: "npm:^4.21.10" + acorn: "npm:^8.14.0" + browserslist: "npm:^4.24.0" chrome-trace-event: "npm:^1.0.2" enhanced-resolve: "npm:^5.17.1" es-module-lexer: "npm:^1.2.1" @@ -10179,7 +11699,7 @@ __metadata: optional: true bin: webpack: bin/webpack.js - checksum: b4d1b751f634079bd177a89eef84d80fa5bb8d6fc15d72ab40fc2b9ca5167a79b56585e1a849e9e27e259803ee5c4365cb719e54af70a43c06358ec268ff4ebf + checksum: ae6052fde9a546f79f14987b65823ba4024c6642a8489339ecfee7a351dff93325842aad453295bbdc6b65fb1690e4ef07529db63aa84ece55c7869e991a0039 languageName: node linkType: hard @@ -10214,6 +11734,38 @@ __metadata: languageName: node linkType: hard +"which-builtin-type@npm:^1.1.3": + version: 1.1.4 + resolution: "which-builtin-type@npm:1.1.4" + dependencies: + function.prototype.name: "npm:^1.1.6" + has-tostringtag: "npm:^1.0.2" + is-async-function: "npm:^2.0.0" + is-date-object: "npm:^1.0.5" + is-finalizationregistry: "npm:^1.0.2" + is-generator-function: "npm:^1.0.10" + is-regex: "npm:^1.1.4" + is-weakref: "npm:^1.0.2" + isarray: "npm:^2.0.5" + which-boxed-primitive: "npm:^1.0.2" + which-collection: "npm:^1.0.2" + which-typed-array: "npm:^1.1.15" + checksum: a4a76d20d869a81b1dbb4adea31edc7e6c1a4466d3ab7c2cd757c9219d48d3723b04076c85583257b0f0f8e3ebe5af337248b8ceed57b9051cb97bce5bd881d1 + languageName: node + linkType: hard + +"which-collection@npm:^1.0.2": + version: 1.0.2 + resolution: "which-collection@npm:1.0.2" + dependencies: + is-map: "npm:^2.0.3" + is-set: "npm:^2.0.3" + is-weakmap: "npm:^2.0.2" + is-weakset: "npm:^2.0.3" + checksum: 3345fde20964525a04cdf7c4a96821f85f0cc198f1b2ecb4576e08096746d129eb133571998fe121c77782ac8f21cbd67745a3d35ce100d26d4e684c142ea1f2 + languageName: node + linkType: hard + "which-typed-array@npm:^1.1.14, which-typed-array@npm:^1.1.15, which-typed-array@npm:^1.1.2": version: 1.1.15 resolution: "which-typed-array@npm:1.1.15" @@ -10349,6 +11901,13 @@ __metadata: languageName: node linkType: hard +"xtend@npm:^4.0.2": + version: 4.0.2 + resolution: "xtend@npm:4.0.2" + checksum: 366ae4783eec6100f8a02dff02ac907bf29f9a00b82ac0264b4d8b832ead18306797e283cf19de776538babfdcb2101375ec5646b59f08c52128ac4ab812ed0e + languageName: node + linkType: hard + "y18n@npm:^5.0.5": version: 5.0.8 resolution: "y18n@npm:5.0.8" diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_artifacts_store.test.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_artifacts_store.test.ts index 0735866154a..54fc9c7d69e 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/contract_artifacts_store.test.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/contract_artifacts_store.test.ts @@ -1,5 +1,5 @@ import { AztecAddress } from '@aztec/circuits.js'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { BenchmarkingContractArtifact } from '@aztec/noir-contracts.js/Benchmarking'; import { beforeEach } from '@jest/globals'; diff --git a/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.test.ts b/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.test.ts index 90b3693716c..d361f91c139 100644 --- a/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.test.ts +++ b/yarn-project/archiver/src/archiver/kv_archiver_store/kv_archiver_store.test.ts @@ -1,4 +1,4 @@ -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { describeArchiverDataStore } from '../archiver_store_test_suite.js'; import { KVArchiverDataStore } from './kv_archiver_store.js'; diff --git a/yarn-project/archiver/src/factory.ts b/yarn-project/archiver/src/factory.ts index a2bd3c66ac7..6e694950065 100644 --- a/yarn-project/archiver/src/factory.ts +++ b/yarn-project/archiver/src/factory.ts @@ -7,7 +7,7 @@ import { import { createDebugLogger } from '@aztec/foundation/log'; import { type Maybe } from '@aztec/foundation/types'; import { type DataStoreConfig } from '@aztec/kv-store/config'; -import { createStore } from '@aztec/kv-store/utils'; +import { createStore } from '@aztec/kv-store/lmdb'; import { TokenBridgeContractArtifact, TokenContractArtifact } from '@aztec/noir-contracts.js'; import { getCanonicalProtocolContract, protocolContractNames } from '@aztec/protocol-contracts'; import { type TelemetryClient } from '@aztec/telemetry-client'; diff --git a/yarn-project/aztec-node/src/aztec-node/server.ts b/yarn-project/aztec-node/src/aztec-node/server.ts index 9a244b42e16..4bbc079ec31 100644 --- a/yarn-project/aztec-node/src/aztec-node/server.ts +++ b/yarn-project/aztec-node/src/aztec-node/server.ts @@ -60,7 +60,7 @@ import { padArrayEnd } from '@aztec/foundation/collection'; import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log'; import { Timer } from '@aztec/foundation/timer'; import { type AztecKVStore } from '@aztec/kv-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { SHA256Trunc, StandardTree, UnbalancedTree } from '@aztec/merkle-tree'; import { AggregateTxValidator, diff --git a/yarn-project/aztec/src/cli/aztec_start_options.ts b/yarn-project/aztec/src/cli/aztec_start_options.ts index 6e3b05512bc..6b0b5c90470 100644 --- a/yarn-project/aztec/src/cli/aztec_start_options.ts +++ b/yarn-project/aztec/src/cli/aztec_start_options.ts @@ -75,6 +75,12 @@ export const aztecStartOptions: { [key: string]: AztecStartOption[] } = { envVar: 'ENABLE_GAS', ...booleanConfigHelper(), }, + { + flag: '--sandbox.noPXE', + description: 'Do not expose PXE service on sandbox start', + envVar: 'NO_PXE', + ...booleanConfigHelper(), + }, ], API: [ { diff --git a/yarn-project/aztec/src/cli/cli.ts b/yarn-project/aztec/src/cli/cli.ts index b6b314bd63c..54a5a139478 100644 --- a/yarn-project/aztec/src/cli/cli.ts +++ b/yarn-project/aztec/src/cli/cli.ts @@ -56,6 +56,8 @@ export function injectAztecCommands(program: Command, userLog: LogFn, debugLogge if (sandboxOptions.testAccounts) { if (aztecNodeConfig.p2pEnabled) { userLog(`Not setting up test accounts as we are connecting to a network`); + } else if (sandboxOptions.noPXE) { + userLog(`Not setting up test accounts as we are not exposing a PXE`); } else { userLog('Setting up test accounts...'); const accounts = await deployInitialTestAccounts(pxe); @@ -67,7 +69,11 @@ export function injectAztecCommands(program: Command, userLog: LogFn, debugLogge // Start Node and PXE JSON-RPC server signalHandlers.push(stop); services.node = [node, AztecNodeApiSchema]; - services.pxe = [pxe, PXESchema]; + if (!sandboxOptions.noPXE) { + services.pxe = [pxe, PXESchema]; + } else { + userLog(`Not exposing PXE API through JSON-RPC server`); + } } else { if (options.node) { const { startNode } = await import('./cmds/start_node.js'); diff --git a/yarn-project/aztec/src/cli/cmds/start_archiver.ts b/yarn-project/aztec/src/cli/cmds/start_archiver.ts index 541ec726db5..c9b953a4980 100644 --- a/yarn-project/aztec/src/cli/cmds/start_archiver.ts +++ b/yarn-project/aztec/src/cli/cmds/start_archiver.ts @@ -3,7 +3,7 @@ import { createDebugLogger } from '@aztec/aztec.js'; import { ArchiverApiSchema } from '@aztec/circuit-types'; import { type NamespacedApiHandlers } from '@aztec/foundation/json-rpc/server'; import { type DataStoreConfig, dataConfigMappings } from '@aztec/kv-store/config'; -import { createStore } from '@aztec/kv-store/utils'; +import { createStore } from '@aztec/kv-store/lmdb'; import { createAndStartTelemetryClient, getConfigEnvVars as getTelemetryClientConfig, diff --git a/yarn-project/bb-prover/src/bb/cli.ts b/yarn-project/bb-prover/src/bb/cli.ts index a0122082c96..97a6724e2e8 100644 --- a/yarn-project/bb-prover/src/bb/cli.ts +++ b/yarn-project/bb-prover/src/bb/cli.ts @@ -2,7 +2,7 @@ import { type LogFn } from '@aztec/foundation/log'; import { type ProtocolArtifact, ProtocolCircuitArtifacts } from '@aztec/noir-protocol-circuits-types'; import { Command } from 'commander'; -import * as fs from 'fs/promises'; +import { promises as fs } from 'fs'; import { generateContractForCircuit, generateKeyForNoirCircuit } from './execute.js'; diff --git a/yarn-project/bb-prover/src/bb/execute.ts b/yarn-project/bb-prover/src/bb/execute.ts index 76261a8d31d..d1236b27a84 100644 --- a/yarn-project/bb-prover/src/bb/execute.ts +++ b/yarn-project/bb-prover/src/bb/execute.ts @@ -5,7 +5,7 @@ import { Timer } from '@aztec/foundation/timer'; import { type NoirCompiledCircuit } from '@aztec/types/noir'; import * as proc from 'child_process'; -import * as fs from 'fs/promises'; +import { promises as fs } from 'fs'; import { basename, dirname, join } from 'path'; import { type UltraHonkFlavor } from '../honk.js'; diff --git a/yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts b/yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts index 7f16b0292fd..5d1b735523a 100644 --- a/yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts +++ b/yarn-project/bb-prover/src/prover/bb_private_kernel_prover.ts @@ -45,7 +45,7 @@ import { type NoirCompiledCircuit } from '@aztec/types/noir'; import { encode } from '@msgpack/msgpack'; import { serializeWitness } from '@noir-lang/noirc_abi'; import { type WitnessMap } from '@noir-lang/types'; -import * as fs from 'fs/promises'; +import { promises as fs } from 'fs'; import path from 'path'; import { diff --git a/yarn-project/bb-prover/src/prover/bb_prover.ts b/yarn-project/bb-prover/src/prover/bb_prover.ts index 57c957382c9..463a09eaad8 100644 --- a/yarn-project/bb-prover/src/prover/bb_prover.ts +++ b/yarn-project/bb-prover/src/prover/bb_prover.ts @@ -76,7 +76,7 @@ import { Attributes, type TelemetryClient, trackSpan } from '@aztec/telemetry-cl import { abiEncode } from '@noir-lang/noirc_abi'; import { type Abi, type WitnessMap } from '@noir-lang/types'; import crypto from 'crypto'; -import * as fs from 'fs/promises'; +import { promises as fs } from 'fs'; import * as path from 'path'; import { diff --git a/yarn-project/bb-prover/src/verification_key/verification_key_data.ts b/yarn-project/bb-prover/src/verification_key/verification_key_data.ts index 14f5eb28c59..98dd1ebff4c 100644 --- a/yarn-project/bb-prover/src/verification_key/verification_key_data.ts +++ b/yarn-project/bb-prover/src/verification_key/verification_key_data.ts @@ -7,7 +7,7 @@ import { import { hashVK } from '@aztec/circuits.js/hash'; import { strict as assert } from 'assert'; -import * as fs from 'fs/promises'; +import { promises as fs } from 'fs'; import * as path from 'path'; import { VK_FIELDS_FILENAME, VK_FILENAME } from '../bb/execute.js'; diff --git a/yarn-project/bb-prover/src/verifier/bb_verifier.ts b/yarn-project/bb-prover/src/verifier/bb_verifier.ts index af05a695ae0..d0e2ae15645 100644 --- a/yarn-project/bb-prover/src/verifier/bb_verifier.ts +++ b/yarn-project/bb-prover/src/verifier/bb_verifier.ts @@ -9,7 +9,7 @@ import { ProtocolCircuitArtifacts, } from '@aztec/noir-protocol-circuits-types'; -import * as fs from 'fs/promises'; +import { promises as fs } from 'fs'; import * as path from 'path'; import { diff --git a/yarn-project/circuits.js/src/structs/client_ivc_proof.ts b/yarn-project/circuits.js/src/structs/client_ivc_proof.ts index 9c47db7e845..3ce4169c2f8 100644 --- a/yarn-project/circuits.js/src/structs/client_ivc_proof.ts +++ b/yarn-project/circuits.js/src/structs/client_ivc_proof.ts @@ -1,7 +1,7 @@ import { bufferSchemaFor } from '@aztec/foundation/schemas'; import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; -import * as fs from 'fs/promises'; +import { promises as fs } from 'fs'; import path from 'path'; /** diff --git a/yarn-project/end-to-end/src/composed/integration_l1_publisher.test.ts b/yarn-project/end-to-end/src/composed/integration_l1_publisher.test.ts index 0e44b93ce98..8529d43e1c4 100644 --- a/yarn-project/end-to-end/src/composed/integration_l1_publisher.test.ts +++ b/yarn-project/end-to-end/src/composed/integration_l1_publisher.test.ts @@ -20,7 +20,7 @@ import { import { fr } from '@aztec/circuits.js/testing'; import { type L1ContractAddresses, createEthereumChain } from '@aztec/ethereum'; import { range } from '@aztec/foundation/array'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { OutboxAbi, RollupAbi } from '@aztec/l1-artifacts'; import { SHA256Trunc, StandardTree } from '@aztec/merkle-tree'; import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types'; diff --git a/yarn-project/end-to-end/src/fixtures/get_acvm_config.ts b/yarn-project/end-to-end/src/fixtures/get_acvm_config.ts index d11a078c78c..f7f840c31d2 100644 --- a/yarn-project/end-to-end/src/fixtures/get_acvm_config.ts +++ b/yarn-project/end-to-end/src/fixtures/get_acvm_config.ts @@ -1,7 +1,7 @@ import { type DebugLogger } from '@aztec/aztec.js'; import { randomBytes } from '@aztec/foundation/crypto'; -import * as fs from 'fs/promises'; +import { promises as fs } from 'fs'; export { deployAndInitializeTokenAndBridgeContracts } from '../shared/cross_chain_test_harness.js'; diff --git a/yarn-project/foundation/src/config/env_var.ts b/yarn-project/foundation/src/config/env_var.ts index 0d36c4cd300..41e2d61b49f 100644 --- a/yarn-project/foundation/src/config/env_var.ts +++ b/yarn-project/foundation/src/config/env_var.ts @@ -60,6 +60,7 @@ export type EnvVar = | 'MNEMONIC' | 'NETWORK_NAME' | 'NETWORK' + | 'NO_PXE' | 'COIN_ISSUER_CONTRACT_ADDRESS' | 'OTEL_EXPORTER_OTLP_METRICS_ENDPOINT' | 'OTEL_EXPORTER_OTLP_TRACES_ENDPOINT' diff --git a/yarn-project/foundation/src/fs/run_in_dir.ts b/yarn-project/foundation/src/fs/run_in_dir.ts index 9ff007a49b6..5bd47da8975 100644 --- a/yarn-project/foundation/src/fs/run_in_dir.ts +++ b/yarn-project/foundation/src/fs/run_in_dir.ts @@ -1,4 +1,4 @@ -import * as fs from 'fs/promises'; +import { promises as fs } from 'fs'; import * as path from 'path'; // Create a random directory underneath a 'base' directory diff --git a/yarn-project/foundation/src/iterable/index.ts b/yarn-project/foundation/src/iterable/index.ts index 364baf20342..ca18f4de0be 100644 --- a/yarn-project/foundation/src/iterable/index.ts +++ b/yarn-project/foundation/src/iterable/index.ts @@ -4,3 +4,4 @@ export * from './sort.js'; export * from './take.js'; export * from './all.js'; export * from './peek.js'; +export * from './toArray.js'; diff --git a/yarn-project/foundation/src/iterable/toArray.ts b/yarn-project/foundation/src/iterable/toArray.ts new file mode 100644 index 00000000000..af7554d01f8 --- /dev/null +++ b/yarn-project/foundation/src/iterable/toArray.ts @@ -0,0 +1,7 @@ +export async function toArray(iterator: AsyncIterableIterator | IterableIterator): Promise { + const arr = []; + for await (const i of iterator) { + arr.push(i); + } + return arr; +} diff --git a/yarn-project/ivc-integration/src/avm_integration.test.ts b/yarn-project/ivc-integration/src/avm_integration.test.ts index b9dd8bbd933..820744c1239 100644 --- a/yarn-project/ivc-integration/src/avm_integration.test.ts +++ b/yarn-project/ivc-integration/src/avm_integration.test.ts @@ -12,7 +12,7 @@ import { BufferReader } from '@aztec/foundation/serialize'; import { type FixedLengthArray } from '@aztec/noir-protocol-circuits-types/types'; import { simulateAvmTestContractGenerateCircuitInputs } from '@aztec/simulator/public/fixtures'; -import fs from 'fs/promises'; +import { promises as fs } from 'fs'; import { tmpdir } from 'node:os'; import os from 'os'; import path from 'path'; diff --git a/yarn-project/ivc-integration/src/native_client_ivc_integration.test.ts b/yarn-project/ivc-integration/src/native_client_ivc_integration.test.ts index 2b891891043..c08645a932a 100644 --- a/yarn-project/ivc-integration/src/native_client_ivc_integration.test.ts +++ b/yarn-project/ivc-integration/src/native_client_ivc_integration.test.ts @@ -4,7 +4,7 @@ import { createDebugLogger } from '@aztec/foundation/log'; import { jest } from '@jest/globals'; import { encode } from '@msgpack/msgpack'; -import fs from 'fs/promises'; +import { promises as fs } from 'fs'; import os from 'os'; import path from 'path'; import { fileURLToPath } from 'url'; diff --git a/yarn-project/ivc-integration/src/scripts/generate_ts_from_abi.ts b/yarn-project/ivc-integration/src/scripts/generate_ts_from_abi.ts index 80545c2587a..af44a1f6bda 100644 --- a/yarn-project/ivc-integration/src/scripts/generate_ts_from_abi.ts +++ b/yarn-project/ivc-integration/src/scripts/generate_ts_from_abi.ts @@ -3,7 +3,7 @@ import { createConsoleLogger } from '@aztec/foundation/log'; import { codegen } from '@noir-lang/noir_codegen'; import { type CompiledCircuit } from '@noir-lang/types'; import { pascalCase } from 'change-case'; -import fs from 'fs/promises'; +import { promises as fs } from 'fs'; const log = createConsoleLogger('aztec:mock-circuits'); diff --git a/yarn-project/key-store/src/key_store.test.ts b/yarn-project/key-store/src/key_store.test.ts index a816660a9a7..1435225b6de 100644 --- a/yarn-project/key-store/src/key_store.test.ts +++ b/yarn-project/key-store/src/key_store.test.ts @@ -1,5 +1,5 @@ import { AztecAddress, Fr, deriveKeys, derivePublicKeyFromSecretKey } from '@aztec/circuits.js'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { KeyStore } from './key_store.js'; diff --git a/yarn-project/key-store/src/key_store.ts b/yarn-project/key-store/src/key_store.ts index c0d41bd9318..10d539c40c3 100644 --- a/yarn-project/key-store/src/key_store.ts +++ b/yarn-project/key-store/src/key_store.ts @@ -15,16 +15,17 @@ import { derivePublicKeyFromSecretKey, } from '@aztec/circuits.js'; import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto'; +import { toArray } from '@aztec/foundation/iterable'; import { type Bufferable, serializeToBuffer } from '@aztec/foundation/serialize'; -import { type AztecKVStore, type AztecMap } from '@aztec/kv-store'; +import { type AztecAsyncKVStore, type AztecAsyncMap } from '@aztec/kv-store'; /** * Used for managing keys. Can hold keys of multiple accounts. */ export class KeyStore { - #keys: AztecMap; + #keys: AztecAsyncMap; - constructor(database: AztecKVStore) { + constructor(database: AztecAsyncKVStore) { this.#keys = database.openMap('key_store'); } @@ -81,18 +82,18 @@ export class KeyStore { await this.#keys.set(`${account.toString()}-tpk_m_hash`, publicKeys.masterTaggingPublicKey.hash().toBuffer()); // At last, we return the newly derived account address - return Promise.resolve(completeAddress); + return completeAddress; } /** * Retrieves addresses of accounts stored in the key store. * @returns A Promise that resolves to an array of account addresses. */ - public getAccounts(): Promise { - const allMapKeys = Array.from(this.#keys.keys()); + public async getAccounts(): Promise { + const allMapKeys = await toArray(this.#keys.keysAsync()); // We return account addresses based on the map keys that end with '-ivsk_m' const accounts = allMapKeys.filter(key => key.endsWith('-ivsk_m')).map(key => key.split('-')[0]); - return Promise.resolve(accounts.map(account => AztecAddress.fromString(account))); + return accounts.map(account => AztecAddress.fromString(account)); } /** @@ -102,11 +103,11 @@ export class KeyStore { * @param contractAddress - The contract address to silo the secret key in the key validation request with. * @returns The key validation request. */ - public getKeyValidationRequest(pkMHash: Fr, contractAddress: AztecAddress): Promise { - const [keyPrefix, account] = this.getKeyPrefixAndAccount(pkMHash); + public async getKeyValidationRequest(pkMHash: Fr, contractAddress: AztecAddress): Promise { + const [keyPrefix, account] = await this.getKeyPrefixAndAccount(pkMHash); // Now we find the master public key for the account - const pkMBuffer = this.#keys.get(`${account.toString()}-${keyPrefix}pk_m`); + const pkMBuffer = await this.#keys.getAsync(`${account.toString()}-${keyPrefix}pk_m`); if (!pkMBuffer) { throw new Error( `Could not find ${keyPrefix}pk_m for account ${account.toString()} whose address was successfully obtained with ${keyPrefix}pk_m_hash ${pkMHash.toString()}.`, @@ -120,7 +121,7 @@ export class KeyStore { } // Now we find the secret key for the public key - const skMBuffer = this.#keys.get(`${account.toString()}-${keyPrefix}sk_m`); + const skMBuffer = await this.#keys.getAsync(`${account.toString()}-${keyPrefix}sk_m`); if (!skMBuffer) { throw new Error( `Could not find ${keyPrefix}sk_m for account ${account.toString()} whose address was successfully obtained with ${keyPrefix}pk_m_hash ${pkMHash.toString()}.`, @@ -137,7 +138,7 @@ export class KeyStore { // At last we silo the secret key and return the key validation request const skApp = computeAppSecretKey(skM, contractAddress, keyPrefix!); - return Promise.resolve(new KeyValidationRequest(pkM, skApp)); + return new KeyValidationRequest(pkM, skApp); } /** @@ -147,13 +148,13 @@ export class KeyStore { * @returns The master nullifier public key for the account. */ public async getMasterNullifierPublicKey(account: AztecAddress): Promise { - const masterNullifierPublicKeyBuffer = this.#keys.get(`${account.toString()}-npk_m`); + const masterNullifierPublicKeyBuffer = await this.#keys.getAsync(`${account.toString()}-npk_m`); if (!masterNullifierPublicKeyBuffer) { throw new Error( `Account ${account.toString()} does not exist. Registered accounts: ${await this.getAccounts()}.`, ); } - return Promise.resolve(Point.fromBuffer(masterNullifierPublicKeyBuffer)); + return Point.fromBuffer(masterNullifierPublicKeyBuffer); } /** @@ -163,13 +164,13 @@ export class KeyStore { * @returns The master incoming viewing public key for the account. */ public async getMasterIncomingViewingPublicKey(account: AztecAddress): Promise { - const masterIncomingViewingPublicKeyBuffer = this.#keys.get(`${account.toString()}-ivpk_m`); + const masterIncomingViewingPublicKeyBuffer = await this.#keys.getAsync(`${account.toString()}-ivpk_m`); if (!masterIncomingViewingPublicKeyBuffer) { throw new Error( `Account ${account.toString()} does not exist. Registered accounts: ${await this.getAccounts()}.`, ); } - return Promise.resolve(Point.fromBuffer(masterIncomingViewingPublicKeyBuffer)); + return Point.fromBuffer(masterIncomingViewingPublicKeyBuffer); } /** @@ -179,13 +180,13 @@ export class KeyStore { * @returns A Promise that resolves to the master outgoing viewing key. */ public async getMasterOutgoingViewingPublicKey(account: AztecAddress): Promise { - const masterOutgoingViewingPublicKeyBuffer = this.#keys.get(`${account.toString()}-ovpk_m`); + const masterOutgoingViewingPublicKeyBuffer = await this.#keys.getAsync(`${account.toString()}-ovpk_m`); if (!masterOutgoingViewingPublicKeyBuffer) { throw new Error( `Account ${account.toString()} does not exist. Registered accounts: ${await this.getAccounts()}.`, ); } - return Promise.resolve(Point.fromBuffer(masterOutgoingViewingPublicKeyBuffer)); + return Point.fromBuffer(masterOutgoingViewingPublicKeyBuffer); } /** @@ -195,13 +196,13 @@ export class KeyStore { * @returns A Promise that resolves to the master tagging key. */ public async getMasterTaggingPublicKey(account: AztecAddress): Promise { - const masterTaggingPublicKeyBuffer = this.#keys.get(`${account.toString()}-tpk_m`); + const masterTaggingPublicKeyBuffer = await this.#keys.getAsync(`${account.toString()}-tpk_m`); if (!masterTaggingPublicKeyBuffer) { throw new Error( `Account ${account.toString()} does not exist. Registered accounts: ${await this.getAccounts()}.`, ); } - return Promise.resolve(Point.fromBuffer(masterTaggingPublicKeyBuffer)); + return Point.fromBuffer(masterTaggingPublicKeyBuffer); } /** @@ -211,15 +212,13 @@ export class KeyStore { * @returns A Promise that resolves to the master incoming viewing secret key. */ public async getMasterIncomingViewingSecretKey(account: AztecAddress): Promise { - const masterIncomingViewingSecretKeyBuffer = this.#keys.get(`${account.toString()}-ivsk_m`); + const masterIncomingViewingSecretKeyBuffer = await this.#keys.getAsync(`${account.toString()}-ivsk_m`); if (!masterIncomingViewingSecretKeyBuffer) { throw new Error( `Account ${account.toString()} does not exist. Registered accounts: ${await this.getAccounts()}.`, ); } - const masterIncomingViewingSecretKey = GrumpkinScalar.fromBuffer(masterIncomingViewingSecretKeyBuffer); - - return Promise.resolve(masterIncomingViewingSecretKey); + return GrumpkinScalar.fromBuffer(masterIncomingViewingSecretKeyBuffer); } /** @@ -230,7 +229,7 @@ export class KeyStore { * @returns A Promise that resolves to the application outgoing viewing secret key. */ public async getAppOutgoingViewingSecretKey(account: AztecAddress, app: AztecAddress): Promise { - const masterOutgoingViewingSecretKeyBuffer = this.#keys.get(`${account.toString()}-ovsk_m`); + const masterOutgoingViewingSecretKeyBuffer = await this.#keys.getAsync(`${account.toString()}-ovsk_m`); if (!masterOutgoingViewingSecretKeyBuffer) { throw new Error( `Account ${account.toString()} does not exist. Registered accounts: ${await this.getAccounts()}.`, @@ -238,11 +237,9 @@ export class KeyStore { } const masterOutgoingViewingSecretKey = GrumpkinScalar.fromBuffer(masterOutgoingViewingSecretKeyBuffer); - return Promise.resolve( - poseidon2HashWithSeparator( - [masterOutgoingViewingSecretKey.hi, masterOutgoingViewingSecretKey.lo, app], - GeneratorIndex.OVSK_M, - ), + return poseidon2HashWithSeparator( + [masterOutgoingViewingSecretKey.hi, masterOutgoingViewingSecretKey.lo, app], + GeneratorIndex.OVSK_M, ); } @@ -253,10 +250,10 @@ export class KeyStore { * @returns A Promise that resolves to sk_m. * @dev Used when feeding the sk_m to the kernel circuit for keys verification. */ - public getMasterSecretKey(pkM: PublicKey): Promise { - const [keyPrefix, account] = this.getKeyPrefixAndAccount(pkM); + public async getMasterSecretKey(pkM: PublicKey): Promise { + const [keyPrefix, account] = await this.getKeyPrefixAndAccount(pkM); - const secretKeyBuffer = this.#keys.get(`${account.toString()}-${keyPrefix}sk_m`); + const secretKeyBuffer = await this.#keys.getAsync(`${account.toString()}-${keyPrefix}sk_m`); if (!secretKeyBuffer) { throw new Error( `Could not find ${keyPrefix}sk_m for ${keyPrefix}pk_m ${pkM.toString()}. This should not happen.`, @@ -277,10 +274,11 @@ export class KeyStore { * @dev Note that this is quite inefficient but it should not matter because there should never be too many keys * in the key store. */ - public getKeyPrefixAndAccount(value: Bufferable): [KeyPrefix, AztecAddress] { + public async getKeyPrefixAndAccount(value: Bufferable): Promise<[KeyPrefix, AztecAddress]> { const valueBuffer = serializeToBuffer(value); - for (const [key, val] of this.#keys.entries()) { - if (val.equals(valueBuffer)) { + for await (const [key, val] of this.#keys.entriesAsync()) { + // Browser returns Uint8Array, Node.js returns Buffer + if (Buffer.from(val).equals(valueBuffer)) { for (const prefix of KEY_PREFIXES) { if (key.includes(`-${prefix}`)) { const account = AztecAddress.fromString(key.split('-')[0]); diff --git a/yarn-project/kv-store/.gitignore b/yarn-project/kv-store/.gitignore new file mode 100644 index 00000000000..68c5d18f00d --- /dev/null +++ b/yarn-project/kv-store/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +/test-results/ +/playwright-report/ +/blob-report/ +/playwright/.cache/ diff --git a/yarn-project/kv-store/.mocharc.json b/yarn-project/kv-store/.mocharc.json new file mode 100644 index 00000000000..f6d8ef05651 --- /dev/null +++ b/yarn-project/kv-store/.mocharc.json @@ -0,0 +1,13 @@ +{ + "require": "ts-node/register", + "extensions": [ + "ts" + ], + "spec": [ + "./src/**/!(indexeddb)/*.test.ts" + ], + "node-option": [ + "experimental-specifier-resolution=node", + "loader=ts-node/esm" + ] + } diff --git a/yarn-project/kv-store/package.json b/yarn-project/kv-store/package.json index f42e02ff786..6bdc1eeb3e3 100644 --- a/yarn-project/kv-store/package.json +++ b/yarn-project/kv-store/package.json @@ -5,7 +5,7 @@ "exports": { ".": "./dest/interfaces/index.js", "./lmdb": "./dest/lmdb/index.js", - "./utils": "./dest/utils.js", + "./indexeddb": "./dest/indexeddb/index.js", "./stores": "./dest/stores/index.js", "./config": "./dest/config.js" }, @@ -15,18 +15,53 @@ "clean": "rm -rf ./dest .tsbuildinfo", "formatting": "run -T prettier --check ./src && run -T eslint ./src", "formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src", - "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests" + "test:node": "NODE_NO_WARNINGS=1 mocha --config ./.mocharc.json", + "test:browser": "wtr --config ./web-test-runner.config.mjs", + "test": "yarn test:node && yarn test:browser" }, "inherits": [ - "../package.common.json" + "../package.common.json", + "./package.local.json" ], + "dependencies": { + "@aztec/circuit-types": "workspace:^", + "@aztec/ethereum": "workspace:^", + "@aztec/foundation": "workspace:^", + "idb": "^8.0.0", + "lmdb": "^3.0.6" + }, + "devDependencies": { + "@aztec/circuits.js": "workspace:^", + "@jest/globals": "^29.5.0", + "@types/chai": "^5.0.1", + "@types/chai-as-promised": "^8.0.1", + "@types/jest": "^29.5.0", + "@types/mocha": "^10.0.10", + "@types/mocha-each": "^2.0.4", + "@types/node": "^18.7.23", + "@web/dev-server-esbuild": "^1.0.3", + "@web/test-runner": "^0.19.0", + "@web/test-runner-playwright": "^0.11.0", + "chai": "^5.1.2", + "chai-as-promised": "^8.0.1", + "jest": "^29.5.0", + "mocha": "^10.8.2", + "mocha-each": "^2.0.1", + "ts-node": "^10.9.1", + "typescript": "^5.0.4" + }, + "files": [ + "dest", + "src", + "!*.test.*" + ], + "engines": { + "node": ">=18" + }, "jest": { - "moduleNameMapper": { - "^(\\.{1,2}/.*)\\.[cm]?js$": "$1" - }, - "testRegex": "./src/.*\\.test\\.(js|mjs|ts)$", - "rootDir": "./src", - "workerThreads": true, + "extensionsToTreatAsEsm": [ + ".ts" + ], "transform": { "^.+\\.tsx?$": [ "@swc/jest", @@ -43,9 +78,9 @@ } ] }, - "extensionsToTreatAsEsm": [ - ".ts" - ], + "moduleNameMapper": { + "^(\\.{1,2}/.*)\\.[cm]?js$": "$1" + }, "reporters": [ [ "default", @@ -53,30 +88,8 @@ "summaryThreshold": 9999 } ] - ] - }, - "dependencies": { - "@aztec/circuit-types": "workspace:^", - "@aztec/ethereum": "workspace:^", - "@aztec/foundation": "workspace:^", - "lmdb": "^3.0.6" - }, - "devDependencies": { - "@aztec/circuits.js": "workspace:^", - "@jest/globals": "^29.5.0", - "@types/jest": "^29.5.0", - "@types/node": "^18.7.23", - "jest": "^29.5.0", - "jest-mock-extended": "^3.0.3", - "ts-node": "^10.9.1", - "typescript": "^5.0.4" - }, - "files": [ - "dest", - "src", - "!*.test.*" - ], - "engines": { - "node": ">=18" + ], + "testRegex": "./src/.*\\.test\\.(js|mjs|ts)$", + "rootDir": "./src" } } diff --git a/yarn-project/kv-store/package.local.json b/yarn-project/kv-store/package.local.json new file mode 100644 index 00000000000..1604caf6ae8 --- /dev/null +++ b/yarn-project/kv-store/package.local.json @@ -0,0 +1,5 @@ +{ + "scripts": { + "test": "yarn test:node && yarn test:browser" + } +} \ No newline at end of file diff --git a/yarn-project/kv-store/src/indexeddb/array.test.ts b/yarn-project/kv-store/src/indexeddb/array.test.ts new file mode 100644 index 00000000000..37d108fc99a --- /dev/null +++ b/yarn-project/kv-store/src/indexeddb/array.test.ts @@ -0,0 +1,7 @@ +import { describeAztecArray } from '../interfaces/array_test_suite.js'; +import { mockLogger } from '../interfaces/utils.js'; +import { AztecIndexedDBStore } from './store.js'; + +describe('IndexedDBArray', () => { + describeAztecArray('AztecArray', async () => await AztecIndexedDBStore.open(mockLogger, undefined, true)); +}); diff --git a/yarn-project/kv-store/src/indexeddb/array.ts b/yarn-project/kv-store/src/indexeddb/array.ts new file mode 100644 index 00000000000..f1297143ae2 --- /dev/null +++ b/yarn-project/kv-store/src/indexeddb/array.ts @@ -0,0 +1,118 @@ +import { type IDBPDatabase, type IDBPObjectStore } from 'idb'; + +import { type AztecAsyncArray } from '../interfaces/array.js'; +import { type AztecIDBSchema } from './store.js'; + +/** + * A persistent array backed by IndexedDB. + */ +export class IndexedDBAztecArray implements AztecAsyncArray { + #_db?: IDBPObjectStore; + #rootDB: IDBPDatabase; + #container: string; + #name: string; + + constructor(rootDB: IDBPDatabase, name: string) { + this.#rootDB = rootDB; + this.#name = name; + this.#container = `array:${this.#name}`; + } + + set db(db: IDBPObjectStore | undefined) { + this.#_db = db; + } + + get db(): IDBPObjectStore { + return this.#_db ? this.#_db : this.#rootDB.transaction('data', 'readwrite').store; + } + + async lengthAsync(): Promise { + return ( + (await this.db + .index('key') + .count(IDBKeyRange.bound([this.#container, this.#name], [this.#container, this.#name]))) ?? 0 + ); + } + + async push(...vals: T[]): Promise { + let length = await this.lengthAsync(); + for (const val of vals) { + await this.db.put({ + value: val, + container: this.#container, + key: this.#name, + keyCount: length + 1, + slot: this.#slot(length), + }); + length += 1; + } + return length; + } + + async pop(): Promise { + const length = await this.lengthAsync(); + if (length === 0) { + return undefined; + } + + const slot = this.#slot(length - 1); + const data = await this.db.get(slot); + await this.db.delete(slot); + + return data?.value; + } + + async atAsync(index: number): Promise { + const length = await this.lengthAsync(); + + if (index < 0) { + index = length + index; + } + + const data = await this.db.get(this.#slot(index)); + return data?.value; + } + + async setAt(index: number, val: T): Promise { + const length = await this.lengthAsync(); + + if (index < 0) { + index = length + index; + } + + if (index < 0 || index >= length) { + return Promise.resolve(false); + } + + await this.db.put({ + value: val, + container: this.#container, + key: this.#name, + keyCount: index + 1, + slot: this.#slot(index), + }); + return true; + } + + async *entriesAsync(): AsyncIterableIterator<[number, T]> { + const index = this.db.index('key'); + const rangeQuery = IDBKeyRange.bound([this.#container, this.#name], [this.#container, this.#name]); + for await (const cursor of index.iterate(rangeQuery)) { + yield [cursor.value.keyCount - 1, cursor.value.value] as [number, T]; + } + } + + async *valuesAsync(): AsyncIterableIterator { + for await (const [_, value] of this.entriesAsync()) { + yield value; + } + } + + [Symbol.asyncIterator](): AsyncIterableIterator { + return this.valuesAsync(); + } + + #slot(index: number): string { + return `array:${this.#name}:slot:${index}`; + } +} diff --git a/yarn-project/kv-store/src/indexeddb/index.ts b/yarn-project/kv-store/src/indexeddb/index.ts new file mode 100644 index 00000000000..3d42a057da9 --- /dev/null +++ b/yarn-project/kv-store/src/indexeddb/index.ts @@ -0,0 +1,37 @@ +import { type Logger, createDebugLogger } from '@aztec/foundation/log'; + +import { type DataStoreConfig } from '../config.js'; +import { initStoreForRollup } from '../utils.js'; +import { AztecIndexedDBStore } from './store.js'; + +export { AztecIndexedDBStore } from './store.js'; + +export async function createStore( + name: string, + config: DataStoreConfig, + log: Logger = createDebugLogger('aztec:kv-store'), +) { + let { dataDirectory } = config; + if (typeof dataDirectory !== 'undefined') { + dataDirectory = `${dataDirectory}/${name}`; + } + + log.info( + dataDirectory + ? `Creating ${name} data store at directory ${dataDirectory} with map size ${config.dataStoreMapSizeKB} KB` + : `Creating ${name} ephemeral data store with map size ${config.dataStoreMapSizeKB} KB`, + ); + const store = await AztecIndexedDBStore.open( + createDebugLogger('aztec:kv-store:indexeddb'), + dataDirectory ?? '', + false, + ); + if (config.l1Contracts?.rollupAddress) { + return initStoreForRollup(store, config.l1Contracts.rollupAddress, log); + } + return store; +} + +export function openTmpStore(ephemeral: boolean = false): Promise { + return AztecIndexedDBStore.open(createDebugLogger('aztec:kv-store:indexeddb'), undefined, ephemeral); +} diff --git a/yarn-project/kv-store/src/indexeddb/map.test.ts b/yarn-project/kv-store/src/indexeddb/map.test.ts new file mode 100644 index 00000000000..f8b12c80819 --- /dev/null +++ b/yarn-project/kv-store/src/indexeddb/map.test.ts @@ -0,0 +1,7 @@ +import { describeAztecMap } from '../interfaces/map_test_suite.js'; +import { mockLogger } from '../interfaces/utils.js'; +import { AztecIndexedDBStore } from './store.js'; + +describe('IndexedDBMap', () => { + describeAztecMap('AztecMap', async () => await AztecIndexedDBStore.open(mockLogger, undefined, true)); +}); diff --git a/yarn-project/kv-store/src/indexeddb/map.ts b/yarn-project/kv-store/src/indexeddb/map.ts new file mode 100644 index 00000000000..5002877b6c6 --- /dev/null +++ b/yarn-project/kv-store/src/indexeddb/map.ts @@ -0,0 +1,142 @@ +import { type IDBPDatabase, type IDBPObjectStore } from 'idb'; + +import { type Key, type Range } from '../interfaces/common.js'; +import { type AztecAsyncMultiMap } from '../interfaces/map.js'; +import { type AztecIDBSchema } from './store.js'; + +/** + * A map backed by IndexedDB. + */ +export class IndexedDBAztecMap implements AztecAsyncMultiMap { + protected name: string; + #container: string; + + #_db?: IDBPObjectStore; + #rootDB: IDBPDatabase; + + constructor(rootDB: IDBPDatabase, mapName: string) { + this.name = mapName; + this.#container = `map:${mapName}`; + this.#rootDB = rootDB; + } + + set db(db: IDBPObjectStore | undefined) { + this.#_db = db; + } + + get db(): IDBPObjectStore { + return this.#_db ? this.#_db : this.#rootDB.transaction('data', 'readwrite').store; + } + + async getAsync(key: K): Promise { + const data = await this.db.get(this.#slot(key)); + return data?.value as V; + } + + async *getValuesAsync(key: K): AsyncIterableIterator { + const index = this.db.index('keyCount'); + const rangeQuery = IDBKeyRange.bound( + [this.#container, this.#normalizeKey(key), 0], + [this.#container, this.#normalizeKey(key), Number.MAX_SAFE_INTEGER], + false, + false, + ); + for await (const cursor of index.iterate(rangeQuery)) { + yield cursor.value.value as V; + } + } + + async hasAsync(key: K): Promise { + const result = (await this.getAsync(key)) !== undefined; + return result; + } + + async set(key: K, val: V): Promise { + const count = await this.db + .index('key') + .count(IDBKeyRange.bound([this.#container, this.#normalizeKey(key)], [this.#container, this.#normalizeKey(key)])); + await this.db.put({ + value: val, + container: this.#container, + key: this.#normalizeKey(key), + keyCount: count + 1, + slot: this.#slot(key, count), + }); + } + + swap(_key: K, _fn: (val: V | undefined) => V): Promise { + throw new Error('Not implemented'); + } + + async setIfNotExists(key: K, val: V): Promise { + if (!(await this.hasAsync(key))) { + await this.set(key, val); + return true; + } + return false; + } + + async delete(key: K): Promise { + await this.db.delete(this.#slot(key)); + } + + async deleteValue(key: K, val: V): Promise { + const index = this.db.index('keyCount'); + const rangeQuery = IDBKeyRange.bound( + [this.#container, this.#normalizeKey(key), 0], + [this.#container, this.#normalizeKey(key), Number.MAX_SAFE_INTEGER], + false, + false, + ); + for await (const cursor of index.iterate(rangeQuery)) { + if (JSON.stringify(cursor.value.value) === JSON.stringify(val)) { + await cursor.delete(); + return; + } + } + } + + async *entriesAsync(range: Range = {}): AsyncIterableIterator<[K, V]> { + const index = this.db.index('key'); + const rangeQuery = IDBKeyRange.bound( + [this.#container, range.start ?? ''], + [this.#container, range.end ?? '\uffff'], + !!range.reverse, + !range.reverse, + ); + let count = 0; + for await (const cursor of index.iterate(rangeQuery, range.reverse ? 'prev' : 'next')) { + if (range.limit && count >= range.limit) { + return; + } + yield [cursor.value.key, cursor.value.value] as [K, V]; + count++; + } + } + + async *valuesAsync(range: Range = {}): AsyncIterableIterator { + for await (const [_, value] of this.entriesAsync(range)) { + yield value; + } + } + + async *keysAsync(range: Range = {}): AsyncIterableIterator { + for await (const [key, _] of this.entriesAsync(range)) { + yield this.#denormalizeKey(key as string); + } + } + + #denormalizeKey(key: string): K { + const denormalizedKey = (key as string).split(',').map(part => (isNaN(parseInt(part)) ? part : parseInt(part))); + return (denormalizedKey.length > 1 ? denormalizedKey : key) as K; + } + + #normalizeKey(key: K): string { + const arrayKey = Array.isArray(key) ? key : [key]; + return arrayKey.join(','); + } + + #slot(key: K, index: number = 0): string { + return `map:${this.name}:slot:${this.#normalizeKey(key)}:${index}`; + } +} diff --git a/yarn-project/kv-store/src/indexeddb/set.test.ts b/yarn-project/kv-store/src/indexeddb/set.test.ts new file mode 100644 index 00000000000..28255ae9a49 --- /dev/null +++ b/yarn-project/kv-store/src/indexeddb/set.test.ts @@ -0,0 +1,7 @@ +import { describeAztecSet } from '../interfaces/set_test_suite.js'; +import { mockLogger } from '../interfaces/utils.js'; +import { AztecIndexedDBStore } from './store.js'; + +describe('IndexedDBSet', () => { + describeAztecSet('AztecSet', async () => await AztecIndexedDBStore.open(mockLogger, undefined, true)); +}); diff --git a/yarn-project/kv-store/src/indexeddb/set.ts b/yarn-project/kv-store/src/indexeddb/set.ts new file mode 100644 index 00000000000..c4c4db9a306 --- /dev/null +++ b/yarn-project/kv-store/src/indexeddb/set.ts @@ -0,0 +1,37 @@ +import { type IDBPDatabase, type IDBPObjectStore } from 'idb'; + +import { type Key, type Range } from '../interfaces/common.js'; +import { type AztecAsyncSet } from '../interfaces/set.js'; +import { IndexedDBAztecMap } from './map.js'; +import { type AztecIDBSchema } from './store.js'; + +/** + * A set backed by IndexedDB. + */ +export class IndexedDBAztecSet implements AztecAsyncSet { + private map: IndexedDBAztecMap; + + constructor(rootDb: IDBPDatabase, mapName: string) { + this.map = new IndexedDBAztecMap(rootDb, mapName); + } + + set db(db: IDBPObjectStore | undefined) { + this.map.db = db; + } + + hasAsync(key: K): Promise { + return this.map.hasAsync(key); + } + + add(key: K): Promise { + return this.map.set(key, true); + } + + delete(key: K): Promise { + return this.map.delete(key); + } + + async *entriesAsync(range: Range = {}): AsyncIterableIterator { + yield* this.map.keysAsync(range); + } +} diff --git a/yarn-project/kv-store/src/indexeddb/singleton.test.ts b/yarn-project/kv-store/src/indexeddb/singleton.test.ts new file mode 100644 index 00000000000..08cb6303452 --- /dev/null +++ b/yarn-project/kv-store/src/indexeddb/singleton.test.ts @@ -0,0 +1,7 @@ +import { describeAztecSingleton } from '../interfaces/singleton_test_suite.js'; +import { mockLogger } from '../interfaces/utils.js'; +import { AztecIndexedDBStore } from './store.js'; + +describe('IndexedDBSingleton', () => { + describeAztecSingleton('AztecSingleton', async () => await AztecIndexedDBStore.open(mockLogger, undefined, true)); +}); diff --git a/yarn-project/kv-store/src/indexeddb/singleton.ts b/yarn-project/kv-store/src/indexeddb/singleton.ts new file mode 100644 index 00000000000..19750cfbdb6 --- /dev/null +++ b/yarn-project/kv-store/src/indexeddb/singleton.ts @@ -0,0 +1,49 @@ +import { type IDBPDatabase, type IDBPObjectStore } from 'idb'; + +import { type AztecAsyncSingleton } from '../interfaces/singleton.js'; +import { type AztecIDBSchema } from './store.js'; + +/** + * Stores a single value in IndexedDB. + */ +export class IndexedDBAztecSingleton implements AztecAsyncSingleton { + #_db?: IDBPObjectStore; + #rootDB: IDBPDatabase; + #container: string; + #slot: string; + + constructor(rootDB: IDBPDatabase, name: string) { + this.#rootDB = rootDB; + this.#container = `singleton:${name}`; + this.#slot = `singleton:${name}:value`; + } + + set db(db: IDBPObjectStore | undefined) { + this.#_db = db; + } + + get db(): IDBPObjectStore { + return this.#_db ? this.#_db : this.#rootDB.transaction('data', 'readwrite').store; + } + + async getAsync(): Promise { + const data = await this.db.get(this.#slot); + return data?.value as T; + } + + async set(val: T): Promise { + const result = await this.db.put({ + container: this.#container, + slot: this.#slot, + key: this.#slot, + keyCount: 1, + value: val, + }); + return result !== undefined; + } + + async delete(): Promise { + await this.db.delete(this.#slot); + return true; + } +} diff --git a/yarn-project/kv-store/src/indexeddb/store.test.ts b/yarn-project/kv-store/src/indexeddb/store.test.ts new file mode 100644 index 00000000000..d2f529b6221 --- /dev/null +++ b/yarn-project/kv-store/src/indexeddb/store.test.ts @@ -0,0 +1,12 @@ +import { describeAztecStore } from '../interfaces/store_test_suite.js'; +import { mockLogger } from '../interfaces/utils.js'; +import { AztecIndexedDBStore } from './store.js'; + +describe('AztecIndexedDBStore', () => { + describeAztecStore( + 'AztecStore', + async () => await AztecIndexedDBStore.open(mockLogger, 'test', false), + async () => await AztecIndexedDBStore.open(mockLogger, undefined, false), + async () => await AztecIndexedDBStore.open(mockLogger, undefined, true), + ); +}); diff --git a/yarn-project/kv-store/src/indexeddb/store.ts b/yarn-project/kv-store/src/indexeddb/store.ts new file mode 100644 index 00000000000..ad841c0a9ab --- /dev/null +++ b/yarn-project/kv-store/src/indexeddb/store.ts @@ -0,0 +1,192 @@ +import { type Logger } from '@aztec/foundation/log'; + +import { type DBSchema, type IDBPDatabase, openDB } from 'idb'; + +import { type AztecAsyncArray } from '../interfaces/array.js'; +import { type Key } from '../interfaces/common.js'; +import { type AztecAsyncCounter } from '../interfaces/counter.js'; +import { type AztecAsyncMap, type AztecAsyncMultiMap } from '../interfaces/map.js'; +import { type AztecAsyncSet } from '../interfaces/set.js'; +import { type AztecAsyncSingleton } from '../interfaces/singleton.js'; +import { type AztecAsyncKVStore } from '../interfaces/store.js'; +import { IndexedDBAztecArray } from './array.js'; +import { IndexedDBAztecMap } from './map.js'; +import { IndexedDBAztecSet } from './set.js'; +import { IndexedDBAztecSingleton } from './singleton.js'; + +export type StoredData = { value: V; container: string; key: string; keyCount: number; slot: string }; + +export interface AztecIDBSchema extends DBSchema { + data: { + value: StoredData; + key: string; + indexes: { container: string; key: string; keyCount: number }; + }; +} + +/** + * A key-value store backed by IndexedDB. + */ + +export class AztecIndexedDBStore implements AztecAsyncKVStore { + #log: Logger; + #rootDB: IDBPDatabase; + #name: string; + + #containers = new Set< + IndexedDBAztecArray | IndexedDBAztecMap | IndexedDBAztecSet | IndexedDBAztecSingleton + >(); + + constructor(rootDB: IDBPDatabase, public readonly isEphemeral: boolean, log: Logger, name: string) { + this.#rootDB = rootDB; + this.#log = log; + this.#name = name; + } + /** + * Creates a new AztecKVStore backed by IndexedDB. The path to the database is optional. If not provided, + * the database will be stored in a temporary location and be deleted when the process exists. + * + * + * @param path - A path on the disk to store the database. Optional + * @param ephemeral - true if the store should only exist in memory and not automatically be flushed to disk. Optional + * @param log - A logger to use. Optional + * @returns The store + */ + static async open(log: Logger, name?: string, ephemeral: boolean = false): Promise { + name = name && !ephemeral ? name : self.crypto.getRandomValues(new Uint8Array(16)).join(''); + log.debug(`Opening IndexedDB ${ephemeral ? 'temp ' : ''}database with name ${name}`); + const rootDB = await openDB(name, 1, { + upgrade(db) { + const objectStore = db.createObjectStore('data', { keyPath: 'slot' }); + + objectStore.createIndex('key', ['container', 'key'], { unique: false }); + objectStore.createIndex('keyCount', ['container', 'key', 'keyCount'], { unique: false }); + }, + }); + + const kvStore = new AztecIndexedDBStore(rootDB, ephemeral, log, name); + return kvStore; + } + + /** + * Forks the current DB into a new DB by backing it up to a temporary location and opening a new indexedb. + * @returns A new AztecIndexedDBStore. + */ + async fork(): Promise { + const forkedStore = await AztecIndexedDBStore.open(this.#log, undefined, true); + this.#log.verbose(`Forking store to ${forkedStore.#name}`); + + // Copy old data to new store + const oldData = this.#rootDB.transaction('data').store; + const dataToWrite = []; + for await (const cursor of oldData.iterate()) { + dataToWrite.push(cursor.value); + } + const tx = forkedStore.#rootDB.transaction('data', 'readwrite').store; + for (const data of dataToWrite) { + await tx.add(data); + } + + this.#log.debug(`Forked store at ${forkedStore.#name} opened successfully`); + return forkedStore; + } + + /** + * Creates a new AztecMap in the store. + * @param name - Name of the map + * @returns A new AztecMap + */ + openMap(name: string): AztecAsyncMap { + const map = new IndexedDBAztecMap(this.#rootDB, name); + this.#containers.add(map); + return map; + } + + /** + * Creates a new AztecSet in the store. + * @param name - Name of the set + * @returns A new AztecSet + */ + openSet(name: string): AztecAsyncSet { + const set = new IndexedDBAztecSet(this.#rootDB, name); + this.#containers.add(set); + return set; + } + + /** + * Creates a new AztecMultiMap in the store. A multi-map stores multiple values for a single key automatically. + * @param name - Name of the map + * @returns A new AztecMultiMap + */ + openMultiMap(name: string): AztecAsyncMultiMap { + const multimap = new IndexedDBAztecMap(this.#rootDB, name); + this.#containers.add(multimap); + return multimap; + } + + openCounter>(_name: string): AztecAsyncCounter { + throw new Error('Method not implemented.'); + } + + /** + * Creates a new AztecArray in the store. + * @param name - Name of the array + * @returns A new AztecArray + */ + openArray(name: string): AztecAsyncArray { + const array = new IndexedDBAztecArray(this.#rootDB, name); + this.#containers.add(array); + return array; + } + + /** + * Creates a new AztecSingleton in the store. + * @param name - Name of the singleton + * @returns A new AztecSingleton + */ + openSingleton(name: string): AztecAsyncSingleton { + const singleton = new IndexedDBAztecSingleton(this.#rootDB, name); + this.#containers.add(singleton); + return singleton; + } + + /** + * Runs a callback in a transaction. + * @param callback - Function to execute in a transaction + * @returns A promise that resolves to the return value of the callback + */ + async transactionAsync(callback: () => Promise): Promise { + const tx = this.#rootDB.transaction('data', 'readwrite'); + for (const container of this.#containers) { + container.db = tx.store; + } + // Avoid awaiting this promise so it doesn't get scheduled in the next microtask + // By then, the tx would be closed + const runningPromise = callback(); + // Wait for the transaction to finish + await tx.done; + for (const container of this.#containers) { + container.db = undefined; + } + // Return the result of the callback. + // Tx is guaranteed to already be closed, so the await doesn't hurt anything here + return await runningPromise; + } + + /** + * Clears all entries in the store & sub DBs. + */ + async clear() { + await this.#rootDB.transaction('data', 'readwrite').store.clear(); + } + + /** Deletes this store and removes the database */ + delete() { + this.#containers.clear(); + return Promise.resolve(this.#rootDB.deleteObjectStore('data')); + } + + estimateSize(): { mappingSize: number; actualSize: number; numItems: number } { + return { mappingSize: 0, actualSize: 0, numItems: 0 }; + } +} diff --git a/yarn-project/kv-store/src/interfaces/array.ts b/yarn-project/kv-store/src/interfaces/array.ts index e2492204212..70e98a24c3e 100644 --- a/yarn-project/kv-store/src/interfaces/array.ts +++ b/yarn-project/kv-store/src/interfaces/array.ts @@ -1,12 +1,7 @@ /** * An array backed by a persistent store. Can not have any holes in it. */ -export interface AztecArray { - /** - * The size of the array - */ - length: number; - +interface BaseAztecArray { /** * Pushes values to the end of the array * @param vals - The values to push to the end of the array @@ -20,6 +15,24 @@ export interface AztecArray { */ pop(): Promise; + /** + * Updates the value at the given index. Index can be in the range [-length, length - 1). + * @param index - The index to set the value at + * @param val - The value to set + * @returns Whether the value was set + */ + setAt(index: number, val: T): Promise; +} + +/** + * An array backed by a persistent store. Can not have any holes in it. + */ +export interface AztecAsyncArray extends BaseAztecArray { + /** + * The size of the array + */ + lengthAsync(): Promise; + /** * Gets the value at the given index. Index can be in the range [-length, length - 1). * If the index is negative, it will be treated as an offset from the end of the array. @@ -27,15 +40,38 @@ export interface AztecArray { * @param index - The index to get the value from * @returns The value at the given index or undefined if the index is out of bounds */ - at(index: number): T | undefined; + atAsync(index: number): Promise; /** - * Updates the value at the given index. Index can be in the range [-length, length - 1). - * @param index - The index to set the value at - * @param val - The value to set - * @returns Whether the value was set + * Iterates over the array with indexes. */ - setAt(index: number, val: T): Promise; + entriesAsync(): AsyncIterableIterator<[number, T]>; + + /** + * Iterates over the array. + */ + valuesAsync(): AsyncIterableIterator; + + /** + * Iterates over the array. + */ + [Symbol.asyncIterator](): AsyncIterableIterator; +} + +export interface AztecArray extends BaseAztecArray { + /** + * The size of the array + */ + length: number; + + /** + * Gets the value at the given index. Index can be in the range [-length, length - 1). + * If the index is negative, it will be treated as an offset from the end of the array. + * + * @param index - The index to get the value from + * @returns The value at the given index or undefined if the index is out of bounds + */ + at(index: number): T | undefined; /** * Iterates over the array with indexes. diff --git a/yarn-project/kv-store/src/interfaces/array_test_suite.ts b/yarn-project/kv-store/src/interfaces/array_test_suite.ts new file mode 100644 index 00000000000..0affe23305e --- /dev/null +++ b/yarn-project/kv-store/src/interfaces/array_test_suite.ts @@ -0,0 +1,126 @@ +import { toArray } from '@aztec/foundation/iterable'; + +import { expect } from 'chai'; + +import { type AztecArray, type AztecAsyncArray } from './array.js'; +import { type AztecAsyncKVStore, type AztecKVStore } from './store.js'; +import { isSyncStore } from './utils.js'; + +export function describeAztecArray( + testName: string, + getStore: () => AztecKVStore | Promise, + forceAsync: boolean = false, +) { + describe(testName, () => { + let store: AztecKVStore | AztecAsyncKVStore; + let arr: AztecArray | AztecAsyncArray; + + beforeEach(async () => { + store = await getStore(); + arr = store.openArray('test'); + }); + + async function length(sut: AztecAsyncArray | AztecArray = arr) { + return isSyncStore(store) && !forceAsync + ? (sut as AztecArray).length + : await (sut as AztecAsyncArray).lengthAsync(); + } + + async function at(index: number) { + return isSyncStore(store) && !forceAsync + ? (arr as AztecArray).at(index) + : await (arr as AztecAsyncArray).atAsync(index); + } + + async function entries() { + return isSyncStore(store) && !forceAsync + ? await toArray((arr as AztecArray).entries()) + : await toArray((arr as AztecAsyncArray).entriesAsync()); + } + + async function values(sut: AztecAsyncArray | AztecArray = arr) { + return isSyncStore(store) && !forceAsync + ? await toArray((sut as AztecArray).values()) + : await toArray((sut as AztecAsyncArray).valuesAsync()); + } + + it('should be able to push and pop values', async () => { + await arr.push(1); + await arr.push(2); + await arr.push(3); + + expect(await length()).to.equal(3); + + expect(await arr.pop()).to.equal(3); + expect(await arr.pop()).to.equal(2); + expect(await arr.pop()).to.equal(1); + expect(await arr.pop()).to.equal(undefined); + }); + + it('should be able to get values by index', async () => { + await arr.push(1); + await arr.push(2); + await arr.push(3); + + expect(await at(0)).to.equal(1); + expect(await at(1)).to.equal(2); + expect(await at(2)).to.equal(3); + expect(await at(3)).to.equal(undefined); + expect(await at(-1)).to.equal(3); + expect(await at(-2)).to.equal(2); + expect(await at(-3)).to.equal(1); + expect(await at(-4)).to.equal(undefined); + }); + + it('should be able to set values by index', async () => { + await arr.push(1); + await arr.push(2); + await arr.push(3); + + expect(await arr.setAt(0, 4)).to.equal(true); + expect(await arr.setAt(1, 5)).to.equal(true); + expect(await arr.setAt(2, 6)).to.equal(true); + + expect(await arr.setAt(3, 7)).to.equal(false); + + expect(await at(0)).to.equal(4); + expect(await at(1)).to.equal(5); + expect(await at(2)).to.equal(6); + expect(await at(3)).to.equal(undefined); + + expect(await arr.setAt(-1, 8)).to.equal(true); + expect(await arr.setAt(-2, 9)).to.equal(true); + expect(await arr.setAt(-3, 10)).to.equal(true); + + expect(await arr.setAt(-4, 11)).to.equal(false); + + expect(await at(-1)).to.equal(8); + expect(await at(-2)).to.equal(9); + expect(await at(-3)).to.equal(10); + expect(await at(-4)).to.equal(undefined); + }); + + it('should be able to iterate over values', async () => { + await arr.push(1); + await arr.push(2); + await arr.push(3); + + expect(await values()).to.deep.equal([1, 2, 3]); + expect(await entries()).to.deep.equal([ + [0, 1], + [1, 2], + [2, 3], + ]); + }); + + it('should be able to restore state', async () => { + await arr.push(1); + await arr.push(2); + await arr.push(3); + + const arr2 = store.openArray('test'); + expect(await length(arr2)).to.equal(3); + expect(await values(arr2)).to.deep.equal(await values()); + }); + }); +} diff --git a/yarn-project/kv-store/src/interfaces/counter.ts b/yarn-project/kv-store/src/interfaces/counter.ts index 0fa636c58dd..2b94a2ff847 100644 --- a/yarn-project/kv-store/src/interfaces/counter.ts +++ b/yarn-project/kv-store/src/interfaces/counter.ts @@ -6,7 +6,7 @@ import { type Key, type Range } from './common.js'; * * Keys are stored in sorted order */ -export interface AztecCounter { +interface AztecBaseCounter { /** * Resets the count of the given key to the given value. * @param key - The key to reset @@ -22,7 +22,9 @@ export interface AztecCounter { * @param delta - The amount to modify the key by */ update(key: K, delta: number): Promise; +} +export interface AztecCounter extends AztecBaseCounter { /** * Gets the current count. * @param key - The key to get the count of @@ -41,3 +43,23 @@ export interface AztecCounter { */ entries(range: Range): IterableIterator<[K, number]>; } + +export interface AztecAsyncCounter extends AztecBaseCounter { + /** + * Gets the current count. + * @param key - The key to get the count of + */ + getAsync(key: K): Promise; + + /** + * Returns keys in the map in sorted order. Only returns keys that have been seen at least once. + * @param range - The range of keys to iterate over + */ + keysAsync(range: Range): AsyncIterableIterator; + + /** + * Returns keys and their counts in the map sorted by the key. Only returns keys that have been seen at least once. + * @param range - The range of keys to iterate over + */ + entriesAsync(range: Range): AsyncIterableIterator<[K, number]>; +} diff --git a/yarn-project/kv-store/src/interfaces/map.ts b/yarn-project/kv-store/src/interfaces/map.ts index 9b0d0ca4d17..6ded76080db 100644 --- a/yarn-project/kv-store/src/interfaces/map.ts +++ b/yarn-project/kv-store/src/interfaces/map.ts @@ -3,20 +3,7 @@ import { type Key, type Range } from './common.js'; /** * A map backed by a persistent store. */ -export interface AztecMap { - /** - * Gets the value at the given key. - * @param key - The key to get the value from - */ - get(key: K): V | undefined; - - /** - * Checks if a key exists in the map. - * @param key - The key to check - * @returns True if the key exists, false otherwise - */ - has(key: K): boolean; - +interface AztecBaseMap { /** * Sets the value at the given key. * @param key - The key to set the value at @@ -43,6 +30,20 @@ export interface AztecMap { * @param key - The key to delete the value at */ delete(key: K): Promise; +} +export interface AztecMap extends AztecBaseMap { + /** + * Gets the value at the given key. + * @param key - The key to get the value from + */ + get(key: K): V | undefined; + + /** + * Checks if a key exists in the map. + * @param key - The key to check + * @returns True if the key exists, false otherwise + */ + has(key: K): boolean; /** * Iterates over the map's key-value entries in the key's natural order @@ -80,3 +81,57 @@ export interface AztecMultiMap extends AztecMap { */ deleteValue(key: K, val: V): Promise; } + +/** + * A map backed by a persistent store. + */ +export interface AztecAsyncMap extends AztecBaseMap { + /** + * Gets the value at the given key. + * @param key - The key to get the value from + */ + getAsync(key: K): Promise; + + /** + * Checks if a key exists in the map. + * @param key - The key to check + * @returns True if the key exists, false otherwise + */ + hasAsync(key: K): Promise; + + /** + * Iterates over the map's key-value entries in the key's natural order + * @param range - The range of keys to iterate over + */ + entriesAsync(range?: Range): AsyncIterableIterator<[K, V]>; + + /** + * Iterates over the map's values in the key's natural order + * @param range - The range of keys to iterate over + */ + valuesAsync(range?: Range): AsyncIterableIterator; + + /** + * Iterates over the map's keys in the key's natural order + * @param range - The range of keys to iterate over + */ + keysAsync(range?: Range): AsyncIterableIterator; +} + +/** + * A map backed by a persistent store that can have multiple values for a single key. + */ +export interface AztecAsyncMultiMap extends AztecAsyncMap { + /** + * Gets all the values at the given key. + * @param key - The key to get the values from + */ + getValuesAsync(key: K): AsyncIterableIterator; + + /** + * Deletes a specific value at the given key. + * @param key - The key to delete the value at + * @param val - The value to delete + */ + deleteValue(key: K, val: V): Promise; +} diff --git a/yarn-project/kv-store/src/interfaces/map_test_suite.ts b/yarn-project/kv-store/src/interfaces/map_test_suite.ts new file mode 100644 index 00000000000..3c999f01b2c --- /dev/null +++ b/yarn-project/kv-store/src/interfaces/map_test_suite.ts @@ -0,0 +1,154 @@ +import { toArray } from '@aztec/foundation/iterable'; + +import { expect } from 'chai'; + +import { type Key, type Range } from './common.js'; +import { type AztecAsyncMap, type AztecAsyncMultiMap, type AztecMap, type AztecMultiMap } from './map.js'; +import { type AztecAsyncKVStore, type AztecKVStore } from './store.js'; +import { isSyncStore } from './utils.js'; + +export function describeAztecMap( + testName: string, + getStore: () => AztecKVStore | Promise, + forceAsync: boolean = false, +) { + describe(testName, () => { + let store: AztecKVStore | AztecAsyncKVStore; + let map: AztecMultiMap | AztecAsyncMultiMap; + + beforeEach(async () => { + store = await getStore(); + map = store.openMultiMap('test'); + }); + + async function get(key: Key, sut: AztecAsyncMap | AztecMap = map) { + return isSyncStore(store) && !forceAsync + ? (sut as AztecMultiMap).get(key) + : await (sut as AztecAsyncMultiMap).getAsync(key); + } + + async function entries() { + return isSyncStore(store) && !forceAsync + ? await toArray((map as AztecMultiMap).entries()) + : await toArray((map as AztecAsyncMultiMap).entriesAsync()); + } + + async function values() { + return isSyncStore(store) && !forceAsync + ? await toArray((map as AztecMultiMap).values()) + : await toArray((map as AztecAsyncMultiMap).valuesAsync()); + } + + async function keys(range?: Range, sut: AztecAsyncMap | AztecMap = map) { + return isSyncStore(store) && !forceAsync + ? await toArray((sut as AztecMultiMap).keys(range)) + : await toArray((sut as AztecAsyncMultiMap).keysAsync(range)); + } + + async function getValues(key: Key) { + return isSyncStore(store) && !forceAsync + ? await toArray((map as AztecMultiMap).getValues(key)) + : await toArray((map as AztecAsyncMultiMap).getValuesAsync(key)); + } + + it('should be able to set and get values', async () => { + await map.set('foo', 'bar'); + await map.set('baz', 'qux'); + + expect(await get('foo')).to.equal('bar'); + expect(await get('baz')).to.equal('qux'); + expect(await get('quux')).to.equal(undefined); + }); + + it('should be able to set values if they do not exist', async () => { + expect(await map.setIfNotExists('foo', 'bar')).to.equal(true); + expect(await map.setIfNotExists('foo', 'baz')).to.equal(false); + + expect(await get('foo')).to.equal('bar'); + }); + + it('should be able to delete values', async () => { + await map.set('foo', 'bar'); + await map.set('baz', 'qux'); + + await map.delete('foo'); + + expect(await get('foo')).to.equal(undefined); + expect(await get('baz')).to.equal('qux'); + }); + + it('should be able to iterate over entries when there are no keys', async () => { + expect(await entries()).to.deep.equal([]); + }); + + it('should be able to iterate over entries', async () => { + await map.set('foo', 'bar'); + await map.set('baz', 'qux'); + + expect(await entries()).to.deep.equal([ + ['baz', 'qux'], + ['foo', 'bar'], + ]); + }); + + it('should be able to iterate over values', async () => { + await map.set('foo', 'bar'); + await map.set('baz', 'quux'); + + expect(await values()).to.deep.equal(['quux', 'bar']); + }); + + it('should be able to iterate over keys', async () => { + await map.set('foo', 'bar'); + await map.set('baz', 'qux'); + + expect(await keys()).to.deep.equal(['baz', 'foo']); + }); + + it('should be able to get multiple values for a single key', async () => { + await map.set('foo', 'bar'); + await map.set('foo', 'baz'); + + expect(await getValues('foo')).to.deep.equal(['bar', 'baz']); + }); + + it('should be able to delete individual values for a single key', async () => { + await map.set('foo', 'bar'); + await map.set('foo', 'baz'); + + await map.deleteValue('foo', 'bar'); + + expect(await getValues('foo')).to.deep.equal(['baz']); + }); + + it('supports tuple keys', async () => { + // Use a new map because key structure has changed + const tupleMap = store.openMap<[number, string], string>('test-tuple'); + + await tupleMap.set([5, 'bar'], 'val'); + await tupleMap.set([0, 'foo'], 'val'); + + expect(await keys(undefined, tupleMap)).to.deep.equal([ + [0, 'foo'], + [5, 'bar'], + ]); + + expect(await get([5, 'bar'], tupleMap)).to.equal('val'); + }); + + it('supports range queries', async () => { + await map.set('a', 'a'); + await map.set('b', 'b'); + await map.set('c', 'c'); + await map.set('d', 'd'); + + expect(await keys({ start: 'b', end: 'c' })).to.deep.equal(['b']); + expect(await keys({ start: 'b' })).to.deep.equal(['b', 'c', 'd']); + expect(await keys({ end: 'c' })).to.deep.equal(['a', 'b']); + expect(await keys({ start: 'b', end: 'c', reverse: true })).to.deep.equal(['c']); + expect(await keys({ start: 'b', limit: 1 })).to.deep.equal(['b']); + expect(await keys({ start: 'b', reverse: true })).to.deep.equal(['d', 'c']); + expect(await keys({ end: 'b', reverse: true })).to.deep.equal(['b', 'a']); + }); + }); +} diff --git a/yarn-project/kv-store/src/interfaces/set.ts b/yarn-project/kv-store/src/interfaces/set.ts index 4eaf1fe1442..a37f0d2ea20 100644 --- a/yarn-project/kv-store/src/interfaces/set.ts +++ b/yarn-project/kv-store/src/interfaces/set.ts @@ -3,14 +3,7 @@ import { type Key, type Range } from './common.js'; /** * A set backed by a persistent store. */ -export interface AztecSet { - /** - * Checks if a key exists in the set. - * @param key - The key to check - * @returns True if the key exists, false otherwise - */ - has(key: K): boolean; - +interface AztecBaseSet { /** * Adds the given value. * @param key - The key to add. @@ -22,6 +15,15 @@ export interface AztecSet { * @param key - The key to delete. */ delete(key: K): Promise; +} + +export interface AztecSet extends AztecBaseSet { + /** + * Checks if a key exists in the set. + * @param key - The key to check + * @returns True if the key exists, false otherwise + */ + has(key: K): boolean; /** * Iterates over the sets's keys entries in the key's natural order @@ -29,3 +31,18 @@ export interface AztecSet { */ entries(range?: Range): IterableIterator; } + +export interface AztecAsyncSet extends AztecBaseSet { + /** + * Checks if a key exists in the set. + * @param key - The key to check + * @returns True if the key exists, false otherwise + */ + hasAsync(key: K): Promise; + + /** + * Iterates over the sets's keys entries in the key's natural order + * @param range - The range of keys to iterate over + */ + entriesAsync(range?: Range): AsyncIterableIterator; +} diff --git a/yarn-project/kv-store/src/interfaces/set_test_suite.ts b/yarn-project/kv-store/src/interfaces/set_test_suite.ts new file mode 100644 index 00000000000..08f2758ebf3 --- /dev/null +++ b/yarn-project/kv-store/src/interfaces/set_test_suite.ts @@ -0,0 +1,77 @@ +import { toArray } from '@aztec/foundation/iterable'; + +import { expect } from 'chai'; + +import { type Range } from './common.js'; +import { type AztecAsyncSet, type AztecSet } from './set.js'; +import { type AztecAsyncKVStore, type AztecKVStore } from './store.js'; +import { isSyncStore } from './utils.js'; + +export function describeAztecSet( + testName: string, + getStore: () => AztecKVStore | Promise, + forceAsync: boolean = false, +) { + describe(testName, () => { + let store: AztecKVStore | AztecAsyncKVStore; + let set: AztecSet | AztecAsyncSet; + + beforeEach(async () => { + store = await getStore(); + set = store.openSet('test'); + }); + + async function has(key: string) { + return isSyncStore(store) && !forceAsync + ? (set as AztecSet).has(key) + : await (set as AztecAsyncSet).hasAsync(key); + } + + async function entries(range?: Range) { + return isSyncStore(store) && !forceAsync + ? await toArray((set as AztecSet).entries(range)) + : await toArray((set as AztecAsyncSet).entriesAsync(range)); + } + + it('should be able to set and get values', async () => { + await set.add('foo'); + await set.add('baz'); + + expect(await has('foo')).to.equal(true); + expect(await has('baz')).to.equal(true); + expect(await has('bar')).to.equal(false); + }); + + it('should be able to delete values', async () => { + await set.add('foo'); + await set.add('baz'); + + await set.delete('foo'); + + expect(await has('foo')).to.equal(false); + expect(await has('baz')).to.equal(true); + }); + + it('should be able to iterate over entries', async () => { + await set.add('baz'); + await set.add('foo'); + + expect(await entries()).to.deep.equal(['baz', 'foo']); + }); + + it('supports range queries', async () => { + await set.add('a'); + await set.add('b'); + await set.add('c'); + await set.add('d'); + + expect(await entries({ start: 'b', end: 'c' })).to.deep.equal(['b']); + expect(await entries({ start: 'b' })).to.deep.equal(['b', 'c', 'd']); + expect(await entries({ end: 'c' })).to.deep.equal(['a', 'b']); + expect(await entries({ start: 'b', end: 'c', reverse: true })).to.deep.equal(['c']); + expect(await entries({ start: 'b', limit: 1 })).to.deep.equal(['b']); + expect(await entries({ start: 'b', reverse: true })).to.deep.equal(['d', 'c']); + expect(await entries({ end: 'b', reverse: true })).to.deep.equal(['b', 'a']); + }); + }); +} diff --git a/yarn-project/kv-store/src/interfaces/singleton.ts b/yarn-project/kv-store/src/interfaces/singleton.ts index eba620e18b5..6d079ae22a2 100644 --- a/yarn-project/kv-store/src/interfaces/singleton.ts +++ b/yarn-project/kv-store/src/interfaces/singleton.ts @@ -2,12 +2,7 @@ * Represents a singleton value in the database. * Note: The singleton loses type info so it's recommended to serialize to buffer when storing it. */ -export interface AztecSingleton { - /** - * Gets the value. - */ - get(): T | undefined; - +interface AztecBaseSingleton { /** * Sets the value. * @param val - The new value @@ -19,3 +14,16 @@ export interface AztecSingleton { */ delete(): Promise; } +export interface AztecSingleton extends AztecBaseSingleton { + /** + * Gets the value. + */ + get(): T | undefined; +} + +export interface AztecAsyncSingleton extends AztecBaseSingleton { + /** + * Gets the value. + */ + getAsync(): Promise; +} diff --git a/yarn-project/kv-store/src/interfaces/singleton_test_suite.ts b/yarn-project/kv-store/src/interfaces/singleton_test_suite.ts new file mode 100644 index 00000000000..b3ad148f8d0 --- /dev/null +++ b/yarn-project/kv-store/src/interfaces/singleton_test_suite.ts @@ -0,0 +1,42 @@ +import { expect } from 'chai'; + +import { type AztecAsyncSingleton, type AztecSingleton } from './singleton.js'; +import { type AztecAsyncKVStore, type AztecKVStore } from './store.js'; +import { isSyncStore } from './utils.js'; + +export function describeAztecSingleton( + testName: string, + getStore: () => AztecKVStore | Promise, + forceAsync: boolean = false, +) { + describe(testName, () => { + let store: AztecKVStore | AztecAsyncKVStore; + let singleton: AztecSingleton | AztecAsyncSingleton; + + beforeEach(async () => { + store = await getStore(); + singleton = store.openSingleton('test'); + }); + + async function get() { + return isSyncStore(store) && !forceAsync + ? (singleton as AztecSingleton).get() + : await (singleton as AztecAsyncSingleton).getAsync(); + } + + it('returns undefined if the value is not set', async () => { + expect(await get()).to.equal(undefined); + }); + + it('should be able to set and get values', async () => { + expect(await singleton.set('foo')).to.equal(true); + expect(await get()).to.equal('foo'); + }); + + it('overwrites the value if it is set again', async () => { + expect(await singleton.set('foo')).to.equal(true); + expect(await singleton.set('bar')).to.equal(true); + expect(await get()).to.equal('bar'); + }); + }); +} diff --git a/yarn-project/kv-store/src/interfaces/store.ts b/yarn-project/kv-store/src/interfaces/store.ts index 9764a474546..81c4d956bed 100644 --- a/yarn-project/kv-store/src/interfaces/store.ts +++ b/yarn-project/kv-store/src/interfaces/store.ts @@ -1,32 +1,33 @@ -import { type AztecArray } from './array.js'; +import { type AztecArray, type AztecAsyncArray } from './array.js'; import { type Key } from './common.js'; -import { type AztecCounter } from './counter.js'; -import { type AztecMap, type AztecMultiMap } from './map.js'; -import { type AztecSet } from './set.js'; -import { type AztecSingleton } from './singleton.js'; +import { type AztecAsyncCounter, type AztecCounter } from './counter.js'; +import { type AztecAsyncMap, type AztecAsyncMultiMap, type AztecMap, type AztecMultiMap } from './map.js'; +import { type AztecAsyncSet, type AztecSet } from './set.js'; +import { type AztecAsyncSingleton, type AztecSingleton } from './singleton.js'; /** A key-value store */ export interface AztecKVStore { + syncGetters: true; /** * Creates a new map. * @param name - The name of the map * @returns The map */ - openMap(name: string): AztecMap; + openMap(name: string): AztecMap; /** * Creates a new set. * @param name - The name of the set * @returns The set */ - openSet(name: string): AztecSet; + openSet(name: string): AztecSet; /** * Creates a new multi-map. * @param name - The name of the multi-map * @returns The multi-map */ - openMultiMap(name: string): AztecMultiMap; + openMultiMap(name: string): AztecMultiMap; /** * Creates a new array. @@ -74,3 +75,72 @@ export interface AztecKVStore { */ estimateSize(): { mappingSize: number; actualSize: number; numItems: number }; } + +export interface AztecAsyncKVStore { + /** + * Creates a new map. + * @param name - The name of the map + * @returns The map + */ + openMap(name: string): AztecAsyncMap; + + /** + * Creates a new set. + * @param name - The name of the set + * @returns The set + */ + openSet(name: string): AztecAsyncSet; + + /** + * Creates a new multi-map. + * @param name - The name of the multi-map + * @returns The multi-map + */ + openMultiMap(name: string): AztecAsyncMultiMap; + + /** + * Creates a new array. + * @param name - The name of the array + * @returns The array + */ + openArray(name: string): AztecAsyncArray; + + /** + * Creates a new singleton. + * @param name - The name of the singleton + * @returns The singleton + */ + openSingleton(name: string): AztecAsyncSingleton; + + /** + * Creates a new count map. + * @param name - name of the counter + */ + openCounter(name: string): AztecAsyncCounter; + + /** + * Starts a transaction. All calls to read/write data while in a transaction are queued and executed atomically. + * @param callback - The callback to execute in a transaction + */ + transactionAsync>>(callback: () => Promise): Promise; + + /** + * Clears all entries in the store + */ + clear(): Promise; + + /** + * Forks the store. + */ + fork(): Promise; + + /** + * Deletes the store + */ + delete(): Promise; + + /** + * Estimates the size of the store in bytes. + */ + estimateSize(): { mappingSize: number; actualSize: number; numItems: number }; +} diff --git a/yarn-project/kv-store/src/interfaces/store_test_suite.ts b/yarn-project/kv-store/src/interfaces/store_test_suite.ts new file mode 100644 index 00000000000..91c2240ecc3 --- /dev/null +++ b/yarn-project/kv-store/src/interfaces/store_test_suite.ts @@ -0,0 +1,52 @@ +import { expect } from 'chai'; + +import { type AztecAsyncSingleton, type AztecSingleton } from './singleton.js'; +import { type AztecAsyncKVStore, type AztecKVStore } from './store.js'; +import { isSyncStore } from './utils.js'; + +export function describeAztecStore( + testName: string, + getPersistentStore: () => Promise, + getPersistentNoPathStore: () => Promise, + getEphemeralStore: () => Promise, +) { + describe(testName, () => { + async function get( + store: AztecKVStore | AztecAsyncKVStore, + singleton: AztecSingleton | AztecAsyncSingleton, + ) { + return isSyncStore(store) + ? (singleton as AztecSingleton).get() + : await (singleton as AztecAsyncSingleton).getAsync(); + } + + const itForks = async (store: AztecKVStore | AztecAsyncKVStore) => { + const singleton = store.openSingleton('singleton'); + await singleton.set('foo'); + + const forkedStore = await store.fork(); + const forkedSingleton = forkedStore.openSingleton('singleton'); + expect(await get(store, singleton)).to.equal('foo'); + await forkedSingleton.set('bar'); + expect(await get(store, singleton)).to.equal('foo'); + expect(await get(forkedStore, forkedSingleton)).to.equal('bar'); + await forkedSingleton.delete(); + expect(await get(store, singleton)).to.equal('foo'); + }; + + it('forks a persistent store', async () => { + const store = await getPersistentStore(); + await itForks(store); + }); + + it('forks a persistent store with no path', async () => { + const store = await getPersistentNoPathStore(); + await itForks(store); + }); + + it('forks an ephemeral store', async () => { + const store = await getEphemeralStore(); + await itForks(store); + }); + }); +} diff --git a/yarn-project/kv-store/src/interfaces/utils.ts b/yarn-project/kv-store/src/interfaces/utils.ts new file mode 100644 index 00000000000..2176a996bbf --- /dev/null +++ b/yarn-project/kv-store/src/interfaces/utils.ts @@ -0,0 +1,20 @@ +import { type AztecAsyncKVStore, type AztecKVStore } from './store.js'; + +/* eslint-disable no-console */ +export const mockLogger = { + debug: (msg: string, data: any) => console.log(msg, data), + info: (msg: string, data: any) => console.log(msg, data), + warn: (msg: string, data: any) => console.log(msg, data), + error: (msg: string, data: any) => console.error(msg, data), + fatal: (msg: string, data: any) => console.error(msg, data), + silent: (_msg: string, _data: any) => {}, + verbose: (msg: string, data: any) => console.log(msg, data), + trace: (msg: string, data: any) => console.log(msg, data), + level: 'trace' as const, + isLevelEnabled: (_level: string) => true, +}; +/* eslint-enable no-console */ + +export function isSyncStore(store: AztecKVStore | AztecAsyncKVStore): store is AztecAsyncKVStore { + return (store as AztecKVStore).syncGetters === true; +} diff --git a/yarn-project/kv-store/src/lmdb/array.test.ts b/yarn-project/kv-store/src/lmdb/array.test.ts index 140d620a87d..31aed9cd80c 100644 --- a/yarn-project/kv-store/src/lmdb/array.test.ts +++ b/yarn-project/kv-store/src/lmdb/array.test.ts @@ -1,91 +1,8 @@ -import { type Database, open } from 'lmdb'; +import { describeAztecArray } from '../interfaces/array_test_suite.js'; +import { openTmpStore } from './index.js'; -import { LmdbAztecArray } from './array.js'; +describe('LMDBArray', () => { + describeAztecArray('Sync AztecArray', () => openTmpStore(true)); -describe('LmdbAztecArray', () => { - let db: Database; - let arr: LmdbAztecArray; - - beforeEach(() => { - db = open({} as any); - arr = new LmdbAztecArray(db, 'test'); - }); - - it('should be able to push and pop values', async () => { - await arr.push(1); - await arr.push(2); - await arr.push(3); - - expect(arr.length).toEqual(3); - expect(await arr.pop()).toEqual(3); - expect(await arr.pop()).toEqual(2); - expect(await arr.pop()).toEqual(1); - expect(await arr.pop()).toEqual(undefined); - }); - - it('should be able to get values by index', async () => { - await arr.push(1); - await arr.push(2); - await arr.push(3); - - expect(arr.at(0)).toEqual(1); - expect(arr.at(1)).toEqual(2); - expect(arr.at(2)).toEqual(3); - expect(arr.at(3)).toEqual(undefined); - expect(arr.at(-1)).toEqual(3); - expect(arr.at(-2)).toEqual(2); - expect(arr.at(-3)).toEqual(1); - expect(arr.at(-4)).toEqual(undefined); - }); - - it('should be able to set values by index', async () => { - await arr.push(1); - await arr.push(2); - await arr.push(3); - - expect(await arr.setAt(0, 4)).toEqual(true); - expect(await arr.setAt(1, 5)).toEqual(true); - expect(await arr.setAt(2, 6)).toEqual(true); - - expect(await arr.setAt(3, 7)).toEqual(false); - - expect(arr.at(0)).toEqual(4); - expect(arr.at(1)).toEqual(5); - expect(arr.at(2)).toEqual(6); - expect(arr.at(3)).toEqual(undefined); - - expect(await arr.setAt(-1, 8)).toEqual(true); - expect(await arr.setAt(-2, 9)).toEqual(true); - expect(await arr.setAt(-3, 10)).toEqual(true); - - expect(await arr.setAt(-4, 11)).toEqual(false); - - expect(arr.at(-1)).toEqual(8); - expect(arr.at(-2)).toEqual(9); - expect(arr.at(-3)).toEqual(10); - expect(arr.at(-4)).toEqual(undefined); - }); - - it('should be able to iterate over values', async () => { - await arr.push(1); - await arr.push(2); - await arr.push(3); - - expect([...arr.values()]).toEqual([1, 2, 3]); - expect([...arr.entries()]).toEqual([ - [0, 1], - [1, 2], - [2, 3], - ]); - }); - - it('should be able to restore state', async () => { - await arr.push(1); - await arr.push(2); - await arr.push(3); - - const arr2 = new LmdbAztecArray(db, 'test'); - expect(arr2.length).toEqual(3); - expect([...arr2.values()]).toEqual([...arr.values()]); - }); + describeAztecArray('Async AztecArray', () => Promise.resolve(openTmpStore(true)), true); }); diff --git a/yarn-project/kv-store/src/lmdb/array.ts b/yarn-project/kv-store/src/lmdb/array.ts index 3ba338d028f..19537dd7598 100644 --- a/yarn-project/kv-store/src/lmdb/array.ts +++ b/yarn-project/kv-store/src/lmdb/array.ts @@ -1,6 +1,6 @@ import { type Database, type Key } from 'lmdb'; -import { type AztecArray } from '../interfaces/array.js'; +import { type AztecArray, type AztecAsyncArray } from '../interfaces/array.js'; import { LmdbAztecSingleton } from './singleton.js'; /** The shape of a key that stores a value in an array */ @@ -9,7 +9,7 @@ type ArrayIndexSlot = ['array', string, 'slot', number]; /** * An persistent array backed by LMDB. */ -export class LmdbAztecArray implements AztecArray { +export class LmdbAztecArray implements AztecArray, AztecAsyncArray { #db: Database; #name: string; #length: LmdbAztecSingleton; @@ -24,6 +24,10 @@ export class LmdbAztecArray implements AztecArray { return this.#length.get() ?? 0; } + lengthAsync(): Promise { + return Promise.resolve(this.length); + } + push(...vals: T[]): Promise { return this.#db.childTransaction(() => { let length = this.length; @@ -69,6 +73,10 @@ export class LmdbAztecArray implements AztecArray { return this.#db.get(this.#slot(index)); } + atAsync(index: number): Promise { + return Promise.resolve(this.at(index)); + } + setAt(index: number, val: T): Promise { if (index < 0) { index = this.length + index; @@ -93,16 +101,32 @@ export class LmdbAztecArray implements AztecArray { } } + async *entriesAsync(): AsyncIterableIterator<[number, T]> { + for (const [key, value] of this.entries()) { + yield [key, value]; + } + } + *values(): IterableIterator { for (const [_, value] of this.entries()) { yield value; } } + async *valuesAsync(): AsyncIterableIterator { + for (const [_, value] of this.entries()) { + yield value; + } + } + [Symbol.iterator](): IterableIterator { return this.values(); } + [Symbol.asyncIterator](): AsyncIterableIterator { + return this.valuesAsync(); + } + #slot(index: number): ArrayIndexSlot { return ['array', this.#name, 'slot', index]; } diff --git a/yarn-project/kv-store/src/lmdb/counter.test.ts b/yarn-project/kv-store/src/lmdb/counter.test.ts index 36ac3e42679..7e1c8524cf9 100644 --- a/yarn-project/kv-store/src/lmdb/counter.test.ts +++ b/yarn-project/kv-store/src/lmdb/counter.test.ts @@ -1,9 +1,15 @@ import { randomBytes } from '@aztec/foundation/crypto'; +import { toArray } from '@aztec/foundation/iterable'; +import { expect, use } from 'chai'; +import chaiAsPromised from 'chai-as-promised'; import { type Database, open } from 'lmdb'; +import forEach from 'mocha-each'; import { LmdbAztecCounter } from './counter.js'; +use(chaiAsPromised); + describe('LmdbAztecCounter', () => { let db: Database; @@ -11,26 +17,26 @@ describe('LmdbAztecCounter', () => { db = open({} as any); }); - describe.each([ + forEach([ ['floating point number', () => Math.random()], ['integers', () => (Math.random() * 1000) | 0], ['strings', () => randomBytes(8).toString('hex')], ['strings', () => [Math.random(), randomBytes(8).toString('hex')]], - ])('counts occurrences of %s values', (_, genKey) => { + ]).describe('counts occurrences of %s values', (_, genKey) => { let counter: LmdbAztecCounter>; beforeEach(() => { counter = new LmdbAztecCounter(db, 'test'); }); it('returns 0 for unknown keys', () => { - expect(counter.get(genKey())).toEqual(0); + expect(counter.get(genKey())).to.equal(0); }); it('increments values', async () => { const key = genKey(); await counter.update(key, 1); - expect(counter.get(key)).toEqual(1); + expect(counter.get(key)).to.equal(1); }); it('decrements values', async () => { @@ -38,14 +44,14 @@ describe('LmdbAztecCounter', () => { await counter.update(key, 1); await counter.update(key, -1); - expect(counter.get(key)).toEqual(0); + expect(counter.get(key)).to.equal(0); }); it('throws when decrementing below zero', async () => { const key = genKey(); await counter.update(key, 1); - await expect(counter.update(key, -2)).rejects.toThrow(); + await expect(counter.update(key, -2)).to.be.rejected; }); it('increments values by a delta', async () => { @@ -53,7 +59,7 @@ describe('LmdbAztecCounter', () => { await counter.update(key, 1); await counter.update(key, 2); - expect(counter.get(key)).toEqual(3); + expect(counter.get(key)).to.equal(3); }); it('resets the counter', async () => { @@ -62,7 +68,7 @@ describe('LmdbAztecCounter', () => { await counter.update(key, 2); await counter.set(key, 0); - expect(counter.get(key)).toEqual(0); + expect(counter.get(key)).to.equal(0); }); it('iterates over entries', async () => { @@ -70,11 +76,11 @@ describe('LmdbAztecCounter', () => { await counter.update(key, 1); await counter.update(key, 2); - expect([...counter.entries()]).toEqual([[key, 3]]); + expect(await toArray(counter.entries())).to.deep.equal([[key, 3]]); }); }); - it.each([ + forEach([ [ [ ['c', 2342], @@ -115,9 +121,9 @@ describe('LmdbAztecCounter', () => { [[11, 'b'], 1], ], ], - ])('iterates in key order', async (insertOrder, expectedOrder) => { + ]).it('iterates in key order', async (insertOrder: [string, number][], expectedOrder) => { const counter = new LmdbAztecCounter(db, 'test'); await Promise.all(insertOrder.map(([key, value]) => counter.update(key, value as number))); - expect([...counter.entries()]).toEqual(expectedOrder); + expect(await toArray(counter.entries())).to.deep.equal(expectedOrder); }); }); diff --git a/yarn-project/kv-store/src/lmdb/counter.ts b/yarn-project/kv-store/src/lmdb/counter.ts index 78e70f5d3ff..10f564abf77 100644 --- a/yarn-project/kv-store/src/lmdb/counter.ts +++ b/yarn-project/kv-store/src/lmdb/counter.ts @@ -1,13 +1,13 @@ import { type Key as BaseKey, type Database } from 'lmdb'; import { type Key, type Range } from '../interfaces/common.js'; -import { type AztecCounter } from '../interfaces/counter.js'; +import { type AztecAsyncCounter, type AztecCounter } from '../interfaces/counter.js'; import { LmdbAztecMap } from './map.js'; /** * A counter implementation backed by LMDB */ -export class LmdbAztecCounter implements AztecCounter { +export class LmdbAztecCounter implements AztecCounter, AztecAsyncCounter { #db: Database; #name: string; #map: LmdbAztecMap; @@ -45,11 +45,23 @@ export class LmdbAztecCounter implements AztecCounter { return this.#map.get(key) ?? 0; } + getAsync(key: K): Promise { + return Promise.resolve(this.get(key)); + } + entries(range: Range = {}): IterableIterator<[K, number]> { return this.#map.entries(range); } + async *entriesAsync(range: Range = {}): AsyncIterableIterator<[K, number]> { + yield* this.entries(range); + } + keys(range: Range = {}): IterableIterator { return this.#map.keys(range); } + + async *keysAsync(range: Range = {}): AsyncIterableIterator { + yield* this.keys(range); + } } diff --git a/yarn-project/kv-store/src/lmdb/index.ts b/yarn-project/kv-store/src/lmdb/index.ts index 53e012fa539..54903fe8cf2 100644 --- a/yarn-project/kv-store/src/lmdb/index.ts +++ b/yarn-project/kv-store/src/lmdb/index.ts @@ -1 +1,37 @@ +import { type Logger, createDebugLogger } from '@aztec/foundation/log'; + +import { join } from 'path'; + +import { type DataStoreConfig } from '../config.js'; +import { initStoreForRollup } from '../utils.js'; +import { AztecLmdbStore } from './store.js'; + export { AztecLmdbStore } from './store.js'; + +export function createStore(name: string, config: DataStoreConfig, log: Logger = createDebugLogger('aztec:kv-store')) { + let { dataDirectory } = config; + if (typeof dataDirectory !== 'undefined') { + dataDirectory = join(dataDirectory, name); + } + + log.info( + dataDirectory + ? `Creating ${name} data store at directory ${dataDirectory} with map size ${config.dataStoreMapSizeKB} KB` + : `Creating ${name} ephemeral data store with map size ${config.dataStoreMapSizeKB} KB`, + ); + + const store = AztecLmdbStore.open(dataDirectory, config.dataStoreMapSizeKB, false); + if (config.l1Contracts?.rollupAddress) { + return initStoreForRollup(store, config.l1Contracts.rollupAddress, log); + } + return store; +} +/** + * Opens a temporary store for testing purposes. + * @param ephemeral - true if the store should only exist in memory and not automatically be flushed to disk. Optional + * @returns A new store + */ +export function openTmpStore(ephemeral: boolean = false): AztecLmdbStore { + const mapSize = 1024 * 1024 * 10; // 10 GB map size + return AztecLmdbStore.open(undefined, mapSize, ephemeral); +} diff --git a/yarn-project/kv-store/src/lmdb/map.test.ts b/yarn-project/kv-store/src/lmdb/map.test.ts index a13aa16e126..224750df8e9 100644 --- a/yarn-project/kv-store/src/lmdb/map.test.ts +++ b/yarn-project/kv-store/src/lmdb/map.test.ts @@ -1,99 +1,8 @@ -import { type Database, open } from 'lmdb'; +import { describeAztecMap } from '../interfaces/map_test_suite.js'; +import { openTmpStore } from './index.js'; -import { LmdbAztecMap } from './map.js'; +describe('LMDBMap', () => { + describeAztecMap('Sync AztecMap', () => openTmpStore(true)); -describe('LmdbAztecMap', () => { - let db: Database; - let map: LmdbAztecMap; - - beforeEach(() => { - db = open({ dupSort: true } as any); - map = new LmdbAztecMap(db, 'test'); - }); - - it('should be able to set and get values', async () => { - await map.set('foo', 'bar'); - await map.set('baz', 'qux'); - - expect(map.get('foo')).toEqual('bar'); - expect(map.get('baz')).toEqual('qux'); - expect(map.get('quux')).toEqual(undefined); - }); - - it('should be able to set values if they do not exist', async () => { - expect(await map.setIfNotExists('foo', 'bar')).toEqual(true); - expect(await map.setIfNotExists('foo', 'baz')).toEqual(false); - - expect(map.get('foo')).toEqual('bar'); - }); - - it('should be able to delete values', async () => { - await map.set('foo', 'bar'); - await map.set('baz', 'qux'); - - await map.delete('foo'); - - expect(map.get('foo')).toEqual(undefined); - expect(map.get('baz')).toEqual('qux'); - }); - - it('should be able to iterate over entries', async () => { - await map.set('foo', 'bar'); - await map.set('baz', 'qux'); - - expect([...map.entries()]).toEqual([ - ['baz', 'qux'], - ['foo', 'bar'], - ]); - }); - - it('should be able to iterate over values', async () => { - await map.set('foo', 'bar'); - await map.set('baz', 'quux'); - - expect([...map.values()]).toEqual(['quux', 'bar']); - }); - - it('should be able to iterate over keys', async () => { - await map.set('foo', 'bar'); - await map.set('baz', 'qux'); - - expect([...map.keys()]).toEqual(['baz', 'foo']); - }); - - it('should be able to get multiple values for a single key', async () => { - await map.set('foo', 'bar'); - await map.set('foo', 'baz'); - - expect([...map.getValues('foo')]).toEqual(['bar', 'baz']); - }); - - it('supports tuple keys', async () => { - const map = new LmdbAztecMap<[number, string], string>(db, 'test'); - - await map.set([5, 'bar'], 'val'); - await map.set([0, 'foo'], 'val'); - - expect([...map.keys()]).toEqual([ - [0, 'foo'], - [5, 'bar'], - ]); - - expect(map.get([5, 'bar'])).toEqual('val'); - }); - - it('supports range queries', async () => { - await map.set('a', 'a'); - await map.set('b', 'b'); - await map.set('c', 'c'); - await map.set('d', 'd'); - - expect([...map.keys({ start: 'b', end: 'c' })]).toEqual(['b']); - expect([...map.keys({ start: 'b' })]).toEqual(['b', 'c', 'd']); - expect([...map.keys({ end: 'c' })]).toEqual(['a', 'b']); - expect([...map.keys({ start: 'b', end: 'c', reverse: true })]).toEqual(['c']); - expect([...map.keys({ start: 'b', limit: 1 })]).toEqual(['b']); - expect([...map.keys({ start: 'b', reverse: true })]).toEqual(['d', 'c']); - expect([...map.keys({ end: 'b', reverse: true })]).toEqual(['b', 'a']); - }); + describeAztecMap('Async AztecMap', () => Promise.resolve(openTmpStore(true)), true); }); diff --git a/yarn-project/kv-store/src/lmdb/map.ts b/yarn-project/kv-store/src/lmdb/map.ts index 3711fa36f55..38d87cf9c6b 100644 --- a/yarn-project/kv-store/src/lmdb/map.ts +++ b/yarn-project/kv-store/src/lmdb/map.ts @@ -1,7 +1,7 @@ import { type Database, type RangeOptions } from 'lmdb'; import { type Key, type Range } from '../interfaces/common.js'; -import { type AztecMultiMap } from '../interfaces/map.js'; +import { type AztecAsyncMultiMap, type AztecMultiMap } from '../interfaces/map.js'; /** The slot where a key-value entry would be stored */ type MapValueSlot = ['map', string, 'slot', K]; @@ -9,7 +9,7 @@ type MapValueSlot = ['map', string, 'slot', K]; /** * A map backed by LMDB. */ -export class LmdbAztecMap implements AztecMultiMap { +export class LmdbAztecMap implements AztecMultiMap, AztecAsyncMultiMap { protected db: Database<[K, V], MapValueSlot>; protected name: string; @@ -35,6 +35,10 @@ export class LmdbAztecMap implements AztecMultiMap { return this.db.get(this.#slot(key))?.[1]; } + getAsync(key: K): Promise { + return Promise.resolve(this.get(key)); + } + *getValues(key: K): IterableIterator { const values = this.db.getValues(this.#slot(key)); for (const value of values) { @@ -42,10 +46,20 @@ export class LmdbAztecMap implements AztecMultiMap { } } + async *getValuesAsync(key: K): AsyncIterableIterator { + for (const value of this.getValues(key)) { + yield value; + } + } + has(key: K): boolean { return this.db.doesExist(this.#slot(key)); } + hasAsync(key: K): Promise { + return Promise.resolve(this.has(key)); + } + async set(key: K, val: V): Promise { await this.db.put(this.#slot(key), [key, val]); } @@ -109,18 +123,36 @@ export class LmdbAztecMap implements AztecMultiMap { } } + async *entriesAsync(range?: Range | undefined): AsyncIterableIterator<[K, V]> { + for (const entry of this.entries(range)) { + yield entry; + } + } + *values(range: Range = {}): IterableIterator { for (const [_, value] of this.entries(range)) { yield value; } } + async *valuesAsync(range: Range = {}): AsyncIterableIterator { + for await (const [_, value] of this.entriesAsync(range)) { + yield value; + } + } + *keys(range: Range = {}): IterableIterator { for (const [key, _] of this.entries(range)) { yield key; } } + async *keysAsync(range: Range = {}): AsyncIterableIterator { + for await (const [key, _] of this.entriesAsync(range)) { + yield key; + } + } + #slot(key: K): MapValueSlot { return ['map', this.name, 'slot', key]; } diff --git a/yarn-project/kv-store/src/lmdb/set.test.ts b/yarn-project/kv-store/src/lmdb/set.test.ts index 677b17e543f..4b7486154c4 100644 --- a/yarn-project/kv-store/src/lmdb/set.test.ts +++ b/yarn-project/kv-store/src/lmdb/set.test.ts @@ -1,54 +1,8 @@ -import { type Database, open } from 'lmdb'; +import { describeAztecSet } from '../interfaces/set_test_suite.js'; +import { openTmpStore } from './index.js'; -import { LmdbAztecSet } from './set.js'; +describe('LMDBSet', () => { + describeAztecSet('Sync AztecSet', () => openTmpStore(true)); -describe('LmdbAztecSet', () => { - let db: Database; - let set: LmdbAztecSet; - - beforeEach(() => { - db = open({ dupSort: true } as any); - set = new LmdbAztecSet(db, 'test'); - }); - - it('should be able to set and get values', async () => { - await set.add('foo'); - await set.add('baz'); - - expect(set.has('foo')).toEqual(true); - expect(set.has('baz')).toEqual(true); - expect(set.has('bar')).toEqual(false); - }); - - it('should be able to delete values', async () => { - await set.add('foo'); - await set.add('baz'); - - await set.delete('foo'); - - expect(set.has('foo')).toEqual(false); - expect(set.has('baz')).toEqual(true); - }); - - it('should be able to iterate over entries', async () => { - await set.add('baz'); - await set.add('foo'); - - expect([...set.entries()]).toEqual(['baz', 'foo']); - }); - - it('supports range queries', async () => { - await set.add('a'); - await set.add('b'); - await set.add('c'); - await set.add('d'); - - expect([...set.entries({ start: 'b', end: 'c' })]).toEqual(['b']); - expect([...set.entries({ start: 'b' })]).toEqual(['b', 'c', 'd']); - expect([...set.entries({ end: 'c' })]).toEqual(['a', 'b']); - expect([...set.entries({ start: 'b', end: 'c', reverse: true })]).toEqual(['c']); - expect([...set.entries({ start: 'b', limit: 1 })]).toEqual(['b']); - expect([...set.entries({ start: 'b', reverse: true })]).toEqual(['d', 'c']); - expect([...set.entries({ end: 'b', reverse: true })]).toEqual(['b', 'a']); - }); + describeAztecSet('Aync AztecSet', () => Promise.resolve(openTmpStore(true)), true); }); diff --git a/yarn-project/kv-store/src/lmdb/set.ts b/yarn-project/kv-store/src/lmdb/set.ts index 887185b1b48..f92dce32f4a 100644 --- a/yarn-project/kv-store/src/lmdb/set.ts +++ b/yarn-project/kv-store/src/lmdb/set.ts @@ -1,13 +1,13 @@ import { type Database } from 'lmdb'; import { type Key, type Range } from '../interfaces/common.js'; -import { type AztecSet } from '../interfaces/set.js'; +import { type AztecAsyncSet, type AztecSet } from '../interfaces/set.js'; import { LmdbAztecMap } from './map.js'; /** * A set backed by LMDB. */ -export class LmdbAztecSet implements AztecSet { +export class LmdbAztecSet implements AztecSet, AztecAsyncSet { private map: LmdbAztecMap; constructor(rootDb: Database, mapName: string) { this.map = new LmdbAztecMap(rootDb, mapName); @@ -21,6 +21,10 @@ export class LmdbAztecSet implements AztecSet { return this.map.has(key); } + hasAsync(key: K): Promise { + return Promise.resolve(this.has(key)); + } + add(key: K): Promise { return this.map.set(key, true); } @@ -32,4 +36,10 @@ export class LmdbAztecSet implements AztecSet { entries(range: Range = {}): IterableIterator { return this.map.keys(range); } + + async *entriesAsync(range: Range = {}): AsyncIterableIterator { + for await (const key of this.map.keysAsync(range)) { + yield key; + } + } } diff --git a/yarn-project/kv-store/src/lmdb/singleton.test.ts b/yarn-project/kv-store/src/lmdb/singleton.test.ts index de1eefae462..24f9bca78fb 100644 --- a/yarn-project/kv-store/src/lmdb/singleton.test.ts +++ b/yarn-project/kv-store/src/lmdb/singleton.test.ts @@ -1,25 +1,8 @@ -import { open } from 'lmdb'; +import { describeAztecSingleton } from '../interfaces/singleton_test_suite.js'; +import { openTmpStore } from './index.js'; -import { LmdbAztecSingleton } from './singleton.js'; +describe('LMDBSingleton', () => { + describeAztecSingleton('Sync AztecSingleton', () => openTmpStore(true)); -describe('LmdbAztecSingleton', () => { - let singleton: LmdbAztecSingleton; - beforeEach(() => { - singleton = new LmdbAztecSingleton(open({} as any), 'test'); - }); - - it('returns undefined if the value is not set', () => { - expect(singleton.get()).toEqual(undefined); - }); - - it('should be able to set and get values', async () => { - expect(await singleton.set('foo')).toEqual(true); - expect(singleton.get()).toEqual('foo'); - }); - - it('overwrites the value if it is set again', async () => { - expect(await singleton.set('foo')).toEqual(true); - expect(await singleton.set('bar')).toEqual(true); - expect(singleton.get()).toEqual('bar'); - }); + describeAztecSingleton('Async AztecSingleton', () => Promise.resolve(openTmpStore(true)), true); }); diff --git a/yarn-project/kv-store/src/lmdb/singleton.ts b/yarn-project/kv-store/src/lmdb/singleton.ts index abeefec242c..8b4e5d28ff3 100644 --- a/yarn-project/kv-store/src/lmdb/singleton.ts +++ b/yarn-project/kv-store/src/lmdb/singleton.ts @@ -1,6 +1,6 @@ import { type Database, type Key } from 'lmdb'; -import { type AztecSingleton } from '../interfaces/singleton.js'; +import { type AztecAsyncSingleton, type AztecSingleton } from '../interfaces/singleton.js'; /** The slot where this singleton will store its value */ type ValueSlot = ['singleton', string, 'value']; @@ -8,7 +8,7 @@ type ValueSlot = ['singleton', string, 'value']; /** * Stores a single value in LMDB. */ -export class LmdbAztecSingleton implements AztecSingleton { +export class LmdbAztecSingleton implements AztecSingleton, AztecAsyncSingleton { #db: Database; #slot: ValueSlot; @@ -21,6 +21,10 @@ export class LmdbAztecSingleton implements AztecSingleton { return this.#db.get(this.#slot); } + getAsync(): Promise { + return Promise.resolve(this.get()); + } + set(val: T): Promise { return this.#db.put(this.#slot, val); } diff --git a/yarn-project/kv-store/src/lmdb/store.test.ts b/yarn-project/kv-store/src/lmdb/store.test.ts index c09953cb55b..1c47ab90a07 100644 --- a/yarn-project/kv-store/src/lmdb/store.test.ts +++ b/yarn-project/kv-store/src/lmdb/store.test.ts @@ -1,39 +1,20 @@ -import { mkdtemp } from 'fs/promises'; +import { promises as fs } from 'fs'; import { tmpdir } from 'os'; import { join } from 'path'; +import { describeAztecStore } from '../interfaces/store_test_suite.js'; import { AztecLmdbStore } from './store.js'; const defaultMapSize = 1024 * 1024 * 1024 * 10; describe('AztecLmdbStore', () => { - const itForks = async (store: AztecLmdbStore) => { - const singleton = store.openSingleton('singleton'); - await singleton.set('foo'); - - const forkedStore = await store.fork(); - const forkedSingleton = forkedStore.openSingleton('singleton'); - expect(forkedSingleton.get()).toEqual('foo'); - await forkedSingleton.set('bar'); - expect(singleton.get()).toEqual('foo'); - expect(forkedSingleton.get()).toEqual('bar'); - await forkedSingleton.delete(); - expect(singleton.get()).toEqual('foo'); - }; - - it('forks a persistent store', async () => { - const path = await mkdtemp(join(tmpdir(), 'aztec-store-test-')); - const store = AztecLmdbStore.open(path, defaultMapSize, false); - await itForks(store); - }); - - it('forks a persistent store with no path', async () => { - const store = AztecLmdbStore.open(undefined, defaultMapSize, false); - await itForks(store); - }); - - it('forks an ephemeral store', async () => { - const store = AztecLmdbStore.open(undefined, defaultMapSize, true); - await itForks(store); - }); + describeAztecStore( + 'AztecStore', + async () => { + const path = await fs.mkdtemp(join(tmpdir(), 'aztec-store-test-')); + return AztecLmdbStore.open(path, defaultMapSize, false); + }, + () => Promise.resolve(AztecLmdbStore.open(undefined, defaultMapSize, false)), + () => Promise.resolve(AztecLmdbStore.open(undefined, defaultMapSize, true)), + ); }); diff --git a/yarn-project/kv-store/src/lmdb/store.ts b/yarn-project/kv-store/src/lmdb/store.ts index 3e43972f088..e66bfb9b4ca 100644 --- a/yarn-project/kv-store/src/lmdb/store.ts +++ b/yarn-project/kv-store/src/lmdb/store.ts @@ -1,17 +1,17 @@ import { createDebugLogger } from '@aztec/foundation/log'; -import { mkdirSync } from 'fs'; -import { mkdtemp, rm } from 'fs/promises'; -import { type Database, type Key, type RootDatabase, open } from 'lmdb'; +import { promises as fs, mkdirSync } from 'fs'; +import { type Database, type RootDatabase, open } from 'lmdb'; import { tmpdir } from 'os'; import { dirname, join } from 'path'; -import { type AztecArray } from '../interfaces/array.js'; -import { type AztecCounter } from '../interfaces/counter.js'; -import { type AztecMap, type AztecMultiMap } from '../interfaces/map.js'; -import { type AztecSet } from '../interfaces/set.js'; -import { type AztecSingleton } from '../interfaces/singleton.js'; -import { type AztecKVStore } from '../interfaces/store.js'; +import { type AztecArray, type AztecAsyncArray } from '../interfaces/array.js'; +import { type Key } from '../interfaces/common.js'; +import { type AztecAsyncCounter, type AztecCounter } from '../interfaces/counter.js'; +import { type AztecAsyncMap, type AztecAsyncMultiMap, type AztecMap, type AztecMultiMap } from '../interfaces/map.js'; +import { type AztecAsyncSet, type AztecSet } from '../interfaces/set.js'; +import { type AztecAsyncSingleton, type AztecSingleton } from '../interfaces/singleton.js'; +import { type AztecAsyncKVStore, type AztecKVStore } from '../interfaces/store.js'; import { LmdbAztecArray } from './array.js'; import { LmdbAztecCounter } from './counter.js'; import { LmdbAztecMap } from './map.js'; @@ -21,7 +21,9 @@ import { LmdbAztecSingleton } from './singleton.js'; /** * A key-value store backed by LMDB. */ -export class AztecLmdbStore implements AztecKVStore { +export class AztecLmdbStore implements AztecKVStore, AztecAsyncKVStore { + syncGetters = true as const; + #rootDb: RootDatabase; #data: Database; #multiMapData: Database; @@ -79,7 +81,7 @@ export class AztecLmdbStore implements AztecKVStore { const baseDir = this.path ? dirname(this.path) : tmpdir(); this.#log.debug(`Forking store with basedir ${baseDir}`); const forkPath = - (await mkdtemp(join(baseDir, 'aztec-store-fork-'))) + (this.isEphemeral || !this.path ? '/data.mdb' : ''); + (await fs.mkdtemp(join(baseDir, 'aztec-store-fork-'))) + (this.isEphemeral || !this.path ? '/data.mdb' : ''); this.#log.verbose(`Forking store to ${forkPath}`); await this.#rootDb.backup(forkPath, false); const forkDb = open(forkPath, { noSync: this.isEphemeral }); @@ -92,7 +94,7 @@ export class AztecLmdbStore implements AztecKVStore { * @param name - Name of the map * @returns A new AztecMap */ - openMap(name: string): AztecMap { + openMap(name: string): AztecMap & AztecAsyncMap { return new LmdbAztecMap(this.#data, name); } @@ -101,7 +103,7 @@ export class AztecLmdbStore implements AztecKVStore { * @param name - Name of the set * @returns A new AztecSet */ - openSet(name: string): AztecSet { + openSet(name: string): AztecSet & AztecAsyncSet { return new LmdbAztecSet(this.#data, name); } @@ -110,11 +112,11 @@ export class AztecLmdbStore implements AztecKVStore { * @param name - Name of the map * @returns A new AztecMultiMap */ - openMultiMap(name: string): AztecMultiMap { + openMultiMap(name: string): AztecMultiMap & AztecAsyncMultiMap { return new LmdbAztecMap(this.#multiMapData, name); } - openCounter>(name: string): AztecCounter { + openCounter(name: string): AztecCounter & AztecAsyncCounter { return new LmdbAztecCounter(this.#data, name); } @@ -123,7 +125,7 @@ export class AztecLmdbStore implements AztecKVStore { * @param name - Name of the array * @returns A new AztecArray */ - openArray(name: string): AztecArray { + openArray(name: string): AztecArray & AztecAsyncArray { return new LmdbAztecArray(this.#data, name); } @@ -132,7 +134,7 @@ export class AztecLmdbStore implements AztecKVStore { * @param name - Name of the singleton * @returns A new AztecSingleton */ - openSingleton(name: string): AztecSingleton { + openSingleton(name: string): AztecSingleton & AztecAsyncSingleton { return new LmdbAztecSingleton(this.#data, name); } @@ -145,6 +147,15 @@ export class AztecLmdbStore implements AztecKVStore { return this.#rootDb.transaction(callback); } + /** + * Runs a callback in a transaction. + * @param callback - Function to execute in a transaction + * @returns A promise that resolves to the return value of the callback + */ + async transactionAsync(callback: () => Promise): Promise { + return await this.#rootDb.transaction(callback); + } + /** * Clears all entries in the store & sub DBs. */ @@ -177,7 +188,7 @@ export class AztecLmdbStore implements AztecKVStore { await this.drop(); await this.close(); if (this.path) { - await rm(this.path, { recursive: true, force: true }); + await fs.rm(this.path, { recursive: true, force: true }); this.#log.verbose(`Deleted database files at ${this.path}`); } } diff --git a/yarn-project/kv-store/src/stores/l2_tips_store.test.ts b/yarn-project/kv-store/src/stores/l2_tips_store.test.ts index 10055113763..d9ec9845fc1 100644 --- a/yarn-project/kv-store/src/stores/l2_tips_store.test.ts +++ b/yarn-project/kv-store/src/stores/l2_tips_store.test.ts @@ -1,13 +1,15 @@ import { type L2Block } from '@aztec/circuit-types'; import { type BlockHeader, Fr } from '@aztec/circuits.js'; import { times } from '@aztec/foundation/collection'; -import { type AztecKVStore } from '@aztec/kv-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { type AztecAsyncKVStore } from '@aztec/kv-store'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; + +import { expect } from 'chai'; import { L2TipsStore } from './l2_tips_store.js'; describe('L2TipsStore', () => { - let kvStore: AztecKVStore; + let kvStore: AztecAsyncKVStore; let tipsStore: L2TipsStore; beforeEach(() => { @@ -28,7 +30,7 @@ describe('L2TipsStore', () => { it('returns zero if no tips are stored', async () => { const tips = await tipsStore.getL2Tips(); - expect(tips).toEqual(makeTips(0, 0, 0)); + expect(tips).to.deep.equal(makeTips(0, 0, 0)); }); it('stores chain tips', async () => { @@ -39,18 +41,18 @@ describe('L2TipsStore', () => { await tipsStore.handleBlockStreamEvent({ type: 'chain-pruned', blockNumber: 10 }); const tips = await tipsStore.getL2Tips(); - expect(tips).toEqual(makeTips(10, 8, 5)); + expect(tips).to.deep.equal(makeTips(10, 8, 5)); }); it('sets latest tip from blocks added', async () => { await tipsStore.handleBlockStreamEvent({ type: 'blocks-added', blocks: times(3, i => makeBlock(i + 1)) }); const tips = await tipsStore.getL2Tips(); - expect(tips).toEqual(makeTips(3, 0, 0)); + expect(tips).to.deep.equal(makeTips(3, 0, 0)); - expect(await tipsStore.getL2BlockHash(1)).toEqual(new Fr(1).toString()); - expect(await tipsStore.getL2BlockHash(2)).toEqual(new Fr(2).toString()); - expect(await tipsStore.getL2BlockHash(3)).toEqual(new Fr(3).toString()); + expect(await tipsStore.getL2BlockHash(1)).to.deep.equal(new Fr(1).toString()); + expect(await tipsStore.getL2BlockHash(2)).to.deep.equal(new Fr(2).toString()); + expect(await tipsStore.getL2BlockHash(3)).to.deep.equal(new Fr(3).toString()); }); it('clears block hashes when setting finalized chain', async () => { @@ -59,13 +61,13 @@ describe('L2TipsStore', () => { await tipsStore.handleBlockStreamEvent({ type: 'chain-finalized', blockNumber: 3 }); const tips = await tipsStore.getL2Tips(); - expect(tips).toEqual(makeTips(5, 3, 3)); + expect(tips).to.deep.equal(makeTips(5, 3, 3)); - expect(await tipsStore.getL2BlockHash(1)).toBeUndefined(); - expect(await tipsStore.getL2BlockHash(2)).toBeUndefined(); + expect(await tipsStore.getL2BlockHash(1)).to.be.undefined; + expect(await tipsStore.getL2BlockHash(2)).to.be.undefined; - expect(await tipsStore.getL2BlockHash(3)).toEqual(new Fr(3).toString()); - expect(await tipsStore.getL2BlockHash(4)).toEqual(new Fr(4).toString()); - expect(await tipsStore.getL2BlockHash(5)).toEqual(new Fr(5).toString()); + expect(await tipsStore.getL2BlockHash(3)).to.deep.equal(new Fr(3).toString()); + expect(await tipsStore.getL2BlockHash(4)).to.deep.equal(new Fr(4).toString()); + expect(await tipsStore.getL2BlockHash(5)).to.deep.equal(new Fr(5).toString()); }); }); diff --git a/yarn-project/kv-store/src/stores/l2_tips_store.ts b/yarn-project/kv-store/src/stores/l2_tips_store.ts index 8141d804ce0..149f7be80b3 100644 --- a/yarn-project/kv-store/src/stores/l2_tips_store.ts +++ b/yarn-project/kv-store/src/stores/l2_tips_store.ts @@ -7,37 +7,37 @@ import { type L2Tips, } from '@aztec/circuit-types'; -import { type AztecMap } from '../interfaces/map.js'; -import { type AztecKVStore } from '../interfaces/store.js'; +import { type AztecAsyncMap } from '../interfaces/map.js'; +import { type AztecAsyncKVStore } from '../interfaces/store.js'; /** Stores currently synced L2 tips and unfinalized block hashes. */ export class L2TipsStore implements L2BlockStreamEventHandler, L2BlockStreamLocalDataProvider { - private readonly l2TipsStore: AztecMap; - private readonly l2BlockHashesStore: AztecMap; + private readonly l2TipsStore: AztecAsyncMap; + private readonly l2BlockHashesStore: AztecAsyncMap; - constructor(store: AztecKVStore, namespace: string) { + constructor(store: AztecAsyncKVStore, namespace: string) { this.l2TipsStore = store.openMap([namespace, 'l2_tips'].join('_')); this.l2BlockHashesStore = store.openMap([namespace, 'l2_block_hashes'].join('_')); } public getL2BlockHash(number: number): Promise { - return Promise.resolve(this.l2BlockHashesStore.get(number)); + return this.l2BlockHashesStore.getAsync(number); } - public getL2Tips(): Promise { - return Promise.resolve({ - latest: this.getL2Tip('latest'), - finalized: this.getL2Tip('finalized'), - proven: this.getL2Tip('proven'), - }); + public async getL2Tips(): Promise { + return { + latest: await this.getL2Tip('latest'), + finalized: await this.getL2Tip('finalized'), + proven: await this.getL2Tip('proven'), + }; } - private getL2Tip(tag: L2BlockTag): L2BlockId { - const blockNumber = this.l2TipsStore.get(tag); + private async getL2Tip(tag: L2BlockTag): Promise { + const blockNumber = await this.l2TipsStore.getAsync(tag); if (blockNumber === undefined || blockNumber === 0) { return { number: 0, hash: undefined }; } - const blockHash = this.l2BlockHashesStore.get(blockNumber); + const blockHash = await this.l2BlockHashesStore.getAsync(blockNumber); if (!blockHash) { throw new Error(`Block hash not found for block number ${blockNumber}`); } @@ -60,7 +60,7 @@ export class L2TipsStore implements L2BlockStreamEventHandler, L2BlockStreamLoca break; case 'chain-finalized': await this.l2TipsStore.set('finalized', event.blockNumber); - for (const key of this.l2BlockHashesStore.keys({ end: event.blockNumber })) { + for await (const key of this.l2BlockHashesStore.keysAsync({ end: event.blockNumber })) { await this.l2BlockHashesStore.delete(key); } break; diff --git a/yarn-project/kv-store/src/utils.ts b/yarn-project/kv-store/src/utils.ts index 25b651d0922..03e0f327f38 100644 --- a/yarn-project/kv-store/src/utils.ts +++ b/yarn-project/kv-store/src/utils.ts @@ -1,30 +1,9 @@ import { type EthAddress } from '@aztec/foundation/eth-address'; -import { type Logger, createDebugLogger } from '@aztec/foundation/log'; +import { type Logger } from '@aztec/foundation/log'; -import { join } from 'path'; - -import { type DataStoreConfig } from './config.js'; -import { type AztecKVStore } from './interfaces/store.js'; -import { AztecLmdbStore } from './lmdb/store.js'; - -export function createStore(name: string, config: DataStoreConfig, log: Logger = createDebugLogger('aztec:kv-store')) { - let { dataDirectory } = config; - if (typeof dataDirectory !== 'undefined') { - dataDirectory = join(dataDirectory, name); - } - - log.info( - dataDirectory - ? `Creating ${name} data store at directory ${dataDirectory} with map size ${config.dataStoreMapSizeKB} KB` - : `Creating ${name} ephemeral data store with map size ${config.dataStoreMapSizeKB} KB`, - ); - - const store = AztecLmdbStore.open(dataDirectory, config.dataStoreMapSizeKB, false); - if (config.l1Contracts?.rollupAddress) { - return initStoreForRollup(store, config.l1Contracts.rollupAddress, log); - } - return store; -} +import { type AztecAsyncSingleton, type AztecSingleton } from './interfaces/singleton.js'; +import { type AztecAsyncKVStore, type AztecKVStore } from './interfaces/store.js'; +import { isSyncStore } from './interfaces/utils.js'; /** * Clears the store if the rollup address does not match the one stored in the database. @@ -33,7 +12,7 @@ export function createStore(name: string, config: DataStoreConfig, log: Logger = * @param rollupAddress - The ETH address of the rollup contract * @returns A promise that resolves when the store is cleared, or rejects if the rollup address does not match */ -async function initStoreForRollup( +export async function initStoreForRollup( store: T, rollupAddress: EthAddress, log?: Logger, @@ -43,7 +22,9 @@ async function initStoreForRollup( } const rollupAddressValue = store.openSingleton>('rollupAddress'); const rollupAddressString = rollupAddress.toString(); - const storedRollupAddressString = rollupAddressValue.get(); + const storedRollupAddressString = isSyncStore(store) + ? (rollupAddressValue as AztecSingleton>).get() + : await (rollupAddressValue as AztecAsyncSingleton>).getAsync(); if (typeof storedRollupAddressString !== 'undefined' && storedRollupAddressString !== rollupAddressString) { log?.warn(`Rollup address mismatch. Clearing entire database...`, { @@ -57,13 +38,3 @@ async function initStoreForRollup( await rollupAddressValue.set(rollupAddressString); return store; } - -/** - * Opens a temporary store for testing purposes. - * @param ephemeral - true if the store should only exist in memory and not automatically be flushed to disk. Optional - * @returns A new store - */ -export function openTmpStore(ephemeral: boolean = false): AztecLmdbStore { - const mapSize = 1024 * 1024 * 10; // 10 GB map size - return AztecLmdbStore.open(undefined, mapSize, ephemeral); -} diff --git a/yarn-project/kv-store/web-test-runner.config.mjs b/yarn-project/kv-store/web-test-runner.config.mjs new file mode 100644 index 00000000000..19811eec487 --- /dev/null +++ b/yarn-project/kv-store/web-test-runner.config.mjs @@ -0,0 +1,24 @@ +import { defaultReporter } from '@web/test-runner'; +import { summaryReporter } from '@web/test-runner'; +import { fileURLToPath } from 'url'; +import { esbuildPlugin } from '@web/dev-server-esbuild'; +import { playwrightLauncher } from '@web/test-runner-playwright'; + +const reporter = process.env.CI ? summaryReporter() : defaultReporter(); + +export default { + browsers: [ + playwrightLauncher({ product: 'chromium' }), + // playwrightLauncher({ product: "webkit" }), + // playwrightLauncher({ product: "firefox" }), + ], + plugins: [ + esbuildPlugin({ + ts: true, + }), + ], + files: ['./src/**/indexeddb/*.test.ts'], + rootDir: fileURLToPath(new URL('../', import.meta.url)), + nodeResolve: true, + reporters: [reporter], +}; diff --git a/yarn-project/merkle-tree/src/snapshots/append_only_snapshot.test.ts b/yarn-project/merkle-tree/src/snapshots/append_only_snapshot.test.ts index e68bde0ee71..094953b0661 100644 --- a/yarn-project/merkle-tree/src/snapshots/append_only_snapshot.test.ts +++ b/yarn-project/merkle-tree/src/snapshots/append_only_snapshot.test.ts @@ -1,7 +1,7 @@ import { Fr } from '@aztec/foundation/fields'; import { type FromBuffer } from '@aztec/foundation/serialize'; import { type AztecKVStore } from '@aztec/kv-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { Pedersen, StandardTree, newTree } from '../index.js'; import { AppendOnlySnapshotBuilder } from './append_only_snapshot.js'; diff --git a/yarn-project/merkle-tree/src/snapshots/full_snapshot.test.ts b/yarn-project/merkle-tree/src/snapshots/full_snapshot.test.ts index be8a8572f6c..35b0a3a9c4a 100644 --- a/yarn-project/merkle-tree/src/snapshots/full_snapshot.test.ts +++ b/yarn-project/merkle-tree/src/snapshots/full_snapshot.test.ts @@ -1,7 +1,7 @@ import { Fr } from '@aztec/foundation/fields'; import { type FromBuffer } from '@aztec/foundation/serialize'; import { type AztecKVStore } from '@aztec/kv-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { Pedersen, StandardTree, newTree } from '../index.js'; import { FullTreeSnapshotBuilder } from './full_snapshot.js'; diff --git a/yarn-project/merkle-tree/src/snapshots/indexed_tree_snapshot.test.ts b/yarn-project/merkle-tree/src/snapshots/indexed_tree_snapshot.test.ts index 75679d4904a..ed25a419e5e 100644 --- a/yarn-project/merkle-tree/src/snapshots/indexed_tree_snapshot.test.ts +++ b/yarn-project/merkle-tree/src/snapshots/indexed_tree_snapshot.test.ts @@ -1,6 +1,6 @@ import { Fr, NullifierLeaf, NullifierLeafPreimage } from '@aztec/circuits.js'; import { type AztecKVStore } from '@aztec/kv-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { type Hasher } from '@aztec/types/interfaces'; import { Pedersen, newTree } from '../index.js'; diff --git a/yarn-project/merkle-tree/src/sparse_tree/sparse_tree.test.ts b/yarn-project/merkle-tree/src/sparse_tree/sparse_tree.test.ts index 56cbaee0a58..fac97ade47e 100644 --- a/yarn-project/merkle-tree/src/sparse_tree/sparse_tree.test.ts +++ b/yarn-project/merkle-tree/src/sparse_tree/sparse_tree.test.ts @@ -3,7 +3,7 @@ import { randomBigInt } from '@aztec/foundation/crypto'; import { Fr } from '@aztec/foundation/fields'; import { createDebugLogger } from '@aztec/foundation/log'; import { type AztecKVStore } from '@aztec/kv-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { type Hasher } from '@aztec/types/interfaces'; import { INITIAL_LEAF, newTree } from '../index.js'; diff --git a/yarn-project/merkle-tree/src/standard_indexed_tree/test/standard_indexed_tree.test.ts b/yarn-project/merkle-tree/src/standard_indexed_tree/test/standard_indexed_tree.test.ts index d15aa61326e..0cd8dcc4ead 100644 --- a/yarn-project/merkle-tree/src/standard_indexed_tree/test/standard_indexed_tree.test.ts +++ b/yarn-project/merkle-tree/src/standard_indexed_tree/test/standard_indexed_tree.test.ts @@ -9,7 +9,7 @@ import { import { toBufferBE } from '@aztec/foundation/bigint-buffer'; import { type FromBuffer } from '@aztec/foundation/serialize'; import { type AztecKVStore } from '@aztec/kv-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { type Hasher } from '@aztec/types/interfaces'; import { INITIAL_LEAF, type MerkleTree, Pedersen, loadTree, newTree } from '../../index.js'; diff --git a/yarn-project/merkle-tree/src/standard_tree/standard_tree.test.ts b/yarn-project/merkle-tree/src/standard_tree/standard_tree.test.ts index b01409eb14c..5068474e024 100644 --- a/yarn-project/merkle-tree/src/standard_tree/standard_tree.test.ts +++ b/yarn-project/merkle-tree/src/standard_tree/standard_tree.test.ts @@ -1,7 +1,7 @@ import { Fr } from '@aztec/foundation/fields'; import { type FromBuffer } from '@aztec/foundation/serialize'; import { type AztecKVStore } from '@aztec/kv-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { type Hasher } from '@aztec/types/interfaces'; import { loadTree } from '../load_tree.js'; diff --git a/yarn-project/merkle-tree/src/test/standard_based_test_suite.ts b/yarn-project/merkle-tree/src/test/standard_based_test_suite.ts index 6f8fc6d0987..f11033ae76e 100644 --- a/yarn-project/merkle-tree/src/test/standard_based_test_suite.ts +++ b/yarn-project/merkle-tree/src/test/standard_based_test_suite.ts @@ -1,7 +1,7 @@ import { SiblingPath } from '@aztec/circuit-types'; import { Fr } from '@aztec/foundation/fields'; import { type AztecKVStore } from '@aztec/kv-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { type Hasher } from '@aztec/types/interfaces'; import { INITIAL_LEAF, Pedersen } from '../index.js'; diff --git a/yarn-project/merkle-tree/src/test/test_suite.ts b/yarn-project/merkle-tree/src/test/test_suite.ts index dba34f92d8f..3c6b9772dcd 100644 --- a/yarn-project/merkle-tree/src/test/test_suite.ts +++ b/yarn-project/merkle-tree/src/test/test_suite.ts @@ -1,6 +1,6 @@ import { SiblingPath } from '@aztec/circuit-types'; import { type AztecKVStore } from '@aztec/kv-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { type Hasher } from '@aztec/types/interfaces'; import { Pedersen } from '../index.js'; diff --git a/yarn-project/merkle-tree/src/unbalanced_tree.test.ts b/yarn-project/merkle-tree/src/unbalanced_tree.test.ts index 14ee0252ee4..7851151a64d 100644 --- a/yarn-project/merkle-tree/src/unbalanced_tree.test.ts +++ b/yarn-project/merkle-tree/src/unbalanced_tree.test.ts @@ -1,7 +1,7 @@ import { sha256Trunc } from '@aztec/foundation/crypto'; import { Fr } from '@aztec/foundation/fields'; import { type FromBuffer } from '@aztec/foundation/serialize'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { type Hasher } from '@aztec/types/interfaces'; import { SHA256Trunc } from './sha_256.js'; diff --git a/yarn-project/noir-protocol-circuits-types/src/scripts/generate_private_kernel_reset_data.ts b/yarn-project/noir-protocol-circuits-types/src/scripts/generate_private_kernel_reset_data.ts index f415b887b72..3ce3065dd95 100644 --- a/yarn-project/noir-protocol-circuits-types/src/scripts/generate_private_kernel_reset_data.ts +++ b/yarn-project/noir-protocol-circuits-types/src/scripts/generate_private_kernel_reset_data.ts @@ -12,7 +12,7 @@ import { } from '@aztec/circuits.js'; import { createConsoleLogger } from '@aztec/foundation/log'; -import fs from 'fs/promises'; +import { promises as fs } from 'fs'; const log = createConsoleLogger('aztec:autogenerate'); diff --git a/yarn-project/noir-protocol-circuits-types/src/scripts/generate_ts_from_abi.ts b/yarn-project/noir-protocol-circuits-types/src/scripts/generate_ts_from_abi.ts index a6b6ceae2ea..e5c07dead20 100644 --- a/yarn-project/noir-protocol-circuits-types/src/scripts/generate_ts_from_abi.ts +++ b/yarn-project/noir-protocol-circuits-types/src/scripts/generate_ts_from_abi.ts @@ -3,7 +3,7 @@ import { createConsoleLogger } from '@aztec/foundation/log'; import { codegen } from '@noir-lang/noir_codegen'; import { type CompiledCircuit } from '@noir-lang/types'; import { pascalCase } from 'change-case'; -import fs from 'fs/promises'; +import { promises as fs } from 'fs'; const log = createConsoleLogger('aztec:autogenerate'); diff --git a/yarn-project/noir-protocol-circuits-types/src/scripts/generate_vk_hashes.ts b/yarn-project/noir-protocol-circuits-types/src/scripts/generate_vk_hashes.ts index a0a2573e9e0..418f2451b44 100644 --- a/yarn-project/noir-protocol-circuits-types/src/scripts/generate_vk_hashes.ts +++ b/yarn-project/noir-protocol-circuits-types/src/scripts/generate_vk_hashes.ts @@ -3,7 +3,7 @@ import { hashVK } from '@aztec/circuits.js/hash'; import { createConsoleLogger } from '@aztec/foundation/log'; import { fileURLToPath } from '@aztec/foundation/url'; -import fs from 'fs/promises'; +import { promises as fs } from 'fs'; import { join } from 'path'; const log = createConsoleLogger('aztec:autogenerate'); diff --git a/yarn-project/p2p-bootstrap/src/index.ts b/yarn-project/p2p-bootstrap/src/index.ts index 37328151890..e48edcff8e2 100644 --- a/yarn-project/p2p-bootstrap/src/index.ts +++ b/yarn-project/p2p-bootstrap/src/index.ts @@ -1,5 +1,5 @@ import { createDebugLogger } from '@aztec/foundation/log'; -import { createStore } from '@aztec/kv-store/utils'; +import { createStore } from '@aztec/kv-store/lmdb'; import { type BootnodeConfig, BootstrapNode } from '@aztec/p2p'; import { type TelemetryClient } from '@aztec/telemetry-client'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; diff --git a/yarn-project/p2p/src/client/index.ts b/yarn-project/p2p/src/client/index.ts index 05056a3c54a..ad0af77b4fd 100644 --- a/yarn-project/p2p/src/client/index.ts +++ b/yarn-project/p2p/src/client/index.ts @@ -2,7 +2,7 @@ import type { ClientProtocolCircuitVerifier, L2BlockSource, WorldStateSynchroniz import { createDebugLogger } from '@aztec/foundation/log'; import { type AztecKVStore } from '@aztec/kv-store'; import { type DataStoreConfig } from '@aztec/kv-store/config'; -import { createStore } from '@aztec/kv-store/utils'; +import { createStore } from '@aztec/kv-store/lmdb'; import { type TelemetryClient } from '@aztec/telemetry-client'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; diff --git a/yarn-project/p2p/src/client/p2p_client.test.ts b/yarn-project/p2p/src/client/p2p_client.test.ts index 219d2caeded..24a112ae839 100644 --- a/yarn-project/p2p/src/client/p2p_client.test.ts +++ b/yarn-project/p2p/src/client/p2p_client.test.ts @@ -4,7 +4,7 @@ import { Fr } from '@aztec/circuits.js'; import { retryUntil } from '@aztec/foundation/retry'; import { sleep } from '@aztec/foundation/sleep'; import { type AztecKVStore } from '@aztec/kv-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { expect, jest } from '@jest/globals'; diff --git a/yarn-project/p2p/src/mem_pools/tx_pool/aztec_kv_tx_pool.test.ts b/yarn-project/p2p/src/mem_pools/tx_pool/aztec_kv_tx_pool.test.ts index 4bd4f3e63f4..dfc5df7f105 100644 --- a/yarn-project/p2p/src/mem_pools/tx_pool/aztec_kv_tx_pool.test.ts +++ b/yarn-project/p2p/src/mem_pools/tx_pool/aztec_kv_tx_pool.test.ts @@ -1,4 +1,4 @@ -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { AztecKVTxPool } from './aztec_kv_tx_pool.js'; diff --git a/yarn-project/p2p/src/mocks/index.ts b/yarn-project/p2p/src/mocks/index.ts index 38127a88daf..d0524378806 100644 --- a/yarn-project/p2p/src/mocks/index.ts +++ b/yarn-project/p2p/src/mocks/index.ts @@ -5,7 +5,7 @@ import { type WorldStateSynchronizer, } from '@aztec/circuit-types'; import { type DataStoreConfig } from '@aztec/kv-store/config'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { type TelemetryClient } from '@aztec/telemetry-client'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; diff --git a/yarn-project/p2p/src/service/discv5_service.test.ts b/yarn-project/p2p/src/service/discv5_service.test.ts index 42f207ada15..1f2ce69cb34 100644 --- a/yarn-project/p2p/src/service/discv5_service.test.ts +++ b/yarn-project/p2p/src/service/discv5_service.test.ts @@ -1,6 +1,6 @@ import { sleep } from '@aztec/foundation/sleep'; import { type AztecKVStore } from '@aztec/kv-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { jest } from '@jest/globals'; diff --git a/yarn-project/p2p/src/service/reqresp/reqresp.integration.test.ts b/yarn-project/p2p/src/service/reqresp/reqresp.integration.test.ts index c6545c5b493..4584db095e7 100644 --- a/yarn-project/p2p/src/service/reqresp/reqresp.integration.test.ts +++ b/yarn-project/p2p/src/service/reqresp/reqresp.integration.test.ts @@ -5,7 +5,7 @@ import { createDebugLogger } from '@aztec/foundation/log'; import { sleep } from '@aztec/foundation/sleep'; import { type AztecKVStore } from '@aztec/kv-store'; import { type DataStoreConfig } from '@aztec/kv-store/config'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { SignableENR } from '@chainsafe/enr'; import { describe, expect, it, jest } from '@jest/globals'; diff --git a/yarn-project/p2p/src/utils.test.ts b/yarn-project/p2p/src/utils.test.ts index dc00b340060..89e9174b577 100644 --- a/yarn-project/p2p/src/utils.test.ts +++ b/yarn-project/p2p/src/utils.test.ts @@ -1,5 +1,5 @@ import { type AztecKVStore } from '@aztec/kv-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { generateKeyPair, marshalPrivateKey } from '@libp2p/crypto/keys'; import { createSecp256k1PeerId } from '@libp2p/peer-id-factory'; diff --git a/yarn-project/protocol-contracts/src/scripts/generate_data.ts b/yarn-project/protocol-contracts/src/scripts/generate_data.ts index eebd16860fe..d1044644e62 100644 --- a/yarn-project/protocol-contracts/src/scripts/generate_data.ts +++ b/yarn-project/protocol-contracts/src/scripts/generate_data.ts @@ -18,7 +18,7 @@ import { createConsoleLogger } from '@aztec/foundation/log'; import { loadContractArtifact } from '@aztec/types/abi'; import { type NoirCompiledContract } from '@aztec/types/noir'; -import fs from 'fs/promises'; +import { promises as fs } from 'fs'; import path from 'path'; import { buildProtocolContractTree } from '../build_protocol_contract_tree.js'; diff --git a/yarn-project/prover-client/src/mocks/fixtures.ts b/yarn-project/prover-client/src/mocks/fixtures.ts index c6f54f98d41..cbcc2596890 100644 --- a/yarn-project/prover-client/src/mocks/fixtures.ts +++ b/yarn-project/prover-client/src/mocks/fixtures.ts @@ -15,7 +15,7 @@ import { type DebugLogger } from '@aztec/foundation/log'; import { fileURLToPath } from '@aztec/foundation/url'; import { NativeACVMSimulator, type SimulationProvider, WASMSimulator } from '@aztec/simulator'; -import * as fs from 'fs/promises'; +import { promises as fs } from 'fs'; import path from 'path'; const { diff --git a/yarn-project/prover-client/src/mocks/test_context.ts b/yarn-project/prover-client/src/mocks/test_context.ts index 049218d91a4..2211b10cb3b 100644 --- a/yarn-project/prover-client/src/mocks/test_context.ts +++ b/yarn-project/prover-client/src/mocks/test_context.ts @@ -27,7 +27,7 @@ import { type MerkleTreeAdminDatabase } from '@aztec/world-state'; import { NativeWorldStateService } from '@aztec/world-state/native'; import { jest } from '@jest/globals'; -import * as fs from 'fs/promises'; +import { promises as fs } from 'fs'; import { mock } from 'jest-mock-extended'; import { TestCircuitProver } from '../../../bb-prover/src/test/test_circuit_prover.js'; diff --git a/yarn-project/prover-client/src/proving_broker/proving_broker.test.ts b/yarn-project/prover-client/src/proving_broker/proving_broker.test.ts index 76eef870b21..304d30a3b37 100644 --- a/yarn-project/prover-client/src/proving_broker/proving_broker.test.ts +++ b/yarn-project/prover-client/src/proving_broker/proving_broker.test.ts @@ -1,6 +1,6 @@ import { type ProofUri, type ProvingJob, type ProvingJobId, ProvingRequestType } from '@aztec/circuit-types'; import { randomBytes } from '@aztec/foundation/crypto'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { jest } from '@jest/globals'; diff --git a/yarn-project/prover-node/src/prover-node.test.ts b/yarn-project/prover-node/src/prover-node.test.ts index bc8ca80897b..a9f4be5f2e0 100644 --- a/yarn-project/prover-node/src/prover-node.test.ts +++ b/yarn-project/prover-node/src/prover-node.test.ts @@ -16,7 +16,7 @@ import { type ContractDataSource, EthAddress, Fr } from '@aztec/circuits.js'; import { times } from '@aztec/foundation/collection'; import { Signature } from '@aztec/foundation/eth-signature'; import { sleep } from '@aztec/foundation/sleep'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { type BootstrapNode, InMemoryAttestationPool, diff --git a/yarn-project/pxe/.gitignore b/yarn-project/pxe/.gitignore new file mode 100644 index 00000000000..3993ba71067 --- /dev/null +++ b/yarn-project/pxe/.gitignore @@ -0,0 +1 @@ +src/config/package_info.ts diff --git a/yarn-project/pxe/package.json b/yarn-project/pxe/package.json index 2d84ed81f13..69ced063f46 100644 --- a/yarn-project/pxe/package.json +++ b/yarn-project/pxe/package.json @@ -2,7 +2,13 @@ "name": "@aztec/pxe", "version": "0.1.0", "type": "module", - "exports": "./dest/index.js", + "exports": { + ".": "./dest/index.js", + "./service": "./dest/pxe_service/index.js", + "./config": "./dest/config/index.js", + "./database": "./dest/database/index.js", + "./kernel_prover": "./dest/kernel_prover/index.js" + }, "bin": "./dest/bin/index.js", "typedocOptions": { "entryPoints": [ @@ -12,16 +18,18 @@ "tsconfig": "./tsconfig.json" }, "scripts": { - "build": "yarn clean && tsc -b", + "build": "yarn clean && yarn generate:package_info && tsc -b", "build:dev": "tsc -b --watch", - "clean": "rm -rf ./dest .tsbuildinfo", + "clean": "rm -rf ./dest .tsbuildinfo ./src/config/package_info.ts", "formatting": "run -T prettier --check ./src && run -T eslint ./src", "formatting:fix": "run -T eslint --fix ./src && run -T prettier -w ./src", + "generate:package_info": "node ./scripts/generate_package_info.js", "test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules ../node_modules/.bin/jest --passWithNoTests", "start": "DEBUG='aztec:*' && node ./dest/bin/index.js" }, "inherits": [ - "../package.common.json" + "../package.common.json", + "./package.local.json" ], "jest": { "moduleNameMapper": { diff --git a/yarn-project/pxe/package.local.json b/yarn-project/pxe/package.local.json new file mode 100644 index 00000000000..ee72375cfea --- /dev/null +++ b/yarn-project/pxe/package.local.json @@ -0,0 +1,7 @@ +{ + "scripts": { + "build": "yarn clean && yarn generate:package_info && tsc -b", + "clean": "rm -rf ./dest .tsbuildinfo ./src/config/package_info.ts", + "generate:package_info": "node ./scripts/generate_package_info.js" + } +} \ No newline at end of file diff --git a/yarn-project/pxe/scripts/generate_package_info.js b/yarn-project/pxe/scripts/generate_package_info.js new file mode 100644 index 00000000000..2b0f2e8212f --- /dev/null +++ b/yarn-project/pxe/scripts/generate_package_info.js @@ -0,0 +1,14 @@ +import { readFileSync, writeFileSync } from 'fs'; +import { dirname, join } from 'path'; +import { fileURLToPath } from 'url'; + +const currentDir = dirname(fileURLToPath(import.meta.url)); + +const { version, name } = JSON.parse(readFileSync(join(currentDir, '../package.json'))); + +writeFileSync(join(currentDir, '../src/config/package_info.ts'), +`export function getPackageInfo() { + return { version: '${version}', name: '${name}' }; +} +`); + diff --git a/yarn-project/pxe/src/bin/index.ts b/yarn-project/pxe/src/bin/index.ts index ac3f0d6f84e..fcf72856dc4 100644 --- a/yarn-project/pxe/src/bin/index.ts +++ b/yarn-project/pxe/src/bin/index.ts @@ -5,7 +5,7 @@ import { createDebugLogger } from '@aztec/foundation/log'; import { getPXEServiceConfig } from '../config/index.js'; import { startPXEHttpServer } from '../pxe_http/index.js'; -import { createPXEService } from '../pxe_service/index.js'; +import { createPXEService } from '../utils/index.js'; const { PXE_PORT = 8080, AZTEC_NODE_URL = 'http://localhost:8079' } = process.env; diff --git a/yarn-project/pxe/src/config/index.ts b/yarn-project/pxe/src/config/index.ts index d97cacbdb92..4841f7ce6fd 100644 --- a/yarn-project/pxe/src/config/index.ts +++ b/yarn-project/pxe/src/config/index.ts @@ -8,10 +8,6 @@ import { import { type DataStoreConfig, dataConfigMappings } from '@aztec/kv-store/config'; import { type Network } from '@aztec/types/network'; -import { readFileSync } from 'fs'; -import { dirname, resolve } from 'path'; -import { fileURLToPath } from 'url'; - /** * Temporary configuration until WASM can be used instead of native */ @@ -128,13 +124,3 @@ export function getCliPXEOptions(): CliPXEOptions & PXEServiceConfig { proverEnabled: pxeConfig.proverEnabled || !!cliOptions.network, }; } - -/** - * Returns package name and version. - */ -export function getPackageInfo() { - const packageJsonPath = resolve(dirname(fileURLToPath(import.meta.url)), '../../package.json'); - const { version, name } = JSON.parse(readFileSync(packageJsonPath).toString()); - - return { version, name }; -} diff --git a/yarn-project/pxe/src/contract_data_oracle/index.ts b/yarn-project/pxe/src/contract_data_oracle/index.ts index d5f6f9e5c0d..981366f3602 100644 --- a/yarn-project/pxe/src/contract_data_oracle/index.ts +++ b/yarn-project/pxe/src/contract_data_oracle/index.ts @@ -7,7 +7,7 @@ import { getFunctionDebugMetadata, } from '@aztec/foundation/abi'; import { type Fr } from '@aztec/foundation/fields'; -import { ContractClassNotFoundError, ContractNotFoundError } from '@aztec/simulator'; +import { ContractClassNotFoundError, ContractNotFoundError } from '@aztec/simulator/client'; import { type ContractArtifactDatabase } from '../database/contracts/contract_artifact_db.js'; import { type ContractInstanceDatabase } from '../database/contracts/contract_instance_db.js'; diff --git a/yarn-project/pxe/src/database/incoming_note_dao.ts b/yarn-project/pxe/src/database/incoming_note_dao.ts index d2dc2d38815..2c9c62821cb 100644 --- a/yarn-project/pxe/src/database/incoming_note_dao.ts +++ b/yarn-project/pxe/src/database/incoming_note_dao.ts @@ -3,7 +3,7 @@ import { AztecAddress, Fr, Point, type PublicKey } from '@aztec/circuits.js'; import { NoteSelector } from '@aztec/foundation/abi'; import { toBigIntBE } from '@aztec/foundation/bigint-buffer'; import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize'; -import { type NoteData } from '@aztec/simulator'; +import { type NoteData } from '@aztec/simulator/acvm'; import { type NoteInfo } from '../note_decryption_utils/index.js'; diff --git a/yarn-project/pxe/src/database/kv_pxe_database.test.ts b/yarn-project/pxe/src/database/kv_pxe_database.test.ts index 501e8de9921..a965cc964a6 100644 --- a/yarn-project/pxe/src/database/kv_pxe_database.test.ts +++ b/yarn-project/pxe/src/database/kv_pxe_database.test.ts @@ -1,4 +1,4 @@ -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { KVPxeDatabase } from './kv_pxe_database.js'; import { describePxeDatabase } from './pxe_database_test_suite.js'; @@ -6,8 +6,8 @@ import { describePxeDatabase } from './pxe_database_test_suite.js'; describe('KVPxeDatabase', () => { let database: KVPxeDatabase; - beforeEach(() => { - database = new KVPxeDatabase(openTmpStore()); + beforeEach(async () => { + database = await KVPxeDatabase.create(openTmpStore()); }); describePxeDatabase(() => database); diff --git a/yarn-project/pxe/src/database/kv_pxe_database.ts b/yarn-project/pxe/src/database/kv_pxe_database.ts index bdb6b26336d..ba9e59a5e98 100644 --- a/yarn-project/pxe/src/database/kv_pxe_database.ts +++ b/yarn-project/pxe/src/database/kv_pxe_database.ts @@ -17,13 +17,14 @@ import { import { type ContractArtifact, FunctionSelector, FunctionType } from '@aztec/foundation/abi'; import { toBufferBE } from '@aztec/foundation/bigint-buffer'; import { Fr } from '@aztec/foundation/fields'; +import { toArray } from '@aztec/foundation/iterable'; import { - type AztecArray, - type AztecKVStore, - type AztecMap, - type AztecMultiMap, - type AztecSet, - type AztecSingleton, + type AztecAsyncArray, + type AztecAsyncKVStore, + type AztecAsyncMap, + type AztecAsyncMultiMap, + type AztecAsyncSet, + type AztecAsyncSingleton, } from '@aztec/kv-store'; import { contractArtifactFromBuffer, contractArtifactToBuffer } from '@aztec/types/abi'; @@ -35,48 +36,48 @@ import { type PxeDatabase } from './pxe_database.js'; * A PXE database backed by LMDB. */ export class KVPxeDatabase implements PxeDatabase { - #synchronizedBlock: AztecSingleton; - #completeAddresses: AztecArray; - #completeAddressIndex: AztecMap; - #addressBook: AztecSet; - #authWitnesses: AztecMap; - #capsules: AztecArray; - #notes: AztecMap; - #nullifiedNotes: AztecMap; - #nullifierToNoteId: AztecMap; - #nullifiersByBlockNumber: AztecMultiMap; - - #nullifiedNotesToScope: AztecMultiMap; - #nullifiedNotesByContract: AztecMultiMap; - #nullifiedNotesByStorageSlot: AztecMultiMap; - #nullifiedNotesByTxHash: AztecMultiMap; - #nullifiedNotesByAddressPoint: AztecMultiMap; - #nullifiedNotesByNullifier: AztecMap; - #syncedBlockPerPublicKey: AztecMap; - #contractArtifacts: AztecMap; - #contractInstances: AztecMap; - #db: AztecKVStore; - - #outgoingNotes: AztecMap; - #outgoingNotesByContract: AztecMultiMap; - #outgoingNotesByStorageSlot: AztecMultiMap; - #outgoingNotesByTxHash: AztecMultiMap; - #outgoingNotesByOvpkM: AztecMultiMap; - - #scopes: AztecSet; - #notesToScope: AztecMultiMap; - #notesByContractAndScope: Map>; - #notesByStorageSlotAndScope: Map>; - #notesByTxHashAndScope: Map>; - #notesByAddressPointAndScope: Map>; + #synchronizedBlock: AztecAsyncSingleton; + #completeAddresses: AztecAsyncArray; + #completeAddressIndex: AztecAsyncMap; + #addressBook: AztecAsyncSet; + #authWitnesses: AztecAsyncMap; + #capsules: AztecAsyncArray; + #notes: AztecAsyncMap; + #nullifiedNotes: AztecAsyncMap; + #nullifierToNoteId: AztecAsyncMap; + #nullifiersByBlockNumber: AztecAsyncMultiMap; + + #nullifiedNotesToScope: AztecAsyncMultiMap; + #nullifiedNotesByContract: AztecAsyncMultiMap; + #nullifiedNotesByStorageSlot: AztecAsyncMultiMap; + #nullifiedNotesByTxHash: AztecAsyncMultiMap; + #nullifiedNotesByAddressPoint: AztecAsyncMultiMap; + #nullifiedNotesByNullifier: AztecAsyncMap; + #syncedBlockPerPublicKey: AztecAsyncMap; + #contractArtifacts: AztecAsyncMap; + #contractInstances: AztecAsyncMap; + #db: AztecAsyncKVStore; + + #outgoingNotes: AztecAsyncMap; + #outgoingNotesByContract: AztecAsyncMultiMap; + #outgoingNotesByStorageSlot: AztecAsyncMultiMap; + #outgoingNotesByTxHash: AztecAsyncMultiMap; + #outgoingNotesByOvpkM: AztecAsyncMultiMap; + + #scopes: AztecAsyncSet; + #notesToScope: AztecAsyncMultiMap; + #notesByContractAndScope: Map>; + #notesByStorageSlotAndScope: Map>; + #notesByTxHashAndScope: Map>; + #notesByAddressPointAndScope: Map>; // Stores the last index used for each tagging secret, taking direction into account // This is necessary to avoid reusing the same index for the same secret, which happens if // sender and recipient are the same - #taggingSecretIndexesForSenders: AztecMap; - #taggingSecretIndexesForRecipients: AztecMap; + #taggingSecretIndexesForSenders: AztecAsyncMap; + #taggingSecretIndexesForRecipients: AztecAsyncMap; - constructor(private db: AztecKVStore) { + protected constructor(private db: AztecAsyncKVStore) { this.#db = db; this.#completeAddresses = db.openArray('complete_addresses'); @@ -113,22 +114,26 @@ export class KVPxeDatabase implements PxeDatabase { this.#scopes = db.openSet('scopes'); this.#notesToScope = db.openMultiMap('notes_to_scope'); - this.#notesByContractAndScope = new Map>(); - this.#notesByStorageSlotAndScope = new Map>(); - this.#notesByTxHashAndScope = new Map>(); - this.#notesByAddressPointAndScope = new Map>(); - - for (const scope of this.#scopes.entries()) { - this.#notesByContractAndScope.set(scope, db.openMultiMap(`${scope}:notes_by_contract`)); - this.#notesByStorageSlotAndScope.set(scope, db.openMultiMap(`${scope}:notes_by_storage_slot`)); - this.#notesByTxHashAndScope.set(scope, db.openMultiMap(`${scope}:notes_by_tx_hash`)); - this.#notesByAddressPointAndScope.set(scope, db.openMultiMap(`${scope}:notes_by_address_point`)); - } + this.#notesByContractAndScope = new Map>(); + this.#notesByStorageSlotAndScope = new Map>(); + this.#notesByTxHashAndScope = new Map>(); + this.#notesByAddressPointAndScope = new Map>(); this.#taggingSecretIndexesForSenders = db.openMap('tagging_secret_indexes_for_senders'); this.#taggingSecretIndexesForRecipients = db.openMap('tagging_secret_indexes_for_recipients'); } + public static async create(db: AztecAsyncKVStore): Promise { + const pxeDB = new KVPxeDatabase(db); + for await (const scope of pxeDB.#scopes.entriesAsync()) { + pxeDB.#notesByContractAndScope.set(scope, db.openMultiMap(`${scope}:notes_by_contract`)); + pxeDB.#notesByStorageSlotAndScope.set(scope, db.openMultiMap(`${scope}:notes_by_storage_slot`)); + pxeDB.#notesByTxHashAndScope.set(scope, db.openMultiMap(`${scope}:notes_by_tx_hash`)); + pxeDB.#notesByAddressPointAndScope.set(scope, db.openMultiMap(`${scope}:notes_by_address_point`)); + } + return pxeDB; + } + public async getContract( address: AztecAddress, ): Promise<(ContractInstanceWithAddress & ContractArtifact) | undefined> { @@ -157,10 +162,10 @@ export class KVPxeDatabase implements PxeDatabase { await this.#contractArtifacts.set(id.toString(), contractArtifactToBuffer(contract)); } - public getContractArtifact(id: Fr): Promise { - const contract = this.#contractArtifacts.get(id.toString()); - // TODO(@spalladino): AztecMap lies and returns Uint8Arrays instead of Buffers, hence the extra Buffer.from. - return Promise.resolve(contract && contractArtifactFromBuffer(Buffer.from(contract))); + public async getContractArtifact(id: Fr): Promise { + const contract = await this.#contractArtifacts.getAsync(id.toString()); + // TODO(@spalladino): AztecAsyncMap lies and returns Uint8Arrays instead of Buffers, hence the extra Buffer.from. + return contract && contractArtifactFromBuffer(Buffer.from(contract)); } async addContractInstance(contract: ContractInstanceWithAddress): Promise { @@ -170,13 +175,14 @@ export class KVPxeDatabase implements PxeDatabase { ); } - getContractInstance(address: AztecAddress): Promise { - const contract = this.#contractInstances.get(address.toString()); - return Promise.resolve(contract && SerializableContractInstance.fromBuffer(contract).withAddress(address)); + async getContractInstance(address: AztecAddress): Promise { + const contract = await this.#contractInstances.getAsync(address.toString()); + return contract && SerializableContractInstance.fromBuffer(contract).withAddress(address); } - getContractsAddresses(): Promise { - return Promise.resolve(Array.from(this.#contractInstances.keys()).map(AztecAddress.fromString)); + async getContractsAddresses(): Promise { + const keys = await toArray(this.#contractInstances.keysAsync()); + return keys.map(AztecAddress.fromString); } async addAuthWitness(messageHash: Fr, witness: Fr[]): Promise { @@ -186,8 +192,8 @@ export class KVPxeDatabase implements PxeDatabase { ); } - getAuthWitness(messageHash: Fr): Promise { - const witness = this.#authWitnesses.get(messageHash.toString()); + async getAuthWitness(messageHash: Fr): Promise { + const witness = await this.#authWitnesses.getAsync(messageHash.toString()); return Promise.resolve(witness?.map(w => Fr.fromBuffer(w))); } @@ -209,65 +215,69 @@ export class KVPxeDatabase implements PxeDatabase { outgoingNotes: OutgoingNoteDao[], scope: AztecAddress = AztecAddress.ZERO, ): Promise { - if (!this.#scopes.has(scope.toString())) { + if (!(await this.#scopes.hasAsync(scope.toString()))) { await this.#addScope(scope); } - return this.db.transaction(() => { + return this.db.transactionAsync(async () => { for (const dao of incomingNotes) { // store notes by their index in the notes hash tree // this provides the uniqueness we need to store individual notes // and should also return notes in the order that they were created. // Had we stored them by their nullifier, they would be returned in random order const noteIndex = toBufferBE(dao.index, 32).toString('hex'); - void this.#notes.set(noteIndex, dao.toBuffer()); - void this.#notesToScope.set(noteIndex, scope.toString()); - void this.#nullifierToNoteId.set(dao.siloedNullifier.toString(), noteIndex); - - void this.#notesByContractAndScope.get(scope.toString())!.set(dao.contractAddress.toString(), noteIndex); - void this.#notesByStorageSlotAndScope.get(scope.toString())!.set(dao.storageSlot.toString(), noteIndex); - void this.#notesByTxHashAndScope.get(scope.toString())!.set(dao.txHash.toString(), noteIndex); - void this.#notesByAddressPointAndScope.get(scope.toString())!.set(dao.addressPoint.toString(), noteIndex); + await this.#notes.set(noteIndex, dao.toBuffer()); + await this.#notesToScope.set(noteIndex, scope.toString()); + await this.#nullifierToNoteId.set(dao.siloedNullifier.toString(), noteIndex); + + await this.#notesByContractAndScope.get(scope.toString())!.set(dao.contractAddress.toString(), noteIndex); + await this.#notesByStorageSlotAndScope.get(scope.toString())!.set(dao.storageSlot.toString(), noteIndex); + await this.#notesByTxHashAndScope.get(scope.toString())!.set(dao.txHash.toString(), noteIndex); + await this.#notesByAddressPointAndScope.get(scope.toString())!.set(dao.addressPoint.toString(), noteIndex); } for (const dao of outgoingNotes) { const noteIndex = toBufferBE(dao.index, 32).toString('hex'); - void this.#outgoingNotes.set(noteIndex, dao.toBuffer()); - void this.#outgoingNotesByContract.set(dao.contractAddress.toString(), noteIndex); - void this.#outgoingNotesByStorageSlot.set(dao.storageSlot.toString(), noteIndex); - void this.#outgoingNotesByTxHash.set(dao.txHash.toString(), noteIndex); - void this.#outgoingNotesByOvpkM.set(dao.ovpkM.toString(), noteIndex); + await this.#outgoingNotes.set(noteIndex, dao.toBuffer()); + await this.#outgoingNotesByContract.set(dao.contractAddress.toString(), noteIndex); + await this.#outgoingNotesByStorageSlot.set(dao.storageSlot.toString(), noteIndex); + await this.#outgoingNotesByTxHash.set(dao.txHash.toString(), noteIndex); + await this.#outgoingNotesByOvpkM.set(dao.ovpkM.toString(), noteIndex); } }); } public removeNotesAfter(blockNumber: number): Promise { - return this.db.transaction(() => { - for (const note of this.#notes.values()) { + return this.db.transactionAsync(async () => { + const notes = await toArray(this.#notes.valuesAsync()); + for (const note of notes) { const noteDao = IncomingNoteDao.fromBuffer(note); if (noteDao.l2BlockNumber > blockNumber) { const noteIndex = toBufferBE(noteDao.index, 32).toString('hex'); - void this.#notes.delete(noteIndex); - void this.#notesToScope.delete(noteIndex); - void this.#nullifierToNoteId.delete(noteDao.siloedNullifier.toString()); - for (const scope of this.#scopes.entries()) { - void this.#notesByAddressPointAndScope.get(scope)!.deleteValue(noteDao.addressPoint.toString(), noteIndex); - void this.#notesByTxHashAndScope.get(scope)!.deleteValue(noteDao.txHash.toString(), noteIndex); - void this.#notesByContractAndScope.get(scope)!.deleteValue(noteDao.contractAddress.toString(), noteIndex); - void this.#notesByStorageSlotAndScope.get(scope)!.deleteValue(noteDao.storageSlot.toString(), noteIndex); + await this.#notes.delete(noteIndex); + await this.#notesToScope.delete(noteIndex); + await this.#nullifierToNoteId.delete(noteDao.siloedNullifier.toString()); + const scopes = await toArray(this.#scopes.entriesAsync()); + for (const scope of scopes) { + await this.#notesByAddressPointAndScope.get(scope)!.deleteValue(noteDao.addressPoint.toString(), noteIndex); + await this.#notesByTxHashAndScope.get(scope)!.deleteValue(noteDao.txHash.toString(), noteIndex); + await this.#notesByContractAndScope.get(scope)!.deleteValue(noteDao.contractAddress.toString(), noteIndex); + await this.#notesByStorageSlotAndScope.get(scope)!.deleteValue(noteDao.storageSlot.toString(), noteIndex); } } } - for (const note of this.#outgoingNotes.values()) { + const outgoingNotes = await toArray(this.#outgoingNotes.valuesAsync()); + + for (const note of outgoingNotes) { const noteDao = OutgoingNoteDao.fromBuffer(note); if (noteDao.l2BlockNumber > blockNumber) { const noteIndex = toBufferBE(noteDao.index, 32).toString('hex'); - void this.#outgoingNotes.delete(noteIndex); - void this.#outgoingNotesByContract.deleteValue(noteDao.contractAddress.toString(), noteIndex); - void this.#outgoingNotesByStorageSlot.deleteValue(noteDao.storageSlot.toString(), noteIndex); - void this.#outgoingNotesByTxHash.deleteValue(noteDao.txHash.toString(), noteIndex); - void this.#outgoingNotesByOvpkM.deleteValue(noteDao.ovpkM.toString(), noteIndex); + await this.#outgoingNotes.delete(noteIndex); + await this.#outgoingNotesByContract.deleteValue(noteDao.contractAddress.toString(), noteIndex); + await this.#outgoingNotesByStorageSlot.deleteValue(noteDao.storageSlot.toString(), noteIndex); + await this.#outgoingNotesByTxHash.deleteValue(noteDao.txHash.toString(), noteIndex); + await this.#outgoingNotesByOvpkM.deleteValue(noteDao.ovpkM.toString(), noteIndex); } } }); @@ -276,101 +286,112 @@ export class KVPxeDatabase implements PxeDatabase { public async unnullifyNotesAfter(blockNumber: number): Promise { const nullifiersToUndo: string[] = []; const currentBlockNumber = blockNumber + 1; - const maxBlockNumber = this.getBlockNumber() ?? currentBlockNumber; + const maxBlockNumber = (await this.getBlockNumber()) ?? currentBlockNumber; for (let i = currentBlockNumber; i <= maxBlockNumber; i++) { - nullifiersToUndo.push(...this.#nullifiersByBlockNumber.getValues(i)); + nullifiersToUndo.push(...(await toArray(this.#nullifiersByBlockNumber.getValuesAsync(i)))); } - const notesIndexesToReinsert = await this.db.transaction(() => - nullifiersToUndo.map(nullifier => this.#nullifiedNotesByNullifier.get(nullifier)), + const notesIndexesToReinsert = await Promise.all( + nullifiersToUndo.map(nullifier => this.#nullifiedNotesByNullifier.getAsync(nullifier)), + ); + const notNullNoteIndexes = notesIndexesToReinsert.filter(noteIndex => noteIndex != undefined); + const nullifiedNoteBuffers = await Promise.all( + notNullNoteIndexes.map(noteIndex => this.#nullifiedNotes.getAsync(noteIndex!)), ); - const nullifiedNoteBuffers = await this.db.transaction(() => { - return notesIndexesToReinsert - .filter(noteIndex => noteIndex != undefined) - .map(noteIndex => this.#nullifiedNotes.get(noteIndex!)); - }); const noteDaos = nullifiedNoteBuffers .filter(buffer => buffer != undefined) .map(buffer => IncomingNoteDao.fromBuffer(buffer!)); - await this.db.transaction(() => { + await this.db.transactionAsync(async () => { for (const dao of noteDaos) { const noteIndex = toBufferBE(dao.index, 32).toString('hex'); - void this.#notes.set(noteIndex, dao.toBuffer()); - void this.#nullifierToNoteId.set(dao.siloedNullifier.toString(), noteIndex); + await this.#notes.set(noteIndex, dao.toBuffer()); + await this.#nullifierToNoteId.set(dao.siloedNullifier.toString(), noteIndex); - let scopes = Array.from(this.#nullifiedNotesToScope.getValues(noteIndex) ?? []); + let scopes = (await toArray(this.#nullifiedNotesToScope.getValuesAsync(noteIndex))) ?? []; if (scopes.length === 0) { scopes = [new AztecAddress(dao.addressPoint.x).toString()]; } for (const scope of scopes) { - void this.#notesByContractAndScope.get(scope)!.set(dao.contractAddress.toString(), noteIndex); - void this.#notesByStorageSlotAndScope.get(scope)!.set(dao.storageSlot.toString(), noteIndex); - void this.#notesByTxHashAndScope.get(scope)!.set(dao.txHash.toString(), noteIndex); - void this.#notesByAddressPointAndScope.get(scope)!.set(dao.addressPoint.toString(), noteIndex); - void this.#notesToScope.set(noteIndex, scope); + await this.#notesByContractAndScope.get(scope.toString())!.set(dao.contractAddress.toString(), noteIndex); + await this.#notesByStorageSlotAndScope.get(scope.toString())!.set(dao.storageSlot.toString(), noteIndex); + await this.#notesByTxHashAndScope.get(scope.toString())!.set(dao.txHash.toString(), noteIndex); + await this.#notesByAddressPointAndScope.get(scope.toString())!.set(dao.addressPoint.toString(), noteIndex); + await this.#notesToScope.set(noteIndex, scope); } - void this.#nullifiedNotes.delete(noteIndex); - void this.#nullifiedNotesToScope.delete(noteIndex); - void this.#nullifiersByBlockNumber.deleteValue(dao.l2BlockNumber, dao.siloedNullifier.toString()); - void this.#nullifiedNotesByContract.deleteValue(dao.contractAddress.toString(), noteIndex); - void this.#nullifiedNotesByStorageSlot.deleteValue(dao.storageSlot.toString(), noteIndex); - void this.#nullifiedNotesByTxHash.deleteValue(dao.txHash.toString(), noteIndex); - void this.#nullifiedNotesByAddressPoint.deleteValue(dao.addressPoint.toString(), noteIndex); - void this.#nullifiedNotesByNullifier.delete(dao.siloedNullifier.toString()); + await this.#nullifiedNotes.delete(noteIndex); + await this.#nullifiedNotesToScope.delete(noteIndex); + await this.#nullifiersByBlockNumber.deleteValue(dao.l2BlockNumber, dao.siloedNullifier.toString()); + await this.#nullifiedNotesByContract.deleteValue(dao.contractAddress.toString(), noteIndex); + await this.#nullifiedNotesByStorageSlot.deleteValue(dao.storageSlot.toString(), noteIndex); + await this.#nullifiedNotesByTxHash.deleteValue(dao.txHash.toString(), noteIndex); + await this.#nullifiedNotesByAddressPoint.deleteValue(dao.addressPoint.toString(), noteIndex); + await this.#nullifiedNotesByNullifier.delete(dao.siloedNullifier.toString()); } }); } - getIncomingNotes(filter: IncomingNotesFilter): Promise { + async getIncomingNotes(filter: IncomingNotesFilter): Promise { const publicKey: PublicKey | undefined = filter.owner ? filter.owner.toAddressPoint() : undefined; filter.status = filter.status ?? NoteStatus.ACTIVE; const candidateNoteSources = []; - filter.scopes ??= [...this.#scopes.entries()].map(addressString => AztecAddress.fromString(addressString)); + filter.scopes ??= (await toArray(this.#scopes.entriesAsync())).map(addressString => + AztecAddress.fromString(addressString), + ); - const activeNoteIdsPerScope: IterableIterator[] = []; + const activeNoteIdsPerScope: string[][] = []; for (const scope of new Set(filter.scopes)) { const formattedScopeString = scope.toString(); - if (!this.#scopes.has(formattedScopeString)) { + if (!this.#scopes.hasAsync(formattedScopeString)) { throw new Error('Trying to get incoming notes of an scope that is not in the PXE database'); } activeNoteIdsPerScope.push( publicKey - ? this.#notesByAddressPointAndScope.get(formattedScopeString)!.getValues(publicKey.toString()) + ? await toArray( + this.#notesByAddressPointAndScope.get(formattedScopeString)!.getValuesAsync(publicKey.toString()), + ) : filter.txHash - ? this.#notesByTxHashAndScope.get(formattedScopeString)!.getValues(filter.txHash.toString()) + ? await toArray( + this.#notesByTxHashAndScope.get(formattedScopeString)!.getValuesAsync(filter.txHash.toString()), + ) : filter.contractAddress - ? this.#notesByContractAndScope.get(formattedScopeString)!.getValues(filter.contractAddress.toString()) + ? await toArray( + this.#notesByContractAndScope + .get(formattedScopeString)! + .getValuesAsync(filter.contractAddress.toString()), + ) : filter.storageSlot - ? this.#notesByStorageSlotAndScope.get(formattedScopeString)!.getValues(filter.storageSlot.toString()) - : this.#notesByAddressPointAndScope.get(formattedScopeString)!.values(), + ? await toArray( + this.#notesByStorageSlotAndScope.get(formattedScopeString)!.getValuesAsync(filter.storageSlot.toString()), + ) + : await toArray(this.#notesByAddressPointAndScope.get(formattedScopeString)!.valuesAsync()), ); } candidateNoteSources.push({ - ids: new Set(activeNoteIdsPerScope.flatMap(iterableIterator => [...iterableIterator])), + ids: new Set(activeNoteIdsPerScope.flat()), notes: this.#notes, }); if (filter.status == NoteStatus.ACTIVE_OR_NULLIFIED) { candidateNoteSources.push({ ids: publicKey - ? this.#nullifiedNotesByAddressPoint.getValues(publicKey.toString()) + ? await toArray(this.#nullifiedNotesByAddressPoint.getValuesAsync(publicKey.toString())) : filter.txHash - ? this.#nullifiedNotesByTxHash.getValues(filter.txHash.toString()) + ? await toArray(this.#nullifiedNotesByTxHash.getValuesAsync(filter.txHash.toString())) : filter.contractAddress - ? this.#nullifiedNotesByContract.getValues(filter.contractAddress.toString()) + ? await toArray(this.#nullifiedNotesByContract.getValuesAsync(filter.contractAddress.toString())) : filter.storageSlot - ? this.#nullifiedNotesByStorageSlot.getValues(filter.storageSlot.toString()) - : this.#nullifiedNotes.keys(), + ? await toArray(this.#nullifiedNotesByStorageSlot.getValuesAsync(filter.storageSlot.toString())) + : await toArray(this.#nullifiedNotes.keysAsync()), notes: this.#nullifiedNotes, }); } @@ -378,7 +399,7 @@ export class KVPxeDatabase implements PxeDatabase { const result: IncomingNoteDao[] = []; for (const { ids, notes } of candidateNoteSources) { for (const id of ids) { - const serializedNote = notes.get(id); + const serializedNote = await notes.getAsync(id); if (!serializedNote) { continue; } @@ -408,32 +429,34 @@ export class KVPxeDatabase implements PxeDatabase { } } - return Promise.resolve(result); + return result; } - getOutgoingNotes(filter: OutgoingNotesFilter): Promise { + async getOutgoingNotes(filter: OutgoingNotesFilter): Promise { const ovpkM: PublicKey | undefined = filter.owner - ? this.#getCompleteAddress(filter.owner)?.publicKeys.masterOutgoingViewingPublicKey + ? (await this.#getCompleteAddress(filter.owner))?.publicKeys.masterOutgoingViewingPublicKey : undefined; // Check if ovpkM is truthy - const ids = ovpkM - ? this.#outgoingNotesByOvpkM.getValues(ovpkM.toString()) + const idsIterator = ovpkM + ? this.#outgoingNotesByOvpkM.getValuesAsync(ovpkM.toString()) : // If ovpkM is falsy, check if filter.txHash is truthy filter.txHash - ? this.#outgoingNotesByTxHash.getValues(filter.txHash.toString()) + ? this.#outgoingNotesByTxHash.getValuesAsync(filter.txHash.toString()) : // If both ovpkM and filter.txHash are falsy, check if filter.contractAddress is truthy filter.contractAddress - ? this.#outgoingNotesByContract.getValues(filter.contractAddress.toString()) + ? this.#outgoingNotesByContract.getValuesAsync(filter.contractAddress.toString()) : // If ovpkM, filter.txHash, and filter.contractAddress are all falsy, check if filter.storageSlot is truthy filter.storageSlot - ? this.#outgoingNotesByStorageSlot.getValues(filter.storageSlot.toString()) + ? this.#outgoingNotesByStorageSlot.getValuesAsync(filter.storageSlot.toString()) : // If none of the above conditions are met, retrieve all keys from this.#outgoingNotes - this.#outgoingNotes.keys(); + this.#outgoingNotes.keysAsync(); const notes: OutgoingNoteDao[] = []; + + const ids = await toArray(idsIterator); for (const id of ids) { - const serializedNote = this.#outgoingNotes.get(id); + const serializedNote = await this.#outgoingNotes.getAsync(id); if (!serializedNote) { continue; } @@ -458,7 +481,7 @@ export class KVPxeDatabase implements PxeDatabase { notes.push(note); } - return Promise.resolve(notes); + return notes; } removeNullifiedNotes(nullifiers: InBlock[], accountAddressPoint: PublicKey): Promise { @@ -466,23 +489,23 @@ export class KVPxeDatabase implements PxeDatabase { return Promise.resolve([]); } - return this.#db.transaction(() => { + return this.db.transactionAsync(async () => { const nullifiedNotes: IncomingNoteDao[] = []; for (const blockScopedNullifier of nullifiers) { const { data: nullifier, l2BlockNumber: blockNumber } = blockScopedNullifier; - const noteIndex = this.#nullifierToNoteId.get(nullifier.toString()); + const noteIndex = await this.#nullifierToNoteId.getAsync(nullifier.toString()); if (!noteIndex) { continue; } - const noteBuffer = noteIndex ? this.#notes.get(noteIndex) : undefined; + const noteBuffer = noteIndex ? await this.#notes.getAsync(noteIndex) : undefined; if (!noteBuffer) { // note doesn't exist. Maybe it got nullified already continue; } - const noteScopes = this.#notesToScope.getValues(noteIndex) ?? []; + const noteScopes = (await toArray(this.#notesToScope.getValuesAsync(noteIndex))) ?? []; const note = IncomingNoteDao.fromBuffer(noteBuffer); if (!note.addressPoint.equals(accountAddressPoint)) { // tried to nullify someone else's note @@ -491,32 +514,33 @@ export class KVPxeDatabase implements PxeDatabase { nullifiedNotes.push(note); - void this.#notes.delete(noteIndex); - void this.#notesToScope.delete(noteIndex); + await this.#notes.delete(noteIndex); + await this.#notesToScope.delete(noteIndex); - for (const scope of this.#scopes.entries()) { - void this.#notesByAddressPointAndScope.get(scope)!.deleteValue(accountAddressPoint.toString(), noteIndex); - void this.#notesByTxHashAndScope.get(scope)!.deleteValue(note.txHash.toString(), noteIndex); - void this.#notesByContractAndScope.get(scope)!.deleteValue(note.contractAddress.toString(), noteIndex); - void this.#notesByStorageSlotAndScope.get(scope)!.deleteValue(note.storageSlot.toString(), noteIndex); + const scopes = await toArray(this.#scopes.entriesAsync()); + + for (const scope of scopes) { + await this.#notesByAddressPointAndScope.get(scope)!.deleteValue(accountAddressPoint.toString(), noteIndex); + await this.#notesByTxHashAndScope.get(scope)!.deleteValue(note.txHash.toString(), noteIndex); + await this.#notesByContractAndScope.get(scope)!.deleteValue(note.contractAddress.toString(), noteIndex); + await this.#notesByStorageSlotAndScope.get(scope)!.deleteValue(note.storageSlot.toString(), noteIndex); } if (noteScopes !== undefined) { for (const scope of noteScopes) { - void this.#nullifiedNotesToScope.set(noteIndex, scope); + await this.#nullifiedNotesToScope.set(noteIndex, scope); } } - void this.#nullifiedNotes.set(noteIndex, note.toBuffer()); - void this.#nullifiersByBlockNumber.set(blockNumber, nullifier.toString()); - void this.#nullifiedNotesByContract.set(note.contractAddress.toString(), noteIndex); - void this.#nullifiedNotesByStorageSlot.set(note.storageSlot.toString(), noteIndex); - void this.#nullifiedNotesByTxHash.set(note.txHash.toString(), noteIndex); - void this.#nullifiedNotesByAddressPoint.set(note.addressPoint.toString(), noteIndex); - void this.#nullifiedNotesByNullifier.set(nullifier.toString(), noteIndex); - - void this.#nullifierToNoteId.delete(nullifier.toString()); + await this.#nullifiedNotes.set(noteIndex, note.toBuffer()); + await this.#nullifiersByBlockNumber.set(blockNumber, nullifier.toString()); + await this.#nullifiedNotesByContract.set(note.contractAddress.toString(), noteIndex); + await this.#nullifiedNotesByStorageSlot.set(note.storageSlot.toString(), noteIndex); + await this.#nullifiedNotesByTxHash.set(note.txHash.toString(), noteIndex); + await this.#nullifiedNotesByAddressPoint.set(note.addressPoint.toString(), noteIndex); + await this.#nullifiedNotesByNullifier.set(nullifier.toString(), noteIndex); + + await this.#nullifierToNoteId.delete(nullifier.toString()); } - return nullifiedNotes; }); } @@ -529,16 +553,14 @@ export class KVPxeDatabase implements PxeDatabase { await this.#nullifiedNotesByStorageSlot.set(note.storageSlot.toString(), noteIndex); await this.#nullifiedNotesByTxHash.set(note.txHash.toString(), noteIndex); await this.#nullifiedNotesByAddressPoint.set(note.addressPoint.toString(), noteIndex); - - return Promise.resolve(); } async setHeader(header: BlockHeader): Promise { await this.#synchronizedBlock.set(header.toBuffer()); } - getBlockNumber(): number | undefined { - const headerBuffer = this.#synchronizedBlock.get(); + async getBlockNumber(): Promise { + const headerBuffer = await this.#synchronizedBlock.getAsync(); if (!headerBuffer) { return undefined; } @@ -546,8 +568,8 @@ export class KVPxeDatabase implements PxeDatabase { return Number(BlockHeader.fromBuffer(headerBuffer).globalVariables.blockNumber.toBigInt()); } - getBlockHeader(): BlockHeader { - const headerBuffer = this.#synchronizedBlock.get(); + async getBlockHeader(): Promise { + const headerBuffer = await this.#synchronizedBlock.getAsync(); if (!headerBuffer) { throw new Error(`Header not set`); } @@ -558,7 +580,7 @@ export class KVPxeDatabase implements PxeDatabase { async #addScope(scope: AztecAddress): Promise { const scopeString = scope.toString(); - if (this.#scopes.has(scopeString)) { + if (await this.#scopes.hasAsync(scopeString)) { return false; } @@ -571,23 +593,23 @@ export class KVPxeDatabase implements PxeDatabase { return true; } - async addCompleteAddress(completeAddress: CompleteAddress): Promise { - await this.#addScope(completeAddress.address); + addCompleteAddress(completeAddress: CompleteAddress): Promise { + return this.db.transactionAsync(async () => { + await this.#addScope(completeAddress.address); - return this.#db.transaction(() => { const addressString = completeAddress.address.toString(); const buffer = completeAddress.toBuffer(); - const existing = this.#completeAddressIndex.get(addressString); - if (typeof existing === 'undefined') { - const index = this.#completeAddresses.length; - void this.#completeAddresses.push(buffer); - void this.#completeAddressIndex.set(addressString, index); + const existing = await this.#completeAddressIndex.getAsync(addressString); + if (existing === undefined) { + const index = await this.#completeAddresses.lengthAsync(); + await this.#completeAddresses.push(buffer); + await this.#completeAddressIndex.set(addressString, index); return true; } else { - const existingBuffer = this.#completeAddresses.at(existing); + const existingBuffer = await this.#completeAddresses.atAsync(existing); - if (existingBuffer?.equals(buffer)) { + if (existingBuffer && Buffer.from(existingBuffer).equals(buffer)) { return false; } @@ -598,26 +620,26 @@ export class KVPxeDatabase implements PxeDatabase { }); } - #getCompleteAddress(address: AztecAddress): CompleteAddress | undefined { - const index = this.#completeAddressIndex.get(address.toString()); - if (typeof index === 'undefined') { + async #getCompleteAddress(address: AztecAddress): Promise { + const index = await this.#completeAddressIndex.getAsync(address.toString()); + if (index === undefined) { return undefined; } - const value = this.#completeAddresses.at(index); + const value = await this.#completeAddresses.atAsync(index); return value ? CompleteAddress.fromBuffer(value) : undefined; } getCompleteAddress(account: AztecAddress): Promise { - return Promise.resolve(this.#getCompleteAddress(account)); + return this.#getCompleteAddress(account); } - getCompleteAddresses(): Promise { - return Promise.resolve(Array.from(this.#completeAddresses).map(v => CompleteAddress.fromBuffer(v))); + async getCompleteAddresses(): Promise { + return (await toArray(this.#completeAddresses.valuesAsync())).map(v => CompleteAddress.fromBuffer(v)); } async addContactAddress(address: AztecAddress): Promise { - if (this.#addressBook.has(address.toString())) { + if (await this.#addressBook.hasAsync(address.toString())) { return false; } @@ -626,12 +648,12 @@ export class KVPxeDatabase implements PxeDatabase { return true; } - getContactAddresses(): AztecAddress[] { - return [...this.#addressBook.entries()].map(AztecAddress.fromString); + async getContactAddresses(): Promise { + return (await toArray(this.#addressBook.entriesAsync())).map(AztecAddress.fromString); } async removeContactAddress(address: AztecAddress): Promise { - if (!this.#addressBook.has(address.toString())) { + if (!this.#addressBook.hasAsync(address.toString())) { return false; } @@ -640,8 +662,8 @@ export class KVPxeDatabase implements PxeDatabase { return true; } - getSynchedBlockNumberForAccount(account: AztecAddress): number | undefined { - return this.#syncedBlockPerPublicKey.get(account.toString()); + getSynchedBlockNumberForAccount(account: AztecAddress): Promise { + return this.#syncedBlockPerPublicKey.getAsync(account.toString()); } setSynchedBlockNumberForAccount(account: AztecAddress, blockNumber: number): Promise { @@ -649,20 +671,14 @@ export class KVPxeDatabase implements PxeDatabase { } async estimateSize(): Promise { - const incomingNotesSize = Array.from(await this.getIncomingNotes({})).reduce( - (sum, note) => sum + note.getSize(), - 0, - ); - const outgoingNotesSize = Array.from(await this.getOutgoingNotes({})).reduce( - (sum, note) => sum + note.getSize(), - 0, - ); + const incomingNotesSize = (await this.getIncomingNotes({})).reduce((sum, note) => sum + note.getSize(), 0); + const outgoingNotesSize = (await this.getOutgoingNotes({})).reduce((sum, note) => sum + note.getSize(), 0); - const authWitsSize = Array.from(this.#authWitnesses.values()).reduce( + const authWitsSize = (await toArray(this.#authWitnesses.valuesAsync())).reduce( (sum, value) => sum + value.length * Fr.SIZE_IN_BYTES, 0, ); - const addressesSize = this.#completeAddresses.length * CompleteAddress.SIZE_IN_BYTES; + const addressesSize = (await this.#completeAddresses.lengthAsync()) * CompleteAddress.SIZE_IN_BYTES; const treeRootsSize = Object.keys(MerkleTreeId).length * Fr.SIZE_IN_BYTES; return incomingNotesSize + outgoingNotesSize + treeRootsSize + authWitsSize + addressesSize; @@ -676,12 +692,10 @@ export class KVPxeDatabase implements PxeDatabase { await this.#setTaggingSecretsIndexes(indexedSecrets, this.#taggingSecretIndexesForRecipients); } - #setTaggingSecretsIndexes(indexedSecrets: IndexedTaggingSecret[], storageMap: AztecMap) { - return this.db.transaction(() => { - indexedSecrets.forEach( - indexedSecret => void storageMap.set(indexedSecret.secret.toString(), indexedSecret.index), - ); - }); + async #setTaggingSecretsIndexes(indexedSecrets: IndexedTaggingSecret[], storageMap: AztecAsyncMap) { + await Promise.all( + indexedSecrets.map(indexedSecret => storageMap.set(indexedSecret.secret.toString(), indexedSecret.index)), + ); } async getTaggingSecretsIndexesAsRecipient(appTaggingSecrets: Fr[]) { @@ -692,18 +706,16 @@ export class KVPxeDatabase implements PxeDatabase { return await this.#getTaggingSecretsIndexes(appTaggingSecrets, this.#taggingSecretIndexesForSenders); } - #getTaggingSecretsIndexes(appTaggingSecrets: Fr[], storageMap: AztecMap): Promise { - return this.db.transaction(() => appTaggingSecrets.map(secret => storageMap.get(`${secret.toString()}`) ?? 0)); + #getTaggingSecretsIndexes(appTaggingSecrets: Fr[], storageMap: AztecAsyncMap): Promise { + return Promise.all(appTaggingSecrets.map(async secret => (await storageMap.getAsync(`${secret.toString()}`)) ?? 0)); } - async resetNoteSyncData(): Promise { - await this.db.transaction(() => { - for (const recipient of this.#taggingSecretIndexesForRecipients.keys()) { - void this.#taggingSecretIndexesForRecipients.delete(recipient); - } - for (const sender of this.#taggingSecretIndexesForSenders.keys()) { - void this.#taggingSecretIndexesForSenders.delete(sender); - } + resetNoteSyncData(): Promise { + return this.db.transactionAsync(async () => { + const recipients = await toArray(this.#taggingSecretIndexesForRecipients.keysAsync()); + await Promise.all(recipients.map(recipient => this.#taggingSecretIndexesForRecipients.delete(recipient))); + const senders = await toArray(this.#taggingSecretIndexesForSenders.keysAsync()); + await Promise.all(senders.map(sender => this.#taggingSecretIndexesForSenders.delete(sender))); }); } } diff --git a/yarn-project/pxe/src/database/pxe_database.ts b/yarn-project/pxe/src/database/pxe_database.ts index a0dfa1ac89a..211b83bd626 100644 --- a/yarn-project/pxe/src/database/pxe_database.ts +++ b/yarn-project/pxe/src/database/pxe_database.ts @@ -102,7 +102,7 @@ export interface PxeDatabase extends ContractArtifactDatabase, ContractInstanceD * Gets the most recently processed block number. * @returns The most recently processed block number or undefined if never synched. */ - getBlockNumber(): number | undefined; + getBlockNumber(): Promise; /** * Retrieve the stored Block Header from the database. @@ -115,7 +115,7 @@ export interface PxeDatabase extends ContractArtifactDatabase, ContractInstanceD * @returns The Block Header. * @throws If no block have been processed yet. */ - getBlockHeader(): BlockHeader; + getBlockHeader(): Promise; /** * Set the latest Block Header. @@ -137,7 +137,7 @@ export interface PxeDatabase extends ContractArtifactDatabase, ContractInstanceD * Retrieves the list of contact addresses in the address book. * @returns An array of Aztec addresses. */ - getContactAddresses(): AztecAddress[]; + getContactAddresses(): Promise; /** * Removes a contact address from the database. @@ -179,7 +179,7 @@ export interface PxeDatabase extends ContractArtifactDatabase, ContractInstanceD * Get the synched block number for a given public key. * @param account - The account to get the synched block number for. */ - getSynchedBlockNumberForAccount(account: AztecAddress): number | undefined; + getSynchedBlockNumberForAccount(account: AztecAddress): Promise; /** * Returns the estimated size in bytes of this db. diff --git a/yarn-project/pxe/src/database/pxe_database_test_suite.ts b/yarn-project/pxe/src/database/pxe_database_test_suite.ts index 9947e952c51..3f683a8814e 100644 --- a/yarn-project/pxe/src/database/pxe_database_test_suite.ts +++ b/yarn-project/pxe/src/database/pxe_database_test_suite.ts @@ -380,11 +380,11 @@ export function describePxeDatabase(getDatabase: () => PxeDatabase) { const header = makeHeader(randomInt(1000), INITIAL_L2_BLOCK_NUM, 0 /** slot number */); await database.setHeader(header); - expect(database.getBlockHeader()).toEqual(header); + await expect(database.getBlockHeader()).resolves.toEqual(header); }); - it('rejects getting header if no block set', () => { - expect(() => database.getBlockHeader()).toThrow(); + it('rejects getting header if no block set', async () => { + await expect(() => database.getBlockHeader()).rejects.toThrow(); }); }); @@ -423,6 +423,16 @@ export function describePxeDatabase(getDatabase: () => PxeDatabase) { expect(result).toEqual(expect.arrayContaining(addresses)); }); + it('returns a single address', async () => { + const addresses = Array.from({ length: 10 }).map(() => CompleteAddress.random()); + for (const address of addresses) { + await database.addCompleteAddress(address); + } + + const result = await database.getCompleteAddress(addresses[3].address); + expect(result).toEqual(addresses[3]); + }); + it("returns an empty array if it doesn't have addresses", async () => { expect(await database.getCompleteAddresses()).toEqual([]); }); diff --git a/yarn-project/pxe/src/index.ts b/yarn-project/pxe/src/index.ts index d6e46f5ad84..ae998668621 100644 --- a/yarn-project/pxe/src/index.ts +++ b/yarn-project/pxe/src/index.ts @@ -10,5 +10,6 @@ export * from '@aztec/foundation/eth-address'; export * from '@aztec/foundation/aztec-address'; export * from '@aztec/key-store'; export * from './database/index.js'; +export * from './utils/index.js'; export { ContractDataOracle } from './contract_data_oracle/index.js'; export { PrivateFunctionsTree } from './contract_data_oracle/private_functions_tree.js'; diff --git a/yarn-project/pxe/src/kernel_prover/index.ts b/yarn-project/pxe/src/kernel_prover/index.ts index 94bc7f6892d..f37c2c857ca 100644 --- a/yarn-project/pxe/src/kernel_prover/index.ts +++ b/yarn-project/pxe/src/kernel_prover/index.ts @@ -1,2 +1,4 @@ +export { TestPrivateKernelProver } from './test/test_circuit_prover.js'; + export * from './kernel_prover.js'; export * from './proving_data_oracle.js'; diff --git a/yarn-project/pxe/src/note_decryption_utils/add_public_values_to_payload.ts b/yarn-project/pxe/src/note_decryption_utils/add_public_values_to_payload.ts index 1d9c3806eea..4d36c3a46e3 100644 --- a/yarn-project/pxe/src/note_decryption_utils/add_public_values_to_payload.ts +++ b/yarn-project/pxe/src/note_decryption_utils/add_public_values_to_payload.ts @@ -1,5 +1,5 @@ import { type L1NotePayload, Note } from '@aztec/circuit-types'; -import { ContractNotFoundError } from '@aztec/simulator'; +import { ContractNotFoundError } from '@aztec/simulator/client'; import { type PxeDatabase } from '../database/pxe_database.js'; diff --git a/yarn-project/pxe/src/note_decryption_utils/brute_force_note_info.ts b/yarn-project/pxe/src/note_decryption_utils/brute_force_note_info.ts index cde87260e71..3632949065d 100644 --- a/yarn-project/pxe/src/note_decryption_utils/brute_force_note_info.ts +++ b/yarn-project/pxe/src/note_decryption_utils/brute_force_note_info.ts @@ -3,7 +3,7 @@ import { type AztecAddress } from '@aztec/circuits.js'; import { computeNoteHashNonce, siloNullifier } from '@aztec/circuits.js/hash'; import { type NoteSelector } from '@aztec/foundation/abi'; import { Fr } from '@aztec/foundation/fields'; -import { type AcirSimulator } from '@aztec/simulator'; +import { type AcirSimulator } from '@aztec/simulator/client'; export interface NoteInfo { noteHashIndex: number; diff --git a/yarn-project/pxe/src/note_decryption_utils/produce_note_daos.ts b/yarn-project/pxe/src/note_decryption_utils/produce_note_daos.ts index fc3e1918ce1..dafbad9afdd 100644 --- a/yarn-project/pxe/src/note_decryption_utils/produce_note_daos.ts +++ b/yarn-project/pxe/src/note_decryption_utils/produce_note_daos.ts @@ -1,7 +1,7 @@ import { type L1NotePayload, type PublicKey, type TxHash } from '@aztec/circuit-types'; import { type Fr } from '@aztec/foundation/fields'; import { type Logger } from '@aztec/foundation/log'; -import { type AcirSimulator } from '@aztec/simulator'; +import { type AcirSimulator } from '@aztec/simulator/client'; import { IncomingNoteDao } from '../database/incoming_note_dao.js'; import { OutgoingNoteDao } from '../database/outgoing_note_dao.js'; diff --git a/yarn-project/pxe/src/note_decryption_utils/produce_note_daos_for_key.ts b/yarn-project/pxe/src/note_decryption_utils/produce_note_daos_for_key.ts index eeeb6c9ee9e..291d9efd80d 100644 --- a/yarn-project/pxe/src/note_decryption_utils/produce_note_daos_for_key.ts +++ b/yarn-project/pxe/src/note_decryption_utils/produce_note_daos_for_key.ts @@ -1,7 +1,7 @@ import { type L1NotePayload, type Note, type TxHash } from '@aztec/circuit-types'; import { type Fr, type PublicKey } from '@aztec/circuits.js'; import { type Logger } from '@aztec/foundation/log'; -import { type AcirSimulator } from '@aztec/simulator'; +import { type AcirSimulator } from '@aztec/simulator/client'; import { type PxeDatabase } from '../database/pxe_database.js'; import { getOrderedNoteItems } from './add_public_values_to_payload.js'; diff --git a/yarn-project/pxe/src/pxe_service/create_pxe_service.ts b/yarn-project/pxe/src/pxe_service/create_pxe_service.ts index a3bdd43b105..c9269395180 100644 --- a/yarn-project/pxe/src/pxe_service/create_pxe_service.ts +++ b/yarn-project/pxe/src/pxe_service/create_pxe_service.ts @@ -3,8 +3,8 @@ import { type AztecNode, type PrivateKernelProver } from '@aztec/circuit-types'; import { randomBytes } from '@aztec/foundation/crypto'; import { createDebugLogger } from '@aztec/foundation/log'; import { KeyStore } from '@aztec/key-store'; +import { createStore } from '@aztec/kv-store/lmdb'; import { L2TipsStore } from '@aztec/kv-store/stores'; -import { createStore } from '@aztec/kv-store/utils'; import { type PXEServiceConfig } from '../config/index.js'; import { KVPxeDatabase } from '../database/kv_pxe_database.js'; @@ -43,7 +43,7 @@ export async function createPXEService( const store = await createStore('pxe_data', configWithContracts, createDebugLogger('aztec:pxe:data:lmdb')); - const db = new KVPxeDatabase(store); + const db = await KVPxeDatabase.create(store); const tips = new L2TipsStore(store, 'pxe'); const prover = proofCreator ?? (await createProver(config, logSuffix)); diff --git a/yarn-project/pxe/src/pxe_service/error_enriching.ts b/yarn-project/pxe/src/pxe_service/error_enriching.ts index 938d391ada7..f9c26ba876e 100644 --- a/yarn-project/pxe/src/pxe_service/error_enriching.ts +++ b/yarn-project/pxe/src/pxe_service/error_enriching.ts @@ -1,7 +1,7 @@ import { type SimulationError, isNoirCallStackUnresolved } from '@aztec/circuit-types'; import { AztecAddress, Fr, FunctionSelector, PUBLIC_DISPATCH_SELECTOR } from '@aztec/circuits.js'; import { type DebugLogger } from '@aztec/foundation/log'; -import { resolveAssertionMessageFromRevertData, resolveOpcodeLocations } from '@aztec/simulator'; +import { resolveAssertionMessageFromRevertData, resolveOpcodeLocations } from '@aztec/simulator/errors'; import { type ContractDataOracle, type PxeDatabase } from '../index.js'; diff --git a/yarn-project/pxe/src/pxe_service/index.ts b/yarn-project/pxe/src/pxe_service/index.ts index c9018d7ba8c..66f9aae2add 100644 --- a/yarn-project/pxe/src/pxe_service/index.ts +++ b/yarn-project/pxe/src/pxe_service/index.ts @@ -1,4 +1,3 @@ export * from './pxe_service.js'; -export * from './create_pxe_service.js'; export { enrichPublicSimulationError } from './error_enriching.js'; export { pxeTestSuite } from './test/pxe_test_suite.js'; diff --git a/yarn-project/pxe/src/pxe_service/pxe_service.ts b/yarn-project/pxe/src/pxe_service/pxe_service.ts index eadab26de2d..691e7a95152 100644 --- a/yarn-project/pxe/src/pxe_service/pxe_service.ts +++ b/yarn-project/pxe/src/pxe_service/pxe_service.ts @@ -65,11 +65,12 @@ import { getCanonicalProtocolContract, protocolContractNames, } from '@aztec/protocol-contracts'; -import { type AcirSimulator } from '@aztec/simulator'; +import { type AcirSimulator } from '@aztec/simulator/client'; import { inspect } from 'util'; -import { type PXEServiceConfig, getPackageInfo } from '../config/index.js'; +import { type PXEServiceConfig } from '../config/index.js'; +import { getPackageInfo } from '../config/package_info.js'; import { ContractDataOracle } from '../contract_data_oracle/index.js'; import { IncomingNoteDao } from '../database/incoming_note_dao.js'; import { type PxeDatabase } from '../database/index.js'; @@ -915,7 +916,7 @@ export class PXEService implements PXE { const vsks = await Promise.all( vpks.map(async vpk => { - const [keyPrefix, account] = this.keyStore.getKeyPrefixAndAccount(vpk); + const [keyPrefix, account] = await this.keyStore.getKeyPrefixAndAccount(vpk); let secretKey = await this.keyStore.getMasterSecretKey(vpk); if (keyPrefix === 'iv') { const registeredAccount = await this.getRegisteredAccount(account); diff --git a/yarn-project/pxe/src/pxe_service/test/pxe_service.test.ts b/yarn-project/pxe/src/pxe_service/test/pxe_service.test.ts index 5899e8af003..678f6c4bb76 100644 --- a/yarn-project/pxe/src/pxe_service/test/pxe_service.test.ts +++ b/yarn-project/pxe/src/pxe_service/test/pxe_service.test.ts @@ -3,8 +3,8 @@ import { INITIAL_L2_BLOCK_NUM } from '@aztec/circuits.js/constants'; import { type L1ContractAddresses } from '@aztec/ethereum'; import { EthAddress } from '@aztec/foundation/eth-address'; import { KeyStore } from '@aztec/key-store'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { L2TipsStore } from '@aztec/kv-store/stores'; -import { openTmpStore } from '@aztec/kv-store/utils'; import { type MockProxy, mock } from 'jest-mock-extended'; @@ -15,11 +15,11 @@ import { TestPrivateKernelProver } from '../../kernel_prover/test/test_circuit_p import { PXEService } from '../pxe_service.js'; import { pxeTestSuite } from './pxe_test_suite.js'; -function createPXEService(): Promise { +async function createPXEService(): Promise { const kvStore = openTmpStore(); const keyStore = new KeyStore(kvStore); const node = mock(); - const db = new KVPxeDatabase(kvStore); + const db = await KVPxeDatabase.create(kvStore); const tips = new L2TipsStore(kvStore, 'pxe'); const config: PXEServiceConfig = { l2BlockPollingIntervalMS: 100, @@ -60,12 +60,12 @@ describe('PXEService', () => { let config: PXEServiceConfig; let tips: L2TipsStore; - beforeEach(() => { + beforeEach(async () => { const kvStore = openTmpStore(); keyStore = new KeyStore(kvStore); node = mock(); tips = new L2TipsStore(kvStore, 'pxe'); - db = new KVPxeDatabase(kvStore); + db = await KVPxeDatabase.create(kvStore); config = { l2BlockPollingIntervalMS: 100, l2StartingBlock: INITIAL_L2_BLOCK_NUM, diff --git a/yarn-project/pxe/src/simulator/index.ts b/yarn-project/pxe/src/simulator/index.ts index 0a4dc3abf73..8f41547a15e 100644 --- a/yarn-project/pxe/src/simulator/index.ts +++ b/yarn-project/pxe/src/simulator/index.ts @@ -1,6 +1,6 @@ import { type AztecNode } from '@aztec/circuit-types'; import { type KeyStore } from '@aztec/key-store'; -import { AcirSimulator } from '@aztec/simulator'; +import { AcirSimulator } from '@aztec/simulator/client'; import { ContractDataOracle } from '../contract_data_oracle/index.js'; import { type PxeDatabase } from '../database/pxe_database.js'; diff --git a/yarn-project/pxe/src/simulator_oracle/index.ts b/yarn-project/pxe/src/simulator_oracle/index.ts index 802fe6c4214..366df568fd6 100644 --- a/yarn-project/pxe/src/simulator_oracle/index.ts +++ b/yarn-project/pxe/src/simulator_oracle/index.ts @@ -31,7 +31,8 @@ import { poseidon2Hash } from '@aztec/foundation/crypto'; import { tryJsonStringify } from '@aztec/foundation/json-rpc'; import { createDebugLogger } from '@aztec/foundation/log'; import { type KeyStore } from '@aztec/key-store'; -import { type AcirSimulator, type DBOracle, MessageLoadOracleInputs } from '@aztec/simulator'; +import { MessageLoadOracleInputs } from '@aztec/simulator/acvm'; +import { type AcirSimulator, type DBOracle } from '@aztec/simulator/client'; import { type ContractDataOracle } from '../contract_data_oracle/index.js'; import { type IncomingNoteDao } from '../database/incoming_note_dao.js'; @@ -253,7 +254,7 @@ export class SimulatorOracle implements DBOracle { * finally the index specified tag. We will then query the node with this tag for each address in the address book. * @returns The full list of the users contact addresses. */ - public getContacts(): AztecAddress[] { + public getContacts(): Promise { return this.db.getContactAddresses(); } @@ -325,7 +326,7 @@ export class SimulatorOracle implements DBOracle { const recipientIvsk = await this.keyStore.getMasterIncomingViewingSecretKey(recipient); // We implicitly add all PXE accounts as contacts, this helps us decrypt tags on notes that we send to ourselves (recipient = us, sender = us) - const contacts = [...this.db.getContactAddresses(), ...(await this.keyStore.getAccounts())].filter( + const contacts = [...(await this.db.getContactAddresses()), ...(await this.keyStore.getAccounts())].filter( (address, index, self) => index === self.findIndex(otherAddress => otherAddress.equals(address)), ); const appTaggingSecrets = contacts.map(contact => { diff --git a/yarn-project/pxe/src/simulator_oracle/simulator_oracle.test.ts b/yarn-project/pxe/src/simulator_oracle/simulator_oracle.test.ts index a9804de5eec..02620bbe16c 100644 --- a/yarn-project/pxe/src/simulator_oracle/simulator_oracle.test.ts +++ b/yarn-project/pxe/src/simulator_oracle/simulator_oracle.test.ts @@ -25,8 +25,8 @@ import { } from '@aztec/circuits.js'; import { pedersenHash, poseidon2Hash } from '@aztec/foundation/crypto'; import { KeyStore } from '@aztec/key-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; -import { type AcirSimulator } from '@aztec/simulator'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; +import { type AcirSimulator } from '@aztec/simulator/client'; import { jest } from '@jest/globals'; import { type MockProxy, mock } from 'jest-mock-extended'; @@ -128,7 +128,7 @@ describe('Simulator oracle', () => { beforeEach(async () => { const db = openTmpStore(); aztecNode = mock(); - database = new KVPxeDatabase(db); + database = await KVPxeDatabase.create(db); contractDataOracle = new ContractDataOracle(database); jest.spyOn(contractDataOracle, 'getDebugContractName').mockImplementation(() => Promise.resolve('TestContract')); keyStore = new KeyStore(db); diff --git a/yarn-project/pxe/src/synchronizer/synchronizer.test.ts b/yarn-project/pxe/src/synchronizer/synchronizer.test.ts index dd331875954..a5cedf499cd 100644 --- a/yarn-project/pxe/src/synchronizer/synchronizer.test.ts +++ b/yarn-project/pxe/src/synchronizer/synchronizer.test.ts @@ -1,6 +1,6 @@ import { type AztecNode, L2Block, type L2BlockStream } from '@aztec/circuit-types'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { L2TipsStore } from '@aztec/kv-store/stores'; -import { openTmpStore } from '@aztec/kv-store/utils'; import { jest } from '@jest/globals'; import { type MockProxy, mock } from 'jest-mock-extended'; @@ -24,11 +24,11 @@ describe('Synchronizer', () => { } }; - beforeEach(() => { + beforeEach(async () => { const store = openTmpStore(); blockStream = mock(); aztecNode = mock(); - database = new KVPxeDatabase(store); + database = await KVPxeDatabase.create(store); tipsStore = new L2TipsStore(store, 'pxe'); synchronizer = new TestSynchronizer(aztecNode, database, tipsStore); }); @@ -37,7 +37,7 @@ describe('Synchronizer', () => { const block = L2Block.random(1, 4); await synchronizer.handleBlockStreamEvent({ type: 'blocks-added', blocks: [block] }); - const obtainedHeader = database.getBlockHeader(); + const obtainedHeader = await database.getBlockHeader(); expect(obtainedHeader).toEqual(block.header); }); diff --git a/yarn-project/pxe/src/synchronizer/synchronizer.ts b/yarn-project/pxe/src/synchronizer/synchronizer.ts index d527a38b535..e855810912e 100644 --- a/yarn-project/pxe/src/synchronizer/synchronizer.ts +++ b/yarn-project/pxe/src/synchronizer/synchronizer.ts @@ -106,8 +106,8 @@ export class Synchronizer implements L2BlockStreamEventHandler { await this.blockStream.sync(); } - private getSynchedBlockNumber() { - return this.db.getBlockNumber() ?? this.initialSyncBlockNumber; + private async getSynchedBlockNumber() { + return (await this.db.getBlockNumber()) ?? this.initialSyncBlockNumber; } /** @@ -118,15 +118,15 @@ export class Synchronizer implements L2BlockStreamEventHandler { */ public async isGlobalStateSynchronized() { const latest = await this.node.getBlockNumber(); - return latest <= this.getSynchedBlockNumber(); + return latest <= (await this.getSynchedBlockNumber()); } /** * Returns the latest block that has been synchronized by the synchronizer and each account. * @returns The latest block synchronized for blocks, and the latest block synched for notes for each public key being tracked. */ - public getSyncStatus() { - const lastBlockNumber = this.getSynchedBlockNumber(); + public async getSyncStatus() { + const lastBlockNumber = await this.getSynchedBlockNumber(); return { blocks: lastBlockNumber, }; diff --git a/yarn-project/pxe/src/utils/index.ts b/yarn-project/pxe/src/utils/index.ts new file mode 100644 index 00000000000..f54e87e2cb2 --- /dev/null +++ b/yarn-project/pxe/src/utils/index.ts @@ -0,0 +1,67 @@ +import { BBNativePrivateKernelProver } from '@aztec/bb-prover'; +import { type AztecNode, type PrivateKernelProver } from '@aztec/circuit-types'; +import { randomBytes } from '@aztec/foundation/crypto'; +import { createDebugLogger } from '@aztec/foundation/log'; +import { KeyStore } from '@aztec/key-store'; +import { createStore } from '@aztec/kv-store/lmdb'; +import { L2TipsStore } from '@aztec/kv-store/stores'; + +import { type PXEServiceConfig } from '../config/index.js'; +import { KVPxeDatabase } from '../database/kv_pxe_database.js'; +import { TestPrivateKernelProver } from '../kernel_prover/test/test_circuit_prover.js'; +import { PXEService } from '../pxe_service/pxe_service.js'; + +/** + * Create and start an PXEService instance with the given AztecNode. + * If no keyStore or database is provided, it will use KeyStore and MemoryDB as default values. + * Returns a Promise that resolves to the started PXEService instance. + * + * @param aztecNode - The AztecNode instance to be used by the server. + * @param config - The PXE Service Config to use + * @param options - (Optional) Optional information for creating an PXEService. + * @param proofCreator - An optional proof creator to use in place of any other configuration + * @returns A Promise that resolves to the started PXEService instance. + */ +export async function createPXEService( + aztecNode: AztecNode, + config: PXEServiceConfig, + useLogSuffix: string | boolean | undefined = undefined, + proofCreator?: PrivateKernelProver, +) { + const logSuffix = + typeof useLogSuffix === 'boolean' ? (useLogSuffix ? randomBytes(3).toString('hex') : undefined) : useLogSuffix; + + const l1Contracts = await aztecNode.getL1ContractAddresses(); + const configWithContracts = { + ...config, + l1Contracts, + } as PXEServiceConfig; + + const keyStore = new KeyStore( + await createStore('pxe_key_store', configWithContracts, createDebugLogger('aztec:pxe:keystore:lmdb')), + ); + + const store = await createStore('pxe_data', configWithContracts, createDebugLogger('aztec:pxe:data:lmdb')); + + const db = await KVPxeDatabase.create(store); + const tips = new L2TipsStore(store, 'pxe'); + + const prover = proofCreator ?? (await createProver(config, logSuffix)); + const server = new PXEService(keyStore, aztecNode, db, tips, prover, config, logSuffix); + await server.start(); + return server; +} + +function createProver(config: PXEServiceConfig, logSuffix?: string) { + if (!config.proverEnabled) { + return new TestPrivateKernelProver(); + } + + // (@PhilWindle) Temporary validation until WASM is implemented + if (!config.bbBinaryPath || !config.bbWorkingDirectory) { + throw new Error(`Prover must be configured with binary path and working directory`); + } + const bbConfig = config as Required> & PXEServiceConfig; + const log = createDebugLogger('aztec:pxe:bb-native-prover' + (logSuffix ? `:${logSuffix}` : '')); + return BBNativePrivateKernelProver.new({ bbSkipCleanup: false, ...bbConfig }, log); +} diff --git a/yarn-project/simulator/package.json b/yarn-project/simulator/package.json index 2832153c30a..4902b9f74d4 100644 --- a/yarn-project/simulator/package.json +++ b/yarn-project/simulator/package.json @@ -4,6 +4,9 @@ "type": "module", "exports": { ".": "./dest/index.js", + "./client": "./dest/client/index.js", + "./acvm": "./dest/acvm/index.js", + "./errors": "./dest/common/errors.js", "./public/fixtures": "./dest/public/fixtures/index.js" }, "typedocOptions": { diff --git a/yarn-project/simulator/src/avm/avm_simulator.test.ts b/yarn-project/simulator/src/avm/avm_simulator.test.ts index fced3916963..ef06934d7c5 100644 --- a/yarn-project/simulator/src/avm/avm_simulator.test.ts +++ b/yarn-project/simulator/src/avm/avm_simulator.test.ts @@ -15,7 +15,7 @@ import { AztecAddress } from '@aztec/foundation/aztec-address'; import { keccak256, keccakf1600, pedersenCommit, pedersenHash, poseidon2Hash, sha256 } from '@aztec/foundation/crypto'; import { Fq, Fr, Point } from '@aztec/foundation/fields'; import { type Fieldable } from '@aztec/foundation/serialize'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { MerkleTrees } from '@aztec/world-state'; diff --git a/yarn-project/simulator/src/avm/avm_tree.test.ts b/yarn-project/simulator/src/avm/avm_tree.test.ts index b30ef226cbb..ead35b02af2 100644 --- a/yarn-project/simulator/src/avm/avm_tree.test.ts +++ b/yarn-project/simulator/src/avm/avm_tree.test.ts @@ -16,7 +16,7 @@ import { import { poseidon2Hash } from '@aztec/foundation/crypto'; import { Fr } from '@aztec/foundation/fields'; import { type IndexedTreeLeafPreimage } from '@aztec/foundation/trees'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { MerkleTrees, NativeWorldStateService } from '@aztec/world-state'; diff --git a/yarn-project/simulator/src/client/private_execution.test.ts b/yarn-project/simulator/src/client/private_execution.test.ts index 022022db071..b7cd2b47457 100644 --- a/yarn-project/simulator/src/client/private_execution.test.ts +++ b/yarn-project/simulator/src/client/private_execution.test.ts @@ -54,7 +54,7 @@ import { EthAddress } from '@aztec/foundation/eth-address'; import { Fr } from '@aztec/foundation/fields'; import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log'; import { type FieldsOf } from '@aztec/foundation/types'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { type AppendOnlyTree, Poseidon, StandardTree, newTree } from '@aztec/merkle-tree'; import { ChildContractArtifact, diff --git a/yarn-project/simulator/src/providers/acvm_native.ts b/yarn-project/simulator/src/providers/acvm_native.ts index 3bf1bdf0157..27fe7c04370 100644 --- a/yarn-project/simulator/src/providers/acvm_native.ts +++ b/yarn-project/simulator/src/providers/acvm_native.ts @@ -5,7 +5,7 @@ import { type NoirCompiledCircuit } from '@aztec/types/noir'; import { type WitnessMap } from '@noir-lang/types'; import * as proc from 'child_process'; -import fs from 'fs/promises'; +import { promises as fs } from 'fs'; import { type SimulationProvider } from './simulation_provider.js'; diff --git a/yarn-project/simulator/src/providers/factory.ts b/yarn-project/simulator/src/providers/factory.ts index 73f7c70cd55..06d88a2ffe9 100644 --- a/yarn-project/simulator/src/providers/factory.ts +++ b/yarn-project/simulator/src/providers/factory.ts @@ -1,6 +1,6 @@ import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log'; -import * as fs from 'fs/promises'; +import { promises as fs } from 'fs'; import { NativeACVMSimulator } from './acvm_native.js'; import { WASMSimulator } from './acvm_wasm.js'; diff --git a/yarn-project/simulator/src/public/fixtures/index.ts b/yarn-project/simulator/src/public/fixtures/index.ts index 257994aa18f..acbefc4be15 100644 --- a/yarn-project/simulator/src/public/fixtures/index.ts +++ b/yarn-project/simulator/src/public/fixtures/index.ts @@ -28,7 +28,7 @@ import { makeContractClassPublic, makeContractInstanceFromClassId } from '@aztec import { type ContractArtifact, type FunctionArtifact } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { Fr, Point } from '@aztec/foundation/fields'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { AvmTestContractArtifact } from '@aztec/noir-contracts.js'; import { PublicTxSimulator, WorldStateDB } from '@aztec/simulator'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; diff --git a/yarn-project/simulator/src/public/public_tx_simulator.test.ts b/yarn-project/simulator/src/public/public_tx_simulator.test.ts index 57a799e22e4..87136847146 100644 --- a/yarn-project/simulator/src/public/public_tx_simulator.test.ts +++ b/yarn-project/simulator/src/public/public_tx_simulator.test.ts @@ -24,7 +24,7 @@ import { import { computePublicDataTreeLeafSlot } from '@aztec/circuits.js/hash'; import { fr } from '@aztec/circuits.js/testing'; import { type AztecKVStore } from '@aztec/kv-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { type AppendOnlyTree, Poseidon, StandardTree, newTree } from '@aztec/merkle-tree'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; import { MerkleTrees } from '@aztec/world-state'; diff --git a/yarn-project/txe/src/oracle/txe_oracle.ts b/yarn-project/txe/src/oracle/txe_oracle.ts index e54123260d0..eda766bdce7 100644 --- a/yarn-project/txe/src/oracle/txe_oracle.ts +++ b/yarn-project/txe/src/oracle/txe_oracle.ts @@ -211,7 +211,7 @@ export class TXE implements TypedOracle { } async addAuthWitness(address: AztecAddress, messageHash: Fr) { - const account = this.txeDatabase.getAccount(address); + const account = await this.txeDatabase.getAccount(address); const privateKey = await this.keyStore.getMasterSecretKey(account.publicKeys.masterIncomingViewingPublicKey); const schnorr = new Schnorr(); const signature = schnorr.constructSignature(messageHash.toBuffer(), privateKey).toBuffer(); diff --git a/yarn-project/txe/src/txe_service/txe_service.ts b/yarn-project/txe/src/txe_service/txe_service.ts index 28cf3a97a17..4965ef1e0a3 100644 --- a/yarn-project/txe/src/txe_service/txe_service.ts +++ b/yarn-project/txe/src/txe_service/txe_service.ts @@ -14,7 +14,7 @@ import { type ContractArtifact, NoteSelector } from '@aztec/foundation/abi'; import { AztecAddress } from '@aztec/foundation/aztec-address'; import { type Logger } from '@aztec/foundation/log'; import { KeyStore } from '@aztec/key-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { getCanonicalProtocolContract, protocolContractNames } from '@aztec/protocol-contracts'; import { enrichPublicSimulationError } from '@aztec/pxe'; import { ExecutionNoteCache, PackedValuesCache, type TypedOracle } from '@aztec/simulator'; diff --git a/yarn-project/txe/src/util/txe_database.ts b/yarn-project/txe/src/util/txe_database.ts index b154fd8702a..5bb4621ec7f 100644 --- a/yarn-project/txe/src/util/txe_database.ts +++ b/yarn-project/txe/src/util/txe_database.ts @@ -1,17 +1,17 @@ import { type AztecAddress, CompleteAddress } from '@aztec/circuits.js'; -import { type AztecKVStore, type AztecMap } from '@aztec/kv-store'; +import { type AztecAsyncKVStore, type AztecAsyncMap } from '@aztec/kv-store'; import { KVPxeDatabase } from '@aztec/pxe'; export class TXEDatabase extends KVPxeDatabase { - #accounts: AztecMap; + #accounts: AztecAsyncMap; - constructor(db: AztecKVStore) { + constructor(db: AztecAsyncKVStore) { super(db); this.#accounts = db.openMap('accounts'); } - getAccount(key: AztecAddress) { - const completeAddress = this.#accounts.get(key.toString()); + async getAccount(key: AztecAddress) { + const completeAddress = await this.#accounts.getAsync(key.toString()); if (!completeAddress) { throw new Error(`Account not found: ${key.toString()}`); } diff --git a/yarn-project/world-state/src/synchronizer/factory.ts b/yarn-project/world-state/src/synchronizer/factory.ts index 10f174e2d9a..92d863e4d11 100644 --- a/yarn-project/world-state/src/synchronizer/factory.ts +++ b/yarn-project/world-state/src/synchronizer/factory.ts @@ -1,7 +1,7 @@ import { type L1ToL2MessageSource, type L2BlockSource } from '@aztec/circuit-types'; import { createDebugLogger } from '@aztec/foundation/log'; import { type DataStoreConfig } from '@aztec/kv-store/config'; -import { createStore } from '@aztec/kv-store/utils'; +import { createStore } from '@aztec/kv-store/lmdb'; import { type TelemetryClient } from '@aztec/telemetry-client'; import { NoopTelemetryClient } from '@aztec/telemetry-client/noop'; diff --git a/yarn-project/world-state/src/world-state-db/merkle_trees.ts b/yarn-project/world-state/src/world-state-db/merkle_trees.ts index bb7bcd58a8d..16640e78bdf 100644 --- a/yarn-project/world-state/src/world-state-db/merkle_trees.ts +++ b/yarn-project/world-state/src/world-state-db/merkle_trees.ts @@ -36,7 +36,7 @@ import { SerialQueue } from '@aztec/foundation/queue'; import { Timer, elapsed } from '@aztec/foundation/timer'; import { type IndexedTreeLeafPreimage } from '@aztec/foundation/trees'; import { type AztecKVStore, type AztecSingleton } from '@aztec/kv-store'; -import { openTmpStore } from '@aztec/kv-store/utils'; +import { openTmpStore } from '@aztec/kv-store/lmdb'; import { type AppendOnlyTree, type IndexedTree, diff --git a/yarn-project/yarn.lock b/yarn-project/yarn.lock index 6a843300ccc..df1ce964b9f 100644 --- a/yarn-project/yarn.lock +++ b/yarn-project/yarn.lock @@ -795,11 +795,22 @@ __metadata: "@aztec/ethereum": "workspace:^" "@aztec/foundation": "workspace:^" "@jest/globals": ^29.5.0 + "@types/chai": ^5.0.1 + "@types/chai-as-promised": ^8.0.1 "@types/jest": ^29.5.0 + "@types/mocha": ^10.0.10 + "@types/mocha-each": ^2.0.4 "@types/node": ^18.7.23 + "@web/dev-server-esbuild": ^1.0.3 + "@web/test-runner": ^0.19.0 + "@web/test-runner-playwright": ^0.11.0 + chai: ^5.1.2 + chai-as-promised: ^8.0.1 + idb: ^8.0.0 jest: ^29.5.0 - jest-mock-extended: ^3.0.3 lmdb: ^3.0.6 + mocha: ^10.8.2 + mocha-each: ^2.0.1 ts-node: ^10.9.1 typescript: ^5.0.4 languageName: unknown @@ -1370,6 +1381,17 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.12.11": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": ^7.25.9 + js-tokens: ^4.0.0 + picocolors: ^1.0.0 + checksum: db13f5c42d54b76c1480916485e6900748bbcb0014a8aca87f50a091f70ff4e0d0a6db63cade75eb41fcc3d2b6ba0a7f89e343def4f96f00269b41b8ab8dd7b8 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.23.5": version: 7.24.4 resolution: "@babel/compat-data@npm:7.24.4" @@ -1525,6 +1547,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 5b85918cb1a92a7f3f508ea02699e8d2422fe17ea8e82acd445006c0ef7520fbf48e3dbcdaf7b0a1d571fc3a2715a29719e5226636cb6042e15fe6ed2a590944 + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.23.5": version: 7.23.5 resolution: "@babel/helper-validator-option@npm:7.23.5" @@ -1966,6 +1995,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/aix-ppc64@npm:0.24.0" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/android-arm64@npm:0.18.20" @@ -1973,6 +2009,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/android-arm64@npm:0.24.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/android-arm@npm:0.18.20" @@ -1980,6 +2023,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/android-arm@npm:0.24.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/android-x64@npm:0.18.20" @@ -1987,6 +2037,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/android-x64@npm:0.24.0" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/darwin-arm64@npm:0.18.20" @@ -1994,6 +2051,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/darwin-arm64@npm:0.24.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/darwin-x64@npm:0.18.20" @@ -2001,6 +2065,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/darwin-x64@npm:0.24.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/freebsd-arm64@npm:0.18.20" @@ -2008,6 +2079,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/freebsd-arm64@npm:0.24.0" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/freebsd-x64@npm:0.18.20" @@ -2015,6 +2093,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/freebsd-x64@npm:0.24.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-arm64@npm:0.18.20" @@ -2022,6 +2107,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-arm64@npm:0.24.0" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-arm@npm:0.18.20" @@ -2029,6 +2121,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-arm@npm:0.24.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-ia32@npm:0.18.20" @@ -2036,6 +2135,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-ia32@npm:0.24.0" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-loong64@npm:0.18.20" @@ -2043,6 +2149,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-loong64@npm:0.24.0" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-mips64el@npm:0.18.20" @@ -2050,6 +2163,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-mips64el@npm:0.24.0" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-ppc64@npm:0.18.20" @@ -2057,6 +2177,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-ppc64@npm:0.24.0" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-riscv64@npm:0.18.20" @@ -2064,6 +2191,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-riscv64@npm:0.24.0" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-s390x@npm:0.18.20" @@ -2071,6 +2205,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-s390x@npm:0.24.0" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-x64@npm:0.18.20" @@ -2078,6 +2219,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/linux-x64@npm:0.24.0" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/netbsd-x64@npm:0.18.20" @@ -2085,6 +2233,20 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/netbsd-x64@npm:0.24.0" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/openbsd-arm64@npm:0.24.0" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/openbsd-x64@npm:0.18.20" @@ -2092,6 +2254,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/openbsd-x64@npm:0.24.0" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/sunos-x64@npm:0.18.20" @@ -2099,6 +2268,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/sunos-x64@npm:0.24.0" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/win32-arm64@npm:0.18.20" @@ -2106,6 +2282,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/win32-arm64@npm:0.24.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/win32-ia32@npm:0.18.20" @@ -2113,6 +2296,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/win32-ia32@npm:0.24.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/win32-x64@npm:0.18.20" @@ -2120,6 +2310,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.24.0": + version: 0.24.0 + resolution: "@esbuild/win32-x64@npm:0.24.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -2162,6 +2359,13 @@ __metadata: languageName: node linkType: hard +"@hapi/bourne@npm:^3.0.0": + version: 3.0.0 + resolution: "@hapi/bourne@npm:3.0.0" + checksum: 7174cab6c33191918fcdb1953fe3169a1106e6ac79a67ef5fd08b351f0813f8f608170f2239786cbe5519e03cdfe5ab748ea1635caa06dcd5802410295514ef8 + languageName: node + linkType: hard + "@humanwhocodes/config-array@npm:^0.11.14": version: 0.11.14 resolution: "@humanwhocodes/config-array@npm:0.11.14" @@ -3235,6 +3439,13 @@ __metadata: languageName: node linkType: hard +"@mdn/browser-compat-data@npm:^4.0.0": + version: 4.2.1 + resolution: "@mdn/browser-compat-data@npm:4.2.1" + checksum: 76eaa7dafed154040e769ba6d23f2dcb58e805ed3ccb376a5c4b76326c92643753c20194faed363870800dc3c1af26c107b8562710c8bb37aaee8c5ffe2a89cd + languageName: node + linkType: hard + "@microsoft/tsdoc-config@npm:0.16.2": version: 0.16.2 resolution: "@microsoft/tsdoc-config@npm:0.16.2" @@ -4072,6 +4283,184 @@ __metadata: languageName: node linkType: hard +"@puppeteer/browsers@npm:2.4.1": + version: 2.4.1 + resolution: "@puppeteer/browsers@npm:2.4.1" + dependencies: + debug: ^4.3.7 + extract-zip: ^2.0.1 + progress: ^2.0.3 + proxy-agent: ^6.4.0 + semver: ^7.6.3 + tar-fs: ^3.0.6 + unbzip2-stream: ^1.4.3 + yargs: ^17.7.2 + bin: + browsers: lib/cjs/main-cli.js + checksum: 1e8193ae4ad84cf5a4f1ad59abe92f77a8ba4a902670f8a54002b9b772bf4df081de9e2ccb47efc465c31a0c6a649cbf7b7be8318f9fd3a6af466836b6835327 + languageName: node + linkType: hard + +"@rollup/plugin-node-resolve@npm:^15.0.1": + version: 15.3.0 + resolution: "@rollup/plugin-node-resolve@npm:15.3.0" + dependencies: + "@rollup/pluginutils": ^5.0.1 + "@types/resolve": 1.20.2 + deepmerge: ^4.2.2 + is-module: ^1.0.0 + resolve: ^1.22.1 + peerDependencies: + rollup: ^2.78.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 90e4e94b173e7edd57e374ac0cc0a69cc6f1b4507e83731132ac6fa1747d96a5648a48441e4452728429b6db5e67561439b7b2f4d2c6a941a33d38be56d871b4 + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^5.0.1": + version: 5.1.3 + resolution: "@rollup/pluginutils@npm:5.1.3" + dependencies: + "@types/estree": ^1.0.0 + estree-walker: ^2.0.2 + picomatch: ^4.0.2 + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: a6e9bac8ae94da39679dae390b53b43fe7a218f8fa2bfecf86e59be4da4ba02ac004f166daf55f03506e49108399394f13edeb62cce090f8cfc967b29f4738bf + languageName: node + linkType: hard + +"@rollup/rollup-android-arm-eabi@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.27.4" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-android-arm64@npm:4.27.4" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-darwin-arm64@npm:4.27.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-darwin-x64@npm:4.27.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.27.4" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-freebsd-x64@npm:4.27.4" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.27.4" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.27.4" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.27.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.27.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.27.4" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.27.4" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.27.4" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.27.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.27.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.27.4" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.27.4" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.27.4": + version: 4.27.4 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.27.4" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.2, @scure/base@npm:~1.1.4": version: 1.1.6 resolution: "@scure/base@npm:1.1.6" @@ -4385,6 +4774,13 @@ __metadata: languageName: node linkType: hard +"@types/babel__code-frame@npm:^7.0.2": + version: 7.0.6 + resolution: "@types/babel__code-frame@npm:7.0.6" + checksum: 5325ab85d95e58fe84279757788ddb0de68bfd6814bc636e868f9ff7b5229915873f28847c4baf48fd3a4a460a73b4ea87bc9e1d78a3a5a60cfc7ca627a722c5 + languageName: node + linkType: hard + "@types/babel__core@npm:^7.1.14": version: 7.20.5 resolution: "@types/babel__core@npm:7.20.5" @@ -4463,6 +4859,24 @@ __metadata: languageName: node linkType: hard +"@types/chai-as-promised@npm:^8.0.1": + version: 8.0.1 + resolution: "@types/chai-as-promised@npm:8.0.1" + dependencies: + "@types/chai": "*" + checksum: 7b298bab0cc16e244f9402de25eed8d626e803d328b67241487e3296bf68e95792f572491a2995ba409288263344fdc0da380064c5b6562a2a4d69bf78624d74 + languageName: node + linkType: hard + +"@types/chai@npm:*, @types/chai@npm:^5.0.1": + version: 5.0.1 + resolution: "@types/chai@npm:5.0.1" + dependencies: + "@types/deep-eql": "*" + checksum: 53d813cbca3755c025381ad4ac8b51b17897df90316350247f9527bdba3adb48b3b1315308fbd717d9013d8e60375c0ab4bd004dc72330133486ff5db4cb0b2c + languageName: node + linkType: hard + "@types/chalk@npm:^2.2.0": version: 2.2.0 resolution: "@types/chalk@npm:2.2.0" @@ -4472,6 +4886,23 @@ __metadata: languageName: node linkType: hard +"@types/co-body@npm:^6.1.0": + version: 6.1.3 + resolution: "@types/co-body@npm:6.1.3" + dependencies: + "@types/node": "*" + "@types/qs": "*" + checksum: e93fdc177f69ee0535cf401783258e4255f5eb8235c58b5a2a5a8958cf341fadf3d0bf2c75907ed6b7d188ce2c2f2cf9593a71d4eef12900beba54ebbbdd5cc1 + languageName: node + linkType: hard + +"@types/command-line-args@npm:^5.0.0": + version: 5.2.3 + resolution: "@types/command-line-args@npm:5.2.3" + checksum: 3d90db5b4bbaabd049654a0d12fa378989ab0d76a0f98d4c606761b5a08ce76458df0f9bb175219e187b4cd57e285e6f836d23e86b2c3d997820854cc3ed9121 + languageName: node + linkType: hard + "@types/connect-history-api-fallback@npm:^1.5.4": version: 1.5.4 resolution: "@types/connect-history-api-fallback@npm:1.5.4" @@ -4498,6 +4929,13 @@ __metadata: languageName: node linkType: hard +"@types/convert-source-map@npm:^2.0.0": + version: 2.0.3 + resolution: "@types/convert-source-map@npm:2.0.3" + checksum: 411cf9a02cf5dbe204e325dd5ebf50de00b58b38d1d2a3064c6ea28417c23bae956206eaa9ed3a75a994909b4ab3f9c6389073d0636a62500fa6d6333c64d45a + languageName: node + linkType: hard + "@types/cookiejar@npm:^2.1.5": version: 2.1.5 resolution: "@types/cookiejar@npm:2.1.5" @@ -4517,6 +4955,13 @@ __metadata: languageName: node linkType: hard +"@types/debounce@npm:^1.2.0": + version: 1.2.4 + resolution: "@types/debounce@npm:1.2.4" + checksum: decef3eee65d681556d50f7fac346f1b33134f6b21f806d41326f9dfb362fa66b0282ff0640ae6791b690694c9dc3dad4e146e909e707e6f96650f3aa325b9da + languageName: node + linkType: hard + "@types/debug@npm:^4.1.7": version: 4.1.12 resolution: "@types/debug@npm:4.1.12" @@ -4526,6 +4971,13 @@ __metadata: languageName: node linkType: hard +"@types/deep-eql@npm:*": + version: 4.0.2 + resolution: "@types/deep-eql@npm:4.0.2" + checksum: 249a27b0bb22f6aa28461db56afa21ec044fa0e303221a62dff81831b20c8530502175f1a49060f7099e7be06181078548ac47c668de79ff9880241968d43d0c + languageName: node + linkType: hard + "@types/detect-node@npm:^2.0.0": version: 2.0.2 resolution: "@types/detect-node@npm:2.0.2" @@ -4578,7 +5030,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:^1.0.6": +"@types/estree@npm:1.0.6, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": version: 1.0.6 resolution: "@types/estree@npm:1.0.6" checksum: 8825d6e729e16445d9a1dd2fb1db2edc5ed400799064cd4d028150701031af012ba30d6d03fe9df40f4d7a437d0de6d2b256020152b7b09bde9f2e420afdffd9 @@ -4670,7 +5122,7 @@ __metadata: languageName: node linkType: hard -"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": +"@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1, @types/istanbul-lib-coverage@npm:^2.0.3": version: 2.0.6 resolution: "@types/istanbul-lib-coverage@npm:2.0.6" checksum: 3feac423fd3e5449485afac999dcfcb3d44a37c830af898b689fadc65d26526460bedb889db278e0d4d815a670331796494d073a10ee6e3a6526301fe7415778 @@ -4807,7 +5259,7 @@ __metadata: languageName: node linkType: hard -"@types/koa@npm:*, @types/koa@npm:^2.13.5, @types/koa@npm:^2.13.6, @types/koa@npm:^2.13.9, @types/koa@npm:^2.15.0": +"@types/koa@npm:*, @types/koa@npm:^2.11.6, @types/koa@npm:^2.13.5, @types/koa@npm:^2.13.6, @types/koa@npm:^2.13.9, @types/koa@npm:^2.15.0": version: 2.15.0 resolution: "@types/koa@npm:2.15.0" dependencies: @@ -4996,6 +5448,22 @@ __metadata: languageName: node linkType: hard +"@types/mocha-each@npm:^2.0.4": + version: 2.0.4 + resolution: "@types/mocha-each@npm:2.0.4" + dependencies: + "@types/mocha": "*" + checksum: 2588284db079e2d0a17735c8fb5c12cba9feabf2de55c9ab49e1f3b38cc522691d30ed3abb1bcb21c087b27f373e3f4123ef7bd8d9a4f95cef38f6c8045c71f3 + languageName: node + linkType: hard + +"@types/mocha@npm:*, @types/mocha@npm:^10.0.10": + version: 10.0.10 + resolution: "@types/mocha@npm:10.0.10" + checksum: 17a56add60a8cc8362d3c62cb6798be3f89f4b6ccd5b9abd12b46e31ff299be21ff2faebf5993de7e0099559f58ca5a3b49a505d302dfa5d65c5a4edfc089195 + languageName: node + linkType: hard + "@types/ms@npm:*": version: 0.7.34 resolution: "@types/ms@npm:0.7.34" @@ -5087,6 +5555,13 @@ __metadata: languageName: node linkType: hard +"@types/parse5@npm:^6.0.1": + version: 6.0.3 + resolution: "@types/parse5@npm:6.0.3" + checksum: ddb59ee4144af5dfcc508a8dcf32f37879d11e12559561e65788756b95b33e6f03ea027d88e1f5408f9b7bfb656bf630ace31a2169edf44151daaf8dd58df1b7 + languageName: node + linkType: hard + "@types/qs@npm:*": version: 6.9.15 resolution: "@types/qs@npm:6.9.15" @@ -5101,6 +5576,13 @@ __metadata: languageName: node linkType: hard +"@types/resolve@npm:1.20.2": + version: 1.20.2 + resolution: "@types/resolve@npm:1.20.2" + checksum: 61c2cad2499ffc8eab36e3b773945d337d848d3ac6b7b0a87c805ba814bc838ef2f262fc0f109bfd8d2e0898ff8bd80ad1025f9ff64f1f71d3d4294c9f14e5f6 + languageName: node + linkType: hard + "@types/retry@npm:0.12.2": version: 0.12.2 resolution: "@types/retry@npm:0.12.2" @@ -5231,6 +5713,15 @@ __metadata: languageName: node linkType: hard +"@types/ws@npm:^7.4.0": + version: 7.4.7 + resolution: "@types/ws@npm:7.4.7" + dependencies: + "@types/node": "*" + checksum: b4c9b8ad209620c9b21e78314ce4ff07515c0cadab9af101c1651e7bfb992d7fd933bd8b9c99d110738fd6db523ed15f82f29f50b45510288da72e964dedb1a3 + languageName: node + linkType: hard + "@types/ws@npm:^8.5.10": version: 8.5.13 resolution: "@types/ws@npm:8.5.13" @@ -5447,54 +5938,275 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:5.62.0": - version: 5.62.0 - resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" +"@typescript-eslint/visitor-keys@npm:5.62.0": + version: 5.62.0 + resolution: "@typescript-eslint/visitor-keys@npm:5.62.0" + dependencies: + "@typescript-eslint/types": 5.62.0 + eslint-visitor-keys: ^3.3.0 + checksum: 976b05d103fe8335bef5c93ad3f76d781e3ce50329c0243ee0f00c0fcfb186c81df50e64bfdd34970148113f8ade90887f53e3c4938183afba830b4ba8e30a35 + languageName: node + linkType: hard + +"@typescript-eslint/visitor-keys@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" + dependencies: + "@typescript-eslint/types": 6.21.0 + eslint-visitor-keys: ^3.4.1 + checksum: 67c7e6003d5af042d8703d11538fca9d76899f0119130b373402819ae43f0bc90d18656aa7add25a24427ccf1a0efd0804157ba83b0d4e145f06107d7d1b7433 + languageName: node + linkType: hard + +"@ungap/structured-clone@npm:^1.2.0": + version: 1.2.0 + resolution: "@ungap/structured-clone@npm:1.2.0" + checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 + languageName: node + linkType: hard + +"@viem/anvil@npm:^0.0.10": + version: 0.0.10 + resolution: "@viem/anvil@npm:0.0.10" + dependencies: + execa: ^7.1.1 + get-port: ^6.1.2 + http-proxy: ^1.18.1 + ws: ^8.13.0 + checksum: fb475055f36c753cea26fa0c02a0278301dddcdc8003418576395cfc31e97ba5a236fbc66ff093bd8d39ea05286487adb86b7499308e446b6cfe90dc08089b38 + languageName: node + linkType: hard + +"@viem/anvil@npm:^0.0.9": + version: 0.0.9 + resolution: "@viem/anvil@npm:0.0.9" + dependencies: + execa: ^7.1.1 + get-port: ^6.1.2 + http-proxy: ^1.18.1 + ws: ^8.13.0 + checksum: 14c9f6593d860e889ade36daadd2e7d5e17d0bcb1254c18b85dbc81391488f570c2ef9b08a5736f2ca9666001fa1001fff84626817ab75cadbacff11c8628ebf + languageName: node + linkType: hard + +"@web/browser-logs@npm:^0.4.0": + version: 0.4.0 + resolution: "@web/browser-logs@npm:0.4.0" + dependencies: + errorstacks: ^2.2.0 + checksum: 65c6c4312b1ff00ff40fd15c07708f5e113bb8b4f87c972356010546a0664287dd4f64c5475f8be27b6abb29b9272ecc4162aada90ffb732f1779ceec5fd8ad6 + languageName: node + linkType: hard + +"@web/config-loader@npm:^0.3.0": + version: 0.3.2 + resolution: "@web/config-loader@npm:0.3.2" + checksum: 8f9b9d9283279b65702e9251c18311d5f8b67cc6c2df3d1d2c9a0d7f9e311f112001879e1328a4c88907b5aa66a279386d126a51b0e98f5ecd9da6ccbb4fd5da + languageName: node + linkType: hard + +"@web/dev-server-core@npm:^0.7.2, @web/dev-server-core@npm:^0.7.3, @web/dev-server-core@npm:^0.7.4": + version: 0.7.4 + resolution: "@web/dev-server-core@npm:0.7.4" + dependencies: + "@types/koa": ^2.11.6 + "@types/ws": ^7.4.0 + "@web/parse5-utils": ^2.1.0 + chokidar: ^4.0.1 + clone: ^2.1.2 + es-module-lexer: ^1.0.0 + get-stream: ^6.0.0 + is-stream: ^2.0.0 + isbinaryfile: ^5.0.0 + koa: ^2.13.0 + koa-etag: ^4.0.0 + koa-send: ^5.0.1 + koa-static: ^5.0.0 + lru-cache: ^8.0.4 + mime-types: ^2.1.27 + parse5: ^6.0.1 + picomatch: ^2.2.2 + ws: ^7.5.10 + checksum: 93493c07fc732989f575bdd17f860063e7d78d4f410fb47ea41aa81f3274d29246b7ea449709ab946650e4bb09bb06c878926d721af2702d1b365012bfc7ba63 + languageName: node + linkType: hard + +"@web/dev-server-esbuild@npm:^1.0.3": + version: 1.0.3 + resolution: "@web/dev-server-esbuild@npm:1.0.3" + dependencies: + "@mdn/browser-compat-data": ^4.0.0 + "@web/dev-server-core": ^0.7.4 + esbuild: ^0.24.0 + parse5: ^6.0.1 + ua-parser-js: ^1.0.33 + checksum: 8dba030098191260eca9aef5d2f8a986a8829300882f3563a925df36807ab49b1cacd33c9a581ae7d6c83fc32fdbaf779a2b4d3b47cb61edbdd2b67eb09534a7 + languageName: node + linkType: hard + +"@web/dev-server-rollup@npm:^0.6.1": + version: 0.6.4 + resolution: "@web/dev-server-rollup@npm:0.6.4" + dependencies: + "@rollup/plugin-node-resolve": ^15.0.1 + "@web/dev-server-core": ^0.7.2 + nanocolors: ^0.2.1 + parse5: ^6.0.1 + rollup: ^4.4.0 + whatwg-url: ^14.0.0 + checksum: 19ab662541fe9f7364b43745e4e2179619afc016fa293b0b0ee9bb8b8a064987f144ebaf531c0b963e676a801a5e93658e3b160148022879a0c86d2acaed95bf + languageName: node + linkType: hard + +"@web/dev-server@npm:^0.4.0": + version: 0.4.6 + resolution: "@web/dev-server@npm:0.4.6" + dependencies: + "@babel/code-frame": ^7.12.11 + "@types/command-line-args": ^5.0.0 + "@web/config-loader": ^0.3.0 + "@web/dev-server-core": ^0.7.2 + "@web/dev-server-rollup": ^0.6.1 + camelcase: ^6.2.0 + command-line-args: ^5.1.1 + command-line-usage: ^7.0.1 + debounce: ^1.2.0 + deepmerge: ^4.2.2 + internal-ip: ^6.2.0 + nanocolors: ^0.2.1 + open: ^8.0.2 + portfinder: ^1.0.32 + bin: + wds: dist/bin.js + web-dev-server: dist/bin.js + checksum: 7dc70749b3bdd9eaa0e8a8f491927bd4562a0a718ac79dbce53f80f55f945e8448a7f8fad34b94c7e056ab10ee3e513ac4b85aa1ed26d9b93ca89252de9b2bdf + languageName: node + linkType: hard + +"@web/parse5-utils@npm:^2.1.0": + version: 2.1.0 + resolution: "@web/parse5-utils@npm:2.1.0" + dependencies: + "@types/parse5": ^6.0.1 + parse5: ^6.0.1 + checksum: 0faa93c51d61934e0006bebc2e257036f8cedeb455c7bf22b8fdbc17919929518c2cc99ced3769f8eb3b1d6694dd4a7186d66ad2b3c4330140fd2ce03dc6c4d2 + languageName: node + linkType: hard + +"@web/test-runner-chrome@npm:^0.17.0": + version: 0.17.0 + resolution: "@web/test-runner-chrome@npm:0.17.0" dependencies: - "@typescript-eslint/types": 5.62.0 - eslint-visitor-keys: ^3.3.0 - checksum: 976b05d103fe8335bef5c93ad3f76d781e3ce50329c0243ee0f00c0fcfb186c81df50e64bfdd34970148113f8ade90887f53e3c4938183afba830b4ba8e30a35 + "@web/test-runner-core": ^0.13.0 + "@web/test-runner-coverage-v8": ^0.8.0 + async-mutex: 0.4.0 + chrome-launcher: ^0.15.0 + puppeteer-core: ^23.2.0 + checksum: 6779c82d8989b57f90d95fbe3cf1a62974583862129c988b81cb1b3327c865a9b8631d0172a762ebcbffd156ba3f61585b849a2268fecdfd9a95e58305feacae languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.21.0": - version: 6.21.0 - resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" +"@web/test-runner-commands@npm:^0.9.0": + version: 0.9.0 + resolution: "@web/test-runner-commands@npm:0.9.0" dependencies: - "@typescript-eslint/types": 6.21.0 - eslint-visitor-keys: ^3.4.1 - checksum: 67c7e6003d5af042d8703d11538fca9d76899f0119130b373402819ae43f0bc90d18656aa7add25a24427ccf1a0efd0804157ba83b0d4e145f06107d7d1b7433 + "@web/test-runner-core": ^0.13.0 + mkdirp: ^1.0.4 + checksum: df226f76148c5967df68c2589549b10ffe75f3d34a31d63bea132447271cdf073de7350aa680fcbf4315737b909fc44faad23d9f8e7e3ce37e93e05e67a7f295 languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 4f656b7b4672f2ce6e272f2427d8b0824ed11546a601d8d5412b9d7704e83db38a8d9f402ecdf2b9063fc164af842ad0ec4a55819f621ed7e7ea4d1efcc74524 +"@web/test-runner-core@npm:^0.13.0": + version: 0.13.4 + resolution: "@web/test-runner-core@npm:0.13.4" + dependencies: + "@babel/code-frame": ^7.12.11 + "@types/babel__code-frame": ^7.0.2 + "@types/co-body": ^6.1.0 + "@types/convert-source-map": ^2.0.0 + "@types/debounce": ^1.2.0 + "@types/istanbul-lib-coverage": ^2.0.3 + "@types/istanbul-reports": ^3.0.0 + "@web/browser-logs": ^0.4.0 + "@web/dev-server-core": ^0.7.3 + chokidar: ^4.0.1 + cli-cursor: ^3.1.0 + co-body: ^6.1.0 + convert-source-map: ^2.0.0 + debounce: ^1.2.0 + dependency-graph: ^0.11.0 + globby: ^11.0.1 + internal-ip: ^6.2.0 + istanbul-lib-coverage: ^3.0.0 + istanbul-lib-report: ^3.0.1 + istanbul-reports: ^3.0.2 + log-update: ^4.0.0 + nanocolors: ^0.2.1 + nanoid: ^3.1.25 + open: ^8.0.2 + picomatch: ^2.2.2 + source-map: ^0.7.3 + checksum: cc80f0873e59d2809d6438c1e5a5a110fa43ce5ce33bf3d0e5c65aa05b214e71d8ffba9f67ee45f75d36c6d6fb1c23662725be0b4ecb2f294a932d5eb76eb911 languageName: node linkType: hard -"@viem/anvil@npm:^0.0.10": - version: 0.0.10 - resolution: "@viem/anvil@npm:0.0.10" +"@web/test-runner-coverage-v8@npm:^0.8.0": + version: 0.8.0 + resolution: "@web/test-runner-coverage-v8@npm:0.8.0" dependencies: - execa: ^7.1.1 - get-port: ^6.1.2 - http-proxy: ^1.18.1 - ws: ^8.13.0 - checksum: fb475055f36c753cea26fa0c02a0278301dddcdc8003418576395cfc31e97ba5a236fbc66ff093bd8d39ea05286487adb86b7499308e446b6cfe90dc08089b38 + "@web/test-runner-core": ^0.13.0 + istanbul-lib-coverage: ^3.0.0 + lru-cache: ^8.0.4 + picomatch: ^2.2.2 + v8-to-istanbul: ^9.0.1 + checksum: 343f834372b3aeb2c24f4b03ce956d8ad851ef2a85b94507651c2a65321fcdff1b26a2c44d7516e97d9c42786bb003b9c245ad0798a414a814d0264fdbe0761e languageName: node linkType: hard -"@viem/anvil@npm:^0.0.9": - version: 0.0.9 - resolution: "@viem/anvil@npm:0.0.9" +"@web/test-runner-mocha@npm:^0.9.0": + version: 0.9.0 + resolution: "@web/test-runner-mocha@npm:0.9.0" dependencies: - execa: ^7.1.1 - get-port: ^6.1.2 - http-proxy: ^1.18.1 - ws: ^8.13.0 - checksum: 14c9f6593d860e889ade36daadd2e7d5e17d0bcb1254c18b85dbc81391488f570c2ef9b08a5736f2ca9666001fa1001fff84626817ab75cadbacff11c8628ebf + "@web/test-runner-core": ^0.13.0 + checksum: bcc9410ac9d679e7bb804fc5720b2a0ed3b4d08f2b49c03f2157f5b54c7f525a432712e1da644f04e5190c2480af2dc46a4c736cdba3fda3ba5fa98fd0f01a94 + languageName: node + linkType: hard + +"@web/test-runner-playwright@npm:^0.11.0": + version: 0.11.0 + resolution: "@web/test-runner-playwright@npm:0.11.0" + dependencies: + "@web/test-runner-core": ^0.13.0 + "@web/test-runner-coverage-v8": ^0.8.0 + playwright: ^1.22.2 + checksum: 3618b0b559d865af1211b3d86ec57487b32722a0dd640c9a3faca6c692cceec75176d742d0db73c823d300fbe761e5c15b2fad0c5096c3dbfedab313ed1aa7fe + languageName: node + linkType: hard + +"@web/test-runner@npm:^0.19.0": + version: 0.19.0 + resolution: "@web/test-runner@npm:0.19.0" + dependencies: + "@web/browser-logs": ^0.4.0 + "@web/config-loader": ^0.3.0 + "@web/dev-server": ^0.4.0 + "@web/test-runner-chrome": ^0.17.0 + "@web/test-runner-commands": ^0.9.0 + "@web/test-runner-core": ^0.13.0 + "@web/test-runner-mocha": ^0.9.0 + camelcase: ^6.2.0 + command-line-args: ^5.1.1 + command-line-usage: ^7.0.1 + convert-source-map: ^2.0.0 + diff: ^5.0.0 + globby: ^11.0.1 + nanocolors: ^0.2.1 + portfinder: ^1.0.32 + source-map: ^0.7.3 + bin: + web-test-runner: dist/bin.js + wtr: dist/bin.js + checksum: b1e0cdd53540c3c9d4c79389e0045e942731e0011d489705ca9913579ba15d7d7cce167dceadd62ecf32dbed9d44a4218cee82bc999a51888701fa10b77b40c5 languageName: node linkType: hard @@ -5952,7 +6664,14 @@ __metadata: languageName: node linkType: hard -"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.2": +"ansi-colors@npm:^4.1.3": + version: 4.1.3 + resolution: "ansi-colors@npm:4.1.3" + checksum: a9c2ec842038a1fabc7db9ece7d3177e2fe1c5dc6f0c51ecfbf5f39911427b89c00b5dc6b8bd95f82a26e9b16aaae2e83d45f060e98070ce4d1333038edceb0e + languageName: node + linkType: hard + +"ansi-escapes@npm:^4.2.1, ansi-escapes@npm:^4.3.0, ansi-escapes@npm:^4.3.2": version: 4.3.2 resolution: "ansi-escapes@npm:4.3.2" dependencies: @@ -6119,6 +6838,13 @@ __metadata: languageName: node linkType: hard +"array-back@npm:^6.2.2": + version: 6.2.2 + resolution: "array-back@npm:6.2.2" + checksum: baae1e3a1687300a307d3bdf09715f6415e1099b5729d3d8e397309fb1e43d90b939d694602892172aaca7e0aeed38da89d04aa4951637d31c2a21350809e003 + languageName: node + linkType: hard + "array-buffer-byte-length@npm:^1.0.1": version: 1.0.1 resolution: "array-buffer-byte-length@npm:1.0.1" @@ -6257,6 +6983,13 @@ __metadata: languageName: node linkType: hard +"assertion-error@npm:^2.0.1": + version: 2.0.1 + resolution: "assertion-error@npm:2.0.1" + checksum: a0789dd882211b87116e81e2648ccb7f60340b34f19877dd020b39ebb4714e475eb943e14ba3e22201c221ef6645b7bfe10297e76b6ac95b48a9898c1211ce66 + languageName: node + linkType: hard + "ast-module-types@npm:^2.7.1": version: 2.7.1 resolution: "ast-module-types@npm:2.7.1" @@ -6287,6 +7020,31 @@ __metadata: languageName: node linkType: hard +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 + languageName: node + linkType: hard + +"async-mutex@npm:0.4.0": + version: 0.4.0 + resolution: "async-mutex@npm:0.4.0" + dependencies: + tslib: ^2.4.0 + checksum: 813a71728b35a4fbfd64dba719f04726d9133c67b577fcd951b7028c4a675a13ee34e69beb82d621f87bf81f5d4f135c4c44be0448550c7db728547244ef71fc + languageName: node + linkType: hard + +"async@npm:^2.6.4": + version: 2.6.4 + resolution: "async@npm:2.6.4" + dependencies: + lodash: ^4.17.14 + checksum: a52083fb32e1ebe1d63e5c5624038bb30be68ff07a6c8d7dfe35e47c93fc144bd8652cbec869e0ac07d57dde387aa5f1386be3559cdee799cb1f789678d88e19 + languageName: node + linkType: hard + "asynckit@npm:^0.4.0": version: 0.4.0 resolution: "asynckit@npm:0.4.0" @@ -6673,6 +7431,13 @@ __metadata: languageName: node linkType: hard +"browser-stdout@npm:^1.3.1": + version: 1.3.1 + resolution: "browser-stdout@npm:1.3.1" + checksum: b717b19b25952dd6af483e368f9bcd6b14b87740c3d226c2977a65e84666ffd67000bddea7d911f111a9b6ddc822b234de42d52ab6507bce4119a4cc003ef7b3 + languageName: node + linkType: hard + "browserify-aes@npm:^1.0.4, browserify-aes@npm:^1.2.0": version: 1.2.0 resolution: "browserify-aes@npm:1.2.0" @@ -7034,7 +7799,7 @@ __metadata: languageName: node linkType: hard -"camelcase@npm:^6.2.0": +"camelcase@npm:^6.0.0, camelcase@npm:^6.2.0": version: 6.3.0 resolution: "camelcase@npm:6.3.0" checksum: 8c96818a9076434998511251dcb2761a94817ea17dbdc37f47ac080bd088fc62c7369429a19e2178b993497132c8cbcf5cc1f44ba963e76782ba469c0474938d @@ -7069,7 +7834,31 @@ __metadata: languageName: node linkType: hard -"chalk-template@npm:0.4.0": +"chai-as-promised@npm:^8.0.1": + version: 8.0.1 + resolution: "chai-as-promised@npm:8.0.1" + dependencies: + check-error: ^2.0.0 + peerDependencies: + chai: ">= 2.1.2 < 6" + checksum: 7fa517bc70fd355ec91b543c8c1a1cf545355224cf75063f93b3ed32bb562f1f23a850135737d6337fa4e098c8baffbb9c74b05b1fcb3c4d290985a8c3c4890d + languageName: node + linkType: hard + +"chai@npm:^5.1.2": + version: 5.1.2 + resolution: "chai@npm:5.1.2" + dependencies: + assertion-error: ^2.0.1 + check-error: ^2.1.1 + deep-eql: ^5.0.1 + loupe: ^3.1.0 + pathval: ^2.0.0 + checksum: f2341967ab5632612548d372c27b46219adad3af35021d8cba2ae3c262f588de2c60cb3f004e6ad40e363a9cad6d20d0de51f00e7e9ac31cce17fb05d4efa316 + languageName: node + linkType: hard + +"chalk-template@npm:0.4.0, chalk-template@npm:^0.4.0": version: 0.4.0 resolution: "chalk-template@npm:0.4.0" dependencies: @@ -7147,7 +7936,14 @@ __metadata: languageName: node linkType: hard -"chokidar@npm:^3.6.0": +"check-error@npm:^2.0.0, check-error@npm:^2.1.1": + version: 2.1.1 + resolution: "check-error@npm:2.1.1" + checksum: d785ed17b1d4a4796b6e75c765a9a290098cf52ff9728ce0756e8ffd4293d2e419dd30c67200aee34202463b474306913f2fcfaf1890641026d9fc6966fea27a + languageName: node + linkType: hard + +"chokidar@npm:^3.5.3, chokidar@npm:^3.6.0": version: 3.6.0 resolution: "chokidar@npm:3.6.0" dependencies: @@ -7166,6 +7962,15 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^4.0.1": + version: 4.0.1 + resolution: "chokidar@npm:4.0.1" + dependencies: + readdirp: ^4.0.1 + checksum: 193da9786b0422a895d59c7552195d15c6c636e6a2293ae43d09e34e243e24ccd02d693f007c767846a65abbeae5fea6bfacb8fc2ddec4ea4d397620d552010d + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -7173,6 +7978,20 @@ __metadata: languageName: node linkType: hard +"chrome-launcher@npm:^0.15.0": + version: 0.15.2 + resolution: "chrome-launcher@npm:0.15.2" + dependencies: + "@types/node": "*" + escape-string-regexp: ^4.0.0 + is-wsl: ^2.2.0 + lighthouse-logger: ^1.0.0 + bin: + print-chrome-path: bin/print-chrome-path.js + checksum: e1f8131b9f7bd931248ea85f413c6cdb93a0d41440ff5bf0987f36afb081d2b2c7b60ba6062ee7ae2dd9b052143f6b275b38c9eb115d11b49c3ea8829bad7db0 + languageName: node + linkType: hard + "chrome-trace-event@npm:^1.0.2": version: 1.0.3 resolution: "chrome-trace-event@npm:1.0.3" @@ -7206,6 +8025,19 @@ __metadata: languageName: node linkType: hard +"chromium-bidi@npm:0.8.0": + version: 0.8.0 + resolution: "chromium-bidi@npm:0.8.0" + dependencies: + mitt: 3.0.1 + urlpattern-polyfill: 10.0.0 + zod: 3.23.8 + peerDependencies: + devtools-protocol: "*" + checksum: 5c5b12e00564b6f145511ca4c159db24b07bfc6a1eb6add26d88c4331d74ef6cc8cd2f58bc169e0726c689910a1888313722f39ccab1bac14284d1918155d5e9 + languageName: node + linkType: hard + "ci-info@npm:^3.2.0": version: 3.9.0 resolution: "ci-info@npm:3.9.0" @@ -7287,6 +8119,17 @@ __metadata: languageName: node linkType: hard +"cliui@npm:^7.0.2": + version: 7.0.4 + resolution: "cliui@npm:7.0.4" + dependencies: + string-width: ^4.2.0 + strip-ansi: ^6.0.0 + wrap-ansi: ^7.0.0 + checksum: ce2e8f578a4813806788ac399b9e866297740eecd4ad1823c27fd344d78b22c5f8597d548adbcc46f0573e43e21e751f39446c5a5e804a12aace402b7a315d7f + languageName: node + linkType: hard + "cliui@npm:^8.0.1": version: 8.0.1 resolution: "cliui@npm:8.0.1" @@ -7316,6 +8159,13 @@ __metadata: languageName: node linkType: hard +"clone@npm:^2.1.2": + version: 2.1.2 + resolution: "clone@npm:2.1.2" + checksum: aaf106e9bc025b21333e2f4c12da539b568db4925c0501a1bf4070836c9e848c892fa22c35548ce0d1132b08bbbfa17a00144fe58fccdab6fa900fec4250f67d + languageName: node + linkType: hard + "co-body@npm:^6.0.0": version: 6.1.0 resolution: "co-body@npm:6.1.0" @@ -7328,6 +8178,19 @@ __metadata: languageName: node linkType: hard +"co-body@npm:^6.1.0": + version: 6.2.0 + resolution: "co-body@npm:6.2.0" + dependencies: + "@hapi/bourne": ^3.0.0 + inflation: ^2.0.0 + qs: ^6.5.2 + raw-body: ^2.3.3 + type-is: ^1.6.16 + checksum: c89336086bb746291b5efd8999403eadce34810f2f1936ab4d38d2cb4290b7fc6b966d1d4e993a2788b3e954b8df63195dbdcb431a06ef2b0ac086fce8ae5c4c + languageName: node + linkType: hard + "co@npm:^4.6.0": version: 4.6.0 resolution: "co@npm:4.6.0" @@ -7447,6 +8310,18 @@ __metadata: languageName: node linkType: hard +"command-line-usage@npm:^7.0.1": + version: 7.0.3 + resolution: "command-line-usage@npm:7.0.3" + dependencies: + array-back: ^6.2.2 + chalk-template: ^0.4.0 + table-layout: ^4.1.0 + typical: ^7.1.1 + checksum: cb65d94c71ac380d6133460fa16d15c3d6dde00746498d60dcd12989fffeb90d1373230135c97e0bd7019874edd913f9df8b87b0afc7180811117342ae950ff4 + languageName: node + linkType: hard + "commander@npm:^10.0.1": version: 10.0.1 resolution: "commander@npm:10.0.1" @@ -8158,7 +9033,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:2.6.9": +"debug@npm:2.6.9, debug@npm:^2.6.9": version: 2.6.9 resolution: "debug@npm:2.6.9" dependencies: @@ -8188,7 +9063,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.3.5, debug@npm:^4.3.6": +"debug@npm:^4.3.5, debug@npm:^4.3.6, debug@npm:^4.3.7": version: 4.3.7 resolution: "debug@npm:4.3.7" dependencies: @@ -8217,6 +9092,13 @@ __metadata: languageName: node linkType: hard +"decamelize@npm:^4.0.0": + version: 4.0.0 + resolution: "decamelize@npm:4.0.0" + checksum: b7d09b82652c39eead4d6678bb578e3bebd848add894b76d0f6b395bc45b2d692fb88d977e7cfb93c4ed6c119b05a1347cef261174916c2e75c0a8ca57da1809 + languageName: node + linkType: hard + "dedent@npm:^1.0.0": version: 1.5.3 resolution: "dedent@npm:1.5.3" @@ -8229,6 +9111,13 @@ __metadata: languageName: node linkType: hard +"deep-eql@npm:^5.0.1": + version: 5.0.2 + resolution: "deep-eql@npm:5.0.2" + checksum: 6aaaadb4c19cbce42e26b2bbe5bd92875f599d2602635dc97f0294bae48da79e89470aedee05f449e0ca8c65e9fd7e7872624d1933a1db02713d99c2ca8d1f24 + languageName: node + linkType: hard + "deep-equal@npm:~1.0.1": version: 1.0.1 resolution: "deep-equal@npm:1.0.1" @@ -8274,6 +9163,15 @@ __metadata: languageName: node linkType: hard +"default-gateway@npm:^6.0.0": + version: 6.0.3 + resolution: "default-gateway@npm:6.0.3" + dependencies: + execa: ^5.0.0 + checksum: 126f8273ecac8ee9ff91ea778e8784f6cd732d77c3157e8c5bdd6ed03651b5291f71446d05bc02d04073b1e67583604db5394ea3cf992ede0088c70ea15b7378 + languageName: node + linkType: hard + "defaults@npm:^1.0.3": version: 1.0.4 resolution: "defaults@npm:1.0.4" @@ -8304,6 +9202,13 @@ __metadata: languageName: node linkType: hard +"define-lazy-prop@npm:^2.0.0": + version: 2.0.0 + resolution: "define-lazy-prop@npm:2.0.0" + checksum: 0115fdb065e0490918ba271d7339c42453d209d4cb619dfe635870d906731eff3e1ade8028bb461ea27ce8264ec5e22c6980612d332895977e89c1bbc80fcee2 + languageName: node + linkType: hard + "define-lazy-prop@npm:^3.0.0": version: 3.0.0 resolution: "define-lazy-prop@npm:3.0.0" @@ -8382,6 +9287,13 @@ __metadata: languageName: node linkType: hard +"dependency-graph@npm:^0.11.0": + version: 0.11.0 + resolution: "dependency-graph@npm:0.11.0" + checksum: 477204beaa9be69e642bc31ffe7a8c383d0cf48fa27acbc91c5df01431ab913e65c154213d2ef83d034c98d77280743ec85e5da018a97a18dd43d3c0b78b28cd + languageName: node + linkType: hard + "dependency-tree@npm:^9.0.0": version: 9.0.0 resolution: "dependency-tree@npm:9.0.0" @@ -8661,6 +9573,13 @@ __metadata: languageName: node linkType: hard +"devtools-protocol@npm:0.0.1367902": + version: 0.0.1367902 + resolution: "devtools-protocol@npm:0.0.1367902" + checksum: ef1115f4b287ab033c5342f7ba7fbf45314c3b46db2195978db0096b368ffbb79157a69dc361fa539874a37fea87101267049957285b1ecbaa1a96f6df6cf344 + languageName: node + linkType: hard + "dezalgo@npm:^1.0.4": version: 1.0.4 resolution: "dezalgo@npm:1.0.4" @@ -8685,6 +9604,13 @@ __metadata: languageName: node linkType: hard +"diff@npm:^5.0.0, diff@npm:^5.2.0": + version: 5.2.0 + resolution: "diff@npm:5.2.0" + checksum: 12b63ca9c36c72bafa3effa77121f0581b4015df18bc16bac1f8e263597735649f1a173c26f7eba17fb4162b073fee61788abe49610e6c70a2641fe1895443fd + languageName: node + linkType: hard + "diffie-hellman@npm:^5.0.0": version: 5.0.3 resolution: "diffie-hellman@npm:5.0.3" @@ -9010,6 +9936,13 @@ __metadata: languageName: node linkType: hard +"errorstacks@npm:^2.2.0": + version: 2.4.1 + resolution: "errorstacks@npm:2.4.1" + checksum: 1b46bdd3c40d3e30dbb6945c0529ffbef6ccdf2260eeecff6cc1ee95b708ec732094597d6adaa53ffe18d045150b366e3f7472d8594946f430941bfa4ad54479 + languageName: node + linkType: hard + "es-abstract@npm:^1.22.1, es-abstract@npm:^1.22.3, es-abstract@npm:^1.23.0, es-abstract@npm:^1.23.2": version: 1.23.3 resolution: "es-abstract@npm:1.23.3" @@ -9080,6 +10013,13 @@ __metadata: languageName: node linkType: hard +"es-module-lexer@npm:^1.0.0": + version: 1.5.4 + resolution: "es-module-lexer@npm:1.5.4" + checksum: a0cf04fb92d052647ac7d818d1913b98d3d3d0f5b9d88f0eafb993436e4c3e2c958599db68839d57f2dfa281fdf0f60e18d448eb78fc292c33c0f25635b6854f + languageName: node + linkType: hard + "es-module-lexer@npm:^1.2.1": version: 1.5.2 resolution: "es-module-lexer@npm:1.5.2" @@ -9204,6 +10144,89 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.24.0": + version: 0.24.0 + resolution: "esbuild@npm:0.24.0" + dependencies: + "@esbuild/aix-ppc64": 0.24.0 + "@esbuild/android-arm": 0.24.0 + "@esbuild/android-arm64": 0.24.0 + "@esbuild/android-x64": 0.24.0 + "@esbuild/darwin-arm64": 0.24.0 + "@esbuild/darwin-x64": 0.24.0 + "@esbuild/freebsd-arm64": 0.24.0 + "@esbuild/freebsd-x64": 0.24.0 + "@esbuild/linux-arm": 0.24.0 + "@esbuild/linux-arm64": 0.24.0 + "@esbuild/linux-ia32": 0.24.0 + "@esbuild/linux-loong64": 0.24.0 + "@esbuild/linux-mips64el": 0.24.0 + "@esbuild/linux-ppc64": 0.24.0 + "@esbuild/linux-riscv64": 0.24.0 + "@esbuild/linux-s390x": 0.24.0 + "@esbuild/linux-x64": 0.24.0 + "@esbuild/netbsd-x64": 0.24.0 + "@esbuild/openbsd-arm64": 0.24.0 + "@esbuild/openbsd-x64": 0.24.0 + "@esbuild/sunos-x64": 0.24.0 + "@esbuild/win32-arm64": 0.24.0 + "@esbuild/win32-ia32": 0.24.0 + "@esbuild/win32-x64": 0.24.0 + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: dd386d92a05c7eb03078480522cdd8b40c434777b5f08487c27971d30933ecaae3f08bd221958dd8f9c66214915cdc85f844283ca9bdbf8ee703d889ae526edd + languageName: node + linkType: hard + "escalade@npm:^3.1.1, escalade@npm:^3.1.2": version: 3.1.2 resolution: "escalade@npm:3.1.2" @@ -9519,6 +10542,13 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^2.0.2": + version: 2.0.2 + resolution: "estree-walker@npm:2.0.2" + checksum: 6151e6f9828abe2259e57f5fd3761335bb0d2ebd76dc1a01048ccee22fabcfef3c0859300f6d83ff0d1927849368775ec5a6d265dde2f6de5a1be1721cd94efc + languageName: node + linkType: hard + "esutils@npm:^2.0.2": version: 2.0.3 resolution: "esutils@npm:2.0.3" @@ -9526,7 +10556,7 @@ __metadata: languageName: node linkType: hard -"etag@npm:~1.8.1": +"etag@npm:^1.8.1, etag@npm:~1.8.1": version: 1.8.1 resolution: "etag@npm:1.8.1" checksum: 571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff @@ -10358,10 +11388,23 @@ __metadata: fs.realpath: ^1.0.0 inflight: ^1.0.4 inherits: 2 - minimatch: ^3.1.1 + minimatch: ^3.1.1 + once: ^1.3.0 + path-is-absolute: ^1.0.0 + checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + languageName: node + linkType: hard + +"glob@npm:^8.1.0": + version: 8.1.0 + resolution: "glob@npm:8.1.0" + dependencies: + fs.realpath: ^1.0.0 + inflight: ^1.0.4 + inherits: 2 + minimatch: ^5.0.1 once: ^1.3.0 - path-is-absolute: ^1.0.0 - checksum: 29452e97b38fa704dabb1d1045350fb2467cf0277e155aa9ff7077e90ad81d1ea9d53d3ee63bd37c05b09a065e90f16aec4a65f5b8de401d1dac40bc5605d133 + checksum: 92fbea3221a7d12075f26f0227abac435de868dd0736a17170663783296d0dd8d3d532a5672b4488a439bf5d7fb85cdd07c11185d6cd39184f0385cbdfb86a47 languageName: node linkType: hard @@ -10908,6 +11951,13 @@ __metadata: languageName: node linkType: hard +"idb@npm:^8.0.0": + version: 8.0.0 + resolution: "idb@npm:8.0.0" + checksum: a9c6176c176dc1a73520ae906d33fcda8a6f6068cf64027e196763d4ad70b088b7141650ed68f3604e0f0ccd1a123f6b8a435ba5e4514f42ada3460c23b6747a + languageName: node + linkType: hard + "ieee754@npm:^1.1.13, ieee754@npm:^1.1.4, ieee754@npm:^1.2.1": version: 1.2.1 resolution: "ieee754@npm:1.2.1" @@ -11064,6 +12114,18 @@ __metadata: languageName: node linkType: hard +"internal-ip@npm:^6.2.0": + version: 6.2.0 + resolution: "internal-ip@npm:6.2.0" + dependencies: + default-gateway: ^6.0.0 + ipaddr.js: ^1.9.1 + is-ip: ^3.1.0 + p-event: ^4.2.0 + checksum: 6d08299c052c4ec926fa4e3643049d81daacbc33d3ab90fc30cd59cd7f12902152107bc75778e1202a269eb82cab0c412ff04a78f0361e056de0c5c2628881fa + languageName: node + linkType: hard + "internal-slot@npm:^1.0.7": version: 1.0.7 resolution: "internal-slot@npm:1.0.7" @@ -11099,6 +12161,13 @@ __metadata: languageName: node linkType: hard +"ip-regex@npm:^4.0.0": + version: 4.3.0 + resolution: "ip-regex@npm:4.3.0" + checksum: 7ff904b891221b1847f3fdf3dbb3e6a8660dc39bc283f79eb7ed88f5338e1a3d1104b779bc83759159be266249c59c2160e779ee39446d79d4ed0890dfd06f08 + languageName: node + linkType: hard + "ip-regex@npm:^5.0.0": version: 5.0.0 resolution: "ip-regex@npm:5.0.0" @@ -11106,7 +12175,7 @@ __metadata: languageName: node linkType: hard -"ipaddr.js@npm:1.9.1": +"ipaddr.js@npm:1.9.1, ipaddr.js@npm:^1.9.1": version: 1.9.1 resolution: "ipaddr.js@npm:1.9.1" checksum: f88d3825981486f5a1942414c8d77dd6674dd71c065adcfa46f578d677edcb99fda25af42675cb59db492fdf427b34a5abfcde3982da11a8fd83a500b41cfe77 @@ -11230,7 +12299,7 @@ __metadata: languageName: node linkType: hard -"is-docker@npm:^2.0.0": +"is-docker@npm:^2.0.0, is-docker@npm:^2.1.1": version: 2.2.1 resolution: "is-docker@npm:2.2.1" bin: @@ -11321,6 +12390,15 @@ __metadata: languageName: node linkType: hard +"is-ip@npm:^3.1.0": + version: 3.1.0 + resolution: "is-ip@npm:3.1.0" + dependencies: + ip-regex: ^4.0.0 + checksum: da2c2b282407194adf2320bade0bad94be9c9d0bdab85ff45b1b62d8185f31c65dff3884519d57bf270277e5ea2046c7916a6e5a6db22fe4b7ddcdd3760f23eb + languageName: node + linkType: hard + "is-lambda@npm:^1.0.1": version: 1.0.1 resolution: "is-lambda@npm:1.0.1" @@ -11335,6 +12413,13 @@ __metadata: languageName: node linkType: hard +"is-module@npm:^1.0.0": + version: 1.0.0 + resolution: "is-module@npm:1.0.0" + checksum: 8cd5390730c7976fb4e8546dd0b38865ee6f7bacfa08dfbb2cc07219606755f0b01709d9361e01f13009bbbd8099fa2927a8ed665118a6105d66e40f1b838c3f + languageName: node + linkType: hard + "is-negative-zero@npm:^2.0.3": version: 2.0.3 resolution: "is-negative-zero@npm:2.0.3" @@ -11559,6 +12644,13 @@ __metadata: languageName: node linkType: hard +"isbinaryfile@npm:^5.0.0": + version: 5.0.4 + resolution: "isbinaryfile@npm:5.0.4" + checksum: d88982a889369d83a5937b4b4d2288ed3b3dbbcee8fc74db40058f3c089a2c7beb9e5305b7177e82d87ff38fb62be8d60960f7a2d669ca08240ef31c1435b884 + languageName: node + linkType: hard + "isexe@npm:^2.0.0": version: 2.0.0 resolution: "isexe@npm:2.0.0" @@ -11622,7 +12714,7 @@ __metadata: languageName: node linkType: hard -"istanbul-lib-report@npm:^3.0.0": +"istanbul-lib-report@npm:^3.0.0, istanbul-lib-report@npm:^3.0.1": version: 3.0.1 resolution: "istanbul-lib-report@npm:3.0.1" dependencies: @@ -11644,7 +12736,7 @@ __metadata: languageName: node linkType: hard -"istanbul-reports@npm:^3.1.3": +"istanbul-reports@npm:^3.0.2, istanbul-reports@npm:^3.1.3": version: 3.1.7 resolution: "istanbul-reports@npm:3.1.7" dependencies: @@ -12642,6 +13734,15 @@ __metadata: languageName: node linkType: hard +"koa-etag@npm:^4.0.0": + version: 4.0.0 + resolution: "koa-etag@npm:4.0.0" + dependencies: + etag: ^1.8.1 + checksum: b5f413574e1edbd60fbbd0d31720e66565d51bfcb407d1bc3f48d9dd5b45fa5a9e4f69a60e749fad7397348e90de23e943307578d007a69da30faaae432deaf6 + languageName: node + linkType: hard + "koa-is-json@npm:^1.0.0": version: 1.0.0 resolution: "koa-is-json@npm:1.0.0" @@ -12662,7 +13763,7 @@ __metadata: languageName: node linkType: hard -"koa-send@npm:^5.0.0": +"koa-send@npm:^5.0.0, koa-send@npm:^5.0.1": version: 5.0.1 resolution: "koa-send@npm:5.0.1" dependencies: @@ -12683,7 +13784,7 @@ __metadata: languageName: node linkType: hard -"koa@npm:^2.14.2, koa@npm:^2.15.3": +"koa@npm:^2.13.0, koa@npm:^2.14.2, koa@npm:^2.15.3": version: 2.15.3 resolution: "koa@npm:2.15.3" dependencies: @@ -12842,6 +13943,16 @@ __metadata: languageName: node linkType: hard +"lighthouse-logger@npm:^1.0.0": + version: 1.4.2 + resolution: "lighthouse-logger@npm:1.4.2" + dependencies: + debug: ^2.6.9 + marky: ^1.2.2 + checksum: ba6b73d93424318fab58b4e07c9ed246e3e969a3313f26b69515ed4c06457dd9a0b11bc706948398fdaef26aa4ba5e65cb848c37ce59f470d3c6c450b9b79a33 + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -13026,7 +14137,7 @@ __metadata: languageName: node linkType: hard -"lodash@npm:^4.17.20, lodash@npm:^4.17.21": +"lodash@npm:^4.17.14, lodash@npm:^4.17.20, lodash@npm:^4.17.21": version: 4.17.21 resolution: "lodash@npm:4.17.21" checksum: eb835a2e51d381e561e508ce932ea50a8e5a68f4ebdd771ea240d3048244a8d13658acbd502cd4829768c56f2e16bdd4340b9ea141297d472517b83868e677f7 @@ -13043,6 +14154,18 @@ __metadata: languageName: node linkType: hard +"log-update@npm:^4.0.0": + version: 4.0.0 + resolution: "log-update@npm:4.0.0" + dependencies: + ansi-escapes: ^4.3.0 + cli-cursor: ^3.1.0 + slice-ansi: ^4.0.0 + wrap-ansi: ^6.2.0 + checksum: ae2f85bbabc1906034154fb7d4c4477c79b3e703d22d78adee8b3862fa913942772e7fa11713e3d96fb46de4e3cabefbf5d0a544344f03b58d3c4bff52aa9eb2 + languageName: node + linkType: hard + "long@npm:^5.0.0": version: 5.2.3 resolution: "long@npm:5.2.3" @@ -13050,6 +14173,13 @@ __metadata: languageName: node linkType: hard +"loupe@npm:^3.1.0": + version: 3.1.2 + resolution: "loupe@npm:3.1.2" + checksum: 4a75bbe8877a1ced3603e08b1095cd6f4c987c50fe63719fdc3009029560f91e07a915e7f6eff1322bb62bfb2a2beeef06b13ccb3c12f81bda9f3674434dcab9 + languageName: node + linkType: hard + "lower-case@npm:^1.1.1": version: 1.1.4 resolution: "lower-case@npm:1.1.4" @@ -13098,6 +14228,13 @@ __metadata: languageName: node linkType: hard +"lru-cache@npm:^8.0.4": + version: 8.0.5 + resolution: "lru-cache@npm:8.0.5" + checksum: 87d72196d8f46e8299c4ab576ed2ec8a07e3cbef517dc9874399c0b2470bd9bf62aacec3b67f84ed6d74aaa1ef31636d048edf996f76248fd17db72bfb631609 + languageName: node + linkType: hard + "ltgt@npm:^2.2.0": version: 2.2.1 resolution: "ltgt@npm:2.2.1" @@ -13242,6 +14379,13 @@ __metadata: languageName: node linkType: hard +"marky@npm:^1.2.2": + version: 1.2.5 + resolution: "marky@npm:1.2.5" + checksum: 823b946677749551cdfc3b5221685478b5d1b9cc0dc03eff977c6f9a615fb05c67559f9556cb3c0fcb941a9ea0e195e37befd83026443396ccee8b724f54f4c5 + languageName: node + linkType: hard + "md5.js@npm:^1.3.4": version: 1.3.5 resolution: "md5.js@npm:1.3.5" @@ -13492,6 +14636,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^5.0.1, minimatch@npm:^5.1.6": + version: 5.1.6 + resolution: "minimatch@npm:5.1.6" + dependencies: + brace-expansion: ^2.0.1 + checksum: 7564208ef81d7065a370f788d337cd80a689e981042cb9a1d0e6580b6c6a8c9279eba80010516e258835a988363f99f54a6f711a315089b8b42694f5da9d0d77 + languageName: node + linkType: hard + "minimatch@npm:^9.0.0, minimatch@npm:^9.0.1": version: 9.0.4 resolution: "minimatch@npm:9.0.4" @@ -13617,7 +14770,18 @@ __metadata: languageName: node linkType: hard -"mkdirp@npm:^1.0.3": +"mkdirp@npm:^0.5.6": + version: 0.5.6 + resolution: "mkdirp@npm:0.5.6" + dependencies: + minimist: ^1.2.6 + bin: + mkdirp: bin/cmd.js + checksum: 0c91b721bb12c3f9af4b77ebf73604baf350e64d80df91754dc509491ae93bf238581e59c7188360cec7cb62fc4100959245a42cfe01834efedc5e9d068376c2 + languageName: node + linkType: hard + +"mkdirp@npm:^1.0.3, mkdirp@npm:^1.0.4": version: 1.0.4 resolution: "mkdirp@npm:1.0.4" bin: @@ -13626,6 +14790,46 @@ __metadata: languageName: node linkType: hard +"mocha-each@npm:^2.0.1": + version: 2.0.1 + resolution: "mocha-each@npm:2.0.1" + dependencies: + sprintf-js: ^1.0.3 + checksum: 0de01ce517c2f7e7c3e19ef3f444809913f2f1602cb2571e6a3f8cb7ef3040f4f01b0f9f11a317e4ec1aeb9d39ceae4947c96668560cf638fe4d02ea549c2d4c + languageName: node + linkType: hard + +"mocha@npm:^10.8.2": + version: 10.8.2 + resolution: "mocha@npm:10.8.2" + 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 + checksum: 68cb519503f1e8ffd9b0651e1aef75dfe4754425186756b21e53169da44b5bcb1889e2b743711205082763d3f9a42eb8eb2c13bb1a718a08cb3a5f563bfcacdc + languageName: node + linkType: hard + "module-definition@npm:^3.3.1": version: 3.4.0 resolution: "module-definition@npm:3.4.0" @@ -13855,6 +15059,13 @@ __metadata: languageName: node linkType: hard +"nanocolors@npm:^0.2.1": + version: 0.2.13 + resolution: "nanocolors@npm:0.2.13" + checksum: 01ac5aab77295c66cef83ea5f595e22f5f91518f19fae12f93ca2cba98703f971e32611fea2983f333eb7e60604043005690f61d9759e7c0a32314942fe6ddb8 + languageName: node + linkType: hard + "nanohtml@npm:^1.4.0": version: 1.10.0 resolution: "nanohtml@npm:1.10.0" @@ -13874,6 +15085,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.1.25": + version: 3.3.8 + resolution: "nanoid@npm:3.3.8" + bin: + nanoid: bin/nanoid.cjs + checksum: dfe0adbc0c77e9655b550c333075f51bb28cfc7568afbf3237249904f9c86c9aaaed1f113f0fddddba75673ee31c758c30c43d4414f014a52a7a626efc5958c9 + languageName: node + linkType: hard + "nanoid@npm:^3.3.7": version: 3.3.7 resolution: "nanoid@npm:3.3.7" @@ -14282,6 +15502,17 @@ __metadata: languageName: node linkType: hard +"open@npm:^8.0.2": + version: 8.4.2 + resolution: "open@npm:8.4.2" + dependencies: + define-lazy-prop: ^2.0.0 + is-docker: ^2.1.1 + is-wsl: ^2.2.0 + checksum: 6388bfff21b40cb9bd8f913f9130d107f2ed4724ea81a8fd29798ee322b361ca31fa2cdfb491a5c31e43a3996cfe9566741238c7a741ada8d7af1cb78d85cf26 + languageName: node + linkType: hard + "opn@npm:^5.4.0": version: 5.5.0 resolution: "opn@npm:5.5.0" @@ -14350,6 +15581,15 @@ __metadata: languageName: node linkType: hard +"p-event@npm:^4.2.0": + version: 4.2.0 + resolution: "p-event@npm:4.2.0" + dependencies: + p-timeout: ^3.1.0 + checksum: 8a3588f7a816a20726a3262dfeee70a631e3997e4773d23219176333eda55cce9a76219e3d2b441b331eb746e14fdb381eb2694ab9ff2fcf87c846462696fe89 + languageName: node + linkType: hard + "p-event@npm:^6.0.0": version: 6.0.1 resolution: "p-event@npm:6.0.1" @@ -14359,6 +15599,13 @@ __metadata: languageName: node linkType: hard +"p-finally@npm:^1.0.0": + version: 1.0.0 + resolution: "p-finally@npm:1.0.0" + checksum: 93a654c53dc805dd5b5891bab16eb0ea46db8f66c4bfd99336ae929323b1af2b70a8b0654f8f1eae924b2b73d037031366d645f1fd18b3d30cbd15950cc4b1d4 + languageName: node + linkType: hard + "p-limit@npm:^2.2.0": version: 2.3.0 resolution: "p-limit@npm:2.3.0" @@ -14435,6 +15682,15 @@ __metadata: languageName: node linkType: hard +"p-timeout@npm:^3.1.0": + version: 3.2.0 + resolution: "p-timeout@npm:3.2.0" + dependencies: + p-finally: ^1.0.0 + checksum: 3dd0eaa048780a6f23e5855df3dd45c7beacff1f820476c1d0d1bcd6648e3298752ba2c877aa1c92f6453c7dd23faaf13d9f5149fc14c0598a142e2c5e8d649c + languageName: node + linkType: hard + "p-timeout@npm:^5.0.2": version: 5.1.0 resolution: "p-timeout@npm:5.1.0" @@ -14557,6 +15813,13 @@ __metadata: languageName: node linkType: hard +"parse5@npm:^6.0.1": + version: 6.0.1 + resolution: "parse5@npm:6.0.1" + checksum: 7d569a176c5460897f7c8f3377eff640d54132b9be51ae8a8fa4979af940830b2b0c296ce75e5bd8f4041520aadde13170dbdec44889975f906098ea0002f4bd + languageName: node + linkType: hard + "parseurl@npm:^1.3.2, parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -14675,6 +15938,13 @@ __metadata: languageName: node linkType: hard +"pathval@npm:^2.0.0": + version: 2.0.0 + resolution: "pathval@npm:2.0.0" + checksum: 682b6a6289de7990909effef7dae9aa7bb6218c0426727bccf66a35b34e7bfbc65615270c5e44e3c9557a5cb44b1b9ef47fc3cb18bce6ad3ba92bcd28467ed7d + languageName: node + linkType: hard + "pause-stream@npm:0.0.11": version: 0.0.11 resolution: "pause-stream@npm:0.0.11" @@ -14718,13 +15988,20 @@ __metadata: languageName: node linkType: hard -"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.2.3, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 050c865ce81119c4822c45d3c84f1ced46f93a0126febae20737bd05ca20589c564d6e9226977df859ed5e03dc73f02584a2b0faad36e896936238238b0446cf languageName: node linkType: hard +"picomatch@npm:^4.0.2": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: a7a5188c954f82c6585720e9143297ccd0e35ad8072231608086ca950bee672d51b0ef676254af0788205e59bd4e4deb4e7708769226bed725bf13370a7d1464 + languageName: node + linkType: hard + "pino-abstract-transport@npm:^2.0.0": version: 2.0.0 resolution: "pino-abstract-transport@npm:2.0.0" @@ -14810,6 +16087,15 @@ __metadata: languageName: node linkType: hard +"playwright-core@npm:1.49.0": + version: 1.49.0 + resolution: "playwright-core@npm:1.49.0" + bin: + playwright-core: cli.js + checksum: d8423ad0cab2e672856529bf6b98b406e7e605da098b847b9b54ee8ebd8d716ed8880a9afff4b38f0a2e3f59b95661c74589116ce3ff2b5e0ae3561507086c94 + languageName: node + linkType: hard + "playwright@npm:1.48.2, playwright@npm:^1.48.2": version: 1.48.2 resolution: "playwright@npm:1.48.2" @@ -14825,6 +16111,21 @@ __metadata: languageName: node linkType: hard +"playwright@npm:^1.22.2": + version: 1.49.0 + resolution: "playwright@npm:1.49.0" + dependencies: + fsevents: 2.3.2 + playwright-core: 1.49.0 + dependenciesMeta: + fsevents: + optional: true + bin: + playwright: cli.js + checksum: f1bfb2fff65cad2ce996edab74ec231dfd21aeb5961554b765ce1eaec27efb87eaba37b00e91ecd27727b82861e5d8c230abe4960e93f6ada8be5ad1020df306 + languageName: node + linkType: hard + "pluralize@npm:^8.0.0": version: 8.0.0 resolution: "pluralize@npm:8.0.0" @@ -14832,6 +16133,17 @@ __metadata: languageName: node linkType: hard +"portfinder@npm:^1.0.32": + version: 1.0.32 + resolution: "portfinder@npm:1.0.32" + dependencies: + async: ^2.6.4 + debug: ^3.2.7 + mkdirp: ^0.5.6 + checksum: 116b4aed1b9e16f6d5503823d966d9ffd41b1c2339e27f54c06cd2f3015a9d8ef53e2a53b57bc0a25af0885977b692007353aa28f9a0a98a44335cb50487240d + languageName: node + linkType: hard + "possible-typed-array-names@npm:^1.0.0": version: 1.0.0 resolution: "possible-typed-array-names@npm:1.0.0" @@ -15180,7 +16492,7 @@ __metadata: languageName: node linkType: hard -"punycode@npm:^2.1.0": +"punycode@npm:^2.1.0, punycode@npm:^2.3.1": version: 2.3.1 resolution: "punycode@npm:2.3.1" checksum: bb0a0ceedca4c3c57a9b981b90601579058903c62be23c5e8e843d2c2d4148a3ecf029d5133486fb0e1822b098ba8bba09e89d6b21742d02fa26bda6441a6fb2 @@ -15213,6 +16525,20 @@ __metadata: languageName: node linkType: hard +"puppeteer-core@npm:^23.2.0": + version: 23.9.0 + resolution: "puppeteer-core@npm:23.9.0" + dependencies: + "@puppeteer/browsers": 2.4.1 + chromium-bidi: 0.8.0 + debug: ^4.3.7 + devtools-protocol: 0.0.1367902 + typed-query-selector: ^2.12.0 + ws: ^8.18.0 + checksum: 0195e3422eee84d0645e8b5f2bcd33a304cb54378bf6a5c9f2a020a59c1435e502987fdbe2766864b7cddb1732d8a27524023c75fbba83c8d2ed9b5209bb931b + languageName: node + linkType: hard + "puppeteer@npm:^22.2": version: 22.8.0 resolution: "puppeteer@npm:22.8.0" @@ -15462,6 +16788,13 @@ __metadata: languageName: node linkType: hard +"readdirp@npm:^4.0.1": + version: 4.0.2 + resolution: "readdirp@npm:4.0.2" + checksum: 309376e717f94fb7eb61bec21e2603243a9e2420cd2e9bf94ddf026aefea0d7377ed1a62f016d33265682e44908049a55c3cfc2307450a1421654ea008489b39 + languageName: node + linkType: hard + "readdirp@npm:~3.6.0": version: 3.6.0 resolution: "readdirp@npm:3.6.0" @@ -15684,7 +17017,7 @@ __metadata: languageName: node linkType: hard -"resolve@npm:^1.1.4, resolve@npm:^1.10.0, resolve@npm:^1.17.0, resolve@npm:^1.20.0, resolve@npm:^1.21.0, resolve@npm:^1.22.4, resolve@npm:^1.4.0": +"resolve@npm:^1.1.4, resolve@npm:^1.10.0, resolve@npm:^1.17.0, resolve@npm:^1.20.0, resolve@npm:^1.21.0, resolve@npm:^1.22.1, resolve@npm:^1.22.4, resolve@npm:^1.4.0": version: 1.22.8 resolution: "resolve@npm:1.22.8" dependencies: @@ -15707,7 +17040,7 @@ __metadata: languageName: node linkType: hard -"resolve@patch:resolve@^1.1.4#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.21.0#~builtin, resolve@patch:resolve@^1.22.4#~builtin, resolve@patch:resolve@^1.4.0#~builtin": +"resolve@patch:resolve@^1.1.4#~builtin, resolve@patch:resolve@^1.10.0#~builtin, resolve@patch:resolve@^1.17.0#~builtin, resolve@patch:resolve@^1.20.0#~builtin, resolve@patch:resolve@^1.21.0#~builtin, resolve@patch:resolve@^1.22.1#~builtin, resolve@patch:resolve@^1.22.4#~builtin, resolve@patch:resolve@^1.4.0#~builtin": version: 1.22.8 resolution: "resolve@patch:resolve@npm%3A1.22.8#~builtin::version=1.22.8&hash=c3c19d" dependencies: @@ -15807,6 +17140,75 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.4.0": + version: 4.27.4 + resolution: "rollup@npm:4.27.4" + dependencies: + "@rollup/rollup-android-arm-eabi": 4.27.4 + "@rollup/rollup-android-arm64": 4.27.4 + "@rollup/rollup-darwin-arm64": 4.27.4 + "@rollup/rollup-darwin-x64": 4.27.4 + "@rollup/rollup-freebsd-arm64": 4.27.4 + "@rollup/rollup-freebsd-x64": 4.27.4 + "@rollup/rollup-linux-arm-gnueabihf": 4.27.4 + "@rollup/rollup-linux-arm-musleabihf": 4.27.4 + "@rollup/rollup-linux-arm64-gnu": 4.27.4 + "@rollup/rollup-linux-arm64-musl": 4.27.4 + "@rollup/rollup-linux-powerpc64le-gnu": 4.27.4 + "@rollup/rollup-linux-riscv64-gnu": 4.27.4 + "@rollup/rollup-linux-s390x-gnu": 4.27.4 + "@rollup/rollup-linux-x64-gnu": 4.27.4 + "@rollup/rollup-linux-x64-musl": 4.27.4 + "@rollup/rollup-win32-arm64-msvc": 4.27.4 + "@rollup/rollup-win32-ia32-msvc": 4.27.4 + "@rollup/rollup-win32-x64-msvc": 4.27.4 + "@types/estree": 1.0.6 + fsevents: ~2.3.2 + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 7268678ce9a645fda79efa2dc3c9b458357683b0bbd8cc44f8e52d406df4d40468ea3efdf24ad01e25210594cd40902b2b3d20730e2d58e9b226cb3c48dcbd8b + languageName: node + linkType: hard + "run-applescript@npm:^7.0.0": version: 7.0.0 resolution: "run-applescript@npm:7.0.0" @@ -16293,6 +17695,17 @@ __metadata: languageName: node linkType: hard +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: ^4.0.0 + astral-regex: ^2.0.0 + is-fullwidth-code-point: ^3.0.0 + checksum: 4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 + languageName: node + linkType: hard + "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -16447,7 +17860,7 @@ __metadata: languageName: node linkType: hard -"source-map@npm:^0.7.4": +"source-map@npm:^0.7.3, source-map@npm:^0.7.4": version: 0.7.4 resolution: "source-map@npm:0.7.4" checksum: 01cc5a74b1f0e1d626a58d36ad6898ea820567e87f18dfc9d24a9843a351aaa2ec09b87422589906d6ff1deed29693e176194dc88bcae7c9a852dc74b311dbf5 @@ -16545,7 +17958,7 @@ __metadata: languageName: node linkType: hard -"sprintf-js@npm:^1.1.3": +"sprintf-js@npm:^1.0.3, sprintf-js@npm:^1.1.3": version: 1.1.3 resolution: "sprintf-js@npm:1.1.3" checksum: a3fdac7b49643875b70864a9d9b469d87a40dfeaf5d34d9d0c5b1cda5fd7d065531fcb43c76357d62254c57184a7b151954156563a4d6a747015cfb41021cad0 @@ -17007,6 +18420,16 @@ __metadata: languageName: node linkType: hard +"table-layout@npm:^4.1.0": + version: 4.1.1 + resolution: "table-layout@npm:4.1.1" + dependencies: + array-back: ^6.2.2 + wordwrapjs: ^5.1.0 + checksum: 6de52785440b3b2ca9522a06b9ce20f81a3a999c15ef7e5d10c38a2e0008b286bf145e7f88b00f0346e874a548a922906107c492d6da5d438332e7c1bb62307a + languageName: node + linkType: hard + "tachyons@npm:^4.9.1": version: 4.12.0 resolution: "tachyons@npm:4.12.0" @@ -17266,6 +18689,15 @@ __metadata: languageName: node linkType: hard +"tr46@npm:^5.0.0": + version: 5.0.0 + resolution: "tr46@npm:5.0.0" + dependencies: + punycode: ^2.3.1 + checksum: 8d8b021f8e17675ebf9e672c224b6b6cfdb0d5b92141349e9665c14a2501c54a298d11264bbb0b17b447581e1e83d4fc3c038c929f3d210e3964d4be47460288 + languageName: node + linkType: hard + "transform-ast@npm:^2.4.0": version: 2.4.4 resolution: "transform-ast@npm:2.4.4" @@ -17658,6 +19090,13 @@ __metadata: languageName: node linkType: hard +"typed-query-selector@npm:^2.12.0": + version: 2.12.0 + resolution: "typed-query-selector@npm:2.12.0" + checksum: c4652f2eec16112d69e0da30c2effab3f03d1710f9559da1e1209bbfc9a20990d5de4ba97890c11f9d17d85c8ae3310953a86c198166599d4c36abc63664f169 + languageName: node + linkType: hard + "typedarray@npm:^0.0.6": version: 0.0.6 resolution: "typedarray@npm:0.0.6" @@ -17755,6 +19194,22 @@ __metadata: languageName: node linkType: hard +"typical@npm:^7.1.1": + version: 7.3.0 + resolution: "typical@npm:7.3.0" + checksum: edbb9beed7ffb355806d434d1dd0d41a2b78be0a41d9f1684fabbd4fb512ee220989b5ff91b04c79d19b850d6025d6c07417d63b8e7c9a3b2229a4a0676e17da + languageName: node + linkType: hard + +"ua-parser-js@npm:^1.0.33": + version: 1.0.39 + resolution: "ua-parser-js@npm:1.0.39" + bin: + ua-parser-js: script/cli.js + checksum: 19455df8c2348ef53f2e150e7406d3a025a619c2fd69722a1e63363d5ba8d91731ef7585f2dce7d8f14c8782734b4d704c05f246dca5f7565b5ae7d318084f2a + languageName: node + linkType: hard + "uint8-varint@npm:^2.0.0, uint8-varint@npm:^2.0.1, uint8-varint@npm:^2.0.2, uint8-varint@npm:^2.0.4": version: 2.0.4 resolution: "uint8-varint@npm:2.0.4" @@ -18210,6 +19665,13 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: f05588567a2a76428515333eff87200fae6c83c3948a7482ebb109562971e77ef6dc49749afa58abb993391227c5697b3ecca52018793e0cb4620a48f10bd21b + languageName: node + linkType: hard + "webpack-cli@npm:^5.1.4": version: 5.1.4 resolution: "webpack-cli@npm:5.1.4" @@ -18415,6 +19877,16 @@ __metadata: languageName: node linkType: hard +"whatwg-url@npm:^14.0.0": + version: 14.0.0 + resolution: "whatwg-url@npm:14.0.0" + dependencies: + tr46: ^5.0.0 + webidl-conversions: ^7.0.0 + checksum: 4b5887e50f786583bead70916413e67a381d2126899b9eb5c67ce664bba1e7ec07cdff791404581ce73c6190d83c359c9ca1d50711631217905db3877dec075c + languageName: node + linkType: hard + "wherearewe@npm:^2.0.1": version: 2.0.1 resolution: "wherearewe@npm:2.0.1" @@ -18505,6 +19977,20 @@ __metadata: languageName: node linkType: hard +"wordwrapjs@npm:^5.1.0": + version: 5.1.0 + resolution: "wordwrapjs@npm:5.1.0" + checksum: 063c7a5a85b694be1a5fd96f7ae0c0f4d717a087909e5c70cf25edec6eb5df5f2f5561f23e939cf6d7514cf81902610f74f288ef1612a49bf5451de15e0e29db + languageName: node + linkType: hard + +"workerpool@npm:^6.5.1": + version: 6.5.1 + resolution: "workerpool@npm:6.5.1" + checksum: f86d13f9139c3a57c5a5867e81905cd84134b499849405dec2ffe5b1acd30dabaa1809f6f6ee603a7c65e1e4325f21509db6b8398eaf202c8b8f5809e26a2e16 + languageName: node + linkType: hard + "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0, wrap-ansi@npm:^7.0.0": version: 7.0.0 resolution: "wrap-ansi@npm:7.0.0" @@ -18585,6 +20071,21 @@ __metadata: languageName: node linkType: hard +"ws@npm:^7.5.10": + version: 7.5.10 + resolution: "ws@npm:7.5.10" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: f9bb062abf54cc8f02d94ca86dcd349c3945d63851f5d07a3a61c2fcb755b15a88e943a63cf580cbdb5b74436d67ef6b67f745b8f7c0814e411379138e1863cb + languageName: node + linkType: hard + "ws@npm:^8.18.0": version: 8.18.0 resolution: "ws@npm:8.18.0" @@ -18654,6 +20155,13 @@ __metadata: languageName: node linkType: hard +"yargs-parser@npm:^20.2.2, yargs-parser@npm:^20.2.9": + version: 20.2.9 + resolution: "yargs-parser@npm:20.2.9" + checksum: 8bb69015f2b0ff9e17b2c8e6bfe224ab463dd00ca211eece72a4cd8a906224d2703fb8a326d36fdd0e68701e201b2a60ed7cf81ce0fd9b3799f9fe7745977ae3 + languageName: node + linkType: hard + "yargs-parser@npm:^21.0.1, yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" @@ -18661,6 +20169,18 @@ __metadata: languageName: node linkType: hard +"yargs-unparser@npm:^2.0.0": + version: 2.0.0 + resolution: "yargs-unparser@npm:2.0.0" + dependencies: + camelcase: ^6.0.0 + decamelize: ^4.0.0 + flat: ^5.0.2 + is-plain-obj: ^2.1.0 + checksum: 68f9a542c6927c3768c2f16c28f71b19008710abd6b8f8efbac6dcce26bbb68ab6503bed1d5994bdbc2df9a5c87c161110c1dfe04c6a3fe5c6ad1b0e15d9a8a3 + languageName: node + linkType: hard + "yargs@npm:17.7.2, yargs@npm:^17.3.1, yargs@npm:^17.7.2": version: 17.7.2 resolution: "yargs@npm:17.7.2" @@ -18676,6 +20196,21 @@ __metadata: languageName: node linkType: hard +"yargs@npm:^16.2.0": + version: 16.2.0 + resolution: "yargs@npm:16.2.0" + dependencies: + cliui: ^7.0.2 + escalade: ^3.1.1 + get-caller-file: ^2.0.5 + require-directory: ^2.1.1 + string-width: ^4.2.0 + y18n: ^5.0.5 + yargs-parser: ^20.2.2 + checksum: b14afbb51e3251a204d81937c86a7e9d4bdbf9a2bcee38226c900d00f522969ab675703bee2a6f99f8e20103f608382936034e64d921b74df82b63c07c5e8f59 + languageName: node + linkType: hard + "yauzl@npm:^2.10.0": version: 2.10.0 resolution: "yauzl@npm:2.10.0"