From e686f808ff95f44b7b46cf0feac5a7862bc5a6dc Mon Sep 17 00:00:00 2001 From: Meno Abels Date: Tue, 16 Sep 2025 13:48:22 +0200 Subject: [PATCH 01/26] wip: concrete lower model without runtime switch [skip ci] --- core/blockstore/package.json | 1 + core/blockstore/register-store-protocol.ts | 25 +- core/gateways/file/fp-sync.ts | 8 + core/gateways/file/index.ts | 1 + core/gateways/file/package.json | 4 +- core/gateways/indexeddb/fp-sync.ts | 17 + core/gateways/indexeddb/index.ts | 2 + core/gateways/indexeddb/package.json | 5 +- core/gateways/memory/fp-sync.ts | 8 + core/gateways/memory/index.ts | 1 + core/gateways/memory/package.json | 5 +- core/protocols/sync/block-log-svc.ts | 35 + core/protocols/sync/car-svc.ts | 43 + core/protocols/sync/cid-set-svc.ts | 37 + core/protocols/sync/index.ts | 5 + core/protocols/sync/package.json | 46 + core/protocols/sync/peer-svc.ts | 48 + core/protocols/sync/sync-block-log.ts | 1 + core/protocols/sync/sync-db.ts | 73 + core/protocols/sync/tsconfig.json | 6 + core/runtime/utils.ts | 18 +- .../blockstore/interceptor-gateway.test.ts | 3 + core/tests/fireproof/database.test.ts | 3 + core/tests/package.json | 2 + .../protocols/sync/block-log-svc.test.ts | 80 + core/tests/protocols/sync/car-svc.test.ts | 105 + core/tests/protocols/sync/cid-set.test.ts | 86 + core/tests/protocols/sync/peer-svc.test.ts | 135 ++ core/tests/protocols/sync/sync-api.test.ts | 13 + core/tests/runtime/meta-key-hack.test.ts | 3 + core/types/protocols/sync/index.ts | 41 + core/types/protocols/sync/package.json | 42 + core/types/protocols/sync/tsconfig.json | 6 + pnpm-lock.yaml | 1862 +++++++++++++---- pnpm-workspace.yaml | 7 + tsconfig.json | 2 +- vitest.config.ts | 7 + 37 files changed, 2394 insertions(+), 392 deletions(-) create mode 100644 core/gateways/file/fp-sync.ts create mode 100644 core/gateways/indexeddb/fp-sync.ts create mode 100644 core/gateways/memory/fp-sync.ts create mode 100644 core/protocols/sync/block-log-svc.ts create mode 100644 core/protocols/sync/car-svc.ts create mode 100644 core/protocols/sync/cid-set-svc.ts create mode 100644 core/protocols/sync/index.ts create mode 100644 core/protocols/sync/package.json create mode 100644 core/protocols/sync/peer-svc.ts create mode 100644 core/protocols/sync/sync-block-log.ts create mode 100644 core/protocols/sync/sync-db.ts create mode 100644 core/protocols/sync/tsconfig.json create mode 100644 core/tests/protocols/sync/block-log-svc.test.ts create mode 100644 core/tests/protocols/sync/car-svc.test.ts create mode 100644 core/tests/protocols/sync/cid-set.test.ts create mode 100644 core/tests/protocols/sync/peer-svc.test.ts create mode 100644 core/tests/protocols/sync/sync-api.test.ts create mode 100644 core/types/protocols/sync/index.ts create mode 100644 core/types/protocols/sync/package.json create mode 100644 core/types/protocols/sync/tsconfig.json diff --git a/core/blockstore/package.json b/core/blockstore/package.json index 92077d9cc..7a373666e 100644 --- a/core/blockstore/package.json +++ b/core/blockstore/package.json @@ -52,6 +52,7 @@ "@ipld/dag-cbor": "^9.2.5", "@ipld/dag-json": "^10.2.5", "@web3-storage/pail": "^0.6.2", + "level": "^10.0.0", "multiformats": "^13.4.0", "p-map": "^7.0.3", "p-retry": "^7.0.0" diff --git a/core/blockstore/register-store-protocol.ts b/core/blockstore/register-store-protocol.ts index 84e803efe..6da7c90e8 100644 --- a/core/blockstore/register-store-protocol.ts +++ b/core/blockstore/register-store-protocol.ts @@ -1,16 +1,18 @@ -import { BuildURI, ResolveOnce, runtimeFn, URI } from "@adviser/cement"; +import { BuildURI, Lazy, ResolveOnce, runtimeFn, URI } from "@adviser/cement"; import { SuperThis, PARAM } from "@fireproof/core-types-base"; import { SerdeGateway, Gateway } from "@fireproof/core-types-blockstore"; import { MemoryGateway } from "@fireproof/core-gateways-memory"; import { FileGateway, FILESTORE_VERSION, sysFileSystemFactory } from "@fireproof/core-gateways-file"; import { DefSerdeGateway, INDEXEDDB_VERSION } from "@fireproof/core-gateways-base"; import { CloudGateway } from "@fireproof/core-gateways-cloud"; +import { FPSyncProtocol } from "../types/protocols/sync/index.js"; export interface SerdeGatewayFactoryItem { readonly protocol: string; readonly isDefault?: boolean; defaultURI(sthis: SuperThis): URI; serdegateway(sthis: SuperThis): Promise; + fpsync(sthis: SuperThis, uri: URI): Promise>; } class OneSerdeGatewayFactoryItem implements SerdeGatewayFactoryItem { @@ -42,6 +44,8 @@ class OneSerdeGatewayFactoryItem implements SerdeGatewayFactoryItem { async serdegateway(sthis: SuperThis): Promise { return this.once.once(() => this.item.serdegateway(sthis)); } + + fpsync = Lazy((sthis: SuperThis, uri: URI) => this.item.fpsync(sthis, uri)); } const storeFactory = new Map(); @@ -71,9 +75,12 @@ export interface SerdeOrGatewayFactoryItem { readonly serdegateway?: (sthis: SuperThis) => Promise; readonly gateway?: (sthis: SuperThis) => Promise; + + readonly fpsync: (sthis: SuperThis, uri: URI) => Promise>; } export function registerStoreProtocol(item: SerdeOrGatewayFactoryItem): () => void { + console.log("registerStoreProtocol", item.protocol); let protocol = item.protocol; if (!protocol.endsWith(":")) { protocol += ":"; @@ -144,6 +151,11 @@ if (runtimeFn().isNodeIsh || runtimeFn().isDeno) { gateway: async (sthis) => { return new FileGateway(sthis, await sysFileSystemFactory(defaultURI(sthis))); }, + fpsync: async (_sthis, _uri) => { + throw new Error("fpsync for file: Not implemented"); + // const { fileFPSync } = await import("@fireproof/core-gateways-file"); + // return fileFPSync(sthis, uri) as Promise>; + }, }); } @@ -162,6 +174,10 @@ if (runtimeFn().isBrowser) { const { GatewayImpl } = await import("@fireproof/core-gateways-indexeddb"); return new GatewayImpl(); }, + fpsync: async (sthis, uri) => { + const { indexedDBFPSync } = await import("@fireproof/core-gateways-indexeddb"); + return indexedDBFPSync(sthis, uri) as Promise>; + }, }); } @@ -175,6 +191,10 @@ registerStoreProtocol({ gateway: async (sthis) => { return new MemoryGateway(sthis, memory); }, + fpsync: () => { + throw new Error("fpsync for memory: Not implemented"); + // memoryFPSync as (sthis: SuperThis, uri: URI) => Promise>, + } }); //const onceRegisterFireproofCloudStoreProtocol = new KeyedResolvOnce<() => void>(); @@ -189,4 +209,7 @@ registerStoreProtocol({ serdegateway: async (sthis: SuperThis) => { return new CloudGateway(sthis); }, + fpsync: async () => { + throw new Error("fpsync for fpcloud: Not implemented"); + }, }); diff --git a/core/gateways/file/fp-sync.ts b/core/gateways/file/fp-sync.ts new file mode 100644 index 000000000..e7e718fbb --- /dev/null +++ b/core/gateways/file/fp-sync.ts @@ -0,0 +1,8 @@ +// import { URI } from "@adviser/cement"; +// import { ClassicLevel } from "classic-level"; +// import { FPSyncEntry, FPSyncProtocol } from "@fireproof/core-types-protocols-sync"; +// import { SuperThis } from "@fireproof/core-types-base"; + +// export async function fileFPSync(_sthis: SuperThis, uri: URI): Promise> { +// return new ClassicLevel(uri.toString()); +// } diff --git a/core/gateways/file/index.ts b/core/gateways/file/index.ts index 7a5f090d1..d915e298a 100644 --- a/core/gateways/file/index.ts +++ b/core/gateways/file/index.ts @@ -2,3 +2,4 @@ export * from "./key-bag-file.js"; export * from "./sys-file-system-factory.js"; export * from "./version.js"; export * from "./gateway-impl.js"; +export * from "./fp-sync.js"; diff --git a/core/gateways/file/package.json b/core/gateways/file/package.json index db437479f..a6438baa1 100644 --- a/core/gateways/file/package.json +++ b/core/gateways/file/package.json @@ -47,7 +47,9 @@ "@fireproof/core-gateways-file-node": "workspace:0.0.0", "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", + "@fireproof/core-types-protocols-sync": "workspace:0.0.0", "@fireproof/core-types-blockstore": "workspace:0.0.0", - "@fireproof/vendor": "workspace:0.0.0" + "@fireproof/vendor": "workspace:0.0.0", + "classic-level": "^3.0.0" } } diff --git a/core/gateways/indexeddb/fp-sync.ts b/core/gateways/indexeddb/fp-sync.ts new file mode 100644 index 000000000..60d9e9495 --- /dev/null +++ b/core/gateways/indexeddb/fp-sync.ts @@ -0,0 +1,17 @@ +import { URI } from "@adviser/cement"; +/// import { Level } from "level"; +import { FPSyncEntry, FPSyncProtocol } from "@fireproof/core-types-protocols-sync"; +import { SuperThis } from "@fireproof/core-types-base"; +import { sleep } from "@fireproof/core-runtime"; + +export async function indexedDBFPSync(_sthis: SuperThis, uri: URI): Promise> { + console.log("indexedDBFPSync-0", uri.toString(), window.location.href); + await sleep(10000000); + //const x = await import("https://esm.sh/browser-level@3.0.0"); +// import { BrowserLevel } from "browser-level"; + console.log("indexedDBFPSync-1", uri.toString()); + // const bl = new x.BrowserLevel("xxxx") + //console.log("indexedDBFPSync", bl); +throw new Error("xxxx"); +// return bl; +} diff --git a/core/gateways/indexeddb/index.ts b/core/gateways/indexeddb/index.ts index 95c6f9be5..b7af9f620 100644 --- a/core/gateways/indexeddb/index.ts +++ b/core/gateways/indexeddb/index.ts @@ -7,3 +7,5 @@ export { KeyBagProviderImpl }; import { IndexedDBGateway as GatewayImpl } from "./gateway-impl.js"; export { GatewayImpl }; + +export * from "./fp-sync.js"; diff --git a/core/gateways/indexeddb/package.json b/core/gateways/indexeddb/package.json index 332c18eca..bfd43d0fe 100644 --- a/core/gateways/indexeddb/package.json +++ b/core/gateways/indexeddb/package.json @@ -41,7 +41,10 @@ "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/core-types-blockstore": "workspace:0.0.0", + "@fireproof/core-types-protocols-sync": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", - "idb": "^8.0.3" + "browser-level": "^3.0.0", + "idb": "^8.0.3", + "level": "^10.0.0" } } diff --git a/core/gateways/memory/fp-sync.ts b/core/gateways/memory/fp-sync.ts new file mode 100644 index 000000000..f386f0d6e --- /dev/null +++ b/core/gateways/memory/fp-sync.ts @@ -0,0 +1,8 @@ +import { URI } from "@adviser/cement"; +import { MemoryLevel } from "memory-level"; +import { FPSyncEntry, FPSyncProtocol } from "@fireproof/core-types-protocols-sync"; +import { SuperThis } from "@fireproof/core-types-base"; + +export async function memoryFPSync(_sthis: SuperThis, _uri: URI): Promise> { + return new MemoryLevel(); +} diff --git a/core/gateways/memory/index.ts b/core/gateways/memory/index.ts index 97d2d5df9..3c231f3b7 100644 --- a/core/gateways/memory/index.ts +++ b/core/gateways/memory/index.ts @@ -1,2 +1,3 @@ export * from "./gateway.js"; export * from "./version.js"; +// export * from "./fp-sync.js"; diff --git a/core/gateways/memory/package.json b/core/gateways/memory/package.json index a58570942..daf37aad4 100644 --- a/core/gateways/memory/package.json +++ b/core/gateways/memory/package.json @@ -46,6 +46,9 @@ "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/core-types-blockstore": "workspace:0.0.0", - "@fireproof/vendor": "workspace:0.0.0" + "@fireproof/core-types-protocols-sync": "workspace:0.0.0", + "@fireproof/vendor": "workspace:0.0.0", + "level": "^10.0.0", + "memory-level": "^3.1.0" } } diff --git a/core/protocols/sync/block-log-svc.ts b/core/protocols/sync/block-log-svc.ts new file mode 100644 index 000000000..8aa7a9582 --- /dev/null +++ b/core/protocols/sync/block-log-svc.ts @@ -0,0 +1,35 @@ +import { BlockLog, BlockLogSchema } from "@fireproof/core-types-protocols-sync"; +import { SyncDatabase } from "./sync-db.js"; +import { exception2Result, Result } from "@adviser/cement"; + +type CreateBlockLog = Omit, "seq"> & { seq?: string }; + +export const BlockLogService = { + create: async (db: SyncDatabase, blockLog: CreateBlockLog): Promise> => { + const entry: BlockLog = { + type: "block", + seq: blockLog.seq || db.sthis.timeOrderedNextId().str, + ...blockLog, + }; + // Validate with Zod schema + const validated = BlockLogSchema.safeParse(entry); + if (!validated.success) { + return Result.Err(validated.error); + } + return exception2Result(() => db.blockLogs.add(validated.data).then((_) => validated.data)) + }, + + getBySeq: (db: SyncDatabase, seq = ""): ReadableStream => { + return new ReadableStream({ + start: (controller) => { + db.blockLogs + .where("seq") + .aboveOrEqual(seq) + .each((blockLog) => { + controller.enqueue(blockLog); + }).then(() => controller.close()); + // controller.close(); + }, + }); + }, +}; diff --git a/core/protocols/sync/car-svc.ts b/core/protocols/sync/car-svc.ts new file mode 100644 index 000000000..d13743f3d --- /dev/null +++ b/core/protocols/sync/car-svc.ts @@ -0,0 +1,43 @@ +import { Cars, CarsSchema } from "@fireproof/core-types-protocols-sync"; +import { SyncDatabase } from "./sync-db.js"; +import { exception2Result, Result } from "@adviser/cement"; + +type CreateCars = Omit; + +export const CarsService = { + get: async (db: SyncDatabase, carCid: string): Promise> => { + return exception2Result(async () => { + const cars = await db.cars.get(carCid); + return cars; + }); + }, + + upsert: async (db: SyncDatabase, cars: CreateCars): Promise> => { + return exception2Result(async () => { + const entry: Cars = { + type: "cars", + ...cars, + }; + // Validate with Zod schema + const validated = CarsSchema.safeParse(entry); + if (!validated.success) { + throw validated.error; + } + + let existing: Cars | undefined; + await db.transaction("rw", ["cars"], async () => { + const fromGet = (await db.cars.get(cars.carCid)) || { peers: [] }; + existing = { + ...fromGet, + ...validated.data, + peers: fromGet.peers ? [...new Set([...fromGet.peers, ...validated.data.peers])] : validated.data.peers, + }; + await db.cars.put(existing); + }); + if (!existing) { + throw new Error("Failed to upsert cars"); + } + return existing; + }); + }, +}; diff --git a/core/protocols/sync/cid-set-svc.ts b/core/protocols/sync/cid-set-svc.ts new file mode 100644 index 000000000..bded4f635 --- /dev/null +++ b/core/protocols/sync/cid-set-svc.ts @@ -0,0 +1,37 @@ + +import { CidSet, CidSetSchema } from "@fireproof/core-types-protocols-sync"; +import { SyncDatabase } from "./sync-db.js"; +import { exception2Result, Result } from "@adviser/cement"; + +type CreateCidSet = Omit; + +export const CidSetService = { + get: async (db: SyncDatabase, cid: string): Promise> => { + return exception2Result(async () => { + const cidSet = await db.cidSets.get(cid); + return cidSet; + }); + }, + + put: async (db: SyncDatabase, cidSet: CreateCidSet | CreateCidSet[]): Promise> => { + const iSet = Array.isArray(cidSet) ? cidSet : [cidSet]; + const entries: Result[] = iSet.map((cidSet) => { + return { + type: "cidSet", + ...cidSet, + }; + }).map((i) => CidSetSchema.safeParse(i)).map((i) => { + if (!i.success) { + return Result.Err(i.error); + } + return Result.Ok(i.data); + }); + + if (entries.some((i) => i.isErr())) { + return Result.Err(entries.filter((i) => i.isErr()).map((i) => i.Err().message).join("\n")); + } + const okEntries = entries.map((i) => i.Ok()); + return exception2Result(() => db.cidSets.bulkAdd(okEntries).then(() => okEntries)); + }, +}; + diff --git a/core/protocols/sync/index.ts b/core/protocols/sync/index.ts new file mode 100644 index 000000000..f18f41270 --- /dev/null +++ b/core/protocols/sync/index.ts @@ -0,0 +1,5 @@ +export * from './block-log-svc.js' +export * from './cid-set-svc.js' +export * from './car-svc.js' +export * from './peer-svc.js' +export * from './sync-db.js' diff --git a/core/protocols/sync/package.json b/core/protocols/sync/package.json new file mode 100644 index 000000000..49722e09a --- /dev/null +++ b/core/protocols/sync/package.json @@ -0,0 +1,46 @@ +{ + "name": "@fireproof/core-protocols-sync", + "version": "0.0.0", + "description": "Live ledger for the web.", + "type": "module", + "main": "./index.js", + "scripts": { + "build": "core-cli tsc", + "pack": "core-cli build --doPack", + "publish": "core-cli build" + }, + "keywords": [ + "ledger", + "JSON", + "document", + "IPLD", + "CID", + "IPFS" + ], + "contributors": [ + "J Chris Anderson", + "Alan Shaw", + "Travis Vachon", + "Mikeal Rogers", + "Meno Abels" + ], + "author": "J Chris Anderson", + "license": "AFL-2.0", + "homepage": "https://use-fireproof.com", + "gptdoc": "import { fireproof } from 'use-fireproof'; const db = fireproof('app-db-name'); const ok = await db.put({ anyField: ['any','json'] }); const doc = await db.get(ok.id); await db.del(doc._id); db.subscribe(myRedrawFn); const result = await db.query('anyField', {range : ['a', 'z']}); result.rows.map(({ key }) => key);", + "repository": { + "type": "git", + "url": "git+https://github.com/fireproof-storage/fireproof.git" + }, + "bugs": { + "url": "https://github.com/fireproof-storage/fireproof/issues" + }, + "dependencies": { + "@adviser/cement": "^0.4.32", + "@fireproof/core-runtime": "workspace:0.0.0", + "@fireproof/core-types-base": "workspace:0.0.0", + "@fireproof/core-types-protocols-sync": "workspace:0.0.0", + "@fireproof/vendor": "workspace:0.0.0", + "dexie": "^4.2.0" + } +} diff --git a/core/protocols/sync/peer-svc.ts b/core/protocols/sync/peer-svc.ts new file mode 100644 index 000000000..e7f4eb462 --- /dev/null +++ b/core/protocols/sync/peer-svc.ts @@ -0,0 +1,48 @@ +import { Peers, PeersSchema } from "@fireproof/core-types-protocols-sync"; +import { SyncDatabase } from "./sync-db.js"; +import { exception2Result, Result } from "@adviser/cement"; +import { hashBufferCID } from "@fireproof/core-runtime"; + +type CreatePeers = Omit, "peerId">, "created">, "isLocal"> & { peerId?: string; created?: number; isLocal?: boolean }; + +export const PeersService = { + get: async (db: SyncDatabase, peerId: string): Promise> => { + return exception2Result(async () => { + const peers = await db.peers.get(peerId); + return peers; + }); + }, + + upsert: async (db: SyncDatabase, peers: CreatePeers): Promise> => { + return exception2Result(async () => { + const entry: Peers = { + type: "peers", + ...peers, + isLocal: peers.isLocal || false, + created: typeof peers.created === 'number' ? peers.created : Date.now(), + peerId: peers.peerId || (await hashBufferCID(peers.url)).toString() + }; + // Validate with Zod schema + const validated = PeersSchema.safeParse(entry); + if (!validated.success) { + throw validated.error; + } + + // console.log("upserting peers", validated.data); + let result: Peers | undefined; + await db.transaction("rw", ["peers"], async () => { + const existing = await db.peers.get(validated.data.peerId) || { created: 0 };; + result = { + ...existing, + ...validated.data, + created: existing.created || validated.data.created, + }; + await db.peers.put(result); + }); + if (!result) { + throw new Error("Failed to upsert peers"); + } + return result; + }); + }, +}; \ No newline at end of file diff --git a/core/protocols/sync/sync-block-log.ts b/core/protocols/sync/sync-block-log.ts new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/core/protocols/sync/sync-block-log.ts @@ -0,0 +1 @@ + diff --git a/core/protocols/sync/sync-db.ts b/core/protocols/sync/sync-db.ts new file mode 100644 index 000000000..05f0623c9 --- /dev/null +++ b/core/protocols/sync/sync-db.ts @@ -0,0 +1,73 @@ +import { BlockLog, Cars, CidSet, Peers } from "@fireproof/core-types-protocols-sync"; +import { Logger, CoerceURI, URI } from "@adviser/cement"; +import { Dexie, Table, TransactionMode } from "dexie"; +import { SuperThis } from "@fireproof/core-types-base"; +import { ensureLogger } from "@fireproof/core-runtime"; + +export class SyncDatabase { + readonly sthis: SuperThis; + readonly logger: Logger; + db!: Dexie; + // readonly blockLogs!: Table; + readonly url: URI; + + constructor(sthis: SuperThis, url: CoerceURI) { + this.sthis = sthis; + this.logger = ensureLogger(sthis, "SyncDatabase"); + this.url = URI.from(url); + } + + transaction(mode: TransactionMode, storeNames: string[], fn: () => Promise): Promise { + return this.db.transaction(mode, storeNames, fn); + } + + get blockLogs(): Table { + return (this.db as unknown as { blockLogs: Table }).blockLogs; + } + + get cidSets(): Table { + return (this.db as unknown as { cidSets: Table }).cidSets; + } + + get cars(): Table { + return (this.db as unknown as { cars: Table }).cars; + } + + get peers(): Table { + return (this.db as unknown as { peers: Table }).peers; + } + + async consumeStream(stream: ReadableStream, cb: (value: T) => void): Promise { + const reader = stream.getReader(); + async function readNext() { + const { done, value } = await reader.read(); + if (done) return; + cb(value); + return readNext(); + } + return readNext(); + } + + async close() { + await this.db.close(); + } + async destroy() { + await this.db.delete({ + disableAutoOpen: true, + }); + } + + async ready() { + this.db = new Dexie("sync", { + indexedDB: indexedDB, + IDBKeyRange: IDBKeyRange, + }); + this.db.version(1).stores({ + blockLogs: "seq, car, type", + cidSets: "cid, peers, type", + cars: "carCid, peers, type", + peers: "peerId, type", + }); + await this.db.open(); + } +} diff --git a/core/protocols/sync/tsconfig.json b/core/protocols/sync/tsconfig.json new file mode 100644 index 000000000..a7db7c68a --- /dev/null +++ b/core/protocols/sync/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist" + } +} diff --git a/core/runtime/utils.ts b/core/runtime/utils.ts index 6c2231dbd..db7f6d1fb 100644 --- a/core/runtime/utils.ts +++ b/core/runtime/utils.ts @@ -53,6 +53,8 @@ interface superThisOpts { readonly txt: TextEndeCoder; } +let timeOrderHelper = Math.floor(Math.random() * 0x1000); + class SuperThisImpl implements SuperThis { readonly logger: Logger; readonly env: Env; @@ -89,7 +91,8 @@ class SuperThisImpl implements SuperThis { .map((i) => i.toString(16).padStart(2, "0")) .join(""); return { - str: `${t.slice(0, 8)}-${t.slice(8)}-7${hex.slice(0, 3)}-${hex.slice(3, 7)}-${hex.slice(7, 19)}`, + // str: `${t.slice(0, 8)}-${t.slice(8)}-7${(timeOrderHelper++ & 0xfff).toString(16).padStart(3, "0").slice(0, 2)}-${hex.slice(3, 7)}-${hex.slice(7, 19)}`, + str: `${t.slice(0, 8)}-${t.slice(8)}-7${(timeOrderHelper++ & 0xfff).toString(16).padStart(3, "0")}-${hex.slice(3, 7)}-${hex.slice(7, 19)}`, }; } @@ -568,6 +571,19 @@ export async function hashObjectCID, S>(o: T): Promise< return { cid: CID.create(1, json.code, hash), bytes, obj: o }; } +export async function hashBufferCID(i: T): Promise { + + let o: ToUInt8; + if (typeof i === "string") { + o = txtOps.encode(i); + } else { + o = i + } + const bytes = await coercePromiseIntoUint8(o); + const hash = await sha256.digest(bytes.Ok()); + return CID.create(1, json.code, hash); +} + export function sleep(ms: number) { return new Promise((resolve) => setTimeout(resolve, ms)); } diff --git a/core/tests/blockstore/interceptor-gateway.test.ts b/core/tests/blockstore/interceptor-gateway.test.ts index c8ab27e8e..4d7179313 100644 --- a/core/tests/blockstore/interceptor-gateway.test.ts +++ b/core/tests/blockstore/interceptor-gateway.test.ts @@ -220,6 +220,9 @@ describe("InterceptorGateway", () => { gateway: async (sthis) => { return new URITrackGateway(sthis, new Map(), gwUris); }, + fpsync: async () => { + throw new Error("fpsync for uriTest: Not implemented"); + }, }); const db = fireproof("interceptor-gateway", { storeUrls: { diff --git a/core/tests/fireproof/database.test.ts b/core/tests/fireproof/database.test.ts index 9e2c2954a..3a4035440 100644 --- a/core/tests/fireproof/database.test.ts +++ b/core/tests/fireproof/database.test.ts @@ -642,6 +642,9 @@ describe("StoreURIRuntime", () => { gateway: function (): Promise { throw new Error("Function not implemented."); }, + fpsync: async () => { + throw new Error("fpsync for murks: Not implemented"); + }, }); }); afterEach(() => { diff --git a/core/tests/package.json b/core/tests/package.json index 17ed5b297..83357f4a9 100644 --- a/core/tests/package.json +++ b/core/tests/package.json @@ -51,9 +51,11 @@ "@fireproof/core-gateways-memory": "workspace:0.0.0", "@fireproof/core-keybag": "workspace:0.0.0", "@fireproof/core-protocols-cloud": "workspace:0.0.0", + "@fireproof/core-protocols-sync": "workspace:0.0.0", "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/core-types-blockstore": "workspace:0.0.0", + "@fireproof/core-types-protocols-sync": "workspace:0.0.0", "@fireproof/core-types-protocols-cloud": "workspace:0.0.0", "@fireproof/core-types-runtime": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", diff --git a/core/tests/protocols/sync/block-log-svc.test.ts b/core/tests/protocols/sync/block-log-svc.test.ts new file mode 100644 index 000000000..724afa5d3 --- /dev/null +++ b/core/tests/protocols/sync/block-log-svc.test.ts @@ -0,0 +1,80 @@ + +import { describe, it, expect, beforeEach, afterEach } from "vitest"; +import { BlockLogService, SyncDatabase } from "@fireproof/core-protocols-sync"; +import { ensureSuperThis } from "@fireproof/core-runtime"; +import { BlockLog } from "@fireproof/core-types-protocols-sync"; + +describe("BlockLogService", () => { + const sthis = ensureSuperThis(); + const db = new SyncDatabase(sthis, "dexie://test-sync-db"); + + beforeEach(async () => { + await sthis.start(); + await db.ready(); + }); + + + afterEach(async () => { + await db.close(); + await db.destroy(); + }); + + describe("create", () => { + it("should auto-generate seq if not provided", async () => { + const blockLog = { + car: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", + }; + + let lastSeq: string | undefined; + for (let i = 0; i < 10; i++) { + const result = await BlockLogService.create(db, blockLog); + expect(result.isOk()).toBe(true); + if (lastSeq) { + expect(lastSeq.localeCompare(result.Ok().seq)).toBe(-1) + } + lastSeq = result.Ok().seq; + } + }); + + it("should use provided seq", async () => { + const blockLog = { + car: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", + seq: "custom-seq-123", + }; + + const result = await BlockLogService.create(db, blockLog); + + expect(result.isOk()).toBe(true); + expect(result.Ok().seq).toBe("custom-seq-123"); + }); + + it("list all", async () => { + for (let i = 0; i < 10; i++) { + await BlockLogService.create(db, { + car: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", + }); + } + + let lastSeq: string | undefined; + const results: BlockLog[] = []; + await db.consumeStream(BlockLogService.getBySeq(db), (blockLog) => { + if (lastSeq) { + expect(lastSeq.localeCompare(blockLog.seq)).toBe(-1) + } + results.push(blockLog); + lastSeq = blockLog.seq; + }); + expect(results.length).toBe(10); + + const results2: BlockLog[] = []; + let first = 0 + await db.consumeStream(BlockLogService.getBySeq(db, results[5].seq), (blockLog) => { + expect(results[5].seq.localeCompare(blockLog.seq)).toBe(first); + first = -1; + results2.push(blockLog); + }); + expect(results2.length).toBe(5); + }) + }); + +}); \ No newline at end of file diff --git a/core/tests/protocols/sync/car-svc.test.ts b/core/tests/protocols/sync/car-svc.test.ts new file mode 100644 index 000000000..3a5defcef --- /dev/null +++ b/core/tests/protocols/sync/car-svc.test.ts @@ -0,0 +1,105 @@ +import { describe, it, expect, beforeEach, afterEach } from "vitest"; +import { CarsService, SyncDatabase } from "@fireproof/core-protocols-sync"; +import { ensureSuperThis } from "@fireproof/core-runtime"; + +describe("CarsService", () => { + const sthis = ensureSuperThis(); + const db = new SyncDatabase(sthis, "dexie://test-sync-db"); + + beforeEach(async () => { + await sthis.start(); + await db.ready(); + }); + + afterEach(async () => { + await db.close(); + await db.destroy(); + }); + + describe("upsert", () => { + it("should create a new cars entry", async () => { + const cars = { + carCid: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", + entries: ["cid1", "cid2"], + created: Date.now(), + peers: ["peer1", "peer2"], + }; + + const result = await CarsService.upsert(db, cars); + + expect(result.isOk()).toBe(true); + expect(result.Ok().type).toBe("cars"); + expect(result.Ok().carCid).toBe(cars.carCid); + expect(result.Ok().entries).toEqual(cars.entries); + expect(result.Ok().peers).toEqual(cars.peers); + }); + + it("should merge peers when updating existing entry", async () => { + const initialCars = { + carCid: "test-car-cid", + entries: ["cid1", "cid2"], + created: Date.now(), + peers: ["peer1", "peer2"], + }; + + // Create initial entry + await CarsService.upsert(db, initialCars); + + // Update with new peers + const updatedCars = { + carCid: "test-car-cid", + entries: ["cid1", "cid2", "cid3"], + created: Date.now(), + peers: ["peer2", "peer3"], // peer2 overlaps, peer3 is new + }; + + const result = await CarsService.upsert(db, updatedCars); + + expect(result.isOk()).toBe(true); + expect(result.Ok().peers).toEqual(["peer1", "peer2", "peer3"]); + expect(result.Ok().entries).toEqual(["cid1", "cid2", "cid3"]); + }); + + it("should deduplicate peers", async () => { + const cars = { + carCid: "test-dedup-cid", + entries: ["cid1"], + created: Date.now(), + peers: ["peer1", "peer1", "peer2"], // duplicate peer1 + }; + + const result = await CarsService.upsert(db, cars); + + expect(result.isOk()).toBe(true); + expect(result.Ok().peers).toEqual(["peer1", "peer2"]); + }); + }); + + describe("get", () => { + it("should retrieve existing cars entry", async () => { + const cars = { + carCid: "test-get-car-cid", + entries: ["cid1", "cid2"], + created: 1234567890, + peers: ["peer1", "peer2"], + }; + + await CarsService.upsert(db, cars); + + const result = await CarsService.get(db, "test-get-car-cid"); + + expect(result.isOk()).toBe(true); + expect(result.Ok()?.carCid).toBe("test-get-car-cid"); + expect(result.Ok()?.entries).toEqual(["cid1", "cid2"]); + expect(result.Ok()?.created).toBe(1234567890); + expect(result.Ok()?.peers).toEqual(["peer1", "peer2"]); + }); + + it("should return undefined for non-existent car", async () => { + const result = await CarsService.get(db, "non-existent-car-cid"); + + expect(result.isOk()).toBe(true); + expect(result.Ok()).toBeUndefined(); + }); + }); +}); \ No newline at end of file diff --git a/core/tests/protocols/sync/cid-set.test.ts b/core/tests/protocols/sync/cid-set.test.ts new file mode 100644 index 000000000..28d6c9938 --- /dev/null +++ b/core/tests/protocols/sync/cid-set.test.ts @@ -0,0 +1,86 @@ +import { describe, it, expect, beforeEach, afterEach } from "vitest"; +import { CidSetService, SyncDatabase } from "@fireproof/core-protocols-sync"; +import { ensureSuperThis } from "@fireproof/core-runtime"; + +describe("CidSetService", () => { + const sthis = ensureSuperThis(); + const db = new SyncDatabase(sthis, "dexie://test-sync-db"); + + beforeEach(async () => { + await sthis.start(); + await db.ready(); + }); + + afterEach(async () => { + await db.close(); + await db.destroy(); + }); + + describe("put", () => { + it("should create a new cid set", async () => { + const cidSet = { + cid: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55f1", + car: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", + type: "cidSet", + } + + const result = await CidSetService.put(db, cidSet); + + expect(result.isOk()).toBe(true); + expect(result.Ok()).toEqual([cidSet]); + }); + it("should create a new cid sets", async () => { + const cidSet = [ + { + cid: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55f1", + car: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", + type: "cidSet", + }, + { + cid: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55f2", + car: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", + type: "cidSet", + }, + ]; + + const result = await CidSetService.put(db, cidSet); + + expect(result.isOk()).toBe(true); + expect(result.Ok()).toEqual(cidSet); + }); + }); + + describe("get", () => { + it("should retrieve existing cid set", async () => { + const cidSet = [ + { + cid: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55f1", + car: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", + type: "cidSet", + }, + { + cid: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55f2", + car: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", + type: "cidSet", + }, + ]; + + await CidSetService.put(db, cidSet); + + const r1 = await CidSetService.get(db, cidSet[0].cid) + const r2 = await CidSetService.get(db, cidSet[1].cid) + + expect(r1.isOk()).toBe(true); + expect(r1.Ok()).toEqual(cidSet[0]); + expect(r2.isOk()).toBe(true); + expect(r2.Ok()).toEqual(cidSet[1]); + + }); + + it("should return undefined for non-existent cid", async () => { + const result = await CidSetService.get(db, "non-existent-cid"); + expect(result.isOk()).toBe(true); + expect(result.Ok()).toBeUndefined(); + }); + }); +}); diff --git a/core/tests/protocols/sync/peer-svc.test.ts b/core/tests/protocols/sync/peer-svc.test.ts new file mode 100644 index 000000000..f83eb68a3 --- /dev/null +++ b/core/tests/protocols/sync/peer-svc.test.ts @@ -0,0 +1,135 @@ +import { describe, it, expect, beforeEach, afterEach } from "vitest"; +import { PeersService, SyncDatabase } from "@fireproof/core-protocols-sync"; +import { ensureSuperThis, hashBufferCID } from "@fireproof/core-runtime"; + +describe("PeersService", () => { + const sthis = ensureSuperThis(); + const db = new SyncDatabase(sthis, "dexie://test-sync-db"); + + beforeEach(async () => { + await sthis.start(); + await db.ready(); + }); + + afterEach(async () => { + await db.close(); + await db.destroy(); + }); + + describe("upsert", () => { + it("should create a new peers entry", async () => { + const peers = { + peerId: "peer-123", + isLocal: false, + url: "https://example.com/peer", + lastAttempt: Date.now(), + created: Date.now(), + }; + + const result = await PeersService.upsert(db, peers); + + expect(result.isOk()).toBe(true); + expect(result.Ok().type).toBe("peers"); + expect(result.Ok().peerId).toBe(peers.peerId); + expect(result.Ok().isLocal).toBe(peers.isLocal); + expect(result.Ok().url).toBe(peers.url); + expect(result.Ok().lastAttempt).toBe(peers.lastAttempt); + expect(result.Ok().created).toBe(peers.created); + }); + + it("should create peers entry with optional fields", async () => { + const peers = { + isLocal: true, + url: "https://local.example.com", + lastSend: "block-log-123", + lastError: "error-log-456", + lastAttempt: 1234567890, + created: 1234567890, + }; + const result = await PeersService.upsert(db, peers); + expect(result.isOk()).toBe(true); + expect(result.Ok().peerId).toBe((await hashBufferCID(peers.url)).toString()); + expect(result.Ok().lastSend).toBe("block-log-123"); + expect(result.Ok().lastError).toBe("error-log-456"); + + const p2 = { + isLocal: false, + url: "https://local.example.com", + lastAttempt: 1234567899, + created: 1234567899, + }; + const result2 = await PeersService.upsert(db, p2); + expect(result2.isOk()).toBe(true); + expect(result2.Ok().peerId).toBe((await hashBufferCID(peers.url)).toString()); + expect(result2.Ok().created).toBe(1234567890); + expect(result2.Ok().lastSend).toBe("block-log-123"); + expect(result2.Ok().lastError).toBe("error-log-456"); + expect(result2.Ok().lastAttempt).toBe(1234567899); + expect(result2.Ok().isLocal).toBe(false); + }); + + it("should update existing peers entry", async () => { + const initialPeers = { + peerId: "update-peer", + isLocal: false, + url: "https://old.example.com", + lastAttempt: 1000, + created: 1000, + }; + + // Create initial entry + await PeersService.upsert(db, initialPeers); + + // Update entry + const updatedPeers = { + peerId: "update-peer", + isLocal: true, + url: "https://new.example.com", + lastSend: "new-block-log", + lastAttempt: 2000, + created: 333000, // Keep original created time + }; + + const result = await PeersService.upsert(db, updatedPeers); + + expect(result.isOk()).toBe(true); + expect(result.Ok().isLocal).toBe(true); + expect(result.Ok().url).toBe("https://new.example.com"); + expect(result.Ok().lastSend).toBe("new-block-log"); + expect(result.Ok().lastAttempt).toBe(2000); + expect(result.Ok().created).toBe(1000); + }); + }); + + describe("get", () => { + it("should retrieve existing peers entry", async () => { + const peers = { + peerId: "get-peer-test", + isLocal: false, + url: "https://get.example.com", + lastSend: "block-123", + lastAttempt: 1234567890, + created: 1234567890, + }; + + await PeersService.upsert(db, peers); + + const result = await PeersService.get(db, "get-peer-test"); + + expect(result.isOk()).toBe(true); + expect(result.Ok()?.peerId).toBe("get-peer-test"); + expect(result.Ok()?.isLocal).toBe(false); + expect(result.Ok()?.url).toBe("https://get.example.com"); + expect(result.Ok()?.lastSend).toBe("block-123"); + expect(result.Ok()?.lastAttempt).toBe(1234567890); + expect(result.Ok()?.created).toBe(1234567890); + }); + + it("should return undefined for non-existent peer", async () => { + const result = await PeersService.get(db, "non-existent-peer"); + + expect(result.isOk()).toBe(true); + expect(result.Ok()).toBeUndefined(); + }); + }); +}); diff --git a/core/tests/protocols/sync/sync-api.test.ts b/core/tests/protocols/sync/sync-api.test.ts new file mode 100644 index 000000000..8750221e7 --- /dev/null +++ b/core/tests/protocols/sync/sync-api.test.ts @@ -0,0 +1,13 @@ +import { defaultGatewayFactoryItem } from "@fireproof/core-blockstore"; +import { ensureSuperThis } from "@fireproof/core-runtime"; +import { it, describe, } from "vitest"; + +describe("sync-api", () => { + const sthis = ensureSuperThis(); + it("factory to open database", async () => { + const gw = defaultGatewayFactoryItem(); + const syncDB = await gw.fpsync(sthis, gw.defaultURI(sthis)); + + await syncDB.close(); + }); +}, { timeout: 10000000 }); diff --git a/core/tests/runtime/meta-key-hack.test.ts b/core/tests/runtime/meta-key-hack.test.ts index 7175a40b8..7a178d371 100644 --- a/core/tests/runtime/meta-key-hack.test.ts +++ b/core/tests/runtime/meta-key-hack.test.ts @@ -20,6 +20,9 @@ describe("MetaKeyHack", () => { serdegateway: async () => { return new AddKeyToDbMetaGateway(memGw, "v2"); }, + fpsync: async () => { + throw new Error("fpsync for hack: Not implemented"); + }, }); let db: Database; diff --git a/core/types/protocols/sync/index.ts b/core/types/protocols/sync/index.ts new file mode 100644 index 000000000..80b1df357 --- /dev/null +++ b/core/types/protocols/sync/index.ts @@ -0,0 +1,41 @@ + +import { z } from 'zod'; + +// Zod schemas +export const BlockLogSchema = z.object({ + type: z.literal("block"), + seq: z.string(), // key // typical V6 UUID + car: z.string(), +}).readonly(); + +export const CarsSchema = z.object({ + type: z.literal("cars"), + carCid: z.string(), // key + entries: z.array(z.string()), // cids of entries + created: z.number(), // timestamp + peers: z.array(z.string()), // peers that have this car +}).readonly(); + +export const CidSetSchema = z.object({ + type: z.literal("cidSet"), + cid: z.string(), // key + car: z.string(), +}).readonly(); + +export const PeersSchema = z.object({ + type: z.literal("peers"), + peerId: z.string(), // key hash of url + isLocal: z.boolean(), + url: z.string(), + lastSend: z.string().optional(), // points to blockLog + lastError: z.string().optional(), // points to blockLog + // is lastError is set we wait retryInterval plus lastAttempt + lastAttempt: z.number(), // local Timestamp + created: z.number(), // timestamp +}).readonly(); + +// Type inference from Zod schemas +export type BlockLog = z.infer; +export type Cars = z.infer; +export type CidSet = z.infer; +export type Peers = z.infer; diff --git a/core/types/protocols/sync/package.json b/core/types/protocols/sync/package.json new file mode 100644 index 000000000..d75a523fe --- /dev/null +++ b/core/types/protocols/sync/package.json @@ -0,0 +1,42 @@ +{ + "name": "@fireproof/core-types-protocols-sync", + "version": "0.0.0", + "description": "SyncDB Protocol to track what we send", + "type": "module", + "main": "./index.js", + "scripts": { + "build": "core-cli tsc", + "pack": "core-cli build --doPack", + "publish": "core-cli build" + }, + "keywords": [ + "ledger", + "JSON", + "document", + "IPLD", + "CID", + "IPFS" + ], + "contributors": [ + "J Chris Anderson", + "Alan Shaw", + "Travis Vachon", + "Mikeal Rogers", + "Meno Abels" + ], + "author": "J Chris Anderson", + "license": "AFL-2.0", + "homepage": "https://use-fireproof.com", + "gptdoc": "import { fireproof } from 'use-fireproof'; const db = fireproof('app-db-name'); const ok = await db.put({ anyField: ['any','json'] }); const doc = await db.get(ok.id); await db.del(doc._id); db.subscribe(myRedrawFn); const result = await db.query('anyField', {range : ['a', 'z']}); result.rows.map(({ key }) => key);", + "repository": { + "type": "git", + "url": "git+https://github.com/fireproof-storage/fireproof.git" + }, + "bugs": { + "url": "https://github.com/fireproof-storage/fireproof/issues" + }, + "dependencies": { + "@adviser/cement": "^0.4.32", + "zod": "^4.0.14" + } +} diff --git a/core/types/protocols/sync/tsconfig.json b/core/types/protocols/sync/tsconfig.json new file mode 100644 index 000000000..89215dcb3 --- /dev/null +++ b/core/types/protocols/sync/tsconfig.json @@ -0,0 +1,6 @@ +{ + "extends": "../../../../tsconfig.json", + "compilerOptions": { + "outDir": "./dist" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a2f7dde7..9efa3c4c8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -63,7 +63,7 @@ importers: version: 8.43.0(eslint@9.35.0(jiti@1.21.7))(typescript@5.9.2) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) wrangler: specifier: ^4.34.0 version: 4.34.0(@cloudflare/workers-types@4.20250906.0) @@ -121,7 +121,7 @@ importers: version: 4.20.5 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) cloud/3rd-party: dependencies: @@ -207,7 +207,7 @@ importers: version: 0.30.6(patch_hash=9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) zx: specifier: ^8.8.1 version: 8.8.1 @@ -265,7 +265,7 @@ importers: version: 4.20.5 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) wrangler: specifier: ^4.34.0 version: 4.34.0(@cloudflare/workers-types@4.20250906.0) @@ -319,7 +319,7 @@ importers: version: 4.9.6 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) devDependencies: '@fireproof/core-cli': specifier: workspace:0.0.0 @@ -369,7 +369,7 @@ importers: version: link:../../cli vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) zx: specifier: ^8.8.1 version: 8.8.1 @@ -501,6 +501,9 @@ importers: '@web3-storage/pail': specifier: ^0.6.2 version: 0.6.2 + level: + specifier: ^10.0.0 + version: 10.0.0 multiformats: specifier: ^13.4.0 version: 13.4.0 @@ -640,9 +643,15 @@ importers: '@fireproof/core-types-blockstore': specifier: workspace:0.0.0 version: link:../../types/blockstore + '@fireproof/core-types-protocols-sync': + specifier: workspace:0.0.0 + version: link:../../types/protocols/sync '@fireproof/vendor': specifier: workspace:0.0.0 version: link:../../../vendor + classic-level: + specifier: ^3.0.0 + version: 3.0.0 devDependencies: '@fireproof/core-cli': specifier: workspace:0.0.0 @@ -701,12 +710,21 @@ importers: '@fireproof/core-types-blockstore': specifier: workspace:0.0.0 version: link:../../types/blockstore + '@fireproof/core-types-protocols-sync': + specifier: workspace:0.0.0 + version: link:../../types/protocols/sync '@fireproof/vendor': specifier: workspace:0.0.0 version: link:../../../vendor + browser-level: + specifier: ^3.0.0 + version: 3.0.0 idb: specifier: ^8.0.3 version: 8.0.3 + level: + specifier: ^10.0.0 + version: 10.0.0 core/gateways/memory: dependencies: @@ -725,9 +743,18 @@ importers: '@fireproof/core-types-blockstore': specifier: workspace:0.0.0 version: link:../../types/blockstore + '@fireproof/core-types-protocols-sync': + specifier: workspace:0.0.0 + version: link:../../types/protocols/sync '@fireproof/vendor': specifier: workspace:0.0.0 version: link:../../../vendor + level: + specifier: ^10.0.0 + version: 10.0.0 + memory-level: + specifier: ^3.1.0 + version: 3.1.0 devDependencies: '@fireproof/core-cli': specifier: workspace:0.0.0 @@ -811,6 +838,27 @@ importers: specifier: workspace:0.0.0 version: link:../../../vendor + core/protocols/sync: + dependencies: + '@adviser/cement': + specifier: ^0.4.32 + version: 0.4.32(typescript@5.9.2) + '@fireproof/core-runtime': + specifier: workspace:0.0.0 + version: link:../../runtime + '@fireproof/core-types-base': + specifier: workspace:0.0.0 + version: link:../../types/base + '@fireproof/core-types-protocols-sync': + specifier: workspace:0.0.0 + version: link:../../types/protocols/sync + '@fireproof/vendor': + specifier: workspace:0.0.0 + version: link:../../../vendor + dexie: + specifier: ^4.2.0 + version: 4.2.0 + core/runtime: dependencies: '@adviser/cement': @@ -883,6 +931,9 @@ importers: '@fireproof/core-protocols-cloud': specifier: workspace:0.0.0 version: link:../protocols/cloud + '@fireproof/core-protocols-sync': + specifier: workspace:0.0.0 + version: link:../protocols/sync '@fireproof/core-runtime': specifier: workspace:0.0.0 version: link:../runtime @@ -895,6 +946,9 @@ importers: '@fireproof/core-types-protocols-cloud': specifier: workspace:0.0.0 version: link:../types/protocols/cloud + '@fireproof/core-types-protocols-sync': + specifier: workspace:0.0.0 + version: link:../types/protocols/sync '@fireproof/core-types-runtime': specifier: workspace:0.0.0 version: link:../types/runtime @@ -946,7 +1000,7 @@ importers: version: 1.55.0 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) zx: specifier: ^8.8.1 version: 8.8.1 @@ -1031,6 +1085,15 @@ importers: specifier: workspace:0.0.0 version: link:../../../../cli + core/types/protocols/sync: + dependencies: + '@adviser/cement': + specifier: ^0.4.32 + version: 0.4.32(typescript@5.9.2) + zod: + specifier: ^4.0.14 + version: 4.0.14 + core/types/runtime: dependencies: '@adviser/cement': @@ -1204,7 +1267,7 @@ importers: version: 7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) wrangler: specifier: ^4.34.0 version: 4.34.0(@cloudflare/workers-types@4.20250906.0) @@ -1277,7 +1340,7 @@ importers: version: 1.55.0 vitest: specifier: ^3.2.4 - version: 3.2.4(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) vendor: dependencies: @@ -1299,7 +1362,7 @@ importers: version: 0.14.1 jscodeshift: specifier: ^17.1.1 - version: 17.3.0 + version: 17.3.0(@babel/preset-env@7.28.3(@babel/core@7.28.3)) tsd: specifier: ^0.33.0 version: 0.33.0 @@ -1310,6 +1373,141 @@ importers: specifier: ^8.8.1 version: 8.8.1 + vendor/level/abstract-level: + dependencies: + '@fireproof/level-supports': + specifier: workspace:* + version: link:../supports + '@fireproof/level-transcoder': + specifier: workspace:* + version: link:../transcoder + '@fireproof/maybe-combine-errors': + specifier: workspace:* + version: link:../maybe-combine-errors + '@fireproof/module-error': + specifier: workspace:* + version: link:../module-error + '@posva/event-emitter': + specifier: ^1.0.3 + version: 1.0.3 + devDependencies: + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + + vendor/level/functional-red-black-tree: + dependencies: + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + devDependencies: + '@fireproof/core-cli': + specifier: workspace:0.0.0 + version: link:../../../cli + '@fireproof/iota-array': + specifier: workspace:0.0.0 + version: link:../iota-array + '@vitest/browser': + specifier: ^3.2.4 + version: 3.2.4(playwright@1.55.0)(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) + + vendor/level/iota-array: + devDependencies: + '@fireproof/core-cli': + specifier: workspace:0.0.0 + version: link:../../../cli + '@vitest/browser': + specifier: ^3.2.4 + version: 3.2.4(playwright@1.55.0)(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) + playwright: + specifier: ^1.55.0 + version: 1.55.0 + playwright-chromium: + specifier: ^1.55.0 + version: 1.55.0 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + + vendor/level/maybe-combine-errors: + devDependencies: + '@fireproof/core-cli': + specifier: workspace:0.0.0 + version: link:../../../cli + '@vitest/browser': + specifier: ^3.2.4 + version: 3.2.4(playwright@1.55.0)(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) + playwright: + specifier: ^1.55.0 + version: 1.55.0 + playwright-chromium: + specifier: ^1.55.0 + version: 1.55.0 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + + vendor/level/module-error: + devDependencies: + '@fireproof/core-cli': + specifier: workspace:0.0.0 + version: link:../../../cli + '@vitest/browser': + specifier: ^3.2.4 + version: 3.2.4(playwright@1.55.0)(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) + playwright: + specifier: ^1.55.0 + version: 1.55.0 + playwright-chromium: + specifier: ^1.55.0 + version: 1.55.0 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + + vendor/level/supports: + dependencies: + '@fireproof/level-transcoder': + specifier: workspace:* + version: link:../transcoder + '@vitest/browser': + specifier: ^3.2.4 + version: 3.2.4(playwright@1.55.0)(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) + playwright: + specifier: ^1.55.0 + version: 1.55.0 + playwright-chromium: + specifier: ^1.55.0 + version: 1.55.0 + devDependencies: + '@fireproof/core-cli': + specifier: workspace:* + version: link:../../../cli + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + + vendor/level/transcoder: + devDependencies: + '@fireproof/core-cli': + specifier: workspace:* + version: link:../../../cli + '@fireproof/module-error': + specifier: workspace:* + version: link:../module-error + '@vitest/browser': + specifier: ^3.2.4 + version: 3.2.4(playwright@1.55.0)(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) + playwright: + specifier: ^1.55.0 + version: 1.55.0 + playwright-chromium: + specifier: ^1.55.0 + version: 1.55.0 + vitest: + specifier: ^3.2.4 + version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + packages: '@adraffy/ens-normalize@1.11.0': @@ -1365,6 +1563,17 @@ packages: peerDependencies: '@babel/core': ^7.0.0 + '@babel/helper-create-regexp-features-plugin@7.27.1': + resolution: {integrity: sha512-uVDC72XVf8UbrH5qQTc18Agb8emwjTiZrQE11Nv3CuBEZmVvTwwE9CBUEvHku06gQCAyYf8Nv6ja1IN+6LMbxQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-define-polyfill-provider@0.6.5': + resolution: {integrity: sha512-uJnGFcPsWQK8fvjgGP5LZUZZsYGIoPeRjSF5PGwrelYgq7Q15/Ft9NGFp1zglwgIv//W0uG4BevRuSJRyylZPg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + '@babel/helper-globals@7.28.0': resolution: {integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==} engines: {node: '>=6.9.0'} @@ -1391,6 +1600,12 @@ packages: resolution: {integrity: sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==} engines: {node: '>=6.9.0'} + '@babel/helper-remap-async-to-generator@7.27.1': + resolution: {integrity: sha512-7fiA521aVw8lSPeI4ZOD3vRFkoqkJcS+z4hFo82bFSH/2tNd6eJ5qCVMS5OzDmZh/kaHQeBaeyxK6wljcPtveA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + '@babel/helper-replace-supers@7.27.1': resolution: {integrity: sha512-7EHz6qDZc8RYS5ElPoShMheWvEgERonFCs7IAonWLLUTXW59DP14bCZt89/GKyreYn8g3S83m21FelHKbeDCKA==} engines: {node: '>=6.9.0'} @@ -1413,6 +1628,10 @@ packages: resolution: {integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==} engines: {node: '>=6.9.0'} + '@babel/helper-wrap-function@7.28.3': + resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} + engines: {node: '>=6.9.0'} + '@babel/helpers@7.28.3': resolution: {integrity: sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==} engines: {node: '>=6.9.0'} @@ -1431,12 +1650,60 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1': + resolution: {integrity: sha512-QPG3C9cCVRQLxAVwmefEmwdTanECuUBMQZ/ym5kiw3XKCGA7qkuQLcjWWHcrD/GKbn/WmJwaezfuuAOcyKlRPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1': + resolution: {integrity: sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1': + resolution: {integrity: sha512-g4L7OYun04N1WyqMNjldFwlfPCLVkgB54A/YCXICZYBsvJJE3kByKv9c9+R/nAfmIfjl2rKYLNyMHboYbZaWaA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1': + resolution: {integrity: sha512-oO02gcONcD5O1iTLi/6frMJBIwWEHceWGSGqrpCmEL8nogiS6J9PBlE48CaK20/Jx1LuRml9aDftLgdjXT8+Cw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.13.0 + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': + resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': + resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-flow@7.27.1': resolution: {integrity: sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-import-assertions@7.27.1': + resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-attributes@7.27.1': + resolution: {integrity: sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + '@babel/plugin-syntax-jsx@7.27.1': resolution: {integrity: sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==} engines: {node: '>=6.9.0'} @@ -1449,128 +1716,421 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.27.1': - resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} + '@babel/plugin-syntax-unicode-sets-regex@7.18.6': + resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.0.0 - '@babel/plugin-transform-flow-strip-types@7.27.1': - resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} + '@babel/plugin-transform-arrow-functions@7.27.1': + resolution: {integrity: sha512-8Z4TGic6xW70FKThA5HYEKKyBpOOsucTOD1DjU3fZxDg+K3zBJcXMFnt/4yQiZnf5+MiOMSXQ9PaEK/Ilh1DeA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-modules-commonjs@7.27.1': - resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + '@babel/plugin-transform-async-generator-functions@7.28.0': + resolution: {integrity: sha512-BEOdvX4+M765icNPZeidyADIvQ1m1gmunXufXxvRESy/jNNyfovIqUyE7MVgGBjWktCoJlzvFA1To2O4ymIO3Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + '@babel/plugin-transform-async-to-generator@7.27.1': + resolution: {integrity: sha512-NREkZsZVJS4xmTr8qzE5y8AfIPqsdQfRuUiLRTEzb7Qii8iFWCyDKaUV2c0rCuh4ljDZ98ALHP/PetiBV2nddA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.27.1': - resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} + '@babel/plugin-transform-block-scoped-functions@7.27.1': + resolution: {integrity: sha512-cnqkuOtZLapWYZUYM5rVIdv1nXYuFVIltZ6ZJ7nIj585QsjKM5dhL2Fu/lICXZ1OyIAFc7Qy+bvDAtTXqGrlhg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.27.1': - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + '@babel/plugin-transform-block-scoping@7.28.4': + resolution: {integrity: sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-self@7.27.1': - resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + '@babel/plugin-transform-class-properties@7.27.1': + resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-react-jsx-source@7.27.1': - resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + '@babel/plugin-transform-class-static-block@7.28.3': + resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} engines: {node: '>=6.9.0'} peerDependencies: - '@babel/core': ^7.0.0-0 + '@babel/core': ^7.12.0 - '@babel/plugin-transform-typescript@7.28.0': - resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} + '@babel/plugin-transform-classes@7.28.4': + resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-flow@7.27.1': - resolution: {integrity: sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg==} + '@babel/plugin-transform-computed-properties@7.27.1': + resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/preset-typescript@7.27.1': - resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} + '@babel/plugin-transform-destructuring@7.28.0': + resolution: {integrity: sha512-v1nrSMBiKcodhsyJ4Gf+Z0U/yawmJDBOTpEB3mcQY52r9RIyPneGyAS/yM6seP/8I+mWI3elOMtT5dB8GJVs+A==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/register@7.28.3': - resolution: {integrity: sha512-CieDOtd8u208eI49bYl4z1J22ySFw87IGwE+IswFEExH7e3rLgKb0WNQeumnacQ1+VoDJLYI5QFA3AJZuyZQfA==} + '@babel/plugin-transform-dotall-regex@7.27.1': + resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/runtime@7.28.3': - resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==} + '@babel/plugin-transform-duplicate-keys@7.27.1': + resolution: {integrity: sha512-MTyJk98sHvSs+cvZ4nOauwTTG1JeonDjSGvGGUNHreGQns+Mpt6WX/dVzWBHgg+dYZhkC4X+zTDfkTU+Vy9y7Q==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/runtime@7.28.4': - resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-hkGcueTEzuhB30B3eJCbCYeCaaEQOmQR0AdvzpD4LoN0GXMWzzGSuRrxR2xTnCrvNbVwK9N6/jQ92GSLfiZWoQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 - '@babel/template@7.27.2': - resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + '@babel/plugin-transform-dynamic-import@7.27.1': + resolution: {integrity: sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/traverse@7.28.3': - resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} + '@babel/plugin-transform-explicit-resource-management@7.28.0': + resolution: {integrity: sha512-K8nhUcn3f6iB+P3gwCv/no7OdzOZQcKchW6N389V6PD8NUWKZHzndOd9sPDVbMoBsbmjMqlB4L9fm+fEFNVlwQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/traverse@7.28.4': - resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + '@babel/plugin-transform-exponentiation-operator@7.27.1': + resolution: {integrity: sha512-uspvXnhHvGKf2r4VVtBpeFnuDWsJLQ6MF6lGJLC89jBR1uoVeqM416AZtTuhTezOfgHicpJQmoD5YUakO/YmXQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/types@7.28.2': - resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + '@babel/plugin-transform-export-namespace-from@7.27.1': + resolution: {integrity: sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@babel/types@7.28.4': - resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + '@babel/plugin-transform-flow-strip-types@7.27.1': + resolution: {integrity: sha512-G5eDKsu50udECw7DL2AcsysXiQyB7Nfg521t2OAJ4tbfTJ27doHLeF/vlI1NZGlLdbb/v+ibvtL1YBQqYOwJGg==} engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@base-org/account@2.0.1': - resolution: {integrity: sha512-tySVNx+vd6XEynZL0uvB10uKiwnAfThr8AbKTwILVG86mPbLAhEOInQIk+uDnvpTvfdUhC1Bi5T/46JvFoLZQQ==} + '@babel/plugin-transform-for-of@7.27.1': + resolution: {integrity: sha512-BfbWFFEJFQzLCQ5N8VocnCtA8J1CLkNTe2Ms2wocj75dd6VpiqS5Z5quTYcUoo4Yq+DN0rtikODccuv7RU81sw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@clerk/backend@2.12.1': - resolution: {integrity: sha512-itpMTMrPaitY8wU6gvmG5GMLecAmyvWnNZB3FHntIhyS/na+bHcdYRyNlCksvh7s39f3wXuS2lwoUCanXEs7yg==} - engines: {node: '>=18.17.0'} + '@babel/plugin-transform-function-name@7.27.1': + resolution: {integrity: sha512-1bQeydJF9Nr1eBCMMbC+hdwmRlsv5XYOMu03YSWFwNs0HsAmtSxxF1fyuYPqemVldVyFmlCU7w8UE14LupUSZQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 - '@clerk/clerk-js@5.91.2': - resolution: {integrity: sha512-6oqaLGo9dLXBginLoQwLtKsZwaayvHIbGgl5CQr6wPMSxrUai7DxAGwZCfE7CvqsRzJrn6cvUGSH00lnU2fMGA==} - engines: {node: '>=18.17.0'} + '@babel/plugin-transform-json-strings@7.27.1': + resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} + engines: {node: '>=6.9.0'} peerDependencies: - react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 - react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + '@babel/core': ^7.0.0-0 - '@clerk/clerk-react@5.46.1': - resolution: {integrity: sha512-vKtIU3SHfIfsPFcLlw+I+El3VxN/io2aekGzAP7cKoClRPB4bE8GKsLvLIA326ff7yTDnvyrdxfEFY4ieyq5zg==} - engines: {node: '>=18.17.0'} + '@babel/plugin-transform-literals@7.27.1': + resolution: {integrity: sha512-0HCFSepIpLTkLcsi86GG3mTUzxV5jpmbv97hTETW3yzrAij8aqlD36toB1D0daVFJM8NK6GvKO0gslVQmm+zZA==} + engines: {node: '>=6.9.0'} peerDependencies: - react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 - react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + '@babel/core': ^7.0.0-0 - '@clerk/localizations@3.24.2': + '@babel/plugin-transform-logical-assignment-operators@7.27.1': + resolution: {integrity: sha512-SJvDs5dXxiae4FbSL1aBJlG4wvl594N6YEVVn9e3JGulwioy6z3oPjx/sQBO3Y4NwUu5HNix6KJ3wBZoewcdbw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-member-expression-literals@7.27.1': + resolution: {integrity: sha512-hqoBX4dcZ1I33jCSWcXrP+1Ku7kdqXf1oeah7ooKOIiAdKQ+uqftgCFNOSzA5AMS2XIHEYeGFg4cKRCdpxzVOQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-amd@7.27.1': + resolution: {integrity: sha512-iCsytMg/N9/oFq6n+gFTvUYDZQOMK5kEdeYxmxt91fcJGycfxVP9CnrxoliM0oumFERba2i8ZtwRUCMhvP1LnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.27.1': + resolution: {integrity: sha512-OJguuwlTYlN0gBZFRPqwOGNWssZjfIUdS7HMYtN8c1KmwpwHFBwTeFZrg9XZa+DFTitWOW5iTAG7tyCUPsCCyw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-systemjs@7.27.1': + resolution: {integrity: sha512-w5N1XzsRbc0PQStASMksmUeqECuzKuTJer7kFagK8AXgpCMkeDMO5S+aaFb7A51ZYDF7XI34qsTX+fkHiIm5yA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-umd@7.27.1': + resolution: {integrity: sha512-iQBE/xC5BV1OxJbp6WG7jq9IWiD+xxlZhLrdwpPkTX3ydmXdvoCpyfJN7acaIBZaOqTfr76pgzqBJflNbeRK+w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1': + resolution: {integrity: sha512-SstR5JYy8ddZvD6MhV0tM/j16Qds4mIpJTOd1Yu9J9pJjH93bxHECF7pgtc28XvkzTD6Pxcm/0Z73Hvk7kb3Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-new-target@7.27.1': + resolution: {integrity: sha512-f6PiYeqXQ05lYq3TIfIDu/MtliKUbNwkGApPUvyo6+tc7uaR4cPjPe7DFPr15Uyycg2lZU6btZ575CuQoYh7MQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': + resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-numeric-separator@7.27.1': + resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-rest-spread@7.28.4': + resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-object-super@7.27.1': + resolution: {integrity: sha512-SFy8S9plRPbIcxlJ8A6mT/CxFdJx/c04JEctz4jf8YZaVS2px34j7NXRrlGlHkN/M2gnpL37ZpGRGVFLd3l8Ng==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-catch-binding@7.27.1': + resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-optional-chaining@7.27.1': + resolution: {integrity: sha512-BQmKPPIuc8EkZgNKsv0X4bPmOoayeu4F1YCwx2/CfmDSXDbp7GnzlUH+/ul5VGfRg1AoFPsrIThlEBj2xb4CAg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-parameters@7.27.7': + resolution: {integrity: sha512-qBkYTYCb76RRxUM6CcZA5KRu8K4SM8ajzVeUgVdMVO9NN9uI/GaVmBg/WKJJGnNokV9SY8FxNOVWGXzqzUidBg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-methods@7.27.1': + resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-private-property-in-object@7.27.1': + resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-property-literals@7.27.1': + resolution: {integrity: sha512-oThy3BCuCha8kDZ8ZkgOg2exvPYUlprMukKQXI1r1pJ47NCvxfkEy8vK+r/hT9nF0Aa4H1WUPZZjHTFtAhGfmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.27.1': + resolution: {integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.27.1': + resolution: {integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regenerator@7.28.4': + resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-regexp-modifiers@7.27.1': + resolution: {integrity: sha512-TtEciroaiODtXvLZv4rmfMhkCv8jx3wgKpL68PuiPh2M4fvz5jhsA7697N1gMvkvr/JTF13DrFYyEbY9U7cVPA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/plugin-transform-reserved-words@7.27.1': + resolution: {integrity: sha512-V2ABPHIJX4kC7HegLkYoDpfg9PVmuWy/i6vUM5eGK22bx4YVFD3M5F0QQnWQoDs6AGsUWTVOopBiMFQgHaSkVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-shorthand-properties@7.27.1': + resolution: {integrity: sha512-N/wH1vcn4oYawbJ13Y/FxcQrWk63jhfNa7jef0ih7PHSIHX2LB7GWE1rkPrOnka9kwMxb6hMl19p7lidA+EHmQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-spread@7.27.1': + resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-sticky-regex@7.27.1': + resolution: {integrity: sha512-lhInBO5bi/Kowe2/aLdBAawijx+q1pQzicSgnkB6dUPc1+RC8QmJHKf2OjvU+NZWitguJHEaEmbV6VWEouT58g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-template-literals@7.27.1': + resolution: {integrity: sha512-fBJKiV7F2DxZUkg5EtHKXQdbsbURW3DZKQUWphDum0uRP6eHGGa/He9mc0mypL680pb+e/lDIthRohlv8NCHkg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typeof-symbol@7.27.1': + resolution: {integrity: sha512-RiSILC+nRJM7FY5srIyc4/fGIwUhyDuuBSdWn4y6yT6gm652DpCHZjIipgn6B7MQ1ITOUnAKWixEUjQRIBIcLw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.28.0': + resolution: {integrity: sha512-4AEiDEBPIZvLQaWlc9liCavE0xRM0dNca41WtBeM3jgFptfUOSG9z0uteLhq6+3rq+WB6jIvUwKDTpXEHPJ2Vg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-escapes@7.27.1': + resolution: {integrity: sha512-Ysg4v6AmF26k9vpfFuTZg8HRfVWzsh1kVfowA23y9j/Gu6dOuahdUVhkLqpObp3JIv27MLSii6noRnuKN8H0Mg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-property-regex@7.27.1': + resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-regex@7.27.1': + resolution: {integrity: sha512-xvINq24TRojDuyt6JGtHmkVkrfVV3FPT16uytxImLeBZqW3/H52yN+kM1MGuyPkIQxrzKwPHs5U/MP3qKyzkGw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-unicode-sets-regex@7.27.1': + resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/preset-env@7.28.3': + resolution: {integrity: sha512-ROiDcM+GbYVPYBOeCR6uBXKkQpBExLl8k9HO1ygXEyds39j+vCCsjmj7S8GOniZQlEs81QlkdJZe76IpLSiqpg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-flow@7.27.1': + resolution: {integrity: sha512-ez3a2it5Fn6P54W8QkbfIyyIbxlXvcxyWHHvno1Wg0Ej5eiJY5hBb8ExttoIOJJk7V2dZE6prP7iby5q2aQ0Lg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-modules@0.1.6-no-external-plugins': + resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} + peerDependencies: + '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 + + '@babel/preset-typescript@7.27.1': + resolution: {integrity: sha512-l7WfQfX0WK4M0v2RudjuQK4u99BS6yLHYEmdtVPP7lKV013zr9DygFuWNlnbvQ9LR+LS0Egz/XAvGx5U9MX0fQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/register@7.28.3': + resolution: {integrity: sha512-CieDOtd8u208eI49bYl4z1J22ySFw87IGwE+IswFEExH7e3rLgKb0WNQeumnacQ1+VoDJLYI5QFA3AJZuyZQfA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.28.3': + resolution: {integrity: sha512-9uIQ10o0WGdpP6GDhXcdOJPJuDgFtIDtN/9+ArJQ2NAfAmiuhTQdzkaTGR33v43GYS2UrSA0eX2pPPHoFVvpxA==} + engines: {node: '>=6.9.0'} + + '@babel/runtime@7.28.4': + resolution: {integrity: sha512-Q/N6JNWvIvPnLDvjlE1OUBLPQHH6l3CltCEsHIujp45zQUSSh8K+gHnaEX45yAT1nyngnINhvWtzN+Nb9D8RAQ==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.27.2': + resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.3': + resolution: {integrity: sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.28.4': + resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.2': + resolution: {integrity: sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.28.4': + resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==} + engines: {node: '>=6.9.0'} + + '@base-org/account@2.0.1': + resolution: {integrity: sha512-tySVNx+vd6XEynZL0uvB10uKiwnAfThr8AbKTwILVG86mPbLAhEOInQIk+uDnvpTvfdUhC1Bi5T/46JvFoLZQQ==} + + '@clerk/backend@2.12.1': + resolution: {integrity: sha512-itpMTMrPaitY8wU6gvmG5GMLecAmyvWnNZB3FHntIhyS/na+bHcdYRyNlCksvh7s39f3wXuS2lwoUCanXEs7yg==} + engines: {node: '>=18.17.0'} + + '@clerk/clerk-js@5.91.2': + resolution: {integrity: sha512-6oqaLGo9dLXBginLoQwLtKsZwaayvHIbGgl5CQr6wPMSxrUai7DxAGwZCfE7CvqsRzJrn6cvUGSH00lnU2fMGA==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + + '@clerk/clerk-react@5.46.1': + resolution: {integrity: sha512-vKtIU3SHfIfsPFcLlw+I+El3VxN/io2aekGzAP7cKoClRPB4bE8GKsLvLIA326ff7yTDnvyrdxfEFY4ieyq5zg==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + + '@clerk/localizations@3.24.2': resolution: {integrity: sha512-ElOLHQJALrWbnRpdausIsdGMmRzHYjl0WxAfkaP+u+NSk/4rIlsNsdvMCSqktC5pZUIqvRGGKKLhNFrvO/gx+g==} engines: {node: '>=18.17.0'} @@ -2776,6 +3336,9 @@ packages: '@poppinss/exception@1.2.2': resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} + '@posva/event-emitter@1.0.3': + resolution: {integrity: sha512-Cfq7RBo5xTwvc4LTJlyiuaQCe3wJfCqrgZv58C1Etqk0njydgFFd0lk00eeCHGwln2dAvS9se+xEIUCGSJs4GQ==} + '@remix-run/node-fetch-server@0.8.0': resolution: {integrity: sha512-8/sKegb4HrM6IdcQeU0KPhj9VOHm5SUqswJDHuMCS3mwbr/NRx078QDbySmn0xslahvvZoOENd7EnK40kWKxkg==} @@ -2800,171 +3363,86 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.49.0': - resolution: {integrity: sha512-rlKIeL854Ed0e09QGYFlmDNbka6I3EQFw7iZuugQjMb11KMpJCLPFL4ZPbMfaEhLADEL1yx0oujGkBQ7+qW3eA==} - cpu: [arm] - os: [android] - '@rollup/rollup-android-arm-eabi@4.50.1': resolution: {integrity: sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.49.0': - resolution: {integrity: sha512-cqPpZdKUSQYRtLLr6R4X3sD4jCBO1zUmeo3qrWBCqYIeH8Q3KRL4F3V7XJ2Rm8/RJOQBZuqzQGWPjjvFUcYa/w==} - cpu: [arm64] - os: [android] - '@rollup/rollup-android-arm64@4.50.1': resolution: {integrity: sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.49.0': - resolution: {integrity: sha512-99kMMSMQT7got6iYX3yyIiJfFndpojBmkHfTc1rIje8VbjhmqBXE+nb7ZZP3A5skLyujvT0eIUCUsxAe6NjWbw==} - cpu: [arm64] - os: [darwin] - '@rollup/rollup-darwin-arm64@4.50.1': resolution: {integrity: sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.49.0': - resolution: {integrity: sha512-y8cXoD3wdWUDpjOLMKLx6l+NFz3NlkWKcBCBfttUn+VGSfgsQ5o/yDUGtzE9HvsodkP0+16N0P4Ty1VuhtRUGg==} - cpu: [x64] - os: [darwin] - '@rollup/rollup-darwin-x64@4.50.1': resolution: {integrity: sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.49.0': - resolution: {integrity: sha512-3mY5Pr7qv4GS4ZvWoSP8zha8YoiqrU+e0ViPvB549jvliBbdNLrg2ywPGkgLC3cmvN8ya3za+Q2xVyT6z+vZqA==} - cpu: [arm64] - os: [freebsd] - '@rollup/rollup-freebsd-arm64@4.50.1': resolution: {integrity: sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.49.0': - resolution: {integrity: sha512-C9KzzOAQU5gU4kG8DTk+tjdKjpWhVWd5uVkinCwwFub2m7cDYLOdtXoMrExfeBmeRy9kBQMkiyJ+HULyF1yj9w==} - cpu: [x64] - os: [freebsd] - '@rollup/rollup-freebsd-x64@4.50.1': resolution: {integrity: sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.49.0': - resolution: {integrity: sha512-OVSQgEZDVLnTbMq5NBs6xkmz3AADByCWI4RdKSFNlDsYXdFtlxS59J+w+LippJe8KcmeSSM3ba+GlsM9+WwC1w==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-gnueabihf@4.50.1': resolution: {integrity: sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.49.0': - resolution: {integrity: sha512-ZnfSFA7fDUHNa4P3VwAcfaBLakCbYaxCk0jUnS3dTou9P95kwoOLAMlT3WmEJDBCSrOEFFV0Y1HXiwfLYJuLlA==} - cpu: [arm] - os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.50.1': resolution: {integrity: sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.49.0': - resolution: {integrity: sha512-Z81u+gfrobVK2iV7GqZCBfEB1y6+I61AH466lNK+xy1jfqFLiQ9Qv716WUM5fxFrYxwC7ziVdZRU9qvGHkYIJg==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.50.1': resolution: {integrity: sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.49.0': - resolution: {integrity: sha512-zoAwS0KCXSnTp9NH/h9aamBAIve0DXeYpll85shf9NJ0URjSTzzS+Z9evmolN+ICfD3v8skKUPyk2PO0uGdFqg==} - cpu: [arm64] - os: [linux] - '@rollup/rollup-linux-arm64-musl@4.50.1': resolution: {integrity: sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.49.0': - resolution: {integrity: sha512-2QyUyQQ1ZtwZGiq0nvODL+vLJBtciItC3/5cYN8ncDQcv5avrt2MbKt1XU/vFAJlLta5KujqyHdYtdag4YEjYQ==} - cpu: [loong64] - os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.50.1': resolution: {integrity: sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.49.0': - resolution: {integrity: sha512-k9aEmOWt+mrMuD3skjVJSSxHckJp+SiFzFG+v8JLXbc/xi9hv2icSkR3U7uQzqy+/QbbYY7iNB9eDTwrELo14g==} + '@rollup/rollup-linux-ppc64-gnu@4.50.1': + resolution: {integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-ppc64-gnu@4.50.1': - resolution: {integrity: sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==} - cpu: [ppc64] - os: [linux] - - '@rollup/rollup-linux-riscv64-gnu@4.49.0': - resolution: {integrity: sha512-rDKRFFIWJ/zJn6uk2IdYLc09Z7zkE5IFIOWqpuU0o6ZpHcdniAyWkwSUWE/Z25N/wNDmFHHMzin84qW7Wzkjsw==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.50.1': resolution: {integrity: sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.49.0': - resolution: {integrity: sha512-FkkhIY/hYFVnOzz1WeV3S9Bd1h0hda/gRqvZCMpHWDHdiIHn6pqsY3b5eSbvGccWHMQ1uUzgZTKS4oGpykf8Tw==} - cpu: [riscv64] - os: [linux] - '@rollup/rollup-linux-riscv64-musl@4.50.1': resolution: {integrity: sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.49.0': - resolution: {integrity: sha512-gRf5c+A7QiOG3UwLyOOtyJMD31JJhMjBvpfhAitPAoqZFcOeK3Kc1Veg1z/trmt+2P6F/biT02fU19GGTS529A==} - cpu: [s390x] - os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.50.1': resolution: {integrity: sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.49.0': - resolution: {integrity: sha512-BR7+blScdLW1h/2hB/2oXM+dhTmpW3rQt1DeSiCP9mc2NMMkqVgjIN3DDsNpKmezffGC9R8XKVOLmBkRUcK/sA==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-gnu@4.50.1': resolution: {integrity: sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.49.0': - resolution: {integrity: sha512-hDMOAe+6nX3V5ei1I7Au3wcr9h3ktKzDvF2ne5ovX8RZiAHEtX1A5SNNk4zt1Qt77CmnbqT+upb/umzoPMWiPg==} - cpu: [x64] - os: [linux] - '@rollup/rollup-linux-x64-musl@4.50.1': resolution: {integrity: sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==} cpu: [x64] @@ -2975,31 +3453,16 @@ packages: cpu: [arm64] os: [openharmony] - '@rollup/rollup-win32-arm64-msvc@4.49.0': - resolution: {integrity: sha512-wkNRzfiIGaElC9kXUT+HLx17z7D0jl+9tGYRKwd8r7cUqTL7GYAvgUY++U2hK6Ar7z5Z6IRRoWC8kQxpmM7TDA==} - cpu: [arm64] - os: [win32] - '@rollup/rollup-win32-arm64-msvc@4.50.1': resolution: {integrity: sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.49.0': - resolution: {integrity: sha512-gq5aW/SyNpjp71AAzroH37DtINDcX1Qw2iv9Chyz49ZgdOP3NV8QCyKZUrGsYX9Yyggj5soFiRCgsL3HwD8TdA==} - cpu: [ia32] - os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.50.1': resolution: {integrity: sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.49.0': - resolution: {integrity: sha512-gEtqFbzmZLFk2xKh7g0Rlo8xzho8KrEFEkzvHbfUGkrgXOpZ4XagQ6n+wIZFNh1nTb8UD16J4nFSFKXYgnbdBg==} - cpu: [x64] - os: [win32] - '@rollup/rollup-win32-x64-msvc@4.50.1': resolution: {integrity: sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==} cpu: [x64] @@ -3097,6 +3560,9 @@ packages: '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} @@ -3127,6 +3593,9 @@ packages: '@types/minimist@1.2.5': resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + '@types/ms@2.1.0': + resolution: {integrity: sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==} + '@types/node@24.3.0': resolution: {integrity: sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow==} @@ -3333,6 +3802,10 @@ packages: zod: optional: true + abstract-level@3.1.0: + resolution: {integrity: sha512-j2e+TsAxy7Ri+0h7dJqwasymgt0zHBWX4+nMk3XatyuqgHfdstBJ9wsMfbiGwE1O+QovRyPcVAqcViMYdyPaaw==} + engines: {node: '>=18'} + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -3475,6 +3948,21 @@ packages: resolution: {integrity: sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==} engines: {node: '>=10', npm: '>=6'} + babel-plugin-polyfill-corejs2@0.4.14: + resolution: {integrity: sha512-Co2Y9wX854ts6U8gAAPXfn0GmAyctHuK8n0Yhfjd6t30g7yvKjspvvOo9yG+z52PZRgFErt7Ka2pYnXCjLKEpg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-corejs3@0.13.0: + resolution: {integrity: sha512-U+GNwMdSFgzVmfhNm8GJUX88AadB3uo9KpJqS3FaqNIPKgySuvMb+bHPsOmmuWyIcuqZj/pzt1RUIUZns4y2+A==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + + babel-plugin-polyfill-regenerator@0.6.5: + resolution: {integrity: sha512-ISqQ2frbiNU9vIJkzg7dlPpznPZ4jOiUQ1uSmB0fEHeowtN3COYRsXr/xexn64NpU13P06jc/L5TgiJXOgrbEg==} + peerDependencies: + '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -3505,6 +3993,9 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + browser-level@3.0.0: + resolution: {integrity: sha512-kGXtLh29jMwqKaskz5xeDLtCtN1KBz/DbQSqmvH7QdJiyGRC7RAM8PPg6gvUiNMa+wVnaxS9eSmEtP/f5ajOVw==} + browser-tabs-lock@1.3.0: resolution: {integrity: sha512-g6nHaobTiT0eMZ7jh16YpD2kcjAp+PInbiVq3M1x6KKaEIVhT4v9oURNIpZLOZ3LQbQ3XYfNhMAb/9hzNLIWrw==} @@ -3524,6 +4015,9 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -3596,6 +4090,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + classic-level@3.0.0: + resolution: {integrity: sha512-yGy8j8LjPbN0Bh3+ygmyYvrmskVita92pD/zCoalfcC9XxZj6iDtZTAnz+ot7GG8p9KLTG+MZ84tSA4AhkgVZQ==} + engines: {node: '>=18'} + cli-color@2.0.4: resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} engines: {node: '>=0.10'} @@ -3652,6 +4150,9 @@ packages: copy-to-clipboard@3.3.3: resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==} + core-js-compat@3.45.1: + resolution: {integrity: sha512-tqTt5T4PzsMIZ430XGviK4vzYSoeNJ6CXODi6c/voxOT6IZqBht5/EKaSNnYiEjjRYxjVz7DQIsOsY0XNi8PIA==} + core-js@3.41.0: resolution: {integrity: sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA==} @@ -3757,6 +4258,9 @@ packages: resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} + dexie@4.2.0: + resolution: {integrity: sha512-OSeyyWOUetDy9oFWeddJgi83OnRA3hSFh3RrbltmPgqHszE9f24eUCVLI4mPg0ifsWk0lQTdnS+jyGNrPMvhDA==} + didyoumean@1.2.2: resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} @@ -4237,6 +4741,9 @@ packages: resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} + functional-red-black-tree@1.0.1: + resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} + functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} @@ -4438,6 +4945,10 @@ packages: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -4622,6 +5133,11 @@ packages: '@babel/preset-env': optional: true + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + jsesc@3.1.0: resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} engines: {node: '>=6'} @@ -4670,6 +5186,18 @@ packages: resolution: {integrity: sha512-rlB0I/c6FBDWPcQoDtkxi9zIvpmnV5xoIalfCMSMCa7nuA6VGA3F54TW9mEgX4DVf10sXAWCF5fDbamI/5ZpKA==} engines: {node: '>=20.0.0'} + level-supports@6.2.0: + resolution: {integrity: sha512-QNxVXP0IRnBmMsJIh+sb2kwNCYcKciQZJEt+L1hPCHrKNELllXhvrlClVHXBYZVT+a7aTSM6StgNXdAldoab3w==} + engines: {node: '>=16'} + + level-transcoder@1.0.1: + resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} + engines: {node: '>=12'} + + level@10.0.0: + resolution: {integrity: sha512-aZJvdfRr/f0VBbSRF5C81FHON47ZsC2TkGxbBezXpGGXAUEL/s6+GP73nnhAYRSCIqUNsmJjfeOF4lzRDKbUig==} + engines: {node: '>=18'} + levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -4707,6 +5235,9 @@ packages: resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + lodash.merge@4.6.2: resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} @@ -4760,10 +5291,18 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} + maybe-combine-errors@1.0.0: + resolution: {integrity: sha512-eefp6IduNPT6fVdwPp+1NgD0PML1NU5P6j1Mj5nz1nidX8/sWY7119WL8vTAHgqfsY74TzW0w1XPgdYEKkGZ5A==} + engines: {node: '>=10'} + memoizee@0.4.17: resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} engines: {node: '>=0.12'} + memory-level@3.1.0: + resolution: {integrity: sha512-mTqFVi5iReKcjue/pag0OY4VNU7dlagCyjjPwWGierpk1Bpl9WjOxgXIswymPW3Q9bj3Foay+Z16mPGnKzvTkQ==} + engines: {node: '>=18'} + meow@9.0.0: resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} engines: {node: '>=10'} @@ -4817,6 +5356,10 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + module-error@1.0.2: + resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} + engines: {node: '>=10'} + monaco-editor@0.52.2: resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} @@ -4842,6 +5385,9 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true + napi-macros@2.2.2: + resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} + natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -4860,6 +5406,10 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} @@ -5261,6 +5811,13 @@ packages: resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==} engines: {node: '>= 0.4'} + regenerate-unicode-properties@10.2.2: + resolution: {integrity: sha512-m03P+zhBeQd1RGnYxrGyDAPpWX/epKirLrp8e3qevZdVkKtnCrjjWczIbYc8+xd6vcTStVlqfycTx1KR4LOr0g==} + engines: {node: '>=4'} + + regenerate@1.4.2: + resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} + regenerator-runtime@0.14.1: resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} @@ -5268,6 +5825,17 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} + regexpu-core@6.3.1: + resolution: {integrity: sha512-DzcswPr252wEr7Qz8AyAVbfyBDKLoYp6eRA1We2Fa9qirRFSdtkP5sHr3yglDKy2BbA0fd2T+j/CUSKes3FeVQ==} + engines: {node: '>=4'} + + regjsgen@0.8.0: + resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} + + regjsparser@0.12.0: + resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} + hasBin: true + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -5305,11 +5873,6 @@ packages: rollup: optional: true - rollup@4.49.0: - resolution: {integrity: sha512-3IVq0cGJ6H7fKXXEdVt+RcYvRCt8beYY9K1760wGQwSAHZcS9eot1zDG5axUbcp/kWRi5zKIIDX8MoKv/TzvZA==} - engines: {node: '>=18.0.0', npm: '>=8.0.0'} - hasBin: true - rollup@4.50.1: resolution: {integrity: sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -5736,6 +6299,22 @@ packages: unenv@2.0.0-rc.20: resolution: {integrity: sha512-8tn4tAl9vD5nWoggAAPz28vf0FY8+pQAayhU94qD+ZkIbVKCBAH/E1MWEEmhb9Whn5EgouYVfBJB20RsTLRDdg==} + unicode-canonical-property-names-ecmascript@2.0.1: + resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} + engines: {node: '>=4'} + + unicode-match-property-ecmascript@2.0.0: + resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} + engines: {node: '>=4'} + + unicode-match-property-value-ecmascript@2.2.1: + resolution: {integrity: sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==} + engines: {node: '>=4'} + + unicode-property-aliases-ecmascript@2.2.0: + resolution: {integrity: sha512-hpbDzxUY9BFwX+UeBnxv3Sh1q7HFxj48DTmXchNgRa46lO8uj3/1iEn3MiNUYTg1g9ctIqXCCERn8gYZhHC5lQ==} + engines: {node: '>=4'} + unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} @@ -5789,46 +6368,6 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@7.1.3: - resolution: {integrity: sha512-OOUi5zjkDxYrKhTV3V7iKsoS37VUM7v40+HuwEmcrsf11Cdx9y3DIr2Px6liIcZFwt3XSRpQvFpL3WVy7ApkGw==} - engines: {node: ^20.19.0 || >=22.12.0} - hasBin: true - peerDependencies: - '@types/node': ^20.19.0 || >=22.12.0 - jiti: '>=1.21.0' - less: ^4.0.0 - lightningcss: ^1.21.0 - sass: ^1.70.0 - sass-embedded: ^1.70.0 - stylus: '>=0.54.8' - sugarss: ^5.0.0 - terser: ^5.16.0 - tsx: ^4.8.1 - yaml: ^2.4.2 - peerDependenciesMeta: - '@types/node': - optional: true - jiti: - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - sass-embedded: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - tsx: - optional: true - yaml: - optional: true - vite@7.1.5: resolution: {integrity: sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -6167,6 +6706,26 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.3.1 + semver: 6.3.1 + optional: true + + '@babel/helper-define-polyfill-provider@0.6.5(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + debug: 4.4.1 + lodash.debounce: 4.0.8 + resolve: 1.22.10 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/helper-globals@7.28.0': {} '@babel/helper-member-expression-to-functions@7.27.1': @@ -6207,6 +6766,16 @@ snapshots: '@babel/helper-plugin-utils@7.27.1': {} + '@babel/helper-remap-async-to-generator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-wrap-function': 7.28.3 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + optional: true + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 @@ -6229,102 +6798,594 @@ snapshots: '@babel/helper-validator-option@7.27.1': {} - '@babel/helpers@7.28.3': + '@babel/helper-wrap-function@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/traverse': 7.28.4 + '@babel/types': 7.28.4 + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/helpers@7.28.3': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + + '@babel/helpers@7.28.4': + dependencies: + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + + '@babel/parser@7.28.3': + dependencies: + '@babel/types': 7.28.2 + + '@babel/parser@7.28.4': + dependencies: + '@babel/types': 7.28.4 + + '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + optional: true + + '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.3) + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-imports': 7.27.1 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-block-scoping@7.28.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-globals': 7.28.0 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/template': 7.27.2 + optional: true + + '@babel/plugin-transform-destructuring@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-transform-exponentiation-operator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.3) + + '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-transform-function-name@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-literals@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-logical-assignment-operators@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-modules-amd@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-modules-systemjs@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-transform-modules-umd@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + + '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.3) + '@babel/traverse': 7.28.4 + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true + + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-plugin-utils': 7.27.1 + transitivePeerDependencies: + - supports-color + optional: true + + '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true - '@babel/helpers@7.28.4': + '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.4 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/parser@7.28.3': + '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/types': 7.28.2 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 - '@babel/parser@7.28.4': + '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.3)': dependencies: - '@babel/types': 7.28.4 + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + optional: true - '@babel/plugin-syntax-flow@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 + optional: true - '@babel/plugin-syntax-jsx@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 + optional: true - '@babel/plugin-syntax-typescript@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 + optional: true - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color + optional: true - '@babel/plugin-transform-flow-strip-types@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-flow': 7.27.1(@babel/core@7.28.3) + optional: true - '@babel/plugin-transform-modules-commonjs@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + optional: true - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 '@babel/helper-plugin-utils': 7.27.1 + optional: true - '@babel/plugin-transform-optional-chaining@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.3)': + '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 - transitivePeerDependencies: - - supports-color + optional: true - '@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 + optional: true - '@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.3)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.3 + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 + optional: true - '@babel/plugin-transform-typescript@7.28.0(@babel/core@7.28.3)': + '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 - '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.3(@babel/core@7.28.3) + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.3) '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.3) + optional: true + + '@babel/preset-env@7.28.3(@babel/core@7.28.3)': + dependencies: + '@babel/compat-data': 7.28.4 + '@babel/core': 7.28.3 + '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-validator-option': 7.27.1 + '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.28.3) + '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.3) + '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-block-scoping': 7.28.4(@babel/core@7.28.3) + '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.28.3) + '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.28.3) + '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-destructuring': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-explicit-resource-management': 7.28.0(@babel/core@7.28.3) + '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-logical-assignment-operators': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-commonjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-systemjs': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.28.3) + '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-optional-chaining': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.3) + '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.28.3) + '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.28.3) + '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.28.3) + '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.28.3) + babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.28.3) + babel-plugin-polyfill-corejs3: 0.13.0(@babel/core@7.28.3) + babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.28.3) + core-js-compat: 3.45.1 + semver: 6.3.1 transitivePeerDependencies: - supports-color + optional: true '@babel/preset-flow@7.27.1(@babel/core@7.28.3)': dependencies: @@ -6333,6 +7394,14 @@ snapshots: '@babel/helper-validator-option': 7.27.1 '@babel/plugin-transform-flow-strip-types': 7.27.1(@babel/core@7.28.3) + '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.28.3)': + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/types': 7.28.4 + esutils: 2.0.3 + optional: true + '@babel/preset-typescript@7.27.1(@babel/core@7.28.3)': dependencies: '@babel/core': 7.28.3 @@ -7369,6 +8438,8 @@ snapshots: '@poppinss/exception@1.2.2': {} + '@posva/event-emitter@1.0.3': {} + '@remix-run/node-fetch-server@0.8.0': {} '@rolldown/pluginutils@1.0.0-beta.34': {} @@ -7388,126 +8459,66 @@ snapshots: optionalDependencies: rollup: 4.50.1 - '@rollup/rollup-android-arm-eabi@4.49.0': - optional: true - '@rollup/rollup-android-arm-eabi@4.50.1': optional: true - '@rollup/rollup-android-arm64@4.49.0': - optional: true - '@rollup/rollup-android-arm64@4.50.1': optional: true - '@rollup/rollup-darwin-arm64@4.49.0': - optional: true - '@rollup/rollup-darwin-arm64@4.50.1': optional: true - '@rollup/rollup-darwin-x64@4.49.0': - optional: true - '@rollup/rollup-darwin-x64@4.50.1': optional: true - '@rollup/rollup-freebsd-arm64@4.49.0': - optional: true - '@rollup/rollup-freebsd-arm64@4.50.1': optional: true - '@rollup/rollup-freebsd-x64@4.49.0': - optional: true - '@rollup/rollup-freebsd-x64@4.50.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.49.0': - optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.50.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.49.0': - optional: true - '@rollup/rollup-linux-arm-musleabihf@4.50.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.49.0': - optional: true - '@rollup/rollup-linux-arm64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.49.0': - optional: true - '@rollup/rollup-linux-arm64-musl@4.50.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.49.0': - optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-ppc64-gnu@4.49.0': - optional: true - '@rollup/rollup-linux-ppc64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.49.0': - optional: true - '@rollup/rollup-linux-riscv64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-riscv64-musl@4.49.0': - optional: true - '@rollup/rollup-linux-riscv64-musl@4.50.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.49.0': - optional: true - '@rollup/rollup-linux-s390x-gnu@4.50.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.49.0': - optional: true - '@rollup/rollup-linux-x64-gnu@4.50.1': optional: true - '@rollup/rollup-linux-x64-musl@4.49.0': - optional: true - '@rollup/rollup-linux-x64-musl@4.50.1': optional: true '@rollup/rollup-openharmony-arm64@4.50.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.49.0': - optional: true - '@rollup/rollup-win32-arm64-msvc@4.50.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.49.0': - optional: true - '@rollup/rollup-win32-ia32-msvc@4.50.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.49.0': - optional: true - '@rollup/rollup-win32-x64-msvc@4.50.1': optional: true @@ -7554,7 +8565,7 @@ snapshots: '@testing-library/dom@10.4.1': dependencies: '@babel/code-frame': 7.27.1 - '@babel/runtime': 7.28.3 + '@babel/runtime': 7.28.4 '@types/aria-query': 5.0.4 aria-query: 5.3.0 dom-accessibility-api: 0.5.16 @@ -7605,6 +8616,11 @@ snapshots: dependencies: '@types/deep-eql': 4.0.2 + '@types/debug@4.1.12': + dependencies: + '@types/ms': 2.1.0 + optional: true + '@types/deep-eql@4.0.2': {} '@types/deno@2.3.0': {} @@ -7636,6 +8652,9 @@ snapshots: '@types/minimist@1.2.5': {} + '@types/ms@2.1.0': + optional: true + '@types/node@24.3.0': dependencies: undici-types: 7.10.0 @@ -7801,26 +8820,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitest/browser@3.2.4(playwright@1.55.0)(vite@7.1.3(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4)': - dependencies: - '@testing-library/dom': 10.4.1 - '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1) - '@vitest/mocker': 3.2.4(vite@7.1.3(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1)) - '@vitest/utils': 3.2.4 - magic-string: 0.30.18 - sirv: 3.0.1 - tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) - ws: 8.18.3 - optionalDependencies: - playwright: 1.55.0 - transitivePeerDependencies: - - bufferutil - - msw - - utf-8-validate - - vite - optional: true - '@vitest/browser@3.2.4(playwright@1.55.0)(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4)': dependencies: '@testing-library/dom': 10.4.1 @@ -7830,7 +8829,7 @@ snapshots: magic-string: 0.30.18 sirv: 3.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.4(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) ws: 8.18.3 optionalDependencies: playwright: 1.55.0 @@ -7848,14 +8847,6 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@7.1.3(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))': - dependencies: - '@vitest/spy': 3.2.4 - estree-walker: 3.0.3 - magic-string: 0.30.18 - optionalDependencies: - vite: 7.1.3(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) - '@vitest/mocker@3.2.4(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))': dependencies: '@vitest/spy': 3.2.4 @@ -7911,6 +8902,15 @@ snapshots: typescript: 5.9.2 zod: 4.0.14 + abstract-level@3.1.0: + dependencies: + buffer: 6.0.3 + is-buffer: 2.0.5 + level-supports: 6.2.0 + level-transcoder: 1.0.1 + maybe-combine-errors: 1.0.0 + module-error: 1.0.2 + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -8066,6 +9066,33 @@ snapshots: cosmiconfig: 7.1.0 resolve: 1.22.10 + babel-plugin-polyfill-corejs2@0.4.14(@babel/core@7.28.3): + dependencies: + '@babel/compat-data': 7.28.4 + '@babel/core': 7.28.3 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.3) + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + optional: true + + babel-plugin-polyfill-corejs3@0.13.0(@babel/core@7.28.3): + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.3) + core-js-compat: 3.45.1 + transitivePeerDependencies: + - supports-color + optional: true + + babel-plugin-polyfill-regenerator@0.6.5(@babel/core@7.28.3): + dependencies: + '@babel/core': 7.28.3 + '@babel/helper-define-polyfill-provider': 0.6.5(@babel/core@7.28.3) + transitivePeerDependencies: + - supports-color + optional: true + balanced-match@1.0.2: {} base64-js@1.5.1: {} @@ -8095,6 +9122,10 @@ snapshots: dependencies: fill-range: 7.1.1 + browser-level@3.0.0: + dependencies: + abstract-level: 3.1.0 + browser-tabs-lock@1.3.0: dependencies: lodash: 4.17.21 @@ -8120,6 +9151,11 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 + buffer@6.0.3: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -8196,6 +9232,13 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + classic-level@3.0.0: + dependencies: + abstract-level: 3.1.0 + module-error: 1.0.2 + napi-macros: 2.2.2 + node-gyp-build: 4.8.4 + cli-color@2.0.4: dependencies: d: 1.0.2 @@ -8259,6 +9302,11 @@ snapshots: dependencies: toggle-selection: 1.0.6 + core-js-compat@3.45.1: + dependencies: + browserslist: 4.25.4 + optional: true + core-js@3.41.0: {} cosmiconfig@7.1.0: @@ -8356,6 +9404,8 @@ snapshots: detect-libc@2.0.4: {} + dexie@4.2.0: {} + didyoumean@1.2.2: {} diff-sequences@29.6.3: {} @@ -8969,6 +10019,8 @@ snapshots: hasown: 2.0.2 is-callable: 1.2.7 + functional-red-black-tree@1.0.1: {} + functions-have-names@1.2.3: {} gel@2.1.1: @@ -9164,6 +10216,8 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 + is-buffer@2.0.5: {} + is-callable@1.2.7: {} is-core-module@2.16.1: @@ -9320,7 +10374,7 @@ snapshots: dependencies: argparse: 2.0.1 - jscodeshift@17.3.0: + jscodeshift@17.3.0(@babel/preset-env@7.28.3(@babel/core@7.28.3)): dependencies: '@babel/core': 7.28.3 '@babel/parser': 7.28.3 @@ -9340,9 +10394,14 @@ snapshots: recast: 0.23.11 tmp: 0.2.5 write-file-atomic: 5.0.1 + optionalDependencies: + '@babel/preset-env': 7.28.3(@babel/core@7.28.3) transitivePeerDependencies: - supports-color + jsesc@3.0.2: + optional: true + jsesc@3.1.0: {} json-buffer@3.0.1: {} @@ -9382,6 +10441,19 @@ snapshots: kysely@0.28.5: {} + level-supports@6.2.0: {} + + level-transcoder@1.0.1: + dependencies: + buffer: 6.0.3 + module-error: 1.0.2 + + level@10.0.0: + dependencies: + abstract-level: 3.1.0 + browser-level: 3.0.0 + classic-level: 3.0.0 + levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -9436,6 +10508,9 @@ snapshots: dependencies: p-locate: 6.0.0 + lodash.debounce@4.0.8: + optional: true + lodash.merge@4.6.2: {} lodash@4.17.21: {} @@ -9482,6 +10557,8 @@ snapshots: math-intrinsics@1.1.0: {} + maybe-combine-errors@1.0.0: {} + memoizee@0.4.17: dependencies: d: 1.0.2 @@ -9493,6 +10570,12 @@ snapshots: next-tick: 1.1.0 timers-ext: 0.1.8 + memory-level@3.1.0: + dependencies: + abstract-level: 3.1.0 + functional-red-black-tree: 1.0.1 + module-error: 1.0.2 + meow@9.0.0: dependencies: '@types/minimist': 1.2.5 @@ -9577,6 +10660,8 @@ snapshots: minipass@7.1.2: {} + module-error@1.0.2: {} + monaco-editor@0.52.2: {} mri@1.2.0: {} @@ -9595,6 +10680,8 @@ snapshots: nanoid@3.3.11: {} + napi-macros@2.2.2: {} + natural-compare@1.4.0: {} neo-async@2.6.2: {} @@ -9609,6 +10696,8 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-gyp-build@4.8.4: {} + node-releases@2.0.19: {} node-releases@2.0.20: {} @@ -10006,6 +11095,14 @@ snapshots: get-proto: 1.0.1 which-builtin-type: 1.2.1 + regenerate-unicode-properties@10.2.2: + dependencies: + regenerate: 1.4.2 + optional: true + + regenerate@1.4.2: + optional: true + regenerator-runtime@0.14.1: {} regexp.prototype.flags@1.5.4: @@ -10017,6 +11114,24 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + regexpu-core@6.3.1: + dependencies: + regenerate: 1.4.2 + regenerate-unicode-properties: 10.2.2 + regjsgen: 0.8.0 + regjsparser: 0.12.0 + unicode-match-property-ecmascript: 2.0.0 + unicode-match-property-value-ecmascript: 2.2.1 + optional: true + + regjsgen@0.8.0: + optional: true + + regjsparser@0.12.0: + dependencies: + jsesc: 3.0.2 + optional: true + require-directory@2.1.1: {} resolve-from@4.0.0: {} @@ -10046,32 +11161,6 @@ snapshots: optionalDependencies: rollup: 4.50.1 - rollup@4.49.0: - dependencies: - '@types/estree': 1.0.8 - optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.49.0 - '@rollup/rollup-android-arm64': 4.49.0 - '@rollup/rollup-darwin-arm64': 4.49.0 - '@rollup/rollup-darwin-x64': 4.49.0 - '@rollup/rollup-freebsd-arm64': 4.49.0 - '@rollup/rollup-freebsd-x64': 4.49.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.49.0 - '@rollup/rollup-linux-arm-musleabihf': 4.49.0 - '@rollup/rollup-linux-arm64-gnu': 4.49.0 - '@rollup/rollup-linux-arm64-musl': 4.49.0 - '@rollup/rollup-linux-loongarch64-gnu': 4.49.0 - '@rollup/rollup-linux-ppc64-gnu': 4.49.0 - '@rollup/rollup-linux-riscv64-gnu': 4.49.0 - '@rollup/rollup-linux-riscv64-musl': 4.49.0 - '@rollup/rollup-linux-s390x-gnu': 4.49.0 - '@rollup/rollup-linux-x64-gnu': 4.49.0 - '@rollup/rollup-linux-x64-musl': 4.49.0 - '@rollup/rollup-win32-arm64-msvc': 4.49.0 - '@rollup/rollup-win32-ia32-msvc': 4.49.0 - '@rollup/rollup-win32-x64-msvc': 4.49.0 - fsevents: 2.3.3 - rollup@4.50.1: dependencies: '@types/estree': 1.0.8 @@ -10611,6 +11700,21 @@ snapshots: pathe: 2.0.3 ufo: 1.6.1 + unicode-canonical-property-names-ecmascript@2.0.1: + optional: true + + unicode-match-property-ecmascript@2.0.0: + dependencies: + unicode-canonical-property-names-ecmascript: 2.0.1 + unicode-property-aliases-ecmascript: 2.2.0 + optional: true + + unicode-match-property-value-ecmascript@2.2.1: + optional: true + + unicode-property-aliases-ecmascript@2.2.0: + optional: true + unicorn-magic@0.1.0: {} universalify@2.0.1: {} @@ -10688,21 +11792,6 @@ snapshots: - tsx - yaml - vite@7.1.3(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1): - dependencies: - esbuild: 0.25.9 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - postcss: 8.5.6 - rollup: 4.49.0 - tinyglobby: 0.2.14 - optionalDependencies: - '@types/node': 24.3.1 - fsevents: 2.3.3 - jiti: 1.21.7 - tsx: 4.20.5 - yaml: 2.8.1 - vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1): dependencies: esbuild: 0.25.9 @@ -10718,11 +11807,11 @@ snapshots: tsx: 4.20.5 yaml: 2.8.1 - vitest@3.2.4(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@7.1.3(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1)) + '@vitest/mocker': 3.2.4(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -10737,15 +11826,16 @@ snapshots: std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.14 + tinyglobby: 0.2.15 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 7.1.3(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) + vite: 7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) vite-node: 3.2.4(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) why-is-node-running: 2.3.0 optionalDependencies: + '@types/debug': 4.1.12 '@types/node': 24.3.1 - '@vitest/browser': 3.2.4(playwright@1.55.0)(vite@7.1.3(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) + '@vitest/browser': 3.2.4(playwright@1.55.0)(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) transitivePeerDependencies: - jiti - less diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index c43359386..b14cdb34f 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -10,6 +10,13 @@ packages: - "use-fireproof" - "dashboard" - "vendor" + - "vendor/level/iota-array" + - "vendor/level/functional-red-black-tree" + - "vendor/level/supports" + - "vendor/level/transcoder" + - "vendor/level/maybe-combine-errors" + - "vendor/level/module-error" + - "vendor/level/abstract-level" #catalog: # adviserCement: ^0.4.20 # diff --git a/tsconfig.json b/tsconfig.json index f84b40c31..7c44c7648 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,6 +18,6 @@ "skipLibCheck": true, "types": ["node", "deno"] }, - "include": ["core/**/*", "cloud/**/*", "tests/**/*", "cli/**/*", "dashboard/**/*"], + "include": ["core/**/*", "cloud/**/*", "tests/**/*", "cli/**/*", "dashboard/**/*", "vendor/level/**/*"], "exclude": ["**/dist/**"] } diff --git a/vitest.config.ts b/vitest.config.ts index 4d2933683..11bc656ea 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -13,6 +13,13 @@ export default defineConfig({ "cloud/backend/base/vitest.config.ts", "cli/vitest.config.ts", "dashboard/vitest.config.ts", + + "vendor/level/iota-array/vitest.config.ts", + "vendor/level/functional-red-black-tree/vitest.config.ts", + "vendor/level/supports/vitest.config.ts", + "vendor/level/transcoder/vitest.config.ts", + "vendor/level/maybe-combine-errors/vitest.config.ts", + "vendor/level/module-error/vitest.config.ts" ], }, }); From b71f8190d3be6e7b6aed8263afa328bb2ab12870 Mon Sep 17 00:00:00 2001 From: Meno Abels Date: Fri, 12 Sep 2025 20:56:11 +0200 Subject: [PATCH 02/26] chore: improve the instance(object-graph) generate to prevent that multiple attaches are running in parallel --- cli/package.json | 2 +- cloud/3rd-party/package.json | 2 +- cloud/backend/base/package.json | 2 +- cloud/backend/cf-d1/package.json | 2 +- cloud/backend/node/package.json | 2 +- cloud/base/package.json | 2 +- cloud/todo-app/package.json | 2 +- core/base/package.json | 2 +- core/blockstore/package.json | 2 +- core/core/package.json | 2 +- core/device-id/package.json | 2 +- core/gateways/base/package.json | 2 +- core/gateways/cloud/package.json | 2 +- core/gateways/cloud/to-cloud.ts | 143 ++++++++++++------ core/gateways/file-deno/package.json | 2 +- core/gateways/file-node/package.json | 2 +- core/gateways/file/package.json | 2 +- core/gateways/indexeddb/package.json | 2 +- core/gateways/memory/package.json | 2 +- core/keybag/key-bag.ts | 4 + core/keybag/package.json | 2 +- core/protocols/cloud/package.json | 2 +- core/protocols/dashboard/package.json | 2 +- core/runtime/package.json | 2 +- core/runtime/sts-service/index.ts | 2 +- core/runtime/utils.ts | 6 +- core/tests/package.json | 3 +- core/tests/protocols/cloud/to-cloud.test.ts | 34 +++++ core/types/base/key-bag-if.ts | 2 + core/types/base/package.json | 2 +- core/types/base/types.ts | 2 + core/types/blockstore/package.json | 2 +- core/types/protocols/cloud/gateway-control.ts | 23 ++- core/types/protocols/cloud/package.json | 2 +- core/types/runtime/package.json | 2 +- dashboard/package.json | 2 +- pnpm-lock.yaml | 132 ++++++++-------- use-fireproof/iframe-strategy.ts | 4 + use-fireproof/index.ts | 14 +- use-fireproof/package.json | 5 +- use-fireproof/react/use-attach.ts | 56 ++++--- use-fireproof/react/use-fireproof.ts | 1 + use-fireproof/redirect-strategy.ts | 9 +- use-fireproof/tests/use-fireproof.test.tsx | 70 +++++++++ vendor/package.json | 2 +- 45 files changed, 401 insertions(+), 165 deletions(-) create mode 100644 core/tests/protocols/cloud/to-cloud.test.ts diff --git a/cli/package.json b/cli/package.json index bc624872a..56f5a8ea5 100644 --- a/cli/package.json +++ b/cli/package.json @@ -39,7 +39,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", diff --git a/cloud/3rd-party/package.json b/cloud/3rd-party/package.json index e6d0e9598..64995241d 100644 --- a/cloud/3rd-party/package.json +++ b/cloud/3rd-party/package.json @@ -39,7 +39,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "react-dom": "^19.1.1", "use-fireproof": "workspace:0.0.0" }, diff --git a/cloud/backend/base/package.json b/cloud/backend/base/package.json index 2e71a321e..e51746410 100644 --- a/cloud/backend/base/package.json +++ b/cloud/backend/base/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@cloudflare/workers-types": "^4.20250906.0", "@fireproof/cloud-base": "workspace:0.0.0", "@fireproof/core-base": "workspace:0.0.0", diff --git a/cloud/backend/cf-d1/package.json b/cloud/backend/cf-d1/package.json index 266076033..b395e0269 100644 --- a/cloud/backend/cf-d1/package.json +++ b/cloud/backend/cf-d1/package.json @@ -39,7 +39,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@cloudflare/workers-types": "^4.20250906.0", "@fireproof/cloud-backend-base": "workspace:0.0.0", "@fireproof/cloud-base": "workspace:0.0.0", diff --git a/cloud/backend/node/package.json b/cloud/backend/node/package.json index cc62cf748..de31f747e 100644 --- a/cloud/backend/node/package.json +++ b/cloud/backend/node/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/cloud-backend-base": "workspace:0.0.0", "@fireproof/cloud-base": "workspace:0.0.0", "@fireproof/core-base": "workspace:0.0.0", diff --git a/cloud/base/package.json b/cloud/base/package.json index b4fdc83d7..37cace4c9 100644 --- a/cloud/base/package.json +++ b/cloud/base/package.json @@ -38,7 +38,7 @@ "react": ">=18.0.0" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-blockstore": "workspace:0.0.0", "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", diff --git a/cloud/todo-app/package.json b/cloud/todo-app/package.json index 018e62748..af87788c7 100644 --- a/cloud/todo-app/package.json +++ b/cloud/todo-app/package.json @@ -41,7 +41,7 @@ "react": ">=18.0.0" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/vendor": "workspace:0.0.0", "@types/react": "^19.1.11", "react-dom": "^19.1.0", diff --git a/core/base/package.json b/core/base/package.json index 419e53fb5..bfb3b5696 100644 --- a/core/base/package.json +++ b/core/base/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-blockstore": "workspace:0.0.0", "@fireproof/core-keybag": "workspace:0.0.0", "@fireproof/core-runtime": "workspace:0.0.0", diff --git a/core/blockstore/package.json b/core/blockstore/package.json index 7a373666e..a5e6e3f3a 100644 --- a/core/blockstore/package.json +++ b/core/blockstore/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-gateways-base": "workspace:0.0.0", "@fireproof/core-gateways-cloud": "workspace:0.0.0", "@fireproof/core-gateways-file": "workspace:0.0.0", diff --git a/core/core/package.json b/core/core/package.json index 6e9713fe0..28d569ba0 100644 --- a/core/core/package.json +++ b/core/core/package.json @@ -39,7 +39,7 @@ "react": ">=18.0.0" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-base": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", diff --git a/core/device-id/package.json b/core/device-id/package.json index a40487180..aded1a877 100644 --- a/core/device-id/package.json +++ b/core/device-id/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.23", + "@adviser/cement": "^0.4.35", "@fireproof/core-keybag": "workspace:0.0.0", "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", diff --git a/core/gateways/base/package.json b/core/gateways/base/package.json index 80a38866d..941efe183 100644 --- a/core/gateways/base/package.json +++ b/core/gateways/base/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/core-types-blockstore": "workspace:0.0.0", diff --git a/core/gateways/cloud/package.json b/core/gateways/cloud/package.json index 7a596203b..fe45a3acc 100644 --- a/core/gateways/cloud/package.json +++ b/core/gateways/cloud/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-gateways-base": "workspace:0.0.0", "@fireproof/core-protocols-cloud": "workspace:0.0.0", "@fireproof/core-runtime": "workspace:0.0.0", diff --git a/core/gateways/cloud/to-cloud.ts b/core/gateways/cloud/to-cloud.ts index d899fabec..60adb3db2 100644 --- a/core/gateways/cloud/to-cloud.ts +++ b/core/gateways/cloud/to-cloud.ts @@ -1,8 +1,10 @@ -import { BuildURI, CoerceURI, Logger, ResolveOnce, URI, AppContext } from "@adviser/cement"; +import { BuildURI, CoerceURI, Logger, ResolveOnce, URI, AppContext, KeyedResolvOnce, Lazy } from "@adviser/cement"; import { Ledger } from "@fireproof/core-types-base"; import { FPCloudClaim, + FPCloudClaimParseSchema, FPCloudUri, + hashableFPCloudRef, ToCloudAttachable, ToCloudBase, ToCloudName, @@ -12,9 +14,10 @@ import { TokenAndClaims, TokenStrategie, } from "@fireproof/core-types-protocols-cloud"; -import { ensureLogger, hashObjectSync } from "@fireproof/core-runtime"; +import { ensureLogger, ensureSuperThis, hashObjectSync } from "@fireproof/core-runtime"; import { decodeJwt } from "jose/jwt/decode"; import { URIInterceptor } from "@fireproof/core-gateways-base"; +import { stripper } from "@adviser/cement/utils"; function addTenantAndLedger(opts: ToCloudOptionalOpts, uri: CoerceURI): URI { const buri = BuildURI.from(uri); @@ -27,6 +30,58 @@ function addTenantAndLedger(opts: ToCloudOptionalOpts, uri: CoerceURI): URI { return buri.URI(); } +export class SimpleTokenStrategy implements TokenStrategie { + private tc: TokenAndClaims; + constructor(jwk: string) { + let claims: FPCloudClaim; + try { + const rawClaims = decodeJwt(jwk); + const rParse = FPCloudClaimParseSchema.safeParse(rawClaims); + if (rParse.success) { + claims = rParse.data; + } else { + throw rParse.error; + } + } catch (e) { + claims = { + userId: "test", + email: "test@test.de", + created: new Date(), + tenants: [{ id: "test", role: "admin" }], + ledgers: [{ id: "test", role: "admin", right: "write" }], + selected: { tenant: "test", ledger: "test" }, + }; + } + + this.tc = { + token: jwk, + claims, + }; + } + + readonly hash = Lazy(() => hashObjectSync(this.tc.token)); + + stop(): void { + // console.log("SimpleTokenStrategy stop"); + return; + } + + open(): void { + // console.log("SimpleTokenStrategy open"); + return; + } + async tryToken(): Promise { + // console.log("SimpleTokenStrategy gatherToken"); + return this.tc; + } + async waitForToken(): Promise { + // console.log("SimpleTokenStrategy waitForToken"); + return this.tc; + } +} + +export const defaultSimpleTokenStrategy = new SimpleTokenStrategy(""); + function defaultOpts(opts: ToCloudOptionalOpts): ToCloudOpts { const base = opts.urls?.base ?? "fpcloud://fireproof-v2-cloud-dev.jchris.workers.dev"; const param = { @@ -34,20 +89,23 @@ function defaultOpts(opts: ToCloudOptionalOpts): ToCloudOpts { file: addTenantAndLedger(opts, opts.urls?.file ?? base), meta: addTenantAndLedger(opts, opts.urls?.meta ?? base), } satisfies FPCloudUri; + const sthis = opts.sthis ?? ensureSuperThis(); const defOpts = { name: ToCloudName, intervalSec: 1, tokenWaitTimeSec: 90, // 90 seconds refreshTokenPresetSec: 2 * 60, // 2 minutes ...opts, + sthis: sthis, events: opts.events ?? { + hash: () => "1", changed: async () => { /* no-op */ }, }, - context: opts.context ?? new AppContext(), + context: opts.context ?? sthis.ctx, urls: param, - strategy: opts.strategy ?? new SimpleTokenStrategy(""), + strategy: opts.strategy ?? defaultSimpleTokenStrategy, } satisfies ToCloudOpts; return defOpts; } @@ -104,7 +162,7 @@ class TokenObserver { isExpired(token?: TokenAndClaims): boolean { const now = ~~(new Date().getTime() / 1000); // current time in seconds - return !token || definedExp(token.claims.exp) - this.opts.refreshTokenPresetSec < now; + return !token || definedExp(token.claims?.exp) - this.opts.refreshTokenPresetSec < now; } readonly _token = new ResolveOnce(); @@ -115,7 +173,7 @@ class TokenObserver { await this.opts.events?.changed(undefined); logger .Debug() - .Any({ claims: this.currentTokenAndClaim?.claims, exp: definedExp(this.currentTokenAndClaim?.claims.exp) }) + .Any({ claims: this.currentTokenAndClaim?.claims, exp: definedExp(this.currentTokenAndClaim?.claims?.exp) }) .Msg("refresh token"); activeTokenAndClaim = await this.refreshToken(logger, ledger); } @@ -155,7 +213,7 @@ class ToCloud implements ToCloudAttachable { configHash(db?: Ledger) { const hash = hashObjectSync({ dbRefId: db?.refId(), - ...this.opts, + opts: hashForToCloudBase(this.opts), }); // console.log("to-cloud-configHash", this.opts, hash); // console.log("to-cloud-configHash", hash, this.opts); @@ -192,6 +250,9 @@ class ToCloud implements ToCloudAttachable { // console.log("getToken", token) const buri = BuildURI.from(uri).setParam("authJWK", token.token); + if (!token.claims) { + throw new Error("No claims"); + } const selected = token.claims.selected ?? {}; if (selected.tenant) { buri.setParam("tenant", selected.tenant); @@ -223,45 +284,37 @@ class ToCloud implements ToCloudAttachable { // resetToken(): void; // } +// function hashForFPCo + +export function hashForToCloudBase(opts: ToCloudOptionalOpts): string { + const hashable = { + opts: stripper(["context", "events", "strategy", "sthis"], opts), + ...(opts.urls ? { urls: hashableFPCloudRef(opts.urls) } : {}), + // ...(opts.context ? { context: opts.context.asObj() } : {}), + ...(opts.strategy ? { strategy: opts.strategy.hash() } : {}), + ...(opts.events ? { events: opts.events.hash() } : {}), + }; + return hashObjectSync(hashable); +} + +const toClouds = new KeyedResolvOnce(); +// if nothing set we need one global text per runtime +// this could break if we are e.g. logging in multiple users in +// the same runtime +const defaultAppContext = new AppContext(); export function toCloud(iopts: Partial & ToCloudRequiredOpts): ToCloudAttachable { - // console.log("toCloud", iopts); - return new ToCloud({ - ...iopts, - urls: iopts.urls ?? {}, - events: iopts.events ?? { - changed: async () => { - /* no-op */ + return toClouds.get(hashForToCloudBase(iopts)).once(() => { + return new ToCloud({ + ...iopts, + urls: iopts.urls ?? {}, + events: iopts.events ?? { + hash: () => "1", + changed: async () => { + /* no-op */ + }, }, - }, - context: iopts.context ?? new AppContext(), - strategy: iopts.strategy, + context: iopts.context ?? defaultAppContext, + strategy: iopts.strategy, + }); }); } - -export class SimpleTokenStrategy implements TokenStrategie { - private tc: TokenAndClaims; - constructor(jwk: string) { - this.tc = { - token: jwk, - claims: decodeJwt(jwk) as FPCloudClaim, - }; - } - - stop(): void { - // console.log("SimpleTokenStrategy stop"); - return; - } - - open(): void { - // console.log("SimpleTokenStrategy open"); - return; - } - async tryToken(): Promise { - // console.log("SimpleTokenStrategy gatherToken"); - return this.tc; - } - async waitForToken(): Promise { - // console.log("SimpleTokenStrategy waitForToken"); - return this.tc; - } -} diff --git a/core/gateways/file-deno/package.json b/core/gateways/file-deno/package.json index 360d28577..2bcd90711 100644 --- a/core/gateways/file-deno/package.json +++ b/core/gateways/file-deno/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", "@types/deno": "^2.3.0", diff --git a/core/gateways/file-node/package.json b/core/gateways/file-node/package.json index a11c15cc2..bf188fd97 100644 --- a/core/gateways/file-node/package.json +++ b/core/gateways/file-node/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0" } diff --git a/core/gateways/file/package.json b/core/gateways/file/package.json index a6438baa1..0eb13fbc6 100644 --- a/core/gateways/file/package.json +++ b/core/gateways/file/package.json @@ -41,7 +41,7 @@ "@types/node": "^24.3.1" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-gateways-base": "workspace:0.0.0", "@fireproof/core-gateways-file-deno": "workspace:0.0.0", "@fireproof/core-gateways-file-node": "workspace:0.0.0", diff --git a/core/gateways/indexeddb/package.json b/core/gateways/indexeddb/package.json index bfd43d0fe..bb552a080 100644 --- a/core/gateways/indexeddb/package.json +++ b/core/gateways/indexeddb/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-gateways-base": "workspace:0.0.0", "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", diff --git a/core/gateways/memory/package.json b/core/gateways/memory/package.json index daf37aad4..97b722072 100644 --- a/core/gateways/memory/package.json +++ b/core/gateways/memory/package.json @@ -41,7 +41,7 @@ "@types/node": "^24.3.1" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-gateways-base": "workspace:0.0.0", "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", diff --git a/core/keybag/key-bag.ts b/core/keybag/key-bag.ts index 0168760fc..94929125c 100644 --- a/core/keybag/key-bag.ts +++ b/core/keybag/key-bag.ts @@ -57,6 +57,10 @@ export class KeyBag implements KeyBagIf { this.#namedKeyItems = namedKeyItems; } + hash(): string { + return this.rt.id(); + } + readonly _warnOnce: ResolveOnce = new ResolveOnce(); async subtleKey(materialStrOrUint8: string | Uint8Array): Promise { const extractable = this.rt.url.getParam(PARAM.EXTRACTKEY) === "_deprecated_internal_api"; diff --git a/core/keybag/package.json b/core/keybag/package.json index 49f794894..1cc5c8864 100644 --- a/core/keybag/package.json +++ b/core/keybag/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-gateways-file": "workspace:0.0.0", "@fireproof/core-gateways-indexeddb": "workspace:0.0.0", "@fireproof/core-runtime": "workspace:0.0.0", diff --git a/core/protocols/cloud/package.json b/core/protocols/cloud/package.json index a6bd97f82..7a0b7c07b 100644 --- a/core/protocols/cloud/package.json +++ b/core/protocols/cloud/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/core-types-protocols-cloud": "workspace:0.0.0", diff --git a/core/protocols/dashboard/package.json b/core/protocols/dashboard/package.json index 25dc6b803..5a438bfd7 100644 --- a/core/protocols/dashboard/package.json +++ b/core/protocols/dashboard/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/core-types-protocols-cloud": "workspace:0.0.0", diff --git a/core/runtime/package.json b/core/runtime/package.json index 23c25f50a..cf6fcefa5 100644 --- a/core/runtime/package.json +++ b/core/runtime/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@adviser/ts-xxhash": "^1.0.2", "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/core-types-blockstore": "workspace:0.0.0", diff --git a/core/runtime/sts-service/index.ts b/core/runtime/sts-service/index.ts index 0e445d542..805bb8368 100644 --- a/core/runtime/sts-service/index.ts +++ b/core/runtime/sts-service/index.ts @@ -116,7 +116,7 @@ export class SessionTokenService { userId: p.userId, tenants: p.tenants, ledgers: p.ledgers, - email: "test@test", + email: "test@test.de", created: new Date(), selected: { tenant: p.tenants[0].id, diff --git a/core/runtime/utils.ts b/core/runtime/utils.ts index db7f6d1fb..8a0697fc3 100644 --- a/core/runtime/utils.ts +++ b/core/runtime/utils.ts @@ -69,7 +69,7 @@ class SuperThisImpl implements SuperThis { this.crypto = opts.crypto; this.pathOps = opts.pathOps; this.txt = opts.txt; - this.ctx = AppContext.merge(opts.ctx); + this.ctx = opts.ctx; // console.log("superThis", this); } @@ -153,6 +153,7 @@ class pathOpsImpl implements PathOps { } const pathOps = new pathOpsImpl(); const txtOps = ((txtEncoder, txtDecoder) => ({ + id: () => "fp-txtOps", encode: (input: string) => txtEncoder.encode(input), decode: (input: ToUInt8) => txtDecoder.decode(coerceIntoUint8(input).Ok()), base64: { @@ -189,11 +190,14 @@ export function onSuperThis(fn: (sthis: SuperThis) => void): () => void { }; } +// const superThises = new KeyedResolvOnce(); + export function ensureSuperThis(osthis?: Partial): SuperThis { const env = envFactory({ symbol: osthis?.env?.symbol || "FP_ENV", presetEnv: presetEnv(osthis?.env?.presetEnv), }); + const ret = new SuperThisImpl({ logger: osthis?.logger || globalLogger(), env, diff --git a/core/tests/package.json b/core/tests/package.json index 83357f4a9..20ac36188 100644 --- a/core/tests/package.json +++ b/core/tests/package.json @@ -40,12 +40,13 @@ "react": ">=18.0.0" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core": "workspace:0.0.0", "@fireproof/core-base": "workspace:0.0.0", "@fireproof/core-blockstore": "workspace:0.0.0", "@fireproof/core-device-id": "workspace:0.0.0", "@fireproof/core-gateways-base": "workspace:0.0.0", + "@fireproof/core-gateways-cloud": "workspace:0.0.0", "@fireproof/core-gateways-file": "workspace:0.0.0", "@fireproof/core-gateways-indexeddb": "workspace:0.0.0", "@fireproof/core-gateways-memory": "workspace:0.0.0", diff --git a/core/tests/protocols/cloud/to-cloud.test.ts b/core/tests/protocols/cloud/to-cloud.test.ts new file mode 100644 index 000000000..884cf1582 --- /dev/null +++ b/core/tests/protocols/cloud/to-cloud.test.ts @@ -0,0 +1,34 @@ +import { SimpleTokenStrategy } from "@fireproof/core-gateways-cloud"; +import { toCloud } from "use-fireproof"; +import { describe, it, expect } from "vitest"; + +describe("toCloud", () => { + it("should be the same instance", () => { + const ref = toCloud({ + urls: { base: "memory://test" }, + strategy: new SimpleTokenStrategy(""), + }); + for (let i = 0; i < 10; i++) { + const tc = toCloud({ + urls: { base: "memory://test" }, + strategy: new SimpleTokenStrategy(""), + }); + expect(tc).toBeDefined(); + + expect(tc).toBe(ref); + } + }); + + it("should be other instance", () => { + const ref = toCloud({ + urls: { base: "memory://test0" }, + strategy: new SimpleTokenStrategy(""), + }); + const tc = toCloud({ + urls: { base: "memory://test" }, + strategy: new SimpleTokenStrategy(""), + }); + expect(tc).toBeDefined(); + expect(tc).not.toBe(ref); + }); +}); diff --git a/core/types/base/key-bag-if.ts b/core/types/base/key-bag-if.ts index 6b4b776b5..2936db503 100644 --- a/core/types/base/key-bag-if.ts +++ b/core/types/base/key-bag-if.ts @@ -21,6 +21,8 @@ export interface KeyBagIf { readonly logger: Logger; readonly rt: KeyBagRuntime; + hash(): string; + subtleKey(materialStrOrUint8: string | Uint8Array): Promise; ensureKeyFromUrl(url: URI, keyFactory: () => string): Promise>; diff --git a/core/types/base/package.json b/core/types/base/package.json index 98b8941e6..69f343dc8 100644 --- a/core/types/base/package.json +++ b/core/types/base/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-types-blockstore": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", "@web3-storage/pail": "^0.6.2", diff --git a/core/types/base/types.ts b/core/types/base/types.ts index f5d066736..9c8afe9ea 100644 --- a/core/types/base/types.ts +++ b/core/types/base/types.ts @@ -127,6 +127,7 @@ export interface Base64EndeCoder { decode(input: string): string; } export interface TextEndeCoder { + id(): string; encode(input: string): Uint8Array; decode(input: ToUInt8): string; readonly base64: Base64EndeCoder; @@ -153,6 +154,7 @@ export interface SuperThis { readonly pathOps: PathOps; readonly ctx: AppContext; readonly txt: TextEndeCoder; + // hash(): string; timeOrderedNextId(time?: number): { str: string; toString: () => string }; nextId(bytes?: number): { str: string; bin: Uint8Array; toString: () => string }; start(): Promise; diff --git a/core/types/blockstore/package.json b/core/types/blockstore/package.json index 3421e35c0..21f9c9075 100644 --- a/core/types/blockstore/package.json +++ b/core/types/blockstore/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/core-types-runtime": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", diff --git a/core/types/protocols/cloud/gateway-control.ts b/core/types/protocols/cloud/gateway-control.ts index dca9524fa..bc72880a7 100644 --- a/core/types/protocols/cloud/gateway-control.ts +++ b/core/types/protocols/cloud/gateway-control.ts @@ -9,7 +9,7 @@ export interface ToCloudAttachable extends Attachable { export interface TokenAndClaims { readonly token: string; - readonly claims: FPCloudClaim; + readonly claims?: FPCloudClaim; // readonly exp: number; // readonly tenant?: string; // readonly ledger?: string; @@ -17,6 +17,7 @@ export interface TokenAndClaims { } export interface TokenStrategie { + hash(): string; open(sthis: SuperThis, logger: Logger, deviceId: string, opts: ToCloudOpts): void; tryToken(sthis: SuperThis, logger: Logger, opts: ToCloudOpts): Promise; waitForToken(sthis: SuperThis, logger: Logger, deviceId: string, opts: ToCloudOpts): Promise; @@ -32,7 +33,26 @@ export interface FPCloudRef { readonly meta: CoerceURI; } +export function hashableFPCloudRef(ref?: Partial): { base?: string; car?: string; file?: string; meta?: string } { + // this is not completed --- it's missed the base -> expension to car, file, meta + // there might be a possibily that to arrays result into the same hash + // like: + // { base: http://a.com } + // { + // car: http://a.com/car + // file: http://a.com/file + // meta: http://a.com/meta + // } this expension happens during later runtime + // i ignore that for now + if (!ref) { + return {}; + } + const keys: (keyof FPCloudRef)[] = ["base", "car", "file", "meta"]; + return Object.fromEntries(keys.filter((k) => ref[k]).map((k) => [k, URI.from(ref[k]).toString()])); +} + export interface TokenAndClaimsEvents { + hash(): string; changed(token?: TokenAndClaims): Promise; } @@ -45,6 +65,7 @@ export interface ToCloudRequiredOpts { } export interface ToCloudBase { + readonly sthis: SuperThis; readonly name: string; // default "toCloud" readonly intervalSec: number; // default 1 second readonly tokenWaitTimeSec: number; // default 90 seconds diff --git a/core/types/protocols/cloud/package.json b/core/types/protocols/cloud/package.json index 50a706e10..0a8a2212f 100644 --- a/core/types/protocols/cloud/package.json +++ b/core/types/protocols/cloud/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/core-types-blockstore": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", diff --git a/core/types/runtime/package.json b/core/types/runtime/package.json index 7e242a44a..0615fe1c5 100644 --- a/core/types/runtime/package.json +++ b/core/types/runtime/package.json @@ -36,7 +36,7 @@ "url": "https://github.com/fireproof-storage/fireproof/issues" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/vendor": "workspace:0.0.0", "multiformats": "^13.4.0" } diff --git a/dashboard/package.json b/dashboard/package.json index 46f588a05..ced1433b3 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -25,7 +25,7 @@ "publish": "echo skip" }, "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@clerk/backend": "^2.12.1", "@clerk/clerk-js": "^5.91.2", "@clerk/clerk-react": "^5.46.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9efa3c4c8..ed1d5e6dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -71,8 +71,8 @@ importers: cli: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-runtime': specifier: workspace:0.0.0 version: link:../core/runtime @@ -126,8 +126,8 @@ importers: cloud/3rd-party: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) react-dom: specifier: ^19.1.1 version: 19.1.1(react@19.1.1) @@ -151,8 +151,8 @@ importers: cloud/backend/base: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@cloudflare/workers-types': specifier: ^4.20250906.0 version: 4.20250906.0 @@ -215,8 +215,8 @@ importers: cloud/backend/cf-d1: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@cloudflare/workers-types': specifier: ^4.20250906.0 version: 4.20250906.0 @@ -276,8 +276,8 @@ importers: cloud/backend/node: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/cloud-backend-base': specifier: workspace:0.0.0 version: link:../base @@ -337,8 +337,8 @@ importers: cloud/base: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-blockstore': specifier: workspace:0.0.0 version: link:../../core/blockstore @@ -377,8 +377,8 @@ importers: cloud/todo-app: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/vendor': specifier: workspace:0.0.0 version: link:../../vendor @@ -408,8 +408,8 @@ importers: core/base: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-blockstore': specifier: workspace:0.0.0 version: link:../blockstore @@ -454,8 +454,8 @@ importers: core/blockstore: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-gateways-base': specifier: workspace:0.0.0 version: link:../gateways/base @@ -517,8 +517,8 @@ importers: core/core: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-base': specifier: workspace:0.0.0 version: link:../base @@ -538,8 +538,8 @@ importers: core/device-id: dependencies: '@adviser/cement': - specifier: ^0.4.23 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-keybag': specifier: workspace:0.0.0 version: link:../keybag @@ -569,8 +569,8 @@ importers: core/gateways/base: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-runtime': specifier: workspace:0.0.0 version: link:../../runtime @@ -593,8 +593,8 @@ importers: core/gateways/cloud: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-gateways-base': specifier: workspace:0.0.0 version: link:../base @@ -623,8 +623,8 @@ importers: core/gateways/file: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-gateways-base': specifier: workspace:0.0.0 version: link:../base @@ -666,8 +666,8 @@ importers: core/gateways/file-deno: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-types-base': specifier: workspace:0.0.0 version: link:../../types/base @@ -684,8 +684,8 @@ importers: core/gateways/file-node: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-types-base': specifier: workspace:0.0.0 version: link:../../types/base @@ -696,8 +696,8 @@ importers: core/gateways/indexeddb: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-gateways-base': specifier: workspace:0.0.0 version: link:../base @@ -729,8 +729,8 @@ importers: core/gateways/memory: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-gateways-base': specifier: workspace:0.0.0 version: link:../base @@ -769,8 +769,8 @@ importers: core/keybag: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-gateways-file': specifier: workspace:0.0.0 version: link:../gateways/file @@ -799,8 +799,8 @@ importers: core/protocols/cloud: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-runtime': specifier: workspace:0.0.0 version: link:../../runtime @@ -823,8 +823,8 @@ importers: core/protocols/dashboard: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-runtime': specifier: workspace:0.0.0 version: link:../../runtime @@ -862,8 +862,8 @@ importers: core/runtime: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@adviser/ts-xxhash': specifier: ^1.0.2 version: 1.0.2 @@ -899,8 +899,8 @@ importers: core/tests: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core': specifier: workspace:0.0.0 version: link:../core @@ -916,6 +916,9 @@ importers: '@fireproof/core-gateways-base': specifier: workspace:0.0.0 version: link:../gateways/base + '@fireproof/core-gateways-cloud': + specifier: workspace:0.0.0 + version: link:../gateways/cloud '@fireproof/core-gateways-file': specifier: workspace:0.0.0 version: link:../gateways/file @@ -1008,8 +1011,8 @@ importers: core/types/base: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-types-blockstore': specifier: workspace:0.0.0 version: link:../blockstore @@ -1035,8 +1038,8 @@ importers: core/types/blockstore: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-types-base': specifier: workspace:0.0.0 version: link:../base @@ -1060,8 +1063,8 @@ importers: core/types/protocols/cloud: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-types-base': specifier: workspace:0.0.0 version: link:../../base @@ -1097,8 +1100,8 @@ importers: core/types/runtime: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/vendor': specifier: workspace:0.0.0 version: link:../../../vendor @@ -1109,8 +1112,8 @@ importers: dashboard: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@clerk/backend': specifier: ^2.12.1 version: 2.12.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -1278,8 +1281,8 @@ importers: use-fireproof: dependencies: '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) '@fireproof/core-base': specifier: workspace:0.0.0 version: link:../core/base @@ -1316,6 +1319,9 @@ importers: react: specifier: '>=18.0.0' version: 19.1.1 + ts-essentials: + specifier: ^10.1.1 + version: 10.1.1(typescript@5.9.2) devDependencies: '@fireproof/core-cli': specifier: workspace:0.0.0 @@ -1345,8 +1351,8 @@ importers: vendor: dependencies: '@adviser/cement': - specifier: ^0.4.23 - version: 0.4.32(typescript@5.9.2) + specifier: ^0.4.35 + version: 0.4.35(typescript@5.9.2) yocto-queue: specifier: ^1.2.1 version: 1.2.1 @@ -1513,8 +1519,8 @@ packages: '@adraffy/ens-normalize@1.11.0': resolution: {integrity: sha512-/3DDPKHqqIqxUULp8yP4zODUY1i+2xvVWsv8A79xGWdCAG+8sb0hRh0Rk2QyOJUnnbyPUAZYcpBuRe3nS2OIUg==} - '@adviser/cement@0.4.32': - resolution: {integrity: sha512-BpLYQyKGuvrsJbwwgclUp6qlMeDQF9WrIrs0yNAotbnDfrWFFwDRU+dDZEW6tWxq6msszu/EjpEBeH8cMnaX2A==} + '@adviser/cement@0.4.35': + resolution: {integrity: sha512-dIdgMlV34pcjv8pBy40tdA0MnM+XYOOQwFD7qG1ncmWzu7ftEHDw271oEc53TjfLb5FiLwPD+AaU6e+zBrGcrQ==} engines: {node: '>=20.19.0'} hasBin: true @@ -6609,7 +6615,7 @@ snapshots: '@adraffy/ens-normalize@1.11.0': {} - '@adviser/cement@0.4.32(typescript@5.9.2)': + '@adviser/cement@0.4.35(typescript@5.9.2)': dependencies: ts-essentials: 10.1.1(typescript@5.9.2) yaml: 2.8.1 diff --git a/use-fireproof/iframe-strategy.ts b/use-fireproof/iframe-strategy.ts index 77e022e24..cdf7e4d51 100644 --- a/use-fireproof/iframe-strategy.ts +++ b/use-fireproof/iframe-strategy.ts @@ -5,6 +5,10 @@ import { WebCtx } from "./react/use-attach.js"; import { WebToCloudCtx } from "./react/types.js"; export class IframeStrategy implements TokenStrategie { + hash(): string { + return "IframeStrategy: this is not a advance"; + } + fpIframeOverlay() { const div = document.createElement("div"); div.id = "fpIframeOverlay"; diff --git a/use-fireproof/index.ts b/use-fireproof/index.ts index ecd9cb098..2e493ae8d 100644 --- a/use-fireproof/index.ts +++ b/use-fireproof/index.ts @@ -17,6 +17,7 @@ import { import { WebToCloudCtx } from "./react/types.js"; import { defaultWebToCloudOpts, WebCtx } from "./react/use-attach.js"; import { toCloud as toCloudCore } from "@fireproof/core-gateways-cloud"; +import { ensureSuperThis } from "@fireproof/core-runtime"; export type UseFpToCloudParam = Omit, "context">, "events"> & Partial & { @@ -29,13 +30,20 @@ async function defaultChanged() { throw new Error("not ready"); } +const defaultRedirectStrategy = new RedirectStrategy(); export function toCloud(opts: UseFpToCloudParam = {}): ToCloudAttachable { - const mergedEvents = { ...opts.events, changed: opts.events?.changed ?? defaultChanged }; + const mergedEvents = { + ...opts.events, + hash: opts.events?.hash ?? (() => "1"), + changed: opts.events?.changed ?? defaultChanged, + }; + const sthis = opts.sthis ?? ensureSuperThis(); const myOpts = { ...opts, + sthis, events: mergedEvents, - context: opts.context ?? new AppContext(), - strategy: opts.strategy ?? new RedirectStrategy(), + context: opts.context ?? sthis.ctx /* ensureSuperThis() creates always a new context */, + strategy: opts.strategy ?? defaultRedirectStrategy, urls: opts.urls ?? {}, }; const webCtx = defaultWebToCloudOpts(myOpts); diff --git a/use-fireproof/package.json b/use-fireproof/package.json index 54527d5dd..2339d5577 100644 --- a/use-fireproof/package.json +++ b/use-fireproof/package.json @@ -22,7 +22,7 @@ "license": "AFL-2.0", "gptdoc": "Fireproof/React/Usage: import { useFireproof } from 'use-fireproof'; function WordCounterApp() { const { useLiveQuery, useDocument } = useFireproof('my-word-app'); const { doc: wordInput, merge: updateWordInput, save: saveWordInput, reset: clearWordInput } = useDocument({ word: '', timestamp: Date.now() }); const recentWords = useLiveQuery('timestamp', { descending: true, limit: 10 }); const { doc: { totalSubmitted }, merge: updateTotalSubmitted, save: saveTotalSubmitted } = useDocument({ _id: 'word-counter', totalSubmitted: 0 }); const handleWordSubmission = (e) => { e.preventDefault(); updateTotalSubmitted({ totalSubmitted: totalSubmitted + 1 }); saveTotalSubmitted(); saveWordInput(); clearWordInput();}; return (<>

{totalSubmitted} words submitted

updateWordInput({ word: e.target.value })} placeholder='Enter a word' />
    {recentWords.docs.map(entry => (
  • {entry.word}
  • ))}
) } export default WordCounterApp;", "dependencies": { - "@adviser/cement": "^0.4.32", + "@adviser/cement": "^0.4.35", "@fireproof/core-base": "workspace:0.0.0", "@fireproof/core-gateways-cloud": "workspace:0.0.0", "@fireproof/core-keybag": "workspace:0.0.0", @@ -33,7 +33,8 @@ "@fireproof/core-types-protocols-cloud": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", "dompurify": "^3.2.6", - "jose": "^6.1.0" + "jose": "^6.1.0", + "ts-essentials": "^10.1.1" }, "peerDependencies": { "@adviser/cement": "^0.4.20", diff --git a/use-fireproof/react/use-attach.ts b/use-fireproof/react/use-attach.ts index f166a75fd..88d84e5ef 100644 --- a/use-fireproof/react/use-attach.ts +++ b/use-fireproof/react/use-attach.ts @@ -2,10 +2,10 @@ import { useEffect, useState } from "react"; import { AttachState as AttachHook, UseFPConfig, WebCtxHook, WebToCloudCtx } from "./types.js"; -import { AppContext, BuildURI, exception2Result, KeyedResolvOnce, ResolveOnce } from "@adviser/cement"; +import { AppContext, exception2Result, KeyedResolvOnce, ResolveOnce, URI } from "@adviser/cement"; import { decodeJwt } from "jose/jwt/decode"; import { SuperThis, Database, KeyBagIf } from "@fireproof/core-types-base"; -import { ensureSuperThis } from "@fireproof/core-runtime"; +import { ensureSuperThis, hashObjectSync } from "@fireproof/core-runtime"; import { FPCloudClaim, ToCloudAttachable, @@ -14,6 +14,8 @@ import { TokenStrategie, } from "@fireproof/core-types-protocols-cloud"; import { getKeyBag } from "@fireproof/core-keybag"; +import { Writable } from "ts-essentials"; +import { hashForToCloudBase } from "@fireproof/core-gateways-cloud"; export const WebCtx = "webCtx"; @@ -22,41 +24,49 @@ export type ToCloudParam = Omit & class WebCtxImpl implements WebToCloudCtx { readonly onActions = new Set<(token?: TokenAndClaims) => void>(); - readonly dashboardURI: string; - readonly tokenApiURI: string; + readonly dashboardURI!: string; + readonly tokenApiURI!: string; // readonly uiURI: string; - readonly tokenParam: string; + readonly tokenParam!: string; // if not provided set in ready keyBag?: KeyBagIf; - readonly sthis: SuperThis; + readonly sthis!: SuperThis; dbId!: string; - private opts: ToCloudParam; + readonly opts!: ToCloudParam; // readonly myTokenChange = new ResolveOnce(); - constructor(opts: ToCloudParam) { + static hash(opts: ToCloudParam) { + const my = {} as WebCtxImpl; + WebCtxImpl.prototype.setup.apply(my, [opts]); + return hashObjectSync({ + dashboardURI: my.dashboardURI, + tokenApiURI: my.tokenApiURI, + tokenParam: my.tokenParam, + ...(my.keyBag ? { keyBag: my.keyBag.hash() } : {}), + ...(my.opts ? { opts: hashForToCloudBase(my.opts) } : {}), + }); + } + + setup(this: Writable, opts: ToCloudParam): void { this.dashboardURI = opts.dashboardURI ?? "https://dev.connect.fireproof.direct/fp/cloud/api/token"; if (!opts.tokenApiURI) { - this.tokenApiURI = BuildURI.from(this.dashboardURI).pathname("/api").toString(); + this.tokenApiURI = URI.from(this.dashboardURI).build().pathname("/api").toString(); } else { this.tokenApiURI = opts.tokenApiURI; } // this.uiURI = opts.uiURI ?? "https://dev.connect.fireproof.direct/api"; this.tokenParam = opts.tokenParam ?? "fpToken"; - this.sthis = opts.sthis ?? ensureSuperThis(); this.keyBag = opts.keyBag; // ?? kb.getKeyBag(ensureSuperThis()); - - // if (opts.keyBag) { - // this.keyBag = opts.keyBag; - // } else { - // const sthis = opts.sthis ?? ensureSuperThis(); - // this.keyBag = kb.getKeyBag(sthis) - // } this.opts = opts; } + constructor(opts: ToCloudParam) { + this.setup(opts); + } + async ready(db: Database): Promise { this.dbId = db.ledger.refId(); this.keyBag = this.keyBag ?? (await getKeyBag(this.sthis)); @@ -132,8 +142,11 @@ class WebCtxImpl implements WebToCloudCtx { // export type WebToCloudOpts = WebToCloudCtx & { readonly strategy?: TokenStrategie } +const webCtxs = new KeyedResolvOnce(); export function defaultWebToCloudOpts(opts: ToCloudParam): WebToCloudCtx { - return new WebCtxImpl(opts); + return webCtxs.get(WebCtxImpl.hash(opts)).once(() => { + return new WebCtxImpl(opts); + }); } const initialCtx = { @@ -146,7 +159,12 @@ export function createAttach(database: Database, config: UseFPConfig): AttachHoo const [attachState, setAttachState] = useState({ state: "initial", ctx: initialCtx }); useEffect(() => { - prepareWebctxs.get(database.ledger.refId()).once(() => { + if (!config.attach) { + return; + } + // this mergest the config of the ledger with the config of the attachable + // the attach call well + prepareWebctxs.get(database.ledger.refId() + config.attach.configHash(database.ledger)).once(() => { if (config.attach && attachState.state === "initial") { // const id = database.sthis.nextId().str; setAttachState((prev) => ({ ...prev, state: "attaching" })); diff --git a/use-fireproof/react/use-fireproof.ts b/use-fireproof/react/use-fireproof.ts index 2a7df6ad7..96388f69d 100644 --- a/use-fireproof/react/use-fireproof.ts +++ b/use-fireproof/react/use-fireproof.ts @@ -30,6 +30,7 @@ export const FireproofCtx = {} as UseFireproof; */ export function useFireproof(name: string | Database = "useFireproof", config: UseFPConfig = {}): UseFireproof { const strConfig = JSON.stringify(toSortedArray(config)); + const database = useMemo(() => (typeof name === "string" ? fireproof(name, config) : name), [name, strConfig]); const attach = createAttach(database, config); diff --git a/use-fireproof/redirect-strategy.ts b/use-fireproof/redirect-strategy.ts index 1ecdbb74c..d02990e26 100644 --- a/use-fireproof/redirect-strategy.ts +++ b/use-fireproof/redirect-strategy.ts @@ -1,4 +1,4 @@ -import { BuildURI, Logger } from "@adviser/cement"; +import { BuildURI, Lazy, Logger } from "@adviser/cement"; import { SuperThis } from "@fireproof/core-types-base"; import { decodeJwt } from "jose"; import DOMPurify from "dompurify"; @@ -6,6 +6,7 @@ import { FPCloudClaim, ToCloudOpts, TokenAndClaims, TokenStrategie } from "@fire import { Api } from "@fireproof/core-protocols-dashboard"; import { WebToCloudCtx } from "./react/types.js"; import { WebCtx } from "./react/use-attach.js"; +import { hashObjectSync } from "@fireproof/core-runtime"; function defaultOverlayHtml(redirectLink: string) { return ` @@ -76,6 +77,12 @@ export class RedirectStrategy implements TokenStrategie { this.overlayCss = opts.overlayCss ?? defaultOverlayCss; this.overlayHtml = opts.overlayHtml ?? defaultOverlayHtml; } + readonly hash = Lazy(() => + hashObjectSync({ + overlayCss: this.overlayCss, + overlayHtml: this.overlayHtml("X").toString(), + }), + ); open(sthis: SuperThis, logger: Logger, deviceId: string, opts: ToCloudOpts) { const redirectCtx = opts.context.get(WebCtx) as WebToCloudCtx; diff --git a/use-fireproof/tests/use-fireproof.test.tsx b/use-fireproof/tests/use-fireproof.test.tsx index 04bdc8ba1..7b01b00a0 100644 --- a/use-fireproof/tests/use-fireproof.test.tsx +++ b/use-fireproof/tests/use-fireproof.test.tsx @@ -603,6 +603,76 @@ describe("HOOK: useFireproof race condition: calling save() without await overwr }); }); +describe("useFireproof and attach toCloud complex", () => { + // it("string are unique", () => { + + // function mark(x: string) { + // const toMark = x as unknown as { __fped?: string }; + // if (toMark.__fped) { + // return toMark.__fped + // } + // toMark.__fped = (~~(Math.random() * 0x1000_0000)).toString(16); + // return toMark.__fped; + // } + + // const set = new Set(); + // for (let i = 0; i < 10; i++) { + // const y = "hello"; + // const x = mark(y); + // set.add(x); + // } + // expect(set.size).toBe(1); + // }); + it("runs offen does once", async () => { + const source2Id = new Map(); + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type + function tagFn(fn: T): string { + // const fnProto = (fn as unknown as { __proto__?: { __fped?: string } }).__proto__; + // if (!fnProto) { + // throw new Error("no proto"); + // } + // if (fnProto && fnProto.__fped){ + // return fnProto.__fped; + // } + // fnProto.__fped = (~~(Math.random() * 0x1000_0000)).toString(16); + // return fnProto.__fped; + + // const fnTag = (fn as unknown as { __fped?: string }); + // if (fnTag.__fped) { + // return fnTag.__fped; + // } + // const newTag = + // return newTag; + const src = fn.toString(); + const sid = source2Id.get(src); + if (sid) { + return sid; + } + const id = (~~(Math.random() * 0x1000_0000)).toString(16); + source2Id.set(src, id); + return id; + } + const fnSet = new Set(); + + for (let i = 0; i < 10; i++) { + const db = () => 4; + function x() { + return 4; + } + fnSet.add(tagFn(db)); + fnSet.add(tagFn(x)); + fnSet.add(tagFn(() => 1)); + fnSet.add( + tagFn(function () { + return 2; + }), + ); + fnSet.add(tagFn(it)); + } + expect(fnSet.size).toBe(5); + }); +}); + describe("useFireproof calling submit()", () => { const dbName = "submitDb"; let db: Database, docResult: UseDocumentResult<{ input: string }>; diff --git a/vendor/package.json b/vendor/package.json index 2ebf7c004..6ac8743f5 100644 --- a/vendor/package.json +++ b/vendor/package.json @@ -29,7 +29,7 @@ "zx": "^8.8.1" }, "dependencies": { - "@adviser/cement": "^0.4.23", + "@adviser/cement": "^0.4.35", "yocto-queue": "^1.2.1" } } From 1eb7db5264e988522022fbd55d5b86f311c7f7cd Mon Sep 17 00:00:00 2001 From: Meno Abels Date: Mon, 15 Sep 2025 08:36:32 +0200 Subject: [PATCH 03/26] Update use-fireproof/tests/use-fireproof.test.tsx Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- use-fireproof/tests/use-fireproof.test.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/use-fireproof/tests/use-fireproof.test.tsx b/use-fireproof/tests/use-fireproof.test.tsx index 7b01b00a0..46b921e94 100644 --- a/use-fireproof/tests/use-fireproof.test.tsx +++ b/use-fireproof/tests/use-fireproof.test.tsx @@ -623,7 +623,7 @@ describe("useFireproof and attach toCloud complex", () => { // } // expect(set.size).toBe(1); // }); - it("runs offen does once", async () => { + it("tags identical function sources only once per run", async () => { const source2Id = new Map(); // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type function tagFn(fn: T): string { @@ -648,7 +648,7 @@ describe("useFireproof and attach toCloud complex", () => { if (sid) { return sid; } - const id = (~~(Math.random() * 0x1000_0000)).toString(16); + const id = hashStringSync(src); source2Id.set(src, id); return id; } From adeba64e381c859e71d75296fec20cd47c362f30 Mon Sep 17 00:00:00 2001 From: Meno Abels Date: Mon, 15 Sep 2025 08:48:39 +0200 Subject: [PATCH 04/26] chore: fix missing import --- use-fireproof/tests/use-fireproof.test.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/use-fireproof/tests/use-fireproof.test.tsx b/use-fireproof/tests/use-fireproof.test.tsx index 46b921e94..a5d1f45d9 100644 --- a/use-fireproof/tests/use-fireproof.test.tsx +++ b/use-fireproof/tests/use-fireproof.test.tsx @@ -2,6 +2,7 @@ import { renderHook, waitFor } from "@testing-library/react"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { fireproof, useFireproof } from "../index.js"; import type { Database, DocResponse, LiveQueryResult, UseDocumentResult } from "../index.js"; +import { hashStringSync } from "@fireproof/core-runtime"; const TEST_TIMEOUT = 45000; From 422f9c05a6402ba01796f4c470c2e850669416c2 Mon Sep 17 00:00:00 2001 From: J Chris Anderson Date: Tue, 9 Sep 2025 15:22:31 -0700 Subject: [PATCH 05/26] fix: make ImgFile references stable using content-based comparison MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, ImgFile would cleanup blob URLs when DocFileMeta.file() returned new File objects for the same content, causing image flickering and unnecessary re-renders. Now uses content-based cache keys instead of object references to determine if the file content has actually changed. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- use-fireproof/react/img-file.ts | 12 +++-- use-fireproof/tests/img-file.test.tsx | 69 +++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 3 deletions(-) diff --git a/use-fireproof/react/img-file.ts b/use-fireproof/react/img-file.ts index b0b92727e..c9870c0f4 100644 --- a/use-fireproof/react/img-file.ts +++ b/use-fireproof/react/img-file.ts @@ -72,15 +72,21 @@ async function loadFile({ } } + // Use content-based comparison instead of object reference comparison + // This prevents premature cleanup when DocFileMeta.file() returns new objects for same content + const currentKey = fileObjRef.current ? getCacheKey(fileObjRef.current) : null; + const newKey = fileObj ? getCacheKey(fileObj) : null; + const isDifferentFile = currentKey !== newKey; + // Clean up previous object URL if it exists and we're loading a new file - if (fileObjRef.current !== fileObj && cleanupRef.current) { + if (isDifferentFile && cleanupRef.current) { cleanupRef.current(); cleanupRef.current = null; } if (fileObj && /image/.test(fileType)) { - // Skip if it's the same exact file object - if (fileObjRef.current !== fileObj) { + // Skip if it's the same file content (even if different object reference) + if (isDifferentFile) { const src = getObjectUrl(fileObj); setImgDataUrl(src); fileObjRef.current = fileObj; diff --git a/use-fireproof/tests/img-file.test.tsx b/use-fireproof/tests/img-file.test.tsx index 323923e63..ef249bc45 100644 --- a/use-fireproof/tests/img-file.test.tsx +++ b/use-fireproof/tests/img-file.test.tsx @@ -188,4 +188,73 @@ describe("COMPONENT: ImgFile", () => { }, TEST_TIMEOUT, ); + + it( + "does not cleanup blob URL when DocFileMeta returns new objects for same content", + async () => { + // Create a file with specific content + const fileContent = new Blob([SVG_CONTENT], { type: "image/svg+xml" }); + const baseFile = new File([fileContent], "same-content.svg", { + type: "image/svg+xml", + lastModified: 1234567890000, // Fixed timestamp for consistent cache key + }); + + // Create a DocFileMeta that returns new File objects with same content + const mockCid = { toString: () => "same-content-cid" } as AnyLink; + const docFileMeta: DocFileMeta = { + type: "image/svg+xml", + size: baseFile.size, + cid: mockCid, + file: async () => { + // Always return a new File object but with same content and metadata + return new File([fileContent], "same-content.svg", { + type: "image/svg+xml", + lastModified: 1234567890000, // Same timestamp for consistent cache key + }); + }, + }; + + const { container, rerender } = render( + createElement(ImgFile, { + file: docFileMeta, + alt: "Content-Based Test", + }), + ); + + // Wait for initial render + await waitFor(() => { + const img = container.querySelector("img"); + expect(img).not.toBeNull(); + }); + + expect(window.URL.createObjectURL).toHaveBeenCalledTimes(1); + expect(window.URL.revokeObjectURL).not.toHaveBeenCalled(); + + // Force a re-render with the same DocFileMeta + // This will trigger the file() method again, returning a new File object + // but with the same content + rerender( + createElement(ImgFile, { + file: docFileMeta, + alt: "Content-Based Test Updated", + }), + ); + + // Wait for any async operations to complete + await waitFor( + () => { + const img = container.querySelector("img"); + expect(img).not.toBeNull(); + }, + { timeout: 2000 }, + ); + + // The blob URL should NOT be cleaned up because the content is the same + // even though the File object references are different + expect(window.URL.revokeObjectURL).not.toHaveBeenCalled(); + // Should not create a new object URL for same content + expect(window.URL.createObjectURL).toHaveBeenCalledTimes(1); + }, + TEST_TIMEOUT, + ); }); From d39303dbf60e23a0a55b017d8e8c58b0c775cad0 Mon Sep 17 00:00:00 2001 From: J Chris Anderson Date: Thu, 11 Sep 2025 14:24:55 -0700 Subject: [PATCH 06/26] refactor: use stable CID-based identity for image file caching and cleanup --- use-fireproof/react/img-file.ts | 46 ++++++++++++++------------- use-fireproof/tests/img-file.test.tsx | 19 ++++++++--- 2 files changed, 38 insertions(+), 27 deletions(-) diff --git a/use-fireproof/react/img-file.ts b/use-fireproof/react/img-file.ts index c9870c0f4..5f660d1a8 100644 --- a/use-fireproof/react/img-file.ts +++ b/use-fireproof/react/img-file.ts @@ -32,15 +32,13 @@ function getCacheKey(fileObj: File): string { return `${fileObj.name}-${fileObj.size}-${fileObj.lastModified}`; } -// Get or create an object URL with caching -function getObjectUrl(fileObj: File): string { - const cacheKey = getCacheKey(fileObj); +// Keyed variant so we can use DocFileMeta.cid for stable identity +function getObjectUrlByKey(cacheKey: string, fileObj: File): string { if (!objectUrlCache.has(cacheKey)) { // eslint-disable-next-line no-restricted-globals objectUrlCache.set(cacheKey, URL.createObjectURL(fileObj)); } - return objectUrlCache.get(cacheKey) as string; } @@ -49,11 +47,13 @@ async function loadFile({ fileObjRef, cleanupRef, setImgDataUrl, + keyRef, }: { fileData?: FileType; fileObjRef: React.RefObject; setImgDataUrl: React.Dispatch>; cleanupRef: React.RefObject<(() => void) | null>; + keyRef: React.RefObject; }) { let fileObj: File | null = null; let fileType = ""; @@ -72,34 +72,35 @@ async function loadFile({ } } - // Use content-based comparison instead of object reference comparison - // This prevents premature cleanup when DocFileMeta.file() returns new objects for same content - const currentKey = fileObjRef.current ? getCacheKey(fileObjRef.current) : null; - const newKey = fileObj ? getCacheKey(fileObj) : null; + // Prefer DocFileMeta.cid; fallback to file-derived key + const currentKey = keyRef.current ?? null; + const newKey = + (fileData && isFileMeta(fileData) && fileData.cid + ? `cid:${String(fileData.cid)}` + : fileObj + ? getCacheKey(fileObj) + : null); const isDifferentFile = currentKey !== newKey; - // Clean up previous object URL if it exists and we're loading a new file - if (isDifferentFile && cleanupRef.current) { - cleanupRef.current(); - cleanupRef.current = null; - } + // Defer cleanup of previous URL until after new URL is set if (fileObj && /image/.test(fileType)) { // Skip if it's the same file content (even if different object reference) - if (isDifferentFile) { - const src = getObjectUrl(fileObj); + if (isDifferentFile && newKey) { + const src = getObjectUrlByKey(newKey, fileObj); setImgDataUrl(src); fileObjRef.current = fileObj; - - // Store cleanup function + const prevCleanup = cleanupRef.current; + // Store cleanup function keyed by content identity cleanupRef.current = () => { - const cacheKey = getCacheKey(fileObj); - if (objectUrlCache.has(cacheKey)) { + if (objectUrlCache.has(newKey)) { // eslint-disable-next-line no-restricted-globals - URL.revokeObjectURL(objectUrlCache.get(cacheKey) as string); - objectUrlCache.delete(cacheKey); + URL.revokeObjectURL(objectUrlCache.get(newKey) as string); + objectUrlCache.delete(newKey); } }; + keyRef.current = newKey; + if (prevCleanup) prevCleanup(); return cleanupRef.current; } @@ -114,6 +115,7 @@ export function ImgFile({ file, meta, ...imgProps }: ImgFileProps) { const [imgDataUrl, setImgDataUrl] = useState(""); const fileObjRef = useRef(null); const cleanupRef = useRef<(() => void) | null>(null); + const keyRef = useRef(null); // Use meta as fallback if file is not provided (for backward compatibility) // Memoize fileData to prevent unnecessary re-renders @@ -124,7 +126,7 @@ export function ImgFile({ file, meta, ...imgProps }: ImgFileProps) { useEffect(() => { if (!fileData) return; let isMounted = true; - loadFile({ fileData, fileObjRef, cleanupRef, setImgDataUrl }).then(function handleResult(result) { + loadFile({ fileData, fileObjRef, cleanupRef, setImgDataUrl, keyRef }).then(function handleResult(result) { if (isMounted) { // Store the result in cleanupRef.current if component is still mounted cleanupRef.current = result; diff --git a/use-fireproof/tests/img-file.test.tsx b/use-fireproof/tests/img-file.test.tsx index ef249bc45..71f9ae6b9 100644 --- a/use-fireproof/tests/img-file.test.tsx +++ b/use-fireproof/tests/img-file.test.tsx @@ -230,12 +230,20 @@ describe("COMPONENT: ImgFile", () => { expect(window.URL.createObjectURL).toHaveBeenCalledTimes(1); expect(window.URL.revokeObjectURL).not.toHaveBeenCalled(); - // Force a re-render with the same DocFileMeta - // This will trigger the file() method again, returning a new File object - // but with the same content + // Force a re-render with a NEW DocFileMeta object that yields the same content + const fileSpy = vi.fn(async () => + new File([fileContent], "same-content.svg", { + type: "image/svg+xml", + lastModified: 1234567890000, + }), + ); + const docFileMeta2: DocFileMeta = { + ...docFileMeta, + file: fileSpy, + }; rerender( createElement(ImgFile, { - file: docFileMeta, + file: docFileMeta2, alt: "Content-Based Test Updated", }), ); @@ -250,10 +258,11 @@ describe("COMPONENT: ImgFile", () => { ); // The blob URL should NOT be cleaned up because the content is the same - // even though the File object references are different expect(window.URL.revokeObjectURL).not.toHaveBeenCalled(); // Should not create a new object URL for same content expect(window.URL.createObjectURL).toHaveBeenCalledTimes(1); + // And the resolver was invoked again + expect(fileSpy).toHaveBeenCalledTimes(1); }, TEST_TIMEOUT, ); From f7d9e39e06669eb4f30bf86d43f9fa7c4eb55531 Mon Sep 17 00:00:00 2001 From: J Chris Anderson Date: Thu, 11 Sep 2025 14:33:16 -0700 Subject: [PATCH 07/26] fix: implement stable CID-based content keys for DocFileMeta objects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Use DocFileMeta.cid as primary key for stable content identity - Add keyRef to track stable content keys across renders - Defer cleanup until after new image URL is set to avoid blanking - Support cross-type comparison between File and DocFileMeta objects - Add comprehensive tests for CID-based caching behavior Addresses CodeRabbit feedback: - Prevents cache invalidation when DocFileMeta.file() returns new objects - Uses truly stable content identity instead of metadata-based keys - Proper cleanup ordering to avoid transient image blanking - Test coverage for edge cases and cross-type scenarios 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- use-fireproof/tests/img-file.test.tsx | 205 ++++++++++++++++++++++++++ 1 file changed, 205 insertions(+) diff --git a/use-fireproof/tests/img-file.test.tsx b/use-fireproof/tests/img-file.test.tsx index 71f9ae6b9..6286b48b1 100644 --- a/use-fireproof/tests/img-file.test.tsx +++ b/use-fireproof/tests/img-file.test.tsx @@ -266,4 +266,209 @@ describe("COMPONENT: ImgFile", () => { }, TEST_TIMEOUT, ); + + it( + "uses CID-based stable keys for DocFileMeta objects with different File metadata but same content", + async () => { + const fileContent = new Blob([SVG_CONTENT], { type: "image/svg+xml" }); + const mockCid = { toString: () => "stable-content-cid" } as AnyLink; + + // First DocFileMeta with one timestamp + const docFileMeta1: DocFileMeta = { + type: "image/svg+xml", + size: fileContent.size, + cid: mockCid, + file: async () => + new File([fileContent], "file1.svg", { + type: "image/svg+xml", + lastModified: 1000000000000, // Different timestamp + }), + }; + + const { container, rerender } = render( + createElement(ImgFile, { + file: docFileMeta1, + alt: "CID Stable Test", + }), + ); + + // Wait for initial render + await waitFor(() => { + const img = container.querySelector("img"); + expect(img).not.toBeNull(); + }); + + expect(window.URL.createObjectURL).toHaveBeenCalledTimes(1); + expect(window.URL.revokeObjectURL).not.toHaveBeenCalled(); + + // Second DocFileMeta with SAME CID but different file metadata + const docFileMeta2: DocFileMeta = { + type: "image/svg+xml", + size: fileContent.size, + cid: mockCid, // Same CID - should be treated as same content + file: async () => + new File([fileContent], "different-name.svg", { + type: "image/svg+xml", + lastModified: 2000000000000, // Different timestamp + }), + }; + + rerender( + createElement(ImgFile, { + file: docFileMeta2, + alt: "CID Stable Test Updated", + }), + ); + + // Wait for any async operations to complete + await waitFor( + () => { + const img = container.querySelector("img"); + expect(img).not.toBeNull(); + }, + { timeout: 2000 }, + ); + + // Because the CID is the same, should NOT create new object URL or revoke old one + expect(window.URL.revokeObjectURL).not.toHaveBeenCalled(); + expect(window.URL.createObjectURL).toHaveBeenCalledTimes(1); + }, + TEST_TIMEOUT, + ); + + it( + "creates new object URL when DocFileMeta has different CID even with same file metadata", + async () => { + const fileContent1 = new Blob([SVG_CONTENT], { type: "image/svg+xml" }); + const fileContent2 = new Blob(["different content"], { type: "image/svg+xml" }); + + const mockCid1 = { toString: () => "content-cid-1" } as AnyLink; + const mockCid2 = { toString: () => "content-cid-2" } as AnyLink; + + // First DocFileMeta + const docFileMeta1: DocFileMeta = { + type: "image/svg+xml", + size: fileContent1.size, + cid: mockCid1, + file: async () => + new File([fileContent1], "same-name.svg", { + type: "image/svg+xml", + lastModified: 1234567890000, // Same metadata + }), + }; + + const { container, rerender } = render( + createElement(ImgFile, { + file: docFileMeta1, + alt: "Different CID Test", + }), + ); + + // Wait for initial render + await waitFor(() => { + const img = container.querySelector("img"); + expect(img).not.toBeNull(); + }); + + expect(window.URL.createObjectURL).toHaveBeenCalledTimes(1); + expect(window.URL.revokeObjectURL).not.toHaveBeenCalled(); + + // Second DocFileMeta with different CID but same file metadata + const docFileMeta2: DocFileMeta = { + type: "image/svg+xml", + size: fileContent2.size, // Could be same size by coincidence + cid: mockCid2, // Different CID - should be treated as different content + file: async () => + new File([fileContent2], "same-name.svg", { + type: "image/svg+xml", + lastModified: 1234567890000, // Same metadata as first + }), + }; + + rerender( + createElement(ImgFile, { + file: docFileMeta2, + alt: "Different CID Test Updated", + }), + ); + + // Wait for any async operations to complete + await waitFor( + () => { + const img = container.querySelector("img"); + expect(img).not.toBeNull(); + }, + { timeout: 2000 }, + ); + + // Because the CID is different, should create new object URL and clean up old one + expect(window.URL.revokeObjectURL).toHaveBeenCalledTimes(1); + expect(window.URL.createObjectURL).toHaveBeenCalledTimes(2); + }, + TEST_TIMEOUT, + ); + + it( + "handles cross-type comparison between File and DocFileMeta objects", + async () => { + const fileContent = new Blob([SVG_CONTENT], { type: "image/svg+xml" }); + + // Start with a direct File object + const directFile = new File([fileContent], "test.svg", { + type: "image/svg+xml", + lastModified: 1234567890000, + }); + + const { container, rerender } = render( + createElement(ImgFile, { + file: directFile, + alt: "Cross-type Test", + }), + ); + + // Wait for initial render + await waitFor(() => { + const img = container.querySelector("img"); + expect(img).not.toBeNull(); + }); + + expect(window.URL.createObjectURL).toHaveBeenCalledTimes(1); + expect(window.URL.revokeObjectURL).not.toHaveBeenCalled(); + + // Now switch to DocFileMeta that returns same content but different file metadata + const mockCid = { toString: () => "cross-type-cid" } as AnyLink; + const docFileMeta: DocFileMeta = { + type: "image/svg+xml", + size: fileContent.size, + cid: mockCid, + file: async () => + new File([fileContent], "different-name.svg", { + type: "image/svg+xml", + lastModified: 9999999999999, // Very different timestamp + }), + }; + + rerender( + createElement(ImgFile, { + file: docFileMeta, + alt: "Cross-type Test Updated", + }), + ); + + // Wait for any async operations to complete + await waitFor( + () => { + const img = container.querySelector("img"); + expect(img).not.toBeNull(); + }, + { timeout: 2000 }, + ); + + // Because we switched from File (metadata-based key) to DocFileMeta (CID-based key), + // these should be treated as different and trigger cleanup + new object URL + expect(window.URL.revokeObjectURL).toHaveBeenCalledTimes(1); + expect(window.URL.createObjectURL).toHaveBeenCalledTimes(2); + }, + TEST_TIMEOUT, + ); }); From b4e5aad8209996d17ce4fc51af1470d369904c60 Mon Sep 17 00:00:00 2001 From: J Chris Anderson Date: Thu, 11 Sep 2025 14:39:34 -0700 Subject: [PATCH 08/26] fix: use correct object type checking for file key generation in ImgFile component --- use-fireproof/react/img-file.ts | 11 +++++------ use-fireproof/tests/img-file.test.tsx | 19 ++++++++++--------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/use-fireproof/react/img-file.ts b/use-fireproof/react/img-file.ts index 5f660d1a8..0c36ec0d3 100644 --- a/use-fireproof/react/img-file.ts +++ b/use-fireproof/react/img-file.ts @@ -32,7 +32,6 @@ function getCacheKey(fileObj: File): string { return `${fileObj.name}-${fileObj.size}-${fileObj.lastModified}`; } - // Keyed variant so we can use DocFileMeta.cid for stable identity function getObjectUrlByKey(cacheKey: string, fileObj: File): string { if (!objectUrlCache.has(cacheKey)) { @@ -72,14 +71,14 @@ async function loadFile({ } } - // Prefer DocFileMeta.cid; fallback to file-derived key + // Use CID-based key for DocFileMeta, file-based key for direct File objects const currentKey = keyRef.current ?? null; const newKey = - (fileData && isFileMeta(fileData) && fileData.cid + fileData && isFileMeta(fileData) && fileData.cid ? `cid:${String(fileData.cid)}` - : fileObj - ? getCacheKey(fileObj) - : null); + : fileData && isFile(fileData) + ? getCacheKey(fileData) + : null; const isDifferentFile = currentKey !== newKey; // Defer cleanup of previous URL until after new URL is set diff --git a/use-fireproof/tests/img-file.test.tsx b/use-fireproof/tests/img-file.test.tsx index 6286b48b1..02b3e54b9 100644 --- a/use-fireproof/tests/img-file.test.tsx +++ b/use-fireproof/tests/img-file.test.tsx @@ -231,11 +231,12 @@ describe("COMPONENT: ImgFile", () => { expect(window.URL.revokeObjectURL).not.toHaveBeenCalled(); // Force a re-render with a NEW DocFileMeta object that yields the same content - const fileSpy = vi.fn(async () => - new File([fileContent], "same-content.svg", { - type: "image/svg+xml", - lastModified: 1234567890000, - }), + const fileSpy = vi.fn( + async () => + new File([fileContent], "same-content.svg", { + type: "image/svg+xml", + lastModified: 1234567890000, + }), ); const docFileMeta2: DocFileMeta = { ...docFileMeta, @@ -303,7 +304,7 @@ describe("COMPONENT: ImgFile", () => { // Second DocFileMeta with SAME CID but different file metadata const docFileMeta2: DocFileMeta = { - type: "image/svg+xml", + type: "image/svg+xml", size: fileContent.size, cid: mockCid, // Same CID - should be treated as same content file: async () => @@ -341,7 +342,7 @@ describe("COMPONENT: ImgFile", () => { async () => { const fileContent1 = new Blob([SVG_CONTENT], { type: "image/svg+xml" }); const fileContent2 = new Blob(["different content"], { type: "image/svg+xml" }); - + const mockCid1 = { toString: () => "content-cid-1" } as AnyLink; const mockCid2 = { toString: () => "content-cid-2" } as AnyLink; @@ -380,7 +381,7 @@ describe("COMPONENT: ImgFile", () => { cid: mockCid2, // Different CID - should be treated as different content file: async () => new File([fileContent2], "same-name.svg", { - type: "image/svg+xml", + type: "image/svg+xml", lastModified: 1234567890000, // Same metadata as first }), }; @@ -412,7 +413,7 @@ describe("COMPONENT: ImgFile", () => { "handles cross-type comparison between File and DocFileMeta objects", async () => { const fileContent = new Blob([SVG_CONTENT], { type: "image/svg+xml" }); - + // Start with a direct File object const directFile = new File([fileContent], "test.svg", { type: "image/svg+xml", From 4d282b6cc29f48055709ec88b33817b2f04378a0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 05:26:15 +0000 Subject: [PATCH 09/26] chore(deps): bump hono from 4.9.6 to 4.9.7 Bumps [hono](https://github.com/honojs/hono) from 4.9.6 to 4.9.7. - [Release notes](https://github.com/honojs/hono/releases) - [Commits](https://github.com/honojs/hono/compare/v4.9.6...v4.9.7) --- updated-dependencies: - dependency-name: hono dependency-version: 4.9.7 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- cloud/backend/base/package.json | 2 +- cloud/backend/cf-d1/package.json | 2 +- cloud/backend/node/package.json | 2 +- pnpm-lock.yaml | 46 ++++++++++++++++---------------- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/cloud/backend/base/package.json b/cloud/backend/base/package.json index e51746410..8ad9d2344 100644 --- a/cloud/backend/base/package.json +++ b/cloud/backend/base/package.json @@ -47,7 +47,7 @@ "@libsql/client": "^0.15.15", "aws4fetch": "^1.0.20", "drizzle-orm": "^0.44.3", - "hono": "^4.9.6", + "hono": "^4.9.7", "jose": "^6.1.0" }, "devDependencies": { diff --git a/cloud/backend/cf-d1/package.json b/cloud/backend/cf-d1/package.json index b395e0269..c890b36d6 100644 --- a/cloud/backend/cf-d1/package.json +++ b/cloud/backend/cf-d1/package.json @@ -50,7 +50,7 @@ "@fireproof/vendor": "workspace:0.0.0", "cmd-ts": "^0.14.1", "drizzle-orm": "^0.44.3", - "hono": "^4.9.6", + "hono": "^4.9.7", "multiformats": "^13.4.0" }, "devDependencies": { diff --git a/cloud/backend/node/package.json b/cloud/backend/node/package.json index de31f747e..baa5cce03 100644 --- a/cloud/backend/node/package.json +++ b/cloud/backend/node/package.json @@ -49,7 +49,7 @@ "@hono/node-ws": "^1.2.0", "@libsql/client": "^0.15.15", "drizzle-orm": "^0.44.3", - "hono": "^4.9.6", + "hono": "^4.9.7", "vitest": "^3.2.4" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed1d5e6dd..618570bb7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,7 +6,7 @@ settings: patchedDependencies: drizzle-kit: - hash: 9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8 + hash: qurcebuunk6oqtltwdee4xtzuy path: patches/drizzle-kit.patch importers: @@ -33,7 +33,7 @@ importers: version: 2.4.4 drizzle-kit: specifier: 0.30.6 - version: 0.30.6(patch_hash=9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8) + version: 0.30.6(patch_hash=qurcebuunk6oqtltwdee4xtzuy) eslint: specifier: ^9.35.0 version: 9.35.0(jiti@1.21.7) @@ -184,8 +184,8 @@ importers: specifier: ^0.44.3 version: 0.44.5(@cloudflare/workers-types@4.20250906.0)(@libsql/client@0.15.15)(gel@2.1.1)(kysely@0.28.5) hono: - specifier: ^4.9.6 - version: 4.9.6 + specifier: ^4.9.7 + version: 4.9.7 jose: specifier: ^6.1.0 version: 6.1.0 @@ -204,7 +204,7 @@ importers: version: link:../../../core/types/protocols/cloud drizzle-kit: specifier: 0.30.6 - version: 0.30.6(patch_hash=9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8) + version: 0.30.6(patch_hash=qurcebuunk6oqtltwdee4xtzuy) vitest: specifier: ^3.2.4 version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) @@ -248,8 +248,8 @@ importers: specifier: ^0.44.3 version: 0.44.5(@cloudflare/workers-types@4.20250906.0)(@libsql/client@0.15.15)(gel@2.1.1)(kysely@0.28.5) hono: - specifier: ^4.9.6 - version: 4.9.6 + specifier: ^4.9.7 + version: 4.9.7 multiformats: specifier: ^13.4.0 version: 13.4.0 @@ -259,7 +259,7 @@ importers: version: link:../../../cli drizzle-kit: specifier: 0.30.6 - version: 0.30.6(patch_hash=9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8) + version: 0.30.6(patch_hash=qurcebuunk6oqtltwdee4xtzuy) tsx: specifier: ^4.20.4 version: 4.20.5 @@ -304,10 +304,10 @@ importers: version: link:../../../vendor '@hono/node-server': specifier: ^1.19.1 - version: 1.19.1(hono@4.9.6) + version: 1.19.1(hono@4.9.7) '@hono/node-ws': specifier: ^1.2.0 - version: 1.2.0(@hono/node-server@1.19.1(hono@4.9.6))(hono@4.9.6) + version: 1.2.0(@hono/node-server@1.19.1(hono@4.9.7))(hono@4.9.7) '@libsql/client': specifier: ^0.15.15 version: 0.15.15 @@ -315,8 +315,8 @@ importers: specifier: ^0.44.3 version: 0.44.5(@cloudflare/workers-types@4.20250906.0)(@libsql/client@0.15.15)(gel@2.1.1)(kysely@0.28.5) hono: - specifier: ^4.9.6 - version: 4.9.6 + specifier: ^4.9.7 + version: 4.9.7 vitest: specifier: ^3.2.4 version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) @@ -329,7 +329,7 @@ importers: version: 24.3.1 drizzle-kit: specifier: 0.30.6 - version: 0.30.6(patch_hash=9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8) + version: 0.30.6(patch_hash=qurcebuunk6oqtltwdee4xtzuy) zx: specifier: ^8.8.1 version: 8.8.1 @@ -1231,7 +1231,7 @@ importers: version: 10.4.21(postcss@8.5.6) drizzle-kit: specifier: 0.30.6 - version: 0.30.6(patch_hash=9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8) + version: 0.30.6(patch_hash=qurcebuunk6oqtltwdee4xtzuy) drizzle-orm: specifier: ^0.44.3 version: 0.44.5(@cloudflare/workers-types@4.20250906.0)(@libsql/client@0.15.15)(gel@2.1.1)(kysely@0.28.5) @@ -4864,8 +4864,8 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - hono@4.9.6: - resolution: {integrity: sha512-doVjXhSFvYZ7y0dNokjwwSahcrAfdz+/BCLvAMa/vHLzjj8+CFyV5xteThGUsKdkaasgN+gF2mUxao+SGLpUeA==} + hono@4.9.7: + resolution: {integrity: sha512-t4Te6ERzIaC48W3x4hJmBwgNlLhmiEdEE5ViYb02ffw4ignHNHa5IBtPjmbKstmtKa8X6C35iWwK4HaqvrzG9w==} engines: {node: '>=16.9.0'} hosted-git-info@2.8.9: @@ -8109,14 +8109,14 @@ snapshots: '@formkit/auto-animate@0.8.4': {} - '@hono/node-server@1.19.1(hono@4.9.6)': + '@hono/node-server@1.19.1(hono@4.9.7)': dependencies: - hono: 4.9.6 + hono: 4.9.7 - '@hono/node-ws@1.2.0(@hono/node-server@1.19.1(hono@4.9.6))(hono@4.9.6)': + '@hono/node-ws@1.2.0(@hono/node-server@1.19.1(hono@4.9.7))(hono@4.9.7)': dependencies: - '@hono/node-server': 1.19.1(hono@4.9.6) - hono: 4.9.6 + '@hono/node-server': 1.19.1(hono@4.9.7) + hono: 4.9.7 ws: 8.18.3 transitivePeerDependencies: - bufferutil @@ -9432,7 +9432,7 @@ snapshots: optionalDependencies: '@types/trusted-types': 2.0.7 - drizzle-kit@0.30.6(patch_hash=9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8): + drizzle-kit@0.30.6(patch_hash=qurcebuunk6oqtltwdee4xtzuy): dependencies: '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 @@ -10147,7 +10147,7 @@ snapshots: dependencies: react-is: 16.13.1 - hono@4.9.6: {} + hono@4.9.7: {} hosted-git-info@2.8.9: {} From c3379c38f5177f6ec91da4ba61c3656dc5ec8693 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 05:26:33 +0000 Subject: [PATCH 10/26] chore(deps): bump react-router-dom from 7.8.2 to 7.9.1 Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 7.8.2 to 7.9.1. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@7.9.1/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-version: 7.9.1 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dashboard/package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/dashboard/package.json b/dashboard/package.json index ced1433b3..a8a12ef11 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -47,7 +47,7 @@ "react": "^19.1.0", "react-dom": "^19.1.0", "react-hook-form": "^7.62.0", - "react-router-dom": "^7.8.2", + "react-router-dom": "^7.9.1", "react-simple-code-editor": "^0.14.1", "use-editable": "^2.3.3", "use-fireproof": "workspace:0.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 618570bb7..aaa076373 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1178,8 +1178,8 @@ importers: specifier: ^7.62.0 version: 7.62.0(react@19.1.1) react-router-dom: - specifier: ^7.8.2 - version: 7.8.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^7.9.1 + version: 7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react-simple-code-editor: specifier: ^0.14.1 version: 0.14.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -5759,15 +5759,15 @@ packages: resolution: {integrity: sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==} engines: {node: '>=0.10.0'} - react-router-dom@7.8.2: - resolution: {integrity: sha512-Z4VM5mKDipal2jQ385H6UBhiiEDlnJPx6jyWsTYoZQdl5TrjxEV2a9yl3Fi60NBJxYzOTGTTHXPi0pdizvTwow==} + react-router-dom@7.9.1: + resolution: {integrity: sha512-U9WBQssBE9B1vmRjo9qTM7YRzfZ3lUxESIZnsf4VjR/lXYz9MHjvOxHzr/aUm4efpktbVOrF09rL/y4VHa8RMw==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' react-dom: '>=18' - react-router@7.8.2: - resolution: {integrity: sha512-7M2fR1JbIZ/jFWqelpvSZx+7vd7UlBTfdZqf6OSdF9g6+sfdqJDAWcak6ervbHph200ePlu+7G8LdoiC3ReyAQ==} + react-router@7.9.1: + resolution: {integrity: sha512-pfAByjcTpX55mqSDGwGnY9vDCpxqBLASg0BMNAuMmpSGESo/TaOUG6BllhAtAkCGx8Rnohik/XtaqiYUJtgW2g==} engines: {node: '>=20.0.0'} peerDependencies: react: '>=18' @@ -11029,13 +11029,13 @@ snapshots: react-refresh@0.17.0: {} - react-router-dom@7.8.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + react-router-dom@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - react-router: 7.8.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + react-router: 7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - react-router@7.8.2(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + react-router@7.9.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: cookie: 1.0.2 react: 19.1.1 From 2af127e2b91a4015ee806cae7bedcdebc7492049 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 07:51:26 +0000 Subject: [PATCH 11/26] chore(deps-dev): bump @typescript/native-preview Bumps [@typescript/native-preview](https://github.com/microsoft/typescript-go) from 7.0.0-dev.20250908.1 to 7.0.0-dev.20250915.1. - [Changelog](https://github.com/microsoft/typescript-go/blob/main/CHANGES.md) - [Commits](https://github.com/microsoft/typescript-go/commits) --- updated-dependencies: - dependency-name: "@typescript/native-preview" dependency-version: 7.0.0-dev.20250915.1 dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- package.json | 2 +- pnpm-lock.yaml | 74 ++++++++++++++++++++++---------------------------- 2 files changed, 34 insertions(+), 42 deletions(-) diff --git a/package.json b/package.json index 32f913782..634242bc4 100644 --- a/package.json +++ b/package.json @@ -62,7 +62,7 @@ "@fireproof/core-cli": "workspace:0.0.0", "@types/deno": "^2.3.0", "@types/node": "^24.3.1", - "@typescript/native-preview": "7.0.0-dev.20250908.1", + "@typescript/native-preview": "7.0.0-dev.20250915.1", "deno": "^2.4.3", "drizzle-kit": "0.30.6", "eslint": "^9.35.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aaa076373..2d660af01 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -26,8 +26,8 @@ importers: specifier: ^24.3.1 version: 24.3.1 '@typescript/native-preview': - specifier: 7.0.0-dev.20250908.1 - version: 7.0.0-dev.20250908.1 + specifier: 7.0.0-dev.20250915.1 + version: 7.0.0-dev.20250915.1 deno: specifier: ^2.4.3 version: 2.4.4 @@ -3690,51 +3690,43 @@ packages: resolution: {integrity: sha512-T+S1KqRD4sg/bHfLwrpF/K3gQLBM1n7Rp7OjjikjTEssI2YJzQpi5WXoynOaQ93ERIuq3O8RBTOUYDKszUCEHw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20250908.1': - resolution: {integrity: sha512-BBH+T4AVrkKZ+3PtJLqXV2IFlcZKR2KScdFefVFeBHffFmjINAHwrArbvizj8Z2J+8LWhop6MSdf2D693tQ1AQ==} - engines: {node: '>=20.6.0'} + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20250915.1': + resolution: {integrity: sha512-N+nkeXCMGfjJzACSzMd156S6pmjZDyca7L3ENbt5u4EtUBkX6UPXW7YH67htyNQZs2kUJ2HRvQsf69jRMF1kaQ==} cpu: [arm64] os: [darwin] - '@typescript/native-preview-darwin-x64@7.0.0-dev.20250908.1': - resolution: {integrity: sha512-eGHiFczXIKOC8Yu6SBSdX93NV/ELLsF2E0q8foP6EIH030GMT83JCcAEYbKC48PnRnXudN7NsNdxFRAWL6zN4w==} - engines: {node: '>=20.6.0'} + '@typescript/native-preview-darwin-x64@7.0.0-dev.20250915.1': + resolution: {integrity: sha512-ZGbsO8YqCVYkPtcagmqoiwjYlvVTwoEWniLLFDuO0RHvDVHXp+cmFlX0+AuVnvcQakPswYNrdZkU0+EjMqhutQ==} cpu: [x64] os: [darwin] - '@typescript/native-preview-linux-arm64@7.0.0-dev.20250908.1': - resolution: {integrity: sha512-sBfAHKt7xaAxCOXnljssPfLGx5dePmdPfqcFA3bXecdcVKZAB3OTYVkDaMnxpTcIvUhq8LtoCybFp/dA2MKlLQ==} - engines: {node: '>=20.6.0'} + '@typescript/native-preview-linux-arm64@7.0.0-dev.20250915.1': + resolution: {integrity: sha512-+L0wP0gFFGONaI6PsfaV84RMtR7S8+sSBVKo7nrCY99Je1dtlTkeD0Y/rqu+WkDZwdP5krZZPc9xIrGUIk30+w==} cpu: [arm64] os: [linux] - '@typescript/native-preview-linux-arm@7.0.0-dev.20250908.1': - resolution: {integrity: sha512-+gy3zZhBEvhWReWB9gXf9lKJ8UoKJ84bu0gIkK/nDVvaTxMiOPvjRILCcVgZ5OmbjcwAWh8jcZyFc7caR6BXjw==} - engines: {node: '>=20.6.0'} + '@typescript/native-preview-linux-arm@7.0.0-dev.20250915.1': + resolution: {integrity: sha512-omh3LvG8Cs8EcA0dVkzGojzHIshWFnNA3fEfSDzwZOHt/KqHAVdGgOCmuqPdQMRsYF3ssO8SMhTAwEZRZNaHmg==} cpu: [arm] os: [linux] - '@typescript/native-preview-linux-x64@7.0.0-dev.20250908.1': - resolution: {integrity: sha512-IEaWm0pfgR+7jJwYA6b3IhiJLkK3PUmmcI2xX7UkzklejVU49P4fboKcCVxemz8bXwdpRIi8ob9ItwWBY5wrxg==} - engines: {node: '>=20.6.0'} + '@typescript/native-preview-linux-x64@7.0.0-dev.20250915.1': + resolution: {integrity: sha512-Ih6D7FIHdIsC1UnkugE6xmCcdiDN4oMV4F56OuCrwN89VyCu+MM4nqLlgsjb50J0lgsgTUi30AhtgTOEhudikg==} cpu: [x64] os: [linux] - '@typescript/native-preview-win32-arm64@7.0.0-dev.20250908.1': - resolution: {integrity: sha512-EAdnfEYaSsZTOn44FCD8In8I29jQd++xgYNuKy936Ufbbp8QAo1I5jDXAEt76z0ce/k4ZKTuV9YM2CuvaRaJGQ==} - engines: {node: '>=20.6.0'} + '@typescript/native-preview-win32-arm64@7.0.0-dev.20250915.1': + resolution: {integrity: sha512-vZHGMbO6smEh3zj7jO5bPrcZQoRYusnA1CxVNvFr3b6iovFXWICpS8kqzHzEH99UEP+8TvfAmPGspf8x1UZsIQ==} cpu: [arm64] os: [win32] - '@typescript/native-preview-win32-x64@7.0.0-dev.20250908.1': - resolution: {integrity: sha512-w3Eo1N0pkLPpiIAaMoca/zhIhupzKtIRB38pAALM3+9Yxj3lwUhmFrfUglUSSzqyc02Yx8PE/IU5AX8xRszXeg==} - engines: {node: '>=20.6.0'} + '@typescript/native-preview-win32-x64@7.0.0-dev.20250915.1': + resolution: {integrity: sha512-Q0+IrpfXoM61bZSAIBQZxWj9II8rOuZfwpp1E34TNhvnu7AOV2aKq3J67KAkTortiBmNZnAhnhRIQ2W3jayWUQ==} cpu: [x64] os: [win32] - '@typescript/native-preview@7.0.0-dev.20250908.1': - resolution: {integrity: sha512-BkW9+//W42Lm6D86HbrF2YwnGjLeguuL64IDkxOqEE9VyX38XKTWkFmclnt3jMmlfeRci7OChiWZBozOxYcvKA==} - engines: {node: '>=20.6.0'} + '@typescript/native-preview@7.0.0-dev.20250915.1': + resolution: {integrity: sha512-uc64rFuzwQZu+tNhGAaDMGpd/Jtp31K/o4kRWNxMwztgHjvUcV9Bbr4C6mTiUsiZ6pERiLEorwFQDSOajPBGGg==} hasBin: true '@vitejs/plugin-react@5.0.2': @@ -8783,36 +8775,36 @@ snapshots: '@typescript-eslint/types': 8.43.0 eslint-visitor-keys: 4.2.1 - '@typescript/native-preview-darwin-arm64@7.0.0-dev.20250908.1': + '@typescript/native-preview-darwin-arm64@7.0.0-dev.20250915.1': optional: true - '@typescript/native-preview-darwin-x64@7.0.0-dev.20250908.1': + '@typescript/native-preview-darwin-x64@7.0.0-dev.20250915.1': optional: true - '@typescript/native-preview-linux-arm64@7.0.0-dev.20250908.1': + '@typescript/native-preview-linux-arm64@7.0.0-dev.20250915.1': optional: true - '@typescript/native-preview-linux-arm@7.0.0-dev.20250908.1': + '@typescript/native-preview-linux-arm@7.0.0-dev.20250915.1': optional: true - '@typescript/native-preview-linux-x64@7.0.0-dev.20250908.1': + '@typescript/native-preview-linux-x64@7.0.0-dev.20250915.1': optional: true - '@typescript/native-preview-win32-arm64@7.0.0-dev.20250908.1': + '@typescript/native-preview-win32-arm64@7.0.0-dev.20250915.1': optional: true - '@typescript/native-preview-win32-x64@7.0.0-dev.20250908.1': + '@typescript/native-preview-win32-x64@7.0.0-dev.20250915.1': optional: true - '@typescript/native-preview@7.0.0-dev.20250908.1': + '@typescript/native-preview@7.0.0-dev.20250915.1': optionalDependencies: - '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20250908.1 - '@typescript/native-preview-darwin-x64': 7.0.0-dev.20250908.1 - '@typescript/native-preview-linux-arm': 7.0.0-dev.20250908.1 - '@typescript/native-preview-linux-arm64': 7.0.0-dev.20250908.1 - '@typescript/native-preview-linux-x64': 7.0.0-dev.20250908.1 - '@typescript/native-preview-win32-arm64': 7.0.0-dev.20250908.1 - '@typescript/native-preview-win32-x64': 7.0.0-dev.20250908.1 + '@typescript/native-preview-darwin-arm64': 7.0.0-dev.20250915.1 + '@typescript/native-preview-darwin-x64': 7.0.0-dev.20250915.1 + '@typescript/native-preview-linux-arm': 7.0.0-dev.20250915.1 + '@typescript/native-preview-linux-arm64': 7.0.0-dev.20250915.1 + '@typescript/native-preview-linux-x64': 7.0.0-dev.20250915.1 + '@typescript/native-preview-win32-arm64': 7.0.0-dev.20250915.1 + '@typescript/native-preview-win32-x64': 7.0.0-dev.20250915.1 '@vitejs/plugin-react@5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))': dependencies: From 8fee29d0c311b15466af9e8e9731f685247380e0 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 07:50:45 +0000 Subject: [PATCH 12/26] chore(deps): bump @clerk/clerk-react from 5.46.1 to 5.47.0 Bumps [@clerk/clerk-react](https://github.com/clerk/javascript/tree/HEAD/packages/react) from 5.46.1 to 5.47.0. - [Release notes](https://github.com/clerk/javascript/releases) - [Changelog](https://github.com/clerk/javascript/blob/main/packages/react/CHANGELOG.md) - [Commits](https://github.com/clerk/javascript/commits/@clerk/clerk-react@5.47.0/packages/react) --- updated-dependencies: - dependency-name: "@clerk/clerk-react" dependency-version: 5.47.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dashboard/package.json | 4 ++-- pnpm-lock.yaml | 50 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 43 insertions(+), 11 deletions(-) diff --git a/dashboard/package.json b/dashboard/package.json index a8a12ef11..88dafeb32 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -28,7 +28,7 @@ "@adviser/cement": "^0.4.35", "@clerk/backend": "^2.12.1", "@clerk/clerk-js": "^5.91.2", - "@clerk/clerk-react": "^5.46.1", + "@clerk/clerk-react": "^5.47.0", "@fireproof/core": "workspace:0.0.0", "@fireproof/core-protocols-cloud": "workspace:0.0.0", "@fireproof/core-protocols-dashboard": "workspace:0.0.0", @@ -54,7 +54,7 @@ "zod": "^4.0.14" }, "devDependencies": { - "@clerk/clerk-react": "^5.46.1", + "@clerk/clerk-react": "^5.47.0", "@cloudflare/vite-plugin": "^1.10.1", "@cloudflare/workers-types": "^4.20250906.0", "@eslint/js": "^9.35.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d660af01..6955cdac1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1121,8 +1121,8 @@ importers: specifier: ^5.91.2 version: 5.91.2(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.0.14) '@clerk/clerk-react': - specifier: ^5.46.1 - version: 5.46.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^5.47.0 + version: 5.47.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@fireproof/core': specifier: workspace:0.0.0 version: link:../core/core @@ -2129,8 +2129,8 @@ packages: react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 - '@clerk/clerk-react@5.46.1': - resolution: {integrity: sha512-vKtIU3SHfIfsPFcLlw+I+El3VxN/io2aekGzAP7cKoClRPB4bE8GKsLvLIA326ff7yTDnvyrdxfEFY4ieyq5zg==} + '@clerk/clerk-react@5.47.0': + resolution: {integrity: sha512-of2Y6dg36eL7TwAP4DbGOMWW6DJpJSIuCn6g1jJqJkh4NGljHC7vz3H18OERRM5UQXmBG3twjC8CNAQxQrquRA==} engines: {node: '>=18.17.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 @@ -2152,10 +2152,26 @@ packages: react-dom: optional: true + '@clerk/shared@3.25.0': + resolution: {integrity: sha512-2Vb6NQqBA+1g7kfGct/OlSFmzU54/s4BQp3qeHwDqW1FgaU4MuXbqfBClI6AatxOC8Ux8W16Rvf705ViwFSxlw==} + engines: {node: '>=18.17.0'} + peerDependencies: + react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + '@clerk/types@4.84.1': resolution: {integrity: sha512-0lLz3u8u0Ot5ZUObU+8JJLOeiHHnruShJMeLAHNryp1d5zANPQquOyagamxbkoV1K2lAf8ld3liobs3EBzll6Q==} engines: {node: '>=18.17.0'} + '@clerk/types@4.86.0': + resolution: {integrity: sha512-YFaOYIAZWbpXehAmtgUB0YNf1v5b/hlwePvdqxlD5vdwrNsap28RpupWZat0hp1+PTtb9uAwSa5AFCOxkYLUJQ==} + engines: {node: '>=18.17.0'} + '@cloudflare/kv-asset-handler@0.4.0': resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} engines: {node: '>=18.0.0'} @@ -7533,21 +7549,33 @@ snapshots: - utf-8-validate - zod - '@clerk/clerk-react@5.46.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@clerk/clerk-react@5.47.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@clerk/shared': 3.24.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@clerk/types': 4.84.1 + '@clerk/shared': 3.25.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@clerk/types': 4.86.0 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) tslib: 2.8.1 '@clerk/localizations@3.24.2': dependencies: - '@clerk/types': 4.84.1 + '@clerk/types': 4.86.0 '@clerk/shared@3.24.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@clerk/types': 4.84.1 + '@clerk/types': 4.86.0 + dequal: 2.0.3 + glob-to-regexp: 0.4.1 + js-cookie: 3.0.5 + std-env: 3.9.0 + swr: 2.3.4(react@19.1.1) + optionalDependencies: + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + + '@clerk/shared@3.25.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@clerk/types': 4.86.0 dequal: 2.0.3 glob-to-regexp: 0.4.1 js-cookie: 3.0.5 @@ -7561,6 +7589,10 @@ snapshots: dependencies: csstype: 3.1.3 + '@clerk/types@4.86.0': + dependencies: + csstype: 3.1.3 + '@cloudflare/kv-asset-handler@0.4.0': dependencies: mime: 3.0.0 From eb08aed6f97355109ff42031ad0f2113f3da0e0e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 05:36:10 +0000 Subject: [PATCH 13/26] chore(deps-dev): bump tailwindcss from 3.4.17 to 4.1.13 Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss/tree/HEAD/packages/tailwindcss) from 3.4.17 to 4.1.13. - [Release notes](https://github.com/tailwindlabs/tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/tailwindcss/commits/v4.1.13/packages/tailwindcss) --- updated-dependencies: - dependency-name: tailwindcss dependency-version: 4.1.13 dependency-type: direct:development update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- dashboard/package.json | 2 +- pnpm-lock.yaml | 555 ++--------------------------------------- 2 files changed, 20 insertions(+), 537 deletions(-) diff --git a/dashboard/package.json b/dashboard/package.json index 88dafeb32..27c2257b7 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -77,7 +77,7 @@ "postcss": "^8.4.49", "prettier": "^3.4.2", "rollup-plugin-visualizer": "^6.0.1", - "tailwindcss": "^3.4.17", + "tailwindcss": "^4.1.13", "typescript": "^5.8.3", "vite": "^7.1.5", "vitest": "^3.2.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6955cdac1..5352bf611 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,7 +6,7 @@ settings: patchedDependencies: drizzle-kit: - hash: qurcebuunk6oqtltwdee4xtzuy + hash: 9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8 path: patches/drizzle-kit.patch importers: @@ -33,7 +33,7 @@ importers: version: 2.4.4 drizzle-kit: specifier: 0.30.6 - version: 0.30.6(patch_hash=qurcebuunk6oqtltwdee4xtzuy) + version: 0.30.6(patch_hash=9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8) eslint: specifier: ^9.35.0 version: 9.35.0(jiti@1.21.7) @@ -204,7 +204,7 @@ importers: version: link:../../../core/types/protocols/cloud drizzle-kit: specifier: 0.30.6 - version: 0.30.6(patch_hash=qurcebuunk6oqtltwdee4xtzuy) + version: 0.30.6(patch_hash=9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8) vitest: specifier: ^3.2.4 version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) @@ -259,7 +259,7 @@ importers: version: link:../../../cli drizzle-kit: specifier: 0.30.6 - version: 0.30.6(patch_hash=qurcebuunk6oqtltwdee4xtzuy) + version: 0.30.6(patch_hash=9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8) tsx: specifier: ^4.20.4 version: 4.20.5 @@ -329,7 +329,7 @@ importers: version: 24.3.1 drizzle-kit: specifier: 0.30.6 - version: 0.30.6(patch_hash=qurcebuunk6oqtltwdee4xtzuy) + version: 0.30.6(patch_hash=9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8) zx: specifier: ^8.8.1 version: 8.8.1 @@ -842,7 +842,7 @@ importers: dependencies: '@adviser/cement': specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + version: 0.4.35(typescript@5.9.2) '@fireproof/core-runtime': specifier: workspace:0.0.0 version: link:../../runtime @@ -1092,7 +1092,7 @@ importers: dependencies: '@adviser/cement': specifier: ^0.4.32 - version: 0.4.32(typescript@5.9.2) + version: 0.4.35(typescript@5.9.2) zod: specifier: ^4.0.14 version: 4.0.14 @@ -1149,7 +1149,7 @@ importers: version: 4.7.0(monaco-editor@0.52.2)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@tailwindcss/container-queries': specifier: ^0.1.1 - version: 0.1.1(tailwindcss@3.4.17) + version: 0.1.1(tailwindcss@4.1.13) '@tanstack/react-query': specifier: ^5.87.1 version: 5.87.1(react@19.1.1) @@ -1231,7 +1231,7 @@ importers: version: 10.4.21(postcss@8.5.6) drizzle-kit: specifier: 0.30.6 - version: 0.30.6(patch_hash=qurcebuunk6oqtltwdee4xtzuy) + version: 0.30.6(patch_hash=9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8) drizzle-orm: specifier: ^0.44.3 version: 0.44.5(@cloudflare/workers-types@4.20250906.0)(@libsql/client@0.15.15)(gel@2.1.1)(kysely@0.28.5) @@ -1260,8 +1260,8 @@ importers: specifier: ^6.0.1 version: 6.0.3(rollup@4.50.1) tailwindcss: - specifier: ^3.4.17 - version: 3.4.17 + specifier: ^4.1.13 + version: 4.1.13 typescript: specifier: ^5.8.3 version: 5.9.2 @@ -1379,141 +1379,6 @@ importers: specifier: ^8.8.1 version: 8.8.1 - vendor/level/abstract-level: - dependencies: - '@fireproof/level-supports': - specifier: workspace:* - version: link:../supports - '@fireproof/level-transcoder': - specifier: workspace:* - version: link:../transcoder - '@fireproof/maybe-combine-errors': - specifier: workspace:* - version: link:../maybe-combine-errors - '@fireproof/module-error': - specifier: workspace:* - version: link:../module-error - '@posva/event-emitter': - specifier: ^1.0.3 - version: 1.0.3 - devDependencies: - vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) - - vendor/level/functional-red-black-tree: - dependencies: - vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) - devDependencies: - '@fireproof/core-cli': - specifier: workspace:0.0.0 - version: link:../../../cli - '@fireproof/iota-array': - specifier: workspace:0.0.0 - version: link:../iota-array - '@vitest/browser': - specifier: ^3.2.4 - version: 3.2.4(playwright@1.55.0)(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) - - vendor/level/iota-array: - devDependencies: - '@fireproof/core-cli': - specifier: workspace:0.0.0 - version: link:../../../cli - '@vitest/browser': - specifier: ^3.2.4 - version: 3.2.4(playwright@1.55.0)(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) - playwright: - specifier: ^1.55.0 - version: 1.55.0 - playwright-chromium: - specifier: ^1.55.0 - version: 1.55.0 - vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) - - vendor/level/maybe-combine-errors: - devDependencies: - '@fireproof/core-cli': - specifier: workspace:0.0.0 - version: link:../../../cli - '@vitest/browser': - specifier: ^3.2.4 - version: 3.2.4(playwright@1.55.0)(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) - playwright: - specifier: ^1.55.0 - version: 1.55.0 - playwright-chromium: - specifier: ^1.55.0 - version: 1.55.0 - vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) - - vendor/level/module-error: - devDependencies: - '@fireproof/core-cli': - specifier: workspace:0.0.0 - version: link:../../../cli - '@vitest/browser': - specifier: ^3.2.4 - version: 3.2.4(playwright@1.55.0)(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) - playwright: - specifier: ^1.55.0 - version: 1.55.0 - playwright-chromium: - specifier: ^1.55.0 - version: 1.55.0 - vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) - - vendor/level/supports: - dependencies: - '@fireproof/level-transcoder': - specifier: workspace:* - version: link:../transcoder - '@vitest/browser': - specifier: ^3.2.4 - version: 3.2.4(playwright@1.55.0)(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) - playwright: - specifier: ^1.55.0 - version: 1.55.0 - playwright-chromium: - specifier: ^1.55.0 - version: 1.55.0 - devDependencies: - '@fireproof/core-cli': - specifier: workspace:* - version: link:../../../cli - vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) - - vendor/level/transcoder: - devDependencies: - '@fireproof/core-cli': - specifier: workspace:* - version: link:../../../cli - '@fireproof/module-error': - specifier: workspace:* - version: link:../module-error - '@vitest/browser': - specifier: ^3.2.4 - version: 3.2.4(playwright@1.55.0)(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) - playwright: - specifier: ^1.55.0 - version: 1.55.0 - playwright-chromium: - specifier: ^1.55.0 - version: 1.55.0 - vitest: - specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) - packages: '@adraffy/ens-normalize@1.11.0': @@ -1527,10 +1392,6 @@ packages: '@adviser/ts-xxhash@1.0.2': resolution: {integrity: sha512-WSryk539sIKc1tYAJ+05Fc7HnH+IPOjoGhtmZSXHHibPH1970EvGah0OG7wnPUn/a0gfG51cwQUtMwNosA+kCA==} - '@alloc/quick-lru@5.2.0': - resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} - engines: {node: '>=10'} - '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -3153,10 +3014,6 @@ packages: resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} engines: {node: 20 || >=22} - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3342,10 +3199,6 @@ packages: '@petamoriken/float16@3.9.2': resolution: {integrity: sha512-VgffxawQde93xKxT3qap3OH+meZf7VaSB5Sqd4Rqc+FP5alWbpOyan/7tRbOAvynjpG3GpdtAuGU/NdhQpmrog==} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@polka/url@1.0.0-next.29': resolution: {integrity: sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==} @@ -3358,9 +3211,6 @@ packages: '@poppinss/exception@1.2.2': resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} - '@posva/event-emitter@1.0.3': - resolution: {integrity: sha512-Cfq7RBo5xTwvc4LTJlyiuaQCe3wJfCqrgZv58C1Etqk0njydgFFd0lk00eeCHGwln2dAvS9se+xEIUCGSJs4GQ==} - '@remix-run/node-fetch-server@0.8.0': resolution: {integrity: sha512-8/sKegb4HrM6IdcQeU0KPhj9VOHm5SUqswJDHuMCS3mwbr/NRx078QDbySmn0xslahvvZoOENd7EnK40kWKxkg==} @@ -3857,10 +3707,6 @@ packages: resolution: {integrity: sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==} engines: {node: '>=12'} - ansi-regex@6.2.2: - resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==} - engines: {node: '>=12'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -3869,23 +3715,9 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - ansi-styles@6.2.3: - resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==} - engines: {node: '>=12'} - - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - archy@1.0.0: resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} - arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} @@ -3987,10 +3819,6 @@ packages: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} @@ -4052,10 +3880,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - camelcase-keys@6.2.2: resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} engines: {node: '>=8'} @@ -4100,10 +3924,6 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - classic-level@3.0.0: resolution: {integrity: sha512-yGy8j8LjPbN0Bh3+ygmyYvrmskVita92pD/zCoalfcC9XxZj6iDtZTAnz+ot7GG8p9KLTG+MZ84tSA4AhkgVZQ==} engines: {node: '>=18'} @@ -4141,10 +3961,6 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -4181,11 +3997,6 @@ packages: crypto-js@4.2.0: resolution: {integrity: sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==} - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} @@ -4286,9 +4097,6 @@ packages: resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} engines: {node: '>=8'} - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - doctrine@2.1.0: resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} engines: {node: '>=0.10.0'} @@ -4399,9 +4207,6 @@ packages: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.210: resolution: {integrity: sha512-20kSVv1tyNBN2VFsjCIJZfyvxqo7ylHPrJLME040f/030lzNMA7uQNpxtqJjWSNpccD8/2sqe53EAjrFPvQmjw==} @@ -4411,9 +4216,6 @@ packages: emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - env-paths@3.0.0: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -4723,10 +4525,6 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - foreground-child@3.3.1: - resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} - engines: {node: '>=14'} - formdata-polyfill@4.0.10: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} @@ -4804,10 +4602,6 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -4951,10 +4745,6 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - is-boolean-object@1.2.2: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} @@ -5102,9 +4892,6 @@ packages: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - jest-diff@29.7.0: resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5226,10 +5013,6 @@ packages: cpu: [x64, arm64, wasm32, arm] os: [darwin, linux, win32] - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -5269,9 +5052,6 @@ packages: loupe@3.2.1: resolution: {integrity: sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ==} - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -5366,10 +5146,6 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - module-error@1.0.2: resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} engines: {node: '>=10'} @@ -5391,9 +5167,6 @@ packages: multiformats@13.4.0: resolution: {integrity: sha512-Mkb/QcclrJxKC+vrcIFl297h52QcKh2Az/9A5vbWytbQt4225UWWWmIuSsKksdww9NkIeYcA7DkfftyLuC/JSg==} - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -5441,10 +5214,6 @@ packages: resolution: {integrity: sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==} engines: {node: '>=10'} - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - normalize-range@0.1.2: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} @@ -5453,10 +5222,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - object-inspect@1.13.4: resolution: {integrity: sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==} engines: {node: '>= 0.4'} @@ -5556,9 +5321,6 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} - package-json-from-dist@1.0.1: - resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -5586,10 +5348,6 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -5615,10 +5373,6 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - pify@4.0.1: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} @@ -5654,40 +5408,6 @@ packages: resolution: {integrity: sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==} engines: {node: '>= 0.4'} - postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - - postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - - postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - - postcss-nested@6.2.0: - resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} - engines: {node: '>=4'} - postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} @@ -5794,9 +5514,6 @@ packages: resolution: {integrity: sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==} engines: {node: '>=0.10.0'} - read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - read-pkg-up@7.0.1: resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} engines: {node: '>=8'} @@ -5809,10 +5526,6 @@ packages: resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} engines: {node: '>= 6'} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - recast@0.23.11: resolution: {integrity: sha512-YTUo+Flmw4ZXiWfQKGcwwc11KnoRAYgzAE2E7mXKCjSviTKShtxBsN6YUUBB2gtaBzKzeKunxhUwNHQuRryhWA==} engines: {node: '>= 4'} @@ -6054,10 +5767,6 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} @@ -6088,10 +5797,6 @@ packages: resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} engines: {node: '>=12'} - strip-ansi@7.1.2: - resolution: {integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==} - engines: {node: '>=12'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -6110,11 +5815,6 @@ packages: stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - supports-color@10.2.2: resolution: {integrity: sha512-SS+jx45GF1QjgEXQx4NJZV9ImqmO2NPz5FNsIHrsDjh2YsHnawpan7SNQ1o8NuhrbHZy9AZhIoCUiCeaW/C80g==} engines: {node: '>=18'} @@ -6139,17 +5839,8 @@ packages: tabbable@6.2.0: resolution: {integrity: sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==} - tailwindcss@3.4.17: - resolution: {integrity: sha512-w33E2aCvSDP0tW9RZuNXadXlkHXqFzSkQew/aIa2i/Sj8fThxwovwlXHSPXTbAHwEIhBFXAedUhP2tueAKP8Og==} - engines: {node: '>=14.0.0'} - hasBin: true - - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + tailwindcss@4.1.13: + resolution: {integrity: sha512-i+zidfmTqtwquj4hMEwdjshYYgMbOrPzb9a0M3ZgNa0JMoZeFC6bxZvO8yr8ozS6ix2SDz0+mvryPeBs2TFE+w==} timers-ext@0.1.8: resolution: {integrity: sha512-wFH7+SEAcKfJpfLPkrgMPvvwnEtj8W4IurvEyrKsDleXnKLCDw71w8jltvfLa8Rm4qQxxT4jmDBYbJG/z7qoww==} @@ -6217,9 +5908,6 @@ packages: typescript: optional: true - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - tsconfig-paths@3.15.0: resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} @@ -6513,10 +6201,6 @@ packages: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - write-file-atomic@5.0.1: resolution: {integrity: sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} @@ -6632,8 +6316,6 @@ snapshots: '@adviser/ts-xxhash@1.0.2': {} - '@alloc/quick-lru@5.2.0': {} - '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -8255,15 +7937,6 @@ snapshots: dependencies: '@isaacs/balanced-match': 4.0.1 - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.2 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 @@ -8451,9 +8124,6 @@ snapshots: '@petamoriken/float16@3.9.2': {} - '@pkgjs/parseargs@0.11.0': - optional: true - '@polka/url@1.0.0-next.29': {} '@poppinss/colors@4.1.5': @@ -8468,8 +8138,6 @@ snapshots: '@poppinss/exception@1.2.2': {} - '@posva/event-emitter@1.0.3': {} - '@remix-run/node-fetch-server@0.8.0': {} '@rolldown/pluginutils@1.0.0-beta.34': {} @@ -8581,9 +8249,9 @@ snapshots: dependencies: tslib: 2.8.1 - '@tailwindcss/container-queries@0.1.1(tailwindcss@3.4.17)': + '@tailwindcss/container-queries@0.1.1(tailwindcss@4.1.13)': dependencies: - tailwindcss: 3.4.17 + tailwindcss: 4.1.13 '@tanstack/query-core@5.87.1': {} @@ -8968,27 +8636,14 @@ snapshots: ansi-regex@6.2.0: {} - ansi-regex@6.2.2: {} - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 ansi-styles@5.2.0: {} - ansi-styles@6.2.3: {} - - any-promise@1.3.0: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - archy@1.0.0: {} - arg@5.0.2: {} - argparse@2.0.1: {} aria-query@5.3.0: @@ -9129,8 +8784,6 @@ snapshots: big-integer@1.6.52: {} - binary-extensions@2.3.0: {} - bl@4.1.0: dependencies: buffer: 5.7.1 @@ -9207,8 +8860,6 @@ snapshots: callsites@3.1.0: {} - camelcase-css@2.0.1: {} - camelcase-keys@6.2.2: dependencies: camelcase: 5.3.1 @@ -9250,18 +8901,6 @@ snapshots: check-error@2.1.1: {} - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - classic-level@3.0.0: dependencies: abstract-level: 3.1.0 @@ -9316,8 +8955,6 @@ snapshots: color-convert: 2.0.1 color-string: 1.9.1 - commander@4.1.1: {} - commondir@1.0.1: {} concat-map@0.0.1: {} @@ -9355,8 +8992,6 @@ snapshots: crypto-js@4.2.0: {} - cssesc@3.0.0: {} - csstype@3.1.3: {} d@1.0.2: @@ -9444,8 +9079,6 @@ snapshots: dependencies: path-type: 4.0.0 - dlv@1.1.3: {} - doctrine@2.1.0: dependencies: esutils: 2.0.3 @@ -9456,7 +9089,7 @@ snapshots: optionalDependencies: '@types/trusted-types': 2.0.7 - drizzle-kit@0.30.6(patch_hash=qurcebuunk6oqtltwdee4xtzuy): + drizzle-kit@0.30.6(patch_hash=9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8): dependencies: '@drizzle-team/brocli': 0.10.2 '@esbuild-kit/esm-loader': 2.6.5 @@ -9479,16 +9112,12 @@ snapshots: es-errors: 1.3.0 gopd: 1.2.0 - eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.210: {} electron-to-chromium@1.5.214: {} emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} - env-paths@3.0.0: {} error-ex@1.3.2: @@ -10015,11 +9644,6 @@ snapshots: dependencies: is-callable: 1.2.7 - foreground-child@3.3.1: - dependencies: - cross-spawn: 7.0.6 - signal-exit: 4.1.0 - formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 @@ -10108,15 +9732,6 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.4.5: - dependencies: - foreground-child: 3.3.1 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.1 - path-scurry: 1.11.1 - globals@14.0.0: {} globals@16.3.0: {} @@ -10237,10 +9852,6 @@ snapshots: dependencies: has-bigints: 1.1.0 - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - is-boolean-object@1.2.2: dependencies: call-bound: 1.0.4 @@ -10373,12 +9984,6 @@ snapshots: has-symbols: 1.1.0 set-function-name: 2.0.2 - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - jest-diff@29.7.0: dependencies: chalk: 4.1.2 @@ -10388,7 +9993,8 @@ snapshots: jest-get-type@29.6.3: {} - jiti@1.21.7: {} + jiti@1.21.7: + optional: true jose@6.1.0: {} @@ -10517,8 +10123,6 @@ snapshots: '@libsql/linux-x64-musl': 0.5.22 '@libsql/win32-x64-msvc': 0.5.22 - lilconfig@3.1.3: {} - lines-and-columns@1.2.4: {} locate-path@3.0.0: @@ -10556,8 +10160,6 @@ snapshots: loupe@3.2.1: {} - lru-cache@10.4.3: {} - lru-cache@5.1.1: dependencies: yallist: 3.1.1 @@ -10688,8 +10290,6 @@ snapshots: minimist@1.2.8: {} - minipass@7.1.2: {} - module-error@1.0.2: {} monaco-editor@0.52.2: {} @@ -10702,12 +10302,6 @@ snapshots: multiformats@13.4.0: {} - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - nanoid@3.3.11: {} napi-macros@2.2.2: {} @@ -10750,14 +10344,10 @@ snapshots: semver: 7.7.2 validate-npm-package-license: 3.0.4 - normalize-path@3.0.0: {} - normalize-range@0.1.2: {} object-assign@4.1.1: {} - object-hash@3.0.0: {} - object-inspect@1.13.4: {} object-keys@1.1.1: {} @@ -10886,8 +10476,6 @@ snapshots: p-try@2.2.0: {} - package-json-from-dist@1.0.1: {} - parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -10909,11 +10497,6 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - path-to-regexp@6.3.0: {} path-type@4.0.0: {} @@ -10928,8 +10511,6 @@ snapshots: picomatch@4.0.3: {} - pify@2.3.0: {} - pify@4.0.1: {} pirates@4.0.7: {} @@ -10956,35 +10537,6 @@ snapshots: possible-typed-array-names@1.1.0: {} - postcss-import@15.1.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.10 - - postcss-js@4.0.1(postcss@8.5.6): - dependencies: - camelcase-css: 2.0.1 - postcss: 8.5.6 - - postcss-load-config@4.0.2(postcss@8.5.6): - dependencies: - lilconfig: 3.1.3 - yaml: 2.8.1 - optionalDependencies: - postcss: 8.5.6 - - postcss-nested@6.2.0(postcss@8.5.6): - dependencies: - postcss: 8.5.6 - postcss-selector-parser: 6.1.2 - - postcss-selector-parser@6.1.2: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - postcss-value-parser@4.2.0: {} postcss@8.5.6: @@ -11074,10 +10626,6 @@ snapshots: react@19.1.1: {} - read-cache@1.0.0: - dependencies: - pify: 2.3.0 - read-pkg-up@7.0.1: dependencies: find-up: 4.1.0 @@ -11097,10 +10645,6 @@ snapshots: string_decoder: 1.3.0 util-deprecate: 1.0.2 - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - recast@0.23.11: dependencies: ast-types: 0.16.1 @@ -11412,12 +10956,6 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.2 - string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 @@ -11474,10 +11012,6 @@ snapshots: dependencies: ansi-regex: 6.2.0 - strip-ansi@7.1.2: - dependencies: - ansi-regex: 6.2.2 - strip-bom@3.0.0: {} strip-indent@3.0.0: @@ -11492,16 +11026,6 @@ snapshots: stylis@4.2.0: {} - sucrase@3.35.0: - dependencies: - '@jridgewell/gen-mapping': 0.3.13 - commander: 4.1.1 - glob: 10.4.5 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.7 - ts-interface-checker: 0.1.13 - supports-color@10.2.2: {} supports-color@7.2.0: @@ -11523,40 +11047,7 @@ snapshots: tabbable@6.2.0: {} - tailwindcss@3.4.17: - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.3 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.7 - lilconfig: 3.1.3 - micromatch: 4.0.8 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.1.1 - postcss: 8.5.6 - postcss-import: 15.1.0(postcss@8.5.6) - postcss-js: 4.0.1(postcss@8.5.6) - postcss-load-config: 4.0.2(postcss@8.5.6) - postcss-nested: 6.2.0(postcss@8.5.6) - postcss-selector-parser: 6.1.2 - resolve: 1.22.10 - sucrase: 3.35.0 - transitivePeerDependencies: - - ts-node - - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 + tailwindcss@4.1.13: {} timers-ext@0.1.8: dependencies: @@ -11605,8 +11096,6 @@ snapshots: optionalDependencies: typescript: 5.9.2 - ts-interface-checker@0.1.13: {} - tsconfig-paths@3.15.0: dependencies: '@types/json5': 0.0.29 @@ -11977,12 +11466,6 @@ snapshots: string-width: 4.2.3 strip-ansi: 6.0.1 - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.3 - string-width: 5.1.2 - strip-ansi: 7.1.2 - write-file-atomic@5.0.1: dependencies: imurmurhash: 0.1.4 From cd436ba0f2132a27b63ba11cdbb6feaffe3335df Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 05:33:59 +0000 Subject: [PATCH 14/26] chore(deps-dev): bump wrangler from 4.34.0 to 4.37.0 Bumps [wrangler](https://github.com/cloudflare/workers-sdk/tree/HEAD/packages/wrangler) from 4.34.0 to 4.37.0. - [Release notes](https://github.com/cloudflare/workers-sdk/releases) - [Changelog](https://github.com/cloudflare/workers-sdk/blob/main/packages/wrangler/CHANGELOG.md) - [Commits](https://github.com/cloudflare/workers-sdk/commits/wrangler@4.37.0/packages/wrangler) --- updated-dependencies: - dependency-name: wrangler dependency-version: 4.37.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- cloud/backend/cf-d1/package.json | 2 +- dashboard/package.json | 2 +- package.json | 2 +- pnpm-lock.yaml | 152 ++++++++++++++++--------------- 4 files changed, 82 insertions(+), 76 deletions(-) diff --git a/cloud/backend/cf-d1/package.json b/cloud/backend/cf-d1/package.json index c890b36d6..9343fe44e 100644 --- a/cloud/backend/cf-d1/package.json +++ b/cloud/backend/cf-d1/package.json @@ -58,7 +58,7 @@ "drizzle-kit": "0.30.6", "tsx": "^4.20.4", "vitest": "^3.2.4", - "wrangler": "^4.34.0", + "wrangler": "^4.37.0", "zx": "^8.8.1" } } diff --git a/dashboard/package.json b/dashboard/package.json index 27c2257b7..b631e20bc 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -81,7 +81,7 @@ "typescript": "^5.8.3", "vite": "^7.1.5", "vitest": "^3.2.4", - "wrangler": "^4.34.0", + "wrangler": "^4.37.0", "zx": "^8.8.1" } } diff --git a/package.json b/package.json index 634242bc4..70486748c 100644 --- a/package.json +++ b/package.json @@ -75,7 +75,7 @@ "typescript": "^5.8.3", "typescript-eslint": "^8.43.0", "vitest": "^3.2.4", - "wrangler": "^4.34.0" + "wrangler": "^4.37.0" }, "repository": { "type": "git", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5352bf611..195acb123 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -65,8 +65,8 @@ importers: specifier: ^3.2.4 version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) wrangler: - specifier: ^4.34.0 - version: 4.34.0(@cloudflare/workers-types@4.20250906.0) + specifier: ^4.37.0 + version: 4.37.0(@cloudflare/workers-types@4.20250906.0) cli: dependencies: @@ -267,8 +267,8 @@ importers: specifier: ^3.2.4 version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) wrangler: - specifier: ^4.34.0 - version: 4.34.0(@cloudflare/workers-types@4.20250906.0) + specifier: ^4.37.0 + version: 4.37.0(@cloudflare/workers-types@4.20250906.0) zx: specifier: ^8.8.1 version: 8.8.1 @@ -1195,7 +1195,7 @@ importers: devDependencies: '@cloudflare/vite-plugin': specifier: ^1.10.1 - version: 1.12.0(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(workerd@1.20250902.0)(wrangler@4.34.0(@cloudflare/workers-types@4.20250906.0)) + version: 1.12.0(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(workerd@1.20250906.0)(wrangler@4.37.0(@cloudflare/workers-types@4.20250906.0)) '@cloudflare/workers-types': specifier: ^4.20250906.0 version: 4.20250906.0 @@ -1272,8 +1272,8 @@ importers: specifier: ^3.2.4 version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) wrangler: - specifier: ^4.34.0 - version: 4.34.0(@cloudflare/workers-types@4.20250906.0) + specifier: ^4.37.0 + version: 4.37.0(@cloudflare/workers-types@4.20250906.0) zx: specifier: ^8.8.1 version: 8.8.1 @@ -2046,10 +2046,10 @@ packages: workerd: optional: true - '@cloudflare/unenv-preset@2.7.2': - resolution: {integrity: sha512-JY7Uf8GhWcbOMDZX8ke2czp9f9TijvJN4CpRBs3+WYN9U7jHpj3XaV+HHm78iHkAwTm/JeBHqyQNhq/PizynRA==} + '@cloudflare/unenv-preset@2.7.3': + resolution: {integrity: sha512-tsQQagBKjvpd9baa6nWVIv399ejiqcrUBBW6SZx6Z22+ymm+Odv5+cFimyuCsD/fC1fQTwfRmwXBNpzvHSeGCw==} peerDependencies: - unenv: 2.0.0-rc.20 + unenv: 2.0.0-rc.21 workerd: ^1.20250828.1 peerDependenciesMeta: workerd: @@ -2067,8 +2067,8 @@ packages: cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-64@1.20250902.0': - resolution: {integrity: sha512-mwC/YEtDUGfnjXdbW5Lya+bgODrpJ5RxxqpaTjtMJycqnjR0RZgVpOqISwGfBHIhseykU3ahPugM5t91XkBKTg==} + '@cloudflare/workerd-darwin-64@1.20250906.0': + resolution: {integrity: sha512-E+X/YYH9BmX0ew2j/mAWFif2z05NMNuhCTlNYEGLkqMe99K15UewBqajL9pMcMUKxylnlrEoK3VNxl33DkbnPA==} engines: {node: '>=16'} cpu: [x64] os: [darwin] @@ -2079,8 +2079,8 @@ packages: cpu: [arm64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20250902.0': - resolution: {integrity: sha512-5Wr6a5/ixoXuMPOvbprN8k9HhAHDBh8f7H5V4DN/Xb4ORoGkI9AbC5QPpYV0wa3Ncf+CRSGobdmZNyO24hRccA==} + '@cloudflare/workerd-darwin-arm64@1.20250906.0': + resolution: {integrity: sha512-X5apsZ1SFW4FYTM19ISHf8005FJMPfrcf4U5rO0tdj+TeJgQgXuZ57IG0WeW7SpLVeBo8hM6WC8CovZh41AfnA==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] @@ -2091,8 +2091,8 @@ packages: cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-64@1.20250902.0': - resolution: {integrity: sha512-1yJGt56VQBuG01nrhkRGoa1FGz7xQwJTrgewxt/MRRtigZTf84qJQiPQxyM7PQWCLREKa+JS7G8HFqvOwK7kZA==} + '@cloudflare/workerd-linux-64@1.20250906.0': + resolution: {integrity: sha512-rlKzWgsLnlQ5Nt9W69YBJKcmTmZbOGu0edUsenXPmc6wzULUxoQpi7ZE9k3TfTonJx4WoQsQlzCUamRYFsX+0Q==} engines: {node: '>=16'} cpu: [x64] os: [linux] @@ -2103,8 +2103,8 @@ packages: cpu: [arm64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20250902.0': - resolution: {integrity: sha512-ArDodWzfo0BVqMQGUgaOGV5Mzf8wEMUX8TJonExpGbYavoVXVDbp2rTLFRJg1vkFGpmw1teCtSoOjSDisFZQMg==} + '@cloudflare/workerd-linux-arm64@1.20250906.0': + resolution: {integrity: sha512-DdedhiQ+SeLzpg7BpcLrIPEZ33QKioJQ1wvL4X7nuLzEB9rWzS37NNNahQzc1+44rhG4fyiHbXBPOeox4B9XVA==} engines: {node: '>=16'} cpu: [arm64] os: [linux] @@ -2115,8 +2115,8 @@ packages: cpu: [x64] os: [win32] - '@cloudflare/workerd-windows-64@1.20250902.0': - resolution: {integrity: sha512-DT/o8ZSkmze1YGI7vgVt4ST+VYGb3tNChiFnOM9Z8YOejqKqbVvATB4gi/xMSnNR9CsKFqH4hHWDDtz+wf4uZg==} + '@cloudflare/workerd-windows-64@1.20250906.0': + resolution: {integrity: sha512-Q8Qjfs8jGVILnZL6vUpQ90q/8MTCYaGR3d1LGxZMBqte8Vr7xF3KFHPEy7tFs0j0mMjnqCYzlofmPNY+9ZaDRg==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -3355,8 +3355,8 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sindresorhus/is@7.0.2': - resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==} + '@sindresorhus/is@7.1.0': + resolution: {integrity: sha512-7F/yz2IphV39hiS2zB4QYVkivrptHHh0K8qJJd9HhuWSdvf8AN7NpebW3CcDZDBQsUPMoDKWsY2WWgW7bqOcfA==} engines: {node: '>=18'} '@speed-highlight/core@1.2.7': @@ -4079,8 +4079,8 @@ packages: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} - detect-libc@2.0.4: - resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} + detect-libc@2.1.0: + resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} engines: {node: '>=8'} dexie@4.2.0: @@ -4734,8 +4734,8 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + is-arrayish@0.3.4: + resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} @@ -5123,8 +5123,8 @@ packages: engines: {node: '>=18.0.0'} hasBin: true - miniflare@4.20250902.0: - resolution: {integrity: sha512-QHjI17yVDxDXsjDvX6GNRySx2uYsQJyiZ2MRBAsA0CFpAI2BcHd4oz0FIjbqgpZK+4Fhm7OKht/AfBNCd234Zg==} + miniflare@4.20250906.2: + resolution: {integrity: sha512-SXGv8Rdd91b6UXZ5eW3rde/gSJM6WVLItMNFV7u9axUVhACvpT4CB5p80OBfi2OOsGfOuFQ6M6s8tMxJbzioVw==} engines: {node: '>=18.0.0'} hasBin: true @@ -5701,8 +5701,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + simple-swizzle@0.2.4: + resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} sirv@3.0.1: resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} @@ -5991,6 +5991,10 @@ packages: undici-types@7.10.0: resolution: {integrity: sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==} + undici@7.14.0: + resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} + engines: {node: '>=20.18.1'} + undici@7.15.0: resolution: {integrity: sha512-7oZJCPvvMvTd0OlqWsIxTuItTpJBpU1tcbVl24FMn3xt3+VSunwUasmfPJRE57oNO1KsZ4PgA1xTdAX4hq8NyQ==} engines: {node: '>=20.18.1'} @@ -5998,8 +6002,8 @@ packages: unenv@2.0.0-rc.19: resolution: {integrity: sha512-t/OMHBNAkknVCI7bVB9OWjUUAwhVv9vsPIAGnNUxnu3FxPQN11rjh0sksLMzc3g7IlTgvHmOTl4JM7JHpcv5wA==} - unenv@2.0.0-rc.20: - resolution: {integrity: sha512-8tn4tAl9vD5nWoggAAPz28vf0FY8+pQAayhU94qD+ZkIbVKCBAH/E1MWEEmhb9Whn5EgouYVfBJB20RsTLRDdg==} + unenv@2.0.0-rc.21: + resolution: {integrity: sha512-Wj7/AMtE9MRnAXa6Su3Lk0LNCfqDYgfwVjwRFVum9U7wsto1imuHqk4kTm7Jni+5A0Hn7dttL6O/zjvUvoo+8A==} unicode-canonical-property-names-ecmascript@2.0.1: resolution: {integrity: sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==} @@ -6182,17 +6186,17 @@ packages: engines: {node: '>=16'} hasBin: true - workerd@1.20250902.0: - resolution: {integrity: sha512-rM+8ARYoy9gWJNPW89ERWyjbp7+m1hu6PFbehiP8FW9Hm5kNVo71lXFrkCP2HSsTP1OLfIU/IwanYOijJ0mQDw==} + workerd@1.20250906.0: + resolution: {integrity: sha512-ryVyEaqXPPsr/AxccRmYZZmDAkfQVjhfRqrNTlEeN8aftBk6Ca1u7/VqmfOayjCXrA+O547TauebU+J3IpvFXw==} engines: {node: '>=16'} hasBin: true - wrangler@4.34.0: - resolution: {integrity: sha512-iU+T8klWX6M/oN9y2PG8HrekoHwlBs/7wNMouyRToCJGn5EFtVl98a1fxxPCgkuUNZ2sKLrCyx/TlhgilIlqpQ==} + wrangler@4.37.0: + resolution: {integrity: sha512-W8IbQohQbUHFn4Hz2kh8gi0SdyFV/jyi9Uus+WrTz0F0Dc9W5qKPCjLbxibeE53+YPHyoI25l65O7nSlwX+Z6Q==} engines: {node: '>=18.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20250902.0 + '@cloudflare/workers-types': ^4.20250906.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -7279,21 +7283,21 @@ snapshots: dependencies: mime: 3.0.0 - '@cloudflare/unenv-preset@2.6.3(unenv@2.0.0-rc.19)(workerd@1.20250902.0)': + '@cloudflare/unenv-preset@2.6.3(unenv@2.0.0-rc.19)(workerd@1.20250906.0)': dependencies: unenv: 2.0.0-rc.19 optionalDependencies: - workerd: 1.20250902.0 + workerd: 1.20250906.0 - '@cloudflare/unenv-preset@2.7.2(unenv@2.0.0-rc.20)(workerd@1.20250902.0)': + '@cloudflare/unenv-preset@2.7.3(unenv@2.0.0-rc.21)(workerd@1.20250906.0)': dependencies: - unenv: 2.0.0-rc.20 + unenv: 2.0.0-rc.21 optionalDependencies: - workerd: 1.20250902.0 + workerd: 1.20250906.0 - '@cloudflare/vite-plugin@1.12.0(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(workerd@1.20250902.0)(wrangler@4.34.0(@cloudflare/workers-types@4.20250906.0))': + '@cloudflare/vite-plugin@1.12.0(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(workerd@1.20250906.0)(wrangler@4.37.0(@cloudflare/workers-types@4.20250906.0))': dependencies: - '@cloudflare/unenv-preset': 2.6.3(unenv@2.0.0-rc.19)(workerd@1.20250902.0) + '@cloudflare/unenv-preset': 2.6.3(unenv@2.0.0-rc.19)(workerd@1.20250906.0) '@remix-run/node-fetch-server': 0.8.0 get-port: 7.1.0 miniflare: 4.20250823.0 @@ -7301,7 +7305,7 @@ snapshots: tinyglobby: 0.2.14 unenv: 2.0.0-rc.19 vite: 7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) - wrangler: 4.34.0(@cloudflare/workers-types@4.20250906.0) + wrangler: 4.37.0(@cloudflare/workers-types@4.20250906.0) ws: 8.18.0 transitivePeerDependencies: - bufferutil @@ -7311,31 +7315,31 @@ snapshots: '@cloudflare/workerd-darwin-64@1.20250823.0': optional: true - '@cloudflare/workerd-darwin-64@1.20250902.0': + '@cloudflare/workerd-darwin-64@1.20250906.0': optional: true '@cloudflare/workerd-darwin-arm64@1.20250823.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20250902.0': + '@cloudflare/workerd-darwin-arm64@1.20250906.0': optional: true '@cloudflare/workerd-linux-64@1.20250823.0': optional: true - '@cloudflare/workerd-linux-64@1.20250902.0': + '@cloudflare/workerd-linux-64@1.20250906.0': optional: true '@cloudflare/workerd-linux-arm64@1.20250823.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20250902.0': + '@cloudflare/workerd-linux-arm64@1.20250906.0': optional: true '@cloudflare/workerd-windows-64@1.20250823.0': optional: true - '@cloudflare/workerd-windows-64@1.20250902.0': + '@cloudflare/workerd-windows-64@1.20250906.0': optional: true '@cloudflare/workers-types@4.20250906.0': {} @@ -8133,7 +8137,7 @@ snapshots: '@poppinss/dumper@0.6.4': dependencies: '@poppinss/colors': 4.1.5 - '@sindresorhus/is': 7.0.2 + '@sindresorhus/is': 7.1.0 supports-color: 10.2.2 '@poppinss/exception@1.2.2': {} @@ -8237,7 +8241,7 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@sindresorhus/is@7.0.2': {} + '@sindresorhus/is@7.1.0': {} '@speed-highlight/core@1.2.7': {} @@ -8948,7 +8952,7 @@ snapshots: color-string@1.9.1: dependencies: color-name: 1.1.4 - simple-swizzle: 0.2.2 + simple-swizzle: 0.2.4 color@4.2.3: dependencies: @@ -9067,7 +9071,7 @@ snapshots: detect-libc@2.0.2: {} - detect-libc@2.0.4: {} + detect-libc@2.1.0: {} dexie@4.2.0: {} @@ -9838,7 +9842,7 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.2: {} + is-arrayish@0.3.4: {} is-async-function@2.1.1: dependencies: @@ -10252,7 +10256,7 @@ snapshots: - bufferutil - utf-8-validate - miniflare@4.20250902.0: + miniflare@4.20250906.2: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.14.0 @@ -10261,8 +10265,8 @@ snapshots: glob-to-regexp: 0.4.1 sharp: 0.33.5 stoppable: 1.1.0 - undici: 7.15.0 - workerd: 1.20250902.0 + undici: 7.14.0 + workerd: 1.20250906.0 ws: 8.18.0 youch: 4.1.0-beta.10 zod: 3.22.3 @@ -10830,7 +10834,7 @@ snapshots: sharp@0.33.5: dependencies: color: 4.2.3 - detect-libc: 2.0.4 + detect-libc: 2.1.0 semver: 7.7.2 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 @@ -10893,9 +10897,9 @@ snapshots: signal-exit@4.1.0: {} - simple-swizzle@0.2.2: + simple-swizzle@0.2.4: dependencies: - is-arrayish: 0.3.2 + is-arrayish: 0.3.4 sirv@3.0.1: dependencies: @@ -11201,6 +11205,8 @@ snapshots: undici-types@7.10.0: {} + undici@7.14.0: {} + undici@7.15.0: {} unenv@2.0.0-rc.19: @@ -11211,7 +11217,7 @@ snapshots: pathe: 2.0.3 ufo: 1.6.1 - unenv@2.0.0-rc.20: + unenv@2.0.0-rc.21: dependencies: defu: 6.1.4 exsolve: 1.0.7 @@ -11435,24 +11441,24 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20250823.0 '@cloudflare/workerd-windows-64': 1.20250823.0 - workerd@1.20250902.0: + workerd@1.20250906.0: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20250902.0 - '@cloudflare/workerd-darwin-arm64': 1.20250902.0 - '@cloudflare/workerd-linux-64': 1.20250902.0 - '@cloudflare/workerd-linux-arm64': 1.20250902.0 - '@cloudflare/workerd-windows-64': 1.20250902.0 + '@cloudflare/workerd-darwin-64': 1.20250906.0 + '@cloudflare/workerd-darwin-arm64': 1.20250906.0 + '@cloudflare/workerd-linux-64': 1.20250906.0 + '@cloudflare/workerd-linux-arm64': 1.20250906.0 + '@cloudflare/workerd-windows-64': 1.20250906.0 - wrangler@4.34.0(@cloudflare/workers-types@4.20250906.0): + wrangler@4.37.0(@cloudflare/workers-types@4.20250906.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 - '@cloudflare/unenv-preset': 2.7.2(unenv@2.0.0-rc.20)(workerd@1.20250902.0) + '@cloudflare/unenv-preset': 2.7.3(unenv@2.0.0-rc.21)(workerd@1.20250906.0) blake3-wasm: 2.1.5 esbuild: 0.25.4 - miniflare: 4.20250902.0 + miniflare: 4.20250906.2 path-to-regexp: 6.3.0 - unenv: 2.0.0-rc.20 - workerd: 1.20250902.0 + unenv: 2.0.0-rc.21 + workerd: 1.20250906.0 optionalDependencies: '@cloudflare/workers-types': 4.20250906.0 fsevents: 2.3.3 From 2b5d283bb21f6bf73fc853ee84cacf0976fe897e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 07:56:09 +0000 Subject: [PATCH 15/26] chore(deps): bump @types/react from 19.1.12 to 19.1.13 Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 19.1.12 to 19.1.13. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) --- updated-dependencies: - dependency-name: "@types/react" dependency-version: 19.1.13 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- cloud/3rd-party/package.json | 2 +- cloud/todo-app/package.json | 2 +- dashboard/package.json | 2 +- pnpm-lock.yaml | 62 ++++++++++++++++++------------------ use-fireproof/package.json | 2 +- 5 files changed, 35 insertions(+), 35 deletions(-) diff --git a/cloud/3rd-party/package.json b/cloud/3rd-party/package.json index 64995241d..ec2bd97ca 100644 --- a/cloud/3rd-party/package.json +++ b/cloud/3rd-party/package.json @@ -44,7 +44,7 @@ "use-fireproof": "workspace:0.0.0" }, "devDependencies": { - "@types/react": "^19.1.11", + "@types/react": "^19.1.13", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.2", "vite": "^7.1.5" diff --git a/cloud/todo-app/package.json b/cloud/todo-app/package.json index af87788c7..46febf1c7 100644 --- a/cloud/todo-app/package.json +++ b/cloud/todo-app/package.json @@ -43,7 +43,7 @@ "dependencies": { "@adviser/cement": "^0.4.35", "@fireproof/vendor": "workspace:0.0.0", - "@types/react": "^19.1.11", + "@types/react": "^19.1.13", "react-dom": "^19.1.0", "use-fireproof": "workspace:0.0.0" }, diff --git a/dashboard/package.json b/dashboard/package.json index b631e20bc..d9f16f875 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -63,7 +63,7 @@ "@libsql/kysely-libsql": "^0.4.1", "@rollup/plugin-replace": "^6.0.1", "@testing-library/react": "^16.3.0", - "@types/react": "^19.1.11", + "@types/react": "^19.1.13", "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.2", "autoprefixer": "^10.4.20", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 195acb123..2914701b3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -136,11 +136,11 @@ importers: version: link:../../use-fireproof devDependencies: '@types/react': - specifier: ^19.1.11 - version: 19.1.12 + specifier: ^19.1.13 + version: 19.1.13 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.13) '@vitejs/plugin-react': specifier: ^5.0.2 version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1)) @@ -383,8 +383,8 @@ importers: specifier: workspace:0.0.0 version: link:../../vendor '@types/react': - specifier: ^19.1.11 - version: 19.1.12 + specifier: ^19.1.13 + version: 19.1.13 react: specifier: '>=18.0.0' version: 19.1.1 @@ -400,7 +400,7 @@ importers: version: link:../../cli '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.13) vite: specifier: ^7.1.5 version: 7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) @@ -1119,7 +1119,7 @@ importers: version: 2.12.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@clerk/clerk-js': specifier: ^5.91.2 - version: 5.91.2(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.0.14) + version: 5.91.2(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.0.14) '@clerk/clerk-react': specifier: ^5.47.0 version: 5.47.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -1216,13 +1216,13 @@ importers: version: 6.0.2(rollup@4.50.1) '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@types/react': - specifier: ^19.1.11 - version: 19.1.12 + specifier: ^19.1.13 + version: 19.1.13 '@types/react-dom': specifier: ^19.1.9 - version: 19.1.9(@types/react@19.1.12) + version: 19.1.9(@types/react@19.1.13) '@vitejs/plugin-react': specifier: ^5.0.2 version: 5.0.2(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1)) @@ -1328,13 +1328,13 @@ importers: version: link:../cli '@testing-library/react': specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@types/deno': specifier: ^2.3.0 version: 2.3.0 '@types/react': - specifier: ^19.1.11 - version: 19.1.12 + specifier: ^19.1.13 + version: 19.1.13 '@vitest/browser': specifier: ^3.2.4 version: 3.2.4(playwright@1.55.0)(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) @@ -3485,8 +3485,8 @@ packages: peerDependencies: '@types/react': ^19.0.0 - '@types/react@19.1.12': - resolution: {integrity: sha512-cMoR+FoAf/Jyq6+Df2/Z41jISvGZZ2eTlnsaJRptmZ76Caldwy1odD4xTr/gNV9VLj0AWgg/nmkevIyUfIIq5w==} + '@types/react@19.1.13': + resolution: {integrity: sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==} '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -7166,7 +7166,7 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@base-org/account@2.0.1(@types/react@19.1.12)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.0.14)': + '@base-org/account@2.0.1(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.0.14)': dependencies: '@noble/hashes': 1.4.0 clsx: 1.2.1 @@ -7175,7 +7175,7 @@ snapshots: ox: 0.6.9(typescript@5.9.2)(zod@4.0.14) preact: 10.24.2 viem: 2.37.4(typescript@5.9.2)(zod@4.0.14) - zustand: 5.0.3(@types/react@19.1.12)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) + zustand: 5.0.3(@types/react@19.1.13)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) transitivePeerDependencies: - '@types/react' - bufferutil @@ -7197,15 +7197,15 @@ snapshots: - react - react-dom - '@clerk/clerk-js@5.91.2(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.0.14)': + '@clerk/clerk-js@5.91.2(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.0.14)': dependencies: - '@base-org/account': 2.0.1(@types/react@19.1.12)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.0.14) + '@base-org/account': 2.0.1(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.0.14) '@clerk/localizations': 3.24.2 '@clerk/shared': 3.24.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@clerk/types': 4.84.1 '@coinbase/wallet-sdk': 4.3.0 '@emotion/cache': 11.11.0 - '@emotion/react': 11.11.1(@types/react@19.1.12)(react@19.1.1) + '@emotion/react': 11.11.1(@types/react@19.1.13)(react@19.1.1) '@floating-ui/react': 0.27.12(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@floating-ui/react-dom': 2.1.6(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@formkit/auto-animate': 0.8.4 @@ -7410,7 +7410,7 @@ snapshots: '@emotion/memoize@0.9.0': {} - '@emotion/react@11.11.1(@types/react@19.1.12)(react@19.1.1)': + '@emotion/react@11.11.1(@types/react@19.1.13)(react@19.1.1)': dependencies: '@babel/runtime': 7.28.4 '@emotion/babel-plugin': 11.13.5 @@ -7422,7 +7422,7 @@ snapshots: hoist-non-react-statics: 3.3.2 react: 19.1.1 optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 transitivePeerDependencies: - supports-color @@ -8275,15 +8275,15 @@ snapshots: picocolors: 1.1.1 pretty-format: 27.5.1 - '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.12))(@types/react@19.1.12)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@testing-library/react@16.3.0(@testing-library/dom@10.4.1)(@types/react-dom@19.1.9(@types/react@19.1.13))(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@babel/runtime': 7.28.3 '@testing-library/dom': 10.4.1 react: 19.1.1 react-dom: 19.1.1(react@19.1.1) optionalDependencies: - '@types/react': 19.1.12 - '@types/react-dom': 19.1.9(@types/react@19.1.12) + '@types/react': 19.1.13 + '@types/react-dom': 19.1.9(@types/react@19.1.13) '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.1)': dependencies: @@ -8369,11 +8369,11 @@ snapshots: '@types/parse-json@4.0.2': {} - '@types/react-dom@19.1.9(@types/react@19.1.12)': + '@types/react-dom@19.1.9(@types/react@19.1.13)': dependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 - '@types/react@19.1.12': + '@types/react@19.1.13': dependencies: csstype: 3.1.3 @@ -11526,9 +11526,9 @@ snapshots: zod@4.0.14: {} - zustand@5.0.3(@types/react@19.1.12)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)): + zustand@5.0.3(@types/react@19.1.13)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)): optionalDependencies: - '@types/react': 19.1.12 + '@types/react': 19.1.13 react: 19.1.1 use-sync-external-store: 1.5.0(react@19.1.1) diff --git a/use-fireproof/package.json b/use-fireproof/package.json index 2339d5577..768083092 100644 --- a/use-fireproof/package.json +++ b/use-fireproof/package.json @@ -51,7 +51,7 @@ "@fireproof/core-cli": "workspace:0.0.0", "@testing-library/react": "^16.3.0", "@types/deno": "^2.3.0", - "@types/react": "^19.1.11", + "@types/react": "^19.1.13", "@vitest/browser": "^3.2.4", "playwright": "^1.55.0", "playwright-chromium": "^1.55.0", From 2b11bab2a910c6cbe62a4b7efb8d87adc3330d1d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 07:52:05 +0000 Subject: [PATCH 16/26] chore(deps): bump @clerk/backend from 2.12.1 to 2.14.0 Bumps [@clerk/backend](https://github.com/clerk/javascript/tree/HEAD/packages/backend) from 2.12.1 to 2.14.0. - [Release notes](https://github.com/clerk/javascript/releases) - [Changelog](https://github.com/clerk/javascript/blob/main/packages/backend/CHANGELOG.md) - [Commits](https://github.com/clerk/javascript/commits/@clerk/backend@2.14.0/packages/backend) --- updated-dependencies: - dependency-name: "@clerk/backend" dependency-version: 2.14.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dashboard/package.json | 2 +- pnpm-lock.yaml | 26 +++++++++++++++++++------- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/dashboard/package.json b/dashboard/package.json index d9f16f875..3d16f654b 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -26,7 +26,7 @@ }, "dependencies": { "@adviser/cement": "^0.4.35", - "@clerk/backend": "^2.12.1", + "@clerk/backend": "^2.14.0", "@clerk/clerk-js": "^5.91.2", "@clerk/clerk-react": "^5.47.0", "@fireproof/core": "workspace:0.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2914701b3..30e13a7a5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1115,8 +1115,8 @@ importers: specifier: ^0.4.35 version: 0.4.35(typescript@5.9.2) '@clerk/backend': - specifier: ^2.12.1 - version: 2.12.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + specifier: ^2.14.0 + version: 2.14.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@clerk/clerk-js': specifier: ^5.91.2 version: 5.91.2(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.0.14) @@ -1979,8 +1979,8 @@ packages: '@base-org/account@2.0.1': resolution: {integrity: sha512-tySVNx+vd6XEynZL0uvB10uKiwnAfThr8AbKTwILVG86mPbLAhEOInQIk+uDnvpTvfdUhC1Bi5T/46JvFoLZQQ==} - '@clerk/backend@2.12.1': - resolution: {integrity: sha512-itpMTMrPaitY8wU6gvmG5GMLecAmyvWnNZB3FHntIhyS/na+bHcdYRyNlCksvh7s39f3wXuS2lwoUCanXEs7yg==} + '@clerk/backend@2.14.0': + resolution: {integrity: sha512-EaPXIaOb3IVyn+3NRX9GVZeKk1eL1ugWOiyPzy7hfJvxRYhTBatZrwd32+nCkQ6igvRpRG4O+o5vWS1tSErbrg==} engines: {node: '>=18.17.0'} '@clerk/clerk-js@5.91.2': @@ -7186,10 +7186,10 @@ snapshots: - utf-8-validate - zod - '@clerk/backend@2.12.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + '@clerk/backend@2.14.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: - '@clerk/shared': 3.24.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@clerk/types': 4.84.1 + '@clerk/shared': 3.25.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@clerk/types': 4.86.0 cookie: 1.0.2 standardwebhooks: 1.0.0 tslib: 2.8.1 @@ -7271,6 +7271,18 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) + '@clerk/shared@3.25.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': + dependencies: + '@clerk/types': 4.86.0 + dequal: 2.0.3 + glob-to-regexp: 0.4.1 + js-cookie: 3.0.5 + std-env: 3.9.0 + swr: 2.3.4(react@19.1.1) + optionalDependencies: + react: 19.1.1 + react-dom: 19.1.1(react@19.1.1) + '@clerk/types@4.84.1': dependencies: csstype: 3.1.3 From b5918cc8b2a95239ddaaba3c52f75e4341ac4e45 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 05:28:29 +0000 Subject: [PATCH 17/26] chore(deps): bump @tanstack/react-query from 5.87.1 to 5.87.4 Bumps [@tanstack/react-query](https://github.com/TanStack/query/tree/HEAD/packages/react-query) from 5.87.1 to 5.87.4. - [Release notes](https://github.com/TanStack/query/releases) - [Commits](https://github.com/TanStack/query/commits/v5.87.4/packages/react-query) --- updated-dependencies: - dependency-name: "@tanstack/react-query" dependency-version: 5.87.4 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- dashboard/package.json | 2 +- pnpm-lock.yaml | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/dashboard/package.json b/dashboard/package.json index 3d16f654b..ae3c3b803 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -38,7 +38,7 @@ "@fireproof/vendor": "^3.0.0", "@monaco-editor/react": "^4.7.0", "@tailwindcss/container-queries": "^0.1.1", - "@tanstack/react-query": "^5.87.1", + "@tanstack/react-query": "^5.87.4", "highlight.js": "^11.10.0", "i": "^0.3.7", "jose": "^6.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 30e13a7a5..2d342c342 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1151,8 +1151,8 @@ importers: specifier: ^0.1.1 version: 0.1.1(tailwindcss@4.1.13) '@tanstack/react-query': - specifier: ^5.87.1 - version: 5.87.1(react@19.1.1) + specifier: ^5.87.4 + version: 5.87.4(react@19.1.1) highlight.js: specifier: ^11.10.0 version: 11.11.1 @@ -3377,11 +3377,11 @@ packages: peerDependencies: tailwindcss: '>=3.2.0' - '@tanstack/query-core@5.87.1': - resolution: {integrity: sha512-HOFHVvhOCprrWvtccSzc7+RNqpnLlZ5R6lTmngb8aq7b4rc2/jDT0w+vLdQ4lD9bNtQ+/A4GsFXy030Gk4ollA==} + '@tanstack/query-core@5.87.4': + resolution: {integrity: sha512-uNsg6zMxraEPDVO2Bn+F3/ctHi+Zsk+MMpcN8h6P7ozqD088F6mFY5TfGM7zuyIrL7HKpDyu6QHfLWiDxh3cuw==} - '@tanstack/react-query@5.87.1': - resolution: {integrity: sha512-YKauf8jfMowgAqcxj96AHs+Ux3m3bWT1oSVKamaRPXSnW2HqSznnTCEkAVqctF1e/W9R/mPcyzzINIgpOH94qg==} + '@tanstack/react-query@5.87.4': + resolution: {integrity: sha512-T5GT/1ZaNsUXf5I3RhcYuT17I4CPlbZgyLxc/ZGv7ciS6esytlbjb3DgUFO6c8JWYMDpdjSWInyGZUErgzqhcA==} peerDependencies: react: ^18 || ^19 @@ -8269,11 +8269,11 @@ snapshots: dependencies: tailwindcss: 4.1.13 - '@tanstack/query-core@5.87.1': {} + '@tanstack/query-core@5.87.4': {} - '@tanstack/react-query@5.87.1(react@19.1.1)': + '@tanstack/react-query@5.87.4(react@19.1.1)': dependencies: - '@tanstack/query-core': 5.87.1 + '@tanstack/query-core': 5.87.4 react: 19.1.1 '@testing-library/dom@10.4.1': From b7fdded6a8a61ca891eee1904b85b08c926d8d83 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 05:33:07 +0000 Subject: [PATCH 18/26] chore(deps-dev): bump globals from 16.3.0 to 16.4.0 Bumps [globals](https://github.com/sindresorhus/globals) from 16.3.0 to 16.4.0. - [Release notes](https://github.com/sindresorhus/globals/releases) - [Commits](https://github.com/sindresorhus/globals/compare/v16.3.0...v16.4.0) --- updated-dependencies: - dependency-name: globals dependency-version: 16.4.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dashboard/package.json | 2 +- pnpm-lock.yaml | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/dashboard/package.json b/dashboard/package.json index ae3c3b803..d3891671c 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -73,7 +73,7 @@ "eslint-plugin-react": "^7.37.2", "eslint-plugin-react-hooks": "5.2.0", "eslint-plugin-react-refresh": "^0.4.16", - "globals": "^16.2.0", + "globals": "^16.4.0", "postcss": "^8.4.49", "prettier": "^3.4.2", "rollup-plugin-visualizer": "^6.0.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2d342c342..ac37d7984 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1248,8 +1248,8 @@ importers: specifier: ^0.4.16 version: 0.4.20(eslint@9.35.0(jiti@1.21.7)) globals: - specifier: ^16.2.0 - version: 16.3.0 + specifier: ^16.4.0 + version: 16.4.0 postcss: specifier: ^8.4.49 version: 8.5.6 @@ -4606,8 +4606,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@16.3.0: - resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} engines: {node: '>=18'} globalthis@1.0.4: @@ -9750,7 +9750,7 @@ snapshots: globals@14.0.0: {} - globals@16.3.0: {} + globals@16.4.0: {} globalthis@1.0.4: dependencies: From 056bc67cf29193234c727cba14f4b022dbe08d9d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 07:53:44 +0000 Subject: [PATCH 19/26] chore(deps): bump zod from 4.0.14 to 4.1.8 Bumps [zod](https://github.com/colinhacks/zod) from 4.0.14 to 4.1.8. - [Release notes](https://github.com/colinhacks/zod/releases) - [Commits](https://github.com/colinhacks/zod/compare/v4.0.14...v4.1.8) --- updated-dependencies: - dependency-name: zod dependency-version: 4.1.8 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- core/device-id/package.json | 2 +- core/keybag/package.json | 2 +- core/types/base/package.json | 2 +- core/types/protocols/cloud/package.json | 2 +- dashboard/package.json | 2 +- pnpm-lock.yaml | 46 ++++++++++++------------- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/core/device-id/package.json b/core/device-id/package.json index aded1a877..d9a6c10ec 100644 --- a/core/device-id/package.json +++ b/core/device-id/package.json @@ -42,7 +42,7 @@ "@fireproof/core-types-base": "workspace:0.0.0", "jose": "^6.0.12", "multiformats": "^13.4.0", - "zod": "^4.0.14" + "zod": "^4.1.8" }, "devDependencies": { "@fireproof/core-cli": "workspace:0.0.0", diff --git a/core/keybag/package.json b/core/keybag/package.json index 1cc5c8864..a7b56aa68 100644 --- a/core/keybag/package.json +++ b/core/keybag/package.json @@ -44,6 +44,6 @@ "@fireproof/vendor": "workspace:0.0.0", "jose": "^6.0.12", "multiformats": "^13.4.0", - "zod": "^4.0.14" + "zod": "^4.1.8" } } diff --git a/core/types/base/package.json b/core/types/base/package.json index 69f343dc8..259c19afb 100644 --- a/core/types/base/package.json +++ b/core/types/base/package.json @@ -43,6 +43,6 @@ "jose": "^6.0.12", "multiformats": "^13.4.0", "prolly-trees": "^1.0.4", - "zod": "^4.0.14" + "zod": "^4.1.8" } } diff --git a/core/types/protocols/cloud/package.json b/core/types/protocols/cloud/package.json index 0a8a2212f..6de363bf7 100644 --- a/core/types/protocols/cloud/package.json +++ b/core/types/protocols/cloud/package.json @@ -42,7 +42,7 @@ "@fireproof/vendor": "workspace:0.0.0", "jose": "^6.1.0", "multiformats": "^13.4.0", - "zod": "^4.0.14" + "zod": "^4.1.8" }, "devDependencies": { "@fireproof/core-cli": "workspace:0.0.0" diff --git a/dashboard/package.json b/dashboard/package.json index d3891671c..e484bf032 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -51,7 +51,7 @@ "react-simple-code-editor": "^0.14.1", "use-editable": "^2.3.3", "use-fireproof": "workspace:0.0.0", - "zod": "^4.0.14" + "zod": "^4.1.8" }, "devDependencies": { "@clerk/clerk-react": "^5.47.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ac37d7984..402dd4fb4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -556,8 +556,8 @@ importers: specifier: ^13.4.0 version: 13.4.0 zod: - specifier: ^4.0.14 - version: 4.0.14 + specifier: ^4.1.8 + version: 4.1.8 devDependencies: '@fireproof/core-cli': specifier: workspace:0.0.0 @@ -793,8 +793,8 @@ importers: specifier: ^13.4.0 version: 13.4.0 zod: - specifier: ^4.0.14 - version: 4.0.14 + specifier: ^4.1.8 + version: 4.1.8 core/protocols/cloud: dependencies: @@ -1032,8 +1032,8 @@ importers: specifier: ^1.0.4 version: 1.0.4 zod: - specifier: ^4.0.14 - version: 4.0.14 + specifier: ^4.1.8 + version: 4.1.8 core/types/blockstore: dependencies: @@ -1081,8 +1081,8 @@ importers: specifier: ^13.4.0 version: 13.4.0 zod: - specifier: ^4.0.14 - version: 4.0.14 + specifier: ^4.1.8 + version: 4.1.8 devDependencies: '@fireproof/core-cli': specifier: workspace:0.0.0 @@ -1190,8 +1190,8 @@ importers: specifier: workspace:0.0.0 version: link:../use-fireproof zod: - specifier: ^4.0.14 - version: 4.0.14 + specifier: ^4.1.8 + version: 4.1.8 devDependencies: '@cloudflare/vite-plugin': specifier: ^1.10.1 @@ -6281,8 +6281,8 @@ packages: zod@3.22.3: resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} - zod@4.0.14: - resolution: {integrity: sha512-nGFJTnJN6cM2v9kXL+SOBq3AtjQby3Mv5ySGFof5UGRHrRioSJ5iG680cYNjE/yWk671nROcpPj4hAS8nyLhSw==} + zod@4.1.8: + resolution: {integrity: sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ==} zustand@5.0.3: resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} @@ -7172,7 +7172,7 @@ snapshots: clsx: 1.2.1 eventemitter3: 5.0.1 idb-keyval: 6.2.1 - ox: 0.6.9(typescript@5.9.2)(zod@4.0.14) + ox: 0.6.9(typescript@5.9.2)(zod@4.1.8) preact: 10.24.2 viem: 2.37.4(typescript@5.9.2)(zod@4.0.14) zustand: 5.0.3(@types/react@19.1.13)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) @@ -8611,10 +8611,10 @@ snapshots: '@zxcvbn-ts/language-common@3.0.4': {} - abitype@1.1.0(typescript@5.9.2)(zod@4.0.14): + abitype@1.1.0(typescript@5.9.2)(zod@4.1.8): optionalDependencies: typescript: 5.9.2 - zod: 4.0.14 + zod: 4.1.8 abstract-level@3.1.0: dependencies: @@ -10427,21 +10427,21 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.6.9(typescript@5.9.2)(zod@4.0.14): + ox@0.6.9(typescript@5.9.2)(zod@4.1.8): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.9.2)(zod@4.0.14) + abitype: 1.1.0(typescript@5.9.2)(zod@4.1.8) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - zod - ox@0.9.3(typescript@5.9.2)(zod@4.0.14): + ox@0.9.3(typescript@5.9.2)(zod@4.1.8): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/ciphers': 1.3.0 @@ -10449,7 +10449,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.9.2)(zod@4.0.14) + abitype: 1.1.0(typescript@5.9.2)(zod@4.1.8) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.2 @@ -11291,15 +11291,15 @@ snapshots: varint@6.0.0: {} - viem@2.37.4(typescript@5.9.2)(zod@4.0.14): + viem@2.37.4(typescript@5.9.2)(zod@4.1.8): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.9.2)(zod@4.0.14) + abitype: 1.1.0(typescript@5.9.2)(zod@4.1.8) isows: 1.0.7(ws@8.18.3) - ox: 0.9.3(typescript@5.9.2)(zod@4.0.14) + ox: 0.9.3(typescript@5.9.2)(zod@4.1.8) ws: 8.18.3 optionalDependencies: typescript: 5.9.2 @@ -11536,7 +11536,7 @@ snapshots: zod@3.22.3: {} - zod@4.0.14: {} + zod@4.1.8: {} zustand@5.0.3(@types/react@19.1.13)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)): optionalDependencies: From a720f5b1fcdede927e8e6a624868db66c6c5a452 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 07:51:54 +0000 Subject: [PATCH 20/26] chore(deps): bump multiformats from 13.4.0 to 13.4.1 Bumps [multiformats](https://github.com/multiformats/js-multiformats) from 13.4.0 to 13.4.1. - [Release notes](https://github.com/multiformats/js-multiformats/releases) - [Changelog](https://github.com/multiformats/js-multiformats/blob/master/CHANGELOG.md) - [Commits](https://github.com/multiformats/js-multiformats/compare/v13.4.0...v13.4.1) --- updated-dependencies: - dependency-name: multiformats dependency-version: 13.4.1 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- cli/package.json | 2 +- core/blockstore/package.json | 3 +- core/device-id/package.json | 2 +- core/keybag/package.json | 2 +- core/runtime/package.json | 2 +- core/types/base/package.json | 2 +- core/types/blockstore/package.json | 2 +- core/types/protocols/cloud/package.json | 2 +- core/types/runtime/package.json | 2 +- dashboard/package.json | 2 +- package.json | 2 +- pnpm-lock.yaml | 66 ++++++++++++------------- 12 files changed, 44 insertions(+), 45 deletions(-) diff --git a/cli/package.json b/cli/package.json index 56f5a8ea5..2f1c36ce9 100644 --- a/cli/package.json +++ b/cli/package.json @@ -48,7 +48,7 @@ "find-up": "^7.0.0", "fs-extra": "^11.3.1", "jose": "^6.1.0", - "multiformats": "^13.4.0", + "multiformats": "^13.4.1", "semver": "^7.7.2", "zx": "^8.8.1" }, diff --git a/core/blockstore/package.json b/core/blockstore/package.json index a5e6e3f3a..0d11db0f6 100644 --- a/core/blockstore/package.json +++ b/core/blockstore/package.json @@ -52,8 +52,7 @@ "@ipld/dag-cbor": "^9.2.5", "@ipld/dag-json": "^10.2.5", "@web3-storage/pail": "^0.6.2", - "level": "^10.0.0", - "multiformats": "^13.4.0", + "multiformats": "^13.4.1", "p-map": "^7.0.3", "p-retry": "^7.0.0" } diff --git a/core/device-id/package.json b/core/device-id/package.json index d9a6c10ec..ff6abfe07 100644 --- a/core/device-id/package.json +++ b/core/device-id/package.json @@ -41,7 +41,7 @@ "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", "jose": "^6.0.12", - "multiformats": "^13.4.0", + "multiformats": "^13.4.1", "zod": "^4.1.8" }, "devDependencies": { diff --git a/core/keybag/package.json b/core/keybag/package.json index a7b56aa68..913d5fe98 100644 --- a/core/keybag/package.json +++ b/core/keybag/package.json @@ -43,7 +43,7 @@ "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", "jose": "^6.0.12", - "multiformats": "^13.4.0", + "multiformats": "^13.4.1", "zod": "^4.1.8" } } diff --git a/core/runtime/package.json b/core/runtime/package.json index cf6fcefa5..e4ecf09db 100644 --- a/core/runtime/package.json +++ b/core/runtime/package.json @@ -45,7 +45,7 @@ "@fireproof/vendor": "workspace:0.0.0", "cborg": "^4.2.15", "jose": "^6.1.0", - "multiformats": "^13.4.0" + "multiformats": "^13.4.1" }, "devDependencies": { "@fireproof/core-cli": "workspace:^" diff --git a/core/types/base/package.json b/core/types/base/package.json index 259c19afb..ff7be2e7d 100644 --- a/core/types/base/package.json +++ b/core/types/base/package.json @@ -41,7 +41,7 @@ "@fireproof/vendor": "workspace:0.0.0", "@web3-storage/pail": "^0.6.2", "jose": "^6.0.12", - "multiformats": "^13.4.0", + "multiformats": "^13.4.1", "prolly-trees": "^1.0.4", "zod": "^4.1.8" } diff --git a/core/types/blockstore/package.json b/core/types/blockstore/package.json index 21f9c9075..9743ff53e 100644 --- a/core/types/blockstore/package.json +++ b/core/types/blockstore/package.json @@ -41,7 +41,7 @@ "@fireproof/core-types-runtime": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", "@web3-storage/pail": "^0.6.2", - "multiformats": "^13.4.0" + "multiformats": "^13.4.1" }, "devDependencies": { "@fireproof/core-cli": "workspace:0.0.0" diff --git a/core/types/protocols/cloud/package.json b/core/types/protocols/cloud/package.json index 6de363bf7..6830e0b36 100644 --- a/core/types/protocols/cloud/package.json +++ b/core/types/protocols/cloud/package.json @@ -41,7 +41,7 @@ "@fireproof/core-types-blockstore": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", "jose": "^6.1.0", - "multiformats": "^13.4.0", + "multiformats": "^13.4.1", "zod": "^4.1.8" }, "devDependencies": { diff --git a/core/types/runtime/package.json b/core/types/runtime/package.json index 0615fe1c5..ef3be2364 100644 --- a/core/types/runtime/package.json +++ b/core/types/runtime/package.json @@ -38,6 +38,6 @@ "dependencies": { "@adviser/cement": "^0.4.35", "@fireproof/vendor": "workspace:0.0.0", - "multiformats": "^13.4.0" + "multiformats": "^13.4.1" } } diff --git a/dashboard/package.json b/dashboard/package.json index e484bf032..9561b36ec 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -43,7 +43,7 @@ "i": "^0.3.7", "jose": "^6.1.0", "minimatch": "^10.0.1", - "multiformats": "^13.4.0", + "multiformats": "^13.4.1", "react": "^19.1.0", "react-dom": "^19.1.0", "react-hook-form": "^7.62.0", diff --git a/package.json b/package.json index 70486748c..113c1184a 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "drizzle-kit": "0.30.6", "eslint": "^9.35.0", "eslint-plugin-import": "^2.32.0", - "multiformats": "^13.4.0", + "multiformats": "^13.4.1", "playwright": "^1.55.0", "playwright-chromium": "^1.55.0", "prettier": "^3.6.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 402dd4fb4..7e9f42e57 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -41,8 +41,8 @@ importers: specifier: ^2.32.0 version: 2.32.0(@typescript-eslint/parser@8.43.0(eslint@9.35.0(jiti@1.21.7))(typescript@5.9.2))(eslint@9.35.0(jiti@1.21.7)) multiformats: - specifier: ^13.4.0 - version: 13.4.0 + specifier: ^13.4.1 + version: 13.4.1 playwright: specifier: ^1.55.0 version: 1.55.0 @@ -98,8 +98,8 @@ importers: specifier: ^6.1.0 version: 6.1.0 multiformats: - specifier: ^13.4.0 - version: 13.4.0 + specifier: ^13.4.1 + version: 13.4.1 semver: specifier: ^7.7.2 version: 7.7.2 @@ -251,8 +251,8 @@ importers: specifier: ^4.9.7 version: 4.9.7 multiformats: - specifier: ^13.4.0 - version: 13.4.0 + specifier: ^13.4.1 + version: 13.4.1 devDependencies: '@fireproof/core-cli': specifier: workspace:0.0.0 @@ -505,8 +505,8 @@ importers: specifier: ^10.0.0 version: 10.0.0 multiformats: - specifier: ^13.4.0 - version: 13.4.0 + specifier: ^13.4.1 + version: 13.4.1 p-map: specifier: ^7.0.3 version: 7.0.3 @@ -553,8 +553,8 @@ importers: specifier: ^6.0.12 version: 6.1.0 multiformats: - specifier: ^13.4.0 - version: 13.4.0 + specifier: ^13.4.1 + version: 13.4.1 zod: specifier: ^4.1.8 version: 4.1.8 @@ -790,8 +790,8 @@ importers: specifier: ^6.0.12 version: 6.1.0 multiformats: - specifier: ^13.4.0 - version: 13.4.0 + specifier: ^13.4.1 + version: 13.4.1 zod: specifier: ^4.1.8 version: 4.1.8 @@ -889,8 +889,8 @@ importers: specifier: ^6.1.0 version: 6.1.0 multiformats: - specifier: ^13.4.0 - version: 13.4.0 + specifier: ^13.4.1 + version: 13.4.1 devDependencies: '@fireproof/core-cli': specifier: workspace:^ @@ -1026,8 +1026,8 @@ importers: specifier: ^6.0.12 version: 6.1.0 multiformats: - specifier: ^13.4.0 - version: 13.4.0 + specifier: ^13.4.1 + version: 13.4.1 prolly-trees: specifier: ^1.0.4 version: 1.0.4 @@ -1053,8 +1053,8 @@ importers: specifier: ^0.6.2 version: 0.6.2 multiformats: - specifier: ^13.4.0 - version: 13.4.0 + specifier: ^13.4.1 + version: 13.4.1 devDependencies: '@fireproof/core-cli': specifier: workspace:0.0.0 @@ -1078,8 +1078,8 @@ importers: specifier: ^6.1.0 version: 6.1.0 multiformats: - specifier: ^13.4.0 - version: 13.4.0 + specifier: ^13.4.1 + version: 13.4.1 zod: specifier: ^4.1.8 version: 4.1.8 @@ -1106,8 +1106,8 @@ importers: specifier: workspace:0.0.0 version: link:../../../vendor multiformats: - specifier: ^13.4.0 - version: 13.4.0 + specifier: ^13.4.1 + version: 13.4.1 dashboard: dependencies: @@ -1166,8 +1166,8 @@ importers: specifier: ^10.0.1 version: 10.0.3 multiformats: - specifier: ^13.4.0 - version: 13.4.0 + specifier: ^13.4.1 + version: 13.4.1 react: specifier: ^19.1.0 version: 19.1.1 @@ -5164,8 +5164,8 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - multiformats@13.4.0: - resolution: {integrity: sha512-Mkb/QcclrJxKC+vrcIFl297h52QcKh2Az/9A5vbWytbQt4225UWWWmIuSsKksdww9NkIeYcA7DkfftyLuC/JSg==} + multiformats@13.4.1: + resolution: {integrity: sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==} nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} @@ -7934,18 +7934,18 @@ snapshots: dependencies: '@ipld/dag-cbor': 9.2.5 cborg: 4.2.14 - multiformats: 13.4.0 + multiformats: 13.4.1 varint: 6.0.0 '@ipld/dag-cbor@9.2.5': dependencies: cborg: 4.2.15 - multiformats: 13.4.0 + multiformats: 13.4.1 '@ipld/dag-json@10.2.5': dependencies: cborg: 4.2.14 - multiformats: 13.4.0 + multiformats: 13.4.1 '@isaacs/balanced-match@4.0.1': {} @@ -8602,7 +8602,7 @@ snapshots: archy: 1.0.0 carstream: 2.3.0 cli-color: 2.0.4 - multiformats: 13.4.0 + multiformats: 13.4.1 sade: 1.8.1 '@zxcvbn-ts/core@3.0.4': @@ -8891,7 +8891,7 @@ snapshots: carstream@2.3.0: dependencies: '@ipld/dag-cbor': 9.2.5 - multiformats: 13.4.0 + multiformats: 13.4.1 uint8arraylist: 2.4.8 cborg@4.2.14: {} @@ -10316,7 +10316,7 @@ snapshots: ms@2.1.3: {} - multiformats@13.4.0: {} + multiformats@13.4.1: {} nanoid@3.3.11: {} @@ -11206,7 +11206,7 @@ snapshots: uint8arrays@5.1.0: dependencies: - multiformats: 13.4.0 + multiformats: 13.4.1 unbox-primitive@1.1.0: dependencies: From 635d59212ae6ac0ec025913297a2cfa5fbf610ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 05:34:17 +0000 Subject: [PATCH 21/26] chore(deps-dev): bump @cloudflare/vite-plugin from 1.12.0 to 1.13.1 Bumps [@cloudflare/vite-plugin](https://github.com/cloudflare/workers-sdk/tree/HEAD/packages/vite-plugin-cloudflare) from 1.12.0 to 1.13.1. - [Release notes](https://github.com/cloudflare/workers-sdk/releases) - [Changelog](https://github.com/cloudflare/workers-sdk/blob/main/packages/vite-plugin-cloudflare/CHANGELOG.md) - [Commits](https://github.com/cloudflare/workers-sdk/commits/@cloudflare/vite-plugin@1.13.1/packages/vite-plugin-cloudflare) --- updated-dependencies: - dependency-name: "@cloudflare/vite-plugin" dependency-version: 1.13.1 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dashboard/package.json | 2 +- pnpm-lock.yaml | 345 +++++++++++++---------------------------- 2 files changed, 110 insertions(+), 237 deletions(-) diff --git a/dashboard/package.json b/dashboard/package.json index 9561b36ec..3bc743ff5 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -55,7 +55,7 @@ }, "devDependencies": { "@clerk/clerk-react": "^5.47.0", - "@cloudflare/vite-plugin": "^1.10.1", + "@cloudflare/vite-plugin": "^1.13.1", "@cloudflare/workers-types": "^4.20250906.0", "@eslint/js": "^9.35.0", "@fireproof/core-cli": "workspace:0.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7e9f42e57..5c9066776 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,7 +66,7 @@ importers: version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) wrangler: specifier: ^4.37.0 - version: 4.37.0(@cloudflare/workers-types@4.20250906.0) + version: 4.37.1(@cloudflare/workers-types@4.20250906.0) cli: dependencies: @@ -251,8 +251,8 @@ importers: specifier: ^4.9.7 version: 4.9.7 multiformats: - specifier: ^13.4.1 - version: 13.4.1 + specifier: ^13.4.0 + version: 13.4.0 devDependencies: '@fireproof/core-cli': specifier: workspace:0.0.0 @@ -268,7 +268,7 @@ importers: version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) wrangler: specifier: ^4.37.0 - version: 4.37.0(@cloudflare/workers-types@4.20250906.0) + version: 4.37.1(@cloudflare/workers-types@4.20250906.0) zx: specifier: ^8.8.1 version: 8.8.1 @@ -501,9 +501,6 @@ importers: '@web3-storage/pail': specifier: ^0.6.2 version: 0.6.2 - level: - specifier: ^10.0.0 - version: 10.0.0 multiformats: specifier: ^13.4.1 version: 13.4.1 @@ -557,7 +554,7 @@ importers: version: 13.4.1 zod: specifier: ^4.1.8 - version: 4.1.8 + version: 4.1.9 devDependencies: '@fireproof/core-cli': specifier: workspace:0.0.0 @@ -794,7 +791,7 @@ importers: version: 13.4.1 zod: specifier: ^4.1.8 - version: 4.1.8 + version: 4.1.9 core/protocols/cloud: dependencies: @@ -1033,7 +1030,7 @@ importers: version: 1.0.4 zod: specifier: ^4.1.8 - version: 4.1.8 + version: 4.1.9 core/types/blockstore: dependencies: @@ -1082,7 +1079,7 @@ importers: version: 13.4.1 zod: specifier: ^4.1.8 - version: 4.1.8 + version: 4.1.9 devDependencies: '@fireproof/core-cli': specifier: workspace:0.0.0 @@ -1119,7 +1116,7 @@ importers: version: 2.14.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@clerk/clerk-js': specifier: ^5.91.2 - version: 5.91.2(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.0.14) + version: 5.91.2(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.1.9) '@clerk/clerk-react': specifier: ^5.47.0 version: 5.47.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -1152,7 +1149,7 @@ importers: version: 0.1.1(tailwindcss@4.1.13) '@tanstack/react-query': specifier: ^5.87.4 - version: 5.87.4(react@19.1.1) + version: 5.89.0(react@19.1.1) highlight.js: specifier: ^11.10.0 version: 11.11.1 @@ -1191,11 +1188,11 @@ importers: version: link:../use-fireproof zod: specifier: ^4.1.8 - version: 4.1.8 + version: 4.1.9 devDependencies: '@cloudflare/vite-plugin': - specifier: ^1.10.1 - version: 1.12.0(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(workerd@1.20250906.0)(wrangler@4.37.0(@cloudflare/workers-types@4.20250906.0)) + specifier: ^1.13.1 + version: 1.13.2(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(workerd@1.20250913.0)(wrangler@4.37.1(@cloudflare/workers-types@4.20250906.0)) '@cloudflare/workers-types': specifier: ^4.20250906.0 version: 4.20250906.0 @@ -1273,7 +1270,7 @@ importers: version: 3.2.4(@types/debug@4.1.12)(@types/node@24.3.1)(@vitest/browser@3.2.4)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) wrangler: specifier: ^4.37.0 - version: 4.37.0(@cloudflare/workers-types@4.20250906.0) + version: 4.37.1(@cloudflare/workers-types@4.20250906.0) zx: specifier: ^8.8.1 version: 8.8.1 @@ -2037,15 +2034,6 @@ packages: resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} engines: {node: '>=18.0.0'} - '@cloudflare/unenv-preset@2.6.3': - resolution: {integrity: sha512-Bj3i0kHAKFh/fViM8RT5ToV7w5Q8bGUR6yw4R0pkNktn559rmBMNf0+hkRmX8BmVH4WTo1Ye79zjkCxnmNt4+g==} - peerDependencies: - unenv: 2.0.0-rc.19 - workerd: ^1.20250802.0 - peerDependenciesMeta: - workerd: - optional: true - '@cloudflare/unenv-preset@2.7.3': resolution: {integrity: sha512-tsQQagBKjvpd9baa6nWVIv399ejiqcrUBBW6SZx6Z22+ymm+Odv5+cFimyuCsD/fC1fQTwfRmwXBNpzvHSeGCw==} peerDependencies: @@ -2055,68 +2043,38 @@ packages: workerd: optional: true - '@cloudflare/vite-plugin@1.12.0': - resolution: {integrity: sha512-DS6I7p9JazEJnSs7JCfLSQIUNNzruRt5JLbVpLDeagSEEZl2CF9TFMvfTfRdT3EQ2MghSmhNJFGRNoJUGBdCTQ==} + '@cloudflare/vite-plugin@1.13.2': + resolution: {integrity: sha512-AOIP8c0Yzp6waH+cfCTtvwAEUiDo68SLBruijwTkSVIp3yQwx9STWR+C8sZhH3CDnKRsxm/WpFRbQDB1a4xwZg==} peerDependencies: vite: ^6.1.0 || ^7.0.0 - wrangler: ^4.33.0 - - '@cloudflare/workerd-darwin-64@1.20250823.0': - resolution: {integrity: sha512-yRLJc1cQNqQYcDViOk7kpTXnR5XuBP7B/Ms5KBdlQ6eTr2Vsg9mfKqWKInjzY8/Cx+p+Sic2Tbld42gcYkiM2A==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] + wrangler: ^4.37.1 - '@cloudflare/workerd-darwin-64@1.20250906.0': - resolution: {integrity: sha512-E+X/YYH9BmX0ew2j/mAWFif2z05NMNuhCTlNYEGLkqMe99K15UewBqajL9pMcMUKxylnlrEoK3VNxl33DkbnPA==} + '@cloudflare/workerd-darwin-64@1.20250913.0': + resolution: {integrity: sha512-926bBGIYDsF0FraaPQV0hO9LymEN+Zdkkm1qOHxU1c58oAxr5b9Tpe4d1z1EqOD0DTFhjn7V/AxKcZBaBBhO/A==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20250823.0': - resolution: {integrity: sha512-KJnikUe6J29Ga1QMPKNCc8eHD56DdBlu5XE5LoBH/AYRrbS5UI1d5F844hUWoFKJb8KRaPIH9F849HZWfNa1vw==} + '@cloudflare/workerd-darwin-arm64@1.20250913.0': + resolution: {integrity: sha512-uy5nJIt44CpICgfsKQotji31cn39i71e2KqE/zeAmmgYp/tzl2cXotVeDtynqqEsloox7hl/eBY5sU0x99N8oQ==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20250906.0': - resolution: {integrity: sha512-X5apsZ1SFW4FYTM19ISHf8005FJMPfrcf4U5rO0tdj+TeJgQgXuZ57IG0WeW7SpLVeBo8hM6WC8CovZh41AfnA==} - engines: {node: '>=16'} - cpu: [arm64] - os: [darwin] - - '@cloudflare/workerd-linux-64@1.20250823.0': - resolution: {integrity: sha512-4QFXq4eDWEAK5QjGxRe0XUTBax1Fgarc08HETL6q0y/KPZp2nOTLfjLjklTn/qEiztafNFoJEIwhkiknHeOi/g==} + '@cloudflare/workerd-linux-64@1.20250913.0': + resolution: {integrity: sha512-khdF7MBi8L9WIt3YyWBQxipMny0J3gG824kurZiRACZmPdQ1AOzkKybDDXC3EMcF8TmGMRqKRUGQIB/25PwJuQ==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-64@1.20250906.0': - resolution: {integrity: sha512-rlKzWgsLnlQ5Nt9W69YBJKcmTmZbOGu0edUsenXPmc6wzULUxoQpi7ZE9k3TfTonJx4WoQsQlzCUamRYFsX+0Q==} - engines: {node: '>=16'} - cpu: [x64] - os: [linux] - - '@cloudflare/workerd-linux-arm64@1.20250823.0': - resolution: {integrity: sha512-sODSrSVe4W/maoBu76qb0sJGBhxhSM2Q2tg/+G7q1IPgRZSzArMKIPrW6nBnmBrrG1O0X6aoAdID6w5hfuEM4g==} - engines: {node: '>=16'} - cpu: [arm64] - os: [linux] - - '@cloudflare/workerd-linux-arm64@1.20250906.0': - resolution: {integrity: sha512-DdedhiQ+SeLzpg7BpcLrIPEZ33QKioJQ1wvL4X7nuLzEB9rWzS37NNNahQzc1+44rhG4fyiHbXBPOeox4B9XVA==} + '@cloudflare/workerd-linux-arm64@1.20250913.0': + resolution: {integrity: sha512-KF5nIOt5YIYGfinY0YEe63JqaAx8WSFDHTLQpytTX+N/oJWEJu3KW6evU1TfX7o8gRlRsc0j/evcZ1vMfbDy5g==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20250823.0': - resolution: {integrity: sha512-WaNqUOXUnrcEI+i2NI4+okA9CrJMI9n2XTfVtDg/pLvcA/ZPTz23MEFMZU1splr4SslS1th1NBO38RMPnDB4rA==} - engines: {node: '>=16'} - cpu: [x64] - os: [win32] - - '@cloudflare/workerd-windows-64@1.20250906.0': - resolution: {integrity: sha512-Q8Qjfs8jGVILnZL6vUpQ90q/8MTCYaGR3d1LGxZMBqte8Vr7xF3KFHPEy7tFs0j0mMjnqCYzlofmPNY+9ZaDRg==} + '@cloudflare/workerd-windows-64@1.20250913.0': + resolution: {integrity: sha512-m/PMnVdaUB7ymW8BvDIC5xrU16hBDCBpyf9/4y9YZSQOYTVXihxErX8kaW9H9A/I6PTX081NmxxhTbb/n+EQRg==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -3355,8 +3313,8 @@ packages: '@sinclair/typebox@0.27.8': resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@sindresorhus/is@7.1.0': - resolution: {integrity: sha512-7F/yz2IphV39hiS2zB4QYVkivrptHHh0K8qJJd9HhuWSdvf8AN7NpebW3CcDZDBQsUPMoDKWsY2WWgW7bqOcfA==} + '@sindresorhus/is@7.0.2': + resolution: {integrity: sha512-d9xRovfKNz1SKieM0qJdO+PQonjnnIfSNWfHYnBSJ9hkjm0ZPw6HlxscDXYstp3z+7V2GOFHc+J0CYrYTjqCJw==} engines: {node: '>=18'} '@speed-highlight/core@1.2.7': @@ -3377,11 +3335,11 @@ packages: peerDependencies: tailwindcss: '>=3.2.0' - '@tanstack/query-core@5.87.4': - resolution: {integrity: sha512-uNsg6zMxraEPDVO2Bn+F3/ctHi+Zsk+MMpcN8h6P7ozqD088F6mFY5TfGM7zuyIrL7HKpDyu6QHfLWiDxh3cuw==} + '@tanstack/query-core@5.89.0': + resolution: {integrity: sha512-joFV1MuPhSLsKfTzwjmPDrp8ENfZ9N23ymFu07nLfn3JCkSHy0CFgsyhHTJOmWaumC/WiNIKM0EJyduCF/Ih/Q==} - '@tanstack/react-query@5.87.4': - resolution: {integrity: sha512-T5GT/1ZaNsUXf5I3RhcYuT17I4CPlbZgyLxc/ZGv7ciS6esytlbjb3DgUFO6c8JWYMDpdjSWInyGZUErgzqhcA==} + '@tanstack/react-query@5.89.0': + resolution: {integrity: sha512-SXbtWSTSRXyBOe80mszPxpEbaN4XPRUp/i0EfQK1uyj3KCk/c8FuPJNIRwzOVe/OU3rzxrYtiNabsAmk1l714A==} peerDependencies: react: ^18 || ^19 @@ -4079,8 +4037,8 @@ packages: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} - detect-libc@2.1.0: - resolution: {integrity: sha512-vEtk+OcP7VBRtQZ1EJ3bdgzSfBjgnEalLTp5zjJrS+2Z1w2KZly4SBdac/WDU3hhsNAZ9E8SC96ME4Ey8MZ7cg==} + detect-libc@2.0.4: + resolution: {integrity: sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==} engines: {node: '>=8'} dexie@4.2.0: @@ -4734,8 +4692,8 @@ packages: is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - is-arrayish@0.3.4: - resolution: {integrity: sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA==} + is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} is-async-function@2.1.1: resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==} @@ -5118,13 +5076,8 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - miniflare@4.20250823.0: - resolution: {integrity: sha512-ofQRQ6rb/5P4nsz/J+xptdrN4zvYUm0wuezbKfaxbAGiIVTsM1vd+Pta5MtZwdQ6BKLM9tKMtU0rnbTzy3wntQ==} - engines: {node: '>=18.0.0'} - hasBin: true - - miniflare@4.20250906.2: - resolution: {integrity: sha512-SXGv8Rdd91b6UXZ5eW3rde/gSJM6WVLItMNFV7u9axUVhACvpT4CB5p80OBfi2OOsGfOuFQ6M6s8tMxJbzioVw==} + miniflare@4.20250913.0: + resolution: {integrity: sha512-EwlUOxtvb9UKg797YZMCtNga/VSAnKG/kbJX9YGqXJoAJjDhDeAeqyCWjSl9O6EzCZNhtHuW7ZV0pD5Hec617g==} engines: {node: '>=18.0.0'} hasBin: true @@ -5164,6 +5117,9 @@ packages: ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + multiformats@13.4.0: + resolution: {integrity: sha512-Mkb/QcclrJxKC+vrcIFl297h52QcKh2Az/9A5vbWytbQt4225UWWWmIuSsKksdww9NkIeYcA7DkfftyLuC/JSg==} + multiformats@13.4.1: resolution: {integrity: sha512-VqO6OSvLrFVAYYjgsr8tyv62/rCQhPgsZUXLTqoFLSgdkgiUYKYeArbt1uWLlEpkjxQe+P0+sHlbPEte1Bi06Q==} @@ -5701,8 +5657,8 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} - simple-swizzle@0.2.4: - resolution: {integrity: sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw==} + simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} sirv@3.0.1: resolution: {integrity: sha512-FoqMu0NCGBLCcAkS1qA+XJIQTR6/JHfQXl+uGteNCQ76T91DMUjPa9xfmeqMY3z80nLSg9yQmNjK0Px6RWsH/A==} @@ -5855,10 +5811,6 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - tinyglobby@0.2.14: - resolution: {integrity: sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.15: resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} engines: {node: '>=12.0.0'} @@ -5995,13 +5947,6 @@ packages: resolution: {integrity: sha512-Vqs8HTzjpQXZeXdpsfChQTlafcMQaaIwnGwLam1wudSSjlJeQ3bw1j+TLPePgrCnCpUXx7Ba5Pdpf5OBih62NQ==} engines: {node: '>=20.18.1'} - undici@7.15.0: - resolution: {integrity: sha512-7oZJCPvvMvTd0OlqWsIxTuItTpJBpU1tcbVl24FMn3xt3+VSunwUasmfPJRE57oNO1KsZ4PgA1xTdAX4hq8NyQ==} - engines: {node: '>=20.18.1'} - - unenv@2.0.0-rc.19: - resolution: {integrity: sha512-t/OMHBNAkknVCI7bVB9OWjUUAwhVv9vsPIAGnNUxnu3FxPQN11rjh0sksLMzc3g7IlTgvHmOTl4JM7JHpcv5wA==} - unenv@2.0.0-rc.21: resolution: {integrity: sha512-Wj7/AMtE9MRnAXa6Su3Lk0LNCfqDYgfwVjwRFVum9U7wsto1imuHqk4kTm7Jni+5A0Hn7dttL6O/zjvUvoo+8A==} @@ -6181,22 +6126,17 @@ packages: resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} engines: {node: '>=0.10.0'} - workerd@1.20250823.0: - resolution: {integrity: sha512-95lToK9zeaC7bX5ZmlP/wz6zqoUPBk3hhec1JjEMGZrxsXY9cPRkjWNCcjDctQ17U97vjMcY/ymchgx7w8Cfmg==} + workerd@1.20250913.0: + resolution: {integrity: sha512-y3J1NjCL10SAWDwgGdcNSRyOVod/dWNypu64CCdjj8VS4/k+Ofa/fHaJGC1stbdzAB1tY2P35Ckgm1PU5HKWiw==} engines: {node: '>=16'} hasBin: true - workerd@1.20250906.0: - resolution: {integrity: sha512-ryVyEaqXPPsr/AxccRmYZZmDAkfQVjhfRqrNTlEeN8aftBk6Ca1u7/VqmfOayjCXrA+O547TauebU+J3IpvFXw==} - engines: {node: '>=16'} - hasBin: true - - wrangler@4.37.0: - resolution: {integrity: sha512-W8IbQohQbUHFn4Hz2kh8gi0SdyFV/jyi9Uus+WrTz0F0Dc9W5qKPCjLbxibeE53+YPHyoI25l65O7nSlwX+Z6Q==} + wrangler@4.37.1: + resolution: {integrity: sha512-ntm1OsIB2r/f7b5bfS84Lzz5QEx3zn4vUsn1JOVz/+7bw8triyytnxbp68OwOimF1vL5A9sQ0Nd+L6u8F3hECg==} engines: {node: '>=18.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20250906.0 + '@cloudflare/workers-types': ^4.20250913.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -6281,8 +6221,11 @@ packages: zod@3.22.3: resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} - zod@4.1.8: - resolution: {integrity: sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ==} + zod@4.0.14: + resolution: {integrity: sha512-nGFJTnJN6cM2v9kXL+SOBq3AtjQby3Mv5ySGFof5UGRHrRioSJ5iG680cYNjE/yWk671nROcpPj4hAS8nyLhSw==} + + zod@4.1.9: + resolution: {integrity: sha512-HI32jTq0AUAC125z30E8bQNz0RQ+9Uc+4J7V97gLYjZVKRjeydPgGt6dvQzFrav7MYOUGFqqOGiHpA/fdbd0cQ==} zustand@5.0.3: resolution: {integrity: sha512-14fwWQtU3pH4dE0dOpdMiWjddcH+QzKIgk1cl8epwSE7yag43k/AD/m4L6+K7DytAOr9gGBe3/EXj9g7cdostg==} @@ -7166,15 +7109,15 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@base-org/account@2.0.1(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.0.14)': + '@base-org/account@2.0.1(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.1.9)': dependencies: '@noble/hashes': 1.4.0 clsx: 1.2.1 eventemitter3: 5.0.1 idb-keyval: 6.2.1 - ox: 0.6.9(typescript@5.9.2)(zod@4.1.8) + ox: 0.6.9(typescript@5.9.2)(zod@4.1.9) preact: 10.24.2 - viem: 2.37.4(typescript@5.9.2)(zod@4.0.14) + viem: 2.37.4(typescript@5.9.2)(zod@4.1.9) zustand: 5.0.3(@types/react@19.1.13)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)) transitivePeerDependencies: - '@types/react' @@ -7197,9 +7140,9 @@ snapshots: - react - react-dom - '@clerk/clerk-js@5.91.2(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.0.14)': + '@clerk/clerk-js@5.91.2(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.1.9)': dependencies: - '@base-org/account': 2.0.1(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.0.14) + '@base-org/account': 2.0.1(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.1.9) '@clerk/localizations': 3.24.2 '@clerk/shared': 3.24.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@clerk/types': 4.84.1 @@ -7271,18 +7214,6 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - '@clerk/shared@3.25.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': - dependencies: - '@clerk/types': 4.86.0 - dequal: 2.0.3 - glob-to-regexp: 0.4.1 - js-cookie: 3.0.5 - std-env: 3.9.0 - swr: 2.3.4(react@19.1.1) - optionalDependencies: - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - '@clerk/types@4.84.1': dependencies: csstype: 3.1.3 @@ -7295,63 +7226,42 @@ snapshots: dependencies: mime: 3.0.0 - '@cloudflare/unenv-preset@2.6.3(unenv@2.0.0-rc.19)(workerd@1.20250906.0)': - dependencies: - unenv: 2.0.0-rc.19 - optionalDependencies: - workerd: 1.20250906.0 - - '@cloudflare/unenv-preset@2.7.3(unenv@2.0.0-rc.21)(workerd@1.20250906.0)': + '@cloudflare/unenv-preset@2.7.3(unenv@2.0.0-rc.21)(workerd@1.20250913.0)': dependencies: unenv: 2.0.0-rc.21 optionalDependencies: - workerd: 1.20250906.0 + workerd: 1.20250913.0 - '@cloudflare/vite-plugin@1.12.0(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(workerd@1.20250906.0)(wrangler@4.37.0(@cloudflare/workers-types@4.20250906.0))': + '@cloudflare/vite-plugin@1.13.2(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(workerd@1.20250913.0)(wrangler@4.37.1(@cloudflare/workers-types@4.20250906.0))': dependencies: - '@cloudflare/unenv-preset': 2.6.3(unenv@2.0.0-rc.19)(workerd@1.20250906.0) + '@cloudflare/unenv-preset': 2.7.3(unenv@2.0.0-rc.21)(workerd@1.20250913.0) '@remix-run/node-fetch-server': 0.8.0 get-port: 7.1.0 - miniflare: 4.20250823.0 + miniflare: 4.20250913.0 picocolors: 1.1.1 - tinyglobby: 0.2.14 - unenv: 2.0.0-rc.19 + tinyglobby: 0.2.15 + unenv: 2.0.0-rc.21 vite: 7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1) - wrangler: 4.37.0(@cloudflare/workers-types@4.20250906.0) + wrangler: 4.37.1(@cloudflare/workers-types@4.20250906.0) ws: 8.18.0 transitivePeerDependencies: - bufferutil - utf-8-validate - workerd - '@cloudflare/workerd-darwin-64@1.20250823.0': - optional: true - - '@cloudflare/workerd-darwin-64@1.20250906.0': - optional: true - - '@cloudflare/workerd-darwin-arm64@1.20250823.0': + '@cloudflare/workerd-darwin-64@1.20250913.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20250906.0': + '@cloudflare/workerd-darwin-arm64@1.20250913.0': optional: true - '@cloudflare/workerd-linux-64@1.20250823.0': + '@cloudflare/workerd-linux-64@1.20250913.0': optional: true - '@cloudflare/workerd-linux-64@1.20250906.0': + '@cloudflare/workerd-linux-arm64@1.20250913.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20250823.0': - optional: true - - '@cloudflare/workerd-linux-arm64@1.20250906.0': - optional: true - - '@cloudflare/workerd-windows-64@1.20250823.0': - optional: true - - '@cloudflare/workerd-windows-64@1.20250906.0': + '@cloudflare/workerd-windows-64@1.20250913.0': optional: true '@cloudflare/workers-types@4.20250906.0': {} @@ -8149,7 +8059,7 @@ snapshots: '@poppinss/dumper@0.6.4': dependencies: '@poppinss/colors': 4.1.5 - '@sindresorhus/is': 7.1.0 + '@sindresorhus/is': 7.0.2 supports-color: 10.2.2 '@poppinss/exception@1.2.2': {} @@ -8253,7 +8163,7 @@ snapshots: '@sinclair/typebox@0.27.8': {} - '@sindresorhus/is@7.1.0': {} + '@sindresorhus/is@7.0.2': {} '@speed-highlight/core@1.2.7': {} @@ -8269,11 +8179,11 @@ snapshots: dependencies: tailwindcss: 4.1.13 - '@tanstack/query-core@5.87.4': {} + '@tanstack/query-core@5.89.0': {} - '@tanstack/react-query@5.87.4(react@19.1.1)': + '@tanstack/react-query@5.89.0(react@19.1.1)': dependencies: - '@tanstack/query-core': 5.87.4 + '@tanstack/query-core': 5.89.0 react: 19.1.1 '@testing-library/dom@10.4.1': @@ -8611,10 +8521,10 @@ snapshots: '@zxcvbn-ts/language-common@3.0.4': {} - abitype@1.1.0(typescript@5.9.2)(zod@4.1.8): + abitype@1.1.0(typescript@5.9.2)(zod@4.1.9): optionalDependencies: typescript: 5.9.2 - zod: 4.1.8 + zod: 4.1.9 abstract-level@3.1.0: dependencies: @@ -8964,7 +8874,7 @@ snapshots: color-string@1.9.1: dependencies: color-name: 1.1.4 - simple-swizzle: 0.2.4 + simple-swizzle: 0.2.2 color@4.2.3: dependencies: @@ -9083,7 +8993,7 @@ snapshots: detect-libc@2.0.2: {} - detect-libc@2.1.0: {} + detect-libc@2.0.4: {} dexie@4.2.0: {} @@ -9854,7 +9764,7 @@ snapshots: is-arrayish@0.2.1: {} - is-arrayish@0.3.4: {} + is-arrayish@0.3.2: {} is-async-function@2.1.1: dependencies: @@ -10250,25 +10160,7 @@ snapshots: min-indent@1.0.1: {} - miniflare@4.20250823.0: - dependencies: - '@cspotcode/source-map-support': 0.8.1 - acorn: 8.14.0 - acorn-walk: 8.3.2 - exit-hook: 2.2.1 - glob-to-regexp: 0.4.1 - sharp: 0.33.5 - stoppable: 1.1.0 - undici: 7.15.0 - workerd: 1.20250823.0 - ws: 8.18.0 - youch: 4.1.0-beta.10 - zod: 3.22.3 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - miniflare@4.20250906.2: + miniflare@4.20250913.0: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.14.0 @@ -10278,7 +10170,7 @@ snapshots: sharp: 0.33.5 stoppable: 1.1.0 undici: 7.14.0 - workerd: 1.20250906.0 + workerd: 1.20250913.0 ws: 8.18.0 youch: 4.1.0-beta.10 zod: 3.22.3 @@ -10316,6 +10208,8 @@ snapshots: ms@2.1.3: {} + multiformats@13.4.0: {} + multiformats@13.4.1: {} nanoid@3.3.11: {} @@ -10427,21 +10321,21 @@ snapshots: object-keys: 1.1.1 safe-push-apply: 1.0.0 - ox@0.6.9(typescript@5.9.2)(zod@4.1.8): + ox@0.6.9(typescript@5.9.2)(zod@4.1.9): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/curves': 1.9.7 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.9.2)(zod@4.1.8) + abitype: 1.1.0(typescript@5.9.2)(zod@4.1.9) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.2 transitivePeerDependencies: - zod - ox@0.9.3(typescript@5.9.2)(zod@4.1.8): + ox@0.9.3(typescript@5.9.2)(zod@4.1.9): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/ciphers': 1.3.0 @@ -10449,7 +10343,7 @@ snapshots: '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.9.2)(zod@4.1.8) + abitype: 1.1.0(typescript@5.9.2)(zod@4.1.9) eventemitter3: 5.0.1 optionalDependencies: typescript: 5.9.2 @@ -10846,7 +10740,7 @@ snapshots: sharp@0.33.5: dependencies: color: 4.2.3 - detect-libc: 2.1.0 + detect-libc: 2.0.4 semver: 7.7.2 optionalDependencies: '@img/sharp-darwin-arm64': 0.33.5 @@ -10909,9 +10803,9 @@ snapshots: signal-exit@4.1.0: {} - simple-swizzle@0.2.4: + simple-swizzle@0.2.2: dependencies: - is-arrayish: 0.3.4 + is-arrayish: 0.3.2 sirv@3.0.1: dependencies: @@ -11076,11 +10970,6 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.14: - dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 - tinyglobby@0.2.15: dependencies: fdir: 6.5.0(picomatch@4.0.3) @@ -11219,16 +11108,6 @@ snapshots: undici@7.14.0: {} - undici@7.15.0: {} - - unenv@2.0.0-rc.19: - dependencies: - defu: 6.1.4 - exsolve: 1.0.7 - ohash: 2.0.11 - pathe: 2.0.3 - ufo: 1.6.1 - unenv@2.0.0-rc.21: dependencies: defu: 6.1.4 @@ -11291,15 +11170,15 @@ snapshots: varint@6.0.0: {} - viem@2.37.4(typescript@5.9.2)(zod@4.1.8): + viem@2.37.4(typescript@5.9.2)(zod@4.1.9): dependencies: '@noble/curves': 1.9.1 '@noble/hashes': 1.8.0 '@scure/bip32': 1.7.0 '@scure/bip39': 1.6.0 - abitype: 1.1.0(typescript@5.9.2)(zod@4.1.8) + abitype: 1.1.0(typescript@5.9.2)(zod@4.1.9) isows: 1.0.7(ws@8.18.3) - ox: 0.9.3(typescript@5.9.2)(zod@4.1.8) + ox: 0.9.3(typescript@5.9.2)(zod@4.1.9) ws: 8.18.3 optionalDependencies: typescript: 5.9.2 @@ -11445,32 +11324,24 @@ snapshots: word-wrap@1.2.5: {} - workerd@1.20250823.0: + workerd@1.20250913.0: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20250823.0 - '@cloudflare/workerd-darwin-arm64': 1.20250823.0 - '@cloudflare/workerd-linux-64': 1.20250823.0 - '@cloudflare/workerd-linux-arm64': 1.20250823.0 - '@cloudflare/workerd-windows-64': 1.20250823.0 + '@cloudflare/workerd-darwin-64': 1.20250913.0 + '@cloudflare/workerd-darwin-arm64': 1.20250913.0 + '@cloudflare/workerd-linux-64': 1.20250913.0 + '@cloudflare/workerd-linux-arm64': 1.20250913.0 + '@cloudflare/workerd-windows-64': 1.20250913.0 - workerd@1.20250906.0: - optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20250906.0 - '@cloudflare/workerd-darwin-arm64': 1.20250906.0 - '@cloudflare/workerd-linux-64': 1.20250906.0 - '@cloudflare/workerd-linux-arm64': 1.20250906.0 - '@cloudflare/workerd-windows-64': 1.20250906.0 - - wrangler@4.37.0(@cloudflare/workers-types@4.20250906.0): + wrangler@4.37.1(@cloudflare/workers-types@4.20250906.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 - '@cloudflare/unenv-preset': 2.7.3(unenv@2.0.0-rc.21)(workerd@1.20250906.0) + '@cloudflare/unenv-preset': 2.7.3(unenv@2.0.0-rc.21)(workerd@1.20250913.0) blake3-wasm: 2.1.5 esbuild: 0.25.4 - miniflare: 4.20250906.2 + miniflare: 4.20250913.0 path-to-regexp: 6.3.0 unenv: 2.0.0-rc.21 - workerd: 1.20250906.0 + workerd: 1.20250913.0 optionalDependencies: '@cloudflare/workers-types': 4.20250906.0 fsevents: 2.3.3 @@ -11536,7 +11407,9 @@ snapshots: zod@3.22.3: {} - zod@4.1.8: {} + zod@4.0.14: {} + + zod@4.1.9: {} zustand@5.0.3(@types/react@19.1.13)(react@19.1.1)(use-sync-external-store@1.5.0(react@19.1.1)): optionalDependencies: From 580435b01387fd30c3c1666b3ccd115653b47dc1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 07:52:39 +0000 Subject: [PATCH 22/26] chore(deps): bump @clerk/clerk-js from 5.91.2 to 5.93.0 Bumps [@clerk/clerk-js](https://github.com/clerk/javascript/tree/HEAD/packages/clerk-js) from 5.91.2 to 5.93.0. - [Release notes](https://github.com/clerk/javascript/releases) - [Changelog](https://github.com/clerk/javascript/blob/main/packages/clerk-js/CHANGELOG.md) - [Commits](https://github.com/clerk/javascript/commits/@clerk/clerk-js@5.93.0/packages/clerk-js) --- updated-dependencies: - dependency-name: "@clerk/clerk-js" dependency-version: 5.93.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- dashboard/package.json | 2 +- pnpm-lock.yaml | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/dashboard/package.json b/dashboard/package.json index 3bc743ff5..a8a319c16 100644 --- a/dashboard/package.json +++ b/dashboard/package.json @@ -27,7 +27,7 @@ "dependencies": { "@adviser/cement": "^0.4.35", "@clerk/backend": "^2.14.0", - "@clerk/clerk-js": "^5.91.2", + "@clerk/clerk-js": "^5.93.0", "@clerk/clerk-react": "^5.47.0", "@fireproof/core": "workspace:0.0.0", "@fireproof/core-protocols-cloud": "workspace:0.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5c9066776..a483e887b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1980,8 +1980,8 @@ packages: resolution: {integrity: sha512-EaPXIaOb3IVyn+3NRX9GVZeKk1eL1ugWOiyPzy7hfJvxRYhTBatZrwd32+nCkQ6igvRpRG4O+o5vWS1tSErbrg==} engines: {node: '>=18.17.0'} - '@clerk/clerk-js@5.91.2': - resolution: {integrity: sha512-6oqaLGo9dLXBginLoQwLtKsZwaayvHIbGgl5CQr6wPMSxrUai7DxAGwZCfE7CvqsRzJrn6cvUGSH00lnU2fMGA==} + '@clerk/clerk-js@5.93.0': + resolution: {integrity: sha512-nhcoJCwrH7wIgiGU9J1Bnzp1zzuZFIYNQ9Bmmg/ISMYtKFgqbnNFFKJunAIQq69tMK77aKTslPMrA+/jq9w9gA==} engines: {node: '>=18.17.0'} peerDependencies: react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 @@ -1994,8 +1994,8 @@ packages: react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 - '@clerk/localizations@3.24.2': - resolution: {integrity: sha512-ElOLHQJALrWbnRpdausIsdGMmRzHYjl0WxAfkaP+u+NSk/4rIlsNsdvMCSqktC5pZUIqvRGGKKLhNFrvO/gx+g==} + '@clerk/localizations@3.25.1': + resolution: {integrity: sha512-l2wXzvawzcuh17e15cGBZS3ZTx14409tOHPdqojSvWsvZtO3FzC1UJw69JylCdcBcCEQWsF22Y/4sIy6hRo+gw==} engines: {node: '>=18.17.0'} '@clerk/shared@3.24.1': @@ -5374,8 +5374,8 @@ packages: preact@10.24.2: resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==} - preact@10.27.1: - resolution: {integrity: sha512-V79raXEWch/rbqoNc7nT9E4ep7lu+mI3+sBmfRD4i1M73R3WLYcCtdI0ibxGVf4eQL8ZIz2nFacqEC+rmnOORQ==} + preact@10.27.2: + resolution: {integrity: sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -6006,8 +6006,8 @@ packages: varint@6.0.0: resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} - viem@2.37.4: - resolution: {integrity: sha512-1ig5O6l1wJmaw3yrSrUimjRLQEZon2ymTqSDjdntu6Bry1/tLC2GClXeS3SiCzrifpLxzfCLQWDITYVTBA10KA==} + viem@2.37.6: + resolution: {integrity: sha512-b+1IozQ8TciVQNdQUkOH5xtFR0z7ZxR8pyloENi/a+RA408lv4LoX12ofwoiT3ip0VRhO5ni1em//X0jn/eW0g==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -7186,7 +7186,7 @@ snapshots: react-dom: 19.1.1(react@19.1.1) tslib: 2.8.1 - '@clerk/localizations@3.24.2': + '@clerk/localizations@3.25.1': dependencies: '@clerk/types': 4.86.0 @@ -7271,7 +7271,7 @@ snapshots: '@noble/hashes': 1.8.0 clsx: 1.2.1 eventemitter3: 5.0.1 - preact: 10.27.1 + preact: 10.27.2 '@cspotcode/source-map-support@0.8.1': dependencies: @@ -10457,7 +10457,7 @@ snapshots: preact@10.24.2: {} - preact@10.27.1: {} + preact@10.27.2: {} prelude-ls@1.2.1: {} From ab2647e4a84cef6ead944e4c4fa4552dba2693b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 07:55:00 +0000 Subject: [PATCH 23/26] chore(deps-dev): bump deno from 2.4.4 to 2.5.0 Bumps [deno](https://github.com/denoland/deno) from 2.4.4 to 2.5.0. - [Release notes](https://github.com/denoland/deno/releases) - [Changelog](https://github.com/denoland/deno/blob/main/Releases.md) - [Commits](https://github.com/denoland/deno/compare/v2.4.4...v2.5.0) --- updated-dependencies: - dependency-name: deno dependency-version: 2.5.0 dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- package.json | 2 +- pnpm-lock.yaml | 58 +++++++++++++++++++++++++------------------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/package.json b/package.json index 113c1184a..2088552ae 100644 --- a/package.json +++ b/package.json @@ -63,7 +63,7 @@ "@types/deno": "^2.3.0", "@types/node": "^24.3.1", "@typescript/native-preview": "7.0.0-dev.20250915.1", - "deno": "^2.4.3", + "deno": "^2.5.0", "drizzle-kit": "0.30.6", "eslint": "^9.35.0", "eslint-plugin-import": "^2.32.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a483e887b..d5a8d9e9d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -29,8 +29,8 @@ importers: specifier: 7.0.0-dev.20250915.1 version: 7.0.0-dev.20250915.1 deno: - specifier: ^2.4.3 - version: 2.4.4 + specifier: ^2.5.0 + version: 2.5.0 drizzle-kit: specifier: 0.30.6 version: 0.30.6(patch_hash=9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8) @@ -2089,33 +2089,33 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@deno/darwin-arm64@2.4.4': - resolution: {integrity: sha512-mFxNliHJs3zHT515AoTICEYSv/zJTjXAU+QIZNXK3Yt1PaEHqbWYhxsMOp39Apb8ACgaAcGcJxPzsc6qecQVSg==} + '@deno/darwin-arm64@2.5.0': + resolution: {integrity: sha512-1x8VmjfO7nPhVdKuRO0vVCSyxbzbhoiYpwTsM6c1dI1LLjLq/yLszHyStH0SE0gd+9XMVgrXLdrRPWrePW7WmQ==} cpu: [arm64] os: [darwin] - '@deno/darwin-x64@2.4.4': - resolution: {integrity: sha512-3/15MyCithm77VFI9yesyLp+TLH5h3GQ0A2EEQISsWbJDWIOTMIAaL4suJHY0GMUKQZKOngoeyXyTqmGA/y0JQ==} + '@deno/darwin-x64@2.5.0': + resolution: {integrity: sha512-yiWqH+L4G7DLX/LSr/x2kImn1DaDh/G14TLdLuLBzcdwZ9XuM/lNjgSe7xc35WlhyXAkf0J/K2yi7kNqHJoItw==} cpu: [x64] os: [darwin] - '@deno/linux-arm64-glibc@2.4.4': - resolution: {integrity: sha512-M0TnQI8j0JxI2A8nFkFMV4bGSzqFU25PX9ZR50OI58Eurp5WY+tmisAusWReVVPtgL7jaVpkS0sEIJyufVIxmw==} + '@deno/linux-arm64-glibc@2.5.0': + resolution: {integrity: sha512-bkx6ITvYh9xS/GVbzzriotM3MA+3RIzDxohvmPosYfDzIckcROzTvvXkl73pLwvAnDfdbw7DF1qpUmU480vv4w==} cpu: [arm64] os: [linux] - '@deno/linux-x64-glibc@2.4.4': - resolution: {integrity: sha512-KsNEe5nWgz54XdTkI06jgUXgXQzQ//mI2u24qPclSm/GNkAwAZMnzcBPnRSZ0gCbLJpy8nDc7fc+j2ITlLifVw==} + '@deno/linux-x64-glibc@2.5.0': + resolution: {integrity: sha512-0u3VXBU6yGAsCRATxi9uC9VW91/9MlhoqrURbbxJy0gPihrYoEWoUqi0b07BI4AIfy2EPUYvf82IcgTxemb0jw==} cpu: [x64] os: [linux] - '@deno/win32-arm64@2.4.4': - resolution: {integrity: sha512-MPkhuVJVNF9PYiwrpRS0WfCwWxYmbB0CUgBE2+PC5FDbfmodfv+lv74w5HTPz2xITMdO4QqrOSSLz+JVCwjgSQ==} + '@deno/win32-arm64@2.5.0': + resolution: {integrity: sha512-5mehFHYvMV/Kz9331FUnKwmocJBxvp/9dfwVK9Zn8MY1koLuvn8F6c0Tg0Vg+uZ9kwDSv9mhEvrkKLv2ZF2CPw==} cpu: [arm64] os: [win32] - '@deno/win32-x64@2.4.4': - resolution: {integrity: sha512-3tZcX6Jx1T7OSyeSXmQpK7zjZwvcc4kTK7PXtkpLuDwFXmObOmsNdbMQXuOIXvcmLlnUnVYJEfEo63zBZWR11g==} + '@deno/win32-x64@2.5.0': + resolution: {integrity: sha512-5k0eYnFn55NV2/i6LwSi/BM1pUkDdmMlAyxKSb3PhiPd+EpS1cxAFEwn92MRmQq7mG2uoUixR1n4A3MrfU259w==} cpu: [x64] os: [win32] @@ -4025,8 +4025,8 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - deno@2.4.4: - resolution: {integrity: sha512-uD357dB8icmaCuRy1xRbltEzA8/bbfMYtCV9W6cv8HDLw9mmfi57SwY4bpEw+wWGjk/2vbg3cIEEAE+2O8DnTg==} + deno@2.5.0: + resolution: {integrity: sha512-GMqK9VJzwFhluLPfPP1iM/qbDnug9t5CsMTv4jpowQoWCJbdghi1aL4+2oiXNm0WPI5e/q5QAcoc1PUfhnL6LA==} hasBin: true dequal@2.0.3: @@ -7277,22 +7277,22 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@deno/darwin-arm64@2.4.4': + '@deno/darwin-arm64@2.5.0': optional: true - '@deno/darwin-x64@2.4.4': + '@deno/darwin-x64@2.5.0': optional: true - '@deno/linux-arm64-glibc@2.4.4': + '@deno/linux-arm64-glibc@2.5.0': optional: true - '@deno/linux-x64-glibc@2.4.4': + '@deno/linux-x64-glibc@2.5.0': optional: true - '@deno/win32-arm64@2.4.4': + '@deno/win32-arm64@2.5.0': optional: true - '@deno/win32-x64@2.4.4': + '@deno/win32-x64@2.5.0': optional: true '@drizzle-team/brocli@0.10.2': {} @@ -8980,14 +8980,14 @@ snapshots: defu@6.1.4: {} - deno@2.4.4: + deno@2.5.0: optionalDependencies: - '@deno/darwin-arm64': 2.4.4 - '@deno/darwin-x64': 2.4.4 - '@deno/linux-arm64-glibc': 2.4.4 - '@deno/linux-x64-glibc': 2.4.4 - '@deno/win32-arm64': 2.4.4 - '@deno/win32-x64': 2.4.4 + '@deno/darwin-arm64': 2.5.0 + '@deno/darwin-x64': 2.5.0 + '@deno/linux-arm64-glibc': 2.5.0 + '@deno/linux-x64-glibc': 2.5.0 + '@deno/win32-arm64': 2.5.0 + '@deno/win32-x64': 2.5.0 dequal@2.0.3: {} From b6fd46c4c56d9641fcd3656bc2cca260416da98c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Sep 2025 05:31:17 +0000 Subject: [PATCH 24/26] chore(deps): bump @hono/node-server from 1.19.1 to 1.19.2 Bumps [@hono/node-server](https://github.com/honojs/node-server) from 1.19.1 to 1.19.2. - [Release notes](https://github.com/honojs/node-server/releases) - [Commits](https://github.com/honojs/node-server/compare/v1.19.1...v1.19.2) --- updated-dependencies: - dependency-name: "@hono/node-server" dependency-version: 1.19.2 dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- cloud/backend/node/package.json | 2 +- pnpm-lock.yaml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cloud/backend/node/package.json b/cloud/backend/node/package.json index baa5cce03..481824525 100644 --- a/cloud/backend/node/package.json +++ b/cloud/backend/node/package.json @@ -45,7 +45,7 @@ "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/core-types-protocols-cloud": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", - "@hono/node-server": "^1.19.1", + "@hono/node-server": "^1.19.2", "@hono/node-ws": "^1.2.0", "@libsql/client": "^0.15.15", "drizzle-orm": "^0.44.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d5a8d9e9d..f55894208 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2818,8 +2818,8 @@ packages: '@formkit/auto-animate@0.8.4': resolution: {integrity: sha512-DHHC01EJ1p70Q0z/ZFRBIY8NDnmfKccQoyoM84Tgb6omLMat6jivCdf272Y8k3nf4Lzdin/Y4R9q8uFtU0GbnA==} - '@hono/node-server@1.19.1': - resolution: {integrity: sha512-h44e5s+ByUriaRIbeS/C74O8v90m0A95luyYQGMF7KEn96KkYMXO7bZAwombzTpjQTU4e0TkU8U1WBIXlwuwtA==} + '@hono/node-server@1.19.2': + resolution: {integrity: sha512-lndWsd9De/btN998Aiv6gkeMVV2h9Cc0AR0qwFTmxx/YFh/PbrjgoxTpHaNaRn6F4GAkPiVJwI0W0gQF4Wn8EA==} engines: {node: '>=18.14.1'} peerDependencies: hono: ^4 From 654493ffcae2177067920a93f5b76737f7cb9819 Mon Sep 17 00:00:00 2001 From: Meno Abels Date: Tue, 16 Sep 2025 13:48:22 +0200 Subject: [PATCH 25/26] wip: concrete lower model without runtime switch [skip ci] --- pnpm-lock.yaml | 128 +++++++++++++++++++------------------------------ 1 file changed, 48 insertions(+), 80 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f55894208..7a2ab9005 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -30,7 +30,7 @@ importers: version: 7.0.0-dev.20250915.1 deno: specifier: ^2.5.0 - version: 2.5.0 + version: 2.5.1 drizzle-kit: specifier: 0.30.6 version: 0.30.6(patch_hash=9e79163b9304da5cbc3c787034937aeddaf678492ba5636df601baaa78e130d8) @@ -303,11 +303,11 @@ importers: specifier: workspace:0.0.0 version: link:../../../vendor '@hono/node-server': - specifier: ^1.19.1 - version: 1.19.1(hono@4.9.7) + specifier: ^1.19.2 + version: 1.19.3(hono@4.9.7) '@hono/node-ws': specifier: ^1.2.0 - version: 1.2.0(@hono/node-server@1.19.1(hono@4.9.7))(hono@4.9.7) + version: 1.2.0(@hono/node-server@1.19.3(hono@4.9.7))(hono@4.9.7) '@libsql/client': specifier: ^0.15.15 version: 0.15.15 @@ -1115,8 +1115,8 @@ importers: specifier: ^2.14.0 version: 2.14.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) '@clerk/clerk-js': - specifier: ^5.91.2 - version: 5.91.2(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.1.9) + specifier: ^5.93.0 + version: 5.93.0(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.1.9) '@clerk/clerk-react': specifier: ^5.47.0 version: 5.47.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -1998,18 +1998,6 @@ packages: resolution: {integrity: sha512-l2wXzvawzcuh17e15cGBZS3ZTx14409tOHPdqojSvWsvZtO3FzC1UJw69JylCdcBcCEQWsF22Y/4sIy6hRo+gw==} engines: {node: '>=18.17.0'} - '@clerk/shared@3.24.1': - resolution: {integrity: sha512-9ZLSeQOejWKH+MdftUH4iBjvx1ilIvZPZqJ2YQDO1RkY3lT3DVj64zIHHMZpjQN7dw2MOsalD0sHIPlQhshT5A==} - engines: {node: '>=18.17.0'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 || ^19.0.0-0 - react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-0 - peerDependenciesMeta: - react: - optional: true - react-dom: - optional: true - '@clerk/shared@3.25.0': resolution: {integrity: sha512-2Vb6NQqBA+1g7kfGct/OlSFmzU54/s4BQp3qeHwDqW1FgaU4MuXbqfBClI6AatxOC8Ux8W16Rvf705ViwFSxlw==} engines: {node: '>=18.17.0'} @@ -2022,10 +2010,6 @@ packages: react-dom: optional: true - '@clerk/types@4.84.1': - resolution: {integrity: sha512-0lLz3u8u0Ot5ZUObU+8JJLOeiHHnruShJMeLAHNryp1d5zANPQquOyagamxbkoV1K2lAf8ld3liobs3EBzll6Q==} - engines: {node: '>=18.17.0'} - '@clerk/types@4.86.0': resolution: {integrity: sha512-YFaOYIAZWbpXehAmtgUB0YNf1v5b/hlwePvdqxlD5vdwrNsap28RpupWZat0hp1+PTtb9uAwSa5AFCOxkYLUJQ==} engines: {node: '>=18.17.0'} @@ -2089,33 +2073,33 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@deno/darwin-arm64@2.5.0': - resolution: {integrity: sha512-1x8VmjfO7nPhVdKuRO0vVCSyxbzbhoiYpwTsM6c1dI1LLjLq/yLszHyStH0SE0gd+9XMVgrXLdrRPWrePW7WmQ==} + '@deno/darwin-arm64@2.5.1': + resolution: {integrity: sha512-vmAI6Bbmp3G4qw2ih/YWfU/uMJbVPNOTBv/I0FAExJMK0R+2WFXeRqWMqEnVqR6wWpOxLs8q2aEvFpetLS3YZg==} cpu: [arm64] os: [darwin] - '@deno/darwin-x64@2.5.0': - resolution: {integrity: sha512-yiWqH+L4G7DLX/LSr/x2kImn1DaDh/G14TLdLuLBzcdwZ9XuM/lNjgSe7xc35WlhyXAkf0J/K2yi7kNqHJoItw==} + '@deno/darwin-x64@2.5.1': + resolution: {integrity: sha512-C+a9H0BrIufPMVUctB9EdLyXB6fINpQuyHaWCIlEdPEnJGFy9URU7ycJhdvh4RTV//U5FDEg4DBOTPHvY2hs2g==} cpu: [x64] os: [darwin] - '@deno/linux-arm64-glibc@2.5.0': - resolution: {integrity: sha512-bkx6ITvYh9xS/GVbzzriotM3MA+3RIzDxohvmPosYfDzIckcROzTvvXkl73pLwvAnDfdbw7DF1qpUmU480vv4w==} + '@deno/linux-arm64-glibc@2.5.1': + resolution: {integrity: sha512-OuZeQfOh1S1HskMV6u74N8CSaY2JAoTh02Ev7HnZLt4RqKy1HtNt6oBSHS1Gx0ARHcJ16WAgh6YK9jM/aFZcVA==} cpu: [arm64] os: [linux] - '@deno/linux-x64-glibc@2.5.0': - resolution: {integrity: sha512-0u3VXBU6yGAsCRATxi9uC9VW91/9MlhoqrURbbxJy0gPihrYoEWoUqi0b07BI4AIfy2EPUYvf82IcgTxemb0jw==} + '@deno/linux-x64-glibc@2.5.1': + resolution: {integrity: sha512-pGzU2UsDBqTY/g4HVENiMB4NSQgDTIxBcFhdgRXh0sMqB/WNcTbtfzmvik2SRNposk0pnkkWlKj9hGffWDfsxA==} cpu: [x64] os: [linux] - '@deno/win32-arm64@2.5.0': - resolution: {integrity: sha512-5mehFHYvMV/Kz9331FUnKwmocJBxvp/9dfwVK9Zn8MY1koLuvn8F6c0Tg0Vg+uZ9kwDSv9mhEvrkKLv2ZF2CPw==} + '@deno/win32-arm64@2.5.1': + resolution: {integrity: sha512-mHpxn2J6sU8woHQ2OKsJq5WeFtH6r//NhOZn2BOTvt7gd1V2PdnVX1t1C/iXzYtodfZHIfqevflU0mkJWW9EbA==} cpu: [arm64] os: [win32] - '@deno/win32-x64@2.5.0': - resolution: {integrity: sha512-5k0eYnFn55NV2/i6LwSi/BM1pUkDdmMlAyxKSb3PhiPd+EpS1cxAFEwn92MRmQq7mG2uoUixR1n4A3MrfU259w==} + '@deno/win32-x64@2.5.1': + resolution: {integrity: sha512-9QFaXjH28E0D5j5X0J09c1HTh8DRgtg99nojw6oIoyCApevOZsBYGwePzHSYkk+lsMgVSI+8XHLsLo8oJr15dg==} cpu: [x64] os: [win32] @@ -2818,8 +2802,8 @@ packages: '@formkit/auto-animate@0.8.4': resolution: {integrity: sha512-DHHC01EJ1p70Q0z/ZFRBIY8NDnmfKccQoyoM84Tgb6omLMat6jivCdf272Y8k3nf4Lzdin/Y4R9q8uFtU0GbnA==} - '@hono/node-server@1.19.2': - resolution: {integrity: sha512-lndWsd9De/btN998Aiv6gkeMVV2h9Cc0AR0qwFTmxx/YFh/PbrjgoxTpHaNaRn6F4GAkPiVJwI0W0gQF4Wn8EA==} + '@hono/node-server@1.19.3': + resolution: {integrity: sha512-Fjyxfux0rMPXMSob79OmddfpK5ArJa2xLkLCV+zamHkbeXQtSNKOi0keiBKyHZ/hCRKjigjmKGp4AJnDFq8PUw==} engines: {node: '>=18.14.1'} peerDependencies: hono: ^4 @@ -4025,8 +4009,8 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - deno@2.5.0: - resolution: {integrity: sha512-GMqK9VJzwFhluLPfPP1iM/qbDnug9t5CsMTv4jpowQoWCJbdghi1aL4+2oiXNm0WPI5e/q5QAcoc1PUfhnL6LA==} + deno@2.5.1: + resolution: {integrity: sha512-fQK5AuQLYtNvq+vTeGlwphcWf1ro9DtL//T7tVnmnazWdcV0AHnveUQgf0BQY/vtLwB6KjuJOtvV/3of/B1d9g==} hasBin: true dequal@2.0.3: @@ -5374,8 +5358,8 @@ packages: preact@10.24.2: resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==} - preact@10.27.2: - resolution: {integrity: sha512-5SYSgFKSyhCbk6SrXyMpqjb5+MQBgfvEKE/OC+PujcY34sOpqtr+0AZQtPYx5IA6VxynQ7rUPCtKzyovpj9Bpg==} + preact@10.27.1: + resolution: {integrity: sha512-V79raXEWch/rbqoNc7nT9E4ep7lu+mI3+sBmfRD4i1M73R3WLYcCtdI0ibxGVf4eQL8ZIz2nFacqEC+rmnOORQ==} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} @@ -6006,8 +5990,8 @@ packages: varint@6.0.0: resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} - viem@2.37.6: - resolution: {integrity: sha512-b+1IozQ8TciVQNdQUkOH5xtFR0z7ZxR8pyloENi/a+RA408lv4LoX12ofwoiT3ip0VRhO5ni1em//X0jn/eW0g==} + viem@2.37.4: + resolution: {integrity: sha512-1ig5O6l1wJmaw3yrSrUimjRLQEZon2ymTqSDjdntu6Bry1/tLC2GClXeS3SiCzrifpLxzfCLQWDITYVTBA10KA==} peerDependencies: typescript: '>=5.0.4' peerDependenciesMeta: @@ -7140,12 +7124,12 @@ snapshots: - react - react-dom - '@clerk/clerk-js@5.91.2(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.1.9)': + '@clerk/clerk-js@5.93.0(@types/react@19.1.13)(react-dom@19.1.1(react@19.1.1))(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.1.9)': dependencies: '@base-org/account': 2.0.1(@types/react@19.1.13)(react@19.1.1)(typescript@5.9.2)(use-sync-external-store@1.5.0(react@19.1.1))(zod@4.1.9) - '@clerk/localizations': 3.24.2 - '@clerk/shared': 3.24.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - '@clerk/types': 4.84.1 + '@clerk/localizations': 3.25.1 + '@clerk/shared': 3.25.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + '@clerk/types': 4.86.0 '@coinbase/wallet-sdk': 4.3.0 '@emotion/cache': 11.11.0 '@emotion/react': 11.11.1(@types/react@19.1.13)(react@19.1.1) @@ -7190,18 +7174,6 @@ snapshots: dependencies: '@clerk/types': 4.86.0 - '@clerk/shared@3.24.1(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': - dependencies: - '@clerk/types': 4.86.0 - dequal: 2.0.3 - glob-to-regexp: 0.4.1 - js-cookie: 3.0.5 - std-env: 3.9.0 - swr: 2.3.4(react@19.1.1) - optionalDependencies: - react: 19.1.1 - react-dom: 19.1.1(react@19.1.1) - '@clerk/shared@3.25.0(react-dom@19.1.1(react@19.1.1))(react@19.1.1)': dependencies: '@clerk/types': 4.86.0 @@ -7214,10 +7186,6 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - '@clerk/types@4.84.1': - dependencies: - csstype: 3.1.3 - '@clerk/types@4.86.0': dependencies: csstype: 3.1.3 @@ -7271,28 +7239,28 @@ snapshots: '@noble/hashes': 1.8.0 clsx: 1.2.1 eventemitter3: 5.0.1 - preact: 10.27.2 + preact: 10.27.1 '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@deno/darwin-arm64@2.5.0': + '@deno/darwin-arm64@2.5.1': optional: true - '@deno/darwin-x64@2.5.0': + '@deno/darwin-x64@2.5.1': optional: true - '@deno/linux-arm64-glibc@2.5.0': + '@deno/linux-arm64-glibc@2.5.1': optional: true - '@deno/linux-x64-glibc@2.5.0': + '@deno/linux-x64-glibc@2.5.1': optional: true - '@deno/win32-arm64@2.5.0': + '@deno/win32-arm64@2.5.1': optional: true - '@deno/win32-x64@2.5.0': + '@deno/win32-x64@2.5.1': optional: true '@drizzle-team/brocli@0.10.2': {} @@ -7741,13 +7709,13 @@ snapshots: '@formkit/auto-animate@0.8.4': {} - '@hono/node-server@1.19.1(hono@4.9.7)': + '@hono/node-server@1.19.3(hono@4.9.7)': dependencies: hono: 4.9.7 - '@hono/node-ws@1.2.0(@hono/node-server@1.19.1(hono@4.9.7))(hono@4.9.7)': + '@hono/node-ws@1.2.0(@hono/node-server@1.19.3(hono@4.9.7))(hono@4.9.7)': dependencies: - '@hono/node-server': 1.19.1(hono@4.9.7) + '@hono/node-server': 1.19.3(hono@4.9.7) hono: 4.9.7 ws: 8.18.3 transitivePeerDependencies: @@ -8980,14 +8948,14 @@ snapshots: defu@6.1.4: {} - deno@2.5.0: + deno@2.5.1: optionalDependencies: - '@deno/darwin-arm64': 2.5.0 - '@deno/darwin-x64': 2.5.0 - '@deno/linux-arm64-glibc': 2.5.0 - '@deno/linux-x64-glibc': 2.5.0 - '@deno/win32-arm64': 2.5.0 - '@deno/win32-x64': 2.5.0 + '@deno/darwin-arm64': 2.5.1 + '@deno/darwin-x64': 2.5.1 + '@deno/linux-arm64-glibc': 2.5.1 + '@deno/linux-x64-glibc': 2.5.1 + '@deno/win32-arm64': 2.5.1 + '@deno/win32-x64': 2.5.1 dequal@2.0.3: {} @@ -10457,7 +10425,7 @@ snapshots: preact@10.24.2: {} - preact@10.27.2: {} + preact@10.27.1: {} prelude-ls@1.2.1: {} From 16328f094e3fea8af1ceba60993c2a7690ce1582 Mon Sep 17 00:00:00 2001 From: Meno Abels Date: Thu, 18 Sep 2025 14:21:29 +0200 Subject: [PATCH 26/26] chore: now the sync-log store show be available everywhere in fireproof --- cloud/backend/base/ws-sockets.test.ts | 13 +- core/blockstore/package.json | 1 + core/blockstore/register-store-protocol.ts | 39 +-- core/gateways/file-deno/deno-filesystem.ts | 77 ++++- core/gateways/file-deno/tsconfig.json | 2 +- core/gateways/file-node/node-filesystem.ts | 111 ++++-- core/gateways/file/fp-sync.ts | 8 - core/gateways/file/index.ts | 1 - core/gateways/file/package.json | 4 +- core/gateways/file/sys-file-system-factory.ts | 209 +++++++++++- core/gateways/indexeddb/dummy-idb.ts | 323 +++--------------- core/gateways/indexeddb/fp-db.ts | 52 +++ core/gateways/indexeddb/fp-sync.ts | 17 +- core/gateways/indexeddb/gateway-impl.ts | 96 +++--- core/gateways/indexeddb/index.ts | 2 + core/gateways/indexeddb/key-bag-indexeddb.ts | 70 ++-- core/gateways/indexeddb/package.json | 6 +- core/gateways/indexeddb/wrap-dexie.ts | 81 +++++ core/gateways/memory/fp-sync.ts | 8 - core/gateways/memory/gateway.ts | 174 +++++++++- core/gateways/memory/package.json | 5 +- core/protocols/sync/block-log-svc.ts | 44 ++- core/protocols/sync/car-svc.ts | 66 ++-- core/protocols/sync/cid-set-svc.ts | 61 ++-- core/protocols/sync/index.ts | 10 +- core/protocols/sync/package.json | 2 +- core/protocols/sync/peer-svc.ts | 82 ++--- core/protocols/sync/sync-block-log.ts | 1 - core/protocols/sync/sync-db.ts | 125 ++++--- core/runtime/utils.ts | 34 +- .../blockstore/interceptor-gateway.test.ts | 2 +- .../keyed-crypto-indexeddb-file.test.ts | 4 +- core/tests/blockstore/keyed-crypto.test.ts | 4 +- core/tests/fireproof/database.test.ts | 2 +- .../indexeddb/create-db-on-write.test.ts | 2 +- .../indexeddb/dexie-transition.test.ts | 55 +++ .../gateway/indexeddb/loader-config.test.ts | 5 + core/tests/package.json | 3 +- .../protocols/sync/block-log-svc.test.ts | 87 ++--- core/tests/protocols/sync/car-svc.test.ts | 42 ++- core/tests/protocols/sync/cid-set.test.ts | 45 ++- core/tests/protocols/sync/peer-svc.test.ts | 28 +- core/tests/protocols/sync/sync-api.test.ts | 13 - core/tests/runtime/meta-key-hack.test.ts | 2 +- core/tests/setup.file.ts | 4 + core/tests/setup.indexeddb.ts | 3 + core/tests/setup.memory.ts | 9 +- core/tests/vitest.browser.memory.config.ts | 36 ++ core/tests/vitest.config.ts | 2 +- core/types/base/types.ts | 42 +++ core/types/blockstore/fp-db.ts | 36 ++ core/types/blockstore/fp-sync.ts | 48 +++ core/types/blockstore/index.ts | 2 + core/types/blockstore/package.json | 3 +- core/types/protocols/sync/index.ts | 41 --- core/types/protocols/sync/package.json | 42 --- core/types/protocols/sync/tsconfig.json | 6 - eslint.config.mjs | 1 + pnpm-lock.yaml | 175 ++-------- tsconfig.json | 2 +- vitest.config.ts | 3 + 61 files changed, 1481 insertions(+), 992 deletions(-) delete mode 100644 core/gateways/file/fp-sync.ts create mode 100644 core/gateways/indexeddb/fp-db.ts create mode 100644 core/gateways/indexeddb/wrap-dexie.ts delete mode 100644 core/gateways/memory/fp-sync.ts delete mode 100644 core/protocols/sync/sync-block-log.ts create mode 100644 core/tests/gateway/indexeddb/dexie-transition.test.ts delete mode 100644 core/tests/protocols/sync/sync-api.test.ts create mode 100644 core/tests/vitest.browser.memory.config.ts create mode 100644 core/types/blockstore/fp-db.ts create mode 100644 core/types/blockstore/fp-sync.ts delete mode 100644 core/types/protocols/sync/index.ts delete mode 100644 core/types/protocols/sync/package.json delete mode 100644 core/types/protocols/sync/tsconfig.json diff --git a/cloud/backend/base/ws-sockets.test.ts b/cloud/backend/base/ws-sockets.test.ts index 7f0d73b30..44f6956bd 100644 --- a/cloud/backend/base/ws-sockets.test.ts +++ b/cloud/backend/base/ws-sockets.test.ts @@ -1,4 +1,4 @@ -import { sleep } from "@fireproof/core-runtime"; +import { consumeStream, sleep } from "@fireproof/core-runtime"; import * as ps from "@fireproof/core-types-protocols-cloud"; import { Msger } from "@fireproof/core-protocols-cloud"; import { testSuperThis } from "@fireproof/cloud-base"; @@ -38,17 +38,6 @@ describe("test multiple connections", () => { // await hserv.close(); }); - function consumeStream(stream: ReadableStream>, cb: (msg: ps.MsgBase) => void): void { - const reader = stream.getReader(); - async function readNext() { - const { done, value } = await reader.read(); - if (done) return; - cb(value); - readNext(); - } - readNext(); - } - it("could open multiple connections", async () => { const id = sthis.nextId(4).str; const conns = await Promise.all( diff --git a/core/blockstore/package.json b/core/blockstore/package.json index 0d11db0f6..3247026e2 100644 --- a/core/blockstore/package.json +++ b/core/blockstore/package.json @@ -52,6 +52,7 @@ "@ipld/dag-cbor": "^9.2.5", "@ipld/dag-json": "^10.2.5", "@web3-storage/pail": "^0.6.2", + "dexie": "^4.2.0", "multiformats": "^13.4.1", "p-map": "^7.0.3", "p-retry": "^7.0.0" diff --git a/core/blockstore/register-store-protocol.ts b/core/blockstore/register-store-protocol.ts index 6da7c90e8..a7231a854 100644 --- a/core/blockstore/register-store-protocol.ts +++ b/core/blockstore/register-store-protocol.ts @@ -1,18 +1,17 @@ -import { BuildURI, Lazy, ResolveOnce, runtimeFn, URI } from "@adviser/cement"; +import { BuildURI, ResolveOnce, runtimeFn, URI } from "@adviser/cement"; import { SuperThis, PARAM } from "@fireproof/core-types-base"; -import { SerdeGateway, Gateway } from "@fireproof/core-types-blockstore"; -import { MemoryGateway } from "@fireproof/core-gateways-memory"; -import { FileGateway, FILESTORE_VERSION, sysFileSystemFactory } from "@fireproof/core-gateways-file"; +import { SerdeGateway, Gateway, FPIndexedDB } from "@fireproof/core-types-blockstore"; +import { memFPIndexedDB, MemoryGateway } from "@fireproof/core-gateways-memory"; +import { FileGateway, FILESTORE_VERSION, sysFileFPIndexedDB, sysFileSystemFactory } from "@fireproof/core-gateways-file"; import { DefSerdeGateway, INDEXEDDB_VERSION } from "@fireproof/core-gateways-base"; import { CloudGateway } from "@fireproof/core-gateways-cloud"; -import { FPSyncProtocol } from "../types/protocols/sync/index.js"; export interface SerdeGatewayFactoryItem { readonly protocol: string; readonly isDefault?: boolean; defaultURI(sthis: SuperThis): URI; serdegateway(sthis: SuperThis): Promise; - fpsync(sthis: SuperThis, uri: URI): Promise>; + fpIndexedDB(sthis: SuperThis, uri: URI): Promise; } class OneSerdeGatewayFactoryItem implements SerdeGatewayFactoryItem { @@ -45,7 +44,9 @@ class OneSerdeGatewayFactoryItem implements SerdeGatewayFactoryItem { return this.once.once(() => this.item.serdegateway(sthis)); } - fpsync = Lazy((sthis: SuperThis, uri: URI) => this.item.fpsync(sthis, uri)); + async fpIndexedDB(sthis: SuperThis, uri: URI): Promise { + return this.item.fpIndexedDB(sthis, uri); + } } const storeFactory = new Map(); @@ -76,11 +77,10 @@ export interface SerdeOrGatewayFactoryItem { readonly serdegateway?: (sthis: SuperThis) => Promise; readonly gateway?: (sthis: SuperThis) => Promise; - readonly fpsync: (sthis: SuperThis, uri: URI) => Promise>; + readonly fpIndexedDB: (sthis: SuperThis, uri: URI) => Promise; } export function registerStoreProtocol(item: SerdeOrGatewayFactoryItem): () => void { - console.log("registerStoreProtocol", item.protocol); let protocol = item.protocol; if (!protocol.endsWith(":")) { protocol += ":"; @@ -151,10 +151,8 @@ if (runtimeFn().isNodeIsh || runtimeFn().isDeno) { gateway: async (sthis) => { return new FileGateway(sthis, await sysFileSystemFactory(defaultURI(sthis))); }, - fpsync: async (_sthis, _uri) => { - throw new Error("fpsync for file: Not implemented"); - // const { fileFPSync } = await import("@fireproof/core-gateways-file"); - // return fileFPSync(sthis, uri) as Promise>; + fpIndexedDB: async (sthis, uri) => { + return sysFileFPIndexedDB(sthis, uri); }, }); } @@ -174,9 +172,9 @@ if (runtimeFn().isBrowser) { const { GatewayImpl } = await import("@fireproof/core-gateways-indexeddb"); return new GatewayImpl(); }, - fpsync: async (sthis, uri) => { - const { indexedDBFPSync } = await import("@fireproof/core-gateways-indexeddb"); - return indexedDBFPSync(sthis, uri) as Promise>; + fpIndexedDB: async (sthis, uri) => { + const { indexeddbFPIndexedDB } = await import("@fireproof/core-gateways-indexeddb"); + return indexeddbFPIndexedDB(sthis, uri); }, }); } @@ -191,10 +189,9 @@ registerStoreProtocol({ gateway: async (sthis) => { return new MemoryGateway(sthis, memory); }, - fpsync: () => { - throw new Error("fpsync for memory: Not implemented"); - // memoryFPSync as (sthis: SuperThis, uri: URI) => Promise>, - } + fpIndexedDB: (sthis, uri) => { + return memFPIndexedDB(sthis, uri, memory); + }, }); //const onceRegisterFireproofCloudStoreProtocol = new KeyedResolvOnce<() => void>(); @@ -209,7 +206,7 @@ registerStoreProtocol({ serdegateway: async (sthis: SuperThis) => { return new CloudGateway(sthis); }, - fpsync: async () => { + fpIndexedDB: async () => { throw new Error("fpsync for fpcloud: Not implemented"); }, }); diff --git a/core/gateways/file-deno/deno-filesystem.ts b/core/gateways/file-deno/deno-filesystem.ts index 819db5e14..fac457a7e 100644 --- a/core/gateways/file-deno/deno-filesystem.ts +++ b/core/gateways/file-deno/deno-filesystem.ts @@ -1,6 +1,75 @@ /// -import type { FPStats, SysFileSystem } from "@fireproof/core-types-base"; -import { to_uint8 } from "@adviser/cement"; +import type { FPSql, FPSqlCmd, FPSqlConn, FPSqlResult, FPStats, SysFileSystem } from "@fireproof/core-types-base"; +import { exception2Result, to_uint8 } from "@adviser/cement"; +import type { DatabaseSync } from "node:sqlite"; + +class NodeSqlite implements FPSql { + readonly path: string; + readonly db: DatabaseSync; + readonly fs: SysFileSystem; + + constructor(db: DatabaseSync, fs: SysFileSystem, path: string) { + this.db = db; + this.path = path; + this.fs = fs; + } + + async batch(sqlCmds: FPSqlCmd[]): Promise { + const ret: FPSqlResult[] = []; + const withStmt = sqlCmds.map((cmd) => ({ + ...cmd, + argss: cmd.argss ?? [[]], + stmt: this.db.prepare(cmd.sql), + })); + for (const cmd of withStmt) { + for (const args of cmd.argss) { + const r = exception2Result(() => cmd.stmt.all(...args)); + switch (true) { + case r.isOk(): + ret.push({ rows: r.Ok().map((i) => Object.values(i)) }); + break; + case r.isErr(): + ret.push({ error: r.Err() }); + break; + } + } + } + return Promise.resolve(ret); + } + + async transaction(fn: (tx: FPSql) => Promise): Promise { + return fn(this); + } + + close(): Promise { + this.db.close(); + return Promise.resolve(); + } + destroy(): Promise { + return this.fs.rm(this.path); + } +} + +class NodeSqliteConn implements FPSqlConn { + readonly fs: SysFileSystem; + readonly #dbs: (path: string) => DatabaseSync; + + static async create(fs: SysFileSystem): Promise { + const rNodeSql = await exception2Result(() => import("node:sqlite")); + if (rNodeSql.isErr()) { + throw new Error("Need node:sqlite in node 22 and deno."); + } + const { DatabaseSync } = rNodeSql.Ok(); + return new NodeSqliteConn(fs, (path: string) => new DatabaseSync(path)); + } + private constructor(fs: SysFileSystem, dbs: (path: string) => DatabaseSync) { + this.fs = fs; + this.#dbs = dbs; + } + async open(path: string): Promise { + return new NodeSqlite(this.#dbs(path), this.fs, path); + } +} export class DenoFileSystem implements SysFileSystem { fs?: { @@ -14,6 +83,10 @@ export class DenoFileSystem implements SysFileSystem { writeFile: typeof Deno.writeFile; }; + sqlite(): Promise { + return this.start().then((fs) => NodeSqliteConn.create(fs)); + } + async start(): Promise { this.fs = Deno as unknown as DenoFileSystem["fs"]; return this; diff --git a/core/gateways/file-deno/tsconfig.json b/core/gateways/file-deno/tsconfig.json index e9b6d0467..9a562e783 100644 --- a/core/gateways/file-deno/tsconfig.json +++ b/core/gateways/file-deno/tsconfig.json @@ -1,7 +1,7 @@ { "extends": "../../../tsconfig.json", "compilerOptions": { - "types": ["deno"], + "types": ["deno", "node"], "outDir": "./dist" } } diff --git a/core/gateways/file-node/node-filesystem.ts b/core/gateways/file-node/node-filesystem.ts index 411c213d8..6fb011653 100644 --- a/core/gateways/file-node/node-filesystem.ts +++ b/core/gateways/file-node/node-filesystem.ts @@ -1,7 +1,77 @@ import type { PathLike, MakeDirectoryOptions, Stats, ObjectEncodingOptions } from "node:fs"; import type { mkdir, readdir, rm, copyFile, readFile, stat, unlink, writeFile } from "node:fs/promises"; import { toArrayBuffer } from "./to-array-buffer.js"; -import type { SysFileSystem } from "@fireproof/core-types-base"; +import type { FPSqlCmd, FPSqlConn, FPSql, FPSqlResult, SysFileSystem } from "@fireproof/core-types-base"; +import { exception2Result } from "@adviser/cement"; +import type { DatabaseSync } from "node:sqlite"; + +class NodeSqlite implements FPSql { + readonly path: string; + readonly db: DatabaseSync; + readonly fs: SysFileSystem; + + constructor(db: DatabaseSync, fs: SysFileSystem, path: string) { + this.db = db; + this.path = path; + this.fs = fs; + } + + async batch(sqlCmds: FPSqlCmd[]): Promise { + const ret: FPSqlResult[] = []; + const withStmt = sqlCmds.map((cmd) => ({ + ...cmd, + argss: cmd.argss ?? [[]], + stmt: this.db.prepare(cmd.sql), + })); + for (const cmd of withStmt) { + for (const args of cmd.argss) { + const r = exception2Result(() => cmd.stmt.all(...args)); + switch (true) { + case r.isOk(): + ret.push({ rows: r.Ok().map((i) => Object.values(i)) }); + break; + case r.isErr(): + ret.push({ error: r.Err() }); + break; + } + } + } + return Promise.resolve(ret); + } + + async transaction(fn: (tx: FPSql) => Promise): Promise { + return fn(this); + } + + close(): Promise { + this.db.close(); + return Promise.resolve(); + } + destroy(): Promise { + return this.fs.rm(this.path); + } +} + +class NodeSqliteConn implements FPSqlConn { + readonly fs: SysFileSystem; + readonly #dbs: (path: string) => DatabaseSync; + + static async create(fs: SysFileSystem): Promise { + const rNodeSql = await exception2Result(() => import("node:sqlite")); + if (rNodeSql.isErr()) { + throw new Error("Need node:sqlite in node 22 and deno."); + } + const { DatabaseSync } = rNodeSql.Ok(); + return new NodeSqliteConn(fs, (path: string) => new DatabaseSync(path)); + } + private constructor(fs: SysFileSystem, dbs: (path: string) => DatabaseSync) { + this.fs = fs; + this.#dbs = dbs; + } + async open(path: string): Promise { + return new NodeSqlite(this.#dbs(path), this.fs, path); + } +} export class NodeFileSystem implements SysFileSystem { fs?: { @@ -15,6 +85,10 @@ export class NodeFileSystem implements SysFileSystem { writeFile: typeof writeFile; }; + sqlite(): Promise { + return this.start().then((fs) => NodeSqliteConn.create(fs)); + } + async start(): Promise { this.fs = await import("node:fs/promises"); return this; @@ -45,38 +119,3 @@ export class NodeFileSystem implements SysFileSystem { return this.fs?.writeFile(path, data); } } - -// import { type NodeMap, join } from "../../sys-container.js"; -// import type { ObjectEncodingOptions, PathLike } from "fs"; -// import * as fs from "fs/promises"; -// import * as path from "path"; -// import * as os from "os"; -// import * as url from "url"; -// import { toArrayBuffer } from "./utils.js"; - -// export async function createNodeSysContainer(): Promise { -// // const nodePath = "node:path"; -// // const nodeOS = "node:os"; -// // const nodeURL = "node:url"; -// // const nodeFS = "node:fs"; -// // const fs = (await import("node:fs")).promises; -// // const assert = "assert"; -// // const path = await import("node:path"); -// return { -// state: "node", -// ...path, -// // ...(await import("node:os")), -// // ...(await import("node:url")), -// ...os, -// ...url, -// ...fs, -// join, -// stat: fs.stat as NodeMap["stat"], -// readdir: fs.readdir as NodeMap["readdir"], -// readfile: async (path: PathLike, options?: ObjectEncodingOptions): Promise => { -// const rs = await fs.readFile(path, options); -// return toArrayBuffer(rs); -// }, -// writefile: fs.writeFile as NodeMap["writefile"], -// }; -// } diff --git a/core/gateways/file/fp-sync.ts b/core/gateways/file/fp-sync.ts deleted file mode 100644 index e7e718fbb..000000000 --- a/core/gateways/file/fp-sync.ts +++ /dev/null @@ -1,8 +0,0 @@ -// import { URI } from "@adviser/cement"; -// import { ClassicLevel } from "classic-level"; -// import { FPSyncEntry, FPSyncProtocol } from "@fireproof/core-types-protocols-sync"; -// import { SuperThis } from "@fireproof/core-types-base"; - -// export async function fileFPSync(_sthis: SuperThis, uri: URI): Promise> { -// return new ClassicLevel(uri.toString()); -// } diff --git a/core/gateways/file/index.ts b/core/gateways/file/index.ts index d915e298a..7a5f090d1 100644 --- a/core/gateways/file/index.ts +++ b/core/gateways/file/index.ts @@ -2,4 +2,3 @@ export * from "./key-bag-file.js"; export * from "./sys-file-system-factory.js"; export * from "./version.js"; export * from "./gateway-impl.js"; -export * from "./fp-sync.js"; diff --git a/core/gateways/file/package.json b/core/gateways/file/package.json index 0eb13fbc6..fa367cba2 100644 --- a/core/gateways/file/package.json +++ b/core/gateways/file/package.json @@ -47,9 +47,7 @@ "@fireproof/core-gateways-file-node": "workspace:0.0.0", "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", - "@fireproof/core-types-protocols-sync": "workspace:0.0.0", "@fireproof/core-types-blockstore": "workspace:0.0.0", - "@fireproof/vendor": "workspace:0.0.0", - "classic-level": "^3.0.0" + "@fireproof/vendor": "workspace:0.0.0" } } diff --git a/core/gateways/file/sys-file-system-factory.ts b/core/gateways/file/sys-file-system-factory.ts index 5c2cbef36..e47069088 100644 --- a/core/gateways/file/sys-file-system-factory.ts +++ b/core/gateways/file/sys-file-system-factory.ts @@ -1,5 +1,13 @@ -import { runtimeFn, URI } from "@adviser/cement"; -import type { SysFileSystem } from "@fireproof/core-types-base"; +import { CoerceURI, KeyedResolvOnce, Lazy, Result, runtimeFn, URI } from "@adviser/cement"; +import { + isFPSqlResultError, + isFPSqlResultOk, + type FPSql, + type FPSQLInputValue, + type SuperThis, + type SysFileSystem, +} from "@fireproof/core-types-base"; +import { BlockLog, Cars, CidSet, DBTable, FPIndexedDB, KV, Peers } from "@fireproof/core-types-blockstore"; export function sysFileSystemFactory(uri: URI): Promise { const rt = runtimeFn(); @@ -12,3 +20,200 @@ export function sysFileSystemFactory(uri: URI): Promise { throw new Error(`unsupported runtime:${rt}`); } } + +const dbs = new KeyedResolvOnce>(); +class FPSQLTable implements DBTable { + readonly #url: string; + readonly #type: string; + constructor(url: CoerceURI, type: string) { + this.#type = type; + this.#url = URI.from(url).toString(); + } + db(): Promise { + return dbs.get(this.#url).once(async () => { + const uri = URI.from(this.#url); + const fp = await sysFileSystemFactory(uri) + .then((fs) => fs.sqlite()) + .then((db) => db.open(uri.pathname)); + await fp.batch([ + { + sql: ` + CREATE TABLE IF NOT EXISTS KV ( + key TEXT NOT NULL, + type TEXT NOT NULL, + val JSON, + PRIMARY KEY (key, type) + )`, + }, + ]); + return fp; + }); + } + + async add(...t: KV[]): Promise[]>> { + const batch = t.map((i) => ({ + sql: "INSERT INTO KV (key, type, val) VALUES (?, ?, ?)", + argss: [[i.key, this.#type, JSON.stringify(i.value)]], + })); + return this.db() + .then((db) => db.batch(batch)) + .then(() => Result.Ok(t)) + .catch((e) => Result.Err(e)); + } + delete(key: string): Promise> { + return this.db() + .then((db) => + db.batch([ + { + sql: "DELETE FROM KV WHERE key = ? AND type = ?", + argss: [[key, this.#type]], + }, + ]), + ) + .then(() => Result.Ok()) + .catch((e) => Result.Err(e)); + } + get(key: string): Promise> { + return this.db() + .then((db) => + db.batch([ + { + sql: "SELECT val FROM KV WHERE key = ? AND type = ?", + argss: [[key, this.#type]], + }, + ]), + ) + .then((r) => { + switch (true) { + case isFPSqlResultError(r[0]): + return Result.Err(r[0].error); + case isFPSqlResultOk(r[0]): { + if (r[0].rows.length === 0) { + return Result.Ok(undefined); + } + const row = r[0].rows[0]; + return Result.Ok(JSON.parse(row[0] as string) as T); + } + default: + return Result.Err(new Error("unknown result")); + } + }); + // return this.db().then(db => db.execute("SELECT val FROM KV WHERE key = ? AND type = ?", [key, this.#type])) + // .then(r => r.rows[0]?.val ? JSON.parse(r.rows[0]?.val as string) : undefined); + } + put(...t: KV[]): Promise[]>> { + const batch = t.map((i) => ({ + sql: "INSERT OR REPLACE INTO KV (key, type, val) VALUES (?, ?, ?)", + argss: [[i.key, this.#type, JSON.stringify(i.value)]], + })); + return this.db() + .then((db) => db.batch(batch)) + .then(() => Result.Ok(t)) + .catch((e) => Result.Err(e)); + } + list(start?: string, end?: string): ReadableStream { + return new ReadableStream({ + start: (controller) => { + this.db() + .then((db) => { + let sqlStmt: { sql: string; argss: FPSQLInputValue[][] }; + switch (true) { + case typeof start === "string" && end === "string": + sqlStmt = { sql: "SELECT val FROM KV WHERE type = ? AND key >= ? AND key <= ?", argss: [[this.#type, start, end]] }; + break; + case typeof start === "string": + sqlStmt = { sql: "SELECT val FROM KV WHERE type = ? AND key >= ?", argss: [[this.#type, start]] }; + break; + case typeof end === "string": + sqlStmt = { sql: "SELECT val FROM KV WHERE type = ? AND key <= ?", argss: [[this.#type, end]] }; + break; + default: + sqlStmt = { sql: "SELECT val FROM KV WHERE type = ?", argss: [[this.#type]] }; + } + return db.batch([sqlStmt]); + }) + .then((res) => { + for (const r of res) { + if (isFPSqlResultError(r)) { + controller.error(r.error); + } + if (isFPSqlResultOk(r)) { + for (const row of r.rows) { + controller.enqueue(JSON.parse(row[0] as string) as T); + } + } + } + controller.close(); + }) + .catch((e) => { + controller.error(e); + }); + }, + }); + } + async transaction(fn: (tx: Omit, "transaction">) => Promise): Promise { + const tx = await this.db(); + return tx.transaction((db) => fn(new FPSQLTableTX(this.#url, this.#type, db))); //.then((r) => tx.commit().then(() => r)).catch((e) => tx.rollback().then(() => { throw e; })); + // fn(new FPSQLTableTX(this.#url, this.#type, tx)).then((r) => tx.commit().then(() => r)).catch((e) => tx.rollback().then(() => { throw e; })); + } + + clear(): Promise { + return this.db() + .then((db) => + db.batch([ + { + sql: "DELETE FROM KV WHERE type = ?", + argss: [[this.#type]], + }, + ]), + ) + .then(() => { + /* empty */ + }); + // return this.db().then(db => db.execute("DELETE FROM KV WHERE type = ?", [this.#type])).then(() => { /* empty */ }); + } +} + +class FPSQLTableTX extends FPSQLTable { + readonly #tx: Omit; + constructor(url: string, type: string, tx: Omit) { + super(url, type); + this.#tx = tx; + } + db(): Promise { + return Promise.resolve(this.#tx as unknown as FPSql); + } +} + +export class FPFileDBImpl implements FPIndexedDB { + readonly #name: string; + constructor(name: string) { + this.#name = name; + } + close(): Promise { + return (this.fpSync.blockLogs() as FPSQLTable).db().then((db) => db.close()); + } + destroy(): Promise { + const url = URI.from(this.#name); + return sysFileSystemFactory(url).then((fs) => fs.rm(url.pathname)); + } + objectStore(_name: string): DBTable { + throw new Error("Method not implemented."); + } + + readonly fpSync = { + blockLogs: Lazy((): DBTable => new FPSQLTable(this.#name, "blockLogs")), + cidSets: Lazy((): DBTable => new FPSQLTable(this.#name, "cidSets")), + cars: Lazy((): DBTable => new FPSQLTable(this.#name, "cars")), + peers: Lazy((): DBTable => new FPSQLTable(this.#name, "peers")), + }; + version(): DBTable<{ version: string }> { + throw new Error("Method not implemented."); + } +} + +const keyedDB = new KeyedResolvOnce(); + +export function sysFileFPIndexedDB(sthis: SuperThis, uri: URI): Promise { + return keyedDB.get(uri.toString()).once(async () => new FPFileDBImpl(uri.toString())); +} diff --git a/core/gateways/indexeddb/dummy-idb.ts b/core/gateways/indexeddb/dummy-idb.ts index 3f79f1a2d..0fe89d22b 100644 --- a/core/gateways/indexeddb/dummy-idb.ts +++ b/core/gateways/indexeddb/dummy-idb.ts @@ -1,289 +1,56 @@ -import { - IDBPObjectStore, - TypedDOMStringList, - IDBPTransaction, - IDBPDatabase, - StoreNames, - DBSchema, - IDBPCursor, - IDBPCursorWithValue, - IDBPCursorWithValueIteratorValue, - IDBPIndex, - IndexNames, - StoreKey, - StoreValue, -} from "idb"; - -type ClearType = Mode extends "readonly" ? undefined : () => Promise; -type AddType< - DBTypes extends DBSchema | unknown, - StoreName extends StoreNames, - Mode extends IDBTransactionMode, -> = Mode extends "readonly" - ? undefined - : ( - value: StoreValue, - key?: IDBKeyRange | StoreKey | undefined, - ) => Promise>; -type PutType< - DBTypes extends DBSchema | unknown, - StoreName extends StoreNames, - Mode extends IDBTransactionMode, -> = Mode extends "readonly" - ? undefined - : ( - value: StoreValue, - key?: IDBKeyRange | StoreKey | undefined, - ) => Promise>; - -type DeleteType< - DBTypes extends DBSchema | unknown, - StoreName extends StoreNames, - Mode extends IDBTransactionMode, -> = Mode extends "readonly" ? undefined : (key: IDBKeyRange | StoreKey) => Promise; - -type CreateIndexType< - DBTypes extends DBSchema | unknown, - TxStores extends ArrayLike>, - StoreName extends StoreNames, - Mode extends IDBTransactionMode, -> = Mode extends "versionchange" - ? >( - name: IndexName, - keyPath: string | string[], - options?: IDBIndexParameters, - ) => IDBPIndex - : undefined; - -export class ReadDummyIDBPObjectStore< - DBTypes extends DBSchema | unknown = unknown, - TxStores extends ArrayLike> = ArrayLike>, - StoreName extends StoreNames = StoreNames, - Mode extends IDBTransactionMode = "readonly", -> implements IDBPObjectStore -{ - // readonly indexNames: TypedDOMStringList = undefined as unknown as TypedDOMStringList; - // readonly transaction: IDBPTransaction, "readonly">; - - readonly name: string; - readonly autoIncrement: boolean = false; - readonly keyPath: string | string[] = []; - readonly transaction: IDBPTransaction; - - constructor(name: string, transaction: IDBPTransaction) { - this.transaction = transaction; - this.name = name; +import { BlockLog, Cars, CidSet, DBTable, FPIndexedDB, KV, Peers } from "@fireproof/core-types-blockstore"; +import { Lazy, Result } from "@adviser/cement"; +class ReadDummyTable implements DBTable { + clear(): Promise { + throw new Error("ReadDummyTable:clear Method not implemented."); } - readonly indexNames: TypedDOMStringList> = undefined as unknown as TypedDOMStringList< - IndexNames - >; - - readonly add: AddType = (( - _value: StoreValue, - _key?: IDBKeyRange | StoreKey | undefined, - ): Promise> => { - throw new Error("add not implemented."); - }) as AddType; - - // = (_value: StoreValue, _key?: IDBKeyRange | StoreKey | undefined) => { - // throw new Error("add not implemented."); - // } as unknown as AddType; - - clear: ClearType = undefined as ClearType; - - createIndex: CreateIndexType = undefined as CreateIndexType< - DBTypes, - TxStores, - StoreName, - Mode - >; - - delete: DeleteType = (async (_key: IDBKeyRange | StoreKey): Promise => { - throw new Error("delete not implemented."); - }) as DeleteType; - - put: PutType = undefined as PutType; - - get(_query: IDBKeyRange | StoreKey): Promise | undefined> { - return Promise.resolve(undefined); - } - getAll( - _query?: IDBKeyRange | StoreKey | null | undefined, - _count?: number, - ): Promise[]> { - return Promise.resolve([]); - } - getAllKeys( - _query?: IDBKeyRange | StoreKey | null | undefined, - _count?: number, - ): Promise[]> { - return Promise.resolve([]); + add(..._t: KV[]): Promise[]>> { + throw new Error("ReadDummyTable:add Method not implemented."); } - getKey(_query: IDBKeyRange | StoreKey): Promise | undefined> { - return Promise.resolve(undefined); + delete(_key: TKey): Promise> { + throw new Error("ReadDummyTable:delete Method not implemented."); } - index>( - _name: IndexName, - ): IDBPIndex { - throw new Error("Method not implemented."); + get(_key: TKey): Promise> { + return Promise.resolve(Result.Ok(undefined)); + // throw new Error("ReadDummyTable:get Method not implemented."); } - openCursor( - _query?: IDBKeyRange | StoreKey | null | undefined, - _direction?: IDBCursorDirection, - ): Promise | null> { - throw new Error("Method not implemented."); + put(..._t: KV[]): Promise[]>> { + throw new Error("ReadDummyTable:put Method not implemented."); } - openKeyCursor( - _query?: IDBKeyRange | StoreKey | null | undefined, - _direction?: IDBCursorDirection, - ): Promise | null> { - throw new Error("Method not implemented."); + list(_start?: TKey | undefined, _end?: TKey | undefined): ReadableStream { + throw new Error("ReadDummyTable:list Method not implemented."); } - iterate( - _query?: IDBKeyRange | StoreKey | null | undefined, - _direction?: IDBCursorDirection, - ): AsyncIterableIterator> { - throw new Error("Method not implemented."); - } - [Symbol.asyncIterator](): AsyncIterableIterator> { - throw new Error("Method not implemented."); - } - deleteIndex(_name: string): void { - throw new Error("Method not implemented."); - } - - count(_key?: IDBKeyRange | IDBValidKey | null | undefined): Promise { - throw new Error("count not implemented."); + transaction(_fn: (tx: Omit, "transaction">) => Promise): Promise { + throw new Error("ReadDummyTable:transaction Method not implemented."); } } -export class ReadDummyIDBPDatabase implements IDBPDatabase { - get objectStoreNames(): TypedDOMStringList { - throw new Error("objectStoreNames not implemented."); - } - - readonly version: number; - readonly name: string; - constructor(name: string, version = 666) { - this.name = name; - this.version = version; - } - - createObjectStore( - _name: Name, - _optionalParameters?: IDBObjectStoreParameters, - ): IDBPObjectStore, Name, "versionchange"> { - throw new Error("createObjectStore not implemented."); - } - deleteObjectStore(_name: string): void { - throw new Error("deleteObjectStore not implemented."); - } - - transaction, Mode extends IDBTransactionMode = "readonly">( - storeNames: Name, - mode?: Mode, - options?: IDBTransactionOptions, - ): IDBPTransaction; - transaction>, Mode extends IDBTransactionMode = "readonly">( - _storeNames: Names, - _mode?: Mode, - _options?: IDBTransactionOptions, - ): IDBPTransaction { - return { - done: Promise.resolve(), - objectStore: function (this: IDBPTransaction, storeName: string) { - return new ReadDummyIDBPObjectStore(storeName, this); - }, - } as IDBPTransaction; - } - add(_storeName: Name, _value: never, _key?: IDBKeyRange | IDBValidKey | undefined): Promise { - throw new Error("add not implemented."); - } - clear(_name: string): Promise { - throw new Error("clear not implemented."); - } - count(_storeName: Name, _key?: IDBKeyRange | IDBValidKey | null | undefined): Promise { - throw new Error("count not implemented."); - } - countFromIndex( - _storeName: Name, - _indexName: IndexName, - _key?: IDBKeyRange | IDBValidKey | null | undefined, - ): Promise { - throw new Error("countFromIndex not implemented."); - } - delete(_storeName: Name, _key: IDBKeyRange | IDBValidKey): Promise { - return Promise.resolve(); - } - get(_storeName: Name, _query: IDBKeyRange | IDBValidKey): Promise { - throw new Error("get not implemented."); - } - getFromIndex( - _storeName: Name, - _indexName: IndexName, - _query: IDBKeyRange | IDBValidKey, - ): Promise { - throw new Error("getFromIndex not implemented."); - } - getAll( - _storeName: Name, - _query?: IDBKeyRange | IDBValidKey | null | undefined, - _count?: number, - ): Promise { - return Promise.resolve([]); - } - getAllFromIndex( - _storeName: Name, - _indexName: IndexName, - _query?: IDBKeyRange | IDBValidKey | null | undefined, - _count?: number, - ): Promise { - return Promise.resolve([]); - } - getAllKeys( - _storeName: Name, - _query?: IDBKeyRange | IDBValidKey | null | undefined, - _count?: number, - ): Promise { - return Promise.resolve([]); - } - getAllKeysFromIndex( - _storeName: Name, - _indexName: IndexName, - _query?: IDBKeyRange | IDBValidKey | null | undefined, - _count?: number, - ): Promise { - return Promise.resolve([]); - } - getKey(_storeName: Name, _query: IDBKeyRange | IDBValidKey): Promise { - return Promise.resolve(undefined); - } - getKeyFromIndex( - _storeName: Name, - _indexName: IndexName, - _query: IDBKeyRange | IDBValidKey, - ): Promise { - return Promise.resolve(undefined); - } - put(_storeName: Name, _value: unknown, _key?: IDBKeyRange | IDBValidKey | undefined): Promise { - throw new Error("put not implemented."); - } - - onabort: ((this: IDBDatabase, ev: Event) => never) | null = null; - onclose: ((this: IDBDatabase, ev: Event) => never) | null = null; - onerror: ((this: IDBDatabase, ev: Event) => never) | null = null; - - onversionchange: ((this: IDBDatabase, ev: IDBVersionChangeEvent) => never) | null = null; - close(): void { - throw new Error("close not implemented."); - } - addEventListener(_type: unknown, _listener: unknown, _options?: unknown): void { - throw new Error("addEventListener not implemented."); - } - removeEventListener(_type: unknown, _listener: unknown, _options?: unknown): void { - throw new Error("removeEventListener not implemented."); - } - dispatchEvent(_event: Event): boolean { - throw new Error("dispatchEvent not implemented."); +export class ReadDummyIDBPDatabase implements FPIndexedDB { + close(): Promise { + throw new Error("ReadDummyIDBPDatabase:close Method not implemented."); + } + destroy(): Promise { + throw new Error("ReadDummyIDBPDatabase:destroy Method not implemented."); + } + + readonly objectStore = Lazy((_name: string): DBTable => new ReadDummyTable()); + + readonly fpSync = { + blockLogs(): DBTable { + throw new Error("ReadDummyIDBPDatabase:fpSync.blockLogs Method not implemented."); + }, + cidSets(): DBTable { + throw new Error("ReadDummyIDBPDatabase:fpSync.cidSets Method not implemented."); + }, + cars(): DBTable { + throw new Error("ReadDummyIDBPDatabase:fpSync.cars Method not implemented."); + }, + peers(): DBTable { + throw new Error("ReadDummyIDBPDatabase:fpSync.peers Method not implemented."); + }, + }; + + version(): DBTable<{ version: string }> { + throw new Error("ReadDummyIDBPDatabase:version Method not implemented."); } } diff --git a/core/gateways/indexeddb/fp-db.ts b/core/gateways/indexeddb/fp-db.ts new file mode 100644 index 000000000..b91166974 --- /dev/null +++ b/core/gateways/indexeddb/fp-db.ts @@ -0,0 +1,52 @@ +import { KeyedResolvOnce, Lazy, URI } from "@adviser/cement"; +import { BlockLog, Cars, CidSet, Peers, FPIndexedDB, DBTable } from "@fireproof/core-types-blockstore"; +import { Dexie } from "dexie"; +import { WrapDexieTable } from "./wrap-dexie.js"; + +export class FPIndexedDBImpl implements FPIndexedDB { + readonly #db: Dexie; + constructor(uri: URI) { + // console.log("FPIndexedDBImpl", uri.pathname); + this.#db = new Dexie(uri.pathname); + this.#db.version(0.1).stores({ + version: "", + data: "", + wal: "", + meta: "", + "idx.data": "", + "idx.wal": "", + "idx.meta": "", + blockLogs: "seq", + cidSets: "cid", + cars: "carCid", + peers: "peerId", + }); + } + + close(): Promise { + return Promise.resolve(this.#db.close()); + } + destroy(): Promise { + return this.#db.delete(); + } + + #wrappedTables = new KeyedResolvOnce>(); + objectStore(name: string): DBTable { + return this.#wrappedTables.get(name).once(() => new WrapDexieTable(this.#db, this.#db.table(name), "")); + } + readonly version = Lazy((): DBTable<{ version: string }> => new WrapDexieTable(this.#db, this.#db.table("version"), "")); + readonly fpSync = { + blockLogs: Lazy((): DBTable => new WrapDexieTable(this.#db, this.#db.table("blockLogs"), "seq")), + cidSets: Lazy((): DBTable => new WrapDexieTable(this.#db, this.#db.table("cidSets"), "cid")), + cars: Lazy((): DBTable => new WrapDexieTable(this.#db, this.#db.table("cars"), "carCid")), + peers: Lazy((): DBTable => new WrapDexieTable(this.#db, this.#db.table("peers"), "peerId")), + }; + + // async open(): Promise { + // await this.#db.open(); + // } + + // async close(): Promise { + // await this.#db.close(); + // } +} diff --git a/core/gateways/indexeddb/fp-sync.ts b/core/gateways/indexeddb/fp-sync.ts index 60d9e9495..956c579e3 100644 --- a/core/gateways/indexeddb/fp-sync.ts +++ b/core/gateways/indexeddb/fp-sync.ts @@ -1,17 +1,10 @@ import { URI } from "@adviser/cement"; /// import { Level } from "level"; -import { FPSyncEntry, FPSyncProtocol } from "@fireproof/core-types-protocols-sync"; +// import { FPSyncEntry, FPSyncProtocol } from "@fireproof/core-types-protocols-sync"; import { SuperThis } from "@fireproof/core-types-base"; -import { sleep } from "@fireproof/core-runtime"; +import { FPIndexedDB } from "@fireproof/core-types-blockstore"; +import { FPIndexedDBImpl } from "./fp-db.js"; -export async function indexedDBFPSync(_sthis: SuperThis, uri: URI): Promise> { - console.log("indexedDBFPSync-0", uri.toString(), window.location.href); - await sleep(10000000); - //const x = await import("https://esm.sh/browser-level@3.0.0"); -// import { BrowserLevel } from "browser-level"; - console.log("indexedDBFPSync-1", uri.toString()); - // const bl = new x.BrowserLevel("xxxx") - //console.log("indexedDBFPSync", bl); -throw new Error("xxxx"); -// return bl; +export async function indexeddbFPIndexedDB(_sthis: SuperThis, uri: URI): Promise { + return Promise.resolve(new FPIndexedDBImpl(uri)); } diff --git a/core/gateways/indexeddb/gateway-impl.ts b/core/gateways/indexeddb/gateway-impl.ts index 7e53e2fcf..5f7ccf60f 100644 --- a/core/gateways/indexeddb/gateway-impl.ts +++ b/core/gateways/indexeddb/gateway-impl.ts @@ -1,26 +1,28 @@ -import { openDB, IDBPDatabase } from "idb"; +// import { openDB, IDBPDatabase } from "idb"; import { exception2Result, KeyedResolvOnce, ResolveOnce, Result, URI } from "@adviser/cement"; import { INDEXEDDB_VERSION } from "@fireproof/core-gateways-base"; import { NotFoundError, PARAM, SuperThis } from "@fireproof/core-types-base"; import { exceptionWrapper, getKey, getStore } from "@fireproof/core-runtime"; -import { Gateway, GetResult } from "@fireproof/core-types-blockstore"; +import { Gateway, GetResult, FPIndexedDB, toKV } from "@fireproof/core-types-blockstore"; import { ReadDummyIDBPDatabase } from "./dummy-idb.js"; +import { FPIndexedDBImpl } from "./fp-db.js"; +// import { Dexie } from "dexie"; function ensureVersion(url: URI): URI { return url.build().defParam(PARAM.VERSION, INDEXEDDB_VERSION).URI(); } interface IDBConn { - readonly db: IDBPDatabase; + readonly db: FPIndexedDB; readonly dbName: DbName; readonly version: string; readonly url: URI; } const onceIndexedDB = new KeyedResolvOnce(); -function sanitzeKey(key: string | string[]): string | string[] { - if (key.length === 1) { +function sanitzeKey(key: string | string[]): string { + if (Array.isArray(key)) { key = key[0]; } return key; @@ -30,21 +32,26 @@ const listDatabases = new ResolveOnce(); function onceCreateDB(dbName: DbName, url: URI, sthis: SuperThis): () => Promise { return async () => { - const db = await openDB(dbName.fullDb, 1, { - upgrade(db) { - ["version", "data", "wal", "meta", "idx.data", "idx.wal", "idx.meta"].map((store) => { - db.createObjectStore(store, { - autoIncrement: false, - }); - }); - }, - }); + const db = new FPIndexedDBImpl(url.build().pathname(dbName.fullDb).URI()); //dbName.fullDb); + // const db = await openDB(dbName.fullDb, 1, { + // upgrade(db) { + // ["version", "data", "wal", "meta", "idx.data", "idx.wal", "idx.meta"].map((store) => { + // db.createObjectStore(store, { + // autoIncrement: false, + // }); + // }); + // }, + // }); // console.log("created", dbName.fullDb, (new Error()).stack); listDatabases.reset(); // not cool but easy - const found = await db.get("version", "version"); + const rFound = await db.version().get("version"); + if (rFound.isErr()) { + throw rFound.Err(); + } + const found = rFound.Ok(); const version = ensureVersion(url).getParam(PARAM.VERSION) as string; if (!found) { - await db.put("version", { version }, "version"); + await db.version().put(toKV("version", { version })); } else if (found.version !== version) { sthis.logger.Warn().Url(url).Str("version", version).Str("found", found.version).Msg("version mismatch"); } @@ -69,7 +76,7 @@ async function connectIdb(style: "read" | "write" | "delete" | "close", url: URI if (!dbs.find((i) => i.name === dbName.fullDb)) { const verUrl = ensureVersion(url); return { - db: new ReadDummyIDBPDatabase(dbName.fullDb), + db: new ReadDummyIDBPDatabase(/*dbName.fullDb*/), dbName, version: verUrl.getParam(PARAM.VERSION, INDEXEDDB_VERSION), url: verUrl, @@ -129,17 +136,18 @@ export class IndexedDBGateway implements Gateway { // return deleteDB(getIndexedDBName(this.url).fullDb); const type = getStore(baseUrl, sthis, joinDBName).name; const idb = await connectIdb("write", baseUrl, sthis); - const trans = idb.db.transaction(type, "readwrite"); - const object_store = trans.objectStore(type); - // console.log("IndexedDBDataStore:destroy", type); - const toDelete = []; - for (let cursor = await object_store.openCursor(); cursor; cursor = await cursor.continue()) { - toDelete.push(cursor.primaryKey); - } - for (const key of toDelete) { - await trans.db.delete(type, key); - } - await trans.done; + // const trans = idb.db.transaction(type, "readwrite"); + // const object_store = idb.db.objectStore(type); + await idb.db.objectStore(type).clear(); + // // console.log("IndexedDBDataStore:destroy", type); + // const toDelete = []; + // for (let cursor = await object_store.openCursor(); cursor; cursor = await cursor.continue()) { + // toDelete.push(cursor.primaryKey); + // } + // for (const key of toDelete) { + // await trans.db.delete(type, key); + // } + // await trans.done; // console.log("IndexedDBDataStore:destroy-completed", type); }); } @@ -154,13 +162,17 @@ export class IndexedDBGateway implements Gateway { const store = getStore(url, sthis, joinDBName).name; sthis.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("getting"); const idb = await connectIdb("read", url, sthis); - const tx = idb.db.transaction([store], "readonly"); - const bytes = await tx.objectStore(store).get(sanitzeKey(key)); - await tx.done; + // const tx = idb.db.transaction([store], "readonly"); + const rBytes = await idb.db.objectStore(store).get(sanitzeKey(key)); + if (rBytes.isErr()) { + return Result.Err(rBytes.Err()); + } + const bytes = rBytes.Ok(); + // await tx.done; if (!bytes) { return Result.Err(new NotFoundError(`missing ${key} ${url.toString()}`)); } - return Promise.resolve(Result.Ok(bytes)); + return Result.Ok(bytes); }); } async put(url: URI, bytes: Uint8Array, sthis: SuperThis): Promise> { @@ -169,9 +181,9 @@ export class IndexedDBGateway implements Gateway { const store = getStore(url, sthis, joinDBName).name; sthis.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("putting"); const idb = await connectIdb("write", url, sthis); - const tx = idb.db.transaction([store], "readwrite"); - await tx.objectStore(store).put(bytes, sanitzeKey(key)); - await tx.done; + // const tx = idb.db.transaction([store], "readwrite"); + await idb.db.objectStore(store).put(toKV(sanitzeKey(key), bytes)); + // await tx.done; }); } async delete(url: URI, sthis: SuperThis) { @@ -180,9 +192,9 @@ export class IndexedDBGateway implements Gateway { const store = getStore(url, sthis, joinDBName).name; sthis.logger.Debug().Url(url).Str("key", key).Str("store", store).Msg("deleting"); const idb = await connectIdb("delete", url, sthis); - const tx = idb.db.transaction([store], "readwrite"); - await tx.objectStore(store).delete(sanitzeKey(key)); - await tx.done; + // const tx = idb.db.transaction([store], "readwrite"); + await idb.db.objectStore(store).delete(sanitzeKey(key)); + // await tx.done; return Result.Ok(undefined); }); } @@ -191,8 +203,12 @@ export class IndexedDBGateway implements Gateway { const ic = await connectIdb("read", url, sthis); const store = getStore(ic.url, sthis, joinDBName).name; sthis.logger.Debug().Str("key", key).Str("store", store).Msg("getting"); - let bytes = await ic.db.get(store, sanitzeKey(key)); - sthis.logger.Debug().Str("key", key).Str("store", store).Int("len", bytes.length).Msg("got"); + const rBytes = await ic.db.objectStore(store).get(sanitzeKey(key)); + if (rBytes.isErr()) { + return Result.Err(rBytes.Err()); + } + let bytes = rBytes.Ok(); + sthis.logger.Debug().Str("key", key).Str("store", store).Int("len", bytes?.length).Msg("got"); if (typeof bytes === "string") { bytes = sthis.txt.encode(bytes); } diff --git a/core/gateways/indexeddb/index.ts b/core/gateways/indexeddb/index.ts index b7af9f620..b298b95df 100644 --- a/core/gateways/indexeddb/index.ts +++ b/core/gateways/indexeddb/index.ts @@ -9,3 +9,5 @@ import { IndexedDBGateway as GatewayImpl } from "./gateway-impl.js"; export { GatewayImpl }; export * from "./fp-sync.js"; + +export * from "./fp-db.js"; diff --git a/core/gateways/indexeddb/key-bag-indexeddb.ts b/core/gateways/indexeddb/key-bag-indexeddb.ts index 0370bcbd6..2b010eb99 100644 --- a/core/gateways/indexeddb/key-bag-indexeddb.ts +++ b/core/gateways/indexeddb/key-bag-indexeddb.ts @@ -1,11 +1,20 @@ -import { IDBPDatabase, openDB } from "idb"; import { Logger, ResolveOnce, URI } from "@adviser/cement"; -import { KeyBagProvider, type SuperThis } from "@fireproof/core-types-base"; +import { KeyBagProvider, KeyedV2StorageKeyItem, type SuperThis } from "@fireproof/core-types-base"; import { getPath } from "@fireproof/core-gateways-base"; +import { Dexie, Table } from "dexie"; -export class KeyBagProviderIndexedDB implements KeyBagProvider { - readonly _db: ResolveOnce> = new ResolveOnce>(); +class KeyBagDB extends Dexie { + readonly bag!: Table; + constructor(name: string) { + super(name); + this.version(1).stores({ + bag: "id", + }); + } +} +export class KeyBagProviderIndexedDB implements KeyBagProvider { + readonly #db = new ResolveOnce(); readonly dbName: string; readonly url: URI; readonly logger: Logger; @@ -17,43 +26,44 @@ export class KeyBagProviderIndexedDB implements KeyBagProvider { this.dbName = getPath(this.url, this.sthis); } - async _prepare(): Promise> { - return this._db.once(async () => { - return await openDB(this.dbName, 1, { - upgrade(db) { - // console.log('upgrade:', dbName); - ["bag"].map((store) => { - db.createObjectStore(store, { - autoIncrement: false, - }); - }); - }, - }); + async _prepare(): Promise { + return this.#db.once(async () => { + const db = new KeyBagDB(this.dbName); + // db.version(1).stores({ + // blockLogs: "seq, car, type", + // cidSets: "cid, peers, type", + // cars: "carCid, peers, type", + // peers: "peerId, type", + // }); + return db.open().then(() => db); }); } async del(id: string): Promise { const db = await this._prepare(); - const tx = db.transaction(["bag"], "readwrite"); - await tx.objectStore("bag").delete(id); - await tx.done; + return db.bag.delete(id); + // const tx = db.transaction(["bag"], "readwrite"); + // await tx.objectStore("bag").delete(id); + // await tx.done; } async get(id: string): Promise | undefined> { const db = await this._prepare(); - const tx = db.transaction(["bag"], "readonly"); - const keyItem = await tx.objectStore("bag").get(id); - await tx.done; - if (!keyItem) { - return undefined; - } - return keyItem; + return db.bag.get(id); + // const tx = db.transaction(["bag"], "readonly"); + // const keyItem = await tx.objectStore("bag").get(id); + // await tx.done; + // if (!keyItem) { + // return undefined; + // } + // return keyItem; } - async set(id: string, item: NonNullable): Promise { + async set(id: string, item: KeyedV2StorageKeyItem): Promise { const db = await this._prepare(); - const tx = db.transaction(["bag"], "readwrite"); - await tx.objectStore("bag").put(item, id); - await tx.done; + return db.bag.put(item); + // const tx = db.transaction(["bag"], "readwrite"); + // await tx.objectStore("bag").put(item, id); + // await tx.done; } } diff --git a/core/gateways/indexeddb/package.json b/core/gateways/indexeddb/package.json index bb552a080..8bc627548 100644 --- a/core/gateways/indexeddb/package.json +++ b/core/gateways/indexeddb/package.json @@ -41,10 +41,8 @@ "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/core-types-blockstore": "workspace:0.0.0", - "@fireproof/core-types-protocols-sync": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", - "browser-level": "^3.0.0", - "idb": "^8.0.3", - "level": "^10.0.0" + "dexie": "^4.2.0", + "idb": "^8.0.3" } } diff --git a/core/gateways/indexeddb/wrap-dexie.ts b/core/gateways/indexeddb/wrap-dexie.ts new file mode 100644 index 000000000..cb041358e --- /dev/null +++ b/core/gateways/indexeddb/wrap-dexie.ts @@ -0,0 +1,81 @@ +import { exception2Result, Result } from "@adviser/cement"; +import { DBTable, KV } from "@fireproof/core-types-blockstore"; +import type { Dexie, Table } from "dexie"; + +export class WrapDexieTable implements DBTable { + readonly #table: Table; + readonly #db: Dexie; + readonly #pkKey: string; + constructor(db: Dexie, table: Table, pkKey: string) { + this.#table = table; + this.#db = db; + this.#pkKey = pkKey; + } + clear(): Promise { + return this.#table.clear(); + } + kv2keys(t: KV[]): string[] | undefined { + const needsKeys = t.filter(({ value }) => !this.containPrimaryKey(value)); + if (needsKeys.length && needsKeys.length !== t.length) { + throw new Error("primary key mix is not supported"); + } + return needsKeys.length ? needsKeys.map(({ key }) => key) : undefined; + } + async add(...t: KV[]): Promise[]>> { + return this.#table + .bulkAdd( + t.map((kv) => kv.value), + this.kv2keys(t), + ) + .then(() => Result.Ok(t)) + .catch((e) => Result.Err(e)); + } + delete(key: string): Promise> { + return exception2Result(() => this.#table.delete(key)); + } + get(key: string): Promise> { + return this.#table + .get(key) + .then((v) => Result.Ok(v)) + .catch((e) => Result.Err(e)); + } + containPrimaryKey(t: T): boolean { + if (typeof t !== "object" || t === null) return false; + const pks = [this.#table.schema.primKey.keyPath].flat(); + return pks.filter((k) => t[k as keyof T]).length === pks.length; + } + + async put(...t: KV[]): Promise[]>> { + return this.#table + .bulkPut( + t.map(({ value }) => value), + this.kv2keys(t), + ) + .then(() => Result.Ok(t)) + .catch((e) => Result.Err(e)); + } + list(_start?: string, _end?: string): ReadableStream { + return new ReadableStream({ + start: (controller) => { + this.#table + .each((blockLog, cursor) => { + if (typeof _start === "string" && cursor.primaryKey.localeCompare(_start) < 0) return; + if (typeof _end === "string" && cursor.primaryKey.localeCompare(_end) > 0) return; + controller.enqueue(blockLog); + }) + .then(() => controller.close()); + // .where(this.#pkKey) + // .between(start ?? "", end ?? "") + // .each((blockLog) => { + // controller.enqueue(blockLog); + // }).then(() => controller.close()); + // controller.close(); + }, + }); + } + transaction(fn: (tx: Omit, "transaction">) => Promise): Promise { + return this.#db.transaction("rw", this.#table.name, (tx) => + fn(new WrapDexieTable(this.#db, tx.table(this.#table.name), this.#pkKey)), + ); + } +} diff --git a/core/gateways/memory/fp-sync.ts b/core/gateways/memory/fp-sync.ts deleted file mode 100644 index f386f0d6e..000000000 --- a/core/gateways/memory/fp-sync.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { URI } from "@adviser/cement"; -import { MemoryLevel } from "memory-level"; -import { FPSyncEntry, FPSyncProtocol } from "@fireproof/core-types-protocols-sync"; -import { SuperThis } from "@fireproof/core-types-base"; - -export async function memoryFPSync(_sthis: SuperThis, _uri: URI): Promise> { - return new MemoryLevel(); -} diff --git a/core/gateways/memory/gateway.ts b/core/gateways/memory/gateway.ts index 0f439aa24..7fd0265ba 100644 --- a/core/gateways/memory/gateway.ts +++ b/core/gateways/memory/gateway.ts @@ -1,8 +1,19 @@ -import { Result, URI } from "@adviser/cement"; +import { Lazy, Result, URI } from "@adviser/cement"; import { NotFoundError, PARAM, SuperThis } from "@fireproof/core-types-base"; -import { Gateway, GetResult, VoidResult } from "@fireproof/core-types-blockstore"; +import { + BlockLog, + Cars, + CidSet, + DBTable, + FPIndexedDB, + Gateway, + GetResult, + KV, + Peers, + VoidResult, +} from "@fireproof/core-types-blockstore"; import { MEMORY_VERSION } from "./version.js"; -import { ensureLogger } from "@fireproof/core-runtime"; +import { consumeIterator, consumeStream, ensureLogger } from "@fireproof/core-runtime"; function cleanURI(uri: URI): URI { return uri @@ -18,6 +29,163 @@ function cleanURI(uri: URI): URI { .URI(); } +class MemoryTable implements DBTable { + readonly memories: Map; + readonly segment: string; + readonly type: string; + readonly pkKey: string; + constructor(memories: Map, segment: string, type: string, pkKey: string) { + this.memories = memories; + this.segment = segment; + this.type = type; + this.pkKey = pkKey; + } + key(t: T): TKey { + return `${this.segment}:${this.type}:${t[this.pkKey as keyof T] as string}` as TKey; + } + keys(t: KV[]): Result { + const keys = t.filter(({ value }) => !!value[this.pkKey as keyof T]).map(({ value }) => this.key(value)); + if (keys.length !== t.length) { + return Result.Err(`primary key must set: ${this.pkKey}`); + } + return Result.Ok(keys); + } + + // bulkAdd(ts: T[]): Promise; + add(...t: KV[]): Promise[]>> { + const rKeys = this.keys(t); + if (rKeys.isErr()) { + return Promise.resolve(Result.Err(rKeys.Err())); + } + if (rKeys.Ok().filter((key) => this.memories.has(key as string)).length) { + return Promise.resolve(Result.Err("already exists")); + } + rKeys.Ok().forEach((key, i) => { + this.memories.set(key as string, t[i].value as unknown as Uint8Array); + }); + return Promise.resolve(Result.Ok(t)); + } + delete(key: TKey): Promise> { + const iKey = this.key({ [this.pkKey]: key } as T); + this.memories.delete(iKey as string); + return Promise.resolve(Result.Ok(undefined)); + } + get(key: TKey): Promise> { + const iKey = this.key({ [this.pkKey]: key } as T); + if (this.memories.has(iKey as string)) { + return Promise.resolve(Result.Ok(this.memories.get(iKey as string) as unknown as T)); + } + return Promise.resolve(Result.Ok(undefined)); + } + put(...t: KV[]): Promise[]>> { + const rKeys = this.keys(t); + if (rKeys.isErr()) { + return Promise.resolve(Result.Err(rKeys.Err())); + } + rKeys.Ok().forEach((key, i) => { + this.memories.set(key as string, t[i].value as unknown as Uint8Array); + }); + return Promise.resolve(Result.Ok(t)); + } + + list(start?: TKey, end?: TKey): ReadableStream { + return new ReadableStream({ + start: (controller) => { + const collection = this.key({ [this.pkKey]: "" } as T) as string; + const sKey = this.key({ [this.pkKey]: start ?? "" } as T) as string; + const eKey = this.key({ [this.pkKey]: end ?? "" } as T) as string; + let match: (v: [string, unknown]) => boolean; + if (start && end) { + match = ([k]) => k.startsWith(collection) && k.localeCompare(sKey) >= 0 && k.localeCompare(eKey) <= 0; + } else if (start) { + match = ([k]) => k.startsWith(collection) && k.localeCompare(sKey) >= 0; + } else if (end) { + match = ([k]) => k.startsWith(collection) && k.localeCompare(eKey) <= 0; + } else { + match = ([k]) => k.startsWith(k); + } + const citer = this.memories.entries(); + const items: [string, unknown][] = []; + consumeIterator(citer, (kv) => { + if (match(kv)) { + items.push(kv); + } + }) + .then(() => + consumeIterator(items.sort((a, b) => a[0].localeCompare(b[0])).values(), (kv) => { + controller.enqueue(kv[1] as unknown as T); + }), + ) + .then(() => controller.close()) + .catch((e) => controller.error(e)); + }, + }); + } + transaction(fn: (tx: Omit, "transaction">) => Promise): Promise { + return fn(this); + } + clear(): Promise { + const toDelete: TKey[] = []; + return consumeStream(this.list(), (t) => { + toDelete.push(this.key(t)); + }).then(() => { + for (const key of toDelete) { + this.memories.delete(key as string); + } + }); + } +} + +export class FPMemoryDBImpl implements FPIndexedDB { + readonly uri: URI; + readonly #memories: Map; + constructor(uri: URI, memories: Map) { + this.#memories = memories; + this.uri = uri; + } + + close(): Promise { + return Promise.resolve(); + } + destroy(): Promise { + const toDelete = []; + for (const key of this.#memories.keys()) { + if (key.startsWith(this.uri.pathname)) { + toDelete.push(key); + } + } + for (const key of toDelete) { + this.#memories.delete(key); + } + return Promise.resolve(); + } + + objectStore(_name: string): DBTable { + throw new Error("Method not implemented."); + } + version(): DBTable<{ version: string }> { + throw new Error("Method not implemented."); + } + readonly fpSync = { + blockLogs: Lazy((): DBTable => new MemoryTable(this.#memories, this.uri.pathname, "blockLogs", "seq")), + cidSets: Lazy((): DBTable => new MemoryTable(this.#memories, this.uri.pathname, "cidSets", "cid")), + cars: Lazy((): DBTable => new MemoryTable(this.#memories, this.uri.pathname, "cars", "carCid")), + peers: Lazy((): DBTable => new MemoryTable(this.#memories, this.uri.pathname, "peers", "peerId")), + }; + + // async open(): Promise { + // await this.#db.open(); + // } + + // async close(): Promise { + // await this.#db.close(); + // } +} + +export function memFPIndexedDB(_sthis: SuperThis, uri: URI, memories: Map): Promise { + return Promise.resolve(new FPMemoryDBImpl(uri, memories)); +} + export class MemoryGateway implements Gateway { readonly memories: Map; readonly sthis: SuperThis; diff --git a/core/gateways/memory/package.json b/core/gateways/memory/package.json index 97b722072..8f671c631 100644 --- a/core/gateways/memory/package.json +++ b/core/gateways/memory/package.json @@ -46,9 +46,6 @@ "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/core-types-blockstore": "workspace:0.0.0", - "@fireproof/core-types-protocols-sync": "workspace:0.0.0", - "@fireproof/vendor": "workspace:0.0.0", - "level": "^10.0.0", - "memory-level": "^3.1.0" + "@fireproof/vendor": "workspace:0.0.0" } } diff --git a/core/protocols/sync/block-log-svc.ts b/core/protocols/sync/block-log-svc.ts index 8aa7a9582..6baf1f75f 100644 --- a/core/protocols/sync/block-log-svc.ts +++ b/core/protocols/sync/block-log-svc.ts @@ -1,11 +1,11 @@ -import { BlockLog, BlockLogSchema } from "@fireproof/core-types-protocols-sync"; -import { SyncDatabase } from "./sync-db.js"; -import { exception2Result, Result } from "@adviser/cement"; +import { BlockLog, BlockLogSchema, DBTable, toKV } from "@fireproof/core-types-blockstore"; +import { Result } from "@adviser/cement"; +import { WithSuperThis } from "@fireproof/core-types-base"; type CreateBlockLog = Omit, "seq"> & { seq?: string }; export const BlockLogService = { - create: async (db: SyncDatabase, blockLog: CreateBlockLog): Promise> => { + create: async (db: WithSuperThis>, blockLog: CreateBlockLog): Promise> => { const entry: BlockLog = { type: "block", seq: blockLog.seq || db.sthis.timeOrderedNextId().str, @@ -16,20 +16,30 @@ export const BlockLogService = { if (!validated.success) { return Result.Err(validated.error); } - return exception2Result(() => db.blockLogs.add(validated.data).then((_) => validated.data)) + return db.add(toKV(validated.data.seq, validated.data)).then((rKv) => { + switch (true) { + case rKv.isErr(): + return Result.Err(rKv); + case rKv.isOk(): + return Result.Ok(rKv.Ok()[0].value); + default: + return Result.Err(new Error("unknown result")); + } + }); }, - getBySeq: (db: SyncDatabase, seq = ""): ReadableStream => { - return new ReadableStream({ - start: (controller) => { - db.blockLogs - .where("seq") - .aboveOrEqual(seq) - .each((blockLog) => { - controller.enqueue(blockLog); - }).then(() => controller.close()); - // controller.close(); - }, - }); + getBySeq: (db: DBTable, seq = ""): ReadableStream => { + return db.list(seq); + // return new ReadableStream({ + // start: (controller) => { + // db.l + // .where("seq") + // .aboveOrEqual(seq) + // .each((blockLog) => { + // controller.enqueue(blockLog); + // }).then(() => controller.close()); + // // controller.close(); + // }, + // }); }, }; diff --git a/core/protocols/sync/car-svc.ts b/core/protocols/sync/car-svc.ts index d13743f3d..cb2314615 100644 --- a/core/protocols/sync/car-svc.ts +++ b/core/protocols/sync/car-svc.ts @@ -1,43 +1,45 @@ -import { Cars, CarsSchema } from "@fireproof/core-types-protocols-sync"; -import { SyncDatabase } from "./sync-db.js"; -import { exception2Result, Result } from "@adviser/cement"; +import { Cars, CarsSchema, DBTable, toKV } from "@fireproof/core-types-blockstore"; +import { Result } from "@adviser/cement"; type CreateCars = Omit; export const CarsService = { - get: async (db: SyncDatabase, carCid: string): Promise> => { - return exception2Result(async () => { - const cars = await db.cars.get(carCid); - return cars; - }); + get: async (db: DBTable, carCid: string): Promise> => { + return db.get(carCid); }, - upsert: async (db: SyncDatabase, cars: CreateCars): Promise> => { - return exception2Result(async () => { - const entry: Cars = { - type: "cars", - ...cars, - }; - // Validate with Zod schema - const validated = CarsSchema.safeParse(entry); - if (!validated.success) { - throw validated.error; - } + upsert: async (db: DBTable, cars: CreateCars): Promise> => { + const entry: Cars = { + type: "cars", + ...cars, + }; + // Validate with Zod schema + const validated = CarsSchema.safeParse(entry); + if (!validated.success) { + return Result.Err(validated.error); + } - let existing: Cars | undefined; - await db.transaction("rw", ["cars"], async () => { - const fromGet = (await db.cars.get(cars.carCid)) || { peers: [] }; - existing = { - ...fromGet, - ...validated.data, - peers: fromGet.peers ? [...new Set([...fromGet.peers, ...validated.data.peers])] : validated.data.peers, - }; - await db.cars.put(existing); - }); - if (!existing) { - throw new Error("Failed to upsert cars"); + return db.transaction(async (db) => { + const rFromGet = await db.get(cars.carCid); + if (rFromGet.isErr()) { + return Result.Err(rFromGet); } - return existing; + const fromGet = rFromGet.Ok() || { peers: [] }; + const existing = { + ...fromGet, + ...validated.data, + peers: fromGet.peers ? [...new Set([...fromGet.peers, ...validated.data.peers])] : validated.data.peers, + }; + return db.put(toKV(existing.carCid, existing)).then((rKv) => { + switch (true) { + case rKv.isErr(): + return Result.Err(rKv); + case rKv.isOk(): + return Result.Ok(rKv.Ok()[0].value); + default: + return Result.Err(new Error("unknown result")); + } + }); }); }, }; diff --git a/core/protocols/sync/cid-set-svc.ts b/core/protocols/sync/cid-set-svc.ts index bded4f635..a24aafcba 100644 --- a/core/protocols/sync/cid-set-svc.ts +++ b/core/protocols/sync/cid-set-svc.ts @@ -1,37 +1,48 @@ - -import { CidSet, CidSetSchema } from "@fireproof/core-types-protocols-sync"; -import { SyncDatabase } from "./sync-db.js"; -import { exception2Result, Result } from "@adviser/cement"; +import { CidSet, CidSetSchema, DBTable, toKV } from "@fireproof/core-types-blockstore"; +import { Result } from "@adviser/cement"; type CreateCidSet = Omit; export const CidSetService = { - get: async (db: SyncDatabase, cid: string): Promise> => { - return exception2Result(async () => { - const cidSet = await db.cidSets.get(cid); - return cidSet; - }); + get: async (db: DBTable, cid: string): Promise> => { + return db.get(cid); }, - put: async (db: SyncDatabase, cidSet: CreateCidSet | CreateCidSet[]): Promise> => { + put: async (db: DBTable, cidSet: CreateCidSet | CreateCidSet[]): Promise> => { const iSet = Array.isArray(cidSet) ? cidSet : [cidSet]; - const entries: Result[] = iSet.map((cidSet) => { - return { - type: "cidSet", - ...cidSet, - }; - }).map((i) => CidSetSchema.safeParse(i)).map((i) => { - if (!i.success) { - return Result.Err(i.error); - } - return Result.Ok(i.data); - }); + const entries: Result[] = iSet + .map((cidSet) => { + return { + type: "cidSet", + ...cidSet, + }; + }) + .map((i) => CidSetSchema.safeParse(i)) + .map((i) => { + if (!i.success) { + return Result.Err(i.error); + } + return Result.Ok(i.data); + }); if (entries.some((i) => i.isErr())) { - return Result.Err(entries.filter((i) => i.isErr()).map((i) => i.Err().message).join("\n")); + return Result.Err( + entries + .filter((i) => i.isErr()) + .map((i) => i.Err().message) + .join("\n"), + ); } - const okEntries = entries.map((i) => i.Ok()); - return exception2Result(() => db.cidSets.bulkAdd(okEntries).then(() => okEntries)); + const okEntries = entries.map((i) => toKV(i.Ok().cid, i.Ok())); + return db.add(...okEntries).then((rKv) => { + switch (true) { + case rKv.isErr(): + return Result.Err(rKv); + case rKv.isOk(): + return Result.Ok(rKv.Ok().map((i) => i.value)); + default: + return Result.Err("unknown result"); + } + }); }, }; - diff --git a/core/protocols/sync/index.ts b/core/protocols/sync/index.ts index f18f41270..5b825c64c 100644 --- a/core/protocols/sync/index.ts +++ b/core/protocols/sync/index.ts @@ -1,5 +1,5 @@ -export * from './block-log-svc.js' -export * from './cid-set-svc.js' -export * from './car-svc.js' -export * from './peer-svc.js' -export * from './sync-db.js' +export * from "./block-log-svc.js"; +export * from "./cid-set-svc.js"; +export * from "./car-svc.js"; +export * from "./peer-svc.js"; +export * from "./sync-db.js"; diff --git a/core/protocols/sync/package.json b/core/protocols/sync/package.json index 49722e09a..5304a91bd 100644 --- a/core/protocols/sync/package.json +++ b/core/protocols/sync/package.json @@ -39,7 +39,7 @@ "@adviser/cement": "^0.4.32", "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", - "@fireproof/core-types-protocols-sync": "workspace:0.0.0", + "@fireproof/core-types-blockstore": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", "dexie": "^4.2.0" } diff --git a/core/protocols/sync/peer-svc.ts b/core/protocols/sync/peer-svc.ts index e7f4eb462..0b844dde4 100644 --- a/core/protocols/sync/peer-svc.ts +++ b/core/protocols/sync/peer-svc.ts @@ -1,48 +1,54 @@ -import { Peers, PeersSchema } from "@fireproof/core-types-protocols-sync"; -import { SyncDatabase } from "./sync-db.js"; -import { exception2Result, Result } from "@adviser/cement"; +import { DBTable, Peers, PeersSchema, toKV } from "@fireproof/core-types-blockstore"; +import { Result } from "@adviser/cement"; import { hashBufferCID } from "@fireproof/core-runtime"; -type CreatePeers = Omit, "peerId">, "created">, "isLocal"> & { peerId?: string; created?: number; isLocal?: boolean }; +type CreatePeers = Omit, "peerId">, "created">, "isLocal"> & { + peerId?: string; + created?: number; + isLocal?: boolean; +}; export const PeersService = { - get: async (db: SyncDatabase, peerId: string): Promise> => { - return exception2Result(async () => { - const peers = await db.peers.get(peerId); - return peers; - }); + get: async (db: DBTable, peerId: string): Promise> => { + return db.get(peerId); }, - upsert: async (db: SyncDatabase, peers: CreatePeers): Promise> => { - return exception2Result(async () => { - const entry: Peers = { - type: "peers", - ...peers, - isLocal: peers.isLocal || false, - created: typeof peers.created === 'number' ? peers.created : Date.now(), - peerId: peers.peerId || (await hashBufferCID(peers.url)).toString() - }; - // Validate with Zod schema - const validated = PeersSchema.safeParse(entry); - if (!validated.success) { - throw validated.error; - } + upsert: async (db: DBTable, peers: CreatePeers): Promise> => { + const entry: Peers = { + type: "peers", + ...peers, + isLocal: peers.isLocal || false, + created: typeof peers.created === "number" ? peers.created : Date.now(), + peerId: peers.peerId || (await hashBufferCID(peers.url)).toString(), + }; + // Validate with Zod schema + const validated = PeersSchema.safeParse(entry); + if (!validated.success) { + return Result.Err(validated.error); + } - // console.log("upserting peers", validated.data); - let result: Peers | undefined; - await db.transaction("rw", ["peers"], async () => { - const existing = await db.peers.get(validated.data.peerId) || { created: 0 };; - result = { - ...existing, - ...validated.data, - created: existing.created || validated.data.created, - }; - await db.peers.put(result); - }); - if (!result) { - throw new Error("Failed to upsert peers"); + // console.log("upserting peers", validated.data); + return db.transaction(async (tx) => { + const rExisting = await tx.get(validated.data.peerId); + if (rExisting.isErr()) { + return Result.Err(rExisting); } - return result; + const existing = rExisting.Ok() || { created: 0 }; + const result = { + ...existing, + ...validated.data, + created: existing.created || validated.data.created, + }; + return tx.put(toKV(result.peerId, result)).then((rKv) => { + switch (true) { + case rKv.isErr(): + return Result.Err(rKv); + case rKv.isOk(): + return Result.Ok(rKv.Ok()[0].value); + default: + return Result.Err(new Error("unknown result")); + } + }); }); }, -}; \ No newline at end of file +}; diff --git a/core/protocols/sync/sync-block-log.ts b/core/protocols/sync/sync-block-log.ts deleted file mode 100644 index 8b1378917..000000000 --- a/core/protocols/sync/sync-block-log.ts +++ /dev/null @@ -1 +0,0 @@ - diff --git a/core/protocols/sync/sync-db.ts b/core/protocols/sync/sync-db.ts index 05f0623c9..4be73a723 100644 --- a/core/protocols/sync/sync-db.ts +++ b/core/protocols/sync/sync-db.ts @@ -1,73 +1,72 @@ -import { BlockLog, Cars, CidSet, Peers } from "@fireproof/core-types-protocols-sync"; -import { Logger, CoerceURI, URI } from "@adviser/cement"; -import { Dexie, Table, TransactionMode } from "dexie"; -import { SuperThis } from "@fireproof/core-types-base"; -import { ensureLogger } from "@fireproof/core-runtime"; +// import { BlockLog, Cars, CidSet, Peers } from "@fireproof/core-types-blockstore"; +// import { CoerceURI, URI } from "@adviser/cement"; +// import { Dexie, Table, TransactionMode } from "dexie"; +// import { SuperThis } from "@fireproof/core-types-base"; -export class SyncDatabase { - readonly sthis: SuperThis; - readonly logger: Logger; - db!: Dexie; - // readonly blockLogs!: Table; - readonly url: URI; +// export class SyncDatabase { +// readonly sthis: SuperThis; +// // readonly logger: Logger; +// db!: Dexie; +// // readonly blockLogs!: Table; +// readonly url: URI; - constructor(sthis: SuperThis, url: CoerceURI) { - this.sthis = sthis; - this.logger = ensureLogger(sthis, "SyncDatabase"); - this.url = URI.from(url); - } +// constructor(sthis: SuperThis, url: CoerceURI) { +// this.sthis = sthis; +// // this.logger = ensureLogger(sthis, "SyncDatabase"); +// this.url = URI.from(url); +// } - transaction(mode: TransactionMode, storeNames: string[], fn: () => Promise): Promise { - return this.db.transaction(mode, storeNames, fn); - } +// transaction(mode: TransactionMode, storeNames: string[], fn: () => Promise): Promise { +// return this.db.transaction(mode, storeNames, fn); +// } - get blockLogs(): Table { - return (this.db as unknown as { blockLogs: Table }).blockLogs; - } +// get blockLogs(): Table { +// return (this.db as unknown as { blockLogs: Table }).blockLogs; +// } - get cidSets(): Table { - return (this.db as unknown as { cidSets: Table }).cidSets; - } +// get cidSets(): Table { +// return (this.db as unknown as { cidSets: Table }).cidSets; +// } - get cars(): Table { - return (this.db as unknown as { cars: Table }).cars; - } +// get cars(): Table { +// return (this.db as unknown as { cars: Table }).cars; +// } - get peers(): Table { - return (this.db as unknown as { peers: Table }).peers; - } +// get peers(): Table { +// return (this.db as unknown as { peers: Table }).peers; +// } - async consumeStream(stream: ReadableStream, cb: (value: T) => void): Promise { - const reader = stream.getReader(); - async function readNext() { - const { done, value } = await reader.read(); - if (done) return; - cb(value); - return readNext(); - } - return readNext(); - } +// async consumeStream(stream: ReadableStream, cb: (value: T) => void): Promise { +// const reader = stream.getReader(); +// async function readNext() { +// const { done, value } = await reader.read(); +// if (done) return; +// cb(value); +// return readNext(); +// } +// return readNext(); +// } - async close() { - await this.db.close(); - } - async destroy() { - await this.db.delete({ - disableAutoOpen: true, - }); - } +// async close() { +// await this.db.close(); +// } +// async destroy() { +// await this.db.delete({ +// disableAutoOpen: true, +// }); +// } - async ready() { - this.db = new Dexie("sync", { - indexedDB: indexedDB, - IDBKeyRange: IDBKeyRange, - }); - this.db.version(1).stores({ - blockLogs: "seq, car, type", - cidSets: "cid, peers, type", - cars: "carCid, peers, type", - peers: "peerId, type", - }); - await this.db.open(); - } -} +// async ready() { +// this.db = new Dexie("sync", { +// indexedDB: indexedDB, +// IDBKeyRange: IDBKeyRange, +// }); +// this.db.version(1).stores({ +// blockLogs: "seq, car, type", +// cidSets: "cid, peers, type", +// cars: "carCid, peers, type", +// peers: "peerId, type", +// }); +// await this.db.open(); +// } +// } diff --git a/core/runtime/utils.ts b/core/runtime/utils.ts index 8a0697fc3..3d28bb1c8 100644 --- a/core/runtime/utils.ts +++ b/core/runtime/utils.ts @@ -576,12 +576,11 @@ export async function hashObjectCID, S>(o: T): Promise< } export async function hashBufferCID(i: T): Promise { - let o: ToUInt8; if (typeof i === "string") { o = txtOps.encode(i); } else { - o = i + o = i; } const bytes = await coercePromiseIntoUint8(o); const hash = await sha256.digest(bytes.Ok()); @@ -623,3 +622,34 @@ export function deepFreeze(o?: T): T | undefined { } return o; } + +export function consumeStream(stream: ReadableStream, cb: (msg: E) => void): Promise { + const reader = stream.getReader(); + async function readNext() { + const { done, value } = await reader.read(); + if (done) return; + cb(value); + return readNext(); + } + return readNext(); +} + +function step(iter: IterableIterator, cb: (msg: E) => void, resolve: () => void, chunk: number, i: number): void { + const { done, value } = iter.next(); + if (done) { + resolve(); + return; + } + cb(value); + if (i >= chunk) { + setTimeout(() => step(iter, cb, resolve, chunk, 0), 0); + return; + } + return step(iter, cb, resolve, chunk, i + 1); +} + +export function consumeIterator(iter: IterableIterator, cb: (msg: E) => void): Promise { + return new Promise((resolve) => { + step(iter, cb, resolve, 16, 0); + }); +} diff --git a/core/tests/blockstore/interceptor-gateway.test.ts b/core/tests/blockstore/interceptor-gateway.test.ts index 4d7179313..f221576f8 100644 --- a/core/tests/blockstore/interceptor-gateway.test.ts +++ b/core/tests/blockstore/interceptor-gateway.test.ts @@ -220,7 +220,7 @@ describe("InterceptorGateway", () => { gateway: async (sthis) => { return new URITrackGateway(sthis, new Map(), gwUris); }, - fpsync: async () => { + fpIndexedDB: async () => { throw new Error("fpsync for uriTest: Not implemented"); }, }); diff --git a/core/tests/blockstore/keyed-crypto-indexeddb-file.test.ts b/core/tests/blockstore/keyed-crypto-indexeddb-file.test.ts index 1779308b2..11e10419f 100644 --- a/core/tests/blockstore/keyed-crypto-indexeddb-file.test.ts +++ b/core/tests/blockstore/keyed-crypto-indexeddb-file.test.ts @@ -65,8 +65,8 @@ describe("KeyBag indexeddb and file", () => { const provider = await kb.rt.getBagProvider(); if (runtimeFn().isBrowser) { const p = provider as KeyBagProviderIndexedDB; - diskBag = await p._prepare().then((db) => db.get("bag", name)); - diskBag2 = await p._prepare().then((db) => db.get("bag", name2)); + diskBag = await p._prepare().then((db) => db.bag.get(name) as Promise); + diskBag2 = await p._prepare().then((db) => db.bag.get(name2) as Promise); } else { const p = provider as KeyBagProviderFile; const { sysFS } = await p._prepare(name); diff --git a/core/tests/blockstore/keyed-crypto.test.ts b/core/tests/blockstore/keyed-crypto.test.ts index 99cc9e4ce..bf2bd9ec5 100644 --- a/core/tests/blockstore/keyed-crypto.test.ts +++ b/core/tests/blockstore/keyed-crypto.test.ts @@ -109,8 +109,8 @@ describe("KeyBag", () => { const provider = await kb.rt.getBagProvider(); if (runtimeFn().isBrowser) { const p = provider as KeyBagProviderIndexedDB; - diskBag = await p._prepare().then((db) => db.get("bag", name)); - diskBag2 = await p._prepare().then((db) => db.get("bag", name2)); + diskBag = await p._prepare().then((db) => db.bag.get(name) as Promise); + diskBag2 = await p._prepare().then((db) => db.bag.get(name2) as Promise); } else { const p = provider as KeyBagProviderFile; if (typeof p._prepare !== "function") { diff --git a/core/tests/fireproof/database.test.ts b/core/tests/fireproof/database.test.ts index 3a4035440..ad50ef2d8 100644 --- a/core/tests/fireproof/database.test.ts +++ b/core/tests/fireproof/database.test.ts @@ -642,7 +642,7 @@ describe("StoreURIRuntime", () => { gateway: function (): Promise { throw new Error("Function not implemented."); }, - fpsync: async () => { + fpIndexedDB: async () => { throw new Error("fpsync for murks: Not implemented"); }, }); diff --git a/core/tests/gateway/indexeddb/create-db-on-write.test.ts b/core/tests/gateway/indexeddb/create-db-on-write.test.ts index 894222f53..29cd79b36 100644 --- a/core/tests/gateway/indexeddb/create-db-on-write.test.ts +++ b/core/tests/gateway/indexeddb/create-db-on-write.test.ts @@ -93,6 +93,7 @@ describe("IndexedDB create on write", () => { describe("action is not creating a db", () => { it("del", async () => { + // eslint-disable-next-line no-console console.warn(`⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️ The Core writes on del currently that should not the case on empty db's`); // const dbName = `indexdb-${sthis.nextId().str}`; // const db = fireproof(dbName); @@ -191,7 +192,6 @@ describe("IndexedDB create on write", () => { it.each(notCreating)("was created $name", async (item) => { await item.action(db); const idbs = await indexedDB.databases(); - // console.log("idbs", idbs, dbName); expect(idbs.find((i) => i.name === `fp.${dbName}`)).toBeDefined(); }); }); diff --git a/core/tests/gateway/indexeddb/dexie-transition.test.ts b/core/tests/gateway/indexeddb/dexie-transition.test.ts new file mode 100644 index 000000000..d2cd929fb --- /dev/null +++ b/core/tests/gateway/indexeddb/dexie-transition.test.ts @@ -0,0 +1,55 @@ +import { fireproof } from "@fireproof/core"; +import { describe, expect, it, vi } from "vitest"; +import { Dexie } from "dexie"; +import { consumeStream, ensureSuperThis, runtimeFn } from "@fireproof/core-runtime"; +import { defaultGatewayFactoryItem } from "@fireproof/core-blockstore"; + +describe("dexie", () => { + const sthis = ensureSuperThis(); + const gw = defaultGatewayFactoryItem(); + it("should work", async () => { + Dexie.delete("fp.test-dexie"); + const x = fireproof("test-dexie"); + await x.put({ _id: "test", foo: "bar" }); + await x.close(); + // const ddb = new FPIndexedDB("fp.test-dexie"); + + if (runtimeFn().isBrowser) { + const url = gw.defaultURI(sthis).build().pathname("fp.test-dexie").URI(); + // console.log("url", url.toString()); + const ddb = await gw.fpIndexedDB(sthis, url); + const dataFn = vi.fn(); + const metaFn = vi.fn(); + const walFn = vi.fn(); + await consumeStream(ddb.version().list(), (doc) => { + expect(doc.version).toBeDefined(); + }); + await consumeStream(ddb.objectStore("data").list(), dataFn); + await consumeStream(ddb.objectStore("meta").list(), metaFn); + await consumeStream(ddb.objectStore("wal").list(), walFn); + expect(dataFn).toHaveBeenCalled(); + expect(metaFn).toHaveBeenCalledTimes(1); + expect(walFn).toHaveBeenCalledTimes(1); + } + + const y = fireproof("test-dexie"); + const { rows } = await y.allDocs(); + expect(rows.length).toBe(1); + await y.close(); + if (runtimeFn().isBrowser) { + const ddb = await gw.fpIndexedDB(sthis, gw.defaultURI(sthis).build().pathname("fp.test-dexie").URI()); + const dataFn = vi.fn(); + const metaFn = vi.fn(); + const walFn = vi.fn(); + await consumeStream(ddb.version().list(), (doc) => { + expect(doc.version).toBeDefined(); + }); + await consumeStream(ddb.objectStore("data").list(), dataFn); + await consumeStream(ddb.objectStore("meta").list(), metaFn); + await consumeStream(ddb.objectStore("wal").list(), walFn); + expect(dataFn).toHaveBeenCalled(); + expect(metaFn).toHaveBeenCalledTimes(1); + expect(walFn).toHaveBeenCalledTimes(1); + } + }); +}); diff --git a/core/tests/gateway/indexeddb/loader-config.test.ts b/core/tests/gateway/indexeddb/loader-config.test.ts index f46316458..4b9525712 100644 --- a/core/tests/gateway/indexeddb/loader-config.test.ts +++ b/core/tests/gateway/indexeddb/loader-config.test.ts @@ -1,6 +1,7 @@ import { fireproof } from "@fireproof/core"; import { mockSuperThis } from "../../helpers.js"; import { describe, beforeAll, it, expect } from "vitest"; +import { Env } from "@adviser/cement"; describe("fireproof config indexeddb", () => { const _my_app = "my-app"; @@ -13,7 +14,11 @@ describe("fireproof config indexeddb", () => { }); it("indexeddb-loader", async () => { + const env = (globalThis as unknown as Record>)[Symbol.for("FP_ENV")] as unknown as Env; + const pre = env.get("FP_STORAGE_URL"); + env.delete("FP_STORAGE_URL"); const db = fireproof(my_app()); + env.set("FP_STORAGE_URL", pre); await db.put({ name: "my-app" }); expect(db.ledger.name).toBe(my_app()); diff --git a/core/tests/package.json b/core/tests/package.json index 20ac36188..45af54d9c 100644 --- a/core/tests/package.json +++ b/core/tests/package.json @@ -56,7 +56,6 @@ "@fireproof/core-runtime": "workspace:0.0.0", "@fireproof/core-types-base": "workspace:0.0.0", "@fireproof/core-types-blockstore": "workspace:0.0.0", - "@fireproof/core-types-protocols-sync": "workspace:0.0.0", "@fireproof/core-types-protocols-cloud": "workspace:0.0.0", "@fireproof/core-types-runtime": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", @@ -66,6 +65,7 @@ "@types/node": "^24.3.1", "cborg": "^4.2.15", "charwise": "^3.0.1", + "fake-indexeddb": "^6.2.2", "jose": "^6.0.12", "use-fireproof": "workspace:0.0.0", "uuidv7": "^1.0.2" @@ -73,6 +73,7 @@ "devDependencies": { "@fireproof/core-cli": "workspace:0.0.0", "@vitest/browser": "^3.2.4", + "dexie": "^4.2.0", "playwright": "^1.55.0", "playwright-chromium": "^1.55.0", "vitest": "^3.2.4", diff --git a/core/tests/protocols/sync/block-log-svc.test.ts b/core/tests/protocols/sync/block-log-svc.test.ts index 724afa5d3..d53fd0da3 100644 --- a/core/tests/protocols/sync/block-log-svc.test.ts +++ b/core/tests/protocols/sync/block-log-svc.test.ts @@ -1,22 +1,32 @@ - -import { describe, it, expect, beforeEach, afterEach } from "vitest"; -import { BlockLogService, SyncDatabase } from "@fireproof/core-protocols-sync"; -import { ensureSuperThis } from "@fireproof/core-runtime"; -import { BlockLog } from "@fireproof/core-types-protocols-sync"; +import { describe, it, expect, afterEach, afterAll, beforeAll } from "vitest"; +import { BlockLogService } from "@fireproof/core-protocols-sync"; +import { consumeStream, ensureSuperThis } from "@fireproof/core-runtime"; +import { BlockLog, DBTable, FPIndexedDB } from "@fireproof/core-types-blockstore"; +import { getGatewayFactoryItem, SerdeGatewayFactoryItem } from "@fireproof/core-blockstore"; +import { withSuperThis, WithSuperThis } from "@fireproof/core-types-base"; +import { URI } from "@adviser/cement"; describe("BlockLogService", () => { const sthis = ensureSuperThis(); - const db = new SyncDatabase(sthis, "dexie://test-sync-db"); + const backendURI = URI.from(sthis.env.get("FP_STORAGE_URL")); + let gw: SerdeGatewayFactoryItem; + let db: WithSuperThis>; + let fpDb: FPIndexedDB; - beforeEach(async () => { + beforeAll(async () => { await sthis.start(); - await db.ready(); + gw = getGatewayFactoryItem(backendURI.protocol) as SerdeGatewayFactoryItem; + fpDb = await gw.fpIndexedDB(sthis, backendURI.build().appendRelative("block-logs").URI()); + db = withSuperThis(fpDb.fpSync.blockLogs(), sthis); }); - afterEach(async () => { - await db.close(); - await db.destroy(); + await db.clear(); + }); + + afterAll(async () => { + await fpDb.close(); + await fpDb.destroy(); }); describe("create", () => { @@ -30,7 +40,7 @@ describe("BlockLogService", () => { const result = await BlockLogService.create(db, blockLog); expect(result.isOk()).toBe(true); if (lastSeq) { - expect(lastSeq.localeCompare(result.Ok().seq)).toBe(-1) + expect(lastSeq.localeCompare(result.Ok().seq)).toBe(-1); } lastSeq = result.Ok().seq; } @@ -43,38 +53,37 @@ describe("BlockLogService", () => { }; const result = await BlockLogService.create(db, blockLog); - + expect(result.isOk()).toBe(true); expect(result.Ok().seq).toBe("custom-seq-123"); }); it("list all", async () => { - for (let i = 0; i < 10; i++) { - await BlockLogService.create(db, { - car: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", - }); - } - - let lastSeq: string | undefined; - const results: BlockLog[] = []; - await db.consumeStream(BlockLogService.getBySeq(db), (blockLog) => { - if (lastSeq) { - expect(lastSeq.localeCompare(blockLog.seq)).toBe(-1) - } - results.push(blockLog); - lastSeq = blockLog.seq; + for (let i = 0; i < 10; i++) { + await BlockLogService.create(db, { + car: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", }); - expect(results.length).toBe(10); + } - const results2: BlockLog[] = []; - let first = 0 - await db.consumeStream(BlockLogService.getBySeq(db, results[5].seq), (blockLog) => { - expect(results[5].seq.localeCompare(blockLog.seq)).toBe(first); - first = -1; - results2.push(blockLog); - }); - expect(results2.length).toBe(5); - }) - }); + let lastSeq: string | undefined; + const results: BlockLog[] = []; + await consumeStream(BlockLogService.getBySeq(db), (blockLog) => { + if (lastSeq) { + expect(lastSeq.localeCompare(blockLog.seq)).toBe(-1); + } + results.push(blockLog); + lastSeq = blockLog.seq; + }); + expect(results.length).toBe(10); -}); \ No newline at end of file + const results2: BlockLog[] = []; + let first = 0; + await consumeStream(BlockLogService.getBySeq(db, results[5].seq), (blockLog) => { + expect(results[5].seq.localeCompare(blockLog.seq)).toBe(first); + first = -1; + results2.push(blockLog); + }); + expect(results2.length).toBe(5); + }); + }); +}); diff --git a/core/tests/protocols/sync/car-svc.test.ts b/core/tests/protocols/sync/car-svc.test.ts index 3a5defcef..32b66a36a 100644 --- a/core/tests/protocols/sync/car-svc.test.ts +++ b/core/tests/protocols/sync/car-svc.test.ts @@ -1,19 +1,31 @@ -import { describe, it, expect, beforeEach, afterEach } from "vitest"; -import { CarsService, SyncDatabase } from "@fireproof/core-protocols-sync"; +import { describe, it, expect, afterEach, afterAll, beforeAll } from "vitest"; +import { CarsService } from "@fireproof/core-protocols-sync"; import { ensureSuperThis } from "@fireproof/core-runtime"; +import { getGatewayFactoryItem, SerdeGatewayFactoryItem } from "@fireproof/core-blockstore"; +import { DBTable, FPIndexedDB, Cars } from "@fireproof/core-types-blockstore"; +import { withSuperThis, WithSuperThis } from "use-fireproof"; +import { URI } from "@adviser/cement"; describe("CarsService", () => { const sthis = ensureSuperThis(); - const db = new SyncDatabase(sthis, "dexie://test-sync-db"); + const backendURI = URI.from(sthis.env.get("FP_STORAGE_URL")); + let gw: SerdeGatewayFactoryItem; + let db: WithSuperThis>; + let fpDb: FPIndexedDB; - beforeEach(async () => { + beforeAll(async () => { await sthis.start(); - await db.ready(); + gw = getGatewayFactoryItem(backendURI.protocol) as SerdeGatewayFactoryItem; + fpDb = await gw.fpIndexedDB(sthis, backendURI.build().appendRelative("cars").URI()); + db = withSuperThis(fpDb.fpSync.cars(), sthis); }); - afterEach(async () => { - await db.close(); - await db.destroy(); + await db.clear(); + }); + + afterAll(async () => { + await fpDb.close(); + await fpDb.destroy(); }); describe("upsert", () => { @@ -26,7 +38,7 @@ describe("CarsService", () => { }; const result = await CarsService.upsert(db, cars); - + expect(result.isOk()).toBe(true); expect(result.Ok().type).toBe("cars"); expect(result.Ok().carCid).toBe(cars.carCid); @@ -54,7 +66,7 @@ describe("CarsService", () => { }; const result = await CarsService.upsert(db, updatedCars); - + expect(result.isOk()).toBe(true); expect(result.Ok().peers).toEqual(["peer1", "peer2", "peer3"]); expect(result.Ok().entries).toEqual(["cid1", "cid2", "cid3"]); @@ -69,7 +81,7 @@ describe("CarsService", () => { }; const result = await CarsService.upsert(db, cars); - + expect(result.isOk()).toBe(true); expect(result.Ok().peers).toEqual(["peer1", "peer2"]); }); @@ -85,9 +97,9 @@ describe("CarsService", () => { }; await CarsService.upsert(db, cars); - + const result = await CarsService.get(db, "test-get-car-cid"); - + expect(result.isOk()).toBe(true); expect(result.Ok()?.carCid).toBe("test-get-car-cid"); expect(result.Ok()?.entries).toEqual(["cid1", "cid2"]); @@ -97,9 +109,9 @@ describe("CarsService", () => { it("should return undefined for non-existent car", async () => { const result = await CarsService.get(db, "non-existent-car-cid"); - + expect(result.isOk()).toBe(true); expect(result.Ok()).toBeUndefined(); }); }); -}); \ No newline at end of file +}); diff --git a/core/tests/protocols/sync/cid-set.test.ts b/core/tests/protocols/sync/cid-set.test.ts index 28d6c9938..b6c7ea984 100644 --- a/core/tests/protocols/sync/cid-set.test.ts +++ b/core/tests/protocols/sync/cid-set.test.ts @@ -1,28 +1,40 @@ -import { describe, it, expect, beforeEach, afterEach } from "vitest"; -import { CidSetService, SyncDatabase } from "@fireproof/core-protocols-sync"; +import { describe, it, expect, afterEach, afterAll, beforeAll } from "vitest"; +import { CidSetService } from "@fireproof/core-protocols-sync"; import { ensureSuperThis } from "@fireproof/core-runtime"; +import { getGatewayFactoryItem, SerdeGatewayFactoryItem } from "@fireproof/core-blockstore"; +import { DBTable, FPIndexedDB, CidSet } from "@fireproof/core-types-blockstore"; +import { withSuperThis, WithSuperThis } from "@fireproof/core-types-base"; +import { URI } from "@adviser/cement"; describe("CidSetService", () => { const sthis = ensureSuperThis(); - const db = new SyncDatabase(sthis, "dexie://test-sync-db"); + const backendURI = URI.from(sthis.env.get("FP_STORAGE_URL")); + let gw: SerdeGatewayFactoryItem; + let db: WithSuperThis>; + let fpDb: FPIndexedDB; - beforeEach(async () => { + beforeAll(async () => { await sthis.start(); - await db.ready(); + gw = getGatewayFactoryItem(backendURI.protocol) as SerdeGatewayFactoryItem; + fpDb = await gw.fpIndexedDB(sthis, backendURI.build().appendRelative("cid-sets").URI()); + db = withSuperThis(fpDb.fpSync.cidSets(), sthis); }); - afterEach(async () => { - await db.close(); - await db.destroy(); + await db.clear(); + }); + + afterAll(async () => { + await fpDb.close(); + await fpDb.destroy(); }); describe("put", () => { - it("should create a new cid set", async () => { + it("should create a new cid set", async () => { const cidSet = { - cid: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55f1", - car: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", - type: "cidSet", - } + cid: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55f1", + car: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", + type: "cidSet", + }; const result = await CidSetService.put(db, cidSet); @@ -52,7 +64,7 @@ describe("CidSetService", () => { describe("get", () => { it("should retrieve existing cid set", async () => { - const cidSet = [ + const cidSet = [ { cid: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55f1", car: "bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi", @@ -67,14 +79,13 @@ describe("CidSetService", () => { await CidSetService.put(db, cidSet); - const r1 = await CidSetService.get(db, cidSet[0].cid) - const r2 = await CidSetService.get(db, cidSet[1].cid) + const r1 = await CidSetService.get(db, cidSet[0].cid); + const r2 = await CidSetService.get(db, cidSet[1].cid); expect(r1.isOk()).toBe(true); expect(r1.Ok()).toEqual(cidSet[0]); expect(r2.isOk()).toBe(true); expect(r2.Ok()).toEqual(cidSet[1]); - }); it("should return undefined for non-existent cid", async () => { diff --git a/core/tests/protocols/sync/peer-svc.test.ts b/core/tests/protocols/sync/peer-svc.test.ts index f83eb68a3..e1021844b 100644 --- a/core/tests/protocols/sync/peer-svc.test.ts +++ b/core/tests/protocols/sync/peer-svc.test.ts @@ -1,19 +1,33 @@ -import { describe, it, expect, beforeEach, afterEach } from "vitest"; -import { PeersService, SyncDatabase } from "@fireproof/core-protocols-sync"; +import { describe, it, expect, afterEach, beforeAll, afterAll } from "vitest"; +import { PeersService } from "@fireproof/core-protocols-sync"; import { ensureSuperThis, hashBufferCID } from "@fireproof/core-runtime"; +import { getGatewayFactoryItem, SerdeGatewayFactoryItem } from "@fireproof/core-blockstore"; +import { DBTable, FPIndexedDB, Peers } from "@fireproof/core-types-blockstore"; +import { withSuperThis, WithSuperThis } from "@fireproof/core-types-base"; +import { URI } from "@adviser/cement"; describe("PeersService", () => { const sthis = ensureSuperThis(); - const db = new SyncDatabase(sthis, "dexie://test-sync-db"); + const backendURI = URI.from(sthis.env.get("FP_STORAGE_URL")); + // console.log("backendURI", backendURI.toString()) + let gw: SerdeGatewayFactoryItem; + let db: WithSuperThis>; + let fpDb: FPIndexedDB; - beforeEach(async () => { + beforeAll(async () => { await sthis.start(); - await db.ready(); + gw = getGatewayFactoryItem(backendURI.protocol) as SerdeGatewayFactoryItem; + fpDb = await gw.fpIndexedDB(sthis, backendURI.build().appendRelative("peers").URI()); + db = withSuperThis(fpDb.fpSync.peers(), sthis); }); afterEach(async () => { - await db.close(); - await db.destroy(); + await db.clear(); + }); + + afterAll(async () => { + await fpDb.close(); + await fpDb.destroy(); }); describe("upsert", () => { diff --git a/core/tests/protocols/sync/sync-api.test.ts b/core/tests/protocols/sync/sync-api.test.ts deleted file mode 100644 index 8750221e7..000000000 --- a/core/tests/protocols/sync/sync-api.test.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defaultGatewayFactoryItem } from "@fireproof/core-blockstore"; -import { ensureSuperThis } from "@fireproof/core-runtime"; -import { it, describe, } from "vitest"; - -describe("sync-api", () => { - const sthis = ensureSuperThis(); - it("factory to open database", async () => { - const gw = defaultGatewayFactoryItem(); - const syncDB = await gw.fpsync(sthis, gw.defaultURI(sthis)); - - await syncDB.close(); - }); -}, { timeout: 10000000 }); diff --git a/core/tests/runtime/meta-key-hack.test.ts b/core/tests/runtime/meta-key-hack.test.ts index 7a178d371..b5ce38eb5 100644 --- a/core/tests/runtime/meta-key-hack.test.ts +++ b/core/tests/runtime/meta-key-hack.test.ts @@ -20,7 +20,7 @@ describe("MetaKeyHack", () => { serdegateway: async () => { return new AddKeyToDbMetaGateway(memGw, "v2"); }, - fpsync: async () => { + fpIndexedDB: async () => { throw new Error("fpsync for hack: Not implemented"); }, }); diff --git a/core/tests/setup.file.ts b/core/tests/setup.file.ts index 09cc0b94a..4648287b0 100644 --- a/core/tests/setup.file.ts +++ b/core/tests/setup.file.ts @@ -1 +1,5 @@ process.env.FP_STORAGE_URL = "./dist/fp-dir-file"; + +(globalThis as unknown as Record>)[Symbol.for("FP_PRESET_ENV")] = { + FP_STORAGE_URL: "./dist/fp-dir-file", +}; diff --git a/core/tests/setup.indexeddb.ts b/core/tests/setup.indexeddb.ts index e69de29bb..cb99d8e85 100644 --- a/core/tests/setup.indexeddb.ts +++ b/core/tests/setup.indexeddb.ts @@ -0,0 +1,3 @@ +(globalThis as unknown as Record>)[Symbol.for("FP_PRESET_ENV")] = { + FP_STORAGE_URL: "indexeddb://fp", +}; diff --git a/core/tests/setup.memory.ts b/core/tests/setup.memory.ts index bb456be5d..d16223f0d 100644 --- a/core/tests/setup.memory.ts +++ b/core/tests/setup.memory.ts @@ -1,2 +1,7 @@ -process.env.FP_STORAGE_URL = "memory://test"; -process.env.FP_KEYBAG_URL = "memory://keybag"; +//process.env.FP_STORAGE_URL = "memory://test"; +//process.env.FP_KEYBAG_URL = "memory://keybag"; + +(globalThis as unknown as Record>)[Symbol.for("FP_PRESET_ENV")] = { + FP_STORAGE_URL: "memory://test", + FP_KEYBAG_URL: "memory://keybag", +}; diff --git a/core/tests/vitest.browser.memory.config.ts b/core/tests/vitest.browser.memory.config.ts new file mode 100644 index 000000000..3aa5c9d93 --- /dev/null +++ b/core/tests/vitest.browser.memory.config.ts @@ -0,0 +1,36 @@ +/// +/// + +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + name: "browser:memory", + exclude: [ + "dist/**", + "node_modules/**", + "examples/**", + "gateway/file", + "gateway/indexeddb/create-db-on-write.test.ts", + "gateway/indexeddb/dexie-transition.test.ts", + ], + include: ["**/*test.?(c|m)[jt]s?(x)"], + browser: { + enabled: true, + headless: true, + provider: "playwright", + instances: [ + { + browser: "chromium", + context: { + // Disable screenshots and video recording + recordVideo: undefined, + recordHar: undefined, + }, + }, + ], + screenshotFailures: false, + }, + setupFiles: "./setup.memory.ts", + }, +}); diff --git a/core/tests/vitest.config.ts b/core/tests/vitest.config.ts index 70afd827c..3b5acac4c 100644 --- a/core/tests/vitest.config.ts +++ b/core/tests/vitest.config.ts @@ -2,7 +2,7 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ test: { - projects: ["vitest.file.config.ts", "vitest.memory.config.ts", "vitest.indexeddb.config.ts"], + projects: ["vitest.file.config.ts", "vitest.memory.config.ts", "vitest.indexeddb.config.ts", "vitest.browser.memory.config.ts"], globalSetup: "global-setup.ts", }, }); diff --git a/core/types/base/types.ts b/core/types/base/types.ts index 9c8afe9ea..1ca1d69d8 100644 --- a/core/types/base/types.ts +++ b/core/types/base/types.ts @@ -100,6 +100,41 @@ export interface FPStats { birthtime: Date | Falsy; } +export type FPSQLInputValue = null | number | bigint | string | Uint8Array; +export type FPSQLOutputValue = null | number | bigint | string | Uint8Array; + +export interface FPSqlCmd { + sql: string; + argss?: FPSQLInputValue[][]; +} + +export interface FPSqlResultError { + readonly error: Error; +} +export function isFPSqlResultError(r: FPSqlResult): r is FPSqlResultError { + return (r as FPSqlResultError).error !== undefined; +} +export interface FPSqlResultOk { + readonly rows: FPSQLOutputValue[][]; +} + +export function isFPSqlResultOk(r: FPSqlResult): r is FPSqlResultOk { + return (r as FPSqlResultOk).rows !== undefined; +} + +export type FPSqlResult = FPSqlResultOk | FPSqlResultError; + +export interface FPSql { + batch(sqlCmds: FPSqlCmd[]): Promise; + transaction(fn: (tx: Omit) => Promise): Promise; + close(): Promise; + destroy(): Promise; +} + +export interface FPSqlConn { + open(path: string): Promise; +} + export interface SysFileSystem { start(): Promise; mkdir(path: string, options?: { recursive: boolean }): Promise; @@ -110,6 +145,7 @@ export interface SysFileSystem { stat(path: string): Promise; unlink(path: string): Promise; writefile(path: string, data: Uint8Array | string): Promise; + sqlite(): Promise; } export interface PathOps { @@ -161,6 +197,12 @@ export interface SuperThis { clone(override: Partial): SuperThis; } +export type WithSuperThis = T & { readonly sthis: SuperThis }; +export function withSuperThis(t: T, sthis: SuperThis): WithSuperThis { + (t as { sthis: SuperThis }).sthis = sthis; + return t as WithSuperThis; +} + export interface IdleEventFromCommitQueue { readonly event: "idleFromCommitQueue"; } diff --git a/core/types/blockstore/fp-db.ts b/core/types/blockstore/fp-db.ts new file mode 100644 index 000000000..f3371a2c0 --- /dev/null +++ b/core/types/blockstore/fp-db.ts @@ -0,0 +1,36 @@ +import { Result } from "@adviser/cement"; +import { BlockLog, Cars, CidSet, Peers } from "./fp-sync.js"; + +export interface KV { + readonly key: TKey; + readonly value: T; +} + +export function toKV(key: TKey, value: T): KV { + return { key, value }; +} + +export interface DBTable { + // bulkAdd(ts: T[]): Promise; + add(...t: KV[]): Promise[]>>; + delete(key: TKey): Promise>; + get(key: TKey): Promise>; + put(...t: KV[]): Promise[]>>; + list(start?: TKey, end?: TKey): ReadableStream; + transaction(fn: (tx: Omit, "transaction">) => Promise): Promise; + clear(): Promise; +} + +export interface FPIndexedDB { + objectStore(name: string): DBTable; + version(): DBTable<{ version: string }>; + fpSync: { + blockLogs(): DBTable; + cidSets(): DBTable; + cars(): DBTable; + peers(): DBTable; + }; + + close(): Promise; + destroy(): Promise; +} diff --git a/core/types/blockstore/fp-sync.ts b/core/types/blockstore/fp-sync.ts new file mode 100644 index 000000000..2940246b5 --- /dev/null +++ b/core/types/blockstore/fp-sync.ts @@ -0,0 +1,48 @@ +import { z } from "zod"; + +// Zod schemas +export const BlockLogSchema = z + .object({ + type: z.literal("block"), + seq: z.string(), // key // typical V6 UUID + car: z.string(), + }) + .readonly(); + +export const CarsSchema = z + .object({ + type: z.literal("cars"), + carCid: z.string(), // key + entries: z.array(z.string()), // cids of entries + created: z.number(), // timestamp + peers: z.array(z.string()), // peers that have this car + }) + .readonly(); + +export const CidSetSchema = z + .object({ + type: z.literal("cidSet"), + cid: z.string(), // key + car: z.string(), + }) + .readonly(); + +export const PeersSchema = z + .object({ + type: z.literal("peers"), + peerId: z.string(), // key hash of url + isLocal: z.boolean(), + url: z.string(), + lastSend: z.string().optional(), // points to blockLog + lastError: z.string().optional(), // points to blockLog + // is lastError is set we wait retryInterval plus lastAttempt + lastAttempt: z.number(), // local Timestamp + created: z.number(), // timestamp + }) + .readonly(); + +// Type inference from Zod schemas +export type BlockLog = z.infer; +export type Cars = z.infer; +export type CidSet = z.infer; +export type Peers = z.infer; diff --git a/core/types/blockstore/index.ts b/core/types/blockstore/index.ts index 99c003246..64d8e272c 100644 --- a/core/types/blockstore/index.ts +++ b/core/types/blockstore/index.ts @@ -5,3 +5,5 @@ export * from "./serde-gateway.js"; export * from "./task-manager-if.js"; export * from "./types.js"; export * from "./gateway.js"; +export * from "./fp-sync.js"; +export * from "./fp-db.js"; diff --git a/core/types/blockstore/package.json b/core/types/blockstore/package.json index 9743ff53e..6ed794801 100644 --- a/core/types/blockstore/package.json +++ b/core/types/blockstore/package.json @@ -41,7 +41,8 @@ "@fireproof/core-types-runtime": "workspace:0.0.0", "@fireproof/vendor": "workspace:0.0.0", "@web3-storage/pail": "^0.6.2", - "multiformats": "^13.4.1" + "multiformats": "^13.4.1", + "zod": "^4.1.8" }, "devDependencies": { "@fireproof/core-cli": "workspace:0.0.0" diff --git a/core/types/protocols/sync/index.ts b/core/types/protocols/sync/index.ts deleted file mode 100644 index 80b1df357..000000000 --- a/core/types/protocols/sync/index.ts +++ /dev/null @@ -1,41 +0,0 @@ - -import { z } from 'zod'; - -// Zod schemas -export const BlockLogSchema = z.object({ - type: z.literal("block"), - seq: z.string(), // key // typical V6 UUID - car: z.string(), -}).readonly(); - -export const CarsSchema = z.object({ - type: z.literal("cars"), - carCid: z.string(), // key - entries: z.array(z.string()), // cids of entries - created: z.number(), // timestamp - peers: z.array(z.string()), // peers that have this car -}).readonly(); - -export const CidSetSchema = z.object({ - type: z.literal("cidSet"), - cid: z.string(), // key - car: z.string(), -}).readonly(); - -export const PeersSchema = z.object({ - type: z.literal("peers"), - peerId: z.string(), // key hash of url - isLocal: z.boolean(), - url: z.string(), - lastSend: z.string().optional(), // points to blockLog - lastError: z.string().optional(), // points to blockLog - // is lastError is set we wait retryInterval plus lastAttempt - lastAttempt: z.number(), // local Timestamp - created: z.number(), // timestamp -}).readonly(); - -// Type inference from Zod schemas -export type BlockLog = z.infer; -export type Cars = z.infer; -export type CidSet = z.infer; -export type Peers = z.infer; diff --git a/core/types/protocols/sync/package.json b/core/types/protocols/sync/package.json deleted file mode 100644 index d75a523fe..000000000 --- a/core/types/protocols/sync/package.json +++ /dev/null @@ -1,42 +0,0 @@ -{ - "name": "@fireproof/core-types-protocols-sync", - "version": "0.0.0", - "description": "SyncDB Protocol to track what we send", - "type": "module", - "main": "./index.js", - "scripts": { - "build": "core-cli tsc", - "pack": "core-cli build --doPack", - "publish": "core-cli build" - }, - "keywords": [ - "ledger", - "JSON", - "document", - "IPLD", - "CID", - "IPFS" - ], - "contributors": [ - "J Chris Anderson", - "Alan Shaw", - "Travis Vachon", - "Mikeal Rogers", - "Meno Abels" - ], - "author": "J Chris Anderson", - "license": "AFL-2.0", - "homepage": "https://use-fireproof.com", - "gptdoc": "import { fireproof } from 'use-fireproof'; const db = fireproof('app-db-name'); const ok = await db.put({ anyField: ['any','json'] }); const doc = await db.get(ok.id); await db.del(doc._id); db.subscribe(myRedrawFn); const result = await db.query('anyField', {range : ['a', 'z']}); result.rows.map(({ key }) => key);", - "repository": { - "type": "git", - "url": "git+https://github.com/fireproof-storage/fireproof.git" - }, - "bugs": { - "url": "https://github.com/fireproof-storage/fireproof/issues" - }, - "dependencies": { - "@adviser/cement": "^0.4.32", - "zod": "^4.0.14" - } -} diff --git a/core/types/protocols/sync/tsconfig.json b/core/types/protocols/sync/tsconfig.json deleted file mode 100644 index 89215dcb3..000000000 --- a/core/types/protocols/sync/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "extends": "../../../../tsconfig.json", - "compilerOptions": { - "outDir": "./dist" - } -} diff --git a/eslint.config.mjs b/eslint.config.mjs index 7c32d46aa..70958cd85 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -16,6 +16,7 @@ const opts = tseslint.config( }, { ignores: [ + "vendor/level/**", "babel.config.cjs", "jest.config.js", "**/dist/", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7a2ab9005..5e27cfbe6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -501,6 +501,9 @@ importers: '@web3-storage/pail': specifier: ^0.6.2 version: 0.6.2 + dexie: + specifier: ^4.2.0 + version: 4.2.0 multiformats: specifier: ^13.4.1 version: 13.4.1 @@ -640,15 +643,9 @@ importers: '@fireproof/core-types-blockstore': specifier: workspace:0.0.0 version: link:../../types/blockstore - '@fireproof/core-types-protocols-sync': - specifier: workspace:0.0.0 - version: link:../../types/protocols/sync '@fireproof/vendor': specifier: workspace:0.0.0 version: link:../../../vendor - classic-level: - specifier: ^3.0.0 - version: 3.0.0 devDependencies: '@fireproof/core-cli': specifier: workspace:0.0.0 @@ -707,21 +704,15 @@ importers: '@fireproof/core-types-blockstore': specifier: workspace:0.0.0 version: link:../../types/blockstore - '@fireproof/core-types-protocols-sync': - specifier: workspace:0.0.0 - version: link:../../types/protocols/sync '@fireproof/vendor': specifier: workspace:0.0.0 version: link:../../../vendor - browser-level: - specifier: ^3.0.0 - version: 3.0.0 + dexie: + specifier: ^4.2.0 + version: 4.2.0 idb: specifier: ^8.0.3 version: 8.0.3 - level: - specifier: ^10.0.0 - version: 10.0.0 core/gateways/memory: dependencies: @@ -740,18 +731,9 @@ importers: '@fireproof/core-types-blockstore': specifier: workspace:0.0.0 version: link:../../types/blockstore - '@fireproof/core-types-protocols-sync': - specifier: workspace:0.0.0 - version: link:../../types/protocols/sync '@fireproof/vendor': specifier: workspace:0.0.0 version: link:../../../vendor - level: - specifier: ^10.0.0 - version: 10.0.0 - memory-level: - specifier: ^3.1.0 - version: 3.1.0 devDependencies: '@fireproof/core-cli': specifier: workspace:0.0.0 @@ -846,9 +828,9 @@ importers: '@fireproof/core-types-base': specifier: workspace:0.0.0 version: link:../../types/base - '@fireproof/core-types-protocols-sync': + '@fireproof/core-types-blockstore': specifier: workspace:0.0.0 - version: link:../../types/protocols/sync + version: link:../../types/blockstore '@fireproof/vendor': specifier: workspace:0.0.0 version: link:../../../vendor @@ -946,9 +928,6 @@ importers: '@fireproof/core-types-protocols-cloud': specifier: workspace:0.0.0 version: link:../types/protocols/cloud - '@fireproof/core-types-protocols-sync': - specifier: workspace:0.0.0 - version: link:../types/protocols/sync '@fireproof/core-types-runtime': specifier: workspace:0.0.0 version: link:../types/runtime @@ -973,6 +952,9 @@ importers: charwise: specifier: ^3.0.1 version: 3.0.1 + fake-indexeddb: + specifier: ^6.2.2 + version: 6.2.2 jose: specifier: ^6.0.12 version: 6.1.0 @@ -992,6 +974,9 @@ importers: '@vitest/browser': specifier: ^3.2.4 version: 3.2.4(playwright@1.55.0)(vite@7.1.5(@types/node@24.3.1)(jiti@1.21.7)(tsx@4.20.5)(yaml@2.8.1))(vitest@3.2.4) + dexie: + specifier: ^4.2.0 + version: 4.2.0 playwright: specifier: ^1.55.0 version: 1.55.0 @@ -1052,6 +1037,9 @@ importers: multiformats: specifier: ^13.4.1 version: 13.4.1 + zod: + specifier: ^4.1.8 + version: 4.1.8 devDependencies: '@fireproof/core-cli': specifier: workspace:0.0.0 @@ -1085,15 +1073,6 @@ importers: specifier: workspace:0.0.0 version: link:../../../../cli - core/types/protocols/sync: - dependencies: - '@adviser/cement': - specifier: ^0.4.32 - version: 0.4.35(typescript@5.9.2) - zod: - specifier: ^4.0.14 - version: 4.0.14 - core/types/runtime: dependencies: '@adviser/cement': @@ -3608,10 +3587,6 @@ packages: zod: optional: true - abstract-level@3.1.0: - resolution: {integrity: sha512-j2e+TsAxy7Ri+0h7dJqwasymgt0zHBWX4+nMk3XatyuqgHfdstBJ9wsMfbiGwE1O+QovRyPcVAqcViMYdyPaaw==} - engines: {node: '>=18'} - acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -3777,9 +3752,6 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browser-level@3.0.0: - resolution: {integrity: sha512-kGXtLh29jMwqKaskz5xeDLtCtN1KBz/DbQSqmvH7QdJiyGRC7RAM8PPg6gvUiNMa+wVnaxS9eSmEtP/f5ajOVw==} - browser-tabs-lock@1.3.0: resolution: {integrity: sha512-g6nHaobTiT0eMZ7jh16YpD2kcjAp+PInbiVq3M1x6KKaEIVhT4v9oURNIpZLOZ3LQbQ3XYfNhMAb/9hzNLIWrw==} @@ -3799,9 +3771,6 @@ packages: buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -3866,10 +3835,6 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} - classic-level@3.0.0: - resolution: {integrity: sha512-yGy8j8LjPbN0Bh3+ygmyYvrmskVita92pD/zCoalfcC9XxZj6iDtZTAnz+ot7GG8p9KLTG+MZ84tSA4AhkgVZQ==} - engines: {node: '>=18'} - cli-color@2.0.4: resolution: {integrity: sha512-zlnpg0jNcibNrO7GG9IeHH7maWFeCz+Ja1wx/7tZNU5ASSSSZ+/qZciM0/LHCYxSdqv5h2sdbQ/PXYdOuetXvA==} engines: {node: '>=0.10'} @@ -4385,6 +4350,10 @@ packages: ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + fake-indexeddb@6.2.2: + resolution: {integrity: sha512-SGbf7fzjeHz3+12NO1dYigcYn4ivviaeULV5yY5rdGihBvvgwMds4r4UBbNIUMwkze57KTDm32rq3j1Az8mzEw==} + engines: {node: '>=18'} + fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} @@ -4495,9 +4464,6 @@ packages: resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==} engines: {node: '>= 0.4'} - functional-red-black-tree@1.0.1: - resolution: {integrity: sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==} - functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} @@ -4691,10 +4657,6 @@ packages: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} - is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -4929,18 +4891,6 @@ packages: resolution: {integrity: sha512-rlB0I/c6FBDWPcQoDtkxi9zIvpmnV5xoIalfCMSMCa7nuA6VGA3F54TW9mEgX4DVf10sXAWCF5fDbamI/5ZpKA==} engines: {node: '>=20.0.0'} - level-supports@6.2.0: - resolution: {integrity: sha512-QNxVXP0IRnBmMsJIh+sb2kwNCYcKciQZJEt+L1hPCHrKNELllXhvrlClVHXBYZVT+a7aTSM6StgNXdAldoab3w==} - engines: {node: '>=16'} - - level-transcoder@1.0.1: - resolution: {integrity: sha512-t7bFwFtsQeD8cl8NIoQ2iwxA0CL/9IFw7/9gAjOonH0PWTTiRfY7Hq+Ejbsxh86tXobDQ6IOiddjNYIfOBs06w==} - engines: {node: '>=12'} - - level@10.0.0: - resolution: {integrity: sha512-aZJvdfRr/f0VBbSRF5C81FHON47ZsC2TkGxbBezXpGGXAUEL/s6+GP73nnhAYRSCIqUNsmJjfeOF4lzRDKbUig==} - engines: {node: '>=18'} - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -5027,18 +4977,10 @@ packages: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} - maybe-combine-errors@1.0.0: - resolution: {integrity: sha512-eefp6IduNPT6fVdwPp+1NgD0PML1NU5P6j1Mj5nz1nidX8/sWY7119WL8vTAHgqfsY74TzW0w1XPgdYEKkGZ5A==} - engines: {node: '>=10'} - memoizee@0.4.17: resolution: {integrity: sha512-DGqD7Hjpi/1or4F/aYAspXKNm5Yili0QDAFAY4QYvpqpgiY6+1jOfqpmByzjxbWd/T9mChbCArXAbDAsTm5oXA==} engines: {node: '>=0.12'} - memory-level@3.1.0: - resolution: {integrity: sha512-mTqFVi5iReKcjue/pag0OY4VNU7dlagCyjjPwWGierpk1Bpl9WjOxgXIswymPW3Q9bj3Foay+Z16mPGnKzvTkQ==} - engines: {node: '>=18'} - meow@9.0.0: resolution: {integrity: sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==} engines: {node: '>=10'} @@ -5083,10 +5025,6 @@ packages: minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - module-error@1.0.2: - resolution: {integrity: sha512-0yuvsqSCv8LbaOKhnsQ/T5JhyFlCYLPXK3U2sgV10zoKQwzs/MyfuQUOZQ1V/6OCOJsK/TRgNVrPuPDqtdMFtA==} - engines: {node: '>=10'} - monaco-editor@0.52.2: resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} @@ -5112,9 +5050,6 @@ packages: engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true - napi-macros@2.2.2: - resolution: {integrity: sha512-hmEVtAGYzVQpCKdbQea4skABsdXW4RUh5t5mJ2zzqowJS2OyXZTU1KhDVFhx+NlWZ4ap9mqR9TcDO3LTTttd+g==} - natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} @@ -5133,10 +5068,6 @@ packages: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - node-gyp-build@4.8.4: - resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} - hasBin: true - node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} @@ -6205,8 +6136,8 @@ packages: zod@3.22.3: resolution: {integrity: sha512-EjIevzuJRiRPbVH4mGc8nApb/lVLKVpmUhAaR5R5doKGfAnGJ6Gr3CViAVjP+4FWSxCsybeWQdcgCtbX+7oZug==} - zod@4.0.14: - resolution: {integrity: sha512-nGFJTnJN6cM2v9kXL+SOBq3AtjQby3Mv5ySGFof5UGRHrRioSJ5iG680cYNjE/yWk671nROcpPj4hAS8nyLhSw==} + zod@4.1.8: + resolution: {integrity: sha512-5R1P+WwQqmmMIEACyzSvo4JXHY5WiAFHRMg+zBZKgKS+Q1viRa0C1hmUKtHltoIFKtIdki3pRxkmpP74jnNYHQ==} zod@4.1.9: resolution: {integrity: sha512-HI32jTq0AUAC125z30E8bQNz0RQ+9Uc+4J7V97gLYjZVKRjeydPgGt6dvQzFrav7MYOUGFqqOGiHpA/fdbd0cQ==} @@ -8494,15 +8425,6 @@ snapshots: typescript: 5.9.2 zod: 4.1.9 - abstract-level@3.1.0: - dependencies: - buffer: 6.0.3 - is-buffer: 2.0.5 - level-supports: 6.2.0 - level-transcoder: 1.0.1 - maybe-combine-errors: 1.0.0 - module-error: 1.0.2 - acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -8699,10 +8621,6 @@ snapshots: dependencies: fill-range: 7.1.1 - browser-level@3.0.0: - dependencies: - abstract-level: 3.1.0 - browser-tabs-lock@1.3.0: dependencies: lodash: 4.17.21 @@ -8728,11 +8646,6 @@ snapshots: base64-js: 1.5.1 ieee754: 1.2.1 - buffer@6.0.3: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -8795,13 +8708,6 @@ snapshots: check-error@2.1.1: {} - classic-level@3.0.0: - dependencies: - abstract-level: 3.1.0 - module-error: 1.0.2 - napi-macros: 2.2.2 - node-gyp-build: 4.8.4 - cli-color@2.0.4: dependencies: d: 1.0.2 @@ -9458,6 +9364,8 @@ snapshots: dependencies: type: 2.7.3 + fake-indexeddb@6.2.2: {} + fast-deep-equal@3.1.3: {} fast-glob@3.3.3: @@ -9567,8 +9475,6 @@ snapshots: hasown: 2.0.2 is-callable: 1.2.7 - functional-red-black-tree@1.0.1: {} - functions-have-names@1.2.3: {} gel@2.1.1: @@ -9751,8 +9657,6 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-buffer@2.0.5: {} - is-callable@1.2.7: {} is-core-module@2.16.1: @@ -9971,19 +9875,6 @@ snapshots: kysely@0.28.5: {} - level-supports@6.2.0: {} - - level-transcoder@1.0.1: - dependencies: - buffer: 6.0.3 - module-error: 1.0.2 - - level@10.0.0: - dependencies: - abstract-level: 3.1.0 - browser-level: 3.0.0 - classic-level: 3.0.0 - levn@0.4.1: dependencies: prelude-ls: 1.2.1 @@ -10083,8 +9974,6 @@ snapshots: math-intrinsics@1.1.0: {} - maybe-combine-errors@1.0.0: {} - memoizee@0.4.17: dependencies: d: 1.0.2 @@ -10096,12 +9985,6 @@ snapshots: next-tick: 1.1.0 timers-ext: 0.1.8 - memory-level@3.1.0: - dependencies: - abstract-level: 3.1.0 - functional-red-black-tree: 1.0.1 - module-error: 1.0.2 - meow@9.0.0: dependencies: '@types/minimist': 1.2.5 @@ -10166,8 +10049,6 @@ snapshots: minimist@1.2.8: {} - module-error@1.0.2: {} - monaco-editor@0.52.2: {} mri@1.2.0: {} @@ -10182,8 +10063,6 @@ snapshots: nanoid@3.3.11: {} - napi-macros@2.2.2: {} - natural-compare@1.4.0: {} neo-async@2.6.2: {} @@ -10198,8 +10077,6 @@ snapshots: fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - node-gyp-build@4.8.4: {} - node-releases@2.0.19: {} node-releases@2.0.20: {} @@ -11375,7 +11252,7 @@ snapshots: zod@3.22.3: {} - zod@4.0.14: {} + zod@4.1.8: {} zod@4.1.9: {} diff --git a/tsconfig.json b/tsconfig.json index 7c44c7648..f84b40c31 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -18,6 +18,6 @@ "skipLibCheck": true, "types": ["node", "deno"] }, - "include": ["core/**/*", "cloud/**/*", "tests/**/*", "cli/**/*", "dashboard/**/*", "vendor/level/**/*"], + "include": ["core/**/*", "cloud/**/*", "tests/**/*", "cli/**/*", "dashboard/**/*"], "exclude": ["**/dist/**"] } diff --git a/vitest.config.ts b/vitest.config.ts index 11bc656ea..9f94f2e98 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -6,6 +6,7 @@ export default defineConfig({ "core/tests/vitest.file.config.ts", "core/tests/vitest.indexeddb.config.ts", "core/tests/vitest.memory.config.ts", + "core/tests/vitest.browser.memory.config.ts", "use-fireproof/vitest.config.ts", "cloud/backend/cf-d1/vitest.config.ts", @@ -14,12 +15,14 @@ export default defineConfig({ "cli/vitest.config.ts", "dashboard/vitest.config.ts", + /* "vendor/level/iota-array/vitest.config.ts", "vendor/level/functional-red-black-tree/vitest.config.ts", "vendor/level/supports/vitest.config.ts", "vendor/level/transcoder/vitest.config.ts", "vendor/level/maybe-combine-errors/vitest.config.ts", "vendor/level/module-error/vitest.config.ts" +*/ ], }, });