@firtoz/drizzle-sqlite-wasm 1.0.5 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +23 -0
- package/README.md +9 -1
- package/dist/chunk-6LNYKOKR.js +24 -0
- package/dist/chunk-6LNYKOKR.js.map +1 -0
- package/dist/chunk-7JJHY44Q.js +19 -0
- package/dist/chunk-7JJHY44Q.js.map +1 -0
- package/dist/chunk-AEYHRJVN.js +130 -0
- package/dist/chunk-AEYHRJVN.js.map +1 -0
- package/dist/chunk-AGMKOHXO.js +238 -0
- package/dist/chunk-AGMKOHXO.js.map +1 -0
- package/dist/chunk-BJDPMGFF.js +87 -0
- package/dist/chunk-BJDPMGFF.js.map +1 -0
- package/dist/chunk-BZVMUTJ7.js +49 -0
- package/dist/chunk-BZVMUTJ7.js.map +1 -0
- package/dist/chunk-FIVEPVOM.js +43 -0
- package/dist/chunk-FIVEPVOM.js.map +1 -0
- package/dist/chunk-FRONXNEA.js +123 -0
- package/dist/chunk-FRONXNEA.js.map +1 -0
- package/dist/chunk-GVUNHU6J.js +85 -0
- package/dist/chunk-GVUNHU6J.js.map +1 -0
- package/dist/chunk-H2F2HZ2A.js +22 -0
- package/dist/chunk-H2F2HZ2A.js.map +1 -0
- package/dist/chunk-NSPVPJKE.js +117 -0
- package/dist/chunk-NSPVPJKE.js.map +1 -0
- package/dist/chunk-TZP4AIBR.js +22 -0
- package/dist/chunk-TZP4AIBR.js.map +1 -0
- package/dist/chunk-WFFFP6DB.js +124 -0
- package/dist/chunk-WFFFP6DB.js.map +1 -0
- package/dist/collections/sqlite-collection.d.ts +40 -0
- package/dist/collections/sqlite-collection.js +3 -0
- package/dist/collections/sqlite-collection.js.map +1 -0
- package/dist/collections/synced-sqlite-collection.d.ts +19 -0
- package/dist/collections/synced-sqlite-collection.js +4 -0
- package/dist/collections/synced-sqlite-collection.js.map +1 -0
- package/dist/collections/websocket-collection.d.ts +18 -0
- package/dist/collections/websocket-collection.js +185 -0
- package/dist/collections/websocket-collection.js.map +1 -0
- package/dist/context/DrizzleSqliteProvider.d.ts +50 -0
- package/dist/context/DrizzleSqliteProvider.js +11 -0
- package/dist/context/DrizzleSqliteProvider.js.map +1 -0
- package/dist/context/useDrizzleSqlite.d.ts +23 -0
- package/dist/context/useDrizzleSqlite.js +12 -0
- package/dist/context/useDrizzleSqlite.js.map +1 -0
- package/dist/drizzle/direct.d.ts +8 -0
- package/dist/drizzle/direct.js +4 -0
- package/dist/drizzle/direct.js.map +1 -0
- package/dist/drizzle/handle-callback.d.ts +15 -0
- package/dist/drizzle/handle-callback.js +3 -0
- package/dist/drizzle/handle-callback.js.map +1 -0
- package/dist/drizzle/worker.d.ts +15 -0
- package/dist/drizzle/worker.js +3 -0
- package/dist/drizzle/worker.js.map +1 -0
- package/dist/hooks/useDrizzleSqliteDb.d.ts +24 -0
- package/dist/hooks/useDrizzleSqliteDb.js +9 -0
- package/dist/hooks/useDrizzleSqliteDb.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/migration/migrator.d.ts +7 -0
- package/dist/migration/migrator.js +3 -0
- package/dist/migration/migrator.js.map +1 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/worker/client.d.ts +12 -0
- package/dist/worker/client.js +3 -0
- package/dist/worker/client.js.map +1 -0
- package/dist/worker/global-manager.d.ts +36 -0
- package/dist/worker/global-manager.js +6 -0
- package/dist/worker/global-manager.js.map +1 -0
- package/dist/worker/manager.d.ts +71 -0
- package/dist/worker/manager.js +5 -0
- package/dist/worker/manager.js.map +1 -0
- package/dist/worker/schema.d.ts +125 -0
- package/dist/worker/schema.js +4 -0
- package/dist/worker/schema.js.map +1 -0
- package/dist/worker/sqlite-open-options.d.ts +45 -0
- package/dist/worker/sqlite-open-options.js +3 -0
- package/dist/worker/sqlite-open-options.js.map +1 -0
- package/dist/worker/sqlite.worker.d.ts +2 -0
- package/dist/worker/sqlite.worker.js +196 -0
- package/dist/worker/sqlite.worker.js.map +1 -0
- package/package.json +24 -24
- package/src/collections/sqlite-collection.ts +4 -4
- package/src/hooks/useDrizzleSqliteDb.ts +2 -2
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { createSqliteTableSyncBackend, createSyncFunction, createInsertSchemaWithIdDefault, createCollectionConfig } from '@firtoz/drizzle-utils';
|
|
2
|
+
|
|
3
|
+
// src/collections/sqlite-collection.ts
|
|
4
|
+
function sqliteCollectionOptions(config) {
|
|
5
|
+
const tableName = config.tableName;
|
|
6
|
+
const table = config.drizzle?._.fullSchema[tableName];
|
|
7
|
+
const getKey = (item) => item.id;
|
|
8
|
+
const backend = createSqliteTableSyncBackend({
|
|
9
|
+
drizzle: config.drizzle,
|
|
10
|
+
table,
|
|
11
|
+
tableName: config.tableName,
|
|
12
|
+
debug: config.debug,
|
|
13
|
+
checkpoint: config.checkpoint,
|
|
14
|
+
interceptor: config.interceptor,
|
|
15
|
+
driverMode: "async"
|
|
16
|
+
});
|
|
17
|
+
const baseSyncConfig = {
|
|
18
|
+
table,
|
|
19
|
+
readyPromise: config.readyPromise,
|
|
20
|
+
syncMode: config.syncMode,
|
|
21
|
+
debug: config.debug,
|
|
22
|
+
getSyncPersistKey: (item) => String(getKey(item))
|
|
23
|
+
};
|
|
24
|
+
const syncResult = createSyncFunction(baseSyncConfig, backend);
|
|
25
|
+
const schema = createInsertSchemaWithIdDefault(table);
|
|
26
|
+
const collectionConfig = createCollectionConfig({
|
|
27
|
+
schema,
|
|
28
|
+
getKey,
|
|
29
|
+
syncResult,
|
|
30
|
+
onInsert: config.debug ? async (params) => {
|
|
31
|
+
console.log("onInsert", params);
|
|
32
|
+
await syncResult.onInsert(params);
|
|
33
|
+
} : void 0,
|
|
34
|
+
onUpdate: config.debug ? async (params) => {
|
|
35
|
+
console.log("onUpdate", params);
|
|
36
|
+
await syncResult.onUpdate(params);
|
|
37
|
+
} : void 0,
|
|
38
|
+
onDelete: config.debug ? async (params) => {
|
|
39
|
+
console.log("onDelete", params);
|
|
40
|
+
await syncResult.onDelete(params);
|
|
41
|
+
} : void 0,
|
|
42
|
+
syncMode: config.syncMode
|
|
43
|
+
});
|
|
44
|
+
return collectionConfig;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export { sqliteCollectionOptions };
|
|
48
|
+
//# sourceMappingURL=chunk-BZVMUTJ7.js.map
|
|
49
|
+
//# sourceMappingURL=chunk-BZVMUTJ7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/collections/sqlite-collection.ts"],"names":[],"mappings":";;;AA+EO,SAAS,wBAKf,MAAA,EACiC;AACjC,EAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AAGzB,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,OAAA,EAAS,CAAA,CAAE,WAAW,SAAS,CAAA;AAEpD,EAAA,MAAM,MAAA,GAAS,CACd,IAAA,KACmB,IAAA,CAA8B,EAAA;AAElD,EAAA,MAAM,UAAU,4BAAA,CAA6B;AAAA,IAC5C,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,KAAA;AAAA,IACA,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,YAAY,MAAA,CAAO,UAAA;AAAA,IACnB,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,UAAA,EAAY;AAAA,GACZ,CAAA;AAED,EAAA,MAAM,cAAA,GAAyC;AAAA,IAC9C,KAAA;AAAA,IACA,cAAc,MAAA,CAAO,YAAA;AAAA,IACrB,UAAU,MAAA,CAAO,QAAA;AAAA,IACjB,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,mBAAmB,CAAC,IAAA,KAAS,MAAA,CAAO,MAAA,CAAO,IAAI,CAAC;AAAA,GACjD;AAEA,EAAA,MAAM,UAAA,GAAa,kBAAA,CAAmB,cAAA,EAAgB,OAAO,CAAA;AAE7D,EAAA,MAAM,MAAA,GAAS,gCAAgC,KAAK,CAAA;AAEpD,EAAA,MAAM,mBAAmB,sBAAA,CAAuB;AAAA,IAC/C,MAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA,EAAU,MAAA,CAAO,KAAA,GACd,OAAO,MAAA,KAAW;AAClB,MAAA,OAAA,CAAQ,GAAA,CAAI,YAAY,MAAM,CAAA;AAE9B,MAAA,MAAM,UAAA,CAAW,SAAU,MAAM,CAAA;AAAA,IAClC,CAAA,GACC,MAAA;AAAA,IACH,QAAA,EAAU,MAAA,CAAO,KAAA,GACd,OAAO,MAAA,KAAW;AAClB,MAAA,OAAA,CAAQ,GAAA,CAAI,YAAY,MAAM,CAAA;AAE9B,MAAA,MAAM,UAAA,CAAW,SAAU,MAAM,CAAA;AAAA,IAClC,CAAA,GACC,MAAA;AAAA,IACH,QAAA,EAAU,MAAA,CAAO,KAAA,GACd,OAAO,MAAA,KAAW;AAClB,MAAA,OAAA,CAAQ,GAAA,CAAI,YAAY,MAAM,CAAA;AAE9B,MAAA,MAAM,UAAA,CAAW,SAAU,MAAM,CAAA;AAAA,IAClC,CAAA,GACC,MAAA;AAAA,IACH,UAAU,MAAA,CAAO;AAAA,GACjB,CAAA;AAED,EAAA,OAAO,gBAAA;AACR","file":"chunk-BZVMUTJ7.js","sourcesContent":["import type {\n\tInferSchemaOutput,\n\tSyncMode,\n\tCollectionConfig,\n} from \"@tanstack/db\";\nimport type { Table } from \"drizzle-orm\";\nimport type { BaseSQLiteDatabase } from \"drizzle-orm/sqlite-core\";\nimport type { CollectionUtils } from \"@firtoz/db-helpers\";\nimport type {\n\tSelectSchema,\n\tInsertToSelectSchema,\n\tTableWithRequiredFields,\n\tBaseSyncConfig,\n\tIdOf,\n} from \"@firtoz/drizzle-utils\";\nimport {\n\tcreateSyncFunction,\n\tcreateInsertSchemaWithIdDefault,\n\tcreateCollectionConfig,\n\tcreateSqliteTableSyncBackend,\n\ttype SQLOperation,\n\ttype SQLInterceptor,\n} from \"@firtoz/drizzle-utils\";\nexport type { SQLOperation, SQLInterceptor };\n\nexport type AnyDrizzleDatabase = BaseSQLiteDatabase<\n\t\"async\",\n\t// biome-ignore lint/suspicious/noExplicitAny: We really want to use any here.\n\tany,\n\tRecord<string, unknown>\n>;\n\nexport type DrizzleSchema<TDrizzle extends AnyDrizzleDatabase> =\n\tTDrizzle[\"_\"][\"fullSchema\"];\n\nexport interface DrizzleSqliteCollectionConfig<\n\tTDrizzle extends AnyDrizzleDatabase,\n\tTTableName extends ValidTableNames<DrizzleSchema<TDrizzle>>,\n> {\n\tdrizzle: TDrizzle;\n\ttableName: ValidTableNames<DrizzleSchema<TDrizzle>> extends never\n\t\t? {\n\t\t\t\t$error: \"The schema needs to include at least one table that uses the syncableTable function.\";\n\t\t\t}\n\t\t: TTableName;\n\treadyPromise: Promise<void>;\n\tsyncMode?: SyncMode;\n\t/**\n\t * Enable debug logging for query execution and mutations\n\t */\n\tdebug?: boolean;\n\t/**\n\t * Optional callback to checkpoint the database after mutations\n\t * This ensures WAL is flushed to the main database file for OPFS persistence\n\t */\n\tcheckpoint?: () => Promise<void>;\n\t/**\n\t * Optional interceptor for tracking SQLite operations (for testing/debugging)\n\t */\n\tinterceptor?: SQLInterceptor;\n}\n\nexport type ValidTableNames<TSchema extends Record<string, unknown>> = {\n\t[K in keyof TSchema]: TSchema[K] extends TableWithRequiredFields ? K : never;\n}[keyof TSchema];\n\nexport type SqliteCollectionConfig<TTable extends Table> = Omit<\n\tCollectionConfig<\n\t\tInferSchemaOutput<SelectSchema<TTable>>,\n\t\tIdOf<TTable>,\n\t\tInsertToSelectSchema<TTable>,\n\t\tCollectionUtils<InferSchemaOutput<SelectSchema<TTable>>>\n\t>,\n\t\"utils\"\n> & {\n\tschema: InsertToSelectSchema<TTable>;\n\tutils: CollectionUtils<InferSchemaOutput<SelectSchema<TTable>>>;\n};\n\nexport function sqliteCollectionOptions<\n\tconst TDrizzle extends AnyDrizzleDatabase,\n\tconst TTableName extends string & ValidTableNames<DrizzleSchema<TDrizzle>>,\n\tTTable extends DrizzleSchema<TDrizzle>[TTableName] & TableWithRequiredFields,\n>(\n\tconfig: DrizzleSqliteCollectionConfig<TDrizzle, TTableName>,\n): SqliteCollectionConfig<TTable> {\n\tconst tableName = config.tableName as string &\n\t\tValidTableNames<DrizzleSchema<TDrizzle>>;\n\n\tconst table = config.drizzle?._.fullSchema[tableName] as TTable;\n\n\tconst getKey = (\n\t\titem: InferSchemaOutput<SelectSchema<TTable>>,\n\t): IdOf<TTable> => (item as { id: IdOf<TTable> }).id;\n\n\tconst backend = createSqliteTableSyncBackend({\n\t\tdrizzle: config.drizzle,\n\t\ttable,\n\t\ttableName: config.tableName as string,\n\t\tdebug: config.debug,\n\t\tcheckpoint: config.checkpoint,\n\t\tinterceptor: config.interceptor,\n\t\tdriverMode: \"async\",\n\t});\n\n\tconst baseSyncConfig: BaseSyncConfig<TTable> = {\n\t\ttable,\n\t\treadyPromise: config.readyPromise,\n\t\tsyncMode: config.syncMode,\n\t\tdebug: config.debug,\n\t\tgetSyncPersistKey: (item) => String(getKey(item)),\n\t};\n\n\tconst syncResult = createSyncFunction(baseSyncConfig, backend);\n\n\tconst schema = createInsertSchemaWithIdDefault(table);\n\n\tconst collectionConfig = createCollectionConfig({\n\t\tschema,\n\t\tgetKey,\n\t\tsyncResult,\n\t\tonInsert: config.debug\n\t\t\t? async (params) => {\n\t\t\t\t\tconsole.log(\"onInsert\", params);\n\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: onInsert is always defined in createSyncFunction\n\t\t\t\t\tawait syncResult.onInsert!(params);\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tonUpdate: config.debug\n\t\t\t? async (params) => {\n\t\t\t\t\tconsole.log(\"onUpdate\", params);\n\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: onUpdate is always defined in createSyncFunction\n\t\t\t\t\tawait syncResult.onUpdate!(params);\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tonDelete: config.debug\n\t\t\t? async (params) => {\n\t\t\t\t\tconsole.log(\"onDelete\", params);\n\t\t\t\t\t// biome-ignore lint/style/noNonNullAssertion: onDelete is always defined in createSyncFunction\n\t\t\t\t\tawait syncResult.onDelete!(params);\n\t\t\t\t}\n\t\t\t: undefined,\n\t\tsyncMode: config.syncMode,\n\t});\n\n\treturn collectionConfig;\n}\n"]}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { SqliteWorkerManager } from './chunk-AGMKOHXO.js';
|
|
2
|
+
|
|
3
|
+
// src/worker/global-manager.ts
|
|
4
|
+
var globalManager = null;
|
|
5
|
+
var initPromise = null;
|
|
6
|
+
function initializeSqliteWorker(WorkerConstructor, debug = false) {
|
|
7
|
+
if (initPromise) {
|
|
8
|
+
return initPromise;
|
|
9
|
+
}
|
|
10
|
+
if (globalManager) {
|
|
11
|
+
return Promise.resolve(globalManager);
|
|
12
|
+
}
|
|
13
|
+
initPromise = (async () => {
|
|
14
|
+
const worker = new WorkerConstructor();
|
|
15
|
+
const manager = new SqliteWorkerManager(worker, debug);
|
|
16
|
+
globalManager = manager;
|
|
17
|
+
await manager.ready;
|
|
18
|
+
return manager;
|
|
19
|
+
})();
|
|
20
|
+
return initPromise;
|
|
21
|
+
}
|
|
22
|
+
function getSqliteWorkerManager() {
|
|
23
|
+
if (!globalManager) {
|
|
24
|
+
throw new Error(
|
|
25
|
+
"SQLite worker manager not initialized. Call initializeSqliteWorker() first."
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
return globalManager;
|
|
29
|
+
}
|
|
30
|
+
function isSqliteWorkerInitialized() {
|
|
31
|
+
return globalManager !== null;
|
|
32
|
+
}
|
|
33
|
+
function resetSqliteWorkerManager() {
|
|
34
|
+
if (globalManager) {
|
|
35
|
+
globalManager.terminate();
|
|
36
|
+
}
|
|
37
|
+
globalManager = null;
|
|
38
|
+
initPromise = null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export { getSqliteWorkerManager, initializeSqliteWorker, isSqliteWorkerInitialized, resetSqliteWorkerManager };
|
|
42
|
+
//# sourceMappingURL=chunk-FIVEPVOM.js.map
|
|
43
|
+
//# sourceMappingURL=chunk-FIVEPVOM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/worker/global-manager.ts"],"names":[],"mappings":";;;AAEA,IAAI,aAAA,GAA4C,IAAA;AAChD,IAAI,WAAA,GAAmD,IAAA;AAgBhD,SAAS,sBAAA,CACf,iBAAA,EACA,KAAA,GAAiB,KAAA,EACc;AAE/B,EAAA,IAAI,WAAA,EAAa;AAChB,IAAA,OAAO,WAAA;AAAA,EACR;AAGA,EAAA,IAAI,aAAA,EAAe;AAClB,IAAA,OAAO,OAAA,CAAQ,QAAQ,aAAa,CAAA;AAAA,EACrC;AAGA,EAAA,WAAA,GAAA,CAAe,YAAY;AAC1B,IAAA,MAAM,MAAA,GAAS,IAAI,iBAAA,EAAkB;AACrC,IAAA,MAAM,OAAA,GAAU,IAAI,mBAAA,CAAoB,MAAA,EAAQ,KAAK,CAAA;AACrD,IAAA,aAAA,GAAgB,OAAA;AAGhB,IAAA,MAAM,OAAA,CAAQ,KAAA;AAEd,IAAA,OAAO,OAAA;AAAA,EACR,CAAA,GAAG;AAEH,EAAA,OAAO,WAAA;AACR;AAMO,SAAS,sBAAA,GAA8C;AAC7D,EAAA,IAAI,CAAC,aAAA,EAAe;AACnB,IAAA,MAAM,IAAI,KAAA;AAAA,MACT;AAAA,KACD;AAAA,EACD;AACA,EAAA,OAAO,aAAA;AACR;AAKO,SAAS,yBAAA,GAAqC;AACpD,EAAA,OAAO,aAAA,KAAkB,IAAA;AAC1B;AAKO,SAAS,wBAAA,GAA2B;AAC1C,EAAA,IAAI,aAAA,EAAe;AAClB,IAAA,aAAA,CAAc,SAAA,EAAU;AAAA,EACzB;AACA,EAAA,aAAA,GAAgB,IAAA;AAChB,EAAA,WAAA,GAAc,IAAA;AACf","file":"chunk-FIVEPVOM.js","sourcesContent":["import { SqliteWorkerManager } from \"./manager\";\n\nlet globalManager: SqliteWorkerManager | null = null;\nlet initPromise: Promise<SqliteWorkerManager> | null = null;\n\n/**\n * Initialize the global SQLite worker manager.\n * Should be called once, early in your app (e.g., in entry.client.tsx).\n * Subsequent calls return the same manager instance.\n *\n * @example\n * ```typescript\n * // In entry.client.tsx\n * import { initializeSqliteWorker } from \"@firtoz/drizzle-sqlite-wasm\";\n * import SqliteWorker from \"@firtoz/drizzle-sqlite-wasm/worker/sqlite.worker?worker\";\n *\n * initializeSqliteWorker(SqliteWorker);\n * ```\n */\nexport function initializeSqliteWorker(\n\tWorkerConstructor: new () => Worker,\n\tdebug: boolean = false,\n): Promise<SqliteWorkerManager> {\n\t// Return existing init promise if initialization is in progress\n\tif (initPromise) {\n\t\treturn initPromise;\n\t}\n\n\t// Return resolved promise if already initialized\n\tif (globalManager) {\n\t\treturn Promise.resolve(globalManager);\n\t}\n\n\t// Start initialization\n\tinitPromise = (async () => {\n\t\tconst worker = new WorkerConstructor();\n\t\tconst manager = new SqliteWorkerManager(worker, debug);\n\t\tglobalManager = manager;\n\n\t\t// Wait for the worker to actually send its Ready message\n\t\tawait manager.ready;\n\n\t\treturn manager;\n\t})();\n\n\treturn initPromise;\n}\n\n/**\n * Get the global SQLite worker manager.\n * Throws an error if not initialized.\n */\nexport function getSqliteWorkerManager(): SqliteWorkerManager {\n\tif (!globalManager) {\n\t\tthrow new Error(\n\t\t\t\"SQLite worker manager not initialized. Call initializeSqliteWorker() first.\",\n\t\t);\n\t}\n\treturn globalManager;\n}\n\n/**\n * Check if the global manager has been initialized\n */\nexport function isSqliteWorkerInitialized(): boolean {\n\treturn globalManager !== null;\n}\n\n/**\n * Reset the global manager (mainly for testing)\n */\nexport function resetSqliteWorkerManager() {\n\tif (globalManager) {\n\t\tglobalManager.terminate();\n\t}\n\tglobalManager = null;\n\tinitPromise = null;\n}\n"]}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { drizzle } from 'drizzle-orm/sqlite-proxy';
|
|
2
|
+
|
|
3
|
+
// src/drizzle/worker.ts
|
|
4
|
+
var drizzleSqliteWasmWorker = (client, config = {}) => {
|
|
5
|
+
return drizzle(async (sql, params, method) => {
|
|
6
|
+
return new Promise((resolve, reject) => {
|
|
7
|
+
client.performRemoteCallback(
|
|
8
|
+
{
|
|
9
|
+
sql,
|
|
10
|
+
params,
|
|
11
|
+
method
|
|
12
|
+
},
|
|
13
|
+
resolve,
|
|
14
|
+
reject
|
|
15
|
+
);
|
|
16
|
+
});
|
|
17
|
+
}, config);
|
|
18
|
+
};
|
|
19
|
+
var createInstrumentedDrizzle = (client, config = {}, interceptor) => {
|
|
20
|
+
return drizzle(async (sql, params, method) => {
|
|
21
|
+
const startTime = Date.now();
|
|
22
|
+
const result = await new Promise((resolve, reject) => {
|
|
23
|
+
client.performRemoteCallback(
|
|
24
|
+
{
|
|
25
|
+
sql,
|
|
26
|
+
params,
|
|
27
|
+
method
|
|
28
|
+
},
|
|
29
|
+
resolve,
|
|
30
|
+
reject
|
|
31
|
+
);
|
|
32
|
+
});
|
|
33
|
+
if (interceptor?.onOperation) {
|
|
34
|
+
const sqlLower = sql.toLowerCase().trim();
|
|
35
|
+
let context = "Direct Drizzle query";
|
|
36
|
+
if (sqlLower.startsWith("select")) {
|
|
37
|
+
const fromMatch = sql.match(/from\s+["']?(\w+)["']?/i);
|
|
38
|
+
const tableName = fromMatch?.[1] || "unknown";
|
|
39
|
+
const hasLimit = /limit\s+(\d+|\?|\$\d+)/i.test(sql);
|
|
40
|
+
const hasOffset = /offset\s+(\d+|\?|\$\d+)/i.test(sql);
|
|
41
|
+
const hasOrderBy = /order\s+by/i.test(sql);
|
|
42
|
+
if (hasLimit || hasOffset) {
|
|
43
|
+
let limitVal = "?";
|
|
44
|
+
let offsetVal = "0";
|
|
45
|
+
const literalLimit = sql.match(/limit\s+(\d+)/i);
|
|
46
|
+
const literalOffset = sql.match(/offset\s+(\d+)/i);
|
|
47
|
+
if (literalLimit) {
|
|
48
|
+
limitVal = literalLimit[1];
|
|
49
|
+
} else if (params && params.length > 0) {
|
|
50
|
+
if (hasLimit && hasOffset && params.length >= 2) {
|
|
51
|
+
limitVal = String(params[params.length - 2]);
|
|
52
|
+
offsetVal = String(params[params.length - 1]);
|
|
53
|
+
} else if (hasLimit && params.length >= 1) {
|
|
54
|
+
limitVal = String(params[params.length - 1]);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
if (literalOffset) {
|
|
58
|
+
offsetVal = literalOffset[1];
|
|
59
|
+
}
|
|
60
|
+
context = `SELECT with LIMIT ${limitVal} OFFSET ${offsetVal}`;
|
|
61
|
+
} else if (hasOrderBy) {
|
|
62
|
+
context = `SELECT all from ${tableName} (ordered)`;
|
|
63
|
+
} else {
|
|
64
|
+
context = `SELECT all from ${tableName}`;
|
|
65
|
+
}
|
|
66
|
+
const operation = {
|
|
67
|
+
type: "raw-query",
|
|
68
|
+
sql,
|
|
69
|
+
params,
|
|
70
|
+
method,
|
|
71
|
+
rowCount: result.rows?.length ?? 0,
|
|
72
|
+
context,
|
|
73
|
+
timestamp: startTime
|
|
74
|
+
};
|
|
75
|
+
interceptor.onOperation(operation);
|
|
76
|
+
} else if (sqlLower.startsWith("insert")) {
|
|
77
|
+
const intoMatch = sql.match(/into\s+["']?(\w+)["']?/i);
|
|
78
|
+
context = `INSERT into ${intoMatch?.[1] || "unknown"}`;
|
|
79
|
+
const operation = {
|
|
80
|
+
type: "raw-query",
|
|
81
|
+
sql,
|
|
82
|
+
params,
|
|
83
|
+
method,
|
|
84
|
+
rowCount: 0,
|
|
85
|
+
context,
|
|
86
|
+
timestamp: startTime
|
|
87
|
+
};
|
|
88
|
+
interceptor.onOperation(operation);
|
|
89
|
+
} else if (sqlLower.startsWith("update")) {
|
|
90
|
+
const tableMatch = sql.match(/update\s+["']?(\w+)["']?/i);
|
|
91
|
+
context = `UPDATE ${tableMatch?.[1] || "unknown"}`;
|
|
92
|
+
const operation = {
|
|
93
|
+
type: "raw-query",
|
|
94
|
+
sql,
|
|
95
|
+
params,
|
|
96
|
+
method,
|
|
97
|
+
rowCount: 0,
|
|
98
|
+
context,
|
|
99
|
+
timestamp: startTime
|
|
100
|
+
};
|
|
101
|
+
interceptor.onOperation(operation);
|
|
102
|
+
} else if (sqlLower.startsWith("delete")) {
|
|
103
|
+
const fromMatch = sql.match(/from\s+["']?(\w+)["']?/i);
|
|
104
|
+
context = `DELETE from ${fromMatch?.[1] || "unknown"}`;
|
|
105
|
+
const operation = {
|
|
106
|
+
type: "raw-query",
|
|
107
|
+
sql,
|
|
108
|
+
params,
|
|
109
|
+
method,
|
|
110
|
+
rowCount: 0,
|
|
111
|
+
context,
|
|
112
|
+
timestamp: startTime
|
|
113
|
+
};
|
|
114
|
+
interceptor.onOperation(operation);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return result;
|
|
118
|
+
}, config);
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
export { createInstrumentedDrizzle, drizzleSqliteWasmWorker };
|
|
122
|
+
//# sourceMappingURL=chunk-FRONXNEA.js.map
|
|
123
|
+
//# sourceMappingURL=chunk-FRONXNEA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/drizzle/worker.ts"],"names":["drizzleSqliteProxy"],"mappings":"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","file":"chunk-FRONXNEA.js","sourcesContent":["import type { DrizzleConfig } from \"drizzle-orm\";\nimport { drizzle as drizzleSqliteProxy } from \"drizzle-orm/sqlite-proxy\";\nimport type { ISqliteWorkerClient } from \"../worker/client\";\nimport type {\n\tSQLInterceptor,\n\tSQLOperation,\n} from \"../collections/sqlite-collection\";\n\nexport const drizzleSqliteWasmWorker = <\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n>(\n\tclient: ISqliteWorkerClient,\n\tconfig: DrizzleConfig<TSchema> = {},\n) => {\n\treturn drizzleSqliteProxy<TSchema>(async (sql, params, method) => {\n\t\treturn new Promise<{ rows: unknown[] }>((resolve, reject) => {\n\t\t\tclient.performRemoteCallback(\n\t\t\t\t{\n\t\t\t\t\tsql,\n\t\t\t\t\tparams,\n\t\t\t\t\tmethod,\n\t\t\t\t},\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t);\n\t\t});\n\t}, config);\n};\n\n/**\n * Creates an instrumented Drizzle instance that logs all SQL queries.\n * This wraps the standard drizzleSqliteWasmWorker to intercept every query.\n */\nexport const createInstrumentedDrizzle = <\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n>(\n\tclient: ISqliteWorkerClient,\n\tconfig: DrizzleConfig<TSchema> = {},\n\tinterceptor?: SQLInterceptor,\n) => {\n\treturn drizzleSqliteProxy<TSchema>(async (sql, params, method) => {\n\t\tconst startTime = Date.now();\n\n\t\tconst result = await new Promise<{ rows: unknown[] }>((resolve, reject) => {\n\t\t\tclient.performRemoteCallback(\n\t\t\t\t{\n\t\t\t\t\tsql,\n\t\t\t\t\tparams,\n\t\t\t\t\tmethod,\n\t\t\t\t},\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t);\n\t\t});\n\n\t\t// Log the operation if interceptor is provided\n\t\tif (interceptor?.onOperation) {\n\t\t\t// Parse SQL to determine context\n\t\t\tconst sqlLower = sql.toLowerCase().trim();\n\t\t\tlet context = \"Direct Drizzle query\";\n\n\t\t\tif (sqlLower.startsWith(\"select\")) {\n\t\t\t\t// Extract table name from SELECT query\n\t\t\t\tconst fromMatch = sql.match(/from\\s+[\"']?(\\w+)[\"']?/i);\n\t\t\t\tconst tableName = fromMatch?.[1] || \"unknown\";\n\n\t\t\t\t// Check for LIMIT/OFFSET - handle both literal values and ? placeholders\n\t\t\t\t// Drizzle uses parameterized queries, so we need to check for `limit ?` style\n\t\t\t\tconst hasLimit = /limit\\s+(\\d+|\\?|\\$\\d+)/i.test(sql);\n\t\t\t\tconst hasOffset = /offset\\s+(\\d+|\\?|\\$\\d+)/i.test(sql);\n\t\t\t\tconst hasOrderBy = /order\\s+by/i.test(sql);\n\n\t\t\t\tif (hasLimit || hasOffset) {\n\t\t\t\t\t// Extract actual values from params if using placeholders\n\t\t\t\t\t// Drizzle typically puts LIMIT as second-to-last param, OFFSET as last\n\t\t\t\t\tlet limitVal = \"?\";\n\t\t\t\t\tlet offsetVal = \"0\";\n\n\t\t\t\t\t// Try to extract literal values first\n\t\t\t\t\tconst literalLimit = sql.match(/limit\\s+(\\d+)/i);\n\t\t\t\t\tconst literalOffset = sql.match(/offset\\s+(\\d+)/i);\n\n\t\t\t\t\tif (literalLimit) {\n\t\t\t\t\t\tlimitVal = literalLimit[1];\n\t\t\t\t\t} else if (params && params.length > 0) {\n\t\t\t\t\t\t// For parameterized queries, try to infer from params\n\t\t\t\t\t\t// LIMIT/OFFSET are usually at the end\n\t\t\t\t\t\tif (hasLimit && hasOffset && params.length >= 2) {\n\t\t\t\t\t\t\tlimitVal = String(params[params.length - 2]);\n\t\t\t\t\t\t\toffsetVal = String(params[params.length - 1]);\n\t\t\t\t\t\t} else if (hasLimit && params.length >= 1) {\n\t\t\t\t\t\t\tlimitVal = String(params[params.length - 1]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (literalOffset) {\n\t\t\t\t\t\toffsetVal = literalOffset[1];\n\t\t\t\t\t}\n\n\t\t\t\t\tcontext = `SELECT with LIMIT ${limitVal} OFFSET ${offsetVal}`;\n\t\t\t\t} else if (hasOrderBy) {\n\t\t\t\t\tcontext = `SELECT all from ${tableName} (ordered)`;\n\t\t\t\t} else {\n\t\t\t\t\tcontext = `SELECT all from ${tableName}`;\n\t\t\t\t}\n\n\t\t\t\tconst operation: SQLOperation = {\n\t\t\t\t\ttype: \"raw-query\",\n\t\t\t\t\tsql,\n\t\t\t\t\tparams: params as unknown[],\n\t\t\t\t\tmethod,\n\t\t\t\t\trowCount: result.rows?.length ?? 0,\n\t\t\t\t\tcontext,\n\t\t\t\t\ttimestamp: startTime,\n\t\t\t\t};\n\t\t\t\tinterceptor.onOperation(operation);\n\t\t\t} else if (sqlLower.startsWith(\"insert\")) {\n\t\t\t\tconst intoMatch = sql.match(/into\\s+[\"']?(\\w+)[\"']?/i);\n\t\t\t\tcontext = `INSERT into ${intoMatch?.[1] || \"unknown\"}`;\n\n\t\t\t\tconst operation: SQLOperation = {\n\t\t\t\t\ttype: \"raw-query\",\n\t\t\t\t\tsql,\n\t\t\t\t\tparams: params as unknown[],\n\t\t\t\t\tmethod,\n\t\t\t\t\trowCount: 0,\n\t\t\t\t\tcontext,\n\t\t\t\t\ttimestamp: startTime,\n\t\t\t\t};\n\t\t\t\tinterceptor.onOperation(operation);\n\t\t\t} else if (sqlLower.startsWith(\"update\")) {\n\t\t\t\tconst tableMatch = sql.match(/update\\s+[\"']?(\\w+)[\"']?/i);\n\t\t\t\tcontext = `UPDATE ${tableMatch?.[1] || \"unknown\"}`;\n\n\t\t\t\tconst operation: SQLOperation = {\n\t\t\t\t\ttype: \"raw-query\",\n\t\t\t\t\tsql,\n\t\t\t\t\tparams: params as unknown[],\n\t\t\t\t\tmethod,\n\t\t\t\t\trowCount: 0,\n\t\t\t\t\tcontext,\n\t\t\t\t\ttimestamp: startTime,\n\t\t\t\t};\n\t\t\t\tinterceptor.onOperation(operation);\n\t\t\t} else if (sqlLower.startsWith(\"delete\")) {\n\t\t\t\tconst fromMatch = sql.match(/from\\s+[\"']?(\\w+)[\"']?/i);\n\t\t\t\tcontext = `DELETE from ${fromMatch?.[1] || \"unknown\"}`;\n\n\t\t\t\tconst operation: SQLOperation = {\n\t\t\t\t\ttype: \"raw-query\",\n\t\t\t\t\tsql,\n\t\t\t\t\tparams: params as unknown[],\n\t\t\t\t\tmethod,\n\t\t\t\t\trowCount: 0,\n\t\t\t\t\tcontext,\n\t\t\t\t\ttimestamp: startTime,\n\t\t\t\t};\n\t\t\t\tinterceptor.onOperation(operation);\n\t\t\t}\n\t\t}\n\n\t\treturn result;\n\t}, config);\n};\n"]}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { SqliteWasmWorkerOpenOptionsSchema } from './chunk-6LNYKOKR.js';
|
|
2
|
+
import z from 'zod';
|
|
3
|
+
|
|
4
|
+
var RemoteCallbackIdSchema = z.string().brand("remote-callback-id");
|
|
5
|
+
var DbIdSchema = z.string().brand("db-id");
|
|
6
|
+
var StartRequestIdSchema = z.string().brand("start-request-id");
|
|
7
|
+
var CheckpointIdSchema = z.string().brand("checkpoint-id");
|
|
8
|
+
var SqliteWorkerClientMessageType = /* @__PURE__ */ ((SqliteWorkerClientMessageType2) => {
|
|
9
|
+
SqliteWorkerClientMessageType2["Start"] = "start";
|
|
10
|
+
SqliteWorkerClientMessageType2["RemoteCallbackRequest"] = "remote-callback-request";
|
|
11
|
+
SqliteWorkerClientMessageType2["Checkpoint"] = "checkpoint";
|
|
12
|
+
return SqliteWorkerClientMessageType2;
|
|
13
|
+
})(SqliteWorkerClientMessageType || {});
|
|
14
|
+
var SqliteWorkerServerMessageType = /* @__PURE__ */ ((SqliteWorkerServerMessageType2) => {
|
|
15
|
+
SqliteWorkerServerMessageType2["Ready"] = "ready";
|
|
16
|
+
SqliteWorkerServerMessageType2["Started"] = "started";
|
|
17
|
+
SqliteWorkerServerMessageType2["RemoteCallbackResponse"] = "remote-callback-response";
|
|
18
|
+
SqliteWorkerServerMessageType2["RemoteCallbackError"] = "remote-callback-error";
|
|
19
|
+
SqliteWorkerServerMessageType2["CheckpointComplete"] = "checkpoint-complete";
|
|
20
|
+
SqliteWorkerServerMessageType2["CheckpointError"] = "checkpoint-error";
|
|
21
|
+
return SqliteWorkerServerMessageType2;
|
|
22
|
+
})(SqliteWorkerServerMessageType || {});
|
|
23
|
+
var RemoteCallbackRequestSchema = z.object({
|
|
24
|
+
type: z.literal("remote-callback-request" /* RemoteCallbackRequest */),
|
|
25
|
+
// AsyncRemoteCallback
|
|
26
|
+
// sql: string, params: any[], method: 'run' | 'all' | 'values' | 'get'
|
|
27
|
+
id: RemoteCallbackIdSchema,
|
|
28
|
+
dbId: DbIdSchema,
|
|
29
|
+
sql: z.string(),
|
|
30
|
+
params: z.array(z.any()),
|
|
31
|
+
method: z.enum(["run", "all", "values", "get"])
|
|
32
|
+
});
|
|
33
|
+
var CheckpointRequestSchema = z.object({
|
|
34
|
+
type: z.literal("checkpoint" /* Checkpoint */),
|
|
35
|
+
id: CheckpointIdSchema,
|
|
36
|
+
dbId: DbIdSchema
|
|
37
|
+
});
|
|
38
|
+
var SqliteWorkerClientMessageSchema = z.discriminatedUnion("type", [
|
|
39
|
+
z.object({
|
|
40
|
+
type: z.literal("start" /* Start */),
|
|
41
|
+
requestId: StartRequestIdSchema,
|
|
42
|
+
dbName: z.string(),
|
|
43
|
+
/** Applied on first open of this `dbName` in the worker process. */
|
|
44
|
+
openOptions: SqliteWasmWorkerOpenOptionsSchema.optional()
|
|
45
|
+
}),
|
|
46
|
+
RemoteCallbackRequestSchema,
|
|
47
|
+
CheckpointRequestSchema
|
|
48
|
+
]);
|
|
49
|
+
var RemoteCallbackResponseSchema = z.object({
|
|
50
|
+
type: z.literal("remote-callback-response" /* RemoteCallbackResponse */),
|
|
51
|
+
id: RemoteCallbackIdSchema,
|
|
52
|
+
rows: z.array(z.any())
|
|
53
|
+
});
|
|
54
|
+
var RemoteCallbackErrorServerMessageSchema = z.object({
|
|
55
|
+
type: z.literal("remote-callback-error" /* RemoteCallbackError */),
|
|
56
|
+
id: RemoteCallbackIdSchema,
|
|
57
|
+
error: z.string()
|
|
58
|
+
});
|
|
59
|
+
var CheckpointCompleteSchema = z.object({
|
|
60
|
+
type: z.literal("checkpoint-complete" /* CheckpointComplete */),
|
|
61
|
+
id: CheckpointIdSchema
|
|
62
|
+
});
|
|
63
|
+
var CheckpointErrorSchema = z.object({
|
|
64
|
+
type: z.literal("checkpoint-error" /* CheckpointError */),
|
|
65
|
+
id: CheckpointIdSchema,
|
|
66
|
+
error: z.string()
|
|
67
|
+
});
|
|
68
|
+
var sqliteWorkerServerMessage = z.discriminatedUnion("type", [
|
|
69
|
+
z.object({
|
|
70
|
+
type: z.literal("ready" /* Ready */)
|
|
71
|
+
}),
|
|
72
|
+
z.object({
|
|
73
|
+
type: z.literal("started" /* Started */),
|
|
74
|
+
requestId: StartRequestIdSchema,
|
|
75
|
+
dbId: DbIdSchema
|
|
76
|
+
}),
|
|
77
|
+
RemoteCallbackResponseSchema,
|
|
78
|
+
RemoteCallbackErrorServerMessageSchema,
|
|
79
|
+
CheckpointCompleteSchema,
|
|
80
|
+
CheckpointErrorSchema
|
|
81
|
+
]);
|
|
82
|
+
|
|
83
|
+
export { CheckpointCompleteSchema, CheckpointErrorSchema, CheckpointIdSchema, CheckpointRequestSchema, DbIdSchema, RemoteCallbackErrorServerMessageSchema, RemoteCallbackIdSchema, RemoteCallbackRequestSchema, RemoteCallbackResponseSchema, SqliteWorkerClientMessageSchema, SqliteWorkerClientMessageType, SqliteWorkerServerMessageType, StartRequestIdSchema, sqliteWorkerServerMessage };
|
|
84
|
+
//# sourceMappingURL=chunk-GVUNHU6J.js.map
|
|
85
|
+
//# sourceMappingURL=chunk-GVUNHU6J.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/worker/schema.ts"],"names":["SqliteWorkerClientMessageType","SqliteWorkerServerMessageType"],"mappings":"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","file":"chunk-GVUNHU6J.js","sourcesContent":["import z from \"zod\";\nimport { SqliteWasmWorkerOpenOptionsSchema } from \"./sqlite-open-options\";\n\nexport const RemoteCallbackIdSchema = z.string().brand(\"remote-callback-id\");\nexport type RemoteCallbackId = z.infer<typeof RemoteCallbackIdSchema>;\n\nexport const DbIdSchema = z.string().brand(\"db-id\");\nexport type DbId = z.infer<typeof DbIdSchema>;\n\nexport const StartRequestIdSchema = z.string().brand(\"start-request-id\");\nexport type StartRequestId = z.infer<typeof StartRequestIdSchema>;\n\nexport const CheckpointIdSchema = z.string().brand(\"checkpoint-id\");\nexport type CheckpointId = z.infer<typeof CheckpointIdSchema>;\n\nexport enum SqliteWorkerClientMessageType {\n\tStart = \"start\",\n\tRemoteCallbackRequest = \"remote-callback-request\",\n\tCheckpoint = \"checkpoint\",\n}\n\nexport enum SqliteWorkerServerMessageType {\n\tReady = \"ready\",\n\tStarted = \"started\",\n\tRemoteCallbackResponse = \"remote-callback-response\",\n\tRemoteCallbackError = \"remote-callback-error\",\n\tCheckpointComplete = \"checkpoint-complete\",\n\tCheckpointError = \"checkpoint-error\",\n}\n\nexport const RemoteCallbackRequestSchema = z.object({\n\ttype: z.literal(SqliteWorkerClientMessageType.RemoteCallbackRequest),\n\t// AsyncRemoteCallback\n\t// sql: string, params: any[], method: 'run' | 'all' | 'values' | 'get'\n\tid: RemoteCallbackIdSchema,\n\tdbId: DbIdSchema,\n\tsql: z.string(),\n\tparams: z.array(z.any()),\n\tmethod: z.enum([\"run\", \"all\", \"values\", \"get\"]),\n});\n\nexport type SqliteWorkerRemoteCallbackClientMessage = z.infer<\n\ttypeof RemoteCallbackRequestSchema\n>;\n\nexport const CheckpointRequestSchema = z.object({\n\ttype: z.literal(SqliteWorkerClientMessageType.Checkpoint),\n\tid: CheckpointIdSchema,\n\tdbId: DbIdSchema,\n});\n\nexport type CheckpointRequest = z.infer<typeof CheckpointRequestSchema>;\n\nexport const SqliteWorkerClientMessageSchema = z.discriminatedUnion(\"type\", [\n\tz.object({\n\t\ttype: z.literal(SqliteWorkerClientMessageType.Start),\n\t\trequestId: StartRequestIdSchema,\n\t\tdbName: z.string(),\n\t\t/** Applied on first open of this `dbName` in the worker process. */\n\t\topenOptions: SqliteWasmWorkerOpenOptionsSchema.optional(),\n\t}),\n\tRemoteCallbackRequestSchema,\n\tCheckpointRequestSchema,\n]);\n\nexport const RemoteCallbackResponseSchema = z.object({\n\ttype: z.literal(SqliteWorkerServerMessageType.RemoteCallbackResponse),\n\tid: RemoteCallbackIdSchema,\n\trows: z.array(z.any()),\n});\n\nexport const RemoteCallbackErrorServerMessageSchema = z.object({\n\ttype: z.literal(SqliteWorkerServerMessageType.RemoteCallbackError),\n\tid: RemoteCallbackIdSchema,\n\terror: z.string(),\n});\n\nexport const CheckpointCompleteSchema = z.object({\n\ttype: z.literal(SqliteWorkerServerMessageType.CheckpointComplete),\n\tid: CheckpointIdSchema,\n});\n\nexport const CheckpointErrorSchema = z.object({\n\ttype: z.literal(SqliteWorkerServerMessageType.CheckpointError),\n\tid: CheckpointIdSchema,\n\terror: z.string(),\n});\n\nexport const sqliteWorkerServerMessage = z.discriminatedUnion(\"type\", [\n\tz.object({\n\t\ttype: z.literal(SqliteWorkerServerMessageType.Ready),\n\t}),\n\tz.object({\n\t\ttype: z.literal(SqliteWorkerServerMessageType.Started),\n\t\trequestId: StartRequestIdSchema,\n\t\tdbId: DbIdSchema,\n\t}),\n\tRemoteCallbackResponseSchema,\n\tRemoteCallbackErrorServerMessageSchema,\n\tCheckpointCompleteSchema,\n\tCheckpointErrorSchema,\n]);\n\nexport type SqliteWorkerClientMessage = z.infer<\n\ttypeof SqliteWorkerClientMessageSchema\n>;\n\nexport type SqliteWorkerServerMessage = z.infer<\n\ttypeof sqliteWorkerServerMessage\n>;\n\nexport type SqliteClientRemoteCallbackServerMessage = z.infer<\n\ttypeof RemoteCallbackResponseSchema\n>;\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { DrizzleSqliteContext, useSqliteCollection } from './chunk-AEYHRJVN.js';
|
|
2
|
+
import { useContext } from 'react';
|
|
3
|
+
|
|
4
|
+
function useDrizzleSqlite() {
|
|
5
|
+
const context = useContext(
|
|
6
|
+
DrizzleSqliteContext
|
|
7
|
+
);
|
|
8
|
+
if (!context) {
|
|
9
|
+
throw new Error(
|
|
10
|
+
"useDrizzleSqlite must be used within a DrizzleSqliteProvider"
|
|
11
|
+
);
|
|
12
|
+
}
|
|
13
|
+
return {
|
|
14
|
+
drizzle: context.drizzle,
|
|
15
|
+
readyPromise: context.readyPromise,
|
|
16
|
+
useCollection: (tableName) => useSqliteCollection(context, tableName)
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export { useDrizzleSqlite };
|
|
21
|
+
//# sourceMappingURL=chunk-H2F2HZ2A.js.map
|
|
22
|
+
//# sourceMappingURL=chunk-H2F2HZ2A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/context/useDrizzleSqlite.ts"],"names":[],"mappings":";;;AAgBO,SAAS,gBAAA,GAEqB;AACpC,EAAA,MAAM,OAAA,GAAU,UAAA;AAAA,IACf;AAAA,GACD;AAEA,EAAA,IAAI,CAAC,OAAA,EAAS;AACb,IAAA,MAAM,IAAI,KAAA;AAAA,MACT;AAAA,KACD;AAAA,EACD;AAEA,EAAA,OAAO;AAAA,IACN,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,cAAc,OAAA,CAAQ,YAAA;AAAA,IACtB,aAAA,EAAe,CACd,SAAA,KACI,mBAAA,CAAoB,SAAS,SAAS;AAAA,GAC5C;AACD","file":"chunk-H2F2HZ2A.js","sourcesContent":["import { useContext } from \"react\";\nimport type { DrizzleSqliteContextValue } from \"./DrizzleSqliteProvider\";\nimport {\n\tDrizzleSqliteContext,\n\tuseSqliteCollection,\n} from \"./DrizzleSqliteProvider\";\nimport type { ValidTableNames } from \"../collections/sqlite-collection\";\n\nexport type UseDrizzleSqliteReturn<TSchema extends Record<string, unknown>> = {\n\tdrizzle: DrizzleSqliteContextValue<TSchema>[\"drizzle\"];\n\treadyPromise: DrizzleSqliteContextValue<TSchema>[\"readyPromise\"];\n\tuseCollection: <TTableName extends string & ValidTableNames<TSchema>>(\n\t\ttableName: TTableName,\n\t) => ReturnType<typeof useSqliteCollection<TSchema, TTableName>>;\n};\n\nexport function useDrizzleSqlite<\n\tTSchema extends Record<string, unknown>,\n>(): UseDrizzleSqliteReturn<TSchema> {\n\tconst context = useContext(\n\t\tDrizzleSqliteContext,\n\t) as DrizzleSqliteContextValue<TSchema> | null;\n\n\tif (!context) {\n\t\tthrow new Error(\n\t\t\t\"useDrizzleSqlite must be used within a DrizzleSqliteProvider\",\n\t\t);\n\t}\n\n\treturn {\n\t\tdrizzle: context.drizzle,\n\t\treadyPromise: context.readyPromise,\n\t\tuseCollection: <TTableName extends string & ValidTableNames<TSchema>>(\n\t\t\ttableName: TTableName,\n\t\t) => useSqliteCollection(context, tableName),\n\t};\n}\n"]}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { sql } from 'drizzle-orm';
|
|
2
|
+
|
|
3
|
+
// src/migration/migrator.ts
|
|
4
|
+
function readMigrationFiles({
|
|
5
|
+
journal,
|
|
6
|
+
migrations
|
|
7
|
+
}) {
|
|
8
|
+
const migrationQueries = [];
|
|
9
|
+
for (const journalEntry of journal.entries) {
|
|
10
|
+
const query = migrations[`m${journalEntry.idx.toString().padStart(4, "0")}`];
|
|
11
|
+
if (!query) {
|
|
12
|
+
throw new Error(`Missing migration: ${journalEntry.tag}`);
|
|
13
|
+
}
|
|
14
|
+
try {
|
|
15
|
+
const result = query.split("--> statement-breakpoint").map((it) => {
|
|
16
|
+
return it;
|
|
17
|
+
});
|
|
18
|
+
migrationQueries.push({
|
|
19
|
+
sql: result,
|
|
20
|
+
bps: journalEntry.breakpoints,
|
|
21
|
+
folderMillis: journalEntry.when,
|
|
22
|
+
hash: ""
|
|
23
|
+
});
|
|
24
|
+
} catch {
|
|
25
|
+
throw new Error(`Failed to parse migration: ${journalEntry.tag}`);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
return migrationQueries;
|
|
29
|
+
}
|
|
30
|
+
async function customSqliteMigrate(db, config, debug = false) {
|
|
31
|
+
if (debug) {
|
|
32
|
+
console.log(
|
|
33
|
+
`[${(/* @__PURE__ */ new Date()).toISOString()}] [SqliteWasmMigrator] migrating database`,
|
|
34
|
+
config
|
|
35
|
+
);
|
|
36
|
+
}
|
|
37
|
+
const migrations = readMigrationFiles(config);
|
|
38
|
+
let currentStatement = null;
|
|
39
|
+
let migrationCount = 0;
|
|
40
|
+
let success = true;
|
|
41
|
+
await db.transaction(async (tx) => {
|
|
42
|
+
try {
|
|
43
|
+
const migrationsTable = "__drizzle_migrations";
|
|
44
|
+
await tx.run(sql`
|
|
45
|
+
CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (
|
|
46
|
+
id SERIAL PRIMARY KEY,
|
|
47
|
+
hash text NOT NULL,
|
|
48
|
+
created_at numeric
|
|
49
|
+
)
|
|
50
|
+
`);
|
|
51
|
+
const dbMigrations = await tx.values(
|
|
52
|
+
sql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`
|
|
53
|
+
);
|
|
54
|
+
const lastDbMigration = dbMigrations[0] ?? void 0;
|
|
55
|
+
if (debug) {
|
|
56
|
+
console.log(
|
|
57
|
+
`[${(/* @__PURE__ */ new Date()).toISOString()}] [SqliteWasmMigrator] last db migration`,
|
|
58
|
+
lastDbMigration
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
for (const migration of migrations) {
|
|
62
|
+
if (!lastDbMigration || Number(lastDbMigration[2]) < migration.folderMillis) {
|
|
63
|
+
for (const stmt of migration.sql) {
|
|
64
|
+
currentStatement = stmt;
|
|
65
|
+
if (debug) {
|
|
66
|
+
console.log(
|
|
67
|
+
`[${(/* @__PURE__ */ new Date()).toISOString()}] [SqliteWasmMigrator] running migration`,
|
|
68
|
+
stmt
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
await tx.run(sql.raw(stmt));
|
|
72
|
+
currentStatement = null;
|
|
73
|
+
}
|
|
74
|
+
await tx.run(
|
|
75
|
+
sql`INSERT INTO ${sql.identifier(
|
|
76
|
+
migrationsTable
|
|
77
|
+
)} ("hash", "created_at") VALUES(${migration.hash}, ${migration.folderMillis})`
|
|
78
|
+
);
|
|
79
|
+
migrationCount++;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
} catch (error) {
|
|
83
|
+
const e = error instanceof Error ? error : new Error(String(error));
|
|
84
|
+
console.error("[Sqlite WASM Migrator] Database migration failed:", {
|
|
85
|
+
error: e,
|
|
86
|
+
errorMessage: e.message,
|
|
87
|
+
errorStack: e.stack,
|
|
88
|
+
migrations: Object.keys(migrations),
|
|
89
|
+
...currentStatement && { failedStatement: currentStatement }
|
|
90
|
+
});
|
|
91
|
+
tx.rollback();
|
|
92
|
+
success = false;
|
|
93
|
+
throw e;
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
if (debug) {
|
|
97
|
+
if (!success) {
|
|
98
|
+
console.log(
|
|
99
|
+
`[${(/* @__PURE__ */ new Date()).toISOString()}] [SqliteWasmMigrator] migration failed.`
|
|
100
|
+
);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
if (migrationCount > 0) {
|
|
104
|
+
console.log(
|
|
105
|
+
`[${(/* @__PURE__ */ new Date()).toISOString()}] [SqliteWasmMigrator] migration completed. migrations count: ${migrationCount} migrations applied.`
|
|
106
|
+
);
|
|
107
|
+
} else {
|
|
108
|
+
console.log(
|
|
109
|
+
`[${(/* @__PURE__ */ new Date()).toISOString()}] [SqliteWasmMigrator] no migrations applied.`
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export { customSqliteMigrate };
|
|
116
|
+
//# sourceMappingURL=chunk-NSPVPJKE.js.map
|
|
117
|
+
//# sourceMappingURL=chunk-NSPVPJKE.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/migration/migrator.ts"],"names":[],"mappings":"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","file":"chunk-NSPVPJKE.js","sourcesContent":["// Adapted from https://github.com/drizzle-team/drizzle-orm/blob/main/drizzle-orm/src/durable-sqlite/migrator.ts\n// Adaptation date: 26/10/2025 20:28 commit 9cf0ed2\n\nimport { sql } from \"drizzle-orm\";\nimport type { MigrationMeta } from \"drizzle-orm/migrator\";\nimport type { SqliteRemoteDatabase } from \"drizzle-orm/sqlite-proxy\";\nimport type { migrate as durableSqliteMigrate } from \"drizzle-orm/durable-sqlite/migrator\";\n\nexport type DurableSqliteMigrationConfig = Parameters<\n\ttypeof durableSqliteMigrate\n>[1];\n\nfunction readMigrationFiles({\n\tjournal,\n\tmigrations,\n}: DurableSqliteMigrationConfig): MigrationMeta[] {\n\tconst migrationQueries: MigrationMeta[] = [];\n\n\tfor (const journalEntry of journal.entries) {\n\t\tconst query =\n\t\t\tmigrations[`m${journalEntry.idx.toString().padStart(4, \"0\")}`];\n\n\t\tif (!query) {\n\t\t\tthrow new Error(`Missing migration: ${journalEntry.tag}`);\n\t\t}\n\n\t\ttry {\n\t\t\tconst result = query.split(\"--> statement-breakpoint\").map((it) => {\n\t\t\t\treturn it;\n\t\t\t});\n\n\t\t\tmigrationQueries.push({\n\t\t\t\tsql: result,\n\t\t\t\tbps: journalEntry.breakpoints,\n\t\t\t\tfolderMillis: journalEntry.when,\n\t\t\t\thash: \"\",\n\t\t\t});\n\t\t} catch {\n\t\t\tthrow new Error(`Failed to parse migration: ${journalEntry.tag}`);\n\t\t}\n\t}\n\n\treturn migrationQueries;\n}\n\nexport async function customSqliteMigrate<\n\tTSchema extends Record<string, unknown>,\n>(\n\tdb: SqliteRemoteDatabase<TSchema>,\n\tconfig: DurableSqliteMigrationConfig,\n\tdebug: boolean = false,\n): Promise<void> {\n\tif (debug) {\n\t\tconsole.log(\n\t\t\t`[${new Date().toISOString()}] [SqliteWasmMigrator] migrating database`,\n\t\t\tconfig,\n\t\t);\n\t}\n\n\tconst migrations = readMigrationFiles(config);\n\tlet currentStatement: string | null = null;\n\n\tlet migrationCount = 0;\n\tlet success = true;\n\n\tawait db.transaction(async (tx) => {\n\t\ttry {\n\t\t\tconst migrationsTable = \"__drizzle_migrations\";\n\n\t\t\tawait tx.run(sql`\n\t\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\t\thash text NOT NULL,\n\t\t\t\t\tcreated_at numeric\n\t\t\t\t)\n\t\t\t`);\n\n\t\t\tconst dbMigrations = await tx.values<[number, string, string]>(\n\t\t\t\tsql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`,\n\t\t\t);\n\n\t\t\tconst lastDbMigration = dbMigrations[0] ?? undefined;\n\n\t\t\tif (debug) {\n\t\t\t\tconsole.log(\n\t\t\t\t\t`[${new Date().toISOString()}] [SqliteWasmMigrator] last db migration`,\n\t\t\t\t\tlastDbMigration,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tfor (const migration of migrations) {\n\t\t\t\tif (\n\t\t\t\t\t!lastDbMigration ||\n\t\t\t\t\tNumber(lastDbMigration[2]) < migration.folderMillis\n\t\t\t\t) {\n\t\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\t\tcurrentStatement = stmt;\n\t\t\t\t\t\tif (debug) {\n\t\t\t\t\t\t\tconsole.log(\n\t\t\t\t\t\t\t\t`[${new Date().toISOString()}] [SqliteWasmMigrator] running migration`,\n\t\t\t\t\t\t\t\tstmt,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait tx.run(sql.raw(stmt));\n\t\t\t\t\t\tcurrentStatement = null;\n\t\t\t\t\t}\n\t\t\t\t\tawait tx.run(\n\t\t\t\t\t\tsql`INSERT INTO ${sql.identifier(\n\t\t\t\t\t\t\tmigrationsTable,\n\t\t\t\t\t\t)} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t\t);\n\t\t\t\t\tmigrationCount++;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (error: unknown) {\n\t\t\tconst e = error instanceof Error ? error : new Error(String(error));\n\t\t\tconsole.error(\"[Sqlite WASM Migrator] Database migration failed:\", {\n\t\t\t\terror: e,\n\t\t\t\terrorMessage: e.message,\n\t\t\t\terrorStack: e.stack,\n\t\t\t\tmigrations: Object.keys(migrations),\n\t\t\t\t...(currentStatement && { failedStatement: currentStatement }),\n\t\t\t});\n\t\t\ttx.rollback();\n\t\t\tsuccess = false;\n\t\t\tthrow e;\n\t\t}\n\t});\n\n\tif (debug) {\n\t\tif (!success) {\n\t\t\tconsole.log(\n\t\t\t\t`[${new Date().toISOString()}] [SqliteWasmMigrator] migration failed.`,\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (migrationCount > 0) {\n\t\t\tconsole.log(\n\t\t\t\t`[${new Date().toISOString()}] [SqliteWasmMigrator] migration completed. migrations count: ${migrationCount} migrations applied.`,\n\t\t\t);\n\t\t} else {\n\t\t\tconsole.log(\n\t\t\t\t`[${new Date().toISOString()}] [SqliteWasmMigrator] no migrations applied.`,\n\t\t\t);\n\t\t}\n\t}\n}\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { handleRemoteCallback } from './chunk-BJDPMGFF.js';
|
|
2
|
+
import { drizzle } from 'drizzle-orm/sqlite-proxy';
|
|
3
|
+
|
|
4
|
+
var drizzleSqliteWasm = (sqliteDb, config = {}, debug) => {
|
|
5
|
+
return drizzle(async (sql, params, method) => {
|
|
6
|
+
const result = await handleRemoteCallback({
|
|
7
|
+
sqliteDb,
|
|
8
|
+
sql,
|
|
9
|
+
params,
|
|
10
|
+
method,
|
|
11
|
+
debug
|
|
12
|
+
});
|
|
13
|
+
if (result.success) {
|
|
14
|
+
return result.result;
|
|
15
|
+
}
|
|
16
|
+
throw new Error(result.error);
|
|
17
|
+
}, config);
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export { drizzleSqliteWasm };
|
|
21
|
+
//# sourceMappingURL=chunk-TZP4AIBR.js.map
|
|
22
|
+
//# sourceMappingURL=chunk-TZP4AIBR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/drizzle/direct.ts"],"names":["drizzleSqliteProxy"],"mappings":";;;AAKO,IAAM,oBAAoB,CAGhC,QAAA,EACA,MAAA,GAAiC,IACjC,KAAA,KACI;AACJ,EAAA,OAAOA,OAAA,CAA4B,OAAO,GAAA,EAAK,MAAA,EAAQ,MAAA,KAAW;AACjE,IAAA,MAAM,MAAA,GAAS,MAAM,oBAAA,CAAqB;AAAA,MACzC,QAAA;AAAA,MACA,GAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACA,CAAA;AACD,IAAA,IAAI,OAAO,OAAA,EAAS;AACnB,MAAA,OAAO,MAAA,CAAO,MAAA;AAAA,IACf;AAEA,IAAA,MAAM,IAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAAA,EAC7B,GAAG,MAAM,CAAA;AACV","file":"chunk-TZP4AIBR.js","sourcesContent":["import type { Database } from \"../types\";\nimport type { DrizzleConfig } from \"drizzle-orm\";\nimport { drizzle as drizzleSqliteProxy } from \"drizzle-orm/sqlite-proxy\";\nimport { handleRemoteCallback } from \"./handle-callback\";\n\nexport const drizzleSqliteWasm = <\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n>(\n\tsqliteDb: Database,\n\tconfig: DrizzleConfig<TSchema> = {},\n\tdebug?: boolean,\n) => {\n\treturn drizzleSqliteProxy<TSchema>(async (sql, params, method) => {\n\t\tconst result = await handleRemoteCallback({\n\t\t\tsqliteDb,\n\t\t\tsql,\n\t\t\tparams,\n\t\t\tmethod,\n\t\t\tdebug,\n\t\t});\n\t\tif (result.success) {\n\t\t\treturn result.result;\n\t\t}\n\t\t// If the callback failed, throw an error for drizzle to handle\n\t\tthrow new Error(result.error);\n\t}, config);\n};\n"]}
|