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/barretenberg/cpp/src/barretenberg/commitment_schemes/commitment_key.hpp b/barretenberg/cpp/src/barretenberg/commitment_schemes/commitment_key.hpp index 6440c016a62..81ef54a2b9d 100644 --- a/barretenberg/cpp/src/barretenberg/commitment_schemes/commitment_key.hpp +++ b/barretenberg/cpp/src/barretenberg/commitment_schemes/commitment_key.hpp @@ -85,7 +85,7 @@ template class CommitmentKey { */ Commitment commit(PolynomialSpan polynomial) { - PROFILE_THIS(); + PROFILE_THIS_NAME("commit"); // We must have a power-of-2 SRS points *after* subtracting by start_index. size_t dyadic_poly_size = numeric::round_up_power_2(polynomial.size()); // Because pippenger prefers a power-of-2 size, we must choose a starting index for the points so that we don't @@ -133,7 +133,7 @@ template class CommitmentKey { */ Commitment commit_sparse(PolynomialSpan polynomial) { - PROFILE_THIS(); + PROFILE_THIS_NAME("commit_sparse"); const size_t poly_size = polynomial.size(); ASSERT(polynomial.end_index() <= srs->get_monomial_size()); @@ -204,21 +204,24 @@ template class CommitmentKey { * @return Commitment */ Commitment commit_structured(PolynomialSpan polynomial, - const std::vector>& active_ranges) + const std::vector>& active_ranges, + size_t final_active_wire_idx = 0) { - BB_OP_COUNT_TIME(); + PROFILE_THIS_NAME("commit_structured"); ASSERT(polynomial.end_index() <= srs->get_monomial_size()); // Percentage of nonzero coefficients beyond which we resort to the conventional commit method constexpr size_t NONZERO_THRESHOLD = 75; + // Compute the number of non-zero coefficients in the polynomial size_t total_num_scalars = 0; - for (const auto& range : active_ranges) { - total_num_scalars += range.second - range.first; + for (const auto& [first, second] : active_ranges) { + total_num_scalars += second - first; } // Compute "active" percentage of polynomial; resort to standard commit if appropriate - size_t percentage_nonzero = total_num_scalars * 100 / polynomial.size(); + size_t polynomial_size = final_active_wire_idx != 0 ? final_active_wire_idx : polynomial.size(); + size_t percentage_nonzero = total_num_scalars * 100 / polynomial_size; if (percentage_nonzero > NONZERO_THRESHOLD) { return commit(polynomial); } @@ -259,9 +262,10 @@ template class CommitmentKey { * @return Commitment */ Commitment commit_structured_with_nonzero_complement(PolynomialSpan polynomial, - const std::vector>& active_ranges) + const std::vector>& active_ranges, + size_t final_active_wire_idx = 0) { - BB_OP_COUNT_TIME(); + PROFILE_THIS_NAME("commit_structured_with_nonzero_complement"); ASSERT(polynomial.end_index() <= srs->get_monomial_size()); using BatchedAddition = BatchedAffineAddition; @@ -273,20 +277,21 @@ template class CommitmentKey { // Note: the range from the end of the last active range to the end of the polynomial is excluded from the // complement since the polynomial is assumed to be zero there. std::vector> active_ranges_complement; + // Also compute total number of scalars in the constant regions + size_t total_num_complement_scalars = 0; for (size_t i = 0; i < active_ranges.size() - 1; ++i) { const size_t start = active_ranges[i].second; const size_t end = active_ranges[i + 1].first; - active_ranges_complement.emplace_back(start, end); - } - - // Compute the total number of scalars in the constant regions - size_t total_num_complement_scalars = 0; - for (const auto& range : active_ranges_complement) { - total_num_complement_scalars += range.second - range.first; + if (end > start) { + active_ranges_complement.emplace_back(start, end); + total_num_complement_scalars += end - start; + } } + size_t polynomial_size = final_active_wire_idx != 0 ? final_active_wire_idx : polynomial.size(); // Compute percentage of polynomial comprised of constant blocks; resort to standard commit if appropriate - size_t percentage_constant = total_num_complement_scalars * 100 / polynomial.size(); + size_t percentage_constant = total_num_complement_scalars * 100 / polynomial_size; + if (percentage_constant < CONSTANT_THRESHOLD) { return commit(polynomial); } @@ -299,12 +304,11 @@ template class CommitmentKey { // TODO(https://github.com/AztecProtocol/barretenberg/issues/1131): Peak memory usage could be improved by // performing this copy and the subsequent summation as a precomputation prior to constructing the point table. std::vector points; - points.reserve(2 * total_num_complement_scalars); - for (const auto& range : active_ranges_complement) { - const size_t start = 2 * range.first; - const size_t end = 2 * range.second; - for (size_t i = start; i < end; i += 2) { - points.emplace_back(point_table[i]); + + points.reserve(total_num_complement_scalars); + for (const auto& [start, end] : active_ranges_complement) { + for (size_t i = start; i < end; i++) { + points.emplace_back(point_table[2 * i]); } } @@ -313,17 +317,16 @@ template class CommitmentKey { std::vector unique_scalars; std::vector sequence_counts; for (const auto& range : active_ranges_complement) { - if (range.second - range.first > 0) { // only ranges with nonzero length - unique_scalars.emplace_back(polynomial.span[range.first]); - sequence_counts.emplace_back(range.second - range.first); - } + unique_scalars.emplace_back(polynomial.span[range.first]); + sequence_counts.emplace_back(range.second - range.first); } // Reduce each sequence to a single point auto reduced_points = BatchedAddition::add_in_place(points, sequence_counts); // Compute the full commitment as the sum of the "active" region commitment and the constant region contribution - Commitment result = commit_structured(polynomial, active_ranges); + Commitment result = commit_structured(polynomial, active_ranges, final_active_wire_idx); + for (auto [scalar, point] : zip_view(unique_scalars, reduced_points)) { result = result + point * scalar; } diff --git a/barretenberg/cpp/src/barretenberg/ecc/batched_affine_addition/batched_affine_addition.cpp b/barretenberg/cpp/src/barretenberg/ecc/batched_affine_addition/batched_affine_addition.cpp index 447e6039c55..058bce37738 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/batched_affine_addition/batched_affine_addition.cpp +++ b/barretenberg/cpp/src/barretenberg/ecc/batched_affine_addition/batched_affine_addition.cpp @@ -10,6 +10,7 @@ template std::vector::G1> BatchedAffineAddition::add_in_place( const std::span& points, const std::vector& sequence_counts) { + PROFILE_THIS_NAME("BatchedAffineAddition::add_in_place"); // Instantiate scratch space for point addition denominators and their calculation std::vector scratch_space_vector(points.size()); std::span scratch_space(scratch_space_vector); diff --git a/barretenberg/cpp/src/barretenberg/ecc/fields/field_impl.hpp b/barretenberg/cpp/src/barretenberg/ecc/fields/field_impl.hpp index 0ed0c481dec..5a747150eb1 100644 --- a/barretenberg/cpp/src/barretenberg/ecc/fields/field_impl.hpp +++ b/barretenberg/cpp/src/barretenberg/ecc/fields/field_impl.hpp @@ -404,9 +404,10 @@ template void field::batch_invert(field* coeffs, const size_t n) no batch_invert(std::span{ coeffs, n }); } +// TODO(https://github.com/AztecProtocol/barretenberg/issues/1166) template void field::batch_invert(std::span coeffs) noexcept { - BB_OP_COUNT_TRACK_NAME("fr::batch_invert"); + PROFILE_THIS_NAME("fr::batch_invert"); const size_t n = coeffs.size(); auto temporaries_ptr = std::static_pointer_cast(get_mem_slab(n * sizeof(field))); diff --git a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp index b9230e4675a..e6fe7ef2aa3 100644 --- a/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/flavor/flavor.hpp @@ -123,7 +123,7 @@ template class ProvingKey_ { // folded element by element. std::vector public_inputs; - // Ranges of the form [start, end) over which the execution trace is "active" + // Ranges of the form [start, end) where witnesses have non-zero values (hence the execution trace is "active") std::vector> active_block_ranges; ProvingKey_() = default; diff --git a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/execution_trace/execution_trace_usage_tracker.hpp b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/execution_trace/execution_trace_usage_tracker.hpp index 683a20a3d63..91837b267dd 100644 --- a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/execution_trace/execution_trace_usage_tracker.hpp +++ b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/execution_trace/execution_trace_usage_tracker.hpp @@ -22,6 +22,7 @@ struct ExecutionTraceUsageTracker { MegaTraceFixedBlockSizes fixed_sizes; // fixed size of each block prescribed by structuring // Store active ranges based on the most current accumulator and those based on all but the most recently // accumulated circuit. The former is needed for the combiner calculation and the latter for the perturbator. + // The ranges cover all areas in the trace where relations have nontrivial values. std::vector active_ranges; std::vector previous_active_ranges; diff --git a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/library/grand_product_library.hpp b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/library/grand_product_library.hpp index 58b1d35630a..ee7eeb3c437 100644 --- a/barretenberg/cpp/src/barretenberg/plonk_honk_shared/library/grand_product_library.hpp +++ b/barretenberg/cpp/src/barretenberg/plonk_honk_shared/library/grand_product_library.hpp @@ -56,8 +56,11 @@ namespace bb { template void compute_grand_product(typename Flavor::ProverPolynomials& full_polynomials, bb::RelationParameters& relation_parameters, - size_t size_override = 0) + size_t size_override = 0, + std::vector> active_block_ranges = {}) { + PROFILE_THIS_NAME("compute_grand_product"); + using FF = typename Flavor::FF; using Polynomial = typename Flavor::Polynomial; using Accumulator = std::tuple_element_t<0, typename GrandProdRelation::SumcheckArrayOfValuesOverSubrelations>; @@ -84,22 +87,34 @@ void compute_grand_product(typename Flavor::ProverPolynomials& full_polynomials, Polynomial numerator{ domain_size, domain_size }; Polynomial denominator{ domain_size, domain_size }; + auto check_is_active = [&](size_t idx) { + if (active_block_ranges.empty()) { + return true; + } + return std::any_of(active_block_ranges.begin(), active_block_ranges.end(), [idx](const auto& range) { + return idx >= range.first && idx < range.second; + }); + }; + // Step (1) // Populate `numerator` and `denominator` with the algebra described by Relation + FF gamma_fourth = relation_parameters.gamma.pow(4); parallel_for(num_threads, [&](size_t thread_idx) { - typename Flavor::AllValues evaluations; - // TODO(https://github.com/AztecProtocol/barretenberg/issues/940): construction of evaluations is equivalent to - // calling get_row which creates full copies. avoid? + typename Flavor::AllValues row; const size_t start = idx_bounds[thread_idx].first; const size_t end = idx_bounds[thread_idx].second; for (size_t i = start; i < end; ++i) { - for (auto [eval, full_poly] : zip_view(evaluations.get_all(), full_polynomials.get_all())) { - eval = full_poly.size() > i ? full_poly[i] : 0; + if (check_is_active(i)) { + // TODO(https://github.com/AztecProtocol/barretenberg/issues/940):consider avoiding get_row if possible. + row = full_polynomials.get_row(i); + numerator.at(i) = + GrandProdRelation::template compute_grand_product_numerator(row, relation_parameters); + denominator.at(i) = GrandProdRelation::template compute_grand_product_denominator( + row, relation_parameters); + } else { + numerator.at(i) = gamma_fourth; + denominator.at(i) = gamma_fourth; } - numerator.at(i) = GrandProdRelation::template compute_grand_product_numerator( - evaluations, relation_parameters); - denominator.at(i) = GrandProdRelation::template compute_grand_product_denominator( - evaluations, relation_parameters); } }); @@ -163,6 +178,7 @@ void compute_grand_product(typename Flavor::ProverPolynomials& full_polynomials, auto& grand_product_polynomial = GrandProdRelation::get_grand_product_polynomial(full_polynomials); // We have a 'virtual' 0 at the start (as this is a to-be-shifted polynomial) ASSERT(grand_product_polynomial.start_index() == 1); + parallel_for(num_threads, [&](size_t thread_idx) { const size_t start = idx_bounds[thread_idx].first; const size_t end = idx_bounds[thread_idx].second; diff --git a/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp b/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp index 3b00b5bff69..d51062f991f 100644 --- a/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp +++ b/barretenberg/cpp/src/barretenberg/relations/databus_lookup_relation.hpp @@ -231,6 +231,7 @@ template class DatabusLookupRelationImpl { auto& relation_parameters, const size_t circuit_size) { + PROFILE_THIS_NAME("Databus::compute_logderivative_inverse"); auto& inverse_polynomial = BusData::inverses(polynomials); size_t min_iterations_per_thread = 1 << 6; // min number of iterations for which we'll spin up a unique thread diff --git a/barretenberg/cpp/src/barretenberg/relations/logderiv_lookup_relation.hpp b/barretenberg/cpp/src/barretenberg/relations/logderiv_lookup_relation.hpp index 686b751903c..dbd45cc2ed5 100644 --- a/barretenberg/cpp/src/barretenberg/relations/logderiv_lookup_relation.hpp +++ b/barretenberg/cpp/src/barretenberg/relations/logderiv_lookup_relation.hpp @@ -156,6 +156,7 @@ template class LogDerivLookupRelationImpl { auto& relation_parameters, const size_t circuit_size) { + PROFILE_THIS_NAME("Lookup::compute_logderivative_inverse"); auto& inverse_polynomial = get_inverse_polynomial(polynomials); size_t min_iterations_per_thread = 1 << 6; // min number of iterations for which we'll spin up a unique thread diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp index f4129c363a3..24919feb257 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/mega_flavor.hpp @@ -492,6 +492,8 @@ class MegaFlavor { */ void compute_logderivative_inverses(const RelationParameters& relation_parameters) { + PROFILE_THIS_NAME("compute_logderivative_inverses"); + // Compute inverses for conventional lookups LogDerivLookupRelation::compute_logderivative_inverse( this->polynomials, relation_parameters, this->circuit_size); @@ -525,7 +527,7 @@ class MegaFlavor { // Compute permutation grand product polynomial compute_grand_product>( - this->polynomials, relation_parameters, size_override); + this->polynomials, relation_parameters, size_override, this->active_block_ranges); } uint64_t estimate_memory() diff --git a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_flavor.hpp b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_flavor.hpp index 6ff45fb338d..f34d0b48733 100644 --- a/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_flavor.hpp +++ b/barretenberg/cpp/src/barretenberg/stdlib_circuit_builders/ultra_flavor.hpp @@ -328,7 +328,7 @@ class UltraFlavor { [[nodiscard]] size_t get_polynomial_size() const { return q_c.size(); } [[nodiscard]] AllValues get_row(const size_t row_idx) const { - PROFILE_THIS(); + PROFILE_THIS_NAME("UltraFlavor::get_row"); AllValues result; for (auto [result_field, polynomial] : zip_view(result.get_all(), get_all())) { result_field = polynomial[row_idx]; diff --git a/barretenberg/cpp/src/barretenberg/trace_to_polynomials/trace_to_polynomials.cpp b/barretenberg/cpp/src/barretenberg/trace_to_polynomials/trace_to_polynomials.cpp index 549d42564fd..39eccd6ef01 100644 --- a/barretenberg/cpp/src/barretenberg/trace_to_polynomials/trace_to_polynomials.cpp +++ b/barretenberg/cpp/src/barretenberg/trace_to_polynomials/trace_to_polynomials.cpp @@ -150,6 +150,7 @@ typename TraceToPolynomials::TraceData TraceToPolynomials::const // otherwise, the next block starts immediately following the previous one offset += block.get_fixed_size(is_structured); } + return trace_data; } diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp index c19a43f8f98..7377c7b31c7 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.cpp @@ -235,6 +235,7 @@ template void OinkProver::execute_grand_product_c { PROFILE_THIS_NAME("OinkProver::execute_grand_product_computation_round"); // Compute the permutation grand product polynomial + proving_key->proving_key.compute_grand_product_polynomial(proving_key->relation_parameters, proving_key->final_active_wire_idx + 1); @@ -243,7 +244,9 @@ template void OinkProver::execute_grand_product_c if (proving_key->get_is_structured()) { witness_commitments.z_perm = proving_key->proving_key.commitment_key->commit_structured_with_nonzero_complement( - proving_key->proving_key.polynomials.z_perm, proving_key->proving_key.active_block_ranges); + proving_key->proving_key.polynomials.z_perm, + proving_key->proving_key.active_block_ranges, + proving_key->final_active_wire_idx + 1); } else { witness_commitments.z_perm = proving_key->proving_key.commitment_key->commit(proving_key->proving_key.polynomials.z_perm); diff --git a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp index 8ab9fed7aa1..e6db742510b 100644 --- a/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp +++ b/barretenberg/cpp/src/barretenberg/ultra_honk/oink_prover.hpp @@ -19,6 +19,7 @@ // clang-format on #include +#include "barretenberg/plonk_honk_shared/execution_trace/execution_trace_usage_tracker.hpp" #include "barretenberg/ultra_honk/decider_proving_key.hpp" namespace bb { @@ -40,16 +41,20 @@ template class OinkProver { std::shared_ptr proving_key; std::shared_ptr transcript; std::string domain_separator; + ExecutionTraceUsageTracker trace_usage_tracker; + typename Flavor::WitnessCommitments witness_commitments; typename Flavor::CommitmentLabels commitment_labels; using RelationSeparator = typename Flavor::RelationSeparator; OinkProver(std::shared_ptr proving_key, const std::shared_ptr& transcript = std::make_shared(), - std::string domain_separator = "") + std::string domain_separator = "", + const ExecutionTraceUsageTracker& trace_usage_tracker = ExecutionTraceUsageTracker{}) : proving_key(proving_key) , transcript(transcript) , domain_separator(std::move(domain_separator)) + , trace_usage_tracker(trace_usage_tracker) {} void prove(); 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"