@anfenn/dync 1.0.3 → 1.0.4

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.
Files changed (35) hide show
  1. package/README.md +31 -13
  2. package/dist/{chunk-66PSQW4D.js → chunk-PCA4XM2N.js} +17 -17
  3. package/dist/chunk-PCA4XM2N.js.map +1 -0
  4. package/dist/{dexie-Bv-fV10P.d.cts → dexie-1_xyU5MV.d.cts} +41 -38
  5. package/dist/{dexie-DJFApKsM.d.ts → dexie-ChZ0o0Sz.d.ts} +41 -38
  6. package/dist/dexie.cjs +40 -40
  7. package/dist/dexie.cjs.map +1 -1
  8. package/dist/dexie.d.cts +1 -1
  9. package/dist/dexie.d.ts +1 -1
  10. package/dist/dexie.js +40 -40
  11. package/dist/dexie.js.map +1 -1
  12. package/dist/index.cjs +16 -16
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.d.cts +2 -2
  15. package/dist/index.d.ts +2 -2
  16. package/dist/index.js +1 -1
  17. package/dist/{index.shared-CkYsQYyn.d.ts → index.shared-Byhq6TyU.d.ts} +1 -1
  18. package/dist/{index.shared-BGwvMH8f.d.cts → index.shared-DsDBNWlz.d.cts} +1 -1
  19. package/dist/react/index.cjs +2 -2
  20. package/dist/react/index.cjs.map +1 -1
  21. package/dist/react/index.d.cts +2 -2
  22. package/dist/react/index.d.ts +2 -2
  23. package/dist/react/index.js +1 -1
  24. package/package.json +1 -1
  25. package/src/core/tableEnhancers.ts +17 -17
  26. package/src/storage/dexie/DexieAdapter.ts +2 -2
  27. package/src/storage/dexie/{DexieStorageCollection.ts → DexieCollection.ts} +12 -12
  28. package/src/storage/dexie/DexieTable.ts +123 -0
  29. package/src/storage/dexie/{DexieStorageWhereClause.ts → DexieWhereClause.ts} +21 -21
  30. package/src/storage/dexie/index.ts +3 -3
  31. package/src/storage/memory/MemoryTable.ts +40 -40
  32. package/src/storage/sqlite/SQLiteTable.ts +34 -36
  33. package/src/storage/types.ts +22 -19
  34. package/dist/chunk-66PSQW4D.js.map +0 -1
  35. package/src/storage/dexie/DexieStorageTable.ts +0 -123
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/logger.ts","../src/types.ts","../src/createLocalId.ts","../src/helpers.ts","../src/addVisibilityChangeListener.ts","../src/core/StateManager.ts","../src/core/tableEnhancers.ts","../src/core/pullOperations.ts","../src/core/pushOperations.ts","../src/core/firstLoad.ts","../src/index.shared.ts","../src/storage/memory/MemoryQueryContext.ts","../src/storage/memory/types.ts","../src/storage/memory/MemoryCollection.ts","../src/storage/memory/MemoryWhereClause.ts","../src/storage/memory/MemoryTable.ts","../src/storage/memory/MemoryAdapter.ts","../src/storage/sqlite/helpers.ts","../src/storage/sqlite/SqliteQueryContext.ts","../src/storage/sqlite/SQLiteAdapter.ts","../src/storage/sqlite/SQLiteWhereClause.ts","../src/storage/sqlite/SQLiteTable.ts","../src/storage/sqlite/SQLiteCollection.ts"],"sourcesContent":["export type LogLevel = 'debug' | 'info' | 'warn' | 'error' | 'none';\n\nexport interface Logger {\n debug: (...args: any[]) => void;\n info: (...args: any[]) => void;\n warn: (...args: any[]) => void;\n error: (...args: any[]) => void;\n}\n\nexport function newLogger(base: Logger, min: LogLevel): Logger {\n const order: Record<LogLevel, number> = {\n debug: 10,\n info: 20,\n warn: 30,\n error: 40,\n none: 100,\n };\n const threshold = order[min];\n const enabled = (lvl: LogLevel) => order[lvl] >= threshold;\n return {\n debug: (...a: any[]) => enabled('debug') && base.debug?.(...a),\n info: (...a: any[]) => enabled('info') && base.info?.(...a),\n warn: (...a: any[]) => enabled('warn') && base.warn?.(...a),\n error: (...a: any[]) => enabled('error') && base.error?.(...a),\n };\n}\n","import type { Logger, LogLevel } from './logger';\nimport type { StorageTable } from './storage/types';\n\nexport const SERVER_PK = 'id';\nexport const LOCAL_PK = '_localId';\nexport const UPDATED_AT = 'updated_at';\n\nexport interface SyncedRecord {\n _localId: string;\n id?: any;\n updated_at: string;\n [k: string]: any;\n}\n\nexport interface ApiFunctions {\n add: (item: any) => Promise<any | undefined>;\n update: (id: any, changes: any, item: any) => Promise<boolean>;\n remove: (id: any) => Promise<void>;\n list: (lastUpdatedAt: Date) => Promise<any[]>;\n firstLoad?: (lastId: any) => Promise<any[]>;\n}\n\n// ============================================================================\n// Batch Sync Types\n// ============================================================================\n\n/**\n * Payload for a single change in a batch push request.\n */\nexport interface BatchPushPayload {\n table: string;\n action: 'add' | 'update' | 'remove';\n localId: string;\n // Server-assigned ID (for update/remove)\n id?: any;\n // The data to sync (for add/update)\n data?: any;\n}\n\n/**\n * Result for a single change in a batch push response.\n */\nexport interface BatchPushResult {\n // Client-generated local ID - used to correlate with the request\n localId: string;\n success: boolean;\n // Server-assigned ID (for successful adds)\n id?: any;\n // Server-assigned updated_at (for successful adds/updates)\n updated_at?: string;\n error?: string;\n}\n\n/**\n * Result for batch first load operation.\n */\nexport interface BatchFirstLoadResult {\n // Data grouped by table name\n data: Record<string, any[]>;\n // Pagination cursors by table name. Undefined value = table is complete\n cursors: Record<string, any>;\n // Whether there's more data to load for any table\n hasMore: boolean;\n}\n\n/**\n * Batch sync configuration for\n */\nexport interface BatchSync {\n /**\n * Array of table names to sync.\n */\n syncTables: string[];\n\n /**\n * Push all pending changes to the server in a single request.\n * @param changes Array of changes to push\n * @returns Array of results, one per change, correlated by localId\n */\n push: (changes: BatchPushPayload[]) => Promise<BatchPushResult[]>;\n\n /**\n * Pull changes from server since last sync.\n * @param since Map of table name to last pulled timestamp\n * @returns Map of table name to array of changed records\n */\n pull: (since: Record<string, Date>) => Promise<Record<string, any[]>>;\n\n /**\n * Initial data load for all tables (optional).\n * @param cursors Map of table name to pagination cursor\n * @returns Batch first load result with data, cursors, and hasMore flag\n */\n firstLoad?: (cursors: Record<string, any>) => Promise<BatchFirstLoadResult>;\n}\n\nexport type MissingRemoteRecordStrategy = 'ignore' | 'delete-local-record' | 'insert-remote-record';\nexport type ConflictResolutionStrategy = 'local-wins' | 'remote-wins' | 'try-shallow-merge';\n\nexport type AfterRemoteAddCallback = (tableName: string, item: SyncedRecord) => void;\nexport type MissingRemoteRecordDuringUpdateCallback = (strategy: MissingRemoteRecordStrategy, item: SyncedRecord) => void;\n\nexport interface SyncOptions {\n syncInterval?: number;\n logger?: Logger;\n minLogLevel?: LogLevel;\n onAfterRemoteAdd?: AfterRemoteAddCallback;\n missingRemoteRecordDuringUpdateStrategy?: MissingRemoteRecordStrategy;\n onAfterMissingRemoteRecordDuringUpdate?: MissingRemoteRecordDuringUpdateCallback;\n conflictResolutionStrategy?: ConflictResolutionStrategy;\n}\n\nexport interface FirstLoadProgress {\n table: string;\n inserted: number;\n updated: number;\n total: number;\n}\n\nexport type FirstLoadProgressCallback = (progress: FirstLoadProgress) => void;\n\nexport type SyncApi = {\n enable: (enabled: boolean) => Promise<void>;\n startFirstLoad: (onProgress?: FirstLoadProgressCallback) => Promise<void>;\n getState: () => SyncState;\n resolveConflict: (localId: string, keepLocal: boolean) => Promise<void>;\n onStateChange: (fn: (state: SyncState) => void) => () => void;\n onMutation: (fn: (event: MutationEvent) => void) => () => void;\n};\n\nexport interface MutationEvent {\n type: 'add' | 'update' | 'delete' | 'bulkAdd' | 'bulkPut' | 'bulkDelete' | 'clear' | 'put' | 'modify' | 'pull';\n tableName: string;\n keys?: unknown[];\n}\n\nexport interface PersistedSyncState {\n firstLoadDone: boolean;\n pendingChanges: PendingChange[];\n lastPulled: Record<string, string>;\n error?: Error;\n conflicts?: Record<string, Conflict>;\n}\n\nexport type SyncStatus = 'disabled' | 'disabling' | 'idle' | 'syncing' | 'error';\n\nexport interface SyncState extends PersistedSyncState {\n status: SyncStatus;\n hydrated: boolean;\n}\n\nexport enum SyncAction {\n Create = 'create',\n Update = 'update',\n Remove = 'remove', // Remote removes are a noop if no record found\n}\n\nexport interface PendingChange {\n action: SyncAction;\n tableName: string;\n localId: string;\n id?: any;\n version: number;\n changes?: any;\n before?: any;\n after?: any;\n}\n\nexport interface Conflict {\n tableName: string;\n fields: FieldConflict[];\n}\n\nexport interface FieldConflict {\n key: string;\n localValue: any;\n remoteValue: any;\n}\n\nexport type TableMap<TStoreMap extends Record<string, unknown>> = {\n [K in keyof TStoreMap]: StorageTable<TStoreMap[K]>;\n};\n\nexport type VisibilitySubscription = {\n remove: () => void;\n};\n","export function createLocalId(): string {\n if (typeof globalThis.crypto?.randomUUID === 'function') {\n return globalThis.crypto.randomUUID();\n }\n throw new Error('createLocalId(): crypto.randomUUID is not available');\n}\n","import { SyncAction } from './types';\nimport { createLocalId } from './createLocalId';\n\nexport { createLocalId };\n\nexport function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve) => {\n if (signal?.aborted) {\n resolve();\n return;\n }\n const timer = setTimeout(resolve, ms);\n signal?.addEventListener('abort', () => {\n clearTimeout(timer);\n resolve();\n });\n });\n}\n\nexport function changeKeysTo(input: any | any[], toIdKey: string, toUpdatedAtKey: string, toDeletedKey: string) {\n if (!input) return input;\n const isArray = Array.isArray(input);\n const result = (isArray ? input : [input]).map((item) => {\n const { id, updated_at, deleted, ...rest } = item;\n return {\n [toIdKey]: id,\n [toUpdatedAtKey]: updated_at,\n [toDeletedKey]: deleted,\n ...rest,\n };\n });\n return isArray ? result : result[0];\n}\n\nexport function changeKeysFrom(input: any | any[], fromIdKey: string, fromUpdatedAtKey: string, fromDeletedKey: string) {\n if (!input) return input;\n const isArray = Array.isArray(input);\n const result = (isArray ? input : [input]).map((item) => {\n const { [fromIdKey]: id, [fromUpdatedAtKey]: updated_at, [fromDeletedKey]: deleted, ...rest } = item;\n return {\n id,\n updated_at,\n deleted,\n ...rest,\n };\n });\n return isArray ? result : result[0];\n}\n\nexport function orderFor(a: SyncAction): number {\n switch (a) {\n case SyncAction.Create:\n return 1;\n case SyncAction.Update:\n return 2;\n case SyncAction.Remove:\n return 3;\n }\n}\n\nexport function omitFields(item: any, fields: string[]) {\n const result = { ...item };\n for (const k of fields) delete result[k];\n return result;\n}\n\nexport function addOnSetDo(obj: any, key: string, fn: (v: any) => void): void {\n let value = obj[key];\n\n Object.defineProperty(obj, key, {\n get() {\n return value;\n },\n set(newVal) {\n value = newVal;\n fn(value);\n },\n enumerable: true,\n configurable: false,\n });\n}\n\nexport function deleteKeyIfEmptyObject(obj: any, key: string) {\n if (obj[key] && Object.keys(obj[key]).length === 0) {\n delete obj[key];\n }\n}\n","import type { VisibilitySubscription } from './types';\n\nexport function addVisibilityChangeListener(\n add: boolean,\n currentSubscription: VisibilitySubscription | undefined,\n onVisibilityChange: (isVisible: boolean) => void,\n): VisibilitySubscription | undefined {\n if (add && !currentSubscription) {\n const handler = () => {\n onVisibilityChange(document.visibilityState === 'visible');\n };\n document.addEventListener('visibilitychange', handler);\n\n return {\n remove: () => {\n document.removeEventListener('visibilitychange', handler);\n },\n };\n } else if (!add && currentSubscription) {\n currentSubscription.remove();\n return undefined;\n }\n return currentSubscription;\n}\n","import { deleteKeyIfEmptyObject, omitFields } from '../helpers';\nimport { LOCAL_PK, UPDATED_AT, SyncAction, type PendingChange, type PersistedSyncState, type SyncState, type SyncStatus } from '../types';\nimport type { StorageAdapter } from '../storage/types';\n\nconst LOCAL_ONLY_SYNC_FIELDS = [LOCAL_PK, UPDATED_AT];\n\n// Internal table name used for storing sync state\nexport const DYNC_STATE_TABLE = '_dync_state';\nconst SYNC_STATE_KEY = 'sync_state';\n\ninterface StateRow {\n [LOCAL_PK]: string;\n value: string;\n}\n\nconst DEFAULT_STATE: PersistedSyncState = {\n firstLoadDone: false,\n pendingChanges: [],\n lastPulled: {},\n};\n\ninterface StateContext {\n initialStatus?: SyncStatus;\n storageAdapter?: StorageAdapter;\n}\n\nexport interface StateHelpers {\n hydrate(): Promise<void>;\n getState(): PersistedSyncState;\n setState(setterOrState: PersistedSyncState | ((state: PersistedSyncState) => Partial<PersistedSyncState>)): Promise<void>;\n setErrorInMemory(error: Error): void;\n addPendingChange(change: Omit<PendingChange, 'version'>): Promise<void>;\n samePendingVersion(tableName: string, localId: string, version: number): boolean;\n removePendingChange(localId: string, tableName: string): Promise<void>;\n updatePendingChange(tableName: string, localId: string, action: SyncAction, id?: any): Promise<void>;\n setPendingChangeBefore(tableName: string, localId: string, before: any): Promise<void>;\n hasConflicts(localId: string): boolean;\n getSyncStatus(): SyncStatus;\n setSyncStatus(status: SyncStatus): void;\n getSyncState(): SyncState;\n subscribe(listener: (state: SyncState) => void): () => void;\n}\n\nexport class StateManager implements StateHelpers {\n private persistedState: PersistedSyncState;\n private syncStatus: SyncStatus;\n private readonly listeners = new Set<(state: SyncState) => void>();\n private readonly storageAdapter?: StorageAdapter;\n private hydrated = false;\n\n constructor(ctx: StateContext) {\n this.storageAdapter = ctx.storageAdapter;\n // Start with default state, hydrate() will load from database\n this.persistedState = DEFAULT_STATE;\n this.syncStatus = ctx.initialStatus ?? 'disabled';\n }\n\n /**\n * Load state from the database. Called after stores() defines the schema.\n */\n async hydrate(): Promise<void> {\n if (this.hydrated) return;\n\n if (!this.storageAdapter) {\n throw new Error('Cannot hydrate state without a storage adapter');\n }\n\n const table = this.storageAdapter.table<StateRow>(DYNC_STATE_TABLE);\n const row = await table.get(SYNC_STATE_KEY);\n if (row?.value) {\n this.persistedState = parseStoredState(row.value);\n }\n\n this.hydrated = true;\n\n // Notify subscribers if state was loaded from database\n this.emit();\n }\n\n private emit(): void {\n this.listeners.forEach((fn) => fn(this.getSyncState()));\n }\n\n private async persist(): Promise<void> {\n // Only persist after hydration (i.e., after database is opened)\n if (!this.hydrated || !this.storageAdapter) return;\n\n this.emit();\n\n const table = this.storageAdapter.table<StateRow>(DYNC_STATE_TABLE);\n await table.put({ [LOCAL_PK]: SYNC_STATE_KEY, value: JSON.stringify(this.persistedState) } as StateRow);\n }\n\n getState(): PersistedSyncState {\n return clonePersistedState(this.persistedState);\n }\n\n setState(setterOrState: PersistedSyncState | ((state: PersistedSyncState) => Partial<PersistedSyncState>)): Promise<void> {\n this.persistedState = resolveNextState(this.persistedState, setterOrState);\n return this.persist();\n }\n\n /**\n * Set error in memory only without persisting to database.\n * Used when the database itself failed to open.\n */\n setErrorInMemory(error: Error): void {\n this.persistedState = { ...this.persistedState, error };\n this.emit();\n }\n\n addPendingChange(change: Omit<PendingChange, 'version'>): Promise<void> {\n const next = clonePersistedState(this.persistedState);\n const queueItem = next.pendingChanges.find((p) => p.localId === change.localId && p.tableName === change.tableName);\n\n const omittedChanges = omitFields(change.changes, LOCAL_ONLY_SYNC_FIELDS);\n const omittedBefore = omitFields(change.before, LOCAL_ONLY_SYNC_FIELDS);\n const omittedAfter = omitFields(change.after, LOCAL_ONLY_SYNC_FIELDS);\n const hasChanges = Object.keys(omittedChanges || {}).length > 0;\n const action = change.action;\n\n if (queueItem) {\n if (queueItem.action === SyncAction.Remove) {\n return Promise.resolve();\n }\n\n queueItem.version += 1;\n\n if (action === SyncAction.Remove) {\n queueItem.action = SyncAction.Remove;\n } else if (hasChanges) {\n queueItem.changes = { ...queueItem.changes, ...omittedChanges };\n queueItem.after = { ...queueItem.after, ...omittedAfter };\n }\n } else if (action === SyncAction.Remove || hasChanges) {\n next.pendingChanges = [...next.pendingChanges];\n next.pendingChanges.push({\n action,\n tableName: change.tableName,\n localId: change.localId,\n id: change.id,\n version: 1,\n changes: omittedChanges,\n before: omittedBefore,\n after: omittedAfter,\n });\n }\n\n this.persistedState = next;\n return this.persist();\n }\n\n samePendingVersion(tableName: string, localId: string, version: number): boolean {\n return this.persistedState.pendingChanges.find((p) => p.localId === localId && p.tableName === tableName)?.version === version;\n }\n\n removePendingChange(localId: string, tableName: string): Promise<void> {\n const next = clonePersistedState(this.persistedState);\n next.pendingChanges = next.pendingChanges.filter((p) => !(p.localId === localId && p.tableName === tableName));\n this.persistedState = next;\n return this.persist();\n }\n\n updatePendingChange(tableName: string, localId: string, action: SyncAction, id?: any): Promise<void> {\n const next = clonePersistedState(this.persistedState);\n const changeItem = next.pendingChanges.find((p) => p.tableName === tableName && p.localId === localId);\n if (changeItem) {\n changeItem.action = action;\n if (id) changeItem.id = id;\n this.persistedState = next;\n return this.persist();\n }\n return Promise.resolve();\n }\n\n setPendingChangeBefore(tableName: string, localId: string, before: any): Promise<void> {\n const next = clonePersistedState(this.persistedState);\n const changeItem = next.pendingChanges.find((p) => p.tableName === tableName && p.localId === localId);\n if (changeItem) {\n changeItem.before = { ...(changeItem.before ?? {}), ...before };\n this.persistedState = next;\n return this.persist();\n }\n return Promise.resolve();\n }\n\n hasConflicts(localId: string): boolean {\n return Boolean(this.persistedState.conflicts?.[localId]);\n }\n\n getSyncStatus(): SyncStatus {\n return this.syncStatus;\n }\n\n setSyncStatus(status: SyncStatus): void {\n if (this.syncStatus === status) return;\n this.syncStatus = status;\n this.emit();\n }\n\n getSyncState(): SyncState {\n return buildSyncState(this.persistedState, this.syncStatus, this.hydrated);\n }\n\n subscribe(listener: (state: SyncState) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n}\n\nfunction parseStoredState(stored: string): PersistedSyncState {\n const parsed = JSON.parse(stored);\n if (parsed.pendingChanges) {\n parsed.pendingChanges = parsed.pendingChanges.map((change: any) => ({\n ...change,\n timestamp: change.timestamp ? new Date(change.timestamp) : change.timestamp,\n }));\n }\n return parsed;\n}\n\nfunction resolveNextState(\n current: PersistedSyncState,\n setterOrState: PersistedSyncState | ((state: PersistedSyncState) => Partial<PersistedSyncState>),\n): PersistedSyncState {\n if (typeof setterOrState === 'function') {\n return { ...current, ...setterOrState(clonePersistedState(current)) };\n }\n return { ...current, ...setterOrState };\n}\n\nfunction buildSyncState(state: PersistedSyncState, status: SyncStatus, hydrated: boolean): SyncState {\n const persisted = clonePersistedState(state);\n const syncState: SyncState = {\n ...persisted,\n status,\n hydrated,\n };\n deleteKeyIfEmptyObject(syncState, 'conflicts');\n return syncState;\n}\n\nfunction clonePersistedState(state: PersistedSyncState): PersistedSyncState {\n return {\n ...state,\n pendingChanges: state.pendingChanges.map((change) => ({\n ...change,\n changes: cloneRecord(change.changes),\n before: cloneRecord(change.before),\n after: cloneRecord(change.after),\n })),\n lastPulled: { ...state.lastPulled },\n conflicts: cloneConflicts(state.conflicts),\n };\n}\n\nfunction cloneConflicts(conflicts: SyncState['conflicts'] | undefined): SyncState['conflicts'] | undefined {\n if (!conflicts) return undefined;\n const next: NonNullable<SyncState['conflicts']> = {};\n for (const [key, value] of Object.entries(conflicts)) {\n next[key] = {\n tableName: value.tableName,\n fields: value.fields.map((field) => ({ ...field })),\n };\n }\n return next;\n}\n\nfunction cloneRecord<T extends Record<string, any> | null | undefined>(record: T): T {\n if (!record) return record;\n return { ...record } as T;\n}\n","import { createLocalId } from '../helpers';\nimport { SyncAction, type MutationEvent, type SyncedRecord } from '../types';\nimport type { StorageTable } from '../storage/types';\nimport { DYNC_STATE_TABLE, type StateHelpers } from './StateManager';\nimport type { WithTransaction } from './types';\nexport type EmitMutation = (event: MutationEvent) => void;\n\n/**\n * Wraps a table with mutation emission for reactive updates.\n * This allows useLiveQuery to work with any table.\n */\nexport function wrapWithMutationEmitter<T>(table: StorageTable<T>, tableName: string, emitMutation: EmitMutation): void {\n const rawAdd = table.raw.add;\n const rawPut = table.raw.put;\n const rawUpdate = table.raw.update;\n const rawDelete = table.raw.delete;\n const rawBulkAdd = table.raw.bulkAdd;\n const rawBulkPut = table.raw.bulkPut;\n const rawBulkUpdate = table.raw.bulkUpdate;\n const rawBulkDelete = table.raw.bulkDelete;\n const rawClear = table.raw.clear;\n\n table.add = async (item: T) => {\n const result = await rawAdd(item);\n emitMutation({ type: 'add', tableName, keys: [result] });\n return result;\n };\n\n table.put = async (item: T) => {\n const result = await rawPut(item);\n emitMutation({ type: 'update', tableName, keys: [result] });\n return result;\n };\n\n table.update = async (key: unknown, changes: Partial<T>) => {\n const result = await rawUpdate(key, changes);\n if (result > 0) {\n emitMutation({ type: 'update', tableName, keys: [key] });\n }\n return result;\n };\n\n table.delete = async (key: unknown) => {\n await rawDelete(key);\n emitMutation({ type: 'delete', tableName, keys: [key] });\n };\n\n table.bulkAdd = async (items: T[]) => {\n const result = await rawBulkAdd(items);\n if (items.length > 0) {\n emitMutation({ type: 'add', tableName });\n }\n return result;\n };\n\n table.bulkPut = async (items: T[]) => {\n const result = await rawBulkPut(items);\n if (items.length > 0) {\n emitMutation({ type: 'update', tableName });\n }\n return result;\n };\n\n table.bulkUpdate = async (keysAndChanges: Array<{ key: unknown; changes: Partial<T> }>) => {\n const result = await rawBulkUpdate(keysAndChanges);\n if (result > 0) {\n emitMutation({ type: 'update', tableName, keys: keysAndChanges.map((kc) => kc.key) });\n }\n return result;\n };\n\n table.bulkDelete = async (keys: unknown[]) => {\n await rawBulkDelete(keys);\n if (keys.length > 0) {\n emitMutation({ type: 'delete', tableName });\n }\n };\n\n table.clear = async () => {\n await rawClear();\n emitMutation({ type: 'delete', tableName });\n };\n}\n\ninterface SetupOptions {\n owner: object;\n tableCache: Map<string, StorageTable<any>>;\n enhancedTables: Set<string>;\n getTable: (name: string) => StorageTable<any>;\n}\n\nexport function setupEnhancedTables({ owner, tableCache, enhancedTables, getTable }: SetupOptions, tableNames: string[]): void {\n for (const tableName of tableNames) {\n tableCache.delete(tableName);\n enhancedTables.delete(tableName);\n\n if (!Object.prototype.hasOwnProperty.call(owner, tableName)) {\n Object.defineProperty(owner, tableName, {\n get: () => getTable(tableName),\n enumerable: true,\n configurable: true,\n });\n }\n }\n}\n\ninterface EnhanceOptions<T> {\n table: StorageTable<T & SyncedRecord>;\n tableName: string;\n withTransaction: WithTransaction;\n state: StateHelpers;\n enhancedTables: Set<string>;\n emitMutation: EmitMutation;\n}\n\nexport function enhanceSyncTable<T>({ table, tableName, withTransaction, state, enhancedTables, emitMutation }: EnhanceOptions<T>): void {\n const rawAdd = table.raw.add;\n const rawPut = table.raw.put;\n const rawUpdate = table.raw.update;\n const rawDelete = table.raw.delete;\n const rawBulkAdd = table.raw.bulkAdd;\n const rawBulkPut = table.raw.bulkPut;\n const rawBulkUpdate = table.raw.bulkUpdate;\n const rawBulkDelete = table.raw.bulkDelete;\n const rawClear = table.raw.clear;\n\n const wrappedAdd = async (item: any) => {\n let localId = item._localId;\n if (!localId) localId = createLocalId();\n\n const syncedItem = {\n ...item,\n _localId: localId,\n updated_at: new Date().toISOString(),\n };\n\n let result: any;\n await withTransaction('rw', [tableName, DYNC_STATE_TABLE], async () => {\n result = await rawAdd(syncedItem);\n\n await state.addPendingChange({\n action: SyncAction.Create,\n tableName,\n localId,\n changes: syncedItem,\n before: null,\n after: syncedItem,\n });\n });\n\n emitMutation({ type: 'add', tableName, keys: [localId] });\n return result;\n };\n\n const wrappedPut = async (item: any) => {\n let localId = item._localId;\n if (!localId) localId = createLocalId();\n\n const syncedItem = {\n ...item,\n _localId: localId,\n updated_at: new Date().toISOString(),\n };\n\n let result: any;\n let isUpdate = false;\n let existingRecord: any;\n\n await withTransaction('rw', [tableName, DYNC_STATE_TABLE], async (tables) => {\n const txTable = tables[tableName]!;\n existingRecord = await txTable.get(localId);\n isUpdate = !!existingRecord;\n\n result = await rawPut(syncedItem);\n\n await state.addPendingChange({\n action: isUpdate ? SyncAction.Update : SyncAction.Create,\n tableName,\n localId,\n id: existingRecord?.id,\n changes: syncedItem,\n before: existingRecord ?? null,\n after: syncedItem,\n });\n });\n\n emitMutation({ type: isUpdate ? 'update' : 'add', tableName, keys: [localId] });\n return result;\n };\n\n const wrappedUpdate = async (key: any, changes: any) => {\n const updatedChanges = {\n ...changes,\n updated_at: new Date().toISOString(),\n };\n\n let result = 0;\n await withTransaction('rw', [tableName, DYNC_STATE_TABLE], async (tables) => {\n const txTable = tables[tableName]!;\n const record = await txTable.get(key);\n if (!record) {\n throw new Error(`Record with key=${key} not found`);\n }\n\n result = (await rawUpdate(key, updatedChanges as any)) ?? 0;\n if (result > 0) {\n await state.addPendingChange({\n action: SyncAction.Update,\n tableName,\n localId: key,\n id: record.id,\n changes: updatedChanges,\n before: record,\n after: { ...record, ...updatedChanges },\n });\n }\n });\n\n if (result > 0) {\n emitMutation({ type: 'update', tableName, keys: [key] });\n }\n return result;\n };\n\n const wrappedDelete = async (key: any) => {\n let deletedLocalId: string | undefined;\n await withTransaction('rw', [tableName, DYNC_STATE_TABLE], async (tables) => {\n const txTable = tables[tableName]!;\n const record = await txTable.get(key);\n\n await rawDelete(key);\n\n if (record) {\n deletedLocalId = record._localId;\n await state.addPendingChange({\n action: SyncAction.Remove,\n tableName,\n localId: record._localId,\n id: record.id,\n changes: null,\n before: record,\n });\n }\n });\n\n if (deletedLocalId) {\n emitMutation({ type: 'delete', tableName, keys: [deletedLocalId] });\n }\n };\n\n const wrappedBulkAdd = async (items: any[]) => {\n if (items.length === 0) return;\n\n const now = new Date().toISOString();\n const syncedItems = items.map((item) => {\n const localId = item._localId || createLocalId();\n return {\n ...item,\n _localId: localId,\n updated_at: now,\n };\n });\n\n let result: any;\n await withTransaction('rw', [tableName, DYNC_STATE_TABLE], async () => {\n result = await rawBulkAdd(syncedItems);\n\n for (const syncedItem of syncedItems) {\n await state.addPendingChange({\n action: SyncAction.Create,\n tableName,\n localId: syncedItem._localId,\n changes: syncedItem,\n before: null,\n after: syncedItem,\n });\n }\n });\n\n emitMutation({ type: 'add', tableName, keys: syncedItems.map((i) => i._localId) });\n return result;\n };\n\n const wrappedBulkPut = async (items: any[]) => {\n if (items.length === 0) return;\n\n const now = new Date().toISOString();\n const syncedItems = items.map((item) => {\n const localId = item._localId || createLocalId();\n return {\n ...item,\n _localId: localId,\n updated_at: now,\n };\n });\n const localIds = syncedItems.map((i) => i._localId);\n\n let result: any;\n await withTransaction('rw', [tableName, DYNC_STATE_TABLE], async (tables) => {\n const txTable = tables[tableName]!;\n\n // Check which items already exist\n const existingRecords = await txTable.bulkGet(localIds);\n const existingMap = new Map<string, any>();\n for (let i = 0; i < localIds.length; i++) {\n if (existingRecords[i]) {\n existingMap.set(localIds[i], existingRecords[i]);\n }\n }\n\n result = await rawBulkPut(syncedItems);\n\n for (const syncedItem of syncedItems) {\n const existing = existingMap.get(syncedItem._localId);\n await state.addPendingChange({\n action: existing ? SyncAction.Update : SyncAction.Create,\n tableName,\n localId: syncedItem._localId,\n id: existing?.id,\n changes: syncedItem,\n before: existing ?? null,\n after: syncedItem,\n });\n }\n });\n\n emitMutation({ type: 'update', tableName, keys: localIds });\n return result;\n };\n\n const wrappedBulkUpdate = async (keysAndChanges: Array<{ key: any; changes: any }>) => {\n if (keysAndChanges.length === 0) return 0;\n\n const now = new Date().toISOString();\n const updatedKeysAndChanges = keysAndChanges.map(({ key, changes }) => ({\n key,\n changes: {\n ...changes,\n updated_at: now,\n },\n }));\n\n let result = 0;\n const updatedKeys: string[] = [];\n\n await withTransaction('rw', [tableName, DYNC_STATE_TABLE], async (tables) => {\n const txTable = tables[tableName]!;\n\n // Get all records before updating\n const keys = updatedKeysAndChanges.map((kc) => kc.key);\n const records = await txTable.bulkGet(keys);\n const recordMap = new Map<string, any>();\n for (let i = 0; i < keys.length; i++) {\n if (records[i]) {\n recordMap.set(String(keys[i]), records[i]);\n }\n }\n\n result = await rawBulkUpdate(updatedKeysAndChanges);\n\n for (const { key, changes } of updatedKeysAndChanges) {\n const record = recordMap.get(String(key));\n if (record) {\n updatedKeys.push(record._localId);\n await state.addPendingChange({\n action: SyncAction.Update,\n tableName,\n localId: record._localId,\n id: record.id,\n changes,\n before: record,\n after: { ...record, ...changes },\n });\n }\n }\n });\n\n if (updatedKeys.length > 0) {\n emitMutation({ type: 'update', tableName, keys: updatedKeys });\n }\n return result;\n };\n\n const wrappedBulkDelete = async (keys: any[]) => {\n if (keys.length === 0) return;\n\n const deletedLocalIds: string[] = [];\n await withTransaction('rw', [tableName, DYNC_STATE_TABLE], async (tables) => {\n const txTable = tables[tableName]!;\n\n // Get all records before deleting\n const records = await txTable.bulkGet(keys);\n\n await rawBulkDelete(keys);\n\n for (const record of records) {\n if (record) {\n deletedLocalIds.push(record._localId);\n await state.addPendingChange({\n action: SyncAction.Remove,\n tableName,\n localId: record._localId,\n id: record.id,\n changes: null,\n before: record,\n });\n }\n }\n });\n\n if (deletedLocalIds.length > 0) {\n emitMutation({ type: 'delete', tableName, keys: deletedLocalIds });\n }\n };\n\n const wrappedClear = async () => {\n const deletedLocalIds: string[] = [];\n await withTransaction('rw', [tableName, DYNC_STATE_TABLE], async (tables) => {\n const txTable = tables[tableName]!;\n\n // Get all records before clearing\n const allRecords = await txTable.toArray();\n\n await rawClear();\n\n for (const record of allRecords) {\n if (record._localId) {\n deletedLocalIds.push(record._localId);\n await state.addPendingChange({\n action: SyncAction.Remove,\n tableName,\n localId: record._localId,\n id: record.id,\n changes: null,\n before: record,\n });\n }\n }\n });\n\n if (deletedLocalIds.length > 0) {\n emitMutation({ type: 'delete', tableName, keys: deletedLocalIds });\n }\n };\n\n table.add = wrappedAdd;\n table.put = wrappedPut;\n table.update = wrappedUpdate;\n table.delete = wrappedDelete;\n table.bulkAdd = wrappedBulkAdd;\n table.bulkPut = wrappedBulkPut;\n table.bulkUpdate = wrappedBulkUpdate;\n table.bulkDelete = wrappedBulkDelete;\n table.clear = wrappedClear;\n\n enhancedTables.add(tableName);\n}\n","import { createLocalId } from '../helpers';\nimport type { Logger } from '../logger';\nimport type { ApiFunctions, BatchSync, ConflictResolutionStrategy, FieldConflict, SyncedRecord } from '../types';\nimport { SyncAction } from '../types';\nimport type { StorageTable } from '../storage/types';\nimport { DYNC_STATE_TABLE, type StateHelpers } from './StateManager';\nimport type { WithTransaction } from './types';\n\nexport interface PullContext {\n logger: Logger;\n state: StateHelpers;\n table: <T>(name: string) => StorageTable<T>;\n withTransaction: WithTransaction;\n conflictResolutionStrategy: ConflictResolutionStrategy;\n}\n\nexport interface PullAllContext extends PullContext {\n syncApis: Record<string, ApiFunctions>;\n}\n\nexport interface PullAllBatchContext extends PullContext {\n batchSync: BatchSync;\n}\n\nexport async function pullAll(ctx: PullAllContext): Promise<{ error?: Error; changedTables: string[] }> {\n let firstSyncError: Error | undefined;\n const changedTables: string[] = [];\n for (const [tableName, api] of Object.entries(ctx.syncApis)) {\n try {\n const lastPulled = ctx.state.getState().lastPulled[tableName];\n const since = lastPulled ? new Date(lastPulled) : new Date(0);\n\n ctx.logger.debug(`[dync] pull:start tableName=${tableName} since=${since.toISOString()}`);\n\n const serverData = (await api.list(since)) as SyncedRecord[];\n const changed = await processPullData(tableName, serverData, since, ctx);\n if (changed) changedTables.push(tableName);\n } catch (err) {\n firstSyncError = firstSyncError ?? (err as Error);\n ctx.logger.error(`[dync] pull:error tableName=${tableName}`, err);\n }\n }\n return { error: firstSyncError, changedTables };\n}\n\nasync function handleRemoteItemUpdate(table: StorageTable<any>, tableName: string, localItem: any, remote: any, ctx: PullContext): Promise<void> {\n const pendingChange = ctx.state.getState().pendingChanges.find((p) => p.tableName === tableName && p.localId === localItem._localId);\n const conflictStrategy = ctx.conflictResolutionStrategy;\n\n if (pendingChange) {\n ctx.logger.debug(`[dync] pull:conflict-strategy:${conflictStrategy} tableName=${tableName} id=${remote.id}`);\n\n switch (conflictStrategy) {\n case 'local-wins':\n break;\n\n case 'remote-wins': {\n const merged = { ...remote, _localId: localItem._localId };\n await table.raw.update(localItem._localId, merged);\n await ctx.state.removePendingChange(localItem._localId, tableName);\n break;\n }\n\n case 'try-shallow-merge': {\n const changes = pendingChange.changes || {};\n const before = pendingChange.before || {};\n const fields: FieldConflict[] = Object.entries(changes)\n .filter(([k, localValue]) => k in before && k in remote && before[k] !== remote[k] && localValue !== remote[k])\n .map(([key, localValue]) => ({ key, localValue, remoteValue: remote[key] }));\n\n if (fields.length > 0) {\n ctx.logger.warn(`[dync] pull:${conflictStrategy}:conflicts-found`, JSON.stringify(fields, null, 4));\n // Store or update conflict with CURRENT field values (prevents stale conflicts)\n await ctx.state.setState((syncState) => ({\n ...syncState,\n conflicts: {\n ...(syncState.conflicts || {}),\n [localItem._localId]: { tableName, fields },\n },\n }));\n } else {\n const localChangedKeys = Object.keys(changes);\n const preservedLocal: any = { _localId: localItem._localId };\n for (const k of localChangedKeys) {\n if (k in localItem) preservedLocal[k] = localItem[k];\n }\n\n const merged = { ...remote, ...preservedLocal };\n await table.raw.update(localItem._localId, merged);\n\n // Clear conflict for the current pending change - it no longer conflicts\n await ctx.state.setState((syncState) => {\n const ss = { ...syncState };\n delete ss.conflicts?.[localItem._localId];\n return ss;\n });\n }\n break;\n }\n }\n } else {\n const merged = { ...localItem, ...remote };\n await table.raw.update(localItem._localId, merged);\n ctx.logger.debug(`[dync] pull:merge-remote tableName=${tableName} id=${remote.id}`);\n }\n}\n\n// ============================================================================\n// Batch Mode Pull Operations\n// ============================================================================\n\nexport async function pullAllBatch(ctx: PullAllBatchContext): Promise<{ error?: Error; changedTables: string[] }> {\n let firstSyncError: Error | undefined;\n const changedTables: string[] = [];\n\n try {\n // Build since map for all synced tables\n const sinceMap: Record<string, Date> = {};\n for (const tableName of ctx.batchSync.syncTables) {\n const lastPulled = ctx.state.getState().lastPulled[tableName];\n sinceMap[tableName] = lastPulled ? new Date(lastPulled) : new Date(0);\n }\n\n ctx.logger.debug(`[dync] pull:batch:start tables=${[...ctx.batchSync.syncTables].join(',')}`, sinceMap);\n\n // Single batch pull request\n const serverDataByTable = await ctx.batchSync.pull(sinceMap);\n\n // Process each table's data\n for (const [tableName, serverData] of Object.entries(serverDataByTable)) {\n if (!ctx.batchSync.syncTables.includes(tableName)) {\n ctx.logger.warn(`[dync] pull:batch:unknown-table tableName=${tableName}`);\n continue;\n }\n\n try {\n const changed = await processPullData(tableName, serverData as SyncedRecord[], sinceMap[tableName]!, ctx);\n if (changed) changedTables.push(tableName);\n } catch (err) {\n firstSyncError = firstSyncError ?? (err as Error);\n ctx.logger.error(`[dync] pull:batch:error tableName=${tableName}`, err);\n }\n }\n } catch (err) {\n firstSyncError = err as Error;\n ctx.logger.error(`[dync] pull:batch:error`, err);\n }\n\n return { error: firstSyncError, changedTables };\n}\n\nasync function processPullData(tableName: string, serverData: SyncedRecord[], since: Date, ctx: PullContext): Promise<boolean> {\n if (!serverData?.length) return false;\n\n ctx.logger.debug(`[dync] pull:process tableName=${tableName} count=${serverData.length}`);\n\n let newest = since;\n let hasChanges = false;\n\n await ctx.withTransaction('rw', [tableName, DYNC_STATE_TABLE], async (tables) => {\n const txTable = tables[tableName]!;\n const pendingRemovalById = new Set(\n ctx.state\n .getState()\n .pendingChanges.filter((p) => p.tableName === tableName && p.action === SyncAction.Remove)\n .map((p) => p.id),\n );\n\n for (const remote of serverData) {\n const remoteUpdated = new Date(remote.updated_at);\n if (remoteUpdated > newest) newest = remoteUpdated;\n\n if (pendingRemovalById.has(remote.id)) {\n ctx.logger.debug(`[dync] pull:skip-pending-remove tableName=${tableName} id=${remote.id}`);\n continue;\n }\n\n const localItem = await txTable.where('id').equals(remote.id).first();\n\n if (remote.deleted) {\n if (localItem) {\n await txTable.raw.delete(localItem._localId);\n ctx.logger.debug(`[dync] pull:remove tableName=${tableName} id=${remote.id}`);\n hasChanges = true;\n }\n continue;\n }\n\n delete remote.deleted;\n\n if (localItem) {\n await handleRemoteItemUpdate(txTable, tableName, localItem, remote, ctx);\n hasChanges = true;\n } else {\n const newLocalItem = { ...remote, _localId: createLocalId() };\n await txTable.raw.add(newLocalItem);\n ctx.logger.debug(`[dync] pull:add tableName=${tableName} id=${remote.id}`);\n hasChanges = true;\n }\n }\n\n await ctx.state.setState((syncState) => ({\n ...syncState,\n lastPulled: {\n ...syncState.lastPulled,\n [tableName]: newest.toISOString(),\n },\n }));\n });\n\n return hasChanges;\n}\n","import { createLocalId, orderFor } from '../helpers';\nimport type { Logger } from '../logger';\nimport type { ApiFunctions, BatchPushPayload, BatchPushResult, BatchSync, PendingChange, SyncOptions } from '../types';\nimport { SyncAction } from '../types';\nimport type { StorageTable } from '../storage/types';\nimport { DYNC_STATE_TABLE, type StateHelpers } from './StateManager';\nimport type { WithTransaction } from './types';\n\nexport interface PushContext {\n logger: Logger;\n state: StateHelpers;\n table: <T>(name: string) => StorageTable<T>;\n withTransaction: WithTransaction;\n syncOptions: SyncOptions;\n}\n\nexport interface PushAllContext extends PushContext {\n syncApis: Record<string, ApiFunctions>;\n}\n\nexport interface PushAllBatchContext extends PushContext {\n batchSync: BatchSync;\n}\n\nasync function handleRemoveSuccess(change: PendingChange, ctx: PushContext): Promise<void> {\n const { tableName, localId, id } = change;\n ctx.logger.debug(`[dync] push:remove:success tableName=${tableName} localId=${localId} id=${id}`);\n await ctx.state.removePendingChange(localId, tableName);\n}\n\nasync function handleUpdateSuccess(change: PendingChange, ctx: PushContext): Promise<void> {\n const { tableName, localId, version, changes } = change;\n ctx.logger.debug(`[dync] push:update:success tableName=${tableName} localId=${localId} id=${change.id}`);\n if (ctx.state.samePendingVersion(tableName, localId, version)) {\n await ctx.state.removePendingChange(localId, tableName);\n } else {\n await ctx.state.setPendingChangeBefore(tableName, localId, changes);\n }\n}\n\nasync function handleCreateSuccess(change: PendingChange, serverResult: { id: unknown; updated_at?: string }, ctx: PushContext): Promise<void> {\n const { tableName, localId, version, changes, id } = change;\n ctx.logger.debug(`[dync] push:create:success tableName=${tableName} localId=${localId} id=${id ?? serverResult.id}`);\n\n await ctx.withTransaction('rw', [tableName, DYNC_STATE_TABLE], async (tables) => {\n const txTable = tables[tableName]!;\n const wasChanged = (await txTable.raw.update(localId, serverResult)) ?? 0;\n\n if (wasChanged && ctx.state.samePendingVersion(tableName, localId, version)) {\n await ctx.state.removePendingChange(localId, tableName);\n } else {\n const nextAction = wasChanged ? SyncAction.Update : SyncAction.Remove;\n await ctx.state.updatePendingChange(tableName, localId, nextAction, serverResult.id);\n if (nextAction === SyncAction.Remove) return;\n }\n });\n\n const finalItem = { ...changes, ...serverResult, _localId: localId };\n ctx.syncOptions.onAfterRemoteAdd?.(tableName, finalItem);\n}\n\nexport async function pushAll(ctx: PushAllContext): Promise<Error | undefined> {\n let firstSyncError: Error | undefined;\n const changesSnapshot = [...ctx.state.getState().pendingChanges].sort((a, b) => orderFor(a.action) - orderFor(b.action));\n\n for (const change of changesSnapshot) {\n try {\n await pushOne(change, ctx);\n } catch (err) {\n firstSyncError = firstSyncError ?? (err as Error);\n ctx.logger.error(`[dync] push:error change=${JSON.stringify(change)}`, err);\n }\n }\n return firstSyncError;\n}\n\nasync function pushOne(change: PendingChange, ctx: PushAllContext): Promise<void> {\n const api = ctx.syncApis[change.tableName];\n if (!api) return;\n\n ctx.logger.debug(`[dync] push:attempt action=${change.action} tableName=${change.tableName} localId=${change.localId}`);\n\n const { action, tableName, localId, id, changes, after } = change;\n\n switch (action) {\n case SyncAction.Remove:\n if (!id) {\n ctx.logger.warn(`[dync] push:remove:no-id tableName=${tableName} localId=${localId}`);\n await ctx.state.removePendingChange(localId, tableName);\n return;\n }\n await api.remove(id);\n await handleRemoveSuccess(change, ctx);\n break;\n\n case SyncAction.Update: {\n if (ctx.state.hasConflicts(localId)) {\n ctx.logger.warn(`[dync] push:update:skipping-with-conflicts tableName=${tableName} localId=${localId} id=${id}`);\n return;\n }\n\n const exists = await api.update(id, changes, after);\n if (exists) {\n await handleUpdateSuccess(change, ctx);\n } else {\n await handleMissingRemoteRecord(change, ctx);\n }\n break;\n }\n\n case SyncAction.Create: {\n const result = await api.add(changes);\n if (result) {\n await handleCreateSuccess(change, result, ctx);\n } else {\n ctx.logger.warn(`[dync] push:create:no-result tableName=${tableName} localId=${localId} id=${id}`);\n if (ctx.state.samePendingVersion(tableName, localId, change.version)) {\n await ctx.state.removePendingChange(localId, tableName);\n }\n }\n break;\n }\n }\n}\n\nasync function handleMissingRemoteRecord(change: PendingChange, ctx: PushContext): Promise<void> {\n const { tableName, localId } = change;\n const strategy = ctx.syncOptions.missingRemoteRecordDuringUpdateStrategy!;\n\n let localItem: any;\n\n await ctx.withTransaction('rw', [tableName, DYNC_STATE_TABLE], async (tables) => {\n const txTable = tables[tableName]!;\n localItem = await txTable.get(localId);\n\n if (!localItem) {\n ctx.logger.warn(`[dync] push:missing-remote:no-local-item tableName=${tableName} localId=${localId}`);\n await ctx.state.removePendingChange(localId, tableName);\n return;\n }\n\n switch (strategy) {\n case 'delete-local-record':\n await txTable.raw.delete(localId);\n ctx.logger.debug(`[dync] push:missing-remote:${strategy} tableName=${tableName} id=${localItem.id}`);\n break;\n\n case 'insert-remote-record': {\n const newItem = {\n ...localItem,\n _localId: createLocalId(),\n updated_at: new Date().toISOString(),\n };\n\n await txTable.raw.add(newItem);\n await txTable.raw.delete(localId);\n\n await ctx.state.addPendingChange({\n action: SyncAction.Create,\n tableName,\n localId: newItem._localId,\n changes: newItem,\n before: null,\n });\n\n ctx.logger.debug(`[dync] push:missing-remote:${strategy} tableName=${tableName} id=${newItem.id}`);\n break;\n }\n\n case 'ignore':\n ctx.logger.debug(`[dync] push:missing-remote:${strategy} tableName=${tableName} id=${localItem.id}`);\n break;\n\n default:\n ctx.logger.error(`[dync] push:missing-remote:unknown-strategy tableName=${tableName} id=${localItem.id} strategy=${strategy}`);\n break;\n }\n\n await ctx.state.removePendingChange(localId, tableName);\n });\n\n ctx.syncOptions.onAfterMissingRemoteRecordDuringUpdate?.(strategy, localItem);\n}\n\n// ============================================================================\n// Batch Mode Push Operations\n// ============================================================================\n\nexport async function pushAllBatch(ctx: PushAllBatchContext): Promise<Error | undefined> {\n let firstSyncError: Error | undefined;\n\n try {\n const changesSnapshot = [...ctx.state.getState().pendingChanges]\n .filter((change) => ctx.batchSync.syncTables.includes(change.tableName))\n .sort((a, b) => orderFor(a.action) - orderFor(b.action));\n\n if (changesSnapshot.length === 0) {\n ctx.logger.debug('[dync] push:batch:no-changes');\n return undefined;\n }\n\n // Filter out changes with conflicts\n const changesToPush = changesSnapshot.filter((change) => {\n if (change.action === SyncAction.Update && ctx.state.hasConflicts(change.localId)) {\n ctx.logger.warn(`[dync] push:batch:skipping-with-conflicts tableName=${change.tableName} localId=${change.localId}`);\n return false;\n }\n return true;\n });\n\n if (changesToPush.length === 0) {\n ctx.logger.debug('[dync] push:batch:all-skipped');\n return undefined;\n }\n\n // Build batch payload\n const payloads: BatchPushPayload[] = changesToPush.map((change) => ({\n table: change.tableName,\n action: change.action === SyncAction.Create ? 'add' : change.action === SyncAction.Update ? 'update' : 'remove',\n localId: change.localId,\n id: change.id,\n data: change.action === SyncAction.Remove ? undefined : change.changes,\n }));\n\n ctx.logger.debug(`[dync] push:batch:start count=${payloads.length}`);\n\n // Single batch push request\n const results = await ctx.batchSync.push(payloads);\n\n // Create a map of results by localId for easy lookup\n const resultMap = new Map<string, BatchPushResult>();\n for (const result of results) {\n resultMap.set(result.localId, result);\n }\n\n // Process each result\n for (const change of changesToPush) {\n const result = resultMap.get(change.localId);\n if (!result) {\n ctx.logger.warn(`[dync] push:batch:missing-result localId=${change.localId}`);\n continue;\n }\n\n try {\n await processBatchPushResult(change, result, ctx);\n } catch (err) {\n firstSyncError = firstSyncError ?? (err as Error);\n ctx.logger.error(`[dync] push:batch:error localId=${change.localId}`, err);\n }\n }\n } catch (err) {\n firstSyncError = err as Error;\n ctx.logger.error('[dync] push:batch:error', err);\n }\n\n return firstSyncError;\n}\n\nasync function processBatchPushResult(change: PendingChange, result: BatchPushResult, ctx: PushAllBatchContext): Promise<void> {\n const { action, tableName, localId } = change;\n\n if (!result.success) {\n if (action === SyncAction.Update) {\n // Update failed - might be missing remote record\n await handleMissingRemoteRecord(change, ctx);\n } else {\n ctx.logger.warn(`[dync] push:batch:failed tableName=${tableName} localId=${localId} error=${result.error}`);\n }\n return;\n }\n\n switch (action) {\n case SyncAction.Remove:\n handleRemoveSuccess(change, ctx);\n break;\n\n case SyncAction.Update:\n handleUpdateSuccess(change, ctx);\n break;\n\n case SyncAction.Create: {\n const serverResult: { id: unknown; updated_at?: string } = { id: result.id };\n if (result.updated_at) {\n serverResult.updated_at = result.updated_at;\n }\n await handleCreateSuccess(change, serverResult, ctx);\n break;\n }\n }\n}\n","import { createLocalId, sleep } from '../helpers';\nimport type { Logger } from '../logger';\nimport type { ApiFunctions, BatchFirstLoadResult, BatchSync, FirstLoadProgressCallback } from '../types';\nimport type { StorageTable } from '../storage/types';\nimport { DYNC_STATE_TABLE, type StateHelpers } from './StateManager';\nimport type { WithTransaction } from './types';\n\nexport interface FirstLoadBaseContext {\n logger: Logger;\n state: StateHelpers;\n table: <T>(name: string) => StorageTable<T>;\n withTransaction: WithTransaction;\n onProgress?: FirstLoadProgressCallback;\n}\n\nexport interface FirstLoadContext extends FirstLoadBaseContext {\n syncApis: Record<string, ApiFunctions>;\n}\n\nexport interface FirstLoadBatchContext extends FirstLoadBaseContext {\n batchSync: BatchSync;\n}\n\ninterface RemoteRecord {\n id?: unknown;\n updated_at?: string;\n deleted?: boolean;\n _localId?: string;\n [key: string]: unknown;\n}\n\n// Yield to event loop to prevent UI freezing on constrained devices\nconst yieldToEventLoop = (): Promise<void> => sleep(0);\n\nconst WRITE_BATCH_SIZE = 200;\n\nexport async function startFirstLoad(ctx: FirstLoadContext): Promise<void> {\n ctx.logger.debug('[dync] Starting first load...');\n\n if (ctx.state.getState().firstLoadDone) {\n ctx.logger.debug('[dync] First load already completed');\n return;\n }\n\n let error: Error | undefined;\n\n for (const [tableName, api] of Object.entries(ctx.syncApis)) {\n if (!api.firstLoad) {\n ctx.logger.error(`[dync] firstLoad:no-api-function tableName=${tableName}`);\n continue;\n }\n\n try {\n ctx.logger.info(`[dync] firstLoad:start tableName=${tableName}`);\n\n let lastId: unknown;\n let isEmptyTable = true;\n let batchCount = 0;\n let totalInserted = 0;\n let totalUpdated = 0;\n\n while (true) {\n const batch = await api.firstLoad(lastId);\n if (!batch?.length) break;\n\n batchCount++;\n\n // Process batch in smaller chunks to manage memory and allow UI updates\n const { inserted, updated } = await processBatchInChunks(ctx, tableName, batch, isEmptyTable, lastId === undefined);\n totalInserted += inserted;\n totalUpdated += updated;\n\n // Report progress if callback provided\n if (ctx.onProgress) {\n ctx.onProgress({\n table: tableName,\n inserted: totalInserted,\n updated: totalUpdated,\n total: totalInserted + totalUpdated,\n });\n }\n\n // After first batch, we know if table was empty\n if (lastId === undefined) {\n isEmptyTable = (await ctx.table(tableName).count()) === batch.length;\n }\n\n if (lastId !== undefined && lastId === batch[batch.length - 1].id) {\n throw new Error(`Duplicate records downloaded, stopping to prevent infinite loop`);\n }\n\n lastId = batch[batch.length - 1].id;\n\n // Yield between API batches to allow UI updates\n if (batchCount % 5 === 0) {\n await yieldToEventLoop();\n }\n }\n\n ctx.logger.info(`[dync] firstLoad:done tableName=${tableName} inserted=${totalInserted} updated=${totalUpdated}`);\n } catch (err) {\n error = error ?? (err as Error);\n ctx.logger.error(`[dync] firstLoad:error tableName=${tableName}`, err);\n }\n }\n\n await ctx.state.setState((syncState) => ({\n ...syncState,\n firstLoadDone: true,\n error,\n }));\n\n ctx.logger.debug('[dync] First load completed');\n}\n\ninterface BatchResult {\n inserted: number;\n updated: number;\n}\n\nasync function processBatchInChunks(\n ctx: FirstLoadBaseContext,\n tableName: string,\n batch: RemoteRecord[],\n isEmptyTable: boolean,\n isFirstBatch: boolean,\n): Promise<BatchResult> {\n let newest = new Date(ctx.state.getState().lastPulled[tableName] || 0);\n\n return ctx.withTransaction('rw', [tableName, DYNC_STATE_TABLE], async (tables) => {\n const txTable = tables[tableName]!;\n\n // Check if table is empty on first batch\n let tableIsEmpty = isEmptyTable;\n if (isFirstBatch) {\n const count = await txTable.count();\n tableIsEmpty = count === 0;\n }\n\n // Pre-filter and prepare records, mutating in place to reduce allocations\n const activeRecords: RemoteRecord[] = [];\n for (const remote of batch) {\n const remoteUpdated = new Date(remote.updated_at || 0);\n if (remoteUpdated > newest) newest = remoteUpdated;\n\n if (remote.deleted) continue;\n\n // Mutate in place instead of spreading\n delete remote.deleted;\n remote._localId = createLocalId();\n activeRecords.push(remote);\n }\n\n let inserted = 0;\n let updated = 0;\n\n if (tableIsEmpty) {\n // Fast path: no existing records, bulk add in chunks\n for (let i = 0; i < activeRecords.length; i += WRITE_BATCH_SIZE) {\n const chunk = activeRecords.slice(i, i + WRITE_BATCH_SIZE);\n await txTable.raw.bulkAdd(chunk as any);\n inserted += chunk.length;\n }\n } else {\n // Slower path: need to check for existing records\n // Process in chunks to limit memory usage of lookup map\n for (let i = 0; i < activeRecords.length; i += WRITE_BATCH_SIZE) {\n const chunk = activeRecords.slice(i, i + WRITE_BATCH_SIZE);\n const chunkResult = await processChunkWithLookup(txTable, chunk);\n inserted += chunkResult.inserted;\n updated += chunkResult.updated;\n }\n }\n\n await ctx.state.setState((syncState) => ({\n ...syncState,\n lastPulled: {\n ...syncState.lastPulled,\n [tableName]: newest.toISOString(),\n },\n }));\n\n return { inserted, updated };\n });\n}\n\nasync function processChunkWithLookup(txTable: StorageTable<any>, chunk: RemoteRecord[]): Promise<BatchResult> {\n // Collect server IDs for this chunk\n const serverIds = chunk.filter((r) => r.id != null).map((r) => r.id);\n\n // Bulk lookup existing records\n const existingByServerId = new Map<unknown, { _localId: string }>();\n if (serverIds.length > 0) {\n const existingRecords = await txTable.where('id').anyOf(serverIds).toArray();\n for (const existing of existingRecords) {\n existingByServerId.set((existing as any).id, existing as { _localId: string });\n }\n }\n\n // Separate into adds and updates\n const toAdd: RemoteRecord[] = [];\n let updated = 0;\n\n for (const remote of chunk) {\n const existing = remote.id != null ? existingByServerId.get(remote.id) : undefined;\n if (existing) {\n // Update: merge and update in place\n const merged = Object.assign({}, existing, remote, { _localId: existing._localId });\n await txTable.raw.update(existing._localId, merged as any);\n updated++;\n } else {\n toAdd.push(remote);\n }\n }\n\n // Bulk add new records\n if (toAdd.length > 0) {\n await txTable.raw.bulkAdd(toAdd as any);\n }\n\n // Clear the map to help GC\n existingByServerId.clear();\n\n return { inserted: toAdd.length, updated };\n}\n\n// ============================================================================\n// Batch Mode First Load Operations\n// ============================================================================\n\nexport async function startFirstLoadBatch(ctx: FirstLoadBatchContext): Promise<void> {\n ctx.logger.debug('[dync] Starting batch first load...');\n\n if (ctx.state.getState().firstLoadDone) {\n ctx.logger.debug('[dync] First load already completed');\n return;\n }\n\n if (!ctx.batchSync.firstLoad) {\n ctx.logger.warn('[dync] firstLoad:batch:no-firstLoad-function');\n await ctx.state.setState((syncState) => ({\n ...syncState,\n firstLoadDone: true,\n }));\n return;\n }\n\n let error: Error | undefined;\n\n try {\n ctx.logger.info(`[dync] firstLoad:batch:start tables=${[...ctx.batchSync.syncTables].join(',')}`);\n\n // Track progress per table\n const progress: Record<string, { inserted: number; updated: number }> = {};\n for (const tableName of ctx.batchSync.syncTables) {\n progress[tableName] = { inserted: 0, updated: 0 };\n }\n\n // Initialize cursors for all tables\n let cursors: Record<string, any> = {};\n for (const tableName of ctx.batchSync.syncTables) {\n cursors[tableName] = undefined;\n }\n\n let batchCount = 0;\n\n while (true) {\n const result: BatchFirstLoadResult = await ctx.batchSync.firstLoad(cursors);\n\n if (!result.hasMore && Object.values(result.data).every((d) => !d?.length)) {\n break;\n }\n\n batchCount++;\n\n // Process each table's data\n for (const [tableName, batch] of Object.entries(result.data)) {\n if (!ctx.batchSync.syncTables.includes(tableName)) {\n ctx.logger.warn(`[dync] firstLoad:batch:unknown-table tableName=${tableName}`);\n continue;\n }\n\n if (!batch?.length) continue;\n\n const isFirstBatch = progress[tableName]!.inserted === 0 && progress[tableName]!.updated === 0;\n const isEmptyTable = isFirstBatch && (await ctx.table(tableName).count()) === 0;\n\n const { inserted, updated } = await processBatchInChunks(ctx, tableName, batch, isEmptyTable, isFirstBatch);\n progress[tableName]!.inserted += inserted;\n progress[tableName]!.updated += updated;\n\n // Report progress if callback provided\n if (ctx.onProgress) {\n ctx.onProgress({\n table: tableName,\n inserted: progress[tableName]!.inserted,\n updated: progress[tableName]!.updated,\n total: progress[tableName]!.inserted + progress[tableName]!.updated,\n });\n }\n }\n\n // Update cursors for next batch\n cursors = result.cursors;\n\n // Yield between API batches to allow UI updates\n if (batchCount % 5 === 0) {\n await yieldToEventLoop();\n }\n\n if (!result.hasMore) {\n break;\n }\n }\n\n // Log completion for each table\n for (const [tableName, p] of Object.entries(progress)) {\n ctx.logger.info(`[dync] firstLoad:batch:done tableName=${tableName} inserted=${p.inserted} updated=${p.updated}`);\n }\n } catch (err) {\n error = err as Error;\n ctx.logger.error('[dync] firstLoad:batch:error', err);\n }\n\n await ctx.state.setState((syncState) => ({\n ...syncState,\n firstLoadDone: true,\n error,\n }));\n\n ctx.logger.debug('[dync] Batch first load completed');\n}\n","import { newLogger, type Logger, type LogLevel } from './logger';\nimport { sleep } from './helpers';\nimport {\n type ApiFunctions,\n type BatchSync,\n type SyncOptions,\n type SyncState,\n type SyncedRecord,\n type MissingRemoteRecordStrategy,\n type ConflictResolutionStrategy,\n type SyncStatus,\n type SyncApi,\n type TableMap,\n type MutationEvent,\n LOCAL_PK,\n SERVER_PK,\n UPDATED_AT,\n} from './types';\nimport { addVisibilityChangeListener } from './addVisibilityChangeListener';\nimport { type StorageAdapter, type StorageTable, type TransactionMode } from './storage/types';\nimport type { StorageSchemaDefinitionOptions, SQLiteVersionConfigurator } from './storage/sqlite/types';\nimport type { TableSchemaDefinition, SQLiteTableDefinition } from './storage/sqlite/schema';\nimport { enhanceSyncTable, setupEnhancedTables as setupEnhancedTablesHelper, wrapWithMutationEmitter } from './core/tableEnhancers';\nimport { pullAll as runPullAll, pullAllBatch as runPullAllBatch } from './core/pullOperations';\nimport { pushAll as runPushAll, pushAllBatch as runPushAllBatch } from './core/pushOperations';\nimport { startFirstLoad as runFirstLoad, startFirstLoadBatch as runFirstLoadBatch } from './core/firstLoad';\nimport type { FirstLoadProgressCallback, VisibilitySubscription } from './types';\nimport { StateManager, DYNC_STATE_TABLE, type StateHelpers } from './core/StateManager';\nimport type { MemoryQueryContext } from './storage/memory/MemoryQueryContext';\nimport type { SqliteQueryContext } from './storage/sqlite/SqliteQueryContext';\nimport type { DexieQueryContext } from './storage/dexie/DexieQueryContext';\n\nconst DEFAULT_SYNC_INTERVAL_MILLIS = 2000;\nconst DEFAULT_LOGGER: Logger = console;\nconst DEFAULT_MIN_LOG_LEVEL: LogLevel = 'debug';\nconst DEFAULT_MISSING_REMOTE_RECORD_STRATEGY: MissingRemoteRecordStrategy = 'insert-remote-record';\nconst DEFAULT_CONFLICT_RESOLUTION_STRATEGY: ConflictResolutionStrategy = 'try-shallow-merge';\n\nclass DyncBase<_TStoreMap = Record<string, any>> {\n private readonly adapter: StorageAdapter;\n private readonly tableCache = new Map<string, StorageTable<any>>();\n private readonly mutationWrappedTables = new Set<string>();\n private readonly syncEnhancedTables = new Set<string>();\n private readonly mutationListeners = new Set<(event: MutationEvent) => void>();\n private visibilitySubscription?: VisibilitySubscription;\n private openPromise?: Promise<void>;\n private disableSyncPromise?: Promise<void>;\n private disableSyncPromiseResolver?: () => void;\n private sleepAbortController?: AbortController;\n private closing = false;\n // Per-table sync mode\n private syncApis: Record<string, ApiFunctions> = {};\n // Batch sync mode\n private batchSync?: BatchSync;\n private syncedTables: Set<string> = new Set();\n private syncOptions: SyncOptions;\n private logger: Logger;\n private syncTimerStarted = false;\n private mutationsDuringSync = false;\n private state!: StateHelpers;\n readonly name: string;\n\n /**\n * Create a new Dync instance.\n *\n * Mode 1 - Per-table endpoints:\n * @param databaseName - Name of the database\n * @param syncApis - Map of table names to API functions\n * @param storageAdapter - Storage adapter implementation (required)\n * @param options - Sync options\n *\n * Mode 2 - Batch endpoints:\n * @param databaseName - Name of the database\n * @param batchSync - Batch sync config (syncTables, push, pull, firstLoad)\n * @param storageAdapter - Storage adapter implementation (required)\n * @param options - Sync options\n */\n constructor(databaseName: string, syncApis: Record<string, ApiFunctions>, storageAdapter: StorageAdapter, options?: SyncOptions);\n constructor(databaseName: string, batchSync: BatchSync, storageAdapter: StorageAdapter, options?: SyncOptions);\n constructor(databaseName: string, syncApisOrBatchSync: Record<string, ApiFunctions> | BatchSync, storageAdapter: StorageAdapter, options?: SyncOptions) {\n // Detect mode based on whether the second arg has sync API shape (has 'list' function)\n const isBatchMode = typeof (syncApisOrBatchSync as BatchSync).push === 'function';\n\n if (isBatchMode) {\n // Batch mode: (databaseName, batchSync, options?)\n this.batchSync = syncApisOrBatchSync as BatchSync;\n this.syncedTables = new Set(this.batchSync.syncTables);\n } else {\n // Per-table mode: (databaseName, syncApis, options?)\n this.syncApis = syncApisOrBatchSync as Record<string, ApiFunctions>;\n this.syncedTables = new Set(Object.keys(this.syncApis));\n }\n\n this.adapter = storageAdapter;\n this.name = databaseName;\n this.syncOptions = {\n syncInterval: DEFAULT_SYNC_INTERVAL_MILLIS,\n logger: DEFAULT_LOGGER,\n minLogLevel: DEFAULT_MIN_LOG_LEVEL,\n missingRemoteRecordDuringUpdateStrategy: DEFAULT_MISSING_REMOTE_RECORD_STRATEGY,\n conflictResolutionStrategy: DEFAULT_CONFLICT_RESOLUTION_STRATEGY,\n ...(options ?? {}),\n };\n\n this.logger = newLogger(this.syncOptions.logger!, this.syncOptions.minLogLevel!);\n this.state = new StateManager({\n storageAdapter: this.adapter,\n });\n\n const driverInfo = 'driverType' in this.adapter ? ` (Driver: ${this.adapter.driverType})` : '';\n this.logger.debug(`[dync] Initialized with ${this.adapter.type}${driverInfo}`);\n }\n\n version(versionNumber: number) {\n /* eslint-disable @typescript-eslint/no-this-alias */\n const self = this;\n const schemaOptions: StorageSchemaDefinitionOptions = {};\n let storesDefined = false;\n\n const builder = {\n stores(schema: Record<string, TableSchemaDefinition>) {\n // Detect if any user table uses structured schema (for SQLite)\n const usesStructuredSchema = Object.values(schema).some((def) => typeof def !== 'string');\n\n // Inject internal state table for sync state persistence\n // Use structured schema if user is using structured schema, otherwise use string schema\n // Note: SQLite adapter requires _localId column as primary key\n const stateTableSchema: TableSchemaDefinition = usesStructuredSchema\n ? {\n columns: {\n [LOCAL_PK]: { type: 'TEXT' },\n value: { type: 'TEXT' },\n },\n }\n : LOCAL_PK;\n\n const fullSchema: Record<string, TableSchemaDefinition> = {\n ...schema,\n [DYNC_STATE_TABLE]: stateTableSchema,\n };\n\n for (const [tableName, tableSchema] of Object.entries(schema)) {\n const isSyncTable = self.syncedTables.has(tableName);\n\n if (typeof tableSchema === 'string') {\n if (isSyncTable) {\n // Auto-inject sync fields for sync tables\n // Note: updated_at is indexed to support user queries like orderBy('updated_at')\n fullSchema[tableName] = `${LOCAL_PK}, &${SERVER_PK}, ${tableSchema}, ${UPDATED_AT}`;\n }\n\n self.logger.debug(\n `[dync] Defining ${isSyncTable ? '' : 'non-'}sync table '${tableName}' with primary key & indexes '${fullSchema[tableName]}'`,\n );\n } else {\n if (isSyncTable) {\n // Auto-inject sync columns for structured schemas\n fullSchema[tableName] = self.injectSyncColumns(tableSchema);\n }\n\n const schemaColumns = Object.keys((fullSchema[tableName] as SQLiteTableDefinition).columns ?? {}).join(', ');\n const schemaIndexes = ((fullSchema[tableName] as SQLiteTableDefinition).indexes ?? []).map((idx) => idx.columns.join('+')).join(', ');\n\n self.logger.debug(\n `[dync] Defining ${isSyncTable ? '' : 'non-'}sync table '${tableName}' with columns ${schemaColumns} and indexes ${schemaIndexes}`,\n );\n }\n }\n\n storesDefined = true;\n self.adapter.defineSchema(versionNumber, fullSchema, schemaOptions);\n self.setupEnhancedTables(Object.keys(schema));\n\n return builder;\n },\n sqlite(configure: (builder: SQLiteVersionConfigurator) => void) {\n if (!storesDefined) {\n throw new Error('Call stores() before registering sqlite migrations');\n }\n const sqliteOptions = (schemaOptions.sqlite ??= {});\n const migrations = (sqliteOptions.migrations ??= {});\n const configurator: SQLiteVersionConfigurator = {\n upgrade(handler) {\n migrations.upgrade = handler;\n },\n downgrade(handler) {\n migrations.downgrade = handler;\n },\n };\n configure(configurator);\n return builder;\n },\n };\n\n return builder;\n }\n\n async open(): Promise<void> {\n if (this.closing) {\n return;\n }\n if (this.openPromise) {\n return this.openPromise;\n }\n\n this.openPromise = (async () => {\n if (this.closing) return;\n await this.adapter.open();\n if (this.closing) return;\n await this.state.hydrate();\n })();\n\n return this.openPromise;\n }\n\n async close(): Promise<void> {\n // Mark as closing to abort any pending opens\n this.closing = true;\n // Wait for any pending open to complete before closing\n if (this.openPromise) {\n await this.openPromise.catch(() => {});\n this.openPromise = undefined;\n }\n await this.enableSync(false);\n await this.adapter.close();\n this.tableCache.clear();\n this.mutationWrappedTables.clear();\n this.syncEnhancedTables.clear();\n }\n\n async delete(): Promise<void> {\n await this.adapter.delete();\n // Clear any cached table wrappers that may reference a deleted/closed database.\n this.tableCache.clear();\n this.mutationWrappedTables.clear();\n this.syncEnhancedTables.clear();\n }\n\n async query<R>(callback: (ctx: DexieQueryContext | SqliteQueryContext | MemoryQueryContext) => Promise<R>): Promise<R> {\n return this.adapter.query(callback as any);\n }\n\n table<K extends keyof _TStoreMap>(name: K): StorageTable<_TStoreMap[K]>;\n table<T = any>(name: string): StorageTable<T>;\n table(name: string) {\n if (this.tableCache.has(name)) {\n return this.tableCache.get(name)!;\n }\n\n const table = this.adapter.table(name);\n const isSyncTable = this.syncedTables.has(name);\n\n // For sync tables, enhanceSyncTable handles both pending changes AND mutation emission.\n // For non-sync tables, we just need mutation emission for useLiveQuery reactivity.\n if (isSyncTable && !this.syncEnhancedTables.has(name)) {\n this.enhanceSyncTable(table as StorageTable<SyncedRecord>, name);\n } else if (!isSyncTable && !this.mutationWrappedTables.has(name) && name !== DYNC_STATE_TABLE) {\n wrapWithMutationEmitter(table, name, this.emitMutation.bind(this));\n this.mutationWrappedTables.add(name);\n }\n\n this.tableCache.set(name, table as StorageTable<any>);\n return table;\n }\n\n private async withTransaction<T>(mode: TransactionMode, tableNames: string[], fn: (tables: Record<string, StorageTable<any>>) => Promise<T>): Promise<T> {\n await this.open();\n return this.adapter.transaction(mode, tableNames, async () => {\n const tables: Record<string, StorageTable<any>> = {};\n for (const tableName of tableNames) {\n tables[tableName] = this.table(tableName);\n }\n return fn(tables);\n });\n }\n\n private setupEnhancedTables(tableNames: string[]): void {\n setupEnhancedTablesHelper(\n {\n owner: this,\n tableCache: this.tableCache,\n enhancedTables: this.syncEnhancedTables,\n getTable: (name) => this.table(name),\n },\n tableNames,\n );\n // Also clear mutation wrapping so tables get re-wrapped on next access\n for (const tableName of tableNames) {\n this.mutationWrappedTables.delete(tableName);\n }\n }\n\n private injectSyncColumns(schema: SQLiteTableDefinition): SQLiteTableDefinition {\n const columns = schema.columns ?? {};\n\n // Validate user hasn't defined reserved sync columns\n if (columns[LOCAL_PK]) {\n throw new Error(`Column '${LOCAL_PK}' is auto-injected for sync tables and cannot be defined manually.`);\n }\n if (columns[SERVER_PK]) {\n throw new Error(`Column '${SERVER_PK}' is auto-injected for sync tables and cannot be defined manually.`);\n }\n if (columns[UPDATED_AT]) {\n throw new Error(`Column '${UPDATED_AT}' is auto-injected for sync tables and cannot be defined manually.`);\n }\n\n // Inject _localId, id, and updated_at columns\n const injectedColumns: Record<string, any> = {\n ...columns,\n [LOCAL_PK]: { type: 'TEXT' },\n [SERVER_PK]: { type: 'INTEGER', unique: true },\n [UPDATED_AT]: { type: 'TEXT' },\n };\n\n // Auto-inject updated_at index if not already defined by user\n // This supports user queries like orderBy('updated_at')\n const userIndexes = schema.indexes ?? [];\n const hasUpdatedAtIndex = userIndexes.some((idx) => idx.columns.length === 1 && idx.columns[0] === UPDATED_AT);\n\n const injectedIndexes = hasUpdatedAtIndex ? userIndexes : [...userIndexes, { columns: [UPDATED_AT] }];\n\n return {\n ...schema,\n columns: injectedColumns,\n indexes: injectedIndexes,\n };\n }\n\n private enhanceSyncTable<T>(table: StorageTable<T & SyncedRecord>, tableName: string): void {\n enhanceSyncTable({\n table,\n tableName,\n withTransaction: this.withTransaction.bind(this),\n state: this.state,\n enhancedTables: this.syncEnhancedTables,\n emitMutation: this.emitMutation.bind(this),\n });\n }\n\n private async syncOnce(): Promise<void> {\n if (this.closing) {\n return;\n }\n if (this.syncStatus === 'syncing') {\n this.mutationsDuringSync = true;\n return;\n }\n\n this.syncStatus = 'syncing';\n this.mutationsDuringSync = false;\n\n const pullResult = await this.pullAll();\n const firstPushSyncError = await this.pushAll();\n\n // Emit pull mutation only for tables that had changes\n for (const tableName of pullResult.changedTables) {\n this.emitMutation({ type: 'pull', tableName });\n }\n\n this.syncStatus = 'idle';\n await this.state.setState((syncState) => ({\n ...syncState,\n error: pullResult.error ?? firstPushSyncError,\n }));\n\n if (this.mutationsDuringSync) {\n this.mutationsDuringSync = false;\n this.syncOnce().catch(() => {\n // Suppress unhandled promise rejections that occur when the database closes\n });\n }\n }\n\n private async pullAll(): Promise<{ error?: Error; changedTables: string[] }> {\n const baseContext = {\n logger: this.logger,\n state: this.state,\n table: this.table.bind(this),\n withTransaction: this.withTransaction.bind(this),\n conflictResolutionStrategy: this.syncOptions.conflictResolutionStrategy!,\n };\n\n if (this.batchSync) {\n return runPullAllBatch({\n ...baseContext,\n batchSync: this.batchSync,\n });\n }\n\n return runPullAll({\n ...baseContext,\n syncApis: this.syncApis,\n });\n }\n\n private async pushAll(): Promise<Error | undefined> {\n const baseContext = {\n logger: this.logger,\n state: this.state,\n table: this.table.bind(this),\n withTransaction: this.withTransaction.bind(this),\n syncOptions: this.syncOptions,\n };\n\n if (this.batchSync) {\n return runPushAllBatch({\n ...baseContext,\n batchSync: this.batchSync,\n });\n }\n\n return runPushAll({\n ...baseContext,\n syncApis: this.syncApis,\n });\n }\n\n private startSyncTimer(start: boolean) {\n if (start) {\n void this.tryStart();\n } else {\n this.syncTimerStarted = false;\n }\n }\n\n private async tryStart() {\n if (this.syncTimerStarted) return;\n this.syncTimerStarted = true;\n\n while (this.syncTimerStarted) {\n this.sleepAbortController = new AbortController();\n await this.syncOnce();\n await sleep(this.syncOptions.syncInterval!, this.sleepAbortController.signal);\n }\n\n this.syncStatus = 'disabled';\n this.disableSyncPromiseResolver?.();\n }\n\n private setupVisibilityListener(add: boolean) {\n this.visibilitySubscription = addVisibilityChangeListener(add, this.visibilitySubscription, (isVisible) => this.handleVisibilityChange(isVisible));\n }\n\n private handleVisibilityChange(isVisible: boolean) {\n if (isVisible) {\n this.logger.debug('[dync] sync:start-in-foreground');\n this.startSyncTimer(true);\n } else {\n this.logger.debug('[dync] sync:pause-in-background');\n this.startSyncTimer(false);\n }\n }\n\n private async startFirstLoad(onProgress?: FirstLoadProgressCallback): Promise<void> {\n // Ensure database is open and state is hydrated before first load\n await this.open();\n\n const baseContext = {\n logger: this.logger,\n state: this.state,\n table: this.table.bind(this),\n withTransaction: this.withTransaction.bind(this),\n onProgress,\n };\n\n if (this.batchSync) {\n await runFirstLoadBatch({\n ...baseContext,\n batchSync: this.batchSync,\n });\n } else {\n await runFirstLoad({\n ...baseContext,\n syncApis: this.syncApis,\n });\n }\n\n // Emit pull mutation for all synced tables to trigger live query updates\n for (const tableName of this.syncedTables) {\n this.emitMutation({ type: 'pull', tableName });\n }\n }\n\n private getSyncState(): SyncState {\n return this.state.getSyncState();\n }\n\n private async resolveConflict(localId: string, keepLocal: boolean): Promise<void> {\n const conflict = this.state.getState().conflicts?.[localId];\n if (!conflict) {\n this.logger.warn(`[dync] No conflict found for localId: ${localId}`);\n return;\n }\n\n await this.withTransaction('rw', [conflict.tableName, DYNC_STATE_TABLE], async (tables) => {\n const txTable = tables[conflict.tableName]!;\n if (!keepLocal) {\n const item = await txTable.get(localId);\n if (item) {\n // Use remote value(s)\n for (const field of conflict.fields) {\n item[field.key] = field.remoteValue;\n }\n\n await txTable.raw.update(localId, item);\n } else {\n this.logger.warn(`[dync] No local item found for localId: ${localId} to apply remote values`);\n }\n\n await this.state.setState((syncState) => ({\n ...syncState,\n pendingChanges: syncState.pendingChanges.filter((p) => !(p.localId === localId && p.tableName === conflict.tableName)),\n }));\n }\n\n await this.state.setState((syncState) => {\n const ss = { ...syncState };\n delete ss.conflicts?.[localId];\n return ss;\n });\n });\n }\n\n private async enableSync(enabled: boolean) {\n if (!enabled) {\n // Only wait for sync to stop if it was actually running\n if (this.syncTimerStarted) {\n this.disableSyncPromise = new Promise((resolve) => {\n this.disableSyncPromiseResolver = resolve;\n });\n this.sleepAbortController?.abort();\n this.syncStatus = 'disabling';\n this.startSyncTimer(false);\n this.setupVisibilityListener(false);\n return this.disableSyncPromise;\n }\n this.syncStatus = 'disabled';\n this.setupVisibilityListener(false);\n return Promise.resolve();\n }\n this.syncStatus = 'idle';\n this.startSyncTimer(true);\n this.setupVisibilityListener(true);\n return Promise.resolve();\n }\n\n get syncStatus(): SyncStatus {\n return this.state.getSyncStatus();\n }\n\n set syncStatus(status: SyncStatus) {\n this.state.setSyncStatus(status);\n }\n\n private onSyncStateChange(fn: (state: SyncState) => void): () => void {\n return this.state.subscribe(fn);\n }\n\n private onMutation(fn: (event: MutationEvent) => void): () => void {\n this.mutationListeners.add(fn);\n return () => this.mutationListeners.delete(fn);\n }\n\n private emitMutation(event: MutationEvent): void {\n // Trigger sync on data changes if sync was enabled\n if (event.type === 'add' || event.type === 'update' || event.type === 'delete') {\n if (this.syncTimerStarted) {\n this.syncOnce().catch(() => {\n // Suppress unhandled promise rejections that occur when the database closes\n });\n }\n }\n\n for (const listener of this.mutationListeners) {\n listener(event);\n }\n }\n\n // Public API\n sync: SyncApi = {\n enable: this.enableSync.bind(this),\n startFirstLoad: this.startFirstLoad.bind(this),\n getState: this.getSyncState.bind(this),\n resolveConflict: this.resolveConflict.bind(this),\n onStateChange: this.onSyncStateChange.bind(this),\n onMutation: this.onMutation.bind(this),\n };\n}\n\ntype DyncInstance<TStoreMap extends Record<string, unknown> = Record<string, unknown>> = DyncBase<TStoreMap> &\n TableMap<TStoreMap> & {\n table<K extends keyof TStoreMap & string>(name: K): StorageTable<TStoreMap[K]>;\n table(name: string): StorageTable<any>;\n };\n\nconst DyncConstructor = DyncBase as unknown as {\n prototype: DyncInstance<Record<string, unknown>>;\n new <TStoreMap extends Record<string, unknown> = Record<string, unknown>>(\n databaseName: string,\n syncApis: Record<string, ApiFunctions>,\n storageAdapter: StorageAdapter,\n options?: SyncOptions,\n ): DyncInstance<TStoreMap>;\n new <TStoreMap extends Record<string, unknown> = Record<string, unknown>>(\n databaseName: string,\n batchSync: BatchSync,\n storageAdapter: StorageAdapter,\n options?: SyncOptions,\n ): DyncInstance<TStoreMap>;\n} & typeof DyncBase;\n\nexport const Dync = DyncConstructor;\nexport type Dync<TStoreMap extends Record<string, unknown> = Record<string, unknown>> = DyncInstance<TStoreMap>;\n","import type { StorageTable, StorageTransactionContext, TransactionMode } from '../types';\nimport type { MemoryAdapter } from './MemoryAdapter';\n\nexport class MemoryQueryContext {\n constructor(private readonly adapter: MemoryAdapter) {}\n\n table<T = any>(name: string): StorageTable<T> {\n return this.adapter.table(name);\n }\n\n transaction<T>(mode: TransactionMode, tableNames: string[], callback: (context: StorageTransactionContext) => Promise<T>): Promise<T> {\n return this.adapter.transaction(mode, tableNames, callback);\n }\n}\n","export interface MemoryRecord {\n _localId?: string;\n id?: unknown;\n updated_at?: string;\n [key: string]: unknown;\n}\n\nexport interface MemoryCollectionState<T extends MemoryRecord> {\n predicate: (record: T, key: string) => boolean;\n orderBy?: { index: string | string[]; direction: 'asc' | 'desc' };\n reverse: boolean;\n offset: number;\n limit?: number;\n distinct: boolean;\n}\n\nexport const createDefaultState = <T extends MemoryRecord>(): MemoryCollectionState<T> => ({\n predicate: () => true,\n orderBy: undefined,\n reverse: false,\n offset: 0,\n limit: undefined,\n distinct: false,\n});\n","import type { StorageCollection, StorageWhereClause } from '../types';\nimport type { MemoryCollectionState, MemoryRecord } from './types';\nimport type { MemoryTable } from './MemoryTable';\n\nexport class MemoryCollection<T extends MemoryRecord = MemoryRecord> implements StorageCollection<T> {\n private readonly table: MemoryTable<T>;\n private readonly state: MemoryCollectionState<T>;\n\n constructor(table: MemoryTable<T>, state: MemoryCollectionState<T>) {\n this.table = table;\n this.state = state;\n }\n\n getState(): MemoryCollectionState<T> {\n return { ...this.state };\n }\n\n matches(record: T, key: string): boolean {\n return this.state.predicate(record, key);\n }\n\n clone(_props?: Record<string, unknown>): StorageCollection<T> {\n return new MemoryCollection(this.table, { ...this.state });\n }\n\n reverse(): StorageCollection<T> {\n return this.withState({ reverse: !this.state.reverse });\n }\n\n offset(offset: number): StorageCollection<T> {\n return this.withState({ offset });\n }\n\n limit(count: number): StorageCollection<T> {\n return this.withState({ limit: count });\n }\n\n toCollection(): StorageCollection<T> {\n return this.clone();\n }\n\n distinct(): StorageCollection<T> {\n return this.withState({ distinct: true });\n }\n\n jsFilter(predicate: (item: T) => boolean): StorageCollection<T> {\n return this.withState({ predicate: this.combinePredicate(predicate, 'and') });\n }\n\n or(index: string): StorageWhereClause<T> {\n return this.table.createWhereClause(index, this);\n }\n\n async first(): Promise<T | undefined> {\n const entries = this.materializeEntries(true);\n return entries.at(0)?.[1];\n }\n\n async last(): Promise<T | undefined> {\n const entries = this.materializeEntries(true);\n return entries.at(-1)?.[1];\n }\n\n async each(callback: (item: T, index: number) => void | Promise<void>): Promise<void> {\n const entries = this.materializeEntries(true);\n for (let index = 0; index < entries.length; index += 1) {\n const [, record] = entries[index]!;\n await callback(record, index);\n }\n }\n\n async eachKey(callback: (key: unknown, index: number) => void | Promise<void>): Promise<void> {\n const keys = await this.keys();\n for (let index = 0; index < keys.length; index += 1) {\n await callback(keys[index], index);\n }\n }\n\n async eachPrimaryKey(callback: (key: unknown, index: number) => void | Promise<void>): Promise<void> {\n const keys = await this.primaryKeys();\n for (let index = 0; index < keys.length; index += 1) {\n await callback(keys[index], index);\n }\n }\n\n async eachUniqueKey(callback: (key: unknown, index: number) => void | Promise<void>): Promise<void> {\n const keys = await this.uniqueKeys();\n for (let index = 0; index < keys.length; index += 1) {\n await callback(keys[index], index);\n }\n }\n\n async keys(): Promise<unknown[]> {\n return this.materializeEntries(false).map(([key, record]) => this.table.resolvePublicKey(record, key));\n }\n\n async primaryKeys(): Promise<unknown[]> {\n return this.keys();\n }\n\n async uniqueKeys(): Promise<unknown[]> {\n const seen = new Set<string>();\n const keys: unknown[] = [];\n for (const [key, record] of this.materializeEntries(false)) {\n const publicKey = this.table.resolvePublicKey(record, key);\n const signature = JSON.stringify(publicKey);\n if (!seen.has(signature)) {\n seen.add(signature);\n keys.push(publicKey);\n }\n }\n return keys;\n }\n\n async count(): Promise<number> {\n return this.materializeEntries(false).length;\n }\n\n async sortBy(key: string): Promise<T[]> {\n const entries = this.materializeEntries(true);\n entries.sort((a, b) => this.table.compareValues((a[1] as any)[key], (b[1] as any)[key]));\n return entries.map(([, record]) => record);\n }\n\n async delete(): Promise<number> {\n const entries = this.materializeEntries(false);\n for (const [key] of entries) {\n this.table.deleteByKey(key);\n }\n return entries.length;\n }\n\n async modify(changes: Partial<T> | ((item: T) => void | Promise<void>)): Promise<number> {\n const entries = this.materializeEntries(false);\n let modified = 0;\n for (const [key] of entries) {\n const current = this.table.getMutableRecord(key);\n if (!current) {\n continue;\n }\n if (typeof changes === 'function') {\n const clone = this.table.cloneRecord(current);\n await changes(clone);\n (clone as MemoryRecord)._localId = current._localId ?? key;\n this.table.setMutableRecord(key, clone);\n } else {\n const updated = { ...current, ...changes, _localId: current._localId ?? key } as T;\n this.table.setMutableRecord(key, updated);\n }\n modified += 1;\n }\n return modified;\n }\n\n async toArray(): Promise<T[]> {\n return this.materializeEntries(true).map(([, record]) => record);\n }\n\n private withState(overrides: Partial<MemoryCollectionState<T>>): MemoryCollection<T> {\n return new MemoryCollection(this.table, {\n ...this.state,\n ...overrides,\n predicate: overrides.predicate ?? this.state.predicate,\n });\n }\n\n private combinePredicate(predicate: (record: T) => boolean, mode: 'and' | 'or'): (record: T, key: string) => boolean {\n if (mode === 'and') {\n return (record: T, key: string) => this.state.predicate(record, key) && predicate(record);\n }\n return (record: T, key: string) => this.state.predicate(record, key) || predicate(record);\n }\n\n private materializeEntries(clone: boolean): Array<[string, T]> {\n let entries = this.table.entries().filter(([key, record]) => this.state.predicate(record, key));\n\n if (this.state.orderBy) {\n const { index, direction } = this.state.orderBy;\n entries = [...entries].sort((a, b) => this.table.compareEntries(a[1], b[1], index));\n if (direction === 'desc') {\n entries.reverse();\n }\n }\n\n if (this.state.reverse) {\n entries = [...entries].reverse();\n }\n\n if (this.state.distinct) {\n const seen = new Set<string>();\n entries = entries.filter(([, record]) => {\n const signature = JSON.stringify(record);\n if (seen.has(signature)) {\n return false;\n }\n seen.add(signature);\n return true;\n });\n }\n\n if (this.state.offset > 0) {\n entries = entries.slice(this.state.offset);\n }\n\n if (typeof this.state.limit === 'number') {\n entries = entries.slice(0, this.state.limit);\n }\n\n if (clone) {\n return entries.map(([key, record]) => [key, this.table.cloneRecord(record)] as [string, T]);\n }\n\n return entries;\n }\n}\n","import type { StorageCollection, StorageWhereClause } from '../types';\nimport type { MemoryRecord } from './types';\nimport type { MemoryTable } from './MemoryTable';\nimport type { MemoryCollection } from './MemoryCollection';\n\nexport class MemoryWhereClause<T extends MemoryRecord = MemoryRecord> implements StorageWhereClause<T> {\n private readonly table: MemoryTable<T>;\n private readonly index: string | string[];\n private readonly baseCollection?: MemoryCollection<T>;\n\n constructor(table: MemoryTable<T>, index: string | string[], baseCollection?: MemoryCollection<T>) {\n this.table = table;\n this.index = index;\n this.baseCollection = baseCollection;\n }\n\n equals(value: any): StorageCollection<T> {\n return this.createCollection((current) => this.table.compareValues(current, value) === 0);\n }\n\n above(value: any): StorageCollection<T> {\n return this.createCollection((current) => this.table.compareValues(current, value) > 0);\n }\n\n aboveOrEqual(value: any): StorageCollection<T> {\n return this.createCollection((current) => this.table.compareValues(current, value) >= 0);\n }\n\n below(value: any): StorageCollection<T> {\n return this.createCollection((current) => this.table.compareValues(current, value) < 0);\n }\n\n belowOrEqual(value: any): StorageCollection<T> {\n return this.createCollection((current) => this.table.compareValues(current, value) <= 0);\n }\n\n between(lower: any, upper: any, includeLower = true, includeUpper = false): StorageCollection<T> {\n return this.createCollection((current) => {\n const lowerCmp = this.table.compareValues(current, lower);\n const upperCmp = this.table.compareValues(current, upper);\n const lowerOk = includeLower ? lowerCmp >= 0 : lowerCmp > 0;\n const upperOk = includeUpper ? upperCmp <= 0 : upperCmp < 0;\n return lowerOk && upperOk;\n });\n }\n\n inAnyRange(ranges: Array<[any, any]>, options?: { includeLower?: boolean; includeUpper?: boolean }): StorageCollection<T> {\n const includeLower = options?.includeLower ?? true;\n const includeUpper = options?.includeUpper ?? false;\n return this.createCollection((current) => {\n for (const [lower, upper] of ranges) {\n const lowerCmp = this.table.compareValues(current, lower);\n const upperCmp = this.table.compareValues(current, upper);\n const lowerOk = includeLower ? lowerCmp >= 0 : lowerCmp > 0;\n const upperOk = includeUpper ? upperCmp <= 0 : upperCmp < 0;\n if (lowerOk && upperOk) {\n return true;\n }\n }\n return false;\n });\n }\n\n startsWith(prefix: string): StorageCollection<T> {\n return this.createCollection((current) => typeof current === 'string' && current.startsWith(prefix));\n }\n\n startsWithIgnoreCase(prefix: string): StorageCollection<T> {\n return this.createCollection((current) => typeof current === 'string' && current.toLowerCase().startsWith(prefix.toLowerCase()));\n }\n\n startsWithAnyOf(...prefixes: string[]): StorageCollection<T>;\n startsWithAnyOf(prefixes: string[]): StorageCollection<T>;\n startsWithAnyOf(...args: any[]): StorageCollection<T> {\n const prefixes = this.flattenArgs<string>(args);\n return this.createCollection((current) => typeof current === 'string' && prefixes.some((prefix) => current.startsWith(prefix)));\n }\n\n startsWithAnyOfIgnoreCase(...prefixes: string[]): StorageCollection<T>;\n startsWithAnyOfIgnoreCase(prefixes: string[]): StorageCollection<T>;\n startsWithAnyOfIgnoreCase(...args: any[]): StorageCollection<T> {\n const prefixes = this.flattenArgs<string>(args).map((prefix) => prefix.toLowerCase());\n return this.createCollection((current) => typeof current === 'string' && prefixes.some((prefix) => current.toLowerCase().startsWith(prefix)));\n }\n\n equalsIgnoreCase(value: string): StorageCollection<T> {\n return this.createCollection((current) => typeof current === 'string' && current.toLowerCase() === value.toLowerCase());\n }\n\n anyOf(...values: any[]): StorageCollection<T>;\n anyOf(values: any[]): StorageCollection<T>;\n anyOf(...args: any[]): StorageCollection<T> {\n const values = this.flattenArgs<any>(args);\n const valueSet = new Set(values.map((entry) => JSON.stringify(entry)));\n return this.createCollection((current) => valueSet.has(JSON.stringify(current)));\n }\n\n anyOfIgnoreCase(...values: string[]): StorageCollection<T>;\n anyOfIgnoreCase(values: string[]): StorageCollection<T>;\n anyOfIgnoreCase(...args: any[]): StorageCollection<T> {\n const values = this.flattenArgs<string>(args).map((value) => value.toLowerCase());\n const valueSet = new Set(values);\n return this.createCollection((current) => typeof current === 'string' && valueSet.has(current.toLowerCase()));\n }\n\n noneOf(...values: any[]): StorageCollection<T>;\n noneOf(values: any[]): StorageCollection<T>;\n noneOf(...args: any[]): StorageCollection<T> {\n const values = this.flattenArgs<any>(args);\n const valueSet = new Set(values.map((entry) => JSON.stringify(entry)));\n return this.createCollection((current) => !valueSet.has(JSON.stringify(current)));\n }\n\n notEqual(value: any): StorageCollection<T> {\n return this.createCollection((current) => this.table.compareValues(current, value) !== 0);\n }\n\n private createCollection(predicate: (indexValue: unknown) => boolean): StorageCollection<T> {\n const condition = (record: T, _key: string): boolean => predicate(this.table.getIndexValue(record, this.index));\n if (this.baseCollection) {\n const combined = (record: T, key: string): boolean =>\n this.baseCollection!.matches(record, key) || predicate(this.table.getIndexValue(record, this.index));\n return this.table.createCollectionFromPredicate(combined, this.baseCollection);\n }\n return this.table.createCollectionFromPredicate(condition);\n }\n\n private flattenArgs<TValue>(args: any[]): TValue[] {\n if (args.length === 1 && Array.isArray(args[0])) {\n return args[0] as TValue[];\n }\n return args as TValue[];\n }\n}\n","import type { StorageCollection, StorageTable, StorageWhereClause } from '../types';\nimport { LOCAL_PK } from '../../types';\nimport { createLocalId } from '../../helpers';\nimport type { MemoryCollectionState, MemoryRecord } from './types';\nimport { createDefaultState } from './types';\nimport { MemoryCollection } from './MemoryCollection';\nimport { MemoryWhereClause } from './MemoryWhereClause';\n\nexport class MemoryTable<T extends MemoryRecord = MemoryRecord> implements StorageTable<T> {\n readonly name: string;\n readonly schema: unknown = undefined;\n readonly primaryKey: unknown = LOCAL_PK;\n readonly hook: unknown = Object.freeze({});\n readonly raw: {\n add: (item: T) => Promise<unknown>;\n put: (item: T) => Promise<unknown>;\n update: (key: unknown, changes: Partial<T>) => Promise<number>;\n delete: (key: unknown) => Promise<void>;\n get: (key: unknown) => Promise<T | undefined>;\n bulkAdd: (items: T[]) => Promise<unknown>;\n bulkPut: (items: T[]) => Promise<unknown>;\n bulkUpdate: (keysAndChanges: Array<{ key: unknown; changes: Partial<T> }>) => Promise<number>;\n bulkDelete: (keys: Array<unknown>) => Promise<void>;\n clear: () => Promise<void>;\n };\n private readonly records = new Map<string, T>();\n\n constructor(name: string) {\n this.name = name;\n this.raw = {\n add: async (item: T) => this.baseAdd(item),\n put: async (item: T) => this.basePut(item),\n update: async (key: unknown, changes: Partial<T>) => this.baseUpdate(key, changes),\n delete: async (key: unknown) => {\n this.baseDelete(key);\n },\n get: async (key: unknown) => this.baseGet(key),\n bulkAdd: async (items: T[]) => this.baseBulkAdd(items),\n bulkPut: async (items: T[]) => this.baseBulkPut(items),\n bulkUpdate: async (keysAndChanges: Array<{ key: unknown; changes: Partial<T> }>) => this.baseBulkUpdate(keysAndChanges),\n bulkDelete: async (keys: Array<unknown>) => this.baseBulkDelete(keys),\n clear: async () => this.baseClear(),\n };\n }\n\n async add(item: T): Promise<unknown> {\n return this.baseAdd(item);\n }\n\n async put(item: T): Promise<unknown> {\n return this.basePut(item);\n }\n\n async update(key: unknown, changes: Partial<T>): Promise<number> {\n return this.baseUpdate(key, changes);\n }\n\n async delete(key: unknown): Promise<void> {\n this.baseDelete(key);\n }\n\n async clear(): Promise<void> {\n this.baseClear();\n }\n\n private baseClear(): void {\n this.records.clear();\n }\n\n async get(key: unknown): Promise<T | undefined> {\n const stored = this.baseGet(key);\n return stored ? this.cloneRecord(stored) : undefined;\n }\n\n async toArray(): Promise<T[]> {\n return this.entries().map(([, record]) => this.cloneRecord(record));\n }\n\n async count(): Promise<number> {\n return this.records.size;\n }\n\n async bulkAdd(items: T[]): Promise<unknown> {\n return this.baseBulkAdd(items);\n }\n\n private baseBulkAdd(items: T[]): unknown {\n let lastKey: unknown = undefined;\n for (let index = 0; index < items.length; index += 1) {\n const item = items[index]!;\n lastKey = this.baseAdd(item);\n }\n return lastKey;\n }\n\n async bulkPut(items: T[]): Promise<unknown> {\n return this.baseBulkPut(items);\n }\n\n private baseBulkPut(items: T[]): unknown {\n let lastKey: unknown = undefined;\n for (let index = 0; index < items.length; index += 1) {\n const item = items[index]!;\n lastKey = this.basePut(item);\n }\n return lastKey;\n }\n\n async bulkGet(keys: Array<unknown>): Promise<Array<T | undefined>> {\n return Promise.all(keys.map((key) => this.get(key)));\n }\n\n async bulkUpdate(keysAndChanges: Array<{ key: unknown; changes: Partial<T> }>): Promise<number> {\n return this.baseBulkUpdate(keysAndChanges);\n }\n\n private baseBulkUpdate(keysAndChanges: Array<{ key: unknown; changes: Partial<T> }>): number {\n let updatedCount = 0;\n for (const { key, changes } of keysAndChanges) {\n const result = this.baseUpdate(key, changes);\n updatedCount += result;\n }\n return updatedCount;\n }\n\n async bulkDelete(keys: Array<unknown>): Promise<void> {\n this.baseBulkDelete(keys);\n }\n\n private baseBulkDelete(keys: Array<unknown>): void {\n for (const key of keys) {\n this.baseDelete(key);\n }\n }\n\n where(index: string | string[]): StorageWhereClause<T> {\n return this.createWhereClause(index);\n }\n\n orderBy(index: string | string[]): StorageCollection<T> {\n return this.createCollection({\n orderBy: { index, direction: 'asc' },\n });\n }\n\n reverse(): StorageCollection<T> {\n return this.createCollection({ reverse: true });\n }\n\n offset(offset: number): StorageCollection<T> {\n return this.createCollection({ offset });\n }\n\n limit(count: number): StorageCollection<T> {\n return this.createCollection({ limit: count });\n }\n\n mapToClass(_ctor: new (...args: any[]) => any): StorageTable<T> {\n return this;\n }\n\n async each(callback: (item: T) => void | Promise<void>): Promise<void> {\n for (const [, record] of this.entries()) {\n await callback(this.cloneRecord(record));\n }\n }\n\n jsFilter(predicate: (item: T) => boolean): StorageCollection<T> {\n return this.createCollection({ predicate: (record) => predicate(record) });\n }\n\n private createCollection(stateOverrides?: Partial<MemoryCollectionState<T>>): MemoryCollection<T> {\n const baseState = createDefaultState<T>();\n const state: MemoryCollectionState<T> = {\n ...baseState,\n ...stateOverrides,\n predicate: stateOverrides?.predicate ?? baseState.predicate,\n };\n return new MemoryCollection(this, state);\n }\n\n createCollectionFromPredicate(predicate: (record: T, key: string) => boolean, template?: MemoryCollection<T>): MemoryCollection<T> {\n const baseState = template ? template.getState() : createDefaultState<T>();\n return new MemoryCollection(this, {\n ...baseState,\n predicate,\n });\n }\n\n createWhereClause(index: string | string[], baseCollection?: MemoryCollection<T>): MemoryWhereClause<T> {\n return new MemoryWhereClause(this, index, baseCollection);\n }\n\n entries(): Array<[string, T]> {\n return Array.from(this.records.entries());\n }\n\n cloneRecord(record: T): T {\n return { ...(record as object) } as T;\n }\n\n deleteByKey(key: string): void {\n this.records.delete(key);\n }\n\n getMutableRecord(key: string): T | undefined {\n return this.records.get(key);\n }\n\n setMutableRecord(key: string, record: T): void {\n this.records.set(key, { ...record, _localId: record._localId ?? key } as T);\n }\n\n resolvePublicKey(record: T, key: string): unknown {\n if (record._localId !== undefined) {\n return record._localId;\n }\n if (record.id !== undefined) {\n return record.id;\n }\n return key;\n }\n\n getIndexValue(record: T, index: string | string[]): unknown {\n if (Array.isArray(index)) {\n return index.map((key) => (record as any)[key]);\n }\n return (record as any)[index];\n }\n\n compareEntries(left: T, right: T, index: string | string[]): number {\n if (Array.isArray(index)) {\n for (const key of index) {\n const diff = this.compareValues((left as any)[key], (right as any)[key]);\n if (diff !== 0) {\n return diff;\n }\n }\n return 0;\n }\n return this.compareValues((left as any)[index], (right as any)[index]);\n }\n\n compareValues(left: unknown, right: unknown): number {\n const normalizedLeft = this.normalizeComparableValue(left) as any;\n const normalizedRight = this.normalizeComparableValue(right) as any;\n if (normalizedLeft < normalizedRight) {\n return -1;\n }\n if (normalizedLeft > normalizedRight) {\n return 1;\n }\n return 0;\n }\n\n private normalizeComparableValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map((entry) => this.normalizeComparableValue(entry));\n }\n if (value instanceof Date) {\n return value.valueOf();\n }\n return value ?? null;\n }\n\n private baseAdd(item: T): string {\n const primaryKey = this.createPrimaryKey(item);\n const stored = { ...item, _localId: primaryKey } as T;\n this.records.set(primaryKey, stored);\n return primaryKey;\n }\n\n private basePut(item: T): string {\n const primaryKey = this.createPrimaryKey(item);\n const stored = { ...item, _localId: primaryKey } as T;\n this.records.set(primaryKey, stored);\n return primaryKey;\n }\n\n private baseUpdate(key: unknown, changes: Partial<T>): number {\n const primaryKey = this.resolveKey(key);\n if (!primaryKey) {\n return 0;\n }\n const existing = this.records.get(primaryKey);\n if (!existing) {\n return 0;\n }\n const updated = { ...existing, ...changes, _localId: existing._localId ?? primaryKey } as T;\n this.records.set(primaryKey, updated);\n return 1;\n }\n\n private baseDelete(key: unknown): void {\n const primaryKey = this.resolveKey(key);\n if (primaryKey) {\n this.records.delete(primaryKey);\n }\n }\n\n private baseGet(key: unknown): T | undefined {\n const primaryKey = this.resolveKey(key);\n if (!primaryKey) {\n return undefined;\n }\n return this.records.get(primaryKey);\n }\n\n private createPrimaryKey(item: T): string {\n if (item._localId && typeof item._localId === 'string') {\n return item._localId;\n }\n if (item.id !== undefined && (typeof item.id === 'string' || typeof item.id === 'number' || typeof item.id === 'bigint')) {\n return String(item.id);\n }\n return createLocalId();\n }\n\n private resolveKey(key: unknown): string | undefined {\n if (typeof key === 'string') {\n return key;\n }\n if (typeof key === 'number' || typeof key === 'bigint') {\n return String(key);\n }\n if (key && typeof key === 'object' && 'id' in (key as Record<string, unknown>)) {\n const lookup = (key as Record<string, unknown>).id;\n for (const [storedKey, record] of this.records.entries()) {\n if (record.id === lookup) {\n return storedKey;\n }\n }\n }\n return undefined;\n }\n}\n","import type { StorageAdapter, StorageTable, StorageTransactionContext, TransactionMode } from '../types';\nimport type { StorageSchemaDefinitionOptions } from '../sqlite/types';\nimport { MemoryQueryContext } from './MemoryQueryContext';\nimport { MemoryTable } from './MemoryTable';\n\nexport class MemoryAdapter implements StorageAdapter {\n readonly type = 'MemoryAdapter';\n readonly name: string;\n readonly tables = new Map<string, MemoryTable<any>>();\n\n constructor(name: string) {\n this.name = name;\n }\n\n async open(): Promise<void> {\n // No-op for memory adapter - always \"open\"\n }\n\n async close(): Promise<void> {\n this.tables.clear();\n }\n\n async delete(): Promise<void> {\n this.tables.clear();\n }\n\n async query<R>(callback: (ctx: MemoryQueryContext) => Promise<R>): Promise<R> {\n return callback(new MemoryQueryContext(this));\n }\n\n defineSchema(_version: number, schema: Record<string, string>, _options?: StorageSchemaDefinitionOptions): void {\n for (const tableName of Object.keys(schema)) {\n this.ensureTable(tableName);\n }\n }\n\n table<T = any>(name: string): StorageTable<T> {\n return this.ensureTable(name) as StorageTable<T>;\n }\n\n async transaction<T>(_mode: TransactionMode, tableNames: string[], callback: (context: StorageTransactionContext) => Promise<T>): Promise<T> {\n const tables: Record<string, StorageTable<any>> = {};\n for (const tableName of tableNames) {\n tables[tableName] = this.ensureTable(tableName);\n }\n return callback({ tables });\n }\n\n private ensureTable(name: string): MemoryTable<any> {\n if (!this.tables.has(name)) {\n this.tables.set(name, new MemoryTable(name));\n }\n return this.tables.get(name)!;\n }\n}\n","import type { SQLiteCollectionState, SQLiteCondition } from './types';\n\nexport const SQLITE_SCHEMA_VERSION_STATE_KEY = 'sqlite_schema_version';\nexport const DEFAULT_STREAM_BATCH_SIZE = 200;\n\nexport const createDefaultState = <T>(): SQLiteCollectionState<T> => ({\n sqlConditions: [],\n jsPredicate: undefined,\n orderBy: undefined,\n reverse: false,\n offset: 0,\n limit: undefined,\n distinct: false,\n});\n\nexport interface SQLiteBuiltQuery {\n whereClause: string;\n parameters: unknown[];\n}\n\nexport const buildWhereClause = (conditions: SQLiteCondition[]): SQLiteBuiltQuery => {\n if (conditions.length === 0) {\n return { whereClause: '', parameters: [] };\n }\n\n const clauses: string[] = [];\n const parameters: unknown[] = [];\n\n for (const condition of conditions) {\n const built = buildCondition(condition);\n clauses.push(built.clause);\n parameters.push(...built.parameters);\n }\n\n return {\n whereClause: `WHERE ${clauses.join(' AND ')}`,\n parameters,\n };\n};\n\ninterface BuiltCondition {\n clause: string;\n parameters: unknown[];\n}\n\nconst buildCondition = (condition: SQLiteCondition): BuiltCondition => {\n // Handle 'or' condition first since it doesn't have a column property\n if (condition.type === 'or') {\n if (condition.conditions.length === 0) {\n return { clause: '0 = 1', parameters: [] };\n }\n const subClauses: string[] = [];\n const subParams: unknown[] = [];\n for (const sub of condition.conditions) {\n const built = buildCondition(sub);\n subClauses.push(built.clause);\n subParams.push(...built.parameters);\n }\n return { clause: `(${subClauses.join(' OR ')})`, parameters: subParams };\n }\n\n // Handle compound equals (multiple columns ANDed together)\n if (condition.type === 'compoundEquals') {\n const clauses = condition.columns.map((col) => `${quoteIdentifier(col)} = ?`);\n return { clause: `(${clauses.join(' AND ')})`, parameters: condition.values };\n }\n\n const col = quoteIdentifier(condition.column);\n\n switch (condition.type) {\n case 'equals': {\n if (condition.caseInsensitive) {\n return { clause: `LOWER(${col}) = LOWER(?)`, parameters: [condition.value] };\n }\n return { clause: `${col} = ?`, parameters: [condition.value] };\n }\n\n case 'comparison': {\n return { clause: `${col} ${condition.op} ?`, parameters: [condition.value] };\n }\n\n case 'between': {\n const lowerOp = condition.includeLower ? '>=' : '>';\n const upperOp = condition.includeUpper ? '<=' : '<';\n return {\n clause: `(${col} ${lowerOp} ? AND ${col} ${upperOp} ?)`,\n parameters: [condition.lower, condition.upper],\n };\n }\n\n case 'in': {\n if (condition.values.length === 0) {\n // No values = no matches\n return { clause: '0 = 1', parameters: [] };\n }\n const placeholders = condition.values.map(() => '?').join(', ');\n if (condition.caseInsensitive) {\n return {\n clause: `LOWER(${col}) IN (${condition.values.map(() => 'LOWER(?)').join(', ')})`,\n parameters: condition.values,\n };\n }\n return { clause: `${col} IN (${placeholders})`, parameters: condition.values };\n }\n\n case 'notIn': {\n if (condition.values.length === 0) {\n // No exclusions = all match\n return { clause: '1 = 1', parameters: [] };\n }\n const placeholders = condition.values.map(() => '?').join(', ');\n return { clause: `${col} NOT IN (${placeholders})`, parameters: condition.values };\n }\n\n case 'like': {\n if (condition.caseInsensitive) {\n return { clause: `LOWER(${col}) LIKE LOWER(?)`, parameters: [condition.pattern] };\n }\n return { clause: `${col} LIKE ?`, parameters: [condition.pattern] };\n }\n }\n};\n\nexport const cloneValue = <T>(value: T): T => {\n if (typeof globalThis.structuredClone === 'function') {\n return globalThis.structuredClone(value);\n }\n return JSON.parse(JSON.stringify(value ?? null)) as T;\n};\n\nexport const quoteIdentifier = (name: string): string => `\"${name.replace(/\"/g, '\"\"')}\"`;\n\nexport const normalizeComparableValue = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.map((entry) => normalizeComparableValue(entry));\n }\n if (value instanceof Date) {\n return value.valueOf();\n }\n if (value === undefined) {\n return null;\n }\n return value;\n};\n","import type { StorageTable, StorageTransactionContext, TransactionMode } from '../types';\nimport type { SQLiteDatabaseDriver, SQLiteRunResult } from './types';\nimport { SQLiteAdapter } from './SQLiteAdapter';\n\nexport class SqliteQueryContext {\n constructor(\n private readonly driver: SQLiteDatabaseDriver,\n private readonly adapter: SQLiteAdapter,\n ) {}\n\n table<T = any>(name: string): StorageTable<T> {\n return this.adapter.table(name);\n }\n\n transaction<T>(mode: TransactionMode, tableNames: string[], callback: (context: StorageTransactionContext) => Promise<T>): Promise<T> {\n return this.adapter.transaction(mode, tableNames, callback);\n }\n\n async execute(statement: string): Promise<void> {\n return this.driver.execute(statement);\n }\n\n async run(statement: string, values?: any[]): Promise<SQLiteRunResult> {\n return this.driver.run(statement, values);\n }\n\n async queryRows(statement: string, values?: any[]): Promise<Array<Record<string, any>>> {\n return this.adapter.queryRows(statement, values);\n }\n}\n","import type { StorageAdapter, StorageTable, StorageTransactionContext, TransactionMode } from '../types';\nimport type {\n TableSchemaDefinition,\n SQLiteTableDefinition,\n SQLiteColumnDefinition,\n SQLiteIndexDefinition,\n SQLiteDefaultValue,\n SQLiteForeignKeyReference,\n} from './schema';\nimport type { StorageSchemaDefinitionOptions, SQLiteMigrationContext, SQLiteMigrationDirection, SQLiteMigrationHandler } from './types';\nimport type { SQLiteDatabaseDriver, SQLiteRunResult, SQLiteQueryResult } from './types';\nimport { LOCAL_PK } from '../../types';\nimport type { SQLiteAdapterOptions, SQLiteTableSchemaMetadata, SQLiteColumnSchema } from './types';\nimport { DYNC_STATE_TABLE } from '../../core/StateManager';\nimport { SQLITE_SCHEMA_VERSION_STATE_KEY, quoteIdentifier } from './helpers';\nimport { SQLiteTable } from './SQLiteTable';\nimport { SqliteQueryContext } from './SqliteQueryContext';\n\nexport class SQLiteAdapter implements StorageAdapter {\n readonly type = 'SQLiteAdapter';\n readonly name: string;\n\n private readonly options: SQLiteAdapterOptions;\n private readonly schemas = new Map<string, SQLiteTableSchemaMetadata>();\n private readonly versionSchemas = new Map<number, Map<string, SQLiteTableSchemaMetadata>>();\n private readonly versionOptions = new Map<number, StorageSchemaDefinitionOptions>();\n private readonly tableCache = new Map<string, SQLiteTable<any>>();\n private driver: SQLiteDatabaseDriver;\n private openPromise?: Promise<void>;\n private isOpen = false;\n private schemaApplied = false;\n private transactionDepth = 0;\n private targetVersion = 0;\n\n constructor(driver: SQLiteDatabaseDriver, options: SQLiteAdapterOptions = {}) {\n this.driver = driver;\n this.name = driver.name;\n this.options = options;\n }\n\n get driverType(): string {\n return this.driver.type;\n }\n\n /**\n * Opens the database connection and applies schema.\n * This is called automatically when performing operations,\n * so explicit calls are optional but safe (idempotent).\n * When called explicitly after schema changes, it will run any pending migrations.\n */\n async open(): Promise<void> {\n if (this.isOpen) {\n // Explicit open() call while already open - check for pending migrations\n await this.runPendingMigrations();\n return;\n }\n return this.ensureOpen();\n }\n\n private async ensureOpen(): Promise<void> {\n if (this.isOpen) {\n return;\n }\n if (this.openPromise) {\n return this.openPromise;\n }\n this.openPromise = this.performOpen();\n try {\n await this.openPromise;\n } finally {\n this.openPromise = undefined;\n }\n }\n\n private async performOpen(): Promise<void> {\n await this.driver.open();\n await this.applySchema();\n await this.runPendingMigrations();\n this.isOpen = true;\n }\n\n async close(): Promise<void> {\n if (this.driver) {\n await this.driver.close();\n }\n this.isOpen = false;\n this.tableCache.clear();\n }\n\n async delete(): Promise<void> {\n for (const table of this.schemas.keys()) {\n await this.execute(`DROP TABLE IF EXISTS ${quoteIdentifier(table)}`);\n }\n await this.execute(`DROP TABLE IF EXISTS ${quoteIdentifier(DYNC_STATE_TABLE)}`);\n\n this.tableCache.clear();\n this.schemaApplied = false;\n // Rebuild schemas from versionSchemas so the adapter remains usable.\n // The next operation will re-create the tables via applySchema().\n this.refreshActiveSchema();\n }\n\n defineSchema(version: number, schema: Record<string, TableSchemaDefinition>, options?: StorageSchemaDefinitionOptions): void {\n const normalized = new Map<string, SQLiteTableSchemaMetadata>();\n for (const [tableName, definition] of Object.entries(schema)) {\n if (typeof definition === 'string') {\n throw new Error(`SQLite adapter requires structured schema definitions. Table '${tableName}' must provide an object-based schema.`);\n }\n normalized.set(tableName, this.parseStructuredSchema(tableName, definition));\n }\n this.versionSchemas.set(version, normalized);\n this.versionOptions.set(version, options ?? {});\n this.refreshActiveSchema();\n }\n\n private refreshActiveSchema(): void {\n if (!this.versionSchemas.size) {\n this.schemas.clear();\n this.targetVersion = 0;\n this.schemaApplied = false;\n this.tableCache.clear();\n return;\n }\n\n const versions = Array.from(this.versionSchemas.keys());\n const latestVersion = Math.max(...versions);\n const latestSchema = this.versionSchemas.get(latestVersion);\n if (!latestSchema) {\n return;\n }\n\n this.schemas.clear();\n for (const [name, schema] of latestSchema.entries()) {\n this.schemas.set(name, schema);\n }\n\n if (this.targetVersion !== latestVersion) {\n this.tableCache.clear();\n }\n\n this.targetVersion = latestVersion;\n this.schemaApplied = false;\n }\n\n table<T = any>(name: string): StorageTable<T> {\n if (!this.schemas.has(name)) {\n throw new Error(`Table '${name}' is not part of the defined schema`);\n }\n if (!this.tableCache.has(name)) {\n this.tableCache.set(name, new SQLiteTable<T>(this, this.schemas.get(name)!));\n }\n return this.tableCache.get(name)! as StorageTable<T>;\n }\n\n async transaction<T>(_mode: TransactionMode, tableNames: string[], callback: (context: StorageTransactionContext) => Promise<T>): Promise<T> {\n const driver = await this.getDriver();\n const shouldManageTransaction = this.transactionDepth === 0;\n this.transactionDepth += 1;\n if (shouldManageTransaction) {\n this.logSql('BEGIN TRANSACTION');\n await driver.execute('BEGIN TRANSACTION');\n }\n try {\n const tables: Record<string, StorageTable<any>> = {};\n for (const tableName of tableNames) {\n tables[tableName] = this.table(tableName);\n }\n const result = await callback({ tables });\n if (shouldManageTransaction) {\n this.logSql('COMMIT');\n await driver.execute('COMMIT');\n }\n return result;\n } catch (err) {\n if (shouldManageTransaction) {\n this.logSql('ROLLBACK');\n await driver.execute('ROLLBACK');\n }\n throw err;\n } finally {\n this.transactionDepth -= 1;\n }\n }\n\n async execute(statement: string, values?: any[]): Promise<void> {\n if (values && values.length) {\n await this.run(statement, values);\n return;\n }\n const driver = await this.getDriver();\n this.logSql(statement);\n await driver.execute(statement);\n }\n\n async run(statement: string, values?: any[]): Promise<SQLiteRunResult> {\n const driver = await this.getDriver();\n const params = values ?? [];\n this.logSql(statement, params);\n return driver.run(statement, params);\n }\n\n async query<R>(callback: (ctx: SqliteQueryContext) => Promise<R>): Promise<R>;\n async query(statement: string, values?: any[]): Promise<SQLiteQueryResult>;\n async query<R>(arg1: string | ((ctx: SqliteQueryContext) => Promise<R>), arg2?: any[]): Promise<R | SQLiteQueryResult> {\n if (typeof arg1 === 'function') {\n const driver = await this.getDriver();\n return arg1(new SqliteQueryContext(driver, this));\n }\n const statement = arg1;\n const values = arg2;\n const driver = await this.getDriver();\n const params = values ?? [];\n this.logSql(statement, params);\n return driver.query(statement, params);\n }\n\n async queryRows(statement: string, values?: any[]): Promise<Array<Record<string, any>>> {\n const result = await this.query(statement, values);\n const columns = result.columns ?? [];\n return (result.values ?? []).map((row) => {\n const record: Record<string, any> = {};\n for (let index = 0; index < columns.length; index += 1) {\n record[columns[index]!] = row[index];\n }\n return record;\n });\n }\n\n /**\n * Ensures the database is open and returns the driver.\n * This is the main entry point for all public database operations.\n */\n private async getDriver(): Promise<SQLiteDatabaseDriver> {\n await this.ensureOpen();\n return this.driver;\n }\n\n /**\n * Internal execute that uses driver directly.\n * Used during the open process to avoid recursion.\n */\n private async internalExecute(statement: string, values?: any[]): Promise<void> {\n if (values && values.length) {\n await this.internalRun(statement, values);\n return;\n }\n this.logSql(statement);\n await this.driver.execute(statement);\n }\n\n /**\n * Internal run that uses driver directly.\n * Used during the open process to avoid recursion.\n */\n private async internalRun(statement: string, values?: any[]): Promise<SQLiteRunResult> {\n const params = values ?? [];\n this.logSql(statement, params);\n return this.driver.run(statement, params);\n }\n\n /**\n * Internal queryRows that uses driver directly.\n * Used during the open process to avoid recursion.\n */\n private async internalQueryRows(statement: string, values?: any[]): Promise<Array<Record<string, any>>> {\n const params = values ?? [];\n this.logSql(statement, params);\n const result = await this.driver.query(statement, params);\n const columns = result.columns ?? [];\n return (result.values ?? []).map((row) => {\n const record: Record<string, any> = {};\n for (let index = 0; index < columns.length; index += 1) {\n record[columns[index]!] = row[index];\n }\n return record;\n });\n }\n\n /**\n * Internal query that uses driver directly.\n * Used during migrations to avoid recursion.\n */\n private async internalQuery(statement: string, values?: any[]): Promise<SQLiteQueryResult> {\n const params = values ?? [];\n this.logSql(statement, params);\n return this.driver.query(statement, params);\n }\n\n private logSql(statement: string, parameters?: any[]): void {\n const { debug } = this.options;\n if (!debug) {\n return;\n }\n const hasParams = parameters && parameters.length;\n if (typeof debug === 'function') {\n debug(statement, hasParams ? parameters : undefined);\n return;\n }\n if (debug === true) {\n if (hasParams) {\n console.debug('[dync][sqlite]', statement, parameters);\n } else {\n console.debug('[dync][sqlite]', statement);\n }\n }\n }\n\n private async getStoredSchemaVersion(): Promise<number> {\n const rows = await this.internalQueryRows(`SELECT value FROM ${quoteIdentifier(DYNC_STATE_TABLE)} WHERE ${quoteIdentifier(LOCAL_PK)} = ? LIMIT 1`, [\n SQLITE_SCHEMA_VERSION_STATE_KEY,\n ]);\n const rawValue = rows[0]?.value;\n const parsed = Number(rawValue ?? 0);\n return Number.isFinite(parsed) ? parsed : 0;\n }\n\n private async setStoredSchemaVersion(version: number): Promise<void> {\n await this.internalRun(\n `INSERT INTO ${quoteIdentifier(DYNC_STATE_TABLE)} (${quoteIdentifier(LOCAL_PK)}, value) VALUES (?, ?) ON CONFLICT(${quoteIdentifier(LOCAL_PK)}) DO UPDATE SET value = excluded.value`,\n [SQLITE_SCHEMA_VERSION_STATE_KEY, String(version)],\n );\n }\n\n private async runPendingMigrations(): Promise<void> {\n if (!this.versionSchemas.size) {\n await this.setStoredSchemaVersion(0);\n return;\n }\n\n const targetVersion = this.targetVersion;\n const currentVersion = await this.getStoredSchemaVersion();\n\n if (currentVersion === targetVersion) {\n return;\n }\n\n if (currentVersion < targetVersion) {\n for (let version = currentVersion + 1; version <= targetVersion; version += 1) {\n await this.runMigrationStep(version, 'upgrade', version - 1, version);\n await this.setStoredSchemaVersion(version);\n }\n return;\n }\n\n for (let version = currentVersion; version > targetVersion; version -= 1) {\n await this.runMigrationStep(version, 'downgrade', version, version - 1);\n await this.setStoredSchemaVersion(version - 1);\n }\n }\n\n private async runMigrationStep(version: number, direction: SQLiteMigrationDirection, fromVersion: number, toVersion: number): Promise<void> {\n const handler = this.getMigrationHandler(version, direction);\n if (!handler) {\n return;\n }\n const context: SQLiteMigrationContext = {\n direction,\n fromVersion,\n toVersion,\n execute: (statement: string) => this.internalExecute(statement),\n run: (statement: string, values?: any[]) => this.internalRun(statement, values),\n query: (statement: string, values?: any[]) => this.internalQuery(statement, values),\n };\n await handler(context);\n }\n\n private getMigrationHandler(version: number, direction: SQLiteMigrationDirection): SQLiteMigrationHandler | undefined {\n const options = this.versionOptions.get(version);\n const migrations = options?.sqlite?.migrations;\n if (!migrations) {\n return undefined;\n }\n return direction === 'upgrade' ? migrations.upgrade : migrations.downgrade;\n }\n\n private async applySchema(): Promise<void> {\n if (this.schemaApplied) {\n return;\n }\n for (const schema of this.schemas.values()) {\n await this.internalExecute(this.buildCreateTableStatement(schema));\n const indexStatements = this.buildIndexStatements(schema);\n for (const statement of indexStatements) {\n await this.internalExecute(statement);\n }\n }\n this.schemaApplied = true;\n }\n\n private buildCreateTableStatement(schema: SQLiteTableSchemaMetadata): string {\n const columns: string[] = [];\n\n for (const column of Object.values(schema.definition.columns)) {\n columns.push(this.buildStructuredColumnDefinition(column));\n }\n\n if (schema.definition.source === 'structured' && Array.isArray(schema.definition.tableConstraints)) {\n columns.push(...schema.definition.tableConstraints.filter(Boolean));\n }\n\n const trailingClauses = [schema.definition.withoutRowId ? 'WITHOUT ROWID' : undefined, schema.definition.strict ? 'STRICT' : undefined].filter(Boolean);\n\n const suffix = trailingClauses.length ? ` ${trailingClauses.join(' ')}` : '';\n return `CREATE TABLE IF NOT EXISTS ${quoteIdentifier(schema.name)} (${columns.join(', ')})${suffix}`;\n }\n\n private buildStructuredColumnDefinition(column: SQLiteColumnSchema): string {\n const parts: string[] = [];\n parts.push(quoteIdentifier(column.name));\n parts.push(this.formatColumnType(column));\n\n if (column.name === LOCAL_PK) {\n parts.push('PRIMARY KEY');\n }\n\n if (column.collate) {\n parts.push(`COLLATE ${column.collate}`);\n }\n\n if (column.generatedAlwaysAs) {\n const storage = column.stored ? 'STORED' : 'VIRTUAL';\n parts.push(`GENERATED ALWAYS AS (${column.generatedAlwaysAs}) ${storage}`);\n }\n\n if (column.unique) {\n parts.push('UNIQUE');\n }\n\n if (column.default !== undefined) {\n parts.push(`DEFAULT ${this.formatDefaultValue(column.default)}`);\n }\n\n if (column.check) {\n parts.push(`CHECK (${column.check})`);\n }\n\n if (column.references) {\n parts.push(this.buildReferencesClause(column.references));\n }\n\n if (column.constraints?.length) {\n parts.push(...column.constraints);\n }\n\n return parts.filter(Boolean).join(' ');\n }\n\n private formatColumnType(column: SQLiteColumnSchema): string {\n const declaredType = column.type?.trim().toUpperCase();\n // Map BOOLEAN to INTEGER for SQLite storage (SQLite has no native boolean type)\n const base = !declaredType || !declaredType.length ? 'NUMERIC' : declaredType === 'BOOLEAN' ? 'INTEGER' : declaredType;\n if (column.length && !base.includes('(')) {\n return `${base}(${column.length})`;\n }\n return base;\n }\n\n private formatDefaultValue(value: SQLiteDefaultValue): string {\n if (value === null) {\n return 'NULL';\n }\n if (typeof value === 'number') {\n return String(value);\n }\n if (typeof value === 'boolean') {\n return value ? '1' : '0';\n }\n const escaped = String(value).replace(/'/g, \"''\");\n return `'${escaped}'`;\n }\n\n private buildReferencesClause(reference: SQLiteForeignKeyReference | string): string {\n if (typeof reference === 'string') {\n return `REFERENCES ${reference}`;\n }\n const parts: string[] = [];\n parts.push(`REFERENCES ${quoteIdentifier(reference.table)}`);\n if (reference.column) {\n parts.push(`(${quoteIdentifier(reference.column)})`);\n }\n if (reference.match) {\n parts.push(`MATCH ${reference.match}`);\n }\n if (reference.onDelete) {\n parts.push(`ON DELETE ${reference.onDelete}`);\n }\n if (reference.onUpdate) {\n parts.push(`ON UPDATE ${reference.onUpdate}`);\n }\n return parts.join(' ');\n }\n\n private buildIndexStatements(schema: SQLiteTableSchemaMetadata): string[] {\n if (schema.definition.source !== 'structured' || !schema.definition.indexes?.length) {\n return [];\n }\n const statements: string[] = [];\n schema.definition.indexes.forEach((index, position) => {\n if (!index.columns?.length) {\n return;\n }\n const indexName = this.generateIndexName(schema, index, position);\n const columnSegments = index.columns.map((columnName, columnIndex) => {\n const segments = [quoteIdentifier(columnName)];\n if (index.collate) {\n segments.push(`COLLATE ${index.collate}`);\n }\n const order = index.orders?.[columnIndex];\n if (order) {\n segments.push(order);\n }\n return segments.join(' ');\n });\n const whereClause = index.where ? ` WHERE ${index.where}` : '';\n statements.push(\n `CREATE ${index.unique ? 'UNIQUE ' : ''}INDEX IF NOT EXISTS ${quoteIdentifier(indexName)} ON ${quoteIdentifier(schema.name)} (${columnSegments.join(', ')})${whereClause}`,\n );\n });\n return statements;\n }\n\n private generateIndexName(schema: SQLiteTableSchemaMetadata, index: SQLiteIndexDefinition, position: number): string {\n if (index.name) {\n return index.name;\n }\n const sanitizedColumns = index.columns.map((column) => column.replace(/[^A-Za-z0-9_]/g, '_')).join('_');\n const suffix = sanitizedColumns || String(position);\n return `${schema.name}_${suffix}_idx`;\n }\n\n private parseStructuredSchema(tableName: string, definition: SQLiteTableDefinition): SQLiteTableSchemaMetadata {\n if (!definition?.columns || !Object.keys(definition.columns).length) {\n throw new Error(`SQLite schema for table '${tableName}' must define at least one column.`);\n }\n\n if (!definition.columns[LOCAL_PK]) {\n throw new Error(`SQLite schema for table '${tableName}' must define a column named '${LOCAL_PK}'.`);\n }\n\n const normalizedColumns = this.normalizeColumns(definition.columns);\n\n return {\n name: tableName,\n definition: {\n ...definition,\n name: tableName,\n columns: normalizedColumns,\n source: 'structured',\n },\n };\n }\n\n private normalizeColumns(columns: Record<string, SQLiteColumnDefinition>): Record<string, SQLiteColumnSchema> {\n const normalized: Record<string, SQLiteColumnSchema> = {};\n for (const [name, column] of Object.entries(columns)) {\n normalized[name] = {\n name,\n ...column,\n nullable: column?.nullable ?? true,\n };\n }\n return normalized;\n }\n}\n","import type { StorageWhereClause, StorageCollection } from '../types';\nimport type { SQLiteCondition } from './types';\nimport { SQLiteTable } from './SQLiteTable';\nimport { SQLiteCollection } from './SQLiteCollection';\n\nexport class SQLiteWhereClause<T = any> implements StorageWhereClause<T> {\n private readonly table: SQLiteTable<T>;\n private readonly index: string | string[];\n private readonly baseCollection?: SQLiteCollection<T>;\n\n constructor(table: SQLiteTable<T>, index: string | string[], baseCollection?: SQLiteCollection<T>) {\n this.table = table;\n this.index = index;\n this.baseCollection = baseCollection;\n }\n\n private getColumn(): string {\n // For compound indexes, we only support the first column in SQL conditions\n // Complex compound index queries fall back to JS\n if (Array.isArray(this.index)) {\n return this.index[0]!;\n }\n return this.index;\n }\n\n private isCompoundIndex(): boolean {\n return Array.isArray(this.index) && this.index.length > 1;\n }\n\n private getCompoundColumns(): string[] {\n return Array.isArray(this.index) ? this.index : [this.index];\n }\n\n private getCompoundValues(value: unknown): unknown[] {\n // For compound indexes, value should be an array of values matching each column\n if (Array.isArray(value)) {\n return value;\n }\n // Single value for single-column index\n return [value];\n }\n\n private createCollectionWithCondition(condition: SQLiteCondition): SQLiteCollection<T> {\n const base = this.baseCollection ?? this.table.createCollection();\n return base.addSqlCondition(condition);\n }\n\n private createCollectionWithJsPredicate(predicate: (record: T) => boolean): SQLiteCollection<T> {\n const base = this.baseCollection ?? this.table.createCollection();\n return base.jsFilter(predicate) as SQLiteCollection<T>;\n }\n\n private getIndexValue(record: T): unknown {\n return this.table.getIndexValue(record, this.index);\n }\n\n private flattenArgs<TValue>(args: any[]): TValue[] {\n if (args.length === 1 && Array.isArray(args[0])) {\n return args[0] as TValue[];\n }\n return args as TValue[];\n }\n\n equals(value: any): StorageCollection<T> {\n if (this.isCompoundIndex()) {\n // Use native SQL: WHERE col1 = ? AND col2 = ? AND ...\n const columns = this.getCompoundColumns();\n const values = this.getCompoundValues(value);\n return this.createCollectionWithCondition({\n type: 'compoundEquals',\n columns,\n values,\n });\n }\n return this.createCollectionWithCondition({\n type: 'equals',\n column: this.getColumn(),\n value,\n });\n }\n\n above(value: any): StorageCollection<T> {\n if (this.isCompoundIndex()) {\n return this.createCollectionWithJsPredicate((record) => this.table.compareValues(this.getIndexValue(record), value) > 0);\n }\n return this.createCollectionWithCondition({\n type: 'comparison',\n column: this.getColumn(),\n op: '>',\n value,\n });\n }\n\n aboveOrEqual(value: any): StorageCollection<T> {\n if (this.isCompoundIndex()) {\n return this.createCollectionWithJsPredicate((record) => this.table.compareValues(this.getIndexValue(record), value) >= 0);\n }\n return this.createCollectionWithCondition({\n type: 'comparison',\n column: this.getColumn(),\n op: '>=',\n value,\n });\n }\n\n below(value: any): StorageCollection<T> {\n if (this.isCompoundIndex()) {\n return this.createCollectionWithJsPredicate((record) => this.table.compareValues(this.getIndexValue(record), value) < 0);\n }\n return this.createCollectionWithCondition({\n type: 'comparison',\n column: this.getColumn(),\n op: '<',\n value,\n });\n }\n\n belowOrEqual(value: any): StorageCollection<T> {\n if (this.isCompoundIndex()) {\n return this.createCollectionWithJsPredicate((record) => this.table.compareValues(this.getIndexValue(record), value) <= 0);\n }\n return this.createCollectionWithCondition({\n type: 'comparison',\n column: this.getColumn(),\n op: '<=',\n value,\n });\n }\n\n between(lower: any, upper: any, includeLower = true, includeUpper = false): StorageCollection<T> {\n if (this.isCompoundIndex()) {\n return this.createCollectionWithJsPredicate((record) => {\n const value = this.getIndexValue(record);\n const lowerCmp = this.table.compareValues(value, lower);\n const upperCmp = this.table.compareValues(value, upper);\n const lowerPass = includeLower ? lowerCmp >= 0 : lowerCmp > 0;\n const upperPass = includeUpper ? upperCmp <= 0 : upperCmp < 0;\n return lowerPass && upperPass;\n });\n }\n return this.createCollectionWithCondition({\n type: 'between',\n column: this.getColumn(),\n lower,\n upper,\n includeLower,\n includeUpper,\n });\n }\n\n inAnyRange(ranges: Array<[any, any]>, options?: { includeLower?: boolean; includeUpper?: boolean }): StorageCollection<T> {\n // inAnyRange with multiple ranges uses OR logic - can be expressed in SQL\n if (this.isCompoundIndex() || ranges.length === 0) {\n return this.createCollectionWithJsPredicate((record) => {\n const value = this.getIndexValue(record);\n return ranges.some(([lower, upper]) => {\n const lowerCmp = this.table.compareValues(value, lower);\n const upperCmp = this.table.compareValues(value, upper);\n const lowerPass = options?.includeLower !== false ? lowerCmp >= 0 : lowerCmp > 0;\n const upperPass = options?.includeUpper ? upperCmp <= 0 : upperCmp < 0;\n return lowerPass && upperPass;\n });\n });\n }\n\n const column = this.getColumn();\n const orConditions: SQLiteCondition[] = ranges.map(([lower, upper]) => ({\n type: 'between' as const,\n column,\n lower,\n upper,\n includeLower: options?.includeLower !== false,\n includeUpper: options?.includeUpper ?? false,\n }));\n\n return this.createCollectionWithCondition({\n type: 'or',\n conditions: orConditions,\n });\n }\n\n startsWith(prefix: string): StorageCollection<T> {\n if (this.isCompoundIndex()) {\n return this.createCollectionWithJsPredicate((record) => String(this.getIndexValue(record) ?? '').startsWith(prefix));\n }\n // SQLite LIKE pattern: 'prefix%' matches strings starting with prefix\n // Escape special LIKE characters in the prefix\n const escapedPrefix = prefix.replace(/[%_\\\\]/g, '\\\\$&');\n return this.createCollectionWithCondition({\n type: 'like',\n column: this.getColumn(),\n pattern: `${escapedPrefix}%`,\n });\n }\n\n startsWithIgnoreCase(prefix: string): StorageCollection<T> {\n if (this.isCompoundIndex()) {\n return this.createCollectionWithJsPredicate((record) =>\n String(this.getIndexValue(record) ?? '')\n .toLowerCase()\n .startsWith(prefix.toLowerCase()),\n );\n }\n const escapedPrefix = prefix.replace(/[%_\\\\]/g, '\\\\$&');\n return this.createCollectionWithCondition({\n type: 'like',\n column: this.getColumn(),\n pattern: `${escapedPrefix}%`,\n caseInsensitive: true,\n });\n }\n\n startsWithAnyOf(...args: any[]): StorageCollection<T> {\n const prefixes = this.flattenArgs<string>(args);\n if (this.isCompoundIndex() || prefixes.length === 0) {\n return this.createCollectionWithJsPredicate((record) => {\n const value = String(this.getIndexValue(record) ?? '');\n return prefixes.some((prefix) => value.startsWith(prefix));\n });\n }\n\n const column = this.getColumn();\n const orConditions: SQLiteCondition[] = prefixes.map((prefix) => {\n const escapedPrefix = prefix.replace(/[%_\\\\]/g, '\\\\$&');\n return {\n type: 'like' as const,\n column,\n pattern: `${escapedPrefix}%`,\n };\n });\n\n return this.createCollectionWithCondition({\n type: 'or',\n conditions: orConditions,\n });\n }\n\n startsWithAnyOfIgnoreCase(...args: any[]): StorageCollection<T> {\n const prefixes = this.flattenArgs<string>(args);\n if (this.isCompoundIndex() || prefixes.length === 0) {\n const lowerPrefixes = prefixes.map((p) => p.toLowerCase());\n return this.createCollectionWithJsPredicate((record) => {\n const value = String(this.getIndexValue(record) ?? '').toLowerCase();\n return lowerPrefixes.some((prefix) => value.startsWith(prefix));\n });\n }\n\n const column = this.getColumn();\n const orConditions: SQLiteCondition[] = prefixes.map((prefix) => {\n const escapedPrefix = prefix.replace(/[%_\\\\]/g, '\\\\$&');\n return {\n type: 'like' as const,\n column,\n pattern: `${escapedPrefix}%`,\n caseInsensitive: true,\n };\n });\n\n return this.createCollectionWithCondition({\n type: 'or',\n conditions: orConditions,\n });\n }\n\n equalsIgnoreCase(value: string): StorageCollection<T> {\n if (this.isCompoundIndex()) {\n return this.createCollectionWithJsPredicate((record) => String(this.getIndexValue(record) ?? '').toLowerCase() === value.toLowerCase());\n }\n return this.createCollectionWithCondition({\n type: 'equals',\n column: this.getColumn(),\n value,\n caseInsensitive: true,\n });\n }\n\n anyOf(...args: any[]): StorageCollection<T> {\n const values = this.flattenArgs<any>(args);\n if (this.isCompoundIndex()) {\n // Use native SQL: (col1 = ? AND col2 = ?) OR (col1 = ? AND col2 = ?) OR ...\n const columns = this.getCompoundColumns();\n const orConditions: SQLiteCondition[] = values.map((value) => ({\n type: 'compoundEquals' as const,\n columns,\n values: this.getCompoundValues(value),\n }));\n return this.createCollectionWithCondition({\n type: 'or',\n conditions: orConditions,\n });\n }\n return this.createCollectionWithCondition({\n type: 'in',\n column: this.getColumn(),\n values,\n });\n }\n\n anyOfIgnoreCase(...args: any[]): StorageCollection<T> {\n const values = this.flattenArgs<string>(args);\n if (this.isCompoundIndex()) {\n const lowerValues = values.map((v) => v.toLowerCase());\n return this.createCollectionWithJsPredicate((record) => {\n const value = String(this.getIndexValue(record) ?? '').toLowerCase();\n return lowerValues.includes(value);\n });\n }\n return this.createCollectionWithCondition({\n type: 'in',\n column: this.getColumn(),\n values,\n caseInsensitive: true,\n });\n }\n\n noneOf(...args: any[]): StorageCollection<T> {\n const values = this.flattenArgs<any>(args);\n if (this.isCompoundIndex()) {\n return this.createCollectionWithJsPredicate((record) =>\n values.every((candidate) => this.table.compareValues(this.getIndexValue(record), candidate) !== 0),\n );\n }\n return this.createCollectionWithCondition({\n type: 'notIn',\n column: this.getColumn(),\n values,\n });\n }\n\n notEqual(value: any): StorageCollection<T> {\n if (this.isCompoundIndex()) {\n return this.createCollectionWithJsPredicate((record) => this.table.compareValues(this.getIndexValue(record), value) !== 0);\n }\n return this.createCollectionWithCondition({\n type: 'comparison',\n column: this.getColumn(),\n op: '!=',\n value,\n });\n }\n}\n","import type { StorageTable, StorageWhereClause, StorageCollection } from '../types';\nimport { LOCAL_PK } from '../../types';\nimport type { SQLiteTableSchemaMetadata, SQLiteIterateEntriesOptions, SQLiteOrderByOptions, SQLiteCollectionState, TableEntry } from './types';\nimport { SQLiteAdapter } from './SQLiteAdapter';\nimport { SQLiteCollection } from './SQLiteCollection';\nimport { SQLiteWhereClause } from './SQLiteWhereClause';\nimport { cloneValue, createDefaultState, normalizeComparableValue, quoteIdentifier, DEFAULT_STREAM_BATCH_SIZE } from './helpers';\n\nexport class SQLiteTable<T = any> implements StorageTable<T> {\n readonly name: string;\n readonly schema: SQLiteTableSchemaMetadata;\n readonly hook: unknown = Object.freeze({});\n readonly raw: {\n add: (item: T) => Promise<unknown>;\n put: (item: T) => Promise<unknown>;\n update: (key: unknown, changes: Partial<T>) => Promise<number>;\n delete: (key: unknown) => Promise<void>;\n get: (key: unknown) => Promise<T | undefined>;\n bulkAdd: (items: T[]) => Promise<unknown>;\n bulkPut: (items: T[]) => Promise<unknown>;\n bulkUpdate: (keysAndChanges: Array<{ key: unknown; changes: Partial<T> }>) => Promise<number>;\n bulkDelete: (keys: Array<unknown>) => Promise<void>;\n clear: () => Promise<void>;\n };\n\n private readonly adapter: SQLiteAdapter;\n private readonly columnNames: string[];\n private readonly booleanColumns: Set<string>;\n\n constructor(adapter: SQLiteAdapter, schema: SQLiteTableSchemaMetadata) {\n this.adapter = adapter;\n this.schema = schema;\n this.name = schema.name;\n this.columnNames = Object.keys(schema.definition.columns ?? {});\n // Track which columns are declared as BOOLEAN for read/write conversion\n this.booleanColumns = new Set(\n Object.entries(schema.definition.columns ?? {})\n .filter(([_, col]) => col.type?.toUpperCase() === 'BOOLEAN')\n .map(([name]) => name),\n );\n // Capture bound methods BEFORE any wrapping can occur\n // These provide access to the underlying storage operations\n this.raw = Object.freeze({\n add: this.baseAdd.bind(this),\n put: this.basePut.bind(this),\n update: this.baseUpdate.bind(this),\n delete: this.baseDelete.bind(this),\n get: this.get.bind(this),\n bulkAdd: this.baseBulkAdd.bind(this),\n bulkPut: this.baseBulkPut.bind(this),\n bulkUpdate: this.baseBulkUpdate.bind(this),\n bulkDelete: this.baseBulkDelete.bind(this),\n clear: this.baseClear.bind(this),\n });\n }\n\n async add(item: T): Promise<unknown> {\n return this.baseAdd(item);\n }\n\n async put(item: T): Promise<unknown> {\n return this.basePut(item);\n }\n\n async update(key: unknown, changes: Partial<T>): Promise<number> {\n return this.baseUpdate(key, changes);\n }\n\n async delete(key: unknown): Promise<void> {\n await this.baseDelete(key);\n }\n\n async clear(): Promise<void> {\n await this.baseClear();\n }\n\n private async baseClear(): Promise<void> {\n await this.adapter.execute(`DELETE FROM ${quoteIdentifier(this.name)}`);\n }\n\n async get(key: unknown): Promise<T | undefined> {\n if (!key || typeof key !== 'string') {\n return undefined;\n }\n const row = await this.fetchRow(key);\n return row ? this.cloneRecord(row) : undefined;\n }\n\n async toArray(): Promise<T[]> {\n const entries = await this.getEntries();\n return entries.map((entry) => this.cloneRecord(entry.value));\n }\n\n async count(): Promise<number> {\n const rows = await this.adapter.queryRows(`SELECT COUNT(*) as count FROM ${quoteIdentifier(this.name)}`);\n return Number(rows[0]?.count ?? 0);\n }\n\n async bulkAdd(items: T[]): Promise<unknown> {\n return this.baseBulkAdd(items);\n }\n\n private async baseBulkAdd(items: T[]): Promise<unknown> {\n if (!items.length) return undefined;\n\n const columns = this.columnNames;\n const columnCount = columns.length;\n // SQLite has a parameter limit (typically 999 or 32766). Use conservative batch size.\n const maxParamsPerBatch = 500;\n const batchSize = Math.max(1, Math.floor(maxParamsPerBatch / columnCount));\n\n let lastKey: unknown = undefined;\n\n for (let i = 0; i < items.length; i += batchSize) {\n const batch = items.slice(i, i + batchSize);\n const records = batch.map((item) => this.prepareRecordForWrite(item));\n\n const placeholderRow = `(${columns.map(() => '?').join(', ')})`;\n const placeholders = records.map(() => placeholderRow).join(', ');\n const values: unknown[] = [];\n\n for (const record of records) {\n values.push(...this.extractColumnValues(record));\n }\n\n await this.adapter.run(\n `INSERT INTO ${quoteIdentifier(this.name)} (${columns.map((c) => quoteIdentifier(c)).join(', ')}) VALUES ${placeholders}`,\n values,\n );\n\n lastKey = (records[records.length - 1] as any)[LOCAL_PK];\n }\n\n return lastKey;\n }\n\n async bulkPut(items: T[]): Promise<unknown> {\n return this.baseBulkPut(items);\n }\n\n private async baseBulkPut(items: T[]): Promise<unknown> {\n if (!items.length) return undefined;\n\n const columns = this.columnNames;\n const columnCount = columns.length;\n const maxParamsPerBatch = 500;\n const batchSize = Math.max(1, Math.floor(maxParamsPerBatch / columnCount));\n\n let lastKey: unknown = undefined;\n\n for (let i = 0; i < items.length; i += batchSize) {\n const batch = items.slice(i, i + batchSize);\n const records = batch.map((item) => this.prepareRecordForWrite(item));\n\n const placeholderRow = `(${columns.map(() => '?').join(', ')})`;\n const placeholders = records.map(() => placeholderRow).join(', ');\n const values: unknown[] = [];\n\n for (const record of records) {\n values.push(...this.extractColumnValues(record));\n }\n\n await this.adapter.run(\n `INSERT OR REPLACE INTO ${quoteIdentifier(this.name)} (${columns.map((c) => quoteIdentifier(c)).join(', ')}) VALUES ${placeholders}`,\n values,\n );\n\n lastKey = (records[records.length - 1] as any)[LOCAL_PK];\n }\n\n return lastKey;\n }\n\n async bulkGet(keys: Array<unknown>): Promise<Array<T | undefined>> {\n if (!keys.length) return [];\n\n // Use IN clause for bulk lookup\n const validKeys = keys.filter((k) => k && typeof k === 'string');\n if (!validKeys.length) return keys.map(() => undefined);\n\n const selectClause = this.buildSelectClause();\n const placeholders = validKeys.map(() => '?').join(', ');\n\n const rows = await this.adapter.queryRows(\n `SELECT ${selectClause} FROM ${quoteIdentifier(this.name)} WHERE ${quoteIdentifier(LOCAL_PK)} IN (${placeholders})`,\n validKeys,\n );\n\n // Build a map of key -> record for quick lookup\n const recordMap = new Map<string, T>();\n for (const row of rows) {\n const record = this.hydrateRow(row);\n recordMap.set(String(row[LOCAL_PK]), this.cloneRecord(record));\n }\n\n // Return results in the same order as input keys\n return keys.map((key) => (key && typeof key === 'string' ? recordMap.get(key) : undefined));\n }\n\n async bulkUpdate(keysAndChanges: Array<{ key: unknown; changes: Partial<T> }>): Promise<number> {\n return this.baseBulkUpdate(keysAndChanges);\n }\n\n private async baseBulkUpdate(keysAndChanges: Array<{ key: unknown; changes: Partial<T> }>): Promise<number> {\n if (!keysAndChanges.length) return 0;\n\n let updatedCount = 0;\n for (const { key, changes } of keysAndChanges) {\n const result = await this.baseUpdate(key, changes);\n updatedCount += result;\n }\n return updatedCount;\n }\n\n async bulkDelete(keys: Array<unknown>): Promise<void> {\n await this.baseBulkDelete(keys);\n }\n\n private async baseBulkDelete(keys: Array<unknown>): Promise<void> {\n if (!keys.length) return;\n\n const validKeys = keys.filter((k) => k && typeof k === 'string');\n if (!validKeys.length) return;\n\n const placeholders = validKeys.map(() => '?').join(', ');\n await this.adapter.run(`DELETE FROM ${quoteIdentifier(this.name)} WHERE ${quoteIdentifier(LOCAL_PK)} IN (${placeholders})`, validKeys);\n }\n\n where(index: string | string[]): StorageWhereClause<T> {\n return this.createWhereClause(index);\n }\n\n orderBy(index: string | string[]): StorageCollection<T> {\n return this.createCollection({\n orderBy: { index, direction: 'asc' },\n });\n }\n\n reverse(): StorageCollection<T> {\n return this.createCollection({ reverse: true });\n }\n\n offset(offset: number): StorageCollection<T> {\n return this.createCollection({ offset });\n }\n\n limit(count: number): StorageCollection<T> {\n return this.createCollection({ limit: count });\n }\n\n mapToClass(_ctor: new (...args: any[]) => any): StorageTable<T> {\n return this;\n }\n\n async each(callback: (item: T) => void | Promise<void>): Promise<void> {\n const entries = await this.getEntries();\n for (const entry of entries) {\n await callback(this.cloneRecord(entry.value));\n }\n }\n\n jsFilter(predicate: (item: T) => boolean): StorageCollection<T> {\n return this.createCollection({ jsPredicate: (record) => predicate(record) });\n }\n\n createCollection(stateOverrides?: Partial<SQLiteCollectionState<T>>): SQLiteCollection<T> {\n return new SQLiteCollection(this, stateOverrides);\n }\n\n createCollectionFromPredicate(predicate: (record: T, key: string, index: number) => boolean, template?: SQLiteCollection<T>): SQLiteCollection<T> {\n const baseState = template ? template.getState() : createDefaultState<T>();\n const existingPredicate = baseState.jsPredicate;\n const combinedPredicate = existingPredicate\n ? (record: T, key: string, index: number) => existingPredicate(record, key, index) && predicate(record, key, index)\n : predicate;\n return new SQLiteCollection(this, {\n ...baseState,\n jsPredicate: combinedPredicate,\n });\n }\n\n createWhereClause(index: string | string[], baseCollection?: SQLiteCollection<T>): SQLiteWhereClause<T> {\n return new SQLiteWhereClause(this, index, baseCollection);\n }\n\n async *iterateEntries(options?: SQLiteIterateEntriesOptions): AsyncGenerator<TableEntry<T>> {\n const selectClause = this.buildSelectClause();\n const chunkSize = options?.chunkSize ?? DEFAULT_STREAM_BATCH_SIZE;\n const orderClause = this.buildOrderByClause(options?.orderBy);\n let offset = 0;\n\n while (true) {\n const statementParts = [`SELECT ${selectClause} FROM ${quoteIdentifier(this.name)}`];\n if (orderClause) {\n statementParts.push(orderClause);\n }\n statementParts.push(`LIMIT ${chunkSize} OFFSET ${offset}`);\n const rows = await this.adapter.queryRows(statementParts.join(' '));\n if (!rows.length) {\n break;\n }\n for (const row of rows) {\n yield { key: String(row[LOCAL_PK]), value: this.hydrateRow(row) };\n }\n if (rows.length < chunkSize) {\n break;\n }\n offset += rows.length;\n }\n }\n\n /**\n * Execute a query with pre-built WHERE clause and parameters.\n * This is used by SQLiteCollection for native SQL performance.\n */\n async queryWithConditions(options: {\n whereClause: string;\n parameters: unknown[];\n orderBy?: { index: string | string[]; direction: 'asc' | 'desc' };\n limit?: number;\n offset?: number;\n distinct?: boolean;\n }): Promise<T[]> {\n const selectClause = this.buildSelectClause();\n const distinctKeyword = options.distinct ? 'DISTINCT ' : '';\n const parts = [`SELECT ${distinctKeyword}${selectClause} FROM ${quoteIdentifier(this.name)}`];\n\n if (options.whereClause) {\n parts.push(options.whereClause);\n }\n\n if (options.orderBy) {\n parts.push(this.buildOrderByClause(options.orderBy));\n }\n\n if (options.limit !== undefined) {\n parts.push(`LIMIT ${options.limit}`);\n }\n\n if (options.offset !== undefined && options.offset > 0) {\n parts.push(`OFFSET ${options.offset}`);\n }\n\n const rows = await this.adapter.queryRows(parts.join(' '), options.parameters);\n return rows.map((row) => this.hydrateRow(row));\n }\n\n /**\n * Execute a COUNT query with pre-built WHERE clause.\n */\n async countWithConditions(options: { whereClause: string; parameters: unknown[]; distinct?: boolean }): Promise<number> {\n const distinctKeyword = options.distinct ? 'DISTINCT ' : '';\n const selectClause = this.buildSelectClause();\n // For DISTINCT, we need to count distinct rows, not just COUNT(*)\n const countExpr = options.distinct ? `COUNT(${distinctKeyword}${selectClause})` : 'COUNT(*)';\n const parts = [`SELECT ${countExpr} as count FROM ${quoteIdentifier(this.name)}`];\n\n if (options.whereClause) {\n parts.push(options.whereClause);\n }\n\n const rows = await this.adapter.queryRows(parts.join(' '), options.parameters);\n return Number(rows[0]?.count ?? 0);\n }\n\n /**\n * Execute a DELETE query with pre-built WHERE clause.\n * Returns the number of deleted rows.\n */\n async deleteWithConditions(options: { whereClause: string; parameters: unknown[] }): Promise<number> {\n const parts = [`DELETE FROM ${quoteIdentifier(this.name)}`];\n\n if (options.whereClause) {\n parts.push(options.whereClause);\n }\n\n const result = await this.adapter.run(parts.join(' '), options.parameters);\n return result.changes ?? 0;\n }\n\n /**\n * Execute an UPDATE query with pre-built WHERE clause.\n * Returns the number of updated rows.\n */\n async updateWithConditions(options: { whereClause: string; parameters: unknown[]; changes: Partial<T> }): Promise<number> {\n const changeEntries = Object.entries(options.changes);\n if (changeEntries.length === 0) {\n return 0;\n }\n\n const setClauses = changeEntries.map(([column]) => `${quoteIdentifier(column)} = ?`);\n const setValues = changeEntries.map(([, value]) => this.normalizeColumnValue(value));\n\n const parts = [`UPDATE ${quoteIdentifier(this.name)} SET ${setClauses.join(', ')}`];\n\n if (options.whereClause) {\n parts.push(options.whereClause);\n }\n\n const result = await this.adapter.run(parts.join(' '), [...setValues, ...options.parameters]);\n return result.changes ?? 0;\n }\n\n /**\n * Query only primary keys with pre-built WHERE clause.\n * This is more efficient than fetching full rows when only keys are needed.\n */\n async queryKeysWithConditions(options: {\n whereClause: string;\n parameters: unknown[];\n orderBy?: { index: string | string[]; direction: 'asc' | 'desc' };\n limit?: number;\n offset?: number;\n distinct?: boolean;\n }): Promise<string[]> {\n const distinctKeyword = options.distinct ? 'DISTINCT ' : '';\n const parts = [`SELECT ${distinctKeyword}${quoteIdentifier(LOCAL_PK)} FROM ${quoteIdentifier(this.name)}`];\n\n if (options.whereClause) {\n parts.push(options.whereClause);\n }\n\n if (options.orderBy) {\n parts.push(this.buildOrderByClause(options.orderBy));\n }\n\n if (options.limit !== undefined) {\n parts.push(`LIMIT ${options.limit}`);\n }\n\n if (options.offset !== undefined && options.offset > 0) {\n parts.push(`OFFSET ${options.offset}`);\n }\n\n const rows = await this.adapter.queryRows(parts.join(' '), options.parameters);\n return rows.map((row) => String(row[LOCAL_PK]));\n }\n\n async getEntries(): Promise<TableEntry<T>[]> {\n const entries: TableEntry<T>[] = [];\n for await (const entry of this.iterateEntries()) {\n entries.push(entry);\n }\n return entries;\n }\n\n cloneRecord(record: T): T {\n return cloneValue(record);\n }\n\n compareValues(left: unknown, right: unknown): number {\n const normalizedLeft = normalizeComparableValue(left) as any;\n const normalizedRight = normalizeComparableValue(right) as any;\n if (normalizedLeft < normalizedRight) return -1;\n if (normalizedLeft > normalizedRight) return 1;\n return 0;\n }\n\n compareByIndex(left: T, right: T, index: string | string[]): number {\n if (Array.isArray(index)) {\n for (const key of index) {\n const diff = this.compareValues((left as any)[key], (right as any)[key]);\n if (diff !== 0) {\n return diff;\n }\n }\n return 0;\n }\n return this.compareValues((left as any)[index], (right as any)[index]);\n }\n\n getIndexValue(record: T, index: string | string[]): unknown {\n if (Array.isArray(index)) {\n return index.map((key) => (record as any)[key]);\n }\n return (record as any)[index];\n }\n\n async replaceRecord(record: T): Promise<void> {\n if (!this.columnNames.length) {\n return;\n }\n const assignments = this.columnNames.map((column) => `${quoteIdentifier(column)} = ?`).join(', ');\n const values = this.extractColumnValues(record);\n await this.adapter.run(`UPDATE ${quoteIdentifier(this.name)} SET ${assignments} WHERE ${quoteIdentifier(LOCAL_PK)} = ?`, [\n ...values,\n (record as any)[LOCAL_PK],\n ]);\n }\n\n async deleteByPrimaryKey(primaryKey: string): Promise<void> {\n await this.adapter.run(`DELETE FROM ${quoteIdentifier(this.name)} WHERE ${quoteIdentifier(LOCAL_PK)} = ?`, [primaryKey]);\n }\n\n private async baseAdd(item: T): Promise<string> {\n const record = this.prepareRecordForWrite(item);\n const columns = this.columnNames;\n const placeholders = columns.map(() => '?').join(', ');\n const values = this.extractColumnValues(record);\n await this.adapter.run(\n `INSERT INTO ${quoteIdentifier(this.name)} (${columns.map((column) => quoteIdentifier(column)).join(', ')}) VALUES (${placeholders})`,\n values,\n );\n return (record as any)[LOCAL_PK];\n }\n\n private async basePut(item: T): Promise<string> {\n const record = this.prepareRecordForWrite(item);\n const columns = this.columnNames;\n const placeholders = columns.map(() => '?').join(', ');\n const values = this.extractColumnValues(record);\n await this.adapter.run(\n `INSERT OR REPLACE INTO ${quoteIdentifier(this.name)} (${columns.map((column) => quoteIdentifier(column)).join(', ')}) VALUES (${placeholders})`,\n values,\n );\n return (record as any)[LOCAL_PK];\n }\n\n private async baseUpdate(key: unknown, changes: Partial<T>): Promise<number> {\n if (!key || typeof key !== 'string') {\n return 0;\n }\n const existing = await this.fetchRow(key);\n if (!existing) {\n return 0;\n }\n const updated = { ...existing, ...changes } as T;\n await this.replaceRecord(updated);\n return 1;\n }\n\n private async baseDelete(key: unknown): Promise<void> {\n if (!key || typeof key !== 'string') {\n return;\n }\n await this.deleteByPrimaryKey(key);\n }\n\n private prepareRecordForWrite(item: T): T {\n const clone = this.cloneRecord(item);\n const primaryValue = (clone as any)[LOCAL_PK];\n\n if (!primaryValue || typeof primaryValue !== 'string') {\n throw new Error(`Missing required primary key field \"${LOCAL_PK}\" - a string value must be provided`);\n }\n\n return clone;\n }\n\n private async fetchRow(primaryKey: string): Promise<T | undefined> {\n const selectClause = this.buildSelectClause();\n const rows = await this.adapter.queryRows(`SELECT ${selectClause} FROM ${quoteIdentifier(this.name)} WHERE ${quoteIdentifier(LOCAL_PK)} = ? LIMIT 1`, [\n primaryKey,\n ]);\n if (!rows.length) {\n return undefined;\n }\n return this.hydrateRow(rows[0]!);\n }\n\n private buildSelectClause(): string {\n const dataColumns = this.columnNames.map((column) => quoteIdentifier(column));\n return dataColumns.join(', ');\n }\n\n private hydrateRow(row: Record<string, any>): T {\n const record: Record<string, any> = {};\n for (const column of this.columnNames) {\n let value = row[column];\n // Convert INTEGER back to boolean for BOOLEAN columns\n if (this.booleanColumns.has(column) && value !== null && value !== undefined) {\n value = value === 1 || value === true;\n }\n record[column] = value;\n }\n return record as T;\n }\n\n private buildOrderByClause(orderBy?: SQLiteOrderByOptions): string {\n const target = orderBy ?? { index: LOCAL_PK, direction: 'asc' as const };\n const columns = Array.isArray(target.index) ? target.index : [target.index];\n const direction = target.direction.toUpperCase();\n const clause = columns.map((column) => `${quoteIdentifier(column)} ${direction}`).join(', ');\n return `ORDER BY ${clause}`;\n }\n\n private extractColumnValues(record: T): any[] {\n return this.columnNames.map((column) => this.normalizeColumnValue((record as any)[column]));\n }\n\n private normalizeColumnValue(value: unknown): unknown {\n if (value === undefined) {\n return null;\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n // Convert boolean to INTEGER for SQLite storage\n if (typeof value === 'boolean') {\n return value ? 1 : 0;\n }\n return value;\n }\n}\n","import type { StorageCollection, StorageWhereClause } from '../types';\nimport { LOCAL_PK } from '../../types';\nimport type { SQLiteCollectionState, SQLiteCondition, TableEntry } from './types';\nimport { createDefaultState, cloneValue, buildWhereClause } from './helpers';\nimport { SQLiteTable } from './SQLiteTable';\n\nexport class SQLiteCollection<T = any> implements StorageCollection<T> {\n private readonly table: SQLiteTable<T>;\n private readonly state: SQLiteCollectionState<T>;\n\n constructor(table: SQLiteTable<T>, state?: Partial<SQLiteCollectionState<T>>) {\n this.table = table;\n const base = createDefaultState<T>();\n this.state = {\n ...base,\n ...state,\n sqlConditions: state?.sqlConditions ?? base.sqlConditions,\n jsPredicate: state?.jsPredicate,\n };\n }\n\n getState(): SQLiteCollectionState<T> {\n return { ...this.state, sqlConditions: [...this.state.sqlConditions] };\n }\n\n // Add a SQL-expressible condition to this collection\n addSqlCondition(condition: SQLiteCondition): SQLiteCollection<T> {\n return new SQLiteCollection(this.table, {\n ...this.state,\n sqlConditions: [...this.state.sqlConditions, condition],\n });\n }\n\n private replicate(overrides?: Partial<SQLiteCollectionState<T>>): SQLiteCollection<T> {\n return new SQLiteCollection(this.table, {\n ...this.state,\n ...overrides,\n sqlConditions: overrides?.sqlConditions ?? this.state.sqlConditions,\n jsPredicate: overrides?.jsPredicate !== undefined ? overrides.jsPredicate : this.state.jsPredicate,\n });\n }\n\n private withJsPredicate(predicate: (record: T, key: string, index: number) => boolean): SQLiteCollection<T> {\n const existingPredicate = this.state.jsPredicate;\n const combined = existingPredicate\n ? (record: T, key: string, index: number) => existingPredicate(record, key, index) && predicate(record, key, index)\n : predicate;\n return new SQLiteCollection(this.table, {\n ...this.state,\n jsPredicate: combined,\n });\n }\n\n private hasJsPredicate(): boolean {\n return this.state.jsPredicate !== undefined;\n }\n\n private resolveOrdering(): { index: string | string[]; direction: 'asc' | 'desc' } {\n const base = this.state.orderBy ?? { index: LOCAL_PK, direction: 'asc' as const };\n const direction = this.state.reverse ? (base.direction === 'asc' ? 'desc' : 'asc') : base.direction;\n return { index: base.index, direction };\n }\n\n /**\n * Execute a native SQL query with all SQL conditions.\n * If there's a JS predicate, we fetch rows without LIMIT/OFFSET in SQL\n * and apply them after JS filtering.\n */\n private async executeQuery(\n options: {\n clone?: boolean;\n limitOverride?: number;\n orderByOverride?: { index: string | string[]; direction: 'asc' | 'desc' };\n } = {},\n ): Promise<TableEntry<T>[]> {\n const { whereClause, parameters } = buildWhereClause(this.state.sqlConditions);\n const ordering = options.orderByOverride ?? this.resolveOrdering();\n const cloneValues = options.clone !== false;\n const hasJsFilter = this.hasJsPredicate();\n const distinct = this.state.distinct;\n\n // If we have a JS predicate, we can't apply LIMIT/OFFSET in SQL\n // because we don't know which rows will pass the JS filter\n const sqlLimit = hasJsFilter ? undefined : (options.limitOverride ?? this.state.limit);\n const sqlOffset = hasJsFilter ? undefined : this.state.offset;\n\n const rows = await this.table.queryWithConditions({\n whereClause,\n parameters,\n orderBy: ordering,\n limit: sqlLimit,\n offset: sqlOffset,\n distinct,\n });\n\n let results: TableEntry<T>[] = rows.map((row) => ({\n key: String((row as any)[LOCAL_PK]),\n value: row,\n }));\n\n // Apply JS predicate if present\n if (hasJsFilter) {\n const predicate = this.state.jsPredicate!;\n results = results.filter((entry, index) => predicate(entry.value, entry.key, index));\n\n // Apply offset/limit in JS since we couldn't apply them in SQL\n const offset = Math.max(0, this.state.offset ?? 0);\n const limit = options.limitOverride ?? this.state.limit;\n if (offset > 0 || limit !== undefined) {\n const end = limit !== undefined ? offset + limit : undefined;\n results = results.slice(offset, end);\n }\n }\n\n // Clone values if needed\n if (cloneValues) {\n results = results.map((entry) => ({\n key: entry.key,\n value: this.table.cloneRecord(entry.value),\n }));\n }\n\n return results;\n }\n\n async first(): Promise<T | undefined> {\n const entries = await this.executeQuery({ limitOverride: 1 });\n return entries[0]?.value;\n }\n\n async last(): Promise<T | undefined> {\n return this.replicate({ reverse: !this.state.reverse }).first();\n }\n\n async each(callback: (item: T, index: number) => void | Promise<void>): Promise<void> {\n const entries = await this.executeQuery();\n for (const [index, entry] of entries.entries()) {\n await callback(entry.value, index);\n }\n }\n\n async eachKey(callback: (key: unknown, index: number) => void | Promise<void>): Promise<void> {\n const entries = await this.executeQuery({ clone: false });\n for (const [index, entry] of entries.entries()) {\n await callback(entry.key, index);\n }\n }\n\n async eachPrimaryKey(callback: (key: unknown, index: number) => void | Promise<void>): Promise<void> {\n return this.eachKey(callback);\n }\n\n async eachUniqueKey(callback: (key: unknown, index: number) => void | Promise<void>): Promise<void> {\n const keys = await this.uniqueKeys();\n for (let index = 0; index < keys.length; index += 1) {\n await callback(keys[index], index);\n }\n }\n\n async keys(): Promise<unknown[]> {\n // Optimization: use native SQL when no JS filtering needed\n if (!this.hasJsPredicate()) {\n const { whereClause, parameters } = buildWhereClause(this.state.sqlConditions);\n const ordering = this.resolveOrdering();\n return this.table.queryKeysWithConditions({\n whereClause,\n parameters,\n orderBy: ordering,\n limit: this.state.limit,\n offset: this.state.offset,\n distinct: this.state.distinct,\n });\n }\n // Fallback for JS filtering\n const entries = await this.executeQuery({ clone: false });\n return entries.map((entry) => entry.key);\n }\n\n async primaryKeys(): Promise<unknown[]> {\n return this.keys();\n }\n\n async uniqueKeys(): Promise<unknown[]> {\n // Optimization: use native SQL DISTINCT when no JS filtering needed\n if (!this.hasJsPredicate()) {\n const { whereClause, parameters } = buildWhereClause(this.state.sqlConditions);\n const ordering = this.resolveOrdering();\n return this.table.queryKeysWithConditions({\n whereClause,\n parameters,\n orderBy: ordering,\n limit: this.state.limit,\n offset: this.state.offset,\n distinct: true,\n });\n }\n // Fallback for JS filtering\n const keys = await this.keys();\n return [...new Set(keys)];\n }\n\n async count(): Promise<number> {\n // Optimization: use SQL COUNT when no JS filtering needed\n if (!this.hasJsPredicate()) {\n return this.table.countWithConditions({\n whereClause: buildWhereClause(this.state.sqlConditions).whereClause,\n parameters: buildWhereClause(this.state.sqlConditions).parameters,\n distinct: this.state.distinct,\n });\n }\n // Fallback for JS filtering\n const entries = await this.executeQuery({ clone: false });\n return entries.length;\n }\n\n async sortBy(key: string): Promise<T[]> {\n // Use native SQL ORDER BY instead of JS sorting\n const entries = await this.executeQuery({\n orderByOverride: { index: key, direction: 'asc' },\n });\n return entries.map((entry) => entry.value);\n }\n\n distinct(): StorageCollection<T> {\n return this.replicate({ distinct: true });\n }\n\n jsFilter(predicate: (item: T) => boolean): StorageCollection<T> {\n return this.withJsPredicate((record: T) => predicate(cloneValue(record)));\n }\n\n or(index: string): StorageWhereClause<T> {\n return this.table.createWhereClause(index, this);\n }\n\n clone(_props?: Record<string, unknown>): StorageCollection<T> {\n return this.replicate();\n }\n\n reverse(): StorageCollection<T> {\n return this.replicate({ reverse: !this.state.reverse });\n }\n\n offset(offset: number): StorageCollection<T> {\n return this.replicate({ offset });\n }\n\n limit(count: number): StorageCollection<T> {\n return this.replicate({ limit: count });\n }\n\n toCollection(): StorageCollection<T> {\n return this.replicate();\n }\n\n async delete(): Promise<number> {\n // Optimization: use native SQL DELETE when no JS filtering needed\n if (!this.hasJsPredicate()) {\n const { whereClause, parameters } = buildWhereClause(this.state.sqlConditions);\n return this.table.deleteWithConditions({ whereClause, parameters });\n }\n // Fallback for JS filtering - must iterate and delete one by one\n const entries = await this.executeQuery({ clone: false });\n for (const entry of entries) {\n await this.table.deleteByPrimaryKey(entry.key);\n }\n return entries.length;\n }\n\n async modify(changes: Partial<T> | ((item: T) => void | Promise<void>)): Promise<number> {\n // Optimization: use native SQL UPDATE when changes is an object and no JS filtering\n if (typeof changes !== 'function' && !this.hasJsPredicate()) {\n const { whereClause, parameters } = buildWhereClause(this.state.sqlConditions);\n return this.table.updateWithConditions({ whereClause, parameters, changes });\n }\n // Fallback for function-based changes or JS filtering\n const entries = await this.executeQuery();\n for (const entry of entries) {\n const draft = cloneValue(entry.value);\n if (typeof changes === 'function') {\n await changes(draft);\n } else {\n Object.assign(draft as object, changes);\n }\n await this.table.replaceRecord(draft);\n }\n return entries.length;\n }\n\n async toArray(): Promise<T[]> {\n const entries = await this.executeQuery();\n return entries.map((entry) => entry.value);\n }\n}\n"],"mappings":"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","names":["SyncAction","createDefaultState","col","SQLiteAdapter","driver","SQLiteCollection","createDefaultState","SQLiteCollection","createDefaultState"]}