diff --git a/packages/nodejs/README.md b/packages/nodejs/README.md new file mode 100644 index 000000000..f24506693 --- /dev/null +++ b/packages/nodejs/README.md @@ -0,0 +1,7 @@ +# `@ocap/nodejs` + +For running Ocap Kernel experiments in a nodejs environment. + +## Contributing + +This package is part of a monorepo. Instructions for contributing can be found in the [monorepo README](https://github.com/MetaMask/ocap-kernel#readme). diff --git a/packages/nodejs/package.json b/packages/nodejs/package.json new file mode 100644 index 000000000..9d8dfad22 --- /dev/null +++ b/packages/nodejs/package.json @@ -0,0 +1,79 @@ +{ + "name": "@ocap/nodejs", + "version": "0.0.0", + "private": true, + "description": "For running Ocap Kernel experiments in a nodejs environment", + "repository": { + "type": "git", + "url": "https://github.com/MetaMask/ocap-kernel.git" + }, + "type": "module", + "files": [ + "dist/" + ], + "scripts": { + "build": "ts-bridge --project tsconfig.build.json --clean", + "changelog:validate": "../../scripts/validate-changelog.sh @ocap/nodejs", + "clean": "rimraf --glob ./dist './*.tsbuildinfo'", + "lint": "yarn lint:ts && yarn lint:eslint && yarn lint:misc --check && yarn constraints && yarn lint:dependencies", + "lint:dependencies": "depcheck", + "lint:eslint": "eslint . --cache", + "lint:fix": "yarn lint:ts && yarn lint:eslint --fix && yarn lint:misc --write && yarn constraints --fix && yarn lint:dependencies", + "lint:misc": "prettier --no-error-on-unmatched-pattern '**/*.json' '**/*.md' '**/*.html' '!**/CHANGELOG.old.md' '**/*.yml' '!.yarnrc.yml' '!merged-packages/**' --ignore-path ../../.gitignore", + "lint:ts": "tsc --project tsconfig.lint.json", + "publish:preview": "yarn npm publish --tag preview", + "start": "yarn build:vite:dev --watch", + "test": "yarn build && vitest", + "test:clean": "yarn test --no-cache --coverage.clean", + "test:dev": "yarn test --coverage false", + "test:verbose": "yarn test --reporter verbose" + }, + "dependencies": { + "@endo/eventual-send": "^1.2.6", + "@endo/exo": "^1.5.4", + "@endo/patterns": "^1.4.4", + "@endo/promise-kit": "^1.1.6", + "@metamask/snaps-utils": "^8.3.0", + "@metamask/utils": "^9.3.0", + "@ocap/errors": "workspace:^", + "@ocap/kernel": "workspace:^", + "@ocap/shims": "workspace:^", + "@ocap/streams": "workspace:^", + "@ocap/utils": "workspace:^", + "@sqlite.org/sqlite-wasm": "3.47.0-build1", + "ses": "^1.9.0" + }, + "devDependencies": { + "@arethetypeswrong/cli": "^0.16.4", + "@metamask/auto-changelog": "^3.4.4", + "@metamask/eslint-config": "^14.0.0", + "@metamask/eslint-config-nodejs": "^14.0.0", + "@metamask/eslint-config-typescript": "^14.0.0", + "@ocap/cli": "workspace:^", + "@ocap/test-utils": "workspace:^", + "@ts-bridge/cli": "^0.5.1", + "@types/chrome": "^0.0.268", + "@typescript-eslint/eslint-plugin": "^8.8.1", + "@typescript-eslint/parser": "^8.8.1", + "@typescript-eslint/utils": "^8.8.1", + "depcheck": "^1.4.7", + "eslint": "^9.12.0", + "eslint-config-prettier": "^9.1.0", + "eslint-import-resolver-typescript": "^3.6.3", + "eslint-plugin-import-x": "^4.3.1", + "eslint-plugin-jsdoc": "^50.3.1", + "eslint-plugin-n": "^17.11.1", + "eslint-plugin-prettier": "^5.2.1", + "eslint-plugin-promise": "^7.1.0", + "prettier": "^3.3.3", + "rimraf": "^6.0.1", + "typedoc": "^0.26.8", + "typescript": "~5.5.4", + "typescript-eslint": "^8.8.1", + "vite": "^5.3.5", + "vitest": "^2.1.2" + }, + "engines": { + "node": "^18.18 || >=20" + } +} diff --git a/packages/nodejs/src/kernel/VatWorkerService.ts b/packages/nodejs/src/kernel/VatWorkerService.ts new file mode 100644 index 000000000..16634fa43 --- /dev/null +++ b/packages/nodejs/src/kernel/VatWorkerService.ts @@ -0,0 +1,55 @@ +import type { VatWorkerService, VatId } from '@ocap/kernel'; +import { NodeWorkerMultiplexer } from '@ocap/streams'; +import type { StreamMultiplexer } from '@ocap/streams'; +import { makeLogger } from '@ocap/utils'; +import type { Logger } from '@ocap/utils'; +import { Worker as NodeWorker } from 'node:worker_threads'; + +// Worker file loads from the built dist directory, requires rebuild after change +// Note: Worker runs in same process and may be subject to spectre-style attacks +const workerFileURL = new URL('../../dist/vat/inside.mjs', import.meta.url) + .pathname; + +export class NodejsVatWorkerService implements VatWorkerService { + // eslint-disable-next-line no-unused-private-class-members + readonly #logger: Logger; + + workers = new Map< + VatId, + { worker: NodeWorker; multiplexer: StreamMultiplexer } + >(); + + /** + * The vat worker service, intended to be constructed in + * the kernel worker. + * + * @param logger - An optional {@link Logger}. Defaults to a new logger labeled '[vat worker client]'. + */ + constructor(logger?: Logger) { + this.#logger = logger ?? makeLogger('[vat worker service]'); + } + + async launch(vatId: VatId): Promise { + const worker = new NodeWorker(workerFileURL); + const multiplexer = new NodeWorkerMultiplexer(worker); + this.workers.set(vatId, { worker, multiplexer }); + return multiplexer; + } + + async terminate(vatId: VatId): Promise { + const workerEntry = this.workers.get(vatId); + assert(workerEntry, `No worker found for vatId ${vatId}`); + const { worker, multiplexer } = workerEntry; + await multiplexer.return(); + await worker.terminate(); + this.workers.delete(vatId); + return undefined; + } + + async terminateAll(): Promise { + for (const vatId of this.workers.keys()) { + await this.terminate(vatId); + } + } +} +harden(NodejsVatWorkerService); diff --git a/packages/nodejs/src/kernel/env.ts b/packages/nodejs/src/kernel/env.ts new file mode 100644 index 000000000..43719ed2e --- /dev/null +++ b/packages/nodejs/src/kernel/env.ts @@ -0,0 +1,58 @@ +import '@ocap/shims/endoify'; +import fs from 'fs'; + +// +// these modificiations are used by the "@sqlite.org/sqlite-wasm" package +// + +/** + * + * @param uri - file:// URI + * @param mimeType - MIME type, default is 'text/plain' + * @returns - fetch response + */ +async function fetchFile( + uri: string, + mimeType: string = 'text/plain', + // eslint-disable-next-line n/no-unsupported-features/node-builtins +): Promise { + if (uri.startsWith('file://')) { + try { + const path = new URL(uri).pathname; + const data = await fs.promises.readFile(path); + // eslint-disable-next-line n/no-unsupported-features/node-builtins + return new Response(data, { + status: 200, + statusText: 'OK', + headers: { 'Content-Type': mimeType }, + }); + } catch (error) { + console.error('Error reading file:', error); + // eslint-disable-next-line n/no-unsupported-features/node-builtins + return new Response(null, { status: 404, statusText: 'File Not Found' }); + } + } + // eslint-disable-next-line n/no-unsupported-features/node-builtins + return new Response(null, { + status: 500, + statusText: 'Only file:// supported', + }); +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +(globalThis as any).self = globalThis; + +const globalFetch = globalThis.fetch; +const wrappedFetchForSqliteWasm = async ( + url: string, + options: RequestInit = {}, + // eslint-disable-next-line n/no-unsupported-features/node-builtins +): Promise => { + if (url.endsWith('@sqlite.org/sqlite-wasm/sqlite-wasm/jswasm/sqlite3.wasm')) { + return fetchFile(url, 'application/wasm'); + } + console.log(`fetching ${url}`); + return globalFetch(url, options); +}; +// eslint-disable-next-line @typescript-eslint/no-explicit-any +(globalThis as any).fetch = wrappedFetchForSqliteWasm; diff --git a/packages/nodejs/src/kernel/kernel-worker.test.ts b/packages/nodejs/src/kernel/kernel-worker.test.ts new file mode 100644 index 000000000..7d53dd3e6 --- /dev/null +++ b/packages/nodejs/src/kernel/kernel-worker.test.ts @@ -0,0 +1,29 @@ +import { MessageChannel as NodeMessageChannel } from 'node:worker_threads'; +import { describe, it, expect } from 'vitest'; + +import { makeKernel, runVatLifecycle } from './kernel-worker.js'; + +describe('Kernel Worker', () => { + it('should handle the lifecycle of multiple vats', async () => { + const kernelChannel = new NodeMessageChannel(); + const { port1: kernelPort } = kernelChannel; + console.log('Creating kernel...'); + const kernel = await makeKernel(kernelPort); + console.log('Kernel created.'); + + console.log('Handling the lifecycle of multiple vats...'); + await runVatLifecycle(kernel, ['v1', 'v2', 'v3']); + console.log('Lifecycle of multiple vats handled.'); + + // console.log('Adding default vat...'); + // await kernel.launchVat({ id: 'v0' }); + // console.log('Default vat added.'); + + // console.log('Shutting down the default vat...'); + // await kernel.terminateVat('v0'); + // console.log('Default vat shut down.'); + + console.log('Test passed.'); + expect(true).toBe(true); + }); +}); diff --git a/packages/nodejs/src/kernel/kernel-worker.ts b/packages/nodejs/src/kernel/kernel-worker.ts new file mode 100644 index 000000000..ee87a5ddb --- /dev/null +++ b/packages/nodejs/src/kernel/kernel-worker.ts @@ -0,0 +1,79 @@ +import './env.js'; +import type { NonEmptyArray } from '@metamask/utils'; +import type { KernelCommand, KernelCommandReply, VatId } from '@ocap/kernel'; +import { Kernel, VatCommandMethod } from '@ocap/kernel'; +import { NodeWorkerDuplexStream } from '@ocap/streams'; +import { MessagePort as NodeMessagePort } from 'worker_threads'; + +import { makeSQLKVStore } from './sqlite-kv-store.js'; +import { NodejsVatWorkerService } from './VatWorkerService.js'; + +/** + * The main function for the kernel worker. + * + * @param port - The kernel's end of a node:worker_threads MessageChannel + * @returns The kernel, initialized. + */ +export async function makeKernel(port: NodeMessagePort): Promise { + const nodeStream = new NodeWorkerDuplexStream< + KernelCommand, + KernelCommandReply + >(port); + const vatWorkerClient = new NodejsVatWorkerService(); + + // Initialize kernel store. + const kvStore = await makeSQLKVStore(); + + // Create and start kernel. + const kernel = new Kernel(nodeStream, vatWorkerClient, kvStore); + await kernel.init(); + + return kernel; +} + +/** + * Runs the full lifecycle of an array of vats, including their creation, + * restart, message passing, and termination. + * + * @param kernel The kernel instance. + * @param vats An array of VatIds to be managed. + */ +export async function runVatLifecycle( + kernel: Kernel, + vats: NonEmptyArray, +): Promise { + console.time(`Created vats: ${vats.join(', ')}`); + await Promise.all( + vats.map(async () => + kernel.launchVat({ + bundleName: 'sample-vat', + parameters: { name: 'Nodeen' }, + }), + ), + ); + console.timeEnd(`Created vats: ${vats.join(', ')}`); + + console.log('Kernel vats:', kernel.getVatIds().join(', ')); + + // Restart a randomly selected vat from the array. + const vatToRestart = vats[Math.floor(Math.random() * vats.length)] as VatId; + console.time(`Vat "${vatToRestart}" restart`); + await kernel.restartVat(vatToRestart); + console.timeEnd(`Vat "${vatToRestart}" restart`); + + // Send a "Ping" message to a randomly selected vat. + const vatToPing = vats[Math.floor(Math.random() * vats.length)] as VatId; + console.time(`Ping Vat "${vatToPing}"`); + await kernel.sendMessage(vatToPing, { + method: VatCommandMethod.ping, + params: null, + }); + console.timeEnd(`Ping Vat "${vatToPing}"`); + + const vatIds = kernel.getVatIds().join(', '); + console.time(`Terminated vats: ${vatIds}`); + await kernel.terminateAllVats(); + console.timeEnd(`Terminated vats: ${vatIds}`); + + console.log(`Kernel has ${kernel.getVatIds().length} vats`); +} diff --git a/packages/nodejs/src/kernel/sqlite-kv-store.ts b/packages/nodejs/src/kernel/sqlite-kv-store.ts new file mode 100644 index 000000000..8b4062316 --- /dev/null +++ b/packages/nodejs/src/kernel/sqlite-kv-store.ts @@ -0,0 +1,134 @@ +import type { KVStore } from '@ocap/kernel'; +import { makeLogger } from '@ocap/utils'; +import type { Database } from '@sqlite.org/sqlite-wasm'; +import sqlite3InitModule from '@sqlite.org/sqlite-wasm'; + +// No changes made to this file, besides this comment. +// If used, this file should be deduped with its copy +// in the extension package. This works (to the extent +// that it does) in the node environment because of the +// shims in env.js + +/** + * Ensure that SQLite is initialized. + * + * @returns The SQLite database object. + */ +async function initDB(): Promise { + const sqlite3 = await sqlite3InitModule(); + if (sqlite3.oo1.OpfsDb) { + return new sqlite3.oo1.OpfsDb('/testdb.sqlite', 'cwt'); + } + console.warn(`OPFS not enabled, database will be ephemeral`); + return new sqlite3.oo1.DB('/testdb.sqlite', 'cwt'); +} + +/** + * Makes a {@link KVStore} for low-level persistent storage. + * + * @param label - A logger prefix label. Defaults to '[sqlite]'. + * @returns The key/value store to base the kernel store on. + */ +export async function makeSQLKVStore( + label: string = '[sqlite]', +): Promise { + const logger = makeLogger(label); + const db = await initDB(); + + db.exec(` + CREATE TABLE IF NOT EXISTS kv ( + key TEXT, + value TEXT, + PRIMARY KEY(key) + ) + `); + + const sqlKVGet = db.prepare(` + SELECT value + FROM kv + WHERE key = ? + `); + + /** + * Read a key's value from the database. + * + * @param key - A key to fetch. + * @param required - True if it is an error for the entry not to be there. + * @returns The value at that key. + */ + function kvGet(key: string, required: boolean): string { + sqlKVGet.bind([key]); + if (sqlKVGet.step()) { + const result = sqlKVGet.getString(0); + if (result) { + sqlKVGet.reset(); + logger.debug(`kernel get '${key}' as '${result}'`); + return result; + } + } + sqlKVGet.reset(); + if (required) { + throw Error(`no record matching key '${key}'`); + } else { + // Sometimes, we really lean on TypeScript's unsoundness + return undefined as unknown as string; + } + } + + const sqlKVSet = db.prepare(` + INSERT INTO kv (key, value) + VALUES (?, ?) + ON CONFLICT DO UPDATE SET value = excluded.value + `); + + /** + * Set the value associated with a key in the database. + * + * @param key - A key to assign. + * @param value - The value to assign to it. + */ + function kvSet(key: string, value: string): void { + logger.debug(`kernel set '${key}' to '${value}'`); + sqlKVSet.bind([key, value]); + sqlKVSet.step(); + sqlKVSet.reset(); + } + + const sqlKVDelete = db.prepare(` + DELETE FROM kv + WHERE key = ? + `); + + /** + * Delete a key from the database. + * + * @param key - The key to remove. + */ + function kvDelete(key: string): void { + logger.debug(`kernel delete '${key}'`); + sqlKVDelete.bind([key]); + sqlKVDelete.step(); + sqlKVDelete.reset(); + } + + const sqlKVTruncate = db.prepare(` + TRUNCATE TABLE kv + `); + + /** + * Delete all keys and values from the database. + */ + function kvTruncate(): void { + logger.debug(`kernel truncate`); + sqlKVTruncate.step(); + sqlKVTruncate.reset(); + } + + return { + get: (key) => kvGet(key, false), + getRequired: (key) => kvGet(key, true), + set: kvSet, + delete: kvDelete, + truncate: kvTruncate, + }; +} diff --git a/packages/nodejs/src/vat/inside.ts b/packages/nodejs/src/vat/inside.ts new file mode 100644 index 000000000..418c20be3 --- /dev/null +++ b/packages/nodejs/src/vat/inside.ts @@ -0,0 +1,39 @@ +import '@ocap/shims/endoify'; +import { makeExo } from '@endo/exo'; +import { M } from '@endo/patterns'; +import type { Json } from '@metamask/utils'; +import { VatSupervisor } from '@ocap/kernel'; +import type { VatCommand, VatCommandReply } from '@ocap/kernel'; +import { NodeWorkerMultiplexer } from '@ocap/streams'; +import { parentPort } from 'node:worker_threads'; + +main().catch(console.error); + +/** + * The main function for the iframe. + */ +async function main(): Promise { + assert( + parentPort !== null, + 'Expected to run in Node Worker with parentPort.', + ); + const multiplexer = new NodeWorkerMultiplexer(parentPort); + const commandStream = multiplexer.createChannel( + 'command', + ); + const capTpStream = multiplexer.createChannel('capTp'); + const bootstrap = makeExo( + 'TheGreatFrangooly', + M.interface('TheGreatFrangooly', {}, { defaultGuards: 'passable' }), + { whatIsTheGreatFrangooly: () => 'Crowned with Chaos' }, + ); + + const supervisor = new VatSupervisor({ + id: 'iframe', + commandStream, + capTpStream, + bootstrap, + }); + + console.log(supervisor.evaluate('["Hello", "world!"].join(" ");')); +} diff --git a/packages/nodejs/tsconfig.build.json b/packages/nodejs/tsconfig.build.json new file mode 100644 index 000000000..dc6f5028d --- /dev/null +++ b/packages/nodejs/tsconfig.build.json @@ -0,0 +1,23 @@ +{ + "extends": "../../tsconfig.packages.build.json", + "compilerOptions": { + "allowJs": true, + "baseUrl": "./", + "emitDeclarationOnly": false, + "lib": ["DOM", "ES2022"], + "noEmit": true, + "rootDir": "./src", + "types": ["chrome", "ses"] + }, + "references": [ + { "path": "../shims/tsconfig.build.json" }, + { "path": "../streams/tsconfig.build.json" }, + { "path": "../kernel/tsconfig.build.json" }, + { "path": "../utils/tsconfig.build.json" } + ], + "include": [ + "./src/**/*.ts", + "./src/**/*-trusted-prelude.js", + "./src/env/dev-console.js" + ] +} diff --git a/packages/nodejs/tsconfig.json b/packages/nodejs/tsconfig.json new file mode 100644 index 000000000..94bb7b47d --- /dev/null +++ b/packages/nodejs/tsconfig.json @@ -0,0 +1,31 @@ +{ + "extends": "../../tsconfig.packages.json", + "compilerOptions": { + "allowJs": true, + "baseUrl": "./", + "isolatedModules": true, + "lib": ["DOM", "ES2022"], + "noEmit": true, + "skipLibCheck": true, + "types": ["chrome", "ses", "vitest", "vitest/jsdom"] + }, + "references": [ + { "path": "../shims" }, + { "path": "../streams" }, + { "path": "../test-utils" }, + { "path": "../utils" }, + { "path": "../kernel" } + ], + "include": [ + "../../vitest.config.packages.ts", + "./scripts/build-constants.mjs", + "./src/**/*.ts", + "./src/**/*-trusted-prelude.js", + "./src/env/dev-console.js", + "./test/**/*.ts", + "./vite-plugins/*.ts", + "./vite.config.ts", + "./vitest.config.ts", + "../kernel/src/vat-worker-service.ts" + ] +} diff --git a/packages/nodejs/tsconfig.lint.json b/packages/nodejs/tsconfig.lint.json new file mode 100644 index 000000000..aed9becf3 --- /dev/null +++ b/packages/nodejs/tsconfig.lint.json @@ -0,0 +1,10 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "composite": false, + "noEmit": true, + "skipLibCheck": true + }, + "include": ["./src", "./test", "./scripts"], + "exclude": [] +} diff --git a/packages/nodejs/vitest.config.ts b/packages/nodejs/vitest.config.ts new file mode 100644 index 000000000..f07bdee16 --- /dev/null +++ b/packages/nodejs/vitest.config.ts @@ -0,0 +1,27 @@ +// eslint-disable-next-line spaced-comment +/// + +import path from 'path'; +import { defineConfig, mergeConfig } from 'vite'; + +import defaultConfig from '../../vitest.config.js'; + +const config = mergeConfig( + defaultConfig, + defineConfig({ + test: { + // pool: 'vmThreads', + environment: 'node', + alias: [ + { + find: '@ocap/shims/endoify', + replacement: path.resolve('../shims/src/endoify.js'), + customResolver: (id) => ({ external: true, id }), + }, + ], + }, + }), +); + +delete config.test.coverage.thresholds; +export default config; diff --git a/packages/shims/src/endoify.js b/packages/shims/src/endoify.js index 90fabf755..bd96927e6 100644 --- a/packages/shims/src/endoify.js +++ b/packages/shims/src/endoify.js @@ -4,8 +4,7 @@ import '@endo/eventual-send/shim.js'; lockdown({ consoleTaming: 'unsafe', errorTaming: 'unsafe', - mathTaming: 'unsafe', - dateTaming: 'unsafe', + stackFiltering: 'verbose', domainTaming: 'unsafe', overrideTaming: 'severe', stackFiltering: 'verbose', diff --git a/yarn.lock b/yarn.lock index 228ffb6a3..255bfd087 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1843,6 +1843,54 @@ __metadata: languageName: unknown linkType: soft +"@ocap/nodejs@workspace:packages/nodejs": + version: 0.0.0-use.local + resolution: "@ocap/nodejs@workspace:packages/nodejs" + dependencies: + "@arethetypeswrong/cli": "npm:^0.16.4" + "@endo/eventual-send": "npm:^1.2.6" + "@endo/exo": "npm:^1.5.4" + "@endo/patterns": "npm:^1.4.4" + "@endo/promise-kit": "npm:^1.1.6" + "@metamask/auto-changelog": "npm:^3.4.4" + "@metamask/eslint-config": "npm:^14.0.0" + "@metamask/eslint-config-nodejs": "npm:^14.0.0" + "@metamask/eslint-config-typescript": "npm:^14.0.0" + "@metamask/snaps-utils": "npm:^8.3.0" + "@metamask/utils": "npm:^9.3.0" + "@ocap/cli": "workspace:^" + "@ocap/errors": "workspace:^" + "@ocap/kernel": "workspace:^" + "@ocap/shims": "workspace:^" + "@ocap/streams": "workspace:^" + "@ocap/test-utils": "workspace:^" + "@ocap/utils": "workspace:^" + "@sqlite.org/sqlite-wasm": "npm:3.47.0-build1" + "@ts-bridge/cli": "npm:^0.5.1" + "@types/chrome": "npm:^0.0.268" + "@typescript-eslint/eslint-plugin": "npm:^8.8.1" + "@typescript-eslint/parser": "npm:^8.8.1" + "@typescript-eslint/utils": "npm:^8.8.1" + depcheck: "npm:^1.4.7" + eslint: "npm:^9.12.0" + eslint-config-prettier: "npm:^9.1.0" + eslint-import-resolver-typescript: "npm:^3.6.3" + eslint-plugin-import-x: "npm:^4.3.1" + eslint-plugin-jsdoc: "npm:^50.3.1" + eslint-plugin-n: "npm:^17.11.1" + eslint-plugin-prettier: "npm:^5.2.1" + eslint-plugin-promise: "npm:^7.1.0" + prettier: "npm:^3.3.3" + rimraf: "npm:^6.0.1" + ses: "npm:^1.9.0" + typedoc: "npm:^0.26.8" + typescript: "npm:~5.5.4" + typescript-eslint: "npm:^8.8.1" + vite: "npm:^5.3.5" + vitest: "npm:^2.1.2" + languageName: unknown + linkType: soft + "@ocap/shims@workspace:^, @ocap/shims@workspace:packages/shims": version: 0.0.0-use.local resolution: "@ocap/shims@workspace:packages/shims" @@ -2137,114 +2185,135 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.24.0" +"@rollup/rollup-android-arm-eabi@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.28.1" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-android-arm64@npm:4.24.0" +"@rollup/rollup-android-arm64@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-android-arm64@npm:4.28.1" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.24.0" +"@rollup/rollup-darwin-arm64@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-darwin-arm64@npm:4.28.1" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.24.0" +"@rollup/rollup-darwin-x64@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-darwin-x64@npm:4.28.1" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.24.0" +"@rollup/rollup-freebsd-arm64@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.28.1" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-freebsd-x64@npm:4.28.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.28.1" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.24.0" +"@rollup/rollup-linux-arm-musleabihf@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.28.1" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.24.0" +"@rollup/rollup-linux-arm64-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.28.1" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.24.0" +"@rollup/rollup-linux-arm64-musl@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.28.1" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.24.0" +"@rollup/rollup-linux-loongarch64-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.28.1" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.28.1" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.24.0" +"@rollup/rollup-linux-riscv64-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.28.1" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.24.0" +"@rollup/rollup-linux-s390x-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.28.1" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.24.0" +"@rollup/rollup-linux-x64-gnu@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.28.1" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.24.0" +"@rollup/rollup-linux-x64-musl@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.28.1" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.24.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.28.1" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.24.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.28.1" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.24.0": - version: 4.24.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.24.0" +"@rollup/rollup-win32-x64-msvc@npm:4.28.1": + version: 4.28.1 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.28.1" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -2364,6 +2433,15 @@ __metadata: languageName: node linkType: hard +"@sqlite.org/sqlite-wasm@npm:3.47.0-build1": + version: 3.47.0-build1 + resolution: "@sqlite.org/sqlite-wasm@npm:3.47.0-build1" + bin: + sqlite-wasm: bin/index.js + checksum: 10/2953f9220b5553b2adedb308ae064e742d5fa062da58bba5402ad7ceec01472e972c7ab25d3559fea508361c8564741161a8e97e88395701de9eb6c2218b8982 + languageName: node + linkType: hard + "@testing-library/dom@npm:^10.4.0": version: 10.4.0 resolution: "@testing-library/dom@npm:10.4.0" @@ -2840,15 +2918,15 @@ __metadata: languageName: node linkType: hard -"@vitest/expect@npm:2.1.3": - version: 2.1.3 - resolution: "@vitest/expect@npm:2.1.3" +"@vitest/expect@npm:2.1.4": + version: 2.1.4 + resolution: "@vitest/expect@npm:2.1.4" dependencies: - "@vitest/spy": "npm:2.1.3" - "@vitest/utils": "npm:2.1.3" - chai: "npm:^5.1.1" + "@vitest/spy": "npm:2.1.4" + "@vitest/utils": "npm:2.1.4" + chai: "npm:^5.1.2" tinyrainbow: "npm:^1.2.0" - checksum: 10/94e61e01f14cfcd9ced0e7ac1bbdeee55ff4bf68f09d8f244fd7d73f97b106f35d10cba3fe7a0132464c312206f2eee9e83b16a8d761101b61da053890062858 + checksum: 10/0b3806d39233843a9661f6d5ccde489c9b6d278426f889198a862d601dcc186f107398487374195eb0dae90c9f69628f3f216200d644f817fa25d64ae1bc537e languageName: node linkType: hard @@ -2872,7 +2950,26 @@ __metadata: languageName: node linkType: hard -"@vitest/pretty-format@npm:2.1.3, @vitest/pretty-format@npm:^2.1.3": +"@vitest/mocker@npm:2.1.4": + version: 2.1.4 + resolution: "@vitest/mocker@npm:2.1.4" + dependencies: + "@vitest/spy": "npm:2.1.4" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.12" + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 10/00f323cc184977b247a1f0b9c51fdcceb97377031d728c69ef0bd14ebf0256742a94c68c6caa90eb073ed3de4277febd7d54715508bff05bb2fb7767ce11afbe + languageName: node + linkType: hard + +"@vitest/pretty-format@npm:2.1.3": version: 2.1.3 resolution: "@vitest/pretty-format@npm:2.1.3" dependencies: @@ -2881,24 +2978,33 @@ __metadata: languageName: node linkType: hard -"@vitest/runner@npm:2.1.3": - version: 2.1.3 - resolution: "@vitest/runner@npm:2.1.3" +"@vitest/pretty-format@npm:2.1.4, @vitest/pretty-format@npm:^2.1.4": + version: 2.1.4 + resolution: "@vitest/pretty-format@npm:2.1.4" dependencies: - "@vitest/utils": "npm:2.1.3" + tinyrainbow: "npm:^1.2.0" + checksum: 10/434e6a7903f72a3796f26516ad728aca92724909e18fd3f2cd4b9b8b0ae2cc7b4cd86e92ab9f2ac7bc005c7a7ef0bcb9d768c0264b4b0625f1f0748cc615f1f6 + languageName: node + linkType: hard + +"@vitest/runner@npm:2.1.4": + version: 2.1.4 + resolution: "@vitest/runner@npm:2.1.4" + dependencies: + "@vitest/utils": "npm:2.1.4" pathe: "npm:^1.1.2" - checksum: 10/cdf9b82d388c1cc148753f4a8632dfcadf9c4a1c0e065fdcd485d5af824af62507fd7eab9efb21244009775c05773ccb59547043af522a5ab6d216433321066e + checksum: 10/51dbea968ace6edefb058d88c9736fa524a64f4dc750ec163b43f5015a31b31f2d80a7b20de4c2a819fbfb172162ad4d0f8428c78fa7ca832c1a1b135161ac4b languageName: node linkType: hard -"@vitest/snapshot@npm:2.1.3": - version: 2.1.3 - resolution: "@vitest/snapshot@npm:2.1.3" +"@vitest/snapshot@npm:2.1.4": + version: 2.1.4 + resolution: "@vitest/snapshot@npm:2.1.4" dependencies: - "@vitest/pretty-format": "npm:2.1.3" - magic-string: "npm:^0.30.11" + "@vitest/pretty-format": "npm:2.1.4" + magic-string: "npm:^0.30.12" pathe: "npm:^1.1.2" - checksum: 10/2c0c4ad8abb758f2f76d1d6094f8928360437e09d0a59e0c6a85a544c892cc41a5324ebbc5657a66c8a3793e51cbf58e357c7f71e899f4e5c5eb76e8c9745abf + checksum: 10/785f74cf5f7745eb0dcb73fe3c628bc1f687c6341e8ba63d722fa83609d21465302ebd208405b9f91ce87fb36720a0f361c949983d5caccbcb8ec2119f995483 languageName: node linkType: hard @@ -2911,6 +3017,15 @@ __metadata: languageName: node linkType: hard +"@vitest/spy@npm:2.1.4": + version: 2.1.4 + resolution: "@vitest/spy@npm:2.1.4" + dependencies: + tinyspy: "npm:^3.0.2" + checksum: 10/4dd3e7c28928abb047c567b3711d1cbccd59aaae294c57efaab83cdd723b568882de5376fc086c919a4cb6d1df5e6cc0502b3171cce06dfce87863c731fd5d36 + languageName: node + linkType: hard + "@vitest/utils@npm:2.1.3": version: 2.1.3 resolution: "@vitest/utils@npm:2.1.3" @@ -2922,6 +3037,17 @@ __metadata: languageName: node linkType: hard +"@vitest/utils@npm:2.1.4": + version: 2.1.4 + resolution: "@vitest/utils@npm:2.1.4" + dependencies: + "@vitest/pretty-format": "npm:2.1.4" + loupe: "npm:^3.1.2" + tinyrainbow: "npm:^1.2.0" + checksum: 10/aaaf5310943abca0f0080d9638e67838f7e519d5670ec32e61184915efdfa5ec61d9b495cad6cb7dc492e8caeed14593e78dda77c8ea59c1671a231661f57142 + languageName: node + linkType: hard + "@vue/compiler-core@npm:3.5.12": version: 3.5.12 resolution: "@vue/compiler-core@npm:3.5.12" @@ -3540,16 +3666,16 @@ __metadata: languageName: node linkType: hard -"chai@npm:^5.1.1": - version: 5.1.1 - resolution: "chai@npm:5.1.1" +"chai@npm:^5.1.2": + version: 5.1.2 + resolution: "chai@npm:5.1.2" dependencies: assertion-error: "npm:^2.0.1" check-error: "npm:^2.1.1" deep-eql: "npm:^5.0.1" loupe: "npm:^3.1.0" pathval: "npm:^2.0.0" - checksum: 10/ee67279a5613bd36dc1dc13660042429ae2f1dc5a9030a6abcf381345866dfb5bce7bc10b9d74c8de86b6f656489f654bbbef3f3361e06925591e6a00c72afff + checksum: 10/e8c2bbc83cb5a2f87130d93056d4cfbbe04106e12aa798b504816dbe3fa538a9f68541b472e56cbf0f54558b501d7e31867d74b8218abcd5a8cc8ba536fba46c languageName: node linkType: hard @@ -4909,6 +5035,13 @@ __metadata: languageName: node linkType: hard +"expect-type@npm:^1.1.0": + version: 1.1.0 + resolution: "expect-type@npm:1.1.0" + checksum: 10/05fca80ddc7d493a89361f783c6b000750fa04a8226bc24701f3b90adb0efc2fb467f2a0baaed4015a02d8b9034ef5bb87521df9dba980f50b1105bd596ef833 + languageName: node + linkType: hard + "exponential-backoff@npm:^3.1.1": version: 3.1.1 resolution: "exponential-backoff@npm:3.1.1" @@ -6289,7 +6422,7 @@ __metadata: languageName: node linkType: hard -"loupe@npm:^3.1.0, loupe@npm:^3.1.1": +"loupe@npm:^3.1.0, loupe@npm:^3.1.1, loupe@npm:^3.1.2": version: 3.1.2 resolution: "loupe@npm:3.1.2" checksum: 10/8f5734e53fb64cd914aa7d986e01b6d4c2e3c6c56dcbd5428d71c2703f0ab46b5ab9f9eeaaf2b485e8a1c43f865bdd16ec08ae1a661c8f55acdbd9f4d59c607a @@ -6351,7 +6484,7 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.11": +"magic-string@npm:^0.30.11, magic-string@npm:^0.30.12": version: 0.30.12 resolution: "magic-string@npm:0.30.12" dependencies: @@ -7387,10 +7520,10 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0": - version: 1.1.0 - resolution: "picocolors@npm:1.1.0" - checksum: 10/a2ad60d94d185c30f2a140b19c512547713fb89b920d32cc6cf658fa786d63a37ba7b8451872c3d9fc34883971fb6e5878e07a20b60506e0bb2554dce9169ccb +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10/e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 languageName: node linkType: hard @@ -7467,13 +7600,13 @@ __metadata: linkType: hard "postcss@npm:^8.4.43, postcss@npm:^8.4.47": - version: 8.4.47 - resolution: "postcss@npm:8.4.47" + version: 8.4.49 + resolution: "postcss@npm:8.4.49" dependencies: nanoid: "npm:^3.3.7" - picocolors: "npm:^1.1.0" + picocolors: "npm:^1.1.1" source-map-js: "npm:^1.2.1" - checksum: 10/f2b50ba9b6fcb795232b6bb20de7cdc538c0025989a8ed9c4438d1960196ba3b7eaff41fdb1a5c701b3504651ea87aeb685577707f0ae4d6ce6f3eae5df79a81 + checksum: 10/28fe1005b1339870e0a5006375ba5ac1213fd69800f79e7db09c398e074421ba6e162898e94f64942fed554037fd292db3811d87835d25ab5ef7f3c9daacb6ca languageName: node linkType: hard @@ -7864,25 +7997,28 @@ __metadata: linkType: hard "rollup@npm:^4.20.0": - version: 4.24.0 - resolution: "rollup@npm:4.24.0" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.24.0" - "@rollup/rollup-android-arm64": "npm:4.24.0" - "@rollup/rollup-darwin-arm64": "npm:4.24.0" - "@rollup/rollup-darwin-x64": "npm:4.24.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.24.0" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.24.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.24.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.24.0" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.24.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.24.0" - "@rollup/rollup-linux-s390x-gnu": "npm:4.24.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.24.0" - "@rollup/rollup-linux-x64-musl": "npm:4.24.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.24.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.24.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.24.0" + version: 4.28.1 + resolution: "rollup@npm:4.28.1" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.28.1" + "@rollup/rollup-android-arm64": "npm:4.28.1" + "@rollup/rollup-darwin-arm64": "npm:4.28.1" + "@rollup/rollup-darwin-x64": "npm:4.28.1" + "@rollup/rollup-freebsd-arm64": "npm:4.28.1" + "@rollup/rollup-freebsd-x64": "npm:4.28.1" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.28.1" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.28.1" + "@rollup/rollup-linux-arm64-gnu": "npm:4.28.1" + "@rollup/rollup-linux-arm64-musl": "npm:4.28.1" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.28.1" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.28.1" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.28.1" + "@rollup/rollup-linux-s390x-gnu": "npm:4.28.1" + "@rollup/rollup-linux-x64-gnu": "npm:4.28.1" + "@rollup/rollup-linux-x64-musl": "npm:4.28.1" + "@rollup/rollup-win32-arm64-msvc": "npm:4.28.1" + "@rollup/rollup-win32-ia32-msvc": "npm:4.28.1" + "@rollup/rollup-win32-x64-msvc": "npm:4.28.1" "@types/estree": "npm:1.0.6" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -7894,6 +8030,10 @@ __metadata: optional: true "@rollup/rollup-darwin-x64": optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true "@rollup/rollup-linux-arm-gnueabihf": optional: true "@rollup/rollup-linux-arm-musleabihf": @@ -7902,6 +8042,8 @@ __metadata: optional: true "@rollup/rollup-linux-arm64-musl": optional: true + "@rollup/rollup-linux-loongarch64-gnu": + optional: true "@rollup/rollup-linux-powerpc64le-gnu": optional: true "@rollup/rollup-linux-riscv64-gnu": @@ -7922,7 +8064,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10/291dce8f180628a73d6749119a3e50aa917c416075302bc6f6ac655affc7f0ce9d7f025bef7318d424d0c5623dcb83e360f9ea0125273b6a2285c232172800cc + checksum: 10/4337898d07e646835b52494b43b4ccd6929da87af2b0febc05ab217fd2425cfda05af5efaea6037c1641c90d803eb5b3e491eefdd47b28fda85af4f46a0dad34 languageName: node linkType: hard @@ -8597,14 +8739,14 @@ __metadata: languageName: node linkType: hard -"tinyexec@npm:^0.3.0": - version: 0.3.0 - resolution: "tinyexec@npm:0.3.0" - checksum: 10/317cc536d091ce7e50271287798d91ef53c4dc80088844d890752a2c7387d213004cba83e5e1d9129390ced617625e34f4a8f0ba5779e31c9b6939f9be0d3543 +"tinyexec@npm:^0.3.1": + version: 0.3.1 + resolution: "tinyexec@npm:0.3.1" + checksum: 10/0537c70590d52d354f40c0255ff0f654a3d18ddb3812b440ddf9d436edf516c8057838ad5a38744c0c59670ec03e3cf23fbe04ae3d49f031d948274e99002569 languageName: node linkType: hard -"tinypool@npm:^1.0.0": +"tinypool@npm:^1.0.1": version: 1.0.1 resolution: "tinypool@npm:1.0.1" checksum: 10/eaceb93784b8e27e60c0e3e2c7d11c29e1e79b2a025b2c232215db73b90fe22bd4753ad53fc8e801c2b5a63b94a823af549555d8361272bc98271de7dd4a9925 @@ -8618,7 +8760,7 @@ __metadata: languageName: node linkType: hard -"tinyspy@npm:^3.0.0": +"tinyspy@npm:^3.0.0, tinyspy@npm:^3.0.2": version: 3.0.2 resolution: "tinyspy@npm:3.0.2" checksum: 10/5db671b2ff5cd309de650c8c4761ca945459d7204afb1776db9a04fb4efa28a75f08517a8620c01ee32a577748802231ad92f7d5b194dc003ee7f987a2a06337 @@ -9044,17 +9186,17 @@ __metadata: languageName: node linkType: hard -"vite-node@npm:2.1.3": - version: 2.1.3 - resolution: "vite-node@npm:2.1.3" +"vite-node@npm:2.1.4": + version: 2.1.4 + resolution: "vite-node@npm:2.1.4" dependencies: cac: "npm:^6.7.14" - debug: "npm:^4.3.6" + debug: "npm:^4.3.7" pathe: "npm:^1.1.2" vite: "npm:^5.0.0" bin: vite-node: vite-node.mjs - checksum: 10/8ba6b145cbb02a492c7bb1f0490d02383000462f234ed61d24f650547163825c16f14e6908ee1eb661403bd0a7a3fb3cdbedf116cc015b1e5cdf7bb992872a01 + checksum: 10/3c3fbe6e41ab1716f4e6e0b52dcb80e027cb481df03e31d9bb5d16bb0ffabc5c884cca705ef8a5dea60f787e5eb78a428977d0d40e61e1f331bfb8c3d486d3e2 languageName: node linkType: hard @@ -9193,33 +9335,34 @@ __metadata: linkType: hard "vitest@npm:^2.1.2": - version: 2.1.3 - resolution: "vitest@npm:2.1.3" - dependencies: - "@vitest/expect": "npm:2.1.3" - "@vitest/mocker": "npm:2.1.3" - "@vitest/pretty-format": "npm:^2.1.3" - "@vitest/runner": "npm:2.1.3" - "@vitest/snapshot": "npm:2.1.3" - "@vitest/spy": "npm:2.1.3" - "@vitest/utils": "npm:2.1.3" - chai: "npm:^5.1.1" - debug: "npm:^4.3.6" - magic-string: "npm:^0.30.11" + version: 2.1.4 + resolution: "vitest@npm:2.1.4" + dependencies: + "@vitest/expect": "npm:2.1.4" + "@vitest/mocker": "npm:2.1.4" + "@vitest/pretty-format": "npm:^2.1.4" + "@vitest/runner": "npm:2.1.4" + "@vitest/snapshot": "npm:2.1.4" + "@vitest/spy": "npm:2.1.4" + "@vitest/utils": "npm:2.1.4" + chai: "npm:^5.1.2" + debug: "npm:^4.3.7" + expect-type: "npm:^1.1.0" + magic-string: "npm:^0.30.12" pathe: "npm:^1.1.2" std-env: "npm:^3.7.0" tinybench: "npm:^2.9.0" - tinyexec: "npm:^0.3.0" - tinypool: "npm:^1.0.0" + tinyexec: "npm:^0.3.1" + tinypool: "npm:^1.0.1" tinyrainbow: "npm:^1.2.0" vite: "npm:^5.0.0" - vite-node: "npm:2.1.3" + vite-node: "npm:2.1.4" why-is-node-running: "npm:^2.3.0" peerDependencies: "@edge-runtime/vm": "*" "@types/node": ^18.0.0 || >=20.0.0 - "@vitest/browser": 2.1.3 - "@vitest/ui": 2.1.3 + "@vitest/browser": 2.1.4 + "@vitest/ui": 2.1.4 happy-dom: "*" jsdom: "*" peerDependenciesMeta: @@ -9237,7 +9380,7 @@ __metadata: optional: true bin: vitest: vitest.mjs - checksum: 10/f6079a88583045b551e6526c08774aeac4a9cf85b132793a03f9470c013326abd7fce3985e3c2217dc0dac2fadeee3506e3dc51e215f10862b2fe9da9289af0f + checksum: 10/bf0bb39e6148678ccc0d856a6a08e99458e80266558f97757bd20980812cd439f51599bcb64c807805594bf6fdb2111fdca688bc8884524819cc4a84a4598109 languageName: node linkType: hard