diff --git a/examples/node/.gitignore b/examples/node/.gitignore new file mode 100644 index 000000000..b48304fa5 --- /dev/null +++ b/examples/node/.gitignore @@ -0,0 +1 @@ +.cartridge \ No newline at end of file diff --git a/examples/node/README.md b/examples/node/README.md new file mode 100644 index 000000000..99644ff0f --- /dev/null +++ b/examples/node/README.md @@ -0,0 +1,33 @@ +# Cartridge Node.js Session Example + +This example demonstrates how to use the Cartridge session controller with Node.js + +## Setup + +1. Install dependencies: + +```bash +npm install +``` + +2. Run the example: + +```bash +npm start +``` + +## What's happening? + +The example demonstrates: +1. Setting up a filesystem backend for session storage +2. Creating a session controller instance +3. Creating a new session with specific policies +4. Executing a transaction using the session + +## Customization + +To use this example with your own contract: + +1. Replace the contract address (`0x123...`) with your actual contract address +2. Modify the policies to match your contract's methods +3. Update the transaction parameters in the `execute` call to match your use case diff --git a/examples/node/package.json b/examples/node/package.json new file mode 100644 index 000000000..a2ae3df15 --- /dev/null +++ b/examples/node/package.json @@ -0,0 +1,21 @@ +{ + "name": "cartridge-node-example", + "version": "1.0.0", + "description": "Example of using Cartridge session controller with Node.js", + "type": "module", + "scripts": { + "build": "tsc", + "start": "node --experimental-wasm-modules dist/session.js", + "dev": "node --experimental-wasm-modules --import tsx src/session.ts" + }, + "dependencies": { + "@cartridge/account-wasm": "workspace:*", + "@cartridge/controller": "workspace:*", + "starknet": "catalog:" + }, + "devDependencies": { + "typescript": "^5.3.3", + "tsx": "^4.7.0", + "@types/node": "^22.12.0" + } +} \ No newline at end of file diff --git a/examples/node/src/session.ts b/examples/node/src/session.ts new file mode 100644 index 000000000..5c5fe937b --- /dev/null +++ b/examples/node/src/session.ts @@ -0,0 +1,74 @@ +import SessionProvider, { + ControllerError, +} from "@cartridge/controller/session/node"; +import { constants } from "starknet"; +import path from "path"; + +export const STRK_CONTRACT_ADDRESS = + "0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7"; + +async function main() { + // Path to store session + const storagePath = + process.env.CARTRIDGE_STORAGE_PATH || + path.join(process.cwd(), ".cartridge"); + + // Create a session provider + const provider = new SessionProvider({ + rpc: "https://api.cartridge.gg/x/starknet/sepolia", + chainId: constants.StarknetChainId.SN_SEPOLIA, + policies: { + contracts: { + [STRK_CONTRACT_ADDRESS]: { + methods: [ + { + name: "approve", + entrypoint: "approve", + description: "Approve spending of tokens", + }, + { name: "transfer", entrypoint: "transfer" }, + ], + }, + }, + }, + basePath: storagePath, + }); + try { + // Connect and create session + const account = await provider.connect(); + console.log("Session initialized!"); + + if (account) { + console.log("Account address:", account.address); + + // Example: Transfer ETH + const amount = "0x0"; + const recipient = account.address; // Replace with actual recipient address + + const result = await account.execute([ + { + contractAddress: STRK_CONTRACT_ADDRESS, + entrypoint: "transfer", + calldata: [recipient, amount, "0x0"], + }, + ]); + + console.log("Transaction hash:", result.transaction_hash); + } else { + console.log("Please complete the session creation in your browser"); + } + } catch (error: unknown) { + const controllerError = error as ControllerError; + if (controllerError.code) { + console.error("Session error:", { + code: controllerError.code, + message: controllerError.message, + data: controllerError.data, + }); + } else { + console.error("Session error:", error); + } + } +} + +main().catch(console.error); diff --git a/examples/node/tsconfig.json b/examples/node/tsconfig.json new file mode 100644 index 000000000..58ebb0a29 --- /dev/null +++ b/examples/node/tsconfig.json @@ -0,0 +1,16 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "esModuleInterop": true, + "strict": true, + "skipLibCheck": true, + "outDir": "./dist", + "rootDir": "./src", + "declaration": true, + "allowJs": true, + "resolveJsonModule": true + }, + "include": ["src/**/*"] +} diff --git a/packages/account-wasm/build.sh b/packages/account-wasm/build.sh index 316e0095b..2d224f4f4 100755 --- a/packages/account-wasm/build.sh +++ b/packages/account-wasm/build.sh @@ -7,11 +7,3 @@ pnpm wasm-pack build --target bundler --out-dir ./pkg-controller --release --fea # Build session bundle pnpm wasm-pack build --target bundler --out-dir ./pkg-session --release --features "console-error-panic,session_account" - -# Workaround for ESM `import` error in NextJS. -# This removes `"type": "module"` field from the package.json files -for dir in pkg-controller pkg-session; do - mv $dir/package.json $dir/temp.json - jq -r 'del(.type)' $dir/temp.json >$dir/package.json - rm $dir/temp.json -done diff --git a/packages/account-wasm/package.json b/packages/account-wasm/package.json index 7253eeb88..3a4329d00 100644 --- a/packages/account-wasm/package.json +++ b/packages/account-wasm/package.json @@ -2,55 +2,40 @@ "name": "@cartridge/account-wasm", "version": "0.6.0", "description": "Wasm bindings for Cartridge Controller and Session Account", - "main": "./pkg-controller/account_wasm.js", "type": "module", + "main": "./pkg-controller/account_wasm.js", + "module": "./pkg-controller/account_wasm.js", + "types": "./pkg-controller/account_wasm.d.ts", "scripts": { "build:deps": "./build.sh" }, "files": [ - "./pkg-controller/account_wasm_bg.wasm", - "./pkg-controller/account_wasm.js", - "./pkg-controller/account_wasm_bg.js", - "./pkg-controller/account_wasm.d.ts", - "./pkg-session/account_wasm_bg.wasm", - "./pkg-session/account_wasm.js", - "./pkg-session/account_wasm_bg.js", - "./pkg-session/account_wasm.d.ts" + "pkg-controller", + "pkg-session" ], "exports": { ".": { "types": "./pkg-controller/account_wasm.d.ts", - "default": "./pkg-controller/account_wasm.js" + "import": "./pkg-controller/account_wasm.js", + "require": "./pkg-controller/account_wasm.js" }, "./controller": { "types": "./pkg-controller/account_wasm.d.ts", - "default": "./pkg-controller/account_wasm.js" + "import": "./pkg-controller/account_wasm.js", + "require": "./pkg-controller/account_wasm.js" }, "./session": { "types": "./pkg-session/account_wasm.d.ts", - "default": "./pkg-session/account_wasm.js" + "import": "./pkg-session/account_wasm.js", + "require": "./pkg-session/account_wasm.js" } }, "sideEffects": [ + "**/*.wasm", "./pkg-controller/account_wasm.js", - "./pkg-session/account_wasm.js", - "./pkg-controller/snippets/*", - "./pkg-session/snippets/*" + "./pkg-session/account_wasm.js" ], - "typesVersions": { - "*": { - "controller": [ - "./pkg-controller/account_wasm.d.ts" - ], - "session": [ - "./pkg-session/account_wasm.d.ts" - ] - } - }, "devDependencies": { - "@cartridge/tsconfig": "workspace:*", - "tsup": "catalog:", - "typescript": "catalog:", "wasm-pack": "^0.13.0" } -} +} \ No newline at end of file diff --git a/packages/account-wasm/src/errors.rs b/packages/account-wasm/src/errors.rs index 1c34f5c3c..c0a1532cc 100644 --- a/packages/account-wasm/src/errors.rs +++ b/packages/account-wasm/src/errors.rs @@ -451,6 +451,36 @@ impl From for JsControllerError { } } +impl From for JsControllerError { + fn from(error: account_sdk::signers::SignError) -> Self { + JsControllerError { + code: ErrorCode::SignError, + message: error.to_string(), + data: None, + } + } +} + +impl From for JsControllerError { + fn from(error: url::ParseError) -> Self { + JsControllerError { + code: ErrorCode::UrlParseError, + message: error.to_string(), + data: None, + } + } +} + +impl From for JsControllerError { + fn from(error: starknet::accounts::NotPreparedError) -> Self { + JsControllerError { + code: ErrorCode::StarknetUnexpectedError, + message: error.to_string(), + data: None, + } + } +} + impl fmt::Display for JsControllerError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let json = serde_json::json!({ diff --git a/packages/account-wasm/src/session.rs b/packages/account-wasm/src/session.rs index 64aab6d70..ecbbf7a22 100644 --- a/packages/account-wasm/src/session.rs +++ b/packages/account-wasm/src/session.rs @@ -11,17 +11,19 @@ use serde_wasm_bindgen::to_value; use starknet::accounts::{Account, ConnectedAccount}; use starknet::signers::SigningKey; use starknet_types_core::felt::Felt; + +use std::result::Result; use url::Url; use wasm_bindgen::prelude::*; +use crate::errors::JsControllerError; +use crate::sync::WasmMutex; use crate::types::call::JsCall; use crate::types::session::Session; use crate::types::{Felts, JsFelt}; -type Result = std::result::Result; - #[wasm_bindgen] -pub struct CartridgeSessionAccount(SessionAccount); +pub struct CartridgeSessionAccount(WasmMutex); #[wasm_bindgen] impl CartridgeSessionAccount { @@ -32,7 +34,7 @@ impl CartridgeSessionAccount { chain_id: JsFelt, session_authorization: Vec, session: Session, - ) -> Result { + ) -> Result { let rpc_url = Url::parse(&rpc_url)?; let provider = CartridgeJsonRpcProvider::new(rpc_url.clone()); @@ -48,7 +50,7 @@ impl CartridgeSessionAccount { .policies .into_iter() .map(TryFrom::try_from) - .collect::, _>>()?; + .collect::, _>>()?; let session = account_sdk::account::session::hash::Session::new( policies, @@ -57,16 +59,19 @@ impl CartridgeSessionAccount { Felt::ZERO, )?; - Ok(CartridgeSessionAccount(SessionAccount::new( - provider, - signer, - address, - chain_id, - session_authorization, - session, + Ok(CartridgeSessionAccount(WasmMutex::new( + SessionAccount::new( + provider, + signer, + address, + chain_id, + session_authorization, + session, + ), ))) } + #[wasm_bindgen(js_name = newAsRegistered)] pub fn new_as_registered( rpc_url: String, signer: JsFelt, @@ -74,7 +79,7 @@ impl CartridgeSessionAccount { owner_guid: JsFelt, chain_id: JsFelt, session: Session, - ) -> Result { + ) -> Result { let rpc_url = Url::parse(&rpc_url)?; let provider = CartridgeJsonRpcProvider::new(rpc_url.clone()); @@ -86,7 +91,7 @@ impl CartridgeSessionAccount { .policies .into_iter() .map(TryFrom::try_from) - .collect::, _>>()?; + .collect::, _>>()?; let session = account_sdk::account::session::hash::Session::new( policies, @@ -95,65 +100,83 @@ impl CartridgeSessionAccount { Felt::ZERO, )?; - Ok(CartridgeSessionAccount(SessionAccount::new_as_registered( - provider, - signer, - address, - chain_id, - owner_guid.0, - session, + Ok(CartridgeSessionAccount(WasmMutex::new( + SessionAccount::new_as_registered( + provider, + signer, + address, + chain_id, + owner_guid.0, + session, + ), ))) } - pub async fn sign(&self, hash: JsFelt, calls: Vec) -> Result { + pub async fn sign(&self, hash: JsFelt, calls: Vec) -> Result { let hash = hash.0; let calls = calls .into_iter() .map(TryInto::try_into) - .collect::, _>>()?; + .collect::, _>>()?; - let res = self.0.sign_hash_and_calls(hash, &calls).await?; + let res = self + .0 + .lock() + .await + .sign_hash_and_calls(hash, &calls) + .await?; Ok(Felts(res.into_iter().map(JsFelt).collect())) } - pub async fn sign_transaction(&self, calls: Vec, max_fee: JsFelt) -> Result { + #[wasm_bindgen(js_name = signTransaction)] + pub async fn sign_transaction( + &self, + calls: Vec, + max_fee: JsFelt, + ) -> Result { let calls = calls .into_iter() .map(TryInto::try_into) - .collect::, _>>()?; + .collect::, _>>()?; - let nonce = self.0.get_nonce().await?; - let tx_hash = self - .0 + let session = self.0.lock().await; + let nonce = session.get_nonce().await?; + let tx_hash = session .execute_v1(calls.clone()) .nonce(nonce) .max_fee(max_fee.0) .prepared()? .transaction_hash(false); - let signature = self.0.sign_hash_and_calls(tx_hash, &calls).await?; + let signature = session.sign_hash_and_calls(tx_hash, &calls).await?; Ok(Felts(signature.into_iter().map(JsFelt).collect())) } - pub async fn execute(&self, calls: Vec) -> Result { + pub async fn execute(&self, calls: Vec) -> Result { let calls = calls .into_iter() .map(TryInto::try_into) - .collect::, _>>()?; + .collect::, _>>()?; - let res = self.0.execute_v1(calls).send().await?; + let session = self.0.lock().await; + let nonce = session.get_nonce().await?; + let result = session.execute_v1(calls).nonce(nonce).send().await?; - Ok(to_value(&res)?) + Ok(to_value(&result)?) } - pub async fn execute_from_outside(&self, calls: Vec) -> Result { + #[wasm_bindgen(js_name = executeFromOutside)] + pub async fn execute_from_outside( + &self, + calls: Vec, + ) -> Result { let caller = OutsideExecutionCaller::Any; let calls = calls .into_iter() .map(TryInto::try_into) - .collect::, _>>()?; + .collect::, _>>()?; let now = get_current_timestamp(); let outside_execution = OutsideExecutionV3 { @@ -164,17 +187,16 @@ impl CartridgeSessionAccount { nonce: (SigningKey::from_random().secret_scalar(), 1), }; - let signed = self - .0 + let session = self.0.lock().await; + let signed = session .sign_outside_execution(OutsideExecution::V3(outside_execution.clone())) .await?; - let res = self - .0 + let res = session .provider() .add_execute_outside_transaction( OutsideExecution::V3(outside_execution), - self.0.address(), + session.address(), signed.signature, ) .await?; diff --git a/packages/controller/package.json b/packages/controller/package.json index d1da34cfc..87ec25804 100644 --- a/packages/controller/package.json +++ b/packages/controller/package.json @@ -6,7 +6,7 @@ "types": "dist/index.d.ts", "type": "module", "scripts": { - "build:deps": "tsup --dts-resolve", + "build:deps": "tsup", "build": "pnpm build:deps", "format": "prettier --write \"src/**/*.ts\"", "format:check": "prettier --check \"src/**/*.ts\"", @@ -16,34 +16,52 @@ "exports": { ".": { "types": "./dist/index.d.ts", - "default": "./dist/index.js" + "import": "./dist/index.js", + "require": "./dist/index.cjs" }, "./session": { "types": "./dist/session/index.d.ts", - "default": "./dist/session/index.js" + "import": "./dist/session/index.js", + "require": "./dist/session/index.cjs" + }, + "./session/node": { + "types": "./dist/node/index.d.ts", + "import": "./dist/node/index.js", + "require": "./dist/node/index.cjs" }, "./provider": { "types": "./dist/provider/index.d.ts", - "default": "./dist/provider/index.js" + "import": "./dist/provider/index.js" }, "./types": { "types": "./dist/types/index.d.ts", - "default": "./dist/types/index.js" + "import": "./dist/types/index.js" } }, "tsup": { "entry": [ - "src/**" + "src/index.ts", + "src/controller.ts", + "src/lookup.ts", + "src/session/index.ts", + "src/node/index.ts" ], "format": [ - "esm" + "esm", + "cjs" ], "splitting": false, "sourcemap": true, - "clean": true + "clean": true, + "dts": true, + "treeshake": { + "preset": "recommended" + }, + "exports": "named" }, "peerDependencies": { - "starknet": "catalog:" + "starknet": "catalog:", + "open": "^10.1.0" }, "dependencies": { "@cartridge/account-wasm": "workspace:*", @@ -64,4 +82,4 @@ "tsup": "catalog:", "typescript": "catalog:" } -} +} \ No newline at end of file diff --git a/packages/controller/src/node/account.ts b/packages/controller/src/node/account.ts new file mode 100644 index 000000000..fd9322d6f --- /dev/null +++ b/packages/controller/src/node/account.ts @@ -0,0 +1,72 @@ +import { Policy } from "@cartridge/account-wasm"; +import { CartridgeSessionAccount } from "@cartridge/account-wasm/session"; +import { Call, InvokeFunctionResponse, WalletAccount } from "starknet"; + +import { normalizeCalls } from "../utils"; +import BaseProvider from "../provider"; + +export * from "../errors"; +export * from "../types"; + +export default class SessionAccount extends WalletAccount { + public controller: CartridgeSessionAccount; + + constructor( + provider: BaseProvider, + { + rpcUrl, + privateKey, + address, + ownerGuid, + chainId, + expiresAt, + policies, + }: { + rpcUrl: string; + privateKey: string; + address: string; + ownerGuid: string; + chainId: string; + expiresAt: number; + policies: Policy[]; + }, + ) { + super({ nodeUrl: rpcUrl }, provider); + + this.address = address; + this.controller = CartridgeSessionAccount.newAsRegistered( + rpcUrl, + privateKey, + address, + ownerGuid, + chainId, + { + expiresAt, + policies, + }, + ); + } + + /** + * Invoke execute function in account contract + * + * @param calls the invocation object or an array of them, containing: + * - contractAddress - the address of the contract + * - entrypoint - the entrypoint of the contract + * - calldata - (defaults to []) the calldata + * - signature - (defaults to []) the signature + * + * @returns response from addTransaction + */ + async execute(calls: Call | Call[]): Promise { + try { + const res = await this.controller.executeFromOutside( + normalizeCalls(calls), + ); + + return res; + } catch (e) { + return this.controller.execute(normalizeCalls(calls)); + } + } +} diff --git a/packages/controller/src/node/backend.ts b/packages/controller/src/node/backend.ts new file mode 100644 index 000000000..a8c2843dc --- /dev/null +++ b/packages/controller/src/node/backend.ts @@ -0,0 +1,159 @@ +import * as fs from "fs/promises"; +import * as path from "path"; +import { CallbackServer } from "./server"; + +interface SessionSigner { + privKey: string; + pubKey: string; +} + +interface SessionInfo { + username: string; + address: string; + ownerGuid: string; + transactionHash?: string; + expiresAt: string; +} + +interface SessionData { + signer?: SessionSigner; + session?: SessionInfo; + policies?: any; + lastUsedConnector?: string; + [key: string]: any; +} + +/** + * Implements a file system backend. + * This is designed for Node.js environments to store session data on the filesystem. + */ +export class NodeBackend { + private basePath: string; + private sessionFile: string; + private data: SessionData = {}; + private callbackServer?: CallbackServer; + + constructor(basePath: string) { + if (!basePath) { + throw new Error("basePath is required for NodeBackend"); + } + this.basePath = basePath; + this.sessionFile = path.join(this.basePath, "session.json"); + } + + private async ensureDirectoryExists(): Promise { + try { + await fs.access(this.basePath); + } catch { + try { + await fs.mkdir(this.basePath, { recursive: true }); + } catch (error: any) { + throw new Error( + `Failed to create directory ${this.basePath}: ${error.message}`, + ); + } + } + } + + private async loadData(): Promise { + try { + const content = await fs.readFile(this.sessionFile, "utf-8"); + const parsed = JSON.parse(content); + + if (typeof parsed !== "object" || parsed === null) { + throw new Error("Invalid session data format"); + } + + this.data = parsed; + } catch (error: unknown) { + if (error instanceof Error) { + if ((error as NodeJS.ErrnoException).code !== "ENOENT") { + throw new Error(`Failed to load session data: ${error.message}`); + } + } + this.data = {}; + } + } + + private async saveData(): Promise { + try { + await this.ensureDirectoryExists(); + await fs.writeFile( + this.sessionFile, + JSON.stringify(this.data, null, 2), + "utf-8", + ); + } catch (error: unknown) { + if (error instanceof Error) { + throw new Error(`Failed to save session data: ${error.message}`); + } + throw error; + } + } + + async get(key: string): Promise { + if (!key) { + throw new Error("Key is required"); + } + + await this.loadData(); + return this.data[key] ? JSON.stringify(this.data[key]) : null; + } + + async set(key: string, value: string): Promise { + if (!key) { + throw new Error("Key is required"); + } + if (!value) { + throw new Error("Value is required"); + } + + await this.loadData(); + try { + this.data[key] = JSON.parse(value); + await this.saveData(); + } catch (error: unknown) { + if (error instanceof Error) { + throw new Error(`Failed to set ${key}: ${error.message}`); + } + throw error; + } + } + + async delete(key: string): Promise { + if (!key) { + throw new Error("Key is required"); + } + + await this.loadData(); + delete this.data[key]; + await this.saveData(); + } + + async getRedirectUri(): Promise { + try { + this.callbackServer = new CallbackServer(); + return await this.callbackServer.listen(); + } catch (error: unknown) { + if (error instanceof Error) { + throw new Error(`Failed to start callback server: ${error.message}`); + } + throw error; + } + } + + async waitForCallback(): Promise { + if (!this.callbackServer) { + throw new Error("Callback server not initialized"); + } + return await this.callbackServer.waitForCallback(); + } + + openLink(url: string): void { + if (!url) { + throw new Error("URL is required"); + } + + console.log(`\n\t Open url to authorize session: ${url}`); + } +} diff --git a/packages/controller/src/node/index.ts b/packages/controller/src/node/index.ts new file mode 100644 index 000000000..29d06e08c --- /dev/null +++ b/packages/controller/src/node/index.ts @@ -0,0 +1,4 @@ +export { default } from "./provider"; +export * from "./provider"; +export * from "../errors"; +export * from "../types"; diff --git a/packages/controller/src/node/provider.ts b/packages/controller/src/node/provider.ts new file mode 100644 index 000000000..485b35f46 --- /dev/null +++ b/packages/controller/src/node/provider.ts @@ -0,0 +1,178 @@ +import { ec, stark, WalletAccount } from "starknet"; +import { SessionPolicies } from "@cartridge/presets"; +import { AddStarknetChainParameters } from "@starknet-io/types-js"; + +import SessionAccount from "./account"; +import { KEYCHAIN_URL } from "../constants"; +import BaseProvider from "../provider"; +import { toWasmPolicies } from "../utils"; +import { ParsedSessionPolicies } from "../policies"; +import { NodeBackend } from "./backend"; + +export type SessionOptions = { + rpc: string; + chainId: string; + policies: SessionPolicies; + basePath: string; + keychainUrl?: string; +}; + +export default class SessionProvider extends BaseProvider { + public id = "controller_session"; + public name = "Controller Session"; + + protected _chainId: string; + protected _rpcUrl: string; + protected _username?: string; + protected _policies: ParsedSessionPolicies; + protected _keychainUrl: string; + protected _backend: NodeBackend; + + constructor({ + rpc, + chainId, + policies, + basePath, + keychainUrl, + }: SessionOptions) { + super(); + + this._policies = { + verified: false, + contracts: policies.contracts + ? Object.fromEntries( + Object.entries(policies.contracts).map(([address, contract]) => [ + address, + { + ...contract, + methods: contract.methods.map((method) => ({ + ...method, + authorized: true, + })), + }, + ]), + ) + : undefined, + messages: policies.messages?.map((message) => ({ + ...message, + authorized: true, + })), + }; + + this._rpcUrl = rpc; + this._chainId = chainId; + this._keychainUrl = keychainUrl || KEYCHAIN_URL; + this._backend = new NodeBackend(basePath); + } + + async username() { + const sessionStr = await this._backend.get("session"); + if (sessionStr) { + const session = JSON.parse(sessionStr); + return session.username; + } + return undefined; + } + + async probe(): Promise { + if (this.account) { + return this.account; + } + + const [sessionStr, signerStr] = await Promise.all([ + this._backend.get("session"), + this._backend.get("signer"), + ]); + + if (!sessionStr || !signerStr) { + return undefined; + } + + const session = JSON.parse(sessionStr); + const signer = JSON.parse(signerStr); + + // Check expiration + const expirationTime = parseInt(session.expiresAt) * 1000; + if (Date.now() >= expirationTime) { + await this.disconnect(); + return undefined; + } + + this._username = session.username; + this.account = new SessionAccount(this, { + rpcUrl: this._rpcUrl, + privateKey: signer.privKey, + address: session.address, + ownerGuid: session.ownerGuid, + chainId: this._chainId, + expiresAt: parseInt(session.expiresAt), + policies: toWasmPolicies(this._policies), + }); + + return this.account; + } + + async connect(): Promise { + if (this.account) { + return this.account; + } + + const account = await this.probe(); + if (account) { + return account; + } + + const pk = stark.randomAddress(); + const publicKey = ec.starkCurve.getStarkKey(pk); + + await this._backend.set( + "signer", + JSON.stringify({ + privKey: pk, + pubKey: publicKey, + }), + ); + + // Get redirect URI from local server + const redirectUri = await this._backend.getRedirectUri(); + + const url = `${ + this._keychainUrl + }/session?public_key=${encodeURIComponent(publicKey)}&redirect_uri=${encodeURIComponent( + redirectUri, + )}&redirect_query_name=startapp&policies=${encodeURIComponent( + JSON.stringify(this._policies), + )}&rpc_url=${encodeURIComponent(this._rpcUrl)}`; + + this._backend.openLink(url); + + // Wait for callback with session data + const sessionData = await this._backend.waitForCallback(); + if (sessionData) { + const sessionRegistration = JSON.parse(atob(sessionData)); + // Ensure addresses are properly formatted + sessionRegistration.address = sessionRegistration.address.toLowerCase(); + sessionRegistration.ownerGuid = + sessionRegistration.ownerGuid.toLowerCase(); + await this._backend.set("session", JSON.stringify(sessionRegistration)); + return this.probe(); + } + + return undefined; + } + + async disconnect(): Promise { + await this._backend.delete("signer"); + await this._backend.delete("session"); + this.account = undefined; + this._username = undefined; + } + + switchStarknetChain(_chainId: string): Promise { + throw new Error("switchStarknetChain not implemented"); + } + + addStarknetChain(_chain: AddStarknetChainParameters): Promise { + throw new Error("addStarknetChain not implemented"); + } +} diff --git a/packages/controller/src/node/server.ts b/packages/controller/src/node/server.ts new file mode 100644 index 000000000..7caf64abd --- /dev/null +++ b/packages/controller/src/node/server.ts @@ -0,0 +1,89 @@ +import * as http from "http"; +import { AddressInfo } from "net"; + +type ServerResponse = http.ServerResponse & { + req: http.IncomingMessage; +}; + +export class CallbackServer { + private server: http.Server; + private resolveCallback?: (data: string) => void; + private rejectCallback?: (error: Error) => void; + private timeoutId?: NodeJS.Timeout; + + constructor() { + this.server = http.createServer(this.handleRequest.bind(this)); + + // Handle server errors + this.server.on("error", (error) => { + console.error("Server error:", error); + if (this.rejectCallback) { + this.rejectCallback(error); + } + }); + } + + private cleanup() { + if (this.timeoutId) { + clearTimeout(this.timeoutId); + } + this.server.close(); + } + + private handleRequest(req: http.IncomingMessage, res: ServerResponse) { + if (!req.url?.startsWith("/callback")) { + res.writeHead(404); + res.end(); + return; + } + + const params = new URLSearchParams(req.url.split("?")[1]); + const session = params.get("startapp"); + + if (!session) { + console.warn("Received callback without session data"); + res.writeHead(400); + res.end("Missing session data"); + return; + } + + if (this.resolveCallback) { + this.resolveCallback(session); + } + + res.writeHead(200, { "Content-Type": "text/html" }); + res.end( + "Session registered successfully. You can close this window.", + ); + + this.cleanup(); + } + + async listen(): Promise { + return new Promise((resolve, reject) => { + this.server.listen(0, "localhost", () => { + const address = this.server.address() as AddressInfo; + const url = `http://localhost:${address.port}/callback`; + resolve(url); + }); + + this.server.on("error", reject); + }); + } + + async waitForCallback(): Promise { + return new Promise((resolve, reject) => { + this.resolveCallback = resolve; + this.rejectCallback = reject; + + this.timeoutId = setTimeout( + () => { + console.warn("Callback timeout reached"); + reject(new Error("Callback timeout after 5 minutes")); + this.cleanup(); + }, + 5 * 60 * 1000, + ); + }); + } +} diff --git a/packages/controller/src/session/account.ts b/packages/controller/src/session/account.ts index 092ca60a3..c7041f037 100644 --- a/packages/controller/src/session/account.ts +++ b/packages/controller/src/session/account.ts @@ -34,7 +34,7 @@ export default class SessionAccount extends WalletAccount { super({ nodeUrl: rpcUrl }, provider); this.address = address; - this.controller = CartridgeSessionAccount.new_as_registered( + this.controller = CartridgeSessionAccount.newAsRegistered( rpcUrl, privateKey, address, diff --git a/packages/controller/tsconfig.json b/packages/controller/tsconfig.json index 38471eb8a..953633f2a 100644 --- a/packages/controller/tsconfig.json +++ b/packages/controller/tsconfig.json @@ -7,5 +7,6 @@ "composite": false, "incremental": false }, - "include": ["src/**/*", "package.json"] + "include": ["src/**/*"], + "exclude": ["node_modules", "dist", "**/*.test.ts"] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 309aa63f4..804d156d7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -248,6 +248,28 @@ importers: specifier: 'catalog:' version: 5.7.3 + examples/node: + dependencies: + '@cartridge/account-wasm': + specifier: workspace:* + version: link:../../packages/account-wasm + '@cartridge/controller': + specifier: workspace:* + version: link:../../packages/controller + starknet: + specifier: 'catalog:' + version: 6.21.0 + devDependencies: + '@types/node': + specifier: ^22.12.0 + version: 22.12.0 + tsx: + specifier: ^4.7.0 + version: 4.19.2 + typescript: + specifier: ^5.3.3 + version: 5.7.3 + examples/svelte: dependencies: '@cartridge/controller': @@ -265,13 +287,13 @@ importers: version: 9.18.0 '@sveltejs/adapter-auto': specifier: ^4.0.0 - version: 4.0.0(@sveltejs/kit@2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))) + version: 4.0.0(@sveltejs/kit@2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))) '@sveltejs/kit': specifier: ^2.16.1 - version: 2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) '@sveltejs/vite-plugin-svelte': specifier: ^5.0.3 - version: 5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) '@types/eslint': specifier: ^9.6.0 version: 9.6.1 @@ -283,7 +305,7 @@ importers: version: 9.1.0(eslint@9.18.0(jiti@1.21.7)) eslint-plugin-svelte: specifier: ^2.36.0 - version: 2.46.1(eslint@9.18.0(jiti@1.21.7))(svelte@5.19.2)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) + version: 2.46.1(eslint@9.18.0(jiti@1.21.7))(svelte@5.19.2)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) globals: specifier: 'catalog:' version: 15.14.0 @@ -307,25 +329,16 @@ importers: version: 8.20.0(eslint@9.18.0(jiti@1.21.7))(typescript@5.7.3) vite: specifier: 'catalog:' - version: 6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) vite-plugin-top-level-await: specifier: 'catalog:' - version: 1.4.4(@swc/helpers@0.5.15)(rollup@4.30.1)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 1.4.4(@swc/helpers@0.5.15)(rollup@4.30.1)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) vite-plugin-wasm: specifier: 'catalog:' - version: 3.4.1(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 3.4.1(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) packages/account-wasm: devDependencies: - '@cartridge/tsconfig': - specifier: workspace:* - version: link:../tsconfig - tsup: - specifier: 'catalog:' - version: 8.3.5(@swc/core@1.10.7(@swc/helpers@0.5.15))(jiti@1.21.7)(postcss@8.5.1)(tsx@4.19.2)(typescript@5.7.3)(yaml@2.7.0) - typescript: - specifier: 'catalog:' - version: 5.7.3 wasm-pack: specifier: ^0.13.0 version: 0.13.1 @@ -375,6 +388,9 @@ importers: fast-deep-equal: specifier: 'catalog:' version: 3.1.3 + open: + specifier: ^10.1.0 + version: 10.1.0 starknet: specifier: 'catalog:' version: 6.21.0 @@ -390,7 +406,7 @@ importers: version: 20.17.14 jest: specifier: ^29.7.0 - version: 29.7.0(@types/node@20.17.14)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) + version: 29.7.0(@types/node@20.17.14)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) prettier: specifier: 'catalog:' version: 3.4.2 @@ -879,7 +895,7 @@ importers: version: 2.6.0 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3))) + version: 1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3))) vaul: specifier: ^0.9.0 version: 0.9.9(@types/react-dom@19.0.3(@types/react@19.0.7))(@types/react@19.0.7)(react-dom@19.0.0(react@19.0.0))(react@19.0.0) @@ -907,13 +923,13 @@ importers: version: 8.5.0(@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.0(prettier@3.4.2))(typescript@5.7.3) '@storybook/react-vite': specifier: 'catalog:' - version: 8.5.0(@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(rollup@4.30.1)(storybook@8.5.0(prettier@3.4.2))(typescript@5.7.3)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 8.5.0(@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(rollup@4.30.1)(storybook@8.5.0(prettier@3.4.2))(typescript@5.7.3)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) '@storybook/test': specifier: 'catalog:' version: 8.5.0(storybook@8.5.0(prettier@3.4.2)) '@storybook/test-runner': specifier: 'catalog:' - version: 0.21.0(@swc/helpers@0.5.15)(@types/node@20.17.14)(babel-plugin-macros@3.1.0)(storybook@8.5.0(prettier@3.4.2))(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) + version: 0.21.0(@swc/helpers@0.5.15)(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(storybook@8.5.0(prettier@3.4.2))(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) '@storybook/theming': specifier: 'catalog:' version: 8.5.0(storybook@8.5.0(prettier@3.4.2)) @@ -928,7 +944,7 @@ importers: version: 19.0.3(@types/react@19.0.7) '@vitejs/plugin-react-swc': specifier: 'catalog:' - version: 3.7.2(@swc/helpers@0.5.15)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + version: 3.7.2(@swc/helpers@0.5.15)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) autoprefixer: specifier: 'catalog:' version: 10.4.20(postcss@8.5.1) @@ -940,7 +956,7 @@ importers: version: 14.1.1 jest-image-snapshot: specifier: 'catalog:' - version: 6.4.0(jest@29.7.0(@types/node@20.17.14)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3))) + version: 6.4.0(jest@29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3))) playwright: specifier: 'catalog:' version: 1.49.1 @@ -961,7 +977,7 @@ importers: version: 8.5.0(prettier@3.4.2) tailwindcss: specifier: 'catalog:' - version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) + version: 3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) tsc-alias: specifier: ^1.8.10 version: 1.8.10 @@ -970,7 +986,7 @@ importers: version: 5.7.3 vite: specifier: 'catalog:' - version: 6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + version: 6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) packages/utils: dependencies: @@ -4018,6 +4034,9 @@ packages: '@types/node@20.17.14': resolution: {integrity: sha512-w6qdYetNL5KRBiSClK/KWai+2IMEJuAj+EujKCumalFOwXtvOXaEan9AuwcRID2IcOIAWSIfR495hBtgKlx2zg==} + '@types/node@22.12.0': + resolution: {integrity: sha512-Fll2FZ1riMjNmlmJOdAyY5pUbkftXslB5DgEzlIuNaiWhXd00FhWxVC/r4yV/4wBb9JfImTu+jiSvXTkJ7F/gA==} + '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} @@ -4831,6 +4850,10 @@ packages: builtin-status-codes@3.0.0: resolution: {integrity: sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + bundle-require@5.1.0: resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -5323,6 +5346,14 @@ packages: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} + default-browser-id@5.0.0: + resolution: {integrity: sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==} + engines: {node: '>=18'} + + default-browser@5.2.1: + resolution: {integrity: sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==} + engines: {node: '>=18'} + default-require-extensions@3.0.1: resolution: {integrity: sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==} engines: {node: '>=8'} @@ -5338,6 +5369,10 @@ packages: resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} engines: {node: '>=8'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + define-properties@1.2.1: resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} engines: {node: '>= 0.4'} @@ -6628,6 +6663,11 @@ packages: engines: {node: '>=8'} hasBin: true + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -6652,6 +6692,11 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-interactive@1.0.0: resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} engines: {node: '>=8'} @@ -6755,6 +6800,10 @@ packages: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} + is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + isarray@0.0.1: resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} @@ -7655,6 +7704,10 @@ packages: resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} engines: {node: '>=6'} + open@10.1.0: + resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==} + engines: {node: '>=18'} + open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -8464,6 +8517,10 @@ packages: rrweb-cssom@0.8.0: resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==} + run-applescript@7.0.0: + resolution: {integrity: sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==} + engines: {node: '>=18'} + run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -9316,6 +9373,9 @@ packages: undici-types@6.19.8: resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} + undici-types@6.20.0: + resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} + undici@5.28.4: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} @@ -11566,7 +11626,7 @@ snapshots: '@jest/console@29.7.0': dependencies: '@jest/types': 29.6.3 - '@types/node': 20.17.14 + '@types/node': 22.12.0 chalk: 4.1.2 jest-message-util: 29.7.0 jest-util: 29.7.0 @@ -11579,14 +11639,84 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.14 + '@types/node': 22.12.0 ansi-escapes: 4.3.2 chalk: 4.1.2 ci-info: 3.9.0 exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@20.17.14)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) + jest-config: 29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/core@29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.12.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.8 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/core@29.7.0(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 22.12.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@22.12.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -11615,7 +11745,7 @@ snapshots: dependencies: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.14 + '@types/node': 22.12.0 jest-mock: 29.7.0 '@jest/expect-utils@29.7.0': @@ -11633,7 +11763,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@sinonjs/fake-timers': 10.3.0 - '@types/node': 20.17.14 + '@types/node': 22.12.0 jest-message-util: 29.7.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -11655,7 +11785,7 @@ snapshots: '@jest/transform': 29.7.0 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 20.17.14 + '@types/node': 22.12.0 chalk: 4.1.2 collect-v8-coverage: 1.0.2 exit: 0.1.2 @@ -11725,7 +11855,7 @@ snapshots: '@jest/schemas': 29.6.3 '@types/istanbul-lib-coverage': 2.0.6 '@types/istanbul-reports': 3.0.4 - '@types/node': 20.17.14 + '@types/node': 22.12.0 '@types/yargs': 17.0.33 chalk: 4.1.2 @@ -11737,6 +11867,14 @@ snapshots: optionalDependencies: typescript: 5.7.3 + '@joshwooding/vite-plugin-react-docgen-typescript@0.4.2(typescript@5.7.3)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + dependencies: + magic-string: 0.27.0 + react-docgen-typescript: 2.2.2(typescript@5.7.3) + vite: 6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + optionalDependencies: + typescript: 5.7.3 + '@jridgewell/gen-mapping@0.3.8': dependencies: '@jridgewell/set-array': 1.2.1 @@ -13019,6 +13157,14 @@ snapshots: ts-dedent: 2.2.0 vite: 6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + '@storybook/builder-vite@8.5.0(storybook@8.5.0(prettier@3.4.2))(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + dependencies: + '@storybook/csf-plugin': 8.5.0(storybook@8.5.0(prettier@3.4.2)) + browser-assert: 1.2.1 + storybook: 8.5.0(prettier@3.4.2) + ts-dedent: 2.2.0 + vite: 6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + '@storybook/components@8.5.0(storybook@8.5.0(prettier@3.4.2))': dependencies: storybook: 8.5.0(prettier@3.4.2) @@ -13116,6 +13262,28 @@ snapshots: - supports-color - typescript + '@storybook/react-vite@8.5.0(@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(rollup@4.30.1)(storybook@8.5.0(prettier@3.4.2))(typescript@5.7.3)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + dependencies: + '@joshwooding/vite-plugin-react-docgen-typescript': 0.4.2(typescript@5.7.3)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@rollup/pluginutils': 5.1.4(rollup@4.30.1) + '@storybook/builder-vite': 8.5.0(storybook@8.5.0(prettier@3.4.2))(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@storybook/react': 8.5.0(@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.0(prettier@3.4.2))(typescript@5.7.3) + find-up: 5.0.0 + magic-string: 0.30.17 + react: 19.0.0 + react-docgen: 7.1.0 + react-dom: 19.0.0(react@19.0.0) + resolve: 1.22.10 + storybook: 8.5.0(prettier@3.4.2) + tsconfig-paths: 4.2.0 + vite: 6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + optionalDependencies: + '@storybook/test': 8.5.0(storybook@8.5.0(prettier@3.4.2)) + transitivePeerDependencies: + - rollup + - supports-color + - typescript + '@storybook/react@8.5.0(@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@19.0.0(react@19.0.0))(react@19.0.0)(storybook@8.5.0(prettier@3.4.2))(typescript@5.7.3)': dependencies: '@storybook/components': 8.5.0(storybook@8.5.0(prettier@3.4.2)) @@ -13162,6 +13330,37 @@ snapshots: - supports-color - ts-node + '@storybook/test-runner@0.21.0(@swc/helpers@0.5.15)(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(storybook@8.5.0(prettier@3.4.2))(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3))': + dependencies: + '@babel/core': 7.26.0 + '@babel/generator': 7.26.5 + '@babel/template': 7.25.9 + '@babel/types': 7.26.5 + '@jest/types': 29.6.3 + '@storybook/csf': 0.1.13 + '@swc/core': 1.10.7(@swc/helpers@0.5.15) + '@swc/jest': 0.2.37(@swc/core@1.10.7(@swc/helpers@0.5.15)) + expect-playwright: 0.8.0 + jest: 29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-junit: 16.0.0 + jest-playwright-preset: 4.0.0(jest-circus@29.7.0(babel-plugin-macros@3.1.0))(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3))) + jest-runner: 29.7.0 + jest-serializer-html: 7.1.0 + jest-watch-typeahead: 2.2.2(jest@29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3))) + nyc: 15.1.0 + playwright: 1.49.1 + storybook: 8.5.0(prettier@3.4.2) + transitivePeerDependencies: + - '@swc/helpers' + - '@types/node' + - babel-plugin-macros + - debug + - node-notifier + - supports-color + - ts-node + '@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2))': dependencies: '@storybook/csf': 0.1.12 @@ -13187,14 +13386,14 @@ snapshots: '@stripe/stripe-js@4.10.0': {} - '@sveltejs/adapter-auto@4.0.0(@sveltejs/kit@2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))': + '@sveltejs/adapter-auto@4.0.0(@sveltejs/kit@2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))': dependencies: - '@sveltejs/kit': 2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@sveltejs/kit': 2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) import-meta-resolve: 4.1.0 - '@sveltejs/kit@2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@sveltejs/kit@2.16.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.1.1 @@ -13207,27 +13406,27 @@ snapshots: set-cookie-parser: 2.7.1 sirv: 3.0.0 svelte: 5.19.2 - vite: 6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) debug: 4.4.0 svelte: 5.19.2 - vite: 6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.2)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)))(svelte@5.19.2)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 svelte: 5.19.2 - vite: 6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) - vitefu: 1.0.5(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) + vite: 6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vitefu: 1.0.5(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)) transitivePeerDependencies: - supports-color @@ -13460,7 +13659,7 @@ snapshots: '@types/graceful-fs@4.1.9': dependencies: - '@types/node': 20.17.14 + '@types/node': 22.12.0 '@types/istanbul-lib-coverage@2.0.6': {} @@ -13505,11 +13704,15 @@ snapshots: dependencies: undici-types: 6.19.8 + '@types/node@22.12.0': + dependencies: + undici-types: 6.20.0 + '@types/parse-json@4.0.2': {} '@types/pixelmatch@5.2.6': dependencies: - '@types/node': 20.17.14 + '@types/node': 22.12.0 '@types/react-dom@18.3.5(@types/react@19.0.7)': dependencies: @@ -13533,11 +13736,11 @@ snapshots: '@types/wait-on@5.3.4': dependencies: - '@types/node': 20.17.14 + '@types/node': 22.12.0 '@types/ws@8.5.13': dependencies: - '@types/node': 20.17.14 + '@types/node': 22.12.0 '@types/yargs-parser@21.0.3': {} @@ -13776,6 +13979,13 @@ snapshots: transitivePeerDependencies: - '@swc/helpers' + '@vitejs/plugin-react-swc@3.7.2(@swc/helpers@0.5.15)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0))': + dependencies: + '@swc/core': 1.10.7(@swc/helpers@0.5.15) + vite: 6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + transitivePeerDependencies: + - '@swc/helpers' + '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@edge-runtime/vm@3.2.0)(@types/node@20.17.14)(jsdom@25.0.1)(terser@5.37.0))': dependencies: '@ampproject/remapping': 2.3.0 @@ -14953,6 +15163,10 @@ snapshots: builtin-status-codes@3.0.0: {} + bundle-name@4.1.0: + dependencies: + run-applescript: 7.0.0 + bundle-require@5.1.0(esbuild@0.24.2): dependencies: esbuild: 0.24.2 @@ -15361,6 +15575,36 @@ snapshots: - supports-color - ts-node + create-jest@29.7.0(@types/node@20.17.14)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.17.14)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-jest@29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + create-require@1.1.1: {} cross-fetch@3.2.0: @@ -15492,6 +15736,13 @@ snapshots: deepmerge@4.3.1: {} + default-browser-id@5.0.0: {} + + default-browser@5.2.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.0 + default-require-extensions@3.0.1: dependencies: strip-bom: 4.0.0 @@ -15508,6 +15759,8 @@ snapshots: define-lazy-prop@2.0.0: {} + define-lazy-prop@3.0.0: {} + define-properties@1.2.1: dependencies: define-data-property: 1.1.4 @@ -16149,7 +16402,7 @@ snapshots: - supports-color - typescript - eslint-plugin-svelte@2.46.1(eslint@9.18.0(jiti@1.21.7))(svelte@5.19.2)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)): + eslint-plugin-svelte@2.46.1(eslint@9.18.0(jiti@1.21.7))(svelte@5.19.2)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.18.0(jiti@1.21.7)) '@jridgewell/sourcemap-codec': 1.5.0 @@ -16158,7 +16411,7 @@ snapshots: esutils: 2.0.3 known-css-properties: 0.35.0 postcss: 8.5.1 - postcss-load-config: 3.1.4(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) + postcss-load-config: 3.1.4(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) postcss-safe-parser: 6.0.0(postcss@8.5.1) postcss-selector-parser: 6.1.2 semver: 7.6.3 @@ -17095,6 +17348,8 @@ snapshots: is-docker@2.2.1: {} + is-docker@3.0.0: {} + is-extglob@2.1.1: {} is-finalizationregistry@1.1.1: @@ -17116,6 +17371,10 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-interactive@1.0.0: {} is-lower-case@2.0.2: @@ -17211,6 +17470,10 @@ snapshots: dependencies: is-docker: 2.2.1 + is-wsl@3.1.0: + dependencies: + is-inside-container: 1.0.0 + isarray@0.0.1: {} isarray@1.0.0: {} @@ -17356,7 +17619,7 @@ snapshots: '@jest/expect': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.14 + '@types/node': 22.12.0 chalk: 4.1.2 co: 4.6.0 dedent: 1.5.3(babel-plugin-macros@3.1.0) @@ -17395,28 +17658,66 @@ snapshots: - supports-color - ts-node - jest-config@29.7.0(@types/node@20.17.14)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)): + jest-cli@29.7.0(@types/node@20.17.14)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)): dependencies: - '@babel/core': 7.26.0 - '@jest/test-sequencer': 29.7.0 + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) + '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.0) chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0(babel-plugin-macros@3.1.0) - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 + create-jest: 29.7.0(@types/node@20.17.14)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@20.17.14)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) jest-util: 29.7.0 jest-validate: 29.7.0 - micromatch: 4.0.8 - parse-json: 5.2.0 - pretty-format: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-cli@29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) + exit: 0.1.2 + import-local: 3.2.0 + jest-config: 29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@20.17.14)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)): + dependencies: + '@babel/core': 7.26.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 optionalDependencies: @@ -17426,6 +17727,130 @@ snapshots: - babel-plugin-macros - supports-color + jest-config@29.7.0(@types/node@20.17.14)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)): + dependencies: + '@babel/core': 7.26.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.17.14 + ts-node: 10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)): + dependencies: + '@babel/core': 7.26.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.12.0 + ts-node: 10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)): + dependencies: + '@babel/core': 7.26.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.12.0 + ts-node: 10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-config@29.7.0(@types/node@22.12.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)): + dependencies: + '@babel/core': 7.26.0 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.26.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.8 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 22.12.0 + ts-node: 10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + jest-diff@29.7.0: dependencies: chalk: 4.1.2 @@ -17450,7 +17875,7 @@ snapshots: '@jest/environment': 29.7.0 '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.14 + '@types/node': 22.12.0 jest-mock: 29.7.0 jest-util: 29.7.0 @@ -17460,7 +17885,7 @@ snapshots: dependencies: '@jest/types': 29.6.3 '@types/graceful-fs': 4.1.9 - '@types/node': 20.17.14 + '@types/node': 22.12.0 anymatch: 3.1.3 fb-watchman: 2.0.2 graceful-fs: 4.2.11 @@ -17485,6 +17910,19 @@ snapshots: optionalDependencies: jest: 29.7.0(@types/node@20.17.14)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) + jest-image-snapshot@6.4.0(jest@29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3))): + dependencies: + chalk: 4.1.2 + get-stdin: 5.0.1 + glur: 1.1.2 + lodash: 4.17.21 + pixelmatch: 5.3.0 + pngjs: 3.4.0 + rimraf: 2.7.1 + ssim.js: 3.5.0 + optionalDependencies: + jest: 29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) + jest-junit@16.0.0: dependencies: mkdirp: 1.0.4 @@ -17519,7 +17957,7 @@ snapshots: jest-mock@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.17.14 + '@types/node': 22.12.0 jest-util: 29.7.0 jest-playwright-preset@4.0.0(jest-circus@29.7.0(babel-plugin-macros@3.1.0))(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@20.17.14)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3))): @@ -17538,6 +17976,22 @@ snapshots: - debug - supports-color + jest-playwright-preset@4.0.0(jest-circus@29.7.0(babel-plugin-macros@3.1.0))(jest-environment-node@29.7.0)(jest-runner@29.7.0)(jest@29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3))): + dependencies: + expect-playwright: 0.8.0 + jest: 29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) + jest-circus: 29.7.0(babel-plugin-macros@3.1.0) + jest-environment-node: 29.7.0 + jest-process-manager: 0.4.0 + jest-runner: 29.7.0 + nyc: 15.1.0 + playwright-core: 1.49.1 + rimraf: 3.0.2 + uuid: 8.3.2 + transitivePeerDependencies: + - debug + - supports-color + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): optionalDependencies: jest-resolve: 29.7.0 @@ -17586,7 +18040,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.14 + '@types/node': 22.12.0 chalk: 4.1.2 emittery: 0.13.1 graceful-fs: 4.2.11 @@ -17614,7 +18068,7 @@ snapshots: '@jest/test-result': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.14 + '@types/node': 22.12.0 chalk: 4.1.2 cjs-module-lexer: 1.4.1 collect-v8-coverage: 1.0.2 @@ -17664,7 +18118,7 @@ snapshots: jest-util@29.7.0: dependencies: '@jest/types': 29.6.3 - '@types/node': 20.17.14 + '@types/node': 22.12.0 chalk: 4.1.2 ci-info: 3.9.0 graceful-fs: 4.2.11 @@ -17690,11 +18144,22 @@ snapshots: string-length: 5.0.1 strip-ansi: 7.1.0 + jest-watch-typeahead@2.2.2(jest@29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3))): + dependencies: + ansi-escapes: 6.2.1 + chalk: 5.4.1 + jest: 29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) + jest-regex-util: 29.6.3 + jest-watcher: 29.7.0 + slash: 5.1.0 + string-length: 5.0.1 + strip-ansi: 7.1.0 + jest-watcher@29.7.0: dependencies: '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 - '@types/node': 20.17.14 + '@types/node': 22.12.0 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.13.1 @@ -17703,7 +18168,7 @@ snapshots: jest-worker@29.7.0: dependencies: - '@types/node': 20.17.14 + '@types/node': 22.12.0 jest-util: 29.7.0 merge-stream: 2.0.0 supports-color: 8.1.1 @@ -17720,6 +18185,30 @@ snapshots: - supports-color - ts-node + jest@29.7.0(@types/node@20.17.14)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@20.17.14)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest@29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)): + dependencies: + '@jest/core': 29.7.0(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) + '@jest/types': 29.6.3 + import-local: 3.2.0 + jest-cli: 29.7.0(@types/node@22.12.0)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + jiti@1.17.1: {} jiti@1.21.7: {} @@ -18391,6 +18880,13 @@ snapshots: dependencies: mimic-fn: 2.1.0 + open@10.1.0: + dependencies: + default-browser: 5.2.1 + define-lazy-prop: 3.0.0 + is-inside-container: 1.0.0 + is-wsl: 3.1.0 + open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -18708,13 +19204,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.5.1 - postcss-load-config@3.1.4(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)): + postcss-load-config@3.1.4(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: postcss: 8.5.1 - ts-node: 10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3) + ts-node: 10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3) postcss-load-config@4.0.2(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)): dependencies: @@ -18724,6 +19220,14 @@ snapshots: postcss: 8.5.1 ts-node: 10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3) + postcss-load-config@4.0.2(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)): + dependencies: + lilconfig: 3.1.3 + yaml: 2.7.0 + optionalDependencies: + postcss: 8.5.1 + ts-node: 10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3) + postcss-load-config@6.0.1(jiti@1.21.7)(postcss@8.5.1)(tsx@4.19.2)(yaml@2.7.0): dependencies: lilconfig: 3.1.3 @@ -19207,6 +19711,8 @@ snapshots: rrweb-cssom@0.8.0: {} + run-applescript@7.0.0: {} + run-async@2.4.1: {} run-parallel@1.2.0: @@ -19771,9 +20277,9 @@ snapshots: tailwind-merge@2.6.0: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3))): dependencies: - tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) + tailwindcss: 3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)): dependencies: @@ -19802,6 +20308,33 @@ snapshots: transitivePeerDependencies: - ts-node + tailwindcss@3.4.17(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)): + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.3 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.7 + lilconfig: 3.1.3 + micromatch: 4.0.8 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.1.1 + postcss: 8.5.1 + postcss-import: 15.1.0(postcss@8.5.1) + postcss-js: 4.0.1(postcss@8.5.1) + postcss-load-config: 4.0.2(postcss@8.5.1)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3)) + postcss-nested: 6.2.0(postcss@8.5.1) + postcss-selector-parser: 6.1.2 + resolve: 1.22.10 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + tapable@2.2.1: {} tar@4.4.18: @@ -19946,7 +20479,7 @@ snapshots: bs-logger: 0.2.6 ejs: 3.1.10 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.17.14)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) + jest: 29.7.0(@types/node@20.17.14)(ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@20.17.14)(typescript@5.7.3)) jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 @@ -20009,6 +20542,27 @@ snapshots: optionalDependencies: '@swc/core': 1.10.7(@swc/helpers@0.5.15) + ts-node@10.9.2(@swc/core@1.10.7(@swc/helpers@0.5.15))(@types/node@22.12.0)(typescript@5.7.3): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 22.12.0 + acorn: 8.14.0 + acorn-walk: 8.3.4 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.7.3 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optionalDependencies: + '@swc/core': 1.10.7(@swc/helpers@0.5.15) + optional: true + ts-toolbelt@6.15.5: {} tsc-alias@1.8.10: @@ -20193,6 +20747,8 @@ snapshots: undici-types@6.19.8: {} + undici-types@6.20.0: {} + undici@5.28.4: dependencies: '@fastify/busboy': 2.1.1 @@ -20457,10 +21013,24 @@ snapshots: - '@swc/helpers' - rollup + vite-plugin-top-level-await@1.4.4(@swc/helpers@0.5.15)(rollup@4.30.1)(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + dependencies: + '@rollup/plugin-virtual': 3.0.2(rollup@4.30.1) + '@swc/core': 1.10.7(@swc/helpers@0.5.15) + uuid: 10.0.0 + vite: 6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + transitivePeerDependencies: + - '@swc/helpers' + - rollup + vite-plugin-wasm@3.4.1(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): dependencies: vite: 6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite-plugin-wasm@3.4.1(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + dependencies: + vite: 6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite-tsconfig-paths@5.1.4(typescript@5.7.3)(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): dependencies: debug: 4.4.0 @@ -20495,9 +21065,22 @@ snapshots: tsx: 4.19.2 yaml: 2.7.0 - vitefu@1.0.5(vite@6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): + vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0): + dependencies: + esbuild: 0.24.2 + postcss: 8.5.1 + rollup: 4.30.1 + optionalDependencies: + '@types/node': 22.12.0 + fsevents: 2.3.3 + jiti: 1.21.7 + terser: 5.37.0 + tsx: 4.19.2 + yaml: 2.7.0 + + vitefu@1.0.5(vite@6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0)): optionalDependencies: - vite: 6.0.7(@types/node@20.17.14)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) + vite: 6.0.7(@types/node@22.12.0)(jiti@1.21.7)(terser@5.37.0)(tsx@4.19.2)(yaml@2.7.0) vitest@2.1.8(@edge-runtime/vm@3.2.0)(@types/node@20.17.14)(jsdom@25.0.1)(terser@5.37.0): dependencies: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 5c7b3f6be..1b689c47c 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - examples/next + - examples/node - examples/svelte - packages/*