diff --git a/.github/workflows/typecheck.yml b/.github/workflows/typecheck.yml new file mode 100644 index 000000000..fdf2d6f47 --- /dev/null +++ b/.github/workflows/typecheck.yml @@ -0,0 +1,22 @@ +name: Typecheck +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + typecheck: + name: Run typecheck + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4 + with: + version: 9 + - shell: bash + run: | + pnpm install --no-frozen-lockfile + + - shell: bash + run: pnpm run typecheck diff --git a/examples/canvas/package.json b/examples/canvas/package.json index 8c3ec0261..9ccea892c 100644 --- a/examples/canvas/package.json +++ b/examples/canvas/package.json @@ -4,6 +4,7 @@ "license": "MIT", "scripts": { "build": "vite build", + "typecheck": "tsc --noEmit", "clean": "rm -rf dist/ node_modules/", "dev": "vite serve", "start": "vite preview --host --port 5173" diff --git a/examples/chat/package.json b/examples/chat/package.json index a223c09c5..01c1d4f39 100644 --- a/examples/chat/package.json +++ b/examples/chat/package.json @@ -4,6 +4,7 @@ "license": "MIT", "scripts": { "build": "vite build", + "typecheck": "tsc --noEmit", "clean": "rm -rf dist/ node_modules/", "dev": "vite serve", "start": "vite preview --host --port 5173" diff --git a/examples/chat/src/objects/chat.ts b/examples/chat/src/objects/chat.ts index 5ee96a0eb..ce5a073db 100644 --- a/examples/chat/src/objects/chat.ts +++ b/examples/chat/src/objects/chat.ts @@ -1,7 +1,6 @@ -import { type DRP, type ResolveConflictsType } from "@ts-drp/object"; -import { ActionType, SemanticsType } from "@ts-drp/types"; +import { type IDRP, type ResolveConflictsType, ActionType, SemanticsType } from "@ts-drp/types"; -export class Chat implements DRP { +export class Chat implements IDRP { semanticsType: SemanticsType = SemanticsType.pair; // store messages as strings in the format (timestamp, message, peerId) messages: Set<string>; @@ -17,7 +16,7 @@ export class Chat implements DRP { return this.messages; } - resolveConflicts(_): ResolveConflictsType { + resolveConflicts(): ResolveConflictsType { return { action: ActionType.Nop }; } } diff --git a/examples/grid/package.json b/examples/grid/package.json index 131af4762..565adaa75 100644 --- a/examples/grid/package.json +++ b/examples/grid/package.json @@ -4,6 +4,7 @@ "license": "MIT", "scripts": { "build": "vite build", + "typecheck": "tsc --noEmit", "clean": "rm -rf dist/ node_modules/", "dev": "vite serve", "start": "vite preview --host --port 5173" diff --git a/examples/grid/src/index.ts b/examples/grid/src/index.ts index 8829efa16..f10e2c0f4 100644 --- a/examples/grid/src/index.ts +++ b/examples/grid/src/index.ts @@ -1,5 +1,6 @@ -import { DRPNode, type DRPNodeConfig } from "@ts-drp/node"; -import { enableTracing, type IMetrics, OpentelemetryMetrics } from "@ts-drp/tracer"; +import { DRPNode } from "@ts-drp/node"; +import { enableTracing, OpentelemetryMetrics } from "@ts-drp/tracer"; +import { type DRPNodeConfig, type IMetrics } from "@ts-drp/types"; import { env } from "./env"; import { Grid } from "./objects/grid"; diff --git a/examples/grid/src/objects/grid.ts b/examples/grid/src/objects/grid.ts index 3a6a334c8..17fd8da16 100644 --- a/examples/grid/src/objects/grid.ts +++ b/examples/grid/src/objects/grid.ts @@ -1,7 +1,12 @@ -import { type DRP, type ResolveConflictsType } from "@ts-drp/object"; -import { ActionType, SemanticsType, type Vertex } from "@ts-drp/types"; +import { + type IDRP, + type ResolveConflictsType, + ActionType, + SemanticsType, + type Vertex, +} from "@ts-drp/types"; -export class Grid implements DRP { +export class Grid implements IDRP { semanticsType: SemanticsType = SemanticsType.pair; positions: Map<string, { x: number; y: number }>; diff --git a/examples/grid/src/state.ts b/examples/grid/src/state.ts index f2cdee1b7..891e9af22 100644 --- a/examples/grid/src/state.ts +++ b/examples/grid/src/state.ts @@ -1,11 +1,11 @@ import { DRPNode } from "@ts-drp/node"; -import { type DRPObject } from "@ts-drp/object"; +import { type IDRPObject } from "@ts-drp/types"; import { type Grid } from "./objects/grid"; interface GridState { node: DRPNode; - drpObject: DRPObject | undefined; + drpObject: IDRPObject | undefined; gridDRP: Grid | undefined; peers: string[]; discoveryPeers: string[]; diff --git a/examples/grid/vite.config.mts b/examples/grid/vite.config.mts index 2cab18d98..f68b40036 100644 --- a/examples/grid/vite.config.mts +++ b/examples/grid/vite.config.mts @@ -21,6 +21,7 @@ export default defineConfig({ "@ts-drp": path.resolve(__dirname, "../../packages"), }, }, + // @ts-expect-error -- test is a valid property test: { exclude: ["**/node_modules", "**/e2e"], }, diff --git a/examples/local-bootstrap/package.json b/examples/local-bootstrap/package.json index f6011cdef..e8a36fb07 100644 --- a/examples/local-bootstrap/package.json +++ b/examples/local-bootstrap/package.json @@ -4,6 +4,7 @@ "license": "MIT", "scripts": { "build": "vite build", + "typecheck": "tsc --noEmit", "clean": "rm -rf dist/ node_modules/", "dev": "vite serve" }, diff --git a/package.json b/package.json index fe1f49737..6ed17f4b0 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "type": "module", "scripts": { "bench": "vitest bench", - "build": "pnpm build:packages && pnpm build:examples", + "build": "pnpm -r build", "build:examples": "pnpm --filter 'ts-drp-example*' build", "build:packages": "pnpm --filter '@ts-drp/*' build", "clean": "pnpm --filter '@ts-drp/*' clean && rm -r node_modules/ docs/", @@ -34,6 +34,7 @@ "proto-gen:types": "buf generate packages/types/src/proto -o packages/types/src/proto", "release": "release-it", "test": "vitest", + "typecheck": "pnpm --parallel typecheck", "watch": "pnpm --parallel --filter '@ts-drp/*' watch" }, "dependencies": { @@ -45,7 +46,7 @@ "@playwright/test": "^1.49.1", "@release-it-plugins/workspaces": "^4.2.0", "@typescript-eslint/parser": "^8.21.0", - "@vitest/coverage-v8": "3.0.5", + "@vitest/coverage-v8": "^3.0.5", "assemblyscript": "^0.27.29", "eslint": "^9.19.0", "eslint-config-prettier": "^10.0.1", diff --git a/packages/blueprints/package.json b/packages/blueprints/package.json index f17ef2fdb..21795c9c9 100644 --- a/packages/blueprints/package.json +++ b/packages/blueprints/package.json @@ -21,7 +21,8 @@ } }, "scripts": { - "build": "tsc -b", + "build": "tsc -b tsconfig.build.json", + "typecheck": "tsc --noEmit", "clean": "rm -rf dist/ node_modules/", "prepack": "tsc -b", "test": "vitest", @@ -29,7 +30,6 @@ }, "dependencies": { "@thi.ng/random": "^4.1.0", - "@ts-drp/object": "0.8.5", "@ts-drp/types": "0.8.5" } } diff --git a/packages/blueprints/tests/AddMul.test.ts b/packages/blueprints/tests/AddMul.test.ts index 3d2d5b28c..eeff5024d 100644 --- a/packages/blueprints/tests/AddMul.test.ts +++ b/packages/blueprints/tests/AddMul.test.ts @@ -1,4 +1,4 @@ -import { ActionType } from "@ts-drp/types"; +import { ActionType, type Vertex } from "@ts-drp/types"; import { beforeEach, describe, expect, test } from "vitest"; import { AddMulDRP } from "../src/AddMul/index.js"; @@ -25,12 +25,15 @@ describe("AddMulDRP tests", () => { test("Test: Add (Weird inputs)", () => { drp.add(5); + // @ts-expect-error - weird input drp.add(""); expect(drp.query_value()).toEqual(5); + // @ts-expect-error - weird input drp.add(true); expect(drp.query_value()).toEqual(5); + // @ts-expect-error - weird input drp.add({}); expect(drp.query_value()).toEqual(5); }); @@ -51,12 +54,15 @@ describe("AddMulDRP tests", () => { test("Test: Mul (Weird inputs)", () => { drp.add(5); + // @ts-expect-error - weird input drp.mul(""); expect(drp.query_value()).toEqual(5); + // @ts-expect-error - weird input drp.mul(true); expect(drp.query_value()).toEqual(5); + // @ts-expect-error - weird input drp.mul({}); expect(drp.query_value()).toEqual(5); }); @@ -76,15 +82,19 @@ describe("AddMulDRP tests", () => { }); test("Test: initialValue (Weird inputs)", () => { + // @ts-expect-error - weird input drp = new AddMulDRP("10"); expect(drp.query_value()).toEqual(0); + // @ts-expect-error - weird input drp = new AddMulDRP(true); expect(drp.query_value()).toEqual(0); + // @ts-expect-error - weird input drp = new AddMulDRP({}); expect(drp.query_value()).toEqual(0); + // @ts-expect-error - weird input drp = new AddMulDRP([]); expect(drp.query_value()).toEqual(0); }); @@ -166,24 +176,28 @@ describe("AddMulDRP tests", () => { }); test("Test: resolveConflicts (Weird inputs)", () => { - const vertex1 = { + const vertex1: Vertex = { hash: "1", + // @ts-expect-error - operation is missing operation: { opType: "add", }, }; - const vertex2 = { + const vertex2: Vertex = { hash: "2", + // @ts-expect-error - operation is missing operation: { opType: "mulx", }, }; - const vertex3 = { + const vertex3: Vertex = { + // @ts-expect-error - operation is missing operation: { opType: "mul", }, }; - const vertex4 = {}; + // @ts-expect-error - operation is missing + const vertex4: Vertex = {}; let action = drp.resolveConflicts([vertex1, vertex2]); expect(action).toEqual({ action: ActionType.Nop }); diff --git a/packages/blueprints/tsconfig.build.json b/packages/blueprints/tsconfig.build.json new file mode 100644 index 000000000..07e127d11 --- /dev/null +++ b/packages/blueprints/tsconfig.build.json @@ -0,0 +1 @@ +{"extends": "./tsconfig.json","exclude": ["tests/**/*.ts"]} diff --git a/packages/blueprints/tsconfig.json b/packages/blueprints/tsconfig.json index 3e8b28b11..55527891c 100644 --- a/packages/blueprints/tsconfig.json +++ b/packages/blueprints/tsconfig.json @@ -3,11 +3,11 @@ "compilerOptions": { "outDir": "dist" }, - "references": [ - { - "path": "../object" - } + "include": [ + "src/**/*.ts", + "tests/**/*.ts" ], - "include": ["src/**/*.ts"], - "exclude": ["src/**/*.asc.ts"] + "exclude": [ + "src/**/*.asc.ts" + ] } diff --git a/packages/interval-runner/package.json b/packages/interval-runner/package.json index d522feec6..917974492 100644 --- a/packages/interval-runner/package.json +++ b/packages/interval-runner/package.json @@ -21,12 +21,13 @@ } }, "scripts": { - "build": "tsc -b", + "build": "tsc -b tsconfig.build.json", "clean": "rm -rf dist/ node_modules/", "cli": "tsx ./src/run.ts", "prebuild": "node -p \"'export const VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts", "prepack": "tsc -b", "test": "vitest", + "typecheck": "tsc --noEmit", "watch": "tsc -b -w" }, "dependencies": { diff --git a/packages/interval-runner/tsconfig.build.json b/packages/interval-runner/tsconfig.build.json new file mode 100644 index 000000000..07e127d11 --- /dev/null +++ b/packages/interval-runner/tsconfig.build.json @@ -0,0 +1 @@ +{"extends": "./tsconfig.json","exclude": ["tests/**/*.ts"]} diff --git a/packages/keychain/package.json b/packages/keychain/package.json index c2f5724a9..d63d7204c 100644 --- a/packages/keychain/package.json +++ b/packages/keychain/package.json @@ -21,9 +21,10 @@ } }, "scripts": { - "build": "tsc -b", + "build": "tsc -b tsconfig.build.json", "clean": "rm -rf dist/ node_modules/", "prepack": "tsc -b", + "typecheck": "tsc --noEmit", "watch": "tsc -b -w" }, "dependencies": { @@ -33,7 +34,6 @@ "@libp2p/crypto": "^5.0.5", "@libp2p/interface": "^2.1.3", "@noble/secp256k1": "^2.2.3", - "@ts-drp/object": "0.8.5", "@ts-drp/types": "^0.8.5", "uint8arrays": "^5.1.0" }, diff --git a/packages/keychain/tsconfig.build.json b/packages/keychain/tsconfig.build.json new file mode 100644 index 000000000..07e127d11 --- /dev/null +++ b/packages/keychain/tsconfig.build.json @@ -0,0 +1 @@ +{"extends": "./tsconfig.json","exclude": ["tests/**/*.ts"]} diff --git a/packages/keychain/tsconfig.json b/packages/keychain/tsconfig.json index 3dfb23cf7..ddb28fb86 100644 --- a/packages/keychain/tsconfig.json +++ b/packages/keychain/tsconfig.json @@ -3,5 +3,5 @@ "compilerOptions": { "outDir": "dist" }, - "include": ["src/**/*.ts", "src/**/*.js"] + "include": ["src/**/*.ts", "src/**/*.js", "tests/**/*.ts"] } diff --git a/packages/logger/package.json b/packages/logger/package.json index e28d98211..538d2f33e 100644 --- a/packages/logger/package.json +++ b/packages/logger/package.json @@ -21,13 +21,13 @@ } }, "scripts": { - "build": "tsc -b", + "build": "tsc -b tsconfig.build.json", "clean": "rm -rf dist/ node_modules/", "prepack": "tsc -b", + "typecheck": "tsc --noEmit", "watch": "tsc -b -w" }, "dependencies": { - "@ts-drp/types": "^0.8.5", "loglevel": "^1.9.2", "loglevel-plugin-prefix": "^0.8.4", "@ts-drp/types": "^0.8.5" diff --git a/packages/logger/test/log.test.ts b/packages/logger/tests/log.test.ts similarity index 100% rename from packages/logger/test/log.test.ts rename to packages/logger/tests/log.test.ts diff --git a/packages/logger/tsconfig.build.json b/packages/logger/tsconfig.build.json new file mode 100644 index 000000000..07e127d11 --- /dev/null +++ b/packages/logger/tsconfig.build.json @@ -0,0 +1 @@ +{"extends": "./tsconfig.json","exclude": ["tests/**/*.ts"]} diff --git a/packages/logger/tsconfig.json b/packages/logger/tsconfig.json index 9cc8b37cd..0ca984477 100644 --- a/packages/logger/tsconfig.json +++ b/packages/logger/tsconfig.json @@ -3,5 +3,8 @@ "compilerOptions": { "outDir": "dist" }, - "include": ["src/**/*.ts"] + "include": [ + "src/**/*.ts", + "tests/**/*.ts" + ] } diff --git a/packages/network/package.json b/packages/network/package.json index 567324a1b..c463af952 100644 --- a/packages/network/package.json +++ b/packages/network/package.json @@ -21,13 +21,15 @@ } }, "scripts": { - "build": "tsc -b", + "build": "tsc -b tsconfig.build.json", "clean": "rm -rf dist/ node_modules/", "prepack": "tsc -b", "test": "vitest", + "typecheck": "tsc --noEmit", "watch": "tsc -b -w" }, "devDependencies": { + "@ts-drp/keychain": "0.8.5", "race-event": "^1.3.0" }, "dependencies": { @@ -41,8 +43,8 @@ "@libp2p/crypto": "^5.0.5", "@libp2p/dcutr": "^2.0.6", "@libp2p/devtools-metrics": "^1.1.5", - "@libp2p/interface": "^2.1.3", "@libp2p/identify": "^3.0.6", + "@libp2p/interface": "^2.1.3", "@libp2p/ping": "2.0.11", "@libp2p/pubsub-peer-discovery": "^11.0.0", "@libp2p/webrtc": "^5.0.9", diff --git a/packages/network/tests/index.test.ts b/packages/network/tests/index.test.ts index 089f31ba9..9e4504d13 100644 --- a/packages/network/tests/index.test.ts +++ b/packages/network/tests/index.test.ts @@ -1,4 +1,4 @@ -import { Keychain } from "@ts-drp/keychain/src/keychain.js"; +import { Keychain } from "@ts-drp/keychain"; import { beforeAll, describe, expect, test } from "vitest"; import { DRPNetworkNode } from "../src/node.js"; diff --git a/packages/network/tests/network.test.ts b/packages/network/tests/network.test.ts index 360c00d87..de91c26df 100644 --- a/packages/network/tests/network.test.ts +++ b/packages/network/tests/network.test.ts @@ -6,11 +6,11 @@ import { type Libp2p, type SubscriptionChangeData, } from "@libp2p/interface"; -import { loadConfig } from "@ts-drp/node/src/config.js"; -import { Message } from "@ts-drp/types"; +import { type DRPNodeConfig, Message } from "@ts-drp/types"; import { raceEvent } from "race-event"; import { beforeAll, describe, expect, test, afterAll } from "vitest"; +import rawConfig from "../../../configs/local-bootstrap.json" with { type: "json" }; import { DRPNetworkNode, type DRPNetworkNodeConfig, streamToUint8Array } from "../src/node.js"; describe("DRPNetworkNode can connect & send messages", () => { @@ -42,9 +42,9 @@ describe("DRPNetworkNode can connect & send messages", () => { }; beforeAll(async () => { - const configPath = `${__dirname}/../../../configs/local-bootstrap.json`; + const config: DRPNodeConfig = rawConfig; const bootstrapConfig: DRPNetworkNodeConfig = { - ...loadConfig(configPath)?.network_config, + ...config.network_config, log_config: { level: "silent" }, }; bootstrapNode = new DRPNetworkNode(bootstrapConfig); diff --git a/packages/network/tsconfig.build.json b/packages/network/tsconfig.build.json new file mode 100644 index 000000000..07e127d11 --- /dev/null +++ b/packages/network/tsconfig.build.json @@ -0,0 +1 @@ +{"extends": "./tsconfig.json","exclude": ["tests/**/*.ts"]} diff --git a/packages/network/tsconfig.json b/packages/network/tsconfig.json index 48e3023fd..1d740f8d7 100644 --- a/packages/network/tsconfig.json +++ b/packages/network/tsconfig.json @@ -8,5 +8,8 @@ "path": "../logger" } ], - "include": ["src/**/*.ts"] + "include": [ + "src/**/*.ts", + "tests/**/*.ts" + ] } diff --git a/packages/node/package.json b/packages/node/package.json index bc9b88ad5..9d9410289 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -21,12 +21,13 @@ } }, "scripts": { - "build": "tsc -b", + "build": "tsc -b tsconfig.build.json", "clean": "rm -rf dist/ node_modules/", "cli": "tsx ./src/run.ts", "prebuild": "node -p \"'export const VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts", "prepack": "tsc -b", "test": "vitest", + "typecheck": "tsc --noEmit", "watch": "tsc -b -w" }, "devDependencies": { diff --git a/packages/node/src/config.ts b/packages/node/src/config.ts index 94b381888..52fc06c2a 100644 --- a/packages/node/src/config.ts +++ b/packages/node/src/config.ts @@ -1,8 +1,7 @@ +import type { DRPNodeConfig } from "@ts-drp/types"; import * as dotenv from "dotenv"; import fs from "node:fs"; -import type { DRPNodeConfig } from "./index.js"; - export function loadConfig(configPath?: string | undefined): DRPNodeConfig | undefined { let config: DRPNodeConfig | undefined; diff --git a/packages/node/src/handlers.ts b/packages/node/src/handlers.ts index 960c34e64..f864c57c3 100644 --- a/packages/node/src/handlers.ts +++ b/packages/node/src/handlers.ts @@ -3,7 +3,7 @@ import type { Stream } from "@libp2p/interface"; import { peerIdFromPublicKey } from "@libp2p/peer-id"; import { Signature } from "@noble/secp256k1"; import { streamToUint8Array } from "@ts-drp/network"; -import { HashGraph } from "@ts-drp/object"; +import { HashGraph, deserializeDRPState, serializeDRPState } from "@ts-drp/object"; import { AttestationUpdate, type DRPState, @@ -25,7 +25,6 @@ import * as crypto from "crypto"; import { type DRPNode } from "./index.js"; import { log } from "./logger.js"; -import { deserializeStateMessage, serializeStateMessage } from "./utils.js"; interface HandleParams { node: DRPNode; @@ -100,8 +99,8 @@ function fetchStateHandler({ node, message }: HandleParams): ReturnType<IHandler const response = FetchStateResponse.create({ objectId: fetchState.objectId, vertexHash: fetchState.vertexHash, - aclState: serializeStateMessage(aclState), - drpState: serializeStateMessage(drpState), + aclState: serializeDRPState(aclState), + drpState: serializeDRPState(drpState), }); const messageFetchStateResponse = Message.create({ @@ -130,8 +129,8 @@ function fetchStateResponseHandler({ node, message }: HandleParams): ReturnType< return; } - const aclState = deserializeStateMessage(fetchStateResponse.aclState); - const drpState = deserializeStateMessage(fetchStateResponse.drpState); + const aclState = deserializeDRPState(fetchStateResponse.aclState); + const drpState = deserializeDRPState(fetchStateResponse.drpState); if (fetchStateResponse.vertexHash === HashGraph.rootHash) { const state = aclState; object.aclStates.set(fetchStateResponse.vertexHash, state); diff --git a/packages/node/src/index.ts b/packages/node/src/index.ts index dd8d41426..8e0a6b150 100644 --- a/packages/node/src/index.ts +++ b/packages/node/src/index.ts @@ -1,29 +1,26 @@ import type { GossipsubMessage } from "@chainsafe/libp2p-gossipsub"; import type { EventCallback, IncomingStreamData, StreamHandler } from "@libp2p/interface"; -import { type KeychainConfig, Keychain } from "@ts-drp/keychain"; +import { Keychain } from "@ts-drp/keychain"; import { Logger } from "@ts-drp/logger"; -import { DRPNetworkNode, type DRPNetworkNodeConfig } from "@ts-drp/network"; +import { DRPNetworkNode } from "@ts-drp/network"; import { DRPObject } from "@ts-drp/object"; import { type IMetrics, + type DRPNodeConfig, Message, MessageType, type IACL, type IDRP, - type LoggerOptions, type IDRPObject, } from "@ts-drp/types"; +import { loadConfig } from "./config.js"; import { drpMessagesHandler } from "./handlers.js"; import { log } from "./logger.js"; import * as operations from "./operations.js"; import { DRPObjectStore } from "./store/index.js"; -// snake_casing to match the JSON config -export interface DRPNodeConfig { - log_config?: LoggerOptions; - network_config?: DRPNetworkNodeConfig; - keychain_config?: KeychainConfig; -} + +export { loadConfig }; export class DRPNode { config?: DRPNodeConfig; diff --git a/packages/node/src/run.ts b/packages/node/src/run.ts index e1cb5313d..12f1122ff 100644 --- a/packages/node/src/run.ts +++ b/packages/node/src/run.ts @@ -1,6 +1,8 @@ +import { type DRPNodeConfig } from "@ts-drp/types"; + import { program } from "./cli/index.js"; import { loadConfig } from "./config.js"; -import { type DRPNodeConfig, DRPNode } from "./index.js"; +import { DRPNode } from "./index.js"; import { init as rpc_init } from "./rpc/index.js"; export const run = async (port: number = 6969): Promise<void> => { diff --git a/packages/node/src/utils.ts b/packages/node/src/utils.ts deleted file mode 100644 index 9b436b765..000000000 --- a/packages/node/src/utils.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { deserializeValue, serializeValue } from "@ts-drp/object"; -import { - DRPState, - DRPStateEntry, - DRPStateEntryOtherTheWire, - DRPStateOtherTheWire, -} from "@ts-drp/types"; - -export function serializeStateMessage(state?: DRPState): DRPStateOtherTheWire { - const drpState = DRPStateOtherTheWire.create(); - for (const e of state?.state ?? []) { - const entry = DRPStateEntryOtherTheWire.create({ - key: e.key, - data: serializeValue(e.value), - }); - drpState.state.push(entry); - } - return drpState; -} - -export function deserializeStateMessage(state?: DRPStateOtherTheWire): DRPState { - const drpState = DRPState.create(); - - for (const e of state?.state ?? []) { - const entry = DRPStateEntry.create({ - key: e.key, - value: deserializeValue(e.data), - }); - drpState.state.push(entry); - } - return drpState; -} diff --git a/packages/node/tests/node.test.ts b/packages/node/tests/node.test.ts index 6c8147edc..53bc52bde 100644 --- a/packages/node/tests/node.test.ts +++ b/packages/node/tests/node.test.ts @@ -2,7 +2,7 @@ import { bls } from "@chainsafe/bls/herumi"; import { SetDRP } from "@ts-drp/blueprints"; import { Logger } from "@ts-drp/logger"; import { DRPObject, ObjectACL } from "@ts-drp/object"; -import { type DRP, DrpType, type Vertex, ACLGroup } from "@ts-drp/types"; +import { type IDRP, DrpType, type Vertex, ACLGroup } from "@ts-drp/types"; import { beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import { @@ -222,7 +222,7 @@ describe("DRPNode voting tests", () => { }); describe("DRPNode with rpc", () => { - let drp: DRP; + let drp: IDRP; let drpNode: DRPNode; let drpObject: DRPObject; let mockLogger: Logger; diff --git a/packages/node/tests/utils.test.ts b/packages/node/tests/utils.test.ts index bb62c2854..48690046a 100644 --- a/packages/node/tests/utils.test.ts +++ b/packages/node/tests/utils.test.ts @@ -1,9 +1,7 @@ -import { SetDRP } from "@ts-drp/blueprints/src/index.js"; -import { DRPObject } from "@ts-drp/object/src/index.js"; +import { SetDRP } from "@ts-drp/blueprints"; +import { DRPObject, deserializeDRPState, serializeDRPState } from "@ts-drp/object"; import { beforeAll, describe, expect, test } from "vitest"; -import { deserializeStateMessage, serializeStateMessage } from "../src/utils.js"; - describe("State message utils", () => { let object: DRPObject; @@ -20,8 +18,8 @@ describe("State message utils", () => { test("Should serialize/deserialize state message", () => { const state = object["_computeDRPState"].bind(object); - const serialized = serializeStateMessage(state(object.hashGraph.getFrontier())); - const deserialized = deserializeStateMessage(serialized); + const serialized = serializeDRPState(state(object.hashGraph.getFrontier())); + const deserialized = deserializeDRPState(serialized); expect(deserialized).toStrictEqual(state(object.hashGraph.getFrontier())); }); }); diff --git a/packages/node/tsconfig.build.json b/packages/node/tsconfig.build.json new file mode 100644 index 000000000..843981301 --- /dev/null +++ b/packages/node/tsconfig.build.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "exclude": [ + "tests/**/*.ts" + ] +} diff --git a/packages/node/tsconfig.json b/packages/node/tsconfig.json index b78d8d1c9..7f727758c 100644 --- a/packages/node/tsconfig.json +++ b/packages/node/tsconfig.json @@ -1,25 +1,11 @@ { "extends": "../../tsconfig.json", - "compilerOptions": { "outDir": "dist" }, - "references": [ - { - "path": "../blueprints" - }, - { - "path": "../network" - }, - { - "path": "../object" - }, - { - "path": "../logger" - }, - { - "path": "../keychain" - } - ], - "include": ["src/**/*.ts", "src/**/*.js"] + "include": [ + "src/**/*.ts", + "src/**/*.js", + "tests/**/*.ts" + ] } diff --git a/packages/object/package.json b/packages/object/package.json index 9ce596a0c..db7d82506 100644 --- a/packages/object/package.json +++ b/packages/object/package.json @@ -23,15 +23,17 @@ }, "scripts": { "benchmark": "tsx tests/hashgraph.bench.ts | tee benchmark-output.txt", - "build": "tsc -b", + "build": "tsc -b tsconfig.build.json", "clean": "rm -rf dist/ node_modules/", "prepack": "tsc -b", "test": "vitest", + "typecheck": "tsc --noEmit", "watch": "tsc -b -w" }, "devDependencies": { "@bufbuild/protobuf": "^2.0.0", "@ts-drp/blueprints": "^0.8.5", + "@ts-drp/keychain": "^0.8.5", "@types/benchmark": "^2.1.5", "benchmark": "^2.1.4", "pprof": "^4.0.0", @@ -43,7 +45,6 @@ "@ts-drp/logger": "^0.8.5", "@ts-drp/tracer": "^0.8.5", "@ts-drp/types": "^0.8.5", - "@types/node": "^22.5.4", "es-toolkit": "1.30.1", "fast-deep-equal": "^3.1.3", "fast-equals": "^5.2.2", diff --git a/packages/object/src/utils/serializer.ts b/packages/object/src/utils/serializer.ts index 082d7581b..300eb3040 100644 --- a/packages/object/src/utils/serializer.ts +++ b/packages/object/src/utils/serializer.ts @@ -1,4 +1,10 @@ import { encode, decode, ExtensionCodec } from "@msgpack/msgpack"; +import { + DRPState, + DRPStateEntry, + DRPStateEntryOtherTheWire, + DRPStateOtherTheWire, +} from "@ts-drp/types"; const extensionCodec = new ExtensionCodec(); @@ -66,3 +72,28 @@ export function serializeValue(obj: unknown): Uint8Array { export function deserializeValue(value: Uint8Array): unknown { return decode(value, { extensionCodec }); } + +export function serializeDRPState(state?: DRPState): DRPStateOtherTheWire { + const drpState = DRPStateOtherTheWire.create(); + for (const e of state?.state ?? []) { + const entry = DRPStateEntryOtherTheWire.create({ + key: e.key, + data: serializeValue(e.value), + }); + drpState.state.push(entry); + } + return drpState; +} + +export function deserializeDRPState(state?: DRPStateOtherTheWire): DRPState { + const drpState = DRPState.create(); + + for (const e of state?.state ?? []) { + const entry = DRPStateEntry.create({ + key: e.key, + value: deserializeValue(e.data), + }); + drpState.state.push(entry); + } + return drpState; +} diff --git a/packages/object/tests/actiontypes.test.ts b/packages/object/tests/actiontypes.test.ts index 939023b35..3f5fc269f 100644 --- a/packages/object/tests/actiontypes.test.ts +++ b/packages/object/tests/actiontypes.test.ts @@ -1,4 +1,4 @@ -import { AddMulDRP } from "@ts-drp/blueprints/src/AddMul/index.js"; +import { AddMulDRP } from "@ts-drp/blueprints"; import { beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; import { DRPObject, ObjectACL } from "../src/index.js"; diff --git a/packages/object/tests/causallyrelated.bench.ts b/packages/object/tests/causallyrelated.bench.ts index f61fe1ff7..fb29f5166 100644 --- a/packages/object/tests/causallyrelated.bench.ts +++ b/packages/object/tests/causallyrelated.bench.ts @@ -1,7 +1,8 @@ -import { SetDRP } from "@ts-drp/blueprints/src/index.js"; +import { SetDRP } from "@ts-drp/blueprints"; +import { type Hash } from "@ts-drp/types"; import { bench, describe } from "vitest"; -import { DRPObject, type Hash } from "../src/index.js"; +import { DRPObject } from "../src/index.js"; describe("AreCausallyDependent benchmark", () => { const samples = 100000; diff --git a/packages/object/tests/drpobject.test.ts b/packages/object/tests/drpobject.test.ts index 58d7a132a..1d8ab098e 100644 --- a/packages/object/tests/drpobject.test.ts +++ b/packages/object/tests/drpobject.test.ts @@ -1,8 +1,14 @@ -import { SetDRP } from "@ts-drp/blueprints/src/index.js"; -import { type Vertex, ActionType, SemanticsType } from "@ts-drp/types"; +import { SetDRP } from "@ts-drp/blueprints"; +import { + type IDRP, + type Vertex, + ActionType, + SemanticsType, + type ResolveConflictsType, +} from "@ts-drp/types"; import { beforeEach, describe, expect, it, test, vi } from "vitest"; -import { type DRP, DRPObject, ObjectACL, type ResolveConflictsType } from "../src/index.js"; +import { DRPObject, ObjectACL } from "../src/index.js"; const acl = new ObjectACL({ admins: new Map([ @@ -74,7 +80,7 @@ describe("Drp Object should be able to change state value", () => { describe("Test for duplicate call issue", () => { let counter = 0; - class CounterDRP implements DRP { + class CounterDRP implements IDRP { semanticsType = SemanticsType.pair; private _counter: number; diff --git a/packages/object/tests/finality.test.ts b/packages/object/tests/finality.test.ts index 915f00880..4fda1a24a 100644 --- a/packages/object/tests/finality.test.ts +++ b/packages/object/tests/finality.test.ts @@ -1,6 +1,6 @@ import { bls } from "@chainsafe/bls/herumi"; -import { SetDRP } from "@ts-drp/blueprints/src/index.js"; -import { Keychain } from "@ts-drp/keychain/src/keychain.js"; +import { SetDRP } from "@ts-drp/blueprints"; +import { Keychain } from "@ts-drp/keychain"; import { type Attestation, type AggregatedAttestation } from "@ts-drp/types"; import { toString as uint8ArrayToString } from "uint8arrays"; import { beforeEach, describe, expect, test } from "vitest"; diff --git a/packages/object/tests/hashgraph.bench.ts b/packages/object/tests/hashgraph.bench.ts index 23a760236..aa9d2a10e 100644 --- a/packages/object/tests/hashgraph.bench.ts +++ b/packages/object/tests/hashgraph.bench.ts @@ -1,7 +1,8 @@ -import { MapDRP, SetDRP } from "@ts-drp/blueprints/src/index.js"; +import { MapDRP, SetDRP } from "@ts-drp/blueprints"; +import { type IDRP } from "@ts-drp/types"; import Benchmark from "benchmark"; -import { type DRP, DRPObject, ObjectACL } from "../src/index.js"; +import { DRPObject, ObjectACL } from "../src/index.js"; const acl = new ObjectACL({ admins: new Map([["peer1", { secp256k1PublicKey: "pubKey1", blsPublicKey: "pubKey1" }]]), @@ -71,7 +72,7 @@ suite.add("Create a HashGraph with 1000 operations for set wins map", () => { acl, drp: new MapDRP<number, number>(), }); - const drp = object.drp as DRP as MapDRP<number, number>; + const drp = object.drp as IDRP as MapDRP<number, number>; for (let i = 0; i < 1000; ++i) { drp.set(i, i); } @@ -83,7 +84,7 @@ suite.add(`Create a HashGraph with ${NUMBER_OF_OPERATIONS} operations for set wi acl, drp: new MapDRP<number, number>(), }); - const drp = object.drp as DRP as MapDRP<number, number>; + const drp = object.drp as IDRP as MapDRP<number, number>; for (let i = 0; i < NUMBER_OF_OPERATIONS; ++i) { drp.set(i, i); } @@ -97,7 +98,7 @@ suite.add( acl, drp: new MapDRP<number, number>(), }); - const drp = object.drp as DRP as MapDRP<number, number>; + const drp = object.drp as IDRP as MapDRP<number, number>; for (let i = 0; i < NUMBER_OF_OPERATIONS; ++i) { drp.set(i, i); } @@ -115,7 +116,7 @@ suite.add( acl, drp: new MapDRP<number, number>(), }); - const drp = object.drp as DRP as MapDRP<number, number>; + const drp = object.drp as IDRP as MapDRP<number, number>; for (let i = 0; i < NUMBER_OF_OPERATIONS; ++i) { drp.set(i, i); } @@ -134,7 +135,7 @@ suite.add( acl, drp: new MapDRP<number, number>(), }); - const drp = object.drp as DRP as MapDRP<number, number>; + const drp = object.drp as IDRP as MapDRP<number, number>; for (let i = 0; i < 250; i += 4) { drp.set(i, i); if (i % 2 === 0) { @@ -179,7 +180,7 @@ suite.add( acl, drp: new MapDRP<number, number>(), }); - const drp1 = object1.drp as DRP as MapDRP<number, number>; + const drp1 = object1.drp as IDRP as MapDRP<number, number>; initialize(drp1); const object2: DRPObject = new DRPObject({ @@ -187,7 +188,7 @@ suite.add( acl, drp: new MapDRP<number, number>(), }); - const drp2 = object2.drp as DRP as MapDRP<number, number>; + const drp2 = object2.drp as IDRP as MapDRP<number, number>; initialize(drp2); object1.merge(object2.hashGraph.getAllVertices()); diff --git a/packages/object/tests/hashgraph.flamegraph.ts b/packages/object/tests/hashgraph.flamegraph.ts index 0995469bf..2fe1735d5 100644 --- a/packages/object/tests/hashgraph.flamegraph.ts +++ b/packages/object/tests/hashgraph.flamegraph.ts @@ -1,4 +1,4 @@ -import { SetDRP } from "@ts-drp/blueprints/src/index.js"; +import { SetDRP } from "@ts-drp/blueprints"; import fs from "fs"; import * as pprof from "pprof"; diff --git a/packages/object/tests/hashgraph.test.ts b/packages/object/tests/hashgraph.test.ts index f3605778e..fc65cb6e4 100644 --- a/packages/object/tests/hashgraph.test.ts +++ b/packages/object/tests/hashgraph.test.ts @@ -7,7 +7,7 @@ import { type Hash, DrpType, ACLGroup, - type DRP, + type IDRP, } from "@ts-drp/types"; import { beforeAll, beforeEach, describe, expect, test, vi } from "vitest"; @@ -884,8 +884,8 @@ describe("HashGraph for set wins map tests", () => { \ -- V2:SET("key2, "value2") */ - const drp1 = obj1.drp as DRP as MapDRP<string, string>; - const drp2 = obj2.drp as DRP as MapDRP<string, string>; + const drp1 = obj1.drp as IDRP as MapDRP<string, string>; + const drp2 = obj2.drp as IDRP as MapDRP<string, string>; drp1.set("key1", "value1"); drp2.set("key2", "value2"); drp1.delete("key1"); @@ -906,8 +906,8 @@ describe("HashGraph for set wins map tests", () => { --- V2:SET("key1", "value1") -- V3:DELETE("key1") -- V4:SET("key2", "value2") */ - const drp1 = obj1.drp as DRP as MapDRP<string, string>; - const drp2 = obj2.drp as DRP as MapDRP<string, string>; + const drp1 = obj1.drp as IDRP as MapDRP<string, string>; + const drp2 = obj2.drp as IDRP as MapDRP<string, string>; drp1.set("key1", "value2"); // smaller hash drp2.set("key1", "value1"); // greater hash @@ -935,9 +935,9 @@ describe("HashGraph for set wins map tests", () => { \ ----------------------------\ -- V6:SET("key2", "eulav3") ---------------------------------------------------- v8:SET("key1", "value") */ - const drp1 = obj1.drp as DRP as MapDRP<string, string>; - const drp2 = obj2.drp as DRP as MapDRP<string, string>; - const drp3 = obj3.drp as DRP as MapDRP<string, string>; + const drp1 = obj1.drp as IDRP as MapDRP<string, string>; + const drp2 = obj2.drp as IDRP as MapDRP<string, string>; + const drp3 = obj3.drp as IDRP as MapDRP<string, string>; drp1.set("key1", "value1"); drp1.delete("key2"); @@ -985,8 +985,8 @@ describe("HashGraph for delete wins map tests", () => { \ -- V2:SET("key1", "value2") -- DELETE("key1") */ - const drp1 = obj1.drp as DRP as MapDRP<string, string>; - const drp2 = obj2.drp as DRP as MapDRP<string, string>; + const drp1 = obj1.drp as IDRP as MapDRP<string, string>; + const drp2 = obj2.drp as IDRP as MapDRP<string, string>; drp1.set("key1", "value1"); // greater hash drp2.set("key1", "value2"); // smaller hash @@ -1006,8 +1006,8 @@ describe("HashGraph for delete wins map tests", () => { --V2:SET("key1", "value1") -- V4:SET("key2", "value3") */ - const drp1 = obj1.drp as DRP as MapDRP<string, string>; - const drp2 = obj2.drp as DRP as MapDRP<string, string>; + const drp1 = obj1.drp as IDRP as MapDRP<string, string>; + const drp2 = obj2.drp as IDRP as MapDRP<string, string>; drp1.set("key1", "value2"); drp2.set("key1", "value1"); @@ -1048,8 +1048,8 @@ describe("Hash validation tests", () => { }); test("Should accept vertices with valid hash", () => { - const drp1 = obj1.drp as DRP as MapDRP<string, string>; - const drp2 = obj2.drp as DRP as MapDRP<string, string>; + const drp1 = obj1.drp as IDRP as MapDRP<string, string>; + const drp2 = obj2.drp as IDRP as MapDRP<string, string>; drp1.set("key1", "value1"); drp2.set("key2", "value2"); diff --git a/packages/object/tests/serializer.bench.ts b/packages/object/tests/serializer.bench.ts index c0eb514dc..52519e0dd 100644 --- a/packages/object/tests/serializer.bench.ts +++ b/packages/object/tests/serializer.bench.ts @@ -1,8 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import Benchmark from "benchmark"; -import { deserializeValue } from "../dist/src/index.js"; -import { serializeValue } from "../src/utils/serializer.js"; +import { serializeValue, deserializeValue } from "../src/utils/serializer.js"; function createNestedObject(depth: number, breadth: number): any { if (depth <= 0) { return { diff --git a/packages/object/tests/utils.test.ts b/packages/object/tests/utils.test.ts index 7b0b83fff..64becc6fd 100644 --- a/packages/object/tests/utils.test.ts +++ b/packages/object/tests/utils.test.ts @@ -1,10 +1,16 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { SetDRP } from "@ts-drp/blueprints/src/index.js"; -import { serializeStateMessage, deserializeStateMessage } from "@ts-drp/node/src/utils.js"; +import { SetDRP } from "@ts-drp/blueprints"; import { FetchStateResponse } from "@ts-drp/types"; import { expect, describe, it } from "vitest"; -import { DRPObject, HashGraph, serializeValue, deserializeValue } from "../src/index.js"; +import { + DRPObject, + HashGraph, + serializeValue, + deserializeValue, + serializeDRPState, + deserializeDRPState, +} from "../src/index.js"; class TestCustomClass { constructor( @@ -231,13 +237,13 @@ describe("Serialize & deserialize", () => { const response = FetchStateResponse.create({ objectId: "test", vertexHash: "test", - aclState: serializeStateMessage(aclState), - drpState: serializeStateMessage(drpState), + aclState: serializeDRPState(aclState), + drpState: serializeDRPState(drpState), }); const data = FetchStateResponse.encode(response).finish(); const decoded = FetchStateResponse.decode(data); - const aclStateDecoded = deserializeStateMessage(decoded.aclState); - const drpStateDecoded = deserializeStateMessage(decoded.drpState); + const aclStateDecoded = deserializeDRPState(decoded.aclState); + const drpStateDecoded = deserializeDRPState(decoded.drpState); expect(aclStateDecoded).toStrictEqual(aclState); expect(drpStateDecoded).toStrictEqual(drpState); }); diff --git a/packages/object/tsconfig.build.json b/packages/object/tsconfig.build.json new file mode 100644 index 000000000..f927c80c5 --- /dev/null +++ b/packages/object/tsconfig.build.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "exclude": [ + "dist", + "tests/**/*.ts" + ] +} diff --git a/packages/object/tsconfig.json b/packages/object/tsconfig.json index 48e3023fd..842881500 100644 --- a/packages/object/tsconfig.json +++ b/packages/object/tsconfig.json @@ -3,10 +3,12 @@ "compilerOptions": { "outDir": "dist" }, - "references": [ - { - "path": "../logger" - } + "include": [ + "src/**/*.ts", + "tests/**/*.ts" ], - "include": ["src/**/*.ts"] + "exclude": [ + "dist", + "./*.d.ts", + ] } diff --git a/packages/tracer/package.json b/packages/tracer/package.json index e0c3fbd64..cc0ee69af 100644 --- a/packages/tracer/package.json +++ b/packages/tracer/package.json @@ -21,9 +21,10 @@ } }, "scripts": { - "build": "tsc -b", + "build": "tsc -b tsconfig.build.json", "clean": "rm -rf dist/ node_modules/", "prepack": "tsc -b", + "typecheck": "tsc --noEmit", "watch": "tsc -b -w" }, "dependencies": { diff --git a/packages/tracer/tsconfig.build.json b/packages/tracer/tsconfig.build.json new file mode 100644 index 000000000..07e127d11 --- /dev/null +++ b/packages/tracer/tsconfig.build.json @@ -0,0 +1 @@ +{"extends": "./tsconfig.json","exclude": ["tests/**/*.ts"]} diff --git a/packages/tracer/tsconfig.json b/packages/tracer/tsconfig.json index 9cc8b37cd..0ca984477 100644 --- a/packages/tracer/tsconfig.json +++ b/packages/tracer/tsconfig.json @@ -3,5 +3,8 @@ "compilerOptions": { "outDir": "dist" }, - "include": ["src/**/*.ts"] + "include": [ + "src/**/*.ts", + "tests/**/*.ts" + ] } diff --git a/packages/types/package.json b/packages/types/package.json index 6e6a312b0..a3d1db727 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -21,9 +21,10 @@ } }, "scripts": { - "build": "tsc -b", + "build": "tsc -b tsconfig.build.json", "clean": "rm -rf dist/ node_modules/", "prepack": "tsc -b", + "typecheck": "tsc --noEmit", "watch": "tsc -b -w" }, "dependencies": { diff --git a/packages/types/tsconfig.build.json b/packages/types/tsconfig.build.json new file mode 100644 index 000000000..e23113e7f --- /dev/null +++ b/packages/types/tsconfig.build.json @@ -0,0 +1,8 @@ +{ + "extends": "./tsconfig.json", + "exclude": [ + "tests/**/*.ts", + "test/**/*.ts", + "tests/**/*.js" + ] +} diff --git a/packages/types/tsconfig.json b/packages/types/tsconfig.json index 350ad9a93..80b332a26 100644 --- a/packages/types/tsconfig.json +++ b/packages/types/tsconfig.json @@ -5,6 +5,8 @@ }, "include": [ "src/**/*.ts", - "src/**/*.js" + "src/**/*.js", + "tests/**/*.ts", + "tests/**/*.js" ] } diff --git a/packages/utils/package.json b/packages/utils/package.json index ec69a48a6..96c73d606 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -21,12 +21,13 @@ } }, "scripts": { - "build": "tsc -b", + "build": "tsc -b tsconfig.build.json", "clean": "rm -rf dist/ node_modules/", "cli": "tsx ./src/run.ts", "prebuild": "node -p \"'export const VERSION = ' + JSON.stringify(require('./package.json').version) + ';'\" > src/version.ts", "prepack": "tsc -b", "test": "vitest", + "typecheck": "tsc --noEmit", "watch": "tsc -b -w" } } diff --git a/packages/utils/tsconfig.build.json b/packages/utils/tsconfig.build.json new file mode 100644 index 000000000..07e127d11 --- /dev/null +++ b/packages/utils/tsconfig.build.json @@ -0,0 +1 @@ +{"extends": "./tsconfig.json","exclude": ["tests/**/*.ts"]} diff --git a/packages/utils/tsconfig.json b/packages/utils/tsconfig.json index d37ac717a..0ca984477 100644 --- a/packages/utils/tsconfig.json +++ b/packages/utils/tsconfig.json @@ -4,6 +4,7 @@ "outDir": "dist" }, "include": [ - "src/**/*.ts" + "src/**/*.ts", + "tests/**/*.ts" ] } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eadab3205..98adf6ddf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,7 +20,7 @@ importers: version: 9.21.0 '@playwright/test': specifier: ^1.49.1 - version: 1.50.1 + version: 1.51.0 '@release-it-plugins/workspaces': specifier: ^4.2.0 version: 4.2.0(release-it@17.11.0(typescript@5.8.2)) @@ -28,8 +28,8 @@ importers: specifier: ^8.21.0 version: 8.26.0(eslint@9.21.0)(typescript@5.8.2) '@vitest/coverage-v8': - specifier: 3.0.5 - version: 3.0.5(vitest@3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)) + specifier: ^3.0.5 + version: 3.0.8(vitest@3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)) assemblyscript: specifier: ^0.27.29 version: 0.27.34 @@ -38,7 +38,7 @@ importers: version: 9.21.0 eslint-config-prettier: specifier: ^10.0.1 - version: 10.0.2(eslint@9.21.0) + version: 10.1.0(eslint@9.21.0) eslint-import-resolver-typescript: specifier: ^3.8.3 version: 3.8.3(eslint-plugin-import@2.31.0)(eslint@9.21.0) @@ -47,13 +47,13 @@ importers: version: 2.31.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint-import-resolver-typescript@3.8.3)(eslint@9.21.0) eslint-plugin-prettier: specifier: ^5.2.3 - version: 5.2.3(eslint-config-prettier@10.0.2(eslint@9.21.0))(eslint@9.21.0)(prettier@3.5.3) + version: 5.2.3(eslint-config-prettier@10.1.0(eslint@9.21.0))(eslint@9.21.0)(prettier@3.5.3) eslint-plugin-unused-imports: specifier: ^4.1.4 version: 4.1.4(@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0) eslint-plugin-vitest: specifier: ^0.5.4 - version: 0.5.4(@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)(vitest@3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)) + version: 0.5.4(@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)(vitest@3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)) globals: specifier: ^16.0.0 version: 16.0.0 @@ -80,13 +80,13 @@ importers: version: 8.26.0(eslint@9.21.0)(typescript@5.8.2) vite: specifier: ^6.0.9 - version: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) + version: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) vite-tsconfig-paths: specifier: ^5.0.1 - version: 5.1.4(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)) + version: 5.1.4(typescript@5.8.2)(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)) vitest: specifier: ^3.0.5 - version: 3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) + version: 3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) examples/canvas: dependencies: @@ -108,10 +108,10 @@ importers: version: 5.8.2 vite: specifier: ^6.0.9 - version: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) + version: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.34.9)(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)) + version: 0.22.0(rollup@4.34.9)(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)) examples/chat: dependencies: @@ -133,10 +133,10 @@ importers: version: 5.8.2 vite: specifier: ^6.0.9 - version: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) + version: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.34.9)(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)) + version: 0.22.0(rollup@4.34.9)(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)) examples/grid: dependencies: @@ -161,10 +161,10 @@ importers: version: 5.8.2 vite: specifier: ^6.0.9 - version: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) + version: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.34.9)(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)) + version: 0.22.0(rollup@4.34.9)(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)) examples/local-bootstrap: dependencies: @@ -180,19 +180,16 @@ importers: version: 5.8.2 vite: specifier: ^6.0.9 - version: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) + version: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) vite-plugin-node-polyfills: specifier: ^0.22.0 - version: 0.22.0(rollup@4.34.9)(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)) + version: 0.22.0(rollup@4.34.9)(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)) packages/blueprints: dependencies: '@thi.ng/random': specifier: ^4.1.0 version: 4.1.12 - '@ts-drp/object': - specifier: 0.8.5 - version: link:../object '@ts-drp/types': specifier: 0.8.5 version: link:../types @@ -229,9 +226,6 @@ importers: '@noble/secp256k1': specifier: ^2.2.3 version: 2.2.3 - '@ts-drp/object': - specifier: 0.8.5 - version: link:../object '@ts-drp/types': specifier: ^0.8.5 version: link:../types @@ -336,6 +330,9 @@ importers: specifier: ^5.1.0 version: 5.1.0 devDependencies: + '@ts-drp/keychain': + specifier: 0.8.5 + version: link:../keychain race-event: specifier: ^1.3.0 version: 1.3.0 @@ -417,7 +414,7 @@ importers: version: 4.19.1 vitest: specifier: ^3.0.5 - version: 3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) + version: 3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) packages/object: dependencies: @@ -436,9 +433,6 @@ importers: '@ts-drp/types': specifier: ^0.8.5 version: link:../types - '@types/node': - specifier: ^22.5.4 - version: 22.13.9 es-toolkit: specifier: 1.30.1 version: 1.30.1 @@ -458,6 +452,9 @@ importers: '@ts-drp/blueprints': specifier: ^0.8.5 version: link:../blueprints + '@ts-drp/keychain': + specifier: ^0.8.5 + version: link:../keychain '@types/benchmark': specifier: ^2.1.5 version: 2.1.5 @@ -1995,8 +1992,8 @@ packages: resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@playwright/test@1.50.1': - resolution: {integrity: sha512-Jii3aBg+CEDpgnuDxEp/h7BimHcUTDlpEtce89xEumlJ5ef2hqepZ+PWp1DDpYC/VO9fmWVI1IlEaoI5fK9FXQ==} + '@playwright/test@1.51.0': + resolution: {integrity: sha512-dJ0dMbZeHhI+wb77+ljx/FeC8VBP6j/rj9OAojO08JI80wTZy6vRk9KvHKiDCUh4iMpEiseMgqRBIeW+eKX6RA==} engines: {node: '>=18'} hasBin: true @@ -2452,20 +2449,20 @@ packages: '@ungap/structured-clone@1.3.0': resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==} - '@vitest/coverage-v8@3.0.5': - resolution: {integrity: sha512-zOOWIsj5fHh3jjGwQg+P+J1FW3s4jBu1Zqga0qW60yutsBtqEqNEJKWYh7cYn1yGD+1bdPsPdC/eL4eVK56xMg==} + '@vitest/coverage-v8@3.0.8': + resolution: {integrity: sha512-y7SAKsQirsEJ2F8bulBck4DoluhI2EEgTimHd6EEUgJBGKy9tC25cpywh1MH4FvDGoG2Unt7+asVd1kj4qOSAw==} peerDependencies: - '@vitest/browser': 3.0.5 - vitest: 3.0.5 + '@vitest/browser': 3.0.8 + vitest: 3.0.8 peerDependenciesMeta: '@vitest/browser': optional: true - '@vitest/expect@3.0.7': - resolution: {integrity: sha512-QP25f+YJhzPfHrHfYHtvRn+uvkCFCqFtW9CktfBxmB+25QqWsx7VB2As6f4GmwllHLDhXNHvqedwhvMmSnNmjw==} + '@vitest/expect@3.0.8': + resolution: {integrity: sha512-Xu6TTIavTvSSS6LZaA3EebWFr6tsoXPetOWNMOlc7LO88QVVBwq2oQWBoDiLCN6YTvNYsGSjqOO8CAdjom5DCQ==} - '@vitest/mocker@3.0.7': - resolution: {integrity: sha512-qui+3BLz9Eonx4EAuR/i+QlCX6AUZ35taDQgwGkK/Tw6/WgwodSrjN1X2xf69IA/643ZX5zNKIn2svvtZDrs4w==} + '@vitest/mocker@3.0.8': + resolution: {integrity: sha512-n3LjS7fcW1BCoF+zWZxG7/5XvuYH+lsFg+BDwwAz0arIwHQJFUEsKBQ0BLU49fCxuM/2HSeBPHQD8WjgrxMfow==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -2475,20 +2472,20 @@ packages: vite: optional: true - '@vitest/pretty-format@3.0.7': - resolution: {integrity: sha512-CiRY0BViD/V8uwuEzz9Yapyao+M9M008/9oMOSQydwbwb+CMokEq3XVaF3XK/VWaOK0Jm9z7ENhybg70Gtxsmg==} + '@vitest/pretty-format@3.0.8': + resolution: {integrity: sha512-BNqwbEyitFhzYMYHUVbIvepOyeQOSFA/NeJMIP9enMntkkxLgOcgABH6fjyXG85ipTgvero6noreavGIqfJcIg==} - '@vitest/runner@3.0.7': - resolution: {integrity: sha512-WeEl38Z0S2ZcuRTeyYqaZtm4e26tq6ZFqh5y8YD9YxfWuu0OFiGFUbnxNynwLjNRHPsXyee2M9tV7YxOTPZl2g==} + '@vitest/runner@3.0.8': + resolution: {integrity: sha512-c7UUw6gEcOzI8fih+uaAXS5DwjlBaCJUo7KJ4VvJcjL95+DSR1kova2hFuRt3w41KZEFcOEiq098KkyrjXeM5w==} - '@vitest/snapshot@3.0.7': - resolution: {integrity: sha512-eqTUryJWQN0Rtf5yqCGTQWsCFOQe4eNz5Twsu21xYEcnFJtMU5XvmG0vgebhdLlrHQTSq5p8vWHJIeJQV8ovsA==} + '@vitest/snapshot@3.0.8': + resolution: {integrity: sha512-x8IlMGSEMugakInj44nUrLSILh/zy1f2/BgH0UeHpNyOocG18M9CWVIFBaXPt8TrqVZWmcPjwfG/ht5tnpba8A==} - '@vitest/spy@3.0.7': - resolution: {integrity: sha512-4T4WcsibB0B6hrKdAZTM37ekuyFZt2cGbEGd2+L0P8ov15J1/HUsUaqkXEQPNAWr4BtPPe1gI+FYfMHhEKfR8w==} + '@vitest/spy@3.0.8': + resolution: {integrity: sha512-MR+PzJa+22vFKYb934CejhR4BeRpMSoxkvNoDit68GQxRLSf11aT6CTj3XaqUU9rxgWJFnqicN/wxw6yBRkI1Q==} - '@vitest/utils@3.0.7': - resolution: {integrity: sha512-xePVpCRfooFX3rANQjwoditoXgWb1MaFbzmGuPP59MK6i13mrnDw/yEIyJudLeW6/38mCNcwCiJIGmpDPibAIg==} + '@vitest/utils@3.0.8': + resolution: {integrity: sha512-nkBC3aEhfX2PdtQI/QwAWp8qZWwzASsU4Npbcd5RdMPBSSLCpkZp52P3xku3s3uA0HIEhGvEcF8rNkBsz9dQ4Q==} abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -3245,8 +3242,8 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - electron-to-chromium@1.5.112: - resolution: {integrity: sha512-oen93kVyqSb3l+ziUgzIOlWt/oOuy4zRmpwestMn4rhFWAoFJeFuCVte9F2fASjeZZo7l/Cif9TiyrdW4CwEMA==} + electron-to-chromium@1.5.113: + resolution: {integrity: sha512-wjT2O4hX+wdWPJ76gWSkMhcHAV2PTMX+QetUCPYEdCIe+cxmgzzSSiGRCKW8nuh4mwKZlpv0xvoW7OF2X+wmHg==} elliptic@6.6.1: resolution: {integrity: sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==} @@ -3363,8 +3360,8 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-prettier@10.0.2: - resolution: {integrity: sha512-1105/17ZIMjmCOJOPNfVdbXafLCLj3hPmkmB7dLgt7XsQ/zkxSuDerE/xgO3RxoHysR1N1whmquY0lSn2O0VLg==} + eslint-config-prettier@10.1.0: + resolution: {integrity: sha512-EZxtSSOjkmuRfrDZxcnRgLy8ea/hVGcsCj1zFIKiAZ3SJJOz0Pdusq2FFj0qJrFcpg2KzCo8j8bjInYpgMsdgA==} hasBin: true peerDependencies: eslint: '>=7.0.0' @@ -5102,13 +5099,13 @@ packages: platform@1.3.6: resolution: {integrity: sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==} - playwright-core@1.50.1: - resolution: {integrity: sha512-ra9fsNWayuYumt+NiM069M6OkcRb1FZSK8bgi66AtpFoWkg2+y0bJSNmkFrWhMbEBbVKC/EruAHH3g0zmtwGmQ==} + playwright-core@1.51.0: + resolution: {integrity: sha512-x47yPE3Zwhlil7wlNU/iktF7t2r/URR3VLbH6EknJd/04Qc/PSJ0EY3CMXipmglLG+zyRxW6HNo2EGbKLHPWMg==} engines: {node: '>=18'} hasBin: true - playwright@1.50.1: - resolution: {integrity: sha512-G8rwsOQJ63XG6BbKj2w5rHeavFjy5zynBA9zsJMMtBoe/Uf757oG12NXz6e6OirF7RCrTVAKFXbLmn1RbL7Qaw==} + playwright@1.51.0: + resolution: {integrity: sha512-442pTfGM0xxfCYxuBa/Pu6B2OqxqqaYq39JS8QDMGThUvIOCd6s0ANDog3uwA0cHavVlnTQzGCN7Id2YekDSXA==} engines: {node: '>=18'} hasBin: true @@ -6072,8 +6069,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite-node@3.0.7: - resolution: {integrity: sha512-2fX0QwX4GkkkpULXdT1Pf4q0tC1i1lFOyseKoonavXUNlQ77KpW2XqBGGNIm/J4Ows4KxgGJzDguYVPKwG/n5A==} + vite-node@3.0.8: + resolution: {integrity: sha512-6PhR4H9VGlcwXZ+KWCdMqbtG649xCPZqfI9j2PsK1FcXgEzro5bGHcVKFCTqPLaNKZES8Evqv4LwvZARsq5qlg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true @@ -6090,8 +6087,8 @@ packages: vite: optional: true - vite@6.2.0: - resolution: {integrity: sha512-7dPxoo+WsT/64rDcwoOjk76XHj+TqNTIvHKcuMQ1k4/SeHDaQt5GFAeLYzrimZrMpn/O6DtdI03WUjdxuPM0oQ==} + vite@6.2.1: + resolution: {integrity: sha512-n2GnqDb6XPhlt9B8olZPrgMD/es/Nd1RdChF6CBD/fHW6pUyUTt2sQW2fPRX5GiD9XEa6+8A6A4f2vT6pSsE7Q==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -6130,16 +6127,16 @@ packages: yaml: optional: true - vitest@3.0.7: - resolution: {integrity: sha512-IP7gPK3LS3Fvn44x30X1dM9vtawm0aesAa2yBIZ9vQf+qB69NXC5776+Qmcr7ohUXIQuLhk7xQR0aSUIDPqavg==} + vitest@3.0.8: + resolution: {integrity: sha512-dfqAsNqRGUc8hB9OVR2P0w8PZPEckti2+5rdZip0WIz9WW0MnImJ8XiR61QhqLa92EQzKP2uPkzenKOAHyEIbA==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.0.7 - '@vitest/ui': 3.0.7 + '@vitest/browser': 3.0.8 + '@vitest/ui': 3.0.8 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -8251,9 +8248,9 @@ snapshots: '@pkgr/core@0.1.1': {} - '@playwright/test@1.50.1': + '@playwright/test@1.51.0': dependencies: - playwright: 1.50.1 + playwright: 1.51.0 '@pnpm/config.env-replace@1.1.0': {} @@ -8788,7 +8785,7 @@ snapshots: '@ungap/structured-clone@1.3.0': {} - '@vitest/coverage-v8@3.0.5(vitest@3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))': + '@vitest/coverage-v8@3.0.8(vitest@3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))': dependencies: '@ampproject/remapping': 2.3.0 '@bcoe/v8-coverage': 1.0.2 @@ -8802,47 +8799,47 @@ snapshots: std-env: 3.8.1 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) + vitest: 3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) transitivePeerDependencies: - supports-color - '@vitest/expect@3.0.7': + '@vitest/expect@3.0.8': dependencies: - '@vitest/spy': 3.0.7 - '@vitest/utils': 3.0.7 + '@vitest/spy': 3.0.8 + '@vitest/utils': 3.0.8 chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.7(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))': + '@vitest/mocker@3.0.8(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0))': dependencies: - '@vitest/spy': 3.0.7 + '@vitest/spy': 3.0.8 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) - '@vitest/pretty-format@3.0.7': + '@vitest/pretty-format@3.0.8': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.0.7': + '@vitest/runner@3.0.8': dependencies: - '@vitest/utils': 3.0.7 + '@vitest/utils': 3.0.8 pathe: 2.0.3 - '@vitest/snapshot@3.0.7': + '@vitest/snapshot@3.0.8': dependencies: - '@vitest/pretty-format': 3.0.7 + '@vitest/pretty-format': 3.0.8 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.0.7': + '@vitest/spy@3.0.8': dependencies: tinyspy: 3.0.2 - '@vitest/utils@3.0.7': + '@vitest/utils@3.0.8': dependencies: - '@vitest/pretty-format': 3.0.7 + '@vitest/pretty-format': 3.0.8 loupe: 3.1.3 tinyrainbow: 2.0.0 @@ -9237,7 +9234,7 @@ snapshots: browserslist@4.24.4: dependencies: caniuse-lite: 1.0.30001702 - electron-to-chromium: 1.5.112 + electron-to-chromium: 1.5.113 node-releases: 2.0.19 update-browserslist-db: 1.1.3(browserslist@4.24.4) @@ -9680,7 +9677,7 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.112: {} + electron-to-chromium@1.5.113: {} elliptic@6.6.1: dependencies: @@ -9883,7 +9880,7 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-prettier@10.0.2(eslint@9.21.0): + eslint-config-prettier@10.1.0(eslint@9.21.0): dependencies: eslint: 9.21.0 @@ -9950,14 +9947,14 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.0.2(eslint@9.21.0))(eslint@9.21.0)(prettier@3.5.3): + eslint-plugin-prettier@5.2.3(eslint-config-prettier@10.1.0(eslint@9.21.0))(eslint@9.21.0)(prettier@3.5.3): dependencies: eslint: 9.21.0 prettier: 3.5.3 prettier-linter-helpers: 1.0.0 synckit: 0.9.2 optionalDependencies: - eslint-config-prettier: 10.0.2(eslint@9.21.0) + eslint-config-prettier: 10.1.0(eslint@9.21.0) eslint-plugin-unused-imports@4.1.4(@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0): dependencies: @@ -9965,13 +9962,13 @@ snapshots: optionalDependencies: '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2) - eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)(vitest@3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)): + eslint-plugin-vitest@0.5.4(@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2)(vitest@3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)): dependencies: '@typescript-eslint/utils': 7.18.0(eslint@9.21.0)(typescript@5.8.2) eslint: 9.21.0 optionalDependencies: '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.21.0)(typescript@5.8.2))(eslint@9.21.0)(typescript@5.8.2) - vitest: 3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) + vitest: 3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) transitivePeerDependencies: - supports-color - typescript @@ -11902,11 +11899,11 @@ snapshots: platform@1.3.6: {} - playwright-core@1.50.1: {} + playwright-core@1.51.0: {} - playwright@1.50.1: + playwright@1.51.0: dependencies: - playwright-core: 1.50.1 + playwright-core: 1.51.0 optionalDependencies: fsevents: 2.3.2 @@ -13080,13 +13077,13 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-node@3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0): + vite-node@3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -13101,26 +13098,26 @@ snapshots: - tsx - yaml - vite-plugin-node-polyfills@0.22.0(rollup@4.34.9)(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)): + vite-plugin-node-polyfills@0.22.0(rollup@4.34.9)(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)): dependencies: '@rollup/plugin-inject': 5.0.5(rollup@4.34.9) node-stdlib-browser: 1.3.1 - vite: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) transitivePeerDependencies: - rollup - vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)): + vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)): dependencies: debug: 4.4.0 globrex: 0.1.2 tsconfck: 3.1.5(typescript@5.8.2) optionalDependencies: - vite: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) transitivePeerDependencies: - supports-color - typescript - vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0): + vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0): dependencies: esbuild: 0.25.0 postcss: 8.5.3 @@ -13132,15 +13129,15 @@ snapshots: tsx: 4.19.1 yaml: 2.7.0 - vitest@3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0): + vitest@3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0): dependencies: - '@vitest/expect': 3.0.7 - '@vitest/mocker': 3.0.7(vite@6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)) - '@vitest/pretty-format': 3.0.7 - '@vitest/runner': 3.0.7 - '@vitest/snapshot': 3.0.7 - '@vitest/spy': 3.0.7 - '@vitest/utils': 3.0.7 + '@vitest/expect': 3.0.8 + '@vitest/mocker': 3.0.8(vite@6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0)) + '@vitest/pretty-format': 3.0.8 + '@vitest/runner': 3.0.8 + '@vitest/snapshot': 3.0.8 + '@vitest/spy': 3.0.8 + '@vitest/utils': 3.0.8 chai: 5.2.0 debug: 4.4.0 expect-type: 1.2.0 @@ -13151,8 +13148,8 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.0(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) - vite-node: 3.0.7(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) + vite: 6.2.1(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) + vite-node: 3.0.8(@types/node@22.13.9)(terser@5.39.0)(tsx@4.19.1)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.13.9