From 50f53af6255725157cb5083f20e6abf67155201f Mon Sep 17 00:00:00 2001 From: Meno Abels Date: Fri, 21 Mar 2025 08:07:05 +0100 Subject: [PATCH] chore: added drizzle+zod --- cloud/backend/hono-server.ts | 16 +- cloud/backend/meta-merger/abstract-sql.ts | 53 - .../meta-merger/bettersql-abstract-sql.ts | 37 - .../backend/meta-merger/create-schema-cli.ts | 9 - .../meta-merger/key-by-tenant-ledger.ts | 196 +- .../meta-merger/meta-by-tenant-ledger.ts | 251 ++- cloud/backend/meta-merger/meta-merger.test.ts | 18 +- cloud/backend/meta-merger/meta-merger.ts | 27 +- cloud/backend/meta-merger/meta-send.ts | 301 +-- cloud/backend/meta-merger/schema.ts | 5 + cloud/backend/meta-merger/tenant-ledger.ts | 94 +- cloud/backend/meta-merger/tenant.ts | 79 +- cloud/backend/node-hono-server.ts | 7 +- cloud/backend/node-serve.ts | 7 +- cloud/backend/test-helper.ts | 9 +- drizzle.cloud.config.ts | 10 + package.json | 15 +- patches/drizzle-kit.patch | 1909 +++++++++++++++++ pnpm-lock.yaml | 913 +++++++- src/protocols/cloud/msg-types.ts | 245 ++- 20 files changed, 3550 insertions(+), 651 deletions(-) delete mode 100644 cloud/backend/meta-merger/abstract-sql.ts delete mode 100644 cloud/backend/meta-merger/bettersql-abstract-sql.ts delete mode 100644 cloud/backend/meta-merger/create-schema-cli.ts create mode 100644 cloud/backend/meta-merger/schema.ts create mode 100644 drizzle.cloud.config.ts create mode 100644 patches/drizzle-kit.patch diff --git a/cloud/backend/hono-server.ts b/cloud/backend/hono-server.ts index a5518ebc7..37db32892 100644 --- a/cloud/backend/hono-server.ts +++ b/cloud/backend/hono-server.ts @@ -4,11 +4,12 @@ import { Context, Hono, Next } from "hono"; import { WSContext, WSContextInit, WSMessageReceive } from "hono/ws"; // import { CFExposeCtxItem } from "./cf-hono-server.js"; import { metaMerger } from "./meta-merger/meta-merger.js"; -import { SQLDatabase } from "./meta-merger/abstract-sql.js"; +// import { SQLDatabase } from "./meta-merger/abstract-sql.js"; import { WSRoom } from "./ws-room.js"; import { MsgDispatcher, MsgDispatcherCtx, Promisable, WSConnectionPair } from "./msg-dispatch.js"; import { calculatePreSignedUrl } from "./pre-signed-url.js"; import { buildMsgDispatcher } from "./msg-dispatcher-impl.js"; +import { LibSQLDatabase } from "drizzle-orm/libsql"; type BindGetMeta = ps.cloud.BindGetMeta; type ReqPutMeta = ps.cloud.ReqPutMeta; @@ -51,7 +52,7 @@ export interface ExposeCtxItem { readonly ende: ps.cloud.EnDeCoder; readonly stsService: rt.sts.SessionTokenService; readonly gestalt: ps.cloud.Gestalt; - readonly dbFactory: () => SQLDatabase; + readonly dbFactory: () => LibSQLDatabase; // readonly metaMerger: MetaMerger; readonly id: string; } @@ -138,10 +139,11 @@ export abstract class HonoServerBase implements HonoServerImpl { } // abstract getConnected(): Connected[]; - start(ctx: ExposeCtxItem, drop = false): Promise { - return metaMerger(ctx) - .createSchema(drop) - .then(() => this); + start(ctx: ExposeCtxItem): Promise { + metaMerger(ctx) + return Promise.resolve(this); + // .createSchema(drop) + // .then(() => this); } // gestalt(): Gestalt { @@ -248,7 +250,7 @@ class NoBackChannel implements MsgDispatcherCtx { readonly logger: Logger; readonly ende: ps.cloud.EnDeCoder; readonly gestalt: ps.cloud.Gestalt; - readonly dbFactory: () => SQLDatabase; + readonly dbFactory: () => LibSQLDatabase; readonly id: string; readonly stsService: rt.sts.SessionTokenService; diff --git a/cloud/backend/meta-merger/abstract-sql.ts b/cloud/backend/meta-merger/abstract-sql.ts deleted file mode 100644 index 445c5d2a9..000000000 --- a/cloud/backend/meta-merger/abstract-sql.ts +++ /dev/null @@ -1,53 +0,0 @@ -// import { RunResult } from "better-sqlite3"; - -// export function now() { -// return new Date().toISOString(); -// } - -// export interface SqlLiteStmt { -// // eslint-disable-next-line @typescript-eslint/no-explicit-any -// bind(...args: any[]): any; -// // eslint-disable-next-line @typescript-eslint/no-explicit-any -// run(...args: any[]): Promise; -// // eslint-disable-next-line @typescript-eslint/no-explicit-any -// get(...args: any[]): Promise; -// } - -// export interface SqlLite { -// prepare(sql: string): SqlLiteStmt; -// } - -// export interface SqlLiteDBDialect { - -// } - -// export type SQLLiteFlavor = BaseSQLiteDatabase<'async', unknown>; - -export interface SQLDatabase { - prepare(sql: string): SQLStatement; -} - -export type SQLParams = (string | number | Date)[]; - -// export type SQLRow = Record; - -export interface SQLStatement { - run(...params: SQLParams): Promise; - all(...params: SQLParams): Promise; -} - -export function conditionalDrop(drop: boolean, tabName: string, create: string): string[] { - if (!drop) { - return [create]; - } - return [`DROP TABLE IF EXISTS ${tabName}`, create]; -} - -export function sqliteCoerceParams(params: SQLParams): (string | number)[] { - return params.map((i) => { - if (i instanceof Date) { - return i.toISOString(); - } - return i; - }); -} diff --git a/cloud/backend/meta-merger/bettersql-abstract-sql.ts b/cloud/backend/meta-merger/bettersql-abstract-sql.ts deleted file mode 100644 index 727150dac..000000000 --- a/cloud/backend/meta-merger/bettersql-abstract-sql.ts +++ /dev/null @@ -1,37 +0,0 @@ -import { SQLDatabase, sqliteCoerceParams, SQLParams, SQLStatement } from "./abstract-sql.js"; - -import Database from "better-sqlite3"; - -export class BetterSQLStatement implements SQLStatement { - readonly stmt: Database.Statement; - constructor(stmt: Database.Statement) { - this.stmt = stmt; - } - - async run(...iparams: SQLParams): Promise { - const res = (await this.stmt.run(...sqliteCoerceParams(iparams))) as T; - // console.log("run", res); - return res; - } - async all(...params: SQLParams): Promise { - const res = (await this.stmt.all(...sqliteCoerceParams(params))) as T[]; - // console.log("all", res); - return res; - } -} - -export class BetterSQLDatabase implements SQLDatabase { - readonly db: Database.Database; - constructor(dbOrPath: Database.Database | string) { - if (typeof dbOrPath === "string") { - this.db = new Database(dbOrPath); - } else { - this.db = dbOrPath; - } - } - - prepare(sql: string): SQLStatement { - const stmt = this.db.prepare(sql); - return new BetterSQLStatement(stmt); - } -} diff --git a/cloud/backend/meta-merger/create-schema-cli.ts b/cloud/backend/meta-merger/create-schema-cli.ts deleted file mode 100644 index 7ebd858e7..000000000 --- a/cloud/backend/meta-merger/create-schema-cli.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { MetaSendSql } from "./meta-send.js"; - -async function main() { - // eslint-disable-next-line no-console - console.log(MetaSendSql.schema(true).join(";\n")); -} - -// eslint-disable-next-line no-console -main().catch(console.error); diff --git a/cloud/backend/meta-merger/key-by-tenant-ledger.ts b/cloud/backend/meta-merger/key-by-tenant-ledger.ts index 996ab814e..58a3644a1 100644 --- a/cloud/backend/meta-merger/key-by-tenant-ledger.ts +++ b/cloud/backend/meta-merger/key-by-tenant-ledger.ts @@ -1,6 +1,10 @@ -import { conditionalDrop, SQLDatabase, SQLStatement } from "./abstract-sql.js"; +// import { conditionalDrop, SQLDatabase, SQLStatement } from "./abstract-sql.js"; import { ByConnection } from "./meta-merger.js"; -import { TenantLedgerSql } from "./tenant-ledger.js"; +// import { TenantLedgerSql } from "./tenant-ledger.js"; +import { foreignKey, primaryKey, sqliteTable, text } from "drizzle-orm/sqlite-core"; +import { sqlTenantLedger } from "./tenant-ledger.js"; +import { LibSQLDatabase } from "drizzle-orm/libsql"; +import { eq, and, inArray } from "drizzle-orm/expressions"; export interface KeysForTenantLedger { readonly tenant: string; @@ -9,102 +13,138 @@ export interface KeysForTenantLedger { readonly createdAt: Date; } -export interface SQLMetaByTenantLedgerRow { - readonly tenant: string; - readonly ledger: string; - readonly key: string; - readonly createdAt: string; -} +// export interface SQLMetaByTenantLedgerRow { +// readonly tenant: string; +// readonly ledger: string; +// readonly key: string; +// readonly createdAt: string; +// } + +export const sqlKeyByTenantLedger = sqliteTable( + "KeyByTenantLedger", + { + tenant: text().notNull(), + ledger: text().notNull(), + key: text().notNull(), + createdAt: text().notNull(), + }, + (table) => [ + primaryKey({ columns: [table.tenant, table.ledger, table.key] }), + foreignKey({ + columns: [table.tenant, table.ledger], + foreignColumns: [sqlTenantLedger.tenant, sqlTenantLedger.ledger], + }), + ], +); export class KeyByTenantLedgerSql { - static schema(drop = false) { - return [ - ...conditionalDrop( - drop, - "KeyByTenantLedger", - ` - CREATE TABLE IF NOT EXISTS KeyByTenantLedger( - tenant TEXT NOT NULL, - ledger TEXT NOT NULL, - key TEXT NOT NULL, - createdAt TEXT NOT NULL, - PRIMARY KEY (tenant, ledger, key), - FOREIGN KEY (tenant, ledger) REFERENCES TenantLedger(tenant, ledger) - ) - `, - ), - ]; - } + // static schema(drop = false) { + // return [ + // ...conditionalDrop( + // drop, + // "KeyByTenantLedger", + // ` + // CREATE TABLE IF NOT EXISTS KeyByTenantLedger( + // tenant TEXT NOT NULL, + // ledger TEXT NOT NULL, + // key TEXT NOT NULL, + // createdAt TEXT NOT NULL, + // PRIMARY KEY (tenant, ledger, key), + // FOREIGN KEY (tenant, ledger) REFERENCES TenantLedger(tenant, ledger) + // ) + // `, + // ), + // ]; + // } - readonly db: SQLDatabase; - readonly tenantLedgerSql: TenantLedgerSql; + readonly db: LibSQLDatabase; + // readonly tenantLedgerSql: TenantLedgerSql; readonly id: string; - constructor(id: string, db: SQLDatabase, tenantLedgerSql: TenantLedgerSql) { + constructor(id: string, db: LibSQLDatabase) { this.db = db; - this.tenantLedgerSql = tenantLedgerSql; this.id = id; } // readonly #sqlCreateMetaByTenantLedger = new ResolveOnce(); - sqlCreateKeyByTenantLedger(): SQLStatement[] { - // return this.#sqlCreateMetaByTenantLedger.once(() => { - return KeyByTenantLedgerSql.schema().map((i) => this.db.prepare(i)); - // }); - } + // sqlCreateKeyByTenantLedger(): SQLStatement[] { + // // return this.#sqlCreateMetaByTenantLedger.once(() => { + // return KeyByTenantLedgerSql.schema().map((i) => this.db.prepare(i)); + // // }); + // } // readonly #sqlInsertMetaByTenantLedger = new ResolveOnce(); - sqlEnsureKeyByTenantLedger(): SQLStatement { - // return this.#sqlInsertMetaByTenantLedger.once(() => { - return this.db.prepare(` - INSERT INTO KeyByTenantLedger(tenant, ledger, key, createdAt) - SELECT ?, ?, ?, ? WHERE NOT EXISTS ( - SELECT 1 FROM KeyByTenantLedger WHERE key = ? and tenant = ? and ledger = ? - ) - `); - // }); - } // readonly #sqlDeleteByConnection = new ResolveOnce(); - sqlDeleteByTenantLedgerKey(): SQLStatement { - // return this.#sqlDeleteByConnection.once(() => { - return this.db.prepare(` - DELETE FROM KeyByTenantLedger - WHERE - tenant = ? - AND - ledger = ? - AND - key = ? - `); - // }); - } + // sqlDeleteByTenantLedgerKey(): SQLStatement { + // // return this.#sqlDeleteByConnection.once(() => { + // return this.db.prepare(` + // DELETE FROM KeyByTenantLedger + // WHERE + // tenant = ? + // AND + // ledger = ? + // AND + // key = ? + // `); + // // }); + // } - async deleteByTenantLedgerKey(t: Omit): Promise { - const stmt = this.sqlDeleteByTenantLedgerKey(); - for (const key of t.keys) { - await stmt.run(t.tenant, t.ledger, key); - } + async deleteByTenantLedgerKey(t: Omit) { + return this.db + .delete(sqlKeyByTenantLedger) + .where( + and( + eq(sqlKeyByTenantLedger.tenant, t.tenant), + eq(sqlKeyByTenantLedger.ledger, t.ledger), + inArray(sqlKeyByTenantLedger.key, t.keys), + ), + ) + .run(); } - async ensure(t: KeysForTenantLedger): Promise { - const stmt = this.sqlEnsureKeyByTenantLedger(); - for (const key of t.keys) { - await stmt.run(t.tenant, t.ledger, key, t.createdAt, key, t.tenant, t.ledger); - } - } + // sqlEnsureKeyByTenantLedger(): SQLStatement { + // // return this.#sqlInsertMetaByTenantLedger.once(() => { + // return this.db.prepare(` + // INSERT INTO KeyByTenantLedger(tenant, ledger, key, createdAt) + // SELECT ?, ?, ?, ? WHERE NOT EXISTS ( + // SELECT 1 FROM KeyByTenantLedger WHERE key = ? and tenant = ? and ledger = ? + // ) + // `); + // // }); + // } - sqlSelectByTenantLedger(): SQLStatement { - return this.db.prepare(` - SELECT tenant, ledger, key, createdAt - FROM KeyByTenantLedger - WHERE tenant = ? AND ledger = ? - ORDER BY key - `); + async ensure(t: KeysForTenantLedger) { + return this.db + .insert(sqlKeyByTenantLedger) + .values( + t.keys.map((key) => ({ + tenant: t.tenant, + ledger: t.ledger, + key: key, + createdAt: t.createdAt.toISOString(), + })), + ) + .onConflictDoNothing() + .run(); } + // sqlSelectByTenantLedger(): SQLStatement { + // return this.db.prepare(` + // SELECT tenant, ledger, key, createdAt + // FROM KeyByTenantLedger + // WHERE tenant = ? AND ledger = ? + // ORDER BY key + // `); + // } + async selectKeysByTenantLedger(conn: ByConnection): Promise> { - const stmt = this.sqlSelectByTenantLedger(); - const rows = await stmt.all(conn.tenant, conn.ledger); + // const stmt = this.sqlSelectByTenantLedger(); + const rows = await this.db + .select() + .from(sqlKeyByTenantLedger) + .where(and(eq(sqlKeyByTenantLedger.tenant, conn.tenant), eq(sqlKeyByTenantLedger.ledger, conn.ledger))) + .orderBy(sqlKeyByTenantLedger.key) + .all(); return { tenant: conn.tenant, ledger: conn.ledger, diff --git a/cloud/backend/meta-merger/meta-by-tenant-ledger.ts b/cloud/backend/meta-merger/meta-by-tenant-ledger.ts index 100e58858..cab38b590 100644 --- a/cloud/backend/meta-merger/meta-by-tenant-ledger.ts +++ b/cloud/backend/meta-merger/meta-by-tenant-ledger.ts @@ -1,7 +1,9 @@ -import { CRDTEntry } from "@fireproof/core"; -import { TenantLedgerSql } from "./tenant-ledger.js"; +import { CRDTEntry, } from "@fireproof/core"; +import { sqlTenantLedger } from "./tenant-ledger.js"; import { ByConnection } from "./meta-merger.js"; -import { conditionalDrop, SQLDatabase, SQLStatement } from "./abstract-sql.js"; +import { foreignKey, primaryKey, sqliteTable, text, index } from "drizzle-orm/sqlite-core"; +import { LibSQLDatabase } from "drizzle-orm/libsql"; +import { eq, and, notInArray } from "drizzle-orm"; export interface MetaByTenantLedgerRow { readonly tenant: string; @@ -13,156 +15,149 @@ export interface MetaByTenantLedgerRow { readonly updateAt: Date; } -interface SQLMetaByTenantLedgerRow { - readonly tenant: string; - readonly ledger: string; - readonly reqId: string; - readonly resId: string; - readonly metaCID: string; - readonly meta: string; - readonly updateAt: string; -} +// interface SQLMetaByTenantLedgerRow { +// readonly tenant: string; +// readonly ledger: string; +// readonly reqId: string; +// readonly resId: string; +// readonly metaCID: string; +// readonly meta: string; +// readonly updateAt: string; +// } + -/* -SELECT * FROM Mitarbeiter e1 -WHERE NOT EXISTS -( - SELECT 1 FROM Mitarbeiter e2 - WHERE e1.employee_id=e2.employee_id und e2.employee_name LIKE 'A%' +export const sqlMetaByTenantLedger = sqliteTable( + "MetaByTenantLedger", + { + tenant: text().notNull(), + ledger: text().notNull(), + metaCID: text().notNull(), + meta: text().notNull(), + reqId: text().notNull(), + resId: text().notNull(), + updateAt: text().notNull(), + }, + (table) => [ + primaryKey({ columns: [table.tenant, table.ledger, table.metaCID] }), + index("MetaByTenantLedger-ReqIdResId").on(table.tenant, table.ledger, table.reqId, table.resId), + foreignKey({ + columns: [table.tenant, table.ledger], + foreignColumns: [sqlTenantLedger.tenant, sqlTenantLedger.ledger], + }), + ], ); - */ export class MetaByTenantLedgerSql { - static schema(drop = false) { - return [ - ...TenantLedgerSql.schema(drop), - ...conditionalDrop( - drop, - "MetaByTenantLedger", - ` - CREATE TABLE IF NOT EXISTS MetaByTenantLedger( - tenant TEXT NOT NULL, - ledger TEXT NOT NULL, - reqId TEXT NOT NULL, - resId TEXT NOT NULL, - metaCID TEXT NOT NULL, - meta TEXT NOT NULL, - updatedAt TEXT NOT NULL, - PRIMARY KEY (tenant, ledger, reqId, resId, metaCID), - UNIQUE (tenant, ledger, metaCID), - FOREIGN KEY (tenant, ledger) REFERENCES TenantLedger(tenant, ledger) - ) - `, - ), - ]; - } + // static schema(drop = false) { + // return [ + // ...TenantLedgerSql.schema(drop), + // ...conditionalDrop( + // drop, + // "MetaByTenantLedger", + // ` + // CREATE TABLE IF NOT EXISTS MetaByTenantLedger( + // tenant TEXT NOT NULL, + // ledger TEXT NOT NULL, + // reqId TEXT NOT NULL, + // resId TEXT NOT NULL, + // metaCID TEXT NOT NULL, + // meta TEXT NOT NULL, + // updatedAt TEXT NOT NULL, + // PRIMARY KEY (tenant, ledger, reqId, resId, metaCID), + // UNIQUE (tenant, ledger, metaCID), + // FOREIGN KEY (tenant, ledger) REFERENCES TenantLedger(tenant, ledger) + // ) + // `, + // ), + // ]; + // } - readonly db: SQLDatabase; - readonly tenantLedgerSql: TenantLedgerSql; + readonly db: LibSQLDatabase; readonly id: string; - constructor(id: string, db: SQLDatabase, tenantLedgerSql: TenantLedgerSql) { + constructor(id: string, db: LibSQLDatabase) { this.db = db; - this.tenantLedgerSql = tenantLedgerSql; this.id = id; } // readonly #sqlCreateMetaByTenantLedger = new ResolveOnce(); - sqlCreateMetaByTenantLedger(): SQLStatement[] { - // return this.#sqlCreateMetaByTenantLedger.once(() => { - return MetaByTenantLedgerSql.schema().map((i) => this.db.prepare(i)); - // }); - } + // sqlCreateMetaByTenantLedger(): SQLStatement[] { + // // return this.#sqlCreateMetaByTenantLedger.once(() => { + // return MetaByTenantLedgerSql.schema().map((i) => this.db.prepare(i)); + // // }); + // } - // readonly #sqlInsertMetaByTenantLedger = new ResolveOnce(); - sqlEnsureMetaByTenantLedger(): SQLStatement { - // return this.#sqlInsertMetaByTenantLedger.once(() => { - return this.db.prepare(` - INSERT INTO MetaByTenantLedger(tenant, ledger, reqId, resId, metaCID, meta, updatedAt) - SELECT ?, ?, ?, ?, ?, ?, ? WHERE NOT EXISTS ( - SELECT 1 FROM MetaByTenantLedger WHERE metaCID = ? AND tenant = ? AND ledger = ? - ) - `); - // }); - } // readonly #sqlDeleteByConnection = new ResolveOnce(); - sqlDeleteByConnection(): SQLStatement { - // return this.#sqlDeleteByConnection.once(() => { - const stmt = this.db.prepare(` - DELETE FROM MetaByTenantLedger - WHERE - tenant = ? - AND - ledger = ? - AND - reqId = ? - AND - resId = ? - AND - metaCID NOT IN (SELECT value FROM json_each(?)) - `); - return stmt; - // }); - } - - /* - * select * from MetaByTenantLedger where tenant = 'tenant' and ledger = 'ledger' group by metaCID - */ - - // readonly #sqlSelectByMetaCIDs = new ResolveOnce() - // sqlSelectByMetaCIDs(): Statement { - // return this.#sqlSelectByMetaCIDs.once(() => { - // return this.db.prepare(` - // SELECT tenant, ledger, reqId, resId, metaCID, meta, updatedAt - // FROM MetaByTenantLedger - // WHERE metaCID in ? + // sqlDeleteByConnection(): SQLStatement { + // // return this.#sqlDeleteByConnection.once(() => { + // const stmt = this.db.prepare(` + // DELETE FROM MetaByTenantLedger + // WHERE + // tenant = ? + // AND + // ledger = ? + // AND + // reqId = ? + // AND + // resId = ? + // AND + // metaCID NOT IN (SELECT value FROM json_each(?)) // `); - // }) - // } - // async selectByMetaCIDs(metaCIDs: string[]): Promise { - // const stmt = this.sqlSelectByMetaCIDs(); - // const rows = await stmt.all(metaCIDs) - // return rows.map(row => ({ - // ...row, - // meta: JSON.parse(row.meta), - // updateAt: new Date(row.updateAt) - // } satisfies MetaByTenantLedgerRow)) + // return stmt; + // // }); // } async deleteByConnection(t: ByConnection, waitingMetaCIDS: string[]) { - const stmt = this.sqlDeleteByConnection(); - // console.log("deleteByConnection:by:", t); - return stmt.run(t.tenant, t.ledger, t.reqId, t.resId, JSON.stringify(waitingMetaCIDS)); + return this.db.delete(sqlMetaByTenantLedger).where( + and( + eq(sqlMetaByTenantLedger.tenant, t.tenant), + eq(sqlMetaByTenantLedger.ledger, t.ledger), + notInArray(sqlMetaByTenantLedger.metaCID, waitingMetaCIDS), + ), + ) } + // readonly #sqlInsertMetaByTenantLedger = new ResolveOnce(); + // sqlEnsureMetaByTenantLedger(): SQLStatement { + // // return this.#sqlInsertMetaByTenantLedger.once(() => { + // return this.db.prepare(` + // INSERT INTO MetaByTenantLedger(tenant, ledger, reqId, resId, metaCID, meta, updatedAt) + // SELECT ?, ?, ?, ?, ?, ?, ? WHERE NOT EXISTS ( + // SELECT 1 FROM MetaByTenantLedger WHERE metaCID = ? AND tenant = ? AND ledger = ? + // ) + // `); + // // }); + // } + async ensure(t: MetaByTenantLedgerRow) { - const stmt = this.sqlEnsureMetaByTenantLedger(); - return stmt.run( - t.tenant, - t.ledger, - t.reqId, - t.resId, - t.metaCID, - JSON.stringify(t.meta), - t.updateAt, - t.metaCID, - t.tenant, - t.ledger, - ); + // const stmt = this.sqlEnsureMetaByTenantLedger(); + return this.db.insert(sqlMetaByTenantLedger).values([{ + ...t, + meta: JSON.stringify(t.meta), + updateAt: t.updateAt.toISOString(), + }]).onConflictDoNothing().run(); } - sqlSelectByConnection(): SQLStatement { - return this.db.prepare(` - SELECT tenant, ledger, reqId, resId, metaCID, meta, updatedAt - FROM MetaByTenantLedger - WHERE tenant = ? AND ledger = ? AND reqId = ? AND resId = ? - ORDER BY updatedAt - `); - } + // sqlSelectByConnection(): SQLStatement { + // return this.db.prepare(` + // SELECT tenant, ledger, reqId, resId, metaCID, meta, updatedAt + // FROM MetaByTenantLedger + // WHERE tenant = ? AND ledger = ? AND reqId = ? AND resId = ? + // ORDER BY updatedAt + // `); + // } async selectByConnection(conn: ByConnection): Promise { - const stmt = this.sqlSelectByConnection(); - const rows = await stmt.all(conn.tenant, conn.ledger, conn.reqId, conn.resId); + // const stmt = this.sqlSelectByConnection(); + // const rows = await stmt.all(conn.tenant, conn.ledger, conn.reqId, conn.resId); + const rows = await this.db.select().from(sqlMetaByTenantLedger).where( + and( + eq(sqlMetaByTenantLedger.tenant, conn.tenant), + eq(sqlMetaByTenantLedger.ledger, conn.ledger), + eq(sqlMetaByTenantLedger.reqId, conn.reqId), + eq(sqlMetaByTenantLedger.resId, conn.resId), + ), + ).all(); return rows.map( (row) => ({ diff --git a/cloud/backend/meta-merger/meta-merger.test.ts b/cloud/backend/meta-merger/meta-merger.test.ts index 0a976bf5c..90a0a5ced 100644 --- a/cloud/backend/meta-merger/meta-merger.test.ts +++ b/cloud/backend/meta-merger/meta-merger.test.ts @@ -1,7 +1,8 @@ // import type { Database } from "better-sqlite3"; import { Connection, MetaMerge, MetaMerger } from "./meta-merger.js"; import { ensureSuperThis, rt } from "@fireproof/core"; -import { SQLDatabase } from "./abstract-sql.js"; +// import { SQLDatabase } from "./abstract-sql.js"; +import { drizzle, LibSQLDatabase } from "drizzle-orm/libsql"; function sortCRDTEntries(rows: rt.V2SerializedMetaKey) { return rows.metas.sort((a, b) => a.cid.localeCompare(b.cid)); @@ -38,13 +39,20 @@ function toCRDTEntries(rows: MetaConnection[]) { // r.connection.conn.resId === connection.conn.resId))) // } -function getSQLFlavours(): { name: string; factory: () => Promise }[] { +function getSQLFlavours(): { name: string; factory: () => Promise }[] { return [ { - name: "bettersql", + name: "libsql", factory: async () => { + // import type { Client } from "@libsql/client"; + const { createClient } = await import("@libsql/client"); + return drizzle(createClient({ + url: "file://./dist/test.db", + })) + /* const { BetterSQLDatabase } = await import("./bettersql-abstract-sql.js"); - return new BetterSQLDatabase("./dist/test.db"); + return new BetterSQLDatabase("./dist/test.db") as unknown as LibSQLDatabase; + */ }, }, ]; @@ -59,7 +67,7 @@ describe.each(getSQLFlavours())("$name - MetaMerger", (flavour) => { // db = new Database(':memory:'); const db = await flavour.factory(); mm = new MetaMerger("bong", logger, db); - await mm.createSchema(); + // await mm.createSchema(); }); let metaMerge: MetaMerge; diff --git a/cloud/backend/meta-merger/meta-merger.ts b/cloud/backend/meta-merger/meta-merger.ts index 03f8c5e13..5d5435da6 100644 --- a/cloud/backend/meta-merger/meta-merger.ts +++ b/cloud/backend/meta-merger/meta-merger.ts @@ -3,9 +3,10 @@ import { MetaByTenantLedgerSql } from "./meta-by-tenant-ledger.js"; import { MetaSendSql } from "./meta-send.js"; import { TenantLedgerSql } from "./tenant-ledger.js"; import { TenantSql } from "./tenant.js"; -import { SQLDatabase } from "./abstract-sql.js"; +// import { SQLDatabase } from "./abstract-sql.js"; import { Logger } from "@adviser/cement"; import { KeyByTenantLedgerSql } from "./key-by-tenant-ledger.js"; +import { LibSQLDatabase } from "drizzle-orm/libsql"; type TenantLedger = ps.cloud.TenantLedger; type QSId = ps.cloud.QSId; @@ -36,17 +37,19 @@ function toByConnection(connection: Connection): ByConnection { }; } + + export function metaMerger(ctx: { readonly id: string; readonly logger: Logger; - readonly dbFactory: () => SQLDatabase; + readonly dbFactory: () => LibSQLDatabase; // readonly sthis: SuperThis; }) { return new MetaMerger(ctx.id, ctx.logger, ctx.dbFactory()); } export class MetaMerger { - readonly db: SQLDatabase; + readonly db: LibSQLDatabase; // readonly sthis: SuperThis; readonly sql: { readonly tenant: TenantSql; @@ -59,27 +62,27 @@ export class MetaMerger { readonly logger: Logger; readonly id: string; - constructor(id: string, logger: Logger, db: SQLDatabase) { + constructor(id: string, logger: Logger, db: LibSQLDatabase) { this.db = db; this.id = id; this.logger = logger; // this.sthis = sthis; const tenant = new TenantSql(id, db); - const tenantLedger = new TenantLedgerSql(id, db, tenant); + const tenantLedger = new TenantLedgerSql(id, db); this.sql = { tenant, tenantLedger, - metaByTenantLedger: new MetaByTenantLedgerSql(id, db, tenantLedger), - keyByTenantLedger: new KeyByTenantLedgerSql(id, db, tenantLedger), + metaByTenantLedger: new MetaByTenantLedgerSql(id, db), + keyByTenantLedger: new KeyByTenantLedgerSql(id, db), metaSend: new MetaSendSql(id, db), }; } - async createSchema(drop = false) { - for (const i of this.sql.metaSend.sqlCreateMetaSend(drop)) { - await i.run(); - } - } + // async createSchema(drop = false) { + // for (const i of this.sql.metaSend.sqlCreateMetaSend(drop)) { + // await i.run(); + // } + // } async delMeta(mm: MetaMerge): Promise<{ now: Date; byConnection: ByConnection }> { const now = mm.now || new Date(); diff --git a/cloud/backend/meta-merger/meta-send.ts b/cloud/backend/meta-merger/meta-send.ts index abfe3c4c8..c102d45e5 100644 --- a/cloud/backend/meta-merger/meta-send.ts +++ b/cloud/backend/meta-merger/meta-send.ts @@ -1,9 +1,11 @@ // import { ResolveOnce } from "@adviser/cement"; -import { MetaByTenantLedgerSql } from "./meta-by-tenant-ledger.js"; +import { sqlMetaByTenantLedger } from "./meta-by-tenant-ledger.js"; import { ByConnection } from "./meta-merger.js"; import { CRDTEntry } from "@fireproof/core"; -import { conditionalDrop, SQLDatabase, SQLStatement } from "./abstract-sql.js"; -import { KeyByTenantLedgerSql } from "./key-by-tenant-ledger.js"; +// import { SQLDatabase, SQLStatement } from "./abstract-sql.js"; +import { foreignKey, primaryKey, sqliteTable, text } from "drizzle-orm/sqlite-core"; +import { LibSQLDatabase } from "drizzle-orm/libsql"; +import { and, eq, inArray, notInArray } from "drizzle-orm"; export interface MetaSendRow { readonly metaCID: string; @@ -14,95 +16,122 @@ export interface MetaSendRow { readonly sendAt: Date; } -type SQLMetaSendRowWithMeta = MetaSendRow & { meta: string }; + +export const sqlMetaSend = sqliteTable( + "MetaSend", + { + metaCID: text().notNull(), + tenant: text().notNull(), + ledger: text().notNull(), + reqId: text().notNull(), + resId: text().notNull(), + sendAt: text().notNull(), + }, + (table) => [ + primaryKey({ columns: [table.metaCID, table.tenant, table.ledger] }), + foreignKey({ + columns: [table.tenant, table.ledger, table.metaCID], + foreignColumns: [sqlMetaByTenantLedger.tenant, sqlMetaByTenantLedger.ledger, sqlMetaByTenantLedger.metaCID], + }), + ], +); + +// type SQLMetaSendRowWithMeta = MetaSendRow & { meta: string }; export type MetaSendRowWithMeta = MetaSendRow & { meta: CRDTEntry }; export class MetaSendSql { - static schema(drop = false) { - return [ - ...MetaByTenantLedgerSql.schema(drop), - ...KeyByTenantLedgerSql.schema(drop), - ...conditionalDrop( - drop, - "MetaSend", - ` - CREATE TABLE IF NOT EXISTS MetaSend ( - metaCID TEXT NOT NULL, - tenant TEXT NOT NULL, - ledger TEXT NOT NULL, - reqId TEXT NOT NULL, - resId TEXT NOT NULL, - sendAt TEXT NOT NULL, - PRIMARY KEY(metaCID, tenant, ledger, reqId,resId), - FOREIGN KEY(tenant, ledger, metaCID) REFERENCES MetaByTenantLedger(tenant, ledger, metaCID) - ); - `, - ), - ]; - } + // static schema(drop = false) { + // return [ + // ...MetaByTenantLedgerSql.schema(drop), + // ...KeyByTenantLedgerSql.schema(drop), + // ...conditionalDrop( + // drop, + // "MetaSend", + // ` + // CREATE TABLE IF NOT EXISTS MetaSend ( + // metaCID TEXT NOT NULL, + // tenant TEXT NOT NULL, + // ledger TEXT NOT NULL, + // reqId TEXT NOT NULL, + // resId TEXT NOT NULL, + // sendAt TEXT NOT NULL, + // PRIMARY KEY(metaCID, tenant, ledger, reqId,resId), + // FOREIGN KEY(tenant, ledger, metaCID) REFERENCES MetaByTenantLedger(tenant, ledger, metaCID) + // ); + // `, + // ), + // ]; + // } - readonly db: SQLDatabase; + readonly db: LibSQLDatabase; readonly id: string; - constructor(id: string, db: SQLDatabase) { + constructor(id: string, db: LibSQLDatabase) { this.db = db; this.id = id; } // readonly #sqlCreateMetaSend = new ResolveOnce(); - sqlCreateMetaSend(drop: boolean): SQLStatement[] { - // return this.#sqlCreateMetaSend.once(() => { - return MetaSendSql.schema(drop).map((i) => this.db.prepare(i)); - // }); - } + // sqlCreateMetaSend(drop: boolean): SQLStatement[] { + // // return this.#sqlCreateMetaSend.once(() => { + // return MetaSendSql.schema(drop).map((i) => this.db.prepare(i)); + // // }); + // } // readonly #sqlInsertMetaSend = new ResolveOnce(); - sqlInsertMetaSend(): SQLStatement { - // return this.#sqlInsertMetaSend.once(() => { - return this.db.prepare(` - INSERT INTO MetaSend(metaCID, tenant, ledger, reqId, resId, sendAt) VALUES(?, ?, ?, ?, ?, ?) - `); - // }); - } + // sqlInsertMetaSend(): SQLStatement { + // // return this.#sqlInsertMetaSend.once(() => { + // return this.db.prepare(` + // INSERT INTO MetaSend(metaCID, tenant, ledger, reqId, resId, sendAt) VALUES(?, ?, ?, ?, ?, ?) + // `); + // // }); + // } // readonly #sqlSelectToAddSend = new ResolveOnce(); - sqlSelectToAddSend(): SQLStatement { - // return this.#sqlSelectToAddSend.once(() => { - return this.db.prepare(` - SELECT t.metaCID, t.tenant, t.ledger, ? as reqId, ? as resId, ? as sendAt, t.meta FROM MetaByTenantLedger as t - WHERE - t.tenant = ? - AND - t.ledger = ? - AND - NOT EXISTS (SELECT 1 FROM MetaSend AS s WHERE t.metaCID = s.metaCID and t.tenant = s.tenant and t.ledger = s.ledger and s.reqId = ? and s.resId = ?) - `); - // }); - } + // sqlSelectToAddSend(): SQLStatement { + // // return this.#sqlSelectToAddSend.once(() => { + // return this.db.prepare(` + // SELECT t.metaCID, t.tenant, t.ledger, ? as reqId, ? as resId, ? as sendAt, t.meta FROM MetaByTenantLedger as t + // WHERE + // t.tenant = ? + // AND + // t.ledger = ? + // AND + // NOT EXISTS (SELECT 1 FROM MetaSend AS s WHERE t.metaCID = s.metaCID and t.tenant = s.tenant and t.ledger = s.ledger and s.reqId = ? and s.resId = ?) + // `); + // // }); + // } async selectToAddSend(conn: ByConnection & { now: Date }): Promise { // console.log("selectToAddSend-1"); - const stmt = this.sqlSelectToAddSend(); + // const stmt = this.sqlSelectToAddSend(); // console.log("selectToAddSend-2"); try { - const rows = await stmt.all( - conn.reqId, - conn.resId, - conn.now, - conn.tenant, - conn.ledger, - conn.reqId, - conn.resId, - ); - // console.log("selectToAddSend-3", rows); + + const rows = await this.db.select().from(sqlMetaByTenantLedger) + .where( + and( + eq(sqlMetaByTenantLedger.tenant, conn.tenant), + eq(sqlMetaByTenantLedger.ledger, conn.ledger), + notInArray(sqlMetaByTenantLedger.metaCID, this.db.select({ metaCID: sqlMetaSend.metaCID }).from(sqlMetaSend).where( + and( + eq(sqlMetaSend.tenant, conn.tenant), + eq(sqlMetaSend.ledger, conn.ledger), + eq(sqlMetaSend.reqId, conn.reqId), + eq(sqlMetaSend.resId, conn.resId), + ) + )), + ) + ).all(); + const now = conn.now; return rows.map( (i) => ({ metaCID: i.metaCID, tenant: i.tenant, ledger: i.ledger, - reqId: i.reqId, - resId: i.resId, - sendAt: new Date(i.sendAt), + reqId: conn.reqId, + resId: conn.resId, + sendAt: now, meta: JSON.parse(i.meta) as CRDTEntry, }) satisfies MetaSendRowWithMeta, ); @@ -114,72 +143,100 @@ export class MetaSendSql { } async insert(t: MetaSendRow[]) { - const stmt = this.sqlInsertMetaSend(); - for (const i of t) { - await stmt.run(i.metaCID, i.tenant, i.ledger, i.reqId, i.resId, i.sendAt); - } + return this.db.insert(sqlMetaSend).values(t.map(i => ({ + ...i, + sendAt: i.sendAt.toISOString(), + }))).onConflictDoNothing().run(); + // const stmt = this.sqlInsertMetaSend(); + // for (const i of t) { + // await stmt.run(i.metaCID, i.tenant, i.ledger, i.reqId, i.resId, i.sendAt); + // } } - sqlMetaCIDByConnection(): SQLStatement { - return this.db.prepare(` - SELECT metaCID FROM MetaSend - WHERE - tenant = ? - AND - ledger = ? - AND - reqId = ? - AND - resId = ? - AND - metaCID NOT IN (SELECT value FROM json_each(?)) - `); - } - // readonly #sqlDeleteByConnection = new ResolveOnce(); - sqlDeleteByMetaCID(): SQLStatement { - // return this.#sqlDeleteByConnection.once(() => { - - return this.db.prepare(` - DELETE FROM MetaSend - WHERE - tenant = ? - AND - ledger = ? - AND - reqId = ? - AND - resId = ? - AND - metaCID in (SELECT value FROM json_each(?)) - `); - // }); - } - sqlMetaCIDByTenantLedger(): SQLStatement { - return this.db.prepare(` - select distinct metaCID from MetaSend where tenant = ? and ledger = ? - `); - } + // readonly #sqlDeleteByConnection = new ResolveOnce(); + + // sqlMetaCIDByTenantLedger(): SQLStatement { + // return this.db.prepare(` + // select distinct metaCID from MetaSend where tenant = ? and ledger = ? + // `); + // } async getToSendMetaCIDs(tenant: string, ledger: string): Promise { - const stmt = this.sqlMetaCIDByTenantLedger(); - const rows = await stmt.all<{ metaCID: string }>(tenant, ledger); - return rows.map((i) => i.metaCID); + const rows = await this.db.select({ metaCID: sqlMetaSend.metaCID }).from(sqlMetaSend).where( + and( + eq(sqlMetaSend.tenant, tenant), + eq(sqlMetaSend.ledger, ledger), + )).all(); + // db + // .select({ + // [columnName]: myTable[columnName], + // }) + // .from(myTable) + // .where(whereCondition) + // .distinct(); + // const rows = await stmt.all<{ metaCID: string }>(tenant, ledger); + return Array.from(new Set(rows.map((i) => i.metaCID))); } + // sqlDeleteByMetaCID(): SQLStatement { + // // return this.#sqlDeleteByConnection.once(() => { + + // return this.db.prepare(` + // DELETE FROM MetaSend + // WHERE + // tenant = ? + // AND + // ledger = ? + // AND + // reqId = ? + // AND + // resId = ? + // AND + // metaCID in (SELECT value FROM json_each(?)) + // `); + // // }); + // } + + // sqlMetaCIDByConnection(): SQLStatement { + // return this.db.prepare(` + // SELECT metaCID FROM MetaSend + // WHERE + // tenant = ? + // AND + // ledger = ? + // AND + // reqId = ? + // AND + // resId = ? + // AND + // metaCID NOT IN (SELECT value FROM json_each(?)) + // `); + // } + async deleteByConnection(dmi: ByConnection & { metaCIDs: string[] }) { - const metaCIDs = await this.sqlMetaCIDByConnection().all<{ metaCID: string }>( - dmi.tenant, - dmi.ledger, - dmi.reqId, - dmi.resId, - JSON.stringify(dmi.metaCIDs), - ); + const metaCIDs = await this.db.select().from(sqlMetaSend).where( + and( + eq(sqlMetaSend.tenant, dmi.tenant), + eq(sqlMetaSend.ledger, dmi.ledger), + eq(sqlMetaSend.reqId, dmi.reqId), + eq(sqlMetaSend.resId, dmi.resId), + notInArray(sqlMetaSend.metaCID, dmi.metaCIDs), + ) + ).all() if (!metaCIDs.length) { return; } // console.log("deleteByConnection:send", dmi, metaCIDs); - const stmt = this.sqlDeleteByMetaCID(); - return stmt.run(dmi.tenant, dmi.ledger, dmi.reqId, dmi.resId, JSON.stringify(metaCIDs.map((i) => i.metaCID))); + // const stmt = this.sqlDeleteByMetaCID(); + return this.db.delete(sqlMetaSend).where( + and( + eq(sqlMetaSend.tenant, dmi.tenant), + eq(sqlMetaSend.ledger, dmi.ledger), + eq(sqlMetaSend.reqId, dmi.reqId), + eq(sqlMetaSend.resId, dmi.resId), + inArray(sqlMetaSend.metaCID, metaCIDs.map((i) => i.metaCID)), + ) + ).run() //dmi.tenant, dmi.ledger, dmi.reqId, dmi.resId, JSON.stringify(metaCIDs.map((i) => i.metaCID))); } } diff --git a/cloud/backend/meta-merger/schema.ts b/cloud/backend/meta-merger/schema.ts new file mode 100644 index 000000000..1d2f0a782 --- /dev/null +++ b/cloud/backend/meta-merger/schema.ts @@ -0,0 +1,5 @@ +export * from "./tenant.js" +export * from "./tenant-ledger.js" +export * from "./key-by-tenant-ledger.js" +export * from "./meta-send.js" +export * from "./meta-by-tenant-ledger.js" \ No newline at end of file diff --git a/cloud/backend/meta-merger/tenant-ledger.ts b/cloud/backend/meta-merger/tenant-ledger.ts index c7ba5968c..cb52510ee 100644 --- a/cloud/backend/meta-merger/tenant-ledger.ts +++ b/cloud/backend/meta-merger/tenant-ledger.ts @@ -1,6 +1,16 @@ // import { ResolveOnce } from "@adviser/cement"; -import { conditionalDrop, SQLDatabase, SQLStatement } from "./abstract-sql.js"; -import { TenantSql } from "./tenant.js"; +import { LibSQLDatabase } from "drizzle-orm/libsql"; +import { primaryKey, sqliteTable, text } from "drizzle-orm/sqlite-core"; +import { sqlTenant } from "./tenant.js"; + +export const sqlTenantLedger = sqliteTable("TenantLedger", { + tenant: text().references(() => sqlTenant.tenant), + ledger: text(), + createdAt: text().notNull(), +}, +(table) => [ + primaryKey({ columns: [table.tenant, table.ledger] }), +]); export interface TenantLedgerRow { readonly tenant: string; @@ -9,56 +19,56 @@ export interface TenantLedgerRow { } export class TenantLedgerSql { - static schema(drop = false) { - return [ - ...TenantSql.schema(drop), - ...conditionalDrop( - drop, - "TenantLedger", - ` - CREATE TABLE IF NOT EXISTS TenantLedger( - tenant TEXT NOT NULL, - ledger TEXT NOT NULL, - createdAt TEXT NOT NULL, - PRIMARY KEY(tenant, ledger), - FOREIGN KEY(tenant) REFERENCES Tenant(tenant) - ) - `, - ), - ]; - } + // static schema(drop = false) { + // return [ + // ...TenantSql.schema(drop), + // ...conditionalDrop( + // drop, + // "TenantLedger", + // ` + // CREATE TABLE IF NOT EXISTS TenantLedger( + // tenant TEXT NOT NULL, + // ledger TEXT NOT NULL, + // createdAt TEXT NOT NULL, + // PRIMARY KEY(tenant, ledger), + // FOREIGN KEY(tenant) REFERENCES Tenant(tenant) + // ) + // `, + // ), + // ]; + // } - readonly db: SQLDatabase; - readonly tenantSql: TenantSql; + readonly db: LibSQLDatabase; readonly id: string; - constructor(id: string, db: SQLDatabase, tenantSql: TenantSql) { + constructor(id: string, db: LibSQLDatabase) { this.db = db; - this.tenantSql = tenantSql; this.id = id; } // readonly #sqlCreateTenantLedger = new ResolveOnce(); - sqlCreateTenantLedger(): SQLStatement[] { - // return this.#sqlCreateTenantLedger.once(() => { - return TenantLedgerSql.schema().map((i) => this.db.prepare(i)); - // }); - } + // sqlCreateTenantLedger(): SQLStatement[] { + // // return this.#sqlCreateTenantLedger.once(() => { + // return TenantLedgerSql.schema().map((i) => this.db.prepare(i)); + // // }); + // } // readonly #sqlInsertTenantLedger = new ResolveOnce(); - sqlEnsureTenantLedger(): SQLStatement { - // return this.#sqlInsertTenantLedger.once(() => { - return this.db.prepare(` - INSERT INTO TenantLedger(tenant, ledger, createdAt) - SELECT ?, ?, ? WHERE - NOT EXISTS(SELECT 1 FROM TenantLedger WHERE tenant = ? and ledger = ?) - `); - // }); - } + // sqlEnsureTenantLedger(): SQLStatement { + // // return this.#sqlInsertTenantLedger.once(() => { + // return this.db.prepare(` + // INSERT INTO TenantLedger(tenant, ledger, createdAt) + // SELECT ?, ?, ? WHERE + // NOT EXISTS(SELECT 1 FROM TenantLedger WHERE tenant = ? and ledger = ?) + // `); + // // }); + // } async ensure(t: TenantLedgerRow) { - await this.tenantSql.ensure({ tenant: t.tenant, createdAt: t.createdAt }); - const stmt = this.sqlEnsureTenantLedger(); - const ret = stmt.run(t.tenant, t.ledger, t.createdAt, t.tenant, t.ledger); - return ret; + this.db.insert(sqlTenantLedger) + .values({ + tenant: t.tenant, + ledger: t.ledger, + createdAt: t.createdAt.toISOString(), + }).onConflictDoNothing().run(); } } diff --git a/cloud/backend/meta-merger/tenant.ts b/cloud/backend/meta-merger/tenant.ts index 30267309c..b44ea00dd 100644 --- a/cloud/backend/meta-merger/tenant.ts +++ b/cloud/backend/meta-merger/tenant.ts @@ -1,5 +1,13 @@ // import { ResolveOnce } from "@adviser/cement"; -import { conditionalDrop, SQLDatabase, SQLStatement } from "./abstract-sql.js"; +// import { SQLStatement } from "./abstract-sql.js"; + +import { LibSQLDatabase } from "drizzle-orm/libsql"; +import { sqliteTable, text } from "drizzle-orm/sqlite-core"; + +export const sqlTenant = sqliteTable("Tenant", { + tenant: text().primaryKey(), + createdAt: text().notNull(), +}); export interface TenantRow { readonly tenant: string; @@ -7,47 +15,50 @@ export interface TenantRow { } export class TenantSql { - static schema(drop = false): string[] { - return [ - ...conditionalDrop( - drop, - "Tenant", - ` - CREATE TABLE IF NOT EXISTS Tenant( - tenant TEXT NOT NULL PRIMARY KEY, - createdAt TEXT NOT NULL - ) - `, - ), - ]; - } + // static schema(drop = false): string[] { + // return [ + // ...conditionalDrop( + // drop, + // "Tenant", + // ` + // CREATE TABLE IF NOT EXISTS Tenant( + // tenant TEXT NOT NULL PRIMARY KEY, + // createdAt TEXT NOT NULL + // ) + // `, + // ), + // ]; + // } - readonly db: SQLDatabase; + readonly db: LibSQLDatabase; readonly id: string; - constructor(id: string, db: SQLDatabase) { + constructor(id: string, db: LibSQLDatabase) { this.db = db; this.id = id; } - // readonly #sqlCreateTenant = new ResolveOnce(); - sqlCreateTenant(): SQLStatement[] { - // return this.#sqlCreateTenant.once(() => { - return TenantSql.schema().map((i) => this.db.prepare(i)); - // }); - } + // // readonly #sqlCreateTenant = new ResolveOnce(); + // sqlCreateTenant(): SQLStatement[] { + // // return this.#sqlCreateTenant.once(() => { + // return TenantSql.schema().map((i) => this.db.prepare(i)); + // // }); + // } // readonly #sqlInsertTenant = new ResolveOnce(); - sqlEnsureTenant(): SQLStatement { - // return this.#sqlInsertTenant.once(() => { - return this.db.prepare(` - INSERT INTO Tenant(tenant, createdAt) - SELECT ?, ? WHERE NOT EXISTS(SELECT 1 FROM Tenant WHERE tenant = ?) - `); - // }); - } + // sqlEnsureTenant(): SQLStatement { + // // return this.#sqlInsertTenant.once(() => { + // return this.db.prepare(` + // INSERT INTO Tenant(tenant, createdAt) + // SELECT ?, ? WHERE NOT EXISTS(SELECT 1 FROM Tenant WHERE tenant = ?) + // `); + // // }); + // } - async ensure(t: TenantRow) { - const stmt = this.sqlEnsureTenant(); - return stmt.run(t.tenant, t.createdAt, t.tenant); + ensure(t: TenantRow) { + return this.db.insert(sqlTenant) + .values({ + tenant: t.tenant, + createdAt: t.createdAt.toISOString(), + }).onConflictDoNothing().run(); } } diff --git a/cloud/backend/node-hono-server.ts b/cloud/backend/node-hono-server.ts index d4e334da9..ee3974c18 100644 --- a/cloud/backend/node-hono-server.ts +++ b/cloud/backend/node-hono-server.ts @@ -12,11 +12,12 @@ import { import { ResolveOnce, URI } from "@adviser/cement"; import { Context, Hono } from "hono"; import { ensureLogger, SuperThis, ps, rt } from "@fireproof/core"; -import { SQLDatabase } from "./meta-merger/abstract-sql.js"; +// import { SQLDatabase } from "./meta-merger/abstract-sql.js"; import { WSRoom } from "./ws-room.js"; import { ConnItem } from "./msg-dispatch.js"; import { cloudBackendParams } from "./test-helper.js"; import { MetaMerger } from "./meta-merger/meta-merger.js"; +import { LibSQLDatabase } from "drizzle-orm/libsql"; const { defaultGestalt, isProtocolCapabilities, MsgIsWithConn, qsidKey, jsonEnDe, defaultMsgParams } = ps.cloud; type Gestalt = ps.cloud.Gestalt; @@ -34,7 +35,7 @@ type serveFn = (options: unknown, listeningListener?: ((info: unknown) => void) export interface NodeHonoFactoryParams { readonly msgP?: MsgerParams; readonly gs?: Gestalt; - readonly sql: SQLDatabase; + readonly sql: LibSQLDatabase; } // const wsConnections = new Map>(); @@ -218,7 +219,7 @@ export class NodeHonoFactory implements HonoServerFactory { async start(app: Hono): Promise { try { await createDB.once(() => { - return new MetaMerger("test", this.sthis.logger, this.params.sql).createSchema(); + return new MetaMerger("test", this.sthis.logger, this.params.sql) // .createSchema(); }); const { createNodeWebSocket } = await import("@hono/node-ws"); diff --git a/cloud/backend/node-serve.ts b/cloud/backend/node-serve.ts index 772a38794..2d778508d 100644 --- a/cloud/backend/node-serve.ts +++ b/cloud/backend/node-serve.ts @@ -3,8 +3,10 @@ import { HonoServer } from "./hono-server.js"; import { NodeHonoFactory } from "./node-hono-server.js"; import { serve } from "@hono/node-server"; import { ensureSuperThis } from "use-fireproof"; -import { BetterSQLDatabase } from "./meta-merger/bettersql-abstract-sql.js"; +// import { BetterSQLDatabase } from "./meta-merger/bettersql-abstract-sql.js"; import { ps } from "@fireproof/core"; +import { createClient } from "@libsql/client"; +import { drizzle } from "drizzle-orm/libsql"; // async function main() { // Deno.serve({ @@ -32,7 +34,8 @@ async function main() { new NodeHonoFactory(sthis, { msgP, gs: gestalt, - sql: new BetterSQLDatabase("./dist/node-meta.sqlite"), + sql: drizzle(createClient({ url: `file://${process.cwd()}/dist/sqlite.db` })) + // new BetterSQLDatabase("./dist/node-meta.sqlite"), }), ).register(app); diff --git a/cloud/backend/test-helper.ts b/cloud/backend/test-helper.ts index 01a7db04f..003a13605 100644 --- a/cloud/backend/test-helper.ts +++ b/cloud/backend/test-helper.ts @@ -2,9 +2,10 @@ import { BuildURI, CoerceURI, Result, URI } from "@adviser/cement"; import { SuperThis, rt, ps, ensureSuperThis } from "@fireproof/core"; import type { GenerateKeyPairOptions } from "jose/key/generate/keypair"; import { HonoServer } from "./hono-server.js"; -import { BetterSQLDatabase } from "./meta-merger/bettersql-abstract-sql.js"; import { NodeHonoFactory } from "./node-hono-server.js"; import { Hono } from "hono"; +import { drizzle } from "drizzle-orm/libsql"; +import { createClient } from "@libsql/client"; type MsgerParamsWithEnDe = ps.cloud.MsgerParamsWithEnDe; type MsgRawConnection = ps.cloud.MsgRawConnection; @@ -191,7 +192,8 @@ export function NodeHonoServerFactory(sthis: SuperThis) { const nhf = new NodeHonoFactory(sthis, { msgP, gs: remoteGestalt, - sql: new BetterSQLDatabase("./dist/node-meta.sqlite"), + sql: drizzle(createClient({ url: `file://./dist/node-meta.sqlite` })), + // new BetterSQLDatabase("./dist/node-meta.sqlite"), }); return new HonoServer(nhf); }, @@ -289,7 +291,8 @@ export async function setupBackend( const nhf = new NodeHonoFactory(sthis, { // msgP, // gs: remoteGestalt, - sql: new BetterSQLDatabase("./dist/node-meta.sqlite"), + sql: drizzle(createClient({ url: `file://./dist/node-meta.sqlite` })), + //new BetterSQLDatabase("./dist/node-meta.sqlite"), }); const app = new Hono(); const hs = new HonoServer(nhf); diff --git a/drizzle.cloud.config.ts b/drizzle.cloud.config.ts new file mode 100644 index 000000000..198d7fcd4 --- /dev/null +++ b/drizzle.cloud.config.ts @@ -0,0 +1,10 @@ +import { defineConfig } from "drizzle-kit"; + +export default defineConfig({ + dialect: "sqlite", + schema: "./cloud-backend/meta-merger/schema.ts", + out: "./dist", + dbCredentials: { + url: "./dist/sqlite.db", + }, +}); diff --git a/package.json b/package.json index 18d220ec6..29db50fa8 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,8 @@ "test:indexeddb": "vitest --config vitest.indexeddb.config.ts --run", "test:deno": "deno run --quiet --allow-net --allow-write --allow-run --allow-sys --allow-ffi --allow-read --allow-env ./node_modules/vitest/vitest.mjs --run --project file", "format": "prettier .", - "lint": "eslint" + "lint": "eslint", + "drizzle:test": "drizzle-kit push --config ./drizzle.cloud.config.ts" }, "keywords": [ "ledger", @@ -63,6 +64,7 @@ "@vitest/ui": "^3.0.9", "aws4fetch": "^1.0.20", "better-sqlite3": "^11.9.1", + "drizzle-kit": "^0.30.5", "esbuild": "^0.24.2", "esbuild-plugin-replace": "^1.4.0", "eslint": "^9.18.0", @@ -98,9 +100,11 @@ "@ipld/car": "^5.4.0", "@ipld/dag-cbor": "^9.2.2", "@ipld/dag-json": "^10.2.3", + "@libsql/client": "^0.15.0", "jose": "^6.0.10", "cborg": "^4.2.9", "charwise": "^3.0.1", + "drizzle-orm": "^0.40.1", "esbuild-plugin-replace": "^1.4.0", "idb": "^8.0.2", "multiformats": "^13.3.2", @@ -110,7 +114,8 @@ "prolly-trees": "^1.0.4", "randombytes": "^2.1.0", "react": "^18.3.1", - "ws": "^8.18.1" + "ws": "^8.18.1", + "zod": "^3.24.2" }, "bundle-phobia": { "max-size": "390kB", @@ -120,10 +125,14 @@ "pnpm": { "onlyBuiltDependencies": [ "better-sqlite3", + "core-js", "edgedriver", "esbuild", "msw", "playwright-chromium" - ] + ], + "patchedDependencies": { + "drizzle-kit": "patches/drizzle-kit.patch" + } } } diff --git a/patches/drizzle-kit.patch b/patches/drizzle-kit.patch new file mode 100644 index 000000000..d0aa4569e --- /dev/null +++ b/patches/drizzle-kit.patch @@ -0,0 +1,1909 @@ +diff --git a/api.js b/api.js +index 44ccfaa28b23166c174db6aa8f82c204d5983518..ff42ed7270a486080e531574c7b5bdd2ddd540ab 100644 +--- a/api.js ++++ b/api.js +@@ -3124,11 +3124,11 @@ var require_hanji = __commonJS({ + "use strict"; + var __awaiter = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { +- return value instanceof P ? value : new P(function(resolve) { +- resolve(value); ++ return value instanceof P ? value : new P(function(resolve2) { ++ resolve2(value); + }); + } +- return new (P || (P = Promise))(function(resolve, reject) { ++ return new (P || (P = Promise))(function(resolve2, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); +@@ -3144,7 +3144,7 @@ var require_hanji = __commonJS({ + } + } + function step(result) { +- result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); ++ result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +@@ -3218,14 +3218,14 @@ var require_hanji = __commonJS({ + }; + exports2.SelectState = SelectState3; + var deferred = () => { +- let resolve; ++ let resolve2; + let reject; + const promise = new Promise((res, rej) => { +- resolve = res; ++ resolve2 = res; + reject = rej; + }); + return { +- resolve, ++ resolve: resolve2, + reject, + promise + }; +@@ -3275,8 +3275,8 @@ var require_hanji = __commonJS({ + }; + this.stdin.on("keypress", keypress); + this.view.attach(this); +- const { resolve, promise } = (0, exports2.deferred)(); +- this.resolve = resolve; ++ const { resolve: resolve2, promise } = (0, exports2.deferred)(); ++ this.resolve = resolve2; + this.promise = promise; + this.renderFunc = (0, lodash_throttle_1.default)((str) => { + this.stdout.write(str); +@@ -22381,7 +22381,7 @@ var version; + var init_version = __esm({ + "../drizzle-orm/dist/version.js"() { + "use strict"; +- version = "0.40.0"; ++ version = "0.40.1"; + } + }); + +@@ -22841,7 +22841,7 @@ var init_sql = __esm({ + return new SQL([new StringChunk(str)]); + } + sql2.raw = raw; +- function join(chunks, separator) { ++ function join2(chunks, separator) { + const result = []; + for (const [i, chunk] of chunks.entries()) { + if (i > 0 && separator !== void 0) { +@@ -22851,7 +22851,7 @@ var init_sql = __esm({ + } + return new SQL(result); + } +- sql2.join = join; ++ sql2.join = join2; + function identifier(value) { + return new Name(value); + } +@@ -27668,7 +27668,7 @@ var init_select2 = __esm({ + return (table6, on) => { + const baseTableName = this.tableName; + const tableName = getTableLikeName(table6); +- if (typeof tableName === "string" && this.config.joins?.some((join) => join.alias === tableName)) { ++ if (typeof tableName === "string" && this.config.joins?.some((join2) => join2.alias === tableName)) { + throw new Error(`Alias "${tableName}" is already used in this query`); + } + if (!this.isPartialSelect) { +@@ -28450,7 +28450,7 @@ var init_update = __esm({ + createJoin(joinType) { + return (table6, on) => { + const tableName = getTableLikeName(table6); +- if (typeof tableName === "string" && this.config.joins.some((join) => join.alias === tableName)) { ++ if (typeof tableName === "string" && this.config.joins.some((join2) => join2.alias === tableName)) { + throw new Error(`Alias "${tableName}" is already used in this query`); + } + if (typeof on === "function") { +@@ -28542,10 +28542,10 @@ var init_update = __esm({ + const fromFields = this.getTableLikeFields(this.config.from); + fields[tableName] = fromFields; + } +- for (const join of this.config.joins) { +- const tableName2 = getTableLikeName(join.table); +- if (typeof tableName2 === "string" && !is(join.table, SQL)) { +- const fromFields = this.getTableLikeFields(join.table); ++ for (const join2 of this.config.joins) { ++ const tableName2 = getTableLikeName(join2.table); ++ if (typeof tableName2 === "string" && !is(join2.table, SQL)) { ++ const fromFields = this.getTableLikeFields(join2.table); + fields[tableName2] = fromFields; + } + } +@@ -33351,7 +33351,7 @@ var init_select3 = __esm({ + return (table6, on) => { + const baseTableName = this.tableName; + const tableName = getTableLikeName(table6); +- if (typeof tableName === "string" && this.config.joins?.some((join) => join.alias === tableName)) { ++ if (typeof tableName === "string" && this.config.joins?.some((join2) => join2.alias === tableName)) { + throw new Error(`Alias "${tableName}" is already used in this query`); + } + if (!this.isPartialSelect) { +@@ -33999,7 +33999,7 @@ var init_update2 = __esm({ + createJoin(joinType) { + return (table6, on) => { + const tableName = getTableLikeName(table6); +- if (typeof tableName === "string" && this.config.joins.some((join) => join.alias === tableName)) { ++ if (typeof tableName === "string" && this.config.joins.some((join2) => join2.alias === tableName)) { + throw new Error(`Alias "${tableName}" is already used in this query`); + } + if (typeof on === "function") { +@@ -35439,27 +35439,26 @@ ${withStyle.errorWarning( + fromDatabase2 = async (db, tablesFilter = (table6) => true, progressCallback) => { + const result = {}; + const resultViews = {}; ++ const ignoreTableNames = `NOT IN ( ++ 'sqlite_sequence', ++ '_litestream_seq', ++ '_litestream_lock', ++ 'libsql_wasm_func_table', ++ '__drizzle_migrations', ++ '_cf_KV')`; + const columns = await db.query( + `SELECT + m.name as "tableName", p.name as "columnName", p.type as "columnType", p."notnull" as "notNull", p.dflt_value as "defaultValue", p.pk as pk, p.hidden as hidden, m.sql, m.type as type + FROM sqlite_master AS m JOIN pragma_table_xinfo(m.name) AS p +- WHERE (m.type = 'table' OR m.type = 'view') +- and m.tbl_name != 'sqlite_sequence' +- and m.tbl_name != 'sqlite_stat1' +- and m.tbl_name != '_litestream_seq' +- and m.tbl_name != '_litestream_lock' +- and m.tbl_name != 'libsql_wasm_func_table' +- and m.tbl_name != '__drizzle_migrations' +- and m.tbl_name != '_cf_KV'; ++ WHERE (m.type = 'table' OR m.type = 'view') ++ AND m.tbl_name ${ignoreTableNames}; + ` + ); + const tablesWithSeq = []; + const seq = await db.query( + `SELECT * FROM sqlite_master WHERE name != 'sqlite_sequence' +- and name != 'sqlite_stat1' +- and name != '_litestream_seq' +- and name != '_litestream_lock' +- and tbl_name != '_cf_KV' ++ and name ${ignoreTableNames} ++ and tbl_name ${ignoreTableNames} + and sql GLOB '*[ *' || CHAR(9) || CHAR(10) || CHAR(13) || ']AUTOINCREMENT[^'']*';` + ); + for (const s of seq) { +@@ -35558,7 +35557,7 @@ ${withStyle.errorWarning( + const fks = await db.query( + `SELECT m.name as "tableFrom", f.id as "id", f."table" as "tableTo", f."from", f."to", f."on_update" as "onUpdate", f."on_delete" as "onDelete", f.seq as "seq" + FROM sqlite_master m, pragma_foreign_key_list(m.name) as f +- where m.tbl_name != '_cf_KV';` ++ where m.tbl_name ${ignoreTableNames};` + ); + const fkByTableName = {}; + for (const fkRow of fks) { +@@ -35618,7 +35617,7 @@ FROM sqlite_master AS m, + WHERE + m.type = 'table' + and il.name NOT LIKE 'sqlite_autoindex_%' +- and m.tbl_name != '_cf_KV';` ++ and m.tbl_name ${ignoreTableNames};` + ); + for (const idxRow of idxs) { + const tableName = idxRow.tableName; +@@ -35680,7 +35679,7 @@ WHERE + const checkConstraints = {}; + const checks = await db.query(`SELECT name as "tableName", sql as "sql" + FROM sqlite_master +- WHERE type = 'table' AND name != 'sqlite_sequence';`); ++ WHERE type = 'table' AND name ${ignoreTableNames};`); + for (const check of checks) { + if (!tablesFilter(check.tableName)) continue; + const { tableName, sql: sql2 } = check; +@@ -38940,7 +38939,7 @@ var init_select4 = __esm({ + return (table6, on, onIndex) => { + const baseTableName = this.tableName; + const tableName = getTableLikeName(table6); +- if (typeof tableName === "string" && this.config.joins?.some((join) => join.alias === tableName)) { ++ if (typeof tableName === "string" && this.config.joins?.some((join2) => join2.alias === tableName)) { + throw new Error(`Alias "${tableName}" is already used in this query`); + } + if (!this.isPartialSelect) { +@@ -44114,7 +44113,7 @@ var init_select5 = __esm({ + return (table6, on) => { + const baseTableName = this.tableName; + const tableName = getTableLikeName(table6); +- if (typeof tableName === "string" && this.config.joins?.some((join) => join.alias === tableName)) { ++ if (typeof tableName === "string" && this.config.joins?.some((join2) => join2.alias === tableName)) { + throw new Error(`Alias "${tableName}" is already used in this query`); + } + if (!this.isPartialSelect) { +@@ -45573,12 +45572,16 @@ __export(sqliteImports_exports, { + prepareFromExports: () => prepareFromExports2, + prepareFromSqliteImports: () => prepareFromSqliteImports + }); +-var prepareFromExports2, prepareFromSqliteImports; ++var esbuild, import_promises, import_path, prepareFromExports2, prepareFromSqliteImports; + var init_sqliteImports = __esm({ + "src/serializer/sqliteImports.ts"() { + "use strict"; ++ init_source(); + init_dist(); + init_sqlite_core(); ++ esbuild = __toESM(require("esbuild")); ++ import_promises = require("fs/promises"); ++ import_path = require("path"); + init_utils9(); + prepareFromExports2 = (exports2) => { + const tables = []; +@@ -45598,13 +45601,20 @@ var init_sqliteImports = __esm({ + const tables = []; + const views = []; + const { unregister } = await safeRegister(); +- for (let i = 0; i < imports.length; i++) { +- const it = imports[i]; +- const i0 = require(`${it}`); +- const prepared = prepareFromExports2(i0); +- tables.push(...prepared.tables); +- views.push(...prepared.views); +- } ++ const outDir = await (0, import_promises.mkdtemp)(".drizzle-kit.sqlite-imports-"); ++ let outFile = (0, import_path.resolve)((0, import_path.join)(outDir, "schema.js")); ++ console.log(source_default.grey(`Reading schema files '${JSON.stringify(imports)}'`)); ++ const res = esbuild.buildSync({ ++ entryPoints: imports, ++ bundle: true, ++ format: "cjs", ++ outfile: outFile ++ }); ++ const i0 = require(outFile); ++ const prepared = prepareFromExports2(i0); ++ await (0, import_promises.rm)(outDir, { recursive: true }); ++ tables.push(...prepared.tables); ++ views.push(...prepared.views); + unregister(); + return { tables: Array.from(new Set(tables)), views }; + }; +diff --git a/api.mjs b/api.mjs +index d52ed68b1a8da7e334b1d2e08b4298cd3a9597df..ff343f61495cdb1bfd98c32950b54b320bd535de 100644 +--- a/api.mjs ++++ b/api.mjs +@@ -3129,11 +3129,11 @@ var require_hanji = __commonJS({ + "use strict"; + var __awaiter = exports && exports.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { +- return value instanceof P ? value : new P(function(resolve) { +- resolve(value); ++ return value instanceof P ? value : new P(function(resolve2) { ++ resolve2(value); + }); + } +- return new (P || (P = Promise))(function(resolve, reject) { ++ return new (P || (P = Promise))(function(resolve2, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); +@@ -3149,7 +3149,7 @@ var require_hanji = __commonJS({ + } + } + function step(result) { +- result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); ++ result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +@@ -3223,14 +3223,14 @@ var require_hanji = __commonJS({ + }; + exports.SelectState = SelectState3; + var deferred = () => { +- let resolve; ++ let resolve2; + let reject; + const promise = new Promise((res, rej) => { +- resolve = res; ++ resolve2 = res; + reject = rej; + }); + return { +- resolve, ++ resolve: resolve2, + reject, + promise + }; +@@ -3280,8 +3280,8 @@ var require_hanji = __commonJS({ + }; + this.stdin.on("keypress", keypress); + this.view.attach(this); +- const { resolve, promise } = (0, exports.deferred)(); +- this.resolve = resolve; ++ const { resolve: resolve2, promise } = (0, exports.deferred)(); ++ this.resolve = resolve2; + this.promise = promise; + this.renderFunc = (0, lodash_throttle_1.default)((str) => { + this.stdout.write(str); +@@ -22386,7 +22386,7 @@ var version; + var init_version = __esm({ + "../drizzle-orm/dist/version.js"() { + "use strict"; +- version = "0.40.0"; ++ version = "0.40.1"; + } + }); + +@@ -22846,7 +22846,7 @@ var init_sql = __esm({ + return new SQL([new StringChunk(str)]); + } + sql2.raw = raw; +- function join(chunks, separator) { ++ function join2(chunks, separator) { + const result = []; + for (const [i, chunk] of chunks.entries()) { + if (i > 0 && separator !== void 0) { +@@ -22856,7 +22856,7 @@ var init_sql = __esm({ + } + return new SQL(result); + } +- sql2.join = join; ++ sql2.join = join2; + function identifier(value) { + return new Name(value); + } +@@ -27673,7 +27673,7 @@ var init_select2 = __esm({ + return (table6, on) => { + const baseTableName = this.tableName; + const tableName = getTableLikeName(table6); +- if (typeof tableName === "string" && this.config.joins?.some((join) => join.alias === tableName)) { ++ if (typeof tableName === "string" && this.config.joins?.some((join2) => join2.alias === tableName)) { + throw new Error(`Alias "${tableName}" is already used in this query`); + } + if (!this.isPartialSelect) { +@@ -28455,7 +28455,7 @@ var init_update = __esm({ + createJoin(joinType) { + return (table6, on) => { + const tableName = getTableLikeName(table6); +- if (typeof tableName === "string" && this.config.joins.some((join) => join.alias === tableName)) { ++ if (typeof tableName === "string" && this.config.joins.some((join2) => join2.alias === tableName)) { + throw new Error(`Alias "${tableName}" is already used in this query`); + } + if (typeof on === "function") { +@@ -28547,10 +28547,10 @@ var init_update = __esm({ + const fromFields = this.getTableLikeFields(this.config.from); + fields[tableName] = fromFields; + } +- for (const join of this.config.joins) { +- const tableName2 = getTableLikeName(join.table); +- if (typeof tableName2 === "string" && !is(join.table, SQL)) { +- const fromFields = this.getTableLikeFields(join.table); ++ for (const join2 of this.config.joins) { ++ const tableName2 = getTableLikeName(join2.table); ++ if (typeof tableName2 === "string" && !is(join2.table, SQL)) { ++ const fromFields = this.getTableLikeFields(join2.table); + fields[tableName2] = fromFields; + } + } +@@ -33356,7 +33356,7 @@ var init_select3 = __esm({ + return (table6, on) => { + const baseTableName = this.tableName; + const tableName = getTableLikeName(table6); +- if (typeof tableName === "string" && this.config.joins?.some((join) => join.alias === tableName)) { ++ if (typeof tableName === "string" && this.config.joins?.some((join2) => join2.alias === tableName)) { + throw new Error(`Alias "${tableName}" is already used in this query`); + } + if (!this.isPartialSelect) { +@@ -34004,7 +34004,7 @@ var init_update2 = __esm({ + createJoin(joinType) { + return (table6, on) => { + const tableName = getTableLikeName(table6); +- if (typeof tableName === "string" && this.config.joins.some((join) => join.alias === tableName)) { ++ if (typeof tableName === "string" && this.config.joins.some((join2) => join2.alias === tableName)) { + throw new Error(`Alias "${tableName}" is already used in this query`); + } + if (typeof on === "function") { +@@ -35444,27 +35444,26 @@ ${withStyle.errorWarning( + fromDatabase2 = async (db, tablesFilter = (table6) => true, progressCallback) => { + const result = {}; + const resultViews = {}; ++ const ignoreTableNames = `NOT IN ( ++ 'sqlite_sequence', ++ '_litestream_seq', ++ '_litestream_lock', ++ 'libsql_wasm_func_table', ++ '__drizzle_migrations', ++ '_cf_KV')`; + const columns = await db.query( + `SELECT + m.name as "tableName", p.name as "columnName", p.type as "columnType", p."notnull" as "notNull", p.dflt_value as "defaultValue", p.pk as pk, p.hidden as hidden, m.sql, m.type as type + FROM sqlite_master AS m JOIN pragma_table_xinfo(m.name) AS p +- WHERE (m.type = 'table' OR m.type = 'view') +- and m.tbl_name != 'sqlite_sequence' +- and m.tbl_name != 'sqlite_stat1' +- and m.tbl_name != '_litestream_seq' +- and m.tbl_name != '_litestream_lock' +- and m.tbl_name != 'libsql_wasm_func_table' +- and m.tbl_name != '__drizzle_migrations' +- and m.tbl_name != '_cf_KV'; ++ WHERE (m.type = 'table' OR m.type = 'view') ++ AND m.tbl_name ${ignoreTableNames}; + ` + ); + const tablesWithSeq = []; + const seq = await db.query( + `SELECT * FROM sqlite_master WHERE name != 'sqlite_sequence' +- and name != 'sqlite_stat1' +- and name != '_litestream_seq' +- and name != '_litestream_lock' +- and tbl_name != '_cf_KV' ++ and name ${ignoreTableNames} ++ and tbl_name ${ignoreTableNames} + and sql GLOB '*[ *' || CHAR(9) || CHAR(10) || CHAR(13) || ']AUTOINCREMENT[^'']*';` + ); + for (const s of seq) { +@@ -35563,7 +35562,7 @@ ${withStyle.errorWarning( + const fks = await db.query( + `SELECT m.name as "tableFrom", f.id as "id", f."table" as "tableTo", f."from", f."to", f."on_update" as "onUpdate", f."on_delete" as "onDelete", f.seq as "seq" + FROM sqlite_master m, pragma_foreign_key_list(m.name) as f +- where m.tbl_name != '_cf_KV';` ++ where m.tbl_name ${ignoreTableNames};` + ); + const fkByTableName = {}; + for (const fkRow of fks) { +@@ -35623,7 +35622,7 @@ FROM sqlite_master AS m, + WHERE + m.type = 'table' + and il.name NOT LIKE 'sqlite_autoindex_%' +- and m.tbl_name != '_cf_KV';` ++ and m.tbl_name ${ignoreTableNames};` + ); + for (const idxRow of idxs) { + const tableName = idxRow.tableName; +@@ -35685,7 +35684,7 @@ WHERE + const checkConstraints = {}; + const checks = await db.query(`SELECT name as "tableName", sql as "sql" + FROM sqlite_master +- WHERE type = 'table' AND name != 'sqlite_sequence';`); ++ WHERE type = 'table' AND name ${ignoreTableNames};`); + for (const check of checks) { + if (!tablesFilter(check.tableName)) continue; + const { tableName, sql: sql2 } = check; +@@ -38945,7 +38944,7 @@ var init_select4 = __esm({ + return (table6, on, onIndex) => { + const baseTableName = this.tableName; + const tableName = getTableLikeName(table6); +- if (typeof tableName === "string" && this.config.joins?.some((join) => join.alias === tableName)) { ++ if (typeof tableName === "string" && this.config.joins?.some((join2) => join2.alias === tableName)) { + throw new Error(`Alias "${tableName}" is already used in this query`); + } + if (!this.isPartialSelect) { +@@ -44119,7 +44118,7 @@ var init_select5 = __esm({ + return (table6, on) => { + const baseTableName = this.tableName; + const tableName = getTableLikeName(table6); +- if (typeof tableName === "string" && this.config.joins?.some((join) => join.alias === tableName)) { ++ if (typeof tableName === "string" && this.config.joins?.some((join2) => join2.alias === tableName)) { + throw new Error(`Alias "${tableName}" is already used in this query`); + } + if (!this.isPartialSelect) { +@@ -45578,10 +45577,14 @@ __export(sqliteImports_exports, { + prepareFromExports: () => prepareFromExports2, + prepareFromSqliteImports: () => prepareFromSqliteImports + }); ++import * as esbuild from "esbuild"; ++import { mkdtemp, rm } from "fs/promises"; ++import { join, resolve } from "path"; + var prepareFromExports2, prepareFromSqliteImports; + var init_sqliteImports = __esm({ + "src/serializer/sqliteImports.ts"() { + "use strict"; ++ init_source(); + init_dist(); + init_sqlite_core(); + init_utils9(); +@@ -45603,13 +45606,20 @@ var init_sqliteImports = __esm({ + const tables = []; + const views = []; + const { unregister } = await safeRegister(); +- for (let i = 0; i < imports.length; i++) { +- const it = imports[i]; +- const i0 = __require(`${it}`); +- const prepared = prepareFromExports2(i0); +- tables.push(...prepared.tables); +- views.push(...prepared.views); +- } ++ const outDir = await mkdtemp(".drizzle-kit.sqlite-imports-"); ++ let outFile = resolve(join(outDir, "schema.js")); ++ console.log(source_default.grey(`Reading schema files '${JSON.stringify(imports)}'`)); ++ const res = esbuild.buildSync({ ++ entryPoints: imports, ++ bundle: true, ++ format: "cjs", ++ outfile: outFile ++ }); ++ const i0 = __require(outFile); ++ const prepared = prepareFromExports2(i0); ++ await rm(outDir, { recursive: true }); ++ tables.push(...prepared.tables); ++ views.push(...prepared.views); + unregister(); + return { tables: Array.from(new Set(tables)), views }; + }; +diff --git a/bin.cjs b/bin.cjs +index 70941f2a5aec6dcd1218e8a699fb5aafb4025f35..d88b84f4cd639d76ff7edcf2611b2ea1963915a7 100755 +--- a/bin.cjs ++++ b/bin.cjs +@@ -1191,11 +1191,11 @@ var require_hanji = __commonJS({ + "use strict"; + var __awaiter3 = exports2 && exports2.__awaiter || function(thisArg, _arguments, P, generator) { + function adopt(value) { +- return value instanceof P ? value : new P(function(resolve2) { +- resolve2(value); ++ return value instanceof P ? value : new P(function(resolve3) { ++ resolve3(value); + }); + } +- return new (P || (P = Promise))(function(resolve2, reject) { ++ return new (P || (P = Promise))(function(resolve3, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); +@@ -1211,7 +1211,7 @@ var require_hanji = __commonJS({ + } + } + function step(result) { +- result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected); ++ result.done ? resolve3(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +@@ -1285,14 +1285,14 @@ var require_hanji = __commonJS({ + }; + exports2.SelectState = SelectState3; + var deferred = () => { +- let resolve2; ++ let resolve3; + let reject; + const promise = new Promise((res, rej) => { +- resolve2 = res; ++ resolve3 = res; + reject = rej; + }); + return { +- resolve: resolve2, ++ resolve: resolve3, + reject, + promise + }; +@@ -1342,8 +1342,8 @@ var require_hanji = __commonJS({ + }; + this.stdin.on("keypress", keypress); + this.view.attach(this); +- const { resolve: resolve2, promise } = (0, exports2.deferred)(); +- this.resolve = resolve2; ++ const { resolve: resolve3, promise } = (0, exports2.deferred)(); ++ this.resolve = resolve3; + this.promise = promise; + this.renderFunc = (0, lodash_throttle_1.default)((str) => { + this.stdout.write(str); +@@ -7868,7 +7868,7 @@ function unescapeSingleQuotes(str, ignoreFirstAndLastChar) { + const regex = ignoreFirstAndLastChar ? /(? { ++ if (it.startsWith("file:")) { ++ it = it.substring(5); ++ } ++ (0, import_fs.mkdirSync)((0, import_path.dirname)(it), { recursive: true }); ++ }; + normaliseSQLiteUrl = (it, type) => { ++ mkdirSQLiteUrl(it); + if (type === "libsql") { + if (it.startsWith("file:")) { + return it; +@@ -14174,7 +14181,7 @@ var require_node2 = __commonJS({ + function _interopRequireDefault(obj) { + return obj && obj.__esModule ? obj : { default: obj }; + } +- function asyncGeneratorStep(gen, resolve2, reject, _next, _throw, key, arg) { ++ function asyncGeneratorStep(gen, resolve3, reject, _next, _throw, key, arg) { + try { + var info2 = gen[key](arg); + var value = info2.value; +@@ -14183,7 +14190,7 @@ var require_node2 = __commonJS({ + return; + } + if (info2.done) { +- resolve2(value); ++ resolve3(value); + } else { + Promise.resolve(value).then(_next, _throw); + } +@@ -14191,31 +14198,31 @@ var require_node2 = __commonJS({ + function _asyncToGenerator(fn) { + return function() { + var self2 = this, args = arguments; +- return new Promise(function(resolve2, reject) { ++ return new Promise(function(resolve3, reject) { + var gen = fn.apply(self2, args); + function _next(value) { +- asyncGeneratorStep(gen, resolve2, reject, _next, _throw, "next", value); ++ asyncGeneratorStep(gen, resolve3, reject, _next, _throw, "next", value); + } + function _throw(err2) { +- asyncGeneratorStep(gen, resolve2, reject, _next, _throw, "throw", err2); ++ asyncGeneratorStep(gen, resolve3, reject, _next, _throw, "throw", err2); + } + _next(void 0); + }); + }; + } +- var readFile2 = (fp) => new Promise((resolve2, reject) => { ++ var readFile2 = (fp) => new Promise((resolve3, reject) => { + _fs.default.readFile(fp, "utf8", (err2, data) => { + if (err2) + return reject(err2); +- resolve2(data); ++ resolve3(data); + }); + }); + var readFileSync3 = (fp) => { + return _fs.default.readFileSync(fp, "utf8"); + }; +- var pathExists = (fp) => new Promise((resolve2) => { ++ var pathExists = (fp) => new Promise((resolve3) => { + _fs.default.access(fp, (err2) => { +- resolve2(!err2); ++ resolve3(!err2); + }); + }); + var pathExistsSync = _fs.default.existsSync; +@@ -19997,12 +20004,16 @@ __export(sqliteImports_exports, { + prepareFromExports: () => prepareFromExports3, + prepareFromSqliteImports: () => prepareFromSqliteImports + }); +-var import_drizzle_orm5, import_sqlite_core, prepareFromExports3, prepareFromSqliteImports; ++var import_drizzle_orm5, import_sqlite_core, esbuild, import_promises2, import_path4, prepareFromExports3, prepareFromSqliteImports; + var init_sqliteImports = __esm({ + "src/serializer/sqliteImports.ts"() { + "use strict"; ++ init_source(); + import_drizzle_orm5 = require("drizzle-orm"); + import_sqlite_core = require("drizzle-orm/sqlite-core"); ++ esbuild = __toESM(require("esbuild")); ++ import_promises2 = require("fs/promises"); ++ import_path4 = require("path"); + init_utils3(); + prepareFromExports3 = (exports2) => { + const tables = []; +@@ -20022,13 +20033,20 @@ var init_sqliteImports = __esm({ + const tables = []; + const views = []; + const { unregister } = await safeRegister(); +- for (let i2 = 0; i2 < imports.length; i2++) { +- const it = imports[i2]; +- const i0 = require(`${it}`); +- const prepared = prepareFromExports3(i0); +- tables.push(...prepared.tables); +- views.push(...prepared.views); +- } ++ const outDir = await (0, import_promises2.mkdtemp)(".drizzle-kit.sqlite-imports-"); ++ let outFile = (0, import_path4.resolve)((0, import_path4.join)(outDir, "schema.js")); ++ console.log(source_default.grey(`Reading schema files '${JSON.stringify(imports)}'`)); ++ const res = esbuild.buildSync({ ++ entryPoints: imports, ++ bundle: true, ++ format: "cjs", ++ outfile: outFile ++ }); ++ const i0 = require(outFile); ++ const prepared = prepareFromExports3(i0); ++ await (0, import_promises2.rm)(outDir, { recursive: true }); ++ tables.push(...prepared.tables); ++ views.push(...prepared.views); + unregister(); + return { tables: Array.from(new Set(tables)), views }; + }; +@@ -20406,27 +20424,26 @@ ${withStyle.errorWarning( + fromDatabase3 = async (db, tablesFilter = (table6) => true, progressCallback) => { + const result = {}; + const resultViews = {}; ++ const ignoreTableNames = `NOT IN ( ++ 'sqlite_sequence', ++ '_litestream_seq', ++ '_litestream_lock', ++ 'libsql_wasm_func_table', ++ '__drizzle_migrations', ++ '_cf_KV')`; + const columns = await db.query( + `SELECT + m.name as "tableName", p.name as "columnName", p.type as "columnType", p."notnull" as "notNull", p.dflt_value as "defaultValue", p.pk as pk, p.hidden as hidden, m.sql, m.type as type + FROM sqlite_master AS m JOIN pragma_table_xinfo(m.name) AS p +- WHERE (m.type = 'table' OR m.type = 'view') +- and m.tbl_name != 'sqlite_sequence' +- and m.tbl_name != 'sqlite_stat1' +- and m.tbl_name != '_litestream_seq' +- and m.tbl_name != '_litestream_lock' +- and m.tbl_name != 'libsql_wasm_func_table' +- and m.tbl_name != '__drizzle_migrations' +- and m.tbl_name != '_cf_KV'; ++ WHERE (m.type = 'table' OR m.type = 'view') ++ AND m.tbl_name ${ignoreTableNames}; + ` + ); + const tablesWithSeq = []; + const seq = await db.query( + `SELECT * FROM sqlite_master WHERE name != 'sqlite_sequence' +- and name != 'sqlite_stat1' +- and name != '_litestream_seq' +- and name != '_litestream_lock' +- and tbl_name != '_cf_KV' ++ and name ${ignoreTableNames} ++ and tbl_name ${ignoreTableNames} + and sql GLOB '*[ *' || CHAR(9) || CHAR(10) || CHAR(13) || ']AUTOINCREMENT[^'']*';` + ); + for (const s2 of seq) { +@@ -20526,7 +20543,7 @@ ${withStyle.errorWarning( + const fks = await db.query( + `SELECT m.name as "tableFrom", f.id as "id", f."table" as "tableTo", f."from", f."to", f."on_update" as "onUpdate", f."on_delete" as "onDelete", f.seq as "seq" + FROM sqlite_master m, pragma_foreign_key_list(m.name) as f +- where m.tbl_name != '_cf_KV';` ++ where m.tbl_name ${ignoreTableNames};` + ); + const fkByTableName = {}; + for (const fkRow of fks) { +@@ -20587,7 +20604,7 @@ FROM sqlite_master AS m, + WHERE + m.type = 'table' + and il.name NOT LIKE 'sqlite_autoindex_%' +- and m.tbl_name != '_cf_KV';` ++ and m.tbl_name ${ignoreTableNames};` + ); + for (const idxRow of idxs) { + const tableName = idxRow.tableName; +@@ -20650,7 +20667,7 @@ WHERE + const checkConstraints = {}; + const checks = await db.query(`SELECT name as "tableName", sql as "sql" + FROM sqlite_master +- WHERE type = 'table' AND name != 'sqlite_sequence';`); ++ WHERE type = 'table' AND name ${ignoreTableNames};`); + for (const check2 of checks) { + if (!tablesFilter(check2.tableName)) + continue; +@@ -21199,14 +21216,14 @@ The unique index ${source_default.underline.blue( + }); + + // src/serializer/index.ts +-var import_fs4, glob, import_path4, serializeMySql, serializePg, serializeSQLite, serializeSingleStore, prepareFilenames; ++var import_fs4, glob, import_path5, serializeMySql, serializePg, serializeSQLite, serializeSingleStore, prepareFilenames; + var init_serializer = __esm({ + "src/serializer/index.ts"() { + "use strict"; + init_source(); + import_fs4 = __toESM(require("fs")); + glob = __toESM(require_glob()); +- import_path4 = __toESM(require("path")); ++ import_path5 = __toESM(require("path")); + init_views(); + serializeMySql = async (path4, casing2) => { + const filenames = prepareFilenames(path4); +@@ -21259,8 +21276,8 @@ ${filenames.join("\n")} + const result = path4.reduce((result2, cur) => { + const globbed = glob.sync(`${prefix2}${cur}`); + globbed.forEach((it) => { +- const fileName = import_fs4.default.lstatSync(it).isDirectory() ? null : import_path4.default.resolve(it); +- const filenames = fileName ? [fileName] : import_fs4.default.readdirSync(it).map((file) => import_path4.default.join(import_path4.default.resolve(it), file)); ++ const fileName = import_fs4.default.lstatSync(it).isDirectory() ? null : import_path5.default.resolve(it); ++ const filenames = fileName ? [fileName] : import_fs4.default.readdirSync(it).map((file) => import_path5.default.join(import_path5.default.resolve(it), file)); + filenames.filter((file) => !import_fs4.default.lstatSync(file).isDirectory()).forEach((file) => result2.add(file)); + }); + return result2; +@@ -33430,7 +33447,7 @@ __export(migrate_exports, { + viewsResolver: () => viewsResolver, + writeResult: () => writeResult + }); +-var import_fs6, import_hanji3, import_path5, schemasResolver, tablesResolver, viewsResolver, mySqlViewsResolver, sqliteViewsResolver, sequencesResolver, roleResolver, policyResolver, indPolicyResolver, enumsResolver, columnsResolver, prepareAndMigratePg, prepareAndExportPg, preparePgPush, prepareMySQLPush, prepareAndMigrateMysql, prepareSingleStorePush, prepareAndMigrateSingleStore, prepareAndExportSinglestore, prepareAndExportMysql, prepareAndMigrateSqlite, prepareAndExportSqlite, prepareAndMigrateLibSQL, prepareAndExportLibSQL, prepareSQLitePush, prepareLibSQLPush, promptColumnsConflicts, promptNamedConflict, promptNamedWithSchemasConflict, promptSchemasConflict, BREAKPOINT, writeResult, embeddedMigrations, prepareSnapshotFolderName, two; ++var import_fs6, import_hanji3, import_path6, schemasResolver, tablesResolver, viewsResolver, mySqlViewsResolver, sqliteViewsResolver, sequencesResolver, roleResolver, policyResolver, indPolicyResolver, enumsResolver, columnsResolver, prepareAndMigratePg, prepareAndExportPg, preparePgPush, prepareMySQLPush, prepareAndMigrateMysql, prepareSingleStorePush, prepareAndMigrateSingleStore, prepareAndExportSinglestore, prepareAndExportMysql, prepareAndMigrateSqlite, prepareAndExportSqlite, prepareAndMigrateLibSQL, prepareAndExportLibSQL, prepareSQLitePush, prepareLibSQLPush, promptColumnsConflicts, promptNamedConflict, promptNamedWithSchemasConflict, promptSchemasConflict, BREAKPOINT, writeResult, embeddedMigrations, prepareSnapshotFolderName, two; + var init_migrate = __esm({ + "src/cli/commands/migrate.ts"() { + "use strict"; +@@ -33438,7 +33455,7 @@ var init_migrate = __esm({ + init_migrationPreparator(); + init_source(); + import_hanji3 = __toESM(require_hanji()); +- import_path5 = __toESM(require("path")); ++ import_path6 = __toESM(require("path")); + init_singlestoreSchema(); + init_mysqlSchema(); + init_pgSchema(); +@@ -34392,10 +34409,10 @@ var init_migrate = __esm({ + const { prefix: prefix2, tag } = prepareMigrationMetadata(idx, prefixMode, name); + const toSave = JSON.parse(JSON.stringify(cur)); + toSave["_meta"] = _meta; +- const metaFolderPath = (0, import_path5.join)(outFolder, "meta"); +- const metaJournal = (0, import_path5.join)(metaFolderPath, "_journal.json"); ++ const metaFolderPath = (0, import_path6.join)(outFolder, "meta"); ++ const metaJournal = (0, import_path6.join)(metaFolderPath, "_journal.json"); + import_fs6.default.writeFileSync( +- (0, import_path5.join)(metaFolderPath, `${prefix2}_snapshot.json`), ++ (0, import_path6.join)(metaFolderPath, `${prefix2}_snapshot.json`), + JSON.stringify(toSave, null, 2) + ); + const sqlDelimiter = breakpoints ? BREAKPOINT : "\n"; +@@ -34428,7 +34445,7 @@ ${sql} + `[${source_default.green( + "\u2713" + )}] Your SQL migration file \u279C ${source_default.bold.underline.blue( +- import_path5.default.join(`${outFolder}/${tag}.sql`) ++ import_path6.default.join(`${outFolder}/${tag}.sql`) + )} \u{1F680}` + ); + }; +@@ -36602,8 +36619,8 @@ var require_ponyfill_es2018 = __commonJS({ + return new TypeError("Cannot " + name + " a stream using a released reader"); + } + function defaultReaderClosedPromiseInitialize(reader) { +- reader._closedPromise = newPromise((resolve2, reject) => { +- reader._closedPromise_resolve = resolve2; ++ reader._closedPromise = newPromise((resolve3, reject) => { ++ reader._closedPromise_resolve = resolve3; + reader._closedPromise_reject = reject; + }); + } +@@ -36781,8 +36798,8 @@ var require_ponyfill_es2018 = __commonJS({ + } + let resolvePromise; + let rejectPromise; +- const promise = newPromise((resolve2, reject) => { +- resolvePromise = resolve2; ++ const promise = newPromise((resolve3, reject) => { ++ resolvePromise = resolve3; + rejectPromise = reject; + }); + const readRequest = { +@@ -36878,8 +36895,8 @@ var require_ponyfill_es2018 = __commonJS({ + } + let resolvePromise; + let rejectPromise; +- const promise = newPromise((resolve2, reject) => { +- resolvePromise = resolve2; ++ const promise = newPromise((resolve3, reject) => { ++ resolvePromise = resolve3; + rejectPromise = reject; + }); + const readRequest = { +@@ -37712,8 +37729,8 @@ var require_ponyfill_es2018 = __commonJS({ + } + let resolvePromise; + let rejectPromise; +- const promise = newPromise((resolve2, reject) => { +- resolvePromise = resolve2; ++ const promise = newPromise((resolve3, reject) => { ++ resolvePromise = resolve3; + rejectPromise = reject; + }); + const readIntoRequest = { +@@ -38010,10 +38027,10 @@ var require_ponyfill_es2018 = __commonJS({ + wasAlreadyErroring = true; + reason = void 0; + } +- const promise = newPromise((resolve2, reject) => { ++ const promise = newPromise((resolve3, reject) => { + stream._pendingAbortRequest = { + _promise: void 0, +- _resolve: resolve2, ++ _resolve: resolve3, + _reject: reject, + _reason: reason, + _wasAlreadyErroring: wasAlreadyErroring +@@ -38030,9 +38047,9 @@ var require_ponyfill_es2018 = __commonJS({ + if (state === "closed" || state === "errored") { + return promiseRejectedWith(new TypeError(`The stream (in ${state} state) is not in the writable state and cannot be closed`)); + } +- const promise = newPromise((resolve2, reject) => { ++ const promise = newPromise((resolve3, reject) => { + const closeRequest = { +- _resolve: resolve2, ++ _resolve: resolve3, + _reject: reject + }; + stream._closeRequest = closeRequest; +@@ -38045,9 +38062,9 @@ var require_ponyfill_es2018 = __commonJS({ + return promise; + } + function WritableStreamAddWriteRequest(stream) { +- const promise = newPromise((resolve2, reject) => { ++ const promise = newPromise((resolve3, reject) => { + const writeRequest = { +- _resolve: resolve2, ++ _resolve: resolve3, + _reject: reject + }; + stream._writeRequests.push(writeRequest); +@@ -38643,8 +38660,8 @@ var require_ponyfill_es2018 = __commonJS({ + return new TypeError("Cannot " + name + " a stream using a released writer"); + } + function defaultWriterClosedPromiseInitialize(writer) { +- writer._closedPromise = newPromise((resolve2, reject) => { +- writer._closedPromise_resolve = resolve2; ++ writer._closedPromise = newPromise((resolve3, reject) => { ++ writer._closedPromise_resolve = resolve3; + writer._closedPromise_reject = reject; + writer._closedPromiseState = "pending"; + }); +@@ -38680,8 +38697,8 @@ var require_ponyfill_es2018 = __commonJS({ + writer._closedPromiseState = "resolved"; + } + function defaultWriterReadyPromiseInitialize(writer) { +- writer._readyPromise = newPromise((resolve2, reject) => { +- writer._readyPromise_resolve = resolve2; ++ writer._readyPromise = newPromise((resolve3, reject) => { ++ writer._readyPromise_resolve = resolve3; + writer._readyPromise_reject = reject; + }); + writer._readyPromiseState = "pending"; +@@ -38750,7 +38767,7 @@ var require_ponyfill_es2018 = __commonJS({ + source._disturbed = true; + let shuttingDown = false; + let currentWrite = promiseResolvedWith(void 0); +- return newPromise((resolve2, reject) => { ++ return newPromise((resolve3, reject) => { + let abortAlgorithm; + if (signal !== void 0) { + abortAlgorithm = () => { +@@ -38891,7 +38908,7 @@ var require_ponyfill_es2018 = __commonJS({ + if (isError2) { + reject(error2); + } else { +- resolve2(void 0); ++ resolve3(void 0); + } + } + }); +@@ -39155,8 +39172,8 @@ var require_ponyfill_es2018 = __commonJS({ + let branch1; + let branch2; + let resolveCancelPromise; +- const cancelPromise = newPromise((resolve2) => { +- resolveCancelPromise = resolve2; ++ const cancelPromise = newPromise((resolve3) => { ++ resolveCancelPromise = resolve3; + }); + function pullAlgorithm() { + if (reading) { +@@ -39246,8 +39263,8 @@ var require_ponyfill_es2018 = __commonJS({ + let branch1; + let branch2; + let resolveCancelPromise; +- const cancelPromise = newPromise((resolve2) => { +- resolveCancelPromise = resolve2; ++ const cancelPromise = newPromise((resolve3) => { ++ resolveCancelPromise = resolve3; + }); + function forwardReaderError(thisReader) { + uponRejection(thisReader._closedPromise, (r2) => { +@@ -39936,8 +39953,8 @@ var require_ponyfill_es2018 = __commonJS({ + const writableHighWaterMark = ExtractHighWaterMark(writableStrategy, 1); + const writableSizeAlgorithm = ExtractSizeAlgorithm(writableStrategy); + let startPromise_resolve; +- const startPromise = newPromise((resolve2) => { +- startPromise_resolve = resolve2; ++ const startPromise = newPromise((resolve3) => { ++ startPromise_resolve = resolve3; + }); + InitializeTransformStream(this, startPromise, writableHighWaterMark, writableSizeAlgorithm, readableHighWaterMark, readableSizeAlgorithm); + SetUpTransformStreamDefaultControllerFromTransformer(this, transformer); +@@ -40028,8 +40045,8 @@ var require_ponyfill_es2018 = __commonJS({ + if (stream._backpressureChangePromise !== void 0) { + stream._backpressureChangePromise_resolve(); + } +- stream._backpressureChangePromise = newPromise((resolve2) => { +- stream._backpressureChangePromise_resolve = resolve2; ++ stream._backpressureChangePromise = newPromise((resolve3) => { ++ stream._backpressureChangePromise_resolve = resolve3; + }); + stream._backpressure = backpressure; + } +@@ -42040,7 +42057,7 @@ var init_abort_error = __esm({ + + // ../node_modules/.pnpm/node-fetch@3.3.2/node_modules/node-fetch/src/index.js + async function fetch2(url, options_) { +- return new Promise((resolve2, reject) => { ++ return new Promise((resolve3, reject) => { + const request = new Request2(url, options_); + const { parsedURL, options } = getNodeRequestOptions(request); + if (!supportedSchemas.has(parsedURL.protocol)) { +@@ -42049,7 +42066,7 @@ async function fetch2(url, options_) { + if (parsedURL.protocol === "data:") { + const data = dist_default(request.url); + const response2 = new Response2(data, { headers: { "Content-Type": data.typeFull } }); +- resolve2(response2); ++ resolve3(response2); + return; + } + const send = (parsedURL.protocol === "https:" ? import_node_https.default : import_node_http2.default).request; +@@ -42171,7 +42188,7 @@ async function fetch2(url, options_) { + if (responseReferrerPolicy) { + requestOptions.referrerPolicy = responseReferrerPolicy; + } +- resolve2(fetch2(new Request2(locationURL, requestOptions))); ++ resolve3(fetch2(new Request2(locationURL, requestOptions))); + finalize(); + return; + } +@@ -42204,7 +42221,7 @@ async function fetch2(url, options_) { + const codings = headers.get("Content-Encoding"); + if (!request.compress || request.method === "HEAD" || codings === null || response_.statusCode === 204 || response_.statusCode === 304) { + response = new Response2(body, responseOptions); +- resolve2(response); ++ resolve3(response); + return; + } + const zlibOptions = { +@@ -42218,7 +42235,7 @@ async function fetch2(url, options_) { + } + }); + response = new Response2(body, responseOptions); +- resolve2(response); ++ resolve3(response); + return; + } + if (codings === "deflate" || codings === "x-deflate") { +@@ -42242,12 +42259,12 @@ async function fetch2(url, options_) { + }); + } + response = new Response2(body, responseOptions); +- resolve2(response); ++ resolve3(response); + }); + raw2.once("end", () => { + if (!response) { + response = new Response2(body, responseOptions); +- resolve2(response); ++ resolve3(response); + } + }); + return; +@@ -42259,11 +42276,11 @@ async function fetch2(url, options_) { + } + }); + response = new Response2(body, responseOptions); +- resolve2(response); ++ resolve3(response); + return; + } + response = new Response2(body, responseOptions); +- resolve2(response); ++ resolve3(response); + }); + writeToStream(request_, request).catch(reject); + }); +@@ -42483,10 +42500,10 @@ var require_node_gyp_build = __commonJS({ + if (debug) + return debug; + } +- var prebuild = resolve2(dir); ++ var prebuild = resolve3(dir); + if (prebuild) + return prebuild; +- var nearby = resolve2(path4.dirname(process.execPath)); ++ var nearby = resolve3(path4.dirname(process.execPath)); + if (nearby) + return nearby; + var target = [ +@@ -42503,7 +42520,7 @@ var require_node_gyp_build = __commonJS({ + // eslint-disable-line + ].filter(Boolean).join(" "); + throw new Error("No native build was found for " + target + "\n loaded from: " + dir + "\n"); +- function resolve2(dir2) { ++ function resolve3(dir2) { + var tuples = readdirSync2(path4.join(dir2, "prebuilds")).map(parseTuple); + var tuple = tuples.filter(matchTuple(platform, arch)).sort(compareTuples)[0]; + if (!tuple) +@@ -48176,13 +48193,13 @@ var require_dist_cjs13 = __commonJS({ + ...data.default && { default: data.default } + } + ), "getConfigData"); +- var import_path8 = require("path"); ++ var import_path9 = require("path"); + var import_getHomeDir = require_getHomeDir(); + var ENV_CONFIG_PATH = "AWS_CONFIG_FILE"; +- var getConfigFilepath = /* @__PURE__ */ __name(() => process.env[ENV_CONFIG_PATH] || (0, import_path8.join)((0, import_getHomeDir.getHomeDir)(), ".aws", "config"), "getConfigFilepath"); ++ var getConfigFilepath = /* @__PURE__ */ __name(() => process.env[ENV_CONFIG_PATH] || (0, import_path9.join)((0, import_getHomeDir.getHomeDir)(), ".aws", "config"), "getConfigFilepath"); + var import_getHomeDir2 = require_getHomeDir(); + var ENV_CREDENTIALS_PATH = "AWS_SHARED_CREDENTIALS_FILE"; +- var getCredentialsFilepath = /* @__PURE__ */ __name(() => process.env[ENV_CREDENTIALS_PATH] || (0, import_path8.join)((0, import_getHomeDir2.getHomeDir)(), ".aws", "credentials"), "getCredentialsFilepath"); ++ var getCredentialsFilepath = /* @__PURE__ */ __name(() => process.env[ENV_CREDENTIALS_PATH] || (0, import_path9.join)((0, import_getHomeDir2.getHomeDir)(), ".aws", "credentials"), "getCredentialsFilepath"); + var prefixKeyRegex = /^([\w-]+)\s(["'])?([\w-@\+\.%:/]+)\2$/; + var profileNameBlockList = ["__proto__", "profile __proto__"]; + var parseIni = /* @__PURE__ */ __name((iniData) => { +@@ -49336,7 +49353,7 @@ var require_dist_cjs20 = __commonJS({ + this.refillTokenBucket(); + if (amount > this.currentCapacity) { + const delay = (amount - this.currentCapacity) / this.fillRate * 1e3; +- await new Promise((resolve2) => setTimeout(resolve2, delay)); ++ await new Promise((resolve3) => setTimeout(resolve3, delay)); + } + this.currentCapacity = this.currentCapacity - amount; + } +@@ -50304,18 +50321,18 @@ var require_dist_cjs28 = __commonJS({ + let hasError = false; + if (expect === "100-continue") { + await Promise.race([ +- new Promise((resolve2) => { +- timeoutId = Number(setTimeout(resolve2, Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs))); ++ new Promise((resolve3) => { ++ timeoutId = Number(setTimeout(resolve3, Math.max(MIN_WAIT_TIME, maxContinueTimeoutMs))); + }), +- new Promise((resolve2) => { ++ new Promise((resolve3) => { + httpRequest.on("continue", () => { + clearTimeout(timeoutId); +- resolve2(); ++ resolve3(); + }); + httpRequest.on("error", () => { + hasError = true; + clearTimeout(timeoutId); +- resolve2(); ++ resolve3(); + }); + }) + ]); +@@ -50351,13 +50368,13 @@ var require_dist_cjs28 = __commonJS({ + constructor(options) { + this.socketWarningTimestamp = 0; + this.metadata = { handlerProtocol: "http/1.1" }; +- this.configProvider = new Promise((resolve2, reject) => { ++ this.configProvider = new Promise((resolve3, reject) => { + if (typeof options === "function") { + options().then((_options) => { +- resolve2(this.resolveDefaultConfig(_options)); ++ resolve3(this.resolveDefaultConfig(_options)); + }).catch(reject); + } else { +- resolve2(this.resolveDefaultConfig(options)); ++ resolve3(this.resolveDefaultConfig(options)); + } + }); + } +@@ -50437,7 +50454,7 @@ var require_dist_cjs28 = __commonJS({ + let socketCheckTimeoutId; + return new Promise((_resolve, _reject) => { + let writeRequestBodyPromise = void 0; +- const resolve2 = /* @__PURE__ */ __name(async (arg) => { ++ const resolve3 = /* @__PURE__ */ __name(async (arg) => { + await writeRequestBodyPromise; + clearTimeout(socketCheckTimeoutId); + _resolve(arg); +@@ -50494,7 +50511,7 @@ var require_dist_cjs28 = __commonJS({ + headers: getTransformedHeaders(res.headers), + body: res + }); +- resolve2({ response: httpResponse }); ++ resolve3({ response: httpResponse }); + }); + req.on("error", (err2) => { + if (NODEJS_TIMEOUT_ERROR_CODES.includes(err2.code)) { +@@ -50671,13 +50688,13 @@ var require_dist_cjs28 = __commonJS({ + constructor(options) { + this.metadata = { handlerProtocol: "h2" }; + this.connectionManager = new NodeHttp2ConnectionManager({}); +- this.configProvider = new Promise((resolve2, reject) => { ++ this.configProvider = new Promise((resolve3, reject) => { + if (typeof options === "function") { + options().then((opts) => { +- resolve2(opts || {}); ++ resolve3(opts || {}); + }).catch(reject); + } else { +- resolve2(options || {}); ++ resolve3(options || {}); + } + }); + } +@@ -50707,7 +50724,7 @@ var require_dist_cjs28 = __commonJS({ + var _a; + let fulfilled = false; + let writeRequestBodyPromise = void 0; +- const resolve2 = /* @__PURE__ */ __name(async (arg) => { ++ const resolve3 = /* @__PURE__ */ __name(async (arg) => { + await writeRequestBodyPromise; + _resolve(arg); + }, "resolve"); +@@ -50763,7 +50780,7 @@ var require_dist_cjs28 = __commonJS({ + body: req + }); + fulfilled = true; +- resolve2({ response: httpResponse }); ++ resolve3({ response: httpResponse }); + if (disableConcurrentStreams) { + session.close(); + this.connectionManager.deleteSession(authority, session); +@@ -50846,7 +50863,7 @@ var require_dist_cjs28 = __commonJS({ + if (isReadableStreamInstance(stream)) { + return collectReadableStream(stream); + } +- return new Promise((resolve2, reject) => { ++ return new Promise((resolve3, reject) => { + const collector = new Collector(); + stream.pipe(collector); + stream.on("error", (err2) => { +@@ -50856,7 +50873,7 @@ var require_dist_cjs28 = __commonJS({ + collector.on("error", reject); + collector.on("finish", function() { + const bytes = new Uint8Array(Buffer.concat(this.bufferedBytes)); +- resolve2(bytes); ++ resolve3(bytes); + }); + }); + }, "streamCollector"); +@@ -50917,7 +50934,7 @@ var require_dist_cjs29 = __commonJS({ + var import_protocol_http = require_dist_cjs2(); + var import_querystring_builder = require_dist_cjs27(); + function requestTimeout(timeoutInMs = 0) { +- return new Promise((resolve2, reject) => { ++ return new Promise((resolve3, reject) => { + if (timeoutInMs) { + setTimeout(() => { + const timeoutError = new Error(`Request did not complete within ${timeoutInMs} ms`); +@@ -51026,7 +51043,7 @@ var require_dist_cjs29 = __commonJS({ + ]; + if (abortSignal) { + raceOfPromises.push( +- new Promise((resolve2, reject) => { ++ new Promise((resolve3, reject) => { + abortSignal.onabort = () => { + const abortError = new Error("Request aborted"); + abortError.name = "AbortError"; +@@ -51086,7 +51103,7 @@ var require_dist_cjs29 = __commonJS({ + } + __name(collectStream, "collectStream"); + function readToBase64(blob) { +- return new Promise((resolve2, reject) => { ++ return new Promise((resolve3, reject) => { + const reader = new FileReader(); + reader.onloadend = () => { + if (reader.readyState !== 2) { +@@ -51095,7 +51112,7 @@ var require_dist_cjs29 = __commonJS({ + const result = reader.result ?? ""; + const commaIndex = result.indexOf(","); + const dataOffset = commaIndex > -1 ? commaIndex + 1 : result.length; +- resolve2(result.substring(dataOffset)); ++ resolve3(result.substring(dataOffset)); + }; + reader.onabort = () => reject(new Error("Read aborted")); + reader.onerror = () => reject(reader.error); +@@ -52674,7 +52691,7 @@ var require_dist_cjs33 = __commonJS({ + const delayFromResponse = getDelayFromRetryAfterHeader(err2.$response); + const delay = Math.max(delayFromResponse || 0, delayFromDecider); + totalDelay += delay; +- await new Promise((resolve2) => setTimeout(resolve2, delay)); ++ await new Promise((resolve3) => setTimeout(resolve3, delay)); + continue; + } + if (!err2.$metadata) { +@@ -52842,7 +52859,7 @@ var require_dist_cjs33 = __commonJS({ + attempts = retryToken.getRetryCount(); + const delay = retryToken.getRetryDelay(); + totalRetryDelay += delay; +- await new Promise((resolve2) => setTimeout(resolve2, delay)); ++ await new Promise((resolve3) => setTimeout(resolve3, delay)); + } + } + } else { +@@ -53545,11 +53562,11 @@ function __metadata(metadataKey, metadataValue) { + } + function __awaiter(thisArg, _arguments, P, generator) { + function adopt(value) { +- return value instanceof P ? value : new P(function(resolve2) { +- resolve2(value); ++ return value instanceof P ? value : new P(function(resolve3) { ++ resolve3(value); + }); + } +- return new (P || (P = Promise))(function(resolve2, reject) { ++ return new (P || (P = Promise))(function(resolve3, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); +@@ -53565,7 +53582,7 @@ function __awaiter(thisArg, _arguments, P, generator) { + } + } + function step(result) { +- result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected); ++ result.done ? resolve3(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +@@ -53779,14 +53796,14 @@ function __asyncValues(o) { + }, i2); + function verb(n) { + i2[n] = o[n] && function(v) { +- return new Promise(function(resolve2, reject) { +- v = o[n](v), settle(resolve2, reject, v.done, v.value); ++ return new Promise(function(resolve3, reject) { ++ v = o[n](v), settle(resolve3, reject, v.done, v.value); + }); + }; + } +- function settle(resolve2, reject, d, v) { ++ function settle(resolve3, reject, d, v) { + Promise.resolve(v).then(function(v2) { +- resolve2({ value: v2, done: d }); ++ resolve3({ value: v2, done: d }); + }, reject); + } + } +@@ -56904,11 +56921,11 @@ function __metadata2(metadataKey, metadataValue) { + } + function __awaiter2(thisArg, _arguments, P, generator) { + function adopt(value) { +- return value instanceof P ? value : new P(function(resolve2) { +- resolve2(value); ++ return value instanceof P ? value : new P(function(resolve3) { ++ resolve3(value); + }); + } +- return new (P || (P = Promise))(function(resolve2, reject) { ++ return new (P || (P = Promise))(function(resolve3, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); +@@ -56924,7 +56941,7 @@ function __awaiter2(thisArg, _arguments, P, generator) { + } + } + function step(result) { +- result.done ? resolve2(result.value) : adopt(result.value).then(fulfilled, rejected); ++ result.done ? resolve3(result.value) : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +@@ -57130,14 +57147,14 @@ function __asyncValues2(o) { + }, i2); + function verb(n) { + i2[n] = o[n] && function(v) { +- return new Promise(function(resolve2, reject) { +- v = o[n](v), settle(resolve2, reject, v.done, v.value); ++ return new Promise(function(resolve3, reject) { ++ v = o[n](v), settle(resolve3, reject, v.done, v.value); + }); + }; + } +- function settle(resolve2, reject, d, v) { ++ function settle(resolve3, reject, d, v) { + Promise.resolve(v).then(function(v2) { +- resolve2({ value: v2, done: d }); ++ resolve3({ value: v2, done: d }); + }, reject); + } + } +@@ -57521,7 +57538,7 @@ var require_dist_cjs39 = __commonJS({ + var import_buffer2 = require("buffer"); + var import_http3 = require("http"); + function httpRequest(options) { +- return new Promise((resolve2, reject) => { ++ return new Promise((resolve3, reject) => { + var _a; + const req = (0, import_http3.request)({ + method: "GET", +@@ -57551,7 +57568,7 @@ var require_dist_cjs39 = __commonJS({ + chunks.push(chunk); + }); + res.on("end", () => { +- resolve2(import_buffer2.Buffer.concat(chunks)); ++ resolve3(import_buffer2.Buffer.concat(chunks)); + req.destroy(); + }); + }); +@@ -57983,7 +58000,7 @@ var require_retry_wrapper = __commonJS({ + try { + return await toRetry(); + } catch (e2) { +- await new Promise((resolve2) => setTimeout(resolve2, delayMs)); ++ await new Promise((resolve3) => setTimeout(resolve3, delayMs)); + } + } + return await toRetry(); +@@ -59352,9 +59369,9 @@ var require_dist_cjs46 = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0_@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/auth/httpAuthSchemeProvider.js ++// ../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/auth/httpAuthSchemeProvider.js + var require_httpAuthSchemeProvider3 = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0_@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/auth/httpAuthSchemeProvider.js"(exports2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/auth/httpAuthSchemeProvider.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.resolveHttpAuthSchemeConfig = exports2.defaultSSOOIDCHttpAuthSchemeProvider = exports2.defaultSSOOIDCHttpAuthSchemeParametersProvider = void 0; +@@ -59421,9 +59438,9 @@ var require_httpAuthSchemeProvider3 = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0_@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sso-oidc/package.json ++// ../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sso-oidc/package.json + var require_package4 = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0_@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sso-oidc/package.json"(exports2, module2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sso-oidc/package.json"(exports2, module2) { + module2.exports = { + name: "@aws-sdk/client-sso-oidc", + description: "AWS SDK for JavaScript Sso Oidc Client for Node.js, Browser and React Native", +@@ -59527,9 +59544,9 @@ var require_package4 = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0_@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/endpoint/ruleset.js ++// ../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/endpoint/ruleset.js + var require_ruleset2 = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0_@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/endpoint/ruleset.js"(exports2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/endpoint/ruleset.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ruleSet = void 0; +@@ -59562,9 +59579,9 @@ var require_ruleset2 = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0_@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/endpoint/endpointResolver.js ++// ../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/endpoint/endpointResolver.js + var require_endpointResolver2 = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0_@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/endpoint/endpointResolver.js"(exports2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/endpoint/endpointResolver.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.defaultEndpointResolver = void 0; +@@ -59582,9 +59599,9 @@ var require_endpointResolver2 = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0_@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/runtimeConfig.shared.js ++// ../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/runtimeConfig.shared.js + var require_runtimeConfig_shared2 = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0_@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/runtimeConfig.shared.js"(exports2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/runtimeConfig.shared.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getRuntimeConfig = void 0; +@@ -59628,9 +59645,9 @@ var require_runtimeConfig_shared2 = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0_@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/runtimeConfig.js ++// ../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/runtimeConfig.js + var require_runtimeConfig2 = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0_@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/runtimeConfig.js"(exports2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/runtimeConfig.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getRuntimeConfig = void 0; +@@ -59681,9 +59698,9 @@ var require_runtimeConfig2 = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0_@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/index.js ++// ../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/index.js + var require_dist_cjs47 = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0_@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/index.js"(exports2, module2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sso-oidc/dist-cjs/index.js"(exports2, module2) { + "use strict"; + var __defProp3 = Object.defineProperty; + var __getOwnPropDesc3 = Object.getOwnPropertyDescriptor; +@@ -61029,9 +61046,9 @@ Reference: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.ht + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/auth/httpAuthSchemeProvider.js ++// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/auth/httpAuthSchemeProvider.js + var require_httpAuthSchemeProvider4 = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/auth/httpAuthSchemeProvider.js"(exports2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/auth/httpAuthSchemeProvider.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.resolveHttpAuthSchemeConfig = exports2.resolveStsAuthConfig = exports2.defaultSTSHttpAuthSchemeProvider = exports2.defaultSTSHttpAuthSchemeParametersProvider = void 0; +@@ -61101,9 +61118,9 @@ var require_httpAuthSchemeProvider4 = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/EndpointParameters.js ++// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/EndpointParameters.js + var require_EndpointParameters = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/EndpointParameters.js"(exports2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/EndpointParameters.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.commonParams = exports2.resolveClientEndpointParameters = void 0; +@@ -61127,9 +61144,9 @@ var require_EndpointParameters = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/package.json ++// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/package.json + var require_package5 = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/package.json"(exports2, module2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/package.json"(exports2, module2) { + module2.exports = { + name: "@aws-sdk/client-sts", + description: "AWS SDK for JavaScript Sts Client for Node.js, Browser and React Native", +@@ -61235,9 +61252,9 @@ var require_package5 = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/ruleset.js ++// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/ruleset.js + var require_ruleset3 = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/ruleset.js"(exports2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/ruleset.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.ruleSet = void 0; +@@ -61282,9 +61299,9 @@ var require_ruleset3 = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/endpointResolver.js ++// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/endpointResolver.js + var require_endpointResolver3 = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/endpointResolver.js"(exports2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/endpoint/endpointResolver.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.defaultEndpointResolver = void 0; +@@ -61302,9 +61319,9 @@ var require_endpointResolver3 = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/runtimeConfig.shared.js ++// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/runtimeConfig.shared.js + var require_runtimeConfig_shared3 = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/runtimeConfig.shared.js"(exports2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/runtimeConfig.shared.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getRuntimeConfig = void 0; +@@ -61348,9 +61365,9 @@ var require_runtimeConfig_shared3 = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/runtimeConfig.js ++// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/runtimeConfig.js + var require_runtimeConfig3 = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/runtimeConfig.js"(exports2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/runtimeConfig.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.getRuntimeConfig = void 0; +@@ -61414,9 +61431,9 @@ var require_runtimeConfig3 = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/auth/httpAuthExtensionConfiguration.js ++// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/auth/httpAuthExtensionConfiguration.js + var require_httpAuthExtensionConfiguration = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/auth/httpAuthExtensionConfiguration.js"(exports2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/auth/httpAuthExtensionConfiguration.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.resolveHttpAuthRuntimeConfig = exports2.getHttpAuthExtensionConfiguration = void 0; +@@ -61462,9 +61479,9 @@ var require_httpAuthExtensionConfiguration = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/runtimeExtensions.js ++// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/runtimeExtensions.js + var require_runtimeExtensions = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/runtimeExtensions.js"(exports2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/runtimeExtensions.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.resolveRuntimeExtensions = void 0; +@@ -61493,9 +61510,9 @@ var require_runtimeExtensions = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/STSClient.js ++// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/STSClient.js + var require_STSClient = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/STSClient.js"(exports2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/STSClient.js"(exports2) { + "use strict"; + Object.defineProperty(exports2, "__esModule", { value: true }); + exports2.STSClient = exports2.__Client = void 0; +@@ -61557,9 +61574,9 @@ var require_STSClient = __commonJS({ + } + }); + +-// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/index.js ++// ../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/index.js + var require_dist_cjs50 = __commonJS({ +- "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/index.js"(exports2, module2) { ++ "../node_modules/.pnpm/@aws-sdk+client-sts@3.583.0_@aws-sdk+client-sso-oidc@3.583.0/node_modules/@aws-sdk/client-sts/dist-cjs/index.js"(exports2, module2) { + "use strict"; + var __defProp3 = Object.defineProperty; + var __getOwnPropDesc3 = Object.getOwnPropertyDescriptor; +@@ -72545,14 +72562,14 @@ var require_event = __commonJS({ + this._done = false; + let futReject = null; + let futResolve = null; +- this._promise = new Promise((resolve2, reject) => { ++ this._promise = new Promise((resolve3, reject) => { + futReject = (reason) => { + this._done = true; + reject(reason); + }; + futResolve = (value) => { + this._done = true; +- resolve2(value); ++ resolve3(value); + }; + }); + if (!futReject || !futResolve) { +@@ -72583,8 +72600,8 @@ var require_queues = __commonJS({ + this._promises = []; + } + _add() { +- this._promises.push(new Promise((resolve2, reject) => { +- this._resolvers.push(resolve2); ++ this._promises.push(new Promise((resolve3, reject) => { ++ this._resolvers.push(resolve3); + this._rejecters.push(reject); + })); + } +@@ -72592,12 +72609,12 @@ var require_queues = __commonJS({ + if (!this._resolvers.length) { + this._add(); + } +- const resolve2 = this._resolvers.shift(); ++ const resolve3 = this._resolvers.shift(); + this._rejecters.shift(); +- if (!resolve2) { ++ if (!resolve3) { + throw new errors_1.InternalClientError("resolve function was null or undefined when attempting to push."); + } +- resolve2(item); ++ resolve3(item); + } + get() { + if (!this._promises.length) { +@@ -73644,10 +73661,10 @@ var require_systemUtils = __commonJS({ + input: node_process_1.default.stdin, + output + }); +- return new Promise((resolve2) => { ++ return new Promise((resolve3) => { + rl.question(message, (val2) => { + rl.close(); +- resolve2(val2); ++ resolve3(val2); + }); + silent = true; + }); +@@ -82010,18 +82027,17 @@ var init_push = __esm({ + (0, import_hanji13.render)(` + [${source_default.blue("i")}] No changes detected`); + } else { +- if (!("driver" in credentials2)) { +- await db.run("begin"); +- try { +- for (const dStmnt of statementsToExecute) { +- await db.run(dStmnt); +- } +- await db.run("commit"); +- } catch (e2) { +- console.error(e2); +- await db.run("rollback"); +- process.exit(1); ++ const isNotD1 = !("driver" in credentials2 && credentials2.driver === "d1-http"); ++ isNotD1 ?? await db.run("begin"); ++ try { ++ for (const dStmnt of statementsToExecute) { ++ await db.run(dStmnt); + } ++ isNotD1 ?? await db.run("commit"); ++ } catch (e2) { ++ console.error(e2); ++ isNotD1 ?? await db.run("rollback"); ++ process.exit(1); + } + (0, import_hanji13.render)(`[${source_default.green("\u2713")}] Changes applied`); + } +@@ -85654,7 +85670,7 @@ __export(introspect_exports, { + introspectSqlite: () => introspectSqlite, + relationsToTypeScript: () => relationsToTypeScript + }); +-var import_fs11, import_hanji14, import_path7, import_pluralize, introspectPostgres, introspectGel, introspectMysql, introspectSingleStore, introspectSqlite, introspectLibSQL, withCasing4, relationsToTypeScript; ++var import_fs11, import_hanji14, import_path8, import_pluralize, introspectPostgres, introspectGel, introspectMysql, introspectSingleStore, introspectSqlite, introspectLibSQL, withCasing4, relationsToTypeScript; + var init_introspect = __esm({ + "src/cli/commands/introspect.ts"() { + "use strict"; +@@ -85662,7 +85678,7 @@ var init_introspect = __esm({ + import_fs11 = require("fs"); + import_hanji14 = __toESM(require_hanji()); + init_mjs(); +- import_path7 = require("path"); ++ import_path8 = require("path"); + import_pluralize = __toESM(require_pluralize()); + init_singlestoreSchema(); + init_global(); +@@ -85725,9 +85741,9 @@ var init_introspect = __esm({ + const ts = schemaToTypeScript4(schema6, casing2); + const relationsTs = relationsToTypeScript(schema6, casing2); + const { internal, ...schemaWithoutInternals } = schema6; +- const schemaFile = (0, import_path7.join)(out, "schema.ts"); ++ const schemaFile = (0, import_path8.join)(out, "schema.ts"); + (0, import_fs11.writeFileSync)(schemaFile, ts.file); +- const relationsFile = (0, import_path7.join)(out, "relations.ts"); ++ const relationsFile = (0, import_path8.join)(out, "relations.ts"); + (0, import_fs11.writeFileSync)(relationsFile, relationsTs.file); + console.log(); + const { snapshots, journal } = prepareOutFolder(out, "postgresql"); +@@ -85820,9 +85836,9 @@ var init_introspect = __esm({ + const ts = schemaToTypeScript2(schema6, casing2); + const relationsTs = relationsToTypeScript(schema6, casing2); + const { internal, ...schemaWithoutInternals } = schema6; +- const schemaFile = (0, import_path7.join)(out, "schema.ts"); ++ const schemaFile = (0, import_path8.join)(out, "schema.ts"); + (0, import_fs11.writeFileSync)(schemaFile, ts.file); +- const relationsFile = (0, import_path7.join)(out, "relations.ts"); ++ const relationsFile = (0, import_path8.join)(out, "relations.ts"); + (0, import_fs11.writeFileSync)(relationsFile, relationsTs.file); + console.log(); + (0, import_hanji14.render)( +@@ -85875,9 +85891,9 @@ var init_introspect = __esm({ + const ts = schemaToTypeScript3(schema6, casing2); + const relationsTs = relationsToTypeScript(schema6, casing2); + const { internal, ...schemaWithoutInternals } = schema6; +- const schemaFile = (0, import_path7.join)(out, "schema.ts"); ++ const schemaFile = (0, import_path8.join)(out, "schema.ts"); + (0, import_fs11.writeFileSync)(schemaFile, ts.file); +- const relationsFile = (0, import_path7.join)(out, "relations.ts"); ++ const relationsFile = (0, import_path8.join)(out, "relations.ts"); + (0, import_fs11.writeFileSync)(relationsFile, relationsTs.file); + console.log(); + const { snapshots, journal } = prepareOutFolder(out, "mysql"); +@@ -85957,7 +85973,7 @@ var init_introspect = __esm({ + const schema6 = { id: originUUID, prevId: "", ...res }; + const ts = schemaToTypeScript5(schema6, casing2); + const { internal, ...schemaWithoutInternals } = schema6; +- const schemaFile = (0, import_path7.join)(out, "schema.ts"); ++ const schemaFile = (0, import_path8.join)(out, "schema.ts"); + (0, import_fs11.writeFileSync)(schemaFile, ts.file); + console.log(); + const { snapshots, journal } = prepareOutFolder(out, "postgresql"); +@@ -86030,9 +86046,9 @@ var init_introspect = __esm({ + const schema6 = { id: originUUID, prevId: "", ...res }; + const ts = schemaToTypeScript(schema6, casing2); + const relationsTs = relationsToTypeScript(schema6, casing2); +- const schemaFile = (0, import_path7.join)(out, "schema.ts"); ++ const schemaFile = (0, import_path8.join)(out, "schema.ts"); + (0, import_fs11.writeFileSync)(schemaFile, ts.file); +- const relationsFile = (0, import_path7.join)(out, "relations.ts"); ++ const relationsFile = (0, import_path8.join)(out, "relations.ts"); + (0, import_fs11.writeFileSync)(relationsFile, relationsTs.file); + console.log(); + const { snapshots, journal } = prepareOutFolder(out, "sqlite"); +@@ -86112,9 +86128,9 @@ var init_introspect = __esm({ + const schema6 = { id: originUUID, prevId: "", ...res }; + const ts = schemaToTypeScript(schema6, casing2); + const relationsTs = relationsToTypeScript(schema6, casing2); +- const schemaFile = (0, import_path7.join)(out, "schema.ts"); ++ const schemaFile = (0, import_path8.join)(out, "schema.ts"); + (0, import_fs11.writeFileSync)(schemaFile, ts.file); +- const relationsFile = (0, import_path7.join)(out, "relations.ts"); ++ const relationsFile = (0, import_path8.join)(out, "relations.ts"); + (0, import_fs11.writeFileSync)(relationsFile, relationsTs.file); + console.log(); + const { snapshots, journal } = prepareOutFolder(out, "sqlite"); +@@ -90144,9 +90160,9 @@ var require_clone = __commonJS2({ + } else if (_instanceof(parent2, nativeSet)) { + child = new nativeSet(); + } else if (_instanceof(parent2, nativePromise)) { +- child = new nativePromise(function(resolve2, reject) { ++ child = new nativePromise(function(resolve3, reject) { + parent2.then(function(value) { +- resolve2(_clone(value, depth2 - 1)); ++ resolve3(_clone(value, depth2 - 1)); + }, function(err2) { + reject(_clone(err2, depth2 - 1)); + }); +@@ -91610,9 +91626,9 @@ var import_promises = require("fs/promises"); + var import_node_child_process = require("node:child_process"); + var import_path2 = require("path"); + function runCommand(command, options = {}) { +- return new Promise((resolve2) => { ++ return new Promise((resolve3) => { + (0, import_node_child_process.exec)(command, options, (error2) => { +- return resolve2({ exitCode: (error2 == null ? void 0 : error2.code) ?? 0 }); ++ return resolve3({ exitCode: (error2 == null ? void 0 : error2.code) ?? 0 }); + }); + }); + } +@@ -91681,14 +91697,14 @@ init_source(); + var import_fs7 = require("fs"); + var import_fs8 = __toESM(require("fs")); + var import_hanji4 = __toESM(require_hanji()); +-var import_path6 = require("path"); ++var import_path7 = require("path"); + init_views(); + init_migrate(); + var dropMigration = async ({ + out, + bundle + }) => { +- const metaFilePath = (0, import_path6.join)(out, "meta", "_journal.json"); ++ const metaFilePath = (0, import_path7.join)(out, "meta", "_journal.json"); + const journal = JSON.parse((0, import_fs7.readFileSync)(metaFilePath, "utf-8")); + if (journal.entries.length === 0) { + console.log( +@@ -91704,8 +91720,8 @@ var dropMigration = async ({ + ...journal, + entries: journal.entries.filter(Boolean) + }; +- const sqlFilePath = (0, import_path6.join)(out, `${result.data.tag}.sql`); +- const snapshotFilePath = (0, import_path6.join)( ++ const sqlFilePath = (0, import_path7.join)(out, `${result.data.tag}.sql`); ++ const snapshotFilePath = (0, import_path7.join)( + out, + "meta", + `${result.data.tag.split("_")[0]}_snapshot.json` +@@ -91715,7 +91731,7 @@ var dropMigration = async ({ + (0, import_fs7.writeFileSync)(metaFilePath, JSON.stringify(resultJournal, null, 2)); + if (bundle) { + import_fs8.default.writeFileSync( +- (0, import_path6.join)(out, `migrations.js`), ++ (0, import_path7.join)(out, `migrations.js`), + embeddedMigrations(resultJournal) + ); + } +diff --git a/utils.js b/utils.js +index 7138fccccb595df131ddb9ad36deb33dc8717b63..26110c69c876779641eaa582e4fa722fb2f18361 100644 +--- a/utils.js ++++ b/utils.js +@@ -6211,7 +6211,14 @@ var kloudMeta = () => { + sqlite: [] + }; + }; ++var mkdirSQLiteUrl = (it) => { ++ if (it.startsWith("file:")) { ++ it = it.substring(5); ++ } ++ (0, import_fs.mkdirSync)((0, import_path.dirname)(it), { recursive: true }); ++}; + var normaliseSQLiteUrl = (it, type) => { ++ mkdirSQLiteUrl(it); + if (type === "libsql") { + if (it.startsWith("file:")) { + return it; +diff --git a/utils.mjs b/utils.mjs +index 8551a871b73287ffb7640536eb803e416f73d8fc..0415dec8ab1c944507534c2681c3339e8e553d0e 100644 +--- a/utils.mjs ++++ b/utils.mjs +@@ -1053,7 +1053,7 @@ var source_default = chalk; + + // src/utils.ts + import { existsSync, mkdirSync, readdirSync, readFileSync, writeFileSync } from "fs"; +-import { join } from "path"; ++import { dirname, join } from "path"; + import { parse } from "url"; + + // src/cli/views.ts +@@ -6188,7 +6188,14 @@ var kloudMeta = () => { + sqlite: [] + }; + }; ++var mkdirSQLiteUrl = (it) => { ++ if (it.startsWith("file:")) { ++ it = it.substring(5); ++ } ++ mkdirSync(dirname(it), { recursive: true }); ++}; + var normaliseSQLiteUrl = (it, type) => { ++ mkdirSQLiteUrl(it); + if (type === "libsql") { + if (it.startsWith("file:")) { + return it; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 877d44e4e..baf9ca6b9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,11 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +patchedDependencies: + drizzle-kit: + hash: 8840807a95176f3fce5def1375b3ba14ed7b7bbb70f4aed75a07dcdb25b92df9 + path: patches/drizzle-kit.patch + importers: .: @@ -23,12 +28,18 @@ importers: '@ipld/dag-json': specifier: ^10.2.3 version: 10.2.3 + '@libsql/client': + specifier: ^0.15.0 + version: 0.15.0 cborg: specifier: ^4.2.9 version: 4.2.9 charwise: specifier: ^3.0.1 version: 3.0.1 + drizzle-orm: + specifier: ^0.40.1 + version: 0.40.1(@libsql/client@0.15.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.9.1)(gel@2.0.1) esbuild-plugin-replace: specifier: ^1.4.0 version: 1.4.0 @@ -62,6 +73,9 @@ importers: ws: specifier: ^8.18.1 version: 8.18.1 + zod: + specifier: ^3.24.2 + version: 3.24.2 devDependencies: '@eslint/js': specifier: ^9.23.0 @@ -95,7 +109,7 @@ importers: version: 8.27.0(typescript@5.8.2) '@vitest/browser': specifier: ^3.0.9 - version: 3.0.9(@types/node@22.10.5)(playwright@1.51.1)(typescript@5.8.2)(vite@6.0.7(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0))(vitest@3.0.9)(webdriverio@9.11.0) + version: 3.0.9(@types/node@22.10.5)(playwright@1.51.1)(typescript@5.8.2)(vite@6.2.2(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0))(vitest@3.0.9)(webdriverio@9.11.0) '@vitest/coverage-v8': specifier: ^3.0.9 version: 3.0.9(@vitest/browser@3.0.9)(vitest@3.0.9) @@ -108,6 +122,9 @@ importers: better-sqlite3: specifier: ^11.9.1 version: 11.9.1 + drizzle-kit: + specifier: ^0.30.5 + version: 0.30.5(patch_hash=8840807a95176f3fce5def1375b3ba14ed7b7bbb70f4aed75a07dcdb25b92df9) esbuild: specifier: ^0.24.2 version: 0.24.2 @@ -137,7 +154,7 @@ importers: version: 7.7.1 tsup: specifier: ^8.4.0 - version: 8.4.0(postcss@8.4.49)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0) + version: 8.4.0(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0) tsx: specifier: ^4.19.3 version: 4.19.3 @@ -155,7 +172,7 @@ importers: version: 1.0.2 vite-tsconfig-paths: specifier: ^5.1.4 - version: 5.1.4(typescript@5.8.2)(vite@6.0.7(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0)) + version: 5.1.4(typescript@5.8.2)(vite@6.2.2(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0)) vitest: specifier: ^3.0.9 version: 3.0.9(@types/node@22.10.5)(@vitest/browser@3.0.9)(@vitest/ui@3.0.9)(happy-dom@14.12.3)(msw@2.7.3(@types/node@22.10.5)(typescript@5.8.2))(tsx@4.19.3)(yaml@2.7.0) @@ -219,6 +236,9 @@ packages: '@bundled-es-modules/tough-cookie@0.1.6': resolution: {integrity: sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw==} + '@drizzle-team/brocli@0.10.2': + resolution: {integrity: sha512-z33Il7l5dKjUgGULTqBsQBQwckHh5AbIuxhdsIxDDiZAzBOrZO6q9ogcWC65kU382AfynTfgNumVcNIjuIua6w==} + '@emnapi/core@1.3.1': resolution: {integrity: sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==} @@ -228,6 +248,20 @@ packages: '@emnapi/wasi-threads@1.0.1': resolution: {integrity: sha512-iIBu7mwkq4UQGeMEM8bLwNK962nXdhodeScX4slfQnRhEMMzvYivHhutCIk8uojvmASXXPC2WNEjwxFWk72Oqw==} + '@esbuild-kit/core-utils@3.3.2': + resolution: {integrity: sha512-sPRAnw9CdSsRmEtnsl2WXWdyquogVpB3yZ3dgwJfe8zrOzTsV7cJvmwrKVa+0ma5BoiGJ+BoqkMvawbayKUsqQ==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild-kit/esm-loader@2.6.5': + resolution: {integrity: sha512-FxEMIkJKnodyA1OaCUoEvbYRkoZlLZ4d/eXFu9Fh8CbBBgP5EmZxrfTRyN0qpXZ4vOvqnE5YdRdcrmUUXuU+dA==} + deprecated: 'Merged into tsx: https://tsx.is' + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/aix-ppc64@0.24.2': resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} @@ -246,6 +280,18 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/android-arm64@0.18.20': + resolution: {integrity: sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm64@0.24.2': resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} engines: {node: '>=18'} @@ -264,6 +310,18 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm@0.18.20': + resolution: {integrity: sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-arm@0.24.2': resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} engines: {node: '>=18'} @@ -282,6 +340,18 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-x64@0.18.20': + resolution: {integrity: sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/android-x64@0.24.2': resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} engines: {node: '>=18'} @@ -300,6 +370,18 @@ packages: cpu: [x64] os: [android] + '@esbuild/darwin-arm64@0.18.20': + resolution: {integrity: sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-arm64@0.24.2': resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} engines: {node: '>=18'} @@ -318,6 +400,18 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-x64@0.18.20': + resolution: {integrity: sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/darwin-x64@0.24.2': resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} @@ -336,6 +430,18 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/freebsd-arm64@0.18.20': + resolution: {integrity: sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-arm64@0.24.2': resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} @@ -354,6 +460,18 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-x64@0.18.20': + resolution: {integrity: sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/freebsd-x64@0.24.2': resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} @@ -372,6 +490,18 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/linux-arm64@0.18.20': + resolution: {integrity: sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm64@0.24.2': resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} @@ -390,6 +520,18 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm@0.18.20': + resolution: {integrity: sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-arm@0.24.2': resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} @@ -408,6 +550,18 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-ia32@0.18.20': + resolution: {integrity: sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-ia32@0.24.2': resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} @@ -426,6 +580,18 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-loong64@0.18.20': + resolution: {integrity: sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-loong64@0.24.2': resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} @@ -444,6 +610,18 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-mips64el@0.18.20': + resolution: {integrity: sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-mips64el@0.24.2': resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} @@ -462,6 +640,18 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-ppc64@0.18.20': + resolution: {integrity: sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-ppc64@0.24.2': resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} @@ -480,6 +670,18 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-riscv64@0.18.20': + resolution: {integrity: sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-riscv64@0.24.2': resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} @@ -498,6 +700,18 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-s390x@0.18.20': + resolution: {integrity: sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-s390x@0.24.2': resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} @@ -516,6 +730,18 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-x64@0.18.20': + resolution: {integrity: sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/linux-x64@0.24.2': resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} @@ -552,6 +778,18 @@ packages: cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-x64@0.18.20': + resolution: {integrity: sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/netbsd-x64@0.24.2': resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} @@ -588,6 +826,18 @@ packages: cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-x64@0.18.20': + resolution: {integrity: sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/openbsd-x64@0.24.2': resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} @@ -606,6 +856,18 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/sunos-x64@0.18.20': + resolution: {integrity: sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/sunos-x64@0.24.2': resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} @@ -624,6 +886,18 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/win32-arm64@0.18.20': + resolution: {integrity: sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-arm64@0.24.2': resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} @@ -642,6 +916,18 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-ia32@0.18.20': + resolution: {integrity: sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-ia32@0.24.2': resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} @@ -660,6 +946,18 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-x64@0.18.20': + resolution: {integrity: sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@esbuild/win32-x64@0.24.2': resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} @@ -822,6 +1120,57 @@ packages: '@jridgewell/trace-mapping@0.3.25': resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + '@libsql/client@0.15.0': + resolution: {integrity: sha512-AkJg9mxnAVCtHAVndZ8YwxqG43nSYVNZHAEX55MZ0R06rBcCoYLwjAr8grxC02/tNZpf4KMJj+BVPqNnQOD8ZQ==} + + '@libsql/core@0.15.0': + resolution: {integrity: sha512-8SReMzkCPmqoDl1tkAa9FCmoxDmiiuDM2eM8cTlKnMD6xG2jUczvckYM/x7VCWy0O9zu0LR/u7sEYEd2CPPTJA==} + + '@libsql/darwin-arm64@0.5.1': + resolution: {integrity: sha512-ETWRV8+h2l1P4/BB+ct1yWoBJMokUfCLe8W7TEbGo/9mAqk4NWkacVlAJgRdVIFQsA+3/vrQF7LyaIQOSEELTg==} + cpu: [arm64] + os: [darwin] + + '@libsql/darwin-x64@0.5.1': + resolution: {integrity: sha512-zB1Sid7vTBt/PiiLyQmw9AXZZv3MziNRx/rJ6xc/HTUYG7c2QHwOMikVuad1Lafvvf3OyGYSAPHKg9hdvNFP9A==} + cpu: [x64] + os: [darwin] + + '@libsql/hrana-client@0.7.0': + resolution: {integrity: sha512-OF8fFQSkbL7vJY9rfuegK1R7sPgQ6kFMkDamiEccNUvieQ+3urzfDFI616oPl8V7T9zRmnTkSjMOImYCAVRVuw==} + + '@libsql/isomorphic-fetch@0.3.1': + resolution: {integrity: sha512-6kK3SUK5Uu56zPq/Las620n5aS9xJq+jMBcNSOmjhNf/MUvdyji4vrMTqD7ptY7/4/CAVEAYDeotUz60LNQHtw==} + engines: {node: '>=18.0.0'} + + '@libsql/isomorphic-ws@0.1.5': + resolution: {integrity: sha512-DtLWIH29onUYR00i0GlQ3UdcTRC6EP4u9w/h9LxpUZJWRMARk6dQwZ6Jkd+QdwVpuAOrdxt18v0K2uIYR3fwFg==} + + '@libsql/linux-arm64-gnu@0.5.1': + resolution: {integrity: sha512-RbDc3fcRH5gjg2UUsMTPncSMCqTZ6re59t4jhNFpaLb3n2raD8S3XfvMq9LFqirzK+JDKHhxRPTow0E+QLaLJQ==} + cpu: [arm64] + os: [linux] + + '@libsql/linux-arm64-musl@0.5.1': + resolution: {integrity: sha512-JwK6Ne8dmtt+D+0zESwKvrjnylSDHNN7Mt9gb+TbWZZVvmro8n/ApvRVJh8ZO3R7dH32rUJoc2cQmKD6B691sA==} + cpu: [arm64] + os: [linux] + + '@libsql/linux-x64-gnu@0.5.1': + resolution: {integrity: sha512-9U1yo0H8OaxGsVPQFDm/SrQjhyMFUHinmfPOwQcLjcnWwv1GqfNdYlGnp2ZfdJr2QOx7k5klouJjJgy8KzhY4g==} + cpu: [x64] + os: [linux] + + '@libsql/linux-x64-musl@0.5.1': + resolution: {integrity: sha512-2TEX6SJqi88wPbv1ZHiTHtqaWOf+Mj7L8jOSgQY/aMoPzV5VFtDFF68ApIUNR6L+4eMwlD28NpahwJf8ilWYIw==} + cpu: [x64] + os: [linux] + + '@libsql/win32-x64-msvc@0.5.1': + resolution: {integrity: sha512-rOtBBJhLuCeSgXBWIRNTLADdSLfwsII6za/ci5+XJKSiSi0STO4bcGEfVKLEJ6HDqdCJ2zdH1WGc9rTwhsUB0g==} + cpu: [x64] + os: [win32] + '@mswjs/interceptors@0.37.3': resolution: {integrity: sha512-USvgCL/uOGFtVa6SVyRrC8kIAedzRohxIXN5LISlg5C5vLZCn7dgMFVSNhSF9cuBEFrm/O2spDWEZeMnw4ZXYg==} engines: {node: '>=18'} @@ -829,6 +1178,9 @@ packages: '@napi-rs/wasm-runtime@0.2.7': resolution: {integrity: sha512-5yximcFK5FNompXfJFoWanu5l8v1hNGqNHh9du1xETp9HWk/B/PzvchX55WYOPaIeNglG8++68AAiauBAtbnzw==} + '@neon-rs/load@0.0.4': + resolution: {integrity: sha512-kTPhdZyTQxB+2wpiRcFWrDcejc4JI6tkPuS7UZCG4l6Zvc5kU/gGQ/ozvHTh1XR5tS+UlfAfGuPajjzQjCiHCw==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -850,6 +1202,9 @@ packages: '@open-draft/until@2.1.0': resolution: {integrity: sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==} + '@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'} @@ -1436,6 +1791,9 @@ packages: resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} engines: {node: '>=8.0.0'} + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + buffer@5.7.1: resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} @@ -1660,6 +2018,10 @@ packages: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} + detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} engines: {node: '>=8'} @@ -1684,6 +2046,99 @@ packages: domutils@3.2.2: resolution: {integrity: sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw==} + drizzle-kit@0.30.5: + resolution: {integrity: sha512-l6dMSE100u7sDaTbLczibrQZjA35jLsHNqIV+jmhNVO3O8jzM6kywMOmV9uOz9ZVSCMPQhAZEFjL/qDPVrqpUA==} + hasBin: true + + drizzle-orm@0.40.1: + resolution: {integrity: sha512-aPNhtiJiPfm3qxz1czrnIDkfvkSdKGXYeZkpG55NPTVI186LmK2fBLMi4dsHpPHlJrZeQ92D322YFPHADBALew==} + peerDependencies: + '@aws-sdk/client-rds-data': '>=3' + '@cloudflare/workers-types': '>=4' + '@electric-sql/pglite': '>=0.2.0' + '@libsql/client': '>=0.10.0' + '@libsql/client-wasm': '>=0.10.0' + '@neondatabase/serverless': '>=0.10.0' + '@op-engineering/op-sqlite': '>=2' + '@opentelemetry/api': ^1.4.1 + '@planetscale/database': '>=1' + '@prisma/client': '*' + '@tidbcloud/serverless': '*' + '@types/better-sqlite3': '*' + '@types/pg': '*' + '@types/sql.js': '*' + '@vercel/postgres': '>=0.8.0' + '@xata.io/client': '*' + better-sqlite3: '>=7' + bun-types: '*' + expo-sqlite: '>=14.0.0' + gel: '>=2' + knex: '*' + kysely: '*' + mysql2: '>=2' + pg: '>=8' + postgres: '>=3' + prisma: '*' + sql.js: '>=1' + sqlite3: '>=5' + peerDependenciesMeta: + '@aws-sdk/client-rds-data': + optional: true + '@cloudflare/workers-types': + optional: true + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + '@libsql/client-wasm': + optional: true + '@neondatabase/serverless': + optional: true + '@op-engineering/op-sqlite': + optional: true + '@opentelemetry/api': + optional: true + '@planetscale/database': + optional: true + '@prisma/client': + optional: true + '@tidbcloud/serverless': + optional: true + '@types/better-sqlite3': + optional: true + '@types/pg': + optional: true + '@types/sql.js': + optional: true + '@vercel/postgres': + optional: true + '@xata.io/client': + optional: true + better-sqlite3: + optional: true + bun-types: + optional: true + expo-sqlite: + optional: true + gel: + optional: true + knex: + optional: true + kysely: + optional: true + mysql2: + optional: true + pg: + optional: true + postgres: + optional: true + prisma: + optional: true + sql.js: + optional: true + sqlite3: + optional: true + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -1716,6 +2171,10 @@ packages: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + es-abstract@1.23.9: resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==} engines: {node: '>= 0.4'} @@ -1749,6 +2208,21 @@ packages: esbuild-plugin-replace@1.4.0: resolution: {integrity: sha512-lP3ZAyzyRa5JXoOd59lJbRKNObtK8pJ/RO7o6vdjwLi71GfbL32NR22ZuS7/cLZkr10/L1lutoLma8E4DLngYg==} + esbuild-register@3.6.0: + resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==} + peerDependencies: + esbuild: '>=0.12 <1' + + esbuild@0.18.20: + resolution: {integrity: sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + esbuild@0.24.2: resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} @@ -2006,6 +2480,11 @@ packages: engines: {node: '>=18.0.0'} hasBin: true + gel@2.0.1: + resolution: {integrity: sha512-gfem3IGvqKqXwEq7XseBogyaRwGsQGuE7Cw/yQsjLGdgiyqX92G1xENPCE0ltunPGcsJIa6XBOTx/PK169mOqw==} + engines: {node: '>= 18.0.0'} + hasBin: true + get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -2338,6 +2817,9 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + js-base64@3.7.7: + resolution: {integrity: sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==} + js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -2375,6 +2857,10 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} + libsql@0.5.1: + resolution: {integrity: sha512-ePnm5zj6T//GKiTY/v5b0a272NX73hqdRORmD8gzz1nUui9051dtTt6t0XCrIqxwJAHSmQiZcfAx3YSASn9Y+A==} + os: [darwin, linux, win32] + lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} @@ -2526,8 +3012,8 @@ packages: mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -2733,8 +3219,8 @@ packages: yaml: optional: true - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + postcss@8.5.3: + resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==} engines: {node: ^10 || ^12 || >=14} prebuild-install@7.1.3: @@ -2769,6 +3255,9 @@ packages: prolly-trees@1.0.4: resolution: {integrity: sha512-vtnxfw5wnUHbGa0IIIk9B9DRztJWZw+t9d0s0iGxY/VzEGCg2EMl8GgGU3EhSquFLWapwbGjFTL1ipbezaXR3g==} + promise-limit@2.7.0: + resolution: {integrity: sha512-7nJ6v5lnJsXwGprnGXga4wx6d1POjvi5Qmf1ivTRxTjH4Z/9Czja/UCMLVmB9N93GeWOU93XaFaEt6jbuoagNw==} + proxy-agent@6.5.0: resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} engines: {node: '>= 14'} @@ -2959,6 +3448,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + shell-quote@1.8.2: + resolution: {integrity: sha512-AzqKpGKjrj7EM6rKVQEPpB288oCfnrEIuyoT9cyF4nmGa7V8Zk6f7RRqYisX8X9m+Q7bd632aZW4ky7EhbQztA==} + engines: {node: '>= 0.4'} + side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -3008,6 +3501,9 @@ packages: resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} engines: {node: '>=0.10.0'} + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} @@ -3351,8 +3847,8 @@ packages: vite: optional: true - vite@6.0.7: - resolution: {integrity: sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==} + vite@6.2.2: + resolution: {integrity: sha512-yW7PeMM+LkDzc7CgJuRLMW2Jz0FxMOsVJ8Lv3gpgW9WLcb9cTW+121UEr1hvmfR7w3SegR5ItvYyzVz1vxNJgQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -3484,6 +3980,11 @@ packages: engines: {node: '>= 8'} hasBin: true + which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + which@5.0.0: resolution: {integrity: sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==} engines: {node: ^18.17.0 || >=20.5.0} @@ -3557,6 +4058,9 @@ packages: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} + zod@3.24.2: + resolution: {integrity: sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==} + zx@8.4.1: resolution: {integrity: sha512-1Cb+Tfwt/daKV6wckBeDbB6h3IMauqj9KWp+EcbYzi9doeJeIHCktxp/yWspXOXRdoUzBCQSKoUgm3g8r9fz5A==} engines: {node: '>= 12.17.0'} @@ -3620,6 +4124,8 @@ snapshots: '@types/tough-cookie': 4.0.5 tough-cookie: 4.1.4 + '@drizzle-team/brocli@0.10.2': {} + '@emnapi/core@1.3.1': dependencies: '@emnapi/wasi-threads': 1.0.1 @@ -3636,6 +4142,19 @@ snapshots: tslib: 2.8.1 optional: true + '@esbuild-kit/core-utils@3.3.2': + dependencies: + esbuild: 0.18.20 + source-map-support: 0.5.21 + + '@esbuild-kit/esm-loader@2.6.5': + dependencies: + '@esbuild-kit/core-utils': 3.3.2 + get-tsconfig: 4.10.0 + + '@esbuild/aix-ppc64@0.19.12': + optional: true + '@esbuild/aix-ppc64@0.24.2': optional: true @@ -3645,6 +4164,12 @@ snapshots: '@esbuild/aix-ppc64@0.25.1': optional: true + '@esbuild/android-arm64@0.18.20': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + '@esbuild/android-arm64@0.24.2': optional: true @@ -3654,6 +4179,12 @@ snapshots: '@esbuild/android-arm64@0.25.1': optional: true + '@esbuild/android-arm@0.18.20': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + '@esbuild/android-arm@0.24.2': optional: true @@ -3663,6 +4194,12 @@ snapshots: '@esbuild/android-arm@0.25.1': optional: true + '@esbuild/android-x64@0.18.20': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + '@esbuild/android-x64@0.24.2': optional: true @@ -3672,6 +4209,12 @@ snapshots: '@esbuild/android-x64@0.25.1': optional: true + '@esbuild/darwin-arm64@0.18.20': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + '@esbuild/darwin-arm64@0.24.2': optional: true @@ -3681,6 +4224,12 @@ snapshots: '@esbuild/darwin-arm64@0.25.1': optional: true + '@esbuild/darwin-x64@0.18.20': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + '@esbuild/darwin-x64@0.24.2': optional: true @@ -3690,6 +4239,12 @@ snapshots: '@esbuild/darwin-x64@0.25.1': optional: true + '@esbuild/freebsd-arm64@0.18.20': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + '@esbuild/freebsd-arm64@0.24.2': optional: true @@ -3699,6 +4254,12 @@ snapshots: '@esbuild/freebsd-arm64@0.25.1': optional: true + '@esbuild/freebsd-x64@0.18.20': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + '@esbuild/freebsd-x64@0.24.2': optional: true @@ -3708,6 +4269,12 @@ snapshots: '@esbuild/freebsd-x64@0.25.1': optional: true + '@esbuild/linux-arm64@0.18.20': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + '@esbuild/linux-arm64@0.24.2': optional: true @@ -3717,6 +4284,12 @@ snapshots: '@esbuild/linux-arm64@0.25.1': optional: true + '@esbuild/linux-arm@0.18.20': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + '@esbuild/linux-arm@0.24.2': optional: true @@ -3726,6 +4299,12 @@ snapshots: '@esbuild/linux-arm@0.25.1': optional: true + '@esbuild/linux-ia32@0.18.20': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + '@esbuild/linux-ia32@0.24.2': optional: true @@ -3735,6 +4314,12 @@ snapshots: '@esbuild/linux-ia32@0.25.1': optional: true + '@esbuild/linux-loong64@0.18.20': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + '@esbuild/linux-loong64@0.24.2': optional: true @@ -3744,6 +4329,12 @@ snapshots: '@esbuild/linux-loong64@0.25.1': optional: true + '@esbuild/linux-mips64el@0.18.20': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + '@esbuild/linux-mips64el@0.24.2': optional: true @@ -3753,6 +4344,12 @@ snapshots: '@esbuild/linux-mips64el@0.25.1': optional: true + '@esbuild/linux-ppc64@0.18.20': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + '@esbuild/linux-ppc64@0.24.2': optional: true @@ -3762,6 +4359,12 @@ snapshots: '@esbuild/linux-ppc64@0.25.1': optional: true + '@esbuild/linux-riscv64@0.18.20': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + '@esbuild/linux-riscv64@0.24.2': optional: true @@ -3771,6 +4374,12 @@ snapshots: '@esbuild/linux-riscv64@0.25.1': optional: true + '@esbuild/linux-s390x@0.18.20': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + '@esbuild/linux-s390x@0.24.2': optional: true @@ -3780,6 +4389,12 @@ snapshots: '@esbuild/linux-s390x@0.25.1': optional: true + '@esbuild/linux-x64@0.18.20': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + '@esbuild/linux-x64@0.24.2': optional: true @@ -3798,6 +4413,12 @@ snapshots: '@esbuild/netbsd-arm64@0.25.1': optional: true + '@esbuild/netbsd-x64@0.18.20': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + '@esbuild/netbsd-x64@0.24.2': optional: true @@ -3816,6 +4437,12 @@ snapshots: '@esbuild/openbsd-arm64@0.25.1': optional: true + '@esbuild/openbsd-x64@0.18.20': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + '@esbuild/openbsd-x64@0.24.2': optional: true @@ -3825,6 +4452,12 @@ snapshots: '@esbuild/openbsd-x64@0.25.1': optional: true + '@esbuild/sunos-x64@0.18.20': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + '@esbuild/sunos-x64@0.24.2': optional: true @@ -3834,6 +4467,12 @@ snapshots: '@esbuild/sunos-x64@0.25.1': optional: true + '@esbuild/win32-arm64@0.18.20': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + '@esbuild/win32-arm64@0.24.2': optional: true @@ -3843,6 +4482,12 @@ snapshots: '@esbuild/win32-arm64@0.25.1': optional: true + '@esbuild/win32-ia32@0.18.20': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + '@esbuild/win32-ia32@0.24.2': optional: true @@ -3852,6 +4497,12 @@ snapshots: '@esbuild/win32-ia32@0.25.1': optional: true + '@esbuild/win32-x64@0.18.20': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + '@esbuild/win32-x64@0.24.2': optional: true @@ -4025,6 +4676,62 @@ snapshots: '@jridgewell/resolve-uri': 3.1.1 '@jridgewell/sourcemap-codec': 1.4.15 + '@libsql/client@0.15.0': + dependencies: + '@libsql/core': 0.15.0 + '@libsql/hrana-client': 0.7.0 + js-base64: 3.7.7 + libsql: 0.5.1 + promise-limit: 2.7.0 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@libsql/core@0.15.0': + dependencies: + js-base64: 3.7.7 + + '@libsql/darwin-arm64@0.5.1': + optional: true + + '@libsql/darwin-x64@0.5.1': + optional: true + + '@libsql/hrana-client@0.7.0': + dependencies: + '@libsql/isomorphic-fetch': 0.3.1 + '@libsql/isomorphic-ws': 0.1.5 + js-base64: 3.7.7 + node-fetch: 3.3.2 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@libsql/isomorphic-fetch@0.3.1': {} + + '@libsql/isomorphic-ws@0.1.5': + dependencies: + '@types/ws': 8.18.0 + ws: 8.18.1 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@libsql/linux-arm64-gnu@0.5.1': + optional: true + + '@libsql/linux-arm64-musl@0.5.1': + optional: true + + '@libsql/linux-x64-gnu@0.5.1': + optional: true + + '@libsql/linux-x64-musl@0.5.1': + optional: true + + '@libsql/win32-x64-msvc@0.5.1': + optional: true + '@mswjs/interceptors@0.37.3': dependencies: '@open-draft/deferred-promise': 2.2.0 @@ -4041,6 +4748,8 @@ snapshots: '@tybys/wasm-util': 0.9.0 optional: true + '@neon-rs/load@0.0.4': {} + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4062,6 +4771,8 @@ snapshots: '@open-draft/until@2.1.0': {} + '@petamoriken/float16@3.9.2': {} + '@pkgjs/parseargs@0.11.0': optional: true @@ -4367,11 +5078,11 @@ snapshots: '@unrs/rspack-resolver-binding-win32-x64-msvc@1.2.2': optional: true - '@vitest/browser@3.0.9(@types/node@22.10.5)(playwright@1.51.1)(typescript@5.8.2)(vite@6.0.7(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0))(vitest@3.0.9)(webdriverio@9.11.0)': + '@vitest/browser@3.0.9(@types/node@22.10.5)(playwright@1.51.1)(typescript@5.8.2)(vite@6.2.2(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0))(vitest@3.0.9)(webdriverio@9.11.0)': dependencies: '@testing-library/dom': 10.4.0 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.0) - '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.10.5)(typescript@5.8.2))(vite@6.0.7(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0)) + '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.10.5)(typescript@5.8.2))(vite@6.2.2(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0)) '@vitest/utils': 3.0.9 magic-string: 0.30.17 msw: 2.7.3(@types/node@22.10.5)(typescript@5.8.2) @@ -4405,7 +5116,7 @@ snapshots: tinyrainbow: 2.0.0 vitest: 3.0.9(@types/node@22.10.5)(@vitest/browser@3.0.9)(@vitest/ui@3.0.9)(happy-dom@14.12.3)(msw@2.7.3(@types/node@22.10.5)(typescript@5.8.2))(tsx@4.19.3)(yaml@2.7.0) optionalDependencies: - '@vitest/browser': 3.0.9(@types/node@22.10.5)(playwright@1.51.1)(typescript@5.8.2)(vite@6.0.7(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0))(vitest@3.0.9)(webdriverio@9.11.0) + '@vitest/browser': 3.0.9(@types/node@22.10.5)(playwright@1.51.1)(typescript@5.8.2)(vite@6.2.2(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0))(vitest@3.0.9)(webdriverio@9.11.0) transitivePeerDependencies: - supports-color @@ -4416,14 +5127,14 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.9(msw@2.7.3(@types/node@22.10.5)(typescript@5.8.2))(vite@6.0.7(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0))': + '@vitest/mocker@3.0.9(msw@2.7.3(@types/node@22.10.5)(typescript@5.8.2))(vite@6.2.2(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0))': dependencies: '@vitest/spy': 3.0.9 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: msw: 2.7.3(@types/node@22.10.5)(typescript@5.8.2) - vite: 6.0.7(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.2.2(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0) '@vitest/pretty-format@3.0.9': dependencies: @@ -4729,6 +5440,8 @@ snapshots: buffer-crc32@1.0.0: optional: true + buffer-from@1.1.2: {} + buffer@5.7.1: dependencies: base64-js: 1.5.1 @@ -4891,8 +5604,7 @@ snapshots: csstype@3.1.3: {} - data-uri-to-buffer@4.0.1: - optional: true + data-uri-to-buffer@4.0.1: {} data-uri-to-buffer@6.0.2: optional: true @@ -4964,6 +5676,8 @@ snapshots: dequal@2.0.3: {} + detect-libc@2.0.2: {} + detect-libc@2.0.3: {} doctrine@2.1.0: @@ -4994,6 +5708,23 @@ snapshots: domhandler: 5.0.3 optional: true + drizzle-kit@0.30.5(patch_hash=8840807a95176f3fce5def1375b3ba14ed7b7bbb70f4aed75a07dcdb25b92df9): + dependencies: + '@drizzle-team/brocli': 0.10.2 + '@esbuild-kit/esm-loader': 2.6.5 + esbuild: 0.19.12 + esbuild-register: 3.6.0(esbuild@0.19.12) + gel: 2.0.1 + transitivePeerDependencies: + - supports-color + + drizzle-orm@0.40.1(@libsql/client@0.15.0)(@types/better-sqlite3@7.6.12)(better-sqlite3@11.9.1)(gel@2.0.1): + optionalDependencies: + '@libsql/client': 0.15.0 + '@types/better-sqlite3': 7.6.12 + better-sqlite3: 11.9.1 + gel: 2.0.1 + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.1 @@ -5039,6 +5770,8 @@ snapshots: entities@4.5.0: {} + env-paths@3.0.0: {} + es-abstract@1.23.9: dependencies: array-buffer-byte-length: 1.0.2 @@ -5124,6 +5857,64 @@ snapshots: dependencies: magic-string: 0.25.9 + esbuild-register@3.6.0(esbuild@0.19.12): + dependencies: + debug: 4.4.0 + esbuild: 0.19.12 + transitivePeerDependencies: + - supports-color + + esbuild@0.18.20: + optionalDependencies: + '@esbuild/android-arm': 0.18.20 + '@esbuild/android-arm64': 0.18.20 + '@esbuild/android-x64': 0.18.20 + '@esbuild/darwin-arm64': 0.18.20 + '@esbuild/darwin-x64': 0.18.20 + '@esbuild/freebsd-arm64': 0.18.20 + '@esbuild/freebsd-x64': 0.18.20 + '@esbuild/linux-arm': 0.18.20 + '@esbuild/linux-arm64': 0.18.20 + '@esbuild/linux-ia32': 0.18.20 + '@esbuild/linux-loong64': 0.18.20 + '@esbuild/linux-mips64el': 0.18.20 + '@esbuild/linux-ppc64': 0.18.20 + '@esbuild/linux-riscv64': 0.18.20 + '@esbuild/linux-s390x': 0.18.20 + '@esbuild/linux-x64': 0.18.20 + '@esbuild/netbsd-x64': 0.18.20 + '@esbuild/openbsd-x64': 0.18.20 + '@esbuild/sunos-x64': 0.18.20 + '@esbuild/win32-arm64': 0.18.20 + '@esbuild/win32-ia32': 0.18.20 + '@esbuild/win32-x64': 0.18.20 + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + esbuild@0.24.2: optionalDependencies: '@esbuild/aix-ppc64': 0.24.2 @@ -5419,7 +6210,6 @@ snapshots: dependencies: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 - optional: true fflate@0.8.2: {} @@ -5459,7 +6249,6 @@ snapshots: formdata-polyfill@4.0.10: dependencies: fetch-blob: 3.2.0 - optional: true fs-constants@1.0.0: {} @@ -5497,6 +6286,17 @@ snapshots: - supports-color optional: true + gel@2.0.1: + dependencies: + '@petamoriken/float16': 3.9.2 + debug: 4.4.0 + env-paths: 3.0.0 + semver: 7.7.1 + shell-quote: 1.8.2 + which: 4.0.0 + transitivePeerDependencies: + - supports-color + get-caller-file@2.0.5: {} get-intrinsic@1.2.7: @@ -5817,8 +6617,7 @@ snapshots: isexe@2.0.0: {} - isexe@3.1.1: - optional: true + isexe@3.1.1: {} istanbul-lib-coverage@3.2.2: {} @@ -5851,6 +6650,8 @@ snapshots: joycon@3.1.1: {} + js-base64@3.7.7: {} + js-tokens@4.0.0: {} js-yaml@4.1.0: @@ -5892,6 +6693,19 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + libsql@0.5.1: + dependencies: + '@neon-rs/load': 0.0.4 + detect-libc: 2.0.2 + optionalDependencies: + '@libsql/darwin-arm64': 0.5.1 + '@libsql/darwin-x64': 0.5.1 + '@libsql/linux-arm64-gnu': 0.5.1 + '@libsql/linux-arm64-musl': 0.5.1 + '@libsql/linux-x64-gnu': 0.5.1 + '@libsql/linux-x64-musl': 0.5.1 + '@libsql/win32-x64-msvc': 0.5.1 + lie@3.3.0: dependencies: immediate: 3.0.6 @@ -6050,7 +6864,7 @@ snapshots: object-assign: 4.1.1 thenify-all: 1.6.0 - nanoid@3.3.7: {} + nanoid@3.3.11: {} napi-build-utils@2.0.0: {} @@ -6063,15 +6877,13 @@ snapshots: dependencies: semver: 7.7.1 - node-domexception@1.0.0: - optional: true + node-domexception@1.0.0: {} node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 - optional: true node-sql-parser@3.9.4: dependencies: @@ -6248,17 +7060,17 @@ snapshots: possible-typed-array-names@1.0.0: {} - postcss-load-config@6.0.1(postcss@8.4.49)(tsx@4.19.3)(yaml@2.7.0): + postcss-load-config@6.0.1(postcss@8.5.3)(tsx@4.19.3)(yaml@2.7.0): dependencies: lilconfig: 3.1.3 optionalDependencies: - postcss: 8.4.49 + postcss: 8.5.3 tsx: 4.19.3 yaml: 2.7.0 - postcss@8.4.49: + postcss@8.5.3: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -6301,6 +7113,8 @@ snapshots: bl: 4.1.0 node-sql-parser: 3.9.4 + promise-limit@2.7.0: {} + proxy-agent@6.5.0: dependencies: agent-base: 7.1.3 @@ -6559,6 +7373,8 @@ snapshots: shebang-regex@3.0.0: {} + shell-quote@1.8.2: {} + side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -6625,8 +7441,12 @@ snapshots: source-map-js@1.2.1: {} - source-map@0.6.1: - optional: true + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} source-map@0.8.0-beta.0: dependencies: @@ -6848,7 +7668,7 @@ snapshots: tslib@2.8.1: optional: true - tsup@8.4.0(postcss@8.4.49)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0): + tsup@8.4.0(postcss@8.5.3)(tsx@4.19.3)(typescript@5.8.2)(yaml@2.7.0): dependencies: bundle-require: 5.1.0(esbuild@0.25.1) cac: 6.7.14 @@ -6858,7 +7678,7 @@ snapshots: esbuild: 0.25.1 joycon: 3.1.1 picocolors: 1.1.1 - postcss-load-config: 6.0.1(postcss@8.4.49)(tsx@4.19.3)(yaml@2.7.0) + postcss-load-config: 6.0.1(postcss@8.5.3)(tsx@4.19.3)(yaml@2.7.0) resolve-from: 5.0.0 rollup: 4.35.0 source-map: 0.8.0-beta.0 @@ -6867,7 +7687,7 @@ snapshots: tinyglobby: 0.2.12 tree-kill: 1.2.2 optionalDependencies: - postcss: 8.4.49 + postcss: 8.5.3 typescript: 5.8.2 transitivePeerDependencies: - jiti @@ -7000,7 +7820,7 @@ snapshots: debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.0.7(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.2.2(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - '@types/node' - jiti @@ -7015,21 +7835,21 @@ snapshots: - tsx - yaml - vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@6.0.7(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0)): + vite-tsconfig-paths@5.1.4(typescript@5.8.2)(vite@6.2.2(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0)): dependencies: debug: 4.3.7 globrex: 0.1.2 tsconfck: 3.1.0(typescript@5.8.2) optionalDependencies: - vite: 6.0.7(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.2.2(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0) transitivePeerDependencies: - supports-color - typescript - vite@6.0.7(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0): + vite@6.2.2(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0): dependencies: - esbuild: 0.24.2 - postcss: 8.4.49 + esbuild: 0.25.1 + postcss: 8.5.3 rollup: 4.35.0 optionalDependencies: '@types/node': 22.10.5 @@ -7040,7 +7860,7 @@ snapshots: vitest@3.0.9(@types/node@22.10.5)(@vitest/browser@3.0.9)(@vitest/ui@3.0.9)(happy-dom@14.12.3)(msw@2.7.3(@types/node@22.10.5)(typescript@5.8.2))(tsx@4.19.3)(yaml@2.7.0): dependencies: '@vitest/expect': 3.0.9 - '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.10.5)(typescript@5.8.2))(vite@6.0.7(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0)) + '@vitest/mocker': 3.0.9(msw@2.7.3(@types/node@22.10.5)(typescript@5.8.2))(vite@6.2.2(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0)) '@vitest/pretty-format': 3.0.9 '@vitest/runner': 3.0.9 '@vitest/snapshot': 3.0.9 @@ -7056,12 +7876,12 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.0.7(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0) + vite: 6.2.2(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0) vite-node: 3.0.9(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 22.10.5 - '@vitest/browser': 3.0.9(@types/node@22.10.5)(playwright@1.51.1)(typescript@5.8.2)(vite@6.0.7(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0))(vitest@3.0.9)(webdriverio@9.11.0) + '@vitest/browser': 3.0.9(@types/node@22.10.5)(playwright@1.51.1)(typescript@5.8.2)(vite@6.2.2(@types/node@22.10.5)(tsx@4.19.3)(yaml@2.7.0))(vitest@3.0.9)(webdriverio@9.11.0) '@vitest/ui': 3.0.9(vitest@3.0.9) happy-dom: 14.12.3 transitivePeerDependencies: @@ -7087,8 +7907,7 @@ snapshots: - supports-color optional: true - web-streams-polyfill@3.3.3: - optional: true + web-streams-polyfill@3.3.3: {} webdriver@9.11.0: dependencies: @@ -7209,6 +8028,10 @@ snapshots: dependencies: isexe: 2.0.0 + which@4.0.0: + dependencies: + isexe: 3.1.1 + which@5.0.0: dependencies: isexe: 3.1.1 @@ -7276,4 +8099,6 @@ snapshots: readable-stream: 4.7.0 optional: true + zod@3.24.2: {} + zx@8.4.1: {} diff --git a/src/protocols/cloud/msg-types.ts b/src/protocols/cloud/msg-types.ts index 51cabd1c6..7a45d17a8 100644 --- a/src/protocols/cloud/msg-types.ts +++ b/src/protocols/cloud/msg-types.ts @@ -1,23 +1,53 @@ import { Future, Logger, Result } from "@adviser/cement"; import { SuperThis } from "@fireproof/core"; import { CalculatePreSignedUrl } from "./msg-types-data.js"; -import type { JWTPayload } from "jose"; +// import type { JWTPayload } from "jose"; +import zod from "zod"; // import { PreSignedMsg } from "./pre-signed-url.js"; export const VERSION = "FP-MSG-1.0"; -export interface BaseTokenParam { - readonly alg: string; // defaults ES256 - readonly issuer: string; - readonly audience: string; - readonly validFor: number; -} -export interface FPCloudClaim extends JWTPayload { - readonly userId: string; - readonly tenants: { readonly id: string; readonly role: string }[]; - readonly ledgers: { readonly id: string; readonly role: string; readonly right: string }[]; -} +const zodBaseTokenParam = zod.object({ + alg: zod.string(), + issuer: zod.string(), + audience: zod.string(), + validFor: zod.number(), +}); + +export type BaseTokenParam = zod.infer; + +// export interface BaseTokenParam { +// readonly alg: string; // defaults ES256 +// readonly issuer: string; +// readonly audience: string; +// readonly validFor: number; +// } +const zodJWTPayload = zod.object({ + iss: zod.string().optional(), + sub: zod.string().optional(), + aud: zod.union([zod.string(), zod.array(zod.string())]).optional(), + jti: zod.string().optional(), + nbf: zod.number().optional(), + exp: zod.number().optional(), + iat: zod.number().optional(), +}) + + +export const zodFPCloudClaim = zod.object({ + ...zodJWTPayload.shape, + userId: zod.string(), + tenants: zod.array(zod.object({ id: zod.string(), role: zod.string() })), + ledgers: zod.array(zod.object({ id: zod.string(), role: zod.string(), right: zod.string() })), +}) + +export type FPCloudClaim = zod.infer; + +// export interface FPCloudClaim extends JWTPayload { +// readonly userId: string; +// readonly tenants: { readonly id: string; readonly role: string }[]; +// readonly ledgers: { readonly id: string; readonly role: string; readonly right: string }[]; +// } export type TokenForParam = FPCloudClaim & Partial; @@ -55,9 +85,65 @@ export interface NextId { readonly nextId: SuperThis["nextId"]; } -export interface AuthType { - readonly type: "ucan" | "error" | "fp-cloud-jwk" | "fp-cloud"; -} +export const zodError = zod.object({ + type: zod.literal("error"), +}) + +export const zodUcanAuth = zod.object({ + type: zod.literal("ucan"), + params: zod.object({ + tbd: zod.string(), + }), +}); + +export type UCanAuth = zod.infer; +// export interface UCanAuth extends AuthType { +// readonly type: "ucan"; +// readonly params: { +// readonly tbd: string; +// }; +// } + +export const zodFPJWKCloudAuthType = zod.object({ + type: zod.literal("fp-cloud-jwk"), + params: zod.object({ + jwk: zod.string(), + }), +}); + +export type FPJWKCloudAuthType = zod.infer; + +// export interface FPJWKCloudAuthType extends AuthType { +// readonly type: "fp-cloud-jwk"; +// readonly params: { +// readonly jwk: string; +// }; +// } + +export const zodFPCloudAuthType = zod.object({ + type: zod.literal("fp-cloud"), + params: zod.object({ + claim: zodBaseTokenParam, + jwk: zod.string(), + }), +}); +export type FPCloudAuthType = zod.infer; + +// export interface FPCloudAuthType extends AuthType { +// readonly type: "fp-cloud"; +// readonly params: { +// readonly claim: TokenForParam; +// readonly jwk: string; // for reply +// }; +// } + +export const zodAuthType = zod.union([zodUcanAuth, zodFPJWKCloudAuthType, zodFPCloudAuthType, zodError]); + +export type AuthType = zod.infer; + +// export interface AuthType { +// readonly type: "ucan" | "error" | "fp-cloud-jwk" | "fp-cloud"; +// } export function isAuthTypeFPCloudJWK(a: AuthType): a is FPJWKCloudAuthType { return a.type === "fp-cloud-jwk"; @@ -67,27 +153,6 @@ export function isAuthTypeFPCloud(a: AuthType): a is FPCloudAuthType { return a.type === "fp-cloud"; } -export interface UCanAuth extends AuthType { - readonly type: "ucan"; - readonly params: { - readonly tbd: string; - }; -} -export interface FPJWKCloudAuthType extends AuthType { - readonly type: "fp-cloud-jwk"; - readonly params: { - readonly jwk: string; - }; -} - -export interface FPCloudAuthType extends AuthType { - readonly type: "fp-cloud"; - readonly params: { - readonly claim: TokenForParam; - readonly jwk: string; // for reply - }; -} - export type AuthFactory = (tp?: Partial) => Promise>; export interface TenantLedger { @@ -99,10 +164,15 @@ export function keyTenantLedger(t: TenantLedger): string { return `${t.tenant}:${t.ledger}`; } -export interface QSId { - readonly reqId: string; - readonly resId: string; -} +export const zodQSId = zod.object({ + reqId: zod.string(), + resId: zod.string(), +}); +// export interface QSId { +// readonly reqId: string; +// readonly resId: string; +// } +export type QSId = zod.infer; export function qsidEqual(a: QSId, b: QSId): boolean { return a.reqId === b.reqId && a.resId === b.resId; @@ -120,18 +190,34 @@ export function qsidKey(qsid: QSId): string { // readonly conn: Connection; // } -export interface MsgBase { - readonly tid: string; - readonly type: string; - readonly version: string; - readonly auth: AuthType; -} +export const zodMsgBase = zod.object({ + tid: zod.string(), + type: zod.string(), + version: zod.string(), + auth: zodAuthType.optional(), + conn: zodQSId.optional() +}); + +// export interface MsgBase { +// readonly tid: string; +// readonly type: string; +// readonly version: string; +// readonly auth: AuthType; +// } + +export type MsgBase = zod.infer; + + export function MsgIsTid(msg: MsgBase, tid: string): boolean { return msg.tid === tid; } -type MsgWithConn = T & { readonly conn: QSId }; +const zodMsgWithConn = zod.object({ + ...zodMsgBase.shape, + conn: zodQSId, +}); +type MsgWithConn = zod.infer // T & { readonly conn: QSId }; export type MsgWithConnAuth = MsgWithConn & { readonly auth: AuthType }; @@ -141,13 +227,23 @@ export type MsgWithConnAuth = MsgWithConn & { re export type MsgWithTenantLedger = T & { readonly tenant: TenantLedger }; -export interface ErrorMsg extends MsgBase { - readonly type: "error"; - readonly src: unknown; - readonly message: string; - readonly body?: string; - readonly stack?: string[]; -} +export const zodErrorMsg = zod.object({ + ...zodMsgBase.shape, + type: zod.literal("error"), + src: zod.unknown(), + message: zod.string(), + body: zod.string().optional(), + stack: zod.array(zod.string()).optional(), +}); + +export type ErrorMsg = zod.infer; +// export interface ErrorMsg extends MsgBase { +// readonly type: "error"; +// readonly src: unknown; +// readonly message: string; +// readonly body?: string; +// readonly stack?: string[]; +// } export function MsgIsError(rq: MsgBase): rq is ErrorMsg { return rq.type === "error"; @@ -420,30 +516,41 @@ export function MsgIsResGestalt(msg: MsgBase): msg is ResGestalt { return msg.type === "resGestalt"; } -export interface ReqOpenConnection { - // readonly key: TenantLedger; - readonly reqId?: string; - readonly resId?: string; // for double open -} +// export interface ReqOpenConnection { +// // readonly key: TenantLedger; +// readonly reqId?: string; +// readonly resId?: string; // for double open +// } -export interface ReqOpenConn { - readonly reqId: string; - readonly resId?: string; -} -export interface ReqOpen extends MsgBase { - readonly type: "reqOpen"; - readonly conn: ReqOpenConn; -} +// export interface ReqOpenConn { +// readonly reqId: string; +// readonly resId?: string; +// } +const zodQSidReqOpen = zod.object({ + reqId: zod.string(), + resId: zod.string().optional(), +}); + +export const zodReqOpen = zod.object({ + ...zodMsgBase.shape, + type: zod.literal("reqOpen"), + conn: zodQSidReqOpen, +}); + +export type ReqOpen = zod.infer; +// export interface ReqOpen extends MsgBase { +// readonly type: "reqOpen"; +// readonly conn: ReqOpenConn; +// } -export function buildReqOpen(sthis: NextId, auth: AuthType, conn: ReqOpenConnection): ReqOpen { +export function buildReqOpen(sthis: NextId, auth: AuthType, conn: Partial): ReqOpen { return { tid: sthis.nextId().str, auth, type: "reqOpen", version: VERSION, conn: { - ...conn, reqId: conn.reqId || sthis.nextId().str, }, };