@tanstack/tauri-db-sqlite-persistence 0.2.32 → 0.2.34
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/dist/cjs/tauri-persistence.cjs +3 -1
- package/dist/cjs/tauri-persistence.cjs.map +1 -1
- package/dist/cjs/tauri-sql-driver.cjs.map +1 -1
- package/dist/cjs/tauri-sql-driver.d.cts +0 -1
- package/dist/esm/tauri-persistence.js +3 -1
- package/dist/esm/tauri-persistence.js.map +1 -1
- package/dist/esm/tauri-sql-driver.d.ts +0 -1
- package/dist/esm/tauri-sql-driver.js.map +1 -1
- package/package.json +2 -2
- package/src/tauri-persistence.ts +2 -0
- package/src/tauri-sql-driver.ts +0 -6
|
@@ -34,7 +34,9 @@ function resolveAdapterBaseOptions(options) {
|
|
|
34
34
|
return {
|
|
35
35
|
appliedTxPruneMaxRows: options.appliedTxPruneMaxRows ?? dbSqlitePersistenceCore.DEFAULT_APPLIED_TX_PRUNE_MAX_ROWS,
|
|
36
36
|
appliedTxPruneMaxAgeSeconds: options.appliedTxPruneMaxAgeSeconds ?? dbSqlitePersistenceCore.DEFAULT_APPLIED_TX_PRUNE_MAX_AGE_SECONDS,
|
|
37
|
-
pullSinceReloadThreshold: options.pullSinceReloadThreshold
|
|
37
|
+
pullSinceReloadThreshold: options.pullSinceReloadThreshold,
|
|
38
|
+
cacheGenerationClaimTtlMs: options.cacheGenerationClaimTtlMs,
|
|
39
|
+
now: options.now
|
|
38
40
|
};
|
|
39
41
|
}
|
|
40
42
|
function createTauriSQLitePersistence(options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tauri-persistence.cjs","sources":["../../src/tauri-persistence.ts"],"sourcesContent":["import {\n DEFAULT_APPLIED_TX_PRUNE_MAX_AGE_SECONDS,\n DEFAULT_APPLIED_TX_PRUNE_MAX_ROWS,\n SingleProcessCoordinator,\n createSQLiteCorePersistenceAdapter,\n} from '@tanstack/db-sqlite-persistence-core'\nimport { TauriSQLiteDriver } from './tauri-sql-driver'\nimport type {\n PersistedCollectionCoordinator,\n PersistedCollectionMode,\n PersistedCollectionPersistence,\n SQLiteCoreAdapterOptions,\n SQLiteDriver,\n} from '@tanstack/db-sqlite-persistence-core'\nimport type { TauriSQLiteDatabaseLike } from './tauri-sql-driver'\n\nexport type { TauriSQLiteDatabaseLike } from './tauri-sql-driver'\n\ntype TauriSQLiteCoreSchemaMismatchPolicy =\n `sync-present-reset` | `sync-absent-error` | `reset`\n\nexport type TauriSQLiteSchemaMismatchPolicy =\n TauriSQLiteCoreSchemaMismatchPolicy | `throw`\n\ntype TauriSQLitePersistenceBaseOptions = Omit<\n SQLiteCoreAdapterOptions,\n `driver` | `schemaVersion` | `schemaMismatchPolicy`\n> & {\n database: TauriSQLiteDatabaseLike\n coordinator?: PersistedCollectionCoordinator\n schemaMismatchPolicy?: TauriSQLiteSchemaMismatchPolicy\n}\n\nexport type TauriSQLitePersistenceOptions = TauriSQLitePersistenceBaseOptions\n\nconst tauriDriverCache = new WeakMap<\n TauriSQLiteDatabaseLike,\n TauriSQLiteDriver\n>()\n\nfunction normalizeSchemaMismatchPolicy(\n policy: TauriSQLiteSchemaMismatchPolicy,\n): TauriSQLiteCoreSchemaMismatchPolicy {\n if (policy === `throw`) {\n return `sync-absent-error`\n }\n\n return policy\n}\n\nfunction resolveSchemaMismatchPolicy(\n explicitPolicy: TauriSQLiteSchemaMismatchPolicy | undefined,\n mode: PersistedCollectionMode,\n): TauriSQLiteCoreSchemaMismatchPolicy {\n if (explicitPolicy) {\n return normalizeSchemaMismatchPolicy(explicitPolicy)\n }\n\n return mode === `sync-present` ? `sync-present-reset` : `sync-absent-error`\n}\n\nfunction createAdapterCacheKey(\n schemaMismatchPolicy: TauriSQLiteCoreSchemaMismatchPolicy,\n schemaVersion: number | undefined,\n): string {\n const schemaVersionKey =\n schemaVersion === undefined ? `schema:default` : `schema:${schemaVersion}`\n return `${schemaMismatchPolicy}|${schemaVersionKey}`\n}\n\nfunction createInternalSQLiteDriver(\n options: TauriSQLitePersistenceOptions,\n): SQLiteDriver {\n const cachedDriver = tauriDriverCache.get(options.database)\n if (cachedDriver) {\n return cachedDriver\n }\n\n const driver = new TauriSQLiteDriver({\n database: options.database,\n })\n tauriDriverCache.set(options.database, driver)\n return driver\n}\n\nfunction resolveAdapterBaseOptions(\n options: TauriSQLitePersistenceOptions,\n): Omit<\n SQLiteCoreAdapterOptions,\n `driver` | `schemaVersion` | `schemaMismatchPolicy`\n> {\n return {\n appliedTxPruneMaxRows:\n options.appliedTxPruneMaxRows ?? DEFAULT_APPLIED_TX_PRUNE_MAX_ROWS,\n appliedTxPruneMaxAgeSeconds:\n options.appliedTxPruneMaxAgeSeconds ??\n DEFAULT_APPLIED_TX_PRUNE_MAX_AGE_SECONDS,\n pullSinceReloadThreshold: options.pullSinceReloadThreshold,\n }\n}\n\nexport function createTauriSQLitePersistence(\n options: TauriSQLitePersistenceOptions,\n): PersistedCollectionPersistence {\n const { coordinator, schemaMismatchPolicy } = options\n const driver = createInternalSQLiteDriver(options)\n const adapterBaseOptions = resolveAdapterBaseOptions(options)\n const resolvedCoordinator = coordinator ?? new SingleProcessCoordinator()\n const adapterCache = new Map<\n string,\n ReturnType<typeof createSQLiteCorePersistenceAdapter>\n >()\n\n const getAdapterForCollection = (\n mode: PersistedCollectionMode,\n schemaVersion: number | undefined,\n ) => {\n const resolvedSchemaMismatchPolicy = resolveSchemaMismatchPolicy(\n schemaMismatchPolicy,\n mode,\n )\n const cacheKey = createAdapterCacheKey(\n resolvedSchemaMismatchPolicy,\n schemaVersion,\n )\n const cachedAdapter = adapterCache.get(cacheKey)\n if (cachedAdapter) {\n return cachedAdapter\n }\n\n const adapter = createSQLiteCorePersistenceAdapter({\n ...adapterBaseOptions,\n driver,\n schemaMismatchPolicy: resolvedSchemaMismatchPolicy,\n ...(schemaVersion === undefined ? {} : { schemaVersion }),\n })\n adapterCache.set(cacheKey, adapter)\n return adapter\n }\n\n const createCollectionPersistence = (\n mode: PersistedCollectionMode,\n schemaVersion: number | undefined,\n ): PersistedCollectionPersistence => ({\n adapter: getAdapterForCollection(mode, schemaVersion),\n coordinator: resolvedCoordinator,\n })\n\n const defaultPersistence = createCollectionPersistence(\n `sync-absent`,\n undefined,\n )\n\n return {\n ...defaultPersistence,\n resolvePersistenceForCollection: ({ mode, schemaVersion }) =>\n createCollectionPersistence(mode, schemaVersion),\n resolvePersistenceForMode: (mode) =>\n createCollectionPersistence(mode, undefined),\n }\n}\n"],"names":["TauriSQLiteDriver","DEFAULT_APPLIED_TX_PRUNE_MAX_ROWS","DEFAULT_APPLIED_TX_PRUNE_MAX_AGE_SECONDS","SingleProcessCoordinator","createSQLiteCorePersistenceAdapter"],"mappings":";;;;AAmCA,MAAM,uCAAuB,QAAA;AAK7B,SAAS,8BACP,QACqC;AACrC,MAAI,WAAW,SAAS;AACtB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,4BACP,gBACA,MACqC;AACrC,MAAI,gBAAgB;AAClB,WAAO,8BAA8B,cAAc;AAAA,EACrD;AAEA,SAAO,SAAS,iBAAiB,uBAAuB;AAC1D;AAEA,SAAS,sBACP,sBACA,eACQ;AACR,QAAM,mBACJ,kBAAkB,SAAY,mBAAmB,UAAU,aAAa;AAC1E,SAAO,GAAG,oBAAoB,IAAI,gBAAgB;AACpD;AAEA,SAAS,2BACP,SACc;AACd,QAAM,eAAe,iBAAiB,IAAI,QAAQ,QAAQ;AAC1D,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,IAAIA,iCAAkB;AAAA,IACnC,UAAU,QAAQ;AAAA,EAAA,CACnB;AACD,mBAAiB,IAAI,QAAQ,UAAU,MAAM;AAC7C,SAAO;AACT;AAEA,SAAS,0BACP,SAIA;AACA,SAAO;AAAA,IACL,uBACE,QAAQ,yBAAyBC,wBAAAA;AAAAA,IACnC,6BACE,QAAQ,+BACRC,wBAAAA;AAAAA,IACF,0BAA0B,QAAQ;AAAA,EAAA;
|
|
1
|
+
{"version":3,"file":"tauri-persistence.cjs","sources":["../../src/tauri-persistence.ts"],"sourcesContent":["import {\n DEFAULT_APPLIED_TX_PRUNE_MAX_AGE_SECONDS,\n DEFAULT_APPLIED_TX_PRUNE_MAX_ROWS,\n SingleProcessCoordinator,\n createSQLiteCorePersistenceAdapter,\n} from '@tanstack/db-sqlite-persistence-core'\nimport { TauriSQLiteDriver } from './tauri-sql-driver'\nimport type {\n PersistedCollectionCoordinator,\n PersistedCollectionMode,\n PersistedCollectionPersistence,\n SQLiteCoreAdapterOptions,\n SQLiteDriver,\n} from '@tanstack/db-sqlite-persistence-core'\nimport type { TauriSQLiteDatabaseLike } from './tauri-sql-driver'\n\nexport type { TauriSQLiteDatabaseLike } from './tauri-sql-driver'\n\ntype TauriSQLiteCoreSchemaMismatchPolicy =\n `sync-present-reset` | `sync-absent-error` | `reset`\n\nexport type TauriSQLiteSchemaMismatchPolicy =\n TauriSQLiteCoreSchemaMismatchPolicy | `throw`\n\ntype TauriSQLitePersistenceBaseOptions = Omit<\n SQLiteCoreAdapterOptions,\n `driver` | `schemaVersion` | `schemaMismatchPolicy`\n> & {\n database: TauriSQLiteDatabaseLike\n coordinator?: PersistedCollectionCoordinator\n schemaMismatchPolicy?: TauriSQLiteSchemaMismatchPolicy\n}\n\nexport type TauriSQLitePersistenceOptions = TauriSQLitePersistenceBaseOptions\n\nconst tauriDriverCache = new WeakMap<\n TauriSQLiteDatabaseLike,\n TauriSQLiteDriver\n>()\n\nfunction normalizeSchemaMismatchPolicy(\n policy: TauriSQLiteSchemaMismatchPolicy,\n): TauriSQLiteCoreSchemaMismatchPolicy {\n if (policy === `throw`) {\n return `sync-absent-error`\n }\n\n return policy\n}\n\nfunction resolveSchemaMismatchPolicy(\n explicitPolicy: TauriSQLiteSchemaMismatchPolicy | undefined,\n mode: PersistedCollectionMode,\n): TauriSQLiteCoreSchemaMismatchPolicy {\n if (explicitPolicy) {\n return normalizeSchemaMismatchPolicy(explicitPolicy)\n }\n\n return mode === `sync-present` ? `sync-present-reset` : `sync-absent-error`\n}\n\nfunction createAdapterCacheKey(\n schemaMismatchPolicy: TauriSQLiteCoreSchemaMismatchPolicy,\n schemaVersion: number | undefined,\n): string {\n const schemaVersionKey =\n schemaVersion === undefined ? `schema:default` : `schema:${schemaVersion}`\n return `${schemaMismatchPolicy}|${schemaVersionKey}`\n}\n\nfunction createInternalSQLiteDriver(\n options: TauriSQLitePersistenceOptions,\n): SQLiteDriver {\n const cachedDriver = tauriDriverCache.get(options.database)\n if (cachedDriver) {\n return cachedDriver\n }\n\n const driver = new TauriSQLiteDriver({\n database: options.database,\n })\n tauriDriverCache.set(options.database, driver)\n return driver\n}\n\nfunction resolveAdapterBaseOptions(\n options: TauriSQLitePersistenceOptions,\n): Omit<\n SQLiteCoreAdapterOptions,\n `driver` | `schemaVersion` | `schemaMismatchPolicy`\n> {\n return {\n appliedTxPruneMaxRows:\n options.appliedTxPruneMaxRows ?? DEFAULT_APPLIED_TX_PRUNE_MAX_ROWS,\n appliedTxPruneMaxAgeSeconds:\n options.appliedTxPruneMaxAgeSeconds ??\n DEFAULT_APPLIED_TX_PRUNE_MAX_AGE_SECONDS,\n pullSinceReloadThreshold: options.pullSinceReloadThreshold,\n cacheGenerationClaimTtlMs: options.cacheGenerationClaimTtlMs,\n now: options.now,\n }\n}\n\nexport function createTauriSQLitePersistence(\n options: TauriSQLitePersistenceOptions,\n): PersistedCollectionPersistence {\n const { coordinator, schemaMismatchPolicy } = options\n const driver = createInternalSQLiteDriver(options)\n const adapterBaseOptions = resolveAdapterBaseOptions(options)\n const resolvedCoordinator = coordinator ?? new SingleProcessCoordinator()\n const adapterCache = new Map<\n string,\n ReturnType<typeof createSQLiteCorePersistenceAdapter>\n >()\n\n const getAdapterForCollection = (\n mode: PersistedCollectionMode,\n schemaVersion: number | undefined,\n ) => {\n const resolvedSchemaMismatchPolicy = resolveSchemaMismatchPolicy(\n schemaMismatchPolicy,\n mode,\n )\n const cacheKey = createAdapterCacheKey(\n resolvedSchemaMismatchPolicy,\n schemaVersion,\n )\n const cachedAdapter = adapterCache.get(cacheKey)\n if (cachedAdapter) {\n return cachedAdapter\n }\n\n const adapter = createSQLiteCorePersistenceAdapter({\n ...adapterBaseOptions,\n driver,\n schemaMismatchPolicy: resolvedSchemaMismatchPolicy,\n ...(schemaVersion === undefined ? {} : { schemaVersion }),\n })\n adapterCache.set(cacheKey, adapter)\n return adapter\n }\n\n const createCollectionPersistence = (\n mode: PersistedCollectionMode,\n schemaVersion: number | undefined,\n ): PersistedCollectionPersistence => ({\n adapter: getAdapterForCollection(mode, schemaVersion),\n coordinator: resolvedCoordinator,\n })\n\n const defaultPersistence = createCollectionPersistence(\n `sync-absent`,\n undefined,\n )\n\n return {\n ...defaultPersistence,\n resolvePersistenceForCollection: ({ mode, schemaVersion }) =>\n createCollectionPersistence(mode, schemaVersion),\n resolvePersistenceForMode: (mode) =>\n createCollectionPersistence(mode, undefined),\n }\n}\n"],"names":["TauriSQLiteDriver","DEFAULT_APPLIED_TX_PRUNE_MAX_ROWS","DEFAULT_APPLIED_TX_PRUNE_MAX_AGE_SECONDS","SingleProcessCoordinator","createSQLiteCorePersistenceAdapter"],"mappings":";;;;AAmCA,MAAM,uCAAuB,QAAA;AAK7B,SAAS,8BACP,QACqC;AACrC,MAAI,WAAW,SAAS;AACtB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,4BACP,gBACA,MACqC;AACrC,MAAI,gBAAgB;AAClB,WAAO,8BAA8B,cAAc;AAAA,EACrD;AAEA,SAAO,SAAS,iBAAiB,uBAAuB;AAC1D;AAEA,SAAS,sBACP,sBACA,eACQ;AACR,QAAM,mBACJ,kBAAkB,SAAY,mBAAmB,UAAU,aAAa;AAC1E,SAAO,GAAG,oBAAoB,IAAI,gBAAgB;AACpD;AAEA,SAAS,2BACP,SACc;AACd,QAAM,eAAe,iBAAiB,IAAI,QAAQ,QAAQ;AAC1D,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,IAAIA,iCAAkB;AAAA,IACnC,UAAU,QAAQ;AAAA,EAAA,CACnB;AACD,mBAAiB,IAAI,QAAQ,UAAU,MAAM;AAC7C,SAAO;AACT;AAEA,SAAS,0BACP,SAIA;AACA,SAAO;AAAA,IACL,uBACE,QAAQ,yBAAyBC,wBAAAA;AAAAA,IACnC,6BACE,QAAQ,+BACRC,wBAAAA;AAAAA,IACF,0BAA0B,QAAQ;AAAA,IAClC,2BAA2B,QAAQ;AAAA,IACnC,KAAK,QAAQ;AAAA,EAAA;AAEjB;AAEO,SAAS,6BACd,SACgC;AAChC,QAAM,EAAE,aAAa,qBAAA,IAAyB;AAC9C,QAAM,SAAS,2BAA2B,OAAO;AACjD,QAAM,qBAAqB,0BAA0B,OAAO;AAC5D,QAAM,sBAAsB,eAAe,IAAIC,iDAAA;AAC/C,QAAM,mCAAmB,IAAA;AAKzB,QAAM,0BAA0B,CAC9B,MACA,kBACG;AACH,UAAM,+BAA+B;AAAA,MACnC;AAAA,MACA;AAAA,IAAA;AAEF,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,IAAA;AAEF,UAAM,gBAAgB,aAAa,IAAI,QAAQ;AAC/C,QAAI,eAAe;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,UAAUC,wBAAAA,mCAAmC;AAAA,MACjD,GAAG;AAAA,MACH;AAAA,MACA,sBAAsB;AAAA,MACtB,GAAI,kBAAkB,SAAY,CAAA,IAAK,EAAE,cAAA;AAAA,IAAc,CACxD;AACD,iBAAa,IAAI,UAAU,OAAO;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,8BAA8B,CAClC,MACA,mBACoC;AAAA,IACpC,SAAS,wBAAwB,MAAM,aAAa;AAAA,IACpD,aAAa;AAAA,EAAA;AAGf,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA;AAAA,EAAA;AAGF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,iCAAiC,CAAC,EAAE,MAAM,oBACxC,4BAA4B,MAAM,aAAa;AAAA,IACjD,2BAA2B,CAAC,SAC1B,4BAA4B,MAAM,MAAS;AAAA,EAAA;AAEjD;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tauri-sql-driver.cjs","sources":["../../src/tauri-sql-driver.ts"],"sourcesContent":["import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persistence-core'\nimport type { SQLiteDriver } from '@tanstack/db-sqlite-persistence-core'\nimport type Database from '@tauri-apps/plugin-sql'\n\nexport type TauriSQLiteDatabaseLike = Pick<\n Database,\n `execute` | `select` | `close` | `path`\n>\n\nexport type TauriSQLiteDriverOptions = {\n database: TauriSQLiteDatabaseLike\n}\n\nfunction assertTransactionCallbackHasDriverArg(\n fn: (transactionDriver: SQLiteDriver) => Promise<unknown>,\n): void {\n if (fn.length > 0) {\n return\n }\n\n throw new InvalidPersistedCollectionConfigError(\n `SQLiteDriver.transaction callback must accept the transaction driver argument`,\n )\n}\n\nfunction isTauriSQLiteDatabaseLike(\n value: unknown,\n): value is TauriSQLiteDatabaseLike {\n const candidate = value as Partial<TauriSQLiteDatabaseLike>\n return (\n typeof value === `object` &&\n value !== null &&\n typeof candidate.path === `string` &&\n typeof candidate.execute === `function` &&\n typeof candidate.select === `function`\n )\n}\n\nfunction normalizeQueryRows<TRow>(\n rows: unknown,\n sql: string,\n): ReadonlyArray<TRow> {\n if (Array.isArray(rows)) {\n return rows as ReadonlyArray<TRow>\n }\n\n throw new InvalidPersistedCollectionConfigError(\n `Unsupported Tauri SQL query result shape for SQL \"${sql}\"`,\n )\n}\n\nfunction convertSqlitePlaceholdersToTauri(sql: string): string {\n let result = ``\n let parameterIndex = 1\n let inSingleQuote = false\n let inDoubleQuote = false\n let inLineComment = false\n let inBlockComment = false\n\n for (let index = 0; index < sql.length; index++) {\n const currentChar = sql[index]\n const nextChar = sql[index + 1]\n\n if (inLineComment) {\n result += currentChar\n if (currentChar === `\\n`) {\n inLineComment = false\n }\n continue\n }\n\n if (inBlockComment) {\n result += currentChar\n if (currentChar === `*` && nextChar === `/`) {\n result += `/`\n index++\n inBlockComment = false\n }\n continue\n }\n\n if (!inSingleQuote && !inDoubleQuote) {\n if (currentChar === `-` && nextChar === `-`) {\n result += `--`\n index++\n inLineComment = true\n continue\n }\n\n if (currentChar === `/` && nextChar === `*`) {\n result += `/*`\n index++\n inBlockComment = true\n continue\n }\n }\n\n if (currentChar === `'` && !inDoubleQuote) {\n result += currentChar\n if (inSingleQuote && nextChar === `'`) {\n result += `'`\n index++\n continue\n }\n inSingleQuote = !inSingleQuote\n continue\n }\n\n if (currentChar === `\"` && !inSingleQuote) {\n result += currentChar\n if (inDoubleQuote && nextChar === `\"`) {\n result += `\"`\n index++\n continue\n }\n inDoubleQuote = !inDoubleQuote\n continue\n }\n\n if (currentChar === `?` && !inSingleQuote && !inDoubleQuote) {\n result += `$${String(parameterIndex)}`\n parameterIndex++\n continue\n }\n\n result += currentChar\n }\n\n return result\n}\n\nexport class TauriSQLiteDriver implements SQLiteDriver {\n private readonly database: TauriSQLiteDatabaseLike\n private queue: Promise<void> = Promise.resolve()\n private nextSavepointId = 1\n\n constructor(options: TauriSQLiteDriverOptions) {\n if (!isTauriSQLiteDatabaseLike(options.database)) {\n throw new InvalidPersistedCollectionConfigError(\n `Tauri SQLite database object must provide execute/select methods`,\n )\n }\n\n this.database = options.database\n }\n\n async exec(sql: string): Promise<void> {\n await this.enqueue(async () => {\n await this.executeStatement(sql)\n })\n }\n\n async query<TRow>(\n sql: string,\n params: ReadonlyArray<unknown> = [],\n ): Promise<ReadonlyArray<TRow>> {\n return this.enqueue(async () => {\n const rows = await this.database.select<ReadonlyArray<TRow>>(\n convertSqlitePlaceholdersToTauri(sql),\n params.length > 0 ? [...params] : undefined,\n )\n return normalizeQueryRows<TRow>(rows, sql)\n })\n }\n\n async run(sql: string, params: ReadonlyArray<unknown> = []): Promise<void> {\n await this.enqueue(async () => {\n await this.executeStatement(sql, params)\n })\n }\n\n async transaction<TReturn>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> {\n assertTransactionCallbackHasDriverArg(fn)\n return this.transactionWithDriver(fn)\n }\n\n async transactionWithDriver<TReturn>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> {\n return this.enqueue(async () => {\n await this.executeStatement(`BEGIN IMMEDIATE`)\n const transactionDriver = this.createTransactionDriver()\n\n try {\n const result = await fn(transactionDriver)\n await this.executeStatement(`COMMIT`)\n return result\n } catch (error) {\n try {\n await this.executeStatement(`ROLLBACK`)\n } catch {\n // Keep the original transaction error as the primary failure.\n }\n throw error\n }\n })\n }\n\n async close(): Promise<void> {\n if (typeof this.database.close !== `function`) {\n return\n }\n\n await Promise.resolve(this.database.close(this.database.path))\n }\n\n getDatabase(): TauriSQLiteDatabaseLike {\n return this.database\n }\n\n private async executeStatement(\n sql: string,\n params: ReadonlyArray<unknown> = [],\n ): Promise<void> {\n await this.database.execute(\n convertSqlitePlaceholdersToTauri(sql),\n params.length > 0 ? [...params] : undefined,\n )\n }\n\n private enqueue<TReturn>(\n operation: () => Promise<TReturn>,\n ): Promise<TReturn> {\n const queuedOperation = this.queue.then(operation, operation)\n this.queue = queuedOperation.then(\n () => undefined,\n () => undefined,\n )\n return queuedOperation\n }\n\n private createTransactionDriver(): SQLiteDriver {\n const transactionDriver: SQLiteDriver = {\n exec: async (sql) => {\n await this.executeStatement(sql)\n },\n query: async <TRow>(\n sql: string,\n params: ReadonlyArray<unknown> = [],\n ): Promise<ReadonlyArray<TRow>> => {\n const rows = await this.database.select<ReadonlyArray<TRow>>(\n convertSqlitePlaceholdersToTauri(sql),\n params.length > 0 ? [...params] : undefined,\n )\n return normalizeQueryRows<TRow>(rows, sql)\n },\n run: async (sql, params = []) => {\n await this.executeStatement(sql, params)\n },\n transaction: async <TReturn>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> => {\n assertTransactionCallbackHasDriverArg(fn)\n return this.runNestedTransaction(transactionDriver, fn)\n },\n transactionWithDriver: async <TReturn>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> => this.runNestedTransaction(transactionDriver, fn),\n }\n\n return transactionDriver\n }\n\n private async runNestedTransaction<TReturn>(\n transactionDriver: SQLiteDriver,\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> {\n const savepointName = `tsdb_sp_${this.nextSavepointId}`\n this.nextSavepointId++\n await this.executeStatement(`SAVEPOINT ${savepointName}`)\n\n try {\n const result = await fn(transactionDriver)\n await this.executeStatement(`RELEASE SAVEPOINT ${savepointName}`)\n return result\n } catch (error) {\n await this.executeStatement(`ROLLBACK TO SAVEPOINT ${savepointName}`)\n await this.executeStatement(`RELEASE SAVEPOINT ${savepointName}`)\n throw error\n }\n }\n}\n\nexport function createTauriSQLiteDriver(\n options: TauriSQLiteDriverOptions,\n): TauriSQLiteDriver {\n return new TauriSQLiteDriver(options)\n}\n"],"names":["InvalidPersistedCollectionConfigError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tauri-sql-driver.cjs","sources":["../../src/tauri-sql-driver.ts"],"sourcesContent":["import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persistence-core'\nimport type { SQLiteDriver } from '@tanstack/db-sqlite-persistence-core'\nimport type Database from '@tauri-apps/plugin-sql'\n\nexport type TauriSQLiteDatabaseLike = Pick<\n Database,\n `execute` | `select` | `close` | `path`\n>\n\nexport type TauriSQLiteDriverOptions = {\n database: TauriSQLiteDatabaseLike\n}\n\nfunction assertTransactionCallbackHasDriverArg(\n fn: (transactionDriver: SQLiteDriver) => Promise<unknown>,\n): void {\n if (fn.length > 0) {\n return\n }\n\n throw new InvalidPersistedCollectionConfigError(\n `SQLiteDriver.transaction callback must accept the transaction driver argument`,\n )\n}\n\nfunction isTauriSQLiteDatabaseLike(\n value: unknown,\n): value is TauriSQLiteDatabaseLike {\n const candidate = value as Partial<TauriSQLiteDatabaseLike>\n return (\n typeof value === `object` &&\n value !== null &&\n typeof candidate.path === `string` &&\n typeof candidate.execute === `function` &&\n typeof candidate.select === `function`\n )\n}\n\nfunction normalizeQueryRows<TRow>(\n rows: unknown,\n sql: string,\n): ReadonlyArray<TRow> {\n if (Array.isArray(rows)) {\n return rows as ReadonlyArray<TRow>\n }\n\n throw new InvalidPersistedCollectionConfigError(\n `Unsupported Tauri SQL query result shape for SQL \"${sql}\"`,\n )\n}\n\nfunction convertSqlitePlaceholdersToTauri(sql: string): string {\n let result = ``\n let parameterIndex = 1\n let inSingleQuote = false\n let inDoubleQuote = false\n let inLineComment = false\n let inBlockComment = false\n\n for (let index = 0; index < sql.length; index++) {\n const currentChar = sql[index]\n const nextChar = sql[index + 1]\n\n if (inLineComment) {\n result += currentChar\n if (currentChar === `\\n`) {\n inLineComment = false\n }\n continue\n }\n\n if (inBlockComment) {\n result += currentChar\n if (currentChar === `*` && nextChar === `/`) {\n result += `/`\n index++\n inBlockComment = false\n }\n continue\n }\n\n if (!inSingleQuote && !inDoubleQuote) {\n if (currentChar === `-` && nextChar === `-`) {\n result += `--`\n index++\n inLineComment = true\n continue\n }\n\n if (currentChar === `/` && nextChar === `*`) {\n result += `/*`\n index++\n inBlockComment = true\n continue\n }\n }\n\n if (currentChar === `'` && !inDoubleQuote) {\n result += currentChar\n if (inSingleQuote && nextChar === `'`) {\n result += `'`\n index++\n continue\n }\n inSingleQuote = !inSingleQuote\n continue\n }\n\n if (currentChar === `\"` && !inSingleQuote) {\n result += currentChar\n if (inDoubleQuote && nextChar === `\"`) {\n result += `\"`\n index++\n continue\n }\n inDoubleQuote = !inDoubleQuote\n continue\n }\n\n if (currentChar === `?` && !inSingleQuote && !inDoubleQuote) {\n result += `$${String(parameterIndex)}`\n parameterIndex++\n continue\n }\n\n result += currentChar\n }\n\n return result\n}\n\nexport class TauriSQLiteDriver implements SQLiteDriver {\n private readonly database: TauriSQLiteDatabaseLike\n private queue: Promise<void> = Promise.resolve()\n private nextSavepointId = 1\n\n constructor(options: TauriSQLiteDriverOptions) {\n if (!isTauriSQLiteDatabaseLike(options.database)) {\n throw new InvalidPersistedCollectionConfigError(\n `Tauri SQLite database object must provide execute/select methods`,\n )\n }\n\n this.database = options.database\n }\n\n async exec(sql: string): Promise<void> {\n await this.enqueue(async () => {\n await this.executeStatement(sql)\n })\n }\n\n async query<TRow>(\n sql: string,\n params: ReadonlyArray<unknown> = [],\n ): Promise<ReadonlyArray<TRow>> {\n return this.enqueue(async () => {\n const rows = await this.database.select<ReadonlyArray<TRow>>(\n convertSqlitePlaceholdersToTauri(sql),\n params.length > 0 ? [...params] : undefined,\n )\n return normalizeQueryRows<TRow>(rows, sql)\n })\n }\n\n async run(sql: string, params: ReadonlyArray<unknown> = []): Promise<void> {\n await this.enqueue(async () => {\n await this.executeStatement(sql, params)\n })\n }\n\n async transaction<TReturn>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> {\n assertTransactionCallbackHasDriverArg(fn)\n return this.transactionWithDriver(fn)\n }\n\n async transactionWithDriver<TReturn>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> {\n return this.enqueue(async () => {\n await this.executeStatement(`BEGIN IMMEDIATE`)\n const transactionDriver = this.createTransactionDriver()\n\n try {\n const result = await fn(transactionDriver)\n await this.executeStatement(`COMMIT`)\n return result\n } catch (error) {\n try {\n await this.executeStatement(`ROLLBACK`)\n } catch {\n // Keep the original transaction error as the primary failure.\n }\n throw error\n }\n })\n }\n\n async close(): Promise<void> {\n if (typeof this.database.close !== `function`) {\n return\n }\n\n await Promise.resolve(this.database.close(this.database.path))\n }\n\n getDatabase(): TauriSQLiteDatabaseLike {\n return this.database\n }\n\n private async executeStatement(\n sql: string,\n params: ReadonlyArray<unknown> = [],\n ): Promise<void> {\n await this.database.execute(\n convertSqlitePlaceholdersToTauri(sql),\n params.length > 0 ? [...params] : undefined,\n )\n }\n\n private enqueue<TReturn>(\n operation: () => Promise<TReturn>,\n ): Promise<TReturn> {\n const queuedOperation = this.queue.then(operation, operation)\n this.queue = queuedOperation.then(\n () => undefined,\n () => undefined,\n )\n return queuedOperation\n }\n\n private createTransactionDriver(): SQLiteDriver {\n const transactionDriver: SQLiteDriver = {\n exec: async (sql) => {\n await this.executeStatement(sql)\n },\n query: async <TRow>(\n sql: string,\n params: ReadonlyArray<unknown> = [],\n ): Promise<ReadonlyArray<TRow>> => {\n const rows = await this.database.select<ReadonlyArray<TRow>>(\n convertSqlitePlaceholdersToTauri(sql),\n params.length > 0 ? [...params] : undefined,\n )\n return normalizeQueryRows<TRow>(rows, sql)\n },\n run: async (sql, params = []) => {\n await this.executeStatement(sql, params)\n },\n transaction: async <TReturn>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> => {\n assertTransactionCallbackHasDriverArg(fn)\n return this.runNestedTransaction(transactionDriver, fn)\n },\n transactionWithDriver: async <TReturn>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> => this.runNestedTransaction(transactionDriver, fn),\n }\n\n return transactionDriver\n }\n\n private async runNestedTransaction<TReturn>(\n transactionDriver: SQLiteDriver,\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> {\n const savepointName = `tsdb_sp_${this.nextSavepointId}`\n this.nextSavepointId++\n await this.executeStatement(`SAVEPOINT ${savepointName}`)\n\n try {\n const result = await fn(transactionDriver)\n await this.executeStatement(`RELEASE SAVEPOINT ${savepointName}`)\n return result\n } catch (error) {\n await this.executeStatement(`ROLLBACK TO SAVEPOINT ${savepointName}`)\n await this.executeStatement(`RELEASE SAVEPOINT ${savepointName}`)\n throw error\n }\n }\n}\n"],"names":["InvalidPersistedCollectionConfigError"],"mappings":"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"}
|
|
@@ -32,7 +32,9 @@ function resolveAdapterBaseOptions(options) {
|
|
|
32
32
|
return {
|
|
33
33
|
appliedTxPruneMaxRows: options.appliedTxPruneMaxRows ?? DEFAULT_APPLIED_TX_PRUNE_MAX_ROWS,
|
|
34
34
|
appliedTxPruneMaxAgeSeconds: options.appliedTxPruneMaxAgeSeconds ?? DEFAULT_APPLIED_TX_PRUNE_MAX_AGE_SECONDS,
|
|
35
|
-
pullSinceReloadThreshold: options.pullSinceReloadThreshold
|
|
35
|
+
pullSinceReloadThreshold: options.pullSinceReloadThreshold,
|
|
36
|
+
cacheGenerationClaimTtlMs: options.cacheGenerationClaimTtlMs,
|
|
37
|
+
now: options.now
|
|
36
38
|
};
|
|
37
39
|
}
|
|
38
40
|
function createTauriSQLitePersistence(options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tauri-persistence.js","sources":["../../src/tauri-persistence.ts"],"sourcesContent":["import {\n DEFAULT_APPLIED_TX_PRUNE_MAX_AGE_SECONDS,\n DEFAULT_APPLIED_TX_PRUNE_MAX_ROWS,\n SingleProcessCoordinator,\n createSQLiteCorePersistenceAdapter,\n} from '@tanstack/db-sqlite-persistence-core'\nimport { TauriSQLiteDriver } from './tauri-sql-driver'\nimport type {\n PersistedCollectionCoordinator,\n PersistedCollectionMode,\n PersistedCollectionPersistence,\n SQLiteCoreAdapterOptions,\n SQLiteDriver,\n} from '@tanstack/db-sqlite-persistence-core'\nimport type { TauriSQLiteDatabaseLike } from './tauri-sql-driver'\n\nexport type { TauriSQLiteDatabaseLike } from './tauri-sql-driver'\n\ntype TauriSQLiteCoreSchemaMismatchPolicy =\n `sync-present-reset` | `sync-absent-error` | `reset`\n\nexport type TauriSQLiteSchemaMismatchPolicy =\n TauriSQLiteCoreSchemaMismatchPolicy | `throw`\n\ntype TauriSQLitePersistenceBaseOptions = Omit<\n SQLiteCoreAdapterOptions,\n `driver` | `schemaVersion` | `schemaMismatchPolicy`\n> & {\n database: TauriSQLiteDatabaseLike\n coordinator?: PersistedCollectionCoordinator\n schemaMismatchPolicy?: TauriSQLiteSchemaMismatchPolicy\n}\n\nexport type TauriSQLitePersistenceOptions = TauriSQLitePersistenceBaseOptions\n\nconst tauriDriverCache = new WeakMap<\n TauriSQLiteDatabaseLike,\n TauriSQLiteDriver\n>()\n\nfunction normalizeSchemaMismatchPolicy(\n policy: TauriSQLiteSchemaMismatchPolicy,\n): TauriSQLiteCoreSchemaMismatchPolicy {\n if (policy === `throw`) {\n return `sync-absent-error`\n }\n\n return policy\n}\n\nfunction resolveSchemaMismatchPolicy(\n explicitPolicy: TauriSQLiteSchemaMismatchPolicy | undefined,\n mode: PersistedCollectionMode,\n): TauriSQLiteCoreSchemaMismatchPolicy {\n if (explicitPolicy) {\n return normalizeSchemaMismatchPolicy(explicitPolicy)\n }\n\n return mode === `sync-present` ? `sync-present-reset` : `sync-absent-error`\n}\n\nfunction createAdapterCacheKey(\n schemaMismatchPolicy: TauriSQLiteCoreSchemaMismatchPolicy,\n schemaVersion: number | undefined,\n): string {\n const schemaVersionKey =\n schemaVersion === undefined ? `schema:default` : `schema:${schemaVersion}`\n return `${schemaMismatchPolicy}|${schemaVersionKey}`\n}\n\nfunction createInternalSQLiteDriver(\n options: TauriSQLitePersistenceOptions,\n): SQLiteDriver {\n const cachedDriver = tauriDriverCache.get(options.database)\n if (cachedDriver) {\n return cachedDriver\n }\n\n const driver = new TauriSQLiteDriver({\n database: options.database,\n })\n tauriDriverCache.set(options.database, driver)\n return driver\n}\n\nfunction resolveAdapterBaseOptions(\n options: TauriSQLitePersistenceOptions,\n): Omit<\n SQLiteCoreAdapterOptions,\n `driver` | `schemaVersion` | `schemaMismatchPolicy`\n> {\n return {\n appliedTxPruneMaxRows:\n options.appliedTxPruneMaxRows ?? DEFAULT_APPLIED_TX_PRUNE_MAX_ROWS,\n appliedTxPruneMaxAgeSeconds:\n options.appliedTxPruneMaxAgeSeconds ??\n DEFAULT_APPLIED_TX_PRUNE_MAX_AGE_SECONDS,\n pullSinceReloadThreshold: options.pullSinceReloadThreshold,\n }\n}\n\nexport function createTauriSQLitePersistence(\n options: TauriSQLitePersistenceOptions,\n): PersistedCollectionPersistence {\n const { coordinator, schemaMismatchPolicy } = options\n const driver = createInternalSQLiteDriver(options)\n const adapterBaseOptions = resolveAdapterBaseOptions(options)\n const resolvedCoordinator = coordinator ?? new SingleProcessCoordinator()\n const adapterCache = new Map<\n string,\n ReturnType<typeof createSQLiteCorePersistenceAdapter>\n >()\n\n const getAdapterForCollection = (\n mode: PersistedCollectionMode,\n schemaVersion: number | undefined,\n ) => {\n const resolvedSchemaMismatchPolicy = resolveSchemaMismatchPolicy(\n schemaMismatchPolicy,\n mode,\n )\n const cacheKey = createAdapterCacheKey(\n resolvedSchemaMismatchPolicy,\n schemaVersion,\n )\n const cachedAdapter = adapterCache.get(cacheKey)\n if (cachedAdapter) {\n return cachedAdapter\n }\n\n const adapter = createSQLiteCorePersistenceAdapter({\n ...adapterBaseOptions,\n driver,\n schemaMismatchPolicy: resolvedSchemaMismatchPolicy,\n ...(schemaVersion === undefined ? {} : { schemaVersion }),\n })\n adapterCache.set(cacheKey, adapter)\n return adapter\n }\n\n const createCollectionPersistence = (\n mode: PersistedCollectionMode,\n schemaVersion: number | undefined,\n ): PersistedCollectionPersistence => ({\n adapter: getAdapterForCollection(mode, schemaVersion),\n coordinator: resolvedCoordinator,\n })\n\n const defaultPersistence = createCollectionPersistence(\n `sync-absent`,\n undefined,\n )\n\n return {\n ...defaultPersistence,\n resolvePersistenceForCollection: ({ mode, schemaVersion }) =>\n createCollectionPersistence(mode, schemaVersion),\n resolvePersistenceForMode: (mode) =>\n createCollectionPersistence(mode, undefined),\n }\n}\n"],"names":[],"mappings":";;AAmCA,MAAM,uCAAuB,QAAA;AAK7B,SAAS,8BACP,QACqC;AACrC,MAAI,WAAW,SAAS;AACtB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,4BACP,gBACA,MACqC;AACrC,MAAI,gBAAgB;AAClB,WAAO,8BAA8B,cAAc;AAAA,EACrD;AAEA,SAAO,SAAS,iBAAiB,uBAAuB;AAC1D;AAEA,SAAS,sBACP,sBACA,eACQ;AACR,QAAM,mBACJ,kBAAkB,SAAY,mBAAmB,UAAU,aAAa;AAC1E,SAAO,GAAG,oBAAoB,IAAI,gBAAgB;AACpD;AAEA,SAAS,2BACP,SACc;AACd,QAAM,eAAe,iBAAiB,IAAI,QAAQ,QAAQ;AAC1D,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,IAAI,kBAAkB;AAAA,IACnC,UAAU,QAAQ;AAAA,EAAA,CACnB;AACD,mBAAiB,IAAI,QAAQ,UAAU,MAAM;AAC7C,SAAO;AACT;AAEA,SAAS,0BACP,SAIA;AACA,SAAO;AAAA,IACL,uBACE,QAAQ,yBAAyB;AAAA,IACnC,6BACE,QAAQ,+BACR;AAAA,IACF,0BAA0B,QAAQ;AAAA,EAAA;
|
|
1
|
+
{"version":3,"file":"tauri-persistence.js","sources":["../../src/tauri-persistence.ts"],"sourcesContent":["import {\n DEFAULT_APPLIED_TX_PRUNE_MAX_AGE_SECONDS,\n DEFAULT_APPLIED_TX_PRUNE_MAX_ROWS,\n SingleProcessCoordinator,\n createSQLiteCorePersistenceAdapter,\n} from '@tanstack/db-sqlite-persistence-core'\nimport { TauriSQLiteDriver } from './tauri-sql-driver'\nimport type {\n PersistedCollectionCoordinator,\n PersistedCollectionMode,\n PersistedCollectionPersistence,\n SQLiteCoreAdapterOptions,\n SQLiteDriver,\n} from '@tanstack/db-sqlite-persistence-core'\nimport type { TauriSQLiteDatabaseLike } from './tauri-sql-driver'\n\nexport type { TauriSQLiteDatabaseLike } from './tauri-sql-driver'\n\ntype TauriSQLiteCoreSchemaMismatchPolicy =\n `sync-present-reset` | `sync-absent-error` | `reset`\n\nexport type TauriSQLiteSchemaMismatchPolicy =\n TauriSQLiteCoreSchemaMismatchPolicy | `throw`\n\ntype TauriSQLitePersistenceBaseOptions = Omit<\n SQLiteCoreAdapterOptions,\n `driver` | `schemaVersion` | `schemaMismatchPolicy`\n> & {\n database: TauriSQLiteDatabaseLike\n coordinator?: PersistedCollectionCoordinator\n schemaMismatchPolicy?: TauriSQLiteSchemaMismatchPolicy\n}\n\nexport type TauriSQLitePersistenceOptions = TauriSQLitePersistenceBaseOptions\n\nconst tauriDriverCache = new WeakMap<\n TauriSQLiteDatabaseLike,\n TauriSQLiteDriver\n>()\n\nfunction normalizeSchemaMismatchPolicy(\n policy: TauriSQLiteSchemaMismatchPolicy,\n): TauriSQLiteCoreSchemaMismatchPolicy {\n if (policy === `throw`) {\n return `sync-absent-error`\n }\n\n return policy\n}\n\nfunction resolveSchemaMismatchPolicy(\n explicitPolicy: TauriSQLiteSchemaMismatchPolicy | undefined,\n mode: PersistedCollectionMode,\n): TauriSQLiteCoreSchemaMismatchPolicy {\n if (explicitPolicy) {\n return normalizeSchemaMismatchPolicy(explicitPolicy)\n }\n\n return mode === `sync-present` ? `sync-present-reset` : `sync-absent-error`\n}\n\nfunction createAdapterCacheKey(\n schemaMismatchPolicy: TauriSQLiteCoreSchemaMismatchPolicy,\n schemaVersion: number | undefined,\n): string {\n const schemaVersionKey =\n schemaVersion === undefined ? `schema:default` : `schema:${schemaVersion}`\n return `${schemaMismatchPolicy}|${schemaVersionKey}`\n}\n\nfunction createInternalSQLiteDriver(\n options: TauriSQLitePersistenceOptions,\n): SQLiteDriver {\n const cachedDriver = tauriDriverCache.get(options.database)\n if (cachedDriver) {\n return cachedDriver\n }\n\n const driver = new TauriSQLiteDriver({\n database: options.database,\n })\n tauriDriverCache.set(options.database, driver)\n return driver\n}\n\nfunction resolveAdapterBaseOptions(\n options: TauriSQLitePersistenceOptions,\n): Omit<\n SQLiteCoreAdapterOptions,\n `driver` | `schemaVersion` | `schemaMismatchPolicy`\n> {\n return {\n appliedTxPruneMaxRows:\n options.appliedTxPruneMaxRows ?? DEFAULT_APPLIED_TX_PRUNE_MAX_ROWS,\n appliedTxPruneMaxAgeSeconds:\n options.appliedTxPruneMaxAgeSeconds ??\n DEFAULT_APPLIED_TX_PRUNE_MAX_AGE_SECONDS,\n pullSinceReloadThreshold: options.pullSinceReloadThreshold,\n cacheGenerationClaimTtlMs: options.cacheGenerationClaimTtlMs,\n now: options.now,\n }\n}\n\nexport function createTauriSQLitePersistence(\n options: TauriSQLitePersistenceOptions,\n): PersistedCollectionPersistence {\n const { coordinator, schemaMismatchPolicy } = options\n const driver = createInternalSQLiteDriver(options)\n const adapterBaseOptions = resolveAdapterBaseOptions(options)\n const resolvedCoordinator = coordinator ?? new SingleProcessCoordinator()\n const adapterCache = new Map<\n string,\n ReturnType<typeof createSQLiteCorePersistenceAdapter>\n >()\n\n const getAdapterForCollection = (\n mode: PersistedCollectionMode,\n schemaVersion: number | undefined,\n ) => {\n const resolvedSchemaMismatchPolicy = resolveSchemaMismatchPolicy(\n schemaMismatchPolicy,\n mode,\n )\n const cacheKey = createAdapterCacheKey(\n resolvedSchemaMismatchPolicy,\n schemaVersion,\n )\n const cachedAdapter = adapterCache.get(cacheKey)\n if (cachedAdapter) {\n return cachedAdapter\n }\n\n const adapter = createSQLiteCorePersistenceAdapter({\n ...adapterBaseOptions,\n driver,\n schemaMismatchPolicy: resolvedSchemaMismatchPolicy,\n ...(schemaVersion === undefined ? {} : { schemaVersion }),\n })\n adapterCache.set(cacheKey, adapter)\n return adapter\n }\n\n const createCollectionPersistence = (\n mode: PersistedCollectionMode,\n schemaVersion: number | undefined,\n ): PersistedCollectionPersistence => ({\n adapter: getAdapterForCollection(mode, schemaVersion),\n coordinator: resolvedCoordinator,\n })\n\n const defaultPersistence = createCollectionPersistence(\n `sync-absent`,\n undefined,\n )\n\n return {\n ...defaultPersistence,\n resolvePersistenceForCollection: ({ mode, schemaVersion }) =>\n createCollectionPersistence(mode, schemaVersion),\n resolvePersistenceForMode: (mode) =>\n createCollectionPersistence(mode, undefined),\n }\n}\n"],"names":[],"mappings":";;AAmCA,MAAM,uCAAuB,QAAA;AAK7B,SAAS,8BACP,QACqC;AACrC,MAAI,WAAW,SAAS;AACtB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,4BACP,gBACA,MACqC;AACrC,MAAI,gBAAgB;AAClB,WAAO,8BAA8B,cAAc;AAAA,EACrD;AAEA,SAAO,SAAS,iBAAiB,uBAAuB;AAC1D;AAEA,SAAS,sBACP,sBACA,eACQ;AACR,QAAM,mBACJ,kBAAkB,SAAY,mBAAmB,UAAU,aAAa;AAC1E,SAAO,GAAG,oBAAoB,IAAI,gBAAgB;AACpD;AAEA,SAAS,2BACP,SACc;AACd,QAAM,eAAe,iBAAiB,IAAI,QAAQ,QAAQ;AAC1D,MAAI,cAAc;AAChB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,IAAI,kBAAkB;AAAA,IACnC,UAAU,QAAQ;AAAA,EAAA,CACnB;AACD,mBAAiB,IAAI,QAAQ,UAAU,MAAM;AAC7C,SAAO;AACT;AAEA,SAAS,0BACP,SAIA;AACA,SAAO;AAAA,IACL,uBACE,QAAQ,yBAAyB;AAAA,IACnC,6BACE,QAAQ,+BACR;AAAA,IACF,0BAA0B,QAAQ;AAAA,IAClC,2BAA2B,QAAQ;AAAA,IACnC,KAAK,QAAQ;AAAA,EAAA;AAEjB;AAEO,SAAS,6BACd,SACgC;AAChC,QAAM,EAAE,aAAa,qBAAA,IAAyB;AAC9C,QAAM,SAAS,2BAA2B,OAAO;AACjD,QAAM,qBAAqB,0BAA0B,OAAO;AAC5D,QAAM,sBAAsB,eAAe,IAAI,yBAAA;AAC/C,QAAM,mCAAmB,IAAA;AAKzB,QAAM,0BAA0B,CAC9B,MACA,kBACG;AACH,UAAM,+BAA+B;AAAA,MACnC;AAAA,MACA;AAAA,IAAA;AAEF,UAAM,WAAW;AAAA,MACf;AAAA,MACA;AAAA,IAAA;AAEF,UAAM,gBAAgB,aAAa,IAAI,QAAQ;AAC/C,QAAI,eAAe;AACjB,aAAO;AAAA,IACT;AAEA,UAAM,UAAU,mCAAmC;AAAA,MACjD,GAAG;AAAA,MACH;AAAA,MACA,sBAAsB;AAAA,MACtB,GAAI,kBAAkB,SAAY,CAAA,IAAK,EAAE,cAAA;AAAA,IAAc,CACxD;AACD,iBAAa,IAAI,UAAU,OAAO;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,8BAA8B,CAClC,MACA,mBACoC;AAAA,IACpC,SAAS,wBAAwB,MAAM,aAAa;AAAA,IACpD,aAAa;AAAA,EAAA;AAGf,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA;AAAA,EAAA;AAGF,SAAO;AAAA,IACL,GAAG;AAAA,IACH,iCAAiC,CAAC,EAAE,MAAM,oBACxC,4BAA4B,MAAM,aAAa;AAAA,IACjD,2BAA2B,CAAC,SAC1B,4BAA4B,MAAM,MAAS;AAAA,EAAA;AAEjD;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tauri-sql-driver.js","sources":["../../src/tauri-sql-driver.ts"],"sourcesContent":["import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persistence-core'\nimport type { SQLiteDriver } from '@tanstack/db-sqlite-persistence-core'\nimport type Database from '@tauri-apps/plugin-sql'\n\nexport type TauriSQLiteDatabaseLike = Pick<\n Database,\n `execute` | `select` | `close` | `path`\n>\n\nexport type TauriSQLiteDriverOptions = {\n database: TauriSQLiteDatabaseLike\n}\n\nfunction assertTransactionCallbackHasDriverArg(\n fn: (transactionDriver: SQLiteDriver) => Promise<unknown>,\n): void {\n if (fn.length > 0) {\n return\n }\n\n throw new InvalidPersistedCollectionConfigError(\n `SQLiteDriver.transaction callback must accept the transaction driver argument`,\n )\n}\n\nfunction isTauriSQLiteDatabaseLike(\n value: unknown,\n): value is TauriSQLiteDatabaseLike {\n const candidate = value as Partial<TauriSQLiteDatabaseLike>\n return (\n typeof value === `object` &&\n value !== null &&\n typeof candidate.path === `string` &&\n typeof candidate.execute === `function` &&\n typeof candidate.select === `function`\n )\n}\n\nfunction normalizeQueryRows<TRow>(\n rows: unknown,\n sql: string,\n): ReadonlyArray<TRow> {\n if (Array.isArray(rows)) {\n return rows as ReadonlyArray<TRow>\n }\n\n throw new InvalidPersistedCollectionConfigError(\n `Unsupported Tauri SQL query result shape for SQL \"${sql}\"`,\n )\n}\n\nfunction convertSqlitePlaceholdersToTauri(sql: string): string {\n let result = ``\n let parameterIndex = 1\n let inSingleQuote = false\n let inDoubleQuote = false\n let inLineComment = false\n let inBlockComment = false\n\n for (let index = 0; index < sql.length; index++) {\n const currentChar = sql[index]\n const nextChar = sql[index + 1]\n\n if (inLineComment) {\n result += currentChar\n if (currentChar === `\\n`) {\n inLineComment = false\n }\n continue\n }\n\n if (inBlockComment) {\n result += currentChar\n if (currentChar === `*` && nextChar === `/`) {\n result += `/`\n index++\n inBlockComment = false\n }\n continue\n }\n\n if (!inSingleQuote && !inDoubleQuote) {\n if (currentChar === `-` && nextChar === `-`) {\n result += `--`\n index++\n inLineComment = true\n continue\n }\n\n if (currentChar === `/` && nextChar === `*`) {\n result += `/*`\n index++\n inBlockComment = true\n continue\n }\n }\n\n if (currentChar === `'` && !inDoubleQuote) {\n result += currentChar\n if (inSingleQuote && nextChar === `'`) {\n result += `'`\n index++\n continue\n }\n inSingleQuote = !inSingleQuote\n continue\n }\n\n if (currentChar === `\"` && !inSingleQuote) {\n result += currentChar\n if (inDoubleQuote && nextChar === `\"`) {\n result += `\"`\n index++\n continue\n }\n inDoubleQuote = !inDoubleQuote\n continue\n }\n\n if (currentChar === `?` && !inSingleQuote && !inDoubleQuote) {\n result += `$${String(parameterIndex)}`\n parameterIndex++\n continue\n }\n\n result += currentChar\n }\n\n return result\n}\n\nexport class TauriSQLiteDriver implements SQLiteDriver {\n private readonly database: TauriSQLiteDatabaseLike\n private queue: Promise<void> = Promise.resolve()\n private nextSavepointId = 1\n\n constructor(options: TauriSQLiteDriverOptions) {\n if (!isTauriSQLiteDatabaseLike(options.database)) {\n throw new InvalidPersistedCollectionConfigError(\n `Tauri SQLite database object must provide execute/select methods`,\n )\n }\n\n this.database = options.database\n }\n\n async exec(sql: string): Promise<void> {\n await this.enqueue(async () => {\n await this.executeStatement(sql)\n })\n }\n\n async query<TRow>(\n sql: string,\n params: ReadonlyArray<unknown> = [],\n ): Promise<ReadonlyArray<TRow>> {\n return this.enqueue(async () => {\n const rows = await this.database.select<ReadonlyArray<TRow>>(\n convertSqlitePlaceholdersToTauri(sql),\n params.length > 0 ? [...params] : undefined,\n )\n return normalizeQueryRows<TRow>(rows, sql)\n })\n }\n\n async run(sql: string, params: ReadonlyArray<unknown> = []): Promise<void> {\n await this.enqueue(async () => {\n await this.executeStatement(sql, params)\n })\n }\n\n async transaction<TReturn>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> {\n assertTransactionCallbackHasDriverArg(fn)\n return this.transactionWithDriver(fn)\n }\n\n async transactionWithDriver<TReturn>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> {\n return this.enqueue(async () => {\n await this.executeStatement(`BEGIN IMMEDIATE`)\n const transactionDriver = this.createTransactionDriver()\n\n try {\n const result = await fn(transactionDriver)\n await this.executeStatement(`COMMIT`)\n return result\n } catch (error) {\n try {\n await this.executeStatement(`ROLLBACK`)\n } catch {\n // Keep the original transaction error as the primary failure.\n }\n throw error\n }\n })\n }\n\n async close(): Promise<void> {\n if (typeof this.database.close !== `function`) {\n return\n }\n\n await Promise.resolve(this.database.close(this.database.path))\n }\n\n getDatabase(): TauriSQLiteDatabaseLike {\n return this.database\n }\n\n private async executeStatement(\n sql: string,\n params: ReadonlyArray<unknown> = [],\n ): Promise<void> {\n await this.database.execute(\n convertSqlitePlaceholdersToTauri(sql),\n params.length > 0 ? [...params] : undefined,\n )\n }\n\n private enqueue<TReturn>(\n operation: () => Promise<TReturn>,\n ): Promise<TReturn> {\n const queuedOperation = this.queue.then(operation, operation)\n this.queue = queuedOperation.then(\n () => undefined,\n () => undefined,\n )\n return queuedOperation\n }\n\n private createTransactionDriver(): SQLiteDriver {\n const transactionDriver: SQLiteDriver = {\n exec: async (sql) => {\n await this.executeStatement(sql)\n },\n query: async <TRow>(\n sql: string,\n params: ReadonlyArray<unknown> = [],\n ): Promise<ReadonlyArray<TRow>> => {\n const rows = await this.database.select<ReadonlyArray<TRow>>(\n convertSqlitePlaceholdersToTauri(sql),\n params.length > 0 ? [...params] : undefined,\n )\n return normalizeQueryRows<TRow>(rows, sql)\n },\n run: async (sql, params = []) => {\n await this.executeStatement(sql, params)\n },\n transaction: async <TReturn>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> => {\n assertTransactionCallbackHasDriverArg(fn)\n return this.runNestedTransaction(transactionDriver, fn)\n },\n transactionWithDriver: async <TReturn>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> => this.runNestedTransaction(transactionDriver, fn),\n }\n\n return transactionDriver\n }\n\n private async runNestedTransaction<TReturn>(\n transactionDriver: SQLiteDriver,\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> {\n const savepointName = `tsdb_sp_${this.nextSavepointId}`\n this.nextSavepointId++\n await this.executeStatement(`SAVEPOINT ${savepointName}`)\n\n try {\n const result = await fn(transactionDriver)\n await this.executeStatement(`RELEASE SAVEPOINT ${savepointName}`)\n return result\n } catch (error) {\n await this.executeStatement(`ROLLBACK TO SAVEPOINT ${savepointName}`)\n await this.executeStatement(`RELEASE SAVEPOINT ${savepointName}`)\n throw error\n }\n }\n}\n\nexport function createTauriSQLiteDriver(\n options: TauriSQLiteDriverOptions,\n): TauriSQLiteDriver {\n return new TauriSQLiteDriver(options)\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tauri-sql-driver.js","sources":["../../src/tauri-sql-driver.ts"],"sourcesContent":["import { InvalidPersistedCollectionConfigError } from '@tanstack/db-sqlite-persistence-core'\nimport type { SQLiteDriver } from '@tanstack/db-sqlite-persistence-core'\nimport type Database from '@tauri-apps/plugin-sql'\n\nexport type TauriSQLiteDatabaseLike = Pick<\n Database,\n `execute` | `select` | `close` | `path`\n>\n\nexport type TauriSQLiteDriverOptions = {\n database: TauriSQLiteDatabaseLike\n}\n\nfunction assertTransactionCallbackHasDriverArg(\n fn: (transactionDriver: SQLiteDriver) => Promise<unknown>,\n): void {\n if (fn.length > 0) {\n return\n }\n\n throw new InvalidPersistedCollectionConfigError(\n `SQLiteDriver.transaction callback must accept the transaction driver argument`,\n )\n}\n\nfunction isTauriSQLiteDatabaseLike(\n value: unknown,\n): value is TauriSQLiteDatabaseLike {\n const candidate = value as Partial<TauriSQLiteDatabaseLike>\n return (\n typeof value === `object` &&\n value !== null &&\n typeof candidate.path === `string` &&\n typeof candidate.execute === `function` &&\n typeof candidate.select === `function`\n )\n}\n\nfunction normalizeQueryRows<TRow>(\n rows: unknown,\n sql: string,\n): ReadonlyArray<TRow> {\n if (Array.isArray(rows)) {\n return rows as ReadonlyArray<TRow>\n }\n\n throw new InvalidPersistedCollectionConfigError(\n `Unsupported Tauri SQL query result shape for SQL \"${sql}\"`,\n )\n}\n\nfunction convertSqlitePlaceholdersToTauri(sql: string): string {\n let result = ``\n let parameterIndex = 1\n let inSingleQuote = false\n let inDoubleQuote = false\n let inLineComment = false\n let inBlockComment = false\n\n for (let index = 0; index < sql.length; index++) {\n const currentChar = sql[index]\n const nextChar = sql[index + 1]\n\n if (inLineComment) {\n result += currentChar\n if (currentChar === `\\n`) {\n inLineComment = false\n }\n continue\n }\n\n if (inBlockComment) {\n result += currentChar\n if (currentChar === `*` && nextChar === `/`) {\n result += `/`\n index++\n inBlockComment = false\n }\n continue\n }\n\n if (!inSingleQuote && !inDoubleQuote) {\n if (currentChar === `-` && nextChar === `-`) {\n result += `--`\n index++\n inLineComment = true\n continue\n }\n\n if (currentChar === `/` && nextChar === `*`) {\n result += `/*`\n index++\n inBlockComment = true\n continue\n }\n }\n\n if (currentChar === `'` && !inDoubleQuote) {\n result += currentChar\n if (inSingleQuote && nextChar === `'`) {\n result += `'`\n index++\n continue\n }\n inSingleQuote = !inSingleQuote\n continue\n }\n\n if (currentChar === `\"` && !inSingleQuote) {\n result += currentChar\n if (inDoubleQuote && nextChar === `\"`) {\n result += `\"`\n index++\n continue\n }\n inDoubleQuote = !inDoubleQuote\n continue\n }\n\n if (currentChar === `?` && !inSingleQuote && !inDoubleQuote) {\n result += `$${String(parameterIndex)}`\n parameterIndex++\n continue\n }\n\n result += currentChar\n }\n\n return result\n}\n\nexport class TauriSQLiteDriver implements SQLiteDriver {\n private readonly database: TauriSQLiteDatabaseLike\n private queue: Promise<void> = Promise.resolve()\n private nextSavepointId = 1\n\n constructor(options: TauriSQLiteDriverOptions) {\n if (!isTauriSQLiteDatabaseLike(options.database)) {\n throw new InvalidPersistedCollectionConfigError(\n `Tauri SQLite database object must provide execute/select methods`,\n )\n }\n\n this.database = options.database\n }\n\n async exec(sql: string): Promise<void> {\n await this.enqueue(async () => {\n await this.executeStatement(sql)\n })\n }\n\n async query<TRow>(\n sql: string,\n params: ReadonlyArray<unknown> = [],\n ): Promise<ReadonlyArray<TRow>> {\n return this.enqueue(async () => {\n const rows = await this.database.select<ReadonlyArray<TRow>>(\n convertSqlitePlaceholdersToTauri(sql),\n params.length > 0 ? [...params] : undefined,\n )\n return normalizeQueryRows<TRow>(rows, sql)\n })\n }\n\n async run(sql: string, params: ReadonlyArray<unknown> = []): Promise<void> {\n await this.enqueue(async () => {\n await this.executeStatement(sql, params)\n })\n }\n\n async transaction<TReturn>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> {\n assertTransactionCallbackHasDriverArg(fn)\n return this.transactionWithDriver(fn)\n }\n\n async transactionWithDriver<TReturn>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> {\n return this.enqueue(async () => {\n await this.executeStatement(`BEGIN IMMEDIATE`)\n const transactionDriver = this.createTransactionDriver()\n\n try {\n const result = await fn(transactionDriver)\n await this.executeStatement(`COMMIT`)\n return result\n } catch (error) {\n try {\n await this.executeStatement(`ROLLBACK`)\n } catch {\n // Keep the original transaction error as the primary failure.\n }\n throw error\n }\n })\n }\n\n async close(): Promise<void> {\n if (typeof this.database.close !== `function`) {\n return\n }\n\n await Promise.resolve(this.database.close(this.database.path))\n }\n\n getDatabase(): TauriSQLiteDatabaseLike {\n return this.database\n }\n\n private async executeStatement(\n sql: string,\n params: ReadonlyArray<unknown> = [],\n ): Promise<void> {\n await this.database.execute(\n convertSqlitePlaceholdersToTauri(sql),\n params.length > 0 ? [...params] : undefined,\n )\n }\n\n private enqueue<TReturn>(\n operation: () => Promise<TReturn>,\n ): Promise<TReturn> {\n const queuedOperation = this.queue.then(operation, operation)\n this.queue = queuedOperation.then(\n () => undefined,\n () => undefined,\n )\n return queuedOperation\n }\n\n private createTransactionDriver(): SQLiteDriver {\n const transactionDriver: SQLiteDriver = {\n exec: async (sql) => {\n await this.executeStatement(sql)\n },\n query: async <TRow>(\n sql: string,\n params: ReadonlyArray<unknown> = [],\n ): Promise<ReadonlyArray<TRow>> => {\n const rows = await this.database.select<ReadonlyArray<TRow>>(\n convertSqlitePlaceholdersToTauri(sql),\n params.length > 0 ? [...params] : undefined,\n )\n return normalizeQueryRows<TRow>(rows, sql)\n },\n run: async (sql, params = []) => {\n await this.executeStatement(sql, params)\n },\n transaction: async <TReturn>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> => {\n assertTransactionCallbackHasDriverArg(fn)\n return this.runNestedTransaction(transactionDriver, fn)\n },\n transactionWithDriver: async <TReturn>(\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> => this.runNestedTransaction(transactionDriver, fn),\n }\n\n return transactionDriver\n }\n\n private async runNestedTransaction<TReturn>(\n transactionDriver: SQLiteDriver,\n fn: (transactionDriver: SQLiteDriver) => Promise<TReturn>,\n ): Promise<TReturn> {\n const savepointName = `tsdb_sp_${this.nextSavepointId}`\n this.nextSavepointId++\n await this.executeStatement(`SAVEPOINT ${savepointName}`)\n\n try {\n const result = await fn(transactionDriver)\n await this.executeStatement(`RELEASE SAVEPOINT ${savepointName}`)\n return result\n } catch (error) {\n await this.executeStatement(`ROLLBACK TO SAVEPOINT ${savepointName}`)\n await this.executeStatement(`RELEASE SAVEPOINT ${savepointName}`)\n throw error\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/tauri-db-sqlite-persistence",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.34",
|
|
4
4
|
"description": "Tauri SQLite persisted collection adapter for TanStack DB",
|
|
5
5
|
"author": "TanStack Team",
|
|
6
6
|
"license": "MIT",
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
"src"
|
|
50
50
|
],
|
|
51
51
|
"dependencies": {
|
|
52
|
-
"@tanstack/db-sqlite-persistence-core": "0.4.
|
|
52
|
+
"@tanstack/db-sqlite-persistence-core": "0.4.9"
|
|
53
53
|
},
|
|
54
54
|
"peerDependencies": {
|
|
55
55
|
"@tauri-apps/plugin-sql": "^2.3.2",
|
package/src/tauri-persistence.ts
CHANGED
|
@@ -96,6 +96,8 @@ function resolveAdapterBaseOptions(
|
|
|
96
96
|
options.appliedTxPruneMaxAgeSeconds ??
|
|
97
97
|
DEFAULT_APPLIED_TX_PRUNE_MAX_AGE_SECONDS,
|
|
98
98
|
pullSinceReloadThreshold: options.pullSinceReloadThreshold,
|
|
99
|
+
cacheGenerationClaimTtlMs: options.cacheGenerationClaimTtlMs,
|
|
100
|
+
now: options.now,
|
|
99
101
|
}
|
|
100
102
|
}
|
|
101
103
|
|
package/src/tauri-sql-driver.ts
CHANGED