@happyvertical/sql 0.103.3 → 0.103.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- package/dist/chunks/{duckdb-CLYpx7zH.js → duckdb--JT-CiX3.js} +4 -4
- package/dist/chunks/{duckdb-CLYpx7zH.js.map → duckdb--JT-CiX3.js.map} +1 -1
- package/dist/chunks/{postgres-dialect-CGv6DxSP.js → postgres-dialect-DIy5f5YR.js} +2 -2
- package/dist/chunks/{postgres-dialect-CGv6DxSP.js.map → postgres-dialect-DIy5f5YR.js.map} +1 -1
- package/dist/chunks/{query-RzXJ4B9s.js → query-DubG7aF0.js} +2 -2
- package/dist/chunks/{query-RzXJ4B9s.js.map → query-DubG7aF0.js.map} +1 -1
- package/dist/chunks/{schema-manager-cxsySSDA.js → schema-manager-tfASrb_b.js} +3 -2
- package/dist/chunks/{schema-manager-cxsySSDA.js.map → schema-manager-tfASrb_b.js.map} +1 -1
- package/dist/chunks/{sqlite-rILMdW7Z.js → sqlite-DuMGkufB.js} +45 -7
- package/dist/chunks/sqlite-DuMGkufB.js.map +1 -0
- package/dist/chunks/{sqlite-connection-cache-CYThh9l5.js → sqlite-connection-cache-C_7rVisQ.js} +3 -3
- package/dist/chunks/{sqlite-connection-cache-CYThh9l5.js.map → sqlite-connection-cache-C_7rVisQ.js.map} +1 -1
- package/dist/chunks/{sqlite-native-CsJ_BLqN.js → sqlite-native-79oQLrDp.js} +5 -5
- package/dist/chunks/{sqlite-native-CsJ_BLqN.js.map → sqlite-native-79oQLrDp.js.map} +1 -1
- package/dist/index.js +5 -5
- package/dist/pglite.js +2 -2
- package/dist/query.js +2 -2
- package/dist/shared/sqlite-connection-cache.d.ts.map +1 -1
- package/dist/shared/utils.d.ts.map +1 -1
- package/dist/sqlite.d.ts.map +1 -1
- package/package.json +2 -2
- package/dist/chunks/sqlite-rILMdW7Z.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite-DuMGkufB.js","names":["#observation"],"sources":["../../src/secure-sqlite-client.ts","../../src/sqlite.ts"],"sourcesContent":["import { execFile } from 'node:child_process';\nimport type { BigIntStats } from 'node:fs';\nimport { lstat, open, unlink } from 'node:fs/promises';\nimport { dirname, parse, relative, resolve, sep } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport { DatabaseError } from '@happyvertical/utils';\n\nexport interface SecureSqliteStatement {\n sql: string;\n args?: unknown[];\n}\n\nexport interface SecureSqliteResult {\n rows: Record<string, unknown>[];\n rowsAffected: number;\n lastInsertRowid?: bigint;\n}\n\nexport interface SecureSqliteTransactionClient {\n readonly closed: boolean;\n execute(\n statement: string | SecureSqliteStatement,\n ): Promise<SecureSqliteResult>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n close(): void;\n}\n\nexport interface SecureSqliteClient {\n readonly transactionReservation: 'exclusive';\n execute(\n statement: string | SecureSqliteStatement,\n ): Promise<SecureSqliteResult>;\n transaction(mode?: string): Promise<SecureSqliteTransactionClient>;\n close(): Promise<void>;\n}\n\nexport interface SecureSqliteCustodyOptions {\n custody: 'trusted-parent';\n root?: string;\n}\n\ninterface NodeSqliteStatement {\n all(...args: unknown[]): Record<string, unknown>[];\n columns(): Array<{ name: string }>;\n run(...args: unknown[]): {\n changes: number | bigint;\n lastInsertRowid: number | bigint;\n };\n setReadBigInts(enabled: boolean): void;\n}\n\ninterface NodeSqliteDatabase {\n readonly isTransaction: boolean;\n prepare(sql: string): NodeSqliteStatement;\n close(): void;\n}\n\ninterface NodeSqliteModule {\n // biome-ignore lint/style/useNamingConvention: mirrors node:sqlite's public API\n DatabaseSync: new (\n filename: string,\n options?: {\n enableForeignKeyConstraints?: boolean;\n enableDoubleQuotedStringLiterals?: boolean;\n },\n ) => NodeSqliteDatabase;\n}\n\n/** @internal Deterministic acquisition seam used by the integration tests. */\nexport interface SecureSqliteRuntime {\n platform: NodeJS.Platform;\n nodeVersion?: string;\n currentUid?: () => number;\n pathOwnerUid?: (filePath: string, actualUid: number) => number;\n inspectDarwinAcl?: (filePath: string) => Promise<boolean>;\n openLeaf?: typeof open;\n lstatLeaf?: typeof lstat;\n loadDriver: () => Promise<NodeSqliteModule>;\n}\n\n/**\n * @internal Parses the stable ACL section emitted by macOS `/bin/ls`.\n * Returns true only when the ACL grants authority; deny-only ACLs are\n * restrictive and do not weaken trusted-parent custody.\n */\nexport function parseDarwinAclListing(listing: string): boolean {\n const permissionMarker = /^[bcdlps-][rwxStTs-]{9}([+@ ])/.exec(listing)?.[1];\n if (!permissionMarker) {\n throw new Error('macOS ACL inspection returned an unrecognized listing');\n }\n const aclEntries = listing.split('\\n').slice(1).filter(Boolean);\n if (aclEntries.length === 0) {\n if (permissionMarker === '+') {\n throw new Error('macOS ACL inspection returned no ACL entries');\n }\n return false;\n }\n if (permissionMarker !== '+' && permissionMarker !== '@') {\n throw new Error('macOS ACL inspection returned entries without a marker');\n }\n let grantsAuthority = false;\n for (const entry of aclEntries) {\n const parsed = /^\\s+\\d+:\\s+.+\\s+(allow|deny)\\s+[A-Za-z_,]+\\s*$/.exec(entry);\n if (!parsed) {\n throw new Error('macOS ACL inspection returned an unrecognized entry');\n }\n if (parsed[1] === 'allow') grantsAuthority = true;\n }\n return grantsAuthority;\n}\n\nfunction inspectDarwinAcl(filePath: string): Promise<boolean> {\n return new Promise((resolveInspection, reject) => {\n execFile(\n '/bin/ls',\n ['-lde', '--', filePath],\n {\n encoding: 'utf8',\n env: {\n // biome-ignore lint/style/useNamingConvention: standard POSIX locale variable\n LC_ALL: 'C',\n },\n timeout: 5_000,\n },\n (error, stdout) => {\n if (error) {\n reject(error);\n return;\n }\n try {\n resolveInspection(parseDarwinAclListing(stdout));\n } catch (parseError) {\n reject(parseError);\n }\n },\n );\n });\n}\n\nconst defaultRuntime: SecureSqliteRuntime = {\n platform: process.platform,\n nodeVersion: process.versions.node,\n currentUid: () => {\n if (!process.getuid) {\n throw new Error('process.getuid() is unavailable');\n }\n return process.getuid();\n },\n inspectDarwinAcl,\n loadDriver: async () => {\n const moduleName = 'node:sqlite';\n return (await import(/* @vite-ignore */ moduleName)) as NodeSqliteModule;\n },\n};\n\nconst GROUP_OR_WORLD_WRITE = 0o022;\nconst STICKY_BIT = 0o1000;\nconst MINIMUM_NODE_VERSION = [24, 18, 0] as const;\n\nfunction validateNodeVersion(runtime: SecureSqliteRuntime): void {\n const version = runtime.nodeVersion ?? defaultRuntime.nodeVersion ?? '';\n const match =\n /^v?(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)\\.(0|[1-9][0-9]*)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/.exec(\n version,\n );\n const parsed = match?.slice(1, 4).map(Number);\n const isPrerelease = Boolean(match?.[4]);\n if (\n !parsed ||\n parsed.some((part) => !Number.isSafeInteger(part)) ||\n isPrerelease ||\n parsed[0] < MINIMUM_NODE_VERSION[0] ||\n (parsed[0] === MINIMUM_NODE_VERSION[0] &&\n parsed[1] < MINIMUM_NODE_VERSION[1]) ||\n (parsed[0] === MINIMUM_NODE_VERSION[0] &&\n parsed[1] === MINIMUM_NODE_VERSION[1] &&\n parsed[2] < MINIMUM_NODE_VERSION[2])\n ) {\n throw new DatabaseError('Secure SQLite requires Node.js 24.18.0 or newer', {\n actualVersion: version || 'unknown',\n minimumVersion: MINIMUM_NODE_VERSION.join('.'),\n hint: 'Upgrade the runtime before requesting trusted-parent secure SQLite. Default LibSQL mode remains available on older supported runtimes.',\n });\n }\n}\n\nfunction pathComponents(path: string): string[] {\n const root = parse(path).root;\n const components = path.slice(root.length).split(sep).filter(Boolean);\n const paths = [root];\n for (const component of components) {\n paths.push(resolve(paths.at(-1) ?? root, component));\n }\n return paths;\n}\n\nasync function validateDarwinAcl(\n filePath: string,\n runtime: SecureSqliteRuntime,\n): Promise<void> {\n if (runtime.platform !== 'darwin') return;\n\n let hasAcl: boolean;\n try {\n const inspect = runtime.inspectDarwinAcl ?? defaultRuntime.inspectDarwinAcl;\n if (!inspect) throw new Error('macOS ACL inspector is unavailable');\n hasAcl = await inspect(filePath);\n } catch (error) {\n throw new DatabaseError(\n 'Secure SQLite acquisition cannot inspect macOS access control lists',\n {\n path: filePath,\n originalError: error instanceof Error ? error.message : String(error),\n },\n );\n }\n\n if (hasAcl) {\n throw new DatabaseError(\n 'Secure SQLite custody path contains a permissive macOS access control list',\n {\n path: filePath,\n hint: 'Remove ACL entries that grant authority from the application-custodied path before requesting secure acquisition.',\n },\n );\n }\n}\n\nasync function validateTrustedParentCustody(\n filePath: string,\n options: SecureSqliteCustodyOptions,\n runtime: SecureSqliteRuntime,\n): Promise<boolean> {\n if (options.custody !== 'trusted-parent') {\n throw new DatabaseError(\n 'Secure SQLite acquisition requires trusted-parent custody',\n {},\n );\n }\n\n let currentUid: number;\n try {\n currentUid = (runtime.currentUid ?? defaultRuntime.currentUid)?.() ?? -1;\n } catch (error) {\n throw new DatabaseError(\n 'Secure SQLite acquisition cannot verify the current user',\n { originalError: error instanceof Error ? error.message : String(error) },\n );\n }\n\n const databaseParent = dirname(filePath);\n const custodyRoot = resolve(options.root ?? databaseParent);\n const relativeDatabasePath = relative(custodyRoot, filePath);\n if (\n !relativeDatabasePath ||\n relativeDatabasePath === '..' ||\n relativeDatabasePath.startsWith(`..${sep}`) ||\n parse(relativeDatabasePath).root\n ) {\n throw new DatabaseError(\n 'Secure SQLite database must be beneath its trusted custody root',\n { path: filePath, custodyRoot },\n );\n }\n\n const custodyRelative = relative(custodyRoot, databaseParent);\n const custodiedParents = new Set([\n custodyRoot,\n ...pathComponents(databaseParent).filter((path) => {\n const child = relative(custodyRoot, path);\n return child === '' || (!child.startsWith(`..${sep}`) && child !== '..');\n }),\n ]);\n\n if (\n custodyRelative === '..' ||\n custodyRelative.startsWith(`..${sep}`) ||\n parse(custodyRelative).root\n ) {\n throw new DatabaseError(\n 'Secure SQLite parent must be beneath its trusted custody root',\n { path: databaseParent, custodyRoot },\n );\n }\n\n for (const componentPath of pathComponents(databaseParent)) {\n let stats: Awaited<ReturnType<typeof lstat>>;\n try {\n stats = await lstat(componentPath);\n } catch (error) {\n throw new DatabaseError(\n 'Secure SQLite custody chain contains an inaccessible component',\n {\n path: componentPath,\n originalError: error instanceof Error ? error.message : String(error),\n },\n );\n }\n\n if (stats.isSymbolicLink() || !stats.isDirectory()) {\n throw new DatabaseError(\n 'Secure SQLite custody chain must contain only real directories',\n { path: componentPath },\n );\n }\n await validateDarwinAcl(componentPath, runtime);\n\n const componentUid =\n runtime.pathOwnerUid?.(componentPath, stats.uid) ?? stats.uid;\n const isCustodied = custodiedParents.has(componentPath);\n if (isCustodied) {\n if (componentUid !== currentUid) {\n throw new DatabaseError(\n 'Secure SQLite custody directory is not owned by the current user',\n {\n path: componentPath,\n expectedUid: currentUid,\n actualUid: componentUid,\n },\n );\n }\n if ((stats.mode & GROUP_OR_WORLD_WRITE) !== 0) {\n throw new DatabaseError(\n 'Secure SQLite custody directory is group/world writable',\n { path: componentPath },\n );\n }\n } else {\n if (componentUid !== currentUid && componentUid !== 0) {\n throw new DatabaseError(\n 'Secure SQLite ancestor is owned by an untrusted user',\n {\n path: componentPath,\n expectedUid: currentUid,\n actualUid: componentUid,\n },\n );\n }\n if (\n (stats.mode & GROUP_OR_WORLD_WRITE) !== 0 &&\n (stats.mode & STICKY_BIT) === 0\n ) {\n throw new DatabaseError(\n 'Secure SQLite ancestor permits replacement by another principal',\n { path: componentPath },\n );\n }\n }\n }\n\n try {\n const leaf = await lstat(filePath);\n if (leaf.isSymbolicLink() || !leaf.isFile()) {\n throw new DatabaseError(\n 'Secure SQLite database leaf must be a regular file',\n { path: filePath },\n );\n }\n const leafUid = runtime.pathOwnerUid?.(filePath, leaf.uid) ?? leaf.uid;\n if (leafUid !== currentUid) {\n throw new DatabaseError(\n 'Secure SQLite database leaf is not owned by the current user',\n { path: filePath, expectedUid: currentUid, actualUid: leafUid },\n );\n }\n if ((leaf.mode & GROUP_OR_WORLD_WRITE) !== 0) {\n throw new DatabaseError(\n 'Secure SQLite database leaf is group/world writable',\n { path: filePath },\n );\n }\n await validateDarwinAcl(filePath, runtime);\n return true;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error;\n return false;\n }\n}\n\ninterface SecureLeafIdentity {\n birthtimeNs: bigint;\n ctimeNs: bigint;\n dev: bigint;\n ino: bigint;\n}\n\nfunction leafIdentity(\n stats: Pick<BigIntStats, 'birthtimeNs' | 'ctimeNs' | 'dev' | 'ino'>,\n): SecureLeafIdentity {\n return {\n birthtimeNs: stats.birthtimeNs,\n ctimeNs: stats.ctimeNs,\n dev: stats.dev,\n ino: stats.ino,\n };\n}\n\nfunction sameLeafIdentity(\n left: SecureLeafIdentity,\n right: SecureLeafIdentity,\n): boolean {\n return (\n left.dev === right.dev &&\n left.ino === right.ino &&\n left.birthtimeNs === right.birthtimeNs &&\n left.ctimeNs === right.ctimeNs\n );\n}\n\nasync function createSecureLeaf(\n filePath: string,\n runtime: SecureSqliteRuntime,\n): Promise<SecureLeafIdentity | undefined> {\n let handle: Awaited<ReturnType<typeof open>>;\n try {\n handle = await (runtime.openLeaf ?? open)(filePath, 'wx', 0o600);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'EEXIST') return undefined;\n throw new DatabaseError(\n 'Secure SQLite could not create the database leaf',\n {\n path: filePath,\n originalError: error instanceof Error ? error.message : String(error),\n },\n );\n }\n\n let identity: SecureLeafIdentity | undefined;\n let acquisitionError: unknown;\n try {\n const stats = await handle.stat({ bigint: true });\n identity = leafIdentity(stats);\n } catch (error) {\n acquisitionError = error;\n }\n try {\n await handle.close();\n } catch (error) {\n acquisitionError = acquisitionError\n ? new AggregateError(\n [acquisitionError, error],\n 'Secure SQLite leaf inspection and close failed',\n )\n : error;\n }\n\n if (acquisitionError) {\n // If fstat failed, there is no trustworthy pathname identity with which to\n // decide whether cleanup is still deleting the file we created. Leave the\n // restrictive empty leaf behind rather than unlinking a replacement.\n const cleanupError = identity\n ? await removeCreatedLeafIfUnchanged(filePath, identity, runtime)\n : undefined;\n throw new DatabaseError('Secure SQLite could not close the created leaf', {\n path: filePath,\n originalError:\n acquisitionError instanceof Error\n ? acquisitionError.message\n : String(acquisitionError),\n ...(!identity ? { cleanupSkipped: 'leaf identity unavailable' } : {}),\n ...(cleanupError ? { cleanupError } : {}),\n });\n }\n\n return identity;\n}\n\nasync function removeCreatedLeafIfUnchanged(\n filePath: string,\n identity: SecureLeafIdentity,\n runtime: SecureSqliteRuntime,\n): Promise<string | undefined> {\n try {\n const current = await (runtime.lstatLeaf ?? lstat)(filePath, {\n bigint: true,\n });\n if (!sameLeafIdentity(leafIdentity(current), identity)) {\n return undefined;\n }\n await unlink(filePath);\n return undefined;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined;\n return error instanceof Error ? error.message : String(error);\n }\n}\n\nfunction resolveSecureFilePath(url: string): string {\n if (\n url === ':memory:' ||\n url.startsWith('file::memory:') ||\n /^(?:https?|libsql):/i.test(url)\n ) {\n throw new DatabaseError(\n 'Secure SQLite acquisition requires a local file-backed database',\n {\n hint: \"Use a local path or 'file:...' URL, or disable secureFile for memory and remote databases.\",\n },\n );\n }\n\n if (url.startsWith('file://')) {\n const parsed = new URL(url);\n if (parsed.search || parsed.hash) {\n throw new DatabaseError(\n 'Secure SQLite acquisition does not support file URLs with query parameters or fragments',\n {},\n );\n }\n return resolve(fileURLToPath(parsed));\n }\n\n if (url.startsWith('file:')) {\n const path = url.slice('file:'.length);\n if (!path || path.includes('?') || path.includes('#')) {\n throw new DatabaseError(\n 'Secure SQLite acquisition requires a plain file path without query parameters or fragments',\n {},\n );\n }\n return resolve(path);\n }\n\n return resolve(url);\n}\n\nfunction normalizeExactInteger(value: unknown): unknown {\n if (typeof value !== 'bigint') return value;\n if (\n value >= BigInt(Number.MIN_SAFE_INTEGER) &&\n value <= BigInt(Number.MAX_SAFE_INTEGER)\n ) {\n return Number(value);\n }\n return value;\n}\n\nfunction normalizeExactRow(\n row: Record<string, unknown>,\n): Record<string, unknown> {\n return Object.fromEntries(\n Object.entries(row).map(([key, value]) => [\n key,\n normalizeExactInteger(value),\n ]),\n );\n}\n\nfunction toExactBigInt(value: number | bigint, metric: string): bigint {\n if (typeof value === 'bigint') return value;\n if (!Number.isSafeInteger(value)) {\n throw new DatabaseError(\n `Secure SQLite returned an inexact ${metric} metric`,\n { metric, value },\n );\n }\n return BigInt(value);\n}\n\n/** @internal Exact public-contract range guard used by deterministic tests. */\nexport function toPublicRowCount(value: number | bigint): number {\n const exact = toExactBigInt(value, 'changes');\n if (exact < 0n || exact > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new DatabaseError(\n 'Secure SQLite changes exceed the public safe-integer row-count range',\n {\n changes: exact.toString(),\n maxSafeInteger: Number.MAX_SAFE_INTEGER,\n },\n );\n }\n return Number(exact);\n}\n\n/**\n * node:sqlite does not bind named parameters from the positional array used by\n * the existing LibSQL adapter. Translate executable parameters to SQLite\n * numeric slots while preserving SQLite's first-occurrence allocation and\n * reuse rules, including Tcl-style `$name::suffix(...)` parameters. Quoted\n * text, identifiers, and comments remain untouched.\n */\nfunction normalizeNodeSqlitePlaceholders(sql: string): string {\n let normalized = '';\n let index = 0;\n let quote: \"'\" | '\"' | '`' | ']' | undefined;\n let largestParameterIndex = 0;\n const namedParameterIndexes = new Map<string, number>();\n\n while (index < sql.length) {\n const char = sql[index];\n const next = sql[index + 1];\n\n if (quote) {\n normalized += char;\n if (char === quote) {\n if (next === quote && quote !== ']') {\n normalized += next;\n index += 2;\n continue;\n }\n quote = undefined;\n }\n index += 1;\n continue;\n }\n\n if (char === \"'\" || char === '\"' || char === '`' || char === '[') {\n quote = char === '[' ? ']' : char;\n normalized += char;\n index += 1;\n continue;\n }\n\n if (char === '-' && next === '-') {\n const end = sql.indexOf('\\n', index + 2);\n if (end === -1) return normalized + sql.slice(index);\n normalized += sql.slice(index, end + 1);\n index = end + 1;\n continue;\n }\n\n if (char === '/' && next === '*') {\n const end = sql.indexOf('*/', index + 2);\n if (end === -1) return normalized + sql.slice(index);\n normalized += sql.slice(index, end + 2);\n index = end + 2;\n continue;\n }\n\n if (char === '?') {\n let end = index + 1;\n while (/[0-9]/.test(sql[end] ?? '')) end += 1;\n if (end > index + 1) {\n largestParameterIndex = Math.max(\n largestParameterIndex,\n Number(sql.slice(index + 1, end)),\n );\n normalized += sql.slice(index, end);\n } else {\n largestParameterIndex += 1;\n normalized += `?${largestParameterIndex}`;\n }\n index = end;\n continue;\n }\n\n if (\n (char === '$' || char === ':' || char === '@') &&\n /[A-Za-z0-9_]/.test(next ?? '') &&\n !/[A-Za-z0-9_$:@]/.test(sql[index - 1] ?? '')\n ) {\n let end = index + 2;\n while (/[A-Za-z0-9_]/.test(sql[end] ?? '')) end += 1;\n if (char === '$') {\n while (\n sql.slice(end, end + 2) === '::' &&\n /[A-Za-z0-9_]/.test(sql[end + 2] ?? '')\n ) {\n end += 3;\n while (/[A-Za-z0-9_]/.test(sql[end] ?? '')) end += 1;\n }\n if (sql[end] === '(') {\n const closingParenthesis = sql.indexOf(')', end + 1);\n if (closingParenthesis !== -1) end = closingParenthesis + 1;\n }\n }\n const token = sql.slice(index, end);\n let parameterIndex = namedParameterIndexes.get(token);\n if (parameterIndex === undefined) {\n largestParameterIndex += 1;\n parameterIndex = largestParameterIndex;\n namedParameterIndexes.set(token, parameterIndex);\n }\n normalized += `?${parameterIndex}`;\n index = end;\n continue;\n }\n\n normalized += char;\n index += 1;\n }\n\n return normalized;\n}\n\nfunction executeNodeSqlite(\n database: NodeSqliteDatabase,\n statement: string | SecureSqliteStatement,\n): SecureSqliteResult {\n const sql = normalizeNodeSqlitePlaceholders(\n typeof statement === 'string' ? statement : statement.sql,\n );\n const args = (\n typeof statement === 'string' ? [] : (statement.args ?? [])\n ).map((value) => (typeof value === 'boolean' ? Number(value) : value));\n const prepared = database.prepare(sql);\n prepared.setReadBigInts(true);\n\n if (prepared.columns().length > 0) {\n const beforeStatement = database.prepare(\n 'SELECT total_changes() AS totalChanges',\n );\n beforeStatement.setReadBigInts(true);\n const before = toExactBigInt(\n beforeStatement.all()[0]?.totalChanges as number | bigint,\n 'totalChanges',\n );\n const rows = prepared.all(...args).map(normalizeExactRow);\n const afterStatement = database.prepare(\n 'SELECT total_changes() AS totalChanges, changes() AS changes, last_insert_rowid() AS lastInsertRowid',\n );\n afterStatement.setReadBigInts(true);\n const metrics = afterStatement.all()[0];\n const after = toExactBigInt(\n metrics?.totalChanges as number | bigint,\n 'totalChanges',\n );\n const changed = after > before;\n const rowsAffected = changed\n ? toPublicRowCount(metrics?.changes as number | bigint)\n : 0;\n return {\n rows,\n rowsAffected,\n ...(changed\n ? {\n lastInsertRowid: toExactBigInt(\n metrics?.lastInsertRowid as number | bigint,\n 'lastInsertRowid',\n ),\n }\n : {}),\n };\n }\n\n const result = prepared.run(...args);\n const rowsAffected = toPublicRowCount(result.changes);\n return {\n rows: [],\n rowsAffected,\n ...(rowsAffected > 0\n ? {\n lastInsertRowid: toExactBigInt(\n result.lastInsertRowid,\n 'lastInsertRowid',\n ),\n }\n : {}),\n };\n}\n\nfunction createClient(database: NodeSqliteDatabase): SecureSqliteClient {\n interface ReservationOwner {\n active: boolean;\n beforeExecute?: () => void;\n tail: Promise<void>;\n }\n\n let closePromise: Promise<void> | undefined;\n let executionTail = Promise.resolve();\n let state: 'open' | 'closing' | 'closed' = 'open';\n\n const executeStatement = async (\n statement: string | SecureSqliteStatement,\n ): Promise<SecureSqliteResult> => {\n return executeNodeSqlite(database, statement);\n };\n\n const enqueue = (\n statement: string | SecureSqliteStatement,\n owner?: ReservationOwner,\n ): Promise<SecureSqliteResult> => {\n if (owner) {\n if (!owner.active || state === 'closed') {\n return Promise.reject(\n new DatabaseError(\n 'Secure SQLite transaction reservation is closed',\n {},\n ),\n );\n }\n const pending = owner.tail.then(() => {\n if (!owner.active || state === 'closed') {\n throw new DatabaseError(\n 'Secure SQLite transaction reservation is closed',\n {},\n );\n }\n owner.beforeExecute?.();\n return executeStatement(statement);\n });\n owner.tail = pending.then(\n () => undefined,\n () => undefined,\n );\n return pending;\n }\n\n if (state !== 'open') {\n return Promise.reject(\n new DatabaseError('Secure SQLite client is closing or closed', {}),\n );\n }\n const pending = executionTail.then(() => executeStatement(statement));\n\n executionTail = pending.then(\n () => undefined,\n () => undefined,\n );\n return pending;\n };\n\n const acquireReservation = async (): Promise<{\n owner: ReservationOwner;\n release: () => Promise<void>;\n }> => {\n if (state !== 'open') {\n throw new DatabaseError('Secure SQLite client is closing or closed', {});\n }\n\n const owner: ReservationOwner = {\n active: false,\n tail: Promise.resolve(),\n };\n let markAcquired: () => void = () => {};\n let markReleased: () => void = () => {};\n const acquired = new Promise<void>((resolveAcquired) => {\n markAcquired = resolveAcquired;\n });\n const released = new Promise<void>((resolveReleased) => {\n markReleased = resolveReleased;\n });\n const reservation = executionTail.then(async () => {\n owner.active = true;\n markAcquired();\n await released;\n await owner.tail;\n owner.active = false;\n });\n executionTail = reservation.then(\n () => undefined,\n () => undefined,\n );\n\n await acquired;\n let releaseStarted = false;\n return {\n owner,\n release: async () => {\n if (!releaseStarted) {\n releaseStarted = true;\n markReleased();\n }\n await reservation;\n },\n };\n };\n\n const execute = (\n statement: string | SecureSqliteStatement,\n ): Promise<SecureSqliteResult> => enqueue(statement);\n\n return {\n transactionReservation: 'exclusive',\n execute,\n transaction: async () => {\n const { owner, release } = await acquireReservation();\n try {\n await enqueue('BEGIN IMMEDIATE', owner);\n } catch (error) {\n await release();\n throw error;\n }\n let transactionClosed = false;\n let transactionEnding = false;\n let reservationReleased = false;\n let automaticRollbackError: DatabaseError | undefined;\n\n const releaseReservation = async (): Promise<void> => {\n if (reservationReleased) return;\n reservationReleased = true;\n await release();\n };\n\n const detectAutomaticRollback = (): void => {\n if (transactionClosed || database.isTransaction) return;\n transactionClosed = true;\n automaticRollbackError = new DatabaseError(\n 'Secure SQLite transaction ended automatically',\n {\n hint: 'A statement conflict policy such as ON CONFLICT ROLLBACK ended the transaction. No later accepted work was executed.',\n },\n );\n // Release only after every statement already accepted by this owner has\n // drained. Those later statements observe transactionClosed and reject\n // before touching SQLite.\n void releaseReservation().catch(() => {});\n };\n\n const executeInTransaction = async (\n statement: string | SecureSqliteStatement,\n ): Promise<SecureSqliteResult> => {\n detectAutomaticRollback();\n if (transactionClosed) {\n throw (\n automaticRollbackError ??\n new DatabaseError(\n 'Secure SQLite transaction reservation is closed',\n {},\n )\n );\n }\n try {\n return await enqueue(statement, owner);\n } finally {\n detectAutomaticRollback();\n }\n };\n owner.beforeExecute = () => {\n detectAutomaticRollback();\n if (transactionClosed) {\n throw (\n automaticRollbackError ??\n new DatabaseError(\n 'Secure SQLite transaction reservation is closed',\n {},\n )\n );\n }\n };\n\n const end = async (sql: 'COMMIT' | 'ROLLBACK'): Promise<void> => {\n if (transactionEnding) {\n throw new DatabaseError(\n 'Secure SQLite transaction is already ending',\n {},\n );\n }\n if (transactionClosed) {\n await releaseReservation();\n if (sql === 'COMMIT' && automaticRollbackError) {\n throw automaticRollbackError;\n }\n return;\n }\n transactionEnding = true;\n if (sql === 'COMMIT') {\n try {\n await enqueue(sql, owner);\n transactionClosed = true;\n await releaseReservation();\n return;\n } finally {\n transactionEnding = false;\n }\n }\n try {\n await enqueue(sql, owner);\n transactionClosed = true;\n await releaseReservation();\n } catch (rollbackError) {\n // A failed rollback leaves SQLite's transaction state uncertain. Do\n // not return this connection to service: close it after the accepted\n // owner queue drains and propagate every cleanup failure.\n transactionClosed = true;\n state = 'closing';\n let closeError: unknown;\n try {\n await releaseReservation();\n database.close();\n } catch (error) {\n closeError = error;\n } finally {\n state = 'closed';\n }\n if (closeError) {\n throw new AggregateError(\n [rollbackError, closeError],\n 'Secure SQLite rollback and connection invalidation both failed',\n { cause: rollbackError },\n );\n }\n throw rollbackError;\n } finally {\n transactionEnding = false;\n }\n };\n\n return {\n get closed() {\n return transactionClosed;\n },\n execute: executeInTransaction,\n commit: () => end('COMMIT'),\n rollback: () => end('ROLLBACK'),\n close: () => {\n if (!transactionClosed) void end('ROLLBACK').catch(() => {});\n },\n };\n },\n close: async () => {\n if (state === 'closed') return;\n if (!closePromise) {\n state = 'closing';\n closePromise = executionTail.then(() => database.close());\n }\n try {\n await closePromise;\n state = 'closed';\n } catch (error) {\n state = 'open';\n closePromise = undefined;\n throw error;\n }\n },\n };\n}\n\n/**\n * Opens a local SQLite file under an explicit trusted-parent custody contract.\n *\n * Static path components and their ownership/mode are checked before the\n * built-in `node:sqlite` driver opens the file. Other principals cannot replace\n * a path beneath the caller-custodied parent. Hostile processes running as the\n * same account are explicitly outside this boundary.\n *\n * @internal Call through `getDatabase()` with typed `secureFile` custody.\n */\nexport async function createSecureSqliteClient(\n url: string,\n options: SecureSqliteCustodyOptions,\n runtime: SecureSqliteRuntime = defaultRuntime,\n): Promise<SecureSqliteClient> {\n validateNodeVersion(runtime);\n if (runtime.platform !== 'darwin' && runtime.platform !== 'linux') {\n throw new DatabaseError(\n `Secure SQLite acquisition is unsupported on ${runtime.platform}`,\n {\n hint: 'secureFile requires built-in node:sqlite on macOS or Linux. Disable secureFile only if trusted-parent custody is not required.',\n },\n );\n }\n\n const filePath = resolveSecureFilePath(url);\n const leafExisted = await validateTrustedParentCustody(\n filePath,\n options,\n runtime,\n );\n let nodeSqlite: NodeSqliteModule;\n try {\n nodeSqlite = await runtime.loadDriver();\n } catch (error) {\n throw new DatabaseError(\n 'Secure SQLite acquisition could not load the node:sqlite driver',\n {\n hint: 'Run @happyvertical/sql on its supported Node.js version with built-in node:sqlite available.',\n originalError: error instanceof Error ? error.message : String(error),\n },\n );\n }\n let createdLeaf: SecureLeafIdentity | undefined;\n if (!leafExisted) {\n createdLeaf = await createSecureLeaf(filePath, runtime);\n // An EEXIST race or inherited platform ACL must still satisfy the complete\n // custody contract before the driver sees the path. Other principals\n // cannot create beneath a validated trusted parent; hostile same-UID\n // mutation remains outside the documented boundary.\n try {\n const acquiredLeaf = await validateTrustedParentCustody(\n filePath,\n options,\n runtime,\n );\n if (!acquiredLeaf) {\n throw new DatabaseError(\n 'Secure SQLite database leaf disappeared during acquisition',\n { path: filePath },\n );\n }\n if (createdLeaf) {\n let current: BigIntStats;\n try {\n current = await (runtime.lstatLeaf ?? lstat)(filePath, {\n bigint: true,\n });\n } catch (error) {\n throw new DatabaseError(\n 'Secure SQLite database leaf changed during acquisition',\n {\n path: filePath,\n originalError:\n error instanceof Error ? error.message : String(error),\n },\n );\n }\n if (!sameLeafIdentity(leafIdentity(current), createdLeaf)) {\n throw new DatabaseError(\n 'Secure SQLite database leaf changed during acquisition',\n { path: filePath },\n );\n }\n }\n } catch (error) {\n if (createdLeaf) {\n await removeCreatedLeafIfUnchanged(filePath, createdLeaf, runtime);\n }\n throw error;\n }\n }\n\n let database: NodeSqliteDatabase;\n try {\n database = new nodeSqlite.DatabaseSync(filePath, {\n // Match the legacy LibSQL adapter rather than inheriting node:sqlite's\n // intentionally stricter defaults.\n enableForeignKeyConstraints: false,\n enableDoubleQuotedStringLiterals: true,\n });\n } catch (error) {\n let cleanupError: string | undefined;\n if (createdLeaf) {\n cleanupError = await removeCreatedLeafIfUnchanged(\n filePath,\n createdLeaf,\n runtime,\n );\n }\n throw new DatabaseError(\n 'Secure SQLite acquisition rejected the database path',\n {\n path: filePath,\n hint: 'Ensure the database path and every ancestor are real directories/files, not symbolic links, and that the file is writable.',\n originalError: error instanceof Error ? error.message : String(error),\n ...(cleanupError ? { cleanupError } : {}),\n },\n );\n }\n\n return createClient(database);\n}\n","import {\n AsyncLocalStorage,\n createHook,\n executionAsyncId,\n} from 'node:async_hooks';\nimport { createHash } from 'node:crypto';\nimport { types as utilTypes } from 'node:util';\nimport { DatabaseError } from '@happyvertical/utils';\nimport type { Client } from '@libsql/client';\nimport { DatabaseSchemaManager } from './schema-manager';\nimport { createSecureSqliteClient } from './secure-sqlite-client';\nimport {\n generateAddColumnStatement,\n generateCreateIndexStatement,\n validateColumnName,\n validateColumnNames,\n validateIndexName,\n validateTableName,\n} from './shared/alter-utils';\nimport { validateDatabaseCacheOptions } from './shared/connection-cache';\nimport { redactDatabaseUrl } from './shared/redact-database-url';\nimport { getCachedSqliteDatabase } from './shared/sqlite-connection-cache';\nimport {\n createTransactionLock,\n DEFAULT_TRANSACTION_QUEUE_TIMEOUT_MS,\n} from './shared/transaction-lock';\nimport type {\n ColumnDefinition,\n ColumnDefinitionWithName,\n DatabaseInterface,\n DatabaseOptions,\n IndexDefinition,\n QueryResult,\n SchemaInitializationOptions,\n SqliteCapabilitiesOptions,\n TableInterface,\n TableSchemaInfo,\n TransactionHandle,\n UpsertOptions,\n} from './shared/types';\nimport { resolveSchemas } from './shared/types';\nimport {\n buildWhere,\n formatDbError,\n resolveInsertColumns,\n wrapDatabaseError,\n} from './shared/utils';\n\n/**\n * Connection cache for in-memory databases with memoryId\n * Enables sharing of :memory: databases across multiple getDatabase() calls\n */\nconst NULL_AWARE_UPSERT_MAX_ATTEMPTS = 8;\nconst NULL_AWARE_UPSERT_BASE_DELAY_MS = 25;\nconst nullAwareUpsertLocks = new Map<string, Promise<void>>();\n\ninterface SqliteTransactionClientLike {\n readonly closed: boolean;\n execute(statement: any): Promise<any>;\n commit(): Promise<void>;\n rollback(): Promise<void>;\n close(): void;\n}\n\ninterface SqliteClientLike {\n readonly transactionReservation?: 'exclusive';\n execute(statement: any): Promise<any>;\n transaction(mode?: any): Promise<SqliteTransactionClientLike>;\n close(): void | Promise<void>;\n}\n\ntype SqliteExecutor = Pick<SqliteClientLike, 'execute'>;\n\nconst MANAGED_TRANSACTION_CONTROL_KEYWORDS = new Set([\n 'begin',\n 'commit',\n 'end',\n 'release',\n 'rollback',\n 'savepoint',\n]);\n\nfunction firstSqlKeyword(sql: string): string | undefined {\n let offset = 0;\n while (offset < sql.length) {\n const remaining = sql.slice(offset);\n const whitespace = remaining.match(/^\\s+/)?.[0];\n if (whitespace) {\n offset += whitespace.length;\n continue;\n }\n if (remaining.startsWith('--')) {\n const newline = remaining.indexOf('\\n', 2);\n if (newline === -1) return undefined;\n offset += newline + 1;\n continue;\n }\n if (remaining.startsWith('/*')) {\n const end = remaining.indexOf('*/', 2);\n if (end === -1) return undefined;\n offset += end + 2;\n continue;\n }\n if (remaining.startsWith(';')) {\n offset += 1;\n continue;\n }\n return remaining.match(/^[A-Za-z]+/)?.[0]?.toLowerCase();\n }\n return undefined;\n}\n\nfunction prepareManagedStatement(statement: any): any {\n const sql = typeof statement === 'string' ? statement : statement?.sql;\n if (\n typeof sql === 'string' &&\n MANAGED_TRANSACTION_CONTROL_KEYWORDS.has(firstSqlKeyword(sql) ?? '')\n ) {\n throw new DatabaseError(\n 'Transaction-control SQL is managed by the SQLite transaction scope',\n {\n hint: 'Use transaction(), beginTransaction(), commit(), or rollback() instead of issuing BEGIN, COMMIT, ROLLBACK, SAVEPOINT, or RELEASE as raw SQL.',\n },\n );\n }\n\n // Validate and execute the same immutable statement snapshot. A getter or\n // Proxy must not be able to present harmless SQL to the transaction-control\n // guard and different SQL to the queued driver acquisition.\n if (typeof statement === 'object' && statement !== null) {\n const args = statement.args;\n return {\n sql,\n args: Array.isArray(args) ? [...args] : args,\n };\n }\n return statement;\n}\n\ninterface InvocationBarrier {\n run<T>(work: () => Promise<T>): Promise<T>;\n close(work: () => void | Promise<void>): Promise<void>;\n}\n\n/**\n * Orders secure adapter calls at public invocation time.\n *\n * The reservation is appended before this function returns a promise. A later\n * `close()` therefore cannot overtake an operation while it awaits an internal\n * transaction/upsert lock before publishing work to the driver queue.\n */\nfunction createInvocationBarrier(): InvocationBarrier {\n let tail = Promise.resolve();\n let closePromise: Promise<void> | undefined;\n let state: 'open' | 'closing' | 'closed' = 'open';\n\n const run = <T>(work: () => Promise<T>): Promise<T> => {\n if (state !== 'open') {\n return Promise.reject(\n new DatabaseError('Secure SQLite adapter is closing or closed', {}),\n );\n }\n\n const previous = tail;\n let release: () => void = () => {};\n const current = new Promise<void>((resolveCurrent) => {\n release = resolveCurrent;\n });\n tail = previous.then(\n () => current,\n () => current,\n );\n\n return previous.then(work, work).finally(release);\n };\n\n const close = (work: () => void | Promise<void>): Promise<void> => {\n if (state === 'closed') return Promise.resolve();\n if (closePromise) return closePromise;\n\n state = 'closing';\n closePromise = tail.then(work, work).then(\n () => {\n state = 'closed';\n },\n (error) => {\n state = 'open';\n closePromise = undefined;\n throw error;\n },\n );\n tail = closePromise.then(\n () => undefined,\n () => undefined,\n );\n return closePromise;\n };\n\n return { run, close };\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nexport function toSafeSqliteCount(value: unknown): number {\n const count = typeof value === 'bigint' ? value : BigInt(String(value ?? 0));\n if (count < 0n || count > BigInt(Number.MAX_SAFE_INTEGER)) {\n throw new DatabaseError('SQLite count exceeds the safe integer range', {\n value: String(value),\n maximum: Number.MAX_SAFE_INTEGER,\n });\n }\n return Number(count);\n}\n\nfunction combineTransactionFailures(\n primary: unknown,\n secondary: unknown,\n): AggregateError {\n return new AggregateError(\n [primary, secondary],\n 'Transaction callback and accepted transaction work both failed',\n { cause: primary },\n );\n}\n\ninterface PromiseObservation {\n observed: boolean;\n error?: unknown;\n branches?: Set<PromiseObservation>;\n handlers: Set<Promise<void>>;\n nativeTransfers: Set<Promise<unknown>>;\n unhandledNativeTransfers: Set<Promise<unknown>>;\n nativeCorrelationIds: Set<number>;\n nativeTrackingActive?: boolean;\n nativeCorrelationIncomplete?: boolean;\n suppressIntrinsicRecovery?: number;\n propagateFailureToParent?: PromiseObservation;\n}\n\nconst activeNativeTransferObservations = new Set<PromiseObservation>();\nconst trackedPromiseObservations = new Set<PromiseObservation>();\nconst nativePromiseResources = new Map<number, WeakRef<Promise<unknown>>>();\nconst nativePromiseTriggers = new Map<number, number>();\nconst nativePromiseIds = new WeakMap<Promise<unknown>, number>();\nconst nativePromiseWatermarks = new WeakMap<Promise<unknown>, number>();\nlet latestNativePromiseId = 0;\nlet nativePromiseTrackingUsers = 0;\nconst MAX_TRACKED_PROMISE_RESOURCES = 8_192;\nconst nativePromiseHook = createHook({\n init(asyncId, type, triggerAsyncId, resource) {\n if (type === 'PROMISE') {\n latestNativePromiseId = Math.max(latestNativePromiseId, asyncId);\n nativePromiseResources.set(\n asyncId,\n new WeakRef(resource as Promise<unknown>),\n );\n nativePromiseTriggers.set(asyncId, triggerAsyncId);\n nativePromiseIds.set(resource as Promise<unknown>, asyncId);\n while (nativePromiseResources.size > MAX_TRACKED_PROMISE_RESOURCES) {\n const oldest = nativePromiseResources.keys().next().value;\n if (oldest === undefined) break;\n nativePromiseResources.delete(oldest);\n nativePromiseTriggers.delete(oldest);\n for (const observation of trackedPromiseObservations) {\n if (\n !observation.observed &&\n observation.nativeCorrelationIds.has(oldest)\n ) {\n observation.nativeCorrelationIncomplete = true;\n }\n }\n }\n }\n },\n destroy(asyncId) {\n nativePromiseResources.delete(asyncId);\n nativePromiseTriggers.delete(asyncId);\n },\n});\nlet nativeTransferListenerInstalled = false;\ntype UnhandledRejectionMode =\n | 'none'\n | 'strict'\n | 'throw'\n | 'warn'\n | 'warn-with-error-code';\nfunction configuredUnhandledRejectionMode(): UnhandledRejectionMode {\n const configured = `${process.env.NODE_OPTIONS ?? ''} ${process.execArgv.join(' ')}`;\n const modes = [\n ...configured.matchAll(\n /--unhandled-rejections(?:=|\\s+)(warn-with-error-code|none|strict|throw|warn)\\b/g,\n ),\n ];\n return (modes.at(-1)?.[1] as UnhandledRejectionMode | undefined) ?? 'throw';\n}\n\nfunction promisesAreRelated(\n rejectedPromise: Promise<unknown>,\n transferPromise: Promise<unknown>,\n): boolean {\n const rejectedId = nativePromiseIds.get(rejectedPromise);\n const transferId = nativePromiseIds.get(transferPromise);\n if (rejectedId === undefined || transferId === undefined) return false;\n if (rejectedId > (nativePromiseWatermarks.get(transferPromise) ?? -1)) {\n return false;\n }\n if (rejectedId === transferId) return true;\n\n const isAncestor = (ancestor: number, descendant: number): boolean => {\n let current = descendant;\n while (nativePromiseTriggers.has(current)) {\n current = nativePromiseTriggers.get(current) ?? 0;\n if (current === ancestor) return true;\n if (current === 0) break;\n }\n return false;\n };\n if (\n isAncestor(rejectedId, transferId) ||\n isAncestor(transferId, rejectedId)\n ) {\n return true;\n }\n\n // Promise combinators allocate their result immediately before per-element\n // adoption promises under the same async trigger.\n return (\n rejectedId === transferId - 1 &&\n nativePromiseTriggers.get(rejectedId) ===\n nativePromiseTriggers.get(transferId)\n );\n}\n\nconst recordUnhandledNativeTransfer = (\n reason: unknown,\n rejectedPromise: Promise<unknown>,\n) => {\n let matched = false;\n for (const observation of activeNativeTransferObservations) {\n for (const transferPromise of observation.nativeTransfers) {\n if (promisesAreRelated(rejectedPromise, transferPromise)) {\n observation.unhandledNativeTransfers.add(transferPromise);\n observation.observed = false;\n matched = true;\n }\n }\n }\n // Merely observing a transaction-owned rejection must not suppress Node's\n // default fatal handling for an unrelated rejection. If another application\n // listener exists, it already owns that policy; otherwise reproduce the\n // default fail-fast outcome outside this event dispatch.\n if (!matched && process.listenerCount('unhandledRejection') === 1) {\n const mode = configuredUnhandledRejectionMode();\n if (mode === 'none' || mode === 'strict') return;\n // Node emits its own warnings in `warn` mode even when a listener exists.\n if (mode === 'warn') return;\n if (mode === 'warn-with-error-code') {\n process.emitWarning(\n reason instanceof Error\n ? (reason.stack ?? reason.message)\n : String(reason),\n { type: 'UnhandledPromiseRejectionWarning' },\n );\n process.exitCode = 1;\n return;\n }\n const error =\n reason instanceof Error\n ? reason\n : new Error(`Unhandled promise rejection: ${String(reason)}`, {\n cause: reason,\n });\n queueMicrotask(() => {\n // A capture callback is Node's higher-priority uncaught-exception\n // boundary. Throw normally so Node invokes it without also dispatching\n // the process event listeners installed by a test runner or host.\n if (process.hasUncaughtExceptionCaptureCallback()) throw error;\n if (process.listenerCount('uncaughtException') > 0) {\n const emitProcessEvent = process.emit as (\n event: string,\n ...args: unknown[]\n ) => boolean;\n emitProcessEvent.call(\n process,\n 'uncaughtExceptionMonitor',\n error,\n 'unhandledRejection',\n );\n emitProcessEvent.call(\n process,\n 'uncaughtException',\n error,\n 'unhandledRejection',\n );\n return;\n }\n throw error;\n });\n }\n};\n\nfunction retainNativePromiseTracking(observation: PromiseObservation): void {\n if (observation.nativeTrackingActive) return;\n observation.nativeTrackingActive = true;\n trackedPromiseObservations.add(observation);\n nativePromiseTrackingUsers += 1;\n if (nativePromiseTrackingUsers === 1) nativePromiseHook.enable();\n}\n\nfunction releaseNativePromiseTracking(observation: PromiseObservation): void {\n if (!observation.nativeTrackingActive) return;\n observation.nativeTrackingActive = false;\n trackedPromiseObservations.delete(observation);\n nativePromiseTrackingUsers -= 1;\n if (nativePromiseTrackingUsers === 0) {\n nativePromiseHook.disable();\n nativePromiseResources.clear();\n nativePromiseTriggers.clear();\n }\n}\n\nfunction recordNativePromiseTransfer(observation: PromiseObservation): void {\n const executionId = executionAsyncId();\n const adoptionId = nativePromiseTriggers.get(executionId) ?? executionId;\n const adoptingPromise = nativePromiseResources.get(adoptionId)?.deref();\n // If Node cannot identify the adopting promise, leave the failed operation\n // unobserved so transaction draining fails closed.\n if (!adoptingPromise) return;\n observation.nativeTransfers.add(adoptingPromise);\n // Native adoption is recovery unless its derived Promise later reaches the\n // unhandled-rejection event. Record that event below before drain commits.\n observation.observed = true;\n nativePromiseWatermarks.set(adoptingPromise, latestNativePromiseId);\n let correlationId = adoptionId;\n observation.nativeCorrelationIds.add(correlationId);\n while (nativePromiseTriggers.has(correlationId)) {\n correlationId = nativePromiseTriggers.get(correlationId) ?? 0;\n if (correlationId === 0) break;\n observation.nativeCorrelationIds.add(correlationId);\n }\n activeNativeTransferObservations.add(observation);\n if (!nativeTransferListenerInstalled) {\n process.prependListener(\n 'unhandledRejection',\n recordUnhandledNativeTransfer,\n );\n nativeTransferListenerInstalled = true;\n }\n}\n\nasync function settleNativePromiseTransfers(\n observations: Iterable<PromiseObservation>,\n): Promise<void> {\n const observed = expandPromiseObservations(observations);\n const transferred = observed.filter(\n (observation) => observation.nativeTransfers.size > 0,\n );\n if (transferred.length === 0) {\n for (const observation of observed)\n releaseNativePromiseTracking(observation);\n return;\n }\n\n // Native adoption does not expose the adopting Promise. The listener is\n // installed when rejection transfers, so this checkpoint distinguishes a\n // caught await/combinator from a detached rejection even if the callback\n // crossed an earlier macrotask before reaching its drain.\n await new Promise<void>((resolvePromise) => setImmediate(resolvePromise));\n\n for (const observation of transferred) {\n if (\n !observation.nativeCorrelationIncomplete &&\n [...observation.nativeTransfers].every(\n (promise) => !observation.unhandledNativeTransfers.has(promise),\n )\n ) {\n observation.observed = true;\n }\n activeNativeTransferObservations.delete(observation);\n }\n for (const observation of observed) releaseNativePromiseTracking(observation);\n if (\n nativeTransferListenerInstalled &&\n activeNativeTransferObservations.size === 0\n ) {\n process.off('unhandledRejection', recordUnhandledNativeTransfer);\n nativeTransferListenerInstalled = false;\n }\n}\n\nfunction expandPromiseObservations(\n observations: Iterable<PromiseObservation>,\n): PromiseObservation[] {\n const expanded = new Set<PromiseObservation>();\n for (const observation of observations) {\n expanded.add(observation);\n for (const branch of observation.branches ?? []) expanded.add(branch);\n }\n return [...expanded];\n}\n\nfunction isNativePromiseAssimilation(\n onFulfilled: unknown,\n onRejected: unknown,\n): boolean {\n const anonymousPromiseResolver = (handler: {\n name: string;\n length: number;\n }): boolean =>\n handler.name === '' &&\n handler.length === 1 &&\n /\\{\\s*\\[native code\\]\\s*\\}/.test(Function.prototype.toString.call(handler));\n return (\n typeof onFulfilled === 'function' &&\n typeof onRejected === 'function' &&\n anonymousPromiseResolver(onFulfilled) &&\n anonymousPromiseResolver(onRejected)\n );\n}\n\nfunction looksLikeNativePromiseCapabilityExecutor(executor: unknown): boolean {\n return (\n typeof executor === 'function' &&\n !utilTypes.isProxy(executor) &&\n executor.name === '' &&\n executor.length === 2 &&\n /\\{\\s*\\[native code\\]\\s*\\}/.test(Function.prototype.toString.call(executor))\n );\n}\n\nfunction isConsumedPromiseCapabilityExecutor(\n executor: (\n resolve: (value: unknown) => void,\n reject: (reason?: any) => void,\n ) => void,\n): boolean {\n try {\n executor(\n () => undefined,\n () => undefined,\n );\n return false;\n } catch (error) {\n return (\n error instanceof TypeError &&\n error.message ===\n 'Promise executor has already been invoked with non-undefined arguments'\n );\n }\n}\n\n/**\n * Returns a native Promise chain that records rejection handling per derived\n * branch. A handler transfers responsibility from its parent to a branch-local\n * observation, so catching one sibling cannot hide another detached failure.\n */\nfunction withRejectionObservation<T>(\n source: Promise<T>,\n rootObservation: PromiseObservation,\n): Promise<T> {\n retainNativePromiseTracking(rootObservation);\n const wrap = <U>(\n promise: Promise<U>,\n observation: PromiseObservation = rootObservation,\n ): Promise<U> => {\n const createStandaloneObservation = (): PromiseObservation => ({\n observed: false,\n handlers: new Set(),\n nativeTransfers: new Set(),\n unhandledNativeTransfers: new Set(),\n nativeCorrelationIds: new Set(),\n });\n const suppressIntrinsicRecovery = <V>(\n callback: () => V,\n targetObservation: PromiseObservation = observation,\n ): V => {\n targetObservation.suppressIntrinsicRecovery =\n (targetObservation.suppressIntrinsicRecovery ?? 0) + 1;\n try {\n return callback();\n } finally {\n targetObservation.suppressIntrinsicRecovery -= 1;\n }\n };\n // The transaction owns detached rejection reporting. Prevent the native\n // derived Promise from also surfacing as an unhandledRejection while its\n // shared observation record remains deliberately unhandled. Use the\n // intrinsic directly so this internal sink never counts as caller recovery.\n suppressIntrinsicRecovery(() => {\n void Promise.prototype.then.call(promise, undefined, () => undefined);\n });\n const intrinsicPromiseObservations = new WeakMap<\n Promise<unknown>,\n PromiseObservation\n >();\n const createPromiseSpeciesOwner = (\n parentObservation: PromiseObservation,\n ): PromiseConstructor => {\n const speciesOwner = function transactionObservedPromiseBranch(\n executor: (\n resolve: (value: unknown | PromiseLike<unknown>) => void,\n reject: (reason?: any) => void,\n ) => void,\n ): Promise<unknown> {\n return new Promise(executor);\n } as unknown as PromiseConstructor;\n Object.setPrototypeOf(speciesOwner, Promise);\n Object.defineProperty(speciesOwner, Symbol.species, {\n configurable: true,\n get: () => createIntrinsicDerivedPromise(parentObservation),\n });\n return speciesOwner;\n };\n const createIntrinsicDerivedPromise = (\n parentObservation: PromiseObservation,\n ): PromiseConstructor => {\n class IntrinsicDerivedPromise extends Promise<unknown> {\n readonly #observation: PromiseObservation;\n\n static get [Symbol.species](): PromiseConstructor {\n return Promise;\n }\n\n constructor(\n executor: (\n resolve: (value: unknown | PromiseLike<unknown>) => void,\n reject: (reason?: any) => void,\n ) => void,\n ) {\n const suppressed =\n (parentObservation.suppressIntrinsicRecovery ?? 0) > 0;\n const candidateRecovery =\n !suppressed && looksLikeNativePromiseCapabilityExecutor(executor);\n const branch: PromiseObservation = suppressed\n ? parentObservation\n : createStandaloneObservation();\n let finishHandling: () => void = () => {};\n const handling = new Promise<void>((resolveHandling) => {\n finishHandling = resolveHandling;\n });\n super((resolve, reject) => {\n try {\n executor(\n (value) => {\n if (candidateRecovery) {\n // Observe the final adoption outcome rather than merely\n // resolve(): a fulfilled handler can return a rejected\n // thenable, which must remain a branch-local failure.\n void new Promise<unknown>((resolveValue) =>\n resolveValue(value),\n ).then(\n () => {\n branch.observed = true;\n finishHandling();\n },\n (error) => {\n branch.error = error;\n if (branch.propagateFailureToParent) {\n branch.propagateFailureToParent.observed = true;\n }\n finishHandling();\n },\n );\n } else {\n finishHandling();\n }\n resolve(value);\n },\n (reason) => {\n if (candidateRecovery) {\n branch.error = reason;\n if (branch.propagateFailureToParent) {\n branch.propagateFailureToParent.observed = true;\n }\n }\n finishHandling();\n reject(reason);\n },\n );\n } catch (error) {\n if (candidateRecovery) {\n branch.error = error;\n if (branch.propagateFailureToParent) {\n branch.propagateFailureToParent.observed = true;\n }\n }\n finishHandling();\n throw error;\n }\n });\n const tracksRecovery =\n candidateRecovery && isConsumedPromiseCapabilityExecutor(executor);\n if (tracksRecovery) {\n const branches =\n parentObservation.branches ?? new Set<PromiseObservation>();\n parentObservation.branches = branches;\n branch.branches = branches;\n branches.add(branch);\n parentObservation.observed = true;\n }\n this.#observation = branch;\n intrinsicPromiseObservations.set(this, branch);\n // Transaction draining owns detached rejection reporting. The sink\n // prevents a process-level unhandledRejection; branch state above\n // still fails the transaction unless a later child handles it.\n void Promise.prototype.then.call(this, undefined, () => undefined);\n if (tracksRecovery) {\n branch.handlers.add(handling);\n void handling.finally(() => branch.handlers.delete(handling));\n }\n // Promise.prototype.then.call() reads the source's constructor and\n // species. Bind that lookup to this branch so every direct intrinsic\n // child gets independent failure/recovery state.\n Object.defineProperty(this, 'constructor', {\n configurable: true,\n value: createPromiseSpeciesOwner(branch),\n });\n }\n\n // biome-ignore lint/suspicious/noThenProperty: this is an actual Promise subclass preserving the public Promise contract.\n override then<TResult1 = unknown, TResult2 = never>(\n onFulfilled?:\n | ((value: unknown) => TResult1 | PromiseLike<TResult1>)\n | null,\n onRejected?:\n | ((reason: any) => TResult2 | PromiseLike<TResult2>)\n | null,\n ): Promise<TResult1 | TResult2> {\n const branch = this.#observation;\n const transfersToNativePromise = isNativePromiseAssimilation(\n onFulfilled,\n onRejected,\n );\n const handleRejected =\n transfersToNativePromise && typeof onRejected === 'function'\n ? (reason: any) => {\n recordNativePromiseTransfer(branch);\n return onRejected(reason);\n }\n : onRejected;\n const wasObserved = branch.observed;\n const derived = Promise.prototype.then.call(\n this,\n onFulfilled,\n handleRejected,\n ) as Promise<TResult1 | TResult2>;\n if (transfersToNativePromise) {\n branch.observed = wasObserved;\n const child = intrinsicPromiseObservations.get(derived);\n if (child) child.propagateFailureToParent = branch;\n } else {\n branch.observed = true;\n }\n return derived;\n }\n\n override catch<TResult = never>(\n onRejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null,\n ): Promise<unknown | TResult> {\n return this.then(undefined, onRejected);\n }\n\n override finally(\n onFinally?: (() => void | PromiseLike<void>) | null,\n ): Promise<unknown> {\n if (typeof onFinally !== 'function') {\n return this.then(\n (value) => value,\n (reason) => {\n throw reason;\n },\n );\n }\n return this.then(\n (value) => Promise.resolve(onFinally()).then(() => value),\n (reason) =>\n Promise.resolve(onFinally()).then(() => {\n throw reason;\n }),\n );\n }\n }\n\n return IntrinsicDerivedPromise as unknown as PromiseConstructor;\n };\n\n class ObservedPromise extends Promise<U> {\n readonly #observation: PromiseObservation;\n\n static get [Symbol.species](): PromiseConstructor {\n return createIntrinsicDerivedPromise(observation);\n }\n\n constructor(\n executor?: (\n resolve: (value: U | PromiseLike<U>) => void,\n reject: (reason?: any) => void,\n ) => void,\n ) {\n super((resolve, reject) => {\n if (executor) executor(resolve, reject);\n else Promise.prototype.then.call(promise, resolve, reject);\n });\n this.#observation = executor\n ? createStandaloneObservation()\n : observation;\n Object.defineProperty(this, 'constructor', {\n configurable: true,\n value: createPromiseSpeciesOwner(this.#observation),\n });\n }\n\n // biome-ignore lint/suspicious/noThenProperty: this is an actual Promise subclass preserving the public Promise contract.\n override then<TResult1 = U, TResult2 = never>(\n onFulfilled?: ((value: U) => TResult1 | PromiseLike<TResult1>) | null,\n onRejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n // Promise assimilation (`await`, `Promise.resolve`, `Promise.all`, and\n // async helper adoption) supplies a pair of native resolving functions.\n // Those functions transfer rejection to a native Promise. The\n // enclosing callback still rejects if an await is not caught; a caught\n // await is therefore valid recovery and must not be rolled back again\n // by detached-operation draining.\n const currentObservation = this.#observation;\n const transfersToNativePromise = isNativePromiseAssimilation(\n onFulfilled,\n onRejected,\n );\n const handleRejected =\n transfersToNativePromise && typeof onRejected === 'function'\n ? (reason: any) => {\n recordNativePromiseTransfer(currentObservation);\n return onRejected(reason);\n }\n : onRejected;\n const wasObserved = currentObservation.observed;\n const derived = Promise.prototype.then.call(\n this,\n onFulfilled,\n handleRejected,\n ) as Promise<TResult1 | TResult2>;\n if (transfersToNativePromise) {\n currentObservation.observed = wasObserved;\n const child = intrinsicPromiseObservations.get(derived);\n if (child) child.propagateFailureToParent = currentObservation;\n } else {\n currentObservation.observed = true;\n }\n return derived;\n }\n\n override catch<TResult = never>(\n onRejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null,\n ): Promise<U | TResult> {\n return this.then(undefined, onRejected);\n }\n\n override finally(onFinally?: (() => void) | null): Promise<U> {\n if (typeof onFinally !== 'function') {\n return this.then(\n (value) => value,\n (reason) => {\n throw reason;\n },\n );\n }\n return this.then(\n (value) => Promise.resolve(onFinally()).then(() => value),\n (reason) =>\n Promise.resolve(onFinally()).then(() => {\n throw reason;\n }),\n );\n }\n }\n\n const observed = new ObservedPromise();\n suppressIntrinsicRecovery(() =>\n Promise.prototype.then.call(observed, undefined, () => undefined),\n );\n return observed;\n };\n\n return wrap(source);\n}\n\nfunction isRetriableSqliteTransactionError(error: unknown): boolean {\n const formatted = formatDbError(error).toLowerCase();\n return (\n formatted.includes('busy') ||\n formatted.includes('locked') ||\n formatted.includes('database is locked')\n );\n}\n\nasync function withNullAwareUpsertLock<T>(\n lockKey: string,\n callback: () => Promise<T>,\n): Promise<T> {\n const previous = nullAwareUpsertLocks.get(lockKey) ?? Promise.resolve();\n let release: () => void = () => {};\n const current = new Promise<void>((resolve) => {\n release = resolve;\n });\n const next = previous.catch(() => {}).then(() => current);\n\n nullAwareUpsertLocks.set(lockKey, next);\n await previous.catch(() => {});\n\n try {\n return await callback();\n } finally {\n release();\n\n if (nullAwareUpsertLocks.get(lockKey) === next) {\n nullAwareUpsertLocks.delete(lockKey);\n }\n }\n}\n\n/**\n * Generates a unique identifier for in-memory databases\n * @returns A unique database identifier string\n */\nfunction generateDbId(): string {\n return `memory-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Creates a LibSQL client using the default client implementation\n * Supports in-memory databases and remote LibSQL URLs\n *\n * @param options - SQLite connection options\n * @returns Promise resolving to a LibSQL client instance\n */\nasync function createLibSQLClient(\n options: SqliteOptions,\n): Promise<SqliteClientLike> {\n const { url = ':memory:', authToken, encryptionKey } = options;\n\n // Normalize URLs: add file:// prefix for local paths\n let libsqlUrl = url;\n const remoteUrl = url.replace(/[\\t\\n\\r]/g, '').trim();\n const hasRemoteScheme = /^(?:https?|libsql):/i.test(remoteUrl);\n if (hasRemoteScheme) {\n libsqlUrl = remoteUrl;\n let parsedRemoteUrl: URL;\n try {\n parsedRemoteUrl = new URL(remoteUrl);\n } catch {\n const safeUrl = redactDatabaseUrl(remoteUrl);\n throw new DatabaseError(`Invalid remote database URL: ${safeUrl}`, {\n url: safeUrl,\n });\n }\n if (!/^(?:https?|libsql):\\/\\//i.test(remoteUrl) || !parsedRemoteUrl.host) {\n const safeUrl = redactDatabaseUrl(remoteUrl);\n throw new DatabaseError(`Invalid remote database URL: ${safeUrl}`, {\n url: safeUrl,\n });\n }\n }\n if (url !== ':memory:' && !hasRemoteScheme && !url.startsWith('file:')) {\n // Local file path - resolve to absolute and add file:// prefix\n const { resolve } = await import('node:path');\n const absolutePath = resolve(url);\n // Use file:// format (file URL scheme with authority component omitted)\n libsqlUrl = `file://${absolutePath}`;\n }\n\n try {\n // Use explicit external import to avoid bundling\n const libsqlClient = '@libsql/client';\n const { createClient } = await import(/* @vite-ignore */ libsqlClient);\n const client = createClient({\n url: libsqlUrl,\n authToken,\n encryptionKey,\n }) as Client;\n if (!hasRemoteScheme && url !== ':memory:') {\n // libsql 0.5.x can leave a failed SQLITE_BUSY statement active even\n // after ROLLBACK. Never reuse that connection or silently reconnect it:\n // reconnecting would lose the caller's TEMP tables and PRAGMA state.\n // Dispose it and require explicit acquisition/reinitialization instead.\n const dispose = client.close.bind(client);\n let invalidated: Error | undefined;\n const guard = async <T>(operation: () => Promise<T>): Promise<T> => {\n if (invalidated) throw invalidated;\n try {\n return await operation();\n } catch (error) {\n if ((error as { code?: string })?.code?.startsWith('SQLITE_BUSY')) {\n dispose();\n invalidated = Object.assign(\n new Error(\n 'SQLite connection closed and invalidated after SQLITE_BUSY; acquire a new database, restore connection-local settings, and retry the entire transaction.',\n { cause: error },\n ),\n { code: 'SQLITE_BUSY', connectionInvalidated: true },\n );\n throw invalidated;\n }\n throw error;\n }\n };\n const execute = client.execute.bind(client);\n client.execute = (...args: Parameters<Client['execute']>) =>\n guard(() => execute(...args));\n const transaction = client.transaction.bind(client);\n client.transaction = async (\n ...args: Parameters<Client['transaction']>\n ) => {\n const tx = await guard(() => transaction(...args));\n const execute = tx.execute.bind(tx);\n const commit = tx.commit.bind(tx);\n const close = tx.close.bind(tx);\n const prototype = Object.getPrototypeOf(tx);\n Object.defineProperty(tx, 'closed', {\n get: () =>\n Boolean(invalidated) || Reflect.get(prototype, 'closed', tx),\n });\n tx.close = () => {\n if (!invalidated) close();\n };\n tx.execute = (...args: Parameters<typeof tx.execute>) =>\n guard(() => execute(...args));\n tx.commit = () => guard(commit);\n return tx;\n };\n }\n return client;\n } catch (error) {\n const errorMessage = redactDatabaseUrl(\n error instanceof Error ? error.message : String(error),\n );\n const safeUrl = redactDatabaseUrl(libsqlUrl);\n\n // Provide helpful error messages for common issues\n if (errorMessage?.includes('URL_SCHEME_NOT_SUPPORTED')) {\n throw new DatabaseError(\n `Unsupported URL scheme. Use ':memory:' for in-memory databases or 'libsql://' for remote LibSQL databases. URL: ${safeUrl}`,\n { url: safeUrl, originalError: errorMessage },\n );\n }\n\n // Re-throw other errors with context\n throw new DatabaseError(`Failed to create LibSQL client: ${errorMessage}`, {\n url: safeUrl,\n originalError: errorMessage,\n });\n }\n}\n\n/** Options for the trusted-parent SQLite file acquisition boundary. */\nexport interface SecureSqliteFileOptions {\n /**\n * Built-in driver that owns the secure acquisition and exact integer path.\n *\n * @default 'node:sqlite'\n */\n driver: 'node:sqlite';\n\n /**\n * Assert that the application controls the database parent directory.\n * The adapter verifies current-user ownership, non-writable group/other\n * permissions, current-user/root ancestor ownership, static symlink absence,\n * and no macOS ACL before acquisition.\n */\n custody: 'trusted-parent';\n\n /**\n * Optional application data root. Defaults to the database's direct parent.\n * Every database parent at or below this root must satisfy the custody check.\n */\n root?: string;\n}\n\n/**\n * Configuration options for SQLite database connections\n */\nexport interface SqliteOptions extends DatabaseOptions {\n /**\n * Connection URL for SQLite database\n * Supported schemes:\n * - ':memory:' for in-memory databases\n * - 'file:path/to/database.db' for local file databases\n * - 'libsql://...' for remote LibSQL/Turso databases\n */\n url?: string;\n\n /**\n * Authentication token for Turso/LibSQL remote connections\n */\n authToken?: string;\n\n /**\n * Encryption key for encrypted SQLite databases (LibSQL feature)\n */\n encryptionKey?: string;\n\n /**\n * Unique identifier for in-memory databases to enable connection sharing\n * Calls using the same dbid and the same LibSQL/native adapter path receive\n * the same database connection instance. `clearCache` evicts both paths.\n *\n * Auto-generated for :memory: databases if not provided.\n */\n dbid?: string;\n\n /**\n * Optional native SQLite capabilities for local development and testing.\n *\n * When any capability is enabled, the adapter uses the internal native\n * SQLite implementation instead of the LibSQL client path. Native\n * capabilities are only supported for local SQLite databases.\n */\n capabilities?: SqliteCapabilitiesOptions;\n\n /**\n * Require trusted-parent acquisition for a local file-backed database.\n *\n * This requires an explicit `trusted-parent` custody assertion, verifies the\n * application data root/parent chain and rejects static symlinks before the\n * built-in `node:sqlite` driver opens the file. Other principals cannot\n * replace a path under the custodied parent. It does not claim protection\n * from a hostile same-account process, which can directly replace or rewrite\n * an unencrypted user-owned database.\n *\n * Existing pathname behavior is unchanged when omitted or false.\n */\n secureFile?: boolean | SecureSqliteFileOptions;\n\n /**\n * How long a queued transaction waits for the connection, in milliseconds.\n *\n * Applies to the single-connection adapters — SQLite (both the LibSQL and\n * native paths), DuckDB and JSON. Those drive one connection, so transactions\n * run one at a time and an overlapping `transaction()` waits its turn.\n * PostgreSQL pools and ignores this.\n *\n * The clock starts when the call queues, not when the connection frees, so\n * this bounds the total wait rather than any single transaction: raise it for\n * workloads with long transactions *or* with sustained bursts on one\n * connection. Must be positive and finite.\n *\n * Read once, when the connection is created. Adapters that cache connections\n * hand a later `getDatabase()` for the same database the existing one, which\n * keeps the timeout the first caller asked for.\n *\n * @default 30000\n */\n transactionQueueTimeout?: number;\n\n /**\n * Schema definitions for tables.\n * Accepts a record or a lazy function (see SchemasOption).\n *\n * When provided, these schemas will be used for table creation.\n * Accepts a lazy function to defer schema building until needed.\n */\n schemas?: import('./shared/types').SchemasOption;\n}\n\nfunction hasNativeSqliteCapabilities(options: SqliteOptions): boolean {\n return Boolean(\n options.capabilities?.notifications || options.capabilities?.vector,\n );\n}\n\n/**\n * Creates tables from provided schema definitions\n *\n * @param client - LibSQL client\n * @param schemas - Schema definitions to create\n */\nasync function createTablesFromSchemas(\n client: any,\n schemas: Record<string, import('./shared/types').SchemaProvider>,\n): Promise<void> {\n for (const [tableName, schema] of Object.entries(schemas)) {\n try {\n // Check if table already exists\n const result = await client.execute({\n sql: `SELECT name FROM sqlite_master WHERE type='table' AND name=?`,\n args: [tableName],\n });\n\n if (result.rows.length > 0) {\n console.log(`[sqlite] Table ${tableName} already exists, skipping`);\n continue;\n }\n\n console.log(`[sqlite] Creating table ${tableName} from provided schema`);\n\n // Create table from DDL\n await client.execute(schema.ddl);\n\n // Create indexes\n if (schema.indexes && schema.indexes.length > 0) {\n for (const indexSQL of schema.indexes) {\n try {\n await client.execute(indexSQL);\n } catch (error) {\n console.warn(\n `[sqlite] Failed to create index for ${tableName}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n }\n\n // Create triggers (if supported)\n if (schema.triggers && schema.triggers.length > 0) {\n for (const triggerSQL of schema.triggers) {\n try {\n await client.execute(triggerSQL);\n } catch (error) {\n console.warn(\n `[sqlite] Failed to create trigger for ${tableName}: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n }\n } catch (error) {\n console.error(\n `[sqlite] Error creating table ${tableName}:`,\n error instanceof Error ? error.message : String(error),\n );\n console.error(`[sqlite] DDL was:`, schema.ddl?.substring(0, 200) + '...');\n throw new DatabaseError(\n `Failed to create table ${tableName} from schema: ${error instanceof Error ? error.message : String(error)}`,\n {\n tableName,\n schema,\n originalError: error instanceof Error ? error.message : String(error),\n },\n );\n }\n }\n}\n\n/**\n * Creates a SQLite database adapter\n *\n * @param options - SQLite connection options\n * @returns Database interface for SQLite\n */\nexport async function getDatabase(\n options: SqliteOptions = {},\n): Promise<DatabaseInterface> {\n validateDatabaseCacheOptions(options);\n const url = options.url || ':memory:';\n\n // Auto-generate dbid for :memory: databases if not provided\n // Mutate options object to ensure child objects reuse the same connection\n if (url === ':memory:' && !options.dbid && options.cache !== false) {\n options.dbid = generateDbId();\n }\n\n if (options.secureFile) {\n if (options.secureFile === true) {\n throw new DatabaseError(\n 'Secure SQLite acquisition requires an explicit trusted-parent custody contract',\n {\n hint: \"Use secureFile: { driver: 'node:sqlite', custody: 'trusted-parent' } after placing the database beneath a current-user-owned parent with no group/world write permission.\",\n },\n );\n }\n const secureOptions = options.secureFile;\n if (secureOptions.driver !== 'node:sqlite') {\n throw new DatabaseError(\n `Unsupported secure SQLite driver: ${String(secureOptions.driver)}`,\n {\n hint: \"Use secureFile: { driver: 'node:sqlite', custody: 'trusted-parent' }.\",\n },\n );\n }\n if (secureOptions.custody !== 'trusted-parent') {\n throw new DatabaseError(\n 'Secure SQLite acquisition requires trusted-parent custody',\n {\n hint: \"Set custody: 'trusted-parent' only when the application controls the database parent directory.\",\n },\n );\n }\n if (options.authToken || options.encryptionKey) {\n throw new DatabaseError(\n 'Secure SQLite acquisition does not support LibSQL authentication or encryption options',\n {\n hint: 'Remove authToken/encryptionKey for a local secure file, or disable secureFile to use LibSQL features.',\n },\n );\n }\n if (hasNativeSqliteCapabilities(options)) {\n throw new DatabaseError(\n 'Secure SQLite acquisition cannot be combined with native SQLite capabilities',\n {\n hint: 'Use either secureFile custody or optional native capabilities for a connection, not both.',\n },\n );\n }\n\n return getCachedSqliteDatabase('secure', options, () =>\n createDatabase(options, url, () =>\n createSecureSqliteClient(url, {\n custody: secureOptions.custody,\n root: secureOptions.root,\n }),\n ),\n );\n }\n\n if (hasNativeSqliteCapabilities(options)) {\n const sqliteNative = await import('./sqlite-native.js');\n return sqliteNative.getNativeSqliteDatabase(options);\n }\n\n return getCachedSqliteDatabase('libsql', options, () =>\n createDatabase(options, url),\n );\n}\n\nasync function createDatabase(\n options: SqliteOptions,\n url: string,\n clientFactory: () => Promise<SqliteClientLike> = () =>\n createLibSQLClient(options),\n): Promise<DatabaseInterface> {\n return (async () => {\n // One lock per connection. Nothing else in this closure escapes to another\n // caller, and `getDatabase` hands cached callers this same closure, so\n // \"created here\" and \"per connection\" are the same scope.\n const connectionLock = createTransactionLock(\n 'sqlite',\n options.transactionQueueTimeout,\n );\n // Validate queue configuration before a secure client can create or open\n // its file. Invalid configuration must not leave an acquired resource.\n const client = await clientFactory();\n\n const executorContext = new AsyncLocalStorage<SqliteExecutor>();\n const transactionCallbackContext = new AsyncLocalStorage<boolean>();\n const currentExecutor = (): SqliteExecutor =>\n executorContext.getStore() ?? client;\n\n // Initialize tables from provided schemas (resolves lazy function if needed)\n const resolvedSchemas = resolveSchemas(options.schemas);\n if (resolvedSchemas && Object.keys(resolvedSchemas).length > 0) {\n try {\n await createTablesFromSchemas(client, resolvedSchemas);\n } catch (error) {\n try {\n await client.close();\n } catch (cleanupError) {\n throw new AggregateError(\n [error, cleanupError],\n 'LibSQL schema initialization and cleanup failed',\n );\n }\n throw error;\n }\n }\n\n /**\n * Serializes a value for SQLite storage\n * Converts objects and arrays to JSON strings\n * Converts Dates to ISO strings\n * Passes through primitives unchanged\n */\n const serializeValue = (value: any): any => {\n if (value === null || value === undefined) {\n return value;\n }\n if (value instanceof Date) {\n return value.toISOString();\n }\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n return value;\n };\n\n /**\n * Serializes all values in an object\n */\n const serializeRecord = (\n record: Record<string, any>,\n ): Record<string, any> => {\n const serialized: Record<string, any> = {};\n for (const [key, value] of Object.entries(record)) {\n // Skip undefined values - they cannot be passed to the database\n if (value === undefined) {\n continue;\n }\n serialized[key] = serializeValue(value);\n }\n return serialized;\n };\n\n const hasNullConflictValue = (\n conflictColumns: string[],\n data: Record<string, any>,\n ): boolean => conflictColumns.some((col) => data[col] === null);\n\n const buildNullAwareUpsertLockKey = (\n table: string,\n conflictColumns: string[],\n ): string => {\n // SQLite equality is schema-affinity dependent: an INTEGER column can\n // treat 1, 1n, true, and the string \"1\" as the same conflict value. A\n // value-derived key cannot reproduce that without loading the schema.\n // Serialize all null-aware attempts for one logical constraint instead.\n const material = JSON.stringify({\n url,\n table: table.toLowerCase(),\n // SQLite accepts equivalent composite conflict targets in either\n // column order. Canonicalize that caller-provided order so every\n // spelling of one logical constraint shares the same lock.\n conflicts: [\n ...new Set(conflictColumns.map((column) => column.toLowerCase())),\n ].sort(),\n });\n return `sqlite-null-aware:${createHash('sha256').update(material).digest('hex')}`;\n };\n\n const validateUpsertConflictColumns = (\n table: string,\n conflictColumns: string[],\n serializedData: Record<string, any>,\n ): void => {\n const missingColumns = conflictColumns.filter(\n (col) => !(col in serializedData),\n );\n\n if (missingColumns.length > 0) {\n throw new DatabaseError('Conflict columns missing from data', {\n table,\n conflictColumns,\n missingColumns,\n availableColumns: Object.keys(serializedData),\n hint: 'All columns specified in ON CONFLICT must be present in the data being inserted. Undefined values are filtered out during serialization - consider using null or an empty string instead.',\n });\n }\n };\n\n const executeStandardUpsert = async (\n table: string,\n conflictColumns: string[],\n serializedData: Record<string, any>,\n ): Promise<QueryResult> => {\n const keys = Object.keys(serializedData);\n const values = Object.values(serializedData);\n const placeholders = keys.map(() => '?').join(', ');\n const updateSet = keys\n .map((key) => `${key} = excluded.${key}`)\n .join(', ');\n const conflict = conflictColumns.join(', ');\n const sql = `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders}) ON CONFLICT(${conflict}) DO UPDATE SET ${updateSet}`;\n\n const result = await currentExecutor().execute({ sql, args: values });\n return { operation: 'upsert', affected: result.rowsAffected };\n };\n\n const executeNullAwareUpsertAttempt = async (\n executor: SqliteExecutor,\n table: string,\n conflictColumns: string[],\n serializedData: Record<string, any>,\n ): Promise<QueryResult> => {\n const keys = Object.keys(serializedData);\n const values = Object.values(serializedData);\n const updateSet = keys.map((key) => `${key} = ?`).join(', ');\n const whereClause = conflictColumns\n .map((col) => `${col} IS ?`)\n .join(' AND ');\n const whereValues = conflictColumns.map((col) => serializedData[col]);\n\n const updateSql = `UPDATE ${table} SET ${updateSet} WHERE ${whereClause}`;\n const updateResult = await executor.execute({\n sql: updateSql,\n args: [...values, ...whereValues],\n });\n\n if ((updateResult.rowsAffected ?? 0) > 0) {\n return { operation: 'upsert', affected: updateResult.rowsAffected };\n }\n\n const placeholders = keys.map(() => '?').join(', ');\n const insertSql = `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders})`;\n const insertResult = await executor.execute({\n sql: insertSql,\n args: values,\n });\n\n return { operation: 'upsert', affected: insertResult.rowsAffected };\n };\n\n const executeNullAwareUpsertWithRetry = async (\n table: string,\n conflictColumns: string[],\n serializedData: Record<string, any>,\n lockKey: string,\n ): Promise<QueryResult> => {\n if (url === ':memory:') {\n return withNullAwareUpsertLock(lockKey, () =>\n executeNullAwareUpsertAttempt(\n client,\n table,\n conflictColumns,\n serializedData,\n ),\n );\n }\n\n let lastError: unknown;\n\n for (\n let attempt = 0;\n attempt < NULL_AWARE_UPSERT_MAX_ATTEMPTS;\n attempt++\n ) {\n let transaction: SqliteTransactionClientLike | undefined;\n\n // This opens a transaction on the shared connection like any other, so\n // it takes the same lock — otherwise a null-aware upsert overlapping a\n // `transaction()` call reintroduces exactly the corruption the lock\n // exists to prevent. Acquired per attempt so the retry backoff below\n // waits without holding the connection.\n const releaseConnection = await connectionLock.acquire();\n try {\n return await withNullAwareUpsertLock(lockKey, async () => {\n transaction = await client.transaction('write');\n\n const result = await executeNullAwareUpsertAttempt(\n transaction,\n table,\n conflictColumns,\n serializedData,\n );\n\n await transaction.commit();\n return result;\n });\n } catch (error) {\n lastError = error;\n\n if (transaction && !transaction.closed) {\n try {\n await transaction.rollback();\n } catch (rollbackError) {\n lastError = combineTransactionFailures(lastError, rollbackError);\n }\n }\n } finally {\n transaction?.close();\n releaseConnection();\n }\n\n if (\n lastError &&\n attempt < NULL_AWARE_UPSERT_MAX_ATTEMPTS - 1 &&\n isRetriableSqliteTransactionError(lastError)\n ) {\n await delay(NULL_AWARE_UPSERT_BASE_DELAY_MS * 2 ** attempt);\n continue;\n }\n\n break;\n }\n\n throw lastError;\n };\n\n /**\n * Rejects hostile table/column identifiers before an upsert builds SQL.\n *\n * Called from the public entry points rather than from `executeUpsert`, so\n * the failure reaches the caller naming the bad identifier instead of being\n * flattened into the wrapper's generic \"Failed to upsert record into table\".\n *\n * Validates the keys of the already-serialized snapshot — the exact array\n * the executors interpolate — not a fresh enumeration of the caller's\n * `data`. Enumerating `data` again could disagree with the snapshot if it is\n * a Proxy whose `ownKeys` trap returns different keys on successive reads.\n */\n const validateUpsertIdentifiers = (\n table: string,\n conflictColumns: string[],\n serializedData: Record<string, any>,\n ): void => {\n validateTableName(table);\n validateColumnNames([...conflictColumns, ...Object.keys(serializedData)]);\n };\n\n const executeUpsert = async (\n table: string,\n conflictColumns: string[],\n serializedData: Record<string, any>,\n options: UpsertOptions | undefined,\n acquireTransaction: boolean,\n ): Promise<QueryResult> => {\n validateUpsertConflictColumns(table, conflictColumns, serializedData);\n\n if (\n options?.nullsDistinct ||\n !hasNullConflictValue(conflictColumns, serializedData)\n ) {\n return executeStandardUpsert(table, conflictColumns, serializedData);\n }\n\n if (!acquireTransaction) {\n const executor = currentExecutor();\n return withNullAwareUpsertLock(\n buildNullAwareUpsertLockKey(table, conflictColumns),\n () =>\n executeNullAwareUpsertAttempt(\n executor,\n table,\n conflictColumns,\n serializedData,\n ),\n );\n }\n\n return executeNullAwareUpsertWithRetry(\n table,\n conflictColumns,\n serializedData,\n buildNullAwareUpsertLockKey(table, conflictColumns),\n );\n };\n\n /**\n * Inserts one or more records into a table\n *\n * @param table - Table name\n * @param data - Single record or array of records to insert\n * @returns Promise resolving to operation result\n * @throws Error if the insert operation fails\n */\n const insert = async (\n table: string,\n data: Record<string, any> | Record<string, any>[],\n ): Promise<QueryResult> => {\n validateTableName(table);\n let sql: string;\n let values: any[];\n\n if (Array.isArray(data)) {\n if (data.length === 0) {\n return { operation: 'insert', affected: 0 };\n }\n // Serialize all records in the array\n const serializedRecords: Array<Record<string, any>> = data.map(\n (record) => serializeRecord(record),\n );\n const keys = resolveInsertColumns(table, serializedRecords);\n validateColumnNames(keys);\n const placeholders = serializedRecords\n .map(() => `(${keys.map(() => '?').join(', ')})`)\n .join(', ');\n sql = `INSERT INTO ${table} (${keys.join(', ')}) VALUES ${placeholders}`;\n // Project through `keys` rather than each record's own key order, so a\n // record whose keys were inserted in a different order still binds each\n // value to its own column.\n values = serializedRecords.flatMap((record) =>\n keys.map((key) => record[key]),\n );\n } else {\n // Serialize the single record\n const serializedData = serializeRecord(data);\n const keys = Object.keys(serializedData);\n validateColumnNames(keys);\n const placeholders = keys.map(() => '?').join(', ');\n sql = `INSERT INTO ${table} (${keys.join(', ')}) VALUES (${placeholders})`;\n values = Object.values(serializedData);\n }\n try {\n const result = await currentExecutor().execute({\n sql: sql,\n args: values,\n });\n return { operation: 'insert', affected: result.rowsAffected };\n } catch (e) {\n throw new DatabaseError('Failed to insert records into table', {\n table,\n sql,\n values,\n originalError: formatDbError(e),\n });\n }\n };\n\n /**\n * Retrieves a single record matching the where criteria\n *\n * @param table - Table name\n * @param where - Criteria to match records\n * @returns Promise resolving to matching record or null if not found\n * @throws Error if the query fails\n */\n const get = async (\n table: string,\n where: Record<string, any>,\n ): Promise<Record<string, any> | null> => {\n validateTableName(table);\n const { sql: whereClause, values } = buildWhere(where, 1, 'sqlite');\n if (!whereClause) {\n throw new DatabaseError(\n 'GET requires at least one WHERE condition to prevent returning an arbitrary record',\n { table },\n );\n }\n\n const sql = `SELECT * FROM ${table} ${whereClause}`;\n try {\n const result = await currentExecutor().execute({\n sql: sql,\n args: values,\n });\n return result.rows[0] || null;\n } catch (e) {\n throw new DatabaseError('Failed to retrieve record from table', {\n table,\n sql,\n values,\n originalError: formatDbError(e),\n });\n }\n };\n\n /**\n * Retrieves multiple records matching the where criteria\n *\n * @param table - Table name\n * @param where - Criteria to match records\n * @returns Promise resolving to array of matching records\n * @throws Error if the query fails\n */\n const list = async (\n table: string,\n where: Record<string, any>,\n ): Promise<Record<string, any>[]> => {\n validateTableName(table);\n const { sql: whereClause, values } = buildWhere(where, 1, 'sqlite');\n const sql = `SELECT * FROM ${table} ${whereClause}`;\n try {\n const result = await currentExecutor().execute({ sql, args: values });\n return result.rows;\n } catch (e) {\n throw new DatabaseError('Failed to list records from table', {\n table,\n sql,\n values,\n originalError: formatDbError(e),\n });\n }\n };\n\n /**\n * Updates records matching the where criteria\n *\n * @param table - Table name\n * @param where - Criteria to match records to update\n * @param data - New data to set\n * @returns Promise resolving to operation result\n * @throws Error if the update operation fails\n */\n const update = async (\n table: string,\n where: Record<string, any>,\n data: Record<string, any>,\n ): Promise<QueryResult> => {\n validateTableName(table);\n // Serialize the data to update\n const serializedData = serializeRecord(data);\n const keys = Object.keys(serializedData);\n validateColumnNames(keys);\n const values = Object.values(serializedData);\n const setClause = keys.map((key, i) => `${key} = $${i + 1}`).join(', ');\n const { sql: whereClause, values: whereValues } = buildWhere(\n where,\n values.length + 1,\n 'sqlite',\n );\n if (!whereClause) {\n throw new DatabaseError(\n 'UPDATE requires at least one WHERE condition to prevent accidental update of all records',\n { table },\n );\n }\n\n const sql = `UPDATE ${table} SET ${setClause} ${whereClause}`;\n try {\n const result = await currentExecutor().execute({\n sql,\n args: [...values, ...whereValues],\n });\n return { operation: 'update', affected: result.rowsAffected };\n } catch (e) {\n throw new DatabaseError('Failed to update records in table', {\n table,\n sql,\n values: [...values, ...whereValues],\n originalError: formatDbError(e),\n });\n }\n };\n\n /**\n * Inserts a record or updates it if it already exists (UPSERT)\n *\n * @param table - Table name\n * @param conflictColumns - Columns that define the uniqueness constraint\n * @param data - Data to insert or update\n * @returns Promise resolving to operation result\n * @throws Error if the upsert operation fails\n */\n const upsert = async (\n table: string,\n conflictColumns: string[],\n data: Record<string, any>,\n options?: UpsertOptions,\n ): Promise<QueryResult> => {\n // Snapshot the record and the conflict columns once and thread both\n // through validation and SQL, so neither a hostile record nor a hostile\n // conflict-column array can present different identifiers to each.\n const serializedData = serializeRecord(data);\n const conflictCols = [...conflictColumns];\n validateUpsertIdentifiers(table, conflictCols, serializedData);\n try {\n return await executeUpsert(\n table,\n conflictCols,\n serializedData,\n options,\n true,\n );\n } catch (e) {\n if (\n e instanceof DatabaseError &&\n e.message === 'Conflict columns missing from data'\n ) {\n throw e;\n }\n\n throw new DatabaseError('Failed to upsert record into table', {\n table,\n values: data,\n conflictColumns,\n originalError: formatDbError(e),\n });\n }\n };\n\n // Names nested savepoints. Only ever appended to an identifier the adapter\n // generates, never caller input.\n let savepointSequence = 0;\n\n const upsertInCurrentTransaction = async (\n table: string,\n conflictColumns: string[],\n data: Record<string, any>,\n options?: UpsertOptions,\n ): Promise<QueryResult> => {\n // Snapshot the record and the conflict columns once and thread both\n // through validation and SQL, so neither a hostile record nor a hostile\n // conflict-column array can present different identifiers to each.\n const serializedData = serializeRecord(data);\n const conflictCols = [...conflictColumns];\n validateUpsertIdentifiers(table, conflictCols, serializedData);\n try {\n return await executeUpsert(\n table,\n conflictCols,\n serializedData,\n options,\n false,\n );\n } catch (e) {\n if (\n e instanceof DatabaseError &&\n e.message === 'Conflict columns missing from data'\n ) {\n throw e;\n }\n\n throw new DatabaseError('Failed to upsert record into table', {\n table,\n values: data,\n conflictColumns,\n originalError: formatDbError(e),\n });\n }\n };\n\n /**\n * Gets a record matching the where criteria or inserts it if not found\n *\n * @param table - Table name\n * @param where - Criteria to match existing record\n * @param data - Data to insert if no record found\n * @returns Promise resolving to the record (either retrieved or newly inserted)\n * @throws Error if the operation fails or if the record cannot be retrieved after insert\n */\n const getOrInsert = async (\n table: string,\n where: Record<string, any>,\n data: Record<string, any>,\n ): Promise<Record<string, any>> => {\n const result = await get(table, where);\n if (result) return result;\n await insert(table, data);\n\n const inserted = await get(table, where);\n if (!inserted) {\n throw new DatabaseError('Failed to insert and retrieve record', {\n table,\n where,\n data,\n });\n }\n return inserted;\n };\n\n /**\n * Deletes records from a table matching the where criteria\n *\n * @param table - Table name\n * @param where - Criteria to match records for deletion\n * @returns Promise resolving to operation result with count of deleted rows\n * @throws Error if the delete operation fails\n */\n const deleteRecords = async (\n table: string,\n where: Record<string, any>,\n ): Promise<QueryResult> => {\n validateTableName(table);\n\n const keys = Object.keys(where);\n if (keys.length === 0) {\n throw new DatabaseError(\n 'DELETE requires at least one WHERE condition to prevent accidental deletion of all records',\n { table },\n );\n }\n\n const { sql: whereClause, values } = buildWhere(where, 1, 'sqlite');\n\n try {\n await currentExecutor().execute({\n sql: `DELETE FROM ${table} ${whereClause}`,\n args: values,\n });\n\n // SQLite doesn't reliably return affected rows, so we can't provide an exact count\n return { operation: 'delete', affected: 1 };\n } catch (e) {\n throw new DatabaseError('Failed to delete records from table', {\n table,\n where,\n originalError: e,\n });\n }\n };\n\n /**\n * Counts records in a table matching the where criteria\n *\n * @param table - Table name\n * @param where - Criteria to match records (optional, counts all if omitted)\n * @returns Promise resolving to count of matching records\n * @throws Error if the count operation fails\n */\n const count = async (\n table: string,\n where?: Record<string, any>,\n ): Promise<number> => {\n validateTableName(table);\n\n try {\n if (!where || Object.keys(where).length === 0) {\n // Count all records. Built as a plain string rather than through the\n // `pluck` tagged template, which would bind the table name as a\n // parameter and emit `SELECT COUNT(*) FROM ?`. Interpolating the\n // identifier is safe because validateTableName ran above.\n const result = await currentExecutor().execute({\n sql: `SELECT COUNT(*) as count FROM ${table}`,\n args: [],\n });\n return toSafeSqliteCount(result.rows[0]?.count);\n }\n\n // Count with conditions\n const { sql: whereClause, values } = buildWhere(where, 1, 'sqlite');\n\n const result = await currentExecutor().execute({\n sql: `SELECT COUNT(*) as count FROM ${table} ${whereClause}`,\n args: values,\n });\n\n return toSafeSqliteCount(result.rows[0]?.count);\n } catch (e) {\n if (e instanceof DatabaseError) throw e;\n throw new DatabaseError('Failed to count records in table', {\n table,\n where,\n originalError: e,\n });\n }\n };\n\n /**\n * Checks if a table exists in the database\n *\n * @param tableName - Name of the table to check\n * @returns Promise resolving to boolean indicating if the table exists\n */\n const tableExists = async (tableName: string): Promise<boolean> => {\n const tableExists =\n !!(await pluck`SELECT name FROM sqlite_master WHERE type='table' AND name=${tableName}`);\n return tableExists;\n };\n\n /**\n * Synchronizes database schema with provided SQL DDL\n * Creates tables if they don't exist and adds missing columns\n *\n * @param schema - SQL schema definition with CREATE TABLE statements\n * @returns Promise that resolves when schema is synchronized\n */\n const syncSchema = async (schema: string): Promise<void> => {\n console.log(\n '[sqlite.syncSchema] Starting schema sync for dbid:',\n options.dbid,\n );\n console.log('[sqlite.syncSchema] Schema length:', schema.length, 'chars');\n\n // List of SQL reserved keywords that need to stay quoted\n const reservedKeywords = new Set([\n 'references',\n 'order',\n 'group',\n 'table',\n 'index',\n 'select',\n 'from',\n 'where',\n 'join',\n 'left',\n 'right',\n 'inner',\n 'outer',\n 'on',\n 'as',\n 'and',\n 'or',\n 'not',\n 'like',\n 'in',\n 'between',\n 'case',\n 'when',\n 'then',\n 'else',\n 'end',\n 'union',\n 'distinct',\n 'having',\n 'limit',\n 'offset',\n 'default',\n 'check',\n 'unique',\n 'primary',\n 'foreign',\n 'key',\n 'constraint',\n 'cascade',\n ]);\n\n // Normalize whitespace and simplify CAST expressions\n let normalizedSchema = schema\n .replace(/\\s+/g, ' ') // Replace multiple whitespace with single space\n .replace(/DEFAULT CAST\\(([^)]+)\\s+AS\\s+\\w+\\)/gi, 'DEFAULT $1') // Simplify CAST in DEFAULT clauses\n .trim();\n\n // Remove quotes around identifiers EXCEPT for reserved keywords\n normalizedSchema = normalizedSchema.replace(\n /\"(\\w+)\"/g,\n (match, identifier) => {\n return reservedKeywords.has(identifier.toLowerCase())\n ? match\n : identifier;\n },\n );\n\n console.log('[sqlite.syncSchema] Normalized schema:', normalizedSchema);\n\n // Split into individual commands\n const commands = normalizedSchema\n .split(';')\n .map((cmd) => cmd.trim())\n .filter((cmd) => cmd.length > 0);\n\n console.log(\n '[sqlite.syncSchema] Found',\n commands.length,\n 'commands to process',\n );\n\n // Execute each command\n for (const command of commands) {\n try {\n console.log(\n '[sqlite.syncSchema] Executing:',\n `${command.substring(0, 50)}...`,\n );\n await currentExecutor().execute(command);\n console.log('[sqlite.syncSchema] Successfully executed command');\n } catch (error) {\n console.error(\n '[sqlite.syncSchema] Failed to execute command:',\n command,\n );\n console.error('[sqlite.syncSchema] Error:', error);\n throw error;\n }\n }\n };\n\n /**\n * Coordinates nested savepoints for one enclosing transaction.\n *\n * SQLite permits nesting, but releasing an earlier sibling savepoint while\n * a later sibling is open destroys the later savepoint. Each scope owns a\n * child queue; the root drain also keeps un-awaited accepted children alive\n * until the enclosing commit or rollback.\n */\n type NestedTransaction = (<T>(\n callback: (tx: DatabaseInterface) => Promise<T>,\n ) => Promise<T>) & {\n drain: () => Promise<void>;\n runOperation: <T>(operation: () => Promise<T>) => Promise<T>;\n runNested: <T>(\n callback: (tx: DatabaseInterface) => Promise<T>,\n ) => Promise<T>;\n };\n\n type TransactionOperationRunner = <T>(\n operation: () => Promise<T>,\n ) => Promise<T>;\n\n type NestedTransactionRunner = <T>(\n callback: (tx: DatabaseInterface) => Promise<T>,\n ) => Promise<T>;\n\n interface TransactionScope {\n database: DatabaseInterface;\n sealAndDrain: () => Promise<void>;\n }\n\n const createNestedTransaction = (\n transactionClient: SqliteExecutor,\n ): NestedTransaction => {\n interface NestedScope {\n accepting: boolean;\n tail: Promise<void>;\n children: Set<PromiseObservation & { error?: unknown }>;\n }\n const scopeContext = new AsyncLocalStorage<NestedScope>();\n const rootScope: NestedScope = {\n accepting: true,\n tail: Promise.resolve(),\n children: new Set(),\n };\n\n const enqueueInScope = <T>(\n scope: NestedScope,\n operation: () => Promise<T>,\n ): Promise<T> => {\n if (!scope.accepting) {\n return Promise.reject(\n new DatabaseError('Nested transaction scope is ending', {}),\n );\n }\n const current = scope.tail.then(operation);\n scope.tail = current.then(\n () => undefined,\n () => undefined,\n );\n return current;\n };\n\n const assertBoundScope = (scope: NestedScope): void => {\n const ambientScope = scopeContext.getStore();\n if (ambientScope && ambientScope !== scope) {\n throw new DatabaseError(\n 'A parent transaction handle cannot run inside a nested transaction callback',\n {\n hint: 'Use the nested callback transaction handle, or wait for the nested transaction to settle before using its parent handle.',\n },\n );\n }\n };\n\n const runBoundOperation = <T>(\n scope: NestedScope,\n operation: () => Promise<T>,\n ): Promise<T> => {\n try {\n assertBoundScope(scope);\n return enqueueInScope(scope, operation);\n } catch (error) {\n return Promise.reject(error);\n }\n };\n\n const drainNestedScope = async (scope: NestedScope): Promise<void> => {\n await scope.tail;\n while (\n expandPromiseObservations(scope.children).some(\n (child) => child.handlers.size > 0,\n )\n ) {\n await Promise.all(\n expandPromiseObservations(scope.children).flatMap((child) => [\n ...child.handlers,\n ]),\n );\n }\n await settleNativePromiseTransfers(scope.children);\n const failures = expandPromiseObservations(scope.children)\n .filter((child) => !child.observed && 'error' in child)\n .map((child) => child.error);\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1) {\n throw new AggregateError(\n failures,\n 'Accepted nested transactions failed',\n );\n }\n };\n\n const runScope = async <T>(\n scope: NestedScope,\n callback: (tx: DatabaseInterface) => Promise<T>,\n ): Promise<T> => {\n savepointSequence += 1;\n const name = `hv_sp_${savepointSequence}`;\n await transactionClient.execute({\n sql: `SAVEPOINT ${name}`,\n args: [],\n });\n const callbackScope = createTransactionScope(\n transactionClient,\n nestedTransaction,\n (operation) => runBoundOperation(scope, operation),\n (nestedCallback) => {\n try {\n assertBoundScope(scope);\n return startNested(scope, nestedCallback);\n } catch (error) {\n return Promise.reject(error);\n }\n },\n );\n const drainScope = async (): Promise<void> => {\n await callbackScope.sealAndDrain();\n // A rejected sibling must not let a later queued savepoint outlive\n // this scope.\n await drainNestedScope(scope);\n };\n try {\n const result = await callback(callbackScope.database);\n scope.accepting = false;\n await drainScope();\n await transactionClient.execute({\n sql: `RELEASE SAVEPOINT ${name}`,\n args: [],\n });\n return result;\n } catch (error) {\n scope.accepting = false;\n let failure = error;\n try {\n await drainScope();\n } catch (drainError) {\n if (drainError !== error) {\n failure = combineTransactionFailures(error, drainError);\n }\n }\n try {\n await transactionClient.execute({\n sql: `ROLLBACK TO SAVEPOINT ${name}`,\n args: [],\n });\n await transactionClient.execute({\n sql: `RELEASE SAVEPOINT ${name}`,\n args: [],\n });\n } catch (teardownError) {\n if (teardownError !== failure) {\n failure = combineTransactionFailures(failure, teardownError);\n }\n }\n throw failure;\n }\n };\n\n const startNested = <T>(\n parentScope: NestedScope,\n callback: (tx: DatabaseInterface) => Promise<T>,\n ): Promise<T> => {\n if (!parentScope.accepting) {\n return Promise.reject(\n new DatabaseError('Nested transaction scope is ending', {}),\n );\n }\n const scope: NestedScope = {\n accepting: true,\n tail: Promise.resolve(),\n children: new Set(),\n };\n const child = {\n observed: false,\n handlers: new Set<Promise<void>>(),\n nativeTransfers: new Set<unknown>(),\n unhandledNativeTransfers: new Set<unknown>(),\n nativeCorrelationIds: new Set<number>(),\n } as PromiseObservation;\n parentScope.children.add(child);\n const current = enqueueInScope(parentScope, () =>\n scopeContext.run(scope, () => runScope(scope, callback)),\n );\n void current.catch((error) => {\n child.error = error;\n });\n // Preserve rejection observation through fulfillment-only `.then()`\n // and `.finally()` chains. Only a rejection handler (including the one\n // installed by `await`) makes a failed savepoint recoverable.\n return withRejectionObservation(current, child);\n };\n\n const nestedTransaction = (<T>(\n callback: (tx: DatabaseInterface) => Promise<T>,\n ): Promise<T> =>\n startNested(\n scopeContext.getStore() ?? rootScope,\n callback,\n )) as NestedTransaction;\n nestedTransaction.drain = () => {\n rootScope.accepting = false;\n return drainNestedScope(rootScope);\n };\n nestedTransaction.runOperation = <T>(\n operation: () => Promise<T>,\n ): Promise<T> => runBoundOperation(rootScope, operation);\n nestedTransaction.runNested = <T>(\n callback: (tx: DatabaseInterface) => Promise<T>,\n ): Promise<T> => {\n try {\n assertBoundScope(rootScope);\n return startNested(rootScope, callback);\n } catch (error) {\n return Promise.reject(error);\n }\n };\n return nestedTransaction;\n };\n\n /**\n * Executes a callback within a database transaction\n * Automatically commits on success or rolls back on error\n *\n * @param callback - Function to execute within transaction\n * @returns Promise resolving to callback result\n */\n const transaction = async <T>(\n callback: (tx: DatabaseInterface) => Promise<T>,\n preAcquiredLock?: Promise<() => void>,\n ): Promise<T> => {\n // Held across the whole BEGIN … COMMIT/ROLLBACK span. Without it two\n // overlapping calls raced on the one connection: the second BEGIN threw,\n // its catch ran ROLLBACK, and that rollback ended the *first*\n // transaction — half of its writes durable, half lost, and its promise\n // rejected, so the caller was told nothing had happened.\n const releaseConnection = await (preAcquiredLock ??\n connectionLock.acquire());\n try {\n if (client.transactionReservation !== 'exclusive') {\n let nestedTransaction: NestedTransaction | undefined;\n let transactionScope: TransactionScope | undefined;\n try {\n await client.execute({ sql: 'BEGIN TRANSACTION', args: [] });\n nestedTransaction = createNestedTransaction(client);\n transactionScope = createTransactionScope(\n client,\n nestedTransaction,\n );\n const activeScope = transactionScope;\n const result = await transactionCallbackContext.run(true, () =>\n callback(activeScope.database),\n );\n await transactionScope.sealAndDrain();\n await nestedTransaction.drain();\n await client.execute({ sql: 'COMMIT', args: [] });\n return result;\n } catch (error) {\n let failure = error;\n try {\n await transactionScope?.sealAndDrain();\n } catch (drainError) {\n if (drainError !== error) {\n failure = combineTransactionFailures(failure, drainError);\n }\n }\n try {\n await nestedTransaction?.drain();\n } catch (drainError) {\n if (drainError !== failure) {\n failure = combineTransactionFailures(failure, drainError);\n }\n }\n try {\n await client.execute({ sql: 'ROLLBACK', args: [] });\n } catch {\n // Nothing left to roll back.\n }\n throw failure;\n }\n }\n\n const transactionClient = await client.transaction('write');\n let nestedTransaction: NestedTransaction | undefined;\n let transactionScope: TransactionScope | undefined;\n try {\n nestedTransaction = createNestedTransaction(transactionClient);\n transactionScope = createTransactionScope(\n transactionClient,\n nestedTransaction,\n );\n const activeScope = transactionScope;\n const result = await transactionCallbackContext.run(true, () =>\n callback(activeScope.database),\n );\n await transactionScope.sealAndDrain();\n await nestedTransaction.drain();\n await transactionClient.commit();\n return result;\n } catch (error) {\n let failure = error;\n try {\n await transactionScope?.sealAndDrain();\n } catch (drainError) {\n if (drainError !== error) {\n failure = combineTransactionFailures(failure, drainError);\n }\n }\n try {\n await nestedTransaction?.drain();\n } catch (drainError) {\n if (drainError !== failure) {\n failure = combineTransactionFailures(failure, drainError);\n }\n }\n // A failing ROLLBACK must not replace the caller's error — SQLite\n // reports \"cannot rollback - no transaction is active\" whenever the\n // transaction is already gone, which says nothing about what failed.\n if (!transactionClient.closed) {\n try {\n await transactionClient.rollback();\n } catch (rollbackError) {\n failure = combineTransactionFailures(failure, rollbackError);\n }\n }\n throw failure;\n } finally {\n transactionClient.close();\n }\n } finally {\n releaseConnection();\n }\n };\n\n /**\n * Builds the transaction-scoped interface handed to a transaction callback.\n *\n * The only difference from the top-level interface is `transaction`: this\n * one re-enters the transaction already in progress under a savepoint\n * instead of issuing a second BEGIN. SQLite shares one connection, so the\n * old behaviour of re-exposing the top-level `transaction` sent a nested\n * call into `BEGIN` on a connection that was already in a transaction; that\n * throws, and the nested call's own ROLLBACK then discarded the *enclosing*\n * transaction's work while later writes silently committed in autocommit.\n */\n const createTransactionScope = (\n transactionClient: SqliteExecutor,\n nestedTransaction: NestedTransaction,\n runOperation: TransactionOperationRunner = nestedTransaction.runOperation,\n runNested: NestedTransactionRunner = nestedTransaction.runNested,\n ): TransactionScope => {\n const isSecureTransaction = client.transactionReservation === 'exclusive';\n const scopedExecutor: SqliteExecutor = isSecureTransaction\n ? {\n execute: (statement: any) => {\n return transactionClient.execute(\n prepareManagedStatement(statement),\n );\n },\n }\n : transactionClient;\n let accepting = true;\n const pending = new Set<Promise<unknown>>();\n const operations = new Set<PromiseObservation & { error?: unknown }>();\n let drainPromise: Promise<void> | undefined;\n const bind = <T extends (...args: any[]) => Promise<any>>(\n fn: T,\n trackFailure = true,\n ): T =>\n ((...args: Parameters<T>) => {\n if (!accepting) {\n return Promise.reject(\n new DatabaseError('Transaction scope is ending or ended', {}),\n );\n }\n const run = () =>\n Promise.resolve(\n executorContext.run(scopedExecutor, () => fn(...args)),\n );\n const operation = isSecureTransaction ? runOperation(run) : run();\n const tracked = {\n observed: false,\n handlers: new Set<Promise<void>>(),\n nativeTransfers: new Set<unknown>(),\n unhandledNativeTransfers: new Set<unknown>(),\n nativeCorrelationIds: new Set<number>(),\n } as PromiseObservation;\n operations.add(tracked);\n pending.add(operation);\n void operation.then(\n () => pending.delete(operation),\n (error) => {\n pending.delete(operation);\n if (trackFailure) tracked.error = error;\n },\n );\n return withRejectionObservation(operation, tracked);\n }) as T;\n const scopedInsert = bind(insert);\n const scopedGet = bind(get);\n const scopedList = bind(list);\n const scopedUpdate = bind(update);\n const scopedUpsert = bind(upsertInCurrentTransaction);\n const scopedGetOrInsert = bind(getOrInsert);\n const scopedDelete = bind(deleteRecords);\n const scopedCount = bind(count);\n const scopedMany = bind(many);\n const scopedSingle = bind(single);\n const scopedPluck = bind(pluck);\n const scopedExecute = bind(execute);\n const scopedQuery = bind(query);\n const scopedTableExists = bind(tableExists);\n const scopedSyncSchema = bind(syncSchema);\n const scopedTable = (tableName: string): TableInterface => {\n if (!accepting) {\n const reject = () =>\n Promise.reject(\n new DatabaseError('Transaction scope is ending or ended', {}),\n );\n return { insert: reject, get: reject, list: reject };\n }\n return {\n insert: (data) => scopedInsert(tableName, data),\n get: (where) => scopedGet(tableName, where),\n list: (where) => scopedList(tableName, where),\n };\n };\n\n // Do not assimilate the coordinator's observation-aware thenable here.\n // Awaited/caught savepoint rollback is recoverable; detached failure is\n // retained by the nested coordinator and propagated during root drain.\n const scopedTransaction = (<T>(\n callback: (tx: DatabaseInterface) => Promise<T>,\n ): Promise<T> => {\n if (!accepting) {\n return Promise.reject(\n new DatabaseError('Transaction scope is ending or ended', {}),\n );\n }\n return executorContext.run(scopedExecutor, () => runNested(callback));\n }) as typeof nestedTransaction;\n\n const scopedClient = {\n transactionReservation: 'exclusive' as const,\n execute: bind((statement: any) => scopedExecutor.execute(statement)),\n transaction: () =>\n Promise.reject(\n new DatabaseError(\n 'Use the transaction scope transaction() method instead of client.transaction()',\n {},\n ),\n ),\n close: () =>\n Promise.reject(\n new DatabaseError(\n 'Transaction-scoped SQLite clients cannot be closed directly',\n {},\n ),\n ),\n };\n\n const txDb: DatabaseInterface = {\n url,\n client:\n client.transactionReservation === 'exclusive'\n ? scopedClient\n : transactionClient,\n insert: scopedInsert,\n get: scopedGet,\n list: scopedList,\n update: scopedUpdate,\n upsert: scopedUpsert,\n getOrInsert: scopedGetOrInsert,\n delete: scopedDelete,\n count: scopedCount,\n table: scopedTable,\n many: scopedMany,\n single: scopedSingle,\n pluck: scopedPluck,\n execute: scopedExecute,\n query: scopedQuery,\n oo: scopedMany,\n oO: scopedSingle,\n ox: scopedPluck,\n xx: scopedExecute,\n tableExists: scopedTableExists,\n syncSchema: scopedSyncSchema,\n transaction: scopedTransaction,\n };\n\n return {\n database: txDb,\n sealAndDrain: async () => {\n accepting = false;\n drainPromise ??= (async () => {\n while (pending.size > 0) {\n await Promise.allSettled([...pending]);\n }\n while (\n expandPromiseObservations(operations).some(\n (entry) => entry.handlers.size > 0,\n )\n ) {\n await Promise.all(\n expandPromiseObservations(operations).flatMap((entry) => [\n ...entry.handlers,\n ]),\n );\n }\n await settleNativePromiseTransfers(operations);\n const failures = expandPromiseObservations(operations)\n .filter(\n (operation) => !operation.observed && 'error' in operation,\n )\n .map((operation) => operation.error);\n if (failures.length === 1) throw failures[0];\n if (failures.length > 1) {\n throw new AggregateError(\n failures,\n 'Accepted transaction operations failed',\n );\n }\n })();\n return drainPromise;\n },\n };\n };\n\n /**\n * Begins a new transaction and returns a handle for manual control\n *\n * Unlike transaction(), this gives you explicit control over commit/rollback.\n * Ideal for test isolation where you want to rollback after each test.\n *\n * @returns Promise resolving to a TransactionHandle\n */\n const beginTransaction = async (\n preAcquiredLock?: Promise<() => void>,\n ): Promise<TransactionHandle> => {\n // The handle owns the connection until the caller ends it, so the lock\n // is held across the gap rather than around a single call. A handle that\n // is never committed or rolled back therefore blocks every later\n // transaction until the queue timeout reports it.\n const releaseConnection = await (preAcquiredLock ??\n connectionLock.acquire());\n let transactionClient: SqliteTransactionClientLike | undefined;\n try {\n if (client.transactionReservation === 'exclusive') {\n transactionClient = await client.transaction('write');\n } else {\n await client.execute({ sql: 'BEGIN TRANSACTION', args: [] });\n }\n } catch (error) {\n // No transaction was opened, so there is no handle to end it and\n // nothing left to release the connection.\n releaseConnection();\n throw error;\n }\n\n let active = true;\n let nestedTransaction: NestedTransaction | undefined;\n let transactionScope: TransactionScope | undefined;\n\n // COMMIT and ROLLBACK can both throw, and the transaction is over either\n // way, so the connection goes back before the error is rethrown.\n const end = async (command: 'COMMIT' | 'ROLLBACK'): Promise<void> => {\n if (!active) {\n throw new DatabaseError('Transaction already ended', {});\n }\n active = false;\n try {\n let drainFailure: unknown;\n try {\n await transactionScope?.sealAndDrain();\n } catch (error) {\n drainFailure = error;\n }\n try {\n await nestedTransaction?.drain();\n } catch (error) {\n drainFailure = drainFailure\n ? combineTransactionFailures(drainFailure, error)\n : error;\n }\n if (drainFailure) throw drainFailure;\n if (transactionClient) {\n if (command === 'COMMIT') {\n await transactionClient.commit();\n } else {\n await transactionClient.rollback();\n }\n } else {\n await client.execute({ sql: command, args: [] });\n }\n } catch (error) {\n // COMMIT can fail and leave the transaction *open* — SQLite documents\n // exactly that for SQLITE_BUSY. Releasing the connection then would hand\n // the next queued caller a connection still inside a transaction: its\n // BEGIN would throw, and its catch would ROLLBACK, discarding this\n // transaction's work. So normalize before releasing, the way the pooled\n // adapter's discardTxClient does.\n let failure = error;\n if (transactionClient && !transactionClient.closed) {\n try {\n await transactionClient.rollback();\n } catch (rollbackError) {\n failure = combineTransactionFailures(failure, rollbackError);\n }\n } else if (!transactionClient) {\n try {\n await client.execute({ sql: 'ROLLBACK', args: [] });\n } catch (rollbackError) {\n failure = combineTransactionFailures(failure, rollbackError);\n }\n }\n throw failure;\n } finally {\n transactionClient?.close();\n releaseConnection();\n }\n };\n\n const commit = (): Promise<void> => end('COMMIT');\n\n const rollback = (): Promise<void> => end('ROLLBACK');\n\n const isActive = (): boolean => active;\n\n // Create a transaction-scoped database interface with commit/rollback.\n // The handle is inside a transaction for the same reason a callback scope\n // is, so it gets the same savepoint-based nesting rather than the\n // top-level `transaction`.\n const executor = transactionClient ?? client;\n nestedTransaction = createNestedTransaction(executor);\n transactionScope = createTransactionScope(executor, nestedTransaction);\n const txHandle: TransactionHandle = {\n ...transactionScope.database,\n commit,\n rollback,\n isActive,\n };\n\n return txHandle;\n };\n\n /**\n * Creates a table-specific interface for simplified table operations\n *\n * @param tableName - Table name\n * @returns TableInterface for the specified table\n */\n const table = (tableName: string): TableInterface => ({\n insert: (data) => insert(tableName, data),\n get: (where) => get(tableName, where),\n list: (where) => list(tableName, where),\n });\n\n /**\n * Parses a tagged template literal into a SQL query and values\n *\n * @param strings - Template strings\n * @param vars - Variables to interpolate into the query\n * @returns Object with SQL query and values array\n */\n const parseTemplate = (strings: TemplateStringsArray, ...vars: any[]) => {\n let sql = strings[0];\n const values = [];\n for (let i = 0; i < vars.length; i++) {\n values.push(vars[i]);\n sql += `?${strings[i + 1]}`;\n }\n return { sql, values };\n };\n\n /**\n * Executes a SQL query using template literals and returns a single value\n *\n * @param strings - Template strings\n * @param vars - Variables to interpolate into the query\n * @returns Promise resolving to a single value (first column of first row)\n * @throws Error if the query fails\n */\n const pluck = async (\n strings: TemplateStringsArray,\n ...vars: any[]\n ): Promise<any> => {\n const { sql, values } = parseTemplate(strings, ...vars);\n try {\n const result = await currentExecutor().execute({ sql, args: values });\n return result.rows[0]?.[Object.keys(result.rows[0])[0]] ?? null;\n } catch (e) {\n throw new DatabaseError('Failed to execute pluck query', {\n sql,\n values,\n originalError: formatDbError(e),\n });\n }\n };\n\n /**\n * Executes a SQL query using template literals and returns a single row\n *\n * @param strings - Template strings\n * @param vars - Variables to interpolate into the query\n * @returns Promise resolving to a single result record or null\n * @throws Error if the query fails\n */\n const single = async (\n strings: TemplateStringsArray,\n ...vars: any[]\n ): Promise<Record<string, any> | null> => {\n const { sql, values } = parseTemplate(strings, ...vars);\n try {\n const result = await currentExecutor().execute({ sql, args: values });\n return result.rows[0] || null;\n } catch (e) {\n throw new DatabaseError('Failed to execute single query', {\n sql,\n values,\n originalError: formatDbError(e),\n });\n }\n };\n\n /**\n * Executes a SQL query using template literals and returns multiple rows\n *\n * @param strings - Template strings\n * @param vars - Variables to interpolate into the query\n * @returns Promise resolving to array of result records\n * @throws Error if the query fails\n */\n const many = async (\n strings: TemplateStringsArray,\n ...vars: any[]\n ): Promise<Record<string, any>[]> => {\n const { sql, values } = parseTemplate(strings, ...vars);\n try {\n const result = await currentExecutor().execute({ sql, args: values });\n return result.rows;\n } catch (e) {\n throw new DatabaseError('Failed to execute many query', {\n sql,\n values,\n originalError: formatDbError(e),\n });\n }\n };\n\n /**\n * Executes a SQL query using template literals without returning results\n *\n * @param strings - Template strings\n * @param vars - Variables to interpolate into the query\n * @returns Promise that resolves when the query completes\n * @throws Error if the query fails\n */\n const execute = async (\n strings: TemplateStringsArray,\n ...vars: any[]\n ): Promise<void> => {\n const { sql, values } = parseTemplate(strings, ...vars);\n try {\n await currentExecutor().execute({ sql, args: values });\n } catch (e) {\n throw new DatabaseError('Failed to execute query', {\n sql,\n values,\n originalError: formatDbError(e),\n });\n }\n };\n\n /**\n * Executes a raw SQL query with parameterized values\n *\n * @param str - SQL query string\n * @param values - Variables to use as parameters\n * @returns Promise resolving to query result with rows and metadata\n * @throws Error if the query fails\n */\n const query = async (str: string, ...values: any[]) => {\n const sql = str;\n const args = Array.isArray(values[0]) ? values[0] : values;\n try {\n const result = await currentExecutor().execute({ sql, args });\n return {\n command: sql.split(' ')[0].toUpperCase(),\n rowCount: result.rowsAffected ?? result.rows.length,\n oid: null,\n fields: Object.keys(result.rows[0] || {}).map((name) => ({\n name,\n tableID: 0,\n columnID: 0,\n dataTypeID: 0,\n dataTypeSize: -1,\n dataTypeModifier: -1,\n format: 'text',\n })),\n rows: result.rows,\n };\n } catch (e) {\n throw wrapDatabaseError('Failed to execute raw query', e, {\n sql,\n args,\n });\n }\n };\n\n // Shorthand aliases for query methods\n const oo = many; // (o)bjective-(o)bjects: returns multiple rows\n const oO = single; // (o)bjective-(O)bject: returns a single row\n const ox = pluck; // (o)bjective-(x): returns a single value\n const xx = execute; // (x)ecute-(x)ecute: executes without returning\n\n /**\n * Initialize database schemas from JSON manifest\n * Supports dependency resolution and schema overrides\n *\n * @param options - Schema initialization options\n * @returns Promise that resolves when schemas are initialized\n */\n const initializeSchemas = async (\n options: SchemaInitializationOptions,\n ): Promise<void> => {\n const schemaManager = new DatabaseSchemaManager();\n const currentDb: DatabaseInterface = {\n url,\n client,\n query,\n insert,\n update,\n upsert,\n get,\n list,\n getOrInsert,\n delete: deleteRecords,\n count,\n table,\n tableExists,\n many,\n single,\n pluck,\n execute,\n oo,\n oO,\n ox,\n xx,\n syncSchema,\n transaction,\n };\n\n await schemaManager.initializeSchemas(currentDb, options);\n };\n\n /**\n * Retrieves the schema information for a table\n *\n * @param table - Table name\n * @returns Promise resolving to table schema info or null if table doesn't exist\n * @throws Error if the query fails\n */\n const getTableSchema = async (\n table: string,\n ): Promise<TableSchemaInfo | null> => {\n validateTableName(table);\n\n try {\n // Check if table exists\n const exists = await tableExists(table);\n if (!exists) {\n return null;\n }\n\n // Get column information from pragma_table_info\n const columnRows =\n await many`SELECT * FROM pragma_table_info(${table})`;\n\n const columns: Record<string, ColumnDefinition> = {};\n for (const row of columnRows) {\n const colName = row.name as string;\n columns[colName] = {\n type: row.type as string,\n primaryKey: row.pk === 1,\n notNull: row.notnull === 1,\n defaultValue: row.dflt_value,\n };\n }\n\n // Get index information from sqlite_master\n const indexRows = await many`\n SELECT name, sql FROM sqlite_master\n WHERE type = 'index'\n AND tbl_name = ${table}\n AND name NOT LIKE 'sqlite_%'\n `;\n\n const indexes: IndexDefinition[] = [];\n for (const row of indexRows) {\n const indexName = row.name as string;\n\n // Get index columns from pragma_index_info\n const indexInfoRows =\n await many`SELECT * FROM pragma_index_info(${indexName})`;\n\n const indexColumns: string[] = [];\n for (const infoRow of indexInfoRows) {\n indexColumns.push(infoRow.name as string);\n }\n\n // Check if index is unique from pragma_index_list\n const indexListRow =\n await single`SELECT * FROM pragma_index_list(${table}) WHERE name = ${indexName}`;\n\n indexes.push({\n name: indexName,\n columns: indexColumns,\n unique: indexListRow?.unique === 1,\n });\n }\n\n // Get foreign key information from pragma_foreign_key_list\n const fkRows =\n await many`SELECT * FROM pragma_foreign_key_list(${table})`;\n\n const foreignKeys: Array<{\n column: string;\n referencesTable: string;\n referencesColumn: string;\n onDelete?: string;\n onUpdate?: string;\n }> = [];\n\n for (const fkRow of fkRows) {\n foreignKeys.push({\n column: fkRow.from as string,\n referencesTable: fkRow.table as string,\n referencesColumn: fkRow.to as string,\n onDelete: fkRow.on_delete as string | undefined,\n onUpdate: fkRow.on_update as string | undefined,\n });\n }\n\n return {\n tableName: table,\n columns,\n indexes,\n foreignKeys,\n };\n } catch (e) {\n throw new DatabaseError('Failed to retrieve table schema', {\n table,\n originalError: formatDbError(e),\n });\n }\n };\n\n /**\n * ALTER TABLE operations for schema evolution\n */\n const alterTable = {\n /**\n * Adds a new column to an existing table\n *\n * @param table - Table name\n * @param column - Column definition with name\n * @returns Promise that resolves when column is added\n * @throws Error if the alter operation fails\n */\n addColumn: async (\n table: string,\n column: ColumnDefinitionWithName,\n ): Promise<void> => {\n validateTableName(table);\n validateColumnName(column.name);\n\n let sql: string | undefined;\n try {\n sql = generateAddColumnStatement(table, column, 'sqlite');\n await currentExecutor().execute({ sql, args: [] });\n } catch (e) {\n throw wrapDatabaseError('Failed to add column to table', e, {\n table,\n column: column.name,\n ...(sql ? { sql } : {}),\n });\n }\n },\n\n /**\n * Adds a new index to an existing table\n *\n * @param table - Table name\n * @param index - Index definition\n * @returns Promise that resolves when index is created\n * @throws Error if the create index operation fails\n */\n addIndex: async (\n table: string,\n index: IndexDefinition,\n ): Promise<void> => {\n validateTableName(table);\n validateIndexName(index.name);\n\n for (const col of index.columns) {\n validateColumnName(col);\n }\n\n let sql: string | undefined;\n try {\n sql = generateCreateIndexStatement(table, index);\n await currentExecutor().execute({ sql, args: [] });\n } catch (e) {\n throw wrapDatabaseError('Failed to create index on table', e, {\n table,\n index: index.name,\n ...(sql ? { sql } : {}),\n });\n }\n },\n };\n\n let closed = false;\n const rawClose = async () => {\n if (closed) return;\n await client.close();\n closed = true;\n };\n const db: DatabaseInterface = {\n url,\n client,\n query,\n insert,\n update,\n upsert,\n get,\n list,\n getOrInsert,\n delete: deleteRecords,\n count,\n table,\n tableExists,\n many,\n single,\n pluck,\n execute,\n oo,\n oO,\n ox,\n xx,\n syncSchema,\n initializeSchemas,\n transaction,\n beginTransaction,\n getTableSchema,\n alterTable,\n close: rawClose,\n };\n\n if (client.transactionReservation !== 'exclusive') return db;\n\n const barrier = createInvocationBarrier();\n const managedRootExecutor: SqliteExecutor = {\n execute: (statement: any) => {\n return client.execute(prepareManagedStatement(statement));\n },\n };\n const rootCallbackError = (operation: 'close' | 'use'): DatabaseError =>\n operation === 'close'\n ? new DatabaseError(\n 'Cannot close the SQLite database from inside its active transaction callback',\n {\n hint: 'Finish the transaction callback before closing the database.',\n },\n )\n : new DatabaseError(\n 'Cannot use the root SQLite database from inside its active transaction callback',\n {\n hint: 'Use the transaction-scoped database passed to the callback.',\n },\n );\n const reservedClose = (): Promise<void> => {\n if (transactionCallbackContext.getStore() === true) {\n return Promise.reject(rootCallbackError('close'));\n }\n return barrier.close(async () => {\n if (connectionLock.held) {\n const releaseConnection = await connectionLock.acquire();\n releaseConnection();\n }\n await rawClose();\n });\n };\n const reserveManaged = <T extends (...args: any[]) => Promise<any>>(\n fn: T,\n ): T =>\n ((...args: Parameters<T>) => {\n if (transactionCallbackContext.getStore() === true) {\n return Promise.reject(rootCallbackError('use'));\n }\n const timeoutMs =\n options.transactionQueueTimeout ??\n DEFAULT_TRANSACTION_QUEUE_TIMEOUT_MS;\n let expired = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const deadline = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n expired = true;\n reject(\n new DatabaseError(\n `Timed out after ${timeoutMs}ms waiting for the sqlite connection's current operation to finish`,\n { adapter: 'sqlite', timeoutMs },\n ),\n );\n }, timeoutMs);\n });\n const queued = barrier.run(async () => {\n if (expired) return deadline;\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n if (connectionLock.held) {\n const releaseConnection = await connectionLock.acquire();\n releaseConnection();\n }\n return executorContext.run(managedRootExecutor, () => fn(...args));\n });\n return Promise.race([queued, deadline]).finally(() => {\n if (timer) clearTimeout(timer);\n });\n }) as T;\n const reservedTable = (tableName: string): TableInterface => {\n const scoped = table(tableName);\n return {\n insert: reserveManaged(scoped.insert),\n get: reserveManaged(scoped.get),\n list: reserveManaged(scoped.list),\n };\n };\n const reservedAlterTable = {\n addColumn: reserveManaged(alterTable.addColumn),\n addIndex: reserveManaged(alterTable.addIndex),\n };\n const reserveTransactionEntry = <T>(\n work: (preAcquiredLock: Promise<() => void>) => Promise<T>,\n ): Promise<T> => {\n if (transactionCallbackContext.getStore() === true) {\n return Promise.reject(rootCallbackError('use'));\n }\n // Start the deadline at invocation, but do not enqueue on connectionLock\n // until this call reaches its barrier turn. Speculatively taking the\n // connection while an earlier retrying upsert owns the barrier reverses\n // the normal connection -> nullable-key order and deadlocks both calls.\n const timeoutMs =\n options.transactionQueueTimeout ?? DEFAULT_TRANSACTION_QUEUE_TIMEOUT_MS;\n let expired = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n const deadline = new Promise<never>((_, reject) => {\n timer = setTimeout(() => {\n expired = true;\n reject(\n new DatabaseError(\n `Timed out after ${timeoutMs}ms waiting for the sqlite connection's current transaction to finish`,\n { adapter: 'sqlite', timeoutMs },\n ),\n );\n }, timeoutMs);\n });\n const queued = barrier.run(async () => {\n if (expired) return deadline;\n const acquisition = connectionLock.acquire();\n try {\n const release = await Promise.race([acquisition, deadline]);\n if (expired) {\n release();\n return deadline;\n }\n // transactionQueueTimeout bounds only queue acquisition. Once this\n // invocation owns the connection, its callback/handle lifetime is\n // governed by the caller and must not be rejected by the old wait\n // deadline while it is actively doing work.\n if (timer) {\n clearTimeout(timer);\n timer = undefined;\n }\n return work(Promise.resolve(release));\n } catch (error) {\n // A deadline can win while acquire() remains queued. Give that future\n // turn back immediately so a timed-out invocation never runs later or\n // strands callers behind it.\n if (expired)\n void acquisition.then(\n (release) => release(),\n () => {},\n );\n throw error;\n }\n });\n return Promise.race([queued, deadline]).finally(() => {\n if (timer) clearTimeout(timer);\n });\n };\n const reservedTransaction: typeof transaction = <T>(\n callback: (tx: DatabaseInterface) => Promise<T>,\n ) =>\n reserveTransactionEntry((preAcquiredLock) =>\n transaction(callback, preAcquiredLock),\n );\n const reservedBeginTransaction: typeof beginTransaction = () =>\n reserveTransactionEntry((preAcquiredLock) =>\n beginTransaction(preAcquiredLock),\n );\n const reservedClient = {\n transactionReservation: 'exclusive' as const,\n execute: reserveManaged(async (statement: any) => {\n return client.execute(prepareManagedStatement(statement));\n }),\n transaction: () =>\n Promise.reject(\n new DatabaseError(\n 'Use database.transaction() or database.beginTransaction() instead of client.transaction()',\n {},\n ),\n ),\n close: reservedClose,\n };\n\n return {\n ...db,\n client: reservedClient,\n query: reserveManaged(query),\n insert: reserveManaged(insert),\n update: reserveManaged(update),\n upsert: reserveManaged(upsert),\n get: reserveManaged(get),\n list: reserveManaged(list),\n getOrInsert: reserveManaged(getOrInsert),\n delete: reserveManaged(deleteRecords),\n count: reserveManaged(count),\n table: reservedTable,\n tableExists: reserveManaged(tableExists),\n many: reserveManaged(many),\n single: reserveManaged(single),\n pluck: reserveManaged(pluck),\n execute: reserveManaged(execute),\n oo: reserveManaged(oo),\n oO: reserveManaged(oO),\n ox: reserveManaged(ox),\n xx: reserveManaged(xx),\n syncSchema: reserveManaged(syncSchema),\n initializeSchemas: reserveManaged(initializeSchemas),\n transaction: reservedTransaction,\n beginTransaction: reservedBeginTransaction,\n getTableSchema: reserveManaged(getTableSchema),\n alterTable: reservedAlterTable,\n close: reservedClose,\n };\n })();\n}\n"],"mappings":"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"}
|
package/dist/chunks/{sqlite-connection-cache-CYThh9l5.js → sqlite-connection-cache-C_7rVisQ.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { l as ConnectionCache } from "./postgres-dialect-
|
|
1
|
+
import { l as ConnectionCache } from "./postgres-dialect-DIy5f5YR.js";
|
|
2
2
|
//#region src/shared/sqlite-connection-cache.ts
|
|
3
3
|
var sqliteConnectionCache = new ConnectionCache();
|
|
4
4
|
var sqliteCacheGroups = /* @__PURE__ */ new Map();
|
|
@@ -62,9 +62,9 @@ async function getCachedSqliteDatabase(path, options, create) {
|
|
|
62
62
|
};
|
|
63
63
|
if (db.client?.transactionReservation === "exclusive") db.client.close = db.close;
|
|
64
64
|
return db;
|
|
65
|
-
}, closeSqliteDatabase);
|
|
65
|
+
}, closeSqliteDatabase, async (db) => path !== "libsql" || db.client?.closed !== true);
|
|
66
66
|
}
|
|
67
67
|
//#endregion
|
|
68
68
|
export { getCachedSqliteDatabase as t };
|
|
69
69
|
|
|
70
|
-
//# sourceMappingURL=sqlite-connection-cache-
|
|
70
|
+
//# sourceMappingURL=sqlite-connection-cache-C_7rVisQ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite-connection-cache-
|
|
1
|
+
{"version":3,"file":"sqlite-connection-cache-C_7rVisQ.js","names":[],"sources":["../../src/shared/sqlite-connection-cache.ts"],"sourcesContent":["import { ConnectionCache } from './connection-cache';\nimport type { DatabaseInterface, DatabaseOptions } from './types';\n\nexport type SqliteAdapterPath = 'libsql' | 'native' | 'secure';\n\nconst sqliteConnectionCache = new ConnectionCache<DatabaseInterface>();\ntype SqliteCacheGroup = {\n barrier?: Promise<void>;\n failure?: unknown;\n hasFailure: boolean;\n};\nconst sqliteCacheGroups = new Map<string, SqliteCacheGroup>();\n\nconst cacheKey = (dbid: string, path: SqliteAdapterPath) =>\n `sqlite:${path}:${dbid}`;\n\nasync function closeSqliteDatabase(db: DatabaseInterface): Promise<void> {\n await db.close?.();\n}\n\nasync function clearSqliteCacheGroup(dbid: string): Promise<void> {\n const group = sqliteCacheGroups.get(dbid) ?? { hasFailure: false };\n sqliteCacheGroups.set(dbid, group);\n const previous = group.barrier;\n const barrier = (previous?.catch(() => {}) ?? Promise.resolve()).then(\n async () => {\n const results = await Promise.allSettled([\n sqliteConnectionCache.evict(\n cacheKey(dbid, 'libsql'),\n closeSqliteDatabase,\n ),\n sqliteConnectionCache.evict(\n cacheKey(dbid, 'native'),\n closeSqliteDatabase,\n ),\n sqliteConnectionCache.evict(\n cacheKey(dbid, 'secure'),\n closeSqliteDatabase,\n ),\n ]);\n const failures = results.filter(\n (result): result is PromiseRejectedResult =>\n result.status === 'rejected',\n );\n if (failures.length) {\n group.failure =\n failures.length === 1\n ? failures[0].reason\n : new AggregateError(\n failures.map((failure) => failure.reason),\n 'Multiple SQLite adapter paths failed to clear',\n );\n group.hasFailure = true;\n throw group.failure;\n }\n group.failure = undefined;\n group.hasFailure = false;\n },\n );\n group.barrier = barrier;\n try {\n await barrier;\n } finally {\n if (group.barrier === barrier) {\n group.barrier = undefined;\n if (!group.hasFailure) sqliteCacheGroups.delete(dbid);\n }\n }\n}\n\nasync function awaitSqliteCacheGroup(dbid: string): Promise<void> {\n const group = sqliteCacheGroups.get(dbid);\n if (!group) return;\n if (group.barrier) await group.barrier;\n if (group.hasFailure) throw group.failure;\n}\n\nexport async function getCachedSqliteDatabase(\n path: SqliteAdapterPath,\n options: DatabaseOptions,\n create: () => Promise<DatabaseInterface>,\n): Promise<DatabaseInterface> {\n const { dbid } = options;\n if (dbid && options.clearCache) {\n await clearSqliteCacheGroup(dbid);\n } else if (dbid) {\n await awaitSqliteCacheGroup(dbid);\n }\n\n return sqliteConnectionCache.getOrCreate(\n dbid ? cacheKey(dbid, path) : undefined,\n { ...options, clearCache: false },\n async () => {\n const db = await create();\n const originalClose = db.close?.bind(db);\n let closePromise: Promise<void> | undefined;\n db.close = async () => {\n if (!closePromise) {\n closePromise = originalClose?.() ?? Promise.resolve();\n }\n try {\n await closePromise;\n sqliteConnectionCache.forget(db);\n } catch (error) {\n closePromise = undefined;\n throw error;\n }\n };\n // Secure SQLite exposes a guarded public client.close() seam. Route it\n // through the same cache-aware close boundary so a direct client close\n // cannot leave a closed adapter cached under an explicit dbid.\n if ((db.client as any)?.transactionReservation === 'exclusive') {\n (db.client as any).close = db.close;\n }\n return db;\n },\n closeSqliteDatabase,\n async (db) =>\n path !== 'libsql' || (db.client as { closed?: boolean })?.closed !== true,\n );\n}\n"],"mappings":";;AAKA,IAAM,wBAAwB,IAAI,gBAAmC;AAMrE,IAAM,oCAAoB,IAAI,IAA8B;AAE5D,IAAM,YAAY,MAAc,SAC9B,UAAU,KAAK,GAAG;AAEpB,eAAe,oBAAoB,IAAsC;CACvE,MAAM,GAAG,QAAQ;AACnB;AAEA,eAAe,sBAAsB,MAA6B;CAChE,MAAM,QAAQ,kBAAkB,IAAI,IAAI,KAAK,EAAE,YAAY,MAAM;CACjE,kBAAkB,IAAI,MAAM,KAAK;CAEjC,MAAM,WADW,MAAM,SACI,YAAY,CAAC,CAAC,KAAK,QAAQ,QAAQ,EAAA,CAAG,KAC/D,YAAY;EAeV,MAAM,YAAW,MAdK,QAAQ,WAAW;GACvC,sBAAsB,MACpB,SAAS,MAAM,QAAQ,GACvB,mBACF;GACA,sBAAsB,MACpB,SAAS,MAAM,QAAQ,GACvB,mBACF;GACA,sBAAsB,MACpB,SAAS,MAAM,QAAQ,GACvB,mBACF;EACF,CAAC,EAAA,CACwB,QACtB,WACC,OAAO,WAAW,UACtB;EACA,IAAI,SAAS,QAAQ;GACnB,MAAM,UACJ,SAAS,WAAW,IAChB,SAAS,EAAE,CAAC,SACZ,IAAI,eACF,SAAS,KAAK,YAAY,QAAQ,MAAM,GACxC,+CACF;GACN,MAAM,aAAa;GACnB,MAAM,MAAM;EACd;EACA,MAAM,UAAU,KAAA;EAChB,MAAM,aAAa;CACrB,CACF;CACA,MAAM,UAAU;CAChB,IAAI;EACF,MAAM;CACR,UAAU;EACR,IAAI,MAAM,YAAY,SAAS;GAC7B,MAAM,UAAU,KAAA;GAChB,IAAI,CAAC,MAAM,YAAY,kBAAkB,OAAO,IAAI;EACtD;CACF;AACF;AAEA,eAAe,sBAAsB,MAA6B;CAChE,MAAM,QAAQ,kBAAkB,IAAI,IAAI;CACxC,IAAI,CAAC,OAAO;CACZ,IAAI,MAAM,SAAS,MAAM,MAAM;CAC/B,IAAI,MAAM,YAAY,MAAM,MAAM;AACpC;AAEA,eAAsB,wBACpB,MACA,SACA,QAC4B;CAC5B,MAAM,EAAE,SAAS;CACjB,IAAI,QAAQ,QAAQ,YAClB,MAAM,sBAAsB,IAAI;MAC3B,IAAI,MACT,MAAM,sBAAsB,IAAI;CAGlC,OAAO,sBAAsB,YAC3B,OAAO,SAAS,MAAM,IAAI,IAAI,KAAA,GAC9B;EAAE,GAAG;EAAS,YAAY;CAAM,GAChC,YAAY;EACV,MAAM,KAAK,MAAM,OAAO;EACxB,MAAM,gBAAgB,GAAG,OAAO,KAAK,EAAE;EACvC,IAAI;EACJ,GAAG,QAAQ,YAAY;GACrB,IAAI,CAAC,cACH,eAAe,gBAAgB,KAAK,QAAQ,QAAQ;GAEtD,IAAI;IACF,MAAM;IACN,sBAAsB,OAAO,EAAE;GACjC,SAAS,OAAO;IACd,eAAe,KAAA;IACf,MAAM;GACR;EACF;EAIA,IAAK,GAAG,QAAgB,2BAA2B,aACjD,GAAI,OAAe,QAAQ,GAAG;EAEhC,OAAO;CACT,GACA,qBACA,OAAO,OACL,SAAS,YAAa,GAAG,QAAiC,WAAW,IACzE;AACF"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { c as wrapDatabaseError, n as buildWhere, o as resolveInsertColumns, r as formatDbError, t as DatabaseSchemaManager } from "./schema-manager-
|
|
2
|
-
import { a as NestedTransactionError, o as resolveSchemas } from "./query-
|
|
3
|
-
import { _ as validateColumnNames, c as createTransactionLock, g as validateColumnName, h as generateCreateIndexStatement, m as generateAddColumnStatement, v as validateIndexName, y as validateTableName } from "./postgres-dialect-
|
|
4
|
-
import { t as getCachedSqliteDatabase } from "./sqlite-connection-cache-
|
|
1
|
+
import { c as wrapDatabaseError, n as buildWhere, o as resolveInsertColumns, r as formatDbError, t as DatabaseSchemaManager } from "./schema-manager-tfASrb_b.js";
|
|
2
|
+
import { a as NestedTransactionError, o as resolveSchemas } from "./query-DubG7aF0.js";
|
|
3
|
+
import { _ as validateColumnNames, c as createTransactionLock, g as validateColumnName, h as generateCreateIndexStatement, m as generateAddColumnStatement, v as validateIndexName, y as validateTableName } from "./postgres-dialect-DIy5f5YR.js";
|
|
4
|
+
import { t as getCachedSqliteDatabase } from "./sqlite-connection-cache-C_7rVisQ.js";
|
|
5
5
|
import { DatabaseError } from "@happyvertical/utils";
|
|
6
6
|
import { resolve } from "node:path";
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
@@ -1018,4 +1018,4 @@ async function createNativeSqliteDatabase(options, url) {
|
|
|
1018
1018
|
//#endregion
|
|
1019
1019
|
export { getNativeSqliteDatabase };
|
|
1020
1020
|
|
|
1021
|
-
//# sourceMappingURL=sqlite-native-
|
|
1021
|
+
//# sourceMappingURL=sqlite-native-79oQLrDp.js.map
|