diff --git a/CHANGELOG.md b/CHANGELOG.md index 9681e575d..6270c3a50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ * [BREAKING] Added support for specifying map storage slots for FPI (#645) * Limited the number of decimals that an asset can have (#666). * [BREAKING] Removed the `testing` feature from the CLI (#670). +* Added per transaction prover support to the web client (#674). * [BREAKING] Added `BlockNumber` structure (#677). ### Fixes diff --git a/Cargo.lock b/Cargo.lock index ae62b44e7..6ba8e4d21 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1392,6 +1392,7 @@ dependencies = [ "miden-lib", "miden-objects", "miden-proving-service-client", + "miden-tx", "rand", "serde", "serde-wasm-bindgen", diff --git a/crates/web-client/Cargo.toml b/crates/web-client/Cargo.toml index fe9077d72..1159c9d90 100644 --- a/crates/web-client/Cargo.toml +++ b/crates/web-client/Cargo.toml @@ -23,6 +23,8 @@ miden-client = { version = "0.6", path = "../rust-client", default-features = fa miden-lib = { workspace = true } miden-objects = { workspace = true } miden-proving-service-client = { git = "https://github.com/0xPolygonMiden/miden-base", branch = "next", default-features = false, features = ["tx-prover"] } +miden-remote-provers = { git = "https://github.com/0xPolygonMiden/miden-base", branch = "next", default-features = false, features = ["tx-prover"] } +miden-tx = { workspace = true } rand = { workspace = true } serde = { workspace = true } serde-wasm-bindgen = { version = "0.6" } @@ -34,4 +36,5 @@ console_error_panic_hook = "0.1" miden-client = { path = "../rust-client", default-features = false, features = ["idxdb", "web-tonic", "testing"] } miden-lib = { workspace = true, default-features = false, features = ["testing"] } miden-objects = { workspace = true, default-features = false, features = ["testing"] } +miden-tx = { workspace = true, features = ["testing"] } web-sys = { version = "0.3", features = ["console"]} diff --git a/crates/web-client/js/index.js b/crates/web-client/js/index.js index 298b9caa3..b4e33ecf8 100644 --- a/crates/web-client/js/index.js +++ b/crates/web-client/js/index.js @@ -32,6 +32,7 @@ const { Rpo256, TestUtils, TransactionFilter, + TransactionProver, TransactionRequest, TransactionRequestBuilder, TransactionScriptInputPair, @@ -76,6 +77,7 @@ export { Rpo256, TestUtils, TransactionFilter, + TransactionProver, TransactionRequest, TransactionRequestBuilder, TransactionScriptInputPair, diff --git a/crates/web-client/js/types/index.d.ts b/crates/web-client/js/types/index.d.ts index 4049d1ead..bf6477605 100644 --- a/crates/web-client/js/types/index.d.ts +++ b/crates/web-client/js/types/index.d.ts @@ -33,6 +33,7 @@ export { SerializedAccountHeader, TestUtils, TransactionFilter, + TransactionProver, TransactionRequest, TransactionRequestBuilder, TransactionScriptInputPair, diff --git a/crates/web-client/src/models/mod.rs b/crates/web-client/src/models/mod.rs index 4e2a9d096..0b8ea4ef6 100644 --- a/crates/web-client/src/models/mod.rs +++ b/crates/web-client/src/models/mod.rs @@ -66,6 +66,7 @@ pub mod note_type; pub mod output_note; pub mod output_notes; pub mod partial_note; +pub mod provers; pub mod rpo256; pub mod rpo_digest; pub mod sync_summary; diff --git a/crates/web-client/src/models/provers.rs b/crates/web-client/src/models/provers.rs new file mode 100644 index 000000000..63ebf5d57 --- /dev/null +++ b/crates/web-client/src/models/provers.rs @@ -0,0 +1,29 @@ +use alloc::sync::Arc; + +use miden_remote_provers::RemoteTransactionProver; +use miden_tx::{LocalTransactionProver, TransactionProver as TransactionProverTrait}; +use wasm_bindgen::prelude::*; + +#[wasm_bindgen] +pub struct TransactionProver { + prover: Arc, +} + +#[wasm_bindgen] +impl TransactionProver { + pub fn new_local_prover() -> TransactionProver { + let local_prover = LocalTransactionProver::new(Default::default()); + TransactionProver { prover: Arc::new(local_prover) } + } + + pub fn new_remote_prover(endpoint: &str) -> TransactionProver { + let remote_prover = RemoteTransactionProver::new(endpoint); + TransactionProver { prover: Arc::new(remote_prover) } + } +} + +impl TransactionProver { + pub fn get_prover(&self) -> Arc { + self.prover.clone() + } +} diff --git a/crates/web-client/src/new_transactions.rs b/crates/web-client/src/new_transactions.rs index 16065f978..e745691be 100644 --- a/crates/web-client/src/new_transactions.rs +++ b/crates/web-client/src/new_transactions.rs @@ -12,8 +12,9 @@ use wasm_bindgen::prelude::*; use crate::{ models::{ - account_id::AccountId, note_type::NoteType, transaction_request::TransactionRequest, - transaction_result::TransactionResult, transactions::NewSwapTransactionResult, + account_id::AccountId, note_type::NoteType, provers::TransactionProver, + transaction_request::TransactionRequest, transaction_result::TransactionResult, + transactions::NewSwapTransactionResult, }, WebClient, }; @@ -71,6 +72,26 @@ impl WebClient { } } + pub async fn submit_transaction_with_prover( + &mut self, + transaction_result: &TransactionResult, + prover: TransactionProver, + ) -> Result<(), JsValue> { + if let Some(client) = self.get_mut_inner() { + let native_transaction_result: NativeTransactionResult = transaction_result.into(); + client + .submit_transaction_with_prover(native_transaction_result, prover.get_prover()) + .await + .map_err(|err| { + JsValue::from_str(&format!("Failed to submit Transaction: {}", err)) + })?; + + Ok(()) + } else { + Err(JsValue::from_str("Client not initialized")) + } + } + pub async fn new_mint_transaction( &mut self, target_account_id: &AccountId, diff --git a/crates/web-client/test/global.test.d.ts b/crates/web-client/test/global.test.d.ts index 88de10bc7..17c80cafa 100644 --- a/crates/web-client/test/global.test.d.ts +++ b/crates/web-client/test/global.test.d.ts @@ -29,6 +29,7 @@ import { Rpo256, TestUtils, TransactionFilter, + TransactionProver, TransactionRequest, TransactionRequestBuilder, TransactionScriptInputPair, @@ -40,6 +41,7 @@ import { declare global { interface Window { client: WebClient; + remote_prover_url: string; Account: typeof Account; AccountHeader: typeof AccountHeader; AccountId: typeof AccountId; @@ -69,6 +71,7 @@ declare global { Rpo256: typeof Rpo256; TestUtils: typeof TestUtils; TransactionFilter: typeof TransactionFilter; + TransactionProver: typeof TransactionProver; TransactionRequest: typeof TransactionRequest; TransactionRequestBuilder: typeof TransactionRequestBuilder; TransactionScriptInputPair: typeof TransactionScriptInputPair; diff --git a/crates/web-client/test/mocha.global.setup.mjs b/crates/web-client/test/mocha.global.setup.mjs index 10e4787fb..7ba8cc66a 100644 --- a/crates/web-client/test/mocha.global.setup.mjs +++ b/crates/web-client/test/mocha.global.setup.mjs @@ -82,6 +82,7 @@ before(async () => { Rpo256, TestUtils, TransactionFilter, + TransactionProver, TransactionRequest, TransactionRequestBuilder, TransactionScriptInputPair, @@ -127,6 +128,7 @@ before(async () => { window.Rpo256 = Rpo256; window.TestUtils = TestUtils; window.TransactionFilter = TransactionFilter; + window.TransactionProver = TransactionProver; window.TransactionRequest = TransactionRequest; window.TransactionRequestBuilder = TransactionRequestBuilder; window.TransactionScriptInputPair = TransactionScriptInputPair; @@ -136,6 +138,9 @@ before(async () => { // Create a namespace for helper functions window.helpers = window.helpers || {}; + // Add the remote prover url to window + window.remote_prover_url = prover_url; + window.helpers.waitForTransaction = async ( transactionId, maxWaitTime = 20000, diff --git a/crates/web-client/test/new_transactions.test.ts b/crates/web-client/test/new_transactions.test.ts index 3105ec4dd..92e34c48e 100644 --- a/crates/web-client/test/new_transactions.test.ts +++ b/crates/web-client/test/new_transactions.test.ts @@ -5,6 +5,7 @@ import { mintTransaction, setupWalletAndFaucet, } from "./webClientTestUtils"; +import { TransactionProver } from "../dist"; import { setupConsumedNote } from "./notes.test"; // NEW_MINT_TRANSACTION TESTS @@ -142,64 +143,66 @@ describe("new_send_transaction tests", () => { // ======================================================================================================= export const customTransaction = async ( - asserted_value: string + asserted_value: string, + with_custom_prover: boolean ): Promise => { - return await testingPage.evaluate(async (_asserted_value: string) => { - const client = window.client; + return await testingPage.evaluate( + async (_asserted_value: string, _with_custom_prover: boolean) => { + const client = window.client; - const walletAccount = await client.new_wallet( - window.AccountStorageMode.private(), - false - ); - const faucetAccount = await client.new_faucet( - window.AccountStorageMode.private(), - false, - "DAG", - 8, - BigInt(10000000) - ); - await client.sync_state(); + const walletAccount = await client.new_wallet( + window.AccountStorageMode.private(), + false + ); + const faucetAccount = await client.new_faucet( + window.AccountStorageMode.private(), + false, + "DAG", + 8, + BigInt(10000000) + ); + await client.sync_state(); + + // Creating Custom Note which needs the following: + // - Note Assets + // - Note Metadata + // - Note Recipient + + // Creating NOTE_ARGS + let felt1 = new window.Felt(BigInt(9)); + let felt2 = new window.Felt(BigInt(12)); + let felt3 = new window.Felt(BigInt(18)); + let felt4 = new window.Felt(BigInt(3)); + let felt5 = new window.Felt(BigInt(3)); + let felt6 = new window.Felt(BigInt(18)); + let felt7 = new window.Felt(BigInt(12)); + let felt8 = new window.Felt(BigInt(9)); + + let noteArgs = [felt1, felt2, felt3, felt4, felt5, felt6, felt7, felt8]; + let feltArray = new window.FeltArray(); + noteArgs.forEach((felt) => feltArray.append(felt)); + + let noteAssets = new window.NoteAssets([ + new window.FungibleAsset(faucetAccount.id(), BigInt(10)), + ]); - // Creating Custom Note which needs the following: - // - Note Assets - // - Note Metadata - // - Note Recipient - - // Creating NOTE_ARGS - let felt1 = new window.Felt(BigInt(9)); - let felt2 = new window.Felt(BigInt(12)); - let felt3 = new window.Felt(BigInt(18)); - let felt4 = new window.Felt(BigInt(3)); - let felt5 = new window.Felt(BigInt(3)); - let felt6 = new window.Felt(BigInt(18)); - let felt7 = new window.Felt(BigInt(12)); - let felt8 = new window.Felt(BigInt(9)); - - let noteArgs = [felt1, felt2, felt3, felt4, felt5, felt6, felt7, felt8]; - let feltArray = new window.FeltArray(); - noteArgs.forEach((felt) => feltArray.append(felt)); - - let noteAssets = new window.NoteAssets([ - new window.FungibleAsset(faucetAccount.id(), BigInt(10)), - ]); - - let noteMetadata = new window.NoteMetadata( - faucetAccount.id(), - window.NoteType.private(), - window.NoteTag.from_account_id( - walletAccount.id(), - window.NoteExecutionMode.new_local() - ), - window.NoteExecutionHint.none(), - undefined - ); + let noteMetadata = new window.NoteMetadata( + faucetAccount.id(), + window.NoteType.private(), + window.NoteTag.from_account_id( + walletAccount.id(), + window.NoteExecutionMode.new_local() + ), + window.NoteExecutionHint.none(), + undefined + ); - let expectedNoteArgs = noteArgs.map((felt) => felt.as_int()); - let memAddress = "1000"; - let memAddress2 = "1001"; - let expectedNoteArg1 = expectedNoteArgs.slice(0, 4).join("."); - let expectedNoteArg2 = expectedNoteArgs.slice(4, 8).join("."); - let note_script = ` + let expectedNoteArgs = noteArgs.map((felt) => felt.as_int()); + let memAddress = "1000"; + let memAddress2 = "1001"; + let expectedNoteArg1 = expectedNoteArgs.slice(0, 4).join("."); + let expectedNoteArg2 = expectedNoteArgs.slice(4, 8).join("."); + let note_script = ` # Custom P2ID note script # # This note script asserts that the note args are exactly the same as passed @@ -321,46 +324,55 @@ export const customTransaction = async ( end `; - let compiledNoteScript = await client.compile_note_script(note_script); - let noteInputs = new window.NoteInputs( - new window.FeltArray([ - walletAccount.id().prefix(), - walletAccount.id().suffix(), - ]) - ); + let compiledNoteScript = await client.compile_note_script(note_script); + let noteInputs = new window.NoteInputs( + new window.FeltArray([ + walletAccount.id().prefix(), + walletAccount.id().suffix(), + ]) + ); - const serialNum = window.Word.new_from_u64s( - new BigUint64Array([BigInt(1), BigInt(2), BigInt(3), BigInt(4)]) - ); - let noteRecipient = new window.NoteRecipient( - serialNum, - compiledNoteScript, - noteInputs - ); + const serialNum = window.Word.new_from_u64s( + new BigUint64Array([BigInt(1), BigInt(2), BigInt(3), BigInt(4)]) + ); + let noteRecipient = new window.NoteRecipient( + serialNum, + compiledNoteScript, + noteInputs + ); - let note = new window.Note(noteAssets, noteMetadata, noteRecipient); + let note = new window.Note(noteAssets, noteMetadata, noteRecipient); - // Creating First Custom Transaction Request to Mint the Custom Note - let transaction_request = new window.TransactionRequestBuilder() - .with_own_output_notes( - new window.OutputNotesArray([window.OutputNote.full(note)]) - ) - .build(); + // Creating First Custom Transaction Request to Mint the Custom Note + let transaction_request = new window.TransactionRequestBuilder() + .with_own_output_notes( + new window.OutputNotesArray([window.OutputNote.full(note)]) + ) + .build(); - // Execute and Submit Transaction - await client.fetch_and_cache_account_auth_by_pub_key(faucetAccount.id()); - let transaction_result = await client.new_transaction( - faucetAccount.id(), - transaction_request - ); - await client.submit_transaction(transaction_result); - await window.helpers.waitForTransaction( - transaction_result.executed_transaction().id().to_hex() - ); + // Execute and Submit Transaction + await client.fetch_and_cache_account_auth_by_pub_key(faucetAccount.id()); + let transaction_result = await client.new_transaction( + faucetAccount.id(), + transaction_request + ); - // Just like in the miden test, you can modify this script to get the execution to fail - // by modifying the assert - let tx_script = ` + if (_with_custom_prover) { + await client.submit_transaction_with_prover( + transaction_result, + await selectProver() + ); + } else { + await client.submit_transaction(transaction_result); + } + + await window.helpers.waitForTransaction( + transaction_result.executed_transaction().id().to_hex() + ); + + // Just like in the miden test, you can modify this script to get the execution to fail + // by modifying the assert + let tx_script = ` use.miden::contracts::auth::basic->auth_tx use.miden::kernels::tx::prologue use.miden::kernels::tx::memory @@ -374,49 +386,61 @@ export const customTransaction = async ( end `; - // Creating Second Custom Transaction Request to Consume Custom Note - // with Invalid/Valid Transaction Script - let account_auth = await client.get_account_auth(walletAccount.id()); - let public_key = account_auth.get_rpo_falcon_512_public_key_as_word(); - let secret_key = account_auth.get_rpo_falcon_512_secret_key_as_felts(); - let transcription_script_input_pair_array = - new window.TransactionScriptInputPairArray([ - new window.TransactionScriptInputPair(public_key, secret_key), + // Creating Second Custom Transaction Request to Consume Custom Note + // with Invalid/Valid Transaction Script + let account_auth = await client.get_account_auth(walletAccount.id()); + let public_key = account_auth.get_rpo_falcon_512_public_key_as_word(); + let secret_key = account_auth.get_rpo_falcon_512_secret_key_as_felts(); + let transcription_script_input_pair_array = + new window.TransactionScriptInputPairArray([ + new window.TransactionScriptInputPair(public_key, secret_key), + ]); + let transaction_script = await client.compile_tx_script( + tx_script, + transcription_script_input_pair_array + ); + let note_id = note.id(); + let note_args_commitment = window.Rpo256.hash_elements(feltArray); // gets consumed by NoteIdAndArgs + let note_id_and_args = new window.NoteIdAndArgs( + note_id, + note_args_commitment.to_word() + ); + let note_id_and_args_array = new window.NoteIdAndArgsArray([ + note_id_and_args, ]); - let transaction_script = await client.compile_tx_script( - tx_script, - transcription_script_input_pair_array - ); - let note_id = note.id(); - let note_args_commitment = window.Rpo256.hash_elements(feltArray); // gets consumed by NoteIdAndArgs - let note_id_and_args = new window.NoteIdAndArgs( - note_id, - note_args_commitment.to_word() - ); - let note_id_and_args_array = new window.NoteIdAndArgsArray([ - note_id_and_args, - ]); - let advice_map = new window.AdviceMap(); - let note_args_commitment_2 = window.Rpo256.hash_elements(feltArray); - advice_map.insert(note_args_commitment_2, feltArray); - - let transaction_request_2 = new window.TransactionRequestBuilder() - .with_authenticated_input_notes(note_id_and_args_array) - .with_custom_script(transaction_script) - .extend_advice_map(advice_map) - .build(); - - // Execute and Submit Transaction - await client.fetch_and_cache_account_auth_by_pub_key(walletAccount.id()); - let transaction_result_2 = await client.new_transaction( - walletAccount.id(), - transaction_request_2 - ); - await client.submit_transaction(transaction_result_2); - await window.helpers.waitForTransaction( - transaction_result_2.executed_transaction().id().to_hex() - ); - }, asserted_value); + let advice_map = new window.AdviceMap(); + let note_args_commitment_2 = window.Rpo256.hash_elements(feltArray); + advice_map.insert(note_args_commitment_2, feltArray); + + let transaction_request_2 = new window.TransactionRequestBuilder() + .with_authenticated_input_notes(note_id_and_args_array) + .with_custom_script(transaction_script) + .extend_advice_map(advice_map) + .build(); + + // Execute and Submit Transaction + await client.fetch_and_cache_account_auth_by_pub_key(walletAccount.id()); + let transaction_result_2 = await client.new_transaction( + walletAccount.id(), + transaction_request_2 + ); + + if (_with_custom_prover) { + await client.submit_transaction_with_prover( + transaction_result_2, + await selectProver() + ); + } else { + await client.submit_transaction(transaction_result_2); + } + + await window.helpers.waitForTransaction( + transaction_result_2.executed_transaction().id().to_hex() + ); + }, + asserted_value, + with_custom_prover + ); }; const customTxWithMultipleNotes = async ( @@ -626,11 +650,11 @@ const customTxWithMultipleNotes = async ( describe("custom transaction tests", () => { it("custom transaction completes successfully", async () => { - await expect(customTransaction("0")).to.be.fulfilled; + await expect(customTransaction("0", false)).to.be.fulfilled; }); it("custom transaction fails", async () => { - await expect(customTransaction("1")).to.be.rejected; + await expect(customTransaction("1", false)).to.be.rejected; }); }); @@ -659,3 +683,21 @@ describe("custom transaction with multiple output notes", () => { }); }); }); + +// CUSTOM PROVERS TEST +// ================================================================================================ + +export const selectProver = async (): Promise => { + if (window.remote_prover_url != null) { + return window.TransactionProver.new_remote_prover(window.remote_prover_url); + } else { + return window.TransactionProver.new_local_prover(); + } +}; + +describe("use custom transaction prover per request", () => { + it("custom transaction prover completes successfully"), + async () => { + await expect(customTransaction("0", true)).to.be.fulfilled; + }; +}); diff --git a/crates/web-client/yarn.lock b/crates/web-client/yarn.lock index 4d4615f93..3b8ad8b97 100644 --- a/crates/web-client/yarn.lock +++ b/crates/web-client/yarn.lock @@ -432,7 +432,7 @@ chai-as-promised@^8.0.0: dependencies: check-error "^2.0.0" -chai@^5.1.1, "chai@>= 2.1.2 < 6": +chai@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/chai/-/chai-5.1.1.tgz" integrity sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA== @@ -526,16 +526,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" @@ -597,6 +597,13 @@ data-uri-to-buffer@^6.0.2: resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz" integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== +debug@4, debug@^4.1.1, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6: + version "4.3.6" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz" + integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== + dependencies: + ms "2.1.2" + debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -604,13 +611,6 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.1.1, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6, debug@4: - version "4.3.6" - resolved "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz" - integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg== - dependencies: - ms "2.1.2" - decamelize@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" @@ -644,7 +644,7 @@ degenerator@^5.0.0: escodegen "^2.1.0" esprima "^4.0.1" -devtools-protocol@*, devtools-protocol@0.0.1330662: +devtools-protocol@0.0.1330662: version "0.0.1330662" resolved "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1330662.tgz" integrity sha512-pzh6YQ8zZfz3iKlCvgzVCu22NdpZ8hNmwU6WnQjNVquh0A9iVosPtNLWDwaWVGyrntQlltPFztTMK5Cg6lfCuw== @@ -934,18 +934,7 @@ glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^8.0.3: - version "8.1.0" - resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" - integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^5.0.1" - once "^1.3.0" - -glob@^8.1.0: +glob@^8.0.3, glob@^8.1.0: version "8.1.0" resolved "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz" integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== @@ -1327,16 +1316,16 @@ minipass@^3.0.0: dependencies: yallist "^4.0.0" -"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: - version "7.1.2" - resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" - integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== - minipass@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz" integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ== +"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2: + version "7.1.2" + resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" + integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== + minizlib@^2.1.1: version "2.1.2" resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" @@ -1388,16 +1377,16 @@ mocha@^10.7.3: yargs-parser "^20.2.9" yargs-unparser "^2.0.0" -ms@^2.1.1, ms@^2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - ms@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== +ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + netmask@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz" @@ -1683,14 +1672,14 @@ rimraf@^6.0.1: glob "^11.0.0" package-json-from-dist "^1.0.0" -rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^2.68.0||^3.0.0||^4.0.0, rollup@^2.78.0||^3.0.0||^4.0.0, rollup@^3.27.2: +rollup@^3.27.2: version "3.29.4" resolved "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz" integrity sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw== optionalDependencies: fsevents "~2.3.2" -safe-buffer@^5.1.0, safe-buffer@5.1.2: +safe-buffer@5.1.2, safe-buffer@^5.1.0: version "5.1.2" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== @@ -1963,7 +1952,7 @@ typed-query-selector@^2.12.0: resolved "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz" integrity sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg== -typescript@^5.5.4, typescript@>=2.7, typescript@>=4.9.5: +typescript@^5.5.4: version "5.5.4" resolved "https://registry.npmjs.org/typescript/-/typescript-5.5.4.tgz" integrity sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==