opencode-supertask 0.1.33 → 0.1.35

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/db/index.ts","../../node_modules/src/bun-sqlite/driver.ts","../../node_modules/src/entity.ts","../../node_modules/src/logger.ts","../../node_modules/src/table.utils.ts","../../node_modules/src/table.ts","../../node_modules/src/column.ts","../../node_modules/src/column-builder.ts","../../node_modules/src/pg-core/foreign-keys.ts","../../node_modules/src/tracing-utils.ts","../../node_modules/src/pg-core/unique-constraint.ts","../../node_modules/src/pg-core/utils/array.ts","../../node_modules/src/pg-core/columns/common.ts","../../node_modules/src/pg-core/columns/enum.ts","../../node_modules/src/subquery.ts","../../node_modules/drizzle-orm/version.js","../../node_modules/src/tracing.ts","../../node_modules/src/view-common.ts","../../node_modules/src/sql/sql.ts","../../node_modules/src/utils.ts","../../node_modules/src/pg-core/table.ts","../../node_modules/src/pg-core/primary-keys.ts","../../node_modules/src/sql/expressions/conditions.ts","../../node_modules/src/sql/expressions/select.ts","../../node_modules/src/relations.ts","../../node_modules/src/alias.ts","../../node_modules/src/selection-proxy.ts","../../node_modules/src/query-promise.ts","../../node_modules/src/sqlite-core/foreign-keys.ts","../../node_modules/src/sqlite-core/unique-constraint.ts","../../node_modules/src/sqlite-core/columns/common.ts","../../node_modules/src/sqlite-core/columns/blob.ts","../../node_modules/src/sqlite-core/columns/custom.ts","../../node_modules/src/sqlite-core/columns/integer.ts","../../node_modules/src/sqlite-core/columns/numeric.ts","../../node_modules/src/sqlite-core/columns/real.ts","../../node_modules/src/sqlite-core/columns/text.ts","../../node_modules/src/sqlite-core/columns/all.ts","../../node_modules/src/sqlite-core/table.ts","../../node_modules/src/sqlite-core/query-builders/delete.ts","../../node_modules/src/casing.ts","../../node_modules/src/errors.ts","../../node_modules/src/sqlite-core/view-base.ts","../../node_modules/src/sqlite-core/dialect.ts","../../node_modules/src/query-builders/query-builder.ts","../../node_modules/src/sqlite-core/query-builders/select.ts","../../node_modules/src/sqlite-core/query-builders/query-builder.ts","../../node_modules/src/sqlite-core/query-builders/insert.ts","../../node_modules/src/sqlite-core/query-builders/update.ts","../../node_modules/src/sqlite-core/query-builders/count.ts","../../node_modules/src/sqlite-core/query-builders/query.ts","../../node_modules/src/sqlite-core/query-builders/raw.ts","../../node_modules/src/sqlite-core/db.ts","../../node_modules/src/sqlite-core/indexes.ts","../../node_modules/src/sqlite-core/session.ts","../../node_modules/src/bun-sqlite/session.ts","../../node_modules/src/migrator.ts","../../node_modules/src/bun-sqlite/migrator.ts","../../src/core/db/schema.ts","../../src/core/backoff.ts","../../src/core/task-working-directory.ts","../../src/core/task-batch.ts","../../src/core/services/task.service.ts","../../src/core/process-control.ts","../../src/core/launch-protocol.ts","../../src/core/services/task-run.service.ts","../../src/worker/index.ts","../../src/gateway/health.ts"],"sourcesContent":["import { Database } from 'bun:sqlite';\nimport { drizzle } from 'drizzle-orm/bun-sqlite';\nimport { migrate } from 'drizzle-orm/bun-sqlite/migrator';\nimport * as schema from './schema';\nimport { existsSync, mkdirSync } from 'fs';\nimport { homedir } from 'os';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst DEFAULT_DB_PATH = join(homedir(), '.local/share/opencode/tasks.db');\nexport const DB_FILE_PATH = process.env.SUPERTASK_DB_PATH || DEFAULT_DB_PATH;\nexport { schema };\n\nlet _sqlite: Database | null = null;\nlet _db: ReturnType<typeof drizzle> | null = null;\nlet _migrationRan = false;\n\nfunction getMigrationsFolder(): string {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n let dir = __dirname;\n for (let i = 0; i < 5; i++) {\n const candidate = join(dir, 'drizzle', 'meta', '_journal.json');\n if (existsSync(candidate)) {\n return join(dir, 'drizzle');\n }\n dir = dirname(dir);\n }\n return join(__dirname, '../../drizzle');\n}\n\nfunction ensureGatewayLock(sqliteDb: Database): void {\n sqliteDb.exec(`\n CREATE TABLE IF NOT EXISTS gateway_lock (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n pid INTEGER NOT NULL,\n acquired_at INTEGER NOT NULL,\n heartbeat_at INTEGER NOT NULL,\n ready_at INTEGER,\n version TEXT\n );\n `);\n const columns = sqliteDb.query('PRAGMA table_info(gateway_lock)').all() as Array<{ name: string }>;\n if (!columns.some((column) => column.name === 'ready_at')) {\n sqliteDb.exec('ALTER TABLE gateway_lock ADD COLUMN ready_at INTEGER;');\n }\n if (!columns.some((column) => column.name === 'version')) {\n sqliteDb.exec('ALTER TABLE gateway_lock ADD COLUMN version TEXT;');\n }\n}\n\nexport function migrateSqliteDatabase(sqliteDb: Database): ReturnType<typeof drizzle> {\n ensureGatewayLock(sqliteDb);\n const drizzleDb = drizzle(sqliteDb, { schema });\n migrate(drizzleDb, { migrationsFolder: getMigrationsFolder() });\n sqliteDb.exec('PRAGMA foreign_keys = ON;');\n const violations = sqliteDb.query('PRAGMA foreign_key_check;').all();\n if (violations.length > 0) {\n throw new Error(`检测到 ${violations.length} 条孤立关联记录,请先修复数据再启动`);\n }\n return drizzleDb;\n}\n\nfunction initDb() {\n const dataDir = dirname(DB_FILE_PATH);\n if (!existsSync(dataDir)) {\n mkdirSync(dataDir, { recursive: true });\n }\n _sqlite = new Database(DB_FILE_PATH);\n _sqlite.exec('PRAGMA journal_mode = WAL;');\n _sqlite.exec('PRAGMA busy_timeout = 5000;');\n if (!_migrationRan) {\n try {\n _db = migrateSqliteDatabase(_sqlite);\n _migrationRan = true;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n _migrationRan = false;\n _sqlite.close();\n _sqlite = null;\n _db = null;\n console.error(`[supertask] migration failed: ${msg}`);\n throw new Error(`[supertask] DB migration failed: ${msg}`);\n }\n } else {\n _db = drizzle(_sqlite, { schema });\n }\n\n return _db;\n}\n\nexport function getDb() {\n if (!_db) initDb();\n return _db!;\n}\n\nexport function getSqlite() {\n if (!_sqlite) initDb();\n return _sqlite!;\n}\n\nexport function closeDb() {\n if (_sqlite) {\n _sqlite.close();\n _sqlite = null;\n _db = null;\n _migrationRan = false;\n }\n}\n\nexport const db = new Proxy({} as ReturnType<typeof drizzle>, {\n get(_, prop) {\n const target = getDb();\n const value = Reflect.get(target, prop);\n if (typeof value === 'function') return value.bind(target);\n return value;\n },\n});\n\nexport const sqlite = new Proxy({} as Database, {\n get(_, prop) {\n const target = getSqlite();\n const value = Reflect.get(target, prop);\n if (typeof value === 'function') return value.bind(target);\n return value;\n },\n});\n","/// <reference types=\"bun-types\" />\n\nimport { Database } from 'bun:sqlite';\nimport { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { BaseSQLiteDatabase } from '~/sqlite-core/db.ts';\nimport { SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { SQLiteBunSession } from './session.ts';\n\nexport class BunSQLiteDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends BaseSQLiteDatabase<'sync', void, TSchema> {\n\tstatic override readonly [entityKind]: string = 'BunSQLiteDatabase';\n}\n\ntype DrizzleBunSqliteDatabaseOptions = {\n\t/**\n\t * Open the database as read-only (no write operations, no create).\n\t *\n\t * Equivalent to {@link constants.SQLITE_OPEN_READONLY}\n\t */\n\treadonly?: boolean;\n\t/**\n\t * Allow creating a new database\n\t *\n\t * Equivalent to {@link constants.SQLITE_OPEN_CREATE}\n\t */\n\tcreate?: boolean;\n\t/**\n\t * Open the database as read-write\n\t *\n\t * Equivalent to {@link constants.SQLITE_OPEN_READWRITE}\n\t */\n\treadwrite?: boolean;\n};\n\nexport type DrizzleBunSqliteDatabaseConfig =\n\t| ({\n\t\tsource?: string;\n\t} & DrizzleBunSqliteDatabaseOptions)\n\t| string\n\t| undefined;\n\nfunction construct<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tclient: Database,\n\tconfig: DrizzleConfig<TSchema> = {},\n): BunSQLiteDatabase<TSchema> & {\n\t$client: Database;\n} {\n\tconst dialect = new SQLiteSyncDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new SQLiteBunSession(client, dialect, schema, { logger });\n\tconst db = new BunSQLiteDatabase('sync', dialect, session, schema) as BunSQLiteDatabase<TSchema>;\n\t(<any> db).$client = client;\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Database = Database,\n>(\n\t...params:\n\t\t| []\n\t\t| [\n\t\t\tTClient | string,\n\t\t]\n\t\t| [\n\t\t\tTClient | string,\n\t\t\tDrizzleConfig<TSchema>,\n\t\t]\n\t\t| [\n\t\t\t(\n\t\t\t\t& DrizzleConfig<TSchema>\n\t\t\t\t& ({\n\t\t\t\t\tconnection?: DrizzleBunSqliteDatabaseConfig;\n\t\t\t\t} | {\n\t\t\t\t\tclient: TClient;\n\t\t\t\t})\n\t\t\t),\n\t\t]\n): BunSQLiteDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (params[0] === undefined || typeof params[0] === 'string') {\n\t\tconst instance = params[0] === undefined ? new Database() : new Database(params[0]);\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& ({\n\t\t\t\tconnection?: DrizzleBunSqliteDatabaseConfig | string;\n\t\t\t\tclient?: TClient;\n\t\t\t})\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tif (typeof connection === 'object') {\n\t\t\tconst { source, ...opts } = connection;\n\n\t\t\tconst options = Object.values(opts).filter((v) => v !== undefined).length ? opts : undefined;\n\n\t\t\tconst instance = new Database(source, options);\n\n\t\t\treturn construct(instance, drizzleConfig) as any;\n\t\t}\n\n\t\tconst instance = new Database(connection);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as Database, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): BunSQLiteDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n","export const entityKind = Symbol.for('drizzle:entityKind');\nexport const hasOwnEntityKind = Symbol.for('drizzle:hasOwnEntityKind');\n\nexport interface DrizzleEntity {\n\t[entityKind]: string;\n}\n\nexport type DrizzleEntityClass<T> =\n\t& ((abstract new(...args: any[]) => T) | (new(...args: any[]) => T))\n\t& DrizzleEntity;\n\nexport function is<T extends DrizzleEntityClass<any>>(value: any, type: T): value is InstanceType<T> {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (value instanceof type) { // eslint-disable-line no-instanceof/no-instanceof\n\t\treturn true;\n\t}\n\n\tif (!Object.prototype.hasOwnProperty.call(type, entityKind)) {\n\t\tthrow new Error(\n\t\t\t`Class \"${\n\t\t\t\ttype.name ?? '<unknown>'\n\t\t\t}\" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`,\n\t\t);\n\t}\n\n\tlet cls = Object.getPrototypeOf(value).constructor;\n\tif (cls) {\n\t\t// Traverse the prototype chain to find the entityKind\n\t\twhile (cls) {\n\t\t\tif (entityKind in cls && cls[entityKind] === type[entityKind]) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tcls = Object.getPrototypeOf(cls);\n\t\t}\n\t}\n\n\treturn false;\n}\n","import { entityKind } from '~/entity.ts';\n\nexport interface Logger {\n\tlogQuery(query: string, params: unknown[]): void;\n}\n\nexport interface LogWriter {\n\twrite(message: string): void;\n}\n\nexport class ConsoleLogWriter implements LogWriter {\n\tstatic readonly [entityKind]: string = 'ConsoleLogWriter';\n\n\twrite(message: string) {\n\t\tconsole.log(message);\n\t}\n}\n\nexport class DefaultLogger implements Logger {\n\tstatic readonly [entityKind]: string = 'DefaultLogger';\n\n\treadonly writer: LogWriter;\n\n\tconstructor(config?: { writer: LogWriter }) {\n\t\tthis.writer = config?.writer ?? new ConsoleLogWriter();\n\t}\n\n\tlogQuery(query: string, params: unknown[]): void {\n\t\tconst stringifiedParams = params.map((p) => {\n\t\t\ttry {\n\t\t\t\treturn JSON.stringify(p);\n\t\t\t} catch {\n\t\t\t\treturn String(p);\n\t\t\t}\n\t\t});\n\t\tconst paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(', ')}]` : '';\n\t\tthis.writer.write(`Query: ${query}${paramsStr}`);\n\t}\n}\n\nexport class NoopLogger implements Logger {\n\tstatic readonly [entityKind]: string = 'NoopLogger';\n\n\tlogQuery(): void {\n\t\t// noop\n\t}\n}\n","/** @internal */\nexport const TableName = Symbol.for('drizzle:Name');\n","import type { Column, GetColumnData } from './column.ts';\nimport { entityKind } from './entity.ts';\nimport type { OptionalKeyOnly, RequiredKeyOnly } from './operations.ts';\nimport type { ExtraConfigColumn } from './pg-core/index.ts';\nimport type { SQLWrapper } from './sql/sql.ts';\nimport { TableName } from './table.utils.ts';\nimport type { Simplify, Update } from './utils.ts';\n\nexport interface TableConfig<TColumn extends Column = Column<any>> {\n\tname: string;\n\tschema: string | undefined;\n\tcolumns: Record<string, TColumn>;\n\tdialect: string;\n}\n\nexport type UpdateTableConfig<T extends TableConfig, TUpdate extends Partial<TableConfig>> = Required<\n\tUpdate<T, TUpdate>\n>;\n\n/** @internal */\nexport const Schema = Symbol.for('drizzle:Schema');\n\n/** @internal */\nexport const Columns = Symbol.for('drizzle:Columns');\n\n/** @internal */\nexport const ExtraConfigColumns = Symbol.for('drizzle:ExtraConfigColumns');\n\n/** @internal */\nexport const OriginalName = Symbol.for('drizzle:OriginalName');\n\n/** @internal */\nexport const BaseName = Symbol.for('drizzle:BaseName');\n\n/** @internal */\nexport const IsAlias = Symbol.for('drizzle:IsAlias');\n\n/** @internal */\nexport const ExtraConfigBuilder = Symbol.for('drizzle:ExtraConfigBuilder');\n\nconst IsDrizzleTable = Symbol.for('drizzle:IsDrizzleTable');\n\nexport interface Table<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tT extends TableConfig = TableConfig,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\n\nexport class Table<T extends TableConfig = TableConfig> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Table';\n\n\tdeclare readonly _: {\n\t\treadonly brand: 'Table';\n\t\treadonly config: T;\n\t\treadonly name: T['name'];\n\t\treadonly schema: T['schema'];\n\t\treadonly columns: T['columns'];\n\t\treadonly inferSelect: InferSelectModel<Table<T>>;\n\t\treadonly inferInsert: InferInsertModel<Table<T>>;\n\t};\n\n\tdeclare readonly $inferSelect: InferSelectModel<Table<T>>;\n\tdeclare readonly $inferInsert: InferInsertModel<Table<T>>;\n\n\t/** @internal */\n\tstatic readonly Symbol = {\n\t\tName: TableName as typeof TableName,\n\t\tSchema: Schema as typeof Schema,\n\t\tOriginalName: OriginalName as typeof OriginalName,\n\t\tColumns: Columns as typeof Columns,\n\t\tExtraConfigColumns: ExtraConfigColumns as typeof ExtraConfigColumns,\n\t\tBaseName: BaseName as typeof BaseName,\n\t\tIsAlias: IsAlias as typeof IsAlias,\n\t\tExtraConfigBuilder: ExtraConfigBuilder as typeof ExtraConfigBuilder,\n\t};\n\n\t/**\n\t * @internal\n\t * Can be changed if the table is aliased.\n\t */\n\t[TableName]: string;\n\n\t/**\n\t * @internal\n\t * Used to store the original name of the table, before any aliasing.\n\t */\n\t[OriginalName]: string;\n\n\t/** @internal */\n\t[Schema]: string | undefined;\n\n\t/** @internal */\n\t[Columns]!: T['columns'];\n\n\t/** @internal */\n\t[ExtraConfigColumns]!: Record<string, ExtraConfigColumn>;\n\n\t/**\n\t * @internal\n\t * Used to store the table name before the transformation via the `tableCreator` functions.\n\t */\n\t[BaseName]: string;\n\n\t/** @internal */\n\t[IsAlias] = false;\n\n\t/** @internal */\n\t[IsDrizzleTable] = true;\n\n\t/** @internal */\n\t[ExtraConfigBuilder]: ((self: any) => Record<string, unknown> | unknown[]) | undefined = undefined;\n\n\tconstructor(name: string, schema: string | undefined, baseName: string) {\n\t\tthis[TableName] = this[OriginalName] = name;\n\t\tthis[Schema] = schema;\n\t\tthis[BaseName] = baseName;\n\t}\n}\n\nexport function isTable(table: unknown): table is Table {\n\treturn typeof table === 'object' && table !== null && IsDrizzleTable in table;\n}\n\n/**\n * Any table with a specified boundary.\n *\n * @example\n\t```ts\n\t// Any table with a specific name\n\ttype AnyUsersTable = AnyTable<{ name: 'users' }>;\n\t```\n *\n * To describe any table with any config, simply use `Table` without any type arguments, like this:\n *\n\t```ts\n\tfunction needsTable(table: Table) {\n\t\t...\n\t}\n\t```\n */\nexport type AnyTable<TPartial extends Partial<TableConfig>> = Table<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport function getTableName<T extends Table>(table: T): T['_']['name'] {\n\treturn table[TableName];\n}\n\nexport function getTableUniqueName<T extends Table>(table: T): `${T['_']['schema']}.${T['_']['name']}` {\n\treturn `${table[Schema] ?? 'public'}.${table[TableName]}`;\n}\n\nexport type MapColumnName<TName extends string, TColumn extends Column, TDBColumNames extends boolean> =\n\tTDBColumNames extends true ? TColumn['_']['name']\n\t\t: TName;\n\nexport type InferModelFromColumns<\n\tTColumns extends Record<string, Column>,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { dbColumnNames: boolean; override?: boolean } = { dbColumnNames: false; override: false },\n> = Simplify<\n\tTInferMode extends 'insert' ?\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as RequiredKeyOnly<\n\t\t\t\t\t\tMapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>,\n\t\t\t\t\t\tTColumns[Key]\n\t\t\t\t\t>\n\t\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t\t}\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as OptionalKeyOnly<\n\t\t\t\t\t\tMapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>,\n\t\t\t\t\t\tTColumns[Key],\n\t\t\t\t\t\tTConfig['override']\n\t\t\t\t\t>\n\t\t\t\t]?: GetColumnData<TColumns[Key], 'query'> | undefined;\n\t\t\t}\n\t\t: {\n\t\t\t[\n\t\t\t\tKey in keyof TColumns & string as MapColumnName<\n\t\t\t\t\tKey,\n\t\t\t\t\tTColumns[Key],\n\t\t\t\t\tTConfig['dbColumnNames']\n\t\t\t\t>\n\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t}\n>;\n\n/** @deprecated Use one of the alternatives: {@link InferSelectModel} / {@link InferInsertModel}, or `table.$inferSelect` / `table.$inferInsert`\n */\nexport type InferModel<\n\tTTable extends Table,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], TInferMode, TConfig>;\n\nexport type InferSelectModel<\n\tTTable extends Table,\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'select', TConfig>;\n\nexport type InferInsertModel<\n\tTTable extends Table,\n\tTConfig extends { dbColumnNames: boolean; override?: boolean } = { dbColumnNames: false; override: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'insert', TConfig>;\n","import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tGeneratedColumnConfig,\n\tGeneratedIdentityConfig,\n} from './column-builder.ts';\nimport { entityKind } from './entity.ts';\nimport type { DriverValueMapper, SQL, SQLWrapper } from './sql/sql.ts';\nimport type { Table } from './table.ts';\nimport type { Update } from './utils.ts';\n\nexport interface ColumnBaseConfig<\n\tTDataType extends ColumnDataType,\n\tTColumnType extends string,\n> extends ColumnBuilderBaseConfig<TDataType, TColumnType> {\n\ttableName: string;\n\tnotNull: boolean;\n\thasDefault: boolean;\n\tisPrimaryKey: boolean;\n\tisAutoincrement: boolean;\n\thasRuntimeDefault: boolean;\n}\n\nexport type ColumnTypeConfig<T extends ColumnBaseConfig<ColumnDataType, string>, TTypeConfig extends object> = T & {\n\tbrand: 'Column';\n\ttableName: T['tableName'];\n\tname: T['name'];\n\tdataType: T['dataType'];\n\tcolumnType: T['columnType'];\n\tdata: T['data'];\n\tdriverParam: T['driverParam'];\n\tnotNull: T['notNull'];\n\thasDefault: T['hasDefault'];\n\tisPrimaryKey: T['isPrimaryKey'];\n\tisAutoincrement: T['isAutoincrement'];\n\thasRuntimeDefault: T['hasRuntimeDefault'];\n\tenumValues: T['enumValues'];\n\tbaseColumn: T extends { baseColumn: infer U } ? U : unknown;\n\tgenerated: GeneratedColumnConfig<T['data']> | undefined;\n\tidentity: undefined | 'always' | 'byDefault';\n} & TTypeConfig;\n\nexport type ColumnRuntimeConfig<TData, TRuntimeConfig extends object> = ColumnBuilderRuntimeConfig<\n\tTData,\n\tTRuntimeConfig\n>;\n\nexport interface Column<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTRuntimeConfig extends object = object,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTTypeConfig extends object = object,\n> extends DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\n/*\n\t`Column` only accepts a full `ColumnConfig` as its generic.\n\tTo infer parts of the config, use `AnyColumn` that accepts a partial config.\n\tSee `GetColumnData` for example usage of inferring.\n*/\nexport abstract class Column<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n> implements DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Column';\n\n\tdeclare readonly _: ColumnTypeConfig<T, TTypeConfig>;\n\n\treadonly name: string;\n\treadonly keyAsName: boolean;\n\treadonly primary: boolean;\n\treadonly notNull: boolean;\n\treadonly default: T['data'] | SQL | undefined;\n\treadonly defaultFn: (() => T['data'] | SQL) | undefined;\n\treadonly onUpdateFn: (() => T['data'] | SQL) | undefined;\n\treadonly hasDefault: boolean;\n\treadonly isUnique: boolean;\n\treadonly uniqueName: string | undefined;\n\treadonly uniqueType: string | undefined;\n\treadonly dataType: T['dataType'];\n\treadonly columnType: T['columnType'];\n\treadonly enumValues: T['enumValues'] = undefined;\n\treadonly generated: GeneratedColumnConfig<T['data']> | undefined = undefined;\n\treadonly generatedIdentity: GeneratedIdentityConfig | undefined = undefined;\n\n\tprotected config: ColumnRuntimeConfig<T['data'], TRuntimeConfig>;\n\n\tconstructor(\n\t\treadonly table: Table,\n\t\tconfig: ColumnRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tthis.config = config;\n\t\tthis.name = config.name;\n\t\tthis.keyAsName = config.keyAsName;\n\t\tthis.notNull = config.notNull;\n\t\tthis.default = config.default;\n\t\tthis.defaultFn = config.defaultFn;\n\t\tthis.onUpdateFn = config.onUpdateFn;\n\t\tthis.hasDefault = config.hasDefault;\n\t\tthis.primary = config.primaryKey;\n\t\tthis.isUnique = config.isUnique;\n\t\tthis.uniqueName = config.uniqueName;\n\t\tthis.uniqueType = config.uniqueType;\n\t\tthis.dataType = config.dataType as T['dataType'];\n\t\tthis.columnType = config.columnType;\n\t\tthis.generated = config.generated;\n\t\tthis.generatedIdentity = config.generatedIdentity;\n\t}\n\n\tabstract getSQLType(): string;\n\n\tmapFromDriverValue(value: unknown): unknown {\n\t\treturn value;\n\t}\n\n\tmapToDriverValue(value: unknown): unknown {\n\t\treturn value;\n\t}\n\n\t// ** @internal */\n\tshouldDisableInsert(): boolean {\n\t\treturn this.config.generated !== undefined && this.config.generated.type !== 'byDefault';\n\t}\n}\n\nexport type UpdateColConfig<\n\tT extends ColumnBaseConfig<ColumnDataType, string>,\n\tTUpdate extends Partial<ColumnBaseConfig<ColumnDataType, string>>,\n> = Update<T, TUpdate>;\n\nexport type AnyColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = Column<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n\nexport type GetColumnData<TColumn extends Column, TInferMode extends 'query' | 'raw' = 'query'> =\n\t// dprint-ignore\n\tTInferMode extends 'raw' // Raw mode\n\t\t? TColumn['_']['data'] // Just return the underlying type\n\t\t: TColumn['_']['notNull'] extends true // Query mode\n\t\t? TColumn['_']['data'] // Query mode, not null\n\t\t: TColumn['_']['data'] | null; // Query mode, nullable\n\nexport type InferColumnsDataTypes<TColumns extends Record<string, Column>> = {\n\t[Key in keyof TColumns]: GetColumnData<TColumns[Key], 'query'>;\n};\n","import { entityKind } from '~/entity.ts';\nimport type { Column } from './column.ts';\nimport type { MySqlColumn } from './mysql-core/index.ts';\nimport type { ExtraConfigColumn, PgColumn, PgSequenceOptions } from './pg-core/index.ts';\nimport type { SingleStoreColumn } from './singlestore-core/index.ts';\nimport type { SQL } from './sql/sql.ts';\nimport type { SQLiteColumn } from './sqlite-core/index.ts';\nimport type { Assume, Simplify } from './utils.ts';\n\nexport type ColumnDataType =\n\t| 'string'\n\t| 'number'\n\t| 'boolean'\n\t| 'array'\n\t| 'json'\n\t| 'date'\n\t| 'bigint'\n\t| 'custom'\n\t| 'buffer';\n\nexport type Dialect = 'pg' | 'mysql' | 'sqlite' | 'singlestore' | 'common';\n\nexport type GeneratedStorageMode = 'virtual' | 'stored';\n\nexport type GeneratedType = 'always' | 'byDefault';\n\nexport type GeneratedColumnConfig<TDataType> = {\n\tas: TDataType | SQL | (() => SQL);\n\ttype?: GeneratedType;\n\tmode?: GeneratedStorageMode;\n};\n\nexport type GeneratedIdentityConfig = {\n\tsequenceName?: string;\n\tsequenceOptions?: PgSequenceOptions;\n\ttype: 'always' | 'byDefault';\n};\n\nexport interface ColumnBuilderBaseConfig<TDataType extends ColumnDataType, TColumnType extends string> {\n\tname: string;\n\tdataType: TDataType;\n\tcolumnType: TColumnType;\n\tdata: unknown;\n\tdriverParam: unknown;\n\tenumValues: string[] | undefined;\n}\n\nexport type MakeColumnConfig<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTableName extends string,\n\tTData = T extends { $type: infer U } ? U : T['data'],\n> = {\n\tname: T['name'];\n\ttableName: TTableName;\n\tdataType: T['dataType'];\n\tcolumnType: T['columnType'];\n\tdata: TData;\n\tdriverParam: T['driverParam'];\n\tnotNull: T extends { notNull: true } ? true : false;\n\thasDefault: T extends { hasDefault: true } ? true : false;\n\tisPrimaryKey: T extends { isPrimaryKey: true } ? true : false;\n\tisAutoincrement: T extends { isAutoincrement: true } ? true : false;\n\thasRuntimeDefault: T extends { hasRuntimeDefault: true } ? true : false;\n\tenumValues: T['enumValues'];\n\tbaseColumn: T extends { baseBuilder: infer U extends ColumnBuilderBase } ? BuildColumn<TTableName, U, 'common'>\n\t\t: never;\n\tidentity: T extends { identity: 'always' } ? 'always' : T extends { identity: 'byDefault' } ? 'byDefault' : undefined;\n\tgenerated: T extends { generated: infer G } ? unknown extends G ? undefined\n\t\t: G extends undefined ? undefined\n\t\t: G\n\t\t: undefined;\n} & {};\n\nexport type ColumnBuilderTypeConfig<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> = Simplify<\n\t& {\n\t\tbrand: 'ColumnBuilder';\n\t\tname: T['name'];\n\t\tdataType: T['dataType'];\n\t\tcolumnType: T['columnType'];\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverParam'];\n\t\tnotNull: T extends { notNull: infer U } ? U : boolean;\n\t\thasDefault: T extends { hasDefault: infer U } ? U : boolean;\n\t\tenumValues: T['enumValues'];\n\t\tidentity: T extends { identity: infer U } ? U : unknown;\n\t\tgenerated: T extends { generated: infer G } ? G extends undefined ? unknown : G : unknown;\n\t}\n\t& TTypeConfig\n>;\n\nexport type ColumnBuilderRuntimeConfig<TData, TRuntimeConfig extends object = object> = {\n\tname: string;\n\tkeyAsName: boolean;\n\tnotNull: boolean;\n\tdefault: TData | SQL | undefined;\n\tdefaultFn: (() => TData | SQL) | undefined;\n\tonUpdateFn: (() => TData | SQL) | undefined;\n\thasDefault: boolean;\n\tprimaryKey: boolean;\n\tisUnique: boolean;\n\tuniqueName: string | undefined;\n\tuniqueType: string | undefined;\n\tdataType: string;\n\tcolumnType: string;\n\tgenerated: GeneratedColumnConfig<TData> | undefined;\n\tgeneratedIdentity: GeneratedIdentityConfig | undefined;\n} & TRuntimeConfig;\n\nexport interface ColumnBuilderExtraConfig {\n\tprimaryKeyHasDefault?: boolean;\n}\n\nexport type NotNull<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tnotNull: true;\n\t};\n};\n\nexport type HasDefault<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\thasDefault: true;\n\t};\n};\n\nexport type IsPrimaryKey<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tisPrimaryKey: true;\n\t};\n};\n\nexport type IsAutoincrement<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tisAutoincrement: true;\n\t};\n};\n\nexport type HasRuntimeDefault<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\thasRuntimeDefault: true;\n\t};\n};\n\nexport type $Type<T extends ColumnBuilderBase, TType> = T & {\n\t_: {\n\t\t$type: TType;\n\t};\n};\n\nexport type HasGenerated<T extends ColumnBuilderBase, TGenerated extends {} = {}> = T & {\n\t_: {\n\t\thasDefault: true;\n\t\tgenerated: TGenerated;\n\t};\n};\n\nexport type IsIdentity<\n\tT extends ColumnBuilderBase,\n\tTType extends 'always' | 'byDefault',\n> = T & {\n\t_: {\n\t\tnotNull: true;\n\t\thasDefault: true;\n\t\tidentity: TType;\n\t};\n};\nexport interface ColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> {\n\t_: ColumnBuilderTypeConfig<T, TTypeConfig>;\n}\n\n// To understand how to use `ColumnBuilder` and `AnyColumnBuilder`, see `Column` and `AnyColumn` documentation.\nexport abstract class ColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> implements ColumnBuilderBase<T, TTypeConfig> {\n\tstatic readonly [entityKind]: string = 'ColumnBuilder';\n\n\tdeclare _: ColumnBuilderTypeConfig<T, TTypeConfig>;\n\n\tprotected config: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>;\n\n\tconstructor(name: T['name'], dataType: T['dataType'], columnType: T['columnType']) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tkeyAsName: name === '',\n\t\t\tnotNull: false,\n\t\t\tdefault: undefined,\n\t\t\thasDefault: false,\n\t\t\tprimaryKey: false,\n\t\t\tisUnique: false,\n\t\t\tuniqueName: undefined,\n\t\t\tuniqueType: undefined,\n\t\t\tdataType,\n\t\t\tcolumnType,\n\t\t\tgenerated: undefined,\n\t\t} as ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>;\n\t}\n\n\t/**\n\t * Changes the data type of the column. Commonly used with `json` columns. Also, useful for branded types.\n\t *\n\t * @example\n\t * ```ts\n\t * const users = pgTable('users', {\n\t * \tid: integer('id').$type<UserId>().primaryKey(),\n\t * \tdetails: json('details').$type<UserDetails>().notNull(),\n\t * });\n\t * ```\n\t */\n\t$type<TType>(): $Type<this, TType> {\n\t\treturn this as $Type<this, TType>;\n\t}\n\n\t/**\n\t * Adds a `not null` clause to the column definition.\n\t *\n\t * Affects the `select` model of the table - columns *without* `not null` will be nullable on select.\n\t */\n\tnotNull(): NotNull<this> {\n\t\tthis.config.notNull = true;\n\t\treturn this as NotNull<this>;\n\t}\n\n\t/**\n\t * Adds a `default <value>` clause to the column definition.\n\t *\n\t * Affects the `insert` model of the table - columns *with* `default` are optional on insert.\n\t *\n\t * If you need to set a dynamic default value, use {@link $defaultFn} instead.\n\t */\n\tdefault(value: (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL): HasDefault<this> {\n\t\tthis.config.default = value;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasDefault<this>;\n\t}\n\n\t/**\n\t * Adds a dynamic default value to the column.\n\t * The function will be called when the row is inserted, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$defaultFn(\n\t\tfn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,\n\t): HasRuntimeDefault<HasDefault<this>> {\n\t\tthis.config.defaultFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasRuntimeDefault<HasDefault<this>>;\n\t}\n\n\t/**\n\t * Alias for {@link $defaultFn}.\n\t */\n\t$default = this.$defaultFn;\n\n\t/**\n\t * Adds a dynamic update value to the column.\n\t * The function will be called when the row is updated, and the returned value will be used as the column value if none is provided.\n\t * If no `default` (or `$defaultFn`) value is provided, the function will be called when the row is inserted as well, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$onUpdateFn(\n\t\tfn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,\n\t): HasDefault<this> {\n\t\tthis.config.onUpdateFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasDefault<this>;\n\t}\n\n\t/**\n\t * Alias for {@link $onUpdateFn}.\n\t */\n\t$onUpdate = this.$onUpdateFn;\n\n\t/**\n\t * Adds a `primary key` clause to the column definition. This implicitly makes the column `not null`.\n\t *\n\t * In SQLite, `integer primary key` implicitly makes the column auto-incrementing.\n\t */\n\tprimaryKey(): TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<NotNull<this>>>\n\t\t: IsPrimaryKey<NotNull<this>>\n\t{\n\t\tthis.config.primaryKey = true;\n\t\tthis.config.notNull = true;\n\t\treturn this as TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<NotNull<this>>>\n\t\t\t: IsPrimaryKey<NotNull<this>>;\n\t}\n\n\tabstract generatedAlwaysAs(\n\t\tas: SQL | T['data'] | (() => SQL),\n\t\tconfig?: Partial<GeneratedColumnConfig<unknown>>,\n\t): HasGenerated<this, {\n\t\ttype: 'always';\n\t}>;\n\n\t/** @internal Sets the name of the column to the key within the table definition if a name was not given. */\n\tsetName(name: string) {\n\t\tif (this.config.name !== '') return;\n\t\tthis.config.name = name;\n\t}\n}\n\nexport type BuildColumn<\n\tTTableName extends string,\n\tTBuilder extends ColumnBuilderBase,\n\tTDialect extends Dialect,\n> = TDialect extends 'pg' ? PgColumn<\n\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t{},\n\t\tSimplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>\n\t>\n\t: TDialect extends 'mysql' ? MySqlColumn<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<\n\t\t\t\tOmit<\n\t\t\t\t\tTBuilder['_'],\n\t\t\t\t\t| keyof MakeColumnConfig<TBuilder['_'], TTableName>\n\t\t\t\t\t| 'brand'\n\t\t\t\t\t| 'dialect'\n\t\t\t\t\t| 'primaryKeyHasDefault'\n\t\t\t\t\t| 'mysqlColumnBuilderBrand'\n\t\t\t\t>\n\t\t\t>\n\t\t>\n\t: TDialect extends 'sqlite' ? SQLiteColumn<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>\n\t\t>\n\t: TDialect extends 'common' ? Column<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>\n\t\t>\n\t: TDialect extends 'singlestore' ? SingleStoreColumn<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<\n\t\t\t\tOmit<\n\t\t\t\t\tTBuilder['_'],\n\t\t\t\t\t| keyof MakeColumnConfig<TBuilder['_'], TTableName>\n\t\t\t\t\t| 'brand'\n\t\t\t\t\t| 'dialect'\n\t\t\t\t\t| 'primaryKeyHasDefault'\n\t\t\t\t\t| 'singlestoreColumnBuilderBrand'\n\t\t\t\t>\n\t\t\t>\n\t\t>\n\t: never;\n\nexport type BuildIndexColumn<\n\tTDialect extends Dialect,\n> = TDialect extends 'pg' ? ExtraConfigColumn : never;\n\n// TODO\n// try to make sql as well + indexRaw\n\n// optional after everything will be working as expected\n// also try to leave only needed methods for extraConfig\n// make an error if I pass .asc() to fk and so on\n\nexport type BuildColumns<\n\tTTableName extends string,\n\tTConfigMap extends Record<string, ColumnBuilderBase>,\n\tTDialect extends Dialect,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: BuildColumn<TTableName, {\n\t\t\t_:\n\t\t\t\t& Omit<TConfigMap[Key]['_'], 'name'>\n\t\t\t\t& { name: TConfigMap[Key]['_']['name'] extends '' ? Assume<Key, string> : TConfigMap[Key]['_']['name'] };\n\t\t}, TDialect>;\n\t}\n\t& {};\n\nexport type BuildExtraConfigColumns<\n\t_TTableName extends string,\n\tTConfigMap extends Record<string, ColumnBuilderBase>,\n\tTDialect extends Dialect,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: BuildIndexColumn<TDialect>;\n\t}\n\t& {};\n\nexport type ChangeColumnTableName<TColumn extends Column, TAlias extends string, TDialect extends Dialect> =\n\tTDialect extends 'pg' ? PgColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'mysql' ? MySqlColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'singlestore' ? SingleStoreColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'sqlite' ? SQLiteColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: never;\n","import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { AnyPgColumn, PgColumn } from './columns/index.ts';\nimport type { PgTable } from './table.ts';\n\nexport type UpdateDeleteAction = 'cascade' | 'restrict' | 'no action' | 'set null' | 'set default';\n\nexport type Reference = () => {\n\treadonly name?: string;\n\treadonly columns: PgColumn[];\n\treadonly foreignTable: PgTable;\n\treadonly foreignColumns: PgColumn[];\n};\n\nexport class ForeignKeyBuilder {\n\tstatic readonly [entityKind]: string = 'PgForeignKeyBuilder';\n\n\t/** @internal */\n\treference: Reference;\n\n\t/** @internal */\n\t_onUpdate: UpdateDeleteAction | undefined = 'no action';\n\n\t/** @internal */\n\t_onDelete: UpdateDeleteAction | undefined = 'no action';\n\n\tconstructor(\n\t\tconfig: () => {\n\t\t\tname?: string;\n\t\t\tcolumns: PgColumn[];\n\t\t\tforeignColumns: PgColumn[];\n\t\t},\n\t\tactions?: {\n\t\t\tonUpdate?: UpdateDeleteAction;\n\t\t\tonDelete?: UpdateDeleteAction;\n\t\t} | undefined,\n\t) {\n\t\tthis.reference = () => {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn { name, columns, foreignTable: foreignColumns[0]!.table as PgTable, foreignColumns };\n\t\t};\n\t\tif (actions) {\n\t\t\tthis._onUpdate = actions.onUpdate;\n\t\t\tthis._onDelete = actions.onDelete;\n\t\t}\n\t}\n\n\tonUpdate(action: UpdateDeleteAction): this {\n\t\tthis._onUpdate = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\tonDelete(action: UpdateDeleteAction): this {\n\t\tthis._onDelete = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): ForeignKey {\n\t\treturn new ForeignKey(table, this);\n\t}\n}\n\nexport type AnyForeignKeyBuilder = ForeignKeyBuilder;\n\nexport class ForeignKey {\n\tstatic readonly [entityKind]: string = 'PgForeignKey';\n\n\treadonly reference: Reference;\n\treadonly onUpdate: UpdateDeleteAction | undefined;\n\treadonly onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(readonly table: PgTable, builder: ForeignKeyBuilder) {\n\t\tthis.reference = builder.reference;\n\t\tthis.onUpdate = builder._onUpdate;\n\t\tthis.onDelete = builder._onDelete;\n\t}\n\n\tgetName(): string {\n\t\tconst { name, columns, foreignColumns } = this.reference();\n\t\tconst columnNames = columns.map((column) => column.name);\n\t\tconst foreignColumnNames = foreignColumns.map((column) => column.name);\n\t\tconst chunks = [\n\t\t\tthis.table[TableName],\n\t\t\t...columnNames,\n\t\t\tforeignColumns[0]!.table[TableName],\n\t\t\t...foreignColumnNames,\n\t\t];\n\t\treturn name ?? `${chunks.join('_')}_fk`;\n\t}\n}\n\ntype ColumnsWithTable<\n\tTTableName extends string,\n\tTColumns extends PgColumn[],\n> = { [Key in keyof TColumns]: AnyPgColumn<{ tableName: TTableName }> };\n\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnyPgColumn<{ tableName: TTableName }>, ...AnyPgColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder {\n\tfunction mappedConfig() {\n\t\tconst { name, columns, foreignColumns } = config;\n\t\treturn {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tforeignColumns,\n\t\t};\n\t}\n\n\treturn new ForeignKeyBuilder(mappedConfig);\n}\n","export function iife<T extends unknown[], U>(fn: (...args: T) => U, ...args: T): U {\n\treturn fn(...args);\n}\n","import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { PgColumn } from './columns/index.ts';\nimport type { PgTable } from './table.ts';\n\nexport function unique(name?: string): UniqueOnConstraintBuilder {\n\treturn new UniqueOnConstraintBuilder(name);\n}\n\nexport function uniqueKeyName(table: PgTable, columns: string[]) {\n\treturn `${table[TableName]}_${columns.join('_')}_unique`;\n}\n\nexport class UniqueConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'PgUniqueConstraintBuilder';\n\n\t/** @internal */\n\tcolumns: PgColumn[];\n\t/** @internal */\n\tnullsNotDistinctConfig = false;\n\n\tconstructor(\n\t\tcolumns: PgColumn[],\n\t\tprivate name?: string,\n\t) {\n\t\tthis.columns = columns;\n\t}\n\n\tnullsNotDistinct() {\n\t\tthis.nullsNotDistinctConfig = true;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): UniqueConstraint {\n\t\treturn new UniqueConstraint(table, this.columns, this.nullsNotDistinctConfig, this.name);\n\t}\n}\n\nexport class UniqueOnConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'PgUniqueOnConstraintBuilder';\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tname?: string,\n\t) {\n\t\tthis.name = name;\n\t}\n\n\ton(...columns: [PgColumn, ...PgColumn[]]) {\n\t\treturn new UniqueConstraintBuilder(columns, this.name);\n\t}\n}\n\nexport class UniqueConstraint {\n\tstatic readonly [entityKind]: string = 'PgUniqueConstraint';\n\n\treadonly columns: PgColumn[];\n\treadonly name?: string;\n\treadonly nullsNotDistinct: boolean = false;\n\n\tconstructor(readonly table: PgTable, columns: PgColumn[], nullsNotDistinct: boolean, name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name ?? uniqueKeyName(this.table, this.columns.map((column) => column.name));\n\t\tthis.nullsNotDistinct = nullsNotDistinct;\n\t}\n\n\tgetName() {\n\t\treturn this.name;\n\t}\n}\n","function parsePgArrayValue(arrayString: string, startFrom: number, inQuotes: boolean): [string, number] {\n\tfor (let i = startFrom; i < arrayString.length; i++) {\n\t\tconst char = arrayString[i];\n\n\t\tif (char === '\\\\') {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\treturn [arrayString.slice(startFrom, i).replace(/\\\\/g, ''), i + 1];\n\t\t}\n\n\t\tif (inQuotes) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === ',' || char === '}') {\n\t\t\treturn [arrayString.slice(startFrom, i).replace(/\\\\/g, ''), i];\n\t\t}\n\t}\n\n\treturn [arrayString.slice(startFrom).replace(/\\\\/g, ''), arrayString.length];\n}\n\nexport function parsePgNestedArray(arrayString: string, startFrom = 0): [any[], number] {\n\tconst result: any[] = [];\n\tlet i = startFrom;\n\tlet lastCharIsComma = false;\n\n\twhile (i < arrayString.length) {\n\t\tconst char = arrayString[i];\n\n\t\tif (char === ',') {\n\t\t\tif (lastCharIsComma || i === startFrom) {\n\t\t\t\tresult.push('');\n\t\t\t}\n\t\t\tlastCharIsComma = true;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlastCharIsComma = false;\n\n\t\tif (char === '\\\\') {\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\tconst [value, startFrom] = parsePgArrayValue(arrayString, i + 1, true);\n\t\t\tresult.push(value);\n\t\t\ti = startFrom;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '}') {\n\t\t\treturn [result, i + 1];\n\t\t}\n\n\t\tif (char === '{') {\n\t\t\tconst [value, startFrom] = parsePgNestedArray(arrayString, i + 1);\n\t\t\tresult.push(value);\n\t\t\ti = startFrom;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst [value, newStartFrom] = parsePgArrayValue(arrayString, i, false);\n\t\tresult.push(value);\n\t\ti = newStartFrom;\n\t}\n\n\treturn [result, i];\n}\n\nexport function parsePgArray(arrayString: string): any[] {\n\tconst [result] = parsePgNestedArray(arrayString, 1);\n\treturn result;\n}\n\nexport function makePgArray(array: any[]): string {\n\treturn `{${\n\t\tarray.map((item) => {\n\t\t\tif (Array.isArray(item)) {\n\t\t\t\treturn makePgArray(item);\n\t\t\t}\n\n\t\t\tif (typeof item === 'string') {\n\t\t\t\treturn `\"${item.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n\t\t\t}\n\n\t\t\treturn `${item}`;\n\t\t}).join(',')\n\t}}`;\n}\n","import type {\n\tColumnBuilderBase,\n\tColumnBuilderBaseConfig,\n\tColumnBuilderExtraConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tHasGenerated,\n\tMakeColumnConfig,\n} from '~/column-builder.ts';\nimport { ColumnBuilder } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { Simplify, Update } from '~/utils.ts';\n\nimport type { ForeignKey, UpdateDeleteAction } from '~/pg-core/foreign-keys.ts';\nimport { ForeignKeyBuilder } from '~/pg-core/foreign-keys.ts';\nimport type { AnyPgTable, PgTable } from '~/pg-core/table.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport { iife } from '~/tracing-utils.ts';\nimport type { PgIndexOpClass } from '../indexes.ts';\nimport { uniqueKeyName } from '../unique-constraint.ts';\nimport { makePgArray, parsePgArray } from '../utils/array.ts';\n\nexport interface ReferenceConfig {\n\tref: () => PgColumn;\n\tactions: {\n\t\tonUpdate?: UpdateDeleteAction;\n\t\tonDelete?: UpdateDeleteAction;\n\t};\n}\n\nexport interface PgColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> extends ColumnBuilderBase<T, TTypeConfig & { dialect: 'pg' }> {}\n\nexport abstract class PgColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> extends ColumnBuilder<T, TRuntimeConfig, TTypeConfig & { dialect: 'pg' }, TExtraConfig>\n\timplements PgColumnBuilderBase<T, TTypeConfig>\n{\n\tprivate foreignKeyConfigs: ReferenceConfig[] = [];\n\n\tstatic override readonly [entityKind]: string = 'PgColumnBuilder';\n\n\tarray<TSize extends number | undefined = undefined>(size?: TSize): PgArrayBuilder<\n\t\t& {\n\t\t\tname: T['name'];\n\t\t\tdataType: 'array';\n\t\t\tcolumnType: 'PgArray';\n\t\t\tdata: T['data'][];\n\t\t\tdriverParam: T['driverParam'][] | string;\n\t\t\tenumValues: T['enumValues'];\n\t\t\tsize: TSize;\n\t\t\tbaseBuilder: T;\n\t\t}\n\t\t& (T extends { notNull: true } ? { notNull: true } : {})\n\t\t& (T extends { hasDefault: true } ? { hasDefault: true } : {}),\n\t\tT\n\t> {\n\t\treturn new PgArrayBuilder(this.config.name, this as PgColumnBuilder<any, any>, size as any);\n\t}\n\n\treferences(\n\t\tref: ReferenceConfig['ref'],\n\t\tactions: ReferenceConfig['actions'] = {},\n\t): this {\n\t\tthis.foreignKeyConfigs.push({ ref, actions });\n\t\treturn this;\n\t}\n\n\tunique(\n\t\tname?: string,\n\t\tconfig?: { nulls: 'distinct' | 'not distinct' },\n\t): this {\n\t\tthis.config.isUnique = true;\n\t\tthis.config.uniqueName = name;\n\t\tthis.config.uniqueType = config?.nulls;\n\t\treturn this;\n\t}\n\n\tgeneratedAlwaysAs(as: SQL | T['data'] | (() => SQL)): HasGenerated<this, {\n\t\ttype: 'always';\n\t}> {\n\t\tthis.config.generated = {\n\t\t\tas,\n\t\t\ttype: 'always',\n\t\t\tmode: 'stored',\n\t\t};\n\t\treturn this as HasGenerated<this, {\n\t\t\ttype: 'always';\n\t\t}>;\n\t}\n\n\t/** @internal */\n\tbuildForeignKeys(column: PgColumn, table: PgTable): ForeignKey[] {\n\t\treturn this.foreignKeyConfigs.map(({ ref, actions }) => {\n\t\t\treturn iife(\n\t\t\t\t(ref, actions) => {\n\t\t\t\t\tconst builder = new ForeignKeyBuilder(() => {\n\t\t\t\t\t\tconst foreignColumn = ref();\n\t\t\t\t\t\treturn { columns: [column], foreignColumns: [foreignColumn] };\n\t\t\t\t\t});\n\t\t\t\t\tif (actions.onUpdate) {\n\t\t\t\t\t\tbuilder.onUpdate(actions.onUpdate);\n\t\t\t\t\t}\n\t\t\t\t\tif (actions.onDelete) {\n\t\t\t\t\t\tbuilder.onDelete(actions.onDelete);\n\t\t\t\t\t}\n\t\t\t\t\treturn builder.build(table);\n\t\t\t\t},\n\t\t\t\tref,\n\t\t\t\tactions,\n\t\t\t);\n\t\t});\n\t}\n\n\t/** @internal */\n\tabstract build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgColumn<MakeColumnConfig<T, TTableName>>;\n\n\t/** @internal */\n\tbuildExtraConfigColumn<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): ExtraConfigColumn {\n\t\treturn new ExtraConfigColumn(table, this.config);\n\t}\n}\n\n// To understand how to use `PgColumn` and `PgColumn`, see `Column` and `AnyColumn` documentation.\nexport abstract class PgColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = {},\n\tTTypeConfig extends object = {},\n> extends Column<T, TRuntimeConfig, TTypeConfig & { dialect: 'pg' }> {\n\tstatic override readonly [entityKind]: string = 'PgColumn';\n\n\tconstructor(\n\t\toverride readonly table: PgTable,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tif (!config.uniqueName) {\n\t\t\tconfig.uniqueName = uniqueKeyName(table, [config.name]);\n\t\t}\n\t\tsuper(table, config);\n\t}\n}\n\nexport type IndexedExtraConfigType = { order?: 'asc' | 'desc'; nulls?: 'first' | 'last'; opClass?: string };\n\nexport class ExtraConfigColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n> extends PgColumn<T, IndexedExtraConfigType> {\n\tstatic override readonly [entityKind]: string = 'ExtraConfigColumn';\n\n\toverride getSQLType(): string {\n\t\treturn this.getSQLType();\n\t}\n\n\tindexConfig: IndexedExtraConfigType = {\n\t\torder: this.config.order ?? 'asc',\n\t\tnulls: this.config.nulls ?? 'last',\n\t\topClass: this.config.opClass,\n\t};\n\tdefaultConfig: IndexedExtraConfigType = {\n\t\torder: 'asc',\n\t\tnulls: 'last',\n\t\topClass: undefined,\n\t};\n\n\tasc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'asc';\n\t\treturn this;\n\t}\n\n\tdesc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'desc';\n\t\treturn this;\n\t}\n\n\tnullsFirst(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'first';\n\t\treturn this;\n\t}\n\n\tnullsLast(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'last';\n\t\treturn this;\n\t}\n\n\t/**\n\t * ### PostgreSQL documentation quote\n\t *\n\t * > An operator class with optional parameters can be specified for each column of an index.\n\t * The operator class identifies the operators to be used by the index for that column.\n\t * For example, a B-tree index on four-byte integers would use the int4_ops class;\n\t * this operator class includes comparison functions for four-byte integers.\n\t * In practice the default operator class for the column's data type is usually sufficient.\n\t * The main point of having operator classes is that for some data types, there could be more than one meaningful ordering.\n\t * For example, we might want to sort a complex-number data type either by absolute value or by real part.\n\t * We could do this by defining two operator classes for the data type and then selecting the proper class when creating an index.\n\t * More information about operator classes check:\n\t *\n\t * ### Useful links\n\t * https://www.postgresql.org/docs/current/sql-createindex.html\n\t *\n\t * https://www.postgresql.org/docs/current/indexes-opclass.html\n\t *\n\t * https://www.postgresql.org/docs/current/xindex.html\n\t *\n\t * ### Additional types\n\t * If you have the `pg_vector` extension installed in your database, you can use the\n\t * `vector_l2_ops`, `vector_ip_ops`, `vector_cosine_ops`, `vector_l1_ops`, `bit_hamming_ops`, `bit_jaccard_ops`, `halfvec_l2_ops`, `sparsevec_l2_ops` options, which are predefined types.\n\t *\n\t * **You can always specify any string you want in the operator class, in case Drizzle doesn't have it natively in its types**\n\t *\n\t * @param opClass\n\t * @returns\n\t */\n\top(opClass: PgIndexOpClass): Omit<this, 'op'> {\n\t\tthis.indexConfig.opClass = opClass;\n\t\treturn this;\n\t}\n}\n\nexport class IndexedColumn {\n\tstatic readonly [entityKind]: string = 'IndexedColumn';\n\tconstructor(\n\t\tname: string | undefined,\n\t\tkeyAsName: boolean,\n\t\ttype: string,\n\t\tindexConfig: IndexedExtraConfigType,\n\t) {\n\t\tthis.name = name;\n\t\tthis.keyAsName = keyAsName;\n\t\tthis.type = type;\n\t\tthis.indexConfig = indexConfig;\n\t}\n\n\tname: string | undefined;\n\tkeyAsName: boolean;\n\ttype: string;\n\tindexConfig: IndexedExtraConfigType;\n}\n\nexport type AnyPgColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = PgColumn<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n\nexport type PgArrayColumnBuilderBaseConfig = ColumnBuilderBaseConfig<'array', 'PgArray'> & {\n\tsize: number | undefined;\n\tbaseBuilder: ColumnBuilderBaseConfig<ColumnDataType, string>;\n};\n\nexport class PgArrayBuilder<\n\tT extends PgArrayColumnBuilderBaseConfig,\n\tTBase extends ColumnBuilderBaseConfig<ColumnDataType, string> | PgArrayColumnBuilderBaseConfig,\n> extends PgColumnBuilder<\n\tT,\n\t{\n\t\tbaseBuilder: TBase extends PgArrayColumnBuilderBaseConfig ? PgArrayBuilder<\n\t\t\t\tTBase,\n\t\t\t\tTBase extends { baseBuilder: infer TBaseBuilder extends ColumnBuilderBaseConfig<any, any> } ? TBaseBuilder\n\t\t\t\t\t: never\n\t\t\t>\n\t\t\t: PgColumnBuilder<TBase, {}, Simplify<Omit<TBase, keyof ColumnBuilderBaseConfig<any, any>>>>;\n\t\tsize: T['size'];\n\t},\n\t{\n\t\tbaseBuilder: TBase extends PgArrayColumnBuilderBaseConfig ? PgArrayBuilder<\n\t\t\t\tTBase,\n\t\t\t\tTBase extends { baseBuilder: infer TBaseBuilder extends ColumnBuilderBaseConfig<any, any> } ? TBaseBuilder\n\t\t\t\t\t: never\n\t\t\t>\n\t\t\t: PgColumnBuilder<TBase, {}, Simplify<Omit<TBase, keyof ColumnBuilderBaseConfig<any, any>>>>;\n\t\tsize: T['size'];\n\t}\n> {\n\tstatic override readonly [entityKind] = 'PgArrayBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\tbaseBuilder: PgArrayBuilder<T, TBase>['config']['baseBuilder'],\n\t\tsize: T['size'],\n\t) {\n\t\tsuper(name, 'array', 'PgArray');\n\t\tthis.config.baseBuilder = baseBuilder;\n\t\tthis.config.size = size;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgArray<MakeColumnConfig<T, TTableName> & { size: T['size']; baseBuilder: T['baseBuilder'] }, TBase> {\n\t\tconst baseColumn = this.config.baseBuilder.build(table);\n\t\treturn new PgArray<MakeColumnConfig<T, TTableName> & { size: T['size']; baseBuilder: T['baseBuilder'] }, TBase>(\n\t\t\ttable as AnyPgTable<{ name: MakeColumnConfig<T, TTableName>['tableName'] }>,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t\tbaseColumn,\n\t\t);\n\t}\n}\n\nexport class PgArray<\n\tT extends ColumnBaseConfig<'array', 'PgArray'> & {\n\t\tsize: number | undefined;\n\t\tbaseBuilder: ColumnBuilderBaseConfig<ColumnDataType, string>;\n\t},\n\tTBase extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n> extends PgColumn<T, {}, { size: T['size']; baseBuilder: T['baseBuilder'] }> {\n\treadonly size: T['size'];\n\n\tstatic override readonly [entityKind]: string = 'PgArray';\n\n\tconstructor(\n\t\ttable: AnyPgTable<{ name: T['tableName'] }>,\n\t\tconfig: PgArrayBuilder<T, TBase>['config'],\n\t\treadonly baseColumn: PgColumn,\n\t\treadonly range?: [number | undefined, number | undefined],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.size = config.size;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `${this.baseColumn.getSQLType()}[${typeof this.size === 'number' ? this.size : ''}]`;\n\t}\n\n\toverride mapFromDriverValue(value: unknown[] | string): T['data'] {\n\t\tif (typeof value === 'string') {\n\t\t\t// Thank you node-postgres for not parsing enum arrays\n\t\t\tvalue = parsePgArray(value);\n\t\t}\n\t\treturn value.map((v) => this.baseColumn.mapFromDriverValue(v));\n\t}\n\n\toverride mapToDriverValue(value: unknown[], isNestedArray = false): unknown[] | string {\n\t\tconst a = value.map((v) =>\n\t\t\tv === null\n\t\t\t\t? null\n\t\t\t\t: is(this.baseColumn, PgArray)\n\t\t\t\t? this.baseColumn.mapToDriverValue(v as unknown[], true)\n\t\t\t\t: this.baseColumn.mapToDriverValue(v)\n\t\t);\n\t\tif (isNestedArray) return a;\n\t\treturn makePgArray(a);\n\t}\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport type { Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgEnumColumnBuilderInitial<TName extends string, TValues extends [string, ...string[]]> =\n\tPgEnumColumnBuilder<{\n\t\tname: TName;\n\t\tdataType: 'string';\n\t\tcolumnType: 'PgEnumColumn';\n\t\tdata: TValues[number];\n\t\tenumValues: TValues;\n\t\tdriverParam: string;\n\t}>;\n\nconst isPgEnumSym = Symbol.for('drizzle:isPgEnum');\nexport interface PgEnum<TValues extends [string, ...string[]]> {\n\t(): PgEnumColumnBuilderInitial<'', TValues>;\n\t<TName extends string>(name: TName): PgEnumColumnBuilderInitial<TName, TValues>;\n\t<TName extends string>(name?: TName): PgEnumColumnBuilderInitial<TName, TValues>;\n\n\treadonly enumName: string;\n\treadonly enumValues: TValues;\n\treadonly schema: string | undefined;\n\t/** @internal */\n\t[isPgEnumSym]: true;\n}\n\nexport function isPgEnum(obj: unknown): obj is PgEnum<[string, ...string[]]> {\n\treturn !!obj && typeof obj === 'function' && isPgEnumSym in obj && obj[isPgEnumSym] === true;\n}\n\nexport class PgEnumColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'PgEnumColumn'> & { enumValues: [string, ...string[]] },\n> extends PgColumnBuilder<T, { enum: PgEnum<T['enumValues']> }> {\n\tstatic override readonly [entityKind]: string = 'PgEnumColumnBuilder';\n\n\tconstructor(name: T['name'], enumInstance: PgEnum<T['enumValues']>) {\n\t\tsuper(name, 'string', 'PgEnumColumn');\n\t\tthis.config.enum = enumInstance;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgEnumColumn<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgEnumColumn<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgEnumColumn<T extends ColumnBaseConfig<'string', 'PgEnumColumn'> & { enumValues: [string, ...string[]] }>\n\textends PgColumn<T, { enum: PgEnum<T['enumValues']> }>\n{\n\tstatic override readonly [entityKind]: string = 'PgEnumColumn';\n\n\treadonly enum = this.config.enum;\n\toverride readonly enumValues = this.config.enum.enumValues;\n\n\tconstructor(\n\t\ttable: AnyPgTable<{ name: T['tableName'] }>,\n\t\tconfig: PgEnumColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.enum = config.enum;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.enum.enumName;\n\t}\n}\n\n// Gratitude to zod for the enum function types\nexport function pgEnum<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tenumName: string,\n\tvalues: T | Writable<T>,\n): PgEnum<Writable<T>> {\n\treturn pgEnumWithSchema(enumName, values, undefined);\n}\n\n/** @internal */\nexport function pgEnumWithSchema<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tenumName: string,\n\tvalues: T | Writable<T>,\n\tschema?: string,\n): PgEnum<Writable<T>> {\n\tconst enumInstance: PgEnum<Writable<T>> = Object.assign(\n\t\t<TName extends string>(name?: TName): PgEnumColumnBuilderInitial<TName, Writable<T>> =>\n\t\t\tnew PgEnumColumnBuilder(name ?? '' as TName, enumInstance),\n\t\t{\n\t\t\tenumName,\n\t\t\tenumValues: values,\n\t\t\tschema,\n\t\t\t[isPgEnumSym]: true,\n\t\t} as const,\n\t);\n\n\treturn enumInstance;\n}\n","import { entityKind } from './entity.ts';\nimport type { SQL, SQLWrapper } from './sql/sql.ts';\n\nexport interface Subquery<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTAlias extends string = string,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTSelectedFields extends Record<string, unknown> = Record<string, unknown>,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\nexport class Subquery<\n\tTAlias extends string = string,\n\tTSelectedFields extends Record<string, unknown> = Record<string, unknown>,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Subquery';\n\n\tdeclare _: {\n\t\tbrand: 'Subquery';\n\t\tsql: SQL;\n\t\tselectedFields: TSelectedFields;\n\t\talias: TAlias;\n\t\tisWith: boolean;\n\t};\n\n\tconstructor(sql: SQL, selection: Record<string, unknown>, alias: string, isWith = false) {\n\t\tthis._ = {\n\t\t\tbrand: 'Subquery',\n\t\t\tsql,\n\t\t\tselectedFields: selection as TSelectedFields,\n\t\t\talias: alias as TAlias,\n\t\t\tisWith,\n\t\t};\n\t}\n\n\t// getSQL(): SQL<unknown> {\n\t// \treturn new SQL([this]);\n\t// }\n}\n\nexport class WithSubquery<\n\tTAlias extends string = string,\n\tTSelection extends Record<string, unknown> = Record<string, unknown>,\n> extends Subquery<TAlias, TSelection> {\n\tstatic override readonly [entityKind]: string = 'WithSubquery';\n}\n\nexport type WithSubqueryWithoutSelection<TAlias extends string> = WithSubquery<TAlias, {}>;\n","// package.json\nvar version = \"0.39.3\";\n\n// src/version.ts\nvar compatibilityVersion = 10;\nexport {\n compatibilityVersion,\n version as npmVersion\n};\n","import type { Span, Tracer } from '@opentelemetry/api';\nimport { iife } from '~/tracing-utils.ts';\nimport { npmVersion } from '~/version.ts';\n\nlet otel: typeof import('@opentelemetry/api') | undefined;\nlet rawTracer: Tracer | undefined;\n// try {\n// \totel = await import('@opentelemetry/api');\n// } catch (err: any) {\n// \tif (err.code !== 'MODULE_NOT_FOUND' && err.code !== 'ERR_MODULE_NOT_FOUND') {\n// \t\tthrow err;\n// \t}\n// }\n\ntype SpanName =\n\t| 'drizzle.operation'\n\t| 'drizzle.prepareQuery'\n\t| 'drizzle.buildSQL'\n\t| 'drizzle.execute'\n\t| 'drizzle.driver.execute'\n\t| 'drizzle.mapResponse';\n\n/** @internal */\nexport const tracer = {\n\tstartActiveSpan<F extends (span?: Span) => unknown>(name: SpanName, fn: F): ReturnType<F> {\n\t\tif (!otel) {\n\t\t\treturn fn() as ReturnType<F>;\n\t\t}\n\n\t\tif (!rawTracer) {\n\t\t\trawTracer = otel.trace.getTracer('drizzle-orm', npmVersion);\n\t\t}\n\n\t\treturn iife(\n\t\t\t(otel, rawTracer) =>\n\t\t\t\trawTracer.startActiveSpan(\n\t\t\t\t\tname,\n\t\t\t\t\t((span: Span) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn fn(span);\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\t\t\tcode: otel.SpanStatusCode.ERROR,\n\t\t\t\t\t\t\t\tmessage: e instanceof Error ? e.message : 'Unknown error', // eslint-disable-line no-instanceof/no-instanceof\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tspan.end();\n\t\t\t\t\t\t}\n\t\t\t\t\t}) as F,\n\t\t\t\t),\n\t\t\totel,\n\t\t\trawTracer,\n\t\t);\n\t},\n};\n","export const ViewBaseConfig = Symbol.for('drizzle:ViewBaseConfig');\n","import type { CasingCache } from '~/casing.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { isPgEnum } from '~/pg-core/columns/enum.ts';\nimport type { SelectResult } from '~/query-builders/select.types.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { Assume, Equal } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { AnyColumn } from '../column.ts';\nimport { Column } from '../column.ts';\nimport { IsAlias, Table } from '../table.ts';\n\n/**\n * This class is used to indicate a primitive param value that is used in `sql` tag.\n * It is only used on type level and is never instantiated at runtime.\n * If you see a value of this type in the code, its runtime value is actually the primitive param value.\n */\nexport class FakePrimitiveParam {\n\tstatic readonly [entityKind]: string = 'FakePrimitiveParam';\n}\n\nexport type Chunk =\n\t| string\n\t| Table\n\t| View\n\t| AnyColumn\n\t| Name\n\t| Param\n\t| Placeholder\n\t| SQL;\n\nexport interface BuildQueryConfig {\n\tcasing: CasingCache;\n\tescapeName(name: string): string;\n\tescapeParam(num: number, value: unknown): string;\n\tescapeString(str: string): string;\n\tprepareTyping?: (encoder: DriverValueEncoder<unknown, unknown>) => QueryTypingsValue;\n\tparamStartIndex?: { value: number };\n\tinlineParams?: boolean;\n\tinvokeSource?: 'indexes' | undefined;\n}\n\nexport type QueryTypingsValue = 'json' | 'decimal' | 'time' | 'timestamp' | 'uuid' | 'date' | 'none';\n\nexport interface Query {\n\tsql: string;\n\tparams: unknown[];\n}\n\nexport interface QueryWithTypings extends Query {\n\ttypings?: QueryTypingsValue[];\n}\n\n/**\n * Any value that implements the `getSQL` method. The implementations include:\n * - `Table`\n * - `Column`\n * - `View`\n * - `Subquery`\n * - `SQL`\n * - `SQL.Aliased`\n * - `Placeholder`\n * - `Param`\n */\nexport interface SQLWrapper {\n\tgetSQL(): SQL;\n\tshouldOmitSQLParens?(): boolean;\n}\n\nexport function isSQLWrapper(value: unknown): value is SQLWrapper {\n\treturn value !== null && value !== undefined && typeof (value as any).getSQL === 'function';\n}\n\nfunction mergeQueries(queries: QueryWithTypings[]): QueryWithTypings {\n\tconst result: QueryWithTypings = { sql: '', params: [] };\n\tfor (const query of queries) {\n\t\tresult.sql += query.sql;\n\t\tresult.params.push(...query.params);\n\t\tif (query.typings?.length) {\n\t\t\tif (!result.typings) {\n\t\t\t\tresult.typings = [];\n\t\t\t}\n\t\t\tresult.typings.push(...query.typings);\n\t\t}\n\t}\n\treturn result;\n}\n\nexport class StringChunk implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'StringChunk';\n\n\treadonly value: string[];\n\n\tconstructor(value: string | string[]) {\n\t\tthis.value = Array.isArray(value) ? value : [value];\n\t}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\nexport class SQL<T = unknown> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'SQL';\n\n\tdeclare _: {\n\t\tbrand: 'SQL';\n\t\ttype: T;\n\t};\n\n\t/** @internal */\n\tdecoder: DriverValueDecoder<T, any> = noopDecoder;\n\tprivate shouldInlineParams = false;\n\n\tconstructor(readonly queryChunks: SQLChunk[]) {}\n\n\tappend(query: SQL): this {\n\t\tthis.queryChunks.push(...query.queryChunks);\n\t\treturn this;\n\t}\n\n\ttoQuery(config: BuildQueryConfig): QueryWithTypings {\n\t\treturn tracer.startActiveSpan('drizzle.buildSQL', (span) => {\n\t\t\tconst query = this.buildQueryFromSourceParams(this.queryChunks, config);\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': query.sql,\n\t\t\t\t'drizzle.query.params': JSON.stringify(query.params),\n\t\t\t});\n\t\t\treturn query;\n\t\t});\n\t}\n\n\tbuildQueryFromSourceParams(chunks: SQLChunk[], _config: BuildQueryConfig): Query {\n\t\tconst config = Object.assign({}, _config, {\n\t\t\tinlineParams: _config.inlineParams || this.shouldInlineParams,\n\t\t\tparamStartIndex: _config.paramStartIndex || { value: 0 },\n\t\t});\n\n\t\tconst {\n\t\t\tcasing,\n\t\t\tescapeName,\n\t\t\tescapeParam,\n\t\t\tprepareTyping,\n\t\t\tinlineParams,\n\t\t\tparamStartIndex,\n\t\t} = config;\n\n\t\treturn mergeQueries(chunks.map((chunk): QueryWithTypings => {\n\t\t\tif (is(chunk, StringChunk)) {\n\t\t\t\treturn { sql: chunk.value.join(''), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Name)) {\n\t\t\t\treturn { sql: escapeName(chunk.value), params: [] };\n\t\t\t}\n\n\t\t\tif (chunk === undefined) {\n\t\t\t\treturn { sql: '', params: [] };\n\t\t\t}\n\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\tconst result: SQLChunk[] = [new StringChunk('(')];\n\t\t\t\tfor (const [i, p] of chunk.entries()) {\n\t\t\t\t\tresult.push(p);\n\t\t\t\t\tif (i < chunk.length - 1) {\n\t\t\t\t\t\tresult.push(new StringChunk(', '));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult.push(new StringChunk(')'));\n\t\t\t\treturn this.buildQueryFromSourceParams(result, config);\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL)) {\n\t\t\t\treturn this.buildQueryFromSourceParams(chunk.queryChunks, {\n\t\t\t\t\t...config,\n\t\t\t\t\tinlineParams: inlineParams || chunk.shouldInlineParams,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (is(chunk, Table)) {\n\t\t\t\tconst schemaName = chunk[Table.Symbol.Schema];\n\t\t\t\tconst tableName = chunk[Table.Symbol.Name];\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === undefined || chunk[IsAlias]\n\t\t\t\t\t\t? escapeName(tableName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(tableName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Column)) {\n\t\t\t\tconst columnName = casing.getColumnCasing(chunk);\n\t\t\t\tif (_config.invokeSource === 'indexes') {\n\t\t\t\t\treturn { sql: escapeName(columnName), params: [] };\n\t\t\t\t}\n\n\t\t\t\tconst schemaName = chunk.table[Table.Symbol.Schema];\n\t\t\t\treturn {\n\t\t\t\t\tsql: chunk.table[IsAlias] || schemaName === undefined\n\t\t\t\t\t\t? escapeName(chunk.table[Table.Symbol.Name]) + '.' + escapeName(columnName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(chunk.table[Table.Symbol.Name]) + '.'\n\t\t\t\t\t\t\t+ escapeName(columnName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, View)) {\n\t\t\t\tconst schemaName = chunk[ViewBaseConfig].schema;\n\t\t\t\tconst viewName = chunk[ViewBaseConfig].name;\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === undefined || chunk[ViewBaseConfig].isAlias\n\t\t\t\t\t\t? escapeName(viewName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(viewName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Param)) {\n\t\t\t\tif (is(chunk.value, Placeholder)) {\n\t\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t\t}\n\n\t\t\t\tconst mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);\n\n\t\t\t\tif (is(mappedValue, SQL)) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([mappedValue], config);\n\t\t\t\t}\n\n\t\t\t\tif (inlineParams) {\n\t\t\t\t\treturn { sql: this.mapInlineParam(mappedValue, config), params: [] };\n\t\t\t\t}\n\n\t\t\t\tlet typings: QueryTypingsValue[] = ['none'];\n\t\t\t\tif (prepareTyping) {\n\t\t\t\t\ttypings = [prepareTyping(chunk.encoder)];\n\t\t\t\t}\n\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };\n\t\t\t}\n\n\t\t\tif (is(chunk, Placeholder)) {\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {\n\t\t\t\treturn { sql: escapeName(chunk.fieldAlias), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Subquery)) {\n\t\t\t\tif (chunk._.isWith) {\n\t\t\t\t\treturn { sql: escapeName(chunk._.alias), params: [] };\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk._.sql,\n\t\t\t\t\tnew StringChunk(') '),\n\t\t\t\t\tnew Name(chunk._.alias),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (isPgEnum(chunk)) {\n\t\t\t\tif (chunk.schema) {\n\t\t\t\t\treturn { sql: escapeName(chunk.schema) + '.' + escapeName(chunk.enumName), params: [] };\n\t\t\t\t}\n\t\t\t\treturn { sql: escapeName(chunk.enumName), params: [] };\n\t\t\t}\n\n\t\t\tif (isSQLWrapper(chunk)) {\n\t\t\t\tif (chunk.shouldOmitSQLParens?.()) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([chunk.getSQL()], config);\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk.getSQL(),\n\t\t\t\t\tnew StringChunk(')'),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (inlineParams) {\n\t\t\t\treturn { sql: this.mapInlineParam(chunk, config), params: [] };\n\t\t\t}\n\n\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t}));\n\t}\n\n\tprivate mapInlineParam(\n\t\tchunk: unknown,\n\t\t{ escapeString }: BuildQueryConfig,\n\t): string {\n\t\tif (chunk === null) {\n\t\t\treturn 'null';\n\t\t}\n\t\tif (typeof chunk === 'number' || typeof chunk === 'boolean') {\n\t\t\treturn chunk.toString();\n\t\t}\n\t\tif (typeof chunk === 'string') {\n\t\t\treturn escapeString(chunk);\n\t\t}\n\t\tif (typeof chunk === 'object') {\n\t\t\tconst mappedValueAsString = chunk.toString();\n\t\t\tif (mappedValueAsString === '[object Object]') {\n\t\t\t\treturn escapeString(JSON.stringify(chunk));\n\t\t\t}\n\t\t\treturn escapeString(mappedValueAsString);\n\t\t}\n\t\tthrow new Error('Unexpected param value: ' + chunk);\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this;\n\t}\n\n\tas(alias: string): SQL.Aliased<T>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(): SQL<TData>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(alias: string): SQL.Aliased<TData>;\n\tas(alias?: string): SQL<T> | SQL.Aliased<T> {\n\t\t// TODO: remove with deprecated overloads\n\t\tif (alias === undefined) {\n\t\t\treturn this;\n\t\t}\n\n\t\treturn new SQL.Aliased(this, alias);\n\t}\n\n\tmapWith<\n\t\tTDecoder extends\n\t\t\t| DriverValueDecoder<any, any>\n\t\t\t| DriverValueDecoder<any, any>['mapFromDriverValue'],\n\t>(decoder: TDecoder): SQL<GetDecoderResult<TDecoder>> {\n\t\tthis.decoder = typeof decoder === 'function' ? { mapFromDriverValue: decoder } : decoder;\n\t\treturn this as SQL<GetDecoderResult<TDecoder>>;\n\t}\n\n\tinlineParams(): this {\n\t\tthis.shouldInlineParams = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * This method is used to conditionally include a part of the query.\n\t *\n\t * @param condition - Condition to check\n\t * @returns itself if the condition is `true`, otherwise `undefined`\n\t */\n\tif(condition: any | undefined): this | undefined {\n\t\treturn condition ? this : undefined;\n\t}\n}\n\nexport type GetDecoderResult<T> = T extends Column ? T['_']['data'] : T extends\n\t| DriverValueDecoder<infer TData, any>\n\t| DriverValueDecoder<infer TData, any>['mapFromDriverValue'] ? TData\n: never;\n\n/**\n * Any DB name (table, column, index etc.)\n */\nexport class Name implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Name';\n\n\tprotected brand!: 'Name';\n\n\tconstructor(readonly value: string) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/**\n * Any DB name (table, column, index etc.)\n * @deprecated Use `sql.identifier` instead.\n */\nexport function name(value: string): Name {\n\treturn new Name(value);\n}\n\nexport interface DriverValueDecoder<TData, TDriverParam> {\n\tmapFromDriverValue(value: TDriverParam): TData;\n}\n\nexport interface DriverValueEncoder<TData, TDriverParam> {\n\tmapToDriverValue(value: TData): TDriverParam | SQL;\n}\n\nexport function isDriverValueEncoder(value: unknown): value is DriverValueEncoder<any, any> {\n\treturn typeof value === 'object' && value !== null && 'mapToDriverValue' in value\n\t\t&& typeof (value as any).mapToDriverValue === 'function';\n}\n\nexport const noopDecoder: DriverValueDecoder<any, any> = {\n\tmapFromDriverValue: (value) => value,\n};\n\nexport const noopEncoder: DriverValueEncoder<any, any> = {\n\tmapToDriverValue: (value) => value,\n};\n\nexport interface DriverValueMapper<TData, TDriverParam>\n\textends DriverValueDecoder<TData, TDriverParam>, DriverValueEncoder<TData, TDriverParam>\n{}\n\nexport const noopMapper: DriverValueMapper<any, any> = {\n\t...noopDecoder,\n\t...noopEncoder,\n};\n\n/** Parameter value that is optionally bound to an encoder (for example, a column). */\nexport class Param<TDataType = unknown, TDriverParamType = TDataType> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Param';\n\n\tprotected brand!: 'BoundParamValue';\n\n\t/**\n\t * @param value - Parameter value\n\t * @param encoder - Encoder to convert the value to a driver parameter\n\t */\n\tconstructor(\n\t\treadonly value: TDataType,\n\t\treadonly encoder: DriverValueEncoder<TDataType, TDriverParamType> = noopEncoder,\n\t) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.param` instead. */\nexport function param<TData, TDriver>(\n\tvalue: TData,\n\tencoder?: DriverValueEncoder<TData, TDriver>,\n): Param<TData, TDriver> {\n\treturn new Param(value, encoder);\n}\n\n/**\n * Anything that can be passed to the `` sql`...` `` tagged function.\n */\nexport type SQLChunk =\n\t| StringChunk\n\t| SQLChunk[]\n\t| SQLWrapper\n\t| SQL\n\t| Table\n\t| View\n\t| Subquery\n\t| AnyColumn\n\t| Param\n\t| Name\n\t| undefined\n\t| FakePrimitiveParam\n\t| Placeholder;\n\nexport function sql<T>(strings: TemplateStringsArray, ...params: any[]): SQL<T>;\n/*\n\tThe type of `params` is specified as `SQLChunk[]`, but that's slightly incorrect -\n\tin runtime, users won't pass `FakePrimitiveParam` instances as `params` - they will pass primitive values\n\twhich will be wrapped in `Param`. That's why the overload specifies `params` as `any[]` and not as `SQLSourceParam[]`.\n\tThis type is used to make our lives easier and the type checker happy.\n*/\nexport function sql(strings: TemplateStringsArray, ...params: SQLChunk[]): SQL {\n\tconst queryChunks: SQLChunk[] = [];\n\tif (params.length > 0 || (strings.length > 0 && strings[0] !== '')) {\n\t\tqueryChunks.push(new StringChunk(strings[0]!));\n\t}\n\tfor (const [paramIndex, param] of params.entries()) {\n\t\tqueryChunks.push(param, new StringChunk(strings[paramIndex + 1]!));\n\t}\n\n\treturn new SQL(queryChunks);\n}\n\nexport namespace sql {\n\texport function empty(): SQL {\n\t\treturn new SQL([]);\n\t}\n\n\t/** @deprecated - use `sql.join()` */\n\texport function fromList(list: SQLChunk[]): SQL {\n\t\treturn new SQL(list);\n\t}\n\n\t/**\n\t * Convenience function to create an SQL query from a raw string.\n\t * @param str The raw SQL query string.\n\t */\n\texport function raw(str: string): SQL {\n\t\treturn new SQL([new StringChunk(str)]);\n\t}\n\n\t/**\n\t * Join a list of SQL chunks with a separator.\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`]);\n\t * // sql`abc`\n\t * ```\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`], sql`, `);\n\t * // sql`a, b, c`\n\t * ```\n\t */\n\texport function join(chunks: SQLChunk[], separator?: SQLChunk): SQL {\n\t\tconst result: SQLChunk[] = [];\n\t\tfor (const [i, chunk] of chunks.entries()) {\n\t\t\tif (i > 0 && separator !== undefined) {\n\t\t\t\tresult.push(separator);\n\t\t\t}\n\t\t\tresult.push(chunk);\n\t\t}\n\t\treturn new SQL(result);\n\t}\n\n\t/**\n\t * Create a SQL chunk that represents a DB identifier (table, column, index etc.).\n\t * When used in a query, the identifier will be escaped based on the DB engine.\n\t * For example, in PostgreSQL, identifiers are escaped with double quotes.\n\t *\n\t * **WARNING: This function does not offer any protection against SQL injections, so you must validate any user input beforehand.**\n\t *\n\t * @example ```ts\n\t * const query = sql`SELECT * FROM ${sql.identifier('my-table')}`;\n\t * // 'SELECT * FROM \"my-table\"'\n\t * ```\n\t */\n\texport function identifier(value: string): Name {\n\t\treturn new Name(value);\n\t}\n\n\texport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\t\treturn new Placeholder(name);\n\t}\n\n\texport function param<TData, TDriver>(\n\t\tvalue: TData,\n\t\tencoder?: DriverValueEncoder<TData, TDriver>,\n\t): Param<TData, TDriver> {\n\t\treturn new Param(value, encoder);\n\t}\n}\n\nexport namespace SQL {\n\texport class Aliased<T = unknown> implements SQLWrapper {\n\t\tstatic readonly [entityKind]: string = 'SQL.Aliased';\n\n\t\tdeclare _: {\n\t\t\tbrand: 'SQL.Aliased';\n\t\t\ttype: T;\n\t\t};\n\n\t\t/** @internal */\n\t\tisSelectionField = false;\n\n\t\tconstructor(\n\t\t\treadonly sql: SQL,\n\t\t\treadonly fieldAlias: string,\n\t\t) {}\n\n\t\tgetSQL(): SQL {\n\t\t\treturn this.sql;\n\t\t}\n\n\t\t/** @internal */\n\t\tclone() {\n\t\t\treturn new Aliased(this.sql, this.fieldAlias);\n\t\t}\n\t}\n}\n\nexport class Placeholder<TName extends string = string, TValue = any> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Placeholder';\n\n\tdeclare protected: TValue;\n\n\tconstructor(readonly name: TName) {}\n\n\tgetSQL(): SQL {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.placeholder` instead. */\nexport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\treturn new Placeholder(name);\n}\n\nexport function fillPlaceholders(params: unknown[], values: Record<string, unknown>): unknown[] {\n\treturn params.map((p) => {\n\t\tif (is(p, Placeholder)) {\n\t\t\tif (!(p.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.name}\" was provided`);\n\t\t\t}\n\n\t\t\treturn values[p.name];\n\t\t}\n\n\t\tif (is(p, Param) && is(p.value, Placeholder)) {\n\t\t\tif (!(p.value.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.value.name}\" was provided`);\n\t\t\t}\n\n\t\t\treturn p.encoder.mapToDriverValue(values[p.value.name]);\n\t\t}\n\n\t\treturn p;\n\t});\n}\n\nexport type ColumnsSelection = Record<string, unknown>;\n\nconst IsDrizzleView = Symbol.for('drizzle:IsDrizzleView');\n\nexport abstract class View<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'View';\n\n\tdeclare _: {\n\t\tbrand: 'View';\n\t\tviewBrand: string;\n\t\tname: TName;\n\t\texisting: TExisting;\n\t\tselectedFields: TSelection;\n\t};\n\n\t/** @internal */\n\t[ViewBaseConfig]: {\n\t\tname: TName;\n\t\toriginalName: TName;\n\t\tschema: string | undefined;\n\t\tselectedFields: ColumnsSelection;\n\t\tisExisting: TExisting;\n\t\tquery: TExisting extends true ? undefined : SQL;\n\t\tisAlias: boolean;\n\t};\n\n\t/** @internal */\n\t[IsDrizzleView] = true;\n\n\tdeclare readonly $inferSelect: InferSelectViewModel<View<Assume<TName, string>, TExisting, TSelection>>;\n\n\tconstructor(\n\t\t{ name, schema, selectedFields, query }: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: ColumnsSelection;\n\t\t\tquery: SQL | undefined;\n\t\t},\n\t) {\n\t\tthis[ViewBaseConfig] = {\n\t\t\tname,\n\t\t\toriginalName: name,\n\t\t\tschema,\n\t\t\tselectedFields,\n\t\t\tquery: query as (TExisting extends true ? undefined : SQL),\n\t\t\tisExisting: !query as TExisting,\n\t\t\tisAlias: false,\n\t\t};\n\t}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\nexport function isView(view: unknown): view is View {\n\treturn typeof view === 'object' && view !== null && IsDrizzleView in view;\n}\n\nexport function getViewName<T extends View>(view: T): T['_']['name'] {\n\treturn view[ViewBaseConfig].name;\n}\n\nexport type InferSelectViewModel<TView extends View> =\n\tEqual<TView['_']['selectedFields'], { [x: string]: unknown }> extends true ? { [x: string]: unknown }\n\t\t: SelectResult<\n\t\t\tTView['_']['selectedFields'],\n\t\t\t'single',\n\t\t\tRecord<TView['_']['name'], 'not-null'>\n\t\t>;\n\n// Defined separately from the Column class to resolve circular dependency\nColumn.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\n// Defined separately from the Table class to resolve circular dependency\nTable.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\n// Defined separately from the Column class to resolve circular dependency\nSubquery.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n","import type { AnyColumn } from './column.ts';\nimport { Column } from './column.ts';\nimport { is } from './entity.ts';\nimport type { Logger } from './logger.ts';\nimport type { SelectedFieldsOrdered } from './operations.ts';\nimport type { TableLike } from './query-builders/select.types.ts';\nimport { Param, SQL, View } from './sql/sql.ts';\nimport type { DriverValueDecoder } from './sql/sql.ts';\nimport { Subquery } from './subquery.ts';\nimport { getTableName, Table } from './table.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\n/** @internal */\nexport function mapResultRow<TResult>(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\trow: unknown[],\n\tjoinsNotNullableMap: Record<string, boolean> | undefined,\n): TResult {\n\t// Key -> nested object key, value -> table name if all fields in the nested object are from the same table, false otherwise\n\tconst nullifyMap: Record<string, string | false> = {};\n\n\tconst result = columns.reduce<Record<string, any>>(\n\t\t(result, { path, field }, columnIndex) => {\n\t\t\tlet decoder: DriverValueDecoder<unknown, unknown>;\n\t\t\tif (is(field, Column)) {\n\t\t\t\tdecoder = field;\n\t\t\t} else if (is(field, SQL)) {\n\t\t\t\tdecoder = field.decoder;\n\t\t\t} else {\n\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t}\n\t\t\tlet node = result;\n\t\t\tfor (const [pathChunkIndex, pathChunk] of path.entries()) {\n\t\t\t\tif (pathChunkIndex < path.length - 1) {\n\t\t\t\t\tif (!(pathChunk in node)) {\n\t\t\t\t\t\tnode[pathChunk] = {};\n\t\t\t\t\t}\n\t\t\t\t\tnode = node[pathChunk];\n\t\t\t\t} else {\n\t\t\t\t\tconst rawValue = row[columnIndex]!;\n\t\t\t\t\tconst value = node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue);\n\n\t\t\t\t\tif (joinsNotNullableMap && is(field, Column) && path.length === 2) {\n\t\t\t\t\t\tconst objectName = path[0]!;\n\t\t\t\t\t\tif (!(objectName in nullifyMap)) {\n\t\t\t\t\t\t\tnullifyMap[objectName] = value === null ? getTableName(field.table) : false;\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\ttypeof nullifyMap[objectName] === 'string' && nullifyMap[objectName] !== getTableName(field.table)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnullifyMap[objectName] = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\t{},\n\t);\n\n\t// Nullify all nested objects from nullifyMap that are nullable\n\tif (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {\n\t\tfor (const [objectName, tableName] of Object.entries(nullifyMap)) {\n\t\t\tif (typeof tableName === 'string' && !joinsNotNullableMap[tableName]) {\n\t\t\t\tresult[objectName] = null;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result as TResult;\n}\n\n/** @internal */\nexport function orderSelectedFields<TColumn extends AnyColumn>(\n\tfields: Record<string, unknown>,\n\tpathPrefix?: string[],\n): SelectedFieldsOrdered<TColumn> {\n\treturn Object.entries(fields).reduce<SelectedFieldsOrdered<AnyColumn>>((result, [name, field]) => {\n\t\tif (typeof name !== 'string') {\n\t\t\treturn result;\n\t\t}\n\n\t\tconst newPath = pathPrefix ? [...pathPrefix, name] : [name];\n\t\tif (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased)) {\n\t\t\tresult.push({ path: newPath, field });\n\t\t} else if (is(field, Table)) {\n\t\t\tresult.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath));\n\t\t} else {\n\t\t\tresult.push(...orderSelectedFields(field as Record<string, unknown>, newPath));\n\t\t}\n\t\treturn result;\n\t}, []) as SelectedFieldsOrdered<TColumn>;\n}\n\nexport function haveSameKeys(left: Record<string, unknown>, right: Record<string, unknown>) {\n\tconst leftKeys = Object.keys(left);\n\tconst rightKeys = Object.keys(right);\n\n\tif (leftKeys.length !== rightKeys.length) {\n\t\treturn false;\n\t}\n\n\tfor (const [index, key] of leftKeys.entries()) {\n\t\tif (key !== rightKeys[index]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/** @internal */\nexport function mapUpdateSet(table: Table, values: Record<string, unknown>): UpdateSet {\n\tconst entries: [string, UpdateSet[string]][] = Object.entries(values)\n\t\t.filter(([, value]) => value !== undefined)\n\t\t.map(([key, value]) => {\n\t\t\t// eslint-disable-next-line unicorn/prefer-ternary\n\t\t\tif (is(value, SQL) || is(value, Column)) {\n\t\t\t\treturn [key, value];\n\t\t\t} else {\n\t\t\t\treturn [key, new Param(value, table[Table.Symbol.Columns][key])];\n\t\t\t}\n\t\t});\n\n\tif (entries.length === 0) {\n\t\tthrow new Error('No values to set');\n\t}\n\n\treturn Object.fromEntries(entries);\n}\n\nexport type UpdateSet = Record<string, SQL | Param | AnyColumn | null | undefined>;\n\nexport type OneOrMany<T> = T | T[];\n\nexport type Update<T, TUpdate> =\n\t& {\n\t\t[K in Exclude<keyof T, keyof TUpdate>]: T[K];\n\t}\n\t& TUpdate;\n\nexport type Simplify<T> =\n\t& {\n\t\t// @ts-ignore - \"Type parameter 'K' has a circular constraint\", not sure why\n\t\t[K in keyof T]: T[K];\n\t}\n\t& {};\n\nexport type SimplifyMappedType<T> = [T] extends [unknown] ? T : never;\n\nexport type ShallowRecord<K extends keyof any, T> = SimplifyMappedType<{ [P in K]: T }>;\n\nexport type Assume<T, U> = T extends U ? T : U;\n\nexport type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;\n\nexport interface DrizzleTypeError<T extends string> {\n\t$drizzleTypeError: T;\n}\n\nexport type ValueOrArray<T> = T | T[];\n\n/** @internal */\nexport function applyMixins(baseClass: any, extendedClasses: any[]) {\n\tfor (const extendedClass of extendedClasses) {\n\t\tfor (const name of Object.getOwnPropertyNames(extendedClass.prototype)) {\n\t\t\tif (name === 'constructor') continue;\n\n\t\t\tObject.defineProperty(\n\t\t\t\tbaseClass.prototype,\n\t\t\t\tname,\n\t\t\t\tObject.getOwnPropertyDescriptor(extendedClass.prototype, name) || Object.create(null),\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport type Or<T1, T2> = T1 extends true ? true : T2 extends true ? true : false;\n\nexport type IfThenElse<If, Then, Else> = If extends true ? Then : Else;\n\nexport type PromiseOf<T> = T extends Promise<infer U> ? U : T;\n\nexport type Writable<T> = {\n\t-readonly [P in keyof T]: T[P];\n};\n\nexport function getTableColumns<T extends Table>(table: T): T['_']['columns'] {\n\treturn table[Table.Symbol.Columns];\n}\n\nexport function getViewSelectedFields<T extends View>(view: T): T['_']['selectedFields'] {\n\treturn view[ViewBaseConfig].selectedFields;\n}\n\n/** @internal */\nexport function getTableLikeName(table: TableLike): string | undefined {\n\treturn is(table, Subquery)\n\t\t? table._.alias\n\t\t: is(table, View)\n\t\t? table[ViewBaseConfig].name\n\t\t: is(table, SQL)\n\t\t? undefined\n\t\t: table[Table.Symbol.IsAlias]\n\t\t? table[Table.Symbol.Name]\n\t\t: table[Table.Symbol.BaseName];\n}\n\nexport type ColumnsWithTable<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends AnyColumn<{ tableName: TTableName }>[],\n> = { [Key in keyof TColumns]: AnyColumn<{ tableName: TForeignTableName }> };\n\nexport type Casing = 'snake_case' | 'camelCase';\n\nexport interface DrizzleConfig<TSchema extends Record<string, unknown> = Record<string, never>> {\n\tlogger?: boolean | Logger;\n\tschema?: TSchema;\n\tcasing?: Casing;\n}\nexport type ValidateShape<T, ValidShape, TResult = T> = T extends ValidShape\n\t? Exclude<keyof T, keyof ValidShape> extends never ? TResult\n\t: DrizzleTypeError<\n\t\t`Invalid key(s): ${Exclude<(keyof T) & (string | number | bigint | boolean | null | undefined), keyof ValidShape>}`\n\t>\n\t: never;\n\nexport type KnownKeysOnly<T, U> = {\n\t[K in keyof T]: K extends keyof U ? T[K] : never;\n};\n\nexport type IsAny<T> = 0 extends (1 & T) ? true : false;\n\n/** @internal */\nexport function getColumnNameAndConfig<\n\tTConfig extends Record<string, any> | undefined,\n>(a: string | TConfig | undefined, b: TConfig | undefined) {\n\treturn {\n\t\tname: typeof a === 'string' && a.length > 0 ? a : '' as string,\n\t\tconfig: typeof a === 'object' ? a : b as TConfig,\n\t};\n}\n\nexport type IfNotImported<T, Y, N> = unknown extends T ? Y : N;\n\nexport type ImportTypeError<TPackageName extends string> =\n\t`Please install \\`${TPackageName}\\` to allow Drizzle ORM to connect to the database`;\n\nexport type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Keys extends any\n\t? Required<Pick<T, Keys>> & Partial<Omit<T, Keys>>\n\t: never;\n\ntype ExpectedConfigShape = {\n\tlogger?: boolean | {\n\t\tlogQuery(query: string, params: unknown[]): void;\n\t};\n\tschema?: Record<string, never>;\n\tcasing?: 'snake_case' | 'camelCase';\n};\n\n// If this errors, you must update config shape checker function with new config specs\nconst _: DrizzleConfig = {} as ExpectedConfigShape;\nconst __: ExpectedConfigShape = {} as DrizzleConfig;\n\nexport function isConfig(data: any): boolean {\n\tif (typeof data !== 'object' || data === null) return false;\n\n\tif (data.constructor.name !== 'Object') return false;\n\n\tif ('logger' in data) {\n\t\tconst type = typeof data['logger'];\n\t\tif (\n\t\t\ttype !== 'boolean' && (type !== 'object' || typeof data['logger']['logQuery'] !== 'function')\n\t\t\t&& type !== 'undefined'\n\t\t) return false;\n\n\t\treturn true;\n\t}\n\n\tif ('schema' in data) {\n\t\tconst type = typeof data['logger'];\n\t\tif (type !== 'object' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('casing' in data) {\n\t\tconst type = typeof data['logger'];\n\t\tif (type !== 'string' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('mode' in data) {\n\t\tif (data['mode'] !== 'default' || data['mode'] !== 'planetscale' || data['mode'] !== undefined) return false;\n\n\t\treturn true;\n\t}\n\n\tif ('connection' in data) {\n\t\tconst type = typeof data['connection'];\n\t\tif (type !== 'string' && type !== 'object' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('client' in data) {\n\t\tconst type = typeof data['client'];\n\t\tif (type !== 'object' && type !== 'function' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif (Object.keys(data).length === 0) return true;\n\n\treturn false;\n}\n\nexport type NeonAuthToken = string | (() => string | Promise<string>);\n","import type { BuildColumns, BuildExtraConfigColumns } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport { Table, type TableConfig as TableConfigBase, type UpdateTableConfig } from '~/table.ts';\nimport type { CheckBuilder } from './checks.ts';\nimport { getPgColumnBuilders, type PgColumnsBuilders } from './columns/all.ts';\nimport type { PgColumn, PgColumnBuilder, PgColumnBuilderBase } from './columns/common.ts';\nimport type { ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { AnyIndexBuilder } from './indexes.ts';\nimport type { PgPolicy } from './policies.ts';\nimport type { PrimaryKeyBuilder } from './primary-keys.ts';\nimport type { UniqueConstraintBuilder } from './unique-constraint.ts';\n\nexport type PgTableExtraConfigValue =\n\t| AnyIndexBuilder\n\t| CheckBuilder\n\t| ForeignKeyBuilder\n\t| PrimaryKeyBuilder\n\t| UniqueConstraintBuilder\n\t| PgPolicy;\n\nexport type PgTableExtraConfig = Record<\n\tstring,\n\tPgTableExtraConfigValue\n>;\n\nexport type TableConfig = TableConfigBase<PgColumn>;\n\n/** @internal */\nexport const InlineForeignKeys = Symbol.for('drizzle:PgInlineForeignKeys');\n/** @internal */\nexport const EnableRLS = Symbol.for('drizzle:EnableRLS');\n\nexport class PgTable<T extends TableConfig = TableConfig> extends Table<T> {\n\tstatic override readonly [entityKind]: string = 'PgTable';\n\n\t/** @internal */\n\tstatic override readonly Symbol = Object.assign({}, Table.Symbol, {\n\t\tInlineForeignKeys: InlineForeignKeys as typeof InlineForeignKeys,\n\t\tEnableRLS: EnableRLS as typeof EnableRLS,\n\t});\n\n\t/**@internal */\n\t[InlineForeignKeys]: ForeignKey[] = [];\n\n\t/** @internal */\n\t[EnableRLS]: boolean = false;\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigBuilder]: ((self: Record<string, PgColumn>) => PgTableExtraConfig) | undefined =\n\t\tundefined;\n}\n\nexport type AnyPgTable<TPartial extends Partial<TableConfig> = {}> = PgTable<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport type PgTableWithColumns<T extends TableConfig> =\n\t& PgTable<T>\n\t& {\n\t\t[Key in keyof T['columns']]: T['columns'][Key];\n\t}\n\t& {\n\t\tenableRLS: () => Omit<\n\t\t\tPgTableWithColumns<T>,\n\t\t\t'enableRLS'\n\t\t>;\n\t};\n\n/** @internal */\nexport function pgTableWithSchema<\n\tTTableName extends string,\n\tTSchemaName extends string | undefined,\n\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n>(\n\tname: TTableName,\n\tcolumns: TColumnsMap | ((columnTypes: PgColumnsBuilders) => TColumnsMap),\n\textraConfig:\n\t\t| ((self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>) => PgTableExtraConfig | PgTableExtraConfigValue[])\n\t\t| undefined,\n\tschema: TSchemaName,\n\tbaseName = name,\n): PgTableWithColumns<{\n\tname: TTableName;\n\tschema: TSchemaName;\n\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\tdialect: 'pg';\n}> {\n\tconst rawTable = new PgTable<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>(name, schema, baseName);\n\n\tconst parsedColumns: TColumnsMap = typeof columns === 'function' ? columns(getPgColumnBuilders()) : columns;\n\n\tconst builtColumns = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as PgColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.build(rawTable);\n\t\t\trawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\n\tconst builtColumnsForExtraConfig = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as PgColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.buildExtraConfigColumn(rawTable);\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>;\n\n\tconst table = Object.assign(rawTable, builtColumns);\n\n\ttable[Table.Symbol.Columns] = builtColumns;\n\ttable[Table.Symbol.ExtraConfigColumns] = builtColumnsForExtraConfig;\n\n\tif (extraConfig) {\n\t\ttable[PgTable.Symbol.ExtraConfigBuilder] = extraConfig as any;\n\t}\n\n\treturn Object.assign(table, {\n\t\tenableRLS: () => {\n\t\t\ttable[PgTable.Symbol.EnableRLS] = true;\n\t\t\treturn table as PgTableWithColumns<{\n\t\t\t\tname: TTableName;\n\t\t\t\tschema: TSchemaName;\n\t\t\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\t\t\tdialect: 'pg';\n\t\t\t}>;\n\t\t},\n\t});\n}\n\nexport interface PgTableFn<TSchema extends string | undefined = undefined> {\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (\n\t\t\tself: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>,\n\t\t) => PgTableExtraConfigValue[],\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: PgColumnsBuilders) => TColumnsMap,\n\t\textraConfig?: (self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>) => PgTableExtraConfigValue[],\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n\t/**\n\t * @deprecated The third parameter of pgTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig: (\n\t\t\tself: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>,\n\t\t) => PgTableExtraConfig,\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n\n\t/**\n\t * @deprecated The third parameter of pgTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: PgColumnsBuilders) => TColumnsMap,\n\t\textraConfig: (self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>) => PgTableExtraConfig,\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n}\n\nexport const pgTable: PgTableFn = (name, columns, extraConfig) => {\n\treturn pgTableWithSchema(name, columns, extraConfig, undefined);\n};\n\nexport function pgTableCreator(customizeTableName: (name: string) => string): PgTableFn {\n\treturn (name, columns, extraConfig) => {\n\t\treturn pgTableWithSchema(customizeTableName(name) as typeof name, columns, extraConfig, undefined, name);\n\t};\n}\n","import { entityKind } from '~/entity.ts';\nimport type { AnyPgColumn, PgColumn } from './columns/index.ts';\nimport { PgTable } from './table.ts';\n\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumn extends AnyPgColumn<{ tableName: TTableName }>,\n\tTColumns extends AnyPgColumn<{ tableName: TTableName }>[],\n>(config: { name?: string; columns: [TColumn, ...TColumns] }): PrimaryKeyBuilder;\n/**\n * @deprecated: Please use primaryKey({ columns: [] }) instead of this function\n * @param columns\n */\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumns extends AnyPgColumn<{ tableName: TTableName }>[],\n>(...columns: TColumns): PrimaryKeyBuilder;\nexport function primaryKey(...config: any) {\n\tif (config[0].columns) {\n\t\treturn new PrimaryKeyBuilder(config[0].columns, config[0].name);\n\t}\n\treturn new PrimaryKeyBuilder(config);\n}\n\nexport class PrimaryKeyBuilder {\n\tstatic readonly [entityKind]: string = 'PgPrimaryKeyBuilder';\n\n\t/** @internal */\n\tcolumns: PgColumn[];\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tcolumns: PgColumn[],\n\t\tname?: string,\n\t) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): PrimaryKey {\n\t\treturn new PrimaryKey(table, this.columns, this.name);\n\t}\n}\n\nexport class PrimaryKey {\n\tstatic readonly [entityKind]: string = 'PgPrimaryKey';\n\n\treadonly columns: AnyPgColumn<{}>[];\n\treadonly name?: string;\n\n\tconstructor(readonly table: PgTable, columns: AnyPgColumn<{}>[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\tgetName(): string {\n\t\treturn this.name ?? `${this.table[PgTable.Symbol.Name]}_${this.columns.map((column) => column.name).join('_')}_pk`;\n\t}\n}\n","import { type AnyColumn, Column, type GetColumnData } from '~/column.ts';\nimport { is } from '~/entity.ts';\nimport { Table } from '~/table.ts';\nimport {\n\tisDriverValueEncoder,\n\tisSQLWrapper,\n\tParam,\n\tPlaceholder,\n\tSQL,\n\tsql,\n\ttype SQLChunk,\n\ttype SQLWrapper,\n\tStringChunk,\n\tView,\n} from '../sql.ts';\n\nexport function bindIfParam(value: unknown, column: SQLWrapper): SQLChunk {\n\tif (\n\t\tisDriverValueEncoder(column)\n\t\t&& !isSQLWrapper(value)\n\t\t&& !is(value, Param)\n\t\t&& !is(value, Placeholder)\n\t\t&& !is(value, Column)\n\t\t&& !is(value, Table)\n\t\t&& !is(value, View)\n\t) {\n\t\treturn new Param(value, column);\n\t}\n\treturn value as SQLChunk;\n}\n\nexport interface BinaryOperator {\n\t<TColumn extends Column>(\n\t\tleft: TColumn,\n\t\tright: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\t): SQL;\n\t<T>(left: SQL.Aliased<T>, right: T | SQLWrapper): SQL;\n\t<T extends SQLWrapper>(\n\t\tleft: Exclude<T, SQL.Aliased | Column>,\n\t\tright: unknown,\n\t): SQL;\n}\n\n/**\n * Test that two values are equal.\n *\n * Remember that the SQL standard dictates that\n * two NULL values are not equal, so if you want to test\n * whether a value is null, you may want to use\n * `isNull` instead.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by Ford\n * db.select().from(cars)\n * .where(eq(cars.make, 'Ford'))\n * ```\n *\n * @see isNull for a way to test equality to NULL.\n */\nexport const eq: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} = ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that two values are not equal.\n *\n * Remember that the SQL standard dictates that\n * two NULL values are not equal, so if you want to test\n * whether a value is not null, you may want to use\n * `isNotNull` instead.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars not made by Ford\n * db.select().from(cars)\n * .where(ne(cars.make, 'Ford'))\n * ```\n *\n * @see isNotNull for a way to test whether a value is not null.\n */\nexport const ne: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} <> ${bindIfParam(right, left)}`;\n};\n\n/**\n * Combine a list of conditions with the `and` operator. Conditions\n * that are equal `undefined` are automatically ignored.\n *\n * ## Examples\n *\n * ```ts\n * db.select().from(cars)\n * .where(\n * and(\n * eq(cars.make, 'Volvo'),\n * eq(cars.year, 1950),\n * )\n * )\n * ```\n */\nexport function and(...conditions: (SQLWrapper | undefined)[]): SQL | undefined;\nexport function and(\n\t...unfilteredConditions: (SQLWrapper | undefined)[]\n): SQL | undefined {\n\tconst conditions = unfilteredConditions.filter(\n\t\t(c): c is Exclude<typeof c, undefined> => c !== undefined,\n\t);\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn new SQL(conditions);\n\t}\n\n\treturn new SQL([\n\t\tnew StringChunk('('),\n\t\tsql.join(conditions, new StringChunk(' and ')),\n\t\tnew StringChunk(')'),\n\t]);\n}\n\n/**\n * Combine a list of conditions with the `or` operator. Conditions\n * that are equal `undefined` are automatically ignored.\n *\n * ## Examples\n *\n * ```ts\n * db.select().from(cars)\n * .where(\n * or(\n * eq(cars.make, 'GM'),\n * eq(cars.make, 'Ford'),\n * )\n * )\n * ```\n */\nexport function or(...conditions: (SQLWrapper | undefined)[]): SQL | undefined;\nexport function or(\n\t...unfilteredConditions: (SQLWrapper | undefined)[]\n): SQL | undefined {\n\tconst conditions = unfilteredConditions.filter(\n\t\t(c): c is Exclude<typeof c, undefined> => c !== undefined,\n\t);\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn new SQL(conditions);\n\t}\n\n\treturn new SQL([\n\t\tnew StringChunk('('),\n\t\tsql.join(conditions, new StringChunk(' or ')),\n\t\tnew StringChunk(')'),\n\t]);\n}\n\n/**\n * Negate the meaning of an expression using the `not` keyword.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars _not_ made by GM or Ford.\n * db.select().from(cars)\n * .where(not(inArray(cars.make, ['GM', 'Ford'])))\n * ```\n */\nexport function not(condition: SQLWrapper): SQL {\n\treturn sql`not ${condition}`;\n}\n\n/**\n * Test that the first expression passed is greater than\n * the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made after 2000.\n * db.select().from(cars)\n * .where(gt(cars.year, 2000))\n * ```\n *\n * @see gte for greater-than-or-equal\n */\nexport const gt: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} > ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is greater than\n * or equal to the second expression. Use `gt` to\n * test whether an expression is strictly greater\n * than another.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made on or after 2000.\n * db.select().from(cars)\n * .where(gte(cars.year, 2000))\n * ```\n *\n * @see gt for a strictly greater-than condition\n */\nexport const gte: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} >= ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is less than\n * the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made before 2000.\n * db.select().from(cars)\n * .where(lt(cars.year, 2000))\n * ```\n *\n * @see lte for less-than-or-equal\n */\nexport const lt: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} < ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is less than\n * or equal to the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made before 2000.\n * db.select().from(cars)\n * .where(lte(cars.year, 2000))\n * ```\n *\n * @see lt for a strictly less-than condition\n */\nexport const lte: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} <= ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test whether the first parameter, a column or expression,\n * has a value from a list passed as the second argument.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by Ford or GM.\n * db.select().from(cars)\n * .where(inArray(cars.make, ['Ford', 'GM']))\n * ```\n *\n * @see notInArray for the inverse of this test\n */\nexport function inArray<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function inArray<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function inArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function inArray(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn sql`false`;\n\t\t}\n\t\treturn sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;\n\t}\n\n\treturn sql`${column} in ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test whether the first parameter, a column or expression,\n * has a value that is not present in a list passed as the\n * second argument.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by any company except Ford or GM.\n * db.select().from(cars)\n * .where(notInArray(cars.make, ['Ford', 'GM']))\n * ```\n *\n * @see inArray for the inverse of this test\n */\nexport function notInArray<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn sql`true`;\n\t\t}\n\t\treturn sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;\n\t}\n\n\treturn sql`${column} not in ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test whether an expression is NULL. By the SQL standard,\n * NULL is neither equal nor not equal to itself, so\n * it's recommended to use `isNull` and `notIsNull` for\n * comparisons to NULL.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars that have no discontinuedAt date.\n * db.select().from(cars)\n * .where(isNull(cars.discontinuedAt))\n * ```\n *\n * @see isNotNull for the inverse of this test\n */\nexport function isNull(value: SQLWrapper): SQL {\n\treturn sql`${value} is null`;\n}\n\n/**\n * Test whether an expression is not NULL. By the SQL standard,\n * NULL is neither equal nor not equal to itself, so\n * it's recommended to use `isNull` and `notIsNull` for\n * comparisons to NULL.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars that have been discontinued.\n * db.select().from(cars)\n * .where(isNotNull(cars.discontinuedAt))\n * ```\n *\n * @see isNull for the inverse of this test\n */\nexport function isNotNull(value: SQLWrapper): SQL {\n\treturn sql`${value} is not null`;\n}\n\n/**\n * Test whether a subquery evaluates to have any rows.\n *\n * ## Examples\n *\n * ```ts\n * // Users whose `homeCity` column has a match in a cities\n * // table.\n * db\n * .select()\n * .from(users)\n * .where(\n * exists(db.select()\n * .from(cities)\n * .where(eq(users.homeCity, cities.id))),\n * );\n * ```\n *\n * @see notExists for the inverse of this test\n */\nexport function exists(subquery: SQLWrapper): SQL {\n\treturn sql`exists ${subquery}`;\n}\n\n/**\n * Test whether a subquery doesn't include any result\n * rows.\n *\n * ## Examples\n *\n * ```ts\n * // Users whose `homeCity` column doesn't match\n * // a row in the cities table.\n * db\n * .select()\n * .from(users)\n * .where(\n * notExists(db.select()\n * .from(cities)\n * .where(eq(users.homeCity, cities.id))),\n * );\n * ```\n *\n * @see exists for the inverse of this test\n */\nexport function notExists(subquery: SQLWrapper): SQL {\n\treturn sql`not exists ${subquery}`;\n}\n\n/**\n * Test whether an expression is between two values. This\n * is an easier way to express range tests, which would be\n * expressed mathematically as `x <= a <= y` but in SQL\n * would have to be like `a >= x AND a <= y`.\n *\n * Between is inclusive of the endpoints: if `column`\n * is equal to `min` or `max`, it will be TRUE.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made between 1990 and 2000\n * db.select().from(cars)\n * .where(between(cars.year, 1990, 2000))\n * ```\n *\n * @see notBetween for the inverse of this test\n */\nexport function between<T>(\n\tcolumn: SQL.Aliased,\n\tmin: T | SQLWrapper,\n\tmax: T | SQLWrapper,\n): SQL;\nexport function between<TColumn extends AnyColumn>(\n\tcolumn: TColumn,\n\tmin: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\tmax: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n): SQL;\nexport function between<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tmin: unknown,\n\tmax: unknown,\n): SQL;\nexport function between(column: SQLWrapper, min: unknown, max: unknown): SQL {\n\treturn sql`${column} between ${bindIfParam(min, column)} and ${\n\t\tbindIfParam(\n\t\t\tmax,\n\t\t\tcolumn,\n\t\t)\n\t}`;\n}\n\n/**\n * Test whether an expression is not between two values.\n *\n * This, like `between`, includes its endpoints, so if\n * the `column` is equal to `min` or `max`, in this case\n * it will evaluate to FALSE.\n *\n * ## Examples\n *\n * ```ts\n * // Exclude cars made in the 1970s\n * db.select().from(cars)\n * .where(notBetween(cars.year, 1970, 1979))\n * ```\n *\n * @see between for the inverse of this test\n */\nexport function notBetween<T>(\n\tcolumn: SQL.Aliased,\n\tmin: T | SQLWrapper,\n\tmax: T | SQLWrapper,\n): SQL;\nexport function notBetween<TColumn extends AnyColumn>(\n\tcolumn: TColumn,\n\tmin: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\tmax: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n): SQL;\nexport function notBetween<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tmin: unknown,\n\tmax: unknown,\n): SQL;\nexport function notBetween(\n\tcolumn: SQLWrapper,\n\tmin: unknown,\n\tmax: unknown,\n): SQL {\n\treturn sql`${column} not between ${\n\t\tbindIfParam(\n\t\t\tmin,\n\t\t\tcolumn,\n\t\t)\n\t} and ${bindIfParam(max, column)}`;\n}\n\n/**\n * Compare a column to a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars with 'Turbo' in their names.\n * db.select().from(cars)\n * .where(like(cars.name, '%Turbo%'))\n * ```\n *\n * @see ilike for a case-insensitive version of this condition\n */\nexport function like(column: Column | SQL.Aliased | SQL, value: string | SQLWrapper): SQL {\n\treturn sql`${column} like ${value}`;\n}\n\n/**\n * The inverse of like - this tests that a given column\n * does not match a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars that don't have \"ROver\" in their name.\n * db.select().from(cars)\n * .where(notLike(cars.name, '%Rover%'))\n * ```\n *\n * @see like for the inverse condition\n * @see notIlike for a case-insensitive version of this condition\n */\nexport function notLike(column: Column | SQL.Aliased | SQL, value: string | SQLWrapper): SQL {\n\treturn sql`${column} not like ${value}`;\n}\n\n/**\n * Case-insensitively compare a column to a pattern,\n * which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * Unlike like, this performs a case-insensitive comparison.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars with 'Turbo' in their names.\n * db.select().from(cars)\n * .where(ilike(cars.name, '%Turbo%'))\n * ```\n *\n * @see like for a case-sensitive version of this condition\n */\nexport function ilike(column: Column | SQL.Aliased | SQL, value: string | SQLWrapper): SQL {\n\treturn sql`${column} ilike ${value}`;\n}\n\n/**\n * The inverse of ilike - this case-insensitively tests that a given column\n * does not match a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars that don't have \"Rover\" in their name.\n * db.select().from(cars)\n * .where(notLike(cars.name, '%Rover%'))\n * ```\n *\n * @see ilike for the inverse condition\n * @see notLike for a case-sensitive version of this condition\n */\nexport function notIlike(column: Column | SQL.Aliased | SQL, value: string | SQLWrapper): SQL {\n\treturn sql`${column} not ilike ${value}`;\n}\n\n/**\n * Test that a column or expression contains all elements of\n * the list passed as the second argument.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\" and \"ORM\".\n * db.select().from(posts)\n * .where(arrayContains(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContained to find if an array contains all elements of a column or expression\n * @see arrayOverlaps to find if a column or expression contains any elements of an array\n */\nexport function arrayContains<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContains<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContains<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayContains(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayContains requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} @> ${array}`;\n\t}\n\n\treturn sql`${column} @> ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test that the list passed as the second argument contains\n * all elements of a column or expression.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\", \"ORM\" or both,\n * // but filtering posts that have additional tags.\n * db.select().from(posts)\n * .where(arrayContained(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContains to find if a column or expression contains all elements of an array\n * @see arrayOverlaps to find if a column or expression contains any elements of an array\n */\nexport function arrayContained<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContained<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContained<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayContained(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayContained requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} <@ ${array}`;\n\t}\n\n\treturn sql`${column} <@ ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test that a column or expression contains any elements of\n * the list passed as the second argument.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\", \"ORM\" or both.\n * db.select().from(posts)\n * .where(arrayOverlaps(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContains to find if a column or expression contains all elements of an array\n * @see arrayContained to find if an array contains all elements of a column or expression\n */\nexport function arrayOverlaps<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayOverlaps<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayOverlaps<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayOverlaps(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayOverlaps requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} && ${array}`;\n\t}\n\n\treturn sql`${column} && ${bindIfParam(values, column)}`;\n}\n","import type { AnyColumn } from '../../column.ts';\nimport type { SQL, SQLWrapper } from '../sql.ts';\nimport { sql } from '../sql.ts';\n\n/**\n * Used in sorting, this specifies that the given\n * column or expression should be sorted in ascending\n * order. By the SQL standard, ascending order is the\n * default, so it is not usually necessary to specify\n * ascending sort order.\n *\n * ## Examples\n *\n * ```ts\n * // Return cars, starting with the oldest models\n * // and going in ascending order to the newest.\n * db.select().from(cars)\n * .orderBy(asc(cars.year));\n * ```\n *\n * @see desc to sort in descending order\n */\nexport function asc(column: AnyColumn | SQLWrapper): SQL {\n\treturn sql`${column} asc`;\n}\n\n/**\n * Used in sorting, this specifies that the given\n * column or expression should be sorted in descending\n * order.\n *\n * ## Examples\n *\n * ```ts\n * // Select users, with the most recently created\n * // records coming first.\n * db.select().from(users)\n * .orderBy(desc(users.createdAt));\n * ```\n *\n * @see asc to sort in ascending order\n */\nexport function desc(column: AnyColumn | SQLWrapper): SQL {\n\treturn sql`${column} desc`;\n}\n","import { type AnyTable, getTableUniqueName, type InferModelFromColumns, Table } from '~/table.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { PrimaryKeyBuilder } from './pg-core/primary-keys.ts';\nimport {\n\tand,\n\tasc,\n\tbetween,\n\tdesc,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from './sql/expressions/index.ts';\nimport { type Placeholder, SQL, sql } from './sql/sql.ts';\nimport type { Assume, ColumnsWithTable, Equal, Simplify, ValueOrArray } from './utils.ts';\n\nexport abstract class Relation<TTableName extends string = string> {\n\tstatic readonly [entityKind]: string = 'Relation';\n\n\tdeclare readonly $brand: 'Relation';\n\treadonly referencedTableName: TTableName;\n\tfieldName!: string;\n\n\tconstructor(\n\t\treadonly sourceTable: Table,\n\t\treadonly referencedTable: AnyTable<{ name: TTableName }>,\n\t\treadonly relationName: string | undefined,\n\t) {\n\t\tthis.referencedTableName = referencedTable[Table.Symbol.Name] as TTableName;\n\t}\n\n\tabstract withFieldName(fieldName: string): Relation<TTableName>;\n}\n\nexport class Relations<\n\tTTableName extends string = string,\n\tTConfig extends Record<string, Relation> = Record<string, Relation>,\n> {\n\tstatic readonly [entityKind]: string = 'Relations';\n\n\tdeclare readonly $brand: 'Relations';\n\n\tconstructor(\n\t\treadonly table: AnyTable<{ name: TTableName }>,\n\t\treadonly config: (helpers: TableRelationsHelpers<TTableName>) => TConfig,\n\t) {}\n}\n\nexport class One<\n\tTTableName extends string = string,\n\tTIsNullable extends boolean = boolean,\n> extends Relation<TTableName> {\n\tstatic override readonly [entityKind]: string = 'One';\n\n\tdeclare protected $relationBrand: 'One';\n\n\tconstructor(\n\t\tsourceTable: Table,\n\t\treferencedTable: AnyTable<{ name: TTableName }>,\n\t\treadonly config:\n\t\t\t| RelationConfig<\n\t\t\t\tTTableName,\n\t\t\t\tstring,\n\t\t\t\tAnyColumn<{ tableName: TTableName }>[]\n\t\t\t>\n\t\t\t| undefined,\n\t\treadonly isNullable: TIsNullable,\n\t) {\n\t\tsuper(sourceTable, referencedTable, config?.relationName);\n\t}\n\n\twithFieldName(fieldName: string): One<TTableName> {\n\t\tconst relation = new One(\n\t\t\tthis.sourceTable,\n\t\t\tthis.referencedTable,\n\t\t\tthis.config,\n\t\t\tthis.isNullable,\n\t\t);\n\t\trelation.fieldName = fieldName;\n\t\treturn relation;\n\t}\n}\n\nexport class Many<TTableName extends string> extends Relation<TTableName> {\n\tstatic override readonly [entityKind]: string = 'Many';\n\n\tdeclare protected $relationBrand: 'Many';\n\n\tconstructor(\n\t\tsourceTable: Table,\n\t\treferencedTable: AnyTable<{ name: TTableName }>,\n\t\treadonly config: { relationName: string } | undefined,\n\t) {\n\t\tsuper(sourceTable, referencedTable, config?.relationName);\n\t}\n\n\twithFieldName(fieldName: string): Many<TTableName> {\n\t\tconst relation = new Many(\n\t\t\tthis.sourceTable,\n\t\t\tthis.referencedTable,\n\t\t\tthis.config,\n\t\t);\n\t\trelation.fieldName = fieldName;\n\t\treturn relation;\n\t}\n}\n\nexport type TableRelationsKeysOnly<\n\tTSchema extends Record<string, unknown>,\n\tTTableName extends string,\n\tK extends keyof TSchema,\n> = TSchema[K] extends Relations<TTableName> ? K : never;\n\nexport type ExtractTableRelationsFromSchema<\n\tTSchema extends Record<string, unknown>,\n\tTTableName extends string,\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TableRelationsKeysOnly<\n\t\t\t\tTSchema,\n\t\t\t\tTTableName,\n\t\t\t\tK\n\t\t\t>\n\t\t]: TSchema[K] extends Relations<TTableName, infer TConfig> ? TConfig : never;\n\t}\n>;\n\nexport type ExtractObjectValues<T> = T[keyof T];\n\nexport type ExtractRelationsFromTableExtraConfigSchema<\n\tTConfig extends unknown[],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TConfig as TConfig[K] extends Relations<any> ? K\n\t\t\t\t: never\n\t\t]: TConfig[K] extends Relations<infer TRelationConfig> ? TRelationConfig\n\t\t\t: never;\n\t}\n>;\n\nexport function getOperators() {\n\treturn {\n\t\tand,\n\t\tbetween,\n\t\teq,\n\t\texists,\n\t\tgt,\n\t\tgte,\n\t\tilike,\n\t\tinArray,\n\t\tisNull,\n\t\tisNotNull,\n\t\tlike,\n\t\tlt,\n\t\tlte,\n\t\tne,\n\t\tnot,\n\t\tnotBetween,\n\t\tnotExists,\n\t\tnotLike,\n\t\tnotIlike,\n\t\tnotInArray,\n\t\tor,\n\t\tsql,\n\t};\n}\n\nexport type Operators = ReturnType<typeof getOperators>;\n\nexport function getOrderByOperators() {\n\treturn {\n\t\tsql,\n\t\tasc,\n\t\tdesc,\n\t};\n}\n\nexport type OrderByOperators = ReturnType<typeof getOrderByOperators>;\n\nexport type FindTableByDBName<\n\tTSchema extends TablesRelationalConfig,\n\tTTableName extends string,\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TSchema[K]['dbName'] extends TTableName ? K\n\t\t\t\t: never\n\t\t]: TSchema[K];\n\t}\n>;\n\nexport type DBQueryConfig<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTIsRoot extends boolean = boolean,\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> =\n\t& {\n\t\tcolumns?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: boolean;\n\t\t\t}\n\t\t\t| undefined;\n\t\twith?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['relations']]?:\n\t\t\t\t\t| true\n\t\t\t\t\t| DBQueryConfig<\n\t\t\t\t\t\tTTableConfig['relations'][K] extends One ? 'one' : 'many',\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\tFindTableByDBName<\n\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\tTTableConfig['relations'][K]['referencedTableName']\n\t\t\t\t\t\t>\n\t\t\t\t\t>\n\t\t\t\t\t| undefined;\n\t\t\t}\n\t\t\t| undefined;\n\t\textras?:\n\t\t\t| Record<string, SQL.Aliased>\n\t\t\t| ((\n\t\t\t\tfields: Simplify<\n\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: { sql: Operators['sql'] },\n\t\t\t) => Record<string, SQL.Aliased>)\n\t\t\t| undefined;\n\t}\n\t& (TRelationType extends 'many' ?\n\t\t\t& {\n\t\t\t\twhere?:\n\t\t\t\t\t| SQL\n\t\t\t\t\t| undefined\n\t\t\t\t\t| ((\n\t\t\t\t\t\tfields: Simplify<\n\t\t\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t\t\t>,\n\t\t\t\t\t\toperators: Operators,\n\t\t\t\t\t) => SQL | undefined);\n\t\t\t\torderBy?:\n\t\t\t\t\t| ValueOrArray<AnyColumn | SQL>\n\t\t\t\t\t| ((\n\t\t\t\t\t\tfields: Simplify<\n\t\t\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t\t\t>,\n\t\t\t\t\t\toperators: OrderByOperators,\n\t\t\t\t\t) => ValueOrArray<AnyColumn | SQL>)\n\t\t\t\t\t| undefined;\n\t\t\t\tlimit?: number | Placeholder | undefined;\n\t\t\t}\n\t\t\t& (TIsRoot extends true ? {\n\t\t\t\t\toffset?: number | Placeholder | undefined;\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t: {});\n\nexport interface TableRelationalConfig {\n\ttsName: string;\n\tdbName: string;\n\tcolumns: Record<string, Column>;\n\trelations: Record<string, Relation>;\n\tprimaryKey: AnyColumn[];\n\tschema?: string;\n}\n\nexport type TablesRelationalConfig = Record<string, TableRelationalConfig>;\n\nexport interface RelationalSchemaConfig<\n\tTSchema extends TablesRelationalConfig,\n> {\n\tfullSchema: Record<string, unknown>;\n\tschema: TSchema;\n\ttableNamesMap: Record<string, string>;\n}\n\nexport type ExtractTablesWithRelations<\n\tTSchema extends Record<string, unknown>,\n> = {\n\t[\n\t\tK in keyof TSchema as TSchema[K] extends Table ? K\n\t\t\t: never\n\t]: TSchema[K] extends Table ? {\n\t\t\ttsName: K & string;\n\t\t\tdbName: TSchema[K]['_']['name'];\n\t\t\tcolumns: TSchema[K]['_']['columns'];\n\t\t\trelations: ExtractTableRelationsFromSchema<\n\t\t\t\tTSchema,\n\t\t\t\tTSchema[K]['_']['name']\n\t\t\t>;\n\t\t\tprimaryKey: AnyColumn[];\n\t\t}\n\t\t: never;\n};\n\nexport type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R\n\t: T;\n\nexport type BuildRelationResult<\n\tTSchema extends TablesRelationalConfig,\n\tTInclude,\n\tTRelations extends Record<string, Relation>,\n> = {\n\t[\n\t\tK in\n\t\t\t& NonUndefinedKeysOnly<TInclude>\n\t\t\t& keyof TRelations\n\t]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<\n\t\t\tTSchema,\n\t\t\tFindTableByDBName<TSchema, TRel['referencedTableName']>,\n\t\t\tAssume<TInclude[K], true | Record<string, unknown>>\n\t\t> extends infer TResult ? TRel extends One ?\n\t\t\t\t\t| TResult\n\t\t\t\t\t| (Equal<TRel['isNullable'], false> extends true ? null : never)\n\t\t\t: TResult[]\n\t\t: never\n\t\t: never;\n};\n\nexport type NonUndefinedKeysOnly<T> =\n\t& ExtractObjectValues<\n\t\t{\n\t\t\t[K in keyof T as T[K] extends undefined ? never : K]: K;\n\t\t}\n\t>\n\t& keyof T;\n\nexport type BuildQueryResult<\n\tTSchema extends TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig,\n\tTFullSelection extends true | Record<string, unknown>,\n> = Equal<TFullSelection, true> extends true ? InferModelFromColumns<TTableConfig['columns']>\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (TFullSelection['columns'] extends Record<string, unknown> ? InferModelFromColumns<\n\t\t\t\t\t{\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tK in Equal<\n\t\t\t\t\t\t\t\tExclude<\n\t\t\t\t\t\t\t\t\tTFullSelection['columns'][\n\t\t\t\t\t\t\t\t\t\t& keyof TFullSelection['columns']\n\t\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t\t> extends true ? Exclude<\n\t\t\t\t\t\t\t\t\tkeyof TTableConfig['columns'],\n\t\t\t\t\t\t\t\t\tNonUndefinedKeysOnly<TFullSelection['columns']>\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t:\n\t\t\t\t\t\t\t\t\t& {\n\t\t\t\t\t\t\t\t\t\t[K in keyof TFullSelection['columns']]: Equal<\n\t\t\t\t\t\t\t\t\t\t\tTFullSelection['columns'][K],\n\t\t\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t\t\t\t\t\t: never;\n\t\t\t\t\t\t\t\t\t}[keyof TFullSelection['columns']]\n\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t]: TTableConfig['columns'][K];\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t: InferModelFromColumns<TTableConfig['columns']>)\n\t\t\t& (TFullSelection['extras'] extends\n\t\t\t\t| Record<string, unknown>\n\t\t\t\t| ((...args: any[]) => Record<string, unknown>) ? {\n\t\t\t\t\t[\n\t\t\t\t\t\tK in NonUndefinedKeysOnly<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>\n\t\t\t\t\t\t>\n\t\t\t\t\t]: Assume<\n\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>[K],\n\t\t\t\t\t\tSQL.Aliased\n\t\t\t\t\t>['_']['type'];\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t\t& (TFullSelection['with'] extends Record<string, unknown> ? BuildRelationResult<\n\t\t\t\t\tTSchema,\n\t\t\t\t\tTFullSelection['with'],\n\t\t\t\t\tTTableConfig['relations']\n\t\t\t\t>\n\t\t\t\t: {})\n\t\t>\n\t: never;\n\nexport interface RelationConfig<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends AnyColumn<{ tableName: TTableName }>[],\n> {\n\trelationName?: string;\n\tfields: TColumns;\n\treferences: ColumnsWithTable<TTableName, TForeignTableName, TColumns>;\n}\n\nexport function extractTablesRelationalConfig<\n\tTTables extends TablesRelationalConfig,\n>(\n\tschema: Record<string, unknown>,\n\tconfigHelpers: (table: Table) => any,\n): { tables: TTables; tableNamesMap: Record<string, string> } {\n\tif (\n\t\tObject.keys(schema).length === 1\n\t\t&& 'default' in schema\n\t\t&& !is(schema['default'], Table)\n\t) {\n\t\tschema = schema['default'] as Record<string, unknown>;\n\t}\n\n\t// table DB name -> schema table key\n\tconst tableNamesMap: Record<string, string> = {};\n\t// Table relations found before their tables - need to buffer them until we know the schema table key\n\tconst relationsBuffer: Record<\n\t\tstring,\n\t\t{ relations: Record<string, Relation>; primaryKey?: AnyColumn[] }\n\t> = {};\n\tconst tablesConfig: TablesRelationalConfig = {};\n\tfor (const [key, value] of Object.entries(schema)) {\n\t\tif (is(value, Table)) {\n\t\t\tconst dbName = getTableUniqueName(value);\n\t\t\tconst bufferedRelations = relationsBuffer[dbName];\n\t\t\ttableNamesMap[dbName] = key;\n\t\t\ttablesConfig[key] = {\n\t\t\t\ttsName: key,\n\t\t\t\tdbName: value[Table.Symbol.Name],\n\t\t\t\tschema: value[Table.Symbol.Schema],\n\t\t\t\tcolumns: value[Table.Symbol.Columns],\n\t\t\t\trelations: bufferedRelations?.relations ?? {},\n\t\t\t\tprimaryKey: bufferedRelations?.primaryKey ?? [],\n\t\t\t};\n\n\t\t\t// Fill in primary keys\n\t\t\tfor (\n\t\t\t\tconst column of Object.values(\n\t\t\t\t\t(value as Table)[Table.Symbol.Columns],\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tif (column.primary) {\n\t\t\t\t\ttablesConfig[key]!.primaryKey.push(column);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst extraConfig = value[Table.Symbol.ExtraConfigBuilder]?.((value as Table)[Table.Symbol.ExtraConfigColumns]);\n\t\t\tif (extraConfig) {\n\t\t\t\tfor (const configEntry of Object.values(extraConfig)) {\n\t\t\t\t\tif (is(configEntry, PrimaryKeyBuilder)) {\n\t\t\t\t\t\ttablesConfig[key]!.primaryKey.push(...configEntry.columns);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (is(value, Relations)) {\n\t\t\tconst dbName = getTableUniqueName(value.table);\n\t\t\tconst tableName = tableNamesMap[dbName];\n\t\t\tconst relations: Record<string, Relation> = value.config(\n\t\t\t\tconfigHelpers(value.table),\n\t\t\t);\n\t\t\tlet primaryKey: AnyColumn[] | undefined;\n\n\t\t\tfor (const [relationName, relation] of Object.entries(relations)) {\n\t\t\t\tif (tableName) {\n\t\t\t\t\tconst tableConfig = tablesConfig[tableName]!;\n\t\t\t\t\ttableConfig.relations[relationName] = relation;\n\t\t\t\t\tif (primaryKey) {\n\t\t\t\t\t\ttableConfig.primaryKey.push(...primaryKey);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!(dbName in relationsBuffer)) {\n\t\t\t\t\t\trelationsBuffer[dbName] = {\n\t\t\t\t\t\t\trelations: {},\n\t\t\t\t\t\t\tprimaryKey,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\trelationsBuffer[dbName]!.relations[relationName] = relation;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { tables: tablesConfig as TTables, tableNamesMap };\n}\n\nexport function relations<\n\tTTableName extends string,\n\tTRelations extends Record<string, Relation<any>>,\n>(\n\ttable: AnyTable<{ name: TTableName }>,\n\trelations: (helpers: TableRelationsHelpers<TTableName>) => TRelations,\n): Relations<TTableName, TRelations> {\n\treturn new Relations<TTableName, TRelations>(\n\t\ttable,\n\t\t(helpers: TableRelationsHelpers<TTableName>) =>\n\t\t\tObject.fromEntries(\n\t\t\t\tObject.entries(relations(helpers)).map(([key, value]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue.withFieldName(key),\n\t\t\t\t]),\n\t\t\t) as TRelations,\n\t);\n}\n\nexport function createOne<TTableName extends string>(sourceTable: Table) {\n\treturn function one<\n\t\tTForeignTable extends Table,\n\t\tTColumns extends [\n\t\t\tAnyColumn<{ tableName: TTableName }>,\n\t\t\t...AnyColumn<{ tableName: TTableName }>[],\n\t\t],\n\t>(\n\t\ttable: TForeignTable,\n\t\tconfig?: RelationConfig<TTableName, TForeignTable['_']['name'], TColumns>,\n\t): One<\n\t\tTForeignTable['_']['name'],\n\t\tEqual<TColumns[number]['_']['notNull'], true>\n\t> {\n\t\treturn new One(\n\t\t\tsourceTable,\n\t\t\ttable,\n\t\t\tconfig,\n\t\t\t(config?.fields.reduce<boolean>((res, f) => res && f.notNull, true)\n\t\t\t\t?? false) as Equal<TColumns[number]['_']['notNull'], true>,\n\t\t);\n\t};\n}\n\nexport function createMany(sourceTable: Table) {\n\treturn function many<TForeignTable extends Table>(\n\t\treferencedTable: TForeignTable,\n\t\tconfig?: { relationName: string },\n\t): Many<TForeignTable['_']['name']> {\n\t\treturn new Many(sourceTable, referencedTable, config);\n\t};\n}\n\nexport interface NormalizedRelation {\n\tfields: AnyColumn[];\n\treferences: AnyColumn[];\n}\n\nexport function normalizeRelation(\n\tschema: TablesRelationalConfig,\n\ttableNamesMap: Record<string, string>,\n\trelation: Relation,\n): NormalizedRelation {\n\tif (is(relation, One) && relation.config) {\n\t\treturn {\n\t\t\tfields: relation.config.fields,\n\t\t\treferences: relation.config.references,\n\t\t};\n\t}\n\n\tconst referencedTableTsName = tableNamesMap[getTableUniqueName(relation.referencedTable)];\n\tif (!referencedTableTsName) {\n\t\tthrow new Error(\n\t\t\t`Table \"${relation.referencedTable[Table.Symbol.Name]}\" not found in schema`,\n\t\t);\n\t}\n\n\tconst referencedTableConfig = schema[referencedTableTsName];\n\tif (!referencedTableConfig) {\n\t\tthrow new Error(`Table \"${referencedTableTsName}\" not found in schema`);\n\t}\n\n\tconst sourceTable = relation.sourceTable;\n\tconst sourceTableTsName = tableNamesMap[getTableUniqueName(sourceTable)];\n\tif (!sourceTableTsName) {\n\t\tthrow new Error(\n\t\t\t`Table \"${sourceTable[Table.Symbol.Name]}\" not found in schema`,\n\t\t);\n\t}\n\n\tconst reverseRelations: Relation[] = [];\n\tfor (\n\t\tconst referencedTableRelation of Object.values(\n\t\t\treferencedTableConfig.relations,\n\t\t)\n\t) {\n\t\tif (\n\t\t\t(relation.relationName\n\t\t\t\t&& relation !== referencedTableRelation\n\t\t\t\t&& referencedTableRelation.relationName === relation.relationName)\n\t\t\t|| (!relation.relationName\n\t\t\t\t&& referencedTableRelation.referencedTable === relation.sourceTable)\n\t\t) {\n\t\t\treverseRelations.push(referencedTableRelation);\n\t\t}\n\t}\n\n\tif (reverseRelations.length > 1) {\n\t\tthrow relation.relationName\n\t\t\t? new Error(\n\t\t\t\t`There are multiple relations with name \"${relation.relationName}\" in table \"${referencedTableTsName}\"`,\n\t\t\t)\n\t\t\t: new Error(\n\t\t\t\t`There are multiple relations between \"${referencedTableTsName}\" and \"${\n\t\t\t\t\trelation.sourceTable[Table.Symbol.Name]\n\t\t\t\t}\". Please specify relation name`,\n\t\t\t);\n\t}\n\n\tif (\n\t\treverseRelations[0]\n\t\t&& is(reverseRelations[0], One)\n\t\t&& reverseRelations[0].config\n\t) {\n\t\treturn {\n\t\t\tfields: reverseRelations[0].config.references,\n\t\t\treferences: reverseRelations[0].config.fields,\n\t\t};\n\t}\n\n\tthrow new Error(\n\t\t`There is not enough information to infer relation \"${sourceTableTsName}.${relation.fieldName}\"`,\n\t);\n}\n\nexport function createTableRelationsHelpers<TTableName extends string>(\n\tsourceTable: AnyTable<{ name: TTableName }>,\n) {\n\treturn {\n\t\tone: createOne<TTableName>(sourceTable),\n\t\tmany: createMany(sourceTable),\n\t};\n}\n\nexport type TableRelationsHelpers<TTableName extends string> = ReturnType<\n\ttypeof createTableRelationsHelpers<TTableName>\n>;\n\nexport interface BuildRelationalQueryResult<\n\tTTable extends Table = Table,\n\tTColumn extends Column = Column,\n> {\n\ttableTsKey: string;\n\tselection: {\n\t\tdbKey: string;\n\t\ttsKey: string;\n\t\tfield: TColumn | SQL | SQL.Aliased;\n\t\trelationTableTsKey: string | undefined;\n\t\tisJson: boolean;\n\t\tisExtra?: boolean;\n\t\tselection: BuildRelationalQueryResult<TTable>['selection'];\n\t}[];\n\tsql: TTable | SQL;\n}\n\nexport function mapRelationalRow(\n\ttablesConfig: TablesRelationalConfig,\n\ttableConfig: TableRelationalConfig,\n\trow: unknown[],\n\tbuildQueryResultSelection: BuildRelationalQueryResult['selection'],\n\tmapColumnValue: (value: unknown) => unknown = (value) => value,\n): Record<string, unknown> {\n\tconst result: Record<string, unknown> = {};\n\n\tfor (\n\t\tconst [\n\t\t\tselectionItemIndex,\n\t\t\tselectionItem,\n\t\t] of buildQueryResultSelection.entries()\n\t) {\n\t\tif (selectionItem.isJson) {\n\t\t\tconst relation = tableConfig.relations[selectionItem.tsKey]!;\n\t\t\tconst rawSubRows = row[selectionItemIndex] as\n\t\t\t\t| unknown[]\n\t\t\t\t| null\n\t\t\t\t| [null]\n\t\t\t\t| string;\n\t\t\tconst subRows = typeof rawSubRows === 'string'\n\t\t\t\t? (JSON.parse(rawSubRows) as unknown[])\n\t\t\t\t: rawSubRows;\n\t\t\tresult[selectionItem.tsKey] = is(relation, One)\n\t\t\t\t? subRows\n\t\t\t\t\t&& mapRelationalRow(\n\t\t\t\t\t\ttablesConfig,\n\t\t\t\t\t\ttablesConfig[selectionItem.relationTableTsKey!]!,\n\t\t\t\t\t\tsubRows,\n\t\t\t\t\t\tselectionItem.selection,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t)\n\t\t\t\t: (subRows as unknown[][]).map((subRow) =>\n\t\t\t\t\tmapRelationalRow(\n\t\t\t\t\t\ttablesConfig,\n\t\t\t\t\t\ttablesConfig[selectionItem.relationTableTsKey!]!,\n\t\t\t\t\t\tsubRow,\n\t\t\t\t\t\tselectionItem.selection,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t} else {\n\t\t\tconst value = mapColumnValue(row[selectionItemIndex]);\n\t\t\tconst field = selectionItem.field!;\n\t\t\tlet decoder;\n\t\t\tif (is(field, Column)) {\n\t\t\t\tdecoder = field;\n\t\t\t} else if (is(field, SQL)) {\n\t\t\t\tdecoder = field.decoder;\n\t\t\t} else {\n\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t}\n\t\t\tresult[selectionItem.tsKey] = value === null ? null : decoder.mapFromDriverValue(value);\n\t\t}\n\t}\n\n\treturn result;\n}\n","import type { AnyColumn } from './column.ts';\nimport { Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport type { Relation } from './relations.ts';\nimport type { View } from './sql/sql.ts';\nimport { SQL, sql } from './sql/sql.ts';\nimport { Table } from './table.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\nexport class ColumnAliasProxyHandler<TColumn extends Column> implements ProxyHandler<TColumn> {\n\tstatic readonly [entityKind]: string = 'ColumnAliasProxyHandler';\n\n\tconstructor(private table: Table | View) {}\n\n\tget(columnObj: TColumn, prop: string | symbol): any {\n\t\tif (prop === 'table') {\n\t\t\treturn this.table;\n\t\t}\n\n\t\treturn columnObj[prop as keyof TColumn];\n\t}\n}\n\nexport class TableAliasProxyHandler<T extends Table | View> implements ProxyHandler<T> {\n\tstatic readonly [entityKind]: string = 'TableAliasProxyHandler';\n\n\tconstructor(private alias: string, private replaceOriginalName: boolean) {}\n\n\tget(target: T, prop: string | symbol): any {\n\t\tif (prop === Table.Symbol.IsAlias) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (prop === Table.Symbol.Name) {\n\t\t\treturn this.alias;\n\t\t}\n\n\t\tif (this.replaceOriginalName && prop === Table.Symbol.OriginalName) {\n\t\t\treturn this.alias;\n\t\t}\n\n\t\tif (prop === ViewBaseConfig) {\n\t\t\treturn {\n\t\t\t\t...target[ViewBaseConfig as keyof typeof target],\n\t\t\t\tname: this.alias,\n\t\t\t\tisAlias: true,\n\t\t\t};\n\t\t}\n\n\t\tif (prop === Table.Symbol.Columns) {\n\t\t\tconst columns = (target as Table)[Table.Symbol.Columns];\n\t\t\tif (!columns) {\n\t\t\t\treturn columns;\n\t\t\t}\n\n\t\t\tconst proxiedColumns: { [key: string]: any } = {};\n\n\t\t\tObject.keys(columns).map((key) => {\n\t\t\t\tproxiedColumns[key] = new Proxy(\n\t\t\t\t\tcolumns[key]!,\n\t\t\t\t\tnew ColumnAliasProxyHandler(new Proxy(target, this)),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn proxiedColumns;\n\t\t}\n\n\t\tconst value = target[prop as keyof typeof target];\n\t\tif (is(value, Column)) {\n\t\t\treturn new Proxy(value as AnyColumn, new ColumnAliasProxyHandler(new Proxy(target, this)));\n\t\t}\n\n\t\treturn value;\n\t}\n}\n\nexport class RelationTableAliasProxyHandler<T extends Relation> implements ProxyHandler<T> {\n\tstatic readonly [entityKind]: string = 'RelationTableAliasProxyHandler';\n\n\tconstructor(private alias: string) {}\n\n\tget(target: T, prop: string | symbol): any {\n\t\tif (prop === 'sourceTable') {\n\t\t\treturn aliasedTable(target.sourceTable, this.alias);\n\t\t}\n\n\t\treturn target[prop as keyof typeof target];\n\t}\n}\n\nexport function aliasedTable<T extends Table | View>(\n\ttable: T,\n\ttableAlias: string,\n): T {\n\treturn new Proxy(table, new TableAliasProxyHandler(tableAlias, false)) as any;\n}\n\nexport function aliasedRelation<T extends Relation>(relation: T, tableAlias: string): T {\n\treturn new Proxy(relation, new RelationTableAliasProxyHandler(tableAlias));\n}\n\nexport function aliasedTableColumn<T extends AnyColumn>(column: T, tableAlias: string): T {\n\treturn new Proxy(\n\t\tcolumn,\n\t\tnew ColumnAliasProxyHandler(new Proxy(column.table, new TableAliasProxyHandler(tableAlias, false))),\n\t);\n}\n\nexport function mapColumnsInAliasedSQLToAlias(query: SQL.Aliased, alias: string): SQL.Aliased {\n\treturn new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias);\n}\n\nexport function mapColumnsInSQLToAlias(query: SQL, alias: string): SQL {\n\treturn sql.join(query.queryChunks.map((c) => {\n\t\tif (is(c, Column)) {\n\t\t\treturn aliasedTableColumn(c, alias);\n\t\t}\n\t\tif (is(c, SQL)) {\n\t\t\treturn mapColumnsInSQLToAlias(c, alias);\n\t\t}\n\t\tif (is(c, SQL.Aliased)) {\n\t\t\treturn mapColumnsInAliasedSQLToAlias(c, alias);\n\t\t}\n\t\treturn c;\n\t}));\n}\n","import { ColumnAliasProxyHandler, TableAliasProxyHandler } from './alias.ts';\nimport { Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { SQL, View } from './sql/sql.ts';\nimport { Subquery } from './subquery.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\nexport class SelectionProxyHandler<T extends Subquery | Record<string, unknown> | View>\n\timplements ProxyHandler<Subquery | Record<string, unknown> | View>\n{\n\tstatic readonly [entityKind]: string = 'SelectionProxyHandler';\n\n\tprivate config: {\n\t\t/**\n\t\t * Table alias for the columns\n\t\t */\n\t\talias?: string;\n\t\t/**\n\t\t * What to do when a field is an instance of `SQL.Aliased` and it's not a selection field (from a subquery)\n\t\t *\n\t\t * `sql` - return the underlying SQL expression\n\t\t *\n\t\t * `alias` - return the field alias\n\t\t */\n\t\tsqlAliasedBehavior: 'sql' | 'alias';\n\t\t/**\n\t\t * What to do when a field is an instance of `SQL` and it doesn't have an alias declared\n\t\t *\n\t\t * `sql` - return the underlying SQL expression\n\t\t *\n\t\t * `error` - return a DrizzleTypeError on type level and throw an error on runtime\n\t\t */\n\t\tsqlBehavior: 'sql' | 'error';\n\n\t\t/**\n\t\t * Whether to replace the original name of the column with the alias\n\t\t * Should be set to `true` for views creation\n\t\t * @default false\n\t\t */\n\t\treplaceOriginalName?: boolean;\n\t};\n\n\tconstructor(config: SelectionProxyHandler<T>['config']) {\n\t\tthis.config = { ...config };\n\t}\n\n\tget(subquery: T, prop: string | symbol): any {\n\t\tif (prop === '_') {\n\t\t\treturn {\n\t\t\t\t...subquery['_' as keyof typeof subquery],\n\t\t\t\tselectedFields: new Proxy(\n\t\t\t\t\t(subquery as Subquery)._.selectedFields,\n\t\t\t\t\tthis as ProxyHandler<Record<string, unknown>>,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\tif (prop === ViewBaseConfig) {\n\t\t\treturn {\n\t\t\t\t...subquery[ViewBaseConfig as keyof typeof subquery],\n\t\t\t\tselectedFields: new Proxy(\n\t\t\t\t\t(subquery as View)[ViewBaseConfig].selectedFields,\n\t\t\t\t\tthis as ProxyHandler<Record<string, unknown>>,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\tif (typeof prop === 'symbol') {\n\t\t\treturn subquery[prop as keyof typeof subquery];\n\t\t}\n\n\t\tconst columns = is(subquery, Subquery)\n\t\t\t? subquery._.selectedFields\n\t\t\t: is(subquery, View)\n\t\t\t? subquery[ViewBaseConfig].selectedFields\n\t\t\t: subquery;\n\t\tconst value: unknown = columns[prop as keyof typeof columns];\n\n\t\tif (is(value, SQL.Aliased)) {\n\t\t\t// Never return the underlying SQL expression for a field previously selected in a subquery\n\t\t\tif (this.config.sqlAliasedBehavior === 'sql' && !value.isSelectionField) {\n\t\t\t\treturn value.sql;\n\t\t\t}\n\n\t\t\tconst newValue = value.clone();\n\t\t\tnewValue.isSelectionField = true;\n\t\t\treturn newValue;\n\t\t}\n\n\t\tif (is(value, SQL)) {\n\t\t\tif (this.config.sqlBehavior === 'sql') {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tthrow new Error(\n\t\t\t\t`You tried to reference \"${prop}\" field from a subquery, which is a raw SQL field, but it doesn't have an alias declared. Please add an alias to the field using \".as('alias')\" method.`,\n\t\t\t);\n\t\t}\n\n\t\tif (is(value, Column)) {\n\t\t\tif (this.config.alias) {\n\t\t\t\treturn new Proxy(\n\t\t\t\t\tvalue,\n\t\t\t\t\tnew ColumnAliasProxyHandler(\n\t\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\t\tvalue.table,\n\t\t\t\t\t\t\tnew TableAliasProxyHandler(this.config.alias, this.config.replaceOriginalName ?? false),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\n\t\tif (typeof value !== 'object' || value === null) {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn new Proxy(value, new SelectionProxyHandler(this.config));\n\t}\n}\n","import { entityKind } from '~/entity.ts';\n\nexport abstract class QueryPromise<T> implements Promise<T> {\n\tstatic readonly [entityKind]: string = 'QueryPromise';\n\n\t[Symbol.toStringTag] = 'QueryPromise';\n\n\tcatch<TResult = never>(\n\t\tonRejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined,\n\t): Promise<T | TResult> {\n\t\treturn this.then(undefined, onRejected);\n\t}\n\n\tfinally(onFinally?: (() => void) | null | undefined): Promise<T> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tonFinally?.();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tonFinally?.();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n\n\tthen<TResult1 = T, TResult2 = never>(\n\t\tonFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,\n\t\tonRejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null,\n\t): Promise<TResult1 | TResult2> {\n\t\treturn this.execute().then(onFulfilled, onRejected);\n\t}\n\n\tabstract execute(): Promise<T>;\n}\n","import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { AnySQLiteColumn, SQLiteColumn } from './columns/index.ts';\nimport type { SQLiteTable } from './table.ts';\n\nexport type UpdateDeleteAction = 'cascade' | 'restrict' | 'no action' | 'set null' | 'set default';\n\nexport type Reference = () => {\n\treadonly name?: string;\n\treadonly columns: SQLiteColumn[];\n\treadonly foreignTable: SQLiteTable;\n\treadonly foreignColumns: SQLiteColumn[];\n};\n\nexport class ForeignKeyBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteForeignKeyBuilder';\n\n\tdeclare _: {\n\t\tbrand: 'SQLiteForeignKeyBuilder';\n\t\tforeignTableName: 'TForeignTableName';\n\t};\n\n\t/** @internal */\n\treference: Reference;\n\n\t/** @internal */\n\t_onUpdate: UpdateDeleteAction | undefined;\n\n\t/** @internal */\n\t_onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(\n\t\tconfig: () => {\n\t\t\tname?: string;\n\t\t\tcolumns: SQLiteColumn[];\n\t\t\tforeignColumns: SQLiteColumn[];\n\t\t},\n\t\tactions?: {\n\t\t\tonUpdate?: UpdateDeleteAction;\n\t\t\tonDelete?: UpdateDeleteAction;\n\t\t} | undefined,\n\t) {\n\t\tthis.reference = () => {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn { name, columns, foreignTable: foreignColumns[0]!.table as SQLiteTable, foreignColumns };\n\t\t};\n\t\tif (actions) {\n\t\t\tthis._onUpdate = actions.onUpdate;\n\t\t\tthis._onDelete = actions.onDelete;\n\t\t}\n\t}\n\n\tonUpdate(action: UpdateDeleteAction): this {\n\t\tthis._onUpdate = action;\n\t\treturn this;\n\t}\n\n\tonDelete(action: UpdateDeleteAction): this {\n\t\tthis._onDelete = action;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: SQLiteTable): ForeignKey {\n\t\treturn new ForeignKey(table, this);\n\t}\n}\n\nexport class ForeignKey {\n\tstatic readonly [entityKind]: string = 'SQLiteForeignKey';\n\n\treadonly reference: Reference;\n\treadonly onUpdate: UpdateDeleteAction | undefined;\n\treadonly onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(readonly table: SQLiteTable, builder: ForeignKeyBuilder) {\n\t\tthis.reference = builder.reference;\n\t\tthis.onUpdate = builder._onUpdate;\n\t\tthis.onDelete = builder._onDelete;\n\t}\n\n\tgetName(): string {\n\t\tconst { name, columns, foreignColumns } = this.reference();\n\t\tconst columnNames = columns.map((column) => column.name);\n\t\tconst foreignColumnNames = foreignColumns.map((column) => column.name);\n\t\tconst chunks = [\n\t\t\tthis.table[TableName],\n\t\t\t...columnNames,\n\t\t\tforeignColumns[0]!.table[TableName],\n\t\t\t...foreignColumnNames,\n\t\t];\n\t\treturn name ?? `${chunks.join('_')}_fk`;\n\t}\n}\n\ntype ColumnsWithTable<\n\tTTableName extends string,\n\tTColumns extends SQLiteColumn[],\n> = { [Key in keyof TColumns]: AnySQLiteColumn<{ tableName: TTableName }> };\n\n/**\n * @deprecated please use `foreignKey({ columns: [], foreignColumns: [] })` syntax without callback\n * @param config\n * @returns\n */\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnySQLiteColumn<{ tableName: TTableName }>, ...AnySQLiteColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: () => {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder;\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnySQLiteColumn<{ tableName: TTableName }>, ...AnySQLiteColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder;\nexport function foreignKey(\n\tconfig: any,\n): ForeignKeyBuilder {\n\tfunction mappedConfig() {\n\t\tif (typeof config === 'function') {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tcolumns,\n\t\t\t\tforeignColumns,\n\t\t\t};\n\t\t}\n\t\treturn config;\n\t}\n\n\treturn new ForeignKeyBuilder(mappedConfig);\n}\n","import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { SQLiteColumn } from './columns/common.ts';\nimport type { SQLiteTable } from './table.ts';\n\nexport function uniqueKeyName(table: SQLiteTable, columns: string[]) {\n\treturn `${table[TableName]}_${columns.join('_')}_unique`;\n}\n\nexport function unique(name?: string): UniqueOnConstraintBuilder {\n\treturn new UniqueOnConstraintBuilder(name);\n}\n\nexport class UniqueConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteUniqueConstraintBuilder';\n\n\t/** @internal */\n\tcolumns: SQLiteColumn[];\n\n\tconstructor(\n\t\tcolumns: SQLiteColumn[],\n\t\tprivate name?: string,\n\t) {\n\t\tthis.columns = columns;\n\t}\n\n\t/** @internal */\n\tbuild(table: SQLiteTable): UniqueConstraint {\n\t\treturn new UniqueConstraint(table, this.columns, this.name);\n\t}\n}\n\nexport class UniqueOnConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteUniqueOnConstraintBuilder';\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tname?: string,\n\t) {\n\t\tthis.name = name;\n\t}\n\n\ton(...columns: [SQLiteColumn, ...SQLiteColumn[]]) {\n\t\treturn new UniqueConstraintBuilder(columns, this.name);\n\t}\n}\n\nexport class UniqueConstraint {\n\tstatic readonly [entityKind]: string = 'SQLiteUniqueConstraint';\n\n\treadonly columns: SQLiteColumn[];\n\treadonly name?: string;\n\n\tconstructor(readonly table: SQLiteTable, columns: SQLiteColumn[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name ?? uniqueKeyName(this.table, this.columns.map((column) => column.name));\n\t}\n\n\tgetName() {\n\t\treturn this.name;\n\t}\n}\n","import type {\n\tColumnBuilderBase,\n\tColumnBuilderBaseConfig,\n\tColumnBuilderExtraConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tHasGenerated,\n\tMakeColumnConfig,\n} from '~/column-builder.ts';\nimport { ColumnBuilder } from '~/column-builder.ts';\nimport { Column } from '~/column.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { ForeignKey, UpdateDeleteAction } from '~/sqlite-core/foreign-keys.ts';\nimport { ForeignKeyBuilder } from '~/sqlite-core/foreign-keys.ts';\nimport type { AnySQLiteTable, SQLiteTable } from '~/sqlite-core/table.ts';\nimport type { Update } from '~/utils.ts';\nimport { uniqueKeyName } from '../unique-constraint.ts';\n\nexport interface ReferenceConfig {\n\tref: () => SQLiteColumn;\n\tactions: {\n\t\tonUpdate?: UpdateDeleteAction;\n\t\tonDelete?: UpdateDeleteAction;\n\t};\n}\n\nexport interface SQLiteColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> extends ColumnBuilderBase<T, TTypeConfig & { dialect: 'sqlite' }> {}\n\nexport interface SQLiteGeneratedColumnConfig {\n\tmode?: 'virtual' | 'stored';\n}\n\nexport abstract class SQLiteColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = object,\n> extends ColumnBuilder<T, TRuntimeConfig, TTypeConfig & { dialect: 'sqlite' }, TExtraConfig>\n\timplements SQLiteColumnBuilderBase<T, TTypeConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteColumnBuilder';\n\n\tprivate foreignKeyConfigs: ReferenceConfig[] = [];\n\n\treferences(\n\t\tref: ReferenceConfig['ref'],\n\t\tactions: ReferenceConfig['actions'] = {},\n\t): this {\n\t\tthis.foreignKeyConfigs.push({ ref, actions });\n\t\treturn this;\n\t}\n\n\tunique(\n\t\tname?: string,\n\t): this {\n\t\tthis.config.isUnique = true;\n\t\tthis.config.uniqueName = name;\n\t\treturn this;\n\t}\n\n\tgeneratedAlwaysAs(as: SQL | T['data'] | (() => SQL), config?: SQLiteGeneratedColumnConfig): HasGenerated<this, {\n\t\ttype: 'always';\n\t}> {\n\t\tthis.config.generated = {\n\t\t\tas,\n\t\t\ttype: 'always',\n\t\t\tmode: config?.mode ?? 'virtual',\n\t\t};\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tbuildForeignKeys(column: SQLiteColumn, table: SQLiteTable): ForeignKey[] {\n\t\treturn this.foreignKeyConfigs.map(({ ref, actions }) => {\n\t\t\treturn ((ref, actions) => {\n\t\t\t\tconst builder = new ForeignKeyBuilder(() => {\n\t\t\t\t\tconst foreignColumn = ref();\n\t\t\t\t\treturn { columns: [column], foreignColumns: [foreignColumn] };\n\t\t\t\t});\n\t\t\t\tif (actions.onUpdate) {\n\t\t\t\t\tbuilder.onUpdate(actions.onUpdate);\n\t\t\t\t}\n\t\t\t\tif (actions.onDelete) {\n\t\t\t\t\tbuilder.onDelete(actions.onDelete);\n\t\t\t\t}\n\t\t\t\treturn builder.build(table);\n\t\t\t})(ref, actions);\n\t\t});\n\t}\n\n\t/** @internal */\n\tabstract build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteColumn<MakeColumnConfig<T, TTableName>>;\n}\n\n// To understand how to use `SQLiteColumn` and `AnySQLiteColumn`, see `Column` and `AnyColumn` documentation.\nexport abstract class SQLiteColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = {},\n\tTTypeConfig extends object = {},\n> extends Column<T, TRuntimeConfig, TTypeConfig & { dialect: 'sqlite' }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteColumn';\n\n\tconstructor(\n\t\toverride readonly table: SQLiteTable,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tif (!config.uniqueName) {\n\t\t\tconfig.uniqueName = uniqueKeyName(table, [config.name]);\n\t\t}\n\t\tsuper(table, config);\n\t}\n}\n\nexport type AnySQLiteColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = SQLiteColumn<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\ntype BlobMode = 'buffer' | 'json' | 'bigint';\n\nexport type SQLiteBigIntBuilderInitial<TName extends string> = SQLiteBigIntBuilder<{\n\tname: TName;\n\tdataType: 'bigint';\n\tcolumnType: 'SQLiteBigInt';\n\tdata: bigint;\n\tdriverParam: Buffer;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteBigIntBuilder<T extends ColumnBuilderBaseConfig<'bigint', 'SQLiteBigInt'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteBigIntBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'bigint', 'SQLiteBigInt');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteBigInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteBigInt<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any>);\n\t}\n}\n\nexport class SQLiteBigInt<T extends ColumnBaseConfig<'bigint', 'SQLiteBigInt'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBigInt';\n\n\tgetSQLType(): string {\n\t\treturn 'blob';\n\t}\n\n\toverride mapFromDriverValue(value: Buffer | Uint8Array | ArrayBuffer): bigint {\n\t\tif (Buffer.isBuffer(value)) {\n\t\t\treturn BigInt(value.toString());\n\t\t}\n\n\t\t// for sqlite durable objects\n\t\t// eslint-disable-next-line no-instanceof/no-instanceof\n\t\tif (value instanceof ArrayBuffer) {\n\t\t\tconst decoder = new TextDecoder();\n\t\t\treturn BigInt(decoder.decode(value));\n\t\t}\n\n\t\treturn BigInt(String.fromCodePoint(...value));\n\t}\n\n\toverride mapToDriverValue(value: bigint): Buffer {\n\t\treturn Buffer.from(value.toString());\n\t}\n}\n\nexport type SQLiteBlobJsonBuilderInitial<TName extends string> = SQLiteBlobJsonBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'SQLiteBlobJson';\n\tdata: unknown;\n\tdriverParam: Buffer;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteBlobJsonBuilder<T extends ColumnBuilderBaseConfig<'json', 'SQLiteBlobJson'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobJsonBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'SQLiteBlobJson');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteBlobJson<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteBlobJson<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteBlobJson<T extends ColumnBaseConfig<'json', 'SQLiteBlobJson'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobJson';\n\n\tgetSQLType(): string {\n\t\treturn 'blob';\n\t}\n\n\toverride mapFromDriverValue(value: Buffer | Uint8Array | ArrayBuffer): T['data'] {\n\t\tif (Buffer.isBuffer(value)) {\n\t\t\treturn JSON.parse(value.toString());\n\t\t}\n\n\t\t// for sqlite durable objects\n\t\t// eslint-disable-next-line no-instanceof/no-instanceof\n\t\tif (value instanceof ArrayBuffer) {\n\t\t\tconst decoder = new TextDecoder();\n\t\t\treturn JSON.parse(decoder.decode(value));\n\t\t}\n\n\t\treturn JSON.parse(String.fromCodePoint(...value));\n\t}\n\n\toverride mapToDriverValue(value: T['data']): Buffer {\n\t\treturn Buffer.from(JSON.stringify(value));\n\t}\n}\n\nexport type SQLiteBlobBufferBuilderInitial<TName extends string> = SQLiteBlobBufferBuilder<{\n\tname: TName;\n\tdataType: 'buffer';\n\tcolumnType: 'SQLiteBlobBuffer';\n\tdata: Buffer;\n\tdriverParam: Buffer;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteBlobBufferBuilder<T extends ColumnBuilderBaseConfig<'buffer', 'SQLiteBlobBuffer'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobBufferBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'buffer', 'SQLiteBlobBuffer');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteBlobBuffer<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteBlobBuffer<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any>);\n\t}\n}\n\nexport class SQLiteBlobBuffer<T extends ColumnBaseConfig<'buffer', 'SQLiteBlobBuffer'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobBuffer';\n\n\tgetSQLType(): string {\n\t\treturn 'blob';\n\t}\n}\n\nexport interface BlobConfig<TMode extends BlobMode = BlobMode> {\n\tmode: TMode;\n}\n\n/**\n * It's recommended to use `text('...', { mode: 'json' })` instead of `blob` in JSON mode, because it supports JSON functions:\n * >All JSON functions currently throw an error if any of their arguments are BLOBs because BLOBs are reserved for a future enhancement in which BLOBs will store the binary encoding for JSON.\n *\n * https://www.sqlite.org/json1.html\n */\nexport function blob(): SQLiteBlobJsonBuilderInitial<''>;\nexport function blob<TMode extends BlobMode = BlobMode>(\n\tconfig?: BlobConfig<TMode>,\n): Equal<TMode, 'bigint'> extends true ? SQLiteBigIntBuilderInitial<''>\n\t: Equal<TMode, 'buffer'> extends true ? SQLiteBlobBufferBuilderInitial<''>\n\t: SQLiteBlobJsonBuilderInitial<''>;\nexport function blob<TName extends string, TMode extends BlobMode = BlobMode>(\n\tname: TName,\n\tconfig?: BlobConfig<TMode>,\n): Equal<TMode, 'bigint'> extends true ? SQLiteBigIntBuilderInitial<TName>\n\t: Equal<TMode, 'buffer'> extends true ? SQLiteBlobBufferBuilderInitial<TName>\n\t: SQLiteBlobJsonBuilderInitial<TName>;\nexport function blob(a?: string | BlobConfig, b?: BlobConfig) {\n\tconst { name, config } = getColumnNameAndConfig<BlobConfig | undefined>(a, b);\n\tif (config?.mode === 'json') {\n\t\treturn new SQLiteBlobJsonBuilder(name);\n\t}\n\tif (config?.mode === 'bigint') {\n\t\treturn new SQLiteBigIntBuilder(name);\n\t}\n\treturn new SQLiteBlobBufferBuilder(name);\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { AnySQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport type ConvertCustomConfig<TName extends string, T extends Partial<CustomTypeValues>> =\n\t& {\n\t\tname: TName;\n\t\tdataType: 'custom';\n\t\tcolumnType: 'SQLiteCustomColumn';\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverData'];\n\t\tenumValues: undefined;\n\t}\n\t& (T['notNull'] extends true ? { notNull: true } : {})\n\t& (T['default'] extends true ? { hasDefault: true } : {});\n\nexport interface SQLiteCustomColumnInnerConfig {\n\tcustomTypeValues: CustomTypeValues;\n}\n\nexport class SQLiteCustomColumnBuilder<T extends ColumnBuilderBaseConfig<'custom', 'SQLiteCustomColumn'>>\n\textends SQLiteColumnBuilder<\n\t\tT,\n\t\t{\n\t\t\tfieldConfig: CustomTypeValues['config'];\n\t\t\tcustomTypeParams: CustomTypeParams<any>;\n\t\t},\n\t\t{\n\t\t\tsqliteColumnBuilderBrand: 'SQLiteCustomColumnBuilderBrand';\n\t\t}\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteCustomColumnBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\tfieldConfig: CustomTypeValues['config'],\n\t\tcustomTypeParams: CustomTypeParams<any>,\n\t) {\n\t\tsuper(name, 'custom', 'SQLiteCustomColumn');\n\t\tthis.config.fieldConfig = fieldConfig;\n\t\tthis.config.customTypeParams = customTypeParams;\n\t}\n\n\t/** @internal */\n\tbuild<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteCustomColumn<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteCustomColumn<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteCustomColumn<T extends ColumnBaseConfig<'custom', 'SQLiteCustomColumn'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteCustomColumn';\n\n\tprivate sqlName: string;\n\tprivate mapTo?: (value: T['data']) => T['driverParam'];\n\tprivate mapFrom?: (value: T['driverParam']) => T['data'];\n\n\tconstructor(\n\t\ttable: AnySQLiteTable<{ name: T['tableName'] }>,\n\t\tconfig: SQLiteCustomColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.sqlName = config.customTypeParams.dataType(config.fieldConfig);\n\t\tthis.mapTo = config.customTypeParams.toDriver;\n\t\tthis.mapFrom = config.customTypeParams.fromDriver;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.sqlName;\n\t}\n\n\toverride mapFromDriverValue(value: T['driverParam']): T['data'] {\n\t\treturn typeof this.mapFrom === 'function' ? this.mapFrom(value) : value as T['data'];\n\t}\n\n\toverride mapToDriverValue(value: T['data']): T['driverParam'] {\n\t\treturn typeof this.mapTo === 'function' ? this.mapTo(value) : value as T['data'];\n\t}\n}\n\nexport type CustomTypeValues = {\n\t/**\n\t * Required type for custom column, that will infer proper type model\n\t *\n\t * Examples:\n\t *\n\t * If you want your column to be `string` type after selecting/or on inserting - use `data: string`. Like `text`, `varchar`\n\t *\n\t * If you want your column to be `number` type after selecting/or on inserting - use `data: number`. Like `integer`\n\t */\n\tdata: unknown;\n\n\t/**\n\t * Type helper, that represents what type database driver is accepting for specific database data type\n\t */\n\tdriverData?: unknown;\n\n\t/**\n\t * What config type should be used for {@link CustomTypeParams} `dataType` generation\n\t */\n\tconfig?: Record<string, any>;\n\n\t/**\n\t * Whether the config argument should be required or not\n\t * @default false\n\t */\n\tconfigRequired?: boolean;\n\n\t/**\n\t * If your custom data type should be notNull by default you can use `notNull: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t dataType() {\n\t * \t return 'serial';\n\t * },\n\t * });\n\t */\n\tnotNull?: boolean;\n\n\t/**\n\t * If your custom data type has default you can use `default: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t dataType() {\n\t * \t return 'serial';\n\t * },\n\t * });\n\t */\n\tdefault?: boolean;\n};\n\nexport interface CustomTypeParams<T extends CustomTypeValues> {\n\t/**\n\t * Database data type string representation, that is used for migrations\n\t * @example\n\t * ```\n\t * `jsonb`, `text`\n\t * ```\n\t *\n\t * If database data type needs additional params you can use them from `config` param\n\t * @example\n\t * ```\n\t * `varchar(256)`, `numeric(2,3)`\n\t * ```\n\t *\n\t * To make `config` be of specific type please use config generic in {@link CustomTypeValues}\n\t *\n\t * @example\n\t * Usage example\n\t * ```\n\t * dataType() {\n\t * return 'boolean';\n\t * },\n\t * ```\n\t * Or\n\t * ```\n\t * dataType(config) {\n\t * \t return typeof config.length !== 'undefined' ? `varchar(${config.length})` : `varchar`;\n\t * \t }\n\t * ```\n\t */\n\tdataType: (config: T['config'] | (Equal<T['configRequired'], true> extends true ? never : undefined)) => string;\n\n\t/**\n\t * Optional mapping function, between user input and driver\n\t * @example\n\t * For example, when using jsonb we need to map JS/TS object to string before writing to database\n\t * ```\n\t * toDriver(value: TData): string {\n\t * \t return JSON.stringify(value);\n\t * }\n\t * ```\n\t */\n\ttoDriver?: (value: T['data']) => T['driverData'] | SQL;\n\n\t/**\n\t * Optional mapping function, that is responsible for data mapping from database to JS/TS code\n\t * @example\n\t * For example, when using timestamp we need to map string Date representation to JS Date\n\t * ```\n\t * fromDriver(value: string): Date {\n\t * \treturn new Date(value);\n\t * },\n\t * ```\n\t */\n\tfromDriver?: (value: T['driverData']) => T['data'];\n}\n\n/**\n * Custom sqlite database data type generator\n */\nexport function customType<T extends CustomTypeValues = CustomTypeValues>(\n\tcustomTypeParams: CustomTypeParams<T>,\n): Equal<T['configRequired'], true> extends true ? {\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig: TConfig,\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TName extends string>(\n\t\t\tdbName: TName,\n\t\t\tfieldConfig: T['config'],\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<TName, T>>;\n\t}\n\t: {\n\t\t(): SQLiteCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig?: TConfig,\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TName extends string>(\n\t\t\tdbName: TName,\n\t\t\tfieldConfig?: T['config'],\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<TName, T>>;\n\t}\n{\n\treturn <TName extends string>(\n\t\ta?: TName | T['config'],\n\t\tb?: T['config'],\n\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<TName, T>> => {\n\t\tconst { name, config } = getColumnNameAndConfig<T['config']>(a, b);\n\t\treturn new SQLiteCustomColumnBuilder(\n\t\t\tname as ConvertCustomConfig<TName, T>['name'],\n\t\t\tconfig,\n\t\t\tcustomTypeParams,\n\t\t);\n\t};\n}\n","import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tHasDefault,\n\tIsPrimaryKey,\n\tMakeColumnConfig,\n\tNotNull,\n} from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { OnConflict } from '~/sqlite-core/utils.ts';\nimport { type Equal, getColumnNameAndConfig, type Or } from '~/utils.ts';\nimport type { AnySQLiteTable } from '../table.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport interface PrimaryKeyConfig {\n\tautoIncrement?: boolean;\n\tonConflict?: OnConflict;\n}\n\nexport abstract class SQLiteBaseIntegerBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n> extends SQLiteColumnBuilder<\n\tT,\n\tTRuntimeConfig & { autoIncrement: boolean },\n\t{},\n\t{ primaryKeyHasDefault: true }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBaseIntegerBuilder';\n\n\tconstructor(name: T['name'], dataType: T['dataType'], columnType: T['columnType']) {\n\t\tsuper(name, dataType, columnType);\n\t\tthis.config.autoIncrement = false;\n\t}\n\n\toverride primaryKey(config?: PrimaryKeyConfig): IsPrimaryKey<HasDefault<NotNull<this>>> {\n\t\tif (config?.autoIncrement) {\n\t\t\tthis.config.autoIncrement = true;\n\t\t}\n\t\tthis.config.hasDefault = true;\n\t\treturn super.primaryKey() as IsPrimaryKey<HasDefault<NotNull<this>>>;\n\t}\n\n\t/** @internal */\n\tabstract override build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteBaseInteger<MakeColumnConfig<T, TTableName>>;\n}\n\nexport abstract class SQLiteBaseInteger<\n\tT extends ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n> extends SQLiteColumn<T, TRuntimeConfig & { autoIncrement: boolean }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBaseInteger';\n\n\treadonly autoIncrement: boolean = this.config.autoIncrement;\n\n\tgetSQLType(): string {\n\t\treturn 'integer';\n\t}\n}\n\nexport type SQLiteIntegerBuilderInitial<TName extends string> = SQLiteIntegerBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SQLiteInteger';\n\tdata: number;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteIntegerBuilder<T extends ColumnBuilderBaseConfig<'number', 'SQLiteInteger'>>\n\textends SQLiteBaseIntegerBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteIntegerBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'SQLiteInteger');\n\t}\n\n\tbuild<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteInteger<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteInteger<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteInteger<T extends ColumnBaseConfig<'number', 'SQLiteInteger'>> extends SQLiteBaseInteger<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteInteger';\n}\n\nexport type SQLiteTimestampBuilderInitial<TName extends string> = SQLiteTimestampBuilder<{\n\tname: TName;\n\tdataType: 'date';\n\tcolumnType: 'SQLiteTimestamp';\n\tdata: Date;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteTimestampBuilder<T extends ColumnBuilderBaseConfig<'date', 'SQLiteTimestamp'>>\n\textends SQLiteBaseIntegerBuilder<T, { mode: 'timestamp' | 'timestamp_ms' }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTimestampBuilder';\n\n\tconstructor(name: T['name'], mode: 'timestamp' | 'timestamp_ms') {\n\t\tsuper(name, 'date', 'SQLiteTimestamp');\n\t\tthis.config.mode = mode;\n\t}\n\n\t/**\n\t * @deprecated Use `default()` with your own expression instead.\n\t *\n\t * Adds `DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer))` to the column, which is the current epoch timestamp in milliseconds.\n\t */\n\tdefaultNow(): HasDefault<this> {\n\t\treturn this.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`) as any;\n\t}\n\n\tbuild<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteTimestamp<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteTimestamp<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteTimestamp<T extends ColumnBaseConfig<'date', 'SQLiteTimestamp'>>\n\textends SQLiteBaseInteger<T, { mode: 'timestamp' | 'timestamp_ms' }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTimestamp';\n\n\treadonly mode: 'timestamp' | 'timestamp_ms' = this.config.mode;\n\n\toverride mapFromDriverValue(value: number): Date {\n\t\tif (this.config.mode === 'timestamp') {\n\t\t\treturn new Date(value * 1000);\n\t\t}\n\t\treturn new Date(value);\n\t}\n\n\toverride mapToDriverValue(value: Date): number {\n\t\tconst unix = value.getTime();\n\t\tif (this.config.mode === 'timestamp') {\n\t\t\treturn Math.floor(unix / 1000);\n\t\t}\n\t\treturn unix;\n\t}\n}\n\nexport type SQLiteBooleanBuilderInitial<TName extends string> = SQLiteBooleanBuilder<{\n\tname: TName;\n\tdataType: 'boolean';\n\tcolumnType: 'SQLiteBoolean';\n\tdata: boolean;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteBooleanBuilder<T extends ColumnBuilderBaseConfig<'boolean', 'SQLiteBoolean'>>\n\textends SQLiteBaseIntegerBuilder<T, { mode: 'boolean' }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteBooleanBuilder';\n\n\tconstructor(name: T['name'], mode: 'boolean') {\n\t\tsuper(name, 'boolean', 'SQLiteBoolean');\n\t\tthis.config.mode = mode;\n\t}\n\n\tbuild<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteBoolean<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteBoolean<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteBoolean<T extends ColumnBaseConfig<'boolean', 'SQLiteBoolean'>>\n\textends SQLiteBaseInteger<T, { mode: 'boolean' }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteBoolean';\n\n\treadonly mode: 'boolean' = this.config.mode;\n\n\toverride mapFromDriverValue(value: number): boolean {\n\t\treturn Number(value) === 1;\n\t}\n\n\toverride mapToDriverValue(value: boolean): number {\n\t\treturn value ? 1 : 0;\n\t}\n}\n\nexport interface IntegerConfig<\n\tTMode extends 'number' | 'timestamp' | 'timestamp_ms' | 'boolean' =\n\t\t| 'number'\n\t\t| 'timestamp'\n\t\t| 'timestamp_ms'\n\t\t| 'boolean',\n> {\n\tmode: TMode;\n}\n\nexport function integer(): SQLiteIntegerBuilderInitial<''>;\nexport function integer<TMode extends IntegerConfig['mode']>(\n\tconfig?: IntegerConfig<TMode>,\n): Or<Equal<TMode, 'timestamp'>, Equal<TMode, 'timestamp_ms'>> extends true ? SQLiteTimestampBuilderInitial<''>\n\t: Equal<TMode, 'boolean'> extends true ? SQLiteBooleanBuilderInitial<''>\n\t: SQLiteIntegerBuilderInitial<''>;\nexport function integer<TName extends string, TMode extends IntegerConfig['mode']>(\n\tname: TName,\n\tconfig?: IntegerConfig<TMode>,\n): Or<Equal<TMode, 'timestamp'>, Equal<TMode, 'timestamp_ms'>> extends true ? SQLiteTimestampBuilderInitial<TName>\n\t: Equal<TMode, 'boolean'> extends true ? SQLiteBooleanBuilderInitial<TName>\n\t: SQLiteIntegerBuilderInitial<TName>;\nexport function integer(a?: string | IntegerConfig, b?: IntegerConfig) {\n\tconst { name, config } = getColumnNameAndConfig<IntegerConfig | undefined>(a, b);\n\tif (config?.mode === 'timestamp' || config?.mode === 'timestamp_ms') {\n\t\treturn new SQLiteTimestampBuilder(name, config.mode);\n\t}\n\tif (config?.mode === 'boolean') {\n\t\treturn new SQLiteBooleanBuilder(name, config.mode);\n\t}\n\treturn new SQLiteIntegerBuilder(name);\n}\n\nexport const int = integer;\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySQLiteTable } from '~/sqlite-core/table.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport type SQLiteNumericBuilderInitial<TName extends string> = SQLiteNumericBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'SQLiteNumeric';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteNumericBuilder<T extends ColumnBuilderBaseConfig<'string', 'SQLiteNumeric'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'SQLiteNumeric');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteNumeric<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteNumeric<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteNumeric<T extends ColumnBaseConfig<'string', 'SQLiteNumeric'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumeric';\n\n\tgetSQLType(): string {\n\t\treturn 'numeric';\n\t}\n}\n\nexport function numeric(): SQLiteNumericBuilderInitial<''>;\nexport function numeric<TName extends string>(name: TName): SQLiteNumericBuilderInitial<TName>;\nexport function numeric(name?: string) {\n\treturn new SQLiteNumericBuilder(name ?? '');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySQLiteTable } from '../table.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport type SQLiteRealBuilderInitial<TName extends string> = SQLiteRealBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SQLiteReal';\n\tdata: number;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteRealBuilder<T extends ColumnBuilderBaseConfig<'number', 'SQLiteReal'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteRealBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'SQLiteReal');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteReal<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteReal<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class SQLiteReal<T extends ColumnBaseConfig<'number', 'SQLiteReal'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteReal';\n\n\tgetSQLType(): string {\n\t\treturn 'real';\n\t}\n}\n\nexport function real(): SQLiteRealBuilderInitial<''>;\nexport function real<TName extends string>(name: TName): SQLiteRealBuilderInitial<TName>;\nexport function real(name?: string) {\n\treturn new SQLiteRealBuilder(name ?? '');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Equal, getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport type SQLiteTextBuilderInitial<\n\tTName extends string,\n\tTEnum extends [string, ...string[]],\n\tTLength extends number | undefined,\n> = SQLiteTextBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'SQLiteText';\n\tdata: TEnum[number];\n\tdriverParam: string;\n\tenumValues: TEnum;\n\tlength: TLength;\n}>;\n\nexport class SQLiteTextBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'SQLiteText'> & { length?: number | undefined },\n> extends SQLiteColumnBuilder<\n\tT,\n\t{ length: T['length']; enumValues: T['enumValues'] },\n\t{ length: T['length'] }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTextBuilder';\n\n\tconstructor(name: T['name'], config: SQLiteTextConfig<'text', T['enumValues'], T['length']>) {\n\t\tsuper(name, 'string', 'SQLiteText');\n\t\tthis.config.enumValues = config.enum;\n\t\tthis.config.length = config.length;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteText<MakeColumnConfig<T, TTableName> & { length: T['length'] }> {\n\t\treturn new SQLiteText<MakeColumnConfig<T, TTableName> & { length: T['length'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteText<T extends ColumnBaseConfig<'string', 'SQLiteText'> & { length?: number | undefined }>\n\textends SQLiteColumn<T, { length: T['length']; enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteText';\n\n\toverride readonly enumValues = this.config.enumValues;\n\n\treadonly length: T['length'] = this.config.length;\n\n\tconstructor(\n\t\ttable: AnySQLiteTable<{ name: T['tableName'] }>,\n\t\tconfig: SQLiteTextBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `text${this.config.length ? `(${this.config.length})` : ''}`;\n\t}\n}\n\nexport type SQLiteTextJsonBuilderInitial<TName extends string> = SQLiteTextJsonBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'SQLiteTextJson';\n\tdata: unknown;\n\tdriverParam: string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SQLiteTextJsonBuilder<T extends ColumnBuilderBaseConfig<'json', 'SQLiteTextJson'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTextJsonBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'SQLiteTextJson');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteTextJson<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteTextJson<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteTextJson<T extends ColumnBaseConfig<'json', 'SQLiteTextJson'>>\n\textends SQLiteColumn<T, { length: number | undefined; enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTextJson';\n\n\tgetSQLType(): string {\n\t\treturn 'text';\n\t}\n\n\toverride mapFromDriverValue(value: string): T['data'] {\n\t\treturn JSON.parse(value);\n\t}\n\n\toverride mapToDriverValue(value: T['data']): string {\n\t\treturn JSON.stringify(value);\n\t}\n}\n\nexport type SQLiteTextConfig<\n\tTMode extends 'text' | 'json' = 'text' | 'json',\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n\tTLength extends number | undefined = number | undefined,\n> = TMode extends 'text' ? {\n\t\tmode?: TMode;\n\t\tlength?: TLength;\n\t\tenum?: TEnum;\n\t}\n\t: {\n\t\tmode?: TMode;\n\t};\n\nexport function text(): SQLiteTextBuilderInitial<'', [string, ...string[]], undefined>;\nexport function text<\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tL extends number | undefined,\n\tTMode extends 'text' | 'json' = 'text' | 'json',\n>(\n\tconfig?: SQLiteTextConfig<TMode, T | Writable<T>, L>,\n): Equal<TMode, 'json'> extends true ? SQLiteTextJsonBuilderInitial<''>\n\t: SQLiteTextBuilderInitial<'', Writable<T>, L>;\nexport function text<\n\tTName extends string,\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tL extends number | undefined,\n\tTMode extends 'text' | 'json' = 'text' | 'json',\n>(\n\tname: TName,\n\tconfig?: SQLiteTextConfig<TMode, T | Writable<T>, L>,\n): Equal<TMode, 'json'> extends true ? SQLiteTextJsonBuilderInitial<TName>\n\t: SQLiteTextBuilderInitial<TName, Writable<T>, L>;\nexport function text(a?: string | SQLiteTextConfig, b: SQLiteTextConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<SQLiteTextConfig>(a, b);\n\tif (config.mode === 'json') {\n\t\treturn new SQLiteTextJsonBuilder(name);\n\t}\n\treturn new SQLiteTextBuilder(name, config as any);\n}\n","import { blob } from './blob.ts';\nimport { customType } from './custom.ts';\nimport { integer } from './integer.ts';\nimport { numeric } from './numeric.ts';\nimport { real } from './real.ts';\nimport { text } from './text.ts';\n\nexport function getSQLiteColumnBuilders() {\n\treturn {\n\t\tblob,\n\t\tcustomType,\n\t\tinteger,\n\t\tnumeric,\n\t\treal,\n\t\ttext,\n\t};\n}\n\nexport type SQLiteColumnBuilders = ReturnType<typeof getSQLiteColumnBuilders>;\n","import type { BuildColumns, BuildExtraConfigColumns } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport { Table, type TableConfig as TableConfigBase, type UpdateTableConfig } from '~/table.ts';\nimport type { CheckBuilder } from './checks.ts';\nimport { getSQLiteColumnBuilders, type SQLiteColumnBuilders } from './columns/all.ts';\nimport type { SQLiteColumn, SQLiteColumnBuilder, SQLiteColumnBuilderBase } from './columns/common.ts';\nimport type { ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { IndexBuilder } from './indexes.ts';\nimport type { PrimaryKeyBuilder } from './primary-keys.ts';\nimport type { UniqueConstraintBuilder } from './unique-constraint.ts';\n\nexport type SQLiteTableExtraConfigValue =\n\t| IndexBuilder\n\t| CheckBuilder\n\t| ForeignKeyBuilder\n\t| PrimaryKeyBuilder\n\t| UniqueConstraintBuilder;\n\nexport type SQLiteTableExtraConfig = Record<\n\tstring,\n\tSQLiteTableExtraConfigValue\n>;\n\nexport type TableConfig = TableConfigBase<SQLiteColumn<any>>;\n\n/** @internal */\nexport const InlineForeignKeys = Symbol.for('drizzle:SQLiteInlineForeignKeys');\n\nexport class SQLiteTable<T extends TableConfig = TableConfig> extends Table<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTable';\n\n\t/** @internal */\n\tstatic override readonly Symbol = Object.assign({}, Table.Symbol, {\n\t\tInlineForeignKeys: InlineForeignKeys as typeof InlineForeignKeys,\n\t});\n\n\t/** @internal */\n\toverride [Table.Symbol.Columns]!: NonNullable<T['columns']>;\n\n\t/** @internal */\n\t[InlineForeignKeys]: ForeignKey[] = [];\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigBuilder]:\n\t\t| ((self: Record<string, SQLiteColumn>) => SQLiteTableExtraConfig)\n\t\t| undefined = undefined;\n}\n\nexport type AnySQLiteTable<TPartial extends Partial<TableConfig> = {}> = SQLiteTable<\n\tUpdateTableConfig<TableConfig, TPartial>\n>;\n\nexport type SQLiteTableWithColumns<T extends TableConfig> =\n\t& SQLiteTable<T>\n\t& {\n\t\t[Key in keyof T['columns']]: T['columns'][Key];\n\t};\n\nexport interface SQLiteTableFn<TSchema extends string | undefined = undefined> {\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, SQLiteColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (\n\t\t\tself: BuildColumns<TTableName, TColumnsMap, 'sqlite'>,\n\t\t) => SQLiteTableExtraConfigValue[],\n\t): SQLiteTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>;\n\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, SQLiteColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: SQLiteColumnBuilders) => TColumnsMap,\n\t\textraConfig?: (self: BuildColumns<TTableName, TColumnsMap, 'sqlite'>) => SQLiteTableExtraConfigValue[],\n\t): SQLiteTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>;\n\t/**\n\t * @deprecated The third parameter of sqliteTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = sqliteTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = sqliteTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, SQLiteColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (self: BuildColumns<TTableName, TColumnsMap, 'sqlite'>) => SQLiteTableExtraConfig,\n\t): SQLiteTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>;\n\n\t/**\n\t * @deprecated The third parameter of sqliteTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = sqliteTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = sqliteTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, SQLiteColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: SQLiteColumnBuilders) => TColumnsMap,\n\t\textraConfig?: (self: BuildColumns<TTableName, TColumnsMap, 'sqlite'>) => SQLiteTableExtraConfig,\n\t): SQLiteTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>;\n}\n\nfunction sqliteTableBase<\n\tTTableName extends string,\n\tTColumnsMap extends Record<string, SQLiteColumnBuilderBase>,\n\tTSchema extends string | undefined,\n>(\n\tname: TTableName,\n\tcolumns: TColumnsMap | ((columnTypes: SQLiteColumnBuilders) => TColumnsMap),\n\textraConfig:\n\t\t| ((\n\t\t\tself: BuildColumns<TTableName, TColumnsMap, 'sqlite'>,\n\t\t) => SQLiteTableExtraConfig | SQLiteTableExtraConfigValue[])\n\t\t| undefined,\n\tschema?: TSchema,\n\tbaseName = name,\n): SQLiteTableWithColumns<{\n\tname: TTableName;\n\tschema: TSchema;\n\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\tdialect: 'sqlite';\n}> {\n\tconst rawTable = new SQLiteTable<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>(name, schema, baseName);\n\n\tconst parsedColumns: TColumnsMap = typeof columns === 'function' ? columns(getSQLiteColumnBuilders()) : columns;\n\n\tconst builtColumns = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as SQLiteColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.build(rawTable);\n\t\t\trawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\n\tconst table = Object.assign(rawTable, builtColumns);\n\n\ttable[Table.Symbol.Columns] = builtColumns;\n\ttable[Table.Symbol.ExtraConfigColumns] = builtColumns as unknown as BuildExtraConfigColumns<\n\t\tTTableName,\n\t\tTColumnsMap,\n\t\t'sqlite'\n\t>;\n\n\tif (extraConfig) {\n\t\ttable[SQLiteTable.Symbol.ExtraConfigBuilder] = extraConfig as (\n\t\t\tself: Record<string, SQLiteColumn>,\n\t\t) => SQLiteTableExtraConfig;\n\t}\n\n\treturn table;\n}\n\nexport const sqliteTable: SQLiteTableFn = (name, columns, extraConfig) => {\n\treturn sqliteTableBase(name, columns, extraConfig);\n};\n\nexport function sqliteTableCreator(customizeTableName: (name: string) => string): SQLiteTableFn {\n\treturn (name, columns, extraConfig) => {\n\t\treturn sqliteTableBase(customizeTableName(name) as typeof name, columns, extraConfig, undefined, name);\n\t};\n}\n","import { entityKind } from '~/entity.ts';\nimport type { SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { Placeholder, Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport { type DrizzleTypeError, orderSelectedFields, type ValueOrArray } from '~/utils.ts';\nimport type { SQLiteColumn } from '../columns/common.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts';\n\nexport type SQLiteDeleteWithout<\n\tT extends AnySQLiteDeleteBase,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T\n\t: Omit<\n\t\tSQLiteDeleteBase<\n\t\t\tT['_']['table'],\n\t\t\tT['_']['resultType'],\n\t\t\tT['_']['runResult'],\n\t\t\tT['_']['returning'],\n\t\t\tTDynamic,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>,\n\t\tT['_']['excludedMethods'] | K\n\t>;\n\nexport type SQLiteDelete<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n> = SQLiteDeleteBase<TTable, TResultType, TRunResult, TReturning, true, never>;\n\nexport interface SQLiteDeleteConfig {\n\twhere?: SQL | undefined;\n\tlimit?: number | Placeholder;\n\torderBy?: (SQLiteColumn | SQL | SQL.Aliased)[];\n\ttable: SQLiteTable;\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type SQLiteDeleteReturningAll<\n\tT extends AnySQLiteDeleteBase,\n\tTDynamic extends boolean,\n> = SQLiteDeleteWithout<\n\tSQLiteDeleteBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tT['_']['dynamic'],\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteDeleteReturning<\n\tT extends AnySQLiteDeleteBase,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFieldsFlat,\n> = SQLiteDeleteWithout<\n\tSQLiteDeleteBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tSelectResultFields<TSelectedFields>,\n\t\tT['_']['dynamic'],\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteDeleteExecute<T extends AnySQLiteDeleteBase> = T['_']['returning'] extends undefined\n\t? T['_']['runResult']\n\t: T['_']['returning'][];\n\nexport type SQLiteDeletePrepare<T extends AnySQLiteDeleteBase> = SQLitePreparedQuery<{\n\ttype: T['_']['resultType'];\n\trun: T['_']['runResult'];\n\tall: T['_']['returning'] extends undefined ? DrizzleTypeError<'.all() cannot be used without .returning()'>\n\t\t: T['_']['returning'][];\n\tget: T['_']['returning'] extends undefined ? DrizzleTypeError<'.get() cannot be used without .returning()'>\n\t\t: T['_']['returning'] | undefined;\n\tvalues: T['_']['returning'] extends undefined ? DrizzleTypeError<'.values() cannot be used without .returning()'>\n\t\t: any[][];\n\texecute: SQLiteDeleteExecute<T>;\n}>;\n\nexport type SQLiteDeleteDynamic<T extends AnySQLiteDeleteBase> = SQLiteDelete<\n\tT['_']['table'],\n\tT['_']['resultType'],\n\tT['_']['runResult'],\n\tT['_']['returning']\n>;\n\nexport type AnySQLiteDeleteBase = SQLiteDeleteBase<any, any, any, any, any, any>;\n\nexport interface SQLiteDeleteBase<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tQueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>,\n\tSQLWrapper\n{\n\treadonly _: {\n\t\tdialect: 'sqlite';\n\t\treadonly table: TTable;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? TRunResult : TReturning[];\n\t};\n}\n\nexport class SQLiteDeleteBase<\n\tTTable extends SQLiteTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>\n\timplements RunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteDelete';\n\n\t/** @internal */\n\tconfig: SQLiteDeleteConfig;\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: SQLiteSession<any, any, any, any>,\n\t\tprivate dialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, withList };\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will delete only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be deleted.\n\t *\n\t * ```ts\n\t * // Delete all cars with green color\n\t * db.delete(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * db.delete(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Delete all BMW cars with a green color\n\t * db.delete(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Delete all cars with the green or blue color\n\t * db.delete(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): SQLiteDeleteWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\torderBy(\n\t\tbuilder: (deleteTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteDeleteWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (SQLiteColumn | SQL | SQL.Aliased)[]): SQLiteDeleteWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(deleteTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteDeleteWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as any,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t} else {\n\t\t\tconst orderByArray = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\tlimit(limit: number | Placeholder): SQLiteDeleteWithout<this, TDynamic, 'limit'> {\n\t\tthis.config.limit = limit;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the deleted rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete#delete-with-return}\n\t *\n\t * @example\n\t * ```ts\n\t * // Delete all cars with the green color and return all fields\n\t * const deletedCars: Car[] = await db.delete(cars)\n\t * .where(eq(cars.color, 'green'))\n\t * .returning();\n\t *\n\t * // Delete all cars with the green color and return only their id and brand fields\n\t * const deletedCarsIdsAndBrands: { id: number, brand: string }[] = await db.delete(cars)\n\t * .where(eq(cars.color, 'green'))\n\t * .returning({ id: cars.id, brand: cars.brand });\n\t * ```\n\t */\n\treturning(): SQLiteDeleteReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFieldsFlat>(\n\t\tfields: TSelectedFields,\n\t): SQLiteDeleteReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields: SelectedFieldsFlat = this.table[SQLiteTable.Symbol.Columns],\n\t): SQLiteDeleteReturning<this, TDynamic, any> {\n\t\tthis.config.returning = orderSelectedFields<SQLiteColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildDeleteQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(isOneTimeQuery = true): SQLiteDeletePrepare<this> {\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tthis.config.returning,\n\t\t\tthis.config.returning ? 'all' : 'run',\n\t\t\ttrue,\n\t\t) as SQLiteDeletePrepare<this>;\n\t}\n\n\tprepare(): SQLiteDeletePrepare<this> {\n\t\treturn this._prepare(false);\n\t}\n\n\trun: ReturnType<this['prepare']>['run'] = (placeholderValues) => {\n\t\treturn this._prepare().run(placeholderValues);\n\t};\n\n\tall: ReturnType<this['prepare']>['all'] = (placeholderValues) => {\n\t\treturn this._prepare().all(placeholderValues);\n\t};\n\n\tget: ReturnType<this['prepare']>['get'] = (placeholderValues) => {\n\t\treturn this._prepare().get(placeholderValues);\n\t};\n\n\tvalues: ReturnType<this['prepare']>['values'] = (placeholderValues) => {\n\t\treturn this._prepare().values(placeholderValues);\n\t};\n\n\toverride async execute(placeholderValues?: Record<string, unknown>): Promise<SQLiteDeleteExecute<this>> {\n\t\treturn this._prepare().execute(placeholderValues) as SQLiteDeleteExecute<this>;\n\t}\n\n\t$dynamic(): SQLiteDeleteDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n","import type { Column } from '~/column.ts';\nimport { entityKind } from './entity.ts';\nimport { Table } from './table.ts';\nimport type { Casing } from './utils.ts';\n\nexport function toSnakeCase(input: string) {\n\tconst words = input\n\t\t.replace(/['\\u2019]/g, '')\n\t\t.match(/[\\da-z]+|[A-Z]+(?![a-z])|[A-Z][\\da-z]+/g) ?? [];\n\n\treturn words.map((word) => word.toLowerCase()).join('_');\n}\n\nexport function toCamelCase(input: string) {\n\tconst words = input\n\t\t.replace(/['\\u2019]/g, '')\n\t\t.match(/[\\da-z]+|[A-Z]+(?![a-z])|[A-Z][\\da-z]+/g) ?? [];\n\n\treturn words.reduce((acc, word, i) => {\n\t\tconst formattedWord = i === 0 ? word.toLowerCase() : `${word[0]!.toUpperCase()}${word.slice(1)}`;\n\t\treturn acc + formattedWord;\n\t}, '');\n}\n\nfunction noopCase(input: string) {\n\treturn input;\n}\n\nexport class CasingCache {\n\tstatic readonly [entityKind]: string = 'CasingCache';\n\n\t/** @internal */\n\tcache: Record<string, string> = {};\n\tprivate cachedTables: Record<string, true> = {};\n\tprivate convert: (input: string) => string;\n\n\tconstructor(casing?: Casing) {\n\t\tthis.convert = casing === 'snake_case'\n\t\t\t? toSnakeCase\n\t\t\t: casing === 'camelCase'\n\t\t\t? toCamelCase\n\t\t\t: noopCase;\n\t}\n\n\tgetColumnCasing(column: Column): string {\n\t\tif (!column.keyAsName) return column.name;\n\n\t\tconst schema = column.table[Table.Symbol.Schema] ?? 'public';\n\t\tconst tableName = column.table[Table.Symbol.OriginalName];\n\t\tconst key = `${schema}.${tableName}.${column.name}`;\n\n\t\tif (!this.cache[key]) {\n\t\t\tthis.cacheTable(column.table);\n\t\t}\n\t\treturn this.cache[key]!;\n\t}\n\n\tprivate cacheTable(table: Table) {\n\t\tconst schema = table[Table.Symbol.Schema] ?? 'public';\n\t\tconst tableName = table[Table.Symbol.OriginalName];\n\t\tconst tableKey = `${schema}.${tableName}`;\n\n\t\tif (!this.cachedTables[tableKey]) {\n\t\t\tfor (const column of Object.values(table[Table.Symbol.Columns])) {\n\t\t\t\tconst columnKey = `${tableKey}.${column.name}`;\n\t\t\t\tthis.cache[columnKey] = this.convert(column.name);\n\t\t\t}\n\t\t\tthis.cachedTables[tableKey] = true;\n\t\t}\n\t}\n\n\tclearCache() {\n\t\tthis.cache = {};\n\t\tthis.cachedTables = {};\n\t}\n}\n","import { entityKind } from '~/entity.ts';\n\nexport class DrizzleError extends Error {\n\tstatic readonly [entityKind]: string = 'DrizzleError';\n\n\tconstructor({ message, cause }: { message?: string; cause?: unknown }) {\n\t\tsuper(message);\n\t\tthis.name = 'DrizzleError';\n\t\tthis.cause = cause;\n\t}\n}\n\nexport class TransactionRollbackError extends DrizzleError {\n\tstatic override readonly [entityKind]: string = 'TransactionRollbackError';\n\n\tconstructor() {\n\t\tsuper({ message: 'Rollback' });\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport type { ColumnsSelection } from '~/sql/sql.ts';\nimport { View } from '~/sql/sql.ts';\n\nexport abstract class SQLiteViewBase<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n> extends View<TName, TExisting, TSelection> {\n\tstatic override readonly [entityKind]: string = 'SQLiteViewBase';\n\n\tdeclare _: View<TName, TExisting, TSelection>['_'] & {\n\t\tviewBrand: 'SQLiteView';\n\t};\n}\n","import { aliasedTable, aliasedTableColumn, mapColumnsInAliasedSQLToAlias, mapColumnsInSQLToAlias } from '~/alias.ts';\nimport { CasingCache } from '~/casing.ts';\nimport type { AnyColumn } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta } from '~/migrator.ts';\nimport {\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tgetOperators,\n\tgetOrderByOperators,\n\tMany,\n\tnormalizeRelation,\n\tOne,\n\ttype Relation,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport type { Name, Placeholder } from '~/sql/index.ts';\nimport { and, eq } from '~/sql/index.ts';\nimport { Param, type QueryWithTypings, SQL, sql, type SQLChunk } from '~/sql/sql.ts';\nimport { SQLiteColumn } from '~/sqlite-core/columns/index.ts';\nimport type {\n\tAnySQLiteSelectQueryBuilder,\n\tSQLiteDeleteConfig,\n\tSQLiteInsertConfig,\n\tSQLiteUpdateConfig,\n} from '~/sqlite-core/query-builders/index.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { getTableName, getTableUniqueName, Table } from '~/table.ts';\nimport { type Casing, orderSelectedFields, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type {\n\tSelectedFieldsOrdered,\n\tSQLiteSelectConfig,\n\tSQLiteSelectJoinConfig,\n} from './query-builders/select.types.ts';\nimport type { SQLiteSession } from './session.ts';\nimport { SQLiteViewBase } from './view-base.ts';\n\nexport interface SQLiteDialectConfig {\n\tcasing?: Casing;\n}\n\nexport abstract class SQLiteDialect {\n\tstatic readonly [entityKind]: string = 'SQLiteDialect';\n\n\t/** @internal */\n\treadonly casing: CasingCache;\n\n\tconstructor(config?: SQLiteDialectConfig) {\n\t\tthis.casing = new CasingCache(config?.casing);\n\t}\n\n\tescapeName(name: string): string {\n\t\treturn `\"${name}\"`;\n\t}\n\n\tescapeParam(_num: number): string {\n\t\treturn '?';\n\t}\n\n\tescapeString(str: string): string {\n\t\treturn `'${str.replace(/'/g, \"''\")}'`;\n\t}\n\n\tprivate buildWithCTE(queries: Subquery[] | undefined): SQL | undefined {\n\t\tif (!queries?.length) return undefined;\n\n\t\tconst withSqlChunks = [sql`with `];\n\t\tfor (const [i, w] of queries.entries()) {\n\t\t\twithSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);\n\t\t\tif (i < queries.length - 1) {\n\t\t\t\twithSqlChunks.push(sql`, `);\n\t\t\t}\n\t\t}\n\t\twithSqlChunks.push(sql` `);\n\t\treturn sql.join(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({ table, where, returning, withList, limit, orderBy }: SQLiteDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n\t}\n\n\tbuildUpdateSet(table: SQLiteTable, set: UpdateSet): SQL {\n\t\tconst tableColumns = table[Table.Symbol.Columns];\n\n\t\tconst columnNames = Object.keys(tableColumns).filter((colName) =>\n\t\t\tset[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined\n\t\t);\n\n\t\tconst setSize = columnNames.length;\n\t\treturn sql.join(columnNames.flatMap((colName, i) => {\n\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\tconst value = set[colName] ?? sql.param(col.onUpdateFn!(), col);\n\t\t\tconst res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;\n\n\t\t\tif (i < setSize - 1) {\n\t\t\t\treturn [res, sql.raw(', ')];\n\t\t\t}\n\t\t\treturn [res];\n\t\t}));\n\t}\n\n\tbuildUpdateQuery({ table, set, where, returning, withList, joins, from, limit, orderBy }: SQLiteUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst fromSql = from && sql.join([sql.raw(' from '), this.buildFromTable(from)]);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n\t}\n\n\t/**\n\t * Builds selection SQL with provided fields/expressions\n\t *\n\t * Examples:\n\t *\n\t * `select <selection> from`\n\t *\n\t * `insert ... returning <selection>`\n\t *\n\t * If `isSingleTable` is true, then columns won't be prefixed with table name\n\t */\n\tprivate buildSelection(\n\t\tfields: SelectedFieldsOrdered,\n\t\t{ isSingleTable = false }: { isSingleTable?: boolean } = {},\n\t): SQL {\n\t\tconst columnsLen = fields.length;\n\n\t\tconst chunks = fields\n\t\t\t.flatMap(({ field }, i) => {\n\t\t\t\tconst chunk: SQLChunk[] = [];\n\n\t\t\t\tif (is(field, SQL.Aliased) && field.isSelectionField) {\n\t\t\t\t\tchunk.push(sql.identifier(field.fieldAlias));\n\t\t\t\t} else if (is(field, SQL.Aliased) || is(field, SQL)) {\n\t\t\t\t\tconst query = is(field, SQL.Aliased) ? field.sql : field;\n\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tnew SQL(\n\t\t\t\t\t\t\t\tquery.queryChunks.map((c) => {\n\t\t\t\t\t\t\t\t\tif (is(c, Column)) {\n\t\t\t\t\t\t\t\t\t\treturn sql.identifier(this.casing.getColumnCasing(c));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn c;\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(query);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (is(field, SQL.Aliased)) {\n\t\t\t\t\t\tchunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Column)) {\n\t\t\t\t\tconst tableName = field.table[Table.Symbol.Name];\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(sql.identifier(this.casing.getColumnCasing(field)));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(sql`${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (i < columnsLen - 1) {\n\t\t\t\t\tchunk.push(sql`, `);\n\t\t\t\t}\n\n\t\t\t\treturn chunk;\n\t\t\t});\n\n\t\treturn sql.join(chunks);\n\t}\n\n\tprivate buildJoins(joins: SQLiteSelectJoinConfig[] | undefined): SQL | undefined {\n\t\tif (!joins || joins.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst joinsArray: SQL[] = [];\n\n\t\tif (joins) {\n\t\t\tfor (const [index, joinMeta] of joins.entries()) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t\tconst table = joinMeta.table;\n\n\t\t\t\tif (is(table, SQLiteTable)) {\n\t\t\t\t\tconst tableName = table[SQLiteTable.Symbol.Name];\n\t\t\t\t\tconst tableSchema = table[SQLiteTable.Symbol.Schema];\n\t\t\t\t\tconst origTableName = table[SQLiteTable.Symbol.OriginalName];\n\t\t\t\t\tconst alias = tableName === origTableName ? undefined : joinMeta.alias;\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${\n\t\t\t\t\t\t\tsql.identifier(origTableName)\n\t\t\t\t\t\t}${alias && sql` ${sql.identifier(alias)}`} on ${joinMeta.on}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join ${table} on ${joinMeta.on}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (index < joins.length - 1) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sql.join(joinsArray);\n\t}\n\n\tprivate buildLimit(limit: number | Placeholder | undefined): SQL | undefined {\n\t\treturn typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\t}\n\n\tprivate buildOrderBy(orderBy: (SQLiteColumn | SQL | SQL.Aliased)[] | undefined): SQL | undefined {\n\t\tconst orderByList: (SQLiteColumn | SQL | SQL.Aliased)[] = [];\n\n\t\tif (orderBy) {\n\t\t\tfor (const [index, orderByValue] of orderBy.entries()) {\n\t\t\t\torderByList.push(orderByValue);\n\n\t\t\t\tif (index < orderBy.length - 1) {\n\t\t\t\t\torderByList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn orderByList.length > 0 ? sql` order by ${sql.join(orderByList)}` : undefined;\n\t}\n\n\tprivate buildFromTable(\n\t\ttable: SQL | Subquery | SQLiteViewBase | SQLiteTable | undefined,\n\t): SQL | Subquery | SQLiteViewBase | SQLiteTable | undefined {\n\t\tif (is(table, Table) && table[Table.Symbol.OriginalName] !== table[Table.Symbol.Name]) {\n\t\t\treturn sql`${sql.identifier(table[Table.Symbol.OriginalName])} ${sql.identifier(table[Table.Symbol.Name])}`;\n\t\t}\n\n\t\treturn table;\n\t}\n\n\tbuildSelectQuery(\n\t\t{\n\t\t\twithList,\n\t\t\tfields,\n\t\t\tfieldsFlat,\n\t\t\twhere,\n\t\t\thaving,\n\t\t\ttable,\n\t\t\tjoins,\n\t\t\torderBy,\n\t\t\tgroupBy,\n\t\t\tlimit,\n\t\t\toffset,\n\t\t\tdistinct,\n\t\t\tsetOperators,\n\t\t}: SQLiteSelectConfig,\n\t): SQL {\n\t\tconst fieldsList = fieldsFlat ?? orderSelectedFields<SQLiteColumn>(fields);\n\t\tfor (const f of fieldsList) {\n\t\t\tif (\n\t\t\t\tis(f.field, Column)\n\t\t\t\t&& getTableName(f.field.table)\n\t\t\t\t\t!== (is(table, Subquery)\n\t\t\t\t\t\t? table._.alias\n\t\t\t\t\t\t: is(table, SQLiteViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].name\n\t\t\t\t\t\t: is(table, SQL)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: getTableName(table))\n\t\t\t\t&& !((table) =>\n\t\t\t\t\tjoins?.some(({ alias }) =>\n\t\t\t\t\t\talias === (table[Table.Symbol.IsAlias] ? getTableName(table) : table[Table.Symbol.BaseName])\n\t\t\t\t\t))(f.field.table)\n\t\t\t) {\n\t\t\t\tconst tableName = getTableName(f.field.table);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Your \"${\n\t\t\t\t\t\tf.path.join('->')\n\t\t\t\t\t}\" field references a column \"${tableName}\".\"${f.field.name}\", but the table \"${tableName}\" is not part of the query! Did you forget to join it?`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst isSingleTable = !joins || joins.length === 0;\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst distinctSql = distinct ? sql` distinct` : undefined;\n\n\t\tconst selection = this.buildSelection(fieldsList, { isSingleTable });\n\n\t\tconst tableSql = this.buildFromTable(table);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst havingSql = having ? sql` having ${having}` : undefined;\n\n\t\tconst groupByList: (SQL | AnyColumn | SQL.Aliased)[] = [];\n\t\tif (groupBy) {\n\t\t\tfor (const [index, groupByValue] of groupBy.entries()) {\n\t\t\t\tgroupByList.push(groupByValue);\n\n\t\t\t\tif (index < groupBy.length - 1) {\n\t\t\t\t\tgroupByList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst groupBySql = groupByList.length > 0 ? sql` group by ${sql.join(groupByList)}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\tconst finalQuery =\n\t\t\tsql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}`;\n\n\t\tif (setOperators.length > 0) {\n\t\t\treturn this.buildSetOperations(finalQuery, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(leftSelect: SQL, setOperators: SQLiteSelectConfig['setOperators']): SQL {\n\t\tconst [setOperator, ...rest] = setOperators;\n\n\t\tif (!setOperator) {\n\t\t\tthrow new Error('Cannot pass undefined values to any set operator');\n\t\t}\n\n\t\tif (rest.length === 0) {\n\t\t\treturn this.buildSetOperationQuery({ leftSelect, setOperator });\n\t\t}\n\n\t\t// Some recursive magic here\n\t\treturn this.buildSetOperations(\n\t\t\tthis.buildSetOperationQuery({ leftSelect, setOperator }),\n\t\t\trest,\n\t\t);\n\t}\n\n\tbuildSetOperationQuery({\n\t\tleftSelect,\n\t\tsetOperator: { type, isAll, rightSelect, limit, orderBy, offset },\n\t}: { leftSelect: SQL; setOperator: SQLiteSelectConfig['setOperators'][number] }): SQL {\n\t\t// SQLite doesn't support parenthesis in set operations\n\t\tconst leftChunk = sql`${leftSelect.getSQL()} `;\n\t\tconst rightChunk = sql`${rightSelect.getSQL()}`;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\tconst orderByValues: (SQL<unknown> | Name)[] = [];\n\n\t\t\t// The next bit is necessary because the sql operator replaces ${table.column} with `table`.`column`\n\t\t\t// which is invalid Sql syntax, Table from one of the SELECTs cannot be used in global ORDER clause\n\t\t\tfor (const singleOrderBy of orderBy) {\n\t\t\t\tif (is(singleOrderBy, SQLiteColumn)) {\n\t\t\t\t\torderByValues.push(sql.identifier(singleOrderBy.name));\n\t\t\t\t} else if (is(singleOrderBy, SQL)) {\n\t\t\t\t\tfor (let i = 0; i < singleOrderBy.queryChunks.length; i++) {\n\t\t\t\t\t\tconst chunk = singleOrderBy.queryChunks[i];\n\n\t\t\t\t\t\tif (is(chunk, SQLiteColumn)) {\n\t\t\t\t\t\t\tsingleOrderBy.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t} else {\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\torderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst operatorChunk = sql.raw(`${type} ${isAll ? 'all ' : ''}`);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\treturn sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;\n\t}\n\n\tbuildInsertQuery(\n\t\t{ table, values: valuesOrSelect, onConflict, returning, withList, select }: SQLiteInsertConfig,\n\t): SQL {\n\t\t// const isSingleValue = values.length === 1;\n\t\tconst valuesSqlList: ((SQLChunk | SQL)[] | SQL)[] = [];\n\t\tconst columns: Record<string, SQLiteColumn> = table[Table.Symbol.Columns];\n\n\t\tconst colEntries: [string, SQLiteColumn][] = Object.entries(columns).filter(([_, col]) =>\n\t\t\t!col.shouldDisableInsert()\n\t\t);\n\t\tconst insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));\n\n\t\tif (select) {\n\t\t\tconst select = valuesOrSelect as AnySQLiteSelectQueryBuilder | SQL;\n\n\t\t\tif (is(select, SQL)) {\n\t\t\t\tvaluesSqlList.push(select);\n\t\t\t} else {\n\t\t\t\tvaluesSqlList.push(select.getSQL());\n\t\t\t}\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, Param | SQL>[];\n\t\t\tvaluesSqlList.push(sql.raw('values '));\n\n\t\t\tfor (const [valueIndex, value] of values.entries()) {\n\t\t\t\tconst valueList: (SQLChunk | SQL)[] = [];\n\t\t\t\tfor (const [fieldName, col] of colEntries) {\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (colValue === undefined || (is(colValue, Param) && colValue.value === undefined)) {\n\t\t\t\t\t\tlet defaultValue;\n\t\t\t\t\t\tif (col.default !== null && col.default !== undefined) {\n\t\t\t\t\t\t\tdefaultValue = is(col.default, SQL) ? col.default : sql.param(col.default, col);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (col.defaultFn !== undefined) {\n\t\t\t\t\t\t\tconst defaultFnResult = col.defaultFn();\n\t\t\t\t\t\t\tdefaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (!col.default && col.onUpdateFn !== undefined) {\n\t\t\t\t\t\t\tconst onUpdateFnResult = col.onUpdateFn();\n\t\t\t\t\t\t\tdefaultValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdefaultValue = sql`null`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalueList.push(defaultValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalueList.push(colValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvaluesSqlList.push(valueList);\n\t\t\t\tif (valueIndex < values.length - 1) {\n\t\t\t\t\tvaluesSqlList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst valuesSql = sql.join(valuesSqlList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst onConflictSql = onConflict?.length\n\t\t\t? sql.join(onConflict)\n\t\t\t: undefined;\n\n\t\t// if (isSingleValue && valuesSqlList.length === 0){\n\t\t// \treturn sql`insert into ${table} default values ${onConflictSql}${returningSql}`;\n\t\t// }\n\n\t\treturn sql`${withSql}insert into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${returningSql}`;\n\t}\n\n\tsqlToQuery(sql: SQL, invokeSource?: 'indexes' | undefined): QueryWithTypings {\n\t\treturn sql.toQuery({\n\t\t\tcasing: this.casing,\n\t\t\tescapeName: this.escapeName,\n\t\t\tescapeParam: this.escapeParam,\n\t\t\tescapeString: this.escapeString,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\n\tbuildRelationalQuery({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: SQLiteTable;\n\t\ttableConfig: TableRelationalConfig;\n\t\tqueryConfig: true | DBQueryConfig<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: Relation;\n\t\tjoinOn?: SQL;\n\t}): BuildRelationalQueryResult<SQLiteTable, SQLiteColumn> {\n\t\tlet selection: BuildRelationalQueryResult<SQLiteTable, SQLiteColumn>['selection'] = [];\n\t\tlet limit, offset, orderBy: SQLiteSelectConfig['orderBy'] = [], where;\n\t\tconst joins: SQLiteSelectJoinConfig[] = [];\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map((\n\t\t\t\t[key, value],\n\t\t\t) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as SQLiteColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: { tsKey: string; value: SQLiteColumn | SQL.Aliased }[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as SQLiteColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | DBQueryConfig<'many', false>;\n\t\t\t\trelation: Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, getOrderByOperators())\n\t\t\t\t: config.orderBy ?? [];\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as SQLiteColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\t// const relationTable = schema[relationTableTsName]!;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this.buildRelationalQuery({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as SQLiteTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, One)\n\t\t\t\t\t\t? (selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 })\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tconst field = (sql`(${builtRelation.sql})`).as(selectedRelationTsKey);\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage:\n\t\t\t\t\t`No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\"). You need to have at least one item in \"columns\", \"with\" or \"extras\". If you need to select all columns, omit the \"columns\" key or set it to undefined.`,\n\t\t\t});\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field }) =>\n\t\t\t\t\t\tis(field, SQLiteColumn)\n\t\t\t\t\t\t\t? sql.identifier(this.casing.getColumnCasing(field))\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, Many)) {\n\t\t\t\tfield = sql`coalesce(json_group_array(${field}), json_array())`;\n\t\t\t}\n\t\t\tconst nestedSelection = [{\n\t\t\t\tdbKey: 'data',\n\t\t\t\ttsKey: 'data',\n\t\t\t\tfield: field.as('data'),\n\t\t\t\tisJson: true,\n\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\tselection,\n\t\t\t}];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\torderBy,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = undefined;\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, SQLiteTable) ? result : new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n}\n\nexport class SQLiteSyncDialect extends SQLiteDialect {\n\tstatic override readonly [entityKind]: string = 'SQLiteSyncDialect';\n\n\tmigrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: SQLiteSession<'sync', unknown, Record<string, unknown>, TablesRelationalConfig>,\n\t\tconfig?: string | MigrationConfig,\n\t): void {\n\t\tconst migrationsTable = config === undefined\n\t\t\t? '__drizzle_migrations'\n\t\t\t: typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric\n\t\t\t)\n\t\t`;\n\t\tsession.run(migrationTableCreate);\n\n\t\tconst dbMigrations = session.values<[number, string, string]>(\n\t\t\tsql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`,\n\t\t);\n\n\t\tconst lastDbMigration = dbMigrations[0] ?? undefined;\n\t\tsession.run(sql`BEGIN`);\n\n\t\ttry {\n\t\t\tfor (const migration of migrations) {\n\t\t\t\tif (!lastDbMigration || Number(lastDbMigration[2])! < migration.folderMillis) {\n\t\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\t\tsession.run(sql.raw(stmt));\n\t\t\t\t\t}\n\t\t\t\t\tsession.run(\n\t\t\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t\t} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsession.run(sql`COMMIT`);\n\t\t} catch (e) {\n\t\t\tsession.run(sql`ROLLBACK`);\n\t\t\tthrow e;\n\t\t}\n\t}\n}\n\nexport class SQLiteAsyncDialect extends SQLiteDialect {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncDialect';\n\n\tasync migrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: SQLiteSession<'async', any, any, any>,\n\t\tconfig?: string | MigrationConfig,\n\t): Promise<void> {\n\t\tconst migrationsTable = config === undefined\n\t\t\t? '__drizzle_migrations'\n\t\t\t: typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric\n\t\t\t)\n\t\t`;\n\t\tawait session.run(migrationTableCreate);\n\n\t\tconst dbMigrations = await session.values<[number, string, string]>(\n\t\t\tsql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`,\n\t\t);\n\n\t\tconst lastDbMigration = dbMigrations[0] ?? undefined;\n\n\t\tawait session.transaction(async (tx) => {\n\t\t\tfor (const migration of migrations) {\n\t\t\t\tif (!lastDbMigration || Number(lastDbMigration[2])! < migration.folderMillis) {\n\t\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\t\tawait tx.run(sql.raw(stmt));\n\t\t\t\t\t}\n\t\t\t\t\tawait tx.run(\n\t\t\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t\t} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport type { SQL, SQLWrapper } from '~/sql/index.ts';\n\nexport abstract class TypedQueryBuilder<TSelection, TResult = unknown> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'TypedQueryBuilder';\n\n\tdeclare _: {\n\t\tselectedFields: TSelection;\n\t\tresult: TResult;\n\t};\n\n\t/** @internal */\n\tgetSelectedFields(): TSelection {\n\t\treturn this._.selectedFields;\n\t}\n\n\tabstract getSQL(): SQL;\n}\n","import { entityKind, is } from '~/entity.ts';\nimport { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type {\n\tBuildSubquerySelection,\n\tGetSelectTableName,\n\tGetSelectTableSelection,\n\tJoinNullability,\n\tJoinType,\n\tSelectMode,\n\tSelectResult,\n\tSetOperator,\n} from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { SQL, View } from '~/sql/sql.ts';\nimport type { ColumnsSelection, Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteColumn } from '~/sqlite-core/columns/index.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { SQLiteSession } from '~/sqlite-core/session.ts';\nimport type { SubqueryWithSelection } from '~/sqlite-core/subquery.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport {\n\tapplyMixins,\n\tgetTableColumns,\n\tgetTableLikeName,\n\thaveSameKeys,\n\torderSelectedFields,\n\ttype ValueOrArray,\n} from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { SQLiteViewBase } from '../view-base.ts';\nimport type {\n\tAnySQLiteSelect,\n\tCreateSQLiteSelectFromBuilderMode,\n\tGetSQLiteSetOperators,\n\tSelectedFields,\n\tSetOperatorRightSelect,\n\tSQLiteCreateSetOperatorFn,\n\tSQLiteSelectConfig,\n\tSQLiteSelectDynamic,\n\tSQLiteSelectExecute,\n\tSQLiteSelectHKT,\n\tSQLiteSelectHKTBase,\n\tSQLiteSelectJoinFn,\n\tSQLiteSelectPrepare,\n\tSQLiteSelectWithout,\n\tSQLiteSetOperatorExcludedMethods,\n\tSQLiteSetOperatorWithResult,\n} from './select.types.ts';\n\nexport class SQLiteSelectBuilder<\n\tTSelection extends SelectedFields | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTBuilderMode extends 'db' | 'qb' = 'db',\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteSelectBuilder';\n\n\tprivate fields: TSelection;\n\tprivate session: SQLiteSession<any, any, any, any> | undefined;\n\tprivate dialect: SQLiteDialect;\n\tprivate withList: Subquery[] | undefined;\n\tprivate distinct: boolean | undefined;\n\n\tconstructor(\n\t\tconfig: {\n\t\t\tfields: TSelection;\n\t\t\tsession: SQLiteSession<any, any, any, any> | undefined;\n\t\t\tdialect: SQLiteDialect;\n\t\t\twithList?: Subquery[];\n\t\t\tdistinct?: boolean;\n\t\t},\n\t) {\n\t\tthis.fields = config.fields;\n\t\tthis.session = config.session;\n\t\tthis.dialect = config.dialect;\n\t\tthis.withList = config.withList;\n\t\tthis.distinct = config.distinct;\n\t}\n\n\tfrom<TFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL>(\n\t\tsource: TFrom,\n\t): CreateSQLiteSelectFromBuilderMode<\n\t\tTBuilderMode,\n\t\tGetSelectTableName<TFrom>,\n\t\tTResultType,\n\t\tTRunResult,\n\t\tTSelection extends undefined ? GetSelectTableSelection<TFrom> : TSelection,\n\t\tTSelection extends undefined ? 'single' : 'partial'\n\t> {\n\t\tconst isPartialSelect = !!this.fields;\n\n\t\tlet fields: SelectedFields;\n\t\tif (this.fields) {\n\t\t\tfields = this.fields;\n\t\t} else if (is(source, Subquery)) {\n\t\t\t// This is required to use the proxy handler to get the correct field values from the subquery\n\t\t\tfields = Object.fromEntries(\n\t\t\t\tObject.keys(source._.selectedFields).map((\n\t\t\t\t\tkey,\n\t\t\t\t) => [key, source[key as unknown as keyof typeof source] as unknown as SelectedFields[string]]),\n\t\t\t);\n\t\t} else if (is(source, SQLiteViewBase)) {\n\t\t\tfields = source[ViewBaseConfig].selectedFields as SelectedFields;\n\t\t} else if (is(source, SQL)) {\n\t\t\tfields = {};\n\t\t} else {\n\t\t\tfields = getTableColumns<SQLiteTable>(source);\n\t\t}\n\n\t\treturn new SQLiteSelectBase({\n\t\t\ttable: source,\n\t\t\tfields,\n\t\t\tisPartialSelect,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\twithList: this.withList,\n\t\t\tdistinct: this.distinct,\n\t\t}) as any;\n\t}\n}\n\nexport abstract class SQLiteSelectQueryBuilderBase<\n\tTHKT extends SQLiteSelectHKTBase,\n\tTTableName extends string | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends TypedQueryBuilder<TSelectedFields, TResult> {\n\tstatic override readonly [entityKind]: string = 'SQLiteSelectQueryBuilder';\n\n\toverride readonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly hkt: THKT;\n\t\treadonly tableName: TTableName;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly selection: TSelection;\n\t\treadonly selectMode: TSelectMode;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t};\n\n\t/** @internal */\n\tconfig: SQLiteSelectConfig;\n\tprotected joinsNotNullableMap: Record<string, boolean>;\n\tprivate tableName: string | undefined;\n\tprivate isPartialSelect: boolean;\n\tprotected session: SQLiteSession<any, any, any, any> | undefined;\n\tprotected dialect: SQLiteDialect;\n\n\tconstructor(\n\t\t{ table, fields, isPartialSelect, session, dialect, withList, distinct }: {\n\t\t\ttable: SQLiteSelectConfig['table'];\n\t\t\tfields: SQLiteSelectConfig['fields'];\n\t\t\tisPartialSelect: boolean;\n\t\t\tsession: SQLiteSession<any, any, any, any> | undefined;\n\t\t\tdialect: SQLiteDialect;\n\t\t\twithList: Subquery[] | undefined;\n\t\t\tdistinct: boolean | undefined;\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis.config = {\n\t\t\twithList,\n\t\t\ttable,\n\t\t\tfields: { ...fields },\n\t\t\tdistinct,\n\t\t\tsetOperators: [],\n\t\t};\n\t\tthis.isPartialSelect = isPartialSelect;\n\t\tthis.session = session;\n\t\tthis.dialect = dialect;\n\t\tthis._ = {\n\t\t\tselectedFields: fields as TSelectedFields,\n\t\t} as this['_'];\n\t\tthis.tableName = getTableLikeName(table);\n\t\tthis.joinsNotNullableMap = typeof this.tableName === 'string' ? { [this.tableName]: true } : {};\n\t}\n\n\tprivate createJoin<TJoinType extends JoinType>(\n\t\tjoinType: TJoinType,\n\t): SQLiteSelectJoinFn<this, TDynamic, TJoinType> {\n\t\treturn (\n\t\t\ttable: SQLiteTable | Subquery | SQLiteViewBase | SQL,\n\t\t\ton: ((aliases: TSelection) => SQL | undefined) | SQL | undefined,\n\t\t) => {\n\t\t\tconst baseTableName = this.tableName;\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins?.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\tif (!this.isPartialSelect) {\n\t\t\t\t// If this is the first join and this is not a partial select and we're not selecting from raw SQL, \"move\" the fields from the main table to the nested object\n\t\t\t\tif (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === 'string') {\n\t\t\t\t\tthis.config.fields = {\n\t\t\t\t\t\t[baseTableName]: this.config.fields,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (typeof tableName === 'string' && !is(table, SQL)) {\n\t\t\t\t\tconst selection = is(table, Subquery)\n\t\t\t\t\t\t? table._.selectedFields\n\t\t\t\t\t\t: is(table, View)\n\t\t\t\t\t\t? table[ViewBaseConfig].selectedFields\n\t\t\t\t\t\t: table[Table.Symbol.Columns];\n\t\t\t\t\tthis.config.fields[tableName] = selection;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.fields,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as TSelection,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (!this.config.joins) {\n\t\t\t\tthis.config.joins = [];\n\t\t\t}\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName });\n\n\t\t\tif (typeof tableName === 'string') {\n\t\t\t\tswitch (joinType) {\n\t\t\t\t\tcase 'left': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'right': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'inner': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'full': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this as any;\n\t\t};\n\t}\n\n\t/**\n\t * Executes a `left join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#left-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet | null }[] = await db.select()\n\t * .from(users)\n\t * .leftJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number | null }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .leftJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tleftJoin = this.createJoin('left');\n\n\t/**\n\t * Executes a `right join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the joined table with the corresponding row from the main table, if a match is found. If no matching row exists, it sets all columns of the main table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#right-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet }[] = await db.select()\n\t * .from(users)\n\t * .rightJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .rightJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\trightJoin = this.createJoin('right');\n\n\t/**\n\t * Executes an `inner join` operation, creating a new table by combining rows from two tables that have matching values.\n\t *\n\t * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet }[] = await db.select()\n\t * .from(users)\n\t * .innerJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .innerJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tinnerJoin = this.createJoin('inner');\n\n\t/**\n\t * Executes a `full join` operation by combining rows from two tables into a new table.\n\t *\n\t * Calling this method retrieves all rows from both main and joined tables, merging rows with matching values and filling in `null` for non-matching columns.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#full-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet | null }[] = await db.select()\n\t * .from(users)\n\t * .fullJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number | null }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .fullJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tfullJoin = this.createJoin('full');\n\n\tprivate createSetOperator(\n\t\ttype: SetOperator,\n\t\tisAll: boolean,\n\t): <TValue extends SQLiteSetOperatorWithResult<TResult>>(\n\t\trightSelection:\n\t\t\t| ((setOperators: GetSQLiteSetOperators) => SetOperatorRightSelect<TValue, TResult>)\n\t\t\t| SetOperatorRightSelect<TValue, TResult>,\n\t) => SQLiteSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tSQLiteSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\treturn (rightSelection) => {\n\t\t\tconst rightSelect = (typeof rightSelection === 'function'\n\t\t\t\t? rightSelection(getSQLiteSetOperators())\n\t\t\t\t: rightSelection) as TypedQueryBuilder<\n\t\t\t\t\tany,\n\t\t\t\t\tTResult\n\t\t\t\t>;\n\n\t\t\tif (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.setOperators.push({ type, isAll, rightSelect });\n\t\t\treturn this as any;\n\t\t};\n\t}\n\n\t/**\n\t * Adds `union` set operator to the query.\n\t *\n\t * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all unique names from customers and users tables\n\t * await db.select({ name: users.name })\n\t * .from(users)\n\t * .union(\n\t * db.select({ name: customers.name }).from(customers)\n\t * );\n\t * // or\n\t * import { union } from 'drizzle-orm/sqlite-core'\n\t *\n\t * await union(\n\t * db.select({ name: users.name }).from(users),\n\t * db.select({ name: customers.name }).from(customers)\n\t * );\n\t * ```\n\t */\n\tunion = this.createSetOperator('union', false);\n\n\t/**\n\t * Adds `union all` set operator to the query.\n\t *\n\t * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all transaction ids from both online and in-store sales\n\t * await db.select({ transaction: onlineSales.transactionId })\n\t * .from(onlineSales)\n\t * .unionAll(\n\t * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t * );\n\t * // or\n\t * import { unionAll } from 'drizzle-orm/sqlite-core'\n\t *\n\t * await unionAll(\n\t * db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n\t * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t * );\n\t * ```\n\t */\n\tunionAll = this.createSetOperator('union', true);\n\n\t/**\n\t * Adds `intersect` set operator to the query.\n\t *\n\t * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select course names that are offered in both departments A and B\n\t * await db.select({ courseName: depA.courseName })\n\t * .from(depA)\n\t * .intersect(\n\t * db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * // or\n\t * import { intersect } from 'drizzle-orm/sqlite-core'\n\t *\n\t * await intersect(\n\t * db.select({ courseName: depA.courseName }).from(depA),\n\t * db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\tintersect = this.createSetOperator('intersect', false);\n\n\t/**\n\t * Adds `except` set operator to the query.\n\t *\n\t * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all courses offered in department A but not in department B\n\t * await db.select({ courseName: depA.courseName })\n\t * .from(depA)\n\t * .except(\n\t * db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * // or\n\t * import { except } from 'drizzle-orm/sqlite-core'\n\t *\n\t * await except(\n\t * db.select({ courseName: depA.courseName }).from(depA),\n\t * db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\texcept = this.createSetOperator('except', false);\n\n\t/** @internal */\n\taddSetOperators(setOperators: SQLiteSelectConfig['setOperators']): SQLiteSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tSQLiteSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\tthis.config.setOperators.push(...setOperators);\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#filtering}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be selected.\n\t *\n\t * ```ts\n\t * // Select all cars with green color\n\t * await db.select().from(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * await db.select().from(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Select all BMW cars with a green color\n\t * await db.select().from(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Select all cars with the green or blue color\n\t * await db.select().from(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(\n\t\twhere: ((aliases: TSelection) => SQL | undefined) | SQL | undefined,\n\t): SQLiteSelectWithout<this, TDynamic, 'where'> {\n\t\tif (typeof where === 'function') {\n\t\t\twhere = where(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `having` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition. It is typically used with aggregate functions to filter the aggregated data based on a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @param having the `having` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all brands with more than one car\n\t * await db.select({\n\t * \tbrand: cars.brand,\n\t * \tcount: sql<number>`cast(count(${cars.id}) as int)`,\n\t * })\n\t * .from(cars)\n\t * .groupBy(cars.brand)\n\t * .having(({ count }) => gt(count, 1));\n\t * ```\n\t */\n\thaving(\n\t\thaving: ((aliases: this['_']['selection']) => SQL | undefined) | SQL | undefined,\n\t): SQLiteSelectWithout<this, TDynamic, 'having'> {\n\t\tif (typeof having === 'function') {\n\t\t\thaving = having(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.having = having;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `group by` clause to the query.\n\t *\n\t * Calling this method will group rows that have the same values into summary rows, often used for aggregation purposes.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Group and count people by their last names\n\t * await db.select({\n\t * lastName: people.lastName,\n\t * count: sql<number>`cast(count(*) as int)`\n\t * })\n\t * .from(people)\n\t * .groupBy(people.lastName);\n\t * ```\n\t */\n\tgroupBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(...columns: (SQLiteColumn | SQL)[]): SQLiteSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteSelectWithout<this, TDynamic, 'groupBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst groupBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t\tthis.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];\n\t\t} else {\n\t\t\tthis.config.groupBy = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `order by` clause to the query.\n\t *\n\t * Calling this method will sort the result-set in ascending or descending order. By default, the sort order is ascending.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#order-by}\n\t *\n\t * @example\n\t *\n\t * ```\n\t * // Select cars ordered by year\n\t * await db.select().from(cars).orderBy(cars.year);\n\t * ```\n\t *\n\t * You can specify whether results are in ascending or descending order with the `asc()` and `desc()` operators.\n\t *\n\t * ```ts\n\t * // Select cars ordered by year in descending order\n\t * await db.select().from(cars).orderBy(desc(cars.year));\n\t *\n\t * // Select cars ordered by year and price\n\t * await db.select().from(cars).orderBy(asc(cars.year), desc(cars.price));\n\t * ```\n\t */\n\torderBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (SQLiteColumn | SQL)[]): SQLiteSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteSelectWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t} else {\n\t\t\tconst orderByArray = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `limit` clause to the query.\n\t *\n\t * Calling this method will set the maximum number of rows that will be returned by this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param limit the `limit` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the first 10 people from this query.\n\t * await db.select().from(people).limit(10);\n\t * ```\n\t */\n\tlimit(limit: number | Placeholder): SQLiteSelectWithout<this, TDynamic, 'limit'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.limit = limit;\n\t\t} else {\n\t\t\tthis.config.limit = limit;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `offset` clause to the query.\n\t *\n\t * Calling this method will skip a number of rows when returning results from this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param offset the `offset` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the 10th-20th people from this query.\n\t * await db.select().from(people).offset(10).limit(10);\n\t * ```\n\t */\n\toffset(offset: number | Placeholder): SQLiteSelectWithout<this, TDynamic, 'offset'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.offset = offset;\n\t\t} else {\n\t\t\tthis.config.offset = offset;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildSelectQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\tas<TAlias extends string>(\n\t\talias: TAlias,\n\t): SubqueryWithSelection<this['_']['selectedFields'], TAlias> {\n\t\treturn new Proxy(\n\t\t\tnew Subquery(this.getSQL(), this.config.fields, alias),\n\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as SubqueryWithSelection<this['_']['selectedFields'], TAlias>;\n\t}\n\n\t/** @internal */\n\toverride getSelectedFields(): this['_']['selectedFields'] {\n\t\treturn new Proxy(\n\t\t\tthis.config.fields,\n\t\t\tnew SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as this['_']['selectedFields'];\n\t}\n\n\t$dynamic(): SQLiteSelectDynamic<this> {\n\t\treturn this;\n\t}\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface SQLiteSelectBase<\n\tTTableName extends string | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode = 'single',\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends\n\tSQLiteSelectQueryBuilderBase<\n\t\tSQLiteSelectHKT,\n\t\tTTableName,\n\t\tTResultType,\n\t\tTRunResult,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\tQueryPromise<TResult>\n{}\n\nexport class SQLiteSelectBase<\n\tTTableName extends string | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTSelection,\n\tTSelectMode extends SelectMode = 'single',\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends SQLiteSelectQueryBuilderBase<\n\tSQLiteSelectHKT,\n\tTTableName,\n\tTResultType,\n\tTRunResult,\n\tTSelection,\n\tTSelectMode,\n\tTNullabilityMap,\n\tTDynamic,\n\tTExcludedMethods,\n\tTResult,\n\tTSelectedFields\n> implements RunnableQuery<TResult, 'sqlite'>, SQLWrapper {\n\tstatic override readonly [entityKind]: string = 'SQLiteSelect';\n\n\t/** @internal */\n\t_prepare(isOneTimeQuery = true): SQLiteSelectPrepare<this> {\n\t\tif (!this.session) {\n\t\t\tthrow new Error('Cannot execute a query on a query builder. Please use a database instance instead.');\n\t\t}\n\t\tconst fieldsList = orderSelectedFields<SQLiteColumn>(this.config.fields);\n\t\tconst query = this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tfieldsList,\n\t\t\t'all',\n\t\t\ttrue,\n\t\t);\n\t\tquery.joinsNotNullableMap = this.joinsNotNullableMap;\n\t\treturn query as ReturnType<this['prepare']>;\n\t}\n\n\tprepare(): SQLiteSelectPrepare<this> {\n\t\treturn this._prepare(false);\n\t}\n\n\trun: ReturnType<this['prepare']>['run'] = (placeholderValues) => {\n\t\treturn this._prepare().run(placeholderValues);\n\t};\n\n\tall: ReturnType<this['prepare']>['all'] = (placeholderValues) => {\n\t\treturn this._prepare().all(placeholderValues);\n\t};\n\n\tget: ReturnType<this['prepare']>['get'] = (placeholderValues) => {\n\t\treturn this._prepare().get(placeholderValues);\n\t};\n\n\tvalues: ReturnType<this['prepare']>['values'] = (placeholderValues) => {\n\t\treturn this._prepare().values(placeholderValues);\n\t};\n\n\tasync execute(): Promise<SQLiteSelectExecute<this>> {\n\t\treturn this.all() as SQLiteSelectExecute<this>;\n\t}\n}\n\napplyMixins(SQLiteSelectBase, [QueryPromise]);\n\nfunction createSetOperator(type: SetOperator, isAll: boolean): SQLiteCreateSetOperatorFn {\n\treturn (leftSelect, rightSelect, ...restSelects) => {\n\t\tconst setOperators = [rightSelect, ...restSelects].map((select) => ({\n\t\t\ttype,\n\t\t\tisAll,\n\t\t\trightSelect: select as AnySQLiteSelect,\n\t\t}));\n\n\t\tfor (const setOperator of setOperators) {\n\t\t\tif (!haveSameKeys((leftSelect as any).getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn (leftSelect as AnySQLiteSelect).addSetOperators(setOperators) as any;\n\t};\n}\n\nconst getSQLiteSetOperators = () => ({\n\tunion,\n\tunionAll,\n\tintersect,\n\texcept,\n});\n\n/**\n * Adds `union` set operator to the query.\n *\n * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n *\n * @example\n *\n * ```ts\n * // Select all unique names from customers and users tables\n * import { union } from 'drizzle-orm/sqlite-core'\n *\n * await union(\n * db.select({ name: users.name }).from(users),\n * db.select({ name: customers.name }).from(customers)\n * );\n * // or\n * await db.select({ name: users.name })\n * .from(users)\n * .union(\n * db.select({ name: customers.name }).from(customers)\n * );\n * ```\n */\nexport const union = createSetOperator('union', false);\n\n/**\n * Adds `union all` set operator to the query.\n *\n * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n *\n * @example\n *\n * ```ts\n * // Select all transaction ids from both online and in-store sales\n * import { unionAll } from 'drizzle-orm/sqlite-core'\n *\n * await unionAll(\n * db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n * );\n * // or\n * await db.select({ transaction: onlineSales.transactionId })\n * .from(onlineSales)\n * .unionAll(\n * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n * );\n * ```\n */\nexport const unionAll = createSetOperator('union', true);\n\n/**\n * Adds `intersect` set operator to the query.\n *\n * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n *\n * @example\n *\n * ```ts\n * // Select course names that are offered in both departments A and B\n * import { intersect } from 'drizzle-orm/sqlite-core'\n *\n * await intersect(\n * db.select({ courseName: depA.courseName }).from(depA),\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n * .from(depA)\n * .intersect(\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * ```\n */\nexport const intersect = createSetOperator('intersect', false);\n\n/**\n * Adds `except` set operator to the query.\n *\n * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n *\n * @example\n *\n * ```ts\n * // Select all courses offered in department A but not in department B\n * import { except } from 'drizzle-orm/sqlite-core'\n *\n * await except(\n * db.select({ courseName: depA.courseName }).from(depA),\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n * .from(depA)\n * .except(\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * ```\n */\nexport const except = createSetOperator('except', false);\n","import { entityKind, is } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, SQL } from '~/sql/sql.ts';\nimport type { SQLiteDialectConfig } from '~/sqlite-core/dialect.ts';\nimport { SQLiteDialect, SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport type { WithBuilder } from '~/sqlite-core/subquery.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport { SQLiteSelectBuilder } from './select.ts';\nimport type { SelectedFields } from './select.types.ts';\n\nexport class QueryBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteQueryBuilder';\n\n\tprivate dialect: SQLiteDialect | undefined;\n\tprivate dialectConfig: SQLiteDialectConfig | undefined;\n\n\tconstructor(dialect?: SQLiteDialect | SQLiteDialectConfig) {\n\t\tthis.dialect = is(dialect, SQLiteDialect) ? dialect : undefined;\n\t\tthis.dialectConfig = is(dialect, SQLiteDialect) ? undefined : dialect;\n\t}\n\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst queryBuilder = this;\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(queryBuilder);\n\t\t\t}\n\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tqb.getSQL(),\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t) as any;\n\t\t};\n\t\treturn { as };\n\t};\n\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\tfunction select(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection | undefined, 'sync', void, 'qb'> {\n\t\t\treturn new SQLiteSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\tfunction selectDistinct(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection | undefined, 'sync', void, 'qb'> {\n\t\t\treturn new SQLiteSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\treturn { select, selectDistinct };\n\t}\n\n\tselect(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields?: TSelection,\n\t): SQLiteSelectBuilder<TSelection | undefined, 'sync', void, 'qb'> {\n\t\treturn new SQLiteSelectBuilder({ fields: fields ?? undefined, session: undefined, dialect: this.getDialect() });\n\t}\n\n\tselectDistinct(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields?: TSelection,\n\t): SQLiteSelectBuilder<TSelection | undefined, 'sync', void, 'qb'> {\n\t\treturn new SQLiteSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: undefined,\n\t\t\tdialect: this.getDialect(),\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\t// Lazy load dialect to avoid circular dependency\n\tprivate getDialect() {\n\t\tif (!this.dialect) {\n\t\t\tthis.dialect = new SQLiteSyncDialect(this.dialectConfig);\n\t\t}\n\n\t\treturn this.dialect;\n\t}\n}\n","import { entityKind, is } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport { Param, SQL, sql } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { IndexColumn } from '~/sqlite-core/indexes.ts';\nimport type { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { Columns, Table } from '~/table.ts';\nimport { type DrizzleTypeError, haveSameKeys, mapUpdateSet, orderSelectedFields, type Simplify } from '~/utils.ts';\nimport type { AnySQLiteColumn, SQLiteColumn } from '../columns/common.ts';\nimport { QueryBuilder } from './query-builder.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts';\nimport type { SQLiteUpdateSetSource } from './update.ts';\n\nexport interface SQLiteInsertConfig<TTable extends SQLiteTable = SQLiteTable> {\n\ttable: TTable;\n\tvalues: Record<string, Param | SQL>[] | SQLiteInsertSelectQueryBuilder<TTable> | SQL;\n\twithList?: Subquery[];\n\tonConflict?: SQL[];\n\treturning?: SelectedFieldsOrdered;\n\tselect?: boolean;\n}\n\nexport type SQLiteInsertValue<TTable extends SQLiteTable> = Simplify<\n\t{\n\t\t[Key in keyof TTable['$inferInsert']]: TTable['$inferInsert'][Key] | SQL | Placeholder;\n\t}\n>;\n\nexport type SQLiteInsertSelectQueryBuilder<TTable extends SQLiteTable> = TypedQueryBuilder<\n\t{ [K in keyof TTable['$inferInsert']]: AnySQLiteColumn | SQL | SQL.Aliased | TTable['$inferInsert'][K] }\n>;\n\nexport class SQLiteInsertBuilder<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteInsertBuilder';\n\n\tconstructor(\n\t\tprotected table: TTable,\n\t\tprotected session: SQLiteSession<any, any, any, any>,\n\t\tprotected dialect: SQLiteDialect,\n\t\tprivate withList?: Subquery[],\n\t) {}\n\n\tvalues(value: SQLiteInsertValue<TTable>): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tvalues(values: SQLiteInsertValue<TTable>[]): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tvalues(\n\t\tvalues: SQLiteInsertValue<TTable> | SQLiteInsertValue<TTable>[],\n\t): SQLiteInsertBase<TTable, TResultType, TRunResult> {\n\t\tvalues = Array.isArray(values) ? values : [values];\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('values() must be called with at least one value');\n\t\t}\n\t\tconst mappedValues = values.map((entry) => {\n\t\t\tconst result: Record<string, Param | SQL> = {};\n\t\t\tconst cols = this.table[Table.Symbol.Columns];\n\t\t\tfor (const colKey of Object.keys(entry)) {\n\t\t\t\tconst colValue = entry[colKey as keyof typeof entry];\n\t\t\t\tresult[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);\n\t\t\t}\n\t\t\treturn result;\n\t\t});\n\n\t\t// if (mappedValues.length > 1 && mappedValues.some((t) => Object.keys(t).length === 0)) {\n\t\t// \tthrow new Error(\n\t\t// \t\t`One of the values you want to insert is empty. In SQLite you can insert only one empty object per statement. For this case Drizzle with use \"INSERT INTO ... DEFAULT VALUES\" syntax`,\n\t\t// \t);\n\t\t// }\n\n\t\treturn new SQLiteInsertBase(this.table, mappedValues, this.session, this.dialect, this.withList);\n\t}\n\n\tselect(\n\t\tselectQuery: (qb: QueryBuilder) => SQLiteInsertSelectQueryBuilder<TTable>,\n\t): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tselect(selectQuery: (qb: QueryBuilder) => SQL): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tselect(selectQuery: SQL): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tselect(selectQuery: SQLiteInsertSelectQueryBuilder<TTable>): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tselect(\n\t\tselectQuery:\n\t\t\t| SQL\n\t\t\t| SQLiteInsertSelectQueryBuilder<TTable>\n\t\t\t| ((qb: QueryBuilder) => SQLiteInsertSelectQueryBuilder<TTable> | SQL),\n\t): SQLiteInsertBase<TTable, TResultType, TRunResult> {\n\t\tconst select = typeof selectQuery === 'function' ? selectQuery(new QueryBuilder()) : selectQuery;\n\n\t\tif (\n\t\t\t!is(select, SQL)\n\t\t\t&& !haveSameKeys(this.table[Columns], select._.selectedFields)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t'Insert select error: selected fields are not the same or are in a different order compared to the table definition',\n\t\t\t);\n\t\t}\n\n\t\treturn new SQLiteInsertBase(this.table, select, this.session, this.dialect, this.withList, true);\n\t}\n}\n\nexport type SQLiteInsertWithout<T extends AnySQLiteInsert, TDynamic extends boolean, K extends keyof T & string> =\n\tTDynamic extends true ? T\n\t\t: Omit<\n\t\t\tSQLiteInsertBase<\n\t\t\t\tT['_']['table'],\n\t\t\t\tT['_']['resultType'],\n\t\t\t\tT['_']['runResult'],\n\t\t\t\tT['_']['returning'],\n\t\t\t\tTDynamic,\n\t\t\t\tT['_']['excludedMethods'] | K\n\t\t\t>,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>;\n\nexport type SQLiteInsertReturning<\n\tT extends AnySQLiteInsert,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFieldsFlat,\n> = SQLiteInsertWithout<\n\tSQLiteInsertBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tSelectResultFields<TSelectedFields>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteInsertReturningAll<\n\tT extends AnySQLiteInsert,\n\tTDynamic extends boolean,\n> = SQLiteInsertWithout<\n\tSQLiteInsertBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteInsertOnConflictDoUpdateConfig<T extends AnySQLiteInsert> = {\n\ttarget: IndexColumn | IndexColumn[];\n\t/** @deprecated - use either `targetWhere` or `setWhere` */\n\twhere?: SQL;\n\t// TODO: add tests for targetWhere and setWhere\n\ttargetWhere?: SQL;\n\tsetWhere?: SQL;\n\tset: SQLiteUpdateSetSource<T['_']['table']>;\n};\n\nexport type SQLiteInsertDynamic<T extends AnySQLiteInsert> = SQLiteInsert<\n\tT['_']['table'],\n\tT['_']['resultType'],\n\tT['_']['runResult'],\n\tT['_']['returning']\n>;\n\nexport type SQLiteInsertExecute<T extends AnySQLiteInsert> = T['_']['returning'] extends undefined ? T['_']['runResult']\n\t: T['_']['returning'][];\n\nexport type SQLiteInsertPrepare<T extends AnySQLiteInsert> = SQLitePreparedQuery<\n\t{\n\t\ttype: T['_']['resultType'];\n\t\trun: T['_']['runResult'];\n\t\tall: T['_']['returning'] extends undefined ? DrizzleTypeError<'.all() cannot be used without .returning()'>\n\t\t\t: T['_']['returning'][];\n\t\tget: T['_']['returning'] extends undefined ? DrizzleTypeError<'.get() cannot be used without .returning()'>\n\t\t\t: T['_']['returning'];\n\t\tvalues: T['_']['returning'] extends undefined ? DrizzleTypeError<'.values() cannot be used without .returning()'>\n\t\t\t: any[][];\n\t\texecute: SQLiteInsertExecute<T>;\n\t}\n>;\n\nexport type AnySQLiteInsert = SQLiteInsertBase<any, any, any, any, any, any>;\n\nexport type SQLiteInsert<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTReturning = any,\n> = SQLiteInsertBase<TTable, TResultType, TRunResult, TReturning, true, never>;\n\nexport interface SQLiteInsertBase<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tSQLWrapper,\n\tQueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>\n{\n\treadonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly table: TTable;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? TRunResult : TReturning[];\n\t};\n}\n\nexport class SQLiteInsertBase<\n\tTTable extends SQLiteTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>\n\timplements RunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteInsert';\n\n\t/** @internal */\n\tconfig: SQLiteInsertConfig<TTable>;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tvalues: SQLiteInsertConfig['values'],\n\t\tprivate session: SQLiteSession<any, any, any, any>,\n\t\tprivate dialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t\tselect?: boolean,\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, values: values as any, withList, select };\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the inserted rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#insert-returning}\n\t *\n\t * @example\n\t * ```ts\n\t * // Insert one row and return all fields\n\t * const insertedCar: Car[] = await db.insert(cars)\n\t * .values({ brand: 'BMW' })\n\t * .returning();\n\t *\n\t * // Insert one row and return only the id\n\t * const insertedCarId: { id: number }[] = await db.insert(cars)\n\t * .values({ brand: 'BMW' })\n\t * .returning({ id: cars.id });\n\t * ```\n\t */\n\treturning(): SQLiteInsertReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFieldsFlat>(\n\t\tfields: TSelectedFields,\n\t): SQLiteInsertReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields: SelectedFieldsFlat = this.config.table[SQLiteTable.Symbol.Columns],\n\t): SQLiteInsertWithout<AnySQLiteInsert, TDynamic, 'returning'> {\n\t\tthis.config.returning = orderSelectedFields<SQLiteColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `on conflict do nothing` clause to the query.\n\t *\n\t * Calling this method simply avoids inserting a row as its alternative action.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#on-conflict-do-nothing}\n\t *\n\t * @param config The `target` and `where` clauses.\n\t *\n\t * @example\n\t * ```ts\n\t * // Insert one row and cancel the insert if there's a conflict\n\t * await db.insert(cars)\n\t * .values({ id: 1, brand: 'BMW' })\n\t * .onConflictDoNothing();\n\t *\n\t * // Explicitly specify conflict target\n\t * await db.insert(cars)\n\t * .values({ id: 1, brand: 'BMW' })\n\t * .onConflictDoNothing({ target: cars.id });\n\t * ```\n\t */\n\tonConflictDoNothing(config: { target?: IndexColumn | IndexColumn[]; where?: SQL } = {}): this {\n\t\tif (!this.config.onConflict) this.config.onConflict = [];\n\n\t\tif (config.target === undefined) {\n\t\t\tthis.config.onConflict.push(sql` on conflict do nothing`);\n\t\t} else {\n\t\t\tconst targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;\n\t\t\tconst whereSql = config.where ? sql` where ${config.where}` : sql``;\n\t\t\tthis.config.onConflict.push(sql` on conflict ${targetSql} do nothing${whereSql}`);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds an `on conflict do update` clause to the query.\n\t *\n\t * Calling this method will update the existing row that conflicts with the row proposed for insertion as its alternative action.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#upserts-and-conflicts}\n\t *\n\t * @param config The `target`, `set` and `where` clauses.\n\t *\n\t * @example\n\t * ```ts\n\t * // Update the row if there's a conflict\n\t * await db.insert(cars)\n\t * .values({ id: 1, brand: 'BMW' })\n\t * .onConflictDoUpdate({\n\t * target: cars.id,\n\t * set: { brand: 'Porsche' }\n\t * });\n\t *\n\t * // Upsert with 'where' clause\n\t * await db.insert(cars)\n\t * .values({ id: 1, brand: 'BMW' })\n\t * .onConflictDoUpdate({\n\t * target: cars.id,\n\t * set: { brand: 'newBMW' },\n\t * where: sql`${cars.createdAt} > '2023-01-01'::date`,\n\t * });\n\t * ```\n\t */\n\tonConflictDoUpdate(config: SQLiteInsertOnConflictDoUpdateConfig<this>): this {\n\t\tif (config.where && (config.targetWhere || config.setWhere)) {\n\t\t\tthrow new Error(\n\t\t\t\t'You cannot use both \"where\" and \"targetWhere\"/\"setWhere\" at the same time - \"where\" is deprecated, use \"targetWhere\" or \"setWhere\" instead.',\n\t\t\t);\n\t\t}\n\n\t\tif (!this.config.onConflict) this.config.onConflict = [];\n\n\t\tconst whereSql = config.where ? sql` where ${config.where}` : undefined;\n\t\tconst targetWhereSql = config.targetWhere ? sql` where ${config.targetWhere}` : undefined;\n\t\tconst setWhereSql = config.setWhere ? sql` where ${config.setWhere}` : undefined;\n\t\tconst targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;\n\t\tconst setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));\n\t\tthis.config.onConflict.push(\n\t\t\tsql` on conflict ${targetSql}${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`,\n\t\t);\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildInsertQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(isOneTimeQuery = true): SQLiteInsertPrepare<this> {\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tthis.config.returning,\n\t\t\tthis.config.returning ? 'all' : 'run',\n\t\t\ttrue,\n\t\t) as SQLiteInsertPrepare<this>;\n\t}\n\n\tprepare(): SQLiteInsertPrepare<this> {\n\t\treturn this._prepare(false);\n\t}\n\n\trun: ReturnType<this['prepare']>['run'] = (placeholderValues) => {\n\t\treturn this._prepare().run(placeholderValues);\n\t};\n\n\tall: ReturnType<this['prepare']>['all'] = (placeholderValues) => {\n\t\treturn this._prepare().all(placeholderValues);\n\t};\n\n\tget: ReturnType<this['prepare']>['get'] = (placeholderValues) => {\n\t\treturn this._prepare().get(placeholderValues);\n\t};\n\n\tvalues: ReturnType<this['prepare']>['values'] = (placeholderValues) => {\n\t\treturn this._prepare().values(placeholderValues);\n\t};\n\n\toverride async execute(): Promise<SQLiteInsertExecute<this>> {\n\t\treturn (this.config.returning ? this.all() : this.run()) as SQLiteInsertExecute<this>;\n\t}\n\n\t$dynamic(): SQLiteInsertDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n","import type { GetColumnData } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { JoinType, SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { Placeholder, Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport {\n\ttype DrizzleTypeError,\n\tgetTableLikeName,\n\tmapUpdateSet,\n\torderSelectedFields,\n\ttype UpdateSet,\n\ttype ValueOrArray,\n} from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { SQLiteColumn } from '../columns/common.ts';\nimport { SQLiteViewBase } from '../view-base.ts';\nimport type { SelectedFields, SelectedFieldsOrdered, SQLiteSelectJoinConfig } from './select.types.ts';\n\nexport interface SQLiteUpdateConfig {\n\twhere?: SQL | undefined;\n\tlimit?: number | Placeholder;\n\torderBy?: (SQLiteColumn | SQL | SQL.Aliased)[];\n\tset: UpdateSet;\n\ttable: SQLiteTable;\n\tfrom?: SQLiteTable | Subquery | SQLiteViewBase | SQL;\n\tjoins: SQLiteSelectJoinConfig[];\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type SQLiteUpdateSetSource<TTable extends SQLiteTable> =\n\t& {\n\t\t[Key in keyof TTable['$inferInsert']]?:\n\t\t\t| GetColumnData<TTable['_']['columns'][Key], 'query'>\n\t\t\t| SQL\n\t\t\t| SQLiteColumn\n\t\t\t| undefined;\n\t}\n\t& {};\n\nexport class SQLiteUpdateBuilder<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteUpdateBuilder';\n\n\tdeclare readonly _: {\n\t\treadonly table: TTable;\n\t};\n\n\tconstructor(\n\t\tprotected table: TTable,\n\t\tprotected session: SQLiteSession<any, any, any, any>,\n\t\tprotected dialect: SQLiteDialect,\n\t\tprivate withList?: Subquery[],\n\t) {}\n\n\tset(\n\t\tvalues: SQLiteUpdateSetSource<TTable>,\n\t): SQLiteUpdateWithout<\n\t\tSQLiteUpdateBase<TTable, TResultType, TRunResult>,\n\t\tfalse,\n\t\t'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'\n\t> {\n\t\treturn new SQLiteUpdateBase(\n\t\t\tthis.table,\n\t\t\tmapUpdateSet(this.table, values),\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tthis.withList,\n\t\t) as any;\n\t}\n}\n\nexport type SQLiteUpdateWithout<\n\tT extends AnySQLiteUpdate,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T : Omit<\n\tSQLiteUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['from'],\n\t\tT['_']['returning'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods'] | K\n\t>,\n\tT['_']['excludedMethods'] | K\n>;\n\nexport type SQLiteUpdateWithJoins<\n\tT extends AnySQLiteUpdate,\n\tTDynamic extends boolean,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL,\n> = TDynamic extends true ? T : Omit<\n\tSQLiteUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tTFrom,\n\t\tT['_']['returning'],\n\t\tTDynamic,\n\t\tExclude<T['_']['excludedMethods'] | 'from', 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'>\n\t>,\n\tExclude<T['_']['excludedMethods'] | 'from', 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'>\n>;\n\nexport type SQLiteUpdateReturningAll<T extends AnySQLiteUpdate, TDynamic extends boolean> = SQLiteUpdateWithout<\n\tSQLiteUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['from'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteUpdateReturning<\n\tT extends AnySQLiteUpdate,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFields,\n> = SQLiteUpdateWithout<\n\tSQLiteUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['from'],\n\t\tSelectResultFields<TSelectedFields>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteUpdateExecute<T extends AnySQLiteUpdate> = T['_']['returning'] extends undefined ? T['_']['runResult']\n\t: T['_']['returning'][];\n\nexport type SQLiteUpdatePrepare<T extends AnySQLiteUpdate> = SQLitePreparedQuery<\n\t{\n\t\ttype: T['_']['resultType'];\n\t\trun: T['_']['runResult'];\n\t\tall: T['_']['returning'] extends undefined ? DrizzleTypeError<'.all() cannot be used without .returning()'>\n\t\t\t: T['_']['returning'][];\n\t\tget: T['_']['returning'] extends undefined ? DrizzleTypeError<'.get() cannot be used without .returning()'>\n\t\t\t: T['_']['returning'];\n\t\tvalues: T['_']['returning'] extends undefined ? DrizzleTypeError<'.values() cannot be used without .returning()'>\n\t\t\t: any[][];\n\t\texecute: SQLiteUpdateExecute<T>;\n\t}\n>;\n\nexport type SQLiteUpdateJoinFn<\n\tT extends AnySQLiteUpdate,\n> = <\n\tTJoinedTable extends SQLiteTable | Subquery | SQLiteViewBase | SQL,\n>(\n\ttable: TJoinedTable,\n\ton:\n\t\t| (\n\t\t\t(\n\t\t\t\tupdateTable: T['_']['table']['_']['columns'],\n\t\t\t\tfrom: T['_']['from'] extends SQLiteTable ? T['_']['from']['_']['columns']\n\t\t\t\t\t: T['_']['from'] extends Subquery | SQLiteViewBase ? T['_']['from']['_']['selectedFields']\n\t\t\t\t\t: never,\n\t\t\t) => SQL | undefined\n\t\t)\n\t\t| SQL\n\t\t| undefined,\n) => T;\n\nexport type SQLiteUpdateDynamic<T extends AnySQLiteUpdate> = SQLiteUpdate<\n\tT['_']['table'],\n\tT['_']['resultType'],\n\tT['_']['runResult'],\n\tT['_']['returning']\n>;\n\nexport type SQLiteUpdate<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = any,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n> = SQLiteUpdateBase<TTable, TResultType, TRunResult, TFrom, TReturning, true, never>;\n\nexport type AnySQLiteUpdate = SQLiteUpdateBase<any, any, any, any, any, any, any>;\n\nexport interface SQLiteUpdateBase<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends SQLWrapper, QueryPromise<TReturning extends undefined ? TRunResult : TReturning[]> {\n\treadonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly table: TTable;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly from: TFrom;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? TRunResult : TReturning[];\n\t};\n}\n\nexport class SQLiteUpdateBase<\n\tTTable extends SQLiteTable = SQLiteTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>\n\timplements RunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteUpdate';\n\n\t/** @internal */\n\tconfig: SQLiteUpdateConfig;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tset: UpdateSet,\n\t\tprivate session: SQLiteSession<any, any, any, any>,\n\t\tprivate dialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { set, table, withList, joins: [] };\n\t}\n\n\tfrom<TFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL>(\n\t\tsource: TFrom,\n\t): SQLiteUpdateWithJoins<this, TDynamic, TFrom> {\n\t\tthis.config.from = source;\n\t\treturn this as any;\n\t}\n\n\tprivate createJoin<TJoinType extends JoinType>(\n\t\tjoinType: TJoinType,\n\t): SQLiteUpdateJoinFn<this> {\n\t\treturn ((\n\t\t\ttable: SQLiteTable | Subquery | SQLiteViewBase | SQL,\n\t\t\ton: ((updateTable: TTable, from: TFrom) => SQL | undefined) | SQL | undefined,\n\t\t) => {\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\tconst from = this.config.from\n\t\t\t\t\t? is(table, SQLiteTable)\n\t\t\t\t\t\t? table[Table.Symbol.Columns]\n\t\t\t\t\t\t: is(table, Subquery)\n\t\t\t\t\t\t? table._.selectedFields\n\t\t\t\t\t\t: is(table, SQLiteViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].selectedFields\n\t\t\t\t\t\t: undefined\n\t\t\t\t\t: undefined;\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as any,\n\t\t\t\t\tfrom && new Proxy(\n\t\t\t\t\t\tfrom,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as any,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName });\n\n\t\t\treturn this as any;\n\t\t}) as any;\n\t}\n\n\tleftJoin = this.createJoin('left');\n\n\trightJoin = this.createJoin('right');\n\n\tinnerJoin = this.createJoin('inner');\n\n\tfullJoin = this.createJoin('full');\n\n\t/**\n\t * Adds a 'where' clause to the query.\n\t *\n\t * Calling this method will update only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param where the 'where' clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be updated.\n\t *\n\t * ```ts\n\t * // Update all cars with green color\n\t * db.update(cars).set({ color: 'red' })\n\t * .where(eq(cars.color, 'green'));\n\t * // or\n\t * db.update(cars).set({ color: 'red' })\n\t * .where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Update all BMW cars with a green color\n\t * db.update(cars).set({ color: 'red' })\n\t * .where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Update all cars with the green or blue color\n\t * db.update(cars).set({ color: 'red' })\n\t * .where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): SQLiteUpdateWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\torderBy(\n\t\tbuilder: (updateTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteUpdateWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (SQLiteColumn | SQL | SQL.Aliased)[]): SQLiteUpdateWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(updateTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteUpdateWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as any,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t} else {\n\t\t\tconst orderByArray = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\tlimit(limit: number | Placeholder): SQLiteUpdateWithout<this, TDynamic, 'limit'> {\n\t\tthis.config.limit = limit;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the updated rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update#update-with-returning}\n\t *\n\t * @example\n\t * ```ts\n\t * // Update all cars with the green color and return all fields\n\t * const updatedCars: Car[] = await db.update(cars)\n\t * .set({ color: 'red' })\n\t * .where(eq(cars.color, 'green'))\n\t * .returning();\n\t *\n\t * // Update all cars with the green color and return only their id and brand fields\n\t * const updatedCarsIdsAndBrands: { id: number, brand: string }[] = await db.update(cars)\n\t * .set({ color: 'red' })\n\t * .where(eq(cars.color, 'green'))\n\t * .returning({ id: cars.id, brand: cars.brand });\n\t * ```\n\t */\n\treturning(): SQLiteUpdateReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFields>(\n\t\tfields: TSelectedFields,\n\t): SQLiteUpdateReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields: SelectedFields = this.config.table[SQLiteTable.Symbol.Columns],\n\t): SQLiteUpdateWithout<AnySQLiteUpdate, TDynamic, 'returning'> {\n\t\tthis.config.returning = orderSelectedFields<SQLiteColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildUpdateQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(isOneTimeQuery = true): SQLiteUpdatePrepare<this> {\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tthis.config.returning,\n\t\t\tthis.config.returning ? 'all' : 'run',\n\t\t\ttrue,\n\t\t) as SQLiteUpdatePrepare<this>;\n\t}\n\n\tprepare(): SQLiteUpdatePrepare<this> {\n\t\treturn this._prepare(false);\n\t}\n\n\trun: ReturnType<this['prepare']>['run'] = (placeholderValues) => {\n\t\treturn this._prepare().run(placeholderValues);\n\t};\n\n\tall: ReturnType<this['prepare']>['all'] = (placeholderValues) => {\n\t\treturn this._prepare().all(placeholderValues);\n\t};\n\n\tget: ReturnType<this['prepare']>['get'] = (placeholderValues) => {\n\t\treturn this._prepare().get(placeholderValues);\n\t};\n\n\tvalues: ReturnType<this['prepare']>['values'] = (placeholderValues) => {\n\t\treturn this._prepare().values(placeholderValues);\n\t};\n\n\toverride async execute(): Promise<SQLiteUpdateExecute<this>> {\n\t\treturn (this.config.returning ? this.all() : this.run()) as SQLiteUpdateExecute<this>;\n\t}\n\n\t$dynamic(): SQLiteUpdateDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport { SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteSession } from '../session.ts';\nimport type { SQLiteTable } from '../table.ts';\nimport type { SQLiteView } from '../view.ts';\n\nexport class SQLiteCountBuilder<\n\tTSession extends SQLiteSession<any, any, any, any>,\n> extends SQL<number> implements Promise<number>, SQLWrapper {\n\tprivate sql: SQL<number>;\n\n\tstatic override readonly [entityKind] = 'SQLiteCountBuilderAsync';\n\t[Symbol.toStringTag] = 'SQLiteCountBuilderAsync';\n\n\tprivate session: TSession;\n\n\tprivate static buildEmbeddedCount(\n\t\tsource: SQLiteTable | SQLiteView | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`(select count(*) from ${source}${sql.raw(' where ').if(filters)}${filters})`;\n\t}\n\n\tprivate static buildCount(\n\t\tsource: SQLiteTable | SQLiteView | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`select count(*) from ${source}${sql.raw(' where ').if(filters)}${filters}`;\n\t}\n\n\tconstructor(\n\t\treadonly params: {\n\t\t\tsource: SQLiteTable | SQLiteView | SQL | SQLWrapper;\n\t\t\tfilters?: SQL<unknown>;\n\t\t\tsession: TSession;\n\t\t},\n\t) {\n\t\tsuper(SQLiteCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);\n\n\t\tthis.session = params.session;\n\n\t\tthis.sql = SQLiteCountBuilder.buildCount(\n\t\t\tparams.source,\n\t\t\tparams.filters,\n\t\t);\n\t}\n\n\tthen<TResult1 = number, TResult2 = never>(\n\t\tonfulfilled?: ((value: number) => TResult1 | PromiseLike<TResult1>) | null | undefined,\n\t\tonrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined,\n\t): Promise<TResult1 | TResult2> {\n\t\treturn Promise.resolve(this.session.count(this.sql)).then(\n\t\t\tonfulfilled,\n\t\t\tonrejected,\n\t\t);\n\t}\n\n\tcatch(\n\t\tonRejected?: ((reason: any) => never | PromiseLike<never>) | null | undefined,\n\t): Promise<number> {\n\t\treturn this.then(undefined, onRejected);\n\t}\n\n\tfinally(onFinally?: (() => void) | null | undefined): Promise<number> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tonFinally?.();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tonFinally?.();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport {\n\ttype BuildQueryResult,\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tmapRelationalRow,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Query, QueryWithTypings, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { KnownKeysOnly } from '~/utils.ts';\nimport type { SQLiteDialect } from '../dialect.ts';\nimport type { PreparedQueryConfig, SQLitePreparedQuery, SQLiteSession } from '../session.ts';\nimport type { SQLiteTable } from '../table.ts';\n\nexport type SQLiteRelationalQueryKind<TMode extends 'sync' | 'async', TResult> = TMode extends 'async'\n\t? SQLiteRelationalQuery<TMode, TResult>\n\t: SQLiteSyncRelationalQuery<TResult>;\n\nexport class RelationalQueryBuilder<\n\tTMode extends 'sync' | 'async',\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n\tTFields extends TableRelationalConfig,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteAsyncRelationalQueryBuilder';\n\n\tconstructor(\n\t\tprotected mode: TMode,\n\t\tprotected fullSchema: Record<string, unknown>,\n\t\tprotected schema: TSchema,\n\t\tprotected tableNamesMap: Record<string, string>,\n\t\tprotected table: SQLiteTable,\n\t\tprotected tableConfig: TableRelationalConfig,\n\t\tprotected dialect: SQLiteDialect,\n\t\tprotected session: SQLiteSession<'async', unknown, TFullSchema, TSchema>,\n\t) {}\n\n\tfindMany<TConfig extends DBQueryConfig<'many', true, TSchema, TFields>>(\n\t\tconfig?: KnownKeysOnly<TConfig, DBQueryConfig<'many', true, TSchema, TFields>>,\n\t): SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TConfig>[]> {\n\t\treturn (this.mode === 'sync'\n\t\t\t? new SQLiteSyncRelationalQuery(\n\t\t\t\tthis.fullSchema,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.tableNamesMap,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig ? (config as DBQueryConfig<'many', true>) : {},\n\t\t\t\t'many',\n\t\t\t)\n\t\t\t: new SQLiteRelationalQuery(\n\t\t\t\tthis.fullSchema,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.tableNamesMap,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig ? (config as DBQueryConfig<'many', true>) : {},\n\t\t\t\t'many',\n\t\t\t)) as SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TConfig>[]>;\n\t}\n\n\tfindFirst<TSelection extends Omit<DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>(\n\t\tconfig?: KnownKeysOnly<TSelection, Omit<DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>,\n\t): SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TSelection> | undefined> {\n\t\treturn (this.mode === 'sync'\n\t\t\t? new SQLiteSyncRelationalQuery(\n\t\t\t\tthis.fullSchema,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.tableNamesMap,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig ? { ...(config as DBQueryConfig<'many', true> | undefined), limit: 1 } : { limit: 1 },\n\t\t\t\t'first',\n\t\t\t)\n\t\t\t: new SQLiteRelationalQuery(\n\t\t\t\tthis.fullSchema,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.tableNamesMap,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig ? { ...(config as DBQueryConfig<'many', true> | undefined), limit: 1 } : { limit: 1 },\n\t\t\t\t'first',\n\t\t\t)) as SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TSelection> | undefined>;\n\t}\n}\n\nexport class SQLiteRelationalQuery<TType extends 'sync' | 'async', TResult> extends QueryPromise<TResult>\n\timplements RunnableQuery<TResult, 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncRelationalQuery';\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly type: TType;\n\t\treadonly result: TResult;\n\t};\n\n\t/** @internal */\n\tmode: 'many' | 'first';\n\n\tconstructor(\n\t\tprivate fullSchema: Record<string, unknown>,\n\t\tprivate schema: TablesRelationalConfig,\n\t\tprivate tableNamesMap: Record<string, string>,\n\t\t/** @internal */\n\t\tpublic table: SQLiteTable,\n\t\tprivate tableConfig: TableRelationalConfig,\n\t\tprivate dialect: SQLiteDialect,\n\t\tprivate session: SQLiteSession<'sync' | 'async', unknown, Record<string, unknown>, TablesRelationalConfig>,\n\t\tprivate config: DBQueryConfig<'many', true> | true,\n\t\tmode: 'many' | 'first',\n\t) {\n\t\tsuper();\n\t\tthis.mode = mode;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildRelationalQuery({\n\t\t\tfullSchema: this.fullSchema,\n\t\t\tschema: this.schema,\n\t\t\ttableNamesMap: this.tableNamesMap,\n\t\t\ttable: this.table,\n\t\t\ttableConfig: this.tableConfig,\n\t\t\tqueryConfig: this.config,\n\t\t\ttableAlias: this.tableConfig.tsName,\n\t\t}).sql as SQL;\n\t}\n\n\t/** @internal */\n\t_prepare(\n\t\tisOneTimeQuery = false,\n\t): SQLitePreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }> {\n\t\tconst { query, builtQuery } = this._toSQL();\n\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tbuiltQuery,\n\t\t\tundefined,\n\t\t\tthis.mode === 'first' ? 'get' : 'all',\n\t\t\ttrue,\n\t\t\t(rawRows, mapColumnValue) => {\n\t\t\t\tconst rows = rawRows.map((row) =>\n\t\t\t\t\tmapRelationalRow(this.schema, this.tableConfig, row, query.selection, mapColumnValue)\n\t\t\t\t);\n\t\t\t\tif (this.mode === 'first') {\n\t\t\t\t\treturn rows[0] as TResult;\n\t\t\t\t}\n\t\t\t\treturn rows as TResult;\n\t\t\t},\n\t\t) as SQLitePreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }>;\n\t}\n\n\tprepare(): SQLitePreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }> {\n\t\treturn this._prepare(false);\n\t}\n\n\tprivate _toSQL(): { query: BuildRelationalQueryResult; builtQuery: QueryWithTypings } {\n\t\tconst query = this.dialect.buildRelationalQuery({\n\t\t\tfullSchema: this.fullSchema,\n\t\t\tschema: this.schema,\n\t\t\ttableNamesMap: this.tableNamesMap,\n\t\t\ttable: this.table,\n\t\t\ttableConfig: this.tableConfig,\n\t\t\tqueryConfig: this.config,\n\t\t\ttableAlias: this.tableConfig.tsName,\n\t\t});\n\n\t\tconst builtQuery = this.dialect.sqlToQuery(query.sql as SQL);\n\n\t\treturn { query, builtQuery };\n\t}\n\n\ttoSQL(): Query {\n\t\treturn this._toSQL().builtQuery;\n\t}\n\n\t/** @internal */\n\texecuteRaw(): TResult {\n\t\tif (this.mode === 'first') {\n\t\t\treturn this._prepare(false).get() as TResult;\n\t\t}\n\t\treturn this._prepare(false).all() as TResult;\n\t}\n\n\toverride async execute(): Promise<TResult> {\n\t\treturn this.executeRaw();\n\t}\n}\n\nexport class SQLiteSyncRelationalQuery<TResult> extends SQLiteRelationalQuery<'sync', TResult> {\n\tstatic override readonly [entityKind]: string = 'SQLiteSyncRelationalQuery';\n\n\tsync(): TResult {\n\t\treturn this.executeRaw();\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport type { SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteAsyncDialect } from '../dialect.ts';\n\ntype SQLiteRawAction = 'all' | 'get' | 'values' | 'run';\nexport interface SQLiteRawConfig {\n\taction: SQLiteRawAction;\n}\n\nexport interface SQLiteRaw<TResult> extends QueryPromise<TResult>, RunnableQuery<TResult, 'sqlite'>, SQLWrapper {}\n\nexport class SQLiteRaw<TResult> extends QueryPromise<TResult>\n\timplements RunnableQuery<TResult, 'sqlite'>, SQLWrapper, PreparedQuery\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteRaw';\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly result: TResult;\n\t};\n\n\t/** @internal */\n\tconfig: SQLiteRawConfig;\n\n\tconstructor(\n\t\tpublic execute: () => Promise<TResult>,\n\t\t/** @internal */\n\t\tpublic getSQL: () => SQL,\n\t\taction: SQLiteRawAction,\n\t\tprivate dialect: SQLiteAsyncDialect,\n\t\tprivate mapBatchResult: (result: unknown) => unknown,\n\t) {\n\t\tsuper();\n\t\tthis.config = { action };\n\t}\n\n\tgetQuery() {\n\t\treturn { ...this.dialect.sqlToQuery(this.getSQL()), method: this.config.action };\n\t}\n\n\tmapResult(result: unknown, isFromBatch?: boolean) {\n\t\treturn isFromBatch ? this.mapBatchResult(result) : result;\n\t}\n\n\t_prepare(): PreparedQuery {\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn false;\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { type ColumnsSelection, type SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteAsyncDialect, SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport {\n\tQueryBuilder,\n\tSQLiteDeleteBase,\n\tSQLiteInsertBuilder,\n\tSQLiteSelectBuilder,\n\tSQLiteUpdateBuilder,\n} from '~/sqlite-core/query-builders/index.ts';\nimport type {\n\tDBResult,\n\tResult,\n\tSQLiteSession,\n\tSQLiteTransaction,\n\tSQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport type { DrizzleTypeError } from '~/utils.ts';\nimport { SQLiteCountBuilder } from './query-builders/count.ts';\nimport { RelationalQueryBuilder } from './query-builders/query.ts';\nimport { SQLiteRaw } from './query-builders/raw.ts';\nimport type { SelectedFields } from './query-builders/select.types.ts';\nimport type { WithBuilder } from './subquery.ts';\nimport type { SQLiteViewBase } from './view-base.ts';\n\nexport class BaseSQLiteDatabase<\n\tTResultKind extends 'sync' | 'async',\n\tTRunResult,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends TablesRelationalConfig = ExtractTablesWithRelations<TFullSchema>,\n> {\n\tstatic readonly [entityKind]: string = 'BaseSQLiteDatabase';\n\n\tdeclare readonly _: {\n\t\treadonly schema: TSchema | undefined;\n\t\treadonly fullSchema: TFullSchema;\n\t\treadonly tableNamesMap: Record<string, string>;\n\t};\n\n\tquery: TFullSchema extends Record<string, never>\n\t\t? DrizzleTypeError<'Seems like the schema generic is missing - did you forget to add it to your DB type?'>\n\t\t: {\n\t\t\t[K in keyof TSchema]: RelationalQueryBuilder<TResultKind, TFullSchema, TSchema, TSchema[K]>;\n\t\t};\n\n\tconstructor(\n\t\tprivate resultKind: TResultKind,\n\t\t/** @internal */\n\t\treadonly dialect: { sync: SQLiteSyncDialect; async: SQLiteAsyncDialect }[TResultKind],\n\t\t/** @internal */\n\t\treadonly session: SQLiteSession<TResultKind, TRunResult, TFullSchema, TSchema>,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t) {\n\t\tthis._ = schema\n\t\t\t? {\n\t\t\t\tschema: schema.schema,\n\t\t\t\tfullSchema: schema.fullSchema as TFullSchema,\n\t\t\t\ttableNamesMap: schema.tableNamesMap,\n\t\t\t}\n\t\t\t: {\n\t\t\t\tschema: undefined,\n\t\t\t\tfullSchema: {} as TFullSchema,\n\t\t\t\ttableNamesMap: {},\n\t\t\t};\n\t\tthis.query = {} as typeof this['query'];\n\t\tconst query = this.query as {\n\t\t\t[K in keyof TSchema]: RelationalQueryBuilder<TResultKind, TFullSchema, TSchema, TSchema[K]>;\n\t\t};\n\t\tif (this._.schema) {\n\t\t\tfor (const [tableName, columns] of Object.entries(this._.schema)) {\n\t\t\t\tquery[tableName as keyof TSchema] = new RelationalQueryBuilder(\n\t\t\t\t\tresultKind,\n\t\t\t\t\tschema!.fullSchema,\n\t\t\t\t\tthis._.schema,\n\t\t\t\t\tthis._.tableNamesMap,\n\t\t\t\t\tschema!.fullSchema[tableName] as SQLiteTable,\n\t\t\t\t\tcolumns,\n\t\t\t\t\tdialect,\n\t\t\t\t\tsession as SQLiteSession<any, any, any, any> as any,\n\t\t\t\t) as typeof query[keyof TSchema];\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Creates a subquery that defines a temporary named result set as a CTE.\n\t *\n\t * It is useful for breaking down complex queries into simpler parts and for reusing the result set in subsequent parts of the query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param alias The alias for the subquery.\n\t *\n\t * Failure to provide an alias will result in a DrizzleTypeError, preventing the subquery from being referenced in other queries.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Create a subquery with alias 'sq' and use it in the select query\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t *\n\t * To select arbitrary SQL values as fields in a CTE and reference them in other CTEs or in the main query, you need to add aliases to them:\n\t *\n\t * ```ts\n\t * // Select an arbitrary SQL value as a field in a CTE and reference it in the main query\n\t * const sq = db.$with('sq').as(db.select({\n\t * name: sql<string>`upper(${users.name})`.as('name'),\n\t * })\n\t * .from(users));\n\t *\n\t * const result = await db.with(sq).select({ name: sq.name }).from(sq);\n\t * ```\n\t */\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst self = this;\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(new QueryBuilder(self.dialect));\n\t\t\t}\n\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tqb.getSQL(),\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t);\n\t\t};\n\t\treturn { as };\n\t};\n\n\t$count(\n\t\tsource: SQLiteTable | SQLiteViewBase | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t) {\n\t\treturn new SQLiteCountBuilder({ source, filters, session: this.session });\n\t}\n\n\t/**\n\t * Incorporates a previously defined CTE (using `$with`) into the main query.\n\t *\n\t * This method allows the main query to reference a temporary named result set.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param queries The CTEs to incorporate into the main query.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Define a subquery 'sq' as a CTE using $with\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * // Incorporate the CTE 'sq' into the main query and select from it\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t */\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\t/**\n\t\t * Creates a select query.\n\t\t *\n\t\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Select all columns and all rows from the 'cars' table\n\t\t * const allCars: Car[] = await db.select().from(cars);\n\t\t *\n\t\t * // Select specific columns and all rows from the 'cars' table\n\t\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t\t * id: cars.id,\n\t\t * brand: cars.brand\n\t\t * })\n\t\t * .from(cars);\n\t\t * ```\n\t\t *\n\t\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t\t *\n\t\t * ```ts\n\t\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t\t * id: cars.id,\n\t\t * lowerBrand: sql<string>`lower(${cars.brand})`,\n\t\t * })\n\t\t * .from(cars);\n\t\t * ```\n\t\t */\n\t\tfunction select(): SQLiteSelectBuilder<undefined, TResultKind, TRunResult>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, TResultKind, TRunResult>;\n\t\tfunction select(\n\t\t\tfields?: SelectedFields,\n\t\t): SQLiteSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Adds `distinct` expression to the select query.\n\t\t *\n\t\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Select all unique rows from the 'cars' table\n\t\t * await db.selectDistinct()\n\t\t * .from(cars)\n\t\t * .orderBy(cars.id, cars.brand, cars.color);\n\t\t *\n\t\t * // Select all unique brands from the 'cars' table\n\t\t * await db.selectDistinct({ brand: cars.brand })\n\t\t * .from(cars)\n\t\t * .orderBy(cars.brand);\n\t\t * ```\n\t\t */\n\t\tfunction selectDistinct(): SQLiteSelectBuilder<undefined, TResultKind, TRunResult>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, TResultKind, TRunResult>;\n\t\tfunction selectDistinct(\n\t\t\tfields?: SelectedFields,\n\t\t): SQLiteSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Creates an update query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t\t *\n\t\t * Use `.set()` method to specify which values to update.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t\t *\n\t\t * @param table The table to update.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Update all rows in the 'cars' table\n\t\t * await db.update(cars).set({ color: 'red' });\n\t\t *\n\t\t * // Update rows with filters and conditions\n\t\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t\t *\n\t\t * // Update with returning clause\n\t\t * const updatedCar: Car[] = await db.update(cars)\n\t\t * .set({ color: 'red' })\n\t\t * .where(eq(cars.id, 1))\n\t\t * .returning();\n\t\t * ```\n\t\t */\n\t\tfunction update<TTable extends SQLiteTable>(table: TTable): SQLiteUpdateBuilder<TTable, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteUpdateBuilder(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\t/**\n\t\t * Creates an insert query.\n\t\t *\n\t\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t\t *\n\t\t * @param table The table to insert into.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Insert one row\n\t\t * await db.insert(cars).values({ brand: 'BMW' });\n\t\t *\n\t\t * // Insert multiple rows\n\t\t * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t\t *\n\t\t * // Insert with returning clause\n\t\t * const insertedCar: Car[] = await db.insert(cars)\n\t\t * .values({ brand: 'BMW' })\n\t\t * .returning();\n\t\t * ```\n\t\t */\n\t\tfunction insert<TTable extends SQLiteTable>(into: TTable): SQLiteInsertBuilder<TTable, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteInsertBuilder(into, self.session, self.dialect, queries);\n\t\t}\n\n\t\t/**\n\t\t * Creates a delete query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t\t *\n\t\t * @param table The table to delete from.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Delete all rows in the 'cars' table\n\t\t * await db.delete(cars);\n\t\t *\n\t\t * // Delete rows with filters and conditions\n\t\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t\t *\n\t\t * // Delete with returning clause\n\t\t * const deletedCar: Car[] = await db.delete(cars)\n\t\t * .where(eq(cars.id, 1))\n\t\t * .returning();\n\t\t * ```\n\t\t */\n\t\tfunction delete_<TTable extends SQLiteTable>(from: TTable): SQLiteDeleteBase<TTable, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteDeleteBase(from, self.session, self.dialect, queries);\n\t\t}\n\n\t\treturn { select, selectDistinct, update, insert, delete: delete_ };\n\t}\n\n\t/**\n\t * Creates a select query.\n\t *\n\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all columns and all rows from the 'cars' table\n\t * const allCars: Car[] = await db.select().from(cars);\n\t *\n\t * // Select specific columns and all rows from the 'cars' table\n\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t * id: cars.id,\n\t * brand: cars.brand\n\t * })\n\t * .from(cars);\n\t * ```\n\t *\n\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t *\n\t * ```ts\n\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t * id: cars.id,\n\t * lowerBrand: sql<string>`lower(${cars.brand})`,\n\t * })\n\t * .from(cars);\n\t * ```\n\t */\n\tselect(): SQLiteSelectBuilder<undefined, TResultKind, TRunResult>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, TResultKind, TRunResult>;\n\tselect(fields?: SelectedFields): SQLiteSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\treturn new SQLiteSelectBuilder({ fields: fields ?? undefined, session: this.session, dialect: this.dialect });\n\t}\n\n\t/**\n\t * Adds `distinct` expression to the select query.\n\t *\n\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all unique rows from the 'cars' table\n\t * await db.selectDistinct()\n\t * .from(cars)\n\t * .orderBy(cars.id, cars.brand, cars.color);\n\t *\n\t * // Select all unique brands from the 'cars' table\n\t * await db.selectDistinct({ brand: cars.brand })\n\t * .from(cars)\n\t * .orderBy(cars.brand);\n\t * ```\n\t */\n\tselectDistinct(): SQLiteSelectBuilder<undefined, TResultKind, TRunResult>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, TResultKind, TRunResult>;\n\tselectDistinct(\n\t\tfields?: SelectedFields,\n\t): SQLiteSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\treturn new SQLiteSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\t/**\n\t * Creates an update query.\n\t *\n\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t *\n\t * Use `.set()` method to specify which values to update.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param table The table to update.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Update all rows in the 'cars' table\n\t * await db.update(cars).set({ color: 'red' });\n\t *\n\t * // Update rows with filters and conditions\n\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t *\n\t * // Update with returning clause\n\t * const updatedCar: Car[] = await db.update(cars)\n\t * .set({ color: 'red' })\n\t * .where(eq(cars.id, 1))\n\t * .returning();\n\t * ```\n\t */\n\tupdate<TTable extends SQLiteTable>(table: TTable): SQLiteUpdateBuilder<TTable, TResultKind, TRunResult> {\n\t\treturn new SQLiteUpdateBuilder(table, this.session, this.dialect);\n\t}\n\n\t/**\n\t * Creates an insert query.\n\t *\n\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t *\n\t * @param table The table to insert into.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Insert one row\n\t * await db.insert(cars).values({ brand: 'BMW' });\n\t *\n\t * // Insert multiple rows\n\t * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t *\n\t * // Insert with returning clause\n\t * const insertedCar: Car[] = await db.insert(cars)\n\t * .values({ brand: 'BMW' })\n\t * .returning();\n\t * ```\n\t */\n\tinsert<TTable extends SQLiteTable>(into: TTable): SQLiteInsertBuilder<TTable, TResultKind, TRunResult> {\n\t\treturn new SQLiteInsertBuilder(into, this.session, this.dialect);\n\t}\n\n\t/**\n\t * Creates a delete query.\n\t *\n\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param table The table to delete from.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Delete all rows in the 'cars' table\n\t * await db.delete(cars);\n\t *\n\t * // Delete rows with filters and conditions\n\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t *\n\t * // Delete with returning clause\n\t * const deletedCar: Car[] = await db.delete(cars)\n\t * .where(eq(cars.id, 1))\n\t * .returning();\n\t * ```\n\t */\n\tdelete<TTable extends SQLiteTable>(from: TTable): SQLiteDeleteBase<TTable, TResultKind, TRunResult> {\n\t\treturn new SQLiteDeleteBase(from, this.session, this.dialect);\n\t}\n\n\trun(query: SQLWrapper | string): DBResult<TResultKind, TRunResult> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteRaw(\n\t\t\t\tasync () => this.session.run(sequel),\n\t\t\t\t() => sequel,\n\t\t\t\t'run',\n\t\t\t\tthis.dialect as SQLiteAsyncDialect,\n\t\t\t\tthis.session.extractRawRunValueFromBatchResult.bind(this.session),\n\t\t\t) as DBResult<TResultKind, TRunResult>;\n\t\t}\n\t\treturn this.session.run(sequel) as DBResult<TResultKind, TRunResult>;\n\t}\n\n\tall<T = unknown>(query: SQLWrapper | string): DBResult<TResultKind, T[]> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteRaw(\n\t\t\t\tasync () => this.session.all(sequel),\n\t\t\t\t() => sequel,\n\t\t\t\t'all',\n\t\t\t\tthis.dialect as SQLiteAsyncDialect,\n\t\t\t\tthis.session.extractRawAllValueFromBatchResult.bind(this.session),\n\t\t\t) as any;\n\t\t}\n\t\treturn this.session.all(sequel) as DBResult<TResultKind, T[]>;\n\t}\n\n\tget<T = unknown>(query: SQLWrapper | string): DBResult<TResultKind, T> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteRaw(\n\t\t\t\tasync () => this.session.get(sequel),\n\t\t\t\t() => sequel,\n\t\t\t\t'get',\n\t\t\t\tthis.dialect as SQLiteAsyncDialect,\n\t\t\t\tthis.session.extractRawGetValueFromBatchResult.bind(this.session),\n\t\t\t) as DBResult<TResultKind, T>;\n\t\t}\n\t\treturn this.session.get(sequel) as DBResult<TResultKind, T>;\n\t}\n\n\tvalues<T extends unknown[] = unknown[]>(query: SQLWrapper | string): DBResult<TResultKind, T[]> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteRaw(\n\t\t\t\tasync () => this.session.values(sequel),\n\t\t\t\t() => sequel,\n\t\t\t\t'values',\n\t\t\t\tthis.dialect as SQLiteAsyncDialect,\n\t\t\t\tthis.session.extractRawValuesValueFromBatchResult.bind(this.session),\n\t\t\t) as any;\n\t\t}\n\t\treturn this.session.values(sequel) as DBResult<TResultKind, T[]>;\n\t}\n\n\ttransaction<T>(\n\t\ttransaction: (tx: SQLiteTransaction<TResultKind, TRunResult, TFullSchema, TSchema>) => Result<TResultKind, T>,\n\t\tconfig?: SQLiteTransactionConfig,\n\t): Result<TResultKind, T> {\n\t\treturn this.session.transaction(transaction, config);\n\t}\n}\n\nexport type SQLiteWithReplicas<Q> = Q & { $primary: Q };\n\nexport const withReplicas = <\n\tTResultKind extends 'sync' | 'async',\n\tTRunResult,\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n\tQ extends BaseSQLiteDatabase<\n\t\tTResultKind,\n\t\tTRunResult,\n\t\tTFullSchema,\n\t\tTSchema extends Record<string, unknown> ? ExtractTablesWithRelations<TFullSchema> : TSchema\n\t>,\n>(\n\tprimary: Q,\n\treplicas: [Q, ...Q[]],\n\tgetReplica: (replicas: Q[]) => Q = () => replicas[Math.floor(Math.random() * replicas.length)]!,\n): SQLiteWithReplicas<Q> => {\n\tconst select: Q['select'] = (...args: []) => getReplica(replicas).select(...args);\n\tconst selectDistinct: Q['selectDistinct'] = (...args: []) => getReplica(replicas).selectDistinct(...args);\n\tconst $count: Q['$count'] = (...args: [any]) => getReplica(replicas).$count(...args);\n\tconst $with: Q['with'] = (...args: []) => getReplica(replicas).with(...args);\n\n\tconst update: Q['update'] = (...args: [any]) => primary.update(...args);\n\tconst insert: Q['insert'] = (...args: [any]) => primary.insert(...args);\n\tconst $delete: Q['delete'] = (...args: [any]) => primary.delete(...args);\n\tconst run: Q['run'] = (...args: [any]) => primary.run(...args);\n\tconst all: Q['all'] = (...args: [any]) => primary.all(...args);\n\tconst get: Q['get'] = (...args: [any]) => primary.get(...args);\n\tconst values: Q['values'] = (...args: [any]) => primary.values(...args);\n\tconst transaction: Q['transaction'] = (...args: [any]) => primary.transaction(...args);\n\n\treturn {\n\t\t...primary,\n\t\tupdate,\n\t\tinsert,\n\t\tdelete: $delete,\n\t\trun,\n\t\tall,\n\t\tget,\n\t\tvalues,\n\t\ttransaction,\n\t\t$primary: primary,\n\t\tselect,\n\t\tselectDistinct,\n\t\t$count,\n\t\twith: $with,\n\t\tget query() {\n\t\t\treturn getReplica(replicas).query;\n\t\t},\n\t};\n};\n","import { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { SQLiteColumn } from './columns/index.ts';\nimport type { SQLiteTable } from './table.ts';\n\nexport interface IndexConfig {\n\tname: string;\n\tcolumns: IndexColumn[];\n\tunique: boolean;\n\twhere: SQL | undefined;\n}\n\nexport type IndexColumn = SQLiteColumn | SQL;\n\nexport class IndexBuilderOn {\n\tstatic readonly [entityKind]: string = 'SQLiteIndexBuilderOn';\n\n\tconstructor(private name: string, private unique: boolean) {}\n\n\ton(...columns: [IndexColumn, ...IndexColumn[]]): IndexBuilder {\n\t\treturn new IndexBuilder(this.name, columns, this.unique);\n\t}\n}\n\nexport class IndexBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteIndexBuilder';\n\n\tdeclare _: {\n\t\tbrand: 'SQLiteIndexBuilder';\n\t};\n\n\t/** @internal */\n\tconfig: IndexConfig;\n\n\tconstructor(name: string, columns: IndexColumn[], unique: boolean) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tunique,\n\t\t\twhere: undefined,\n\t\t};\n\t}\n\n\t/**\n\t * Condition for partial index.\n\t */\n\twhere(condition: SQL): this {\n\t\tthis.config.where = condition;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: SQLiteTable): Index {\n\t\treturn new Index(this.config, table);\n\t}\n}\n\nexport class Index {\n\tstatic readonly [entityKind]: string = 'SQLiteIndex';\n\n\tdeclare _: {\n\t\tbrand: 'SQLiteIndex';\n\t};\n\n\treadonly config: IndexConfig & { table: SQLiteTable };\n\n\tconstructor(config: IndexConfig, table: SQLiteTable) {\n\t\tthis.config = { ...config, table };\n\t}\n}\n\nexport function index(name: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(name, false);\n}\n\nexport function uniqueIndex(name: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(name, true);\n}\n","import { entityKind } from '~/entity.ts';\nimport { DrizzleError, TransactionRollbackError } from '~/errors.ts';\nimport type { TablesRelationalConfig } from '~/relations.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport type { Query, SQL } from '~/sql/sql.ts';\nimport type { SQLiteAsyncDialect, SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\n// import { QueryPromise } from '../index.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport { BaseSQLiteDatabase } from './db.ts';\nimport type { SQLiteRaw } from './query-builders/raw.ts';\nimport type { SelectedFieldsOrdered } from './query-builders/select.types.ts';\n\nexport interface PreparedQueryConfig {\n\ttype: 'sync' | 'async';\n\trun: unknown;\n\tall: unknown;\n\tget: unknown;\n\tvalues: unknown;\n\texecute: unknown;\n}\n\nexport class ExecuteResultSync<T> extends QueryPromise<T> {\n\tstatic override readonly [entityKind]: string = 'ExecuteResultSync';\n\n\tconstructor(private resultCb: () => T) {\n\t\tsuper();\n\t}\n\n\toverride async execute(): Promise<T> {\n\t\treturn this.resultCb();\n\t}\n\n\tsync(): T {\n\t\treturn this.resultCb();\n\t}\n}\n\nexport type ExecuteResult<TType extends 'sync' | 'async', TResult> = TType extends 'async' ? Promise<TResult>\n\t: ExecuteResultSync<TResult>;\n\nexport abstract class SQLitePreparedQuery<T extends PreparedQueryConfig> implements PreparedQuery {\n\tstatic readonly [entityKind]: string = 'PreparedQuery';\n\n\t/** @internal */\n\tjoinsNotNullableMap?: Record<string, boolean>;\n\n\tconstructor(\n\t\tprivate mode: 'sync' | 'async',\n\t\tprivate executeMethod: SQLiteExecuteMethod,\n\t\tprotected query: Query,\n\t) {}\n\n\tgetQuery(): Query {\n\t\treturn this.query;\n\t}\n\n\tabstract run(placeholderValues?: Record<string, unknown>): Result<T['type'], T['run']>;\n\n\tmapRunResult(result: unknown, _isFromBatch?: boolean): unknown {\n\t\treturn result;\n\t}\n\n\tabstract all(placeholderValues?: Record<string, unknown>): Result<T['type'], T['all']>;\n\n\tmapAllResult(_result: unknown, _isFromBatch?: boolean): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tabstract get(placeholderValues?: Record<string, unknown>): Result<T['type'], T['get']>;\n\n\tmapGetResult(_result: unknown, _isFromBatch?: boolean): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tabstract values(placeholderValues?: Record<string, unknown>): Result<T['type'], T['values']>;\n\n\texecute(placeholderValues?: Record<string, unknown>): ExecuteResult<T['type'], T['execute']> {\n\t\tif (this.mode === 'async') {\n\t\t\treturn this[this.executeMethod](placeholderValues) as ExecuteResult<T['type'], T['execute']>;\n\t\t}\n\t\treturn new ExecuteResultSync(() => this[this.executeMethod](placeholderValues));\n\t}\n\n\tmapResult(response: unknown, isFromBatch?: boolean) {\n\t\tswitch (this.executeMethod) {\n\t\t\tcase 'run': {\n\t\t\t\treturn this.mapRunResult(response, isFromBatch);\n\t\t\t}\n\t\t\tcase 'all': {\n\t\t\t\treturn this.mapAllResult(response, isFromBatch);\n\t\t\t}\n\t\t\tcase 'get': {\n\t\t\t\treturn this.mapGetResult(response, isFromBatch);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @internal */\n\tabstract isResponseInArrayMode(): boolean;\n}\n\nexport interface SQLiteTransactionConfig {\n\tbehavior?: 'deferred' | 'immediate' | 'exclusive';\n}\n\nexport type SQLiteExecuteMethod = 'run' | 'all' | 'get';\n\nexport abstract class SQLiteSession<\n\tTResultKind extends 'sync' | 'async',\n\tTRunResult,\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteSession';\n\n\tconstructor(\n\t\t/** @internal */\n\t\treadonly dialect: { sync: SQLiteSyncDialect; async: SQLiteAsyncDialect }[TResultKind],\n\t) {}\n\n\tabstract prepareQuery(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => unknown,\n\t): SQLitePreparedQuery<PreparedQueryConfig & { type: TResultKind }>;\n\n\tprepareOneTimeQuery(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t): SQLitePreparedQuery<PreparedQueryConfig & { type: TResultKind }> {\n\t\treturn this.prepareQuery(query, fields, executeMethod, isResponseInArrayMode);\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: SQLiteTransaction<TResultKind, TRunResult, TFullSchema, TSchema>) => Result<TResultKind, T>,\n\t\tconfig?: SQLiteTransactionConfig,\n\t): Result<TResultKind, T>;\n\n\trun(query: SQL): Result<TResultKind, TRunResult> {\n\t\tconst staticQuery = this.dialect.sqlToQuery(query);\n\t\ttry {\n\t\t\treturn this.prepareOneTimeQuery(staticQuery, undefined, 'run', false).run() as Result<TResultKind, TRunResult>;\n\t\t} catch (err) {\n\t\t\tthrow new DrizzleError({ cause: err, message: `Failed to run the query '${staticQuery.sql}'` });\n\t\t}\n\t}\n\n\t/** @internal */\n\textractRawRunValueFromBatchResult(result: unknown) {\n\t\treturn result;\n\t}\n\n\tall<T = unknown>(query: SQL): Result<TResultKind, T[]> {\n\t\treturn this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, 'run', false).all() as Result<\n\t\t\tTResultKind,\n\t\t\tT[]\n\t\t>;\n\t}\n\n\t/** @internal */\n\textractRawAllValueFromBatchResult(_result: unknown): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tget<T = unknown>(query: SQL): Result<TResultKind, T> {\n\t\treturn this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, 'run', false).get() as Result<\n\t\t\tTResultKind,\n\t\t\tT\n\t\t>;\n\t}\n\n\t/** @internal */\n\textractRawGetValueFromBatchResult(_result: unknown): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tvalues<T extends any[] = unknown[]>(\n\t\tquery: SQL,\n\t): Result<TResultKind, T[]> {\n\t\treturn this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, 'run', false).values() as Result<\n\t\t\tTResultKind,\n\t\t\tT[]\n\t\t>;\n\t}\n\n\tasync count(sql: SQL) {\n\t\tconst result = await this.values(sql) as [[number]];\n\n\t\treturn result[0][0];\n\t}\n\n\t/** @internal */\n\textractRawValuesValueFromBatchResult(_result: unknown): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n}\n\nexport type Result<TKind extends 'sync' | 'async', TResult> = { sync: TResult; async: Promise<TResult> }[TKind];\n\nexport type DBResult<TKind extends 'sync' | 'async', TResult> = { sync: TResult; async: SQLiteRaw<TResult> }[TKind];\n\nexport abstract class SQLiteTransaction<\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends BaseSQLiteDatabase<TResultType, TRunResult, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTransaction';\n\n\tconstructor(\n\t\tresultType: TResultType,\n\t\tdialect: { sync: SQLiteSyncDialect; async: SQLiteAsyncDialect }[TResultType],\n\t\tsession: SQLiteSession<TResultType, TRunResult, TFullSchema, TSchema>,\n\t\tprotected schema: {\n\t\t\tfullSchema: Record<string, unknown>;\n\t\t\tschema: TSchema;\n\t\t\ttableNamesMap: Record<string, string>;\n\t\t} | undefined,\n\t\tprotected readonly nestedIndex = 0,\n\t) {\n\t\tsuper(resultType, dialect, session, schema);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n}\n","/// <reference types=\"bun-types\" />\n\nimport type { Database, Statement as BunStatement } from 'bun:sqlite';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, sql } from '~/sql/sql.ts';\nimport type { SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport { SQLiteTransaction } from '~/sqlite-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types.ts';\nimport type {\n\tPreparedQueryConfig as PreparedQueryConfigBase,\n\tSQLiteExecuteMethod,\n\tSQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport { SQLitePreparedQuery as PreparedQueryBase, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { mapResultRow } from '~/utils.ts';\n\nexport interface SQLiteBunSessionOptions {\n\tlogger?: Logger;\n}\n\ntype PreparedQueryConfig = Omit<PreparedQueryConfigBase, 'statement' | 'run'>;\ntype Statement = BunStatement<any>;\n\nexport class SQLiteBunSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteSession<'sync', void, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBunSession';\n\n\tprivate logger: Logger;\n\n\tconstructor(\n\t\tprivate client: Database,\n\t\tdialect: SQLiteSyncDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\toptions: SQLiteBunSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t}\n\n\texec(query: string): void {\n\t\tthis.client.exec(query);\n\t}\n\n\tprepareQuery<T extends Omit<PreparedQueryConfig, 'run'>>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => unknown,\n\t): PreparedQuery<T> {\n\t\tconst stmt = this.client.prepare(query.sql);\n\t\treturn new PreparedQuery(\n\t\t\tstmt,\n\t\t\tquery,\n\t\t\tthis.logger,\n\t\t\tfields,\n\t\t\texecuteMethod,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (tx: SQLiteBunTransaction<TFullSchema, TSchema>) => T,\n\t\tconfig: SQLiteTransactionConfig = {},\n\t): T {\n\t\tconst tx = new SQLiteBunTransaction('sync', this.dialect, this, this.schema);\n\t\tlet result: T | undefined;\n\t\tconst nativeTx = this.client.transaction(() => {\n\t\t\tresult = transaction(tx);\n\t\t});\n\t\tnativeTx[config.behavior ?? 'deferred']();\n\t\treturn result!;\n\t}\n}\n\nexport class SQLiteBunTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteTransaction<'sync', void, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBunTransaction';\n\n\toverride transaction<T>(transaction: (tx: SQLiteBunTransaction<TFullSchema, TSchema>) => T): T {\n\t\tconst savepointName = `sp${this.nestedIndex}`;\n\t\tconst tx = new SQLiteBunTransaction('sync', this.dialect, this.session, this.schema, this.nestedIndex + 1);\n\t\tthis.session.run(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = transaction(tx);\n\t\t\tthis.session.run(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tthis.session.run(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig> extends PreparedQueryBase<\n\t{ type: 'sync'; run: void; all: T['all']; get: T['get']; values: T['values']; execute: T['execute'] }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBunPreparedQuery';\n\n\tconstructor(\n\t\tprivate stmt: Statement,\n\t\tquery: Query,\n\t\tprivate logger: Logger,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => unknown,\n\t) {\n\t\tsuper('sync', executeMethod, query);\n\t}\n\n\trun(placeholderValues?: Record<string, unknown>) {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn this.stmt.run(...params);\n\t}\n\n\tall(placeholderValues?: Record<string, unknown>): T['all'] {\n\t\tconst { fields, query, logger, joinsNotNullableMap, stmt, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\t\tlogger.logQuery(query.sql, params);\n\t\t\treturn stmt.all(...params);\n\t\t}\n\n\t\tconst rows = this.values(placeholderValues) as unknown[][];\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows) as T['all'];\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow(fields!, row, joinsNotNullableMap));\n\t}\n\n\tget(placeholderValues?: Record<string, unknown>): T['get'] {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\tconst row = this.stmt.values(...params)[0];\n\n\t\tif (!row) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst { fields, joinsNotNullableMap, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn row;\n\t\t}\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper([row]) as T['get'];\n\t\t}\n\n\t\treturn mapResultRow(fields!, row, joinsNotNullableMap);\n\t}\n\n\tvalues(placeholderValues?: Record<string, unknown>): T['values'] {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn this.stmt.values(...params);\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n","import crypto from 'node:crypto';\nimport fs from 'node:fs';\n\nexport interface KitConfig {\n\tout: string;\n\tschema: string;\n}\n\nexport interface MigrationConfig {\n\tmigrationsFolder: string;\n\tmigrationsTable?: string;\n\tmigrationsSchema?: string;\n}\n\nexport interface MigrationMeta {\n\tsql: string[];\n\tfolderMillis: number;\n\thash: string;\n\tbps: boolean;\n}\n\nexport function readMigrationFiles(config: MigrationConfig): MigrationMeta[] {\n\tconst migrationFolderTo = config.migrationsFolder;\n\n\tconst migrationQueries: MigrationMeta[] = [];\n\n\tconst journalPath = `${migrationFolderTo}/meta/_journal.json`;\n\tif (!fs.existsSync(journalPath)) {\n\t\tthrow new Error(`Can't find meta/_journal.json file`);\n\t}\n\n\tconst journalAsString = fs.readFileSync(`${migrationFolderTo}/meta/_journal.json`).toString();\n\n\tconst journal = JSON.parse(journalAsString) as {\n\t\tentries: { idx: number; when: number; tag: string; breakpoints: boolean }[];\n\t};\n\n\tfor (const journalEntry of journal.entries) {\n\t\tconst migrationPath = `${migrationFolderTo}/${journalEntry.tag}.sql`;\n\n\t\ttry {\n\t\t\tconst query = fs.readFileSync(`${migrationFolderTo}/${journalEntry.tag}.sql`).toString();\n\n\t\t\tconst result = query.split('--> statement-breakpoint').map((it) => {\n\t\t\t\treturn it;\n\t\t\t});\n\n\t\t\tmigrationQueries.push({\n\t\t\t\tsql: result,\n\t\t\t\tbps: journalEntry.breakpoints,\n\t\t\t\tfolderMillis: journalEntry.when,\n\t\t\t\thash: crypto.createHash('sha256').update(query).digest('hex'),\n\t\t\t});\n\t\t} catch {\n\t\t\tthrow new Error(`No file ${migrationPath} found in ${migrationFolderTo} folder`);\n\t\t}\n\t}\n\n\treturn migrationQueries;\n}\n","import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { BunSQLiteDatabase } from './driver.ts';\n\nexport function migrate<TSchema extends Record<string, unknown>>(\n\tdb: BunSQLiteDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tdb.dialect.migrate(migrations, db.session, config);\n}\n","// 任务表 Schema\n// 用于存储 AI Agent 的通用任务队列\n\nimport { index, sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\n\nexport const tasks = sqliteTable('tasks', {\n id: integer('id').primaryKey({ autoIncrement: true }),\n\n // 任务配置\n name: text('name').notNull(),\n agent: text('agent').notNull(),\n model: text('model').default('default'),\n prompt: text('prompt').notNull(),\n cwd: text('cwd'),\n\n // 分类与优先级\n category: text('category').default('general'),\n importance: integer('importance').default(3),\n urgency: integer('urgency').default(3),\n\n // 任务分组与依赖\n batchId: text('batch_id'),\n dependsOn: integer('depends_on'),\n\n // 状态\n status: text('status').default('pending'),\n\n // 时间戳(老字段保持秒级 timestamp)\n createdAt: integer('created_at', { mode: 'timestamp' })\n .$defaultFn(() => new Date()),\n startedAt: integer('started_at', { mode: 'timestamp' }),\n finishedAt: integer('finished_at', { mode: 'timestamp' }),\n\n // 执行结果\n resultLog: text('result_log'),\n retryCount: integer('retry_count').default(0),\n maxRetries: integer('max_retries').default(3),\n retryBackoffMs: integer('retry_backoff_ms').default(30000),\n\n // Gateway 扩展字段(毫秒)\n retryAfter: integer('retry_after'),\n timeoutMs: integer('timeout_ms'),\n templateId: integer('template_id'),\n scheduledAt: integer('scheduled_at'),\n}, (table) => [\n index('tasks_queue_idx').on(table.status, table.retryAfter, table.urgency, table.importance, table.createdAt, table.id),\n index('tasks_batch_status_idx').on(table.batchId, table.status),\n index('tasks_template_status_idx').on(table.templateId, table.status),\n index('tasks_depends_on_status_idx').on(table.dependsOn, table.status),\n index('tasks_cleanup_idx').on(table.finishedAt, table.id, table.status),\n]);\n\nexport type Task = typeof tasks.$inferSelect;\nexport type NewTask = typeof tasks.$inferInsert;\nexport type TaskStatus = 'pending' | 'running' | 'done' | 'failed' | 'dead_letter' | 'cancelled';\n\nexport const TASK_CATEGORIES = [\n 'translate',\n 'generate',\n 'review',\n 'test',\n 'general',\n] as const;\n\nexport const taskRuns = sqliteTable('task_runs', {\n id: integer('id').primaryKey({ autoIncrement: true }),\n taskId: integer('task_id').notNull().references(() => tasks.id, { onDelete: 'cascade' }),\n\n sessionId: text('session_id'),\n model: text('model'),\n status: text('status').default('running'),\n\n startedAt: integer('started_at', { mode: 'timestamp' })\n .$defaultFn(() => new Date()),\n finishedAt: integer('finished_at', { mode: 'timestamp' }),\n\n log: text('log'),\n\n // Gateway 运行时态字段(毫秒)\n lockedAt: integer('locked_at'),\n lockedBy: text('locked_by'),\n heartbeatAt: integer('heartbeat_at'),\n workerPid: integer('worker_pid'),\n childPid: integer('child_pid'),\n launchProtocol: text('launch_protocol'),\n}, (table) => [\n index('task_runs_task_started_idx').on(table.taskId, table.startedAt, table.id),\n index('task_runs_status_heartbeat_idx').on(table.status, table.heartbeatAt),\n]);\n\nexport type TaskRun = typeof taskRuns.$inferSelect;\nexport type NewTaskRun = typeof taskRuns.$inferInsert;\nexport type TaskRunStatus = 'running' | 'done' | 'failed';\n\nexport const taskTemplates = sqliteTable('task_templates', {\n id: integer('id').primaryKey({ autoIncrement: true }),\n name: text('name').notNull(),\n agent: text('agent').notNull(),\n model: text('model').default('default'),\n prompt: text('prompt').notNull(),\n cwd: text('cwd'),\n category: text('category').default('general'),\n importance: integer('importance').default(3),\n urgency: integer('urgency').default(3),\n batchId: text('batch_id'),\n\n scheduleType: text('schedule_type').notNull(),\n cronExpr: text('cron_expr'),\n intervalMs: integer('interval_ms'),\n runAt: integer('run_at'),\n\n maxInstances: integer('max_instances').default(1),\n maxRetries: integer('max_retries').default(3),\n retryBackoffMs: integer('retry_backoff_ms').default(30000),\n timeoutMs: integer('timeout_ms'),\n lastRunAt: integer('last_run_at'),\n nextRunAt: integer('next_run_at'),\n enabled: integer('enabled', { mode: 'boolean' }).default(true),\n\n createdAt: integer('created_at').default(0),\n updatedAt: integer('updated_at').default(0),\n}, (table) => [\n index('task_templates_due_idx').on(table.enabled, table.nextRunAt, table.id),\n index('task_templates_retention_idx').on(\n table.scheduleType,\n table.enabled,\n table.lastRunAt,\n table.id,\n ),\n]);\n\nexport type TaskTemplate = typeof taskTemplates.$inferSelect;\nexport type NewTaskTemplate = typeof taskTemplates.$inferInsert;\nexport type ScheduleType = 'cron' | 'delayed' | 'recurring';\n","const MAX_BACKOFF_MS = 30 * 60 * 1000;\n\nexport function computeBackoff(\n retryCount: number,\n baseMs = 30000,\n maxMs = MAX_BACKOFF_MS,\n): number {\n return Math.min(baseMs * Math.pow(2, retryCount - 1), maxMs);\n}\n","import { statSync } from 'fs';\nimport { isAbsolute } from 'path';\n\nexport class InvalidTaskWorkingDirectoryError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidTaskWorkingDirectoryError';\n }\n}\n\nexport function validateTaskWorkingDirectory(cwd: string | null | undefined): void {\n if (cwd == null) return;\n if (!cwd.trim()) {\n throw new InvalidTaskWorkingDirectoryError('任务工作目录不能为空');\n }\n if (!isAbsolute(cwd)) {\n throw new InvalidTaskWorkingDirectoryError(`任务工作目录必须是绝对路径:${cwd}`);\n }\n\n let stat: ReturnType<typeof statSync>;\n try {\n stat = statSync(cwd);\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n throw new InvalidTaskWorkingDirectoryError(`任务工作目录不存在或无法访问:${cwd}(${detail})`);\n }\n if (!stat.isDirectory()) {\n throw new InvalidTaskWorkingDirectoryError(`任务工作目录不是目录:${cwd}`);\n }\n}\n","// SQLite trim() defaults to U+0020 only. Keep database compatibility queries\n// aligned with ECMAScript String.trim() for legacy, unnormalized rows.\nexport const TASK_BATCH_TRIM_CHARACTERS = ' \\t\\n\\v\\f\\r\\u00a0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff';\n\nexport function normalizeTaskBatchId(\n batchId: string | null | undefined,\n): string | null | undefined {\n if (batchId == null) return batchId;\n return batchId.trim() || null;\n}\n","// 任务服务层\n// 封装所有任务相关的 CRUD 操作\n\nimport { db, getSqlite, schema } from '@core/db';\nimport { eq, and, desc, asc, sql, isNull, or } from 'drizzle-orm';\nimport type { Task, NewTask, TaskStatus } from '@core/db/schema';\nimport { computeBackoff } from '@core/backoff';\nimport { validateTaskWorkingDirectory } from '@core/task-working-directory';\nimport {\n normalizeTaskBatchId,\n TASK_BATCH_TRIM_CHARACTERS,\n} from '@core/task-batch';\n\nconst { tasks, taskRuns } = schema;\nlet cleanupInvocation = 0;\n\nexport interface TaskProjectSummary {\n cwd: string;\n total: number;\n pending: number;\n running: number;\n failed: number;\n done: number;\n lastCreatedAt: number | null;\n}\n\nexport interface EditableTaskUpdate {\n name?: string;\n agent?: string;\n model?: string;\n prompt?: string;\n category?: string;\n importance?: number;\n urgency?: number;\n batchId?: string | null;\n maxRetries?: number;\n retryBackoffMs?: number;\n timeoutMs?: number | null;\n}\n\nexport class TaskDeletionConflictError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TaskDeletionConflictError';\n }\n}\n\nfunction hasNoExecutableDependents() {\n return sql`NOT EXISTS (\n SELECT 1 FROM tasks AS dependent_task\n WHERE dependent_task.depends_on = ${tasks.id}\n AND dependent_task.status IN ('pending', 'running', 'failed', 'dead_letter')\n )`;\n}\n\nfunction hasViableDependency() {\n return or(\n isNull(tasks.dependsOn),\n sql`EXISTS (\n SELECT 1 FROM tasks AS dependency_task\n WHERE dependency_task.id = ${tasks.dependsOn}\n AND dependency_task.cwd IS ${tasks.cwd}\n AND (\n dependency_task.status IN ('pending', 'running', 'done')\n OR (\n dependency_task.status = 'failed'\n AND dependency_task.retry_count <= dependency_task.max_retries\n )\n )\n )`,\n );\n}\n\nfunction blockedDependentsOf(prerequisiteId: number) {\n return sql`${tasks.id} IN (\n WITH RECURSIVE blocked_task(id) AS (\n SELECT direct_dependent.id\n FROM tasks AS direct_dependent\n WHERE direct_dependent.depends_on = ${prerequisiteId}\n AND direct_dependent.status IN ('pending', 'failed')\n AND EXISTS (\n SELECT 1 FROM tasks AS prerequisite\n WHERE prerequisite.id = ${prerequisiteId}\n AND prerequisite.status IN ('dead_letter', 'cancelled')\n )\n UNION\n SELECT descendant.id\n FROM tasks AS descendant\n INNER JOIN blocked_task ON descendant.depends_on = blocked_task.id\n WHERE descendant.status IN ('pending', 'failed')\n )\n SELECT id FROM blocked_task\n )`;\n}\n\nexport class TaskService {\n private static buildScopeWhere(scope?: { cwd?: string }) {\n const conditions: Array<ReturnType<typeof eq>> = [];\n if (scope?.cwd !== undefined) {\n conditions.push(eq(tasks.cwd, scope.cwd));\n }\n return conditions;\n }\n\n static async add(data: NewTask): Promise<Task> {\n const normalizedData = {\n ...data,\n batchId: normalizeTaskBatchId(data.batchId),\n };\n this.validateNewTask(normalizedData);\n return db.transaction((tx) => {\n if (normalizedData.dependsOn != null) {\n const dependency = tx\n .select({\n id: tasks.id,\n cwd: tasks.cwd,\n status: tasks.status,\n retryCount: tasks.retryCount,\n maxRetries: tasks.maxRetries,\n })\n .from(tasks)\n .where(eq(tasks.id, normalizedData.dependsOn))\n .get();\n if (!dependency) {\n throw new Error(`dependsOn 指向的任务 #${normalizedData.dependsOn} 不存在`);\n }\n if ((dependency.cwd ?? null) !== (normalizedData.cwd ?? null)) {\n throw new Error('dependsOn 必须指向同一 cwd 的任务');\n }\n const dependencyIsRecoverable = dependency.status === 'pending'\n || dependency.status === 'running'\n || dependency.status === 'done'\n || (\n dependency.status === 'failed'\n && (dependency.retryCount ?? 0) <= (dependency.maxRetries ?? 3)\n );\n if (!dependencyIsRecoverable) {\n throw new Error(`dependsOn 指向的任务 #${normalizedData.dependsOn} 已进入不可恢复终态`);\n }\n }\n return tx.insert(tasks).values(normalizedData).returning().get();\n }, { behavior: 'immediate' });\n }\n\n static async update(\n id: number,\n data: EditableTaskUpdate,\n scope: { cwd?: string } = {},\n ): Promise<Task | null> {\n if (Object.keys(data).length === 0) throw new Error('至少提供一个要修改的字段');\n const normalizedData: EditableTaskUpdate = data.batchId === undefined\n ? data\n : { ...data, batchId: normalizeTaskBatchId(data.batchId) ?? null };\n return db.transaction((tx) => {\n const task = tx.select().from(tasks).where(and(\n eq(tasks.id, id),\n sql`${tasks.status} IN ('pending', 'failed', 'dead_letter')`,\n ...this.buildScopeWhere(scope),\n )).get();\n if (!task) return null;\n\n this.validateNewTask({\n name: normalizedData.name ?? task.name,\n agent: normalizedData.agent ?? task.agent,\n model: normalizedData.model ?? task.model,\n prompt: normalizedData.prompt ?? task.prompt,\n cwd: task.cwd,\n category: normalizedData.category ?? task.category,\n importance: normalizedData.importance ?? task.importance,\n urgency: normalizedData.urgency ?? task.urgency,\n batchId: normalizedData.batchId === undefined ? task.batchId : normalizedData.batchId,\n maxRetries: normalizedData.maxRetries ?? task.maxRetries,\n retryBackoffMs: normalizedData.retryBackoffMs ?? task.retryBackoffMs,\n timeoutMs: normalizedData.timeoutMs === undefined ? task.timeoutMs : normalizedData.timeoutMs,\n dependsOn: task.dependsOn,\n });\n const maxRetries = normalizedData.maxRetries ?? task.maxRetries ?? 3;\n const exhausted = task.status === 'failed' && (task.retryCount ?? 0) > maxRetries;\n return tx.update(tasks).set({\n ...normalizedData,\n ...(exhausted ? {\n status: 'dead_letter',\n retryAfter: null,\n } : {}),\n }).where(eq(tasks.id, id)).returning().get() ?? null;\n }, { behavior: 'immediate' });\n }\n\n private static validateNewTask(data: NewTask): void {\n if (!data.name.trim()) throw new Error('name 不能为空');\n if (!data.agent.trim()) throw new Error('agent 不能为空');\n if (!data.prompt.trim()) throw new Error('prompt 不能为空');\n validateTaskWorkingDirectory(data.cwd);\n this.validateInteger('importance', data.importance, 1, 5);\n this.validateInteger('urgency', data.urgency, 1, 5);\n this.validateInteger('maxRetries', data.maxRetries, 0, 1000);\n this.validateInteger('retryBackoffMs', data.retryBackoffMs, 0, 86_400_000);\n this.validateInteger('timeoutMs', data.timeoutMs, 1000, 604_800_000);\n this.validateInteger('dependsOn', data.dependsOn, 1, Number.MAX_SAFE_INTEGER);\n }\n\n private static validateInteger(\n name: string,\n value: number | null | undefined,\n min: number,\n max: number,\n ): void {\n if (value === undefined || value === null) return;\n if (!Number.isInteger(value) || value < min || value > max) {\n throw new Error(`${name} 必须是 ${min} 到 ${max} 之间的整数`);\n }\n }\n\n static async next(\n scope: { cwd?: string; excludedBatchIds?: string[] } = {},\n ): Promise<Task | null> {\n const baseConditions = [...this.buildScopeWhere(scope)];\n const nowMs = Date.now();\n const retryAfterFilter = or(\n isNull(tasks.retryAfter),\n sql`${tasks.retryAfter} <= ${nowMs}`,\n );\n\n const excludedBatchIds = [...new Set((scope.excludedBatchIds ?? [])\n .map((batchId) => normalizeTaskBatchId(batchId))\n .filter((batchId): batchId is string => Boolean(batchId)))];\n const hasExcludedBatches = excludedBatchIds.length > 0;\n let batchFilter: ReturnType<typeof sql> | undefined;\n if (hasExcludedBatches) {\n batchFilter = or(\n isNull(tasks.batchId),\n sql`trim(${tasks.batchId}, ${TASK_BATCH_TRIM_CHARACTERS}) = ''`,\n sql`trim(${tasks.batchId}, ${TASK_BATCH_TRIM_CHARACTERS}) NOT IN ${excludedBatchIds}`,\n );\n }\n\n const statusConditions = or(\n and(\n eq(tasks.status, 'pending'),\n retryAfterFilter,\n ),\n and(\n eq(tasks.status, 'failed'),\n sql`${tasks.retryCount} <= ${tasks.maxRetries}`,\n retryAfterFilter,\n ),\n );\n\n const conditions = [\n statusConditions,\n ...baseConditions,\n ];\n if (batchFilter) {\n conditions.push(batchFilter);\n }\n\n const result = await db\n .select()\n .from(tasks)\n .where(and(\n ...conditions,\n or(\n isNull(tasks.dependsOn),\n sql`EXISTS (\n SELECT 1 FROM tasks AS dependency_task\n WHERE dependency_task.id = ${tasks.dependsOn}\n AND dependency_task.status = 'done'\n AND dependency_task.cwd IS ${tasks.cwd}\n )`,\n ),\n or(\n isNull(tasks.batchId),\n sql`trim(${tasks.batchId}, ${TASK_BATCH_TRIM_CHARACTERS}) = ''`,\n sql`NOT EXISTS (\n SELECT 1 FROM tasks AS running_batch_task\n WHERE trim(running_batch_task.batch_id, ${TASK_BATCH_TRIM_CHARACTERS})\n = trim(${tasks.batchId}, ${TASK_BATCH_TRIM_CHARACTERS})\n AND (\n running_batch_task.status = 'running'\n OR EXISTS (\n SELECT 1 FROM task_runs AS running_batch_run\n WHERE running_batch_run.task_id = running_batch_task.id\n AND running_batch_run.status = 'running'\n )\n )\n )`,\n ),\n sql`NOT EXISTS (\n SELECT 1 FROM task_runs AS candidate_active_run\n WHERE candidate_active_run.task_id = ${tasks.id}\n AND candidate_active_run.status = 'running'\n )`,\n ))\n .orderBy(\n desc(tasks.urgency),\n desc(tasks.importance),\n asc(tasks.createdAt),\n asc(tasks.id),\n )\n .limit(1);\n\n return result[0] ?? null;\n }\n\n static async countRunning(\n scope: { cwd?: string; legacyCwd?: boolean; batchId?: string } = {},\n ): Promise<number> {\n const scopeConditions = scope.legacyCwd\n ? [sql`${tasks.cwd} IS NULL OR trim(${tasks.cwd}) = ''`]\n : this.buildScopeWhere(scope);\n if (scope.batchId !== undefined) {\n const batchId = normalizeTaskBatchId(scope.batchId);\n scopeConditions.push(batchId\n ? sql`trim(${tasks.batchId}, ${TASK_BATCH_TRIM_CHARACTERS}) = ${batchId}`\n : sql`0`);\n }\n return db.transaction((tx) => {\n const runningTasks = tx\n .select({ count: sql<number>`count(*)` })\n .from(tasks)\n .where(and(eq(tasks.status, 'running'), ...scopeConditions))\n .get();\n const runsWithoutRunningTask = tx\n .select({ count: sql<number>`count(DISTINCT ${taskRuns.taskId})` })\n .from(taskRuns)\n .innerJoin(tasks, eq(tasks.id, taskRuns.taskId))\n .where(and(\n eq(taskRuns.status, 'running'),\n sql`${tasks.status} <> 'running'`,\n ...scopeConditions,\n ))\n .get();\n return Number(runningTasks?.count ?? 0) + Number(runsWithoutRunningTask?.count ?? 0);\n }, { behavior: 'deferred' });\n }\n\n static async start(id: number, scope: { cwd?: string } = {}): Promise<Task | null> {\n const conditions = [\n eq(tasks.id, id),\n or(\n eq(tasks.status, 'pending'),\n and(\n eq(tasks.status, 'failed'),\n sql`${tasks.retryCount} <= ${tasks.maxRetries}`,\n ),\n ),\n ...this.buildScopeWhere(scope),\n ];\n const result = await db\n .update(tasks)\n .set({\n status: 'running',\n startedAt: new Date(),\n finishedAt: null,\n })\n .where(and(...conditions))\n .returning();\n return result[0] || null;\n }\n\n static async done(\n id: number,\n log?: string,\n scope: { cwd?: string } = {},\n ): Promise<Task | null> {\n const conditions = [\n eq(tasks.id, id),\n eq(tasks.status, 'running'),\n ...this.buildScopeWhere(scope),\n ];\n const result = await db\n .update(tasks)\n .set({\n status: 'done',\n finishedAt: new Date(),\n resultLog: log,\n retryAfter: null,\n })\n .where(and(...conditions))\n .returning();\n return result[0] || null;\n }\n\n static async fail(\n id: number,\n log?: string,\n scope: { cwd?: string } = {},\n options?: { setDeadLetter?: boolean; retryAfterMs?: number },\n ): Promise<Task | null> {\n return db.transaction((tx) => {\n const current = tx\n .select()\n .from(tasks)\n .where(and(\n eq(tasks.id, id),\n eq(tasks.status, 'running'),\n ...this.buildScopeWhere(scope),\n ))\n .get();\n if (!current) return null;\n\n const newRetryCount = (current.retryCount ?? 0) + 1;\n const maxRetries = current.maxRetries ?? 3;\n const isDeadLetter = options?.setDeadLetter ?? newRetryCount > maxRetries;\n const failed = tx\n .update(tasks)\n .set({\n status: isDeadLetter ? 'dead_letter' : 'failed',\n finishedAt: new Date(),\n resultLog: log,\n retryCount: newRetryCount,\n retryAfter: isDeadLetter\n ? null\n : (options?.retryAfterMs ?? Date.now() + computeBackoff(\n newRetryCount,\n current.retryBackoffMs ?? 30000,\n )),\n })\n .where(and(eq(tasks.id, id), eq(tasks.status, 'running')))\n .returning()\n .get();\n if (failed?.status === 'dead_letter') {\n tx.update(tasks)\n .set({\n status: 'dead_letter',\n finishedAt: new Date(),\n retryAfter: null,\n resultLog: `依赖任务 #${id} 已进入不可恢复终态`,\n })\n .where(blockedDependentsOf(id))\n .run();\n }\n return failed ?? null;\n }, { behavior: 'immediate' });\n }\n\n static async completeRun(taskId: number, runId: number, log?: string): Promise<Task | null> {\n return db.transaction((tx) => {\n const currentTask = tx\n .select()\n .from(tasks)\n .where(and(eq(tasks.id, taskId), eq(tasks.status, 'running')))\n .get();\n const currentRun = tx\n .select({ id: taskRuns.id })\n .from(taskRuns)\n .where(and(\n eq(taskRuns.id, runId),\n eq(taskRuns.taskId, taskId),\n eq(taskRuns.status, 'running'),\n ))\n .get();\n if (!currentTask || !currentRun) return null;\n\n const finishedAt = new Date();\n const completed = tx\n .update(tasks)\n .set({\n status: 'done',\n finishedAt,\n resultLog: log,\n retryAfter: null,\n })\n .where(and(eq(tasks.id, taskId), eq(tasks.status, 'running')))\n .returning()\n .get();\n if (!completed) return null;\n\n tx.update(taskRuns)\n .set({ status: 'done', finishedAt, log })\n .where(and(eq(taskRuns.id, runId), eq(taskRuns.status, 'running')))\n .run();\n return completed;\n }, { behavior: 'immediate' });\n }\n\n static async failRun(\n taskId: number,\n runId: number,\n log?: string,\n options?: { setDeadLetter?: boolean; retryAfterMs?: number },\n ): Promise<Task | null> {\n const failed = db.transaction((tx) => {\n const currentTask = tx\n .select()\n .from(tasks)\n .where(and(eq(tasks.id, taskId), eq(tasks.status, 'running')))\n .get();\n const currentRun = tx\n .select({ id: taskRuns.id })\n .from(taskRuns)\n .where(and(\n eq(taskRuns.id, runId),\n eq(taskRuns.taskId, taskId),\n eq(taskRuns.status, 'running'),\n ))\n .get();\n if (!currentTask || !currentRun) return null;\n\n const newRetryCount = (currentTask.retryCount ?? 0) + 1;\n const maxRetries = currentTask.maxRetries ?? 3;\n const isDeadLetter = options?.setDeadLetter ?? newRetryCount > maxRetries;\n const finishedAt = new Date();\n const retryAfter = isDeadLetter\n ? null\n : (options?.retryAfterMs ?? Date.now() + computeBackoff(\n newRetryCount,\n currentTask.retryBackoffMs ?? 30000,\n ));\n\n const failed = tx\n .update(tasks)\n .set({\n status: isDeadLetter ? 'dead_letter' : 'failed',\n finishedAt,\n resultLog: log,\n retryCount: newRetryCount,\n retryAfter,\n })\n .where(and(eq(tasks.id, taskId), eq(tasks.status, 'running')))\n .returning()\n .get();\n if (!failed) return null;\n\n tx.update(taskRuns)\n .set({ status: 'failed', finishedAt, log })\n .where(and(eq(taskRuns.id, runId), eq(taskRuns.status, 'running')))\n .run();\n if (failed.status === 'dead_letter') {\n tx.update(tasks)\n .set({\n status: 'dead_letter',\n finishedAt,\n retryAfter: null,\n resultLog: `依赖任务 #${taskId} 已进入不可恢复终态`,\n })\n .where(blockedDependentsOf(taskId))\n .run();\n }\n return failed;\n }, { behavior: 'immediate' });\n return failed;\n }\n\n static async recoverRun(\n taskId: number,\n runId: number,\n log: string,\n ): Promise<{ status: 'pending' | 'dead_letter'; retryCount: number; retryAfterMs: number | null } | null> {\n const recovery = db.transaction((tx) => {\n const currentTask = tx\n .select()\n .from(tasks)\n .where(and(eq(tasks.id, taskId), eq(tasks.status, 'running')))\n .get();\n const currentRun = tx\n .select({ id: taskRuns.id })\n .from(taskRuns)\n .where(and(\n eq(taskRuns.id, runId),\n eq(taskRuns.taskId, taskId),\n eq(taskRuns.status, 'running'),\n ))\n .get();\n if (!currentRun) return null;\n\n const finishedAt = new Date();\n tx.update(taskRuns)\n .set({ status: 'failed', finishedAt, log })\n .where(and(eq(taskRuns.id, runId), eq(taskRuns.status, 'running')))\n .run();\n\n if (!currentTask) return null;\n const retryCount = (currentTask.retryCount ?? 0) + 1;\n const maxRetries = currentTask.maxRetries ?? 3;\n const isDeadLetter = retryCount > maxRetries;\n const recoveryStatus: 'pending' | 'dead_letter' = isDeadLetter ? 'dead_letter' : 'pending';\n const retryAfterMs = isDeadLetter\n ? null\n : Date.now() + computeBackoff(\n retryCount,\n currentTask.retryBackoffMs ?? 30000,\n );\n\n tx.update(tasks)\n .set({\n status: recoveryStatus,\n startedAt: null,\n finishedAt: isDeadLetter ? finishedAt : null,\n retryCount,\n retryAfter: retryAfterMs,\n resultLog: log,\n })\n .where(and(eq(tasks.id, taskId), eq(tasks.status, 'running')))\n .run();\n if (recoveryStatus === 'dead_letter') {\n tx.update(tasks)\n .set({\n status: 'dead_letter',\n finishedAt,\n retryAfter: null,\n resultLog: `依赖任务 #${taskId} 已进入不可恢复终态`,\n })\n .where(blockedDependentsOf(taskId))\n .run();\n }\n return {\n status: recoveryStatus,\n retryCount,\n retryAfterMs,\n };\n }, { behavior: 'immediate' });\n return recovery;\n }\n\n static async interruptRun(\n taskId: number,\n runId: number,\n log: string,\n ): Promise<boolean> {\n return db.transaction((tx) => {\n const currentRun = tx\n .select({ id: taskRuns.id })\n .from(taskRuns)\n .where(and(\n eq(taskRuns.id, runId),\n eq(taskRuns.taskId, taskId),\n eq(taskRuns.status, 'running'),\n ))\n .get();\n if (!currentRun) return false;\n\n const updatedRun = tx.update(taskRuns)\n .set({ status: 'failed', finishedAt: new Date(), log })\n .where(and(eq(taskRuns.id, runId), eq(taskRuns.status, 'running')))\n .returning({ id: taskRuns.id })\n .get();\n tx.update(tasks)\n .set({\n status: 'pending',\n startedAt: null,\n finishedAt: null,\n retryAfter: null,\n resultLog: log,\n })\n .where(and(eq(tasks.id, taskId), eq(tasks.status, 'running')))\n .run();\n return updatedRun != null;\n }, { behavior: 'immediate' });\n }\n\n static async resolveBlockedDependencies(): Promise<number> {\n const finishedAt = new Date();\n const result = await db\n .update(tasks)\n .set({\n status: 'dead_letter',\n finishedAt,\n retryAfter: null,\n resultLog: '依赖任务不存在、跨项目或已进入不可恢复终态',\n })\n .where(sql`${tasks.id} IN (\n WITH RECURSIVE blocked_task(id) AS (\n SELECT candidate.id\n FROM tasks AS candidate\n WHERE candidate.status IN ('pending', 'failed')\n AND candidate.depends_on IS NOT NULL\n AND NOT EXISTS (\n SELECT 1 FROM tasks AS viable_dependency\n WHERE viable_dependency.id = candidate.depends_on\n AND viable_dependency.cwd IS candidate.cwd\n AND (\n viable_dependency.status IN ('pending', 'running', 'done')\n OR (\n viable_dependency.status = 'failed'\n AND viable_dependency.retry_count <= viable_dependency.max_retries\n )\n )\n )\n UNION\n SELECT descendant.id\n FROM tasks AS descendant\n INNER JOIN blocked_task ON descendant.depends_on = blocked_task.id\n WHERE descendant.status IN ('pending', 'failed')\n )\n SELECT id FROM blocked_task\n )`)\n .returning();\n return result.length;\n }\n\n static async rejectBlockedDependents(prerequisiteId: number): Promise<number> {\n const result = await db\n .update(tasks)\n .set({\n status: 'dead_letter',\n finishedAt: new Date(),\n retryAfter: null,\n resultLog: `依赖任务 #${prerequisiteId} 已进入不可恢复终态`,\n })\n .where(blockedDependentsOf(prerequisiteId))\n .returning({ id: tasks.id });\n return result.length;\n }\n\n static async markPendingForRetry(\n id: number,\n retryAfterMs: number,\n retryCount: number,\n ): Promise<Task | null> {\n const result = await db\n .update(tasks)\n .set({\n status: 'pending',\n startedAt: null,\n finishedAt: null,\n retryAfter: retryAfterMs,\n retryCount,\n })\n .where(eq(tasks.id, id))\n .returning();\n return result[0] || null;\n }\n\n static async markDeadLetter(id: number, retryCount: number): Promise<Task | null> {\n return db.transaction((tx) => {\n const finishedAt = new Date();\n const task = tx\n .update(tasks)\n .set({ status: 'dead_letter', finishedAt, retryCount })\n .where(eq(tasks.id, id))\n .returning()\n .get();\n if (!task) return null;\n tx.update(tasks)\n .set({\n status: 'dead_letter',\n finishedAt,\n retryAfter: null,\n resultLog: `依赖任务 #${id} 已进入不可恢复终态`,\n })\n .where(blockedDependentsOf(id))\n .run();\n return task;\n }, { behavior: 'immediate' });\n }\n\n static async resetRunningToPending(ids: number[]): Promise<number> {\n if (ids.length === 0) return 0;\n const result = await db\n .update(tasks)\n .set({\n status: 'pending',\n startedAt: null,\n finishedAt: null,\n })\n .where(\n and(\n sql`${tasks.id} IN ${ids}`,\n eq(tasks.status, 'running'),\n ),\n )\n .returning();\n return result.length;\n }\n\n static async resetOrphanRunningToPending(): Promise<number> {\n const result = await db\n .update(tasks)\n .set({\n status: 'pending',\n startedAt: null,\n finishedAt: null,\n })\n .where(\n and(\n eq(tasks.status, 'running'),\n sql`NOT EXISTS (\n SELECT 1 FROM ${taskRuns}\n WHERE ${taskRuns.taskId} = ${tasks.id}\n AND ${taskRuns.status} = 'running'\n )`,\n ),\n )\n .returning();\n return result.length;\n }\n\n static async cancel(id: number, scope: { cwd?: string } = {}): Promise<Task | null> {\n const conditions = [\n eq(tasks.id, id),\n or(\n eq(tasks.status, 'pending'),\n eq(tasks.status, 'running'),\n eq(tasks.status, 'failed'),\n ),\n ...this.buildScopeWhere(scope),\n ];\n return db.transaction((tx) => {\n const finishedAt = new Date();\n const task = tx\n .update(tasks)\n .set({\n status: 'cancelled',\n finishedAt,\n retryAfter: null,\n })\n .where(and(...conditions))\n .returning()\n .get();\n if (!task) return null;\n tx.update(tasks)\n .set({\n status: 'dead_letter',\n finishedAt,\n retryAfter: null,\n resultLog: `依赖任务 #${id} 已进入不可恢复终态`,\n })\n .where(blockedDependentsOf(id))\n .run();\n return task;\n }, { behavior: 'immediate' });\n }\n\n static async retry(id: number, scope: { cwd?: string } = {}): Promise<Task | null> {\n const conditions = [\n eq(tasks.id, id),\n or(eq(tasks.status, 'failed'), eq(tasks.status, 'dead_letter')),\n ...this.buildScopeWhere(scope),\n ];\n return db.transaction((tx) => tx\n .update(tasks)\n .set({\n status: 'pending',\n startedAt: null,\n finishedAt: null,\n retryAfter: null,\n retryCount: 0,\n })\n .where(and(...conditions, hasViableDependency()))\n .returning()\n .get() ?? null, { behavior: 'immediate' });\n }\n\n static async retryBatch(batchId: string, scope: { cwd?: string } = {}): Promise<number> {\n const normalizedBatchId = normalizeTaskBatchId(batchId);\n if (!normalizedBatchId) return 0;\n const sqlite = getSqlite();\n const scopeFilter = scope.cwd === undefined ? '' : 'AND candidate.cwd = ?';\n const parameters = scope.cwd === undefined\n ? [TASK_BATCH_TRIM_CHARACTERS, normalizedBatchId]\n : [TASK_BATCH_TRIM_CHARACTERS, normalizedBatchId, scope.cwd];\n\n return db.transaction(() => sqlite.query(`\n WITH RECURSIVE\n candidate(id, cwd, depends_on) AS MATERIALIZED (\n SELECT candidate.id, candidate.cwd, candidate.depends_on\n FROM tasks AS candidate\n WHERE trim(candidate.batch_id, ?) = ?\n AND candidate.status IN ('failed', 'dead_letter')\n ${scopeFilter}\n ),\n retryable(id, cwd, depends_on) AS (\n SELECT candidate.id,\n candidate.cwd,\n candidate.depends_on\n FROM candidate\n WHERE candidate.depends_on IS NULL\n OR (\n NOT EXISTS (\n SELECT 1 FROM candidate AS internal_parent\n WHERE internal_parent.id = candidate.depends_on\n )\n AND EXISTS (\n SELECT 1 FROM tasks AS external_parent\n WHERE external_parent.id = candidate.depends_on\n AND external_parent.cwd IS candidate.cwd\n AND (\n external_parent.status IN ('pending', 'running', 'done')\n OR (\n external_parent.status = 'failed'\n AND external_parent.retry_count <= external_parent.max_retries\n )\n )\n )\n )\n UNION\n SELECT child.id,\n child.cwd,\n child.depends_on\n FROM candidate AS child\n INNER JOIN retryable AS parent\n ON child.depends_on = parent.id\n AND child.cwd IS parent.cwd\n )\n UPDATE tasks\n SET status = 'pending',\n started_at = NULL,\n finished_at = NULL,\n retry_after = NULL,\n retry_count = 0\n WHERE id IN (SELECT id FROM retryable)\n `).run(...parameters).changes, { behavior: 'immediate' });\n }\n\n static async getById(id: number, scope: { cwd?: string } = {}): Promise<Task | null> {\n const conditions = [eq(tasks.id, id), ...this.buildScopeWhere(scope)];\n const result = await db.select().from(tasks).where(and(...conditions));\n return result[0] || null;\n }\n\n static async list(options: {\n status?: TaskStatus;\n activeExecution?: boolean;\n batchId?: string;\n category?: string;\n cwd?: string;\n legacyCwd?: boolean;\n limit?: number;\n offset?: number;\n } = {}): Promise<Task[]> {\n let query = db.select().from(tasks).$dynamic();\n\n const conditions = [];\n if (options.activeExecution) {\n conditions.push(or(\n eq(tasks.status, 'running'),\n sql`EXISTS (\n SELECT 1 FROM task_runs AS active_list_run\n WHERE active_list_run.task_id = ${tasks.id}\n AND active_list_run.status = 'running'\n )`,\n ));\n } else if (options.status) {\n conditions.push(eq(tasks.status, options.status));\n }\n if (options.batchId !== undefined) {\n const batchId = normalizeTaskBatchId(options.batchId);\n conditions.push(batchId\n ? sql`trim(${tasks.batchId}, ${TASK_BATCH_TRIM_CHARACTERS}) = ${batchId}`\n : sql`0`);\n }\n if (options.category) {\n conditions.push(eq(tasks.category, options.category));\n }\n if (options.legacyCwd) {\n conditions.push(sql`${tasks.cwd} IS NULL OR trim(${tasks.cwd}) = ''`);\n } else if (options.cwd !== undefined) {\n conditions.push(eq(tasks.cwd, options.cwd));\n }\n\n if (conditions.length > 0) {\n query = query.where(and(...conditions));\n }\n\n query = query.orderBy(desc(tasks.createdAt), desc(tasks.id));\n\n if (options.limit) {\n query = query.limit(options.limit);\n }\n if (options.offset) {\n query = query.offset(options.offset);\n }\n\n return await query;\n }\n\n static async stats(options: {\n batchId?: string;\n cwd?: string;\n legacyCwd?: boolean;\n } = {}): Promise<Record<string, number>> {\n const conditions = [];\n if (options.batchId !== undefined) {\n const batchId = normalizeTaskBatchId(options.batchId);\n conditions.push(batchId\n ? sql`trim(${tasks.batchId}, ${TASK_BATCH_TRIM_CHARACTERS}) = ${batchId}`\n : sql`0`);\n }\n if (options.legacyCwd) {\n conditions.push(sql`${tasks.cwd} IS NULL OR trim(${tasks.cwd}) = ''`);\n } else if (options.cwd !== undefined) {\n conditions.push(eq(tasks.cwd, options.cwd));\n }\n const whereCondition = conditions.length > 0 ? and(...conditions) : undefined;\n\n const result = await db\n .select({\n status: tasks.status,\n count: sql<number>`count(*)`,\n })\n .from(tasks)\n .where(whereCondition)\n .groupBy(tasks.status);\n\n const stats: Record<string, number> = {\n total: 0,\n pending: 0,\n running: 0,\n done: 0,\n failed: 0,\n dead_letter: 0,\n cancelled: 0,\n };\n\n for (const row of result) {\n if (row.status) {\n stats[row.status] = Number(row.count);\n stats.total += Number(row.count);\n }\n }\n\n return stats;\n }\n\n static async projectSummaries(limit = 100): Promise<TaskProjectSummary[]> {\n this.validateInteger('limit', limit, 1, 1000);\n const lastCreatedAt = sql<number | null>`max(${tasks.createdAt})`;\n const lastTaskId = sql<number>`max(${tasks.id})`;\n const rows = await db\n .select({\n cwd: tasks.cwd,\n total: sql<number>`count(*)`,\n pending: sql<number>`sum(CASE WHEN ${tasks.status} = 'pending' THEN 1 ELSE 0 END)`,\n running: sql<number>`sum(CASE WHEN ${tasks.status} = 'running' OR EXISTS (\n SELECT 1 FROM task_runs AS active_project_run\n WHERE active_project_run.task_id = ${tasks.id}\n AND active_project_run.status = 'running'\n ) THEN 1 ELSE 0 END)`,\n failed: sql<number>`sum(CASE WHEN ${tasks.status} IN ('failed', 'dead_letter') THEN 1 ELSE 0 END)`,\n done: sql<number>`sum(CASE WHEN ${tasks.status} = 'done' THEN 1 ELSE 0 END)`,\n lastCreatedAt,\n })\n .from(tasks)\n .where(sql`${tasks.cwd} IS NOT NULL AND trim(${tasks.cwd}) <> ''`)\n .groupBy(tasks.cwd)\n .orderBy(desc(lastCreatedAt), desc(lastTaskId))\n .limit(limit);\n\n return rows.flatMap((row) => row.cwd === null ? [] : [{\n cwd: row.cwd,\n total: Number(row.total),\n pending: Number(row.pending),\n running: Number(row.running),\n failed: Number(row.failed),\n done: Number(row.done),\n lastCreatedAt: row.lastCreatedAt === null ? null : Number(row.lastCreatedAt) * 1000,\n }]);\n }\n\n static async delete(id: number, scope: { cwd?: string } = {}): Promise<boolean> {\n const conditions = [\n eq(tasks.id, id),\n sql`${tasks.status} <> 'running'`,\n sql`NOT EXISTS (\n SELECT 1 FROM ${taskRuns}\n WHERE ${taskRuns.taskId} = ${tasks.id}\n AND ${taskRuns.status} = 'running'\n )`,\n hasNoExecutableDependents(),\n ...this.buildScopeWhere(scope),\n ];\n const result = await db.delete(tasks).where(and(...conditions)).returning();\n if (result.length > 0) {\n // 正式 Schema 使用 ON DELETE CASCADE;测试库未启用外键,仍需显式收敛关联记录。\n await db.delete(taskRuns).where(eq(taskRuns.taskId, id));\n return true;\n }\n\n if (!await this.getById(id, scope)) return false;\n\n const dependent = await db\n .select({ id: tasks.id })\n .from(tasks)\n .where(and(\n eq(tasks.dependsOn, id),\n sql`${tasks.status} IN ('pending', 'running', 'failed', 'dead_letter')`,\n ))\n .orderBy(asc(tasks.id))\n .limit(1);\n if (dependent[0]) {\n throw new TaskDeletionConflictError(\n `任务 #${id} 仍被可执行任务 #${dependent[0].id} 依赖,请先处理依赖任务`,\n );\n }\n throw new TaskDeletionConflictError(\n `任务 #${id} 正在运行,请先取消任务并等待执行进程退出`,\n );\n }\n\n static async deleteOlderThan(\n retentionDays: number,\n shouldStop: () => boolean = () => false,\n ): Promise<number> {\n const cutoffSec = Math.floor(Date.now() / 1000) - retentionDays * 86400;\n const batchSize = 500;\n const sqlite = getSqlite();\n cleanupInvocation += 1;\n const candidateTable = `cleanup_candidates_${process.pid}_${cleanupInvocation}`;\n let deletedTotal = 0;\n\n sqlite.exec(`\n CREATE TEMP TABLE ${candidateTable} (\n id INTEGER NOT NULL PRIMARY KEY\n ) WITHOUT ROWID;\n `);\n try {\n let ceilingId: number | null = null;\n while (true) {\n if (shouldStop()) return deletedTotal;\n const batch = db.transaction(() => {\n sqlite.query(`DELETE FROM ${candidateTable}`).run();\n const ceilingPredicate = ceilingId == null\n ? ''\n : 'AND candidate.id < ?';\n const rawCandidateStatement = sqlite.query(`\n INSERT INTO ${candidateTable}(id)\n SELECT candidate.id\n FROM tasks AS candidate NOT INDEXED\n WHERE candidate.status IN ('done', 'dead_letter', 'cancelled')\n AND candidate.finished_at IS NOT NULL\n AND candidate.finished_at < ?\n ${ceilingPredicate}\n AND NOT EXISTS (\n SELECT 1 FROM task_runs AS active_run\n WHERE active_run.task_id = candidate.id\n AND active_run.status = 'running'\n )\n ORDER BY candidate.id DESC\n LIMIT ?\n `);\n const rawCount = ceilingId == null\n ? rawCandidateStatement.run(cutoffSec, batchSize).changes\n : rawCandidateStatement.run(cutoffSec, ceilingId, batchSize).changes;\n if (rawCount === 0) return { deleted: 0, nextCeilingId: null };\n const rawPage = sqlite.query(`\n SELECT min(id) AS nextCeilingId FROM ${candidateTable}\n `).get() as { nextCeilingId: number };\n\n // 正常依赖边总是 child.id > parent.id。反向边或自环说明数据异常,\n // 先保留该节点,再通过下面的叶到根剪枝保留整个受影响祖先链。\n sqlite.query(`\n DELETE FROM ${candidateTable}\n WHERE EXISTS (\n SELECT 1 FROM tasks AS anomalous\n WHERE anomalous.id = ${candidateTable}.id\n AND anomalous.depends_on IS NOT NULL\n AND anomalous.depends_on >= anomalous.id\n )\n `).run();\n\n while (true) {\n const pruned = sqlite.query(`\n DELETE FROM ${candidateTable}\n WHERE EXISTS (\n SELECT 1 FROM tasks AS dependent_task\n WHERE dependent_task.depends_on = ${candidateTable}.id\n AND NOT EXISTS (\n SELECT 1 FROM ${candidateTable} AS selected_dependent\n WHERE selected_dependent.id = dependent_task.id\n )\n )\n `).run().changes;\n if (pruned === 0) break;\n }\n\n const selected = sqlite.query(`\n SELECT count(*) AS count FROM ${candidateTable}\n `).get() as { count: number };\n if (selected.count === 0) {\n return { deleted: 0, nextCeilingId: rawPage.nextCeilingId };\n }\n\n sqlite.query(`\n DELETE FROM tasks\n WHERE id IN (SELECT id FROM ${candidateTable})\n `).run();\n const remaining = sqlite.query(`\n SELECT count(*) AS count\n FROM tasks\n WHERE id IN (SELECT id FROM ${candidateTable})\n `).get() as { count: number };\n if (remaining.count !== 0) {\n throw new Error('历史清理候选在同一写事务内发生漂移,已回滚本批删除');\n }\n return { deleted: selected.count, nextCeilingId: rawPage.nextCeilingId };\n }, { behavior: 'immediate' });\n if (batch.nextCeilingId == null) break;\n ceilingId = batch.nextCeilingId;\n deletedTotal += batch.deleted;\n\n await Bun.sleep(0);\n if (shouldStop()) return deletedTotal;\n }\n return deletedTotal;\n } finally {\n sqlite.exec(`DROP TABLE IF EXISTS ${candidateTable}`);\n }\n }\n}\n","import { spawnSync } from 'child_process';\nimport { fileURLToPath } from 'url';\nimport { basename, dirname, resolve } from 'path';\nimport {\n isLaunchIdentity,\n LAUNCH_IDENTITY_ARGUMENT,\n TOKEN_GUARDIAN_LAUNCH_PROTOCOL,\n} from '@core/launch-protocol';\n\ninterface ProcessInfo {\n processGroupId: number;\n command: string;\n}\n\nconst OS_COMMAND_TIMEOUT_MS = 2_000;\n\nexport type RecordedProcessSignalResult =\n | 'signalled'\n | 'not-running'\n | 'identity-mismatch'\n | 'inspect-failed'\n | 'signal-failed';\n\nexport type GatewayProcessIdentity = 'match' | 'mismatch' | 'unknown' | 'not-running';\nexport type SpawnedProcessTreePresence = 'running' | 'not-running' | 'unknown';\n\nfunction isSafePid(pid: number): boolean {\n return Number.isInteger(pid) && pid > 1 && pid !== process.pid;\n}\n\nfunction absentLeaderResult(pid: number): RecordedProcessSignalResult {\n return inspectSpawnedProcessTreePresence(pid) === 'not-running'\n ? 'not-running'\n : 'inspect-failed';\n}\n\nexport function isProcessAlive(pid: number): boolean {\n if (!Number.isInteger(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return error instanceof Error && 'code' in error && error.code === 'EPERM';\n }\n}\n\nexport function isSpawnedProcessTreeAlive(pid: number): boolean {\n return inspectSpawnedProcessTreePresence(pid) === 'running';\n}\n\nexport function inspectSpawnedProcessTreePresence(pid: number): SpawnedProcessTreePresence {\n if (!Number.isInteger(pid) || pid <= 0) return 'unknown';\n if (process.platform === 'win32') {\n const processIds = inspectWindowsProcessTree(pid);\n if (processIds == null) return 'unknown';\n return processIds.length > 0 ? 'running' : 'not-running';\n }\n try {\n process.kill(-pid, 0);\n return 'running';\n } catch (error) {\n if (!(error instanceof Error) || !('code' in error)) return 'unknown';\n if (error.code === 'EPERM') return 'running';\n if (error.code === 'ESRCH') return 'not-running';\n return 'unknown';\n }\n}\n\nfunction inspectUnixProcess(pid: number): ProcessInfo | null {\n const result = spawnSync('ps', ['-o', 'pgid=', '-o', 'command=', '-p', String(pid)], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: OS_COMMAND_TIMEOUT_MS,\n killSignal: 'SIGKILL',\n });\n if (result.status !== 0) return null;\n const match = result.stdout.trim().match(/^(\\d+)\\s+(.+)$/s);\n if (!match) return null;\n return { processGroupId: Number(match[1]), command: match[2] };\n}\n\nfunction inspectWindowsCommand(pid: number): string | null {\n const script = `(Get-CimInstance Win32_Process -Filter \"ProcessId = ${pid}\").CommandLine`;\n const result = spawnSync(\n 'powershell.exe',\n ['-NoProfile', '-NonInteractive', '-Command', script],\n {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: OS_COMMAND_TIMEOUT_MS,\n killSignal: 'SIGKILL',\n },\n );\n if (result.status !== 0) return null;\n return result.stdout.trim() || null;\n}\n\nfunction inspectWindowsProcessTree(rootPid: number): number[] | null {\n const script = `$root=${rootPid}; $all=@(Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId); $ids=New-Object 'System.Collections.Generic.HashSet[int]'; [void]$ids.Add($root); do { $added=$false; foreach($p in $all) { if($ids.Contains([int]$p.ParentProcessId) -and $ids.Add([int]$p.ProcessId)) { $added=$true } } } while($added); $all | Where-Object { $ids.Contains([int]$_.ProcessId) } | Select-Object -ExpandProperty ProcessId`;\n const result = spawnSync(\n 'powershell.exe',\n ['-NoProfile', '-NonInteractive', '-Command', script],\n {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: OS_COMMAND_TIMEOUT_MS,\n killSignal: 'SIGKILL',\n },\n );\n if (result.status !== 0) return null;\n return result.stdout\n .split(/\\s+/)\n .filter(Boolean)\n .map(Number)\n .filter((pid) => Number.isInteger(pid) && pid > 0);\n}\n\nfunction executableName(value: string): string {\n return basename(value).trim().toLowerCase().replace(/\\.(?:exe|cmd|bat)$/i, '');\n}\n\nfunction commandTokens(command: string): string[] {\n return command\n .trim()\n .split(/\\s+/)\n .map((token) => token.replace(/^[\"']|[\"']$/g, ''));\n}\n\nfunction openCodeArgsMatch(args: string[]): boolean {\n const agentIndex = args.indexOf('--agent');\n const formatIndex = args.indexOf('--format');\n return args[0] === 'run'\n && agentIndex >= 0\n && Boolean(args[agentIndex + 1])\n && formatIndex >= 0\n && args[formatIndex + 1] === 'json';\n}\n\nfunction guardianLauncherPath(): string {\n const extension = import.meta.url.endsWith('.ts') ? 'ts' : 'js';\n return resolve(dirname(fileURLToPath(import.meta.url)), `../worker/launcher.${extension}`)\n .replaceAll('\\\\', '/');\n}\n\nfunction commandMatches(\n command: string,\n expectedExecutable: string,\n launchProtocol: string | null,\n expectedLaunchIdentity: string | null,\n): boolean {\n const expectedName = executableName(expectedExecutable);\n if (!expectedName) return false;\n const tokens = commandTokens(command);\n\n if (launchProtocol === TOKEN_GUARDIAN_LAUNCH_PROTOCOL) {\n if (!isLaunchIdentity(expectedLaunchIdentity)) return false;\n const expectedLauncher = guardianLauncherPath();\n const launcherIndex = tokens.findIndex((token, index) => (\n index > 0\n && index <= 3\n && token.replaceAll('\\\\', '/') === expectedLauncher\n ));\n if (launcherIndex < 0) return false;\n\n const runtimeName = executableName(process.execPath);\n const hasRuntime = tokens.slice(0, launcherIndex).some((token) => (\n executableName(token) === runtimeName || executableName(token) === 'bun'\n ));\n const identityArgumentIndex = launcherIndex + 1;\n const launchIdentityIndex = launcherIndex + 2;\n const executableIndex = launcherIndex + 3;\n return hasRuntime\n && tokens[identityArgumentIndex] === LAUNCH_IDENTITY_ARGUMENT\n && tokens[launchIdentityIndex] === expectedLaunchIdentity\n && executableName(tokens[executableIndex] ?? '') === expectedName\n && openCodeArgsMatch(tokens.slice(executableIndex + 1));\n }\n if (launchProtocol != null) return false;\n\n const executableIndex = tokens.findIndex((token, index) => (\n index <= 3 && executableName(token) === expectedName\n ));\n if (executableIndex < 0) return false;\n return openCodeArgsMatch(tokens.slice(executableIndex + 1, executableIndex + 12));\n}\n\nexport function identifyGatewayProcess(pid: number): GatewayProcessIdentity {\n if (!isProcessAlive(pid)) return 'not-running';\n const command = process.platform === 'win32'\n ? inspectWindowsCommand(pid)\n : inspectUnixProcess(pid)?.command ?? null;\n if (!command) return 'unknown';\n\n const tokens = command\n .trim()\n .split(/\\s+/)\n .map((token) => token.replace(/^['\"]|['\"]$/g, '').replaceAll('\\\\', '/'));\n const runtimeName = executableName(process.execPath);\n const hasRuntime = tokens.slice(0, 4).some((token) => (\n executableName(token) === runtimeName || executableName(token) === 'bun'\n ));\n const hasGatewayEntry = tokens.some((token) => /(?:^|\\/)gateway\\/index\\.(?:js|ts)$/.test(token));\n const cliEntryIndex = tokens.findIndex((token) => /(?:^|\\/)cli\\/index\\.(?:js|ts)$/.test(token));\n const hasCliGatewayCommand = cliEntryIndex >= 0\n && tokens.slice(cliEntryIndex + 1).includes('gateway');\n const supertaskIndex = tokens.findIndex((token, index) => (\n index <= 3 && executableName(token) === 'supertask'\n ));\n const hasBinGatewayCommand = supertaskIndex >= 0 && tokens[supertaskIndex + 1] === 'gateway';\n return hasRuntime && (hasGatewayEntry || hasCliGatewayCommand || hasBinGatewayCommand)\n ? 'match'\n : 'mismatch';\n}\n\nexport function signalSpawnedProcessTree(pid: number, signal: NodeJS.Signals): boolean {\n if (!isSafePid(pid)) return false;\n\n if (process.platform === 'win32') {\n const args = ['/PID', String(pid), '/T'];\n if (signal === 'SIGKILL') args.push('/F');\n const status = spawnSync('taskkill', args, {\n stdio: 'ignore',\n timeout: OS_COMMAND_TIMEOUT_MS,\n killSignal: 'SIGKILL',\n }).status;\n return status === 0 || !isSpawnedProcessTreeAlive(pid);\n }\n\n try {\n process.kill(-pid, signal);\n return true;\n } catch {\n }\n\n try {\n process.kill(pid, signal);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function signalRecordedProcessTree(\n pid: number,\n signal: NodeJS.Signals,\n expectedExecutable: string,\n launchProtocol: string | null = null,\n expectedLaunchIdentity: string | null = null,\n): boolean {\n return signalRecordedProcessTreeWithResult(\n pid,\n signal,\n expectedExecutable,\n launchProtocol,\n expectedLaunchIdentity,\n ) === 'signalled';\n}\n\nexport function signalRecordedProcessTreeWithResult(\n pid: number,\n signal: NodeJS.Signals,\n expectedExecutable: string,\n launchProtocol: string | null = null,\n expectedLaunchIdentity: string | null = null,\n): RecordedProcessSignalResult {\n if (!isSafePid(pid)) return 'identity-mismatch';\n if (!isProcessAlive(pid)) return absentLeaderResult(pid);\n\n if (process.platform === 'win32') {\n const command = inspectWindowsCommand(pid);\n if (!command) return isProcessAlive(pid) ? 'inspect-failed' : absentLeaderResult(pid);\n if (!commandMatches(\n command,\n expectedExecutable,\n launchProtocol,\n expectedLaunchIdentity,\n )) {\n return 'identity-mismatch';\n }\n const args = ['/PID', String(pid), '/T'];\n if (signal === 'SIGKILL') args.push('/F');\n const status = spawnSync('taskkill', args, {\n stdio: 'ignore',\n timeout: OS_COMMAND_TIMEOUT_MS,\n killSignal: 'SIGKILL',\n }).status;\n if (status === 0) return 'signalled';\n return isProcessAlive(pid) ? 'signal-failed' : absentLeaderResult(pid);\n }\n\n const info = inspectUnixProcess(pid);\n if (!info) return isProcessAlive(pid) ? 'inspect-failed' : absentLeaderResult(pid);\n if (!commandMatches(\n info.command,\n expectedExecutable,\n launchProtocol,\n expectedLaunchIdentity,\n )) {\n return 'identity-mismatch';\n }\n\n try {\n if (info.processGroupId === pid) process.kill(-pid, signal);\n else process.kill(pid, signal);\n return 'signalled';\n } catch {\n return isProcessAlive(pid) ? 'signal-failed' : absentLeaderResult(pid);\n }\n}\n\nexport async function waitForProcessExit(pid: number, timeoutMs = 5_000): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (isProcessAlive(pid) && Date.now() < deadline) {\n await Bun.sleep(Math.min(50, deadline - Date.now()));\n }\n return !isProcessAlive(pid);\n}\n\nexport async function waitForSpawnedProcessTreeExit(\n pid: number,\n timeoutMs = 5_000,\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (inspectSpawnedProcessTreePresence(pid) !== 'not-running' && Date.now() < deadline) {\n await Bun.sleep(Math.min(50, deadline - Date.now()));\n }\n return inspectSpawnedProcessTreePresence(pid) === 'not-running';\n}\n","export const LEGACY_GUARDIAN_LAUNCH_PROTOCOL = 'gated-v2-guardian';\nexport const TOKEN_GUARDIAN_LAUNCH_PROTOCOL = 'gated-v3-token-guardian';\nexport const LAUNCH_IDENTITY_ARGUMENT = '--supertask-launch-identity';\nexport const DRAIN_PROOF_MESSAGE_TYPE = 'supertask-drained';\nexport const DRAIN_PROOF_ACK_MESSAGE_TYPE = 'supertask-drained-ack';\nexport const MANAGED_RUN_ENV = 'SUPERTASK_MANAGED_RUN';\nexport const MANAGED_RUN_ENV_VALUE = '1';\n\nexport function isLaunchIdentity(value: string | null | undefined): value is string {\n return value != null\n && /^gateway-[1-9]\\d*:launch:[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n}\n\nexport function drainProofForIdentity(launchIdentity: string) {\n return { type: DRAIN_PROOF_MESSAGE_TYPE, identity: launchIdentity } as const;\n}\n\nexport function drainProofAckForIdentity(launchIdentity: string) {\n return { type: DRAIN_PROOF_ACK_MESSAGE_TYPE, identity: launchIdentity } as const;\n}\n\nexport function isMatchingDrainProof(message: unknown, launchIdentity: string): boolean {\n if (typeof message !== 'object' || message == null) return false;\n const candidate = message as Record<string, unknown>;\n return candidate.type === DRAIN_PROOF_MESSAGE_TYPE\n && candidate.identity === launchIdentity;\n}\n\nexport function isMatchingDrainProofAck(message: unknown, launchIdentity: string): boolean {\n if (typeof message !== 'object' || message == null) return false;\n const candidate = message as Record<string, unknown>;\n return candidate.type === DRAIN_PROOF_ACK_MESSAGE_TYPE\n && candidate.identity === launchIdentity;\n}\n","import { db, schema } from '@core/db';\nimport { eq, desc, and, inArray } from 'drizzle-orm';\nimport type { TaskRun, NewTaskRun } from '@core/db/schema';\nimport { isProcessAlive } from '@core/process-control';\n\nconst { tasks, taskRuns } = schema;\n\nexport interface StaleRunInfo {\n runId: number;\n taskId: number;\n childPid: number | null;\n workerPid: number | null;\n launchProtocol: string | null;\n lockedBy: string | null;\n taskRetryCount: number;\n taskMaxRetries: number;\n taskRetryBackoffMs: number;\n taskStatus: string | null;\n taskCwd: string | null;\n ownerAlive: boolean;\n}\n\nexport interface LegacyQuarantinedRun {\n runId: number;\n taskId: number;\n taskStatus: string | null;\n taskCwd: string | null;\n workerPid: number | null;\n ownerAlive: boolean;\n}\n\nexport interface AbandonedLegacyRun {\n runId: number;\n taskId: number;\n runStatus: 'failed';\n taskStatus: 'cancelled';\n}\n\nexport class LegacyRunAbandonConflictError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'LegacyRunAbandonConflictError';\n }\n}\n\nexport class TaskRunService {\n static async create(data: NewTaskRun): Promise<TaskRun> {\n const result = await db.insert(taskRuns).values(data).returning();\n return result[0];\n }\n\n static async updateSessionId(id: number, sessionId: string): Promise<TaskRun | null> {\n const result = await db\n .update(taskRuns)\n .set({ sessionId })\n .where(and(eq(taskRuns.id, id), eq(taskRuns.status, 'running')))\n .returning();\n return result[0] || null;\n }\n\n static async done(id: number, log?: string): Promise<TaskRun | null> {\n const result = await db\n .update(taskRuns)\n .set({\n status: 'done',\n finishedAt: new Date(),\n log,\n })\n .where(and(eq(taskRuns.id, id), eq(taskRuns.status, 'running')))\n .returning();\n return result[0] || null;\n }\n\n static async fail(id: number, log?: string): Promise<TaskRun | null> {\n const result = await db\n .update(taskRuns)\n .set({\n status: 'failed',\n finishedAt: new Date(),\n log,\n })\n .where(and(eq(taskRuns.id, id), eq(taskRuns.status, 'running')))\n .returning();\n return result[0] || null;\n }\n\n static async heartbeat(id: number): Promise<TaskRun | null> {\n const result = await db\n .update(taskRuns)\n .set({ heartbeatAt: Date.now() })\n .where(and(eq(taskRuns.id, id), eq(taskRuns.status, 'running')))\n .returning();\n return result[0] || null;\n }\n\n static async updatePid(\n id: number,\n workerPid: number,\n childPid: number,\n lockedBy = `gateway-${process.pid}`,\n ): Promise<TaskRun | null> {\n const result = await db\n .update(taskRuns)\n .set({\n workerPid,\n childPid,\n lockedAt: Date.now(),\n lockedBy,\n })\n .where(and(eq(taskRuns.id, id), eq(taskRuns.status, 'running')))\n .returning();\n return result[0] || null;\n }\n\n static async getById(id: number): Promise<TaskRun | null> {\n const result = await db.select().from(taskRuns).where(eq(taskRuns.id, id));\n return result[0] || null;\n }\n\n static async listByTaskId(taskId: number): Promise<TaskRun[]> {\n return await db\n .select()\n .from(taskRuns)\n .where(eq(taskRuns.taskId, taskId))\n .orderBy(desc(taskRuns.startedAt), desc(taskRuns.id));\n }\n\n static async getLatestByTaskId(taskId: number): Promise<TaskRun | null> {\n const result = await db\n .select()\n .from(taskRuns)\n .where(eq(taskRuns.taskId, taskId))\n .orderBy(desc(taskRuns.startedAt), desc(taskRuns.id))\n .limit(1);\n return result[0] || null;\n }\n\n static async getLatestByTaskIds(taskIds: number[]): Promise<Map<number, TaskRun>> {\n if (taskIds.length === 0) return new Map();\n\n const latestRuns = await db\n .select()\n .from(taskRuns)\n .where(inArray(taskRuns.taskId, taskIds))\n .orderBy(desc(taskRuns.startedAt), desc(taskRuns.id));\n\n const result = new Map<number, TaskRun>();\n for (const run of latestRuns) {\n if (!result.has(run.taskId)) {\n result.set(run.taskId, run);\n }\n }\n return result;\n }\n\n static async getStaleRuns(heartbeatTimeoutMs: number): Promise<StaleRunInfo[]> {\n const cutoffMs = Date.now() - heartbeatTimeoutMs;\n const { tasks: tasksTable } = schema;\n const result = await db\n .select({\n runId: taskRuns.id,\n taskId: taskRuns.taskId,\n childPid: taskRuns.childPid,\n workerPid: taskRuns.workerPid,\n launchProtocol: taskRuns.launchProtocol,\n lockedBy: taskRuns.lockedBy,\n startedAt: taskRuns.startedAt,\n heartbeatAt: taskRuns.heartbeatAt,\n taskRetryCount: tasksTable.retryCount,\n taskMaxRetries: tasksTable.maxRetries,\n taskRetryBackoffMs: tasksTable.retryBackoffMs,\n taskStatus: tasksTable.status,\n taskCwd: tasksTable.cwd,\n })\n .from(taskRuns)\n .innerJoin(tasksTable, eq(taskRuns.taskId, tasksTable.id))\n .where(eq(taskRuns.status, 'running'));\n return result.filter((row) => {\n const heartbeatExpired = row.heartbeatAt == null\n ? row.startedAt == null || row.startedAt.getTime() < cutoffMs\n : row.heartbeatAt < cutoffMs;\n const ownerExited = row.workerPid != null\n && row.workerPid > 0\n && !isProcessAlive(row.workerPid);\n return heartbeatExpired || ownerExited;\n }).map((row) => ({\n runId: row.runId,\n taskId: row.taskId,\n childPid: row.childPid,\n workerPid: row.workerPid,\n launchProtocol: row.launchProtocol,\n lockedBy: row.lockedBy,\n taskRetryCount: row.taskRetryCount ?? 0,\n taskMaxRetries: row.taskMaxRetries ?? 3,\n taskRetryBackoffMs: row.taskRetryBackoffMs ?? 30000,\n taskStatus: row.taskStatus,\n taskCwd: row.taskCwd,\n ownerAlive: row.workerPid != null\n && row.workerPid > 0\n && isProcessAlive(row.workerPid),\n }));\n }\n\n static async listLegacyQuarantinedRuns(\n heartbeatTimeoutMs = 0,\n ): Promise<LegacyQuarantinedRun[]> {\n const staleRuns = await this.getStaleRuns(heartbeatTimeoutMs);\n return staleRuns\n .filter((row) => row.launchProtocol == null\n && row.childPid == null\n )\n .map((row) => ({\n runId: row.runId,\n taskId: row.taskId,\n taskStatus: row.taskStatus,\n taskCwd: row.taskCwd,\n workerPid: row.workerPid,\n ownerAlive: row.ownerAlive,\n }));\n }\n\n static async abandonLegacyRun(runId: number): Promise<AbandonedLegacyRun | null> {\n return db.transaction((tx) => {\n const current = tx\n .select({\n runId: taskRuns.id,\n taskId: taskRuns.taskId,\n runStatus: taskRuns.status,\n taskStatus: tasks.status,\n workerPid: taskRuns.workerPid,\n childPid: taskRuns.childPid,\n launchProtocol: taskRuns.launchProtocol,\n log: taskRuns.log,\n })\n .from(taskRuns)\n .innerJoin(tasks, eq(taskRuns.taskId, tasks.id))\n .where(eq(taskRuns.id, runId))\n .get();\n if (!current) return null;\n if (current.runStatus !== 'running') {\n throw new LegacyRunAbandonConflictError(`run #${runId} 已不是 running 状态`);\n }\n if (current.launchProtocol != null) {\n throw new LegacyRunAbandonConflictError(\n `run #${runId} 使用未知或受管协议 ${current.launchProtocol},禁止人工 abandon`,\n );\n }\n if (current.childPid != null) {\n throw new LegacyRunAbandonConflictError(\n `run #${runId} 已记录 child PID ${current.childPid},必须由 Worker/Watchdog 确认进程树退出`,\n );\n }\n if (current.workerPid != null && isProcessAlive(current.workerPid)) {\n throw new LegacyRunAbandonConflictError(\n `run #${runId} 的 owner PID ${current.workerPid} 仍存活`,\n );\n }\n if (current.taskStatus !== 'cancelled') {\n throw new LegacyRunAbandonConflictError(\n `任务 #${current.taskId} 必须先取消并保持 cancelled 状态`,\n );\n }\n\n const note = '操作员已确认旧版无 PID 执行不存在,并通过 run abandon 关闭隔离记录';\n const updated = tx\n .update(taskRuns)\n .set({\n status: 'failed',\n finishedAt: new Date(),\n log: current.log ? `${current.log}\\n${note}` : note,\n })\n .where(and(eq(taskRuns.id, runId), eq(taskRuns.status, 'running')))\n .returning({ id: taskRuns.id })\n .get();\n if (!updated) {\n throw new LegacyRunAbandonConflictError(`run #${runId} 状态已被其他操作改变`);\n }\n return {\n runId,\n taskId: current.taskId,\n runStatus: 'failed',\n taskStatus: 'cancelled',\n };\n }, { behavior: 'immediate' });\n }\n\n static async getRunningRunByTaskId(taskId: number): Promise<TaskRun | null> {\n const result = await db\n .select()\n .from(taskRuns)\n .where(and(eq(taskRuns.taskId, taskId), eq(taskRuns.status, 'running')))\n .orderBy(desc(taskRuns.startedAt), desc(taskRuns.id))\n .limit(1);\n return result[0] || null;\n }\n\n static async deleteByTaskIds(taskIds: number[]): Promise<number> {\n if (taskIds.length === 0) return 0;\n const result = await db\n .delete(taskRuns)\n .where(inArray(taskRuns.taskId, taskIds))\n .returning();\n return result.length;\n }\n\n static async getAllRunningRuns(): Promise<TaskRun[]> {\n return await db\n .select()\n .from(taskRuns)\n .where(eq(taskRuns.status, 'running'));\n }\n}\n","import { TaskService } from '@core/services/task.service';\nimport { TaskRunService } from '@core/services/task-run.service';\nimport { spawn, type ChildProcess } from 'child_process';\nimport type { GatewayConfig } from '@gateway/config';\nimport type { Task } from '@core/db/schema';\nimport {\n markGatewayActivity,\n markGatewayFailure,\n markGatewaySuccess,\n} from '@gateway/health';\nimport {\n inspectSpawnedProcessTreePresence,\n signalRecordedProcessTreeWithResult,\n waitForSpawnedProcessTreeExit,\n} from '@core/process-control';\nimport { fileURLToPath } from 'url';\nimport { existsSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { randomUUID } from 'crypto';\nimport {\n drainProofAckForIdentity,\n isMatchingDrainProof,\n LAUNCH_IDENTITY_ARGUMENT,\n MANAGED_RUN_ENV,\n MANAGED_RUN_ENV_VALUE,\n TOKEN_GUARDIAN_LAUNCH_PROTOCOL,\n} from '@core/launch-protocol';\nimport { validateTaskWorkingDirectory } from '@core/task-working-directory';\nimport { normalizeTaskBatchId } from '@core/task-batch';\n\nconst DEFAULT_MAX_OUTPUT_CHARS = 64 * 1024;\nconst FORBIDDEN_AGENT = 'supertask-runner';\n\ninterface WorkerEngineOptions {\n opencodeBin?: string;\n maxOutputChars?: number;\n}\n\ninterface TaskTermination {\n kind: 'cancel' | 'failure' | 'shutdown';\n message: string;\n}\n\ninterface RunningTask {\n task: Task;\n runId: number;\n launchIdentity: string;\n child: ChildProcess;\n output: string;\n sessionId: string | null;\n timeoutTimer: ReturnType<typeof setTimeout> | null;\n termination: TaskTermination | null;\n terminationPromise: Promise<boolean> | null;\n settlementPromise: Promise<boolean> | null;\n guardianDrained: boolean;\n quarantined: boolean;\n settled: boolean;\n}\n\nexport interface InterruptedTaskRun {\n taskId: number;\n runId: number;\n}\n\nexport function assertWorkerProcessIsolationSupported(\n platform: NodeJS.Platform = process.platform,\n): void {\n if (platform === 'win32') {\n throw new Error(\n 'Windows Worker 已安全禁用:当前运行时无法用 Job Object 证明整个 OpenCode 进程树已退出',\n );\n }\n}\n\nexport class WorkerEngine {\n private activeBatchIds = new Set<string>();\n private runningTasks = new Map<number, RunningTask>();\n private stopped = false;\n private pollTimer: ReturnType<typeof setTimeout> | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private pollCyclePromise: Promise<void> | null = null;\n private cfg: GatewayConfig['worker'];\n private opencodeBin: string;\n private maxOutputChars: number;\n\n constructor(cfg: GatewayConfig, options: WorkerEngineOptions = {}) {\n this.cfg = cfg.worker;\n this.opencodeBin = options.opencodeBin ?? process.env.SUPERTASK_OPENCODE_BIN ?? 'opencode';\n this.maxOutputChars = options.maxOutputChars ?? DEFAULT_MAX_OUTPUT_CHARS;\n }\n\n start() {\n assertWorkerProcessIsolationSupported();\n this.stopped = false;\n markGatewayActivity('worker');\n this.poll();\n this.heartbeatTimer = setInterval(() => {\n this.runDetached(this.updateHeartbeats(), 'worker heartbeat cycle failed');\n }, this.cfg.heartbeatIntervalMs);\n }\n\n async stop(gracePeriodMs = 0): Promise<InterruptedTaskRun[]> {\n this.stopped = true;\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n\n if (this.pollCyclePromise) await this.pollCyclePromise;\n\n if (gracePeriodMs > 0 && this.runningTasks.size > 0) {\n const deadline = Date.now() + gracePeriodMs;\n while (this.runningTasks.size > 0 && Date.now() < deadline) {\n await Bun.sleep(Math.min(50, deadline - Date.now()));\n }\n }\n\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n const interrupted: InterruptedTaskRun[] = [];\n const entries = [...this.runningTasks.values()];\n await Promise.all(entries.map(async (entry) => {\n if (entry.settled) {\n if (entry.settlementPromise) await entry.settlementPromise;\n return;\n }\n\n const termination = entry.termination ?? {\n kind: 'shutdown' as const,\n message: 'Gateway shutdown',\n };\n const terminated = await this.terminateEntry(entry, termination);\n if (terminated && termination.kind === 'shutdown') {\n interrupted.push({ taskId: entry.task.id, runId: entry.runId });\n }\n }));\n return interrupted;\n }\n\n getRunningTaskIds(): number[] {\n return [...this.runningTasks.keys()];\n }\n\n getRunningCount(): number {\n return this.runningTasks.size;\n }\n\n ownsRun(taskId: number, runId: number): boolean {\n return this.runningTasks.get(taskId)?.runId === runId;\n }\n\n private poll() {\n if (this.stopped) return;\n markGatewayActivity('worker');\n\n this.pollCyclePromise = this.tryDispatch()\n .then((healthy) => {\n if (healthy) markGatewaySuccess('worker');\n })\n .catch((err) => {\n markGatewayFailure('worker', err);\n this.logError('worker poll failed', err);\n })\n .finally(() => {\n this.pollCyclePromise = null;\n if (this.stopped) return;\n this.pollTimer = setTimeout(() => this.poll(), this.cfg.pollIntervalMs);\n });\n }\n\n private async tryDispatch(): Promise<boolean> {\n await TaskService.resetOrphanRunningToPending();\n await this.reconcileCancelledTasks();\n await this.reconcileQuarantinedTasks();\n\n const quarantined = [...this.runningTasks.values()].filter((entry) => entry.quarantined);\n if (quarantined.length > 0) {\n return false;\n }\n\n while (!this.stopped && this.runningTasks.size < this.cfg.maxConcurrency) {\n const databaseRunningCount = await TaskService.countRunning();\n if (databaseRunningCount >= this.cfg.maxConcurrency) break;\n\n let task: Task | null;\n try {\n task = await TaskService.next({ excludedBatchIds: [...this.activeBatchIds] });\n } catch (err) {\n this.logError('task claim failed', err);\n throw err;\n }\n if (!task) break;\n if (this.stopped) break;\n\n if (!await TaskService.start(task.id)) continue;\n const batchId = normalizeTaskBatchId(task.batchId);\n if (batchId) this.activeBatchIds.add(batchId);\n\n if (this.stopped) {\n await TaskService.resetRunningToPending([task.id]);\n this.releaseBatch(task);\n break;\n }\n\n let runId: number | null = null;\n try {\n const launchIdentity = `gateway-${process.pid}:launch:${randomUUID()}`;\n const run = await TaskRunService.create({\n taskId: task.id,\n model: this.resolveModel(task.model),\n status: 'running',\n workerPid: process.pid,\n lockedAt: Date.now(),\n lockedBy: launchIdentity,\n launchProtocol: TOKEN_GUARDIAN_LAUNCH_PROTOCOL,\n });\n runId = run.id;\n\n if (this.stopped) {\n await TaskRunService.fail(run.id, 'Gateway shutdown before spawn');\n await TaskService.resetRunningToPending([task.id]);\n this.releaseBatch(task);\n break;\n }\n\n if (task.agent === FORBIDDEN_AGENT) {\n const message = `禁止执行递归 Agent: ${FORBIDDEN_AGENT}`;\n await TaskService.failRun(task.id, run.id, message, { setDeadLetter: true });\n this.releaseBatch(task);\n continue;\n }\n\n try {\n validateTaskWorkingDirectory(task.cwd);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await TaskService.failRun(task.id, run.id, message, { setDeadLetter: true });\n this.releaseBatch(task);\n continue;\n }\n\n await this.spawnTask(task, run.id, launchIdentity);\n } catch (err) {\n this.releaseBatch(task);\n const message = `Worker 启动任务失败:${err instanceof Error ? err.message : String(err)}`;\n try {\n if (runId == null) {\n await TaskService.fail(task.id, message);\n } else {\n const failed = await TaskService.failRun(task.id, runId, message);\n if (!failed) {\n await TaskRunService.fail(runId, `${message}\\n任务状态已被其他操作改变`);\n }\n }\n } catch (failErr) {\n this.logError('failed to compensate task startup', failErr, task.id);\n }\n this.logError('task dispatch failed', err, task.id);\n }\n }\n return ![...this.runningTasks.values()].some((entry) => entry.quarantined);\n }\n\n private launcherEntry(): string {\n const extension = import.meta.url.endsWith('.ts') ? 'ts' : 'js';\n const moduleDir = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n join(moduleDir, `launcher.${extension}`),\n join(moduleDir, `../worker/launcher.${extension}`),\n ];\n const entry = candidates.find((candidate) => existsSync(candidate));\n if (!entry) throw new Error(`Worker launcher 不存在:${candidates.join(', ')}`);\n return entry;\n }\n\n private async spawnTask(task: Task, runId: number, launchIdentity: string): Promise<void> {\n const model = this.resolveModel(task.model);\n const args = ['run', '--agent', task.agent, '--format', 'json'];\n if (model) args.push('-m', model);\n args.push(task.prompt);\n\n const child = spawn(process.execPath, [\n this.launcherEntry(),\n LAUNCH_IDENTITY_ARGUMENT,\n launchIdentity,\n this.opencodeBin,\n ...args,\n ], {\n cwd: task.cwd || process.cwd(),\n env: {\n ...process.env,\n [MANAGED_RUN_ENV]: MANAGED_RUN_ENV_VALUE,\n },\n stdio: ['pipe', 'pipe', 'pipe', 'ipc'],\n detached: process.platform !== 'win32',\n });\n const entry: RunningTask = {\n task,\n runId,\n launchIdentity,\n child,\n output: '',\n sessionId: null,\n timeoutTimer: null,\n termination: null,\n terminationPromise: null,\n settlementPromise: null,\n guardianDrained: false,\n quarantined: false,\n settled: false,\n };\n this.runningTasks.set(task.id, entry);\n\n const handleData = (data: Buffer) => {\n const text = data.toString();\n entry.output = (entry.output + text).slice(-this.maxOutputChars);\n\n const match = entry.output.match(/\"sessionID\"\\s*:\\s*\"(ses_[^\"]+)\"/);\n if (match?.[1] && match[1] !== entry.sessionId) {\n entry.sessionId = match[1];\n TaskRunService.updateSessionId(runId, match[1]).catch((err) => {\n this.logError('sessionId update failed', err, task.id);\n });\n }\n };\n child.stdout?.on('data', handleData);\n child.stderr?.on('data', handleData);\n child.on('message', (message: unknown) => {\n if (isMatchingDrainProof(message, entry.launchIdentity)) {\n entry.guardianDrained = true;\n try {\n child.send(drainProofAckForIdentity(entry.launchIdentity));\n } catch (error) {\n this.logError('drain proof acknowledgment failed', error, task.id);\n }\n }\n });\n let spawnError: Error | null = null;\n const spawned = new Promise<void>((resolve, reject) => {\n child.once('spawn', resolve);\n child.once('error', (error) => {\n spawnError = error;\n reject(error);\n });\n });\n child.once('close', (code, signal) => {\n this.handleChildClose(entry, code, signal, spawnError);\n });\n\n try {\n await spawned;\n } catch (error) {\n entry.settled = true;\n this.runningTasks.delete(task.id);\n this.releaseBatch(task);\n throw error;\n }\n\n const childPid = child.pid;\n if (!childPid) {\n entry.settled = true;\n this.runningTasks.delete(task.id);\n this.releaseBatch(task);\n throw new Error('launcher 未返回 PID');\n }\n\n let pidRecorded = false;\n try {\n pidRecorded = await TaskRunService.updatePid(\n runId,\n process.pid,\n childPid,\n launchIdentity,\n ) !== null;\n } catch (error) {\n await this.terminateForFailure(\n entry,\n `记录 Worker PID 失败:${error instanceof Error ? error.message : String(error)}`,\n );\n return;\n }\n if (!pidRecorded) {\n await this.terminateForFailure(entry, '记录 Worker PID 失败:run 已不再处于 running 状态');\n return;\n }\n\n if (!child.stdin) {\n await this.terminateForFailure(entry, '放行 OpenCode 失败:launcher stdin 不可用');\n return;\n }\n try {\n await new Promise<void>((resolve, reject) => {\n child.stdin!.end('START\\n', (error?: Error | null) => {\n if (error) reject(error);\n else resolve();\n });\n });\n } catch (error) {\n await this.terminateForFailure(\n entry,\n `放行 OpenCode 失败:${error instanceof Error ? error.message : String(error)}`,\n );\n return;\n }\n\n const timeoutMs = task.timeoutMs ?? this.cfg.taskTimeoutMs;\n if (timeoutMs > 0) {\n entry.timeoutTimer = setTimeout(() => {\n this.runDetached(\n this.terminateForFailure(entry, `任务超时(${timeoutMs}ms)`, 'SIGKILL'),\n 'timeout termination failed',\n entry.task.id,\n );\n }, timeoutMs);\n }\n }\n\n private handleChildClose(\n entry: RunningTask,\n code: number | null,\n signal: NodeJS.Signals | null,\n spawnError: Error | null,\n ): void {\n if (entry.settled || entry.termination) return;\n\n if (!entry.guardianDrained) {\n const pid = entry.child.pid;\n const presence = pid == null\n ? spawnError == null ? 'unknown' : 'not-running'\n : inspectSpawnedProcessTreePresence(pid);\n const message = 'guardian 未提供进程树排空证明';\n if (presence !== 'not-running') {\n if (entry.timeoutTimer) {\n clearTimeout(entry.timeoutTimer);\n entry.timeoutTimer = null;\n }\n entry.termination = { kind: 'failure', message };\n entry.quarantined = true;\n markGatewayFailure(\n 'worker',\n new Error(`${message};任务 #${entry.task.id} 保持隔离`),\n );\n return;\n }\n this.runDetached(\n this.settleEntry(entry, null, message),\n 'task settlement failed',\n entry.task.id,\n );\n return;\n }\n\n const failure = code === 0\n ? undefined\n : `${spawnError ? '无法启动 opencode' : 'opencode 退出码'} ${spawnError?.message ?? code ?? 'null'}${signal ? `,信号 ${signal}` : ''}`;\n this.runDetached(\n this.settleEntry(entry, code, failure),\n 'task settlement failed',\n entry.task.id,\n );\n }\n\n private settleEntry(\n entry: RunningTask,\n code: number | null,\n failure?: string,\n ): Promise<boolean> {\n if (entry.settlementPromise) return entry.settlementPromise;\n if (entry.settled) return Promise.resolve(false);\n entry.settled = true;\n if (entry.timeoutTimer) {\n clearTimeout(entry.timeoutTimer);\n entry.timeoutTimer = null;\n }\n\n const settlement = this.commitEntry(entry, code, failure)\n .then(() => true)\n .catch((error) => {\n markGatewayFailure('worker', error);\n this.logError('task settlement failed', error, entry.task.id);\n return false;\n })\n .finally(() => {\n this.runningTasks.delete(entry.task.id);\n this.releaseBatch(entry.task);\n });\n entry.settlementPromise = settlement;\n return settlement;\n }\n\n private async commitEntry(\n entry: RunningTask,\n code: number | null,\n failure?: string,\n ): Promise<void> {\n const termination = entry.termination;\n if (termination?.kind === 'shutdown') return;\n\n if (termination?.kind === 'cancel') {\n const output = entry.output.trim();\n const log = `${termination.message}${output ? `\\n${output}` : ''}`;\n await TaskRunService.fail(entry.runId, log);\n console.log(JSON.stringify({\n ts: new Date().toISOString(),\n level: 'info',\n msg: 'running task cancelled',\n taskId: entry.task.id,\n }));\n return;\n }\n\n const currentRun = await TaskRunService.getById(entry.runId);\n if (!currentRun || currentRun.status !== 'running') return;\n\n const output = entry.output.trim();\n const log = failure\n ? `${failure}${output ? `\\n${output}` : ''}`\n : output;\n\n if (code === 0 && !failure) {\n const completed = await TaskService.completeRun(entry.task.id, entry.runId, log);\n if (completed) {\n console.log(JSON.stringify({\n ts: new Date().toISOString(),\n level: 'info',\n msg: 'task done',\n taskId: entry.task.id,\n }));\n return;\n }\n\n await TaskRunService.fail(entry.runId, '任务或执行记录状态已被其他操作改变');\n return;\n }\n\n const failed = await TaskService.failRun(entry.task.id, entry.runId, log);\n if (!failed) {\n await TaskRunService.fail(\n entry.runId,\n `${log}${log ? '\\n' : ''}任务状态已被其他操作改变`,\n );\n this.logError('task failure state transition rejected', failure ?? 'unknown failure', entry.task.id);\n }\n console.error(JSON.stringify({\n ts: new Date().toISOString(),\n level: 'error',\n msg: 'task failed',\n taskId: entry.task.id,\n error: failure,\n }));\n }\n\n private async reconcileCancelledTasks() {\n for (const entry of [...this.runningTasks.values()]) {\n try {\n const task = await TaskService.getById(entry.task.id);\n if (task?.status === 'cancelled') await this.cancelEntry(entry);\n } catch (err) {\n this.logError('cancel reconciliation failed', err, entry.task.id);\n }\n }\n }\n\n private async reconcileQuarantinedTasks() {\n for (const entry of [...this.runningTasks.values()]) {\n if (!entry.quarantined || !entry.termination) continue;\n await this.terminateEntry(entry, entry.termination);\n }\n }\n\n private async cancelEntry(entry: RunningTask) {\n await this.terminateEntry(entry, { kind: 'cancel', message: '任务已取消' });\n }\n\n private async updateHeartbeats() {\n for (const entry of this.runningTasks.values()) {\n if (entry.quarantined) continue;\n try {\n await TaskRunService.heartbeat(entry.runId);\n } catch (err) {\n this.logError('heartbeat update failed', err, entry.task.id);\n }\n }\n }\n\n private async terminateForFailure(\n entry: RunningTask,\n message: string,\n initialSignal: NodeJS.Signals = 'SIGTERM',\n ): Promise<boolean> {\n return this.terminateEntry(entry, { kind: 'failure', message }, initialSignal);\n }\n\n private terminateEntry(\n entry: RunningTask,\n termination: TaskTermination,\n initialSignal: NodeJS.Signals = 'SIGTERM',\n ): Promise<boolean> {\n if (entry.terminationPromise) return entry.terminationPromise;\n if (entry.settled) return entry.settlementPromise ?? Promise.resolve(false);\n\n entry.termination ??= termination;\n if (entry.timeoutTimer) {\n clearTimeout(entry.timeoutTimer);\n entry.timeoutTimer = null;\n }\n entry.quarantined = true;\n\n const terminationPromise = this.completeTermination(entry, initialSignal)\n .finally(() => {\n if (!entry.settled && entry.terminationPromise === terminationPromise) {\n entry.terminationPromise = null;\n }\n });\n entry.terminationPromise = terminationPromise;\n return terminationPromise;\n }\n\n private async completeTermination(\n entry: RunningTask,\n initialSignal: NodeJS.Signals,\n ): Promise<boolean> {\n const termination = entry.termination;\n if (!termination) return false;\n\n try {\n const exited = await this.killEntry(entry, initialSignal);\n if (!exited) {\n markGatewayFailure(\n 'worker',\n new Error(`${termination.message};任务 #${entry.task.id} 的进程无法确认退出`),\n );\n return false;\n }\n entry.quarantined = false;\n return await this.settleEntry(\n entry,\n null,\n termination.kind === 'failure' ? termination.message : undefined,\n );\n } catch (error) {\n markGatewayFailure('worker', error);\n this.logError('task termination failed', error, entry.task.id);\n return false;\n }\n }\n\n private async killEntry(\n entry: RunningTask,\n initialSignal: NodeJS.Signals = 'SIGTERM',\n ): Promise<boolean> {\n // 只有绑定当前 run 身份的独立 IPC 证明才能把 guardian 退出视为整组排空。\n if (entry.guardianDrained\n && (entry.child.exitCode !== null || entry.child.signalCode !== null)) return true;\n const pid = entry.child.pid;\n if (!pid) return false;\n\n const initialResult = this.signalEntry(entry, initialSignal);\n if (initialResult === 'not-running') return true;\n if (initialResult !== 'signalled') return false;\n if (await waitForSpawnedProcessTreeExit(pid, 2_500)) return true;\n if (initialSignal === 'SIGKILL') return false;\n if (entry.guardianDrained\n && (entry.child.exitCode !== null || entry.child.signalCode !== null)) return true;\n\n const forcedResult = this.signalEntry(entry, 'SIGKILL');\n if (forcedResult === 'not-running') return true;\n if (forcedResult !== 'signalled') return false;\n return waitForSpawnedProcessTreeExit(pid, 2_500);\n }\n\n private signalEntry(entry: RunningTask, signal: NodeJS.Signals) {\n const pid = entry.child.pid;\n if (!pid) return 'not-running' as const;\n\n return signalRecordedProcessTreeWithResult(\n pid,\n signal,\n this.opencodeBin,\n TOKEN_GUARDIAN_LAUNCH_PROTOCOL,\n entry.launchIdentity,\n );\n }\n\n private releaseBatch(task: Task) {\n const batchId = normalizeTaskBatchId(task.batchId);\n if (batchId) this.activeBatchIds.delete(batchId);\n }\n\n private resolveModel(taskModel: string | null): string | null {\n if (!taskModel || taskModel === 'default') return null;\n return taskModel;\n }\n\n private runDetached(operation: Promise<unknown>, message: string, taskId?: number): void {\n operation.catch((error) => {\n markGatewayFailure('worker', error);\n this.logError(message, error, taskId);\n });\n }\n\n private logError(message: string, error: unknown, taskId?: number) {\n console.error(JSON.stringify({\n ts: new Date().toISOString(),\n level: 'error',\n msg: message,\n taskId,\n error: error instanceof Error ? error.message : String(error),\n }));\n }\n}\n","import { sqlite } from '@core/db';\n\nconst LOCK_STALE_MS = 30_000;\n\ntype GatewayComponent = 'worker' | 'scheduler' | 'watchdog' | 'watchdogCleanup';\n\ninterface GatewayHealthConfig {\n workerPollIntervalMs: number;\n schedulerEnabled: boolean;\n schedulerCheckIntervalMs: number;\n watchdogCheckIntervalMs: number;\n watchdogCleanupIntervalMs: number;\n}\n\ninterface HealthState {\n startedAt: number;\n config: GatewayHealthConfig;\n lastActivityAt: Record<GatewayComponent, number>;\n lastSuccessAt: Record<GatewayComponent, number>;\n consecutiveFailures: Record<GatewayComponent, number>;\n lastError: Record<GatewayComponent, { at: number; message: string } | null>;\n}\n\nlet state: HealthState | null = null;\n\nexport function initializeGatewayHealth(config: GatewayHealthConfig): void {\n const now = Date.now();\n state = {\n startedAt: now,\n config,\n lastActivityAt: {\n worker: now,\n scheduler: now,\n watchdog: now,\n watchdogCleanup: now,\n },\n lastSuccessAt: {\n worker: now,\n scheduler: now,\n watchdog: now,\n watchdogCleanup: now,\n },\n consecutiveFailures: {\n worker: 0,\n scheduler: 0,\n watchdog: 0,\n watchdogCleanup: 0,\n },\n lastError: {\n worker: null,\n scheduler: null,\n watchdog: null,\n watchdogCleanup: null,\n },\n };\n}\n\nexport function markGatewayActivity(component: GatewayComponent): void {\n if (state) state.lastActivityAt[component] = Date.now();\n}\n\nexport function markGatewaySuccess(component: GatewayComponent): void {\n if (!state) return;\n const now = Date.now();\n state.lastActivityAt[component] = now;\n state.lastSuccessAt[component] = now;\n state.consecutiveFailures[component] = 0;\n}\n\nexport function markGatewayFailure(component: GatewayComponent, error: unknown): void {\n if (!state) return;\n const now = Date.now();\n state.lastActivityAt[component] = now;\n state.consecutiveFailures[component] += 1;\n state.lastError[component] = {\n at: now,\n message: error instanceof Error ? error.message : String(error),\n };\n}\n\nexport function resetGatewayHealth(): void {\n state = null;\n}\n\nfunction componentStatus(\n component: GatewayComponent,\n enabled: boolean,\n maxAgeMs: number,\n now: number,\n) {\n const lastActivityAt = state?.lastActivityAt[component] ?? null;\n const ageMs = lastActivityAt == null ? null : Math.max(0, now - lastActivityAt);\n const consecutiveFailures = state?.consecutiveFailures[component] ?? 0;\n return {\n enabled,\n healthy: !enabled || (\n ageMs != null\n && ageMs <= maxAgeMs\n && consecutiveFailures === 0\n ),\n lastActivityAt,\n lastSuccessAt: state?.lastSuccessAt[component] ?? null,\n consecutiveFailures,\n lastError: state?.lastError[component] ?? null,\n ageMs,\n maxAgeMs,\n };\n}\n\nexport function getGatewayHealth(now = Date.now()) {\n const worker = componentStatus(\n 'worker',\n true,\n Math.max((state?.config.workerPollIntervalMs ?? 1000) * 5, 5000),\n now,\n );\n const scheduler = componentStatus(\n 'scheduler',\n state?.config.schedulerEnabled ?? false,\n Math.max((state?.config.schedulerCheckIntervalMs ?? 1000) * 5, 5000),\n now,\n );\n const watchdog = componentStatus(\n 'watchdog',\n true,\n Math.max((state?.config.watchdogCheckIntervalMs ?? 60_000) * 3, 5000),\n now,\n );\n const watchdogCleanup = componentStatus(\n 'watchdogCleanup',\n true,\n Math.max((state?.config.watchdogCleanupIntervalMs ?? 86_400_000) * 2, 60_000),\n now,\n );\n\n let lock: {\n pid: number | null;\n heartbeatAt: number | null;\n readyAt: number | null;\n ageMs: number | null;\n healthy: boolean;\n } = { pid: null, heartbeatAt: null, readyAt: null, ageMs: null, healthy: false };\n\n try {\n const row = sqlite.prepare(\n 'SELECT pid, heartbeat_at, ready_at FROM gateway_lock WHERE id = 1',\n ).get() as { pid: number; heartbeat_at: number; ready_at: number | null } | undefined;\n if (row) {\n const ageMs = Math.max(0, now - row.heartbeat_at);\n lock = {\n pid: row.pid,\n heartbeatAt: row.heartbeat_at,\n readyAt: row.ready_at,\n ageMs,\n healthy: row.pid === process.pid && row.ready_at != null && ageMs < LOCK_STALE_MS,\n };\n }\n } catch {\n }\n\n const healthy = state != null\n && lock.healthy\n && worker.healthy\n && scheduler.healthy\n && watchdog.healthy\n && watchdogCleanup.healthy;\n\n return {\n status: healthy ? 'ok' as const : 'degraded' as const,\n pid: process.pid,\n uptimeMs: state ? Math.max(0, now - state.startedAt) : 0,\n lock,\n components: { worker, scheduler, watchdog, watchdogCleanup },\n };\n}\n"],"mappings":"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","names":["Database","value","startFrom","ref","actions","sql","otel","rawTracer","param","sql","join","placeholder","name","SQL","name","result","index","relations","ForeignKeyBuilder","ForeignKey","uniqueKeyName","UniqueConstraintBuilder","UniqueConstraint","UniqueOnConstraintBuilder","uniqueKeyName","ref","actions","ForeignKeyBuilder","uniqueKeyName","InlineForeignKeys","name","index","table","select","sql","joinOn","field","join","join","sql","db","instance","drizzle","db","Database","tasks","taskRuns","failed","sqlite","fileURLToPath","dirname","dirname","fileURLToPath","index","executableIndex","tasks","taskRuns","fileURLToPath","existsSync","dirname","join","dirname","fileURLToPath","join","existsSync","text","resolve","output","log"]}
1
+ {"version":3,"sources":["../../src/core/db/index.ts","../../node_modules/src/bun-sqlite/driver.ts","../../node_modules/src/entity.ts","../../node_modules/src/logger.ts","../../node_modules/src/table.utils.ts","../../node_modules/src/table.ts","../../node_modules/src/column.ts","../../node_modules/src/column-builder.ts","../../node_modules/src/pg-core/foreign-keys.ts","../../node_modules/src/tracing-utils.ts","../../node_modules/src/pg-core/unique-constraint.ts","../../node_modules/src/pg-core/utils/array.ts","../../node_modules/src/pg-core/columns/common.ts","../../node_modules/src/pg-core/columns/enum.ts","../../node_modules/src/subquery.ts","../../node_modules/drizzle-orm/version.js","../../node_modules/src/tracing.ts","../../node_modules/src/view-common.ts","../../node_modules/src/sql/sql.ts","../../node_modules/src/utils.ts","../../node_modules/src/pg-core/table.ts","../../node_modules/src/pg-core/primary-keys.ts","../../node_modules/src/sql/expressions/conditions.ts","../../node_modules/src/sql/expressions/select.ts","../../node_modules/src/relations.ts","../../node_modules/src/alias.ts","../../node_modules/src/selection-proxy.ts","../../node_modules/src/query-promise.ts","../../node_modules/src/sqlite-core/foreign-keys.ts","../../node_modules/src/sqlite-core/unique-constraint.ts","../../node_modules/src/sqlite-core/columns/common.ts","../../node_modules/src/sqlite-core/columns/blob.ts","../../node_modules/src/sqlite-core/columns/custom.ts","../../node_modules/src/sqlite-core/columns/integer.ts","../../node_modules/src/sqlite-core/columns/numeric.ts","../../node_modules/src/sqlite-core/columns/real.ts","../../node_modules/src/sqlite-core/columns/text.ts","../../node_modules/src/sqlite-core/columns/all.ts","../../node_modules/src/sqlite-core/table.ts","../../node_modules/src/sqlite-core/query-builders/delete.ts","../../node_modules/src/casing.ts","../../node_modules/src/errors.ts","../../node_modules/src/sqlite-core/view-base.ts","../../node_modules/src/sqlite-core/dialect.ts","../../node_modules/src/query-builders/query-builder.ts","../../node_modules/src/sqlite-core/query-builders/select.ts","../../node_modules/src/sqlite-core/query-builders/query-builder.ts","../../node_modules/src/sqlite-core/query-builders/insert.ts","../../node_modules/src/sqlite-core/query-builders/update.ts","../../node_modules/src/sqlite-core/query-builders/count.ts","../../node_modules/src/sqlite-core/query-builders/query.ts","../../node_modules/src/sqlite-core/query-builders/raw.ts","../../node_modules/src/sqlite-core/db.ts","../../node_modules/src/sqlite-core/indexes.ts","../../node_modules/src/sqlite-core/session.ts","../../node_modules/src/bun-sqlite/session.ts","../../node_modules/src/migrator.ts","../../node_modules/src/bun-sqlite/migrator.ts","../../src/core/db/schema.ts","../../src/core/backoff.ts","../../src/core/task-working-directory.ts","../../src/core/task-batch.ts","../../src/core/services/task.service.ts","../../src/core/process-control.ts","../../src/core/launch-protocol.ts","../../src/core/services/task-run.service.ts","../../src/worker/index.ts","../../src/gateway/health.ts"],"sourcesContent":["import { Database } from 'bun:sqlite';\nimport { drizzle } from 'drizzle-orm/bun-sqlite';\nimport { migrate } from 'drizzle-orm/bun-sqlite/migrator';\nimport * as schema from './schema';\nimport { existsSync, mkdirSync } from 'fs';\nimport { homedir } from 'os';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst DEFAULT_DB_PATH = join(homedir(), '.local/share/opencode/tasks.db');\nexport const DB_FILE_PATH = process.env.SUPERTASK_DB_PATH || DEFAULT_DB_PATH;\nexport { schema };\n\nlet _sqlite: Database | null = null;\nlet _db: ReturnType<typeof drizzle> | null = null;\nlet _migrationRan = false;\n\nfunction getMigrationsFolder(): string {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n let dir = __dirname;\n for (let i = 0; i < 5; i++) {\n const candidate = join(dir, 'drizzle', 'meta', '_journal.json');\n if (existsSync(candidate)) {\n return join(dir, 'drizzle');\n }\n dir = dirname(dir);\n }\n return join(__dirname, '../../drizzle');\n}\n\nfunction ensureGatewayLock(sqliteDb: Database): void {\n sqliteDb.exec(`\n CREATE TABLE IF NOT EXISTS gateway_lock (\n id INTEGER PRIMARY KEY CHECK (id = 1),\n pid INTEGER NOT NULL,\n acquired_at INTEGER NOT NULL,\n heartbeat_at INTEGER NOT NULL,\n ready_at INTEGER,\n version TEXT\n );\n `);\n const columns = sqliteDb.query('PRAGMA table_info(gateway_lock)').all() as Array<{ name: string }>;\n if (!columns.some((column) => column.name === 'ready_at')) {\n sqliteDb.exec('ALTER TABLE gateway_lock ADD COLUMN ready_at INTEGER;');\n }\n if (!columns.some((column) => column.name === 'version')) {\n sqliteDb.exec('ALTER TABLE gateway_lock ADD COLUMN version TEXT;');\n }\n}\n\nexport function migrateSqliteDatabase(sqliteDb: Database): ReturnType<typeof drizzle> {\n ensureGatewayLock(sqliteDb);\n const drizzleDb = drizzle(sqliteDb, { schema });\n migrate(drizzleDb, { migrationsFolder: getMigrationsFolder() });\n sqliteDb.exec('PRAGMA foreign_keys = ON;');\n const violations = sqliteDb.query('PRAGMA foreign_key_check;').all();\n if (violations.length > 0) {\n throw new Error(`检测到 ${violations.length} 条孤立关联记录,请先修复数据再启动`);\n }\n return drizzleDb;\n}\n\nfunction initDb() {\n const dataDir = dirname(DB_FILE_PATH);\n if (!existsSync(dataDir)) {\n mkdirSync(dataDir, { recursive: true });\n }\n _sqlite = new Database(DB_FILE_PATH);\n _sqlite.exec('PRAGMA journal_mode = WAL;');\n _sqlite.exec('PRAGMA busy_timeout = 5000;');\n if (!_migrationRan) {\n try {\n _db = migrateSqliteDatabase(_sqlite);\n _migrationRan = true;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n _migrationRan = false;\n _sqlite.close();\n _sqlite = null;\n _db = null;\n console.error(`[supertask] migration failed: ${msg}`);\n throw new Error(`[supertask] DB migration failed: ${msg}`);\n }\n } else {\n _db = drizzle(_sqlite, { schema });\n }\n\n return _db;\n}\n\nexport function getDb() {\n if (!_db) initDb();\n return _db!;\n}\n\nexport function getSqlite() {\n if (!_sqlite) initDb();\n return _sqlite!;\n}\n\nexport function closeDb() {\n if (_sqlite) {\n _sqlite.close();\n _sqlite = null;\n _db = null;\n _migrationRan = false;\n }\n}\n\nexport const db = new Proxy({} as ReturnType<typeof drizzle>, {\n get(_, prop) {\n const target = getDb();\n const value = Reflect.get(target, prop);\n if (typeof value === 'function') return value.bind(target);\n return value;\n },\n});\n\nexport const sqlite = new Proxy({} as Database, {\n get(_, prop) {\n const target = getSqlite();\n const value = Reflect.get(target, prop);\n if (typeof value === 'function') return value.bind(target);\n return value;\n },\n});\n","/// <reference types=\"bun-types\" />\n\nimport { Database } from 'bun:sqlite';\nimport { entityKind } from '~/entity.ts';\nimport { DefaultLogger } from '~/logger.ts';\nimport {\n\tcreateTableRelationsHelpers,\n\textractTablesRelationalConfig,\n\ttype RelationalSchemaConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { BaseSQLiteDatabase } from '~/sqlite-core/db.ts';\nimport { SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport { type DrizzleConfig, isConfig } from '~/utils.ts';\nimport { SQLiteBunSession } from './session.ts';\n\nexport class BunSQLiteDatabase<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n> extends BaseSQLiteDatabase<'sync', void, TSchema> {\n\tstatic override readonly [entityKind]: string = 'BunSQLiteDatabase';\n}\n\ntype DrizzleBunSqliteDatabaseOptions = {\n\t/**\n\t * Open the database as read-only (no write operations, no create).\n\t *\n\t * Equivalent to {@link constants.SQLITE_OPEN_READONLY}\n\t */\n\treadonly?: boolean;\n\t/**\n\t * Allow creating a new database\n\t *\n\t * Equivalent to {@link constants.SQLITE_OPEN_CREATE}\n\t */\n\tcreate?: boolean;\n\t/**\n\t * Open the database as read-write\n\t *\n\t * Equivalent to {@link constants.SQLITE_OPEN_READWRITE}\n\t */\n\treadwrite?: boolean;\n};\n\nexport type DrizzleBunSqliteDatabaseConfig =\n\t| ({\n\t\tsource?: string;\n\t} & DrizzleBunSqliteDatabaseOptions)\n\t| string\n\t| undefined;\n\nfunction construct<TSchema extends Record<string, unknown> = Record<string, never>>(\n\tclient: Database,\n\tconfig: DrizzleConfig<TSchema> = {},\n): BunSQLiteDatabase<TSchema> & {\n\t$client: Database;\n} {\n\tconst dialect = new SQLiteSyncDialect({ casing: config.casing });\n\tlet logger;\n\tif (config.logger === true) {\n\t\tlogger = new DefaultLogger();\n\t} else if (config.logger !== false) {\n\t\tlogger = config.logger;\n\t}\n\n\tlet schema: RelationalSchemaConfig<TablesRelationalConfig> | undefined;\n\tif (config.schema) {\n\t\tconst tablesConfig = extractTablesRelationalConfig(\n\t\t\tconfig.schema,\n\t\t\tcreateTableRelationsHelpers,\n\t\t);\n\t\tschema = {\n\t\t\tfullSchema: config.schema,\n\t\t\tschema: tablesConfig.tables,\n\t\t\ttableNamesMap: tablesConfig.tableNamesMap,\n\t\t};\n\t}\n\n\tconst session = new SQLiteBunSession(client, dialect, schema, { logger });\n\tconst db = new BunSQLiteDatabase('sync', dialect, session, schema) as BunSQLiteDatabase<TSchema>;\n\t(<any> db).$client = client;\n\n\treturn db as any;\n}\n\nexport function drizzle<\n\tTSchema extends Record<string, unknown> = Record<string, never>,\n\tTClient extends Database = Database,\n>(\n\t...params:\n\t\t| []\n\t\t| [\n\t\t\tTClient | string,\n\t\t]\n\t\t| [\n\t\t\tTClient | string,\n\t\t\tDrizzleConfig<TSchema>,\n\t\t]\n\t\t| [\n\t\t\t(\n\t\t\t\t& DrizzleConfig<TSchema>\n\t\t\t\t& ({\n\t\t\t\t\tconnection?: DrizzleBunSqliteDatabaseConfig;\n\t\t\t\t} | {\n\t\t\t\t\tclient: TClient;\n\t\t\t\t})\n\t\t\t),\n\t\t]\n): BunSQLiteDatabase<TSchema> & {\n\t$client: TClient;\n} {\n\tif (params[0] === undefined || typeof params[0] === 'string') {\n\t\tconst instance = params[0] === undefined ? new Database() : new Database(params[0]);\n\n\t\treturn construct(instance, params[1]) as any;\n\t}\n\n\tif (isConfig(params[0])) {\n\t\tconst { connection, client, ...drizzleConfig } = params[0] as\n\t\t\t& ({\n\t\t\t\tconnection?: DrizzleBunSqliteDatabaseConfig | string;\n\t\t\t\tclient?: TClient;\n\t\t\t})\n\t\t\t& DrizzleConfig<TSchema>;\n\n\t\tif (client) return construct(client, drizzleConfig) as any;\n\n\t\tif (typeof connection === 'object') {\n\t\t\tconst { source, ...opts } = connection;\n\n\t\t\tconst options = Object.values(opts).filter((v) => v !== undefined).length ? opts : undefined;\n\n\t\t\tconst instance = new Database(source, options);\n\n\t\t\treturn construct(instance, drizzleConfig) as any;\n\t\t}\n\n\t\tconst instance = new Database(connection);\n\n\t\treturn construct(instance, drizzleConfig) as any;\n\t}\n\n\treturn construct(params[0] as Database, params[1] as DrizzleConfig<TSchema> | undefined) as any;\n}\n\nexport namespace drizzle {\n\texport function mock<TSchema extends Record<string, unknown> = Record<string, never>>(\n\t\tconfig?: DrizzleConfig<TSchema>,\n\t): BunSQLiteDatabase<TSchema> & {\n\t\t$client: '$client is not available on drizzle.mock()';\n\t} {\n\t\treturn construct({} as any, config) as any;\n\t}\n}\n","export const entityKind = Symbol.for('drizzle:entityKind');\nexport const hasOwnEntityKind = Symbol.for('drizzle:hasOwnEntityKind');\n\nexport interface DrizzleEntity {\n\t[entityKind]: string;\n}\n\nexport type DrizzleEntityClass<T> =\n\t& ((abstract new(...args: any[]) => T) | (new(...args: any[]) => T))\n\t& DrizzleEntity;\n\nexport function is<T extends DrizzleEntityClass<any>>(value: any, type: T): value is InstanceType<T> {\n\tif (!value || typeof value !== 'object') {\n\t\treturn false;\n\t}\n\n\tif (value instanceof type) { // eslint-disable-line no-instanceof/no-instanceof\n\t\treturn true;\n\t}\n\n\tif (!Object.prototype.hasOwnProperty.call(type, entityKind)) {\n\t\tthrow new Error(\n\t\t\t`Class \"${\n\t\t\t\ttype.name ?? '<unknown>'\n\t\t\t}\" doesn't look like a Drizzle entity. If this is incorrect and the class is provided by Drizzle, please report this as a bug.`,\n\t\t);\n\t}\n\n\tlet cls = Object.getPrototypeOf(value).constructor;\n\tif (cls) {\n\t\t// Traverse the prototype chain to find the entityKind\n\t\twhile (cls) {\n\t\t\tif (entityKind in cls && cls[entityKind] === type[entityKind]) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tcls = Object.getPrototypeOf(cls);\n\t\t}\n\t}\n\n\treturn false;\n}\n","import { entityKind } from '~/entity.ts';\n\nexport interface Logger {\n\tlogQuery(query: string, params: unknown[]): void;\n}\n\nexport interface LogWriter {\n\twrite(message: string): void;\n}\n\nexport class ConsoleLogWriter implements LogWriter {\n\tstatic readonly [entityKind]: string = 'ConsoleLogWriter';\n\n\twrite(message: string) {\n\t\tconsole.log(message);\n\t}\n}\n\nexport class DefaultLogger implements Logger {\n\tstatic readonly [entityKind]: string = 'DefaultLogger';\n\n\treadonly writer: LogWriter;\n\n\tconstructor(config?: { writer: LogWriter }) {\n\t\tthis.writer = config?.writer ?? new ConsoleLogWriter();\n\t}\n\n\tlogQuery(query: string, params: unknown[]): void {\n\t\tconst stringifiedParams = params.map((p) => {\n\t\t\ttry {\n\t\t\t\treturn JSON.stringify(p);\n\t\t\t} catch {\n\t\t\t\treturn String(p);\n\t\t\t}\n\t\t});\n\t\tconst paramsStr = stringifiedParams.length ? ` -- params: [${stringifiedParams.join(', ')}]` : '';\n\t\tthis.writer.write(`Query: ${query}${paramsStr}`);\n\t}\n}\n\nexport class NoopLogger implements Logger {\n\tstatic readonly [entityKind]: string = 'NoopLogger';\n\n\tlogQuery(): void {\n\t\t// noop\n\t}\n}\n","/** @internal */\nexport const TableName = Symbol.for('drizzle:Name');\n","import type { Column, GetColumnData } from './column.ts';\nimport { entityKind } from './entity.ts';\nimport type { OptionalKeyOnly, RequiredKeyOnly } from './operations.ts';\nimport type { ExtraConfigColumn } from './pg-core/index.ts';\nimport type { SQLWrapper } from './sql/sql.ts';\nimport { TableName } from './table.utils.ts';\nimport type { Simplify, Update } from './utils.ts';\n\nexport interface TableConfig<TColumn extends Column = Column<any>> {\n\tname: string;\n\tschema: string | undefined;\n\tcolumns: Record<string, TColumn>;\n\tdialect: string;\n}\n\nexport type UpdateTableConfig<T extends TableConfig, TUpdate extends Partial<TableConfig>> = Required<\n\tUpdate<T, TUpdate>\n>;\n\n/** @internal */\nexport const Schema = Symbol.for('drizzle:Schema');\n\n/** @internal */\nexport const Columns = Symbol.for('drizzle:Columns');\n\n/** @internal */\nexport const ExtraConfigColumns = Symbol.for('drizzle:ExtraConfigColumns');\n\n/** @internal */\nexport const OriginalName = Symbol.for('drizzle:OriginalName');\n\n/** @internal */\nexport const BaseName = Symbol.for('drizzle:BaseName');\n\n/** @internal */\nexport const IsAlias = Symbol.for('drizzle:IsAlias');\n\n/** @internal */\nexport const ExtraConfigBuilder = Symbol.for('drizzle:ExtraConfigBuilder');\n\nconst IsDrizzleTable = Symbol.for('drizzle:IsDrizzleTable');\n\nexport interface Table<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tT extends TableConfig = TableConfig,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\n\nexport class Table<T extends TableConfig = TableConfig> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Table';\n\n\tdeclare readonly _: {\n\t\treadonly brand: 'Table';\n\t\treadonly config: T;\n\t\treadonly name: T['name'];\n\t\treadonly schema: T['schema'];\n\t\treadonly columns: T['columns'];\n\t\treadonly inferSelect: InferSelectModel<Table<T>>;\n\t\treadonly inferInsert: InferInsertModel<Table<T>>;\n\t};\n\n\tdeclare readonly $inferSelect: InferSelectModel<Table<T>>;\n\tdeclare readonly $inferInsert: InferInsertModel<Table<T>>;\n\n\t/** @internal */\n\tstatic readonly Symbol = {\n\t\tName: TableName as typeof TableName,\n\t\tSchema: Schema as typeof Schema,\n\t\tOriginalName: OriginalName as typeof OriginalName,\n\t\tColumns: Columns as typeof Columns,\n\t\tExtraConfigColumns: ExtraConfigColumns as typeof ExtraConfigColumns,\n\t\tBaseName: BaseName as typeof BaseName,\n\t\tIsAlias: IsAlias as typeof IsAlias,\n\t\tExtraConfigBuilder: ExtraConfigBuilder as typeof ExtraConfigBuilder,\n\t};\n\n\t/**\n\t * @internal\n\t * Can be changed if the table is aliased.\n\t */\n\t[TableName]: string;\n\n\t/**\n\t * @internal\n\t * Used to store the original name of the table, before any aliasing.\n\t */\n\t[OriginalName]: string;\n\n\t/** @internal */\n\t[Schema]: string | undefined;\n\n\t/** @internal */\n\t[Columns]!: T['columns'];\n\n\t/** @internal */\n\t[ExtraConfigColumns]!: Record<string, ExtraConfigColumn>;\n\n\t/**\n\t * @internal\n\t * Used to store the table name before the transformation via the `tableCreator` functions.\n\t */\n\t[BaseName]: string;\n\n\t/** @internal */\n\t[IsAlias] = false;\n\n\t/** @internal */\n\t[IsDrizzleTable] = true;\n\n\t/** @internal */\n\t[ExtraConfigBuilder]: ((self: any) => Record<string, unknown> | unknown[]) | undefined = undefined;\n\n\tconstructor(name: string, schema: string | undefined, baseName: string) {\n\t\tthis[TableName] = this[OriginalName] = name;\n\t\tthis[Schema] = schema;\n\t\tthis[BaseName] = baseName;\n\t}\n}\n\nexport function isTable(table: unknown): table is Table {\n\treturn typeof table === 'object' && table !== null && IsDrizzleTable in table;\n}\n\n/**\n * Any table with a specified boundary.\n *\n * @example\n\t```ts\n\t// Any table with a specific name\n\ttype AnyUsersTable = AnyTable<{ name: 'users' }>;\n\t```\n *\n * To describe any table with any config, simply use `Table` without any type arguments, like this:\n *\n\t```ts\n\tfunction needsTable(table: Table) {\n\t\t...\n\t}\n\t```\n */\nexport type AnyTable<TPartial extends Partial<TableConfig>> = Table<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport function getTableName<T extends Table>(table: T): T['_']['name'] {\n\treturn table[TableName];\n}\n\nexport function getTableUniqueName<T extends Table>(table: T): `${T['_']['schema']}.${T['_']['name']}` {\n\treturn `${table[Schema] ?? 'public'}.${table[TableName]}`;\n}\n\nexport type MapColumnName<TName extends string, TColumn extends Column, TDBColumNames extends boolean> =\n\tTDBColumNames extends true ? TColumn['_']['name']\n\t\t: TName;\n\nexport type InferModelFromColumns<\n\tTColumns extends Record<string, Column>,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { dbColumnNames: boolean; override?: boolean } = { dbColumnNames: false; override: false },\n> = Simplify<\n\tTInferMode extends 'insert' ?\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as RequiredKeyOnly<\n\t\t\t\t\t\tMapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>,\n\t\t\t\t\t\tTColumns[Key]\n\t\t\t\t\t>\n\t\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t\t}\n\t\t\t& {\n\t\t\t\t[\n\t\t\t\t\tKey in keyof TColumns & string as OptionalKeyOnly<\n\t\t\t\t\t\tMapColumnName<Key, TColumns[Key], TConfig['dbColumnNames']>,\n\t\t\t\t\t\tTColumns[Key],\n\t\t\t\t\t\tTConfig['override']\n\t\t\t\t\t>\n\t\t\t\t]?: GetColumnData<TColumns[Key], 'query'> | undefined;\n\t\t\t}\n\t\t: {\n\t\t\t[\n\t\t\t\tKey in keyof TColumns & string as MapColumnName<\n\t\t\t\t\tKey,\n\t\t\t\t\tTColumns[Key],\n\t\t\t\t\tTConfig['dbColumnNames']\n\t\t\t\t>\n\t\t\t]: GetColumnData<TColumns[Key], 'query'>;\n\t\t}\n>;\n\n/** @deprecated Use one of the alternatives: {@link InferSelectModel} / {@link InferInsertModel}, or `table.$inferSelect` / `table.$inferInsert`\n */\nexport type InferModel<\n\tTTable extends Table,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], TInferMode, TConfig>;\n\nexport type InferSelectModel<\n\tTTable extends Table,\n\tTConfig extends { dbColumnNames: boolean } = { dbColumnNames: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'select', TConfig>;\n\nexport type InferInsertModel<\n\tTTable extends Table,\n\tTConfig extends { dbColumnNames: boolean; override?: boolean } = { dbColumnNames: false; override: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'insert', TConfig>;\n","import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tGeneratedColumnConfig,\n\tGeneratedIdentityConfig,\n} from './column-builder.ts';\nimport { entityKind } from './entity.ts';\nimport type { DriverValueMapper, SQL, SQLWrapper } from './sql/sql.ts';\nimport type { Table } from './table.ts';\nimport type { Update } from './utils.ts';\n\nexport interface ColumnBaseConfig<\n\tTDataType extends ColumnDataType,\n\tTColumnType extends string,\n> extends ColumnBuilderBaseConfig<TDataType, TColumnType> {\n\ttableName: string;\n\tnotNull: boolean;\n\thasDefault: boolean;\n\tisPrimaryKey: boolean;\n\tisAutoincrement: boolean;\n\thasRuntimeDefault: boolean;\n}\n\nexport type ColumnTypeConfig<T extends ColumnBaseConfig<ColumnDataType, string>, TTypeConfig extends object> = T & {\n\tbrand: 'Column';\n\ttableName: T['tableName'];\n\tname: T['name'];\n\tdataType: T['dataType'];\n\tcolumnType: T['columnType'];\n\tdata: T['data'];\n\tdriverParam: T['driverParam'];\n\tnotNull: T['notNull'];\n\thasDefault: T['hasDefault'];\n\tisPrimaryKey: T['isPrimaryKey'];\n\tisAutoincrement: T['isAutoincrement'];\n\thasRuntimeDefault: T['hasRuntimeDefault'];\n\tenumValues: T['enumValues'];\n\tbaseColumn: T extends { baseColumn: infer U } ? U : unknown;\n\tgenerated: GeneratedColumnConfig<T['data']> | undefined;\n\tidentity: undefined | 'always' | 'byDefault';\n} & TTypeConfig;\n\nexport type ColumnRuntimeConfig<TData, TRuntimeConfig extends object> = ColumnBuilderRuntimeConfig<\n\tTData,\n\tTRuntimeConfig\n>;\n\nexport interface Column<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTRuntimeConfig extends object = object,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTTypeConfig extends object = object,\n> extends DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\n/*\n\t`Column` only accepts a full `ColumnConfig` as its generic.\n\tTo infer parts of the config, use `AnyColumn` that accepts a partial config.\n\tSee `GetColumnData` for example usage of inferring.\n*/\nexport abstract class Column<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n> implements DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Column';\n\n\tdeclare readonly _: ColumnTypeConfig<T, TTypeConfig>;\n\n\treadonly name: string;\n\treadonly keyAsName: boolean;\n\treadonly primary: boolean;\n\treadonly notNull: boolean;\n\treadonly default: T['data'] | SQL | undefined;\n\treadonly defaultFn: (() => T['data'] | SQL) | undefined;\n\treadonly onUpdateFn: (() => T['data'] | SQL) | undefined;\n\treadonly hasDefault: boolean;\n\treadonly isUnique: boolean;\n\treadonly uniqueName: string | undefined;\n\treadonly uniqueType: string | undefined;\n\treadonly dataType: T['dataType'];\n\treadonly columnType: T['columnType'];\n\treadonly enumValues: T['enumValues'] = undefined;\n\treadonly generated: GeneratedColumnConfig<T['data']> | undefined = undefined;\n\treadonly generatedIdentity: GeneratedIdentityConfig | undefined = undefined;\n\n\tprotected config: ColumnRuntimeConfig<T['data'], TRuntimeConfig>;\n\n\tconstructor(\n\t\treadonly table: Table,\n\t\tconfig: ColumnRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tthis.config = config;\n\t\tthis.name = config.name;\n\t\tthis.keyAsName = config.keyAsName;\n\t\tthis.notNull = config.notNull;\n\t\tthis.default = config.default;\n\t\tthis.defaultFn = config.defaultFn;\n\t\tthis.onUpdateFn = config.onUpdateFn;\n\t\tthis.hasDefault = config.hasDefault;\n\t\tthis.primary = config.primaryKey;\n\t\tthis.isUnique = config.isUnique;\n\t\tthis.uniqueName = config.uniqueName;\n\t\tthis.uniqueType = config.uniqueType;\n\t\tthis.dataType = config.dataType as T['dataType'];\n\t\tthis.columnType = config.columnType;\n\t\tthis.generated = config.generated;\n\t\tthis.generatedIdentity = config.generatedIdentity;\n\t}\n\n\tabstract getSQLType(): string;\n\n\tmapFromDriverValue(value: unknown): unknown {\n\t\treturn value;\n\t}\n\n\tmapToDriverValue(value: unknown): unknown {\n\t\treturn value;\n\t}\n\n\t// ** @internal */\n\tshouldDisableInsert(): boolean {\n\t\treturn this.config.generated !== undefined && this.config.generated.type !== 'byDefault';\n\t}\n}\n\nexport type UpdateColConfig<\n\tT extends ColumnBaseConfig<ColumnDataType, string>,\n\tTUpdate extends Partial<ColumnBaseConfig<ColumnDataType, string>>,\n> = Update<T, TUpdate>;\n\nexport type AnyColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = Column<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n\nexport type GetColumnData<TColumn extends Column, TInferMode extends 'query' | 'raw' = 'query'> =\n\t// dprint-ignore\n\tTInferMode extends 'raw' // Raw mode\n\t\t? TColumn['_']['data'] // Just return the underlying type\n\t\t: TColumn['_']['notNull'] extends true // Query mode\n\t\t? TColumn['_']['data'] // Query mode, not null\n\t\t: TColumn['_']['data'] | null; // Query mode, nullable\n\nexport type InferColumnsDataTypes<TColumns extends Record<string, Column>> = {\n\t[Key in keyof TColumns]: GetColumnData<TColumns[Key], 'query'>;\n};\n","import { entityKind } from '~/entity.ts';\nimport type { Column } from './column.ts';\nimport type { MySqlColumn } from './mysql-core/index.ts';\nimport type { ExtraConfigColumn, PgColumn, PgSequenceOptions } from './pg-core/index.ts';\nimport type { SingleStoreColumn } from './singlestore-core/index.ts';\nimport type { SQL } from './sql/sql.ts';\nimport type { SQLiteColumn } from './sqlite-core/index.ts';\nimport type { Assume, Simplify } from './utils.ts';\n\nexport type ColumnDataType =\n\t| 'string'\n\t| 'number'\n\t| 'boolean'\n\t| 'array'\n\t| 'json'\n\t| 'date'\n\t| 'bigint'\n\t| 'custom'\n\t| 'buffer';\n\nexport type Dialect = 'pg' | 'mysql' | 'sqlite' | 'singlestore' | 'common';\n\nexport type GeneratedStorageMode = 'virtual' | 'stored';\n\nexport type GeneratedType = 'always' | 'byDefault';\n\nexport type GeneratedColumnConfig<TDataType> = {\n\tas: TDataType | SQL | (() => SQL);\n\ttype?: GeneratedType;\n\tmode?: GeneratedStorageMode;\n};\n\nexport type GeneratedIdentityConfig = {\n\tsequenceName?: string;\n\tsequenceOptions?: PgSequenceOptions;\n\ttype: 'always' | 'byDefault';\n};\n\nexport interface ColumnBuilderBaseConfig<TDataType extends ColumnDataType, TColumnType extends string> {\n\tname: string;\n\tdataType: TDataType;\n\tcolumnType: TColumnType;\n\tdata: unknown;\n\tdriverParam: unknown;\n\tenumValues: string[] | undefined;\n}\n\nexport type MakeColumnConfig<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTableName extends string,\n\tTData = T extends { $type: infer U } ? U : T['data'],\n> = {\n\tname: T['name'];\n\ttableName: TTableName;\n\tdataType: T['dataType'];\n\tcolumnType: T['columnType'];\n\tdata: TData;\n\tdriverParam: T['driverParam'];\n\tnotNull: T extends { notNull: true } ? true : false;\n\thasDefault: T extends { hasDefault: true } ? true : false;\n\tisPrimaryKey: T extends { isPrimaryKey: true } ? true : false;\n\tisAutoincrement: T extends { isAutoincrement: true } ? true : false;\n\thasRuntimeDefault: T extends { hasRuntimeDefault: true } ? true : false;\n\tenumValues: T['enumValues'];\n\tbaseColumn: T extends { baseBuilder: infer U extends ColumnBuilderBase } ? BuildColumn<TTableName, U, 'common'>\n\t\t: never;\n\tidentity: T extends { identity: 'always' } ? 'always' : T extends { identity: 'byDefault' } ? 'byDefault' : undefined;\n\tgenerated: T extends { generated: infer G } ? unknown extends G ? undefined\n\t\t: G extends undefined ? undefined\n\t\t: G\n\t\t: undefined;\n} & {};\n\nexport type ColumnBuilderTypeConfig<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> = Simplify<\n\t& {\n\t\tbrand: 'ColumnBuilder';\n\t\tname: T['name'];\n\t\tdataType: T['dataType'];\n\t\tcolumnType: T['columnType'];\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverParam'];\n\t\tnotNull: T extends { notNull: infer U } ? U : boolean;\n\t\thasDefault: T extends { hasDefault: infer U } ? U : boolean;\n\t\tenumValues: T['enumValues'];\n\t\tidentity: T extends { identity: infer U } ? U : unknown;\n\t\tgenerated: T extends { generated: infer G } ? G extends undefined ? unknown : G : unknown;\n\t}\n\t& TTypeConfig\n>;\n\nexport type ColumnBuilderRuntimeConfig<TData, TRuntimeConfig extends object = object> = {\n\tname: string;\n\tkeyAsName: boolean;\n\tnotNull: boolean;\n\tdefault: TData | SQL | undefined;\n\tdefaultFn: (() => TData | SQL) | undefined;\n\tonUpdateFn: (() => TData | SQL) | undefined;\n\thasDefault: boolean;\n\tprimaryKey: boolean;\n\tisUnique: boolean;\n\tuniqueName: string | undefined;\n\tuniqueType: string | undefined;\n\tdataType: string;\n\tcolumnType: string;\n\tgenerated: GeneratedColumnConfig<TData> | undefined;\n\tgeneratedIdentity: GeneratedIdentityConfig | undefined;\n} & TRuntimeConfig;\n\nexport interface ColumnBuilderExtraConfig {\n\tprimaryKeyHasDefault?: boolean;\n}\n\nexport type NotNull<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tnotNull: true;\n\t};\n};\n\nexport type HasDefault<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\thasDefault: true;\n\t};\n};\n\nexport type IsPrimaryKey<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tisPrimaryKey: true;\n\t};\n};\n\nexport type IsAutoincrement<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\tisAutoincrement: true;\n\t};\n};\n\nexport type HasRuntimeDefault<T extends ColumnBuilderBase> = T & {\n\t_: {\n\t\thasRuntimeDefault: true;\n\t};\n};\n\nexport type $Type<T extends ColumnBuilderBase, TType> = T & {\n\t_: {\n\t\t$type: TType;\n\t};\n};\n\nexport type HasGenerated<T extends ColumnBuilderBase, TGenerated extends {} = {}> = T & {\n\t_: {\n\t\thasDefault: true;\n\t\tgenerated: TGenerated;\n\t};\n};\n\nexport type IsIdentity<\n\tT extends ColumnBuilderBase,\n\tTType extends 'always' | 'byDefault',\n> = T & {\n\t_: {\n\t\tnotNull: true;\n\t\thasDefault: true;\n\t\tidentity: TType;\n\t};\n};\nexport interface ColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> {\n\t_: ColumnBuilderTypeConfig<T, TTypeConfig>;\n}\n\n// To understand how to use `ColumnBuilder` and `AnyColumnBuilder`, see `Column` and `AnyColumn` documentation.\nexport abstract class ColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> implements ColumnBuilderBase<T, TTypeConfig> {\n\tstatic readonly [entityKind]: string = 'ColumnBuilder';\n\n\tdeclare _: ColumnBuilderTypeConfig<T, TTypeConfig>;\n\n\tprotected config: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>;\n\n\tconstructor(name: T['name'], dataType: T['dataType'], columnType: T['columnType']) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tkeyAsName: name === '',\n\t\t\tnotNull: false,\n\t\t\tdefault: undefined,\n\t\t\thasDefault: false,\n\t\t\tprimaryKey: false,\n\t\t\tisUnique: false,\n\t\t\tuniqueName: undefined,\n\t\t\tuniqueType: undefined,\n\t\t\tdataType,\n\t\t\tcolumnType,\n\t\t\tgenerated: undefined,\n\t\t} as ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>;\n\t}\n\n\t/**\n\t * Changes the data type of the column. Commonly used with `json` columns. Also, useful for branded types.\n\t *\n\t * @example\n\t * ```ts\n\t * const users = pgTable('users', {\n\t * \tid: integer('id').$type<UserId>().primaryKey(),\n\t * \tdetails: json('details').$type<UserDetails>().notNull(),\n\t * });\n\t * ```\n\t */\n\t$type<TType>(): $Type<this, TType> {\n\t\treturn this as $Type<this, TType>;\n\t}\n\n\t/**\n\t * Adds a `not null` clause to the column definition.\n\t *\n\t * Affects the `select` model of the table - columns *without* `not null` will be nullable on select.\n\t */\n\tnotNull(): NotNull<this> {\n\t\tthis.config.notNull = true;\n\t\treturn this as NotNull<this>;\n\t}\n\n\t/**\n\t * Adds a `default <value>` clause to the column definition.\n\t *\n\t * Affects the `insert` model of the table - columns *with* `default` are optional on insert.\n\t *\n\t * If you need to set a dynamic default value, use {@link $defaultFn} instead.\n\t */\n\tdefault(value: (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL): HasDefault<this> {\n\t\tthis.config.default = value;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasDefault<this>;\n\t}\n\n\t/**\n\t * Adds a dynamic default value to the column.\n\t * The function will be called when the row is inserted, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$defaultFn(\n\t\tfn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,\n\t): HasRuntimeDefault<HasDefault<this>> {\n\t\tthis.config.defaultFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasRuntimeDefault<HasDefault<this>>;\n\t}\n\n\t/**\n\t * Alias for {@link $defaultFn}.\n\t */\n\t$default = this.$defaultFn;\n\n\t/**\n\t * Adds a dynamic update value to the column.\n\t * The function will be called when the row is updated, and the returned value will be used as the column value if none is provided.\n\t * If no `default` (or `$defaultFn`) value is provided, the function will be called when the row is inserted as well, and the returned value will be used as the column value.\n\t *\n\t * **Note:** This value does not affect the `drizzle-kit` behavior, it is only used at runtime in `drizzle-orm`.\n\t */\n\t$onUpdateFn(\n\t\tfn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,\n\t): HasDefault<this> {\n\t\tthis.config.onUpdateFn = fn;\n\t\tthis.config.hasDefault = true;\n\t\treturn this as HasDefault<this>;\n\t}\n\n\t/**\n\t * Alias for {@link $onUpdateFn}.\n\t */\n\t$onUpdate = this.$onUpdateFn;\n\n\t/**\n\t * Adds a `primary key` clause to the column definition. This implicitly makes the column `not null`.\n\t *\n\t * In SQLite, `integer primary key` implicitly makes the column auto-incrementing.\n\t */\n\tprimaryKey(): TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<NotNull<this>>>\n\t\t: IsPrimaryKey<NotNull<this>>\n\t{\n\t\tthis.config.primaryKey = true;\n\t\tthis.config.notNull = true;\n\t\treturn this as TExtraConfig['primaryKeyHasDefault'] extends true ? IsPrimaryKey<HasDefault<NotNull<this>>>\n\t\t\t: IsPrimaryKey<NotNull<this>>;\n\t}\n\n\tabstract generatedAlwaysAs(\n\t\tas: SQL | T['data'] | (() => SQL),\n\t\tconfig?: Partial<GeneratedColumnConfig<unknown>>,\n\t): HasGenerated<this, {\n\t\ttype: 'always';\n\t}>;\n\n\t/** @internal Sets the name of the column to the key within the table definition if a name was not given. */\n\tsetName(name: string) {\n\t\tif (this.config.name !== '') return;\n\t\tthis.config.name = name;\n\t}\n}\n\nexport type BuildColumn<\n\tTTableName extends string,\n\tTBuilder extends ColumnBuilderBase,\n\tTDialect extends Dialect,\n> = TDialect extends 'pg' ? PgColumn<\n\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t{},\n\t\tSimplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>\n\t>\n\t: TDialect extends 'mysql' ? MySqlColumn<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<\n\t\t\t\tOmit<\n\t\t\t\t\tTBuilder['_'],\n\t\t\t\t\t| keyof MakeColumnConfig<TBuilder['_'], TTableName>\n\t\t\t\t\t| 'brand'\n\t\t\t\t\t| 'dialect'\n\t\t\t\t\t| 'primaryKeyHasDefault'\n\t\t\t\t\t| 'mysqlColumnBuilderBrand'\n\t\t\t\t>\n\t\t\t>\n\t\t>\n\t: TDialect extends 'sqlite' ? SQLiteColumn<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>\n\t\t>\n\t: TDialect extends 'common' ? Column<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<Omit<TBuilder['_'], keyof MakeColumnConfig<TBuilder['_'], TTableName> | 'brand' | 'dialect'>>\n\t\t>\n\t: TDialect extends 'singlestore' ? SingleStoreColumn<\n\t\t\tMakeColumnConfig<TBuilder['_'], TTableName>,\n\t\t\t{},\n\t\t\tSimplify<\n\t\t\t\tOmit<\n\t\t\t\t\tTBuilder['_'],\n\t\t\t\t\t| keyof MakeColumnConfig<TBuilder['_'], TTableName>\n\t\t\t\t\t| 'brand'\n\t\t\t\t\t| 'dialect'\n\t\t\t\t\t| 'primaryKeyHasDefault'\n\t\t\t\t\t| 'singlestoreColumnBuilderBrand'\n\t\t\t\t>\n\t\t\t>\n\t\t>\n\t: never;\n\nexport type BuildIndexColumn<\n\tTDialect extends Dialect,\n> = TDialect extends 'pg' ? ExtraConfigColumn : never;\n\n// TODO\n// try to make sql as well + indexRaw\n\n// optional after everything will be working as expected\n// also try to leave only needed methods for extraConfig\n// make an error if I pass .asc() to fk and so on\n\nexport type BuildColumns<\n\tTTableName extends string,\n\tTConfigMap extends Record<string, ColumnBuilderBase>,\n\tTDialect extends Dialect,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: BuildColumn<TTableName, {\n\t\t\t_:\n\t\t\t\t& Omit<TConfigMap[Key]['_'], 'name'>\n\t\t\t\t& { name: TConfigMap[Key]['_']['name'] extends '' ? Assume<Key, string> : TConfigMap[Key]['_']['name'] };\n\t\t}, TDialect>;\n\t}\n\t& {};\n\nexport type BuildExtraConfigColumns<\n\t_TTableName extends string,\n\tTConfigMap extends Record<string, ColumnBuilderBase>,\n\tTDialect extends Dialect,\n> =\n\t& {\n\t\t[Key in keyof TConfigMap]: BuildIndexColumn<TDialect>;\n\t}\n\t& {};\n\nexport type ChangeColumnTableName<TColumn extends Column, TAlias extends string, TDialect extends Dialect> =\n\tTDialect extends 'pg' ? PgColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'mysql' ? MySqlColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'singlestore' ? SingleStoreColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'sqlite' ? SQLiteColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: never;\n","import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { AnyPgColumn, PgColumn } from './columns/index.ts';\nimport type { PgTable } from './table.ts';\n\nexport type UpdateDeleteAction = 'cascade' | 'restrict' | 'no action' | 'set null' | 'set default';\n\nexport type Reference = () => {\n\treadonly name?: string;\n\treadonly columns: PgColumn[];\n\treadonly foreignTable: PgTable;\n\treadonly foreignColumns: PgColumn[];\n};\n\nexport class ForeignKeyBuilder {\n\tstatic readonly [entityKind]: string = 'PgForeignKeyBuilder';\n\n\t/** @internal */\n\treference: Reference;\n\n\t/** @internal */\n\t_onUpdate: UpdateDeleteAction | undefined = 'no action';\n\n\t/** @internal */\n\t_onDelete: UpdateDeleteAction | undefined = 'no action';\n\n\tconstructor(\n\t\tconfig: () => {\n\t\t\tname?: string;\n\t\t\tcolumns: PgColumn[];\n\t\t\tforeignColumns: PgColumn[];\n\t\t},\n\t\tactions?: {\n\t\t\tonUpdate?: UpdateDeleteAction;\n\t\t\tonDelete?: UpdateDeleteAction;\n\t\t} | undefined,\n\t) {\n\t\tthis.reference = () => {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn { name, columns, foreignTable: foreignColumns[0]!.table as PgTable, foreignColumns };\n\t\t};\n\t\tif (actions) {\n\t\t\tthis._onUpdate = actions.onUpdate;\n\t\t\tthis._onDelete = actions.onDelete;\n\t\t}\n\t}\n\n\tonUpdate(action: UpdateDeleteAction): this {\n\t\tthis._onUpdate = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\tonDelete(action: UpdateDeleteAction): this {\n\t\tthis._onDelete = action === undefined ? 'no action' : action;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): ForeignKey {\n\t\treturn new ForeignKey(table, this);\n\t}\n}\n\nexport type AnyForeignKeyBuilder = ForeignKeyBuilder;\n\nexport class ForeignKey {\n\tstatic readonly [entityKind]: string = 'PgForeignKey';\n\n\treadonly reference: Reference;\n\treadonly onUpdate: UpdateDeleteAction | undefined;\n\treadonly onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(readonly table: PgTable, builder: ForeignKeyBuilder) {\n\t\tthis.reference = builder.reference;\n\t\tthis.onUpdate = builder._onUpdate;\n\t\tthis.onDelete = builder._onDelete;\n\t}\n\n\tgetName(): string {\n\t\tconst { name, columns, foreignColumns } = this.reference();\n\t\tconst columnNames = columns.map((column) => column.name);\n\t\tconst foreignColumnNames = foreignColumns.map((column) => column.name);\n\t\tconst chunks = [\n\t\t\tthis.table[TableName],\n\t\t\t...columnNames,\n\t\t\tforeignColumns[0]!.table[TableName],\n\t\t\t...foreignColumnNames,\n\t\t];\n\t\treturn name ?? `${chunks.join('_')}_fk`;\n\t}\n}\n\ntype ColumnsWithTable<\n\tTTableName extends string,\n\tTColumns extends PgColumn[],\n> = { [Key in keyof TColumns]: AnyPgColumn<{ tableName: TTableName }> };\n\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnyPgColumn<{ tableName: TTableName }>, ...AnyPgColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder {\n\tfunction mappedConfig() {\n\t\tconst { name, columns, foreignColumns } = config;\n\t\treturn {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tforeignColumns,\n\t\t};\n\t}\n\n\treturn new ForeignKeyBuilder(mappedConfig);\n}\n","export function iife<T extends unknown[], U>(fn: (...args: T) => U, ...args: T): U {\n\treturn fn(...args);\n}\n","import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { PgColumn } from './columns/index.ts';\nimport type { PgTable } from './table.ts';\n\nexport function unique(name?: string): UniqueOnConstraintBuilder {\n\treturn new UniqueOnConstraintBuilder(name);\n}\n\nexport function uniqueKeyName(table: PgTable, columns: string[]) {\n\treturn `${table[TableName]}_${columns.join('_')}_unique`;\n}\n\nexport class UniqueConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'PgUniqueConstraintBuilder';\n\n\t/** @internal */\n\tcolumns: PgColumn[];\n\t/** @internal */\n\tnullsNotDistinctConfig = false;\n\n\tconstructor(\n\t\tcolumns: PgColumn[],\n\t\tprivate name?: string,\n\t) {\n\t\tthis.columns = columns;\n\t}\n\n\tnullsNotDistinct() {\n\t\tthis.nullsNotDistinctConfig = true;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): UniqueConstraint {\n\t\treturn new UniqueConstraint(table, this.columns, this.nullsNotDistinctConfig, this.name);\n\t}\n}\n\nexport class UniqueOnConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'PgUniqueOnConstraintBuilder';\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tname?: string,\n\t) {\n\t\tthis.name = name;\n\t}\n\n\ton(...columns: [PgColumn, ...PgColumn[]]) {\n\t\treturn new UniqueConstraintBuilder(columns, this.name);\n\t}\n}\n\nexport class UniqueConstraint {\n\tstatic readonly [entityKind]: string = 'PgUniqueConstraint';\n\n\treadonly columns: PgColumn[];\n\treadonly name?: string;\n\treadonly nullsNotDistinct: boolean = false;\n\n\tconstructor(readonly table: PgTable, columns: PgColumn[], nullsNotDistinct: boolean, name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name ?? uniqueKeyName(this.table, this.columns.map((column) => column.name));\n\t\tthis.nullsNotDistinct = nullsNotDistinct;\n\t}\n\n\tgetName() {\n\t\treturn this.name;\n\t}\n}\n","function parsePgArrayValue(arrayString: string, startFrom: number, inQuotes: boolean): [string, number] {\n\tfor (let i = startFrom; i < arrayString.length; i++) {\n\t\tconst char = arrayString[i];\n\n\t\tif (char === '\\\\') {\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\treturn [arrayString.slice(startFrom, i).replace(/\\\\/g, ''), i + 1];\n\t\t}\n\n\t\tif (inQuotes) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === ',' || char === '}') {\n\t\t\treturn [arrayString.slice(startFrom, i).replace(/\\\\/g, ''), i];\n\t\t}\n\t}\n\n\treturn [arrayString.slice(startFrom).replace(/\\\\/g, ''), arrayString.length];\n}\n\nexport function parsePgNestedArray(arrayString: string, startFrom = 0): [any[], number] {\n\tconst result: any[] = [];\n\tlet i = startFrom;\n\tlet lastCharIsComma = false;\n\n\twhile (i < arrayString.length) {\n\t\tconst char = arrayString[i];\n\n\t\tif (char === ',') {\n\t\t\tif (lastCharIsComma || i === startFrom) {\n\t\t\t\tresult.push('');\n\t\t\t}\n\t\t\tlastCharIsComma = true;\n\t\t\ti++;\n\t\t\tcontinue;\n\t\t}\n\n\t\tlastCharIsComma = false;\n\n\t\tif (char === '\\\\') {\n\t\t\ti += 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '\"') {\n\t\t\tconst [value, startFrom] = parsePgArrayValue(arrayString, i + 1, true);\n\t\t\tresult.push(value);\n\t\t\ti = startFrom;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (char === '}') {\n\t\t\treturn [result, i + 1];\n\t\t}\n\n\t\tif (char === '{') {\n\t\t\tconst [value, startFrom] = parsePgNestedArray(arrayString, i + 1);\n\t\t\tresult.push(value);\n\t\t\ti = startFrom;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst [value, newStartFrom] = parsePgArrayValue(arrayString, i, false);\n\t\tresult.push(value);\n\t\ti = newStartFrom;\n\t}\n\n\treturn [result, i];\n}\n\nexport function parsePgArray(arrayString: string): any[] {\n\tconst [result] = parsePgNestedArray(arrayString, 1);\n\treturn result;\n}\n\nexport function makePgArray(array: any[]): string {\n\treturn `{${\n\t\tarray.map((item) => {\n\t\t\tif (Array.isArray(item)) {\n\t\t\t\treturn makePgArray(item);\n\t\t\t}\n\n\t\t\tif (typeof item === 'string') {\n\t\t\t\treturn `\"${item.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`;\n\t\t\t}\n\n\t\t\treturn `${item}`;\n\t\t}).join(',')\n\t}}`;\n}\n","import type {\n\tColumnBuilderBase,\n\tColumnBuilderBaseConfig,\n\tColumnBuilderExtraConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tHasGenerated,\n\tMakeColumnConfig,\n} from '~/column-builder.ts';\nimport { ColumnBuilder } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { Simplify, Update } from '~/utils.ts';\n\nimport type { ForeignKey, UpdateDeleteAction } from '~/pg-core/foreign-keys.ts';\nimport { ForeignKeyBuilder } from '~/pg-core/foreign-keys.ts';\nimport type { AnyPgTable, PgTable } from '~/pg-core/table.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport { iife } from '~/tracing-utils.ts';\nimport type { PgIndexOpClass } from '../indexes.ts';\nimport { uniqueKeyName } from '../unique-constraint.ts';\nimport { makePgArray, parsePgArray } from '../utils/array.ts';\n\nexport interface ReferenceConfig {\n\tref: () => PgColumn;\n\tactions: {\n\t\tonUpdate?: UpdateDeleteAction;\n\t\tonDelete?: UpdateDeleteAction;\n\t};\n}\n\nexport interface PgColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> extends ColumnBuilderBase<T, TTypeConfig & { dialect: 'pg' }> {}\n\nexport abstract class PgColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> extends ColumnBuilder<T, TRuntimeConfig, TTypeConfig & { dialect: 'pg' }, TExtraConfig>\n\timplements PgColumnBuilderBase<T, TTypeConfig>\n{\n\tprivate foreignKeyConfigs: ReferenceConfig[] = [];\n\n\tstatic override readonly [entityKind]: string = 'PgColumnBuilder';\n\n\tarray<TSize extends number | undefined = undefined>(size?: TSize): PgArrayBuilder<\n\t\t& {\n\t\t\tname: T['name'];\n\t\t\tdataType: 'array';\n\t\t\tcolumnType: 'PgArray';\n\t\t\tdata: T['data'][];\n\t\t\tdriverParam: T['driverParam'][] | string;\n\t\t\tenumValues: T['enumValues'];\n\t\t\tsize: TSize;\n\t\t\tbaseBuilder: T;\n\t\t}\n\t\t& (T extends { notNull: true } ? { notNull: true } : {})\n\t\t& (T extends { hasDefault: true } ? { hasDefault: true } : {}),\n\t\tT\n\t> {\n\t\treturn new PgArrayBuilder(this.config.name, this as PgColumnBuilder<any, any>, size as any);\n\t}\n\n\treferences(\n\t\tref: ReferenceConfig['ref'],\n\t\tactions: ReferenceConfig['actions'] = {},\n\t): this {\n\t\tthis.foreignKeyConfigs.push({ ref, actions });\n\t\treturn this;\n\t}\n\n\tunique(\n\t\tname?: string,\n\t\tconfig?: { nulls: 'distinct' | 'not distinct' },\n\t): this {\n\t\tthis.config.isUnique = true;\n\t\tthis.config.uniqueName = name;\n\t\tthis.config.uniqueType = config?.nulls;\n\t\treturn this;\n\t}\n\n\tgeneratedAlwaysAs(as: SQL | T['data'] | (() => SQL)): HasGenerated<this, {\n\t\ttype: 'always';\n\t}> {\n\t\tthis.config.generated = {\n\t\t\tas,\n\t\t\ttype: 'always',\n\t\t\tmode: 'stored',\n\t\t};\n\t\treturn this as HasGenerated<this, {\n\t\t\ttype: 'always';\n\t\t}>;\n\t}\n\n\t/** @internal */\n\tbuildForeignKeys(column: PgColumn, table: PgTable): ForeignKey[] {\n\t\treturn this.foreignKeyConfigs.map(({ ref, actions }) => {\n\t\t\treturn iife(\n\t\t\t\t(ref, actions) => {\n\t\t\t\t\tconst builder = new ForeignKeyBuilder(() => {\n\t\t\t\t\t\tconst foreignColumn = ref();\n\t\t\t\t\t\treturn { columns: [column], foreignColumns: [foreignColumn] };\n\t\t\t\t\t});\n\t\t\t\t\tif (actions.onUpdate) {\n\t\t\t\t\t\tbuilder.onUpdate(actions.onUpdate);\n\t\t\t\t\t}\n\t\t\t\t\tif (actions.onDelete) {\n\t\t\t\t\t\tbuilder.onDelete(actions.onDelete);\n\t\t\t\t\t}\n\t\t\t\t\treturn builder.build(table);\n\t\t\t\t},\n\t\t\t\tref,\n\t\t\t\tactions,\n\t\t\t);\n\t\t});\n\t}\n\n\t/** @internal */\n\tabstract build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgColumn<MakeColumnConfig<T, TTableName>>;\n\n\t/** @internal */\n\tbuildExtraConfigColumn<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): ExtraConfigColumn {\n\t\treturn new ExtraConfigColumn(table, this.config);\n\t}\n}\n\n// To understand how to use `PgColumn` and `PgColumn`, see `Column` and `AnyColumn` documentation.\nexport abstract class PgColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = {},\n\tTTypeConfig extends object = {},\n> extends Column<T, TRuntimeConfig, TTypeConfig & { dialect: 'pg' }> {\n\tstatic override readonly [entityKind]: string = 'PgColumn';\n\n\tconstructor(\n\t\toverride readonly table: PgTable,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tif (!config.uniqueName) {\n\t\t\tconfig.uniqueName = uniqueKeyName(table, [config.name]);\n\t\t}\n\t\tsuper(table, config);\n\t}\n}\n\nexport type IndexedExtraConfigType = { order?: 'asc' | 'desc'; nulls?: 'first' | 'last'; opClass?: string };\n\nexport class ExtraConfigColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n> extends PgColumn<T, IndexedExtraConfigType> {\n\tstatic override readonly [entityKind]: string = 'ExtraConfigColumn';\n\n\toverride getSQLType(): string {\n\t\treturn this.getSQLType();\n\t}\n\n\tindexConfig: IndexedExtraConfigType = {\n\t\torder: this.config.order ?? 'asc',\n\t\tnulls: this.config.nulls ?? 'last',\n\t\topClass: this.config.opClass,\n\t};\n\tdefaultConfig: IndexedExtraConfigType = {\n\t\torder: 'asc',\n\t\tnulls: 'last',\n\t\topClass: undefined,\n\t};\n\n\tasc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'asc';\n\t\treturn this;\n\t}\n\n\tdesc(): Omit<this, 'asc' | 'desc'> {\n\t\tthis.indexConfig.order = 'desc';\n\t\treturn this;\n\t}\n\n\tnullsFirst(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'first';\n\t\treturn this;\n\t}\n\n\tnullsLast(): Omit<this, 'nullsFirst' | 'nullsLast'> {\n\t\tthis.indexConfig.nulls = 'last';\n\t\treturn this;\n\t}\n\n\t/**\n\t * ### PostgreSQL documentation quote\n\t *\n\t * > An operator class with optional parameters can be specified for each column of an index.\n\t * The operator class identifies the operators to be used by the index for that column.\n\t * For example, a B-tree index on four-byte integers would use the int4_ops class;\n\t * this operator class includes comparison functions for four-byte integers.\n\t * In practice the default operator class for the column's data type is usually sufficient.\n\t * The main point of having operator classes is that for some data types, there could be more than one meaningful ordering.\n\t * For example, we might want to sort a complex-number data type either by absolute value or by real part.\n\t * We could do this by defining two operator classes for the data type and then selecting the proper class when creating an index.\n\t * More information about operator classes check:\n\t *\n\t * ### Useful links\n\t * https://www.postgresql.org/docs/current/sql-createindex.html\n\t *\n\t * https://www.postgresql.org/docs/current/indexes-opclass.html\n\t *\n\t * https://www.postgresql.org/docs/current/xindex.html\n\t *\n\t * ### Additional types\n\t * If you have the `pg_vector` extension installed in your database, you can use the\n\t * `vector_l2_ops`, `vector_ip_ops`, `vector_cosine_ops`, `vector_l1_ops`, `bit_hamming_ops`, `bit_jaccard_ops`, `halfvec_l2_ops`, `sparsevec_l2_ops` options, which are predefined types.\n\t *\n\t * **You can always specify any string you want in the operator class, in case Drizzle doesn't have it natively in its types**\n\t *\n\t * @param opClass\n\t * @returns\n\t */\n\top(opClass: PgIndexOpClass): Omit<this, 'op'> {\n\t\tthis.indexConfig.opClass = opClass;\n\t\treturn this;\n\t}\n}\n\nexport class IndexedColumn {\n\tstatic readonly [entityKind]: string = 'IndexedColumn';\n\tconstructor(\n\t\tname: string | undefined,\n\t\tkeyAsName: boolean,\n\t\ttype: string,\n\t\tindexConfig: IndexedExtraConfigType,\n\t) {\n\t\tthis.name = name;\n\t\tthis.keyAsName = keyAsName;\n\t\tthis.type = type;\n\t\tthis.indexConfig = indexConfig;\n\t}\n\n\tname: string | undefined;\n\tkeyAsName: boolean;\n\ttype: string;\n\tindexConfig: IndexedExtraConfigType;\n}\n\nexport type AnyPgColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = PgColumn<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n\nexport type PgArrayColumnBuilderBaseConfig = ColumnBuilderBaseConfig<'array', 'PgArray'> & {\n\tsize: number | undefined;\n\tbaseBuilder: ColumnBuilderBaseConfig<ColumnDataType, string>;\n};\n\nexport class PgArrayBuilder<\n\tT extends PgArrayColumnBuilderBaseConfig,\n\tTBase extends ColumnBuilderBaseConfig<ColumnDataType, string> | PgArrayColumnBuilderBaseConfig,\n> extends PgColumnBuilder<\n\tT,\n\t{\n\t\tbaseBuilder: TBase extends PgArrayColumnBuilderBaseConfig ? PgArrayBuilder<\n\t\t\t\tTBase,\n\t\t\t\tTBase extends { baseBuilder: infer TBaseBuilder extends ColumnBuilderBaseConfig<any, any> } ? TBaseBuilder\n\t\t\t\t\t: never\n\t\t\t>\n\t\t\t: PgColumnBuilder<TBase, {}, Simplify<Omit<TBase, keyof ColumnBuilderBaseConfig<any, any>>>>;\n\t\tsize: T['size'];\n\t},\n\t{\n\t\tbaseBuilder: TBase extends PgArrayColumnBuilderBaseConfig ? PgArrayBuilder<\n\t\t\t\tTBase,\n\t\t\t\tTBase extends { baseBuilder: infer TBaseBuilder extends ColumnBuilderBaseConfig<any, any> } ? TBaseBuilder\n\t\t\t\t\t: never\n\t\t\t>\n\t\t\t: PgColumnBuilder<TBase, {}, Simplify<Omit<TBase, keyof ColumnBuilderBaseConfig<any, any>>>>;\n\t\tsize: T['size'];\n\t}\n> {\n\tstatic override readonly [entityKind] = 'PgArrayBuilder';\n\n\tconstructor(\n\t\tname: string,\n\t\tbaseBuilder: PgArrayBuilder<T, TBase>['config']['baseBuilder'],\n\t\tsize: T['size'],\n\t) {\n\t\tsuper(name, 'array', 'PgArray');\n\t\tthis.config.baseBuilder = baseBuilder;\n\t\tthis.config.size = size;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgArray<MakeColumnConfig<T, TTableName> & { size: T['size']; baseBuilder: T['baseBuilder'] }, TBase> {\n\t\tconst baseColumn = this.config.baseBuilder.build(table);\n\t\treturn new PgArray<MakeColumnConfig<T, TTableName> & { size: T['size']; baseBuilder: T['baseBuilder'] }, TBase>(\n\t\t\ttable as AnyPgTable<{ name: MakeColumnConfig<T, TTableName>['tableName'] }>,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t\tbaseColumn,\n\t\t);\n\t}\n}\n\nexport class PgArray<\n\tT extends ColumnBaseConfig<'array', 'PgArray'> & {\n\t\tsize: number | undefined;\n\t\tbaseBuilder: ColumnBuilderBaseConfig<ColumnDataType, string>;\n\t},\n\tTBase extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n> extends PgColumn<T, {}, { size: T['size']; baseBuilder: T['baseBuilder'] }> {\n\treadonly size: T['size'];\n\n\tstatic override readonly [entityKind]: string = 'PgArray';\n\n\tconstructor(\n\t\ttable: AnyPgTable<{ name: T['tableName'] }>,\n\t\tconfig: PgArrayBuilder<T, TBase>['config'],\n\t\treadonly baseColumn: PgColumn,\n\t\treadonly range?: [number | undefined, number | undefined],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.size = config.size;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `${this.baseColumn.getSQLType()}[${typeof this.size === 'number' ? this.size : ''}]`;\n\t}\n\n\toverride mapFromDriverValue(value: unknown[] | string): T['data'] {\n\t\tif (typeof value === 'string') {\n\t\t\t// Thank you node-postgres for not parsing enum arrays\n\t\t\tvalue = parsePgArray(value);\n\t\t}\n\t\treturn value.map((v) => this.baseColumn.mapFromDriverValue(v));\n\t}\n\n\toverride mapToDriverValue(value: unknown[], isNestedArray = false): unknown[] | string {\n\t\tconst a = value.map((v) =>\n\t\t\tv === null\n\t\t\t\t? null\n\t\t\t\t: is(this.baseColumn, PgArray)\n\t\t\t\t? this.baseColumn.mapToDriverValue(v as unknown[], true)\n\t\t\t\t: this.baseColumn.mapToDriverValue(v)\n\t\t);\n\t\tif (isNestedArray) return a;\n\t\treturn makePgArray(a);\n\t}\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnyPgTable } from '~/pg-core/table.ts';\nimport type { Writable } from '~/utils.ts';\nimport { PgColumn, PgColumnBuilder } from './common.ts';\n\nexport type PgEnumColumnBuilderInitial<TName extends string, TValues extends [string, ...string[]]> =\n\tPgEnumColumnBuilder<{\n\t\tname: TName;\n\t\tdataType: 'string';\n\t\tcolumnType: 'PgEnumColumn';\n\t\tdata: TValues[number];\n\t\tenumValues: TValues;\n\t\tdriverParam: string;\n\t}>;\n\nconst isPgEnumSym = Symbol.for('drizzle:isPgEnum');\nexport interface PgEnum<TValues extends [string, ...string[]]> {\n\t(): PgEnumColumnBuilderInitial<'', TValues>;\n\t<TName extends string>(name: TName): PgEnumColumnBuilderInitial<TName, TValues>;\n\t<TName extends string>(name?: TName): PgEnumColumnBuilderInitial<TName, TValues>;\n\n\treadonly enumName: string;\n\treadonly enumValues: TValues;\n\treadonly schema: string | undefined;\n\t/** @internal */\n\t[isPgEnumSym]: true;\n}\n\nexport function isPgEnum(obj: unknown): obj is PgEnum<[string, ...string[]]> {\n\treturn !!obj && typeof obj === 'function' && isPgEnumSym in obj && obj[isPgEnumSym] === true;\n}\n\nexport class PgEnumColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'PgEnumColumn'> & { enumValues: [string, ...string[]] },\n> extends PgColumnBuilder<T, { enum: PgEnum<T['enumValues']> }> {\n\tstatic override readonly [entityKind]: string = 'PgEnumColumnBuilder';\n\n\tconstructor(name: T['name'], enumInstance: PgEnum<T['enumValues']>) {\n\t\tsuper(name, 'string', 'PgEnumColumn');\n\t\tthis.config.enum = enumInstance;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnyPgTable<{ name: TTableName }>,\n\t): PgEnumColumn<MakeColumnConfig<T, TTableName>> {\n\t\treturn new PgEnumColumn<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class PgEnumColumn<T extends ColumnBaseConfig<'string', 'PgEnumColumn'> & { enumValues: [string, ...string[]] }>\n\textends PgColumn<T, { enum: PgEnum<T['enumValues']> }>\n{\n\tstatic override readonly [entityKind]: string = 'PgEnumColumn';\n\n\treadonly enum = this.config.enum;\n\toverride readonly enumValues = this.config.enum.enumValues;\n\n\tconstructor(\n\t\ttable: AnyPgTable<{ name: T['tableName'] }>,\n\t\tconfig: PgEnumColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.enum = config.enum;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.enum.enumName;\n\t}\n}\n\n// Gratitude to zod for the enum function types\nexport function pgEnum<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tenumName: string,\n\tvalues: T | Writable<T>,\n): PgEnum<Writable<T>> {\n\treturn pgEnumWithSchema(enumName, values, undefined);\n}\n\n/** @internal */\nexport function pgEnumWithSchema<U extends string, T extends Readonly<[U, ...U[]]>>(\n\tenumName: string,\n\tvalues: T | Writable<T>,\n\tschema?: string,\n): PgEnum<Writable<T>> {\n\tconst enumInstance: PgEnum<Writable<T>> = Object.assign(\n\t\t<TName extends string>(name?: TName): PgEnumColumnBuilderInitial<TName, Writable<T>> =>\n\t\t\tnew PgEnumColumnBuilder(name ?? '' as TName, enumInstance),\n\t\t{\n\t\t\tenumName,\n\t\t\tenumValues: values,\n\t\t\tschema,\n\t\t\t[isPgEnumSym]: true,\n\t\t} as const,\n\t);\n\n\treturn enumInstance;\n}\n","import { entityKind } from './entity.ts';\nimport type { SQL, SQLWrapper } from './sql/sql.ts';\n\nexport interface Subquery<\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTAlias extends string = string,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTSelectedFields extends Record<string, unknown> = Record<string, unknown>,\n> extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\nexport class Subquery<\n\tTAlias extends string = string,\n\tTSelectedFields extends Record<string, unknown> = Record<string, unknown>,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Subquery';\n\n\tdeclare _: {\n\t\tbrand: 'Subquery';\n\t\tsql: SQL;\n\t\tselectedFields: TSelectedFields;\n\t\talias: TAlias;\n\t\tisWith: boolean;\n\t};\n\n\tconstructor(sql: SQL, selection: Record<string, unknown>, alias: string, isWith = false) {\n\t\tthis._ = {\n\t\t\tbrand: 'Subquery',\n\t\t\tsql,\n\t\t\tselectedFields: selection as TSelectedFields,\n\t\t\talias: alias as TAlias,\n\t\t\tisWith,\n\t\t};\n\t}\n\n\t// getSQL(): SQL<unknown> {\n\t// \treturn new SQL([this]);\n\t// }\n}\n\nexport class WithSubquery<\n\tTAlias extends string = string,\n\tTSelection extends Record<string, unknown> = Record<string, unknown>,\n> extends Subquery<TAlias, TSelection> {\n\tstatic override readonly [entityKind]: string = 'WithSubquery';\n}\n\nexport type WithSubqueryWithoutSelection<TAlias extends string> = WithSubquery<TAlias, {}>;\n","// package.json\nvar version = \"0.39.3\";\n\n// src/version.ts\nvar compatibilityVersion = 10;\nexport {\n compatibilityVersion,\n version as npmVersion\n};\n","import type { Span, Tracer } from '@opentelemetry/api';\nimport { iife } from '~/tracing-utils.ts';\nimport { npmVersion } from '~/version.ts';\n\nlet otel: typeof import('@opentelemetry/api') | undefined;\nlet rawTracer: Tracer | undefined;\n// try {\n// \totel = await import('@opentelemetry/api');\n// } catch (err: any) {\n// \tif (err.code !== 'MODULE_NOT_FOUND' && err.code !== 'ERR_MODULE_NOT_FOUND') {\n// \t\tthrow err;\n// \t}\n// }\n\ntype SpanName =\n\t| 'drizzle.operation'\n\t| 'drizzle.prepareQuery'\n\t| 'drizzle.buildSQL'\n\t| 'drizzle.execute'\n\t| 'drizzle.driver.execute'\n\t| 'drizzle.mapResponse';\n\n/** @internal */\nexport const tracer = {\n\tstartActiveSpan<F extends (span?: Span) => unknown>(name: SpanName, fn: F): ReturnType<F> {\n\t\tif (!otel) {\n\t\t\treturn fn() as ReturnType<F>;\n\t\t}\n\n\t\tif (!rawTracer) {\n\t\t\trawTracer = otel.trace.getTracer('drizzle-orm', npmVersion);\n\t\t}\n\n\t\treturn iife(\n\t\t\t(otel, rawTracer) =>\n\t\t\t\trawTracer.startActiveSpan(\n\t\t\t\t\tname,\n\t\t\t\t\t((span: Span) => {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\treturn fn(span);\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tspan.setStatus({\n\t\t\t\t\t\t\t\tcode: otel.SpanStatusCode.ERROR,\n\t\t\t\t\t\t\t\tmessage: e instanceof Error ? e.message : 'Unknown error', // eslint-disable-line no-instanceof/no-instanceof\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tthrow e;\n\t\t\t\t\t\t} finally {\n\t\t\t\t\t\t\tspan.end();\n\t\t\t\t\t\t}\n\t\t\t\t\t}) as F,\n\t\t\t\t),\n\t\t\totel,\n\t\t\trawTracer,\n\t\t);\n\t},\n};\n","export const ViewBaseConfig = Symbol.for('drizzle:ViewBaseConfig');\n","import type { CasingCache } from '~/casing.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { isPgEnum } from '~/pg-core/columns/enum.ts';\nimport type { SelectResult } from '~/query-builders/select.types.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { tracer } from '~/tracing.ts';\nimport type { Assume, Equal } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { AnyColumn } from '../column.ts';\nimport { Column } from '../column.ts';\nimport { IsAlias, Table } from '../table.ts';\n\n/**\n * This class is used to indicate a primitive param value that is used in `sql` tag.\n * It is only used on type level and is never instantiated at runtime.\n * If you see a value of this type in the code, its runtime value is actually the primitive param value.\n */\nexport class FakePrimitiveParam {\n\tstatic readonly [entityKind]: string = 'FakePrimitiveParam';\n}\n\nexport type Chunk =\n\t| string\n\t| Table\n\t| View\n\t| AnyColumn\n\t| Name\n\t| Param\n\t| Placeholder\n\t| SQL;\n\nexport interface BuildQueryConfig {\n\tcasing: CasingCache;\n\tescapeName(name: string): string;\n\tescapeParam(num: number, value: unknown): string;\n\tescapeString(str: string): string;\n\tprepareTyping?: (encoder: DriverValueEncoder<unknown, unknown>) => QueryTypingsValue;\n\tparamStartIndex?: { value: number };\n\tinlineParams?: boolean;\n\tinvokeSource?: 'indexes' | undefined;\n}\n\nexport type QueryTypingsValue = 'json' | 'decimal' | 'time' | 'timestamp' | 'uuid' | 'date' | 'none';\n\nexport interface Query {\n\tsql: string;\n\tparams: unknown[];\n}\n\nexport interface QueryWithTypings extends Query {\n\ttypings?: QueryTypingsValue[];\n}\n\n/**\n * Any value that implements the `getSQL` method. The implementations include:\n * - `Table`\n * - `Column`\n * - `View`\n * - `Subquery`\n * - `SQL`\n * - `SQL.Aliased`\n * - `Placeholder`\n * - `Param`\n */\nexport interface SQLWrapper {\n\tgetSQL(): SQL;\n\tshouldOmitSQLParens?(): boolean;\n}\n\nexport function isSQLWrapper(value: unknown): value is SQLWrapper {\n\treturn value !== null && value !== undefined && typeof (value as any).getSQL === 'function';\n}\n\nfunction mergeQueries(queries: QueryWithTypings[]): QueryWithTypings {\n\tconst result: QueryWithTypings = { sql: '', params: [] };\n\tfor (const query of queries) {\n\t\tresult.sql += query.sql;\n\t\tresult.params.push(...query.params);\n\t\tif (query.typings?.length) {\n\t\t\tif (!result.typings) {\n\t\t\t\tresult.typings = [];\n\t\t\t}\n\t\t\tresult.typings.push(...query.typings);\n\t\t}\n\t}\n\treturn result;\n}\n\nexport class StringChunk implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'StringChunk';\n\n\treadonly value: string[];\n\n\tconstructor(value: string | string[]) {\n\t\tthis.value = Array.isArray(value) ? value : [value];\n\t}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\nexport class SQL<T = unknown> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'SQL';\n\n\tdeclare _: {\n\t\tbrand: 'SQL';\n\t\ttype: T;\n\t};\n\n\t/** @internal */\n\tdecoder: DriverValueDecoder<T, any> = noopDecoder;\n\tprivate shouldInlineParams = false;\n\n\tconstructor(readonly queryChunks: SQLChunk[]) {}\n\n\tappend(query: SQL): this {\n\t\tthis.queryChunks.push(...query.queryChunks);\n\t\treturn this;\n\t}\n\n\ttoQuery(config: BuildQueryConfig): QueryWithTypings {\n\t\treturn tracer.startActiveSpan('drizzle.buildSQL', (span) => {\n\t\t\tconst query = this.buildQueryFromSourceParams(this.queryChunks, config);\n\t\t\tspan?.setAttributes({\n\t\t\t\t'drizzle.query.text': query.sql,\n\t\t\t\t'drizzle.query.params': JSON.stringify(query.params),\n\t\t\t});\n\t\t\treturn query;\n\t\t});\n\t}\n\n\tbuildQueryFromSourceParams(chunks: SQLChunk[], _config: BuildQueryConfig): Query {\n\t\tconst config = Object.assign({}, _config, {\n\t\t\tinlineParams: _config.inlineParams || this.shouldInlineParams,\n\t\t\tparamStartIndex: _config.paramStartIndex || { value: 0 },\n\t\t});\n\n\t\tconst {\n\t\t\tcasing,\n\t\t\tescapeName,\n\t\t\tescapeParam,\n\t\t\tprepareTyping,\n\t\t\tinlineParams,\n\t\t\tparamStartIndex,\n\t\t} = config;\n\n\t\treturn mergeQueries(chunks.map((chunk): QueryWithTypings => {\n\t\t\tif (is(chunk, StringChunk)) {\n\t\t\t\treturn { sql: chunk.value.join(''), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Name)) {\n\t\t\t\treturn { sql: escapeName(chunk.value), params: [] };\n\t\t\t}\n\n\t\t\tif (chunk === undefined) {\n\t\t\t\treturn { sql: '', params: [] };\n\t\t\t}\n\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\tconst result: SQLChunk[] = [new StringChunk('(')];\n\t\t\t\tfor (const [i, p] of chunk.entries()) {\n\t\t\t\t\tresult.push(p);\n\t\t\t\t\tif (i < chunk.length - 1) {\n\t\t\t\t\t\tresult.push(new StringChunk(', '));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tresult.push(new StringChunk(')'));\n\t\t\t\treturn this.buildQueryFromSourceParams(result, config);\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL)) {\n\t\t\t\treturn this.buildQueryFromSourceParams(chunk.queryChunks, {\n\t\t\t\t\t...config,\n\t\t\t\t\tinlineParams: inlineParams || chunk.shouldInlineParams,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif (is(chunk, Table)) {\n\t\t\t\tconst schemaName = chunk[Table.Symbol.Schema];\n\t\t\t\tconst tableName = chunk[Table.Symbol.Name];\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === undefined || chunk[IsAlias]\n\t\t\t\t\t\t? escapeName(tableName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(tableName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Column)) {\n\t\t\t\tconst columnName = casing.getColumnCasing(chunk);\n\t\t\t\tif (_config.invokeSource === 'indexes') {\n\t\t\t\t\treturn { sql: escapeName(columnName), params: [] };\n\t\t\t\t}\n\n\t\t\t\tconst schemaName = chunk.table[Table.Symbol.Schema];\n\t\t\t\treturn {\n\t\t\t\t\tsql: chunk.table[IsAlias] || schemaName === undefined\n\t\t\t\t\t\t? escapeName(chunk.table[Table.Symbol.Name]) + '.' + escapeName(columnName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(chunk.table[Table.Symbol.Name]) + '.'\n\t\t\t\t\t\t\t+ escapeName(columnName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, View)) {\n\t\t\t\tconst schemaName = chunk[ViewBaseConfig].schema;\n\t\t\t\tconst viewName = chunk[ViewBaseConfig].name;\n\t\t\t\treturn {\n\t\t\t\t\tsql: schemaName === undefined || chunk[ViewBaseConfig].isAlias\n\t\t\t\t\t\t? escapeName(viewName)\n\t\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(viewName),\n\t\t\t\t\tparams: [],\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tif (is(chunk, Param)) {\n\t\t\t\tif (is(chunk.value, Placeholder)) {\n\t\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t\t}\n\n\t\t\t\tconst mappedValue = chunk.value === null ? null : chunk.encoder.mapToDriverValue(chunk.value);\n\n\t\t\t\tif (is(mappedValue, SQL)) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([mappedValue], config);\n\t\t\t\t}\n\n\t\t\t\tif (inlineParams) {\n\t\t\t\t\treturn { sql: this.mapInlineParam(mappedValue, config), params: [] };\n\t\t\t\t}\n\n\t\t\t\tlet typings: QueryTypingsValue[] = ['none'];\n\t\t\t\tif (prepareTyping) {\n\t\t\t\t\ttypings = [prepareTyping(chunk.encoder)];\n\t\t\t\t}\n\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, mappedValue), params: [mappedValue], typings };\n\t\t\t}\n\n\t\t\tif (is(chunk, Placeholder)) {\n\t\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t\t}\n\n\t\t\tif (is(chunk, SQL.Aliased) && chunk.fieldAlias !== undefined) {\n\t\t\t\treturn { sql: escapeName(chunk.fieldAlias), params: [] };\n\t\t\t}\n\n\t\t\tif (is(chunk, Subquery)) {\n\t\t\t\tif (chunk._.isWith) {\n\t\t\t\t\treturn { sql: escapeName(chunk._.alias), params: [] };\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk._.sql,\n\t\t\t\t\tnew StringChunk(') '),\n\t\t\t\t\tnew Name(chunk._.alias),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (isPgEnum(chunk)) {\n\t\t\t\tif (chunk.schema) {\n\t\t\t\t\treturn { sql: escapeName(chunk.schema) + '.' + escapeName(chunk.enumName), params: [] };\n\t\t\t\t}\n\t\t\t\treturn { sql: escapeName(chunk.enumName), params: [] };\n\t\t\t}\n\n\t\t\tif (isSQLWrapper(chunk)) {\n\t\t\t\tif (chunk.shouldOmitSQLParens?.()) {\n\t\t\t\t\treturn this.buildQueryFromSourceParams([chunk.getSQL()], config);\n\t\t\t\t}\n\t\t\t\treturn this.buildQueryFromSourceParams([\n\t\t\t\t\tnew StringChunk('('),\n\t\t\t\t\tchunk.getSQL(),\n\t\t\t\t\tnew StringChunk(')'),\n\t\t\t\t], config);\n\t\t\t}\n\n\t\t\tif (inlineParams) {\n\t\t\t\treturn { sql: this.mapInlineParam(chunk, config), params: [] };\n\t\t\t}\n\n\t\t\treturn { sql: escapeParam(paramStartIndex.value++, chunk), params: [chunk], typings: ['none'] };\n\t\t}));\n\t}\n\n\tprivate mapInlineParam(\n\t\tchunk: unknown,\n\t\t{ escapeString }: BuildQueryConfig,\n\t): string {\n\t\tif (chunk === null) {\n\t\t\treturn 'null';\n\t\t}\n\t\tif (typeof chunk === 'number' || typeof chunk === 'boolean') {\n\t\t\treturn chunk.toString();\n\t\t}\n\t\tif (typeof chunk === 'string') {\n\t\t\treturn escapeString(chunk);\n\t\t}\n\t\tif (typeof chunk === 'object') {\n\t\t\tconst mappedValueAsString = chunk.toString();\n\t\t\tif (mappedValueAsString === '[object Object]') {\n\t\t\t\treturn escapeString(JSON.stringify(chunk));\n\t\t\t}\n\t\t\treturn escapeString(mappedValueAsString);\n\t\t}\n\t\tthrow new Error('Unexpected param value: ' + chunk);\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this;\n\t}\n\n\tas(alias: string): SQL.Aliased<T>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(): SQL<TData>;\n\t/**\n\t * @deprecated\n\t * Use ``sql<DataType>`query`.as(alias)`` instead.\n\t */\n\tas<TData>(alias: string): SQL.Aliased<TData>;\n\tas(alias?: string): SQL<T> | SQL.Aliased<T> {\n\t\t// TODO: remove with deprecated overloads\n\t\tif (alias === undefined) {\n\t\t\treturn this;\n\t\t}\n\n\t\treturn new SQL.Aliased(this, alias);\n\t}\n\n\tmapWith<\n\t\tTDecoder extends\n\t\t\t| DriverValueDecoder<any, any>\n\t\t\t| DriverValueDecoder<any, any>['mapFromDriverValue'],\n\t>(decoder: TDecoder): SQL<GetDecoderResult<TDecoder>> {\n\t\tthis.decoder = typeof decoder === 'function' ? { mapFromDriverValue: decoder } : decoder;\n\t\treturn this as SQL<GetDecoderResult<TDecoder>>;\n\t}\n\n\tinlineParams(): this {\n\t\tthis.shouldInlineParams = true;\n\t\treturn this;\n\t}\n\n\t/**\n\t * This method is used to conditionally include a part of the query.\n\t *\n\t * @param condition - Condition to check\n\t * @returns itself if the condition is `true`, otherwise `undefined`\n\t */\n\tif(condition: any | undefined): this | undefined {\n\t\treturn condition ? this : undefined;\n\t}\n}\n\nexport type GetDecoderResult<T> = T extends Column ? T['_']['data'] : T extends\n\t| DriverValueDecoder<infer TData, any>\n\t| DriverValueDecoder<infer TData, any>['mapFromDriverValue'] ? TData\n: never;\n\n/**\n * Any DB name (table, column, index etc.)\n */\nexport class Name implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Name';\n\n\tprotected brand!: 'Name';\n\n\tconstructor(readonly value: string) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/**\n * Any DB name (table, column, index etc.)\n * @deprecated Use `sql.identifier` instead.\n */\nexport function name(value: string): Name {\n\treturn new Name(value);\n}\n\nexport interface DriverValueDecoder<TData, TDriverParam> {\n\tmapFromDriverValue(value: TDriverParam): TData;\n}\n\nexport interface DriverValueEncoder<TData, TDriverParam> {\n\tmapToDriverValue(value: TData): TDriverParam | SQL;\n}\n\nexport function isDriverValueEncoder(value: unknown): value is DriverValueEncoder<any, any> {\n\treturn typeof value === 'object' && value !== null && 'mapToDriverValue' in value\n\t\t&& typeof (value as any).mapToDriverValue === 'function';\n}\n\nexport const noopDecoder: DriverValueDecoder<any, any> = {\n\tmapFromDriverValue: (value) => value,\n};\n\nexport const noopEncoder: DriverValueEncoder<any, any> = {\n\tmapToDriverValue: (value) => value,\n};\n\nexport interface DriverValueMapper<TData, TDriverParam>\n\textends DriverValueDecoder<TData, TDriverParam>, DriverValueEncoder<TData, TDriverParam>\n{}\n\nexport const noopMapper: DriverValueMapper<any, any> = {\n\t...noopDecoder,\n\t...noopEncoder,\n};\n\n/** Parameter value that is optionally bound to an encoder (for example, a column). */\nexport class Param<TDataType = unknown, TDriverParamType = TDataType> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Param';\n\n\tprotected brand!: 'BoundParamValue';\n\n\t/**\n\t * @param value - Parameter value\n\t * @param encoder - Encoder to convert the value to a driver parameter\n\t */\n\tconstructor(\n\t\treadonly value: TDataType,\n\t\treadonly encoder: DriverValueEncoder<TDataType, TDriverParamType> = noopEncoder,\n\t) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.param` instead. */\nexport function param<TData, TDriver>(\n\tvalue: TData,\n\tencoder?: DriverValueEncoder<TData, TDriver>,\n): Param<TData, TDriver> {\n\treturn new Param(value, encoder);\n}\n\n/**\n * Anything that can be passed to the `` sql`...` `` tagged function.\n */\nexport type SQLChunk =\n\t| StringChunk\n\t| SQLChunk[]\n\t| SQLWrapper\n\t| SQL\n\t| Table\n\t| View\n\t| Subquery\n\t| AnyColumn\n\t| Param\n\t| Name\n\t| undefined\n\t| FakePrimitiveParam\n\t| Placeholder;\n\nexport function sql<T>(strings: TemplateStringsArray, ...params: any[]): SQL<T>;\n/*\n\tThe type of `params` is specified as `SQLChunk[]`, but that's slightly incorrect -\n\tin runtime, users won't pass `FakePrimitiveParam` instances as `params` - they will pass primitive values\n\twhich will be wrapped in `Param`. That's why the overload specifies `params` as `any[]` and not as `SQLSourceParam[]`.\n\tThis type is used to make our lives easier and the type checker happy.\n*/\nexport function sql(strings: TemplateStringsArray, ...params: SQLChunk[]): SQL {\n\tconst queryChunks: SQLChunk[] = [];\n\tif (params.length > 0 || (strings.length > 0 && strings[0] !== '')) {\n\t\tqueryChunks.push(new StringChunk(strings[0]!));\n\t}\n\tfor (const [paramIndex, param] of params.entries()) {\n\t\tqueryChunks.push(param, new StringChunk(strings[paramIndex + 1]!));\n\t}\n\n\treturn new SQL(queryChunks);\n}\n\nexport namespace sql {\n\texport function empty(): SQL {\n\t\treturn new SQL([]);\n\t}\n\n\t/** @deprecated - use `sql.join()` */\n\texport function fromList(list: SQLChunk[]): SQL {\n\t\treturn new SQL(list);\n\t}\n\n\t/**\n\t * Convenience function to create an SQL query from a raw string.\n\t * @param str The raw SQL query string.\n\t */\n\texport function raw(str: string): SQL {\n\t\treturn new SQL([new StringChunk(str)]);\n\t}\n\n\t/**\n\t * Join a list of SQL chunks with a separator.\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`]);\n\t * // sql`abc`\n\t * ```\n\t * @example\n\t * ```ts\n\t * const query = sql.join([sql`a`, sql`b`, sql`c`], sql`, `);\n\t * // sql`a, b, c`\n\t * ```\n\t */\n\texport function join(chunks: SQLChunk[], separator?: SQLChunk): SQL {\n\t\tconst result: SQLChunk[] = [];\n\t\tfor (const [i, chunk] of chunks.entries()) {\n\t\t\tif (i > 0 && separator !== undefined) {\n\t\t\t\tresult.push(separator);\n\t\t\t}\n\t\t\tresult.push(chunk);\n\t\t}\n\t\treturn new SQL(result);\n\t}\n\n\t/**\n\t * Create a SQL chunk that represents a DB identifier (table, column, index etc.).\n\t * When used in a query, the identifier will be escaped based on the DB engine.\n\t * For example, in PostgreSQL, identifiers are escaped with double quotes.\n\t *\n\t * **WARNING: This function does not offer any protection against SQL injections, so you must validate any user input beforehand.**\n\t *\n\t * @example ```ts\n\t * const query = sql`SELECT * FROM ${sql.identifier('my-table')}`;\n\t * // 'SELECT * FROM \"my-table\"'\n\t * ```\n\t */\n\texport function identifier(value: string): Name {\n\t\treturn new Name(value);\n\t}\n\n\texport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\t\treturn new Placeholder(name);\n\t}\n\n\texport function param<TData, TDriver>(\n\t\tvalue: TData,\n\t\tencoder?: DriverValueEncoder<TData, TDriver>,\n\t): Param<TData, TDriver> {\n\t\treturn new Param(value, encoder);\n\t}\n}\n\nexport namespace SQL {\n\texport class Aliased<T = unknown> implements SQLWrapper {\n\t\tstatic readonly [entityKind]: string = 'SQL.Aliased';\n\n\t\tdeclare _: {\n\t\t\tbrand: 'SQL.Aliased';\n\t\t\ttype: T;\n\t\t};\n\n\t\t/** @internal */\n\t\tisSelectionField = false;\n\n\t\tconstructor(\n\t\t\treadonly sql: SQL,\n\t\t\treadonly fieldAlias: string,\n\t\t) {}\n\n\t\tgetSQL(): SQL {\n\t\t\treturn this.sql;\n\t\t}\n\n\t\t/** @internal */\n\t\tclone() {\n\t\t\treturn new Aliased(this.sql, this.fieldAlias);\n\t\t}\n\t}\n}\n\nexport class Placeholder<TName extends string = string, TValue = any> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Placeholder';\n\n\tdeclare protected: TValue;\n\n\tconstructor(readonly name: TName) {}\n\n\tgetSQL(): SQL {\n\t\treturn new SQL([this]);\n\t}\n}\n\n/** @deprecated Use `sql.placeholder` instead. */\nexport function placeholder<TName extends string>(name: TName): Placeholder<TName> {\n\treturn new Placeholder(name);\n}\n\nexport function fillPlaceholders(params: unknown[], values: Record<string, unknown>): unknown[] {\n\treturn params.map((p) => {\n\t\tif (is(p, Placeholder)) {\n\t\t\tif (!(p.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.name}\" was provided`);\n\t\t\t}\n\n\t\t\treturn values[p.name];\n\t\t}\n\n\t\tif (is(p, Param) && is(p.value, Placeholder)) {\n\t\t\tif (!(p.value.name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${p.value.name}\" was provided`);\n\t\t\t}\n\n\t\t\treturn p.encoder.mapToDriverValue(values[p.value.name]);\n\t\t}\n\n\t\treturn p;\n\t});\n}\n\nexport type ColumnsSelection = Record<string, unknown>;\n\nconst IsDrizzleView = Symbol.for('drizzle:IsDrizzleView');\n\nexport abstract class View<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'View';\n\n\tdeclare _: {\n\t\tbrand: 'View';\n\t\tviewBrand: string;\n\t\tname: TName;\n\t\texisting: TExisting;\n\t\tselectedFields: TSelection;\n\t};\n\n\t/** @internal */\n\t[ViewBaseConfig]: {\n\t\tname: TName;\n\t\toriginalName: TName;\n\t\tschema: string | undefined;\n\t\tselectedFields: ColumnsSelection;\n\t\tisExisting: TExisting;\n\t\tquery: TExisting extends true ? undefined : SQL;\n\t\tisAlias: boolean;\n\t};\n\n\t/** @internal */\n\t[IsDrizzleView] = true;\n\n\tdeclare readonly $inferSelect: InferSelectViewModel<View<Assume<TName, string>, TExisting, TSelection>>;\n\n\tconstructor(\n\t\t{ name, schema, selectedFields, query }: {\n\t\t\tname: TName;\n\t\t\tschema: string | undefined;\n\t\t\tselectedFields: ColumnsSelection;\n\t\t\tquery: SQL | undefined;\n\t\t},\n\t) {\n\t\tthis[ViewBaseConfig] = {\n\t\t\tname,\n\t\t\toriginalName: name,\n\t\t\tschema,\n\t\t\tselectedFields,\n\t\t\tquery: query as (TExisting extends true ? undefined : SQL),\n\t\t\tisExisting: !query as TExisting,\n\t\t\tisAlias: false,\n\t\t};\n\t}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\nexport function isView(view: unknown): view is View {\n\treturn typeof view === 'object' && view !== null && IsDrizzleView in view;\n}\n\nexport function getViewName<T extends View>(view: T): T['_']['name'] {\n\treturn view[ViewBaseConfig].name;\n}\n\nexport type InferSelectViewModel<TView extends View> =\n\tEqual<TView['_']['selectedFields'], { [x: string]: unknown }> extends true ? { [x: string]: unknown }\n\t\t: SelectResult<\n\t\t\tTView['_']['selectedFields'],\n\t\t\t'single',\n\t\t\tRecord<TView['_']['name'], 'not-null'>\n\t\t>;\n\n// Defined separately from the Column class to resolve circular dependency\nColumn.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\n// Defined separately from the Table class to resolve circular dependency\nTable.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\n// Defined separately from the Column class to resolve circular dependency\nSubquery.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n","import type { AnyColumn } from './column.ts';\nimport { Column } from './column.ts';\nimport { is } from './entity.ts';\nimport type { Logger } from './logger.ts';\nimport type { SelectedFieldsOrdered } from './operations.ts';\nimport type { TableLike } from './query-builders/select.types.ts';\nimport { Param, SQL, View } from './sql/sql.ts';\nimport type { DriverValueDecoder } from './sql/sql.ts';\nimport { Subquery } from './subquery.ts';\nimport { getTableName, Table } from './table.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\n/** @internal */\nexport function mapResultRow<TResult>(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\trow: unknown[],\n\tjoinsNotNullableMap: Record<string, boolean> | undefined,\n): TResult {\n\t// Key -> nested object key, value -> table name if all fields in the nested object are from the same table, false otherwise\n\tconst nullifyMap: Record<string, string | false> = {};\n\n\tconst result = columns.reduce<Record<string, any>>(\n\t\t(result, { path, field }, columnIndex) => {\n\t\t\tlet decoder: DriverValueDecoder<unknown, unknown>;\n\t\t\tif (is(field, Column)) {\n\t\t\t\tdecoder = field;\n\t\t\t} else if (is(field, SQL)) {\n\t\t\t\tdecoder = field.decoder;\n\t\t\t} else {\n\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t}\n\t\t\tlet node = result;\n\t\t\tfor (const [pathChunkIndex, pathChunk] of path.entries()) {\n\t\t\t\tif (pathChunkIndex < path.length - 1) {\n\t\t\t\t\tif (!(pathChunk in node)) {\n\t\t\t\t\t\tnode[pathChunk] = {};\n\t\t\t\t\t}\n\t\t\t\t\tnode = node[pathChunk];\n\t\t\t\t} else {\n\t\t\t\t\tconst rawValue = row[columnIndex]!;\n\t\t\t\t\tconst value = node[pathChunk] = rawValue === null ? null : decoder.mapFromDriverValue(rawValue);\n\n\t\t\t\t\tif (joinsNotNullableMap && is(field, Column) && path.length === 2) {\n\t\t\t\t\t\tconst objectName = path[0]!;\n\t\t\t\t\t\tif (!(objectName in nullifyMap)) {\n\t\t\t\t\t\t\tnullifyMap[objectName] = value === null ? getTableName(field.table) : false;\n\t\t\t\t\t\t} else if (\n\t\t\t\t\t\t\ttypeof nullifyMap[objectName] === 'string' && nullifyMap[objectName] !== getTableName(field.table)\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tnullifyMap[objectName] = false;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn result;\n\t\t},\n\t\t{},\n\t);\n\n\t// Nullify all nested objects from nullifyMap that are nullable\n\tif (joinsNotNullableMap && Object.keys(nullifyMap).length > 0) {\n\t\tfor (const [objectName, tableName] of Object.entries(nullifyMap)) {\n\t\t\tif (typeof tableName === 'string' && !joinsNotNullableMap[tableName]) {\n\t\t\t\tresult[objectName] = null;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn result as TResult;\n}\n\n/** @internal */\nexport function orderSelectedFields<TColumn extends AnyColumn>(\n\tfields: Record<string, unknown>,\n\tpathPrefix?: string[],\n): SelectedFieldsOrdered<TColumn> {\n\treturn Object.entries(fields).reduce<SelectedFieldsOrdered<AnyColumn>>((result, [name, field]) => {\n\t\tif (typeof name !== 'string') {\n\t\t\treturn result;\n\t\t}\n\n\t\tconst newPath = pathPrefix ? [...pathPrefix, name] : [name];\n\t\tif (is(field, Column) || is(field, SQL) || is(field, SQL.Aliased)) {\n\t\t\tresult.push({ path: newPath, field });\n\t\t} else if (is(field, Table)) {\n\t\t\tresult.push(...orderSelectedFields(field[Table.Symbol.Columns], newPath));\n\t\t} else {\n\t\t\tresult.push(...orderSelectedFields(field as Record<string, unknown>, newPath));\n\t\t}\n\t\treturn result;\n\t}, []) as SelectedFieldsOrdered<TColumn>;\n}\n\nexport function haveSameKeys(left: Record<string, unknown>, right: Record<string, unknown>) {\n\tconst leftKeys = Object.keys(left);\n\tconst rightKeys = Object.keys(right);\n\n\tif (leftKeys.length !== rightKeys.length) {\n\t\treturn false;\n\t}\n\n\tfor (const [index, key] of leftKeys.entries()) {\n\t\tif (key !== rightKeys[index]) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/** @internal */\nexport function mapUpdateSet(table: Table, values: Record<string, unknown>): UpdateSet {\n\tconst entries: [string, UpdateSet[string]][] = Object.entries(values)\n\t\t.filter(([, value]) => value !== undefined)\n\t\t.map(([key, value]) => {\n\t\t\t// eslint-disable-next-line unicorn/prefer-ternary\n\t\t\tif (is(value, SQL) || is(value, Column)) {\n\t\t\t\treturn [key, value];\n\t\t\t} else {\n\t\t\t\treturn [key, new Param(value, table[Table.Symbol.Columns][key])];\n\t\t\t}\n\t\t});\n\n\tif (entries.length === 0) {\n\t\tthrow new Error('No values to set');\n\t}\n\n\treturn Object.fromEntries(entries);\n}\n\nexport type UpdateSet = Record<string, SQL | Param | AnyColumn | null | undefined>;\n\nexport type OneOrMany<T> = T | T[];\n\nexport type Update<T, TUpdate> =\n\t& {\n\t\t[K in Exclude<keyof T, keyof TUpdate>]: T[K];\n\t}\n\t& TUpdate;\n\nexport type Simplify<T> =\n\t& {\n\t\t// @ts-ignore - \"Type parameter 'K' has a circular constraint\", not sure why\n\t\t[K in keyof T]: T[K];\n\t}\n\t& {};\n\nexport type SimplifyMappedType<T> = [T] extends [unknown] ? T : never;\n\nexport type ShallowRecord<K extends keyof any, T> = SimplifyMappedType<{ [P in K]: T }>;\n\nexport type Assume<T, U> = T extends U ? T : U;\n\nexport type Equal<X, Y> = (<T>() => T extends X ? 1 : 2) extends (<T>() => T extends Y ? 1 : 2) ? true : false;\n\nexport interface DrizzleTypeError<T extends string> {\n\t$drizzleTypeError: T;\n}\n\nexport type ValueOrArray<T> = T | T[];\n\n/** @internal */\nexport function applyMixins(baseClass: any, extendedClasses: any[]) {\n\tfor (const extendedClass of extendedClasses) {\n\t\tfor (const name of Object.getOwnPropertyNames(extendedClass.prototype)) {\n\t\t\tif (name === 'constructor') continue;\n\n\t\t\tObject.defineProperty(\n\t\t\t\tbaseClass.prototype,\n\t\t\t\tname,\n\t\t\t\tObject.getOwnPropertyDescriptor(extendedClass.prototype, name) || Object.create(null),\n\t\t\t);\n\t\t}\n\t}\n}\n\nexport type Or<T1, T2> = T1 extends true ? true : T2 extends true ? true : false;\n\nexport type IfThenElse<If, Then, Else> = If extends true ? Then : Else;\n\nexport type PromiseOf<T> = T extends Promise<infer U> ? U : T;\n\nexport type Writable<T> = {\n\t-readonly [P in keyof T]: T[P];\n};\n\nexport function getTableColumns<T extends Table>(table: T): T['_']['columns'] {\n\treturn table[Table.Symbol.Columns];\n}\n\nexport function getViewSelectedFields<T extends View>(view: T): T['_']['selectedFields'] {\n\treturn view[ViewBaseConfig].selectedFields;\n}\n\n/** @internal */\nexport function getTableLikeName(table: TableLike): string | undefined {\n\treturn is(table, Subquery)\n\t\t? table._.alias\n\t\t: is(table, View)\n\t\t? table[ViewBaseConfig].name\n\t\t: is(table, SQL)\n\t\t? undefined\n\t\t: table[Table.Symbol.IsAlias]\n\t\t? table[Table.Symbol.Name]\n\t\t: table[Table.Symbol.BaseName];\n}\n\nexport type ColumnsWithTable<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends AnyColumn<{ tableName: TTableName }>[],\n> = { [Key in keyof TColumns]: AnyColumn<{ tableName: TForeignTableName }> };\n\nexport type Casing = 'snake_case' | 'camelCase';\n\nexport interface DrizzleConfig<TSchema extends Record<string, unknown> = Record<string, never>> {\n\tlogger?: boolean | Logger;\n\tschema?: TSchema;\n\tcasing?: Casing;\n}\nexport type ValidateShape<T, ValidShape, TResult = T> = T extends ValidShape\n\t? Exclude<keyof T, keyof ValidShape> extends never ? TResult\n\t: DrizzleTypeError<\n\t\t`Invalid key(s): ${Exclude<(keyof T) & (string | number | bigint | boolean | null | undefined), keyof ValidShape>}`\n\t>\n\t: never;\n\nexport type KnownKeysOnly<T, U> = {\n\t[K in keyof T]: K extends keyof U ? T[K] : never;\n};\n\nexport type IsAny<T> = 0 extends (1 & T) ? true : false;\n\n/** @internal */\nexport function getColumnNameAndConfig<\n\tTConfig extends Record<string, any> | undefined,\n>(a: string | TConfig | undefined, b: TConfig | undefined) {\n\treturn {\n\t\tname: typeof a === 'string' && a.length > 0 ? a : '' as string,\n\t\tconfig: typeof a === 'object' ? a : b as TConfig,\n\t};\n}\n\nexport type IfNotImported<T, Y, N> = unknown extends T ? Y : N;\n\nexport type ImportTypeError<TPackageName extends string> =\n\t`Please install \\`${TPackageName}\\` to allow Drizzle ORM to connect to the database`;\n\nexport type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Keys extends any\n\t? Required<Pick<T, Keys>> & Partial<Omit<T, Keys>>\n\t: never;\n\ntype ExpectedConfigShape = {\n\tlogger?: boolean | {\n\t\tlogQuery(query: string, params: unknown[]): void;\n\t};\n\tschema?: Record<string, never>;\n\tcasing?: 'snake_case' | 'camelCase';\n};\n\n// If this errors, you must update config shape checker function with new config specs\nconst _: DrizzleConfig = {} as ExpectedConfigShape;\nconst __: ExpectedConfigShape = {} as DrizzleConfig;\n\nexport function isConfig(data: any): boolean {\n\tif (typeof data !== 'object' || data === null) return false;\n\n\tif (data.constructor.name !== 'Object') return false;\n\n\tif ('logger' in data) {\n\t\tconst type = typeof data['logger'];\n\t\tif (\n\t\t\ttype !== 'boolean' && (type !== 'object' || typeof data['logger']['logQuery'] !== 'function')\n\t\t\t&& type !== 'undefined'\n\t\t) return false;\n\n\t\treturn true;\n\t}\n\n\tif ('schema' in data) {\n\t\tconst type = typeof data['logger'];\n\t\tif (type !== 'object' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('casing' in data) {\n\t\tconst type = typeof data['logger'];\n\t\tif (type !== 'string' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('mode' in data) {\n\t\tif (data['mode'] !== 'default' || data['mode'] !== 'planetscale' || data['mode'] !== undefined) return false;\n\n\t\treturn true;\n\t}\n\n\tif ('connection' in data) {\n\t\tconst type = typeof data['connection'];\n\t\tif (type !== 'string' && type !== 'object' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('client' in data) {\n\t\tconst type = typeof data['client'];\n\t\tif (type !== 'object' && type !== 'function' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif (Object.keys(data).length === 0) return true;\n\n\treturn false;\n}\n\nexport type NeonAuthToken = string | (() => string | Promise<string>);\n","import type { BuildColumns, BuildExtraConfigColumns } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport { Table, type TableConfig as TableConfigBase, type UpdateTableConfig } from '~/table.ts';\nimport type { CheckBuilder } from './checks.ts';\nimport { getPgColumnBuilders, type PgColumnsBuilders } from './columns/all.ts';\nimport type { PgColumn, PgColumnBuilder, PgColumnBuilderBase } from './columns/common.ts';\nimport type { ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { AnyIndexBuilder } from './indexes.ts';\nimport type { PgPolicy } from './policies.ts';\nimport type { PrimaryKeyBuilder } from './primary-keys.ts';\nimport type { UniqueConstraintBuilder } from './unique-constraint.ts';\n\nexport type PgTableExtraConfigValue =\n\t| AnyIndexBuilder\n\t| CheckBuilder\n\t| ForeignKeyBuilder\n\t| PrimaryKeyBuilder\n\t| UniqueConstraintBuilder\n\t| PgPolicy;\n\nexport type PgTableExtraConfig = Record<\n\tstring,\n\tPgTableExtraConfigValue\n>;\n\nexport type TableConfig = TableConfigBase<PgColumn>;\n\n/** @internal */\nexport const InlineForeignKeys = Symbol.for('drizzle:PgInlineForeignKeys');\n/** @internal */\nexport const EnableRLS = Symbol.for('drizzle:EnableRLS');\n\nexport class PgTable<T extends TableConfig = TableConfig> extends Table<T> {\n\tstatic override readonly [entityKind]: string = 'PgTable';\n\n\t/** @internal */\n\tstatic override readonly Symbol = Object.assign({}, Table.Symbol, {\n\t\tInlineForeignKeys: InlineForeignKeys as typeof InlineForeignKeys,\n\t\tEnableRLS: EnableRLS as typeof EnableRLS,\n\t});\n\n\t/**@internal */\n\t[InlineForeignKeys]: ForeignKey[] = [];\n\n\t/** @internal */\n\t[EnableRLS]: boolean = false;\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigBuilder]: ((self: Record<string, PgColumn>) => PgTableExtraConfig) | undefined =\n\t\tundefined;\n}\n\nexport type AnyPgTable<TPartial extends Partial<TableConfig> = {}> = PgTable<UpdateTableConfig<TableConfig, TPartial>>;\n\nexport type PgTableWithColumns<T extends TableConfig> =\n\t& PgTable<T>\n\t& {\n\t\t[Key in keyof T['columns']]: T['columns'][Key];\n\t}\n\t& {\n\t\tenableRLS: () => Omit<\n\t\t\tPgTableWithColumns<T>,\n\t\t\t'enableRLS'\n\t\t>;\n\t};\n\n/** @internal */\nexport function pgTableWithSchema<\n\tTTableName extends string,\n\tTSchemaName extends string | undefined,\n\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n>(\n\tname: TTableName,\n\tcolumns: TColumnsMap | ((columnTypes: PgColumnsBuilders) => TColumnsMap),\n\textraConfig:\n\t\t| ((self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>) => PgTableExtraConfig | PgTableExtraConfigValue[])\n\t\t| undefined,\n\tschema: TSchemaName,\n\tbaseName = name,\n): PgTableWithColumns<{\n\tname: TTableName;\n\tschema: TSchemaName;\n\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\tdialect: 'pg';\n}> {\n\tconst rawTable = new PgTable<{\n\t\tname: TTableName;\n\t\tschema: TSchemaName;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>(name, schema, baseName);\n\n\tconst parsedColumns: TColumnsMap = typeof columns === 'function' ? columns(getPgColumnBuilders()) : columns;\n\n\tconst builtColumns = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as PgColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.build(rawTable);\n\t\t\trawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\n\tconst builtColumnsForExtraConfig = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as PgColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.buildExtraConfigColumn(rawTable);\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>;\n\n\tconst table = Object.assign(rawTable, builtColumns);\n\n\ttable[Table.Symbol.Columns] = builtColumns;\n\ttable[Table.Symbol.ExtraConfigColumns] = builtColumnsForExtraConfig;\n\n\tif (extraConfig) {\n\t\ttable[PgTable.Symbol.ExtraConfigBuilder] = extraConfig as any;\n\t}\n\n\treturn Object.assign(table, {\n\t\tenableRLS: () => {\n\t\t\ttable[PgTable.Symbol.EnableRLS] = true;\n\t\t\treturn table as PgTableWithColumns<{\n\t\t\t\tname: TTableName;\n\t\t\t\tschema: TSchemaName;\n\t\t\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\t\t\tdialect: 'pg';\n\t\t\t}>;\n\t\t},\n\t});\n}\n\nexport interface PgTableFn<TSchema extends string | undefined = undefined> {\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (\n\t\t\tself: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>,\n\t\t) => PgTableExtraConfigValue[],\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: PgColumnsBuilders) => TColumnsMap,\n\t\textraConfig?: (self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>) => PgTableExtraConfigValue[],\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n\t/**\n\t * @deprecated The third parameter of pgTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig: (\n\t\t\tself: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>,\n\t\t) => PgTableExtraConfig,\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n\n\t/**\n\t * @deprecated The third parameter of pgTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = pgTable(\"users\", {\n\t * \tid: integer(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, PgColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: PgColumnsBuilders) => TColumnsMap,\n\t\textraConfig: (self: BuildExtraConfigColumns<TTableName, TColumnsMap, 'pg'>) => PgTableExtraConfig,\n\t): PgTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'pg'>;\n\t\tdialect: 'pg';\n\t}>;\n}\n\nexport const pgTable: PgTableFn = (name, columns, extraConfig) => {\n\treturn pgTableWithSchema(name, columns, extraConfig, undefined);\n};\n\nexport function pgTableCreator(customizeTableName: (name: string) => string): PgTableFn {\n\treturn (name, columns, extraConfig) => {\n\t\treturn pgTableWithSchema(customizeTableName(name) as typeof name, columns, extraConfig, undefined, name);\n\t};\n}\n","import { entityKind } from '~/entity.ts';\nimport type { AnyPgColumn, PgColumn } from './columns/index.ts';\nimport { PgTable } from './table.ts';\n\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumn extends AnyPgColumn<{ tableName: TTableName }>,\n\tTColumns extends AnyPgColumn<{ tableName: TTableName }>[],\n>(config: { name?: string; columns: [TColumn, ...TColumns] }): PrimaryKeyBuilder;\n/**\n * @deprecated: Please use primaryKey({ columns: [] }) instead of this function\n * @param columns\n */\nexport function primaryKey<\n\tTTableName extends string,\n\tTColumns extends AnyPgColumn<{ tableName: TTableName }>[],\n>(...columns: TColumns): PrimaryKeyBuilder;\nexport function primaryKey(...config: any) {\n\tif (config[0].columns) {\n\t\treturn new PrimaryKeyBuilder(config[0].columns, config[0].name);\n\t}\n\treturn new PrimaryKeyBuilder(config);\n}\n\nexport class PrimaryKeyBuilder {\n\tstatic readonly [entityKind]: string = 'PgPrimaryKeyBuilder';\n\n\t/** @internal */\n\tcolumns: PgColumn[];\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tcolumns: PgColumn[],\n\t\tname?: string,\n\t) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\t/** @internal */\n\tbuild(table: PgTable): PrimaryKey {\n\t\treturn new PrimaryKey(table, this.columns, this.name);\n\t}\n}\n\nexport class PrimaryKey {\n\tstatic readonly [entityKind]: string = 'PgPrimaryKey';\n\n\treadonly columns: AnyPgColumn<{}>[];\n\treadonly name?: string;\n\n\tconstructor(readonly table: PgTable, columns: AnyPgColumn<{}>[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name;\n\t}\n\n\tgetName(): string {\n\t\treturn this.name ?? `${this.table[PgTable.Symbol.Name]}_${this.columns.map((column) => column.name).join('_')}_pk`;\n\t}\n}\n","import { type AnyColumn, Column, type GetColumnData } from '~/column.ts';\nimport { is } from '~/entity.ts';\nimport { Table } from '~/table.ts';\nimport {\n\tisDriverValueEncoder,\n\tisSQLWrapper,\n\tParam,\n\tPlaceholder,\n\tSQL,\n\tsql,\n\ttype SQLChunk,\n\ttype SQLWrapper,\n\tStringChunk,\n\tView,\n} from '../sql.ts';\n\nexport function bindIfParam(value: unknown, column: SQLWrapper): SQLChunk {\n\tif (\n\t\tisDriverValueEncoder(column)\n\t\t&& !isSQLWrapper(value)\n\t\t&& !is(value, Param)\n\t\t&& !is(value, Placeholder)\n\t\t&& !is(value, Column)\n\t\t&& !is(value, Table)\n\t\t&& !is(value, View)\n\t) {\n\t\treturn new Param(value, column);\n\t}\n\treturn value as SQLChunk;\n}\n\nexport interface BinaryOperator {\n\t<TColumn extends Column>(\n\t\tleft: TColumn,\n\t\tright: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\t): SQL;\n\t<T>(left: SQL.Aliased<T>, right: T | SQLWrapper): SQL;\n\t<T extends SQLWrapper>(\n\t\tleft: Exclude<T, SQL.Aliased | Column>,\n\t\tright: unknown,\n\t): SQL;\n}\n\n/**\n * Test that two values are equal.\n *\n * Remember that the SQL standard dictates that\n * two NULL values are not equal, so if you want to test\n * whether a value is null, you may want to use\n * `isNull` instead.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by Ford\n * db.select().from(cars)\n * .where(eq(cars.make, 'Ford'))\n * ```\n *\n * @see isNull for a way to test equality to NULL.\n */\nexport const eq: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} = ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that two values are not equal.\n *\n * Remember that the SQL standard dictates that\n * two NULL values are not equal, so if you want to test\n * whether a value is not null, you may want to use\n * `isNotNull` instead.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars not made by Ford\n * db.select().from(cars)\n * .where(ne(cars.make, 'Ford'))\n * ```\n *\n * @see isNotNull for a way to test whether a value is not null.\n */\nexport const ne: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} <> ${bindIfParam(right, left)}`;\n};\n\n/**\n * Combine a list of conditions with the `and` operator. Conditions\n * that are equal `undefined` are automatically ignored.\n *\n * ## Examples\n *\n * ```ts\n * db.select().from(cars)\n * .where(\n * and(\n * eq(cars.make, 'Volvo'),\n * eq(cars.year, 1950),\n * )\n * )\n * ```\n */\nexport function and(...conditions: (SQLWrapper | undefined)[]): SQL | undefined;\nexport function and(\n\t...unfilteredConditions: (SQLWrapper | undefined)[]\n): SQL | undefined {\n\tconst conditions = unfilteredConditions.filter(\n\t\t(c): c is Exclude<typeof c, undefined> => c !== undefined,\n\t);\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn new SQL(conditions);\n\t}\n\n\treturn new SQL([\n\t\tnew StringChunk('('),\n\t\tsql.join(conditions, new StringChunk(' and ')),\n\t\tnew StringChunk(')'),\n\t]);\n}\n\n/**\n * Combine a list of conditions with the `or` operator. Conditions\n * that are equal `undefined` are automatically ignored.\n *\n * ## Examples\n *\n * ```ts\n * db.select().from(cars)\n * .where(\n * or(\n * eq(cars.make, 'GM'),\n * eq(cars.make, 'Ford'),\n * )\n * )\n * ```\n */\nexport function or(...conditions: (SQLWrapper | undefined)[]): SQL | undefined;\nexport function or(\n\t...unfilteredConditions: (SQLWrapper | undefined)[]\n): SQL | undefined {\n\tconst conditions = unfilteredConditions.filter(\n\t\t(c): c is Exclude<typeof c, undefined> => c !== undefined,\n\t);\n\n\tif (conditions.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tif (conditions.length === 1) {\n\t\treturn new SQL(conditions);\n\t}\n\n\treturn new SQL([\n\t\tnew StringChunk('('),\n\t\tsql.join(conditions, new StringChunk(' or ')),\n\t\tnew StringChunk(')'),\n\t]);\n}\n\n/**\n * Negate the meaning of an expression using the `not` keyword.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars _not_ made by GM or Ford.\n * db.select().from(cars)\n * .where(not(inArray(cars.make, ['GM', 'Ford'])))\n * ```\n */\nexport function not(condition: SQLWrapper): SQL {\n\treturn sql`not ${condition}`;\n}\n\n/**\n * Test that the first expression passed is greater than\n * the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made after 2000.\n * db.select().from(cars)\n * .where(gt(cars.year, 2000))\n * ```\n *\n * @see gte for greater-than-or-equal\n */\nexport const gt: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} > ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is greater than\n * or equal to the second expression. Use `gt` to\n * test whether an expression is strictly greater\n * than another.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made on or after 2000.\n * db.select().from(cars)\n * .where(gte(cars.year, 2000))\n * ```\n *\n * @see gt for a strictly greater-than condition\n */\nexport const gte: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} >= ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is less than\n * the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made before 2000.\n * db.select().from(cars)\n * .where(lt(cars.year, 2000))\n * ```\n *\n * @see lte for less-than-or-equal\n */\nexport const lt: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} < ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test that the first expression passed is less than\n * or equal to the second expression.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made before 2000.\n * db.select().from(cars)\n * .where(lte(cars.year, 2000))\n * ```\n *\n * @see lt for a strictly less-than condition\n */\nexport const lte: BinaryOperator = (left: SQLWrapper, right: unknown): SQL => {\n\treturn sql`${left} <= ${bindIfParam(right, left)}`;\n};\n\n/**\n * Test whether the first parameter, a column or expression,\n * has a value from a list passed as the second argument.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by Ford or GM.\n * db.select().from(cars)\n * .where(inArray(cars.make, ['Ford', 'GM']))\n * ```\n *\n * @see notInArray for the inverse of this test\n */\nexport function inArray<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function inArray<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function inArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function inArray(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn sql`false`;\n\t\t}\n\t\treturn sql`${column} in ${values.map((v) => bindIfParam(v, column))}`;\n\t}\n\n\treturn sql`${column} in ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test whether the first parameter, a column or expression,\n * has a value that is not present in a list passed as the\n * second argument.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made by any company except Ford or GM.\n * db.select().from(cars)\n * .where(notInArray(cars.make, ['Ford', 'GM']))\n * ```\n *\n * @see inArray for the inverse of this test\n */\nexport function notInArray<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function notInArray(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn sql`true`;\n\t\t}\n\t\treturn sql`${column} not in ${values.map((v) => bindIfParam(v, column))}`;\n\t}\n\n\treturn sql`${column} not in ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test whether an expression is NULL. By the SQL standard,\n * NULL is neither equal nor not equal to itself, so\n * it's recommended to use `isNull` and `notIsNull` for\n * comparisons to NULL.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars that have no discontinuedAt date.\n * db.select().from(cars)\n * .where(isNull(cars.discontinuedAt))\n * ```\n *\n * @see isNotNull for the inverse of this test\n */\nexport function isNull(value: SQLWrapper): SQL {\n\treturn sql`${value} is null`;\n}\n\n/**\n * Test whether an expression is not NULL. By the SQL standard,\n * NULL is neither equal nor not equal to itself, so\n * it's recommended to use `isNull` and `notIsNull` for\n * comparisons to NULL.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars that have been discontinued.\n * db.select().from(cars)\n * .where(isNotNull(cars.discontinuedAt))\n * ```\n *\n * @see isNull for the inverse of this test\n */\nexport function isNotNull(value: SQLWrapper): SQL {\n\treturn sql`${value} is not null`;\n}\n\n/**\n * Test whether a subquery evaluates to have any rows.\n *\n * ## Examples\n *\n * ```ts\n * // Users whose `homeCity` column has a match in a cities\n * // table.\n * db\n * .select()\n * .from(users)\n * .where(\n * exists(db.select()\n * .from(cities)\n * .where(eq(users.homeCity, cities.id))),\n * );\n * ```\n *\n * @see notExists for the inverse of this test\n */\nexport function exists(subquery: SQLWrapper): SQL {\n\treturn sql`exists ${subquery}`;\n}\n\n/**\n * Test whether a subquery doesn't include any result\n * rows.\n *\n * ## Examples\n *\n * ```ts\n * // Users whose `homeCity` column doesn't match\n * // a row in the cities table.\n * db\n * .select()\n * .from(users)\n * .where(\n * notExists(db.select()\n * .from(cities)\n * .where(eq(users.homeCity, cities.id))),\n * );\n * ```\n *\n * @see exists for the inverse of this test\n */\nexport function notExists(subquery: SQLWrapper): SQL {\n\treturn sql`not exists ${subquery}`;\n}\n\n/**\n * Test whether an expression is between two values. This\n * is an easier way to express range tests, which would be\n * expressed mathematically as `x <= a <= y` but in SQL\n * would have to be like `a >= x AND a <= y`.\n *\n * Between is inclusive of the endpoints: if `column`\n * is equal to `min` or `max`, it will be TRUE.\n *\n * ## Examples\n *\n * ```ts\n * // Select cars made between 1990 and 2000\n * db.select().from(cars)\n * .where(between(cars.year, 1990, 2000))\n * ```\n *\n * @see notBetween for the inverse of this test\n */\nexport function between<T>(\n\tcolumn: SQL.Aliased,\n\tmin: T | SQLWrapper,\n\tmax: T | SQLWrapper,\n): SQL;\nexport function between<TColumn extends AnyColumn>(\n\tcolumn: TColumn,\n\tmin: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\tmax: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n): SQL;\nexport function between<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tmin: unknown,\n\tmax: unknown,\n): SQL;\nexport function between(column: SQLWrapper, min: unknown, max: unknown): SQL {\n\treturn sql`${column} between ${bindIfParam(min, column)} and ${\n\t\tbindIfParam(\n\t\t\tmax,\n\t\t\tcolumn,\n\t\t)\n\t}`;\n}\n\n/**\n * Test whether an expression is not between two values.\n *\n * This, like `between`, includes its endpoints, so if\n * the `column` is equal to `min` or `max`, in this case\n * it will evaluate to FALSE.\n *\n * ## Examples\n *\n * ```ts\n * // Exclude cars made in the 1970s\n * db.select().from(cars)\n * .where(notBetween(cars.year, 1970, 1979))\n * ```\n *\n * @see between for the inverse of this test\n */\nexport function notBetween<T>(\n\tcolumn: SQL.Aliased,\n\tmin: T | SQLWrapper,\n\tmax: T | SQLWrapper,\n): SQL;\nexport function notBetween<TColumn extends AnyColumn>(\n\tcolumn: TColumn,\n\tmin: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n\tmax: GetColumnData<TColumn, 'raw'> | SQLWrapper,\n): SQL;\nexport function notBetween<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tmin: unknown,\n\tmax: unknown,\n): SQL;\nexport function notBetween(\n\tcolumn: SQLWrapper,\n\tmin: unknown,\n\tmax: unknown,\n): SQL {\n\treturn sql`${column} not between ${\n\t\tbindIfParam(\n\t\t\tmin,\n\t\t\tcolumn,\n\t\t)\n\t} and ${bindIfParam(max, column)}`;\n}\n\n/**\n * Compare a column to a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars with 'Turbo' in their names.\n * db.select().from(cars)\n * .where(like(cars.name, '%Turbo%'))\n * ```\n *\n * @see ilike for a case-insensitive version of this condition\n */\nexport function like(column: Column | SQL.Aliased | SQL, value: string | SQLWrapper): SQL {\n\treturn sql`${column} like ${value}`;\n}\n\n/**\n * The inverse of like - this tests that a given column\n * does not match a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars that don't have \"ROver\" in their name.\n * db.select().from(cars)\n * .where(notLike(cars.name, '%Rover%'))\n * ```\n *\n * @see like for the inverse condition\n * @see notIlike for a case-insensitive version of this condition\n */\nexport function notLike(column: Column | SQL.Aliased | SQL, value: string | SQLWrapper): SQL {\n\treturn sql`${column} not like ${value}`;\n}\n\n/**\n * Case-insensitively compare a column to a pattern,\n * which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * Unlike like, this performs a case-insensitive comparison.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars with 'Turbo' in their names.\n * db.select().from(cars)\n * .where(ilike(cars.name, '%Turbo%'))\n * ```\n *\n * @see like for a case-sensitive version of this condition\n */\nexport function ilike(column: Column | SQL.Aliased | SQL, value: string | SQLWrapper): SQL {\n\treturn sql`${column} ilike ${value}`;\n}\n\n/**\n * The inverse of ilike - this case-insensitively tests that a given column\n * does not match a pattern, which can include `%` and `_`\n * characters to match multiple variations. Including `%`\n * in the pattern matches zero or more characters, and including\n * `_` will match a single character.\n *\n * ## Examples\n *\n * ```ts\n * // Select all cars that don't have \"Rover\" in their name.\n * db.select().from(cars)\n * .where(notLike(cars.name, '%Rover%'))\n * ```\n *\n * @see ilike for the inverse condition\n * @see notLike for a case-sensitive version of this condition\n */\nexport function notIlike(column: Column | SQL.Aliased | SQL, value: string | SQLWrapper): SQL {\n\treturn sql`${column} not ilike ${value}`;\n}\n\n/**\n * Test that a column or expression contains all elements of\n * the list passed as the second argument.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\" and \"ORM\".\n * db.select().from(posts)\n * .where(arrayContains(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContained to find if an array contains all elements of a column or expression\n * @see arrayOverlaps to find if a column or expression contains any elements of an array\n */\nexport function arrayContains<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContains<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContains<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayContains(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayContains requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} @> ${array}`;\n\t}\n\n\treturn sql`${column} @> ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test that the list passed as the second argument contains\n * all elements of a column or expression.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\", \"ORM\" or both,\n * // but filtering posts that have additional tags.\n * db.select().from(posts)\n * .where(arrayContained(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContains to find if a column or expression contains all elements of an array\n * @see arrayOverlaps to find if a column or expression contains any elements of an array\n */\nexport function arrayContained<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContained<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayContained<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayContained(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayContained requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} <@ ${array}`;\n\t}\n\n\treturn sql`${column} <@ ${bindIfParam(values, column)}`;\n}\n\n/**\n * Test that a column or expression contains any elements of\n * the list passed as the second argument.\n *\n * ## Throws\n *\n * The argument passed in the second array can't be empty:\n * if an empty is provided, this method will throw.\n *\n * ## Examples\n *\n * ```ts\n * // Select posts where its tags contain \"Typescript\", \"ORM\" or both.\n * db.select().from(posts)\n * .where(arrayOverlaps(posts.tags, ['Typescript', 'ORM']))\n * ```\n *\n * @see arrayContains to find if a column or expression contains all elements of an array\n * @see arrayContained to find if an array contains all elements of a column or expression\n */\nexport function arrayOverlaps<T>(\n\tcolumn: SQL.Aliased<T>,\n\tvalues: (T | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayOverlaps<TColumn extends Column>(\n\tcolumn: TColumn,\n\tvalues: (GetColumnData<TColumn, 'raw'> | Placeholder) | SQLWrapper,\n): SQL;\nexport function arrayOverlaps<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL;\nexport function arrayOverlaps(\n\tcolumn: SQLWrapper,\n\tvalues: (unknown | Placeholder)[] | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('arrayOverlaps requires at least one value');\n\t\t}\n\t\tconst array = sql`${bindIfParam(values, column)}`;\n\t\treturn sql`${column} && ${array}`;\n\t}\n\n\treturn sql`${column} && ${bindIfParam(values, column)}`;\n}\n","import type { AnyColumn } from '../../column.ts';\nimport type { SQL, SQLWrapper } from '../sql.ts';\nimport { sql } from '../sql.ts';\n\n/**\n * Used in sorting, this specifies that the given\n * column or expression should be sorted in ascending\n * order. By the SQL standard, ascending order is the\n * default, so it is not usually necessary to specify\n * ascending sort order.\n *\n * ## Examples\n *\n * ```ts\n * // Return cars, starting with the oldest models\n * // and going in ascending order to the newest.\n * db.select().from(cars)\n * .orderBy(asc(cars.year));\n * ```\n *\n * @see desc to sort in descending order\n */\nexport function asc(column: AnyColumn | SQLWrapper): SQL {\n\treturn sql`${column} asc`;\n}\n\n/**\n * Used in sorting, this specifies that the given\n * column or expression should be sorted in descending\n * order.\n *\n * ## Examples\n *\n * ```ts\n * // Select users, with the most recently created\n * // records coming first.\n * db.select().from(users)\n * .orderBy(desc(users.createdAt));\n * ```\n *\n * @see asc to sort in ascending order\n */\nexport function desc(column: AnyColumn | SQLWrapper): SQL {\n\treturn sql`${column} desc`;\n}\n","import { type AnyTable, getTableUniqueName, type InferModelFromColumns, Table } from '~/table.ts';\nimport { type AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { PrimaryKeyBuilder } from './pg-core/primary-keys.ts';\nimport {\n\tand,\n\tasc,\n\tbetween,\n\tdesc,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tisNotNull,\n\tisNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotIlike,\n\tnotInArray,\n\tnotLike,\n\tor,\n} from './sql/expressions/index.ts';\nimport { type Placeholder, SQL, sql } from './sql/sql.ts';\nimport type { Assume, ColumnsWithTable, Equal, Simplify, ValueOrArray } from './utils.ts';\n\nexport abstract class Relation<TTableName extends string = string> {\n\tstatic readonly [entityKind]: string = 'Relation';\n\n\tdeclare readonly $brand: 'Relation';\n\treadonly referencedTableName: TTableName;\n\tfieldName!: string;\n\n\tconstructor(\n\t\treadonly sourceTable: Table,\n\t\treadonly referencedTable: AnyTable<{ name: TTableName }>,\n\t\treadonly relationName: string | undefined,\n\t) {\n\t\tthis.referencedTableName = referencedTable[Table.Symbol.Name] as TTableName;\n\t}\n\n\tabstract withFieldName(fieldName: string): Relation<TTableName>;\n}\n\nexport class Relations<\n\tTTableName extends string = string,\n\tTConfig extends Record<string, Relation> = Record<string, Relation>,\n> {\n\tstatic readonly [entityKind]: string = 'Relations';\n\n\tdeclare readonly $brand: 'Relations';\n\n\tconstructor(\n\t\treadonly table: AnyTable<{ name: TTableName }>,\n\t\treadonly config: (helpers: TableRelationsHelpers<TTableName>) => TConfig,\n\t) {}\n}\n\nexport class One<\n\tTTableName extends string = string,\n\tTIsNullable extends boolean = boolean,\n> extends Relation<TTableName> {\n\tstatic override readonly [entityKind]: string = 'One';\n\n\tdeclare protected $relationBrand: 'One';\n\n\tconstructor(\n\t\tsourceTable: Table,\n\t\treferencedTable: AnyTable<{ name: TTableName }>,\n\t\treadonly config:\n\t\t\t| RelationConfig<\n\t\t\t\tTTableName,\n\t\t\t\tstring,\n\t\t\t\tAnyColumn<{ tableName: TTableName }>[]\n\t\t\t>\n\t\t\t| undefined,\n\t\treadonly isNullable: TIsNullable,\n\t) {\n\t\tsuper(sourceTable, referencedTable, config?.relationName);\n\t}\n\n\twithFieldName(fieldName: string): One<TTableName> {\n\t\tconst relation = new One(\n\t\t\tthis.sourceTable,\n\t\t\tthis.referencedTable,\n\t\t\tthis.config,\n\t\t\tthis.isNullable,\n\t\t);\n\t\trelation.fieldName = fieldName;\n\t\treturn relation;\n\t}\n}\n\nexport class Many<TTableName extends string> extends Relation<TTableName> {\n\tstatic override readonly [entityKind]: string = 'Many';\n\n\tdeclare protected $relationBrand: 'Many';\n\n\tconstructor(\n\t\tsourceTable: Table,\n\t\treferencedTable: AnyTable<{ name: TTableName }>,\n\t\treadonly config: { relationName: string } | undefined,\n\t) {\n\t\tsuper(sourceTable, referencedTable, config?.relationName);\n\t}\n\n\twithFieldName(fieldName: string): Many<TTableName> {\n\t\tconst relation = new Many(\n\t\t\tthis.sourceTable,\n\t\t\tthis.referencedTable,\n\t\t\tthis.config,\n\t\t);\n\t\trelation.fieldName = fieldName;\n\t\treturn relation;\n\t}\n}\n\nexport type TableRelationsKeysOnly<\n\tTSchema extends Record<string, unknown>,\n\tTTableName extends string,\n\tK extends keyof TSchema,\n> = TSchema[K] extends Relations<TTableName> ? K : never;\n\nexport type ExtractTableRelationsFromSchema<\n\tTSchema extends Record<string, unknown>,\n\tTTableName extends string,\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TableRelationsKeysOnly<\n\t\t\t\tTSchema,\n\t\t\t\tTTableName,\n\t\t\t\tK\n\t\t\t>\n\t\t]: TSchema[K] extends Relations<TTableName, infer TConfig> ? TConfig : never;\n\t}\n>;\n\nexport type ExtractObjectValues<T> = T[keyof T];\n\nexport type ExtractRelationsFromTableExtraConfigSchema<\n\tTConfig extends unknown[],\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TConfig as TConfig[K] extends Relations<any> ? K\n\t\t\t\t: never\n\t\t]: TConfig[K] extends Relations<infer TRelationConfig> ? TRelationConfig\n\t\t\t: never;\n\t}\n>;\n\nexport function getOperators() {\n\treturn {\n\t\tand,\n\t\tbetween,\n\t\teq,\n\t\texists,\n\t\tgt,\n\t\tgte,\n\t\tilike,\n\t\tinArray,\n\t\tisNull,\n\t\tisNotNull,\n\t\tlike,\n\t\tlt,\n\t\tlte,\n\t\tne,\n\t\tnot,\n\t\tnotBetween,\n\t\tnotExists,\n\t\tnotLike,\n\t\tnotIlike,\n\t\tnotInArray,\n\t\tor,\n\t\tsql,\n\t};\n}\n\nexport type Operators = ReturnType<typeof getOperators>;\n\nexport function getOrderByOperators() {\n\treturn {\n\t\tsql,\n\t\tasc,\n\t\tdesc,\n\t};\n}\n\nexport type OrderByOperators = ReturnType<typeof getOrderByOperators>;\n\nexport type FindTableByDBName<\n\tTSchema extends TablesRelationalConfig,\n\tTTableName extends string,\n> = ExtractObjectValues<\n\t{\n\t\t[\n\t\t\tK in keyof TSchema as TSchema[K]['dbName'] extends TTableName ? K\n\t\t\t\t: never\n\t\t]: TSchema[K];\n\t}\n>;\n\nexport type DBQueryConfig<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTIsRoot extends boolean = boolean,\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> =\n\t& {\n\t\tcolumns?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['columns']]?: boolean;\n\t\t\t}\n\t\t\t| undefined;\n\t\twith?:\n\t\t\t| {\n\t\t\t\t[K in keyof TTableConfig['relations']]?:\n\t\t\t\t\t| true\n\t\t\t\t\t| DBQueryConfig<\n\t\t\t\t\t\tTTableConfig['relations'][K] extends One ? 'one' : 'many',\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\tFindTableByDBName<\n\t\t\t\t\t\t\tTSchema,\n\t\t\t\t\t\t\tTTableConfig['relations'][K]['referencedTableName']\n\t\t\t\t\t\t>\n\t\t\t\t\t>\n\t\t\t\t\t| undefined;\n\t\t\t}\n\t\t\t| undefined;\n\t\textras?:\n\t\t\t| Record<string, SQL.Aliased>\n\t\t\t| ((\n\t\t\t\tfields: Simplify<\n\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t>,\n\t\t\t\toperators: { sql: Operators['sql'] },\n\t\t\t) => Record<string, SQL.Aliased>)\n\t\t\t| undefined;\n\t}\n\t& (TRelationType extends 'many' ?\n\t\t\t& {\n\t\t\t\twhere?:\n\t\t\t\t\t| SQL\n\t\t\t\t\t| undefined\n\t\t\t\t\t| ((\n\t\t\t\t\t\tfields: Simplify<\n\t\t\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t\t\t>,\n\t\t\t\t\t\toperators: Operators,\n\t\t\t\t\t) => SQL | undefined);\n\t\t\t\torderBy?:\n\t\t\t\t\t| ValueOrArray<AnyColumn | SQL>\n\t\t\t\t\t| ((\n\t\t\t\t\t\tfields: Simplify<\n\t\t\t\t\t\t\t[TTableConfig['columns']] extends [never] ? {}\n\t\t\t\t\t\t\t\t: TTableConfig['columns']\n\t\t\t\t\t\t>,\n\t\t\t\t\t\toperators: OrderByOperators,\n\t\t\t\t\t) => ValueOrArray<AnyColumn | SQL>)\n\t\t\t\t\t| undefined;\n\t\t\t\tlimit?: number | Placeholder | undefined;\n\t\t\t}\n\t\t\t& (TIsRoot extends true ? {\n\t\t\t\t\toffset?: number | Placeholder | undefined;\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t: {});\n\nexport interface TableRelationalConfig {\n\ttsName: string;\n\tdbName: string;\n\tcolumns: Record<string, Column>;\n\trelations: Record<string, Relation>;\n\tprimaryKey: AnyColumn[];\n\tschema?: string;\n}\n\nexport type TablesRelationalConfig = Record<string, TableRelationalConfig>;\n\nexport interface RelationalSchemaConfig<\n\tTSchema extends TablesRelationalConfig,\n> {\n\tfullSchema: Record<string, unknown>;\n\tschema: TSchema;\n\ttableNamesMap: Record<string, string>;\n}\n\nexport type ExtractTablesWithRelations<\n\tTSchema extends Record<string, unknown>,\n> = {\n\t[\n\t\tK in keyof TSchema as TSchema[K] extends Table ? K\n\t\t\t: never\n\t]: TSchema[K] extends Table ? {\n\t\t\ttsName: K & string;\n\t\t\tdbName: TSchema[K]['_']['name'];\n\t\t\tcolumns: TSchema[K]['_']['columns'];\n\t\t\trelations: ExtractTableRelationsFromSchema<\n\t\t\t\tTSchema,\n\t\t\t\tTSchema[K]['_']['name']\n\t\t\t>;\n\t\t\tprimaryKey: AnyColumn[];\n\t\t}\n\t\t: never;\n};\n\nexport type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R\n\t: T;\n\nexport type BuildRelationResult<\n\tTSchema extends TablesRelationalConfig,\n\tTInclude,\n\tTRelations extends Record<string, Relation>,\n> = {\n\t[\n\t\tK in\n\t\t\t& NonUndefinedKeysOnly<TInclude>\n\t\t\t& keyof TRelations\n\t]: TRelations[K] extends infer TRel extends Relation ? BuildQueryResult<\n\t\t\tTSchema,\n\t\t\tFindTableByDBName<TSchema, TRel['referencedTableName']>,\n\t\t\tAssume<TInclude[K], true | Record<string, unknown>>\n\t\t> extends infer TResult ? TRel extends One ?\n\t\t\t\t\t| TResult\n\t\t\t\t\t| (Equal<TRel['isNullable'], false> extends true ? null : never)\n\t\t\t: TResult[]\n\t\t: never\n\t\t: never;\n};\n\nexport type NonUndefinedKeysOnly<T> =\n\t& ExtractObjectValues<\n\t\t{\n\t\t\t[K in keyof T as T[K] extends undefined ? never : K]: K;\n\t\t}\n\t>\n\t& keyof T;\n\nexport type BuildQueryResult<\n\tTSchema extends TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig,\n\tTFullSelection extends true | Record<string, unknown>,\n> = Equal<TFullSelection, true> extends true ? InferModelFromColumns<TTableConfig['columns']>\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (TFullSelection['columns'] extends Record<string, unknown> ? InferModelFromColumns<\n\t\t\t\t\t{\n\t\t\t\t\t\t[\n\t\t\t\t\t\t\tK in Equal<\n\t\t\t\t\t\t\t\tExclude<\n\t\t\t\t\t\t\t\t\tTFullSelection['columns'][\n\t\t\t\t\t\t\t\t\t\t& keyof TFullSelection['columns']\n\t\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t\t\t\t],\n\t\t\t\t\t\t\t\t\tundefined\n\t\t\t\t\t\t\t\t>,\n\t\t\t\t\t\t\t\tfalse\n\t\t\t\t\t\t\t> extends true ? Exclude<\n\t\t\t\t\t\t\t\t\tkeyof TTableConfig['columns'],\n\t\t\t\t\t\t\t\t\tNonUndefinedKeysOnly<TFullSelection['columns']>\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t:\n\t\t\t\t\t\t\t\t\t& {\n\t\t\t\t\t\t\t\t\t\t[K in keyof TFullSelection['columns']]: Equal<\n\t\t\t\t\t\t\t\t\t\t\tTFullSelection['columns'][K],\n\t\t\t\t\t\t\t\t\t\t\ttrue\n\t\t\t\t\t\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t\t\t\t\t\t: never;\n\t\t\t\t\t\t\t\t\t}[keyof TFullSelection['columns']]\n\t\t\t\t\t\t\t\t\t& keyof TTableConfig['columns']\n\t\t\t\t\t\t]: TTableConfig['columns'][K];\n\t\t\t\t\t}\n\t\t\t\t>\n\t\t\t\t: InferModelFromColumns<TTableConfig['columns']>)\n\t\t\t& (TFullSelection['extras'] extends\n\t\t\t\t| Record<string, unknown>\n\t\t\t\t| ((...args: any[]) => Record<string, unknown>) ? {\n\t\t\t\t\t[\n\t\t\t\t\t\tK in NonUndefinedKeysOnly<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>\n\t\t\t\t\t\t>\n\t\t\t\t\t]: Assume<\n\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras']>[K],\n\t\t\t\t\t\tSQL.Aliased\n\t\t\t\t\t>['_']['type'];\n\t\t\t\t}\n\t\t\t\t: {})\n\t\t\t& (TFullSelection['with'] extends Record<string, unknown> ? BuildRelationResult<\n\t\t\t\t\tTSchema,\n\t\t\t\t\tTFullSelection['with'],\n\t\t\t\t\tTTableConfig['relations']\n\t\t\t\t>\n\t\t\t\t: {})\n\t\t>\n\t: never;\n\nexport interface RelationConfig<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends AnyColumn<{ tableName: TTableName }>[],\n> {\n\trelationName?: string;\n\tfields: TColumns;\n\treferences: ColumnsWithTable<TTableName, TForeignTableName, TColumns>;\n}\n\nexport function extractTablesRelationalConfig<\n\tTTables extends TablesRelationalConfig,\n>(\n\tschema: Record<string, unknown>,\n\tconfigHelpers: (table: Table) => any,\n): { tables: TTables; tableNamesMap: Record<string, string> } {\n\tif (\n\t\tObject.keys(schema).length === 1\n\t\t&& 'default' in schema\n\t\t&& !is(schema['default'], Table)\n\t) {\n\t\tschema = schema['default'] as Record<string, unknown>;\n\t}\n\n\t// table DB name -> schema table key\n\tconst tableNamesMap: Record<string, string> = {};\n\t// Table relations found before their tables - need to buffer them until we know the schema table key\n\tconst relationsBuffer: Record<\n\t\tstring,\n\t\t{ relations: Record<string, Relation>; primaryKey?: AnyColumn[] }\n\t> = {};\n\tconst tablesConfig: TablesRelationalConfig = {};\n\tfor (const [key, value] of Object.entries(schema)) {\n\t\tif (is(value, Table)) {\n\t\t\tconst dbName = getTableUniqueName(value);\n\t\t\tconst bufferedRelations = relationsBuffer[dbName];\n\t\t\ttableNamesMap[dbName] = key;\n\t\t\ttablesConfig[key] = {\n\t\t\t\ttsName: key,\n\t\t\t\tdbName: value[Table.Symbol.Name],\n\t\t\t\tschema: value[Table.Symbol.Schema],\n\t\t\t\tcolumns: value[Table.Symbol.Columns],\n\t\t\t\trelations: bufferedRelations?.relations ?? {},\n\t\t\t\tprimaryKey: bufferedRelations?.primaryKey ?? [],\n\t\t\t};\n\n\t\t\t// Fill in primary keys\n\t\t\tfor (\n\t\t\t\tconst column of Object.values(\n\t\t\t\t\t(value as Table)[Table.Symbol.Columns],\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tif (column.primary) {\n\t\t\t\t\ttablesConfig[key]!.primaryKey.push(column);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst extraConfig = value[Table.Symbol.ExtraConfigBuilder]?.((value as Table)[Table.Symbol.ExtraConfigColumns]);\n\t\t\tif (extraConfig) {\n\t\t\t\tfor (const configEntry of Object.values(extraConfig)) {\n\t\t\t\t\tif (is(configEntry, PrimaryKeyBuilder)) {\n\t\t\t\t\t\ttablesConfig[key]!.primaryKey.push(...configEntry.columns);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} else if (is(value, Relations)) {\n\t\t\tconst dbName = getTableUniqueName(value.table);\n\t\t\tconst tableName = tableNamesMap[dbName];\n\t\t\tconst relations: Record<string, Relation> = value.config(\n\t\t\t\tconfigHelpers(value.table),\n\t\t\t);\n\t\t\tlet primaryKey: AnyColumn[] | undefined;\n\n\t\t\tfor (const [relationName, relation] of Object.entries(relations)) {\n\t\t\t\tif (tableName) {\n\t\t\t\t\tconst tableConfig = tablesConfig[tableName]!;\n\t\t\t\t\ttableConfig.relations[relationName] = relation;\n\t\t\t\t\tif (primaryKey) {\n\t\t\t\t\t\ttableConfig.primaryKey.push(...primaryKey);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (!(dbName in relationsBuffer)) {\n\t\t\t\t\t\trelationsBuffer[dbName] = {\n\t\t\t\t\t\t\trelations: {},\n\t\t\t\t\t\t\tprimaryKey,\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\t\t\t\t\trelationsBuffer[dbName]!.relations[relationName] = relation;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { tables: tablesConfig as TTables, tableNamesMap };\n}\n\nexport function relations<\n\tTTableName extends string,\n\tTRelations extends Record<string, Relation<any>>,\n>(\n\ttable: AnyTable<{ name: TTableName }>,\n\trelations: (helpers: TableRelationsHelpers<TTableName>) => TRelations,\n): Relations<TTableName, TRelations> {\n\treturn new Relations<TTableName, TRelations>(\n\t\ttable,\n\t\t(helpers: TableRelationsHelpers<TTableName>) =>\n\t\t\tObject.fromEntries(\n\t\t\t\tObject.entries(relations(helpers)).map(([key, value]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\tvalue.withFieldName(key),\n\t\t\t\t]),\n\t\t\t) as TRelations,\n\t);\n}\n\nexport function createOne<TTableName extends string>(sourceTable: Table) {\n\treturn function one<\n\t\tTForeignTable extends Table,\n\t\tTColumns extends [\n\t\t\tAnyColumn<{ tableName: TTableName }>,\n\t\t\t...AnyColumn<{ tableName: TTableName }>[],\n\t\t],\n\t>(\n\t\ttable: TForeignTable,\n\t\tconfig?: RelationConfig<TTableName, TForeignTable['_']['name'], TColumns>,\n\t): One<\n\t\tTForeignTable['_']['name'],\n\t\tEqual<TColumns[number]['_']['notNull'], true>\n\t> {\n\t\treturn new One(\n\t\t\tsourceTable,\n\t\t\ttable,\n\t\t\tconfig,\n\t\t\t(config?.fields.reduce<boolean>((res, f) => res && f.notNull, true)\n\t\t\t\t?? false) as Equal<TColumns[number]['_']['notNull'], true>,\n\t\t);\n\t};\n}\n\nexport function createMany(sourceTable: Table) {\n\treturn function many<TForeignTable extends Table>(\n\t\treferencedTable: TForeignTable,\n\t\tconfig?: { relationName: string },\n\t): Many<TForeignTable['_']['name']> {\n\t\treturn new Many(sourceTable, referencedTable, config);\n\t};\n}\n\nexport interface NormalizedRelation {\n\tfields: AnyColumn[];\n\treferences: AnyColumn[];\n}\n\nexport function normalizeRelation(\n\tschema: TablesRelationalConfig,\n\ttableNamesMap: Record<string, string>,\n\trelation: Relation,\n): NormalizedRelation {\n\tif (is(relation, One) && relation.config) {\n\t\treturn {\n\t\t\tfields: relation.config.fields,\n\t\t\treferences: relation.config.references,\n\t\t};\n\t}\n\n\tconst referencedTableTsName = tableNamesMap[getTableUniqueName(relation.referencedTable)];\n\tif (!referencedTableTsName) {\n\t\tthrow new Error(\n\t\t\t`Table \"${relation.referencedTable[Table.Symbol.Name]}\" not found in schema`,\n\t\t);\n\t}\n\n\tconst referencedTableConfig = schema[referencedTableTsName];\n\tif (!referencedTableConfig) {\n\t\tthrow new Error(`Table \"${referencedTableTsName}\" not found in schema`);\n\t}\n\n\tconst sourceTable = relation.sourceTable;\n\tconst sourceTableTsName = tableNamesMap[getTableUniqueName(sourceTable)];\n\tif (!sourceTableTsName) {\n\t\tthrow new Error(\n\t\t\t`Table \"${sourceTable[Table.Symbol.Name]}\" not found in schema`,\n\t\t);\n\t}\n\n\tconst reverseRelations: Relation[] = [];\n\tfor (\n\t\tconst referencedTableRelation of Object.values(\n\t\t\treferencedTableConfig.relations,\n\t\t)\n\t) {\n\t\tif (\n\t\t\t(relation.relationName\n\t\t\t\t&& relation !== referencedTableRelation\n\t\t\t\t&& referencedTableRelation.relationName === relation.relationName)\n\t\t\t|| (!relation.relationName\n\t\t\t\t&& referencedTableRelation.referencedTable === relation.sourceTable)\n\t\t) {\n\t\t\treverseRelations.push(referencedTableRelation);\n\t\t}\n\t}\n\n\tif (reverseRelations.length > 1) {\n\t\tthrow relation.relationName\n\t\t\t? new Error(\n\t\t\t\t`There are multiple relations with name \"${relation.relationName}\" in table \"${referencedTableTsName}\"`,\n\t\t\t)\n\t\t\t: new Error(\n\t\t\t\t`There are multiple relations between \"${referencedTableTsName}\" and \"${\n\t\t\t\t\trelation.sourceTable[Table.Symbol.Name]\n\t\t\t\t}\". Please specify relation name`,\n\t\t\t);\n\t}\n\n\tif (\n\t\treverseRelations[0]\n\t\t&& is(reverseRelations[0], One)\n\t\t&& reverseRelations[0].config\n\t) {\n\t\treturn {\n\t\t\tfields: reverseRelations[0].config.references,\n\t\t\treferences: reverseRelations[0].config.fields,\n\t\t};\n\t}\n\n\tthrow new Error(\n\t\t`There is not enough information to infer relation \"${sourceTableTsName}.${relation.fieldName}\"`,\n\t);\n}\n\nexport function createTableRelationsHelpers<TTableName extends string>(\n\tsourceTable: AnyTable<{ name: TTableName }>,\n) {\n\treturn {\n\t\tone: createOne<TTableName>(sourceTable),\n\t\tmany: createMany(sourceTable),\n\t};\n}\n\nexport type TableRelationsHelpers<TTableName extends string> = ReturnType<\n\ttypeof createTableRelationsHelpers<TTableName>\n>;\n\nexport interface BuildRelationalQueryResult<\n\tTTable extends Table = Table,\n\tTColumn extends Column = Column,\n> {\n\ttableTsKey: string;\n\tselection: {\n\t\tdbKey: string;\n\t\ttsKey: string;\n\t\tfield: TColumn | SQL | SQL.Aliased;\n\t\trelationTableTsKey: string | undefined;\n\t\tisJson: boolean;\n\t\tisExtra?: boolean;\n\t\tselection: BuildRelationalQueryResult<TTable>['selection'];\n\t}[];\n\tsql: TTable | SQL;\n}\n\nexport function mapRelationalRow(\n\ttablesConfig: TablesRelationalConfig,\n\ttableConfig: TableRelationalConfig,\n\trow: unknown[],\n\tbuildQueryResultSelection: BuildRelationalQueryResult['selection'],\n\tmapColumnValue: (value: unknown) => unknown = (value) => value,\n): Record<string, unknown> {\n\tconst result: Record<string, unknown> = {};\n\n\tfor (\n\t\tconst [\n\t\t\tselectionItemIndex,\n\t\t\tselectionItem,\n\t\t] of buildQueryResultSelection.entries()\n\t) {\n\t\tif (selectionItem.isJson) {\n\t\t\tconst relation = tableConfig.relations[selectionItem.tsKey]!;\n\t\t\tconst rawSubRows = row[selectionItemIndex] as\n\t\t\t\t| unknown[]\n\t\t\t\t| null\n\t\t\t\t| [null]\n\t\t\t\t| string;\n\t\t\tconst subRows = typeof rawSubRows === 'string'\n\t\t\t\t? (JSON.parse(rawSubRows) as unknown[])\n\t\t\t\t: rawSubRows;\n\t\t\tresult[selectionItem.tsKey] = is(relation, One)\n\t\t\t\t? subRows\n\t\t\t\t\t&& mapRelationalRow(\n\t\t\t\t\t\ttablesConfig,\n\t\t\t\t\t\ttablesConfig[selectionItem.relationTableTsKey!]!,\n\t\t\t\t\t\tsubRows,\n\t\t\t\t\t\tselectionItem.selection,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t)\n\t\t\t\t: (subRows as unknown[][]).map((subRow) =>\n\t\t\t\t\tmapRelationalRow(\n\t\t\t\t\t\ttablesConfig,\n\t\t\t\t\t\ttablesConfig[selectionItem.relationTableTsKey!]!,\n\t\t\t\t\t\tsubRow,\n\t\t\t\t\t\tselectionItem.selection,\n\t\t\t\t\t\tmapColumnValue,\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t} else {\n\t\t\tconst value = mapColumnValue(row[selectionItemIndex]);\n\t\t\tconst field = selectionItem.field!;\n\t\t\tlet decoder;\n\t\t\tif (is(field, Column)) {\n\t\t\t\tdecoder = field;\n\t\t\t} else if (is(field, SQL)) {\n\t\t\t\tdecoder = field.decoder;\n\t\t\t} else {\n\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t}\n\t\t\tresult[selectionItem.tsKey] = value === null ? null : decoder.mapFromDriverValue(value);\n\t\t}\n\t}\n\n\treturn result;\n}\n","import type { AnyColumn } from './column.ts';\nimport { Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport type { Relation } from './relations.ts';\nimport type { View } from './sql/sql.ts';\nimport { SQL, sql } from './sql/sql.ts';\nimport { Table } from './table.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\nexport class ColumnAliasProxyHandler<TColumn extends Column> implements ProxyHandler<TColumn> {\n\tstatic readonly [entityKind]: string = 'ColumnAliasProxyHandler';\n\n\tconstructor(private table: Table | View) {}\n\n\tget(columnObj: TColumn, prop: string | symbol): any {\n\t\tif (prop === 'table') {\n\t\t\treturn this.table;\n\t\t}\n\n\t\treturn columnObj[prop as keyof TColumn];\n\t}\n}\n\nexport class TableAliasProxyHandler<T extends Table | View> implements ProxyHandler<T> {\n\tstatic readonly [entityKind]: string = 'TableAliasProxyHandler';\n\n\tconstructor(private alias: string, private replaceOriginalName: boolean) {}\n\n\tget(target: T, prop: string | symbol): any {\n\t\tif (prop === Table.Symbol.IsAlias) {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (prop === Table.Symbol.Name) {\n\t\t\treturn this.alias;\n\t\t}\n\n\t\tif (this.replaceOriginalName && prop === Table.Symbol.OriginalName) {\n\t\t\treturn this.alias;\n\t\t}\n\n\t\tif (prop === ViewBaseConfig) {\n\t\t\treturn {\n\t\t\t\t...target[ViewBaseConfig as keyof typeof target],\n\t\t\t\tname: this.alias,\n\t\t\t\tisAlias: true,\n\t\t\t};\n\t\t}\n\n\t\tif (prop === Table.Symbol.Columns) {\n\t\t\tconst columns = (target as Table)[Table.Symbol.Columns];\n\t\t\tif (!columns) {\n\t\t\t\treturn columns;\n\t\t\t}\n\n\t\t\tconst proxiedColumns: { [key: string]: any } = {};\n\n\t\t\tObject.keys(columns).map((key) => {\n\t\t\t\tproxiedColumns[key] = new Proxy(\n\t\t\t\t\tcolumns[key]!,\n\t\t\t\t\tnew ColumnAliasProxyHandler(new Proxy(target, this)),\n\t\t\t\t);\n\t\t\t});\n\n\t\t\treturn proxiedColumns;\n\t\t}\n\n\t\tconst value = target[prop as keyof typeof target];\n\t\tif (is(value, Column)) {\n\t\t\treturn new Proxy(value as AnyColumn, new ColumnAliasProxyHandler(new Proxy(target, this)));\n\t\t}\n\n\t\treturn value;\n\t}\n}\n\nexport class RelationTableAliasProxyHandler<T extends Relation> implements ProxyHandler<T> {\n\tstatic readonly [entityKind]: string = 'RelationTableAliasProxyHandler';\n\n\tconstructor(private alias: string) {}\n\n\tget(target: T, prop: string | symbol): any {\n\t\tif (prop === 'sourceTable') {\n\t\t\treturn aliasedTable(target.sourceTable, this.alias);\n\t\t}\n\n\t\treturn target[prop as keyof typeof target];\n\t}\n}\n\nexport function aliasedTable<T extends Table | View>(\n\ttable: T,\n\ttableAlias: string,\n): T {\n\treturn new Proxy(table, new TableAliasProxyHandler(tableAlias, false)) as any;\n}\n\nexport function aliasedRelation<T extends Relation>(relation: T, tableAlias: string): T {\n\treturn new Proxy(relation, new RelationTableAliasProxyHandler(tableAlias));\n}\n\nexport function aliasedTableColumn<T extends AnyColumn>(column: T, tableAlias: string): T {\n\treturn new Proxy(\n\t\tcolumn,\n\t\tnew ColumnAliasProxyHandler(new Proxy(column.table, new TableAliasProxyHandler(tableAlias, false))),\n\t);\n}\n\nexport function mapColumnsInAliasedSQLToAlias(query: SQL.Aliased, alias: string): SQL.Aliased {\n\treturn new SQL.Aliased(mapColumnsInSQLToAlias(query.sql, alias), query.fieldAlias);\n}\n\nexport function mapColumnsInSQLToAlias(query: SQL, alias: string): SQL {\n\treturn sql.join(query.queryChunks.map((c) => {\n\t\tif (is(c, Column)) {\n\t\t\treturn aliasedTableColumn(c, alias);\n\t\t}\n\t\tif (is(c, SQL)) {\n\t\t\treturn mapColumnsInSQLToAlias(c, alias);\n\t\t}\n\t\tif (is(c, SQL.Aliased)) {\n\t\t\treturn mapColumnsInAliasedSQLToAlias(c, alias);\n\t\t}\n\t\treturn c;\n\t}));\n}\n","import { ColumnAliasProxyHandler, TableAliasProxyHandler } from './alias.ts';\nimport { Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { SQL, View } from './sql/sql.ts';\nimport { Subquery } from './subquery.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\nexport class SelectionProxyHandler<T extends Subquery | Record<string, unknown> | View>\n\timplements ProxyHandler<Subquery | Record<string, unknown> | View>\n{\n\tstatic readonly [entityKind]: string = 'SelectionProxyHandler';\n\n\tprivate config: {\n\t\t/**\n\t\t * Table alias for the columns\n\t\t */\n\t\talias?: string;\n\t\t/**\n\t\t * What to do when a field is an instance of `SQL.Aliased` and it's not a selection field (from a subquery)\n\t\t *\n\t\t * `sql` - return the underlying SQL expression\n\t\t *\n\t\t * `alias` - return the field alias\n\t\t */\n\t\tsqlAliasedBehavior: 'sql' | 'alias';\n\t\t/**\n\t\t * What to do when a field is an instance of `SQL` and it doesn't have an alias declared\n\t\t *\n\t\t * `sql` - return the underlying SQL expression\n\t\t *\n\t\t * `error` - return a DrizzleTypeError on type level and throw an error on runtime\n\t\t */\n\t\tsqlBehavior: 'sql' | 'error';\n\n\t\t/**\n\t\t * Whether to replace the original name of the column with the alias\n\t\t * Should be set to `true` for views creation\n\t\t * @default false\n\t\t */\n\t\treplaceOriginalName?: boolean;\n\t};\n\n\tconstructor(config: SelectionProxyHandler<T>['config']) {\n\t\tthis.config = { ...config };\n\t}\n\n\tget(subquery: T, prop: string | symbol): any {\n\t\tif (prop === '_') {\n\t\t\treturn {\n\t\t\t\t...subquery['_' as keyof typeof subquery],\n\t\t\t\tselectedFields: new Proxy(\n\t\t\t\t\t(subquery as Subquery)._.selectedFields,\n\t\t\t\t\tthis as ProxyHandler<Record<string, unknown>>,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\tif (prop === ViewBaseConfig) {\n\t\t\treturn {\n\t\t\t\t...subquery[ViewBaseConfig as keyof typeof subquery],\n\t\t\t\tselectedFields: new Proxy(\n\t\t\t\t\t(subquery as View)[ViewBaseConfig].selectedFields,\n\t\t\t\t\tthis as ProxyHandler<Record<string, unknown>>,\n\t\t\t\t),\n\t\t\t};\n\t\t}\n\n\t\tif (typeof prop === 'symbol') {\n\t\t\treturn subquery[prop as keyof typeof subquery];\n\t\t}\n\n\t\tconst columns = is(subquery, Subquery)\n\t\t\t? subquery._.selectedFields\n\t\t\t: is(subquery, View)\n\t\t\t? subquery[ViewBaseConfig].selectedFields\n\t\t\t: subquery;\n\t\tconst value: unknown = columns[prop as keyof typeof columns];\n\n\t\tif (is(value, SQL.Aliased)) {\n\t\t\t// Never return the underlying SQL expression for a field previously selected in a subquery\n\t\t\tif (this.config.sqlAliasedBehavior === 'sql' && !value.isSelectionField) {\n\t\t\t\treturn value.sql;\n\t\t\t}\n\n\t\t\tconst newValue = value.clone();\n\t\t\tnewValue.isSelectionField = true;\n\t\t\treturn newValue;\n\t\t}\n\n\t\tif (is(value, SQL)) {\n\t\t\tif (this.config.sqlBehavior === 'sql') {\n\t\t\t\treturn value;\n\t\t\t}\n\n\t\t\tthrow new Error(\n\t\t\t\t`You tried to reference \"${prop}\" field from a subquery, which is a raw SQL field, but it doesn't have an alias declared. Please add an alias to the field using \".as('alias')\" method.`,\n\t\t\t);\n\t\t}\n\n\t\tif (is(value, Column)) {\n\t\t\tif (this.config.alias) {\n\t\t\t\treturn new Proxy(\n\t\t\t\t\tvalue,\n\t\t\t\t\tnew ColumnAliasProxyHandler(\n\t\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\t\tvalue.table,\n\t\t\t\t\t\t\tnew TableAliasProxyHandler(this.config.alias, this.config.replaceOriginalName ?? false),\n\t\t\t\t\t\t),\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn value;\n\t\t}\n\n\t\tif (typeof value !== 'object' || value === null) {\n\t\t\treturn value;\n\t\t}\n\n\t\treturn new Proxy(value, new SelectionProxyHandler(this.config));\n\t}\n}\n","import { entityKind } from '~/entity.ts';\n\nexport abstract class QueryPromise<T> implements Promise<T> {\n\tstatic readonly [entityKind]: string = 'QueryPromise';\n\n\t[Symbol.toStringTag] = 'QueryPromise';\n\n\tcatch<TResult = never>(\n\t\tonRejected?: ((reason: any) => TResult | PromiseLike<TResult>) | null | undefined,\n\t): Promise<T | TResult> {\n\t\treturn this.then(undefined, onRejected);\n\t}\n\n\tfinally(onFinally?: (() => void) | null | undefined): Promise<T> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tonFinally?.();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tonFinally?.();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n\n\tthen<TResult1 = T, TResult2 = never>(\n\t\tonFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | undefined | null,\n\t\tonRejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | undefined | null,\n\t): Promise<TResult1 | TResult2> {\n\t\treturn this.execute().then(onFulfilled, onRejected);\n\t}\n\n\tabstract execute(): Promise<T>;\n}\n","import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { AnySQLiteColumn, SQLiteColumn } from './columns/index.ts';\nimport type { SQLiteTable } from './table.ts';\n\nexport type UpdateDeleteAction = 'cascade' | 'restrict' | 'no action' | 'set null' | 'set default';\n\nexport type Reference = () => {\n\treadonly name?: string;\n\treadonly columns: SQLiteColumn[];\n\treadonly foreignTable: SQLiteTable;\n\treadonly foreignColumns: SQLiteColumn[];\n};\n\nexport class ForeignKeyBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteForeignKeyBuilder';\n\n\tdeclare _: {\n\t\tbrand: 'SQLiteForeignKeyBuilder';\n\t\tforeignTableName: 'TForeignTableName';\n\t};\n\n\t/** @internal */\n\treference: Reference;\n\n\t/** @internal */\n\t_onUpdate: UpdateDeleteAction | undefined;\n\n\t/** @internal */\n\t_onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(\n\t\tconfig: () => {\n\t\t\tname?: string;\n\t\t\tcolumns: SQLiteColumn[];\n\t\t\tforeignColumns: SQLiteColumn[];\n\t\t},\n\t\tactions?: {\n\t\t\tonUpdate?: UpdateDeleteAction;\n\t\t\tonDelete?: UpdateDeleteAction;\n\t\t} | undefined,\n\t) {\n\t\tthis.reference = () => {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn { name, columns, foreignTable: foreignColumns[0]!.table as SQLiteTable, foreignColumns };\n\t\t};\n\t\tif (actions) {\n\t\t\tthis._onUpdate = actions.onUpdate;\n\t\t\tthis._onDelete = actions.onDelete;\n\t\t}\n\t}\n\n\tonUpdate(action: UpdateDeleteAction): this {\n\t\tthis._onUpdate = action;\n\t\treturn this;\n\t}\n\n\tonDelete(action: UpdateDeleteAction): this {\n\t\tthis._onDelete = action;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: SQLiteTable): ForeignKey {\n\t\treturn new ForeignKey(table, this);\n\t}\n}\n\nexport class ForeignKey {\n\tstatic readonly [entityKind]: string = 'SQLiteForeignKey';\n\n\treadonly reference: Reference;\n\treadonly onUpdate: UpdateDeleteAction | undefined;\n\treadonly onDelete: UpdateDeleteAction | undefined;\n\n\tconstructor(readonly table: SQLiteTable, builder: ForeignKeyBuilder) {\n\t\tthis.reference = builder.reference;\n\t\tthis.onUpdate = builder._onUpdate;\n\t\tthis.onDelete = builder._onDelete;\n\t}\n\n\tgetName(): string {\n\t\tconst { name, columns, foreignColumns } = this.reference();\n\t\tconst columnNames = columns.map((column) => column.name);\n\t\tconst foreignColumnNames = foreignColumns.map((column) => column.name);\n\t\tconst chunks = [\n\t\t\tthis.table[TableName],\n\t\t\t...columnNames,\n\t\t\tforeignColumns[0]!.table[TableName],\n\t\t\t...foreignColumnNames,\n\t\t];\n\t\treturn name ?? `${chunks.join('_')}_fk`;\n\t}\n}\n\ntype ColumnsWithTable<\n\tTTableName extends string,\n\tTColumns extends SQLiteColumn[],\n> = { [Key in keyof TColumns]: AnySQLiteColumn<{ tableName: TTableName }> };\n\n/**\n * @deprecated please use `foreignKey({ columns: [], foreignColumns: [] })` syntax without callback\n * @param config\n * @returns\n */\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnySQLiteColumn<{ tableName: TTableName }>, ...AnySQLiteColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: () => {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder;\nexport function foreignKey<\n\tTTableName extends string,\n\tTForeignTableName extends string,\n\tTColumns extends [AnySQLiteColumn<{ tableName: TTableName }>, ...AnySQLiteColumn<{ tableName: TTableName }>[]],\n>(\n\tconfig: {\n\t\tname?: string;\n\t\tcolumns: TColumns;\n\t\tforeignColumns: ColumnsWithTable<TForeignTableName, TColumns>;\n\t},\n): ForeignKeyBuilder;\nexport function foreignKey(\n\tconfig: any,\n): ForeignKeyBuilder {\n\tfunction mappedConfig() {\n\t\tif (typeof config === 'function') {\n\t\t\tconst { name, columns, foreignColumns } = config();\n\t\t\treturn {\n\t\t\t\tname,\n\t\t\t\tcolumns,\n\t\t\t\tforeignColumns,\n\t\t\t};\n\t\t}\n\t\treturn config;\n\t}\n\n\treturn new ForeignKeyBuilder(mappedConfig);\n}\n","import { entityKind } from '~/entity.ts';\nimport { TableName } from '~/table.utils.ts';\nimport type { SQLiteColumn } from './columns/common.ts';\nimport type { SQLiteTable } from './table.ts';\n\nexport function uniqueKeyName(table: SQLiteTable, columns: string[]) {\n\treturn `${table[TableName]}_${columns.join('_')}_unique`;\n}\n\nexport function unique(name?: string): UniqueOnConstraintBuilder {\n\treturn new UniqueOnConstraintBuilder(name);\n}\n\nexport class UniqueConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteUniqueConstraintBuilder';\n\n\t/** @internal */\n\tcolumns: SQLiteColumn[];\n\n\tconstructor(\n\t\tcolumns: SQLiteColumn[],\n\t\tprivate name?: string,\n\t) {\n\t\tthis.columns = columns;\n\t}\n\n\t/** @internal */\n\tbuild(table: SQLiteTable): UniqueConstraint {\n\t\treturn new UniqueConstraint(table, this.columns, this.name);\n\t}\n}\n\nexport class UniqueOnConstraintBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteUniqueOnConstraintBuilder';\n\n\t/** @internal */\n\tname?: string;\n\n\tconstructor(\n\t\tname?: string,\n\t) {\n\t\tthis.name = name;\n\t}\n\n\ton(...columns: [SQLiteColumn, ...SQLiteColumn[]]) {\n\t\treturn new UniqueConstraintBuilder(columns, this.name);\n\t}\n}\n\nexport class UniqueConstraint {\n\tstatic readonly [entityKind]: string = 'SQLiteUniqueConstraint';\n\n\treadonly columns: SQLiteColumn[];\n\treadonly name?: string;\n\n\tconstructor(readonly table: SQLiteTable, columns: SQLiteColumn[], name?: string) {\n\t\tthis.columns = columns;\n\t\tthis.name = name ?? uniqueKeyName(this.table, this.columns.map((column) => column.name));\n\t}\n\n\tgetName() {\n\t\treturn this.name;\n\t}\n}\n","import type {\n\tColumnBuilderBase,\n\tColumnBuilderBaseConfig,\n\tColumnBuilderExtraConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tHasGenerated,\n\tMakeColumnConfig,\n} from '~/column-builder.ts';\nimport { ColumnBuilder } from '~/column-builder.ts';\nimport { Column } from '~/column.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { ForeignKey, UpdateDeleteAction } from '~/sqlite-core/foreign-keys.ts';\nimport { ForeignKeyBuilder } from '~/sqlite-core/foreign-keys.ts';\nimport type { AnySQLiteTable, SQLiteTable } from '~/sqlite-core/table.ts';\nimport type { Update } from '~/utils.ts';\nimport { uniqueKeyName } from '../unique-constraint.ts';\n\nexport interface ReferenceConfig {\n\tref: () => SQLiteColumn;\n\tactions: {\n\t\tonUpdate?: UpdateDeleteAction;\n\t\tonDelete?: UpdateDeleteAction;\n\t};\n}\n\nexport interface SQLiteColumnBuilderBase<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTTypeConfig extends object = object,\n> extends ColumnBuilderBase<T, TTypeConfig & { dialect: 'sqlite' }> {}\n\nexport interface SQLiteGeneratedColumnConfig {\n\tmode?: 'virtual' | 'stored';\n}\n\nexport abstract class SQLiteColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string> = ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n\tTTypeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = object,\n> extends ColumnBuilder<T, TRuntimeConfig, TTypeConfig & { dialect: 'sqlite' }, TExtraConfig>\n\timplements SQLiteColumnBuilderBase<T, TTypeConfig>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteColumnBuilder';\n\n\tprivate foreignKeyConfigs: ReferenceConfig[] = [];\n\n\treferences(\n\t\tref: ReferenceConfig['ref'],\n\t\tactions: ReferenceConfig['actions'] = {},\n\t): this {\n\t\tthis.foreignKeyConfigs.push({ ref, actions });\n\t\treturn this;\n\t}\n\n\tunique(\n\t\tname?: string,\n\t): this {\n\t\tthis.config.isUnique = true;\n\t\tthis.config.uniqueName = name;\n\t\treturn this;\n\t}\n\n\tgeneratedAlwaysAs(as: SQL | T['data'] | (() => SQL), config?: SQLiteGeneratedColumnConfig): HasGenerated<this, {\n\t\ttype: 'always';\n\t}> {\n\t\tthis.config.generated = {\n\t\t\tas,\n\t\t\ttype: 'always',\n\t\t\tmode: config?.mode ?? 'virtual',\n\t\t};\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tbuildForeignKeys(column: SQLiteColumn, table: SQLiteTable): ForeignKey[] {\n\t\treturn this.foreignKeyConfigs.map(({ ref, actions }) => {\n\t\t\treturn ((ref, actions) => {\n\t\t\t\tconst builder = new ForeignKeyBuilder(() => {\n\t\t\t\t\tconst foreignColumn = ref();\n\t\t\t\t\treturn { columns: [column], foreignColumns: [foreignColumn] };\n\t\t\t\t});\n\t\t\t\tif (actions.onUpdate) {\n\t\t\t\t\tbuilder.onUpdate(actions.onUpdate);\n\t\t\t\t}\n\t\t\t\tif (actions.onDelete) {\n\t\t\t\t\tbuilder.onDelete(actions.onDelete);\n\t\t\t\t}\n\t\t\t\treturn builder.build(table);\n\t\t\t})(ref, actions);\n\t\t});\n\t}\n\n\t/** @internal */\n\tabstract build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteColumn<MakeColumnConfig<T, TTableName>>;\n}\n\n// To understand how to use `SQLiteColumn` and `AnySQLiteColumn`, see `Column` and `AnyColumn` documentation.\nexport abstract class SQLiteColumn<\n\tT extends ColumnBaseConfig<ColumnDataType, string> = ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = {},\n\tTTypeConfig extends object = {},\n> extends Column<T, TRuntimeConfig, TTypeConfig & { dialect: 'sqlite' }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteColumn';\n\n\tconstructor(\n\t\toverride readonly table: SQLiteTable,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data'], TRuntimeConfig>,\n\t) {\n\t\tif (!config.uniqueName) {\n\t\t\tconfig.uniqueName = uniqueKeyName(table, [config.name]);\n\t\t}\n\t\tsuper(table, config);\n\t}\n}\n\nexport type AnySQLiteColumn<TPartial extends Partial<ColumnBaseConfig<ColumnDataType, string>> = {}> = SQLiteColumn<\n\tRequired<Update<ColumnBaseConfig<ColumnDataType, string>, TPartial>>\n>;\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\ntype BlobMode = 'buffer' | 'json' | 'bigint';\n\nexport type SQLiteBigIntBuilderInitial<TName extends string> = SQLiteBigIntBuilder<{\n\tname: TName;\n\tdataType: 'bigint';\n\tcolumnType: 'SQLiteBigInt';\n\tdata: bigint;\n\tdriverParam: Buffer;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteBigIntBuilder<T extends ColumnBuilderBaseConfig<'bigint', 'SQLiteBigInt'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteBigIntBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'bigint', 'SQLiteBigInt');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteBigInt<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteBigInt<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any>);\n\t}\n}\n\nexport class SQLiteBigInt<T extends ColumnBaseConfig<'bigint', 'SQLiteBigInt'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBigInt';\n\n\tgetSQLType(): string {\n\t\treturn 'blob';\n\t}\n\n\toverride mapFromDriverValue(value: Buffer | Uint8Array | ArrayBuffer): bigint {\n\t\tif (Buffer.isBuffer(value)) {\n\t\t\treturn BigInt(value.toString());\n\t\t}\n\n\t\t// for sqlite durable objects\n\t\t// eslint-disable-next-line no-instanceof/no-instanceof\n\t\tif (value instanceof ArrayBuffer) {\n\t\t\tconst decoder = new TextDecoder();\n\t\t\treturn BigInt(decoder.decode(value));\n\t\t}\n\n\t\treturn BigInt(String.fromCodePoint(...value));\n\t}\n\n\toverride mapToDriverValue(value: bigint): Buffer {\n\t\treturn Buffer.from(value.toString());\n\t}\n}\n\nexport type SQLiteBlobJsonBuilderInitial<TName extends string> = SQLiteBlobJsonBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'SQLiteBlobJson';\n\tdata: unknown;\n\tdriverParam: Buffer;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteBlobJsonBuilder<T extends ColumnBuilderBaseConfig<'json', 'SQLiteBlobJson'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobJsonBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'SQLiteBlobJson');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteBlobJson<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteBlobJson<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteBlobJson<T extends ColumnBaseConfig<'json', 'SQLiteBlobJson'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobJson';\n\n\tgetSQLType(): string {\n\t\treturn 'blob';\n\t}\n\n\toverride mapFromDriverValue(value: Buffer | Uint8Array | ArrayBuffer): T['data'] {\n\t\tif (Buffer.isBuffer(value)) {\n\t\t\treturn JSON.parse(value.toString());\n\t\t}\n\n\t\t// for sqlite durable objects\n\t\t// eslint-disable-next-line no-instanceof/no-instanceof\n\t\tif (value instanceof ArrayBuffer) {\n\t\t\tconst decoder = new TextDecoder();\n\t\t\treturn JSON.parse(decoder.decode(value));\n\t\t}\n\n\t\treturn JSON.parse(String.fromCodePoint(...value));\n\t}\n\n\toverride mapToDriverValue(value: T['data']): Buffer {\n\t\treturn Buffer.from(JSON.stringify(value));\n\t}\n}\n\nexport type SQLiteBlobBufferBuilderInitial<TName extends string> = SQLiteBlobBufferBuilder<{\n\tname: TName;\n\tdataType: 'buffer';\n\tcolumnType: 'SQLiteBlobBuffer';\n\tdata: Buffer;\n\tdriverParam: Buffer;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteBlobBufferBuilder<T extends ColumnBuilderBaseConfig<'buffer', 'SQLiteBlobBuffer'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobBufferBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'buffer', 'SQLiteBlobBuffer');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteBlobBuffer<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteBlobBuffer<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any>);\n\t}\n}\n\nexport class SQLiteBlobBuffer<T extends ColumnBaseConfig<'buffer', 'SQLiteBlobBuffer'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobBuffer';\n\n\tgetSQLType(): string {\n\t\treturn 'blob';\n\t}\n}\n\nexport interface BlobConfig<TMode extends BlobMode = BlobMode> {\n\tmode: TMode;\n}\n\n/**\n * It's recommended to use `text('...', { mode: 'json' })` instead of `blob` in JSON mode, because it supports JSON functions:\n * >All JSON functions currently throw an error if any of their arguments are BLOBs because BLOBs are reserved for a future enhancement in which BLOBs will store the binary encoding for JSON.\n *\n * https://www.sqlite.org/json1.html\n */\nexport function blob(): SQLiteBlobJsonBuilderInitial<''>;\nexport function blob<TMode extends BlobMode = BlobMode>(\n\tconfig?: BlobConfig<TMode>,\n): Equal<TMode, 'bigint'> extends true ? SQLiteBigIntBuilderInitial<''>\n\t: Equal<TMode, 'buffer'> extends true ? SQLiteBlobBufferBuilderInitial<''>\n\t: SQLiteBlobJsonBuilderInitial<''>;\nexport function blob<TName extends string, TMode extends BlobMode = BlobMode>(\n\tname: TName,\n\tconfig?: BlobConfig<TMode>,\n): Equal<TMode, 'bigint'> extends true ? SQLiteBigIntBuilderInitial<TName>\n\t: Equal<TMode, 'buffer'> extends true ? SQLiteBlobBufferBuilderInitial<TName>\n\t: SQLiteBlobJsonBuilderInitial<TName>;\nexport function blob(a?: string | BlobConfig, b?: BlobConfig) {\n\tconst { name, config } = getColumnNameAndConfig<BlobConfig | undefined>(a, b);\n\tif (config?.mode === 'json') {\n\t\treturn new SQLiteBlobJsonBuilder(name);\n\t}\n\tif (config?.mode === 'bigint') {\n\t\treturn new SQLiteBigIntBuilder(name);\n\t}\n\treturn new SQLiteBlobBufferBuilder(name);\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { AnySQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport type ConvertCustomConfig<TName extends string, T extends Partial<CustomTypeValues>> =\n\t& {\n\t\tname: TName;\n\t\tdataType: 'custom';\n\t\tcolumnType: 'SQLiteCustomColumn';\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverData'];\n\t\tenumValues: undefined;\n\t}\n\t& (T['notNull'] extends true ? { notNull: true } : {})\n\t& (T['default'] extends true ? { hasDefault: true } : {});\n\nexport interface SQLiteCustomColumnInnerConfig {\n\tcustomTypeValues: CustomTypeValues;\n}\n\nexport class SQLiteCustomColumnBuilder<T extends ColumnBuilderBaseConfig<'custom', 'SQLiteCustomColumn'>>\n\textends SQLiteColumnBuilder<\n\t\tT,\n\t\t{\n\t\t\tfieldConfig: CustomTypeValues['config'];\n\t\t\tcustomTypeParams: CustomTypeParams<any>;\n\t\t},\n\t\t{\n\t\t\tsqliteColumnBuilderBrand: 'SQLiteCustomColumnBuilderBrand';\n\t\t}\n\t>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteCustomColumnBuilder';\n\n\tconstructor(\n\t\tname: T['name'],\n\t\tfieldConfig: CustomTypeValues['config'],\n\t\tcustomTypeParams: CustomTypeParams<any>,\n\t) {\n\t\tsuper(name, 'custom', 'SQLiteCustomColumn');\n\t\tthis.config.fieldConfig = fieldConfig;\n\t\tthis.config.customTypeParams = customTypeParams;\n\t}\n\n\t/** @internal */\n\tbuild<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteCustomColumn<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteCustomColumn<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteCustomColumn<T extends ColumnBaseConfig<'custom', 'SQLiteCustomColumn'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteCustomColumn';\n\n\tprivate sqlName: string;\n\tprivate mapTo?: (value: T['data']) => T['driverParam'];\n\tprivate mapFrom?: (value: T['driverParam']) => T['data'];\n\n\tconstructor(\n\t\ttable: AnySQLiteTable<{ name: T['tableName'] }>,\n\t\tconfig: SQLiteCustomColumnBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t\tthis.sqlName = config.customTypeParams.dataType(config.fieldConfig);\n\t\tthis.mapTo = config.customTypeParams.toDriver;\n\t\tthis.mapFrom = config.customTypeParams.fromDriver;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.sqlName;\n\t}\n\n\toverride mapFromDriverValue(value: T['driverParam']): T['data'] {\n\t\treturn typeof this.mapFrom === 'function' ? this.mapFrom(value) : value as T['data'];\n\t}\n\n\toverride mapToDriverValue(value: T['data']): T['driverParam'] {\n\t\treturn typeof this.mapTo === 'function' ? this.mapTo(value) : value as T['data'];\n\t}\n}\n\nexport type CustomTypeValues = {\n\t/**\n\t * Required type for custom column, that will infer proper type model\n\t *\n\t * Examples:\n\t *\n\t * If you want your column to be `string` type after selecting/or on inserting - use `data: string`. Like `text`, `varchar`\n\t *\n\t * If you want your column to be `number` type after selecting/or on inserting - use `data: number`. Like `integer`\n\t */\n\tdata: unknown;\n\n\t/**\n\t * Type helper, that represents what type database driver is accepting for specific database data type\n\t */\n\tdriverData?: unknown;\n\n\t/**\n\t * What config type should be used for {@link CustomTypeParams} `dataType` generation\n\t */\n\tconfig?: Record<string, any>;\n\n\t/**\n\t * Whether the config argument should be required or not\n\t * @default false\n\t */\n\tconfigRequired?: boolean;\n\n\t/**\n\t * If your custom data type should be notNull by default you can use `notNull: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t dataType() {\n\t * \t return 'serial';\n\t * },\n\t * });\n\t */\n\tnotNull?: boolean;\n\n\t/**\n\t * If your custom data type has default you can use `default: true`\n\t *\n\t * @example\n\t * const customSerial = customType<{ data: number, notNull: true, default: true }>({\n\t * \t dataType() {\n\t * \t return 'serial';\n\t * },\n\t * });\n\t */\n\tdefault?: boolean;\n};\n\nexport interface CustomTypeParams<T extends CustomTypeValues> {\n\t/**\n\t * Database data type string representation, that is used for migrations\n\t * @example\n\t * ```\n\t * `jsonb`, `text`\n\t * ```\n\t *\n\t * If database data type needs additional params you can use them from `config` param\n\t * @example\n\t * ```\n\t * `varchar(256)`, `numeric(2,3)`\n\t * ```\n\t *\n\t * To make `config` be of specific type please use config generic in {@link CustomTypeValues}\n\t *\n\t * @example\n\t * Usage example\n\t * ```\n\t * dataType() {\n\t * return 'boolean';\n\t * },\n\t * ```\n\t * Or\n\t * ```\n\t * dataType(config) {\n\t * \t return typeof config.length !== 'undefined' ? `varchar(${config.length})` : `varchar`;\n\t * \t }\n\t * ```\n\t */\n\tdataType: (config: T['config'] | (Equal<T['configRequired'], true> extends true ? never : undefined)) => string;\n\n\t/**\n\t * Optional mapping function, between user input and driver\n\t * @example\n\t * For example, when using jsonb we need to map JS/TS object to string before writing to database\n\t * ```\n\t * toDriver(value: TData): string {\n\t * \t return JSON.stringify(value);\n\t * }\n\t * ```\n\t */\n\ttoDriver?: (value: T['data']) => T['driverData'] | SQL;\n\n\t/**\n\t * Optional mapping function, that is responsible for data mapping from database to JS/TS code\n\t * @example\n\t * For example, when using timestamp we need to map string Date representation to JS Date\n\t * ```\n\t * fromDriver(value: string): Date {\n\t * \treturn new Date(value);\n\t * },\n\t * ```\n\t */\n\tfromDriver?: (value: T['driverData']) => T['data'];\n}\n\n/**\n * Custom sqlite database data type generator\n */\nexport function customType<T extends CustomTypeValues = CustomTypeValues>(\n\tcustomTypeParams: CustomTypeParams<T>,\n): Equal<T['configRequired'], true> extends true ? {\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig: TConfig,\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TName extends string>(\n\t\t\tdbName: TName,\n\t\t\tfieldConfig: T['config'],\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<TName, T>>;\n\t}\n\t: {\n\t\t(): SQLiteCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TConfig extends Record<string, any> & T['config']>(\n\t\t\tfieldConfig?: TConfig,\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<'', T>>;\n\t\t<TName extends string>(\n\t\t\tdbName: TName,\n\t\t\tfieldConfig?: T['config'],\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<TName, T>>;\n\t}\n{\n\treturn <TName extends string>(\n\t\ta?: TName | T['config'],\n\t\tb?: T['config'],\n\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<TName, T>> => {\n\t\tconst { name, config } = getColumnNameAndConfig<T['config']>(a, b);\n\t\treturn new SQLiteCustomColumnBuilder(\n\t\t\tname as ConvertCustomConfig<TName, T>['name'],\n\t\t\tconfig,\n\t\t\tcustomTypeParams,\n\t\t);\n\t};\n}\n","import type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnDataType,\n\tHasDefault,\n\tIsPrimaryKey,\n\tMakeColumnConfig,\n\tNotNull,\n} from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { OnConflict } from '~/sqlite-core/utils.ts';\nimport { type Equal, getColumnNameAndConfig, type Or } from '~/utils.ts';\nimport type { AnySQLiteTable } from '../table.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport interface PrimaryKeyConfig {\n\tautoIncrement?: boolean;\n\tonConflict?: OnConflict;\n}\n\nexport abstract class SQLiteBaseIntegerBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n> extends SQLiteColumnBuilder<\n\tT,\n\tTRuntimeConfig & { autoIncrement: boolean },\n\t{},\n\t{ primaryKeyHasDefault: true }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBaseIntegerBuilder';\n\n\tconstructor(name: T['name'], dataType: T['dataType'], columnType: T['columnType']) {\n\t\tsuper(name, dataType, columnType);\n\t\tthis.config.autoIncrement = false;\n\t}\n\n\toverride primaryKey(config?: PrimaryKeyConfig): IsPrimaryKey<HasDefault<NotNull<this>>> {\n\t\tif (config?.autoIncrement) {\n\t\t\tthis.config.autoIncrement = true;\n\t\t}\n\t\tthis.config.hasDefault = true;\n\t\treturn super.primaryKey() as IsPrimaryKey<HasDefault<NotNull<this>>>;\n\t}\n\n\t/** @internal */\n\tabstract override build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteBaseInteger<MakeColumnConfig<T, TTableName>>;\n}\n\nexport abstract class SQLiteBaseInteger<\n\tT extends ColumnBaseConfig<ColumnDataType, string>,\n\tTRuntimeConfig extends object = object,\n> extends SQLiteColumn<T, TRuntimeConfig & { autoIncrement: boolean }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBaseInteger';\n\n\treadonly autoIncrement: boolean = this.config.autoIncrement;\n\n\tgetSQLType(): string {\n\t\treturn 'integer';\n\t}\n}\n\nexport type SQLiteIntegerBuilderInitial<TName extends string> = SQLiteIntegerBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SQLiteInteger';\n\tdata: number;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteIntegerBuilder<T extends ColumnBuilderBaseConfig<'number', 'SQLiteInteger'>>\n\textends SQLiteBaseIntegerBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteIntegerBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'SQLiteInteger');\n\t}\n\n\tbuild<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteInteger<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteInteger<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteInteger<T extends ColumnBaseConfig<'number', 'SQLiteInteger'>> extends SQLiteBaseInteger<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteInteger';\n}\n\nexport type SQLiteTimestampBuilderInitial<TName extends string> = SQLiteTimestampBuilder<{\n\tname: TName;\n\tdataType: 'date';\n\tcolumnType: 'SQLiteTimestamp';\n\tdata: Date;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteTimestampBuilder<T extends ColumnBuilderBaseConfig<'date', 'SQLiteTimestamp'>>\n\textends SQLiteBaseIntegerBuilder<T, { mode: 'timestamp' | 'timestamp_ms' }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTimestampBuilder';\n\n\tconstructor(name: T['name'], mode: 'timestamp' | 'timestamp_ms') {\n\t\tsuper(name, 'date', 'SQLiteTimestamp');\n\t\tthis.config.mode = mode;\n\t}\n\n\t/**\n\t * @deprecated Use `default()` with your own expression instead.\n\t *\n\t * Adds `DEFAULT (cast((julianday('now') - 2440587.5)*86400000 as integer))` to the column, which is the current epoch timestamp in milliseconds.\n\t */\n\tdefaultNow(): HasDefault<this> {\n\t\treturn this.default(sql`(cast((julianday('now') - 2440587.5)*86400000 as integer))`) as any;\n\t}\n\n\tbuild<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteTimestamp<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteTimestamp<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteTimestamp<T extends ColumnBaseConfig<'date', 'SQLiteTimestamp'>>\n\textends SQLiteBaseInteger<T, { mode: 'timestamp' | 'timestamp_ms' }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTimestamp';\n\n\treadonly mode: 'timestamp' | 'timestamp_ms' = this.config.mode;\n\n\toverride mapFromDriverValue(value: number): Date {\n\t\tif (this.config.mode === 'timestamp') {\n\t\t\treturn new Date(value * 1000);\n\t\t}\n\t\treturn new Date(value);\n\t}\n\n\toverride mapToDriverValue(value: Date): number {\n\t\tconst unix = value.getTime();\n\t\tif (this.config.mode === 'timestamp') {\n\t\t\treturn Math.floor(unix / 1000);\n\t\t}\n\t\treturn unix;\n\t}\n}\n\nexport type SQLiteBooleanBuilderInitial<TName extends string> = SQLiteBooleanBuilder<{\n\tname: TName;\n\tdataType: 'boolean';\n\tcolumnType: 'SQLiteBoolean';\n\tdata: boolean;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteBooleanBuilder<T extends ColumnBuilderBaseConfig<'boolean', 'SQLiteBoolean'>>\n\textends SQLiteBaseIntegerBuilder<T, { mode: 'boolean' }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteBooleanBuilder';\n\n\tconstructor(name: T['name'], mode: 'boolean') {\n\t\tsuper(name, 'boolean', 'SQLiteBoolean');\n\t\tthis.config.mode = mode;\n\t}\n\n\tbuild<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteBoolean<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteBoolean<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteBoolean<T extends ColumnBaseConfig<'boolean', 'SQLiteBoolean'>>\n\textends SQLiteBaseInteger<T, { mode: 'boolean' }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteBoolean';\n\n\treadonly mode: 'boolean' = this.config.mode;\n\n\toverride mapFromDriverValue(value: number): boolean {\n\t\treturn Number(value) === 1;\n\t}\n\n\toverride mapToDriverValue(value: boolean): number {\n\t\treturn value ? 1 : 0;\n\t}\n}\n\nexport interface IntegerConfig<\n\tTMode extends 'number' | 'timestamp' | 'timestamp_ms' | 'boolean' =\n\t\t| 'number'\n\t\t| 'timestamp'\n\t\t| 'timestamp_ms'\n\t\t| 'boolean',\n> {\n\tmode: TMode;\n}\n\nexport function integer(): SQLiteIntegerBuilderInitial<''>;\nexport function integer<TMode extends IntegerConfig['mode']>(\n\tconfig?: IntegerConfig<TMode>,\n): Or<Equal<TMode, 'timestamp'>, Equal<TMode, 'timestamp_ms'>> extends true ? SQLiteTimestampBuilderInitial<''>\n\t: Equal<TMode, 'boolean'> extends true ? SQLiteBooleanBuilderInitial<''>\n\t: SQLiteIntegerBuilderInitial<''>;\nexport function integer<TName extends string, TMode extends IntegerConfig['mode']>(\n\tname: TName,\n\tconfig?: IntegerConfig<TMode>,\n): Or<Equal<TMode, 'timestamp'>, Equal<TMode, 'timestamp_ms'>> extends true ? SQLiteTimestampBuilderInitial<TName>\n\t: Equal<TMode, 'boolean'> extends true ? SQLiteBooleanBuilderInitial<TName>\n\t: SQLiteIntegerBuilderInitial<TName>;\nexport function integer(a?: string | IntegerConfig, b?: IntegerConfig) {\n\tconst { name, config } = getColumnNameAndConfig<IntegerConfig | undefined>(a, b);\n\tif (config?.mode === 'timestamp' || config?.mode === 'timestamp_ms') {\n\t\treturn new SQLiteTimestampBuilder(name, config.mode);\n\t}\n\tif (config?.mode === 'boolean') {\n\t\treturn new SQLiteBooleanBuilder(name, config.mode);\n\t}\n\treturn new SQLiteIntegerBuilder(name);\n}\n\nexport const int = integer;\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySQLiteTable } from '~/sqlite-core/table.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport type SQLiteNumericBuilderInitial<TName extends string> = SQLiteNumericBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'SQLiteNumeric';\n\tdata: string;\n\tdriverParam: string;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteNumericBuilder<T extends ColumnBuilderBaseConfig<'string', 'SQLiteNumeric'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'string', 'SQLiteNumeric');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteNumeric<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteNumeric<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteNumeric<T extends ColumnBaseConfig<'string', 'SQLiteNumeric'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumeric';\n\n\tgetSQLType(): string {\n\t\treturn 'numeric';\n\t}\n}\n\nexport function numeric(): SQLiteNumericBuilderInitial<''>;\nexport function numeric<TName extends string>(name: TName): SQLiteNumericBuilderInitial<TName>;\nexport function numeric(name?: string) {\n\treturn new SQLiteNumericBuilder(name ?? '');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySQLiteTable } from '../table.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport type SQLiteRealBuilderInitial<TName extends string> = SQLiteRealBuilder<{\n\tname: TName;\n\tdataType: 'number';\n\tcolumnType: 'SQLiteReal';\n\tdata: number;\n\tdriverParam: number;\n\tenumValues: undefined;\n}>;\n\nexport class SQLiteRealBuilder<T extends ColumnBuilderBaseConfig<'number', 'SQLiteReal'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteRealBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'number', 'SQLiteReal');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteReal<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteReal<MakeColumnConfig<T, TTableName>>(table, this.config as ColumnBuilderRuntimeConfig<any, any>);\n\t}\n}\n\nexport class SQLiteReal<T extends ColumnBaseConfig<'number', 'SQLiteReal'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteReal';\n\n\tgetSQLType(): string {\n\t\treturn 'real';\n\t}\n}\n\nexport function real(): SQLiteRealBuilderInitial<''>;\nexport function real<TName extends string>(name: TName): SQLiteRealBuilderInitial<TName>;\nexport function real(name?: string) {\n\treturn new SQLiteRealBuilder(name ?? '');\n}\n","import type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig, MakeColumnConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Equal, getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport type SQLiteTextBuilderInitial<\n\tTName extends string,\n\tTEnum extends [string, ...string[]],\n\tTLength extends number | undefined,\n> = SQLiteTextBuilder<{\n\tname: TName;\n\tdataType: 'string';\n\tcolumnType: 'SQLiteText';\n\tdata: TEnum[number];\n\tdriverParam: string;\n\tenumValues: TEnum;\n\tlength: TLength;\n}>;\n\nexport class SQLiteTextBuilder<\n\tT extends ColumnBuilderBaseConfig<'string', 'SQLiteText'> & { length?: number | undefined },\n> extends SQLiteColumnBuilder<\n\tT,\n\t{ length: T['length']; enumValues: T['enumValues'] },\n\t{ length: T['length'] }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTextBuilder';\n\n\tconstructor(name: T['name'], config: SQLiteTextConfig<'text', T['enumValues'], T['length']>) {\n\t\tsuper(name, 'string', 'SQLiteText');\n\t\tthis.config.enumValues = config.enum;\n\t\tthis.config.length = config.length;\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteText<MakeColumnConfig<T, TTableName> & { length: T['length'] }> {\n\t\treturn new SQLiteText<MakeColumnConfig<T, TTableName> & { length: T['length'] }>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteText<T extends ColumnBaseConfig<'string', 'SQLiteText'> & { length?: number | undefined }>\n\textends SQLiteColumn<T, { length: T['length']; enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteText';\n\n\toverride readonly enumValues = this.config.enumValues;\n\n\treadonly length: T['length'] = this.config.length;\n\n\tconstructor(\n\t\ttable: AnySQLiteTable<{ name: T['tableName'] }>,\n\t\tconfig: SQLiteTextBuilder<T>['config'],\n\t) {\n\t\tsuper(table, config);\n\t}\n\n\tgetSQLType(): string {\n\t\treturn `text${this.config.length ? `(${this.config.length})` : ''}`;\n\t}\n}\n\nexport type SQLiteTextJsonBuilderInitial<TName extends string> = SQLiteTextJsonBuilder<{\n\tname: TName;\n\tdataType: 'json';\n\tcolumnType: 'SQLiteTextJson';\n\tdata: unknown;\n\tdriverParam: string;\n\tenumValues: undefined;\n\tgenerated: undefined;\n}>;\n\nexport class SQLiteTextJsonBuilder<T extends ColumnBuilderBaseConfig<'json', 'SQLiteTextJson'>>\n\textends SQLiteColumnBuilder<T>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTextJsonBuilder';\n\n\tconstructor(name: T['name']) {\n\t\tsuper(name, 'json', 'SQLiteTextJson');\n\t}\n\n\t/** @internal */\n\toverride build<TTableName extends string>(\n\t\ttable: AnySQLiteTable<{ name: TTableName }>,\n\t): SQLiteTextJson<MakeColumnConfig<T, TTableName>> {\n\t\treturn new SQLiteTextJson<MakeColumnConfig<T, TTableName>>(\n\t\t\ttable,\n\t\t\tthis.config as ColumnBuilderRuntimeConfig<any, any>,\n\t\t);\n\t}\n}\n\nexport class SQLiteTextJson<T extends ColumnBaseConfig<'json', 'SQLiteTextJson'>>\n\textends SQLiteColumn<T, { length: number | undefined; enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTextJson';\n\n\tgetSQLType(): string {\n\t\treturn 'text';\n\t}\n\n\toverride mapFromDriverValue(value: string): T['data'] {\n\t\treturn JSON.parse(value);\n\t}\n\n\toverride mapToDriverValue(value: T['data']): string {\n\t\treturn JSON.stringify(value);\n\t}\n}\n\nexport type SQLiteTextConfig<\n\tTMode extends 'text' | 'json' = 'text' | 'json',\n\tTEnum extends readonly string[] | string[] | undefined = readonly string[] | string[] | undefined,\n\tTLength extends number | undefined = number | undefined,\n> = TMode extends 'text' ? {\n\t\tmode?: TMode;\n\t\tlength?: TLength;\n\t\tenum?: TEnum;\n\t}\n\t: {\n\t\tmode?: TMode;\n\t};\n\nexport function text(): SQLiteTextBuilderInitial<'', [string, ...string[]], undefined>;\nexport function text<\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tL extends number | undefined,\n\tTMode extends 'text' | 'json' = 'text' | 'json',\n>(\n\tconfig?: SQLiteTextConfig<TMode, T | Writable<T>, L>,\n): Equal<TMode, 'json'> extends true ? SQLiteTextJsonBuilderInitial<''>\n\t: SQLiteTextBuilderInitial<'', Writable<T>, L>;\nexport function text<\n\tTName extends string,\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tL extends number | undefined,\n\tTMode extends 'text' | 'json' = 'text' | 'json',\n>(\n\tname: TName,\n\tconfig?: SQLiteTextConfig<TMode, T | Writable<T>, L>,\n): Equal<TMode, 'json'> extends true ? SQLiteTextJsonBuilderInitial<TName>\n\t: SQLiteTextBuilderInitial<TName, Writable<T>, L>;\nexport function text(a?: string | SQLiteTextConfig, b: SQLiteTextConfig = {}): any {\n\tconst { name, config } = getColumnNameAndConfig<SQLiteTextConfig>(a, b);\n\tif (config.mode === 'json') {\n\t\treturn new SQLiteTextJsonBuilder(name);\n\t}\n\treturn new SQLiteTextBuilder(name, config as any);\n}\n","import { blob } from './blob.ts';\nimport { customType } from './custom.ts';\nimport { integer } from './integer.ts';\nimport { numeric } from './numeric.ts';\nimport { real } from './real.ts';\nimport { text } from './text.ts';\n\nexport function getSQLiteColumnBuilders() {\n\treturn {\n\t\tblob,\n\t\tcustomType,\n\t\tinteger,\n\t\tnumeric,\n\t\treal,\n\t\ttext,\n\t};\n}\n\nexport type SQLiteColumnBuilders = ReturnType<typeof getSQLiteColumnBuilders>;\n","import type { BuildColumns, BuildExtraConfigColumns } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport { Table, type TableConfig as TableConfigBase, type UpdateTableConfig } from '~/table.ts';\nimport type { CheckBuilder } from './checks.ts';\nimport { getSQLiteColumnBuilders, type SQLiteColumnBuilders } from './columns/all.ts';\nimport type { SQLiteColumn, SQLiteColumnBuilder, SQLiteColumnBuilderBase } from './columns/common.ts';\nimport type { ForeignKey, ForeignKeyBuilder } from './foreign-keys.ts';\nimport type { IndexBuilder } from './indexes.ts';\nimport type { PrimaryKeyBuilder } from './primary-keys.ts';\nimport type { UniqueConstraintBuilder } from './unique-constraint.ts';\n\nexport type SQLiteTableExtraConfigValue =\n\t| IndexBuilder\n\t| CheckBuilder\n\t| ForeignKeyBuilder\n\t| PrimaryKeyBuilder\n\t| UniqueConstraintBuilder;\n\nexport type SQLiteTableExtraConfig = Record<\n\tstring,\n\tSQLiteTableExtraConfigValue\n>;\n\nexport type TableConfig = TableConfigBase<SQLiteColumn<any>>;\n\n/** @internal */\nexport const InlineForeignKeys = Symbol.for('drizzle:SQLiteInlineForeignKeys');\n\nexport class SQLiteTable<T extends TableConfig = TableConfig> extends Table<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTable';\n\n\t/** @internal */\n\tstatic override readonly Symbol = Object.assign({}, Table.Symbol, {\n\t\tInlineForeignKeys: InlineForeignKeys as typeof InlineForeignKeys,\n\t});\n\n\t/** @internal */\n\toverride [Table.Symbol.Columns]!: NonNullable<T['columns']>;\n\n\t/** @internal */\n\t[InlineForeignKeys]: ForeignKey[] = [];\n\n\t/** @internal */\n\toverride [Table.Symbol.ExtraConfigBuilder]:\n\t\t| ((self: Record<string, SQLiteColumn>) => SQLiteTableExtraConfig)\n\t\t| undefined = undefined;\n}\n\nexport type AnySQLiteTable<TPartial extends Partial<TableConfig> = {}> = SQLiteTable<\n\tUpdateTableConfig<TableConfig, TPartial>\n>;\n\nexport type SQLiteTableWithColumns<T extends TableConfig> =\n\t& SQLiteTable<T>\n\t& {\n\t\t[Key in keyof T['columns']]: T['columns'][Key];\n\t};\n\nexport interface SQLiteTableFn<TSchema extends string | undefined = undefined> {\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, SQLiteColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (\n\t\t\tself: BuildColumns<TTableName, TColumnsMap, 'sqlite'>,\n\t\t) => SQLiteTableExtraConfigValue[],\n\t): SQLiteTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>;\n\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, SQLiteColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: SQLiteColumnBuilders) => TColumnsMap,\n\t\textraConfig?: (self: BuildColumns<TTableName, TColumnsMap, 'sqlite'>) => SQLiteTableExtraConfigValue[],\n\t): SQLiteTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>;\n\t/**\n\t * @deprecated The third parameter of sqliteTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = sqliteTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = sqliteTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, SQLiteColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: TColumnsMap,\n\t\textraConfig?: (self: BuildColumns<TTableName, TColumnsMap, 'sqlite'>) => SQLiteTableExtraConfig,\n\t): SQLiteTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>;\n\n\t/**\n\t * @deprecated The third parameter of sqliteTable is changing and will only accept an array instead of an object\n\t *\n\t * @example\n\t * Deprecated version:\n\t * ```ts\n\t * export const users = sqliteTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => ({\n\t * \tidx: index('custom_name').on(t.id)\n\t * }));\n\t * ```\n\t *\n\t * New API:\n\t * ```ts\n\t * export const users = sqliteTable(\"users\", {\n\t * \tid: int(),\n\t * }, (t) => [\n\t * \tindex('custom_name').on(t.id)\n\t * ]);\n\t * ```\n\t */\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, SQLiteColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: SQLiteColumnBuilders) => TColumnsMap,\n\t\textraConfig?: (self: BuildColumns<TTableName, TColumnsMap, 'sqlite'>) => SQLiteTableExtraConfig,\n\t): SQLiteTableWithColumns<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>;\n}\n\nfunction sqliteTableBase<\n\tTTableName extends string,\n\tTColumnsMap extends Record<string, SQLiteColumnBuilderBase>,\n\tTSchema extends string | undefined,\n>(\n\tname: TTableName,\n\tcolumns: TColumnsMap | ((columnTypes: SQLiteColumnBuilders) => TColumnsMap),\n\textraConfig:\n\t\t| ((\n\t\t\tself: BuildColumns<TTableName, TColumnsMap, 'sqlite'>,\n\t\t) => SQLiteTableExtraConfig | SQLiteTableExtraConfigValue[])\n\t\t| undefined,\n\tschema?: TSchema,\n\tbaseName = name,\n): SQLiteTableWithColumns<{\n\tname: TTableName;\n\tschema: TSchema;\n\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\tdialect: 'sqlite';\n}> {\n\tconst rawTable = new SQLiteTable<{\n\t\tname: TTableName;\n\t\tschema: TSchema;\n\t\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\t\tdialect: 'sqlite';\n\t}>(name, schema, baseName);\n\n\tconst parsedColumns: TColumnsMap = typeof columns === 'function' ? columns(getSQLiteColumnBuilders()) : columns;\n\n\tconst builtColumns = Object.fromEntries(\n\t\tObject.entries(parsedColumns).map(([name, colBuilderBase]) => {\n\t\t\tconst colBuilder = colBuilderBase as SQLiteColumnBuilder;\n\t\t\tcolBuilder.setName(name);\n\t\t\tconst column = colBuilder.build(rawTable);\n\t\t\trawTable[InlineForeignKeys].push(...colBuilder.buildForeignKeys(column, rawTable));\n\t\t\treturn [name, column];\n\t\t}),\n\t) as unknown as BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\n\tconst table = Object.assign(rawTable, builtColumns);\n\n\ttable[Table.Symbol.Columns] = builtColumns;\n\ttable[Table.Symbol.ExtraConfigColumns] = builtColumns as unknown as BuildExtraConfigColumns<\n\t\tTTableName,\n\t\tTColumnsMap,\n\t\t'sqlite'\n\t>;\n\n\tif (extraConfig) {\n\t\ttable[SQLiteTable.Symbol.ExtraConfigBuilder] = extraConfig as (\n\t\t\tself: Record<string, SQLiteColumn>,\n\t\t) => SQLiteTableExtraConfig;\n\t}\n\n\treturn table;\n}\n\nexport const sqliteTable: SQLiteTableFn = (name, columns, extraConfig) => {\n\treturn sqliteTableBase(name, columns, extraConfig);\n};\n\nexport function sqliteTableCreator(customizeTableName: (name: string) => string): SQLiteTableFn {\n\treturn (name, columns, extraConfig) => {\n\t\treturn sqliteTableBase(customizeTableName(name) as typeof name, columns, extraConfig, undefined, name);\n\t};\n}\n","import { entityKind } from '~/entity.ts';\nimport type { SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { Placeholder, Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport { type DrizzleTypeError, orderSelectedFields, type ValueOrArray } from '~/utils.ts';\nimport type { SQLiteColumn } from '../columns/common.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts';\n\nexport type SQLiteDeleteWithout<\n\tT extends AnySQLiteDeleteBase,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T\n\t: Omit<\n\t\tSQLiteDeleteBase<\n\t\t\tT['_']['table'],\n\t\t\tT['_']['resultType'],\n\t\t\tT['_']['runResult'],\n\t\t\tT['_']['returning'],\n\t\t\tTDynamic,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>,\n\t\tT['_']['excludedMethods'] | K\n\t>;\n\nexport type SQLiteDelete<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n> = SQLiteDeleteBase<TTable, TResultType, TRunResult, TReturning, true, never>;\n\nexport interface SQLiteDeleteConfig {\n\twhere?: SQL | undefined;\n\tlimit?: number | Placeholder;\n\torderBy?: (SQLiteColumn | SQL | SQL.Aliased)[];\n\ttable: SQLiteTable;\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type SQLiteDeleteReturningAll<\n\tT extends AnySQLiteDeleteBase,\n\tTDynamic extends boolean,\n> = SQLiteDeleteWithout<\n\tSQLiteDeleteBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tT['_']['dynamic'],\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteDeleteReturning<\n\tT extends AnySQLiteDeleteBase,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFieldsFlat,\n> = SQLiteDeleteWithout<\n\tSQLiteDeleteBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tSelectResultFields<TSelectedFields>,\n\t\tT['_']['dynamic'],\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteDeleteExecute<T extends AnySQLiteDeleteBase> = T['_']['returning'] extends undefined\n\t? T['_']['runResult']\n\t: T['_']['returning'][];\n\nexport type SQLiteDeletePrepare<T extends AnySQLiteDeleteBase> = SQLitePreparedQuery<{\n\ttype: T['_']['resultType'];\n\trun: T['_']['runResult'];\n\tall: T['_']['returning'] extends undefined ? DrizzleTypeError<'.all() cannot be used without .returning()'>\n\t\t: T['_']['returning'][];\n\tget: T['_']['returning'] extends undefined ? DrizzleTypeError<'.get() cannot be used without .returning()'>\n\t\t: T['_']['returning'] | undefined;\n\tvalues: T['_']['returning'] extends undefined ? DrizzleTypeError<'.values() cannot be used without .returning()'>\n\t\t: any[][];\n\texecute: SQLiteDeleteExecute<T>;\n}>;\n\nexport type SQLiteDeleteDynamic<T extends AnySQLiteDeleteBase> = SQLiteDelete<\n\tT['_']['table'],\n\tT['_']['resultType'],\n\tT['_']['runResult'],\n\tT['_']['returning']\n>;\n\nexport type AnySQLiteDeleteBase = SQLiteDeleteBase<any, any, any, any, any, any>;\n\nexport interface SQLiteDeleteBase<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tQueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>,\n\tSQLWrapper\n{\n\treadonly _: {\n\t\tdialect: 'sqlite';\n\t\treadonly table: TTable;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? TRunResult : TReturning[];\n\t};\n}\n\nexport class SQLiteDeleteBase<\n\tTTable extends SQLiteTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>\n\timplements RunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteDelete';\n\n\t/** @internal */\n\tconfig: SQLiteDeleteConfig;\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprivate session: SQLiteSession<any, any, any, any>,\n\t\tprivate dialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, withList };\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will delete only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be deleted.\n\t *\n\t * ```ts\n\t * // Delete all cars with green color\n\t * db.delete(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * db.delete(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Delete all BMW cars with a green color\n\t * db.delete(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Delete all cars with the green or blue color\n\t * db.delete(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): SQLiteDeleteWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\torderBy(\n\t\tbuilder: (deleteTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteDeleteWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (SQLiteColumn | SQL | SQL.Aliased)[]): SQLiteDeleteWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(deleteTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteDeleteWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as any,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t} else {\n\t\t\tconst orderByArray = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\tlimit(limit: number | Placeholder): SQLiteDeleteWithout<this, TDynamic, 'limit'> {\n\t\tthis.config.limit = limit;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the deleted rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete#delete-with-return}\n\t *\n\t * @example\n\t * ```ts\n\t * // Delete all cars with the green color and return all fields\n\t * const deletedCars: Car[] = await db.delete(cars)\n\t * .where(eq(cars.color, 'green'))\n\t * .returning();\n\t *\n\t * // Delete all cars with the green color and return only their id and brand fields\n\t * const deletedCarsIdsAndBrands: { id: number, brand: string }[] = await db.delete(cars)\n\t * .where(eq(cars.color, 'green'))\n\t * .returning({ id: cars.id, brand: cars.brand });\n\t * ```\n\t */\n\treturning(): SQLiteDeleteReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFieldsFlat>(\n\t\tfields: TSelectedFields,\n\t): SQLiteDeleteReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields: SelectedFieldsFlat = this.table[SQLiteTable.Symbol.Columns],\n\t): SQLiteDeleteReturning<this, TDynamic, any> {\n\t\tthis.config.returning = orderSelectedFields<SQLiteColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildDeleteQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(isOneTimeQuery = true): SQLiteDeletePrepare<this> {\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tthis.config.returning,\n\t\t\tthis.config.returning ? 'all' : 'run',\n\t\t\ttrue,\n\t\t) as SQLiteDeletePrepare<this>;\n\t}\n\n\tprepare(): SQLiteDeletePrepare<this> {\n\t\treturn this._prepare(false);\n\t}\n\n\trun: ReturnType<this['prepare']>['run'] = (placeholderValues) => {\n\t\treturn this._prepare().run(placeholderValues);\n\t};\n\n\tall: ReturnType<this['prepare']>['all'] = (placeholderValues) => {\n\t\treturn this._prepare().all(placeholderValues);\n\t};\n\n\tget: ReturnType<this['prepare']>['get'] = (placeholderValues) => {\n\t\treturn this._prepare().get(placeholderValues);\n\t};\n\n\tvalues: ReturnType<this['prepare']>['values'] = (placeholderValues) => {\n\t\treturn this._prepare().values(placeholderValues);\n\t};\n\n\toverride async execute(placeholderValues?: Record<string, unknown>): Promise<SQLiteDeleteExecute<this>> {\n\t\treturn this._prepare().execute(placeholderValues) as SQLiteDeleteExecute<this>;\n\t}\n\n\t$dynamic(): SQLiteDeleteDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n","import type { Column } from '~/column.ts';\nimport { entityKind } from './entity.ts';\nimport { Table } from './table.ts';\nimport type { Casing } from './utils.ts';\n\nexport function toSnakeCase(input: string) {\n\tconst words = input\n\t\t.replace(/['\\u2019]/g, '')\n\t\t.match(/[\\da-z]+|[A-Z]+(?![a-z])|[A-Z][\\da-z]+/g) ?? [];\n\n\treturn words.map((word) => word.toLowerCase()).join('_');\n}\n\nexport function toCamelCase(input: string) {\n\tconst words = input\n\t\t.replace(/['\\u2019]/g, '')\n\t\t.match(/[\\da-z]+|[A-Z]+(?![a-z])|[A-Z][\\da-z]+/g) ?? [];\n\n\treturn words.reduce((acc, word, i) => {\n\t\tconst formattedWord = i === 0 ? word.toLowerCase() : `${word[0]!.toUpperCase()}${word.slice(1)}`;\n\t\treturn acc + formattedWord;\n\t}, '');\n}\n\nfunction noopCase(input: string) {\n\treturn input;\n}\n\nexport class CasingCache {\n\tstatic readonly [entityKind]: string = 'CasingCache';\n\n\t/** @internal */\n\tcache: Record<string, string> = {};\n\tprivate cachedTables: Record<string, true> = {};\n\tprivate convert: (input: string) => string;\n\n\tconstructor(casing?: Casing) {\n\t\tthis.convert = casing === 'snake_case'\n\t\t\t? toSnakeCase\n\t\t\t: casing === 'camelCase'\n\t\t\t? toCamelCase\n\t\t\t: noopCase;\n\t}\n\n\tgetColumnCasing(column: Column): string {\n\t\tif (!column.keyAsName) return column.name;\n\n\t\tconst schema = column.table[Table.Symbol.Schema] ?? 'public';\n\t\tconst tableName = column.table[Table.Symbol.OriginalName];\n\t\tconst key = `${schema}.${tableName}.${column.name}`;\n\n\t\tif (!this.cache[key]) {\n\t\t\tthis.cacheTable(column.table);\n\t\t}\n\t\treturn this.cache[key]!;\n\t}\n\n\tprivate cacheTable(table: Table) {\n\t\tconst schema = table[Table.Symbol.Schema] ?? 'public';\n\t\tconst tableName = table[Table.Symbol.OriginalName];\n\t\tconst tableKey = `${schema}.${tableName}`;\n\n\t\tif (!this.cachedTables[tableKey]) {\n\t\t\tfor (const column of Object.values(table[Table.Symbol.Columns])) {\n\t\t\t\tconst columnKey = `${tableKey}.${column.name}`;\n\t\t\t\tthis.cache[columnKey] = this.convert(column.name);\n\t\t\t}\n\t\t\tthis.cachedTables[tableKey] = true;\n\t\t}\n\t}\n\n\tclearCache() {\n\t\tthis.cache = {};\n\t\tthis.cachedTables = {};\n\t}\n}\n","import { entityKind } from '~/entity.ts';\n\nexport class DrizzleError extends Error {\n\tstatic readonly [entityKind]: string = 'DrizzleError';\n\n\tconstructor({ message, cause }: { message?: string; cause?: unknown }) {\n\t\tsuper(message);\n\t\tthis.name = 'DrizzleError';\n\t\tthis.cause = cause;\n\t}\n}\n\nexport class TransactionRollbackError extends DrizzleError {\n\tstatic override readonly [entityKind]: string = 'TransactionRollbackError';\n\n\tconstructor() {\n\t\tsuper({ message: 'Rollback' });\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport type { ColumnsSelection } from '~/sql/sql.ts';\nimport { View } from '~/sql/sql.ts';\n\nexport abstract class SQLiteViewBase<\n\tTName extends string = string,\n\tTExisting extends boolean = boolean,\n\tTSelection extends ColumnsSelection = ColumnsSelection,\n> extends View<TName, TExisting, TSelection> {\n\tstatic override readonly [entityKind]: string = 'SQLiteViewBase';\n\n\tdeclare _: View<TName, TExisting, TSelection>['_'] & {\n\t\tviewBrand: 'SQLiteView';\n\t};\n}\n","import { aliasedTable, aliasedTableColumn, mapColumnsInAliasedSQLToAlias, mapColumnsInSQLToAlias } from '~/alias.ts';\nimport { CasingCache } from '~/casing.ts';\nimport type { AnyColumn } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta } from '~/migrator.ts';\nimport {\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tgetOperators,\n\tgetOrderByOperators,\n\tMany,\n\tnormalizeRelation,\n\tOne,\n\ttype Relation,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport type { Name, Placeholder } from '~/sql/index.ts';\nimport { and, eq } from '~/sql/index.ts';\nimport { Param, type QueryWithTypings, SQL, sql, type SQLChunk } from '~/sql/sql.ts';\nimport { SQLiteColumn } from '~/sqlite-core/columns/index.ts';\nimport type {\n\tAnySQLiteSelectQueryBuilder,\n\tSQLiteDeleteConfig,\n\tSQLiteInsertConfig,\n\tSQLiteUpdateConfig,\n} from '~/sqlite-core/query-builders/index.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { getTableName, getTableUniqueName, Table } from '~/table.ts';\nimport { type Casing, orderSelectedFields, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type {\n\tSelectedFieldsOrdered,\n\tSQLiteSelectConfig,\n\tSQLiteSelectJoinConfig,\n} from './query-builders/select.types.ts';\nimport type { SQLiteSession } from './session.ts';\nimport { SQLiteViewBase } from './view-base.ts';\n\nexport interface SQLiteDialectConfig {\n\tcasing?: Casing;\n}\n\nexport abstract class SQLiteDialect {\n\tstatic readonly [entityKind]: string = 'SQLiteDialect';\n\n\t/** @internal */\n\treadonly casing: CasingCache;\n\n\tconstructor(config?: SQLiteDialectConfig) {\n\t\tthis.casing = new CasingCache(config?.casing);\n\t}\n\n\tescapeName(name: string): string {\n\t\treturn `\"${name}\"`;\n\t}\n\n\tescapeParam(_num: number): string {\n\t\treturn '?';\n\t}\n\n\tescapeString(str: string): string {\n\t\treturn `'${str.replace(/'/g, \"''\")}'`;\n\t}\n\n\tprivate buildWithCTE(queries: Subquery[] | undefined): SQL | undefined {\n\t\tif (!queries?.length) return undefined;\n\n\t\tconst withSqlChunks = [sql`with `];\n\t\tfor (const [i, w] of queries.entries()) {\n\t\t\twithSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);\n\t\t\tif (i < queries.length - 1) {\n\t\t\t\twithSqlChunks.push(sql`, `);\n\t\t\t}\n\t\t}\n\t\twithSqlChunks.push(sql` `);\n\t\treturn sql.join(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({ table, where, returning, withList, limit, orderBy }: SQLiteDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n\t}\n\n\tbuildUpdateSet(table: SQLiteTable, set: UpdateSet): SQL {\n\t\tconst tableColumns = table[Table.Symbol.Columns];\n\n\t\tconst columnNames = Object.keys(tableColumns).filter((colName) =>\n\t\t\tset[colName] !== undefined || tableColumns[colName]?.onUpdateFn !== undefined\n\t\t);\n\n\t\tconst setSize = columnNames.length;\n\t\treturn sql.join(columnNames.flatMap((colName, i) => {\n\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\tconst value = set[colName] ?? sql.param(col.onUpdateFn!(), col);\n\t\t\tconst res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;\n\n\t\t\tif (i < setSize - 1) {\n\t\t\t\treturn [res, sql.raw(', ')];\n\t\t\t}\n\t\t\treturn [res];\n\t\t}));\n\t}\n\n\tbuildUpdateQuery({ table, set, where, returning, withList, joins, from, limit, orderBy }: SQLiteUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst fromSql = from && sql.join([sql.raw(' from '), this.buildFromTable(from)]);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n\t}\n\n\t/**\n\t * Builds selection SQL with provided fields/expressions\n\t *\n\t * Examples:\n\t *\n\t * `select <selection> from`\n\t *\n\t * `insert ... returning <selection>`\n\t *\n\t * If `isSingleTable` is true, then columns won't be prefixed with table name\n\t */\n\tprivate buildSelection(\n\t\tfields: SelectedFieldsOrdered,\n\t\t{ isSingleTable = false }: { isSingleTable?: boolean } = {},\n\t): SQL {\n\t\tconst columnsLen = fields.length;\n\n\t\tconst chunks = fields\n\t\t\t.flatMap(({ field }, i) => {\n\t\t\t\tconst chunk: SQLChunk[] = [];\n\n\t\t\t\tif (is(field, SQL.Aliased) && field.isSelectionField) {\n\t\t\t\t\tchunk.push(sql.identifier(field.fieldAlias));\n\t\t\t\t} else if (is(field, SQL.Aliased) || is(field, SQL)) {\n\t\t\t\t\tconst query = is(field, SQL.Aliased) ? field.sql : field;\n\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tnew SQL(\n\t\t\t\t\t\t\t\tquery.queryChunks.map((c) => {\n\t\t\t\t\t\t\t\t\tif (is(c, Column)) {\n\t\t\t\t\t\t\t\t\t\treturn sql.identifier(this.casing.getColumnCasing(c));\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\treturn c;\n\t\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(query);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (is(field, SQL.Aliased)) {\n\t\t\t\t\t\tchunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t\t}\n\t\t\t\t} else if (is(field, Column)) {\n\t\t\t\t\tconst tableName = field.table[Table.Symbol.Name];\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(sql.identifier(this.casing.getColumnCasing(field)));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(sql`${sql.identifier(tableName)}.${sql.identifier(this.casing.getColumnCasing(field))}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (i < columnsLen - 1) {\n\t\t\t\t\tchunk.push(sql`, `);\n\t\t\t\t}\n\n\t\t\t\treturn chunk;\n\t\t\t});\n\n\t\treturn sql.join(chunks);\n\t}\n\n\tprivate buildJoins(joins: SQLiteSelectJoinConfig[] | undefined): SQL | undefined {\n\t\tif (!joins || joins.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst joinsArray: SQL[] = [];\n\n\t\tif (joins) {\n\t\t\tfor (const [index, joinMeta] of joins.entries()) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t\tconst table = joinMeta.table;\n\n\t\t\t\tif (is(table, SQLiteTable)) {\n\t\t\t\t\tconst tableName = table[SQLiteTable.Symbol.Name];\n\t\t\t\t\tconst tableSchema = table[SQLiteTable.Symbol.Schema];\n\t\t\t\t\tconst origTableName = table[SQLiteTable.Symbol.OriginalName];\n\t\t\t\t\tconst alias = tableName === origTableName ? undefined : joinMeta.alias;\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${\n\t\t\t\t\t\t\tsql.identifier(origTableName)\n\t\t\t\t\t\t}${alias && sql` ${sql.identifier(alias)}`} on ${joinMeta.on}`,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join ${table} on ${joinMeta.on}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tif (index < joins.length - 1) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sql.join(joinsArray);\n\t}\n\n\tprivate buildLimit(limit: number | Placeholder | undefined): SQL | undefined {\n\t\treturn typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\t}\n\n\tprivate buildOrderBy(orderBy: (SQLiteColumn | SQL | SQL.Aliased)[] | undefined): SQL | undefined {\n\t\tconst orderByList: (SQLiteColumn | SQL | SQL.Aliased)[] = [];\n\n\t\tif (orderBy) {\n\t\t\tfor (const [index, orderByValue] of orderBy.entries()) {\n\t\t\t\torderByList.push(orderByValue);\n\n\t\t\t\tif (index < orderBy.length - 1) {\n\t\t\t\t\torderByList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn orderByList.length > 0 ? sql` order by ${sql.join(orderByList)}` : undefined;\n\t}\n\n\tprivate buildFromTable(\n\t\ttable: SQL | Subquery | SQLiteViewBase | SQLiteTable | undefined,\n\t): SQL | Subquery | SQLiteViewBase | SQLiteTable | undefined {\n\t\tif (is(table, Table) && table[Table.Symbol.OriginalName] !== table[Table.Symbol.Name]) {\n\t\t\treturn sql`${sql.identifier(table[Table.Symbol.OriginalName])} ${sql.identifier(table[Table.Symbol.Name])}`;\n\t\t}\n\n\t\treturn table;\n\t}\n\n\tbuildSelectQuery(\n\t\t{\n\t\t\twithList,\n\t\t\tfields,\n\t\t\tfieldsFlat,\n\t\t\twhere,\n\t\t\thaving,\n\t\t\ttable,\n\t\t\tjoins,\n\t\t\torderBy,\n\t\t\tgroupBy,\n\t\t\tlimit,\n\t\t\toffset,\n\t\t\tdistinct,\n\t\t\tsetOperators,\n\t\t}: SQLiteSelectConfig,\n\t): SQL {\n\t\tconst fieldsList = fieldsFlat ?? orderSelectedFields<SQLiteColumn>(fields);\n\t\tfor (const f of fieldsList) {\n\t\t\tif (\n\t\t\t\tis(f.field, Column)\n\t\t\t\t&& getTableName(f.field.table)\n\t\t\t\t\t!== (is(table, Subquery)\n\t\t\t\t\t\t? table._.alias\n\t\t\t\t\t\t: is(table, SQLiteViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].name\n\t\t\t\t\t\t: is(table, SQL)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: getTableName(table))\n\t\t\t\t&& !((table) =>\n\t\t\t\t\tjoins?.some(({ alias }) =>\n\t\t\t\t\t\talias === (table[Table.Symbol.IsAlias] ? getTableName(table) : table[Table.Symbol.BaseName])\n\t\t\t\t\t))(f.field.table)\n\t\t\t) {\n\t\t\t\tconst tableName = getTableName(f.field.table);\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Your \"${\n\t\t\t\t\t\tf.path.join('->')\n\t\t\t\t\t}\" field references a column \"${tableName}\".\"${f.field.name}\", but the table \"${tableName}\" is not part of the query! Did you forget to join it?`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tconst isSingleTable = !joins || joins.length === 0;\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst distinctSql = distinct ? sql` distinct` : undefined;\n\n\t\tconst selection = this.buildSelection(fieldsList, { isSingleTable });\n\n\t\tconst tableSql = this.buildFromTable(table);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst havingSql = having ? sql` having ${having}` : undefined;\n\n\t\tconst groupByList: (SQL | AnyColumn | SQL.Aliased)[] = [];\n\t\tif (groupBy) {\n\t\t\tfor (const [index, groupByValue] of groupBy.entries()) {\n\t\t\t\tgroupByList.push(groupByValue);\n\n\t\t\t\tif (index < groupBy.length - 1) {\n\t\t\t\t\tgroupByList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst groupBySql = groupByList.length > 0 ? sql` group by ${sql.join(groupByList)}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\tconst finalQuery =\n\t\t\tsql`${withSql}select${distinctSql} ${selection} from ${tableSql}${joinsSql}${whereSql}${groupBySql}${havingSql}${orderBySql}${limitSql}${offsetSql}`;\n\n\t\tif (setOperators.length > 0) {\n\t\t\treturn this.buildSetOperations(finalQuery, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(leftSelect: SQL, setOperators: SQLiteSelectConfig['setOperators']): SQL {\n\t\tconst [setOperator, ...rest] = setOperators;\n\n\t\tif (!setOperator) {\n\t\t\tthrow new Error('Cannot pass undefined values to any set operator');\n\t\t}\n\n\t\tif (rest.length === 0) {\n\t\t\treturn this.buildSetOperationQuery({ leftSelect, setOperator });\n\t\t}\n\n\t\t// Some recursive magic here\n\t\treturn this.buildSetOperations(\n\t\t\tthis.buildSetOperationQuery({ leftSelect, setOperator }),\n\t\t\trest,\n\t\t);\n\t}\n\n\tbuildSetOperationQuery({\n\t\tleftSelect,\n\t\tsetOperator: { type, isAll, rightSelect, limit, orderBy, offset },\n\t}: { leftSelect: SQL; setOperator: SQLiteSelectConfig['setOperators'][number] }): SQL {\n\t\t// SQLite doesn't support parenthesis in set operations\n\t\tconst leftChunk = sql`${leftSelect.getSQL()} `;\n\t\tconst rightChunk = sql`${rightSelect.getSQL()}`;\n\n\t\tlet orderBySql;\n\t\tif (orderBy && orderBy.length > 0) {\n\t\t\tconst orderByValues: (SQL<unknown> | Name)[] = [];\n\n\t\t\t// The next bit is necessary because the sql operator replaces ${table.column} with `table`.`column`\n\t\t\t// which is invalid Sql syntax, Table from one of the SELECTs cannot be used in global ORDER clause\n\t\t\tfor (const singleOrderBy of orderBy) {\n\t\t\t\tif (is(singleOrderBy, SQLiteColumn)) {\n\t\t\t\t\torderByValues.push(sql.identifier(singleOrderBy.name));\n\t\t\t\t} else if (is(singleOrderBy, SQL)) {\n\t\t\t\t\tfor (let i = 0; i < singleOrderBy.queryChunks.length; i++) {\n\t\t\t\t\t\tconst chunk = singleOrderBy.queryChunks[i];\n\n\t\t\t\t\t\tif (is(chunk, SQLiteColumn)) {\n\t\t\t\t\t\t\tsingleOrderBy.queryChunks[i] = sql.identifier(this.casing.getColumnCasing(chunk));\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t} else {\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\torderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst operatorChunk = sql.raw(`${type} ${isAll ? 'all ' : ''}`);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\treturn sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;\n\t}\n\n\tbuildInsertQuery(\n\t\t{ table, values: valuesOrSelect, onConflict, returning, withList, select }: SQLiteInsertConfig,\n\t): SQL {\n\t\t// const isSingleValue = values.length === 1;\n\t\tconst valuesSqlList: ((SQLChunk | SQL)[] | SQL)[] = [];\n\t\tconst columns: Record<string, SQLiteColumn> = table[Table.Symbol.Columns];\n\n\t\tconst colEntries: [string, SQLiteColumn][] = Object.entries(columns).filter(([_, col]) =>\n\t\t\t!col.shouldDisableInsert()\n\t\t);\n\t\tconst insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));\n\n\t\tif (select) {\n\t\t\tconst select = valuesOrSelect as AnySQLiteSelectQueryBuilder | SQL;\n\n\t\t\tif (is(select, SQL)) {\n\t\t\t\tvaluesSqlList.push(select);\n\t\t\t} else {\n\t\t\t\tvaluesSqlList.push(select.getSQL());\n\t\t\t}\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, Param | SQL>[];\n\t\t\tvaluesSqlList.push(sql.raw('values '));\n\n\t\t\tfor (const [valueIndex, value] of values.entries()) {\n\t\t\t\tconst valueList: (SQLChunk | SQL)[] = [];\n\t\t\t\tfor (const [fieldName, col] of colEntries) {\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (colValue === undefined || (is(colValue, Param) && colValue.value === undefined)) {\n\t\t\t\t\t\tlet defaultValue;\n\t\t\t\t\t\tif (col.default !== null && col.default !== undefined) {\n\t\t\t\t\t\t\tdefaultValue = is(col.default, SQL) ? col.default : sql.param(col.default, col);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (col.defaultFn !== undefined) {\n\t\t\t\t\t\t\tconst defaultFnResult = col.defaultFn();\n\t\t\t\t\t\t\tdefaultValue = is(defaultFnResult, SQL) ? defaultFnResult : sql.param(defaultFnResult, col);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (!col.default && col.onUpdateFn !== undefined) {\n\t\t\t\t\t\t\tconst onUpdateFnResult = col.onUpdateFn();\n\t\t\t\t\t\t\tdefaultValue = is(onUpdateFnResult, SQL) ? onUpdateFnResult : sql.param(onUpdateFnResult, col);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdefaultValue = sql`null`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalueList.push(defaultValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalueList.push(colValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvaluesSqlList.push(valueList);\n\t\t\t\tif (valueIndex < values.length - 1) {\n\t\t\t\t\tvaluesSqlList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst valuesSql = sql.join(valuesSqlList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst onConflictSql = onConflict?.length\n\t\t\t? sql.join(onConflict)\n\t\t\t: undefined;\n\n\t\t// if (isSingleValue && valuesSqlList.length === 0){\n\t\t// \treturn sql`insert into ${table} default values ${onConflictSql}${returningSql}`;\n\t\t// }\n\n\t\treturn sql`${withSql}insert into ${table} ${insertOrder} ${valuesSql}${onConflictSql}${returningSql}`;\n\t}\n\n\tsqlToQuery(sql: SQL, invokeSource?: 'indexes' | undefined): QueryWithTypings {\n\t\treturn sql.toQuery({\n\t\t\tcasing: this.casing,\n\t\t\tescapeName: this.escapeName,\n\t\t\tescapeParam: this.escapeParam,\n\t\t\tescapeString: this.escapeString,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\n\tbuildRelationalQuery({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: SQLiteTable;\n\t\ttableConfig: TableRelationalConfig;\n\t\tqueryConfig: true | DBQueryConfig<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: Relation;\n\t\tjoinOn?: SQL;\n\t}): BuildRelationalQueryResult<SQLiteTable, SQLiteColumn> {\n\t\tlet selection: BuildRelationalQueryResult<SQLiteTable, SQLiteColumn>['selection'] = [];\n\t\tlet limit, offset, orderBy: SQLiteSelectConfig['orderBy'] = [], where;\n\t\tconst joins: SQLiteSelectJoinConfig[] = [];\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map((\n\t\t\t\t[key, value],\n\t\t\t) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as SQLiteColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map(([key, value]) => [key, aliasedTableColumn(value, tableAlias)]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: { tsKey: string; value: SQLiteColumn | SQL.Aliased }[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter((key) => !selectedColumns.includes(key));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as SQLiteColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | DBQueryConfig<'many', false>;\n\t\t\t\trelation: Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter((entry): entry is [typeof entry[0], NonNullable<typeof entry[1]>] => !!entry[1])\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({ tsKey, queryConfig, relation: tableConfig.relations[tsKey]! }));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased) ? value.fieldAlias : tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column) ? aliasedTableColumn(value, tableAlias) : value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, getOrderByOperators())\n\t\t\t\t: config.orderBy ?? [];\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as SQLiteColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = normalizeRelation(schema, tableNamesMap, relation);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\t// const relationTable = schema[relationTableTsName]!;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(normalizedRelation.references[i]!, relationTableAlias),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this.buildRelationalQuery({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as SQLiteTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, One)\n\t\t\t\t\t\t? (selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 })\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tconst field = (sql`(${builtRelation.sql})`).as(selectedRelationTsKey);\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage:\n\t\t\t\t\t`No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\"). You need to have at least one item in \"columns\", \"with\" or \"extras\". If you need to select all columns, omit the \"columns\" key or set it to undefined.`,\n\t\t\t});\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field }) =>\n\t\t\t\t\t\tis(field, SQLiteColumn)\n\t\t\t\t\t\t\t? sql.identifier(this.casing.getColumnCasing(field))\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, Many)) {\n\t\t\t\tfield = sql`coalesce(json_group_array(${field}), json_array())`;\n\t\t\t}\n\t\t\tconst nestedSelection = [{\n\t\t\t\tdbKey: 'data',\n\t\t\t\ttsKey: 'data',\n\t\t\t\tfield: field.as('data'),\n\t\t\t\tisJson: true,\n\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\tselection,\n\t\t\t}];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\torderBy,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = undefined;\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, SQLiteTable) ? result : new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column) ? aliasedTableColumn(field, tableAlias) : field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n}\n\nexport class SQLiteSyncDialect extends SQLiteDialect {\n\tstatic override readonly [entityKind]: string = 'SQLiteSyncDialect';\n\n\tmigrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: SQLiteSession<'sync', unknown, Record<string, unknown>, TablesRelationalConfig>,\n\t\tconfig?: string | MigrationConfig,\n\t): void {\n\t\tconst migrationsTable = config === undefined\n\t\t\t? '__drizzle_migrations'\n\t\t\t: typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric\n\t\t\t)\n\t\t`;\n\t\tsession.run(migrationTableCreate);\n\n\t\tconst dbMigrations = session.values<[number, string, string]>(\n\t\t\tsql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`,\n\t\t);\n\n\t\tconst lastDbMigration = dbMigrations[0] ?? undefined;\n\t\tsession.run(sql`BEGIN`);\n\n\t\ttry {\n\t\t\tfor (const migration of migrations) {\n\t\t\t\tif (!lastDbMigration || Number(lastDbMigration[2])! < migration.folderMillis) {\n\t\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\t\tsession.run(sql.raw(stmt));\n\t\t\t\t\t}\n\t\t\t\t\tsession.run(\n\t\t\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t\t} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsession.run(sql`COMMIT`);\n\t\t} catch (e) {\n\t\t\tsession.run(sql`ROLLBACK`);\n\t\t\tthrow e;\n\t\t}\n\t}\n}\n\nexport class SQLiteAsyncDialect extends SQLiteDialect {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncDialect';\n\n\tasync migrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: SQLiteSession<'async', any, any, any>,\n\t\tconfig?: string | MigrationConfig,\n\t): Promise<void> {\n\t\tconst migrationsTable = config === undefined\n\t\t\t? '__drizzle_migrations'\n\t\t\t: typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: config.migrationsTable ?? '__drizzle_migrations';\n\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid SERIAL PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric\n\t\t\t)\n\t\t`;\n\t\tawait session.run(migrationTableCreate);\n\n\t\tconst dbMigrations = await session.values<[number, string, string]>(\n\t\t\tsql`SELECT id, hash, created_at FROM ${sql.identifier(migrationsTable)} ORDER BY created_at DESC LIMIT 1`,\n\t\t);\n\n\t\tconst lastDbMigration = dbMigrations[0] ?? undefined;\n\n\t\tawait session.transaction(async (tx) => {\n\t\t\tfor (const migration of migrations) {\n\t\t\t\tif (!lastDbMigration || Number(lastDbMigration[2])! < migration.folderMillis) {\n\t\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\t\tawait tx.run(sql.raw(stmt));\n\t\t\t\t\t}\n\t\t\t\t\tawait tx.run(\n\t\t\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t\t} (\"hash\", \"created_at\") VALUES(${migration.hash}, ${migration.folderMillis})`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport type { SQL, SQLWrapper } from '~/sql/index.ts';\n\nexport abstract class TypedQueryBuilder<TSelection, TResult = unknown> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'TypedQueryBuilder';\n\n\tdeclare _: {\n\t\tselectedFields: TSelection;\n\t\tresult: TResult;\n\t};\n\n\t/** @internal */\n\tgetSelectedFields(): TSelection {\n\t\treturn this._.selectedFields;\n\t}\n\n\tabstract getSQL(): SQL;\n}\n","import { entityKind, is } from '~/entity.ts';\nimport { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type {\n\tBuildSubquerySelection,\n\tGetSelectTableName,\n\tGetSelectTableSelection,\n\tJoinNullability,\n\tJoinType,\n\tSelectMode,\n\tSelectResult,\n\tSetOperator,\n} from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { SQL, View } from '~/sql/sql.ts';\nimport type { ColumnsSelection, Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteColumn } from '~/sqlite-core/columns/index.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { SQLiteSession } from '~/sqlite-core/session.ts';\nimport type { SubqueryWithSelection } from '~/sqlite-core/subquery.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport {\n\tapplyMixins,\n\tgetTableColumns,\n\tgetTableLikeName,\n\thaveSameKeys,\n\torderSelectedFields,\n\ttype ValueOrArray,\n} from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { SQLiteViewBase } from '../view-base.ts';\nimport type {\n\tAnySQLiteSelect,\n\tCreateSQLiteSelectFromBuilderMode,\n\tGetSQLiteSetOperators,\n\tSelectedFields,\n\tSetOperatorRightSelect,\n\tSQLiteCreateSetOperatorFn,\n\tSQLiteSelectConfig,\n\tSQLiteSelectDynamic,\n\tSQLiteSelectExecute,\n\tSQLiteSelectHKT,\n\tSQLiteSelectHKTBase,\n\tSQLiteSelectJoinFn,\n\tSQLiteSelectPrepare,\n\tSQLiteSelectWithout,\n\tSQLiteSetOperatorExcludedMethods,\n\tSQLiteSetOperatorWithResult,\n} from './select.types.ts';\n\nexport class SQLiteSelectBuilder<\n\tTSelection extends SelectedFields | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTBuilderMode extends 'db' | 'qb' = 'db',\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteSelectBuilder';\n\n\tprivate fields: TSelection;\n\tprivate session: SQLiteSession<any, any, any, any> | undefined;\n\tprivate dialect: SQLiteDialect;\n\tprivate withList: Subquery[] | undefined;\n\tprivate distinct: boolean | undefined;\n\n\tconstructor(\n\t\tconfig: {\n\t\t\tfields: TSelection;\n\t\t\tsession: SQLiteSession<any, any, any, any> | undefined;\n\t\t\tdialect: SQLiteDialect;\n\t\t\twithList?: Subquery[];\n\t\t\tdistinct?: boolean;\n\t\t},\n\t) {\n\t\tthis.fields = config.fields;\n\t\tthis.session = config.session;\n\t\tthis.dialect = config.dialect;\n\t\tthis.withList = config.withList;\n\t\tthis.distinct = config.distinct;\n\t}\n\n\tfrom<TFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL>(\n\t\tsource: TFrom,\n\t): CreateSQLiteSelectFromBuilderMode<\n\t\tTBuilderMode,\n\t\tGetSelectTableName<TFrom>,\n\t\tTResultType,\n\t\tTRunResult,\n\t\tTSelection extends undefined ? GetSelectTableSelection<TFrom> : TSelection,\n\t\tTSelection extends undefined ? 'single' : 'partial'\n\t> {\n\t\tconst isPartialSelect = !!this.fields;\n\n\t\tlet fields: SelectedFields;\n\t\tif (this.fields) {\n\t\t\tfields = this.fields;\n\t\t} else if (is(source, Subquery)) {\n\t\t\t// This is required to use the proxy handler to get the correct field values from the subquery\n\t\t\tfields = Object.fromEntries(\n\t\t\t\tObject.keys(source._.selectedFields).map((\n\t\t\t\t\tkey,\n\t\t\t\t) => [key, source[key as unknown as keyof typeof source] as unknown as SelectedFields[string]]),\n\t\t\t);\n\t\t} else if (is(source, SQLiteViewBase)) {\n\t\t\tfields = source[ViewBaseConfig].selectedFields as SelectedFields;\n\t\t} else if (is(source, SQL)) {\n\t\t\tfields = {};\n\t\t} else {\n\t\t\tfields = getTableColumns<SQLiteTable>(source);\n\t\t}\n\n\t\treturn new SQLiteSelectBase({\n\t\t\ttable: source,\n\t\t\tfields,\n\t\t\tisPartialSelect,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\twithList: this.withList,\n\t\t\tdistinct: this.distinct,\n\t\t}) as any;\n\t}\n}\n\nexport abstract class SQLiteSelectQueryBuilderBase<\n\tTHKT extends SQLiteSelectHKTBase,\n\tTTableName extends string | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends TypedQueryBuilder<TSelectedFields, TResult> {\n\tstatic override readonly [entityKind]: string = 'SQLiteSelectQueryBuilder';\n\n\toverride readonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly hkt: THKT;\n\t\treadonly tableName: TTableName;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly selection: TSelection;\n\t\treadonly selectMode: TSelectMode;\n\t\treadonly nullabilityMap: TNullabilityMap;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TResult;\n\t\treadonly selectedFields: TSelectedFields;\n\t};\n\n\t/** @internal */\n\tconfig: SQLiteSelectConfig;\n\tprotected joinsNotNullableMap: Record<string, boolean>;\n\tprivate tableName: string | undefined;\n\tprivate isPartialSelect: boolean;\n\tprotected session: SQLiteSession<any, any, any, any> | undefined;\n\tprotected dialect: SQLiteDialect;\n\n\tconstructor(\n\t\t{ table, fields, isPartialSelect, session, dialect, withList, distinct }: {\n\t\t\ttable: SQLiteSelectConfig['table'];\n\t\t\tfields: SQLiteSelectConfig['fields'];\n\t\t\tisPartialSelect: boolean;\n\t\t\tsession: SQLiteSession<any, any, any, any> | undefined;\n\t\t\tdialect: SQLiteDialect;\n\t\t\twithList: Subquery[] | undefined;\n\t\t\tdistinct: boolean | undefined;\n\t\t},\n\t) {\n\t\tsuper();\n\t\tthis.config = {\n\t\t\twithList,\n\t\t\ttable,\n\t\t\tfields: { ...fields },\n\t\t\tdistinct,\n\t\t\tsetOperators: [],\n\t\t};\n\t\tthis.isPartialSelect = isPartialSelect;\n\t\tthis.session = session;\n\t\tthis.dialect = dialect;\n\t\tthis._ = {\n\t\t\tselectedFields: fields as TSelectedFields,\n\t\t} as this['_'];\n\t\tthis.tableName = getTableLikeName(table);\n\t\tthis.joinsNotNullableMap = typeof this.tableName === 'string' ? { [this.tableName]: true } : {};\n\t}\n\n\tprivate createJoin<TJoinType extends JoinType>(\n\t\tjoinType: TJoinType,\n\t): SQLiteSelectJoinFn<this, TDynamic, TJoinType> {\n\t\treturn (\n\t\t\ttable: SQLiteTable | Subquery | SQLiteViewBase | SQL,\n\t\t\ton: ((aliases: TSelection) => SQL | undefined) | SQL | undefined,\n\t\t) => {\n\t\t\tconst baseTableName = this.tableName;\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins?.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\tif (!this.isPartialSelect) {\n\t\t\t\t// If this is the first join and this is not a partial select and we're not selecting from raw SQL, \"move\" the fields from the main table to the nested object\n\t\t\t\tif (Object.keys(this.joinsNotNullableMap).length === 1 && typeof baseTableName === 'string') {\n\t\t\t\t\tthis.config.fields = {\n\t\t\t\t\t\t[baseTableName]: this.config.fields,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tif (typeof tableName === 'string' && !is(table, SQL)) {\n\t\t\t\t\tconst selection = is(table, Subquery)\n\t\t\t\t\t\t? table._.selectedFields\n\t\t\t\t\t\t: is(table, View)\n\t\t\t\t\t\t? table[ViewBaseConfig].selectedFields\n\t\t\t\t\t\t: table[Table.Symbol.Columns];\n\t\t\t\t\tthis.config.fields[tableName] = selection;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.fields,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as TSelection,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (!this.config.joins) {\n\t\t\t\tthis.config.joins = [];\n\t\t\t}\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName });\n\n\t\t\tif (typeof tableName === 'string') {\n\t\t\t\tswitch (joinType) {\n\t\t\t\t\tcase 'left': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'right': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'inner': {\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'full': {\n\t\t\t\t\t\tthis.joinsNotNullableMap = Object.fromEntries(\n\t\t\t\t\t\t\tObject.entries(this.joinsNotNullableMap).map(([key]) => [key, false]),\n\t\t\t\t\t\t);\n\t\t\t\t\t\tthis.joinsNotNullableMap[tableName] = false;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn this as any;\n\t\t};\n\t}\n\n\t/**\n\t * Executes a `left join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the table with the corresponding row from the joined table, if a match is found. If no matching row exists, it sets all columns of the joined table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#left-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet | null }[] = await db.select()\n\t * .from(users)\n\t * .leftJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number | null }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .leftJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tleftJoin = this.createJoin('left');\n\n\t/**\n\t * Executes a `right join` operation by adding another table to the current query.\n\t *\n\t * Calling this method associates each row of the joined table with the corresponding row from the main table, if a match is found. If no matching row exists, it sets all columns of the main table to null.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#right-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet }[] = await db.select()\n\t * .from(users)\n\t * .rightJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .rightJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\trightJoin = this.createJoin('right');\n\n\t/**\n\t * Executes an `inner join` operation, creating a new table by combining rows from two tables that have matching values.\n\t *\n\t * Calling this method retrieves rows that have corresponding entries in both joined tables. Rows without matching entries in either table are excluded, resulting in a table that includes only matching pairs.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#inner-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User; pets: Pet }[] = await db.select()\n\t * .from(users)\n\t * .innerJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number; petId: number }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .innerJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tinnerJoin = this.createJoin('inner');\n\n\t/**\n\t * Executes a `full join` operation by combining rows from two tables into a new table.\n\t *\n\t * Calling this method retrieves all rows from both main and joined tables, merging rows with matching values and filling in `null` for non-matching columns.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#full-join}\n\t *\n\t * @param table the table to join.\n\t * @param on the `on` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users and their pets\n\t * const usersWithPets: { user: User | null; pets: Pet | null }[] = await db.select()\n\t * .from(users)\n\t * .fullJoin(pets, eq(users.id, pets.ownerId))\n\t *\n\t * // Select userId and petId\n\t * const usersIdsAndPetIds: { userId: number | null; petId: number | null }[] = await db.select({\n\t * userId: users.id,\n\t * petId: pets.id,\n\t * })\n\t * .from(users)\n\t * .fullJoin(pets, eq(users.id, pets.ownerId))\n\t * ```\n\t */\n\tfullJoin = this.createJoin('full');\n\n\tprivate createSetOperator(\n\t\ttype: SetOperator,\n\t\tisAll: boolean,\n\t): <TValue extends SQLiteSetOperatorWithResult<TResult>>(\n\t\trightSelection:\n\t\t\t| ((setOperators: GetSQLiteSetOperators) => SetOperatorRightSelect<TValue, TResult>)\n\t\t\t| SetOperatorRightSelect<TValue, TResult>,\n\t) => SQLiteSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tSQLiteSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\treturn (rightSelection) => {\n\t\t\tconst rightSelect = (typeof rightSelection === 'function'\n\t\t\t\t? rightSelection(getSQLiteSetOperators())\n\t\t\t\t: rightSelection) as TypedQueryBuilder<\n\t\t\t\t\tany,\n\t\t\t\t\tTResult\n\t\t\t\t>;\n\n\t\t\tif (!haveSameKeys(this.getSelectedFields(), rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.setOperators.push({ type, isAll, rightSelect });\n\t\t\treturn this as any;\n\t\t};\n\t}\n\n\t/**\n\t * Adds `union` set operator to the query.\n\t *\n\t * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all unique names from customers and users tables\n\t * await db.select({ name: users.name })\n\t * .from(users)\n\t * .union(\n\t * db.select({ name: customers.name }).from(customers)\n\t * );\n\t * // or\n\t * import { union } from 'drizzle-orm/sqlite-core'\n\t *\n\t * await union(\n\t * db.select({ name: users.name }).from(users),\n\t * db.select({ name: customers.name }).from(customers)\n\t * );\n\t * ```\n\t */\n\tunion = this.createSetOperator('union', false);\n\n\t/**\n\t * Adds `union all` set operator to the query.\n\t *\n\t * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all transaction ids from both online and in-store sales\n\t * await db.select({ transaction: onlineSales.transactionId })\n\t * .from(onlineSales)\n\t * .unionAll(\n\t * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t * );\n\t * // or\n\t * import { unionAll } from 'drizzle-orm/sqlite-core'\n\t *\n\t * await unionAll(\n\t * db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n\t * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n\t * );\n\t * ```\n\t */\n\tunionAll = this.createSetOperator('union', true);\n\n\t/**\n\t * Adds `intersect` set operator to the query.\n\t *\n\t * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select course names that are offered in both departments A and B\n\t * await db.select({ courseName: depA.courseName })\n\t * .from(depA)\n\t * .intersect(\n\t * db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * // or\n\t * import { intersect } from 'drizzle-orm/sqlite-core'\n\t *\n\t * await intersect(\n\t * db.select({ courseName: depA.courseName }).from(depA),\n\t * db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\tintersect = this.createSetOperator('intersect', false);\n\n\t/**\n\t * Adds `except` set operator to the query.\n\t *\n\t * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all courses offered in department A but not in department B\n\t * await db.select({ courseName: depA.courseName })\n\t * .from(depA)\n\t * .except(\n\t * db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * // or\n\t * import { except } from 'drizzle-orm/sqlite-core'\n\t *\n\t * await except(\n\t * db.select({ courseName: depA.courseName }).from(depA),\n\t * db.select({ courseName: depB.courseName }).from(depB)\n\t * );\n\t * ```\n\t */\n\texcept = this.createSetOperator('except', false);\n\n\t/** @internal */\n\taddSetOperators(setOperators: SQLiteSelectConfig['setOperators']): SQLiteSelectWithout<\n\t\tthis,\n\t\tTDynamic,\n\t\tSQLiteSetOperatorExcludedMethods,\n\t\ttrue\n\t> {\n\t\tthis.config.setOperators.push(...setOperators);\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `where` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#filtering}\n\t *\n\t * @param where the `where` clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be selected.\n\t *\n\t * ```ts\n\t * // Select all cars with green color\n\t * await db.select().from(cars).where(eq(cars.color, 'green'));\n\t * // or\n\t * await db.select().from(cars).where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Select all BMW cars with a green color\n\t * await db.select().from(cars).where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Select all cars with the green or blue color\n\t * await db.select().from(cars).where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(\n\t\twhere: ((aliases: TSelection) => SQL | undefined) | SQL | undefined,\n\t): SQLiteSelectWithout<this, TDynamic, 'where'> {\n\t\tif (typeof where === 'function') {\n\t\t\twhere = where(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `having` clause to the query.\n\t *\n\t * Calling this method will select only those rows that fulfill a specified condition. It is typically used with aggregate functions to filter the aggregated data based on a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @param having the `having` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all brands with more than one car\n\t * await db.select({\n\t * \tbrand: cars.brand,\n\t * \tcount: sql<number>`cast(count(${cars.id}) as int)`,\n\t * })\n\t * .from(cars)\n\t * .groupBy(cars.brand)\n\t * .having(({ count }) => gt(count, 1));\n\t * ```\n\t */\n\thaving(\n\t\thaving: ((aliases: this['_']['selection']) => SQL | undefined) | SQL | undefined,\n\t): SQLiteSelectWithout<this, TDynamic, 'having'> {\n\t\tif (typeof having === 'function') {\n\t\t\thaving = having(\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t}\n\t\tthis.config.having = having;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `group by` clause to the query.\n\t *\n\t * Calling this method will group rows that have the same values into summary rows, often used for aggregation purposes.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#aggregations}\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Group and count people by their last names\n\t * await db.select({\n\t * lastName: people.lastName,\n\t * count: sql<number>`cast(count(*) as int)`\n\t * })\n\t * .from(people)\n\t * .groupBy(people.lastName);\n\t * ```\n\t */\n\tgroupBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(...columns: (SQLiteColumn | SQL)[]): SQLiteSelectWithout<this, TDynamic, 'groupBy'>;\n\tgroupBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteSelectWithout<this, TDynamic, 'groupBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst groupBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\t\t\tthis.config.groupBy = Array.isArray(groupBy) ? groupBy : [groupBy];\n\t\t} else {\n\t\t\tthis.config.groupBy = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `order by` clause to the query.\n\t *\n\t * Calling this method will sort the result-set in ascending or descending order. By default, the sort order is ascending.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#order-by}\n\t *\n\t * @example\n\t *\n\t * ```\n\t * // Select cars ordered by year\n\t * await db.select().from(cars).orderBy(cars.year);\n\t * ```\n\t *\n\t * You can specify whether results are in ascending or descending order with the `asc()` and `desc()` operators.\n\t *\n\t * ```ts\n\t * // Select cars ordered by year in descending order\n\t * await db.select().from(cars).orderBy(desc(cars.year));\n\t *\n\t * // Select cars ordered by year and price\n\t * await db.select().from(cars).orderBy(asc(cars.year), desc(cars.price));\n\t * ```\n\t */\n\torderBy(\n\t\tbuilder: (aliases: this['_']['selection']) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (SQLiteColumn | SQL)[]): SQLiteSelectWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(aliases: this['_']['selection']) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteSelectWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.fields,\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as TSelection,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t} else {\n\t\t\tconst orderByArray = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\n\t\t\tif (this.config.setOperators.length > 0) {\n\t\t\t\tthis.config.setOperators.at(-1)!.orderBy = orderByArray;\n\t\t\t} else {\n\t\t\t\tthis.config.orderBy = orderByArray;\n\t\t\t}\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `limit` clause to the query.\n\t *\n\t * Calling this method will set the maximum number of rows that will be returned by this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param limit the `limit` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the first 10 people from this query.\n\t * await db.select().from(people).limit(10);\n\t * ```\n\t */\n\tlimit(limit: number | Placeholder): SQLiteSelectWithout<this, TDynamic, 'limit'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.limit = limit;\n\t\t} else {\n\t\t\tthis.config.limit = limit;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `offset` clause to the query.\n\t *\n\t * Calling this method will skip a number of rows when returning results from this query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#limit--offset}\n\t *\n\t * @param offset the `offset` clause.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Get the 10th-20th people from this query.\n\t * await db.select().from(people).offset(10).limit(10);\n\t * ```\n\t */\n\toffset(offset: number | Placeholder): SQLiteSelectWithout<this, TDynamic, 'offset'> {\n\t\tif (this.config.setOperators.length > 0) {\n\t\t\tthis.config.setOperators.at(-1)!.offset = offset;\n\t\t} else {\n\t\t\tthis.config.offset = offset;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildSelectQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\tas<TAlias extends string>(\n\t\talias: TAlias,\n\t): SubqueryWithSelection<this['_']['selectedFields'], TAlias> {\n\t\treturn new Proxy(\n\t\t\tnew Subquery(this.getSQL(), this.config.fields, alias),\n\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as SubqueryWithSelection<this['_']['selectedFields'], TAlias>;\n\t}\n\n\t/** @internal */\n\toverride getSelectedFields(): this['_']['selectedFields'] {\n\t\treturn new Proxy(\n\t\t\tthis.config.fields,\n\t\t\tnew SelectionProxyHandler({ alias: this.tableName, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t) as this['_']['selectedFields'];\n\t}\n\n\t$dynamic(): SQLiteSelectDynamic<this> {\n\t\treturn this;\n\t}\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-interface\nexport interface SQLiteSelectBase<\n\tTTableName extends string | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTSelection extends ColumnsSelection,\n\tTSelectMode extends SelectMode = 'single',\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends\n\tSQLiteSelectQueryBuilderBase<\n\t\tSQLiteSelectHKT,\n\t\tTTableName,\n\t\tTResultType,\n\t\tTRunResult,\n\t\tTSelection,\n\t\tTSelectMode,\n\t\tTNullabilityMap,\n\t\tTDynamic,\n\t\tTExcludedMethods,\n\t\tTResult,\n\t\tTSelectedFields\n\t>,\n\tQueryPromise<TResult>\n{}\n\nexport class SQLiteSelectBase<\n\tTTableName extends string | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTSelection,\n\tTSelectMode extends SelectMode = 'single',\n\tTNullabilityMap extends Record<string, JoinNullability> = TTableName extends string ? Record<TTableName, 'not-null'>\n\t\t: {},\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n\tTResult = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends SQLiteSelectQueryBuilderBase<\n\tSQLiteSelectHKT,\n\tTTableName,\n\tTResultType,\n\tTRunResult,\n\tTSelection,\n\tTSelectMode,\n\tTNullabilityMap,\n\tTDynamic,\n\tTExcludedMethods,\n\tTResult,\n\tTSelectedFields\n> implements RunnableQuery<TResult, 'sqlite'>, SQLWrapper {\n\tstatic override readonly [entityKind]: string = 'SQLiteSelect';\n\n\t/** @internal */\n\t_prepare(isOneTimeQuery = true): SQLiteSelectPrepare<this> {\n\t\tif (!this.session) {\n\t\t\tthrow new Error('Cannot execute a query on a query builder. Please use a database instance instead.');\n\t\t}\n\t\tconst fieldsList = orderSelectedFields<SQLiteColumn>(this.config.fields);\n\t\tconst query = this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tfieldsList,\n\t\t\t'all',\n\t\t\ttrue,\n\t\t);\n\t\tquery.joinsNotNullableMap = this.joinsNotNullableMap;\n\t\treturn query as ReturnType<this['prepare']>;\n\t}\n\n\tprepare(): SQLiteSelectPrepare<this> {\n\t\treturn this._prepare(false);\n\t}\n\n\trun: ReturnType<this['prepare']>['run'] = (placeholderValues) => {\n\t\treturn this._prepare().run(placeholderValues);\n\t};\n\n\tall: ReturnType<this['prepare']>['all'] = (placeholderValues) => {\n\t\treturn this._prepare().all(placeholderValues);\n\t};\n\n\tget: ReturnType<this['prepare']>['get'] = (placeholderValues) => {\n\t\treturn this._prepare().get(placeholderValues);\n\t};\n\n\tvalues: ReturnType<this['prepare']>['values'] = (placeholderValues) => {\n\t\treturn this._prepare().values(placeholderValues);\n\t};\n\n\tasync execute(): Promise<SQLiteSelectExecute<this>> {\n\t\treturn this.all() as SQLiteSelectExecute<this>;\n\t}\n}\n\napplyMixins(SQLiteSelectBase, [QueryPromise]);\n\nfunction createSetOperator(type: SetOperator, isAll: boolean): SQLiteCreateSetOperatorFn {\n\treturn (leftSelect, rightSelect, ...restSelects) => {\n\t\tconst setOperators = [rightSelect, ...restSelects].map((select) => ({\n\t\t\ttype,\n\t\t\tisAll,\n\t\t\trightSelect: select as AnySQLiteSelect,\n\t\t}));\n\n\t\tfor (const setOperator of setOperators) {\n\t\t\tif (!haveSameKeys((leftSelect as any).getSelectedFields(), setOperator.rightSelect.getSelectedFields())) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t'Set operator error (union / intersect / except): selected fields are not the same or are in a different order',\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\treturn (leftSelect as AnySQLiteSelect).addSetOperators(setOperators) as any;\n\t};\n}\n\nconst getSQLiteSetOperators = () => ({\n\tunion,\n\tunionAll,\n\tintersect,\n\texcept,\n});\n\n/**\n * Adds `union` set operator to the query.\n *\n * Calling this method will combine the result sets of the `select` statements and remove any duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union}\n *\n * @example\n *\n * ```ts\n * // Select all unique names from customers and users tables\n * import { union } from 'drizzle-orm/sqlite-core'\n *\n * await union(\n * db.select({ name: users.name }).from(users),\n * db.select({ name: customers.name }).from(customers)\n * );\n * // or\n * await db.select({ name: users.name })\n * .from(users)\n * .union(\n * db.select({ name: customers.name }).from(customers)\n * );\n * ```\n */\nexport const union = createSetOperator('union', false);\n\n/**\n * Adds `union all` set operator to the query.\n *\n * Calling this method will combine the result-set of the `select` statements and keep all duplicate rows that appear across them.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#union-all}\n *\n * @example\n *\n * ```ts\n * // Select all transaction ids from both online and in-store sales\n * import { unionAll } from 'drizzle-orm/sqlite-core'\n *\n * await unionAll(\n * db.select({ transaction: onlineSales.transactionId }).from(onlineSales),\n * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n * );\n * // or\n * await db.select({ transaction: onlineSales.transactionId })\n * .from(onlineSales)\n * .unionAll(\n * db.select({ transaction: inStoreSales.transactionId }).from(inStoreSales)\n * );\n * ```\n */\nexport const unionAll = createSetOperator('union', true);\n\n/**\n * Adds `intersect` set operator to the query.\n *\n * Calling this method will retain only the rows that are present in both result sets and eliminate duplicates.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#intersect}\n *\n * @example\n *\n * ```ts\n * // Select course names that are offered in both departments A and B\n * import { intersect } from 'drizzle-orm/sqlite-core'\n *\n * await intersect(\n * db.select({ courseName: depA.courseName }).from(depA),\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n * .from(depA)\n * .intersect(\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * ```\n */\nexport const intersect = createSetOperator('intersect', false);\n\n/**\n * Adds `except` set operator to the query.\n *\n * Calling this method will retrieve all unique rows from the left query, except for the rows that are present in the result set of the right query.\n *\n * See docs: {@link https://orm.drizzle.team/docs/set-operations#except}\n *\n * @example\n *\n * ```ts\n * // Select all courses offered in department A but not in department B\n * import { except } from 'drizzle-orm/sqlite-core'\n *\n * await except(\n * db.select({ courseName: depA.courseName }).from(depA),\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * // or\n * await db.select({ courseName: depA.courseName })\n * .from(depA)\n * .except(\n * db.select({ courseName: depB.courseName }).from(depB)\n * );\n * ```\n */\nexport const except = createSetOperator('except', false);\n","import { entityKind, is } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { ColumnsSelection, SQL } from '~/sql/sql.ts';\nimport type { SQLiteDialectConfig } from '~/sqlite-core/dialect.ts';\nimport { SQLiteDialect, SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport type { WithBuilder } from '~/sqlite-core/subquery.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport { SQLiteSelectBuilder } from './select.ts';\nimport type { SelectedFields } from './select.types.ts';\n\nexport class QueryBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteQueryBuilder';\n\n\tprivate dialect: SQLiteDialect | undefined;\n\tprivate dialectConfig: SQLiteDialectConfig | undefined;\n\n\tconstructor(dialect?: SQLiteDialect | SQLiteDialectConfig) {\n\t\tthis.dialect = is(dialect, SQLiteDialect) ? dialect : undefined;\n\t\tthis.dialectConfig = is(dialect, SQLiteDialect) ? undefined : dialect;\n\t}\n\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst queryBuilder = this;\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(queryBuilder);\n\t\t\t}\n\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tqb.getSQL(),\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t) as any;\n\t\t};\n\t\treturn { as };\n\t};\n\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\tfunction select(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection | undefined, 'sync', void, 'qb'> {\n\t\t\treturn new SQLiteSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\tfunction selectDistinct(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection | undefined, 'sync', void, 'qb'> {\n\t\t\treturn new SQLiteSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: undefined,\n\t\t\t\tdialect: self.getDialect(),\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\treturn { select, selectDistinct };\n\t}\n\n\tselect(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields?: TSelection,\n\t): SQLiteSelectBuilder<TSelection | undefined, 'sync', void, 'qb'> {\n\t\treturn new SQLiteSelectBuilder({ fields: fields ?? undefined, session: undefined, dialect: this.getDialect() });\n\t}\n\n\tselectDistinct(): SQLiteSelectBuilder<undefined, 'sync', void, 'qb'>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, 'sync', void, 'qb'>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields?: TSelection,\n\t): SQLiteSelectBuilder<TSelection | undefined, 'sync', void, 'qb'> {\n\t\treturn new SQLiteSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: undefined,\n\t\t\tdialect: this.getDialect(),\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\t// Lazy load dialect to avoid circular dependency\n\tprivate getDialect() {\n\t\tif (!this.dialect) {\n\t\t\tthis.dialect = new SQLiteSyncDialect(this.dialectConfig);\n\t\t}\n\n\t\treturn this.dialect;\n\t}\n}\n","import { entityKind, is } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport { Param, SQL, sql } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { IndexColumn } from '~/sqlite-core/indexes.ts';\nimport type { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { Columns, Table } from '~/table.ts';\nimport { type DrizzleTypeError, haveSameKeys, mapUpdateSet, orderSelectedFields, type Simplify } from '~/utils.ts';\nimport type { AnySQLiteColumn, SQLiteColumn } from '../columns/common.ts';\nimport { QueryBuilder } from './query-builder.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts';\nimport type { SQLiteUpdateSetSource } from './update.ts';\n\nexport interface SQLiteInsertConfig<TTable extends SQLiteTable = SQLiteTable> {\n\ttable: TTable;\n\tvalues: Record<string, Param | SQL>[] | SQLiteInsertSelectQueryBuilder<TTable> | SQL;\n\twithList?: Subquery[];\n\tonConflict?: SQL[];\n\treturning?: SelectedFieldsOrdered;\n\tselect?: boolean;\n}\n\nexport type SQLiteInsertValue<TTable extends SQLiteTable> = Simplify<\n\t{\n\t\t[Key in keyof TTable['$inferInsert']]: TTable['$inferInsert'][Key] | SQL | Placeholder;\n\t}\n>;\n\nexport type SQLiteInsertSelectQueryBuilder<TTable extends SQLiteTable> = TypedQueryBuilder<\n\t{ [K in keyof TTable['$inferInsert']]: AnySQLiteColumn | SQL | SQL.Aliased | TTable['$inferInsert'][K] }\n>;\n\nexport class SQLiteInsertBuilder<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteInsertBuilder';\n\n\tconstructor(\n\t\tprotected table: TTable,\n\t\tprotected session: SQLiteSession<any, any, any, any>,\n\t\tprotected dialect: SQLiteDialect,\n\t\tprivate withList?: Subquery[],\n\t) {}\n\n\tvalues(value: SQLiteInsertValue<TTable>): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tvalues(values: SQLiteInsertValue<TTable>[]): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tvalues(\n\t\tvalues: SQLiteInsertValue<TTable> | SQLiteInsertValue<TTable>[],\n\t): SQLiteInsertBase<TTable, TResultType, TRunResult> {\n\t\tvalues = Array.isArray(values) ? values : [values];\n\t\tif (values.length === 0) {\n\t\t\tthrow new Error('values() must be called with at least one value');\n\t\t}\n\t\tconst mappedValues = values.map((entry) => {\n\t\t\tconst result: Record<string, Param | SQL> = {};\n\t\t\tconst cols = this.table[Table.Symbol.Columns];\n\t\t\tfor (const colKey of Object.keys(entry)) {\n\t\t\t\tconst colValue = entry[colKey as keyof typeof entry];\n\t\t\t\tresult[colKey] = is(colValue, SQL) ? colValue : new Param(colValue, cols[colKey]);\n\t\t\t}\n\t\t\treturn result;\n\t\t});\n\n\t\t// if (mappedValues.length > 1 && mappedValues.some((t) => Object.keys(t).length === 0)) {\n\t\t// \tthrow new Error(\n\t\t// \t\t`One of the values you want to insert is empty. In SQLite you can insert only one empty object per statement. For this case Drizzle with use \"INSERT INTO ... DEFAULT VALUES\" syntax`,\n\t\t// \t);\n\t\t// }\n\n\t\treturn new SQLiteInsertBase(this.table, mappedValues, this.session, this.dialect, this.withList);\n\t}\n\n\tselect(\n\t\tselectQuery: (qb: QueryBuilder) => SQLiteInsertSelectQueryBuilder<TTable>,\n\t): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tselect(selectQuery: (qb: QueryBuilder) => SQL): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tselect(selectQuery: SQL): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tselect(selectQuery: SQLiteInsertSelectQueryBuilder<TTable>): SQLiteInsertBase<TTable, TResultType, TRunResult>;\n\tselect(\n\t\tselectQuery:\n\t\t\t| SQL\n\t\t\t| SQLiteInsertSelectQueryBuilder<TTable>\n\t\t\t| ((qb: QueryBuilder) => SQLiteInsertSelectQueryBuilder<TTable> | SQL),\n\t): SQLiteInsertBase<TTable, TResultType, TRunResult> {\n\t\tconst select = typeof selectQuery === 'function' ? selectQuery(new QueryBuilder()) : selectQuery;\n\n\t\tif (\n\t\t\t!is(select, SQL)\n\t\t\t&& !haveSameKeys(this.table[Columns], select._.selectedFields)\n\t\t) {\n\t\t\tthrow new Error(\n\t\t\t\t'Insert select error: selected fields are not the same or are in a different order compared to the table definition',\n\t\t\t);\n\t\t}\n\n\t\treturn new SQLiteInsertBase(this.table, select, this.session, this.dialect, this.withList, true);\n\t}\n}\n\nexport type SQLiteInsertWithout<T extends AnySQLiteInsert, TDynamic extends boolean, K extends keyof T & string> =\n\tTDynamic extends true ? T\n\t\t: Omit<\n\t\t\tSQLiteInsertBase<\n\t\t\t\tT['_']['table'],\n\t\t\t\tT['_']['resultType'],\n\t\t\t\tT['_']['runResult'],\n\t\t\t\tT['_']['returning'],\n\t\t\t\tTDynamic,\n\t\t\t\tT['_']['excludedMethods'] | K\n\t\t\t>,\n\t\t\tT['_']['excludedMethods'] | K\n\t\t>;\n\nexport type SQLiteInsertReturning<\n\tT extends AnySQLiteInsert,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFieldsFlat,\n> = SQLiteInsertWithout<\n\tSQLiteInsertBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tSelectResultFields<TSelectedFields>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteInsertReturningAll<\n\tT extends AnySQLiteInsert,\n\tTDynamic extends boolean,\n> = SQLiteInsertWithout<\n\tSQLiteInsertBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteInsertOnConflictDoUpdateConfig<T extends AnySQLiteInsert> = {\n\ttarget: IndexColumn | IndexColumn[];\n\t/** @deprecated - use either `targetWhere` or `setWhere` */\n\twhere?: SQL;\n\t// TODO: add tests for targetWhere and setWhere\n\ttargetWhere?: SQL;\n\tsetWhere?: SQL;\n\tset: SQLiteUpdateSetSource<T['_']['table']>;\n};\n\nexport type SQLiteInsertDynamic<T extends AnySQLiteInsert> = SQLiteInsert<\n\tT['_']['table'],\n\tT['_']['resultType'],\n\tT['_']['runResult'],\n\tT['_']['returning']\n>;\n\nexport type SQLiteInsertExecute<T extends AnySQLiteInsert> = T['_']['returning'] extends undefined ? T['_']['runResult']\n\t: T['_']['returning'][];\n\nexport type SQLiteInsertPrepare<T extends AnySQLiteInsert> = SQLitePreparedQuery<\n\t{\n\t\ttype: T['_']['resultType'];\n\t\trun: T['_']['runResult'];\n\t\tall: T['_']['returning'] extends undefined ? DrizzleTypeError<'.all() cannot be used without .returning()'>\n\t\t\t: T['_']['returning'][];\n\t\tget: T['_']['returning'] extends undefined ? DrizzleTypeError<'.get() cannot be used without .returning()'>\n\t\t\t: T['_']['returning'];\n\t\tvalues: T['_']['returning'] extends undefined ? DrizzleTypeError<'.values() cannot be used without .returning()'>\n\t\t\t: any[][];\n\t\texecute: SQLiteInsertExecute<T>;\n\t}\n>;\n\nexport type AnySQLiteInsert = SQLiteInsertBase<any, any, any, any, any, any>;\n\nexport type SQLiteInsert<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTReturning = any,\n> = SQLiteInsertBase<TTable, TResultType, TRunResult, TReturning, true, never>;\n\nexport interface SQLiteInsertBase<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends\n\tSQLWrapper,\n\tQueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>,\n\tRunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>\n{\n\treadonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly table: TTable;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? TRunResult : TReturning[];\n\t};\n}\n\nexport class SQLiteInsertBase<\n\tTTable extends SQLiteTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>\n\timplements RunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteInsert';\n\n\t/** @internal */\n\tconfig: SQLiteInsertConfig<TTable>;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tvalues: SQLiteInsertConfig['values'],\n\t\tprivate session: SQLiteSession<any, any, any, any>,\n\t\tprivate dialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t\tselect?: boolean,\n\t) {\n\t\tsuper();\n\t\tthis.config = { table, values: values as any, withList, select };\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the inserted rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#insert-returning}\n\t *\n\t * @example\n\t * ```ts\n\t * // Insert one row and return all fields\n\t * const insertedCar: Car[] = await db.insert(cars)\n\t * .values({ brand: 'BMW' })\n\t * .returning();\n\t *\n\t * // Insert one row and return only the id\n\t * const insertedCarId: { id: number }[] = await db.insert(cars)\n\t * .values({ brand: 'BMW' })\n\t * .returning({ id: cars.id });\n\t * ```\n\t */\n\treturning(): SQLiteInsertReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFieldsFlat>(\n\t\tfields: TSelectedFields,\n\t): SQLiteInsertReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields: SelectedFieldsFlat = this.config.table[SQLiteTable.Symbol.Columns],\n\t): SQLiteInsertWithout<AnySQLiteInsert, TDynamic, 'returning'> {\n\t\tthis.config.returning = orderSelectedFields<SQLiteColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds an `on conflict do nothing` clause to the query.\n\t *\n\t * Calling this method simply avoids inserting a row as its alternative action.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#on-conflict-do-nothing}\n\t *\n\t * @param config The `target` and `where` clauses.\n\t *\n\t * @example\n\t * ```ts\n\t * // Insert one row and cancel the insert if there's a conflict\n\t * await db.insert(cars)\n\t * .values({ id: 1, brand: 'BMW' })\n\t * .onConflictDoNothing();\n\t *\n\t * // Explicitly specify conflict target\n\t * await db.insert(cars)\n\t * .values({ id: 1, brand: 'BMW' })\n\t * .onConflictDoNothing({ target: cars.id });\n\t * ```\n\t */\n\tonConflictDoNothing(config: { target?: IndexColumn | IndexColumn[]; where?: SQL } = {}): this {\n\t\tif (!this.config.onConflict) this.config.onConflict = [];\n\n\t\tif (config.target === undefined) {\n\t\t\tthis.config.onConflict.push(sql` on conflict do nothing`);\n\t\t} else {\n\t\t\tconst targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;\n\t\t\tconst whereSql = config.where ? sql` where ${config.where}` : sql``;\n\t\t\tthis.config.onConflict.push(sql` on conflict ${targetSql} do nothing${whereSql}`);\n\t\t}\n\t\treturn this;\n\t}\n\n\t/**\n\t * Adds an `on conflict do update` clause to the query.\n\t *\n\t * Calling this method will update the existing row that conflicts with the row proposed for insertion as its alternative action.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert#upserts-and-conflicts}\n\t *\n\t * @param config The `target`, `set` and `where` clauses.\n\t *\n\t * @example\n\t * ```ts\n\t * // Update the row if there's a conflict\n\t * await db.insert(cars)\n\t * .values({ id: 1, brand: 'BMW' })\n\t * .onConflictDoUpdate({\n\t * target: cars.id,\n\t * set: { brand: 'Porsche' }\n\t * });\n\t *\n\t * // Upsert with 'where' clause\n\t * await db.insert(cars)\n\t * .values({ id: 1, brand: 'BMW' })\n\t * .onConflictDoUpdate({\n\t * target: cars.id,\n\t * set: { brand: 'newBMW' },\n\t * where: sql`${cars.createdAt} > '2023-01-01'::date`,\n\t * });\n\t * ```\n\t */\n\tonConflictDoUpdate(config: SQLiteInsertOnConflictDoUpdateConfig<this>): this {\n\t\tif (config.where && (config.targetWhere || config.setWhere)) {\n\t\t\tthrow new Error(\n\t\t\t\t'You cannot use both \"where\" and \"targetWhere\"/\"setWhere\" at the same time - \"where\" is deprecated, use \"targetWhere\" or \"setWhere\" instead.',\n\t\t\t);\n\t\t}\n\n\t\tif (!this.config.onConflict) this.config.onConflict = [];\n\n\t\tconst whereSql = config.where ? sql` where ${config.where}` : undefined;\n\t\tconst targetWhereSql = config.targetWhere ? sql` where ${config.targetWhere}` : undefined;\n\t\tconst setWhereSql = config.setWhere ? sql` where ${config.setWhere}` : undefined;\n\t\tconst targetSql = Array.isArray(config.target) ? sql`${config.target}` : sql`${[config.target]}`;\n\t\tconst setSql = this.dialect.buildUpdateSet(this.config.table, mapUpdateSet(this.config.table, config.set));\n\t\tthis.config.onConflict.push(\n\t\t\tsql` on conflict ${targetSql}${targetWhereSql} do update set ${setSql}${whereSql}${setWhereSql}`,\n\t\t);\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildInsertQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(isOneTimeQuery = true): SQLiteInsertPrepare<this> {\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tthis.config.returning,\n\t\t\tthis.config.returning ? 'all' : 'run',\n\t\t\ttrue,\n\t\t) as SQLiteInsertPrepare<this>;\n\t}\n\n\tprepare(): SQLiteInsertPrepare<this> {\n\t\treturn this._prepare(false);\n\t}\n\n\trun: ReturnType<this['prepare']>['run'] = (placeholderValues) => {\n\t\treturn this._prepare().run(placeholderValues);\n\t};\n\n\tall: ReturnType<this['prepare']>['all'] = (placeholderValues) => {\n\t\treturn this._prepare().all(placeholderValues);\n\t};\n\n\tget: ReturnType<this['prepare']>['get'] = (placeholderValues) => {\n\t\treturn this._prepare().get(placeholderValues);\n\t};\n\n\tvalues: ReturnType<this['prepare']>['values'] = (placeholderValues) => {\n\t\treturn this._prepare().values(placeholderValues);\n\t};\n\n\toverride async execute(): Promise<SQLiteInsertExecute<this>> {\n\t\treturn (this.config.returning ? this.all() : this.run()) as SQLiteInsertExecute<this>;\n\t}\n\n\t$dynamic(): SQLiteInsertDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n","import type { GetColumnData } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { JoinType, SelectResultFields } from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport type { Placeholder, Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { SQLitePreparedQuery, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { Table } from '~/table.ts';\nimport {\n\ttype DrizzleTypeError,\n\tgetTableLikeName,\n\tmapUpdateSet,\n\torderSelectedFields,\n\ttype UpdateSet,\n\ttype ValueOrArray,\n} from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { SQLiteColumn } from '../columns/common.ts';\nimport { SQLiteViewBase } from '../view-base.ts';\nimport type { SelectedFields, SelectedFieldsOrdered, SQLiteSelectJoinConfig } from './select.types.ts';\n\nexport interface SQLiteUpdateConfig {\n\twhere?: SQL | undefined;\n\tlimit?: number | Placeholder;\n\torderBy?: (SQLiteColumn | SQL | SQL.Aliased)[];\n\tset: UpdateSet;\n\ttable: SQLiteTable;\n\tfrom?: SQLiteTable | Subquery | SQLiteViewBase | SQL;\n\tjoins: SQLiteSelectJoinConfig[];\n\treturning?: SelectedFieldsOrdered;\n\twithList?: Subquery[];\n}\n\nexport type SQLiteUpdateSetSource<TTable extends SQLiteTable> =\n\t& {\n\t\t[Key in keyof TTable['$inferInsert']]?:\n\t\t\t| GetColumnData<TTable['_']['columns'][Key], 'query'>\n\t\t\t| SQL\n\t\t\t| SQLiteColumn\n\t\t\t| undefined;\n\t}\n\t& {};\n\nexport class SQLiteUpdateBuilder<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteUpdateBuilder';\n\n\tdeclare readonly _: {\n\t\treadonly table: TTable;\n\t};\n\n\tconstructor(\n\t\tprotected table: TTable,\n\t\tprotected session: SQLiteSession<any, any, any, any>,\n\t\tprotected dialect: SQLiteDialect,\n\t\tprivate withList?: Subquery[],\n\t) {}\n\n\tset(\n\t\tvalues: SQLiteUpdateSetSource<TTable>,\n\t): SQLiteUpdateWithout<\n\t\tSQLiteUpdateBase<TTable, TResultType, TRunResult>,\n\t\tfalse,\n\t\t'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'\n\t> {\n\t\treturn new SQLiteUpdateBase(\n\t\t\tthis.table,\n\t\t\tmapUpdateSet(this.table, values),\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tthis.withList,\n\t\t) as any;\n\t}\n}\n\nexport type SQLiteUpdateWithout<\n\tT extends AnySQLiteUpdate,\n\tTDynamic extends boolean,\n\tK extends keyof T & string,\n> = TDynamic extends true ? T : Omit<\n\tSQLiteUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['from'],\n\t\tT['_']['returning'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods'] | K\n\t>,\n\tT['_']['excludedMethods'] | K\n>;\n\nexport type SQLiteUpdateWithJoins<\n\tT extends AnySQLiteUpdate,\n\tTDynamic extends boolean,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL,\n> = TDynamic extends true ? T : Omit<\n\tSQLiteUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tTFrom,\n\t\tT['_']['returning'],\n\t\tTDynamic,\n\t\tExclude<T['_']['excludedMethods'] | 'from', 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'>\n\t>,\n\tExclude<T['_']['excludedMethods'] | 'from', 'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'>\n>;\n\nexport type SQLiteUpdateReturningAll<T extends AnySQLiteUpdate, TDynamic extends boolean> = SQLiteUpdateWithout<\n\tSQLiteUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['from'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteUpdateReturning<\n\tT extends AnySQLiteUpdate,\n\tTDynamic extends boolean,\n\tTSelectedFields extends SelectedFields,\n> = SQLiteUpdateWithout<\n\tSQLiteUpdateBase<\n\t\tT['_']['table'],\n\t\tT['_']['resultType'],\n\t\tT['_']['runResult'],\n\t\tT['_']['from'],\n\t\tSelectResultFields<TSelectedFields>,\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteUpdateExecute<T extends AnySQLiteUpdate> = T['_']['returning'] extends undefined ? T['_']['runResult']\n\t: T['_']['returning'][];\n\nexport type SQLiteUpdatePrepare<T extends AnySQLiteUpdate> = SQLitePreparedQuery<\n\t{\n\t\ttype: T['_']['resultType'];\n\t\trun: T['_']['runResult'];\n\t\tall: T['_']['returning'] extends undefined ? DrizzleTypeError<'.all() cannot be used without .returning()'>\n\t\t\t: T['_']['returning'][];\n\t\tget: T['_']['returning'] extends undefined ? DrizzleTypeError<'.get() cannot be used without .returning()'>\n\t\t\t: T['_']['returning'];\n\t\tvalues: T['_']['returning'] extends undefined ? DrizzleTypeError<'.values() cannot be used without .returning()'>\n\t\t\t: any[][];\n\t\texecute: SQLiteUpdateExecute<T>;\n\t}\n>;\n\nexport type SQLiteUpdateJoinFn<\n\tT extends AnySQLiteUpdate,\n> = <\n\tTJoinedTable extends SQLiteTable | Subquery | SQLiteViewBase | SQL,\n>(\n\ttable: TJoinedTable,\n\ton:\n\t\t| (\n\t\t\t(\n\t\t\t\tupdateTable: T['_']['table']['_']['columns'],\n\t\t\t\tfrom: T['_']['from'] extends SQLiteTable ? T['_']['from']['_']['columns']\n\t\t\t\t\t: T['_']['from'] extends Subquery | SQLiteViewBase ? T['_']['from']['_']['selectedFields']\n\t\t\t\t\t: never,\n\t\t\t) => SQL | undefined\n\t\t)\n\t\t| SQL\n\t\t| undefined,\n) => T;\n\nexport type SQLiteUpdateDynamic<T extends AnySQLiteUpdate> = SQLiteUpdate<\n\tT['_']['table'],\n\tT['_']['resultType'],\n\tT['_']['runResult'],\n\tT['_']['returning']\n>;\n\nexport type SQLiteUpdate<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = any,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning extends Record<string, unknown> | undefined = Record<string, unknown> | undefined,\n> = SQLiteUpdateBase<TTable, TResultType, TRunResult, TFrom, TReturning, true, never>;\n\nexport type AnySQLiteUpdate = SQLiteUpdateBase<any, any, any, any, any, any, any>;\n\nexport interface SQLiteUpdateBase<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends SQLWrapper, QueryPromise<TReturning extends undefined ? TRunResult : TReturning[]> {\n\treadonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly table: TTable;\n\t\treadonly resultType: TResultType;\n\t\treadonly runResult: TRunResult;\n\t\treadonly from: TFrom;\n\t\treadonly returning: TReturning;\n\t\treadonly dynamic: TDynamic;\n\t\treadonly excludedMethods: TExcludedMethods;\n\t\treadonly result: TReturning extends undefined ? TRunResult : TReturning[];\n\t};\n}\n\nexport class SQLiteUpdateBase<\n\tTTable extends SQLiteTable = SQLiteTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends QueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>\n\timplements RunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteUpdate';\n\n\t/** @internal */\n\tconfig: SQLiteUpdateConfig;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tset: UpdateSet,\n\t\tprivate session: SQLiteSession<any, any, any, any>,\n\t\tprivate dialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t) {\n\t\tsuper();\n\t\tthis.config = { set, table, withList, joins: [] };\n\t}\n\n\tfrom<TFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL>(\n\t\tsource: TFrom,\n\t): SQLiteUpdateWithJoins<this, TDynamic, TFrom> {\n\t\tthis.config.from = source;\n\t\treturn this as any;\n\t}\n\n\tprivate createJoin<TJoinType extends JoinType>(\n\t\tjoinType: TJoinType,\n\t): SQLiteUpdateJoinFn<this> {\n\t\treturn ((\n\t\t\ttable: SQLiteTable | Subquery | SQLiteViewBase | SQL,\n\t\t\ton: ((updateTable: TTable, from: TFrom) => SQL | undefined) | SQL | undefined,\n\t\t) => {\n\t\t\tconst tableName = getTableLikeName(table);\n\n\t\t\tif (typeof tableName === 'string' && this.config.joins.some((join) => join.alias === tableName)) {\n\t\t\t\tthrow new Error(`Alias \"${tableName}\" is already used in this query`);\n\t\t\t}\n\n\t\t\tif (typeof on === 'function') {\n\t\t\t\tconst from = this.config.from\n\t\t\t\t\t? is(table, SQLiteTable)\n\t\t\t\t\t\t? table[Table.Symbol.Columns]\n\t\t\t\t\t\t: is(table, Subquery)\n\t\t\t\t\t\t? table._.selectedFields\n\t\t\t\t\t\t: is(table, SQLiteViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].selectedFields\n\t\t\t\t\t\t: undefined\n\t\t\t\t\t: undefined;\n\t\t\t\ton = on(\n\t\t\t\t\tnew Proxy(\n\t\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as any,\n\t\t\t\t\tfrom && new Proxy(\n\t\t\t\t\t\tfrom,\n\t\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'sql', sqlBehavior: 'sql' }),\n\t\t\t\t\t) as any,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.config.joins.push({ on, table, joinType, alias: tableName });\n\n\t\t\treturn this as any;\n\t\t}) as any;\n\t}\n\n\tleftJoin = this.createJoin('left');\n\n\trightJoin = this.createJoin('right');\n\n\tinnerJoin = this.createJoin('inner');\n\n\tfullJoin = this.createJoin('full');\n\n\t/**\n\t * Adds a 'where' clause to the query.\n\t *\n\t * Calling this method will update only those rows that fulfill a specified condition.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param where the 'where' clause.\n\t *\n\t * @example\n\t * You can use conditional operators and `sql function` to filter the rows to be updated.\n\t *\n\t * ```ts\n\t * // Update all cars with green color\n\t * db.update(cars).set({ color: 'red' })\n\t * .where(eq(cars.color, 'green'));\n\t * // or\n\t * db.update(cars).set({ color: 'red' })\n\t * .where(sql`${cars.color} = 'green'`)\n\t * ```\n\t *\n\t * You can logically combine conditional operators with `and()` and `or()` operators:\n\t *\n\t * ```ts\n\t * // Update all BMW cars with a green color\n\t * db.update(cars).set({ color: 'red' })\n\t * .where(and(eq(cars.color, 'green'), eq(cars.brand, 'BMW')));\n\t *\n\t * // Update all cars with the green or blue color\n\t * db.update(cars).set({ color: 'red' })\n\t * .where(or(eq(cars.color, 'green'), eq(cars.color, 'blue')));\n\t * ```\n\t */\n\twhere(where: SQL | undefined): SQLiteUpdateWithout<this, TDynamic, 'where'> {\n\t\tthis.config.where = where;\n\t\treturn this as any;\n\t}\n\n\torderBy(\n\t\tbuilder: (updateTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>,\n\t): SQLiteUpdateWithout<this, TDynamic, 'orderBy'>;\n\torderBy(...columns: (SQLiteColumn | SQL | SQL.Aliased)[]): SQLiteUpdateWithout<this, TDynamic, 'orderBy'>;\n\torderBy(\n\t\t...columns:\n\t\t\t| [(updateTable: TTable) => ValueOrArray<SQLiteColumn | SQL | SQL.Aliased>]\n\t\t\t| (SQLiteColumn | SQL | SQL.Aliased)[]\n\t): SQLiteUpdateWithout<this, TDynamic, 'orderBy'> {\n\t\tif (typeof columns[0] === 'function') {\n\t\t\tconst orderBy = columns[0](\n\t\t\t\tnew Proxy(\n\t\t\t\t\tthis.config.table[Table.Symbol.Columns],\n\t\t\t\t\tnew SelectionProxyHandler({ sqlAliasedBehavior: 'alias', sqlBehavior: 'sql' }),\n\t\t\t\t) as any,\n\t\t\t);\n\n\t\t\tconst orderByArray = Array.isArray(orderBy) ? orderBy : [orderBy];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t} else {\n\t\t\tconst orderByArray = columns as (SQLiteColumn | SQL | SQL.Aliased)[];\n\t\t\tthis.config.orderBy = orderByArray;\n\t\t}\n\t\treturn this as any;\n\t}\n\n\tlimit(limit: number | Placeholder): SQLiteUpdateWithout<this, TDynamic, 'limit'> {\n\t\tthis.config.limit = limit;\n\t\treturn this as any;\n\t}\n\n\t/**\n\t * Adds a `returning` clause to the query.\n\t *\n\t * Calling this method will return the specified fields of the updated rows. If no fields are specified, all fields will be returned.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update#update-with-returning}\n\t *\n\t * @example\n\t * ```ts\n\t * // Update all cars with the green color and return all fields\n\t * const updatedCars: Car[] = await db.update(cars)\n\t * .set({ color: 'red' })\n\t * .where(eq(cars.color, 'green'))\n\t * .returning();\n\t *\n\t * // Update all cars with the green color and return only their id and brand fields\n\t * const updatedCarsIdsAndBrands: { id: number, brand: string }[] = await db.update(cars)\n\t * .set({ color: 'red' })\n\t * .where(eq(cars.color, 'green'))\n\t * .returning({ id: cars.id, brand: cars.brand });\n\t * ```\n\t */\n\treturning(): SQLiteUpdateReturningAll<this, TDynamic>;\n\treturning<TSelectedFields extends SelectedFields>(\n\t\tfields: TSelectedFields,\n\t): SQLiteUpdateReturning<this, TDynamic, TSelectedFields>;\n\treturning(\n\t\tfields: SelectedFields = this.config.table[SQLiteTable.Symbol.Columns],\n\t): SQLiteUpdateWithout<AnySQLiteUpdate, TDynamic, 'returning'> {\n\t\tthis.config.returning = orderSelectedFields<SQLiteColumn>(fields);\n\t\treturn this as any;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildUpdateQuery(this.config);\n\t}\n\n\ttoSQL(): Query {\n\t\tconst { typings: _typings, ...rest } = this.dialect.sqlToQuery(this.getSQL());\n\t\treturn rest;\n\t}\n\n\t/** @internal */\n\t_prepare(isOneTimeQuery = true): SQLiteUpdatePrepare<this> {\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tthis.dialect.sqlToQuery(this.getSQL()),\n\t\t\tthis.config.returning,\n\t\t\tthis.config.returning ? 'all' : 'run',\n\t\t\ttrue,\n\t\t) as SQLiteUpdatePrepare<this>;\n\t}\n\n\tprepare(): SQLiteUpdatePrepare<this> {\n\t\treturn this._prepare(false);\n\t}\n\n\trun: ReturnType<this['prepare']>['run'] = (placeholderValues) => {\n\t\treturn this._prepare().run(placeholderValues);\n\t};\n\n\tall: ReturnType<this['prepare']>['all'] = (placeholderValues) => {\n\t\treturn this._prepare().all(placeholderValues);\n\t};\n\n\tget: ReturnType<this['prepare']>['get'] = (placeholderValues) => {\n\t\treturn this._prepare().get(placeholderValues);\n\t};\n\n\tvalues: ReturnType<this['prepare']>['values'] = (placeholderValues) => {\n\t\treturn this._prepare().values(placeholderValues);\n\t};\n\n\toverride async execute(): Promise<SQLiteUpdateExecute<this>> {\n\t\treturn (this.config.returning ? this.all() : this.run()) as SQLiteUpdateExecute<this>;\n\t}\n\n\t$dynamic(): SQLiteUpdateDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport { SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteSession } from '../session.ts';\nimport type { SQLiteTable } from '../table.ts';\nimport type { SQLiteView } from '../view.ts';\n\nexport class SQLiteCountBuilder<\n\tTSession extends SQLiteSession<any, any, any, any>,\n> extends SQL<number> implements Promise<number>, SQLWrapper {\n\tprivate sql: SQL<number>;\n\n\tstatic override readonly [entityKind] = 'SQLiteCountBuilderAsync';\n\t[Symbol.toStringTag] = 'SQLiteCountBuilderAsync';\n\n\tprivate session: TSession;\n\n\tprivate static buildEmbeddedCount(\n\t\tsource: SQLiteTable | SQLiteView | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`(select count(*) from ${source}${sql.raw(' where ').if(filters)}${filters})`;\n\t}\n\n\tprivate static buildCount(\n\t\tsource: SQLiteTable | SQLiteView | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t): SQL<number> {\n\t\treturn sql<number>`select count(*) from ${source}${sql.raw(' where ').if(filters)}${filters}`;\n\t}\n\n\tconstructor(\n\t\treadonly params: {\n\t\t\tsource: SQLiteTable | SQLiteView | SQL | SQLWrapper;\n\t\t\tfilters?: SQL<unknown>;\n\t\t\tsession: TSession;\n\t\t},\n\t) {\n\t\tsuper(SQLiteCountBuilder.buildEmbeddedCount(params.source, params.filters).queryChunks);\n\n\t\tthis.session = params.session;\n\n\t\tthis.sql = SQLiteCountBuilder.buildCount(\n\t\t\tparams.source,\n\t\t\tparams.filters,\n\t\t);\n\t}\n\n\tthen<TResult1 = number, TResult2 = never>(\n\t\tonfulfilled?: ((value: number) => TResult1 | PromiseLike<TResult1>) | null | undefined,\n\t\tonrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null | undefined,\n\t): Promise<TResult1 | TResult2> {\n\t\treturn Promise.resolve(this.session.count(this.sql)).then(\n\t\t\tonfulfilled,\n\t\t\tonrejected,\n\t\t);\n\t}\n\n\tcatch(\n\t\tonRejected?: ((reason: any) => never | PromiseLike<never>) | null | undefined,\n\t): Promise<number> {\n\t\treturn this.then(undefined, onRejected);\n\t}\n\n\tfinally(onFinally?: (() => void) | null | undefined): Promise<number> {\n\t\treturn this.then(\n\t\t\t(value) => {\n\t\t\t\tonFinally?.();\n\t\t\t\treturn value;\n\t\t\t},\n\t\t\t(reason) => {\n\t\t\t\tonFinally?.();\n\t\t\t\tthrow reason;\n\t\t\t},\n\t\t);\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport {\n\ttype BuildQueryResult,\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfig,\n\tmapRelationalRow,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Query, QueryWithTypings, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { KnownKeysOnly } from '~/utils.ts';\nimport type { SQLiteDialect } from '../dialect.ts';\nimport type { PreparedQueryConfig, SQLitePreparedQuery, SQLiteSession } from '../session.ts';\nimport type { SQLiteTable } from '../table.ts';\n\nexport type SQLiteRelationalQueryKind<TMode extends 'sync' | 'async', TResult> = TMode extends 'async'\n\t? SQLiteRelationalQuery<TMode, TResult>\n\t: SQLiteSyncRelationalQuery<TResult>;\n\nexport class RelationalQueryBuilder<\n\tTMode extends 'sync' | 'async',\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n\tTFields extends TableRelationalConfig,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteAsyncRelationalQueryBuilder';\n\n\tconstructor(\n\t\tprotected mode: TMode,\n\t\tprotected fullSchema: Record<string, unknown>,\n\t\tprotected schema: TSchema,\n\t\tprotected tableNamesMap: Record<string, string>,\n\t\tprotected table: SQLiteTable,\n\t\tprotected tableConfig: TableRelationalConfig,\n\t\tprotected dialect: SQLiteDialect,\n\t\tprotected session: SQLiteSession<'async', unknown, TFullSchema, TSchema>,\n\t) {}\n\n\tfindMany<TConfig extends DBQueryConfig<'many', true, TSchema, TFields>>(\n\t\tconfig?: KnownKeysOnly<TConfig, DBQueryConfig<'many', true, TSchema, TFields>>,\n\t): SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TConfig>[]> {\n\t\treturn (this.mode === 'sync'\n\t\t\t? new SQLiteSyncRelationalQuery(\n\t\t\t\tthis.fullSchema,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.tableNamesMap,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig ? (config as DBQueryConfig<'many', true>) : {},\n\t\t\t\t'many',\n\t\t\t)\n\t\t\t: new SQLiteRelationalQuery(\n\t\t\t\tthis.fullSchema,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.tableNamesMap,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig ? (config as DBQueryConfig<'many', true>) : {},\n\t\t\t\t'many',\n\t\t\t)) as SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TConfig>[]>;\n\t}\n\n\tfindFirst<TSelection extends Omit<DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>(\n\t\tconfig?: KnownKeysOnly<TSelection, Omit<DBQueryConfig<'many', true, TSchema, TFields>, 'limit'>>,\n\t): SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TSelection> | undefined> {\n\t\treturn (this.mode === 'sync'\n\t\t\t? new SQLiteSyncRelationalQuery(\n\t\t\t\tthis.fullSchema,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.tableNamesMap,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig ? { ...(config as DBQueryConfig<'many', true> | undefined), limit: 1 } : { limit: 1 },\n\t\t\t\t'first',\n\t\t\t)\n\t\t\t: new SQLiteRelationalQuery(\n\t\t\t\tthis.fullSchema,\n\t\t\t\tthis.schema,\n\t\t\t\tthis.tableNamesMap,\n\t\t\t\tthis.table,\n\t\t\t\tthis.tableConfig,\n\t\t\t\tthis.dialect,\n\t\t\t\tthis.session,\n\t\t\t\tconfig ? { ...(config as DBQueryConfig<'many', true> | undefined), limit: 1 } : { limit: 1 },\n\t\t\t\t'first',\n\t\t\t)) as SQLiteRelationalQueryKind<TMode, BuildQueryResult<TSchema, TFields, TSelection> | undefined>;\n\t}\n}\n\nexport class SQLiteRelationalQuery<TType extends 'sync' | 'async', TResult> extends QueryPromise<TResult>\n\timplements RunnableQuery<TResult, 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncRelationalQuery';\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly type: TType;\n\t\treadonly result: TResult;\n\t};\n\n\t/** @internal */\n\tmode: 'many' | 'first';\n\n\tconstructor(\n\t\tprivate fullSchema: Record<string, unknown>,\n\t\tprivate schema: TablesRelationalConfig,\n\t\tprivate tableNamesMap: Record<string, string>,\n\t\t/** @internal */\n\t\tpublic table: SQLiteTable,\n\t\tprivate tableConfig: TableRelationalConfig,\n\t\tprivate dialect: SQLiteDialect,\n\t\tprivate session: SQLiteSession<'sync' | 'async', unknown, Record<string, unknown>, TablesRelationalConfig>,\n\t\tprivate config: DBQueryConfig<'many', true> | true,\n\t\tmode: 'many' | 'first',\n\t) {\n\t\tsuper();\n\t\tthis.mode = mode;\n\t}\n\n\t/** @internal */\n\tgetSQL(): SQL {\n\t\treturn this.dialect.buildRelationalQuery({\n\t\t\tfullSchema: this.fullSchema,\n\t\t\tschema: this.schema,\n\t\t\ttableNamesMap: this.tableNamesMap,\n\t\t\ttable: this.table,\n\t\t\ttableConfig: this.tableConfig,\n\t\t\tqueryConfig: this.config,\n\t\t\ttableAlias: this.tableConfig.tsName,\n\t\t}).sql as SQL;\n\t}\n\n\t/** @internal */\n\t_prepare(\n\t\tisOneTimeQuery = false,\n\t): SQLitePreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }> {\n\t\tconst { query, builtQuery } = this._toSQL();\n\n\t\treturn this.session[isOneTimeQuery ? 'prepareOneTimeQuery' : 'prepareQuery'](\n\t\t\tbuiltQuery,\n\t\t\tundefined,\n\t\t\tthis.mode === 'first' ? 'get' : 'all',\n\t\t\ttrue,\n\t\t\t(rawRows, mapColumnValue) => {\n\t\t\t\tconst rows = rawRows.map((row) =>\n\t\t\t\t\tmapRelationalRow(this.schema, this.tableConfig, row, query.selection, mapColumnValue)\n\t\t\t\t);\n\t\t\t\tif (this.mode === 'first') {\n\t\t\t\t\treturn rows[0] as TResult;\n\t\t\t\t}\n\t\t\t\treturn rows as TResult;\n\t\t\t},\n\t\t) as SQLitePreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }>;\n\t}\n\n\tprepare(): SQLitePreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }> {\n\t\treturn this._prepare(false);\n\t}\n\n\tprivate _toSQL(): { query: BuildRelationalQueryResult; builtQuery: QueryWithTypings } {\n\t\tconst query = this.dialect.buildRelationalQuery({\n\t\t\tfullSchema: this.fullSchema,\n\t\t\tschema: this.schema,\n\t\t\ttableNamesMap: this.tableNamesMap,\n\t\t\ttable: this.table,\n\t\t\ttableConfig: this.tableConfig,\n\t\t\tqueryConfig: this.config,\n\t\t\ttableAlias: this.tableConfig.tsName,\n\t\t});\n\n\t\tconst builtQuery = this.dialect.sqlToQuery(query.sql as SQL);\n\n\t\treturn { query, builtQuery };\n\t}\n\n\ttoSQL(): Query {\n\t\treturn this._toSQL().builtQuery;\n\t}\n\n\t/** @internal */\n\texecuteRaw(): TResult {\n\t\tif (this.mode === 'first') {\n\t\t\treturn this._prepare(false).get() as TResult;\n\t\t}\n\t\treturn this._prepare(false).all() as TResult;\n\t}\n\n\toverride async execute(): Promise<TResult> {\n\t\treturn this.executeRaw();\n\t}\n}\n\nexport class SQLiteSyncRelationalQuery<TResult> extends SQLiteRelationalQuery<'sync', TResult> {\n\tstatic override readonly [entityKind]: string = 'SQLiteSyncRelationalQuery';\n\n\tsync(): TResult {\n\t\treturn this.executeRaw();\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport type { SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteAsyncDialect } from '../dialect.ts';\n\ntype SQLiteRawAction = 'all' | 'get' | 'values' | 'run';\nexport interface SQLiteRawConfig {\n\taction: SQLiteRawAction;\n}\n\nexport interface SQLiteRaw<TResult> extends QueryPromise<TResult>, RunnableQuery<TResult, 'sqlite'>, SQLWrapper {}\n\nexport class SQLiteRaw<TResult> extends QueryPromise<TResult>\n\timplements RunnableQuery<TResult, 'sqlite'>, SQLWrapper, PreparedQuery\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteRaw';\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly result: TResult;\n\t};\n\n\t/** @internal */\n\tconfig: SQLiteRawConfig;\n\n\tconstructor(\n\t\tpublic execute: () => Promise<TResult>,\n\t\t/** @internal */\n\t\tpublic getSQL: () => SQL,\n\t\taction: SQLiteRawAction,\n\t\tprivate dialect: SQLiteAsyncDialect,\n\t\tprivate mapBatchResult: (result: unknown) => unknown,\n\t) {\n\t\tsuper();\n\t\tthis.config = { action };\n\t}\n\n\tgetQuery() {\n\t\treturn { ...this.dialect.sqlToQuery(this.getSQL()), method: this.config.action };\n\t}\n\n\tmapResult(result: unknown, isFromBatch?: boolean) {\n\t\treturn isFromBatch ? this.mapBatchResult(result) : result;\n\t}\n\n\t_prepare(): PreparedQuery {\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn false;\n\t}\n}\n","import { entityKind } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { ExtractTablesWithRelations, RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { type ColumnsSelection, type SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteAsyncDialect, SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport {\n\tQueryBuilder,\n\tSQLiteDeleteBase,\n\tSQLiteInsertBuilder,\n\tSQLiteSelectBuilder,\n\tSQLiteUpdateBuilder,\n} from '~/sqlite-core/query-builders/index.ts';\nimport type {\n\tDBResult,\n\tResult,\n\tSQLiteSession,\n\tSQLiteTransaction,\n\tSQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport type { DrizzleTypeError } from '~/utils.ts';\nimport { SQLiteCountBuilder } from './query-builders/count.ts';\nimport { RelationalQueryBuilder } from './query-builders/query.ts';\nimport { SQLiteRaw } from './query-builders/raw.ts';\nimport type { SelectedFields } from './query-builders/select.types.ts';\nimport type { WithBuilder } from './subquery.ts';\nimport type { SQLiteViewBase } from './view-base.ts';\n\nexport class BaseSQLiteDatabase<\n\tTResultKind extends 'sync' | 'async',\n\tTRunResult,\n\tTFullSchema extends Record<string, unknown> = Record<string, never>,\n\tTSchema extends TablesRelationalConfig = ExtractTablesWithRelations<TFullSchema>,\n> {\n\tstatic readonly [entityKind]: string = 'BaseSQLiteDatabase';\n\n\tdeclare readonly _: {\n\t\treadonly schema: TSchema | undefined;\n\t\treadonly fullSchema: TFullSchema;\n\t\treadonly tableNamesMap: Record<string, string>;\n\t};\n\n\tquery: TFullSchema extends Record<string, never>\n\t\t? DrizzleTypeError<'Seems like the schema generic is missing - did you forget to add it to your DB type?'>\n\t\t: {\n\t\t\t[K in keyof TSchema]: RelationalQueryBuilder<TResultKind, TFullSchema, TSchema, TSchema[K]>;\n\t\t};\n\n\tconstructor(\n\t\tprivate resultKind: TResultKind,\n\t\t/** @internal */\n\t\treadonly dialect: { sync: SQLiteSyncDialect; async: SQLiteAsyncDialect }[TResultKind],\n\t\t/** @internal */\n\t\treadonly session: SQLiteSession<TResultKind, TRunResult, TFullSchema, TSchema>,\n\t\tschema: RelationalSchemaConfig<TSchema> | undefined,\n\t) {\n\t\tthis._ = schema\n\t\t\t? {\n\t\t\t\tschema: schema.schema,\n\t\t\t\tfullSchema: schema.fullSchema as TFullSchema,\n\t\t\t\ttableNamesMap: schema.tableNamesMap,\n\t\t\t}\n\t\t\t: {\n\t\t\t\tschema: undefined,\n\t\t\t\tfullSchema: {} as TFullSchema,\n\t\t\t\ttableNamesMap: {},\n\t\t\t};\n\t\tthis.query = {} as typeof this['query'];\n\t\tconst query = this.query as {\n\t\t\t[K in keyof TSchema]: RelationalQueryBuilder<TResultKind, TFullSchema, TSchema, TSchema[K]>;\n\t\t};\n\t\tif (this._.schema) {\n\t\t\tfor (const [tableName, columns] of Object.entries(this._.schema)) {\n\t\t\t\tquery[tableName as keyof TSchema] = new RelationalQueryBuilder(\n\t\t\t\t\tresultKind,\n\t\t\t\t\tschema!.fullSchema,\n\t\t\t\t\tthis._.schema,\n\t\t\t\t\tthis._.tableNamesMap,\n\t\t\t\t\tschema!.fullSchema[tableName] as SQLiteTable,\n\t\t\t\t\tcolumns,\n\t\t\t\t\tdialect,\n\t\t\t\t\tsession as SQLiteSession<any, any, any, any> as any,\n\t\t\t\t) as typeof query[keyof TSchema];\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Creates a subquery that defines a temporary named result set as a CTE.\n\t *\n\t * It is useful for breaking down complex queries into simpler parts and for reusing the result set in subsequent parts of the query.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param alias The alias for the subquery.\n\t *\n\t * Failure to provide an alias will result in a DrizzleTypeError, preventing the subquery from being referenced in other queries.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Create a subquery with alias 'sq' and use it in the select query\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t *\n\t * To select arbitrary SQL values as fields in a CTE and reference them in other CTEs or in the main query, you need to add aliases to them:\n\t *\n\t * ```ts\n\t * // Select an arbitrary SQL value as a field in a CTE and reference it in the main query\n\t * const sq = db.$with('sq').as(db.select({\n\t * name: sql<string>`upper(${users.name})`.as('name'),\n\t * })\n\t * .from(users));\n\t *\n\t * const result = await db.with(sq).select({ name: sq.name }).from(sq);\n\t * ```\n\t */\n\t$with: WithBuilder = (alias: string, selection?: ColumnsSelection) => {\n\t\tconst self = this;\n\t\tconst as = (\n\t\t\tqb:\n\t\t\t\t| TypedQueryBuilder<ColumnsSelection | undefined>\n\t\t\t\t| SQL\n\t\t\t\t| ((qb: QueryBuilder) => TypedQueryBuilder<ColumnsSelection | undefined> | SQL),\n\t\t) => {\n\t\t\tif (typeof qb === 'function') {\n\t\t\t\tqb = qb(new QueryBuilder(self.dialect));\n\t\t\t}\n\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tqb.getSQL(),\n\t\t\t\t\tselection ?? ('getSelectedFields' in qb ? qb.getSelectedFields() ?? {} : {}) as SelectedFields,\n\t\t\t\t\talias,\n\t\t\t\t\ttrue,\n\t\t\t\t),\n\t\t\t\tnew SelectionProxyHandler({ alias, sqlAliasedBehavior: 'alias', sqlBehavior: 'error' }),\n\t\t\t);\n\t\t};\n\t\treturn { as };\n\t};\n\n\t$count(\n\t\tsource: SQLiteTable | SQLiteViewBase | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t) {\n\t\treturn new SQLiteCountBuilder({ source, filters, session: this.session });\n\t}\n\n\t/**\n\t * Incorporates a previously defined CTE (using `$with`) into the main query.\n\t *\n\t * This method allows the main query to reference a temporary named result set.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#with-clause}\n\t *\n\t * @param queries The CTEs to incorporate into the main query.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Define a subquery 'sq' as a CTE using $with\n\t * const sq = db.$with('sq').as(db.select().from(users).where(eq(users.id, 42)));\n\t *\n\t * // Incorporate the CTE 'sq' into the main query and select from it\n\t * const result = await db.with(sq).select().from(sq);\n\t * ```\n\t */\n\twith(...queries: WithSubquery[]) {\n\t\tconst self = this;\n\n\t\t/**\n\t\t * Creates a select query.\n\t\t *\n\t\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Select all columns and all rows from the 'cars' table\n\t\t * const allCars: Car[] = await db.select().from(cars);\n\t\t *\n\t\t * // Select specific columns and all rows from the 'cars' table\n\t\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t\t * id: cars.id,\n\t\t * brand: cars.brand\n\t\t * })\n\t\t * .from(cars);\n\t\t * ```\n\t\t *\n\t\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t\t *\n\t\t * ```ts\n\t\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t\t * id: cars.id,\n\t\t * lowerBrand: sql<string>`lower(${cars.brand})`,\n\t\t * })\n\t\t * .from(cars);\n\t\t * ```\n\t\t */\n\t\tfunction select(): SQLiteSelectBuilder<undefined, TResultKind, TRunResult>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, TResultKind, TRunResult>;\n\t\tfunction select(\n\t\t\tfields?: SelectedFields,\n\t\t): SQLiteSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Adds `distinct` expression to the select query.\n\t\t *\n\t\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t\t *\n\t\t * Use `.from()` method to specify which table to select from.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t\t *\n\t\t * @param fields The selection object.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Select all unique rows from the 'cars' table\n\t\t * await db.selectDistinct()\n\t\t * .from(cars)\n\t\t * .orderBy(cars.id, cars.brand, cars.color);\n\t\t *\n\t\t * // Select all unique brands from the 'cars' table\n\t\t * await db.selectDistinct({ brand: cars.brand })\n\t\t * .from(cars)\n\t\t * .orderBy(cars.brand);\n\t\t * ```\n\t\t */\n\t\tfunction selectDistinct(): SQLiteSelectBuilder<undefined, TResultKind, TRunResult>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, TResultKind, TRunResult>;\n\t\tfunction selectDistinct(\n\t\t\tfields?: SelectedFields,\n\t\t): SQLiteSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteSelectBuilder({\n\t\t\t\tfields: fields ?? undefined,\n\t\t\t\tsession: self.session,\n\t\t\t\tdialect: self.dialect,\n\t\t\t\twithList: queries,\n\t\t\t\tdistinct: true,\n\t\t\t});\n\t\t}\n\n\t\t/**\n\t\t * Creates an update query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t\t *\n\t\t * Use `.set()` method to specify which values to update.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t\t *\n\t\t * @param table The table to update.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Update all rows in the 'cars' table\n\t\t * await db.update(cars).set({ color: 'red' });\n\t\t *\n\t\t * // Update rows with filters and conditions\n\t\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t\t *\n\t\t * // Update with returning clause\n\t\t * const updatedCar: Car[] = await db.update(cars)\n\t\t * .set({ color: 'red' })\n\t\t * .where(eq(cars.id, 1))\n\t\t * .returning();\n\t\t * ```\n\t\t */\n\t\tfunction update<TTable extends SQLiteTable>(table: TTable): SQLiteUpdateBuilder<TTable, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteUpdateBuilder(table, self.session, self.dialect, queries);\n\t\t}\n\n\t\t/**\n\t\t * Creates an insert query.\n\t\t *\n\t\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t\t *\n\t\t * @param table The table to insert into.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Insert one row\n\t\t * await db.insert(cars).values({ brand: 'BMW' });\n\t\t *\n\t\t * // Insert multiple rows\n\t\t * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t\t *\n\t\t * // Insert with returning clause\n\t\t * const insertedCar: Car[] = await db.insert(cars)\n\t\t * .values({ brand: 'BMW' })\n\t\t * .returning();\n\t\t * ```\n\t\t */\n\t\tfunction insert<TTable extends SQLiteTable>(into: TTable): SQLiteInsertBuilder<TTable, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteInsertBuilder(into, self.session, self.dialect, queries);\n\t\t}\n\n\t\t/**\n\t\t * Creates a delete query.\n\t\t *\n\t\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t\t *\n\t\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t\t *\n\t\t * @param table The table to delete from.\n\t\t *\n\t\t * @example\n\t\t *\n\t\t * ```ts\n\t\t * // Delete all rows in the 'cars' table\n\t\t * await db.delete(cars);\n\t\t *\n\t\t * // Delete rows with filters and conditions\n\t\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t\t *\n\t\t * // Delete with returning clause\n\t\t * const deletedCar: Car[] = await db.delete(cars)\n\t\t * .where(eq(cars.id, 1))\n\t\t * .returning();\n\t\t * ```\n\t\t */\n\t\tfunction delete_<TTable extends SQLiteTable>(from: TTable): SQLiteDeleteBase<TTable, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteDeleteBase(from, self.session, self.dialect, queries);\n\t\t}\n\n\t\treturn { select, selectDistinct, update, insert, delete: delete_ };\n\t}\n\n\t/**\n\t * Creates a select query.\n\t *\n\t * Calling this method with no arguments will select all columns from the table. Pass a selection object to specify the columns you want to select.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all columns and all rows from the 'cars' table\n\t * const allCars: Car[] = await db.select().from(cars);\n\t *\n\t * // Select specific columns and all rows from the 'cars' table\n\t * const carsIdsAndBrands: { id: number; brand: string }[] = await db.select({\n\t * id: cars.id,\n\t * brand: cars.brand\n\t * })\n\t * .from(cars);\n\t * ```\n\t *\n\t * Like in SQL, you can use arbitrary expressions as selection fields, not just table columns:\n\t *\n\t * ```ts\n\t * // Select specific columns along with expression and all rows from the 'cars' table\n\t * const carsIdsAndLowerNames: { id: number; lowerBrand: string }[] = await db.select({\n\t * id: cars.id,\n\t * lowerBrand: sql<string>`lower(${cars.brand})`,\n\t * })\n\t * .from(cars);\n\t * ```\n\t */\n\tselect(): SQLiteSelectBuilder<undefined, TResultKind, TRunResult>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, TResultKind, TRunResult>;\n\tselect(fields?: SelectedFields): SQLiteSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\treturn new SQLiteSelectBuilder({ fields: fields ?? undefined, session: this.session, dialect: this.dialect });\n\t}\n\n\t/**\n\t * Adds `distinct` expression to the select query.\n\t *\n\t * Calling this method will return only unique values. When multiple columns are selected, it returns rows with unique combinations of values in these columns.\n\t *\n\t * Use `.from()` method to specify which table to select from.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/select#distinct}\n\t *\n\t * @param fields The selection object.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all unique rows from the 'cars' table\n\t * await db.selectDistinct()\n\t * .from(cars)\n\t * .orderBy(cars.id, cars.brand, cars.color);\n\t *\n\t * // Select all unique brands from the 'cars' table\n\t * await db.selectDistinct({ brand: cars.brand })\n\t * .from(cars)\n\t * .orderBy(cars.brand);\n\t * ```\n\t */\n\tselectDistinct(): SQLiteSelectBuilder<undefined, TResultKind, TRunResult>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, TResultKind, TRunResult>;\n\tselectDistinct(\n\t\tfields?: SelectedFields,\n\t): SQLiteSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\treturn new SQLiteSelectBuilder({\n\t\t\tfields: fields ?? undefined,\n\t\t\tsession: this.session,\n\t\t\tdialect: this.dialect,\n\t\t\tdistinct: true,\n\t\t});\n\t}\n\n\t/**\n\t * Creates an update query.\n\t *\n\t * Calling this method without `.where()` clause will update all rows in a table. The `.where()` clause specifies which rows should be updated.\n\t *\n\t * Use `.set()` method to specify which values to update.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/update}\n\t *\n\t * @param table The table to update.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Update all rows in the 'cars' table\n\t * await db.update(cars).set({ color: 'red' });\n\t *\n\t * // Update rows with filters and conditions\n\t * await db.update(cars).set({ color: 'red' }).where(eq(cars.brand, 'BMW'));\n\t *\n\t * // Update with returning clause\n\t * const updatedCar: Car[] = await db.update(cars)\n\t * .set({ color: 'red' })\n\t * .where(eq(cars.id, 1))\n\t * .returning();\n\t * ```\n\t */\n\tupdate<TTable extends SQLiteTable>(table: TTable): SQLiteUpdateBuilder<TTable, TResultKind, TRunResult> {\n\t\treturn new SQLiteUpdateBuilder(table, this.session, this.dialect);\n\t}\n\n\t/**\n\t * Creates an insert query.\n\t *\n\t * Calling this method will create new rows in a table. Use `.values()` method to specify which values to insert.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/insert}\n\t *\n\t * @param table The table to insert into.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Insert one row\n\t * await db.insert(cars).values({ brand: 'BMW' });\n\t *\n\t * // Insert multiple rows\n\t * await db.insert(cars).values([{ brand: 'BMW' }, { brand: 'Porsche' }]);\n\t *\n\t * // Insert with returning clause\n\t * const insertedCar: Car[] = await db.insert(cars)\n\t * .values({ brand: 'BMW' })\n\t * .returning();\n\t * ```\n\t */\n\tinsert<TTable extends SQLiteTable>(into: TTable): SQLiteInsertBuilder<TTable, TResultKind, TRunResult> {\n\t\treturn new SQLiteInsertBuilder(into, this.session, this.dialect);\n\t}\n\n\t/**\n\t * Creates a delete query.\n\t *\n\t * Calling this method without `.where()` clause will delete all rows in a table. The `.where()` clause specifies which rows should be deleted.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/delete}\n\t *\n\t * @param table The table to delete from.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Delete all rows in the 'cars' table\n\t * await db.delete(cars);\n\t *\n\t * // Delete rows with filters and conditions\n\t * await db.delete(cars).where(eq(cars.color, 'green'));\n\t *\n\t * // Delete with returning clause\n\t * const deletedCar: Car[] = await db.delete(cars)\n\t * .where(eq(cars.id, 1))\n\t * .returning();\n\t * ```\n\t */\n\tdelete<TTable extends SQLiteTable>(from: TTable): SQLiteDeleteBase<TTable, TResultKind, TRunResult> {\n\t\treturn new SQLiteDeleteBase(from, this.session, this.dialect);\n\t}\n\n\trun(query: SQLWrapper | string): DBResult<TResultKind, TRunResult> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteRaw(\n\t\t\t\tasync () => this.session.run(sequel),\n\t\t\t\t() => sequel,\n\t\t\t\t'run',\n\t\t\t\tthis.dialect as SQLiteAsyncDialect,\n\t\t\t\tthis.session.extractRawRunValueFromBatchResult.bind(this.session),\n\t\t\t) as DBResult<TResultKind, TRunResult>;\n\t\t}\n\t\treturn this.session.run(sequel) as DBResult<TResultKind, TRunResult>;\n\t}\n\n\tall<T = unknown>(query: SQLWrapper | string): DBResult<TResultKind, T[]> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteRaw(\n\t\t\t\tasync () => this.session.all(sequel),\n\t\t\t\t() => sequel,\n\t\t\t\t'all',\n\t\t\t\tthis.dialect as SQLiteAsyncDialect,\n\t\t\t\tthis.session.extractRawAllValueFromBatchResult.bind(this.session),\n\t\t\t) as any;\n\t\t}\n\t\treturn this.session.all(sequel) as DBResult<TResultKind, T[]>;\n\t}\n\n\tget<T = unknown>(query: SQLWrapper | string): DBResult<TResultKind, T> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteRaw(\n\t\t\t\tasync () => this.session.get(sequel),\n\t\t\t\t() => sequel,\n\t\t\t\t'get',\n\t\t\t\tthis.dialect as SQLiteAsyncDialect,\n\t\t\t\tthis.session.extractRawGetValueFromBatchResult.bind(this.session),\n\t\t\t) as DBResult<TResultKind, T>;\n\t\t}\n\t\treturn this.session.get(sequel) as DBResult<TResultKind, T>;\n\t}\n\n\tvalues<T extends unknown[] = unknown[]>(query: SQLWrapper | string): DBResult<TResultKind, T[]> {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteRaw(\n\t\t\t\tasync () => this.session.values(sequel),\n\t\t\t\t() => sequel,\n\t\t\t\t'values',\n\t\t\t\tthis.dialect as SQLiteAsyncDialect,\n\t\t\t\tthis.session.extractRawValuesValueFromBatchResult.bind(this.session),\n\t\t\t) as any;\n\t\t}\n\t\treturn this.session.values(sequel) as DBResult<TResultKind, T[]>;\n\t}\n\n\ttransaction<T>(\n\t\ttransaction: (tx: SQLiteTransaction<TResultKind, TRunResult, TFullSchema, TSchema>) => Result<TResultKind, T>,\n\t\tconfig?: SQLiteTransactionConfig,\n\t): Result<TResultKind, T> {\n\t\treturn this.session.transaction(transaction, config);\n\t}\n}\n\nexport type SQLiteWithReplicas<Q> = Q & { $primary: Q };\n\nexport const withReplicas = <\n\tTResultKind extends 'sync' | 'async',\n\tTRunResult,\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n\tQ extends BaseSQLiteDatabase<\n\t\tTResultKind,\n\t\tTRunResult,\n\t\tTFullSchema,\n\t\tTSchema extends Record<string, unknown> ? ExtractTablesWithRelations<TFullSchema> : TSchema\n\t>,\n>(\n\tprimary: Q,\n\treplicas: [Q, ...Q[]],\n\tgetReplica: (replicas: Q[]) => Q = () => replicas[Math.floor(Math.random() * replicas.length)]!,\n): SQLiteWithReplicas<Q> => {\n\tconst select: Q['select'] = (...args: []) => getReplica(replicas).select(...args);\n\tconst selectDistinct: Q['selectDistinct'] = (...args: []) => getReplica(replicas).selectDistinct(...args);\n\tconst $count: Q['$count'] = (...args: [any]) => getReplica(replicas).$count(...args);\n\tconst $with: Q['with'] = (...args: []) => getReplica(replicas).with(...args);\n\n\tconst update: Q['update'] = (...args: [any]) => primary.update(...args);\n\tconst insert: Q['insert'] = (...args: [any]) => primary.insert(...args);\n\tconst $delete: Q['delete'] = (...args: [any]) => primary.delete(...args);\n\tconst run: Q['run'] = (...args: [any]) => primary.run(...args);\n\tconst all: Q['all'] = (...args: [any]) => primary.all(...args);\n\tconst get: Q['get'] = (...args: [any]) => primary.get(...args);\n\tconst values: Q['values'] = (...args: [any]) => primary.values(...args);\n\tconst transaction: Q['transaction'] = (...args: [any]) => primary.transaction(...args);\n\n\treturn {\n\t\t...primary,\n\t\tupdate,\n\t\tinsert,\n\t\tdelete: $delete,\n\t\trun,\n\t\tall,\n\t\tget,\n\t\tvalues,\n\t\ttransaction,\n\t\t$primary: primary,\n\t\tselect,\n\t\tselectDistinct,\n\t\t$count,\n\t\twith: $with,\n\t\tget query() {\n\t\t\treturn getReplica(replicas).query;\n\t\t},\n\t};\n};\n","import { entityKind } from '~/entity.ts';\nimport type { SQL } from '~/sql/sql.ts';\nimport type { SQLiteColumn } from './columns/index.ts';\nimport type { SQLiteTable } from './table.ts';\n\nexport interface IndexConfig {\n\tname: string;\n\tcolumns: IndexColumn[];\n\tunique: boolean;\n\twhere: SQL | undefined;\n}\n\nexport type IndexColumn = SQLiteColumn | SQL;\n\nexport class IndexBuilderOn {\n\tstatic readonly [entityKind]: string = 'SQLiteIndexBuilderOn';\n\n\tconstructor(private name: string, private unique: boolean) {}\n\n\ton(...columns: [IndexColumn, ...IndexColumn[]]): IndexBuilder {\n\t\treturn new IndexBuilder(this.name, columns, this.unique);\n\t}\n}\n\nexport class IndexBuilder {\n\tstatic readonly [entityKind]: string = 'SQLiteIndexBuilder';\n\n\tdeclare _: {\n\t\tbrand: 'SQLiteIndexBuilder';\n\t};\n\n\t/** @internal */\n\tconfig: IndexConfig;\n\n\tconstructor(name: string, columns: IndexColumn[], unique: boolean) {\n\t\tthis.config = {\n\t\t\tname,\n\t\t\tcolumns,\n\t\t\tunique,\n\t\t\twhere: undefined,\n\t\t};\n\t}\n\n\t/**\n\t * Condition for partial index.\n\t */\n\twhere(condition: SQL): this {\n\t\tthis.config.where = condition;\n\t\treturn this;\n\t}\n\n\t/** @internal */\n\tbuild(table: SQLiteTable): Index {\n\t\treturn new Index(this.config, table);\n\t}\n}\n\nexport class Index {\n\tstatic readonly [entityKind]: string = 'SQLiteIndex';\n\n\tdeclare _: {\n\t\tbrand: 'SQLiteIndex';\n\t};\n\n\treadonly config: IndexConfig & { table: SQLiteTable };\n\n\tconstructor(config: IndexConfig, table: SQLiteTable) {\n\t\tthis.config = { ...config, table };\n\t}\n}\n\nexport function index(name: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(name, false);\n}\n\nexport function uniqueIndex(name: string): IndexBuilderOn {\n\treturn new IndexBuilderOn(name, true);\n}\n","import { entityKind } from '~/entity.ts';\nimport { DrizzleError, TransactionRollbackError } from '~/errors.ts';\nimport type { TablesRelationalConfig } from '~/relations.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport type { Query, SQL } from '~/sql/sql.ts';\nimport type { SQLiteAsyncDialect, SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\n// import { QueryPromise } from '../index.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport { BaseSQLiteDatabase } from './db.ts';\nimport type { SQLiteRaw } from './query-builders/raw.ts';\nimport type { SelectedFieldsOrdered } from './query-builders/select.types.ts';\n\nexport interface PreparedQueryConfig {\n\ttype: 'sync' | 'async';\n\trun: unknown;\n\tall: unknown;\n\tget: unknown;\n\tvalues: unknown;\n\texecute: unknown;\n}\n\nexport class ExecuteResultSync<T> extends QueryPromise<T> {\n\tstatic override readonly [entityKind]: string = 'ExecuteResultSync';\n\n\tconstructor(private resultCb: () => T) {\n\t\tsuper();\n\t}\n\n\toverride async execute(): Promise<T> {\n\t\treturn this.resultCb();\n\t}\n\n\tsync(): T {\n\t\treturn this.resultCb();\n\t}\n}\n\nexport type ExecuteResult<TType extends 'sync' | 'async', TResult> = TType extends 'async' ? Promise<TResult>\n\t: ExecuteResultSync<TResult>;\n\nexport abstract class SQLitePreparedQuery<T extends PreparedQueryConfig> implements PreparedQuery {\n\tstatic readonly [entityKind]: string = 'PreparedQuery';\n\n\t/** @internal */\n\tjoinsNotNullableMap?: Record<string, boolean>;\n\n\tconstructor(\n\t\tprivate mode: 'sync' | 'async',\n\t\tprivate executeMethod: SQLiteExecuteMethod,\n\t\tprotected query: Query,\n\t) {}\n\n\tgetQuery(): Query {\n\t\treturn this.query;\n\t}\n\n\tabstract run(placeholderValues?: Record<string, unknown>): Result<T['type'], T['run']>;\n\n\tmapRunResult(result: unknown, _isFromBatch?: boolean): unknown {\n\t\treturn result;\n\t}\n\n\tabstract all(placeholderValues?: Record<string, unknown>): Result<T['type'], T['all']>;\n\n\tmapAllResult(_result: unknown, _isFromBatch?: boolean): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tabstract get(placeholderValues?: Record<string, unknown>): Result<T['type'], T['get']>;\n\n\tmapGetResult(_result: unknown, _isFromBatch?: boolean): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tabstract values(placeholderValues?: Record<string, unknown>): Result<T['type'], T['values']>;\n\n\texecute(placeholderValues?: Record<string, unknown>): ExecuteResult<T['type'], T['execute']> {\n\t\tif (this.mode === 'async') {\n\t\t\treturn this[this.executeMethod](placeholderValues) as ExecuteResult<T['type'], T['execute']>;\n\t\t}\n\t\treturn new ExecuteResultSync(() => this[this.executeMethod](placeholderValues));\n\t}\n\n\tmapResult(response: unknown, isFromBatch?: boolean) {\n\t\tswitch (this.executeMethod) {\n\t\t\tcase 'run': {\n\t\t\t\treturn this.mapRunResult(response, isFromBatch);\n\t\t\t}\n\t\t\tcase 'all': {\n\t\t\t\treturn this.mapAllResult(response, isFromBatch);\n\t\t\t}\n\t\t\tcase 'get': {\n\t\t\t\treturn this.mapGetResult(response, isFromBatch);\n\t\t\t}\n\t\t}\n\t}\n\n\t/** @internal */\n\tabstract isResponseInArrayMode(): boolean;\n}\n\nexport interface SQLiteTransactionConfig {\n\tbehavior?: 'deferred' | 'immediate' | 'exclusive';\n}\n\nexport type SQLiteExecuteMethod = 'run' | 'all' | 'get';\n\nexport abstract class SQLiteSession<\n\tTResultKind extends 'sync' | 'async',\n\tTRunResult,\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteSession';\n\n\tconstructor(\n\t\t/** @internal */\n\t\treadonly dialect: { sync: SQLiteSyncDialect; async: SQLiteAsyncDialect }[TResultKind],\n\t) {}\n\n\tabstract prepareQuery(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][], mapColumnValue?: (value: unknown) => unknown) => unknown,\n\t): SQLitePreparedQuery<PreparedQueryConfig & { type: TResultKind }>;\n\n\tprepareOneTimeQuery(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t): SQLitePreparedQuery<PreparedQueryConfig & { type: TResultKind }> {\n\t\treturn this.prepareQuery(query, fields, executeMethod, isResponseInArrayMode);\n\t}\n\n\tabstract transaction<T>(\n\t\ttransaction: (tx: SQLiteTransaction<TResultKind, TRunResult, TFullSchema, TSchema>) => Result<TResultKind, T>,\n\t\tconfig?: SQLiteTransactionConfig,\n\t): Result<TResultKind, T>;\n\n\trun(query: SQL): Result<TResultKind, TRunResult> {\n\t\tconst staticQuery = this.dialect.sqlToQuery(query);\n\t\ttry {\n\t\t\treturn this.prepareOneTimeQuery(staticQuery, undefined, 'run', false).run() as Result<TResultKind, TRunResult>;\n\t\t} catch (err) {\n\t\t\tthrow new DrizzleError({ cause: err, message: `Failed to run the query '${staticQuery.sql}'` });\n\t\t}\n\t}\n\n\t/** @internal */\n\textractRawRunValueFromBatchResult(result: unknown) {\n\t\treturn result;\n\t}\n\n\tall<T = unknown>(query: SQL): Result<TResultKind, T[]> {\n\t\treturn this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, 'run', false).all() as Result<\n\t\t\tTResultKind,\n\t\t\tT[]\n\t\t>;\n\t}\n\n\t/** @internal */\n\textractRawAllValueFromBatchResult(_result: unknown): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tget<T = unknown>(query: SQL): Result<TResultKind, T> {\n\t\treturn this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, 'run', false).get() as Result<\n\t\t\tTResultKind,\n\t\t\tT\n\t\t>;\n\t}\n\n\t/** @internal */\n\textractRawGetValueFromBatchResult(_result: unknown): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n\n\tvalues<T extends any[] = unknown[]>(\n\t\tquery: SQL,\n\t): Result<TResultKind, T[]> {\n\t\treturn this.prepareOneTimeQuery(this.dialect.sqlToQuery(query), undefined, 'run', false).values() as Result<\n\t\t\tTResultKind,\n\t\t\tT[]\n\t\t>;\n\t}\n\n\tasync count(sql: SQL) {\n\t\tconst result = await this.values(sql) as [[number]];\n\n\t\treturn result[0][0];\n\t}\n\n\t/** @internal */\n\textractRawValuesValueFromBatchResult(_result: unknown): unknown {\n\t\tthrow new Error('Not implemented');\n\t}\n}\n\nexport type Result<TKind extends 'sync' | 'async', TResult> = { sync: TResult; async: Promise<TResult> }[TKind];\n\nexport type DBResult<TKind extends 'sync' | 'async', TResult> = { sync: TResult; async: SQLiteRaw<TResult> }[TKind];\n\nexport abstract class SQLiteTransaction<\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends BaseSQLiteDatabase<TResultType, TRunResult, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTransaction';\n\n\tconstructor(\n\t\tresultType: TResultType,\n\t\tdialect: { sync: SQLiteSyncDialect; async: SQLiteAsyncDialect }[TResultType],\n\t\tsession: SQLiteSession<TResultType, TRunResult, TFullSchema, TSchema>,\n\t\tprotected schema: {\n\t\t\tfullSchema: Record<string, unknown>;\n\t\t\tschema: TSchema;\n\t\t\ttableNamesMap: Record<string, string>;\n\t\t} | undefined,\n\t\tprotected readonly nestedIndex = 0,\n\t) {\n\t\tsuper(resultType, dialect, session, schema);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n}\n","/// <reference types=\"bun-types\" />\n\nimport type { Database, Statement as BunStatement } from 'bun:sqlite';\nimport { entityKind } from '~/entity.ts';\nimport type { Logger } from '~/logger.ts';\nimport { NoopLogger } from '~/logger.ts';\nimport type { RelationalSchemaConfig, TablesRelationalConfig } from '~/relations.ts';\nimport { fillPlaceholders, type Query, sql } from '~/sql/sql.ts';\nimport type { SQLiteSyncDialect } from '~/sqlite-core/dialect.ts';\nimport { SQLiteTransaction } from '~/sqlite-core/index.ts';\nimport type { SelectedFieldsOrdered } from '~/sqlite-core/query-builders/select.types.ts';\nimport type {\n\tPreparedQueryConfig as PreparedQueryConfigBase,\n\tSQLiteExecuteMethod,\n\tSQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport { SQLitePreparedQuery as PreparedQueryBase, SQLiteSession } from '~/sqlite-core/session.ts';\nimport { mapResultRow } from '~/utils.ts';\n\nexport interface SQLiteBunSessionOptions {\n\tlogger?: Logger;\n}\n\ntype PreparedQueryConfig = Omit<PreparedQueryConfigBase, 'statement' | 'run'>;\ntype Statement = BunStatement<any>;\n\nexport class SQLiteBunSession<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteSession<'sync', void, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBunSession';\n\n\tprivate logger: Logger;\n\n\tconstructor(\n\t\tprivate client: Database,\n\t\tdialect: SQLiteSyncDialect,\n\t\tprivate schema: RelationalSchemaConfig<TSchema> | undefined,\n\t\toptions: SQLiteBunSessionOptions = {},\n\t) {\n\t\tsuper(dialect);\n\t\tthis.logger = options.logger ?? new NoopLogger();\n\t}\n\n\texec(query: string): void {\n\t\tthis.client.exec(query);\n\t}\n\n\tprepareQuery<T extends Omit<PreparedQueryConfig, 'run'>>(\n\t\tquery: Query,\n\t\tfields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tisResponseInArrayMode: boolean,\n\t\tcustomResultMapper?: (rows: unknown[][]) => unknown,\n\t): PreparedQuery<T> {\n\t\tconst stmt = this.client.prepare(query.sql);\n\t\treturn new PreparedQuery(\n\t\t\tstmt,\n\t\t\tquery,\n\t\t\tthis.logger,\n\t\t\tfields,\n\t\t\texecuteMethod,\n\t\t\tisResponseInArrayMode,\n\t\t\tcustomResultMapper,\n\t\t);\n\t}\n\n\toverride transaction<T>(\n\t\ttransaction: (tx: SQLiteBunTransaction<TFullSchema, TSchema>) => T,\n\t\tconfig: SQLiteTransactionConfig = {},\n\t): T {\n\t\tconst tx = new SQLiteBunTransaction('sync', this.dialect, this, this.schema);\n\t\tlet result: T | undefined;\n\t\tconst nativeTx = this.client.transaction(() => {\n\t\t\tresult = transaction(tx);\n\t\t});\n\t\tnativeTx[config.behavior ?? 'deferred']();\n\t\treturn result!;\n\t}\n}\n\nexport class SQLiteBunTransaction<\n\tTFullSchema extends Record<string, unknown>,\n\tTSchema extends TablesRelationalConfig,\n> extends SQLiteTransaction<'sync', void, TFullSchema, TSchema> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBunTransaction';\n\n\toverride transaction<T>(transaction: (tx: SQLiteBunTransaction<TFullSchema, TSchema>) => T): T {\n\t\tconst savepointName = `sp${this.nestedIndex}`;\n\t\tconst tx = new SQLiteBunTransaction('sync', this.dialect, this.session, this.schema, this.nestedIndex + 1);\n\t\tthis.session.run(sql.raw(`savepoint ${savepointName}`));\n\t\ttry {\n\t\t\tconst result = transaction(tx);\n\t\t\tthis.session.run(sql.raw(`release savepoint ${savepointName}`));\n\t\t\treturn result;\n\t\t} catch (err) {\n\t\t\tthis.session.run(sql.raw(`rollback to savepoint ${savepointName}`));\n\t\t\tthrow err;\n\t\t}\n\t}\n}\n\nexport class PreparedQuery<T extends PreparedQueryConfig = PreparedQueryConfig> extends PreparedQueryBase<\n\t{ type: 'sync'; run: void; all: T['all']; get: T['get']; values: T['values']; execute: T['execute'] }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBunPreparedQuery';\n\n\tconstructor(\n\t\tprivate stmt: Statement,\n\t\tquery: Query,\n\t\tprivate logger: Logger,\n\t\tprivate fields: SelectedFieldsOrdered | undefined,\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tprivate _isResponseInArrayMode: boolean,\n\t\tprivate customResultMapper?: (rows: unknown[][]) => unknown,\n\t) {\n\t\tsuper('sync', executeMethod, query);\n\t}\n\n\trun(placeholderValues?: Record<string, unknown>) {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn this.stmt.run(...params);\n\t}\n\n\tall(placeholderValues?: Record<string, unknown>): T['all'] {\n\t\tconst { fields, query, logger, joinsNotNullableMap, stmt, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\tconst params = fillPlaceholders(query.params, placeholderValues ?? {});\n\t\t\tlogger.logQuery(query.sql, params);\n\t\t\treturn stmt.all(...params);\n\t\t}\n\n\t\tconst rows = this.values(placeholderValues) as unknown[][];\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper(rows) as T['all'];\n\t\t}\n\n\t\treturn rows.map((row) => mapResultRow(fields!, row, joinsNotNullableMap));\n\t}\n\n\tget(placeholderValues?: Record<string, unknown>): T['get'] {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\tconst row = this.stmt.values(...params)[0];\n\n\t\tif (!row) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst { fields, joinsNotNullableMap, customResultMapper } = this;\n\t\tif (!fields && !customResultMapper) {\n\t\t\treturn row;\n\t\t}\n\n\t\tif (customResultMapper) {\n\t\t\treturn customResultMapper([row]) as T['get'];\n\t\t}\n\n\t\treturn mapResultRow(fields!, row, joinsNotNullableMap);\n\t}\n\n\tvalues(placeholderValues?: Record<string, unknown>): T['values'] {\n\t\tconst params = fillPlaceholders(this.query.params, placeholderValues ?? {});\n\t\tthis.logger.logQuery(this.query.sql, params);\n\t\treturn this.stmt.values(...params);\n\t}\n\n\t/** @internal */\n\tisResponseInArrayMode(): boolean {\n\t\treturn this._isResponseInArrayMode;\n\t}\n}\n","import crypto from 'node:crypto';\nimport fs from 'node:fs';\n\nexport interface KitConfig {\n\tout: string;\n\tschema: string;\n}\n\nexport interface MigrationConfig {\n\tmigrationsFolder: string;\n\tmigrationsTable?: string;\n\tmigrationsSchema?: string;\n}\n\nexport interface MigrationMeta {\n\tsql: string[];\n\tfolderMillis: number;\n\thash: string;\n\tbps: boolean;\n}\n\nexport function readMigrationFiles(config: MigrationConfig): MigrationMeta[] {\n\tconst migrationFolderTo = config.migrationsFolder;\n\n\tconst migrationQueries: MigrationMeta[] = [];\n\n\tconst journalPath = `${migrationFolderTo}/meta/_journal.json`;\n\tif (!fs.existsSync(journalPath)) {\n\t\tthrow new Error(`Can't find meta/_journal.json file`);\n\t}\n\n\tconst journalAsString = fs.readFileSync(`${migrationFolderTo}/meta/_journal.json`).toString();\n\n\tconst journal = JSON.parse(journalAsString) as {\n\t\tentries: { idx: number; when: number; tag: string; breakpoints: boolean }[];\n\t};\n\n\tfor (const journalEntry of journal.entries) {\n\t\tconst migrationPath = `${migrationFolderTo}/${journalEntry.tag}.sql`;\n\n\t\ttry {\n\t\t\tconst query = fs.readFileSync(`${migrationFolderTo}/${journalEntry.tag}.sql`).toString();\n\n\t\t\tconst result = query.split('--> statement-breakpoint').map((it) => {\n\t\t\t\treturn it;\n\t\t\t});\n\n\t\t\tmigrationQueries.push({\n\t\t\t\tsql: result,\n\t\t\t\tbps: journalEntry.breakpoints,\n\t\t\t\tfolderMillis: journalEntry.when,\n\t\t\t\thash: crypto.createHash('sha256').update(query).digest('hex'),\n\t\t\t});\n\t\t} catch {\n\t\t\tthrow new Error(`No file ${migrationPath} found in ${migrationFolderTo} folder`);\n\t\t}\n\t}\n\n\treturn migrationQueries;\n}\n","import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { BunSQLiteDatabase } from './driver.ts';\n\nexport function migrate<TSchema extends Record<string, unknown>>(\n\tdb: BunSQLiteDatabase<TSchema>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\tdb.dialect.migrate(migrations, db.session, config);\n}\n","// 任务表 Schema\n// 用于存储 AI Agent 的通用任务队列\n\nimport { index, sqliteTable, text, integer } from 'drizzle-orm/sqlite-core';\n\nexport const tasks = sqliteTable('tasks', {\n id: integer('id').primaryKey({ autoIncrement: true }),\n\n // 任务配置\n name: text('name').notNull(),\n agent: text('agent').notNull(),\n model: text('model').default('default'),\n prompt: text('prompt').notNull(),\n cwd: text('cwd'),\n\n // 分类与优先级\n category: text('category').default('general'),\n importance: integer('importance').default(3),\n urgency: integer('urgency').default(3),\n\n // 任务分组与依赖\n batchId: text('batch_id'),\n dependsOn: integer('depends_on'),\n\n // 状态\n status: text('status').default('pending'),\n\n // 时间戳(老字段保持秒级 timestamp)\n createdAt: integer('created_at', { mode: 'timestamp' })\n .$defaultFn(() => new Date()),\n startedAt: integer('started_at', { mode: 'timestamp' }),\n finishedAt: integer('finished_at', { mode: 'timestamp' }),\n\n // 执行结果\n resultLog: text('result_log'),\n retryCount: integer('retry_count').default(0),\n maxRetries: integer('max_retries').default(3),\n retryBackoffMs: integer('retry_backoff_ms').default(30000),\n\n // Gateway 扩展字段(毫秒)\n retryAfter: integer('retry_after'),\n timeoutMs: integer('timeout_ms'),\n templateId: integer('template_id'),\n scheduledAt: integer('scheduled_at'),\n}, (table) => [\n index('tasks_queue_idx').on(table.status, table.retryAfter, table.urgency, table.importance, table.createdAt, table.id),\n index('tasks_batch_status_idx').on(table.batchId, table.status),\n index('tasks_template_status_idx').on(table.templateId, table.status),\n index('tasks_depends_on_status_idx').on(table.dependsOn, table.status),\n index('tasks_cleanup_idx').on(table.finishedAt, table.id, table.status),\n]);\n\nexport type Task = typeof tasks.$inferSelect;\nexport type NewTask = typeof tasks.$inferInsert;\nexport type TaskStatus = 'pending' | 'running' | 'done' | 'failed' | 'dead_letter' | 'cancelled';\n\nexport const TASK_CATEGORIES = [\n 'translate',\n 'generate',\n 'review',\n 'test',\n 'general',\n] as const;\n\nexport const taskRuns = sqliteTable('task_runs', {\n id: integer('id').primaryKey({ autoIncrement: true }),\n taskId: integer('task_id').notNull().references(() => tasks.id, { onDelete: 'cascade' }),\n\n sessionId: text('session_id'),\n model: text('model'),\n status: text('status').default('running'),\n\n startedAt: integer('started_at', { mode: 'timestamp' })\n .$defaultFn(() => new Date()),\n finishedAt: integer('finished_at', { mode: 'timestamp' }),\n\n log: text('log'),\n\n // Gateway 运行时态字段(毫秒)\n lockedAt: integer('locked_at'),\n lockedBy: text('locked_by'),\n heartbeatAt: integer('heartbeat_at'),\n workerPid: integer('worker_pid'),\n childPid: integer('child_pid'),\n launchProtocol: text('launch_protocol'),\n}, (table) => [\n index('task_runs_task_started_idx').on(table.taskId, table.startedAt, table.id),\n index('task_runs_status_heartbeat_idx').on(table.status, table.heartbeatAt),\n]);\n\nexport type TaskRun = typeof taskRuns.$inferSelect;\nexport type NewTaskRun = typeof taskRuns.$inferInsert;\nexport type TaskRunStatus = 'running' | 'done' | 'failed';\n\nexport const taskTemplates = sqliteTable('task_templates', {\n id: integer('id').primaryKey({ autoIncrement: true }),\n name: text('name').notNull(),\n agent: text('agent').notNull(),\n model: text('model').default('default'),\n prompt: text('prompt').notNull(),\n cwd: text('cwd'),\n category: text('category').default('general'),\n importance: integer('importance').default(3),\n urgency: integer('urgency').default(3),\n batchId: text('batch_id'),\n\n scheduleType: text('schedule_type').notNull(),\n cronExpr: text('cron_expr'),\n intervalMs: integer('interval_ms'),\n runAt: integer('run_at'),\n\n maxInstances: integer('max_instances').default(1),\n maxRetries: integer('max_retries').default(3),\n retryBackoffMs: integer('retry_backoff_ms').default(30000),\n timeoutMs: integer('timeout_ms'),\n lastRunAt: integer('last_run_at'),\n nextRunAt: integer('next_run_at'),\n enabled: integer('enabled', { mode: 'boolean' }).default(true),\n\n createdAt: integer('created_at').default(0),\n updatedAt: integer('updated_at').default(0),\n}, (table) => [\n index('task_templates_due_idx').on(table.enabled, table.nextRunAt, table.id),\n index('task_templates_retention_idx').on(\n table.scheduleType,\n table.enabled,\n table.lastRunAt,\n table.id,\n ),\n]);\n\nexport type TaskTemplate = typeof taskTemplates.$inferSelect;\nexport type NewTaskTemplate = typeof taskTemplates.$inferInsert;\nexport type ScheduleType = 'cron' | 'delayed' | 'recurring';\n","const MAX_BACKOFF_MS = 30 * 60 * 1000;\n\nexport function computeBackoff(\n retryCount: number,\n baseMs = 30000,\n maxMs = MAX_BACKOFF_MS,\n): number {\n return Math.min(baseMs * Math.pow(2, retryCount - 1), maxMs);\n}\n","import { statSync } from 'fs';\nimport { isAbsolute } from 'path';\n\nexport class InvalidTaskWorkingDirectoryError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidTaskWorkingDirectoryError';\n }\n}\n\nexport function validateTaskWorkingDirectory(cwd: string | null | undefined): void {\n if (cwd == null) return;\n if (!cwd.trim()) {\n throw new InvalidTaskWorkingDirectoryError('任务工作目录不能为空');\n }\n if (!isAbsolute(cwd)) {\n throw new InvalidTaskWorkingDirectoryError(`任务工作目录必须是绝对路径:${cwd}`);\n }\n\n let stat: ReturnType<typeof statSync>;\n try {\n stat = statSync(cwd);\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n throw new InvalidTaskWorkingDirectoryError(`任务工作目录不存在或无法访问:${cwd}(${detail})`);\n }\n if (!stat.isDirectory()) {\n throw new InvalidTaskWorkingDirectoryError(`任务工作目录不是目录:${cwd}`);\n }\n}\n","// SQLite trim() defaults to U+0020 only. Keep database compatibility queries\n// aligned with ECMAScript String.trim() for legacy, unnormalized rows.\nexport const TASK_BATCH_TRIM_CHARACTERS = ' \\t\\n\\v\\f\\r\\u00a0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff';\n\nexport function normalizeTaskBatchId(\n batchId: string | null | undefined,\n): string | null | undefined {\n if (batchId == null) return batchId;\n return batchId.trim() || null;\n}\n","// 任务服务层\n// 封装所有任务相关的 CRUD 操作\n\nimport { db, getSqlite, schema } from '@core/db';\nimport { eq, and, desc, asc, sql, isNull, or } from 'drizzle-orm';\nimport type { Task, NewTask, TaskStatus } from '@core/db/schema';\nimport { computeBackoff } from '@core/backoff';\nimport { validateTaskWorkingDirectory } from '@core/task-working-directory';\nimport {\n normalizeTaskBatchId,\n TASK_BATCH_TRIM_CHARACTERS,\n} from '@core/task-batch';\n\nconst { tasks, taskRuns } = schema;\nlet cleanupInvocation = 0;\n\nexport interface TaskProjectSummary {\n cwd: string;\n total: number;\n pending: number;\n running: number;\n failed: number;\n done: number;\n lastCreatedAt: number | null;\n}\n\nexport interface EditableTaskUpdate {\n name?: string;\n agent?: string;\n model?: string;\n prompt?: string;\n category?: string;\n importance?: number;\n urgency?: number;\n batchId?: string | null;\n maxRetries?: number;\n retryBackoffMs?: number;\n timeoutMs?: number | null;\n}\n\nexport class TaskDeletionConflictError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'TaskDeletionConflictError';\n }\n}\n\nfunction hasNoExecutableDependents() {\n return sql`NOT EXISTS (\n SELECT 1 FROM tasks AS dependent_task\n WHERE dependent_task.depends_on = ${tasks.id}\n AND dependent_task.status IN ('pending', 'running', 'failed', 'dead_letter')\n )`;\n}\n\nfunction hasViableDependency() {\n return or(\n isNull(tasks.dependsOn),\n sql`EXISTS (\n SELECT 1 FROM tasks AS dependency_task\n WHERE dependency_task.id = ${tasks.dependsOn}\n AND dependency_task.cwd IS ${tasks.cwd}\n AND (\n dependency_task.status IN ('pending', 'running', 'done')\n OR (\n dependency_task.status = 'failed'\n AND dependency_task.retry_count <= dependency_task.max_retries\n )\n )\n )`,\n );\n}\n\nfunction blockedDependentsOf(prerequisiteId: number) {\n return sql`${tasks.id} IN (\n WITH RECURSIVE blocked_task(id) AS (\n SELECT direct_dependent.id\n FROM tasks AS direct_dependent\n WHERE direct_dependent.depends_on = ${prerequisiteId}\n AND direct_dependent.status IN ('pending', 'failed')\n AND EXISTS (\n SELECT 1 FROM tasks AS prerequisite\n WHERE prerequisite.id = ${prerequisiteId}\n AND prerequisite.status IN ('dead_letter', 'cancelled')\n )\n UNION\n SELECT descendant.id\n FROM tasks AS descendant\n INNER JOIN blocked_task ON descendant.depends_on = blocked_task.id\n WHERE descendant.status IN ('pending', 'failed')\n )\n SELECT id FROM blocked_task\n )`;\n}\n\nexport class TaskService {\n private static buildScopeWhere(scope?: { cwd?: string }) {\n const conditions: Array<ReturnType<typeof eq>> = [];\n if (scope?.cwd !== undefined) {\n conditions.push(eq(tasks.cwd, scope.cwd));\n }\n return conditions;\n }\n\n static async add(data: NewTask): Promise<Task> {\n const normalizedData = {\n ...data,\n batchId: normalizeTaskBatchId(data.batchId),\n };\n this.validateNewTask(normalizedData);\n return db.transaction((tx) => {\n if (normalizedData.dependsOn != null) {\n const dependency = tx\n .select({\n id: tasks.id,\n cwd: tasks.cwd,\n status: tasks.status,\n retryCount: tasks.retryCount,\n maxRetries: tasks.maxRetries,\n })\n .from(tasks)\n .where(eq(tasks.id, normalizedData.dependsOn))\n .get();\n if (!dependency) {\n throw new Error(`dependsOn 指向的任务 #${normalizedData.dependsOn} 不存在`);\n }\n if ((dependency.cwd ?? null) !== (normalizedData.cwd ?? null)) {\n throw new Error('dependsOn 必须指向同一 cwd 的任务');\n }\n const dependencyIsRecoverable = dependency.status === 'pending'\n || dependency.status === 'running'\n || dependency.status === 'done'\n || (\n dependency.status === 'failed'\n && (dependency.retryCount ?? 0) <= (dependency.maxRetries ?? 3)\n );\n if (!dependencyIsRecoverable) {\n throw new Error(`dependsOn 指向的任务 #${normalizedData.dependsOn} 已进入不可恢复终态`);\n }\n }\n return tx.insert(tasks).values(normalizedData).returning().get();\n }, { behavior: 'immediate' });\n }\n\n static async update(\n id: number,\n data: EditableTaskUpdate,\n scope: { cwd?: string } = {},\n ): Promise<Task | null> {\n if (Object.keys(data).length === 0) throw new Error('至少提供一个要修改的字段');\n const normalizedData: EditableTaskUpdate = data.batchId === undefined\n ? data\n : { ...data, batchId: normalizeTaskBatchId(data.batchId) ?? null };\n return db.transaction((tx) => {\n const task = tx.select().from(tasks).where(and(\n eq(tasks.id, id),\n sql`${tasks.status} IN ('pending', 'failed', 'dead_letter')`,\n ...this.buildScopeWhere(scope),\n )).get();\n if (!task) return null;\n\n this.validateNewTask({\n name: normalizedData.name ?? task.name,\n agent: normalizedData.agent ?? task.agent,\n model: normalizedData.model ?? task.model,\n prompt: normalizedData.prompt ?? task.prompt,\n cwd: task.cwd,\n category: normalizedData.category ?? task.category,\n importance: normalizedData.importance ?? task.importance,\n urgency: normalizedData.urgency ?? task.urgency,\n batchId: normalizedData.batchId === undefined ? task.batchId : normalizedData.batchId,\n maxRetries: normalizedData.maxRetries ?? task.maxRetries,\n retryBackoffMs: normalizedData.retryBackoffMs ?? task.retryBackoffMs,\n timeoutMs: normalizedData.timeoutMs === undefined ? task.timeoutMs : normalizedData.timeoutMs,\n dependsOn: task.dependsOn,\n });\n const maxRetries = normalizedData.maxRetries ?? task.maxRetries ?? 3;\n const exhausted = task.status === 'failed' && (task.retryCount ?? 0) > maxRetries;\n return tx.update(tasks).set({\n ...normalizedData,\n ...(exhausted ? {\n status: 'dead_letter',\n retryAfter: null,\n } : {}),\n }).where(eq(tasks.id, id)).returning().get() ?? null;\n }, { behavior: 'immediate' });\n }\n\n private static validateNewTask(data: NewTask): void {\n if (!data.name.trim()) throw new Error('name 不能为空');\n if (!data.agent.trim()) throw new Error('agent 不能为空');\n if (!data.prompt.trim()) throw new Error('prompt 不能为空');\n validateTaskWorkingDirectory(data.cwd);\n this.validateInteger('importance', data.importance, 1, 5);\n this.validateInteger('urgency', data.urgency, 1, 5);\n this.validateInteger('maxRetries', data.maxRetries, 0, 1000);\n this.validateInteger('retryBackoffMs', data.retryBackoffMs, 0, 86_400_000);\n this.validateInteger('timeoutMs', data.timeoutMs, 1000, 604_800_000);\n this.validateInteger('dependsOn', data.dependsOn, 1, Number.MAX_SAFE_INTEGER);\n }\n\n private static validateInteger(\n name: string,\n value: number | null | undefined,\n min: number,\n max: number,\n ): void {\n if (value === undefined || value === null) return;\n if (!Number.isInteger(value) || value < min || value > max) {\n throw new Error(`${name} 必须是 ${min} 到 ${max} 之间的整数`);\n }\n }\n\n static async next(\n scope: { cwd?: string; excludedBatchIds?: string[] } = {},\n ): Promise<Task | null> {\n const baseConditions = [...this.buildScopeWhere(scope)];\n const nowMs = Date.now();\n const retryAfterFilter = or(\n isNull(tasks.retryAfter),\n sql`${tasks.retryAfter} <= ${nowMs}`,\n );\n\n const excludedBatchIds = [...new Set((scope.excludedBatchIds ?? [])\n .map((batchId) => normalizeTaskBatchId(batchId))\n .filter((batchId): batchId is string => Boolean(batchId)))];\n const hasExcludedBatches = excludedBatchIds.length > 0;\n let batchFilter: ReturnType<typeof sql> | undefined;\n if (hasExcludedBatches) {\n batchFilter = or(\n isNull(tasks.batchId),\n sql`trim(${tasks.batchId}, ${TASK_BATCH_TRIM_CHARACTERS}) = ''`,\n sql`trim(${tasks.batchId}, ${TASK_BATCH_TRIM_CHARACTERS}) NOT IN ${excludedBatchIds}`,\n );\n }\n\n const statusConditions = or(\n and(\n eq(tasks.status, 'pending'),\n retryAfterFilter,\n ),\n and(\n eq(tasks.status, 'failed'),\n sql`${tasks.retryCount} <= ${tasks.maxRetries}`,\n retryAfterFilter,\n ),\n );\n\n const conditions = [\n statusConditions,\n ...baseConditions,\n ];\n if (batchFilter) {\n conditions.push(batchFilter);\n }\n\n const result = await db\n .select()\n .from(tasks)\n .where(and(\n ...conditions,\n or(\n isNull(tasks.dependsOn),\n sql`EXISTS (\n SELECT 1 FROM tasks AS dependency_task\n WHERE dependency_task.id = ${tasks.dependsOn}\n AND dependency_task.status = 'done'\n AND dependency_task.cwd IS ${tasks.cwd}\n )`,\n ),\n or(\n isNull(tasks.batchId),\n sql`trim(${tasks.batchId}, ${TASK_BATCH_TRIM_CHARACTERS}) = ''`,\n sql`NOT EXISTS (\n SELECT 1 FROM tasks AS running_batch_task\n WHERE trim(running_batch_task.batch_id, ${TASK_BATCH_TRIM_CHARACTERS})\n = trim(${tasks.batchId}, ${TASK_BATCH_TRIM_CHARACTERS})\n AND (\n running_batch_task.status = 'running'\n OR EXISTS (\n SELECT 1 FROM task_runs AS running_batch_run\n WHERE running_batch_run.task_id = running_batch_task.id\n AND running_batch_run.status = 'running'\n )\n )\n )`,\n ),\n sql`NOT EXISTS (\n SELECT 1 FROM task_runs AS candidate_active_run\n WHERE candidate_active_run.task_id = ${tasks.id}\n AND candidate_active_run.status = 'running'\n )`,\n ))\n .orderBy(\n desc(tasks.urgency),\n desc(tasks.importance),\n asc(tasks.createdAt),\n asc(tasks.id),\n )\n .limit(1);\n\n return result[0] ?? null;\n }\n\n static async countRunning(\n scope: { cwd?: string; legacyCwd?: boolean; batchId?: string } = {},\n ): Promise<number> {\n const scopeConditions = scope.legacyCwd\n ? [sql`${tasks.cwd} IS NULL OR trim(${tasks.cwd}) = ''`]\n : this.buildScopeWhere(scope);\n if (scope.batchId !== undefined) {\n const batchId = normalizeTaskBatchId(scope.batchId);\n scopeConditions.push(batchId\n ? sql`trim(${tasks.batchId}, ${TASK_BATCH_TRIM_CHARACTERS}) = ${batchId}`\n : sql`0`);\n }\n return db.transaction((tx) => {\n const runningTasks = tx\n .select({ count: sql<number>`count(*)` })\n .from(tasks)\n .where(and(eq(tasks.status, 'running'), ...scopeConditions))\n .get();\n const runsWithoutRunningTask = tx\n .select({ count: sql<number>`count(DISTINCT ${taskRuns.taskId})` })\n .from(taskRuns)\n .innerJoin(tasks, eq(tasks.id, taskRuns.taskId))\n .where(and(\n eq(taskRuns.status, 'running'),\n sql`${tasks.status} <> 'running'`,\n ...scopeConditions,\n ))\n .get();\n return Number(runningTasks?.count ?? 0) + Number(runsWithoutRunningTask?.count ?? 0);\n }, { behavior: 'deferred' });\n }\n\n static async start(id: number, scope: { cwd?: string } = {}): Promise<Task | null> {\n const conditions = [\n eq(tasks.id, id),\n or(\n eq(tasks.status, 'pending'),\n and(\n eq(tasks.status, 'failed'),\n sql`${tasks.retryCount} <= ${tasks.maxRetries}`,\n ),\n ),\n ...this.buildScopeWhere(scope),\n ];\n const result = await db\n .update(tasks)\n .set({\n status: 'running',\n startedAt: new Date(),\n finishedAt: null,\n })\n .where(and(...conditions))\n .returning();\n return result[0] || null;\n }\n\n static async done(\n id: number,\n log?: string,\n scope: { cwd?: string } = {},\n ): Promise<Task | null> {\n const conditions = [\n eq(tasks.id, id),\n eq(tasks.status, 'running'),\n ...this.buildScopeWhere(scope),\n ];\n const result = await db\n .update(tasks)\n .set({\n status: 'done',\n finishedAt: new Date(),\n resultLog: log,\n retryAfter: null,\n })\n .where(and(...conditions))\n .returning();\n return result[0] || null;\n }\n\n static async fail(\n id: number,\n log?: string,\n scope: { cwd?: string } = {},\n options?: { setDeadLetter?: boolean; retryAfterMs?: number },\n ): Promise<Task | null> {\n return db.transaction((tx) => {\n const current = tx\n .select()\n .from(tasks)\n .where(and(\n eq(tasks.id, id),\n eq(tasks.status, 'running'),\n ...this.buildScopeWhere(scope),\n ))\n .get();\n if (!current) return null;\n\n const newRetryCount = (current.retryCount ?? 0) + 1;\n const maxRetries = current.maxRetries ?? 3;\n const isDeadLetter = options?.setDeadLetter ?? newRetryCount > maxRetries;\n const failed = tx\n .update(tasks)\n .set({\n status: isDeadLetter ? 'dead_letter' : 'failed',\n finishedAt: new Date(),\n resultLog: log,\n retryCount: newRetryCount,\n retryAfter: isDeadLetter\n ? null\n : (options?.retryAfterMs ?? Date.now() + computeBackoff(\n newRetryCount,\n current.retryBackoffMs ?? 30000,\n )),\n })\n .where(and(eq(tasks.id, id), eq(tasks.status, 'running')))\n .returning()\n .get();\n if (failed?.status === 'dead_letter') {\n tx.update(tasks)\n .set({\n status: 'dead_letter',\n finishedAt: new Date(),\n retryAfter: null,\n resultLog: `依赖任务 #${id} 已进入不可恢复终态`,\n })\n .where(blockedDependentsOf(id))\n .run();\n }\n return failed ?? null;\n }, { behavior: 'immediate' });\n }\n\n static async completeRun(taskId: number, runId: number, log?: string): Promise<Task | null> {\n return db.transaction((tx) => {\n const currentTask = tx\n .select()\n .from(tasks)\n .where(and(eq(tasks.id, taskId), eq(tasks.status, 'running')))\n .get();\n const currentRun = tx\n .select({ id: taskRuns.id })\n .from(taskRuns)\n .where(and(\n eq(taskRuns.id, runId),\n eq(taskRuns.taskId, taskId),\n eq(taskRuns.status, 'running'),\n ))\n .get();\n if (!currentTask || !currentRun) return null;\n\n const finishedAt = new Date();\n const completed = tx\n .update(tasks)\n .set({\n status: 'done',\n finishedAt,\n resultLog: log,\n retryAfter: null,\n })\n .where(and(eq(tasks.id, taskId), eq(tasks.status, 'running')))\n .returning()\n .get();\n if (!completed) return null;\n\n tx.update(taskRuns)\n .set({ status: 'done', finishedAt, log })\n .where(and(eq(taskRuns.id, runId), eq(taskRuns.status, 'running')))\n .run();\n return completed;\n }, { behavior: 'immediate' });\n }\n\n static async failRun(\n taskId: number,\n runId: number,\n log?: string,\n options?: { setDeadLetter?: boolean; retryAfterMs?: number },\n ): Promise<Task | null> {\n const failed = db.transaction((tx) => {\n const currentTask = tx\n .select()\n .from(tasks)\n .where(and(eq(tasks.id, taskId), eq(tasks.status, 'running')))\n .get();\n const currentRun = tx\n .select({ id: taskRuns.id })\n .from(taskRuns)\n .where(and(\n eq(taskRuns.id, runId),\n eq(taskRuns.taskId, taskId),\n eq(taskRuns.status, 'running'),\n ))\n .get();\n if (!currentTask || !currentRun) return null;\n\n const newRetryCount = (currentTask.retryCount ?? 0) + 1;\n const maxRetries = currentTask.maxRetries ?? 3;\n const isDeadLetter = options?.setDeadLetter ?? newRetryCount > maxRetries;\n const finishedAt = new Date();\n const retryAfter = isDeadLetter\n ? null\n : (options?.retryAfterMs ?? Date.now() + computeBackoff(\n newRetryCount,\n currentTask.retryBackoffMs ?? 30000,\n ));\n\n const failed = tx\n .update(tasks)\n .set({\n status: isDeadLetter ? 'dead_letter' : 'failed',\n finishedAt,\n resultLog: log,\n retryCount: newRetryCount,\n retryAfter,\n })\n .where(and(eq(tasks.id, taskId), eq(tasks.status, 'running')))\n .returning()\n .get();\n if (!failed) return null;\n\n tx.update(taskRuns)\n .set({ status: 'failed', finishedAt, log })\n .where(and(eq(taskRuns.id, runId), eq(taskRuns.status, 'running')))\n .run();\n if (failed.status === 'dead_letter') {\n tx.update(tasks)\n .set({\n status: 'dead_letter',\n finishedAt,\n retryAfter: null,\n resultLog: `依赖任务 #${taskId} 已进入不可恢复终态`,\n })\n .where(blockedDependentsOf(taskId))\n .run();\n }\n return failed;\n }, { behavior: 'immediate' });\n return failed;\n }\n\n static async recoverRun(\n taskId: number,\n runId: number,\n log: string,\n ): Promise<{ status: 'pending' | 'dead_letter'; retryCount: number; retryAfterMs: number | null } | null> {\n const recovery = db.transaction((tx) => {\n const currentTask = tx\n .select()\n .from(tasks)\n .where(and(eq(tasks.id, taskId), eq(tasks.status, 'running')))\n .get();\n const currentRun = tx\n .select({ id: taskRuns.id })\n .from(taskRuns)\n .where(and(\n eq(taskRuns.id, runId),\n eq(taskRuns.taskId, taskId),\n eq(taskRuns.status, 'running'),\n ))\n .get();\n if (!currentRun) return null;\n\n const finishedAt = new Date();\n tx.update(taskRuns)\n .set({ status: 'failed', finishedAt, log })\n .where(and(eq(taskRuns.id, runId), eq(taskRuns.status, 'running')))\n .run();\n\n if (!currentTask) return null;\n const retryCount = (currentTask.retryCount ?? 0) + 1;\n const maxRetries = currentTask.maxRetries ?? 3;\n const isDeadLetter = retryCount > maxRetries;\n const recoveryStatus: 'pending' | 'dead_letter' = isDeadLetter ? 'dead_letter' : 'pending';\n const retryAfterMs = isDeadLetter\n ? null\n : Date.now() + computeBackoff(\n retryCount,\n currentTask.retryBackoffMs ?? 30000,\n );\n\n tx.update(tasks)\n .set({\n status: recoveryStatus,\n startedAt: null,\n finishedAt: isDeadLetter ? finishedAt : null,\n retryCount,\n retryAfter: retryAfterMs,\n resultLog: log,\n })\n .where(and(eq(tasks.id, taskId), eq(tasks.status, 'running')))\n .run();\n if (recoveryStatus === 'dead_letter') {\n tx.update(tasks)\n .set({\n status: 'dead_letter',\n finishedAt,\n retryAfter: null,\n resultLog: `依赖任务 #${taskId} 已进入不可恢复终态`,\n })\n .where(blockedDependentsOf(taskId))\n .run();\n }\n return {\n status: recoveryStatus,\n retryCount,\n retryAfterMs,\n };\n }, { behavior: 'immediate' });\n return recovery;\n }\n\n static async interruptRun(\n taskId: number,\n runId: number,\n log: string,\n ): Promise<boolean> {\n return db.transaction((tx) => {\n const currentRun = tx\n .select({ id: taskRuns.id })\n .from(taskRuns)\n .where(and(\n eq(taskRuns.id, runId),\n eq(taskRuns.taskId, taskId),\n eq(taskRuns.status, 'running'),\n ))\n .get();\n if (!currentRun) return false;\n\n const updatedRun = tx.update(taskRuns)\n .set({ status: 'failed', finishedAt: new Date(), log })\n .where(and(eq(taskRuns.id, runId), eq(taskRuns.status, 'running')))\n .returning({ id: taskRuns.id })\n .get();\n tx.update(tasks)\n .set({\n status: 'pending',\n startedAt: null,\n finishedAt: null,\n retryAfter: null,\n resultLog: log,\n })\n .where(and(eq(tasks.id, taskId), eq(tasks.status, 'running')))\n .run();\n return updatedRun != null;\n }, { behavior: 'immediate' });\n }\n\n static async resolveBlockedDependencies(): Promise<number> {\n const finishedAt = new Date();\n const result = await db\n .update(tasks)\n .set({\n status: 'dead_letter',\n finishedAt,\n retryAfter: null,\n resultLog: '依赖任务不存在、跨项目或已进入不可恢复终态',\n })\n .where(sql`${tasks.id} IN (\n WITH RECURSIVE blocked_task(id) AS (\n SELECT candidate.id\n FROM tasks AS candidate\n WHERE candidate.status IN ('pending', 'failed')\n AND candidate.depends_on IS NOT NULL\n AND NOT EXISTS (\n SELECT 1 FROM tasks AS viable_dependency\n WHERE viable_dependency.id = candidate.depends_on\n AND viable_dependency.cwd IS candidate.cwd\n AND (\n viable_dependency.status IN ('pending', 'running', 'done')\n OR (\n viable_dependency.status = 'failed'\n AND viable_dependency.retry_count <= viable_dependency.max_retries\n )\n )\n )\n UNION\n SELECT descendant.id\n FROM tasks AS descendant\n INNER JOIN blocked_task ON descendant.depends_on = blocked_task.id\n WHERE descendant.status IN ('pending', 'failed')\n )\n SELECT id FROM blocked_task\n )`)\n .returning();\n return result.length;\n }\n\n static async rejectBlockedDependents(prerequisiteId: number): Promise<number> {\n const result = await db\n .update(tasks)\n .set({\n status: 'dead_letter',\n finishedAt: new Date(),\n retryAfter: null,\n resultLog: `依赖任务 #${prerequisiteId} 已进入不可恢复终态`,\n })\n .where(blockedDependentsOf(prerequisiteId))\n .returning({ id: tasks.id });\n return result.length;\n }\n\n static async markPendingForRetry(\n id: number,\n retryAfterMs: number,\n retryCount: number,\n ): Promise<Task | null> {\n const result = await db\n .update(tasks)\n .set({\n status: 'pending',\n startedAt: null,\n finishedAt: null,\n retryAfter: retryAfterMs,\n retryCount,\n })\n .where(eq(tasks.id, id))\n .returning();\n return result[0] || null;\n }\n\n static async markDeadLetter(id: number, retryCount: number): Promise<Task | null> {\n return db.transaction((tx) => {\n const finishedAt = new Date();\n const task = tx\n .update(tasks)\n .set({ status: 'dead_letter', finishedAt, retryCount })\n .where(eq(tasks.id, id))\n .returning()\n .get();\n if (!task) return null;\n tx.update(tasks)\n .set({\n status: 'dead_letter',\n finishedAt,\n retryAfter: null,\n resultLog: `依赖任务 #${id} 已进入不可恢复终态`,\n })\n .where(blockedDependentsOf(id))\n .run();\n return task;\n }, { behavior: 'immediate' });\n }\n\n static async resetRunningToPending(ids: number[]): Promise<number> {\n if (ids.length === 0) return 0;\n const result = await db\n .update(tasks)\n .set({\n status: 'pending',\n startedAt: null,\n finishedAt: null,\n })\n .where(\n and(\n sql`${tasks.id} IN ${ids}`,\n eq(tasks.status, 'running'),\n ),\n )\n .returning();\n return result.length;\n }\n\n static async resetOrphanRunningToPending(): Promise<number> {\n const result = await db\n .update(tasks)\n .set({\n status: 'pending',\n startedAt: null,\n finishedAt: null,\n })\n .where(\n and(\n eq(tasks.status, 'running'),\n sql`NOT EXISTS (\n SELECT 1 FROM ${taskRuns}\n WHERE ${taskRuns.taskId} = ${tasks.id}\n AND ${taskRuns.status} = 'running'\n )`,\n ),\n )\n .returning();\n return result.length;\n }\n\n static async cancel(id: number, scope: { cwd?: string } = {}): Promise<Task | null> {\n const conditions = [\n eq(tasks.id, id),\n or(\n eq(tasks.status, 'pending'),\n eq(tasks.status, 'running'),\n eq(tasks.status, 'failed'),\n ),\n ...this.buildScopeWhere(scope),\n ];\n return db.transaction((tx) => {\n const finishedAt = new Date();\n const task = tx\n .update(tasks)\n .set({\n status: 'cancelled',\n finishedAt,\n retryAfter: null,\n })\n .where(and(...conditions))\n .returning()\n .get();\n if (!task) return null;\n tx.update(tasks)\n .set({\n status: 'dead_letter',\n finishedAt,\n retryAfter: null,\n resultLog: `依赖任务 #${id} 已进入不可恢复终态`,\n })\n .where(blockedDependentsOf(id))\n .run();\n return task;\n }, { behavior: 'immediate' });\n }\n\n static async retry(id: number, scope: { cwd?: string } = {}): Promise<Task | null> {\n const conditions = [\n eq(tasks.id, id),\n or(eq(tasks.status, 'failed'), eq(tasks.status, 'dead_letter')),\n ...this.buildScopeWhere(scope),\n ];\n return db.transaction((tx) => tx\n .update(tasks)\n .set({\n status: 'pending',\n startedAt: null,\n finishedAt: null,\n retryAfter: null,\n retryCount: 0,\n })\n .where(and(...conditions, hasViableDependency()))\n .returning()\n .get() ?? null, { behavior: 'immediate' });\n }\n\n static async retryBatch(batchId: string, scope: { cwd?: string } = {}): Promise<number> {\n const normalizedBatchId = normalizeTaskBatchId(batchId);\n if (!normalizedBatchId) return 0;\n const sqlite = getSqlite();\n const scopeFilter = scope.cwd === undefined ? '' : 'AND candidate.cwd = ?';\n const parameters = scope.cwd === undefined\n ? [TASK_BATCH_TRIM_CHARACTERS, normalizedBatchId]\n : [TASK_BATCH_TRIM_CHARACTERS, normalizedBatchId, scope.cwd];\n\n return db.transaction(() => sqlite.query(`\n WITH RECURSIVE\n candidate(id, cwd, depends_on) AS MATERIALIZED (\n SELECT candidate.id, candidate.cwd, candidate.depends_on\n FROM tasks AS candidate\n WHERE trim(candidate.batch_id, ?) = ?\n AND candidate.status IN ('failed', 'dead_letter')\n ${scopeFilter}\n ),\n retryable(id, cwd, depends_on) AS (\n SELECT candidate.id,\n candidate.cwd,\n candidate.depends_on\n FROM candidate\n WHERE candidate.depends_on IS NULL\n OR (\n NOT EXISTS (\n SELECT 1 FROM candidate AS internal_parent\n WHERE internal_parent.id = candidate.depends_on\n )\n AND EXISTS (\n SELECT 1 FROM tasks AS external_parent\n WHERE external_parent.id = candidate.depends_on\n AND external_parent.cwd IS candidate.cwd\n AND (\n external_parent.status IN ('pending', 'running', 'done')\n OR (\n external_parent.status = 'failed'\n AND external_parent.retry_count <= external_parent.max_retries\n )\n )\n )\n )\n UNION\n SELECT child.id,\n child.cwd,\n child.depends_on\n FROM candidate AS child\n INNER JOIN retryable AS parent\n ON child.depends_on = parent.id\n AND child.cwd IS parent.cwd\n )\n UPDATE tasks\n SET status = 'pending',\n started_at = NULL,\n finished_at = NULL,\n retry_after = NULL,\n retry_count = 0\n WHERE id IN (SELECT id FROM retryable)\n `).run(...parameters).changes, { behavior: 'immediate' });\n }\n\n static async getById(id: number, scope: { cwd?: string } = {}): Promise<Task | null> {\n const conditions = [eq(tasks.id, id), ...this.buildScopeWhere(scope)];\n const result = await db.select().from(tasks).where(and(...conditions));\n return result[0] || null;\n }\n\n static async list(options: {\n status?: TaskStatus;\n activeExecution?: boolean;\n batchId?: string;\n category?: string;\n cwd?: string;\n legacyCwd?: boolean;\n limit?: number;\n offset?: number;\n } = {}): Promise<Task[]> {\n let query = db.select().from(tasks).$dynamic();\n\n const conditions = [];\n if (options.activeExecution) {\n conditions.push(or(\n eq(tasks.status, 'running'),\n sql`EXISTS (\n SELECT 1 FROM task_runs AS active_list_run\n WHERE active_list_run.task_id = ${tasks.id}\n AND active_list_run.status = 'running'\n )`,\n ));\n } else if (options.status) {\n conditions.push(eq(tasks.status, options.status));\n }\n if (options.batchId !== undefined) {\n const batchId = normalizeTaskBatchId(options.batchId);\n conditions.push(batchId\n ? sql`trim(${tasks.batchId}, ${TASK_BATCH_TRIM_CHARACTERS}) = ${batchId}`\n : sql`0`);\n }\n if (options.category) {\n conditions.push(eq(tasks.category, options.category));\n }\n if (options.legacyCwd) {\n conditions.push(sql`${tasks.cwd} IS NULL OR trim(${tasks.cwd}) = ''`);\n } else if (options.cwd !== undefined) {\n conditions.push(eq(tasks.cwd, options.cwd));\n }\n\n if (conditions.length > 0) {\n query = query.where(and(...conditions));\n }\n\n query = query.orderBy(desc(tasks.createdAt), desc(tasks.id));\n\n if (options.limit) {\n query = query.limit(options.limit);\n }\n if (options.offset) {\n query = query.offset(options.offset);\n }\n\n return await query;\n }\n\n static async stats(options: {\n batchId?: string;\n cwd?: string;\n legacyCwd?: boolean;\n } = {}): Promise<Record<string, number>> {\n const conditions = [];\n if (options.batchId !== undefined) {\n const batchId = normalizeTaskBatchId(options.batchId);\n conditions.push(batchId\n ? sql`trim(${tasks.batchId}, ${TASK_BATCH_TRIM_CHARACTERS}) = ${batchId}`\n : sql`0`);\n }\n if (options.legacyCwd) {\n conditions.push(sql`${tasks.cwd} IS NULL OR trim(${tasks.cwd}) = ''`);\n } else if (options.cwd !== undefined) {\n conditions.push(eq(tasks.cwd, options.cwd));\n }\n const whereCondition = conditions.length > 0 ? and(...conditions) : undefined;\n\n const result = await db\n .select({\n status: tasks.status,\n count: sql<number>`count(*)`,\n })\n .from(tasks)\n .where(whereCondition)\n .groupBy(tasks.status);\n\n const stats: Record<string, number> = {\n total: 0,\n pending: 0,\n running: 0,\n done: 0,\n failed: 0,\n dead_letter: 0,\n cancelled: 0,\n };\n\n for (const row of result) {\n if (row.status) {\n stats[row.status] = Number(row.count);\n stats.total += Number(row.count);\n }\n }\n\n return stats;\n }\n\n static async projectSummaries(limit = 100): Promise<TaskProjectSummary[]> {\n this.validateInteger('limit', limit, 1, 1000);\n const lastCreatedAt = sql<number | null>`max(${tasks.createdAt})`;\n const lastTaskId = sql<number>`max(${tasks.id})`;\n const rows = await db\n .select({\n cwd: tasks.cwd,\n total: sql<number>`count(*)`,\n pending: sql<number>`sum(CASE WHEN ${tasks.status} = 'pending' THEN 1 ELSE 0 END)`,\n running: sql<number>`sum(CASE WHEN ${tasks.status} = 'running' OR EXISTS (\n SELECT 1 FROM task_runs AS active_project_run\n WHERE active_project_run.task_id = ${tasks.id}\n AND active_project_run.status = 'running'\n ) THEN 1 ELSE 0 END)`,\n failed: sql<number>`sum(CASE WHEN ${tasks.status} IN ('failed', 'dead_letter') THEN 1 ELSE 0 END)`,\n done: sql<number>`sum(CASE WHEN ${tasks.status} = 'done' THEN 1 ELSE 0 END)`,\n lastCreatedAt,\n })\n .from(tasks)\n .where(sql`${tasks.cwd} IS NOT NULL AND trim(${tasks.cwd}) <> ''`)\n .groupBy(tasks.cwd)\n .orderBy(desc(lastCreatedAt), desc(lastTaskId))\n .limit(limit);\n\n return rows.flatMap((row) => row.cwd === null ? [] : [{\n cwd: row.cwd,\n total: Number(row.total),\n pending: Number(row.pending),\n running: Number(row.running),\n failed: Number(row.failed),\n done: Number(row.done),\n lastCreatedAt: row.lastCreatedAt === null ? null : Number(row.lastCreatedAt) * 1000,\n }]);\n }\n\n static async delete(id: number, scope: { cwd?: string } = {}): Promise<boolean> {\n const conditions = [\n eq(tasks.id, id),\n sql`${tasks.status} <> 'running'`,\n sql`NOT EXISTS (\n SELECT 1 FROM ${taskRuns}\n WHERE ${taskRuns.taskId} = ${tasks.id}\n AND ${taskRuns.status} = 'running'\n )`,\n hasNoExecutableDependents(),\n ...this.buildScopeWhere(scope),\n ];\n const result = await db.delete(tasks).where(and(...conditions)).returning();\n if (result.length > 0) {\n // 正式 Schema 使用 ON DELETE CASCADE;测试库未启用外键,仍需显式收敛关联记录。\n await db.delete(taskRuns).where(eq(taskRuns.taskId, id));\n return true;\n }\n\n if (!await this.getById(id, scope)) return false;\n\n const dependent = await db\n .select({ id: tasks.id })\n .from(tasks)\n .where(and(\n eq(tasks.dependsOn, id),\n sql`${tasks.status} IN ('pending', 'running', 'failed', 'dead_letter')`,\n ))\n .orderBy(asc(tasks.id))\n .limit(1);\n if (dependent[0]) {\n throw new TaskDeletionConflictError(\n `任务 #${id} 仍被可执行任务 #${dependent[0].id} 依赖,请先处理依赖任务`,\n );\n }\n throw new TaskDeletionConflictError(\n `任务 #${id} 正在运行,请先取消任务并等待执行进程退出`,\n );\n }\n\n static async deleteOlderThan(\n retentionDays: number,\n shouldStop: () => boolean = () => false,\n ): Promise<number> {\n const cutoffSec = Math.floor(Date.now() / 1000) - retentionDays * 86400;\n const batchSize = 500;\n const sqlite = getSqlite();\n cleanupInvocation += 1;\n const candidateTable = `cleanup_candidates_${process.pid}_${cleanupInvocation}`;\n let deletedTotal = 0;\n\n sqlite.exec(`\n CREATE TEMP TABLE ${candidateTable} (\n id INTEGER NOT NULL PRIMARY KEY\n ) WITHOUT ROWID;\n `);\n try {\n let ceilingId: number | null = null;\n while (true) {\n if (shouldStop()) return deletedTotal;\n const batch = db.transaction(() => {\n sqlite.query(`DELETE FROM ${candidateTable}`).run();\n const ceilingPredicate = ceilingId == null\n ? ''\n : 'AND candidate.id < ?';\n const rawCandidateStatement = sqlite.query(`\n INSERT INTO ${candidateTable}(id)\n SELECT candidate.id\n FROM tasks AS candidate NOT INDEXED\n WHERE candidate.status IN ('done', 'dead_letter', 'cancelled')\n AND candidate.finished_at IS NOT NULL\n AND candidate.finished_at < ?\n ${ceilingPredicate}\n AND NOT EXISTS (\n SELECT 1 FROM task_runs AS active_run\n WHERE active_run.task_id = candidate.id\n AND active_run.status = 'running'\n )\n ORDER BY candidate.id DESC\n LIMIT ?\n `);\n const rawCount = ceilingId == null\n ? rawCandidateStatement.run(cutoffSec, batchSize).changes\n : rawCandidateStatement.run(cutoffSec, ceilingId, batchSize).changes;\n if (rawCount === 0) return { deleted: 0, nextCeilingId: null };\n const rawPage = sqlite.query(`\n SELECT min(id) AS nextCeilingId FROM ${candidateTable}\n `).get() as { nextCeilingId: number };\n\n // 正常依赖边总是 child.id > parent.id。反向边或自环说明数据异常,\n // 先保留该节点,再通过下面的叶到根剪枝保留整个受影响祖先链。\n sqlite.query(`\n DELETE FROM ${candidateTable}\n WHERE EXISTS (\n SELECT 1 FROM tasks AS anomalous\n WHERE anomalous.id = ${candidateTable}.id\n AND anomalous.depends_on IS NOT NULL\n AND anomalous.depends_on >= anomalous.id\n )\n `).run();\n\n while (true) {\n const pruned = sqlite.query(`\n DELETE FROM ${candidateTable}\n WHERE EXISTS (\n SELECT 1 FROM tasks AS dependent_task\n WHERE dependent_task.depends_on = ${candidateTable}.id\n AND NOT EXISTS (\n SELECT 1 FROM ${candidateTable} AS selected_dependent\n WHERE selected_dependent.id = dependent_task.id\n )\n )\n `).run().changes;\n if (pruned === 0) break;\n }\n\n const selected = sqlite.query(`\n SELECT count(*) AS count FROM ${candidateTable}\n `).get() as { count: number };\n if (selected.count === 0) {\n return { deleted: 0, nextCeilingId: rawPage.nextCeilingId };\n }\n\n sqlite.query(`\n DELETE FROM tasks\n WHERE id IN (SELECT id FROM ${candidateTable})\n `).run();\n const remaining = sqlite.query(`\n SELECT count(*) AS count\n FROM tasks\n WHERE id IN (SELECT id FROM ${candidateTable})\n `).get() as { count: number };\n if (remaining.count !== 0) {\n throw new Error('历史清理候选在同一写事务内发生漂移,已回滚本批删除');\n }\n return { deleted: selected.count, nextCeilingId: rawPage.nextCeilingId };\n }, { behavior: 'immediate' });\n if (batch.nextCeilingId == null) break;\n ceilingId = batch.nextCeilingId;\n deletedTotal += batch.deleted;\n\n await Bun.sleep(0);\n if (shouldStop()) return deletedTotal;\n }\n return deletedTotal;\n } finally {\n sqlite.exec(`DROP TABLE IF EXISTS ${candidateTable}`);\n }\n }\n}\n","import { spawnSync } from 'child_process';\nimport { fileURLToPath } from 'url';\nimport { basename, dirname, resolve } from 'path';\nimport {\n isLaunchIdentity,\n LAUNCH_IDENTITY_ARGUMENT,\n TOKEN_GUARDIAN_LAUNCH_PROTOCOL,\n} from '@core/launch-protocol';\n\ninterface ProcessInfo {\n processGroupId: number;\n command: string;\n}\n\nconst OS_COMMAND_TIMEOUT_MS = 2_000;\n\nexport type RecordedProcessSignalResult =\n | 'signalled'\n | 'not-running'\n | 'identity-mismatch'\n | 'inspect-failed'\n | 'signal-failed';\n\nexport type GatewayProcessIdentity = 'match' | 'mismatch' | 'unknown' | 'not-running';\nexport type SpawnedProcessTreePresence = 'running' | 'not-running' | 'unknown';\n\nfunction isSafePid(pid: number): boolean {\n return Number.isInteger(pid) && pid > 1 && pid !== process.pid;\n}\n\nfunction absentLeaderResult(pid: number): RecordedProcessSignalResult {\n return inspectSpawnedProcessTreePresence(pid) === 'not-running'\n ? 'not-running'\n : 'inspect-failed';\n}\n\nexport function isProcessAlive(pid: number): boolean {\n if (!Number.isInteger(pid) || pid <= 0) return false;\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n return error instanceof Error && 'code' in error && error.code === 'EPERM';\n }\n}\n\nexport function isSpawnedProcessTreeAlive(pid: number): boolean {\n return inspectSpawnedProcessTreePresence(pid) === 'running';\n}\n\nexport function inspectSpawnedProcessTreePresence(pid: number): SpawnedProcessTreePresence {\n if (!Number.isInteger(pid) || pid <= 0) return 'unknown';\n if (process.platform === 'win32') {\n const processIds = inspectWindowsProcessTree(pid);\n if (processIds == null) return 'unknown';\n return processIds.length > 0 ? 'running' : 'not-running';\n }\n try {\n process.kill(-pid, 0);\n return 'running';\n } catch (error) {\n if (!(error instanceof Error) || !('code' in error)) return 'unknown';\n if (error.code === 'EPERM') return 'running';\n if (error.code === 'ESRCH') return 'not-running';\n return 'unknown';\n }\n}\n\nfunction inspectUnixProcess(pid: number): ProcessInfo | null {\n const result = spawnSync('ps', ['-o', 'pgid=', '-o', 'command=', '-p', String(pid)], {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: OS_COMMAND_TIMEOUT_MS,\n killSignal: 'SIGKILL',\n });\n if (result.status !== 0) return null;\n const match = result.stdout.trim().match(/^(\\d+)\\s+(.+)$/s);\n if (!match) return null;\n return { processGroupId: Number(match[1]), command: match[2] };\n}\n\nfunction inspectWindowsCommand(pid: number): string | null {\n const script = `(Get-CimInstance Win32_Process -Filter \"ProcessId = ${pid}\").CommandLine`;\n const result = spawnSync(\n 'powershell.exe',\n ['-NoProfile', '-NonInteractive', '-Command', script],\n {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: OS_COMMAND_TIMEOUT_MS,\n killSignal: 'SIGKILL',\n },\n );\n if (result.status !== 0) return null;\n return result.stdout.trim() || null;\n}\n\nfunction inspectWindowsProcessTree(rootPid: number): number[] | null {\n const script = `$root=${rootPid}; $all=@(Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId); $ids=New-Object 'System.Collections.Generic.HashSet[int]'; [void]$ids.Add($root); do { $added=$false; foreach($p in $all) { if($ids.Contains([int]$p.ParentProcessId) -and $ids.Add([int]$p.ProcessId)) { $added=$true } } } while($added); $all | Where-Object { $ids.Contains([int]$_.ProcessId) } | Select-Object -ExpandProperty ProcessId`;\n const result = spawnSync(\n 'powershell.exe',\n ['-NoProfile', '-NonInteractive', '-Command', script],\n {\n encoding: 'utf8',\n stdio: ['ignore', 'pipe', 'ignore'],\n timeout: OS_COMMAND_TIMEOUT_MS,\n killSignal: 'SIGKILL',\n },\n );\n if (result.status !== 0) return null;\n return result.stdout\n .split(/\\s+/)\n .filter(Boolean)\n .map(Number)\n .filter((pid) => Number.isInteger(pid) && pid > 0);\n}\n\nfunction executableName(value: string): string {\n return basename(value).trim().toLowerCase().replace(/\\.(?:exe|cmd|bat)$/i, '');\n}\n\nfunction commandTokens(command: string): string[] {\n return command\n .trim()\n .split(/\\s+/)\n .map((token) => token.replace(/^[\"']|[\"']$/g, ''));\n}\n\nfunction openCodeArgsMatch(args: string[]): boolean {\n const agentIndex = args.indexOf('--agent');\n const formatIndex = args.indexOf('--format');\n return args[0] === 'run'\n && agentIndex >= 0\n && Boolean(args[agentIndex + 1])\n && formatIndex >= 0\n && args[formatIndex + 1] === 'json';\n}\n\nfunction guardianLauncherPath(): string {\n const extension = import.meta.url.endsWith('.ts') ? 'ts' : 'js';\n return resolve(dirname(fileURLToPath(import.meta.url)), `../worker/launcher.${extension}`)\n .replaceAll('\\\\', '/');\n}\n\nfunction commandMatches(\n command: string,\n expectedExecutable: string,\n launchProtocol: string | null,\n expectedLaunchIdentity: string | null,\n): boolean {\n const expectedName = executableName(expectedExecutable);\n if (!expectedName) return false;\n const tokens = commandTokens(command);\n\n if (launchProtocol === TOKEN_GUARDIAN_LAUNCH_PROTOCOL) {\n if (!isLaunchIdentity(expectedLaunchIdentity)) return false;\n const expectedLauncher = guardianLauncherPath();\n const launcherIndex = tokens.findIndex((token, index) => (\n index > 0\n && index <= 3\n && token.replaceAll('\\\\', '/') === expectedLauncher\n ));\n if (launcherIndex < 0) return false;\n\n const runtimeName = executableName(process.execPath);\n const hasRuntime = tokens.slice(0, launcherIndex).some((token) => (\n executableName(token) === runtimeName || executableName(token) === 'bun'\n ));\n const identityArgumentIndex = launcherIndex + 1;\n const launchIdentityIndex = launcherIndex + 2;\n const executableIndex = launcherIndex + 3;\n return hasRuntime\n && tokens[identityArgumentIndex] === LAUNCH_IDENTITY_ARGUMENT\n && tokens[launchIdentityIndex] === expectedLaunchIdentity\n && executableName(tokens[executableIndex] ?? '') === expectedName\n && openCodeArgsMatch(tokens.slice(executableIndex + 1));\n }\n if (launchProtocol != null) return false;\n\n const executableIndex = tokens.findIndex((token, index) => (\n index <= 3 && executableName(token) === expectedName\n ));\n if (executableIndex < 0) return false;\n return openCodeArgsMatch(tokens.slice(executableIndex + 1, executableIndex + 12));\n}\n\nexport function identifyGatewayProcess(pid: number): GatewayProcessIdentity {\n if (!isProcessAlive(pid)) return 'not-running';\n const command = process.platform === 'win32'\n ? inspectWindowsCommand(pid)\n : inspectUnixProcess(pid)?.command ?? null;\n if (!command) return 'unknown';\n\n const tokens = command\n .trim()\n .split(/\\s+/)\n .map((token) => token.replace(/^['\"]|['\"]$/g, '').replaceAll('\\\\', '/'));\n const runtimeName = executableName(process.execPath);\n const hasRuntime = tokens.slice(0, 4).some((token) => (\n executableName(token) === runtimeName || executableName(token) === 'bun'\n ));\n const hasGatewayEntry = tokens.some((token) => /(?:^|\\/)gateway\\/index\\.(?:js|ts)$/.test(token));\n const cliEntryIndex = tokens.findIndex((token) => /(?:^|\\/)cli\\/index\\.(?:js|ts)$/.test(token));\n const hasCliGatewayCommand = cliEntryIndex >= 0\n && tokens.slice(cliEntryIndex + 1).includes('gateway');\n const supertaskIndex = tokens.findIndex((token, index) => (\n index <= 3 && executableName(token) === 'supertask'\n ));\n const hasBinGatewayCommand = supertaskIndex >= 0 && tokens[supertaskIndex + 1] === 'gateway';\n return hasRuntime && (hasGatewayEntry || hasCliGatewayCommand || hasBinGatewayCommand)\n ? 'match'\n : 'mismatch';\n}\n\nexport function signalSpawnedProcessTree(pid: number, signal: NodeJS.Signals): boolean {\n if (!isSafePid(pid)) return false;\n\n if (process.platform === 'win32') {\n const args = ['/PID', String(pid), '/T'];\n if (signal === 'SIGKILL') args.push('/F');\n const status = spawnSync('taskkill', args, {\n stdio: 'ignore',\n timeout: OS_COMMAND_TIMEOUT_MS,\n killSignal: 'SIGKILL',\n }).status;\n return status === 0 || !isSpawnedProcessTreeAlive(pid);\n }\n\n try {\n process.kill(-pid, signal);\n return true;\n } catch {\n }\n\n try {\n process.kill(pid, signal);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function signalRecordedProcessTree(\n pid: number,\n signal: NodeJS.Signals,\n expectedExecutable: string,\n launchProtocol: string | null = null,\n expectedLaunchIdentity: string | null = null,\n): boolean {\n return signalRecordedProcessTreeWithResult(\n pid,\n signal,\n expectedExecutable,\n launchProtocol,\n expectedLaunchIdentity,\n ) === 'signalled';\n}\n\nexport function signalRecordedProcessTreeWithResult(\n pid: number,\n signal: NodeJS.Signals,\n expectedExecutable: string,\n launchProtocol: string | null = null,\n expectedLaunchIdentity: string | null = null,\n): RecordedProcessSignalResult {\n if (!isSafePid(pid)) return 'identity-mismatch';\n if (!isProcessAlive(pid)) return absentLeaderResult(pid);\n\n if (process.platform === 'win32') {\n const command = inspectWindowsCommand(pid);\n if (!command) return isProcessAlive(pid) ? 'inspect-failed' : absentLeaderResult(pid);\n if (!commandMatches(\n command,\n expectedExecutable,\n launchProtocol,\n expectedLaunchIdentity,\n )) {\n return 'identity-mismatch';\n }\n const args = ['/PID', String(pid), '/T'];\n if (signal === 'SIGKILL') args.push('/F');\n const status = spawnSync('taskkill', args, {\n stdio: 'ignore',\n timeout: OS_COMMAND_TIMEOUT_MS,\n killSignal: 'SIGKILL',\n }).status;\n if (status === 0) return 'signalled';\n return isProcessAlive(pid) ? 'signal-failed' : absentLeaderResult(pid);\n }\n\n const info = inspectUnixProcess(pid);\n if (!info) return isProcessAlive(pid) ? 'inspect-failed' : absentLeaderResult(pid);\n if (!commandMatches(\n info.command,\n expectedExecutable,\n launchProtocol,\n expectedLaunchIdentity,\n )) {\n return 'identity-mismatch';\n }\n\n try {\n if (info.processGroupId === pid) process.kill(-pid, signal);\n else process.kill(pid, signal);\n return 'signalled';\n } catch {\n return isProcessAlive(pid) ? 'signal-failed' : absentLeaderResult(pid);\n }\n}\n\nexport async function waitForProcessExit(pid: number, timeoutMs = 5_000): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (isProcessAlive(pid) && Date.now() < deadline) {\n await Bun.sleep(Math.min(50, deadline - Date.now()));\n }\n return !isProcessAlive(pid);\n}\n\nexport async function waitForSpawnedProcessTreeExit(\n pid: number,\n timeoutMs = 5_000,\n): Promise<boolean> {\n const deadline = Date.now() + timeoutMs;\n while (inspectSpawnedProcessTreePresence(pid) !== 'not-running' && Date.now() < deadline) {\n await Bun.sleep(Math.min(50, deadline - Date.now()));\n }\n return inspectSpawnedProcessTreePresence(pid) === 'not-running';\n}\n","export const LEGACY_GUARDIAN_LAUNCH_PROTOCOL = 'gated-v2-guardian';\nexport const TOKEN_GUARDIAN_LAUNCH_PROTOCOL = 'gated-v3-token-guardian';\nexport const LAUNCH_IDENTITY_ARGUMENT = '--supertask-launch-identity';\nexport const DRAIN_PROOF_MESSAGE_TYPE = 'supertask-drained';\nexport const DRAIN_PROOF_ACK_MESSAGE_TYPE = 'supertask-drained-ack';\nexport const MANAGED_RUN_ENV = 'SUPERTASK_MANAGED_RUN';\nexport const MANAGED_RUN_ENV_VALUE = '1';\n\nexport function isLaunchIdentity(value: string | null | undefined): value is string {\n return value != null\n && /^gateway-[1-9]\\d*:launch:[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(value);\n}\n\nexport function drainProofForIdentity(launchIdentity: string) {\n return { type: DRAIN_PROOF_MESSAGE_TYPE, identity: launchIdentity } as const;\n}\n\nexport function drainProofAckForIdentity(launchIdentity: string) {\n return { type: DRAIN_PROOF_ACK_MESSAGE_TYPE, identity: launchIdentity } as const;\n}\n\nexport function isMatchingDrainProof(message: unknown, launchIdentity: string): boolean {\n if (typeof message !== 'object' || message == null) return false;\n const candidate = message as Record<string, unknown>;\n return candidate.type === DRAIN_PROOF_MESSAGE_TYPE\n && candidate.identity === launchIdentity;\n}\n\nexport function isMatchingDrainProofAck(message: unknown, launchIdentity: string): boolean {\n if (typeof message !== 'object' || message == null) return false;\n const candidate = message as Record<string, unknown>;\n return candidate.type === DRAIN_PROOF_ACK_MESSAGE_TYPE\n && candidate.identity === launchIdentity;\n}\n","import { db, schema } from '@core/db';\nimport { eq, desc, and, inArray } from 'drizzle-orm';\nimport type { TaskRun, NewTaskRun } from '@core/db/schema';\nimport { isProcessAlive } from '@core/process-control';\n\nconst { tasks, taskRuns } = schema;\n\nexport interface StaleRunInfo {\n runId: number;\n taskId: number;\n childPid: number | null;\n workerPid: number | null;\n launchProtocol: string | null;\n lockedBy: string | null;\n taskRetryCount: number;\n taskMaxRetries: number;\n taskRetryBackoffMs: number;\n taskStatus: string | null;\n taskCwd: string | null;\n ownerAlive: boolean;\n}\n\nexport interface LegacyQuarantinedRun {\n runId: number;\n taskId: number;\n taskStatus: string | null;\n taskCwd: string | null;\n workerPid: number | null;\n ownerAlive: boolean;\n}\n\nexport interface AbandonedLegacyRun {\n runId: number;\n taskId: number;\n runStatus: 'failed';\n taskStatus: 'cancelled';\n}\n\nexport class LegacyRunAbandonConflictError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'LegacyRunAbandonConflictError';\n }\n}\n\nexport class TaskRunService {\n static async create(data: NewTaskRun): Promise<TaskRun> {\n const result = await db.insert(taskRuns).values(data).returning();\n return result[0];\n }\n\n static async updateSessionId(id: number, sessionId: string): Promise<TaskRun | null> {\n const result = await db\n .update(taskRuns)\n .set({ sessionId })\n .where(and(eq(taskRuns.id, id), eq(taskRuns.status, 'running')))\n .returning();\n return result[0] || null;\n }\n\n static async done(id: number, log?: string): Promise<TaskRun | null> {\n const result = await db\n .update(taskRuns)\n .set({\n status: 'done',\n finishedAt: new Date(),\n log,\n })\n .where(and(eq(taskRuns.id, id), eq(taskRuns.status, 'running')))\n .returning();\n return result[0] || null;\n }\n\n static async fail(id: number, log?: string): Promise<TaskRun | null> {\n const result = await db\n .update(taskRuns)\n .set({\n status: 'failed',\n finishedAt: new Date(),\n log,\n })\n .where(and(eq(taskRuns.id, id), eq(taskRuns.status, 'running')))\n .returning();\n return result[0] || null;\n }\n\n static async heartbeat(id: number): Promise<TaskRun | null> {\n const result = await db\n .update(taskRuns)\n .set({ heartbeatAt: Date.now() })\n .where(and(eq(taskRuns.id, id), eq(taskRuns.status, 'running')))\n .returning();\n return result[0] || null;\n }\n\n static async updatePid(\n id: number,\n workerPid: number,\n childPid: number,\n lockedBy = `gateway-${process.pid}`,\n ): Promise<TaskRun | null> {\n const result = await db\n .update(taskRuns)\n .set({\n workerPid,\n childPid,\n lockedAt: Date.now(),\n lockedBy,\n })\n .where(and(eq(taskRuns.id, id), eq(taskRuns.status, 'running')))\n .returning();\n return result[0] || null;\n }\n\n static async getById(id: number): Promise<TaskRun | null> {\n const result = await db.select().from(taskRuns).where(eq(taskRuns.id, id));\n return result[0] || null;\n }\n\n static async listByTaskId(taskId: number): Promise<TaskRun[]> {\n return await db\n .select()\n .from(taskRuns)\n .where(eq(taskRuns.taskId, taskId))\n .orderBy(desc(taskRuns.startedAt), desc(taskRuns.id));\n }\n\n static async getLatestByTaskId(taskId: number): Promise<TaskRun | null> {\n const result = await db\n .select()\n .from(taskRuns)\n .where(eq(taskRuns.taskId, taskId))\n .orderBy(desc(taskRuns.startedAt), desc(taskRuns.id))\n .limit(1);\n return result[0] || null;\n }\n\n static async getLatestByTaskIds(taskIds: number[]): Promise<Map<number, TaskRun>> {\n if (taskIds.length === 0) return new Map();\n\n const latestRuns = await db\n .select()\n .from(taskRuns)\n .where(inArray(taskRuns.taskId, taskIds))\n .orderBy(desc(taskRuns.startedAt), desc(taskRuns.id));\n\n const result = new Map<number, TaskRun>();\n for (const run of latestRuns) {\n if (!result.has(run.taskId)) {\n result.set(run.taskId, run);\n }\n }\n return result;\n }\n\n static async getStaleRuns(heartbeatTimeoutMs: number): Promise<StaleRunInfo[]> {\n const cutoffMs = Date.now() - heartbeatTimeoutMs;\n const { tasks: tasksTable } = schema;\n const result = await db\n .select({\n runId: taskRuns.id,\n taskId: taskRuns.taskId,\n childPid: taskRuns.childPid,\n workerPid: taskRuns.workerPid,\n launchProtocol: taskRuns.launchProtocol,\n lockedBy: taskRuns.lockedBy,\n startedAt: taskRuns.startedAt,\n heartbeatAt: taskRuns.heartbeatAt,\n taskRetryCount: tasksTable.retryCount,\n taskMaxRetries: tasksTable.maxRetries,\n taskRetryBackoffMs: tasksTable.retryBackoffMs,\n taskStatus: tasksTable.status,\n taskCwd: tasksTable.cwd,\n })\n .from(taskRuns)\n .innerJoin(tasksTable, eq(taskRuns.taskId, tasksTable.id))\n .where(eq(taskRuns.status, 'running'));\n return result.filter((row) => {\n const heartbeatExpired = row.heartbeatAt == null\n ? row.startedAt == null || row.startedAt.getTime() < cutoffMs\n : row.heartbeatAt < cutoffMs;\n const ownerExited = row.workerPid != null\n && row.workerPid > 0\n && !isProcessAlive(row.workerPid);\n return heartbeatExpired || ownerExited;\n }).map((row) => ({\n runId: row.runId,\n taskId: row.taskId,\n childPid: row.childPid,\n workerPid: row.workerPid,\n launchProtocol: row.launchProtocol,\n lockedBy: row.lockedBy,\n taskRetryCount: row.taskRetryCount ?? 0,\n taskMaxRetries: row.taskMaxRetries ?? 3,\n taskRetryBackoffMs: row.taskRetryBackoffMs ?? 30000,\n taskStatus: row.taskStatus,\n taskCwd: row.taskCwd,\n ownerAlive: row.workerPid != null\n && row.workerPid > 0\n && isProcessAlive(row.workerPid),\n }));\n }\n\n static async listLegacyQuarantinedRuns(\n heartbeatTimeoutMs = 0,\n ): Promise<LegacyQuarantinedRun[]> {\n const staleRuns = await this.getStaleRuns(heartbeatTimeoutMs);\n return staleRuns\n .filter((row) => row.launchProtocol == null\n && row.childPid == null\n )\n .map((row) => ({\n runId: row.runId,\n taskId: row.taskId,\n taskStatus: row.taskStatus,\n taskCwd: row.taskCwd,\n workerPid: row.workerPid,\n ownerAlive: row.ownerAlive,\n }));\n }\n\n static async abandonLegacyRun(runId: number): Promise<AbandonedLegacyRun | null> {\n return db.transaction((tx) => {\n const current = tx\n .select({\n runId: taskRuns.id,\n taskId: taskRuns.taskId,\n runStatus: taskRuns.status,\n taskStatus: tasks.status,\n workerPid: taskRuns.workerPid,\n childPid: taskRuns.childPid,\n launchProtocol: taskRuns.launchProtocol,\n log: taskRuns.log,\n })\n .from(taskRuns)\n .innerJoin(tasks, eq(taskRuns.taskId, tasks.id))\n .where(eq(taskRuns.id, runId))\n .get();\n if (!current) return null;\n if (current.runStatus !== 'running') {\n throw new LegacyRunAbandonConflictError(`run #${runId} 已不是 running 状态`);\n }\n if (current.launchProtocol != null) {\n throw new LegacyRunAbandonConflictError(\n `run #${runId} 使用未知或受管协议 ${current.launchProtocol},禁止人工 abandon`,\n );\n }\n if (current.childPid != null) {\n throw new LegacyRunAbandonConflictError(\n `run #${runId} 已记录 child PID ${current.childPid},必须由 Worker/Watchdog 确认进程树退出`,\n );\n }\n if (current.workerPid != null && isProcessAlive(current.workerPid)) {\n throw new LegacyRunAbandonConflictError(\n `run #${runId} 的 owner PID ${current.workerPid} 仍存活`,\n );\n }\n if (current.taskStatus !== 'cancelled') {\n throw new LegacyRunAbandonConflictError(\n `任务 #${current.taskId} 必须先取消并保持 cancelled 状态`,\n );\n }\n\n const note = '操作员已确认旧版无 PID 执行不存在,并通过 run abandon 关闭隔离记录';\n const updated = tx\n .update(taskRuns)\n .set({\n status: 'failed',\n finishedAt: new Date(),\n log: current.log ? `${current.log}\\n${note}` : note,\n })\n .where(and(eq(taskRuns.id, runId), eq(taskRuns.status, 'running')))\n .returning({ id: taskRuns.id })\n .get();\n if (!updated) {\n throw new LegacyRunAbandonConflictError(`run #${runId} 状态已被其他操作改变`);\n }\n return {\n runId,\n taskId: current.taskId,\n runStatus: 'failed',\n taskStatus: 'cancelled',\n };\n }, { behavior: 'immediate' });\n }\n\n static async getRunningRunByTaskId(taskId: number): Promise<TaskRun | null> {\n const result = await db\n .select()\n .from(taskRuns)\n .where(and(eq(taskRuns.taskId, taskId), eq(taskRuns.status, 'running')))\n .orderBy(desc(taskRuns.startedAt), desc(taskRuns.id))\n .limit(1);\n return result[0] || null;\n }\n\n static async deleteByTaskIds(taskIds: number[]): Promise<number> {\n if (taskIds.length === 0) return 0;\n const result = await db\n .delete(taskRuns)\n .where(inArray(taskRuns.taskId, taskIds))\n .returning();\n return result.length;\n }\n\n static async getAllRunningRuns(): Promise<TaskRun[]> {\n return await db\n .select()\n .from(taskRuns)\n .where(eq(taskRuns.status, 'running'));\n }\n}\n","import { TaskService } from '@core/services/task.service';\nimport { TaskRunService } from '@core/services/task-run.service';\nimport { spawn, type ChildProcess } from 'child_process';\nimport type { GatewayConfig } from '@gateway/config';\nimport type { Task } from '@core/db/schema';\nimport {\n markGatewayActivity,\n markGatewayFailure,\n markGatewaySuccess,\n} from '@gateway/health';\nimport {\n inspectSpawnedProcessTreePresence,\n signalRecordedProcessTreeWithResult,\n waitForSpawnedProcessTreeExit,\n} from '@core/process-control';\nimport { fileURLToPath } from 'url';\nimport { existsSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { randomUUID } from 'crypto';\nimport {\n drainProofAckForIdentity,\n isMatchingDrainProof,\n LAUNCH_IDENTITY_ARGUMENT,\n MANAGED_RUN_ENV,\n MANAGED_RUN_ENV_VALUE,\n TOKEN_GUARDIAN_LAUNCH_PROTOCOL,\n} from '@core/launch-protocol';\nimport { validateTaskWorkingDirectory } from '@core/task-working-directory';\nimport { normalizeTaskBatchId } from '@core/task-batch';\n\nconst DEFAULT_MAX_OUTPUT_CHARS = 64 * 1024;\nconst FORBIDDEN_AGENT = 'supertask-runner';\n\ninterface WorkerEngineOptions {\n opencodeBin?: string;\n maxOutputChars?: number;\n}\n\ninterface TaskTermination {\n kind: 'cancel' | 'failure' | 'shutdown';\n message: string;\n}\n\ninterface RunningTask {\n task: Task;\n runId: number;\n launchIdentity: string;\n child: ChildProcess;\n commandContext: string;\n output: string;\n sessionId: string | null;\n timeoutTimer: ReturnType<typeof setTimeout> | null;\n termination: TaskTermination | null;\n terminationPromise: Promise<boolean> | null;\n settlementPromise: Promise<boolean> | null;\n guardianDrained: boolean;\n quarantined: boolean;\n settled: boolean;\n}\n\nexport interface InterruptedTaskRun {\n taskId: number;\n runId: number;\n}\n\nexport function runCommandContext(executable: string, args: string[], cwd: string): string {\n return JSON.stringify({\n type: 'supertask_command',\n executable,\n args,\n cwd,\n });\n}\n\nexport function assertWorkerProcessIsolationSupported(\n platform: NodeJS.Platform = process.platform,\n): void {\n if (platform === 'win32') {\n throw new Error(\n 'Windows Worker 已安全禁用:当前运行时无法用 Job Object 证明整个 OpenCode 进程树已退出',\n );\n }\n}\n\nexport class WorkerEngine {\n private activeBatchIds = new Set<string>();\n private runningTasks = new Map<number, RunningTask>();\n private stopped = false;\n private pollTimer: ReturnType<typeof setTimeout> | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private pollCyclePromise: Promise<void> | null = null;\n private cfg: GatewayConfig['worker'];\n private opencodeBin: string;\n private maxOutputChars: number;\n\n constructor(cfg: GatewayConfig, options: WorkerEngineOptions = {}) {\n this.cfg = cfg.worker;\n this.opencodeBin = options.opencodeBin ?? process.env.SUPERTASK_OPENCODE_BIN ?? 'opencode';\n this.maxOutputChars = options.maxOutputChars ?? DEFAULT_MAX_OUTPUT_CHARS;\n }\n\n start() {\n assertWorkerProcessIsolationSupported();\n this.stopped = false;\n markGatewayActivity('worker');\n this.poll();\n this.heartbeatTimer = setInterval(() => {\n this.runDetached(this.updateHeartbeats(), 'worker heartbeat cycle failed');\n }, this.cfg.heartbeatIntervalMs);\n }\n\n async stop(gracePeriodMs = 0): Promise<InterruptedTaskRun[]> {\n this.stopped = true;\n if (this.pollTimer) {\n clearTimeout(this.pollTimer);\n this.pollTimer = null;\n }\n\n if (this.pollCyclePromise) await this.pollCyclePromise;\n\n if (gracePeriodMs > 0 && this.runningTasks.size > 0) {\n const deadline = Date.now() + gracePeriodMs;\n while (this.runningTasks.size > 0 && Date.now() < deadline) {\n await Bun.sleep(Math.min(50, deadline - Date.now()));\n }\n }\n\n if (this.heartbeatTimer) {\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n const interrupted: InterruptedTaskRun[] = [];\n const entries = [...this.runningTasks.values()];\n await Promise.all(entries.map(async (entry) => {\n if (entry.settled) {\n if (entry.settlementPromise) await entry.settlementPromise;\n return;\n }\n\n const termination = entry.termination ?? {\n kind: 'shutdown' as const,\n message: 'Gateway shutdown',\n };\n const terminated = await this.terminateEntry(entry, termination);\n if (terminated && termination.kind === 'shutdown') {\n interrupted.push({ taskId: entry.task.id, runId: entry.runId });\n }\n }));\n return interrupted;\n }\n\n getRunningTaskIds(): number[] {\n return [...this.runningTasks.keys()];\n }\n\n getRunningCount(): number {\n return this.runningTasks.size;\n }\n\n ownsRun(taskId: number, runId: number): boolean {\n return this.runningTasks.get(taskId)?.runId === runId;\n }\n\n private poll() {\n if (this.stopped) return;\n markGatewayActivity('worker');\n\n this.pollCyclePromise = this.tryDispatch()\n .then((healthy) => {\n if (healthy) markGatewaySuccess('worker');\n })\n .catch((err) => {\n markGatewayFailure('worker', err);\n this.logError('worker poll failed', err);\n })\n .finally(() => {\n this.pollCyclePromise = null;\n if (this.stopped) return;\n this.pollTimer = setTimeout(() => this.poll(), this.cfg.pollIntervalMs);\n });\n }\n\n private async tryDispatch(): Promise<boolean> {\n await TaskService.resetOrphanRunningToPending();\n await this.reconcileCancelledTasks();\n await this.reconcileQuarantinedTasks();\n\n const quarantined = [...this.runningTasks.values()].filter((entry) => entry.quarantined);\n if (quarantined.length > 0) {\n return false;\n }\n\n while (!this.stopped && this.runningTasks.size < this.cfg.maxConcurrency) {\n const databaseRunningCount = await TaskService.countRunning();\n if (databaseRunningCount >= this.cfg.maxConcurrency) break;\n\n let task: Task | null;\n try {\n task = await TaskService.next({ excludedBatchIds: [...this.activeBatchIds] });\n } catch (err) {\n this.logError('task claim failed', err);\n throw err;\n }\n if (!task) break;\n if (this.stopped) break;\n\n if (!await TaskService.start(task.id)) continue;\n const batchId = normalizeTaskBatchId(task.batchId);\n if (batchId) this.activeBatchIds.add(batchId);\n\n if (this.stopped) {\n await TaskService.resetRunningToPending([task.id]);\n this.releaseBatch(task);\n break;\n }\n\n let runId: number | null = null;\n try {\n const launchIdentity = `gateway-${process.pid}:launch:${randomUUID()}`;\n const run = await TaskRunService.create({\n taskId: task.id,\n model: this.resolveModel(task.model),\n status: 'running',\n workerPid: process.pid,\n lockedAt: Date.now(),\n lockedBy: launchIdentity,\n launchProtocol: TOKEN_GUARDIAN_LAUNCH_PROTOCOL,\n });\n runId = run.id;\n\n if (this.stopped) {\n await TaskRunService.fail(run.id, 'Gateway shutdown before spawn');\n await TaskService.resetRunningToPending([task.id]);\n this.releaseBatch(task);\n break;\n }\n\n if (task.agent === FORBIDDEN_AGENT) {\n const message = `禁止执行递归 Agent: ${FORBIDDEN_AGENT}`;\n await TaskService.failRun(task.id, run.id, message, { setDeadLetter: true });\n this.releaseBatch(task);\n continue;\n }\n\n try {\n validateTaskWorkingDirectory(task.cwd);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n await TaskService.failRun(task.id, run.id, message, { setDeadLetter: true });\n this.releaseBatch(task);\n continue;\n }\n\n await this.spawnTask(task, run.id, launchIdentity);\n } catch (err) {\n this.releaseBatch(task);\n const message = `Worker 启动任务失败:${err instanceof Error ? err.message : String(err)}`;\n try {\n if (runId == null) {\n await TaskService.fail(task.id, message);\n } else {\n const failed = await TaskService.failRun(task.id, runId, message);\n if (!failed) {\n await TaskRunService.fail(runId, `${message}\\n任务状态已被其他操作改变`);\n }\n }\n } catch (failErr) {\n this.logError('failed to compensate task startup', failErr, task.id);\n }\n this.logError('task dispatch failed', err, task.id);\n }\n }\n return ![...this.runningTasks.values()].some((entry) => entry.quarantined);\n }\n\n private launcherEntry(): string {\n const extension = import.meta.url.endsWith('.ts') ? 'ts' : 'js';\n const moduleDir = dirname(fileURLToPath(import.meta.url));\n const candidates = [\n join(moduleDir, `launcher.${extension}`),\n join(moduleDir, `../worker/launcher.${extension}`),\n ];\n const entry = candidates.find((candidate) => existsSync(candidate));\n if (!entry) throw new Error(`Worker launcher 不存在:${candidates.join(', ')}`);\n return entry;\n }\n\n private async spawnTask(task: Task, runId: number, launchIdentity: string): Promise<void> {\n const model = this.resolveModel(task.model);\n const args = ['run', '--agent', task.agent, '--format', 'json'];\n if (model) args.push('-m', model);\n args.push(task.prompt);\n\n const child = spawn(process.execPath, [\n this.launcherEntry(),\n LAUNCH_IDENTITY_ARGUMENT,\n launchIdentity,\n this.opencodeBin,\n ...args,\n ], {\n cwd: task.cwd || process.cwd(),\n env: {\n ...process.env,\n [MANAGED_RUN_ENV]: MANAGED_RUN_ENV_VALUE,\n },\n stdio: ['pipe', 'pipe', 'pipe', 'ipc'],\n detached: process.platform !== 'win32',\n });\n const entry: RunningTask = {\n task,\n runId,\n launchIdentity,\n child,\n commandContext: runCommandContext(this.opencodeBin, args, task.cwd || process.cwd()),\n output: '',\n sessionId: null,\n timeoutTimer: null,\n termination: null,\n terminationPromise: null,\n settlementPromise: null,\n guardianDrained: false,\n quarantined: false,\n settled: false,\n };\n this.runningTasks.set(task.id, entry);\n\n const handleData = (data: Buffer) => {\n const text = data.toString();\n entry.output = (entry.output + text).slice(-this.maxOutputChars);\n\n const match = entry.output.match(/\"sessionID\"\\s*:\\s*\"(ses_[^\"]+)\"/);\n if (match?.[1] && match[1] !== entry.sessionId) {\n entry.sessionId = match[1];\n TaskRunService.updateSessionId(runId, match[1]).catch((err) => {\n this.logError('sessionId update failed', err, task.id);\n });\n }\n };\n child.stdout?.on('data', handleData);\n child.stderr?.on('data', handleData);\n child.on('message', (message: unknown) => {\n if (isMatchingDrainProof(message, entry.launchIdentity)) {\n entry.guardianDrained = true;\n try {\n child.send(drainProofAckForIdentity(entry.launchIdentity));\n } catch (error) {\n this.logError('drain proof acknowledgment failed', error, task.id);\n }\n }\n });\n let spawnError: Error | null = null;\n const spawned = new Promise<void>((resolve, reject) => {\n child.once('spawn', resolve);\n child.once('error', (error) => {\n spawnError = error;\n reject(error);\n });\n });\n child.once('close', (code, signal) => {\n this.handleChildClose(entry, code, signal, spawnError);\n });\n\n try {\n await spawned;\n } catch (error) {\n entry.settled = true;\n this.runningTasks.delete(task.id);\n this.releaseBatch(task);\n throw error;\n }\n\n const childPid = child.pid;\n if (!childPid) {\n entry.settled = true;\n this.runningTasks.delete(task.id);\n this.releaseBatch(task);\n throw new Error('launcher 未返回 PID');\n }\n\n let pidRecorded = false;\n try {\n pidRecorded = await TaskRunService.updatePid(\n runId,\n process.pid,\n childPid,\n launchIdentity,\n ) !== null;\n } catch (error) {\n await this.terminateForFailure(\n entry,\n `记录 Worker PID 失败:${error instanceof Error ? error.message : String(error)}`,\n );\n return;\n }\n if (!pidRecorded) {\n await this.terminateForFailure(entry, '记录 Worker PID 失败:run 已不再处于 running 状态');\n return;\n }\n\n if (!child.stdin) {\n await this.terminateForFailure(entry, '放行 OpenCode 失败:launcher stdin 不可用');\n return;\n }\n try {\n await new Promise<void>((resolve, reject) => {\n child.stdin!.end('START\\n', (error?: Error | null) => {\n if (error) reject(error);\n else resolve();\n });\n });\n } catch (error) {\n await this.terminateForFailure(\n entry,\n `放行 OpenCode 失败:${error instanceof Error ? error.message : String(error)}`,\n );\n return;\n }\n\n const timeoutMs = task.timeoutMs ?? this.cfg.taskTimeoutMs;\n if (timeoutMs > 0) {\n entry.timeoutTimer = setTimeout(() => {\n this.runDetached(\n this.terminateForFailure(entry, `任务超时(${timeoutMs}ms)`, 'SIGKILL'),\n 'timeout termination failed',\n entry.task.id,\n );\n }, timeoutMs);\n }\n }\n\n private handleChildClose(\n entry: RunningTask,\n code: number | null,\n signal: NodeJS.Signals | null,\n spawnError: Error | null,\n ): void {\n if (entry.settled || entry.termination) return;\n\n if (!entry.guardianDrained) {\n const pid = entry.child.pid;\n const presence = pid == null\n ? spawnError == null ? 'unknown' : 'not-running'\n : inspectSpawnedProcessTreePresence(pid);\n const message = 'guardian 未提供进程树排空证明';\n if (presence !== 'not-running') {\n if (entry.timeoutTimer) {\n clearTimeout(entry.timeoutTimer);\n entry.timeoutTimer = null;\n }\n entry.termination = { kind: 'failure', message };\n entry.quarantined = true;\n markGatewayFailure(\n 'worker',\n new Error(`${message};任务 #${entry.task.id} 保持隔离`),\n );\n return;\n }\n this.runDetached(\n this.settleEntry(entry, null, message),\n 'task settlement failed',\n entry.task.id,\n );\n return;\n }\n\n const failure = code === 0\n ? undefined\n : `${spawnError ? '无法启动 opencode' : 'opencode 退出码'} ${spawnError?.message ?? code ?? 'null'}${signal ? `,信号 ${signal}` : ''}`\n + `(agent=${entry.task.agent},model=${this.resolveModel(entry.task.model) ?? 'Agent/默认配置'},cwd=${entry.task.cwd ?? process.cwd()})`;\n this.runDetached(\n this.settleEntry(entry, code, failure),\n 'task settlement failed',\n entry.task.id,\n );\n }\n\n private settleEntry(\n entry: RunningTask,\n code: number | null,\n failure?: string,\n ): Promise<boolean> {\n if (entry.settlementPromise) return entry.settlementPromise;\n if (entry.settled) return Promise.resolve(false);\n entry.settled = true;\n if (entry.timeoutTimer) {\n clearTimeout(entry.timeoutTimer);\n entry.timeoutTimer = null;\n }\n\n const settlement = this.commitEntry(entry, code, failure)\n .then(() => true)\n .catch((error) => {\n markGatewayFailure('worker', error);\n this.logError('task settlement failed', error, entry.task.id);\n return false;\n })\n .finally(() => {\n this.runningTasks.delete(entry.task.id);\n this.releaseBatch(entry.task);\n });\n entry.settlementPromise = settlement;\n return settlement;\n }\n\n private async commitEntry(\n entry: RunningTask,\n code: number | null,\n failure?: string,\n ): Promise<void> {\n const termination = entry.termination;\n if (termination?.kind === 'shutdown') return;\n\n if (termination?.kind === 'cancel') {\n const output = this.outputWithCommand(entry);\n const log = `${termination.message}${output ? `\\n${output}` : ''}`;\n await TaskRunService.fail(entry.runId, log);\n console.log(JSON.stringify({\n ts: new Date().toISOString(),\n level: 'info',\n msg: 'running task cancelled',\n taskId: entry.task.id,\n }));\n return;\n }\n\n const currentRun = await TaskRunService.getById(entry.runId);\n if (!currentRun || currentRun.status !== 'running') return;\n\n const output = this.outputWithCommand(entry);\n const log = failure\n ? `${failure}${output ? `\\n${output}` : ''}`\n : output;\n\n if (code === 0 && !failure) {\n const completed = await TaskService.completeRun(entry.task.id, entry.runId, log);\n if (completed) {\n console.log(JSON.stringify({\n ts: new Date().toISOString(),\n level: 'info',\n msg: 'task done',\n taskId: entry.task.id,\n }));\n return;\n }\n\n await TaskRunService.fail(entry.runId, '任务或执行记录状态已被其他操作改变');\n return;\n }\n\n const failed = await TaskService.failRun(entry.task.id, entry.runId, log);\n if (!failed) {\n await TaskRunService.fail(\n entry.runId,\n `${log}${log ? '\\n' : ''}任务状态已被其他操作改变`,\n );\n this.logError('task failure state transition rejected', failure ?? 'unknown failure', entry.task.id);\n }\n console.error(JSON.stringify({\n ts: new Date().toISOString(),\n level: 'error',\n msg: 'task failed',\n taskId: entry.task.id,\n error: failure,\n }));\n }\n\n private async reconcileCancelledTasks() {\n for (const entry of [...this.runningTasks.values()]) {\n try {\n const task = await TaskService.getById(entry.task.id);\n if (task?.status === 'cancelled') await this.cancelEntry(entry);\n } catch (err) {\n this.logError('cancel reconciliation failed', err, entry.task.id);\n }\n }\n }\n\n private async reconcileQuarantinedTasks() {\n for (const entry of [...this.runningTasks.values()]) {\n if (!entry.quarantined || !entry.termination) continue;\n await this.terminateEntry(entry, entry.termination);\n }\n }\n\n private async cancelEntry(entry: RunningTask) {\n await this.terminateEntry(entry, { kind: 'cancel', message: '任务已取消' });\n }\n\n private async updateHeartbeats() {\n for (const entry of this.runningTasks.values()) {\n if (entry.quarantined) continue;\n try {\n await TaskRunService.heartbeat(entry.runId);\n } catch (err) {\n this.logError('heartbeat update failed', err, entry.task.id);\n }\n }\n }\n\n private async terminateForFailure(\n entry: RunningTask,\n message: string,\n initialSignal: NodeJS.Signals = 'SIGTERM',\n ): Promise<boolean> {\n return this.terminateEntry(entry, { kind: 'failure', message }, initialSignal);\n }\n\n private terminateEntry(\n entry: RunningTask,\n termination: TaskTermination,\n initialSignal: NodeJS.Signals = 'SIGTERM',\n ): Promise<boolean> {\n if (entry.terminationPromise) return entry.terminationPromise;\n if (entry.settled) return entry.settlementPromise ?? Promise.resolve(false);\n\n entry.termination ??= termination;\n if (entry.timeoutTimer) {\n clearTimeout(entry.timeoutTimer);\n entry.timeoutTimer = null;\n }\n entry.quarantined = true;\n\n const terminationPromise = this.completeTermination(entry, initialSignal)\n .finally(() => {\n if (!entry.settled && entry.terminationPromise === terminationPromise) {\n entry.terminationPromise = null;\n }\n });\n entry.terminationPromise = terminationPromise;\n return terminationPromise;\n }\n\n private async completeTermination(\n entry: RunningTask,\n initialSignal: NodeJS.Signals,\n ): Promise<boolean> {\n const termination = entry.termination;\n if (!termination) return false;\n\n try {\n const exited = await this.killEntry(entry, initialSignal);\n if (!exited) {\n markGatewayFailure(\n 'worker',\n new Error(`${termination.message};任务 #${entry.task.id} 的进程无法确认退出`),\n );\n return false;\n }\n entry.quarantined = false;\n return await this.settleEntry(\n entry,\n null,\n termination.kind === 'failure' ? termination.message : undefined,\n );\n } catch (error) {\n markGatewayFailure('worker', error);\n this.logError('task termination failed', error, entry.task.id);\n return false;\n }\n }\n\n private async killEntry(\n entry: RunningTask,\n initialSignal: NodeJS.Signals = 'SIGTERM',\n ): Promise<boolean> {\n // 只有绑定当前 run 身份的独立 IPC 证明才能把 guardian 退出视为整组排空。\n if (entry.guardianDrained\n && (entry.child.exitCode !== null || entry.child.signalCode !== null)) return true;\n const pid = entry.child.pid;\n if (!pid) return false;\n\n const initialResult = this.signalEntry(entry, initialSignal);\n if (initialResult === 'not-running') return true;\n if (initialResult !== 'signalled') return false;\n if (await waitForSpawnedProcessTreeExit(pid, 2_500)) return true;\n if (initialSignal === 'SIGKILL') return false;\n if (entry.guardianDrained\n && (entry.child.exitCode !== null || entry.child.signalCode !== null)) return true;\n\n const forcedResult = this.signalEntry(entry, 'SIGKILL');\n if (forcedResult === 'not-running') return true;\n if (forcedResult !== 'signalled') return false;\n return waitForSpawnedProcessTreeExit(pid, 2_500);\n }\n\n private signalEntry(entry: RunningTask, signal: NodeJS.Signals) {\n const pid = entry.child.pid;\n if (!pid) return 'not-running' as const;\n\n return signalRecordedProcessTreeWithResult(\n pid,\n signal,\n this.opencodeBin,\n TOKEN_GUARDIAN_LAUNCH_PROTOCOL,\n entry.launchIdentity,\n );\n }\n\n private releaseBatch(task: Task) {\n const batchId = normalizeTaskBatchId(task.batchId);\n if (batchId) this.activeBatchIds.delete(batchId);\n }\n\n private outputWithCommand(entry: RunningTask): string {\n const output = entry.output.trim();\n return `${entry.commandContext}${output ? `\\n${output}` : ''}`;\n }\n\n private resolveModel(taskModel: string | null): string | null {\n if (!taskModel || taskModel === 'default') return null;\n return taskModel;\n }\n\n private runDetached(operation: Promise<unknown>, message: string, taskId?: number): void {\n operation.catch((error) => {\n markGatewayFailure('worker', error);\n this.logError(message, error, taskId);\n });\n }\n\n private logError(message: string, error: unknown, taskId?: number) {\n console.error(JSON.stringify({\n ts: new Date().toISOString(),\n level: 'error',\n msg: message,\n taskId,\n error: error instanceof Error ? error.message : String(error),\n }));\n }\n}\n","import { sqlite } from '@core/db';\n\nconst LOCK_STALE_MS = 30_000;\n\ntype GatewayComponent = 'worker' | 'scheduler' | 'watchdog' | 'watchdogCleanup';\n\ninterface GatewayHealthConfig {\n workerPollIntervalMs: number;\n schedulerEnabled: boolean;\n schedulerCheckIntervalMs: number;\n watchdogCheckIntervalMs: number;\n watchdogCleanupIntervalMs: number;\n}\n\ninterface HealthState {\n startedAt: number;\n config: GatewayHealthConfig;\n lastActivityAt: Record<GatewayComponent, number>;\n lastSuccessAt: Record<GatewayComponent, number>;\n consecutiveFailures: Record<GatewayComponent, number>;\n lastError: Record<GatewayComponent, { at: number; message: string } | null>;\n}\n\nlet state: HealthState | null = null;\n\nexport function initializeGatewayHealth(config: GatewayHealthConfig): void {\n const now = Date.now();\n state = {\n startedAt: now,\n config,\n lastActivityAt: {\n worker: now,\n scheduler: now,\n watchdog: now,\n watchdogCleanup: now,\n },\n lastSuccessAt: {\n worker: now,\n scheduler: now,\n watchdog: now,\n watchdogCleanup: now,\n },\n consecutiveFailures: {\n worker: 0,\n scheduler: 0,\n watchdog: 0,\n watchdogCleanup: 0,\n },\n lastError: {\n worker: null,\n scheduler: null,\n watchdog: null,\n watchdogCleanup: null,\n },\n };\n}\n\nexport function markGatewayActivity(component: GatewayComponent): void {\n if (state) state.lastActivityAt[component] = Date.now();\n}\n\nexport function markGatewaySuccess(component: GatewayComponent): void {\n if (!state) return;\n const now = Date.now();\n state.lastActivityAt[component] = now;\n state.lastSuccessAt[component] = now;\n state.consecutiveFailures[component] = 0;\n}\n\nexport function markGatewayFailure(component: GatewayComponent, error: unknown): void {\n if (!state) return;\n const now = Date.now();\n state.lastActivityAt[component] = now;\n state.consecutiveFailures[component] += 1;\n state.lastError[component] = {\n at: now,\n message: error instanceof Error ? error.message : String(error),\n };\n}\n\nexport function resetGatewayHealth(): void {\n state = null;\n}\n\nfunction componentStatus(\n component: GatewayComponent,\n enabled: boolean,\n maxAgeMs: number,\n now: number,\n) {\n const lastActivityAt = state?.lastActivityAt[component] ?? null;\n const ageMs = lastActivityAt == null ? null : Math.max(0, now - lastActivityAt);\n const consecutiveFailures = state?.consecutiveFailures[component] ?? 0;\n return {\n enabled,\n healthy: !enabled || (\n ageMs != null\n && ageMs <= maxAgeMs\n && consecutiveFailures === 0\n ),\n lastActivityAt,\n lastSuccessAt: state?.lastSuccessAt[component] ?? null,\n consecutiveFailures,\n lastError: state?.lastError[component] ?? null,\n ageMs,\n maxAgeMs,\n };\n}\n\nexport function getGatewayHealth(now = Date.now()) {\n const worker = componentStatus(\n 'worker',\n true,\n Math.max((state?.config.workerPollIntervalMs ?? 1000) * 5, 5000),\n now,\n );\n const scheduler = componentStatus(\n 'scheduler',\n state?.config.schedulerEnabled ?? false,\n Math.max((state?.config.schedulerCheckIntervalMs ?? 1000) * 5, 5000),\n now,\n );\n const watchdog = componentStatus(\n 'watchdog',\n true,\n Math.max((state?.config.watchdogCheckIntervalMs ?? 60_000) * 3, 5000),\n now,\n );\n const watchdogCleanup = componentStatus(\n 'watchdogCleanup',\n true,\n Math.max((state?.config.watchdogCleanupIntervalMs ?? 86_400_000) * 2, 60_000),\n now,\n );\n\n let lock: {\n pid: number | null;\n heartbeatAt: number | null;\n readyAt: number | null;\n ageMs: number | null;\n healthy: boolean;\n } = { pid: null, heartbeatAt: null, readyAt: null, ageMs: null, healthy: false };\n\n try {\n const row = sqlite.prepare(\n 'SELECT pid, heartbeat_at, ready_at FROM gateway_lock WHERE id = 1',\n ).get() as { pid: number; heartbeat_at: number; ready_at: number | null } | undefined;\n if (row) {\n const ageMs = Math.max(0, now - row.heartbeat_at);\n lock = {\n pid: row.pid,\n heartbeatAt: row.heartbeat_at,\n readyAt: row.ready_at,\n ageMs,\n healthy: row.pid === process.pid && row.ready_at != null && ageMs < LOCK_STALE_MS,\n };\n }\n } catch {\n }\n\n const healthy = state != null\n && lock.healthy\n && worker.healthy\n && scheduler.healthy\n && watchdog.healthy\n && watchdogCleanup.healthy;\n\n return {\n status: healthy ? 'ok' as const : 'degraded' as const,\n pid: process.pid,\n uptimeMs: state ? Math.max(0, now - state.startedAt) : 0,\n lock,\n components: { worker, scheduler, watchdog, watchdogCleanup },\n };\n}\n"],"mappings":"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","names":["Database","value","startFrom","ref","actions","sql","otel","rawTracer","param","sql","join","placeholder","name","SQL","name","result","index","relations","ForeignKeyBuilder","ForeignKey","uniqueKeyName","UniqueConstraintBuilder","UniqueConstraint","UniqueOnConstraintBuilder","uniqueKeyName","ref","actions","ForeignKeyBuilder","uniqueKeyName","InlineForeignKeys","name","index","table","select","sql","joinOn","field","join","join","sql","db","instance","drizzle","db","Database","tasks","taskRuns","failed","sqlite","fileURLToPath","dirname","dirname","fileURLToPath","index","executableIndex","tasks","taskRuns","fileURLToPath","existsSync","dirname","join","dirname","fileURLToPath","join","existsSync","text","resolve","output","log"]}