@wirecat/cli-core 0.432.0 → 0.434.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/cli/messenger/store-maintenance-command.js +5 -2
  3. package/dist/cli/upgrade-command.js +1 -1
  4. package/dist/entities/index.d.ts +10 -3
  5. package/dist/entities/store-maintenance.d.ts +10 -3
  6. package/dist/entities/store-maintenance.js +10 -1
  7. package/dist/errors/reasons.js +7 -0
  8. package/dist/models/anthropic.js +2 -4
  9. package/dist/store/drivers/bun-sqlite.d.ts +6 -0
  10. package/dist/store/drivers/bun-sqlite.js +16 -1
  11. package/dist/store/drivers/node-sqlite.d.ts +5 -1
  12. package/dist/store/drivers/node-sqlite.js +16 -1
  13. package/dist/store/exports.d.ts +1 -0
  14. package/dist/store/exports.js +1 -0
  15. package/dist/store/sqlite/document-pictures.js +4 -1
  16. package/dist/store/sqlite/drizzle/bun.js +58 -14
  17. package/dist/store/sqlite/drizzle/bun.js.map +3 -3
  18. package/dist/store/sqlite/drizzle/core.js +173 -7
  19. package/dist/store/sqlite/drizzle/core.js.map +4 -4
  20. package/dist/store/sqlite/drizzle/node.js +57 -13
  21. package/dist/store/sqlite/drizzle/node.js.map +3 -3
  22. package/dist/store/sqlite/drizzle/shared-55XJMTPA.js +6514 -0
  23. package/dist/store/sqlite/drizzle/shared-55XJMTPA.js.map +7 -0
  24. package/dist/store/sqlite/image-chunks.d.ts +1 -1
  25. package/dist/store/sqlite/image-chunks.js +46 -13
  26. package/dist/store/sqlite/manifest.js +2 -0
  27. package/dist/store/sqlite/message-chunks.d.ts +5 -2
  28. package/dist/store/sqlite/message-chunks.js +42 -13
  29. package/dist/store/sqlite/migrations.generated.js +22 -0
  30. package/dist/store/sqlite/open-store.js +4 -0
  31. package/dist/store/sqlite/open.js +5 -6
  32. package/dist/store/sqlite/schema/canonical-tags.d.ts +1 -0
  33. package/dist/store/sqlite/schema/document-index-pending.d.ts +1 -0
  34. package/dist/store/sqlite/schema/document-transfers.d.ts +1 -0
  35. package/dist/store/sqlite/schema/tag-consolidations.d.ts +2 -0
  36. package/dist/store/sqlite/schema.d.ts +214 -0
  37. package/dist/store/sqlite/schema.js +17 -0
  38. package/dist/store/sqlite/vector-index.d.ts +67 -0
  39. package/dist/store/sqlite/vector-index.js +180 -0
  40. package/dist/store/sqlite/vectors.d.ts +6 -3
  41. package/dist/store/sqlite/vectors.js +71 -31
  42. package/dist/store/vector-extension.d.ts +10 -0
  43. package/dist/store/vector-extension.js +53 -0
  44. package/package.json +24 -25
  45. package/dist/store/sqlite/drizzle/shared-HKXF6HKX.js +0 -4846
  46. package/dist/store/sqlite/drizzle/shared-HKXF6HKX.js.map +0 -7
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/entity.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/errors.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/table.utils.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/table.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/column-common.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/column.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sql/common-chunks.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/view-common.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/view.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/subquery.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/tracing.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sql/sql.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sql/expressions/conditions.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sql/expressions/select.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/column-builder.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/foreign-keys.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/columns/common.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/utils.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/codecs.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/codecs.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/columns/blob.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/columns/integer.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/columns/real.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/columns/text.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/columns/custom.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/columns/numeric.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/columns/all.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/casing.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/table.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/alias.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/logger.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/query-promise.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/relations.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/dialect.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/view-base.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/selection-proxy.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/used-tables.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/query-builders/query-builder.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/query-builders/select.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/query-builders/query-builder.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/session.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/query-builders/count.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/async/count.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/query-builders/query.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/async/query.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/query-builders/delete.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/async/delete.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/query-builders/insert.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/async/insert.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/query-builders/raw.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/async/raw.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/async/select.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/query-builders/update.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/async/update.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/async/db.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/cache/core/cache.ts", "../../../../node_modules/.pnpm/drizzle-orm@1.0.0-rc.5_@opentelemetry+api@1.10.0_valibot@1.5.0_typescript@7.0.2__zod@4.6.7/node_modules/src/sqlite-core/async/session.ts"],
4
+ "sourcesContent": ["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\nconst kindsByConstructor = new WeakMap<object, Set<string>>();\nfunction collectKinds(ctor: object): Set<string> {\n\tconst kinds = new Set<string>();\n\tfor (let cls: any = ctor; cls; cls = Object.getPrototypeOf(cls)) {\n\t\tif (entityKind in cls) kinds.add(cls[entityKind]);\n\t}\n\tkindsByConstructor.set(ctor, kinds);\n\treturn kinds;\n}\n\nconst nativeHasInstance = Function.prototype[Symbol.hasInstance];\nexport function is<T extends DrizzleEntityClass<any>>(value: any, type: T): value is InstanceType<T> {\n\t// `instanceof` would loop back to `is` due to `Symbol.hasInstance` redefinitions\n\tif (nativeHasInstance.call(type, value)) return true;\n\tif (value === null || typeof value !== 'object') return false;\n\n\tconst ctor = Object.getPrototypeOf(value)?.constructor;\n\tif (typeof ctor !== 'function') return false;\n\n\treturn (kindsByConstructor.get(ctor) ?? collectKinds(ctor)).has(type[entityKind]);\n}\n\nexport function entityKindsOf(value: unknown): Set<string> | undefined {\n\tif (value === null || typeof value !== 'object') return undefined;\n\n\tconst ctor = Object.getPrototypeOf(value)?.constructor;\n\tif (typeof ctor !== 'function') return undefined;\n\n\treturn kindsByConstructor.get(ctor) ?? collectKinds(ctor);\n}\n", "import { entityKind, is } from '~/entity.ts';\n\nexport class DrizzleError extends Error {\n\tstatic readonly [entityKind]: string = 'DrizzleError';\n\n\tstatic override [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\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 DrizzleQueryError extends Error {\n\tstatic readonly [entityKind]: string = 'DrizzleQueryError';\n\n\tstatic override [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tconstructor(\n\t\tpublic query: string,\n\t\tpublic params: any[] | undefined,\n\t\tpublic override cause?: Error,\n\t) {\n\t\tsuper(params ? `Failed query: ${query}\\nparams: ${params}` : `Failed query: ${query}`);\n\t\tthis.name = 'DrizzleQueryError';\n\t\tError.captureStackTrace(this, DrizzleQueryError);\n\n\t\t// ES2022+: preserves original error on `.cause`\n\t\tif (cause) (this as any).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\tthis.name = 'TransactionRollbackError';\n\t}\n}\n", "import { DrizzleError } from '~/errors.ts';\n\n/** @internal */\nexport const TableName = Symbol.for('drizzle:Name');\n\n/** @internal */\nexport const TableSchema = Symbol.for('drizzle:Schema');\n\n/** @internal */\nexport const TableColumns = 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 CacheKey = Symbol.for('drizzle:CacheKey');\n\n/** @internal */\nexport const IsAlias = Symbol.for('drizzle:IsAlias');\n\n/** @internal */\nexport const Qualifier = Symbol.for('drizzle:Qualifier');\n\n/** @internal */\nexport const ExtraConfigBuilder = Symbol.for('drizzle:ExtraConfigBuilder');\n\nfunction describeExtraConfigValue(value: unknown): string {\n\tif (value === null) return 'null';\n\tif (Array.isArray(value)) return 'an array';\n\tif (typeof value !== 'object') return `a ${typeof value}`;\n\n\tconst keys = Object.keys(value);\n\treturn keys.length === 0\n\t\t? 'a plain object'\n\t\t: `a plain object with keys ${keys.map((key) => `\"${key}\"`).join(', ')}`;\n}\n\n/**\n * Thrown when a table's extra config callback returns something that isn't a builder,\n * which would otherwise be dropped silently and leave the declared index or constraint\n * missing from every generated migration.\n *\n * @internal\n */\nexport function throwUnknownExtraConfigValue(tableName: string, value: unknown): never {\n\tconst hint = value !== null && typeof value === 'object' && !Array.isArray(value)\n\t\t? ' Builders must be returned as elements of the array, not wrapped in an object:'\n\t\t\t+ ' `(t) => [index(\"name\").on(t.id)]`, not `(t) => [{ myIndex: index(\"name\").on(t.id) }]`.'\n\t\t: '';\n\n\tthrow new DrizzleError({\n\t\tmessage: `Invalid extra config value for table \"${tableName}\": expected an index or constraint builder,`\n\t\t\t+ ` but received ${describeExtraConfigValue(value)}.${hint}`,\n\t});\n}\n", "import type { View } from '~/view.ts';\nimport type { Column, Columns, GetColumnData } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport type { OptionalKeyOnly, RequiredKeyOnly } from './operations.ts';\nimport type { SQLChunk } from './sql/sql.ts';\nimport {\n\tBaseName,\n\tCacheKey,\n\tExtraConfigBuilder,\n\tExtraConfigColumns,\n\tIsAlias,\n\tOriginalName,\n\tQualifier,\n\tTableColumns,\n\tTableName,\n\tTableSchema,\n} from './table.utils.ts';\n\n/** @internal */\nexport {\n\tBaseName,\n\tCacheKey,\n\tExtraConfigBuilder,\n\tExtraConfigColumns,\n\tIsAlias,\n\tOriginalName,\n\tQualifier,\n\tTableColumns,\n\tTableSchema,\n} from './table.utils.ts';\nimport type { Simplify, Update } from './utils.ts';\n\nexport interface TableConfig<TColumns extends Columns = Columns> {\n\tname: string;\n\tschema: string | undefined;\n\tcolumns: TColumns;\n\tdialect: string;\n\tisAlias: boolean;\n}\n\nexport type UpdateTableConfig<T extends TableConfig, TUpdate extends Partial<TableConfig>> = Required<\n\tUpdate<T, TUpdate>\n>;\n\nconst IsDrizzleTable = Symbol.for('drizzle:IsDrizzleTable');\n\nexport interface TableTypeConfig<T extends TableConfig> {\n\treadonly brand: 'Table';\n\treadonly name: T['name'];\n\treadonly schema: T['schema'];\n\treadonly columns: T['columns'];\n\treadonly dialect: T['dialect'];\n\treadonly isAlias: T['isAlias'];\n}\n\nexport class Table<out T extends TableConfig = TableConfig> {\n\tstatic readonly [entityKind]: string = 'Table';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tdeclare readonly _: TableTypeConfig<T>;\n\n\t/** @internal */\n\tstatic readonly Symbol = {\n\t\tName: TableName as typeof TableName,\n\t\tSchema: TableSchema as typeof TableSchema,\n\t\tOriginalName: OriginalName as typeof OriginalName,\n\t\tColumns: TableColumns as typeof TableColumns,\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\tCacheKey: CacheKey as typeof CacheKey,\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[TableSchema]: string | undefined;\n\n\t/** @internal */\n\t[TableColumns]!: T['columns'];\n\n\t/** @internal */\n\t[ExtraConfigColumns]!: Record<string, unknown>;\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/**\n\t * @internal\n\t * Table's identity in the query cache's invalidation index - its actual name (`schema.name`, or `name`\n\t * when unscoped), matching {@link getTableUniqueName} of non-aliased tables\n\t */\n\t[CacheKey]: string;\n\n\t/** @internal */\n\tdeclare readonly [Qualifier]: SQLChunk;\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[TableSchema] = schema;\n\t\tthis[BaseName] = baseName;\n\t\tthis[CacheKey] = schema ? `${schema}.${name}` : name;\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 | View>(table: T): T['_']['name'] {\n\treturn table[TableName];\n}\n\nexport function getTableSchema<T extends Table | View>(table: T): T['_']['schema'] {\n\treturn table[TableSchema];\n}\n\nexport function isTableAlias<T extends Table | View>(table: T): T['_']['isAlias'] {\n\treturn table[IsAlias];\n}\n\nexport function getTableUniqueName<\n\tT extends Table | View,\n\tTResult extends string = T['_']['isAlias'] extends true ? T['_']['name']\n\t\t: T['_']['schema'] extends undefined ? T['_']['name']\n\t\t: `${T['_']['schema']}.${T['_']['name']}`,\n>(\n\ttable: T,\n): TResult {\n\treturn (table[IsAlias] || table[TableSchema] === undefined\n\t\t? table[TableName]\n\t\t: `${table[TableSchema]}.${table[TableName]}`) as TResult;\n}\n\nexport function getCacheKey(table: Table): string {\n\treturn table[CacheKey];\n}\n\n/**\n * Compatibility for _relations, to be removed\n *\n * @internal\n */\nexport function getLegacyTableUniqueName<\n\tT extends Table | View,\n\tTResult extends string = T['_']['schema'] extends undefined ? `public.${T['_']['name']}`\n\t\t: `${T['_']['schema']}.${T['_']['name']}`,\n>(\n\ttable: T,\n): TResult {\n\treturn `${table[TableSchema] ?? 'public'}.${table[TableName]}` as TResult;\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 Columns,\n\tTInferMode extends 'select' | 'insert' = 'select',\n\tTConfig extends { 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\tKey,\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\tKey,\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\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> = InferModelFromColumns<TTable['_']['columns'], TInferMode>;\n\nexport type InferSelectModel<\n\tTTable extends Table,\n> = InferModelFromColumns<TTable['_']['columns'], 'select'>;\n\nexport type InferInsertModel<\n\tTTable extends Table,\n\tTOverride extends { override?: boolean } = { override: false },\n> = InferModelFromColumns<TTable['_']['columns'], 'insert', TOverride>;\n\nexport type InferEnum<T> = T extends { enumValues: readonly (infer U)[] } ? U\n\t: never;\n\nexport interface InferTableColumnsModels<TColumns extends Columns> {\n\treadonly $inferSelect: InferModelFromColumns<TColumns, 'select'>;\n\treadonly $inferInsert: InferModelFromColumns<TColumns, 'insert', { override: false }>;\n}\n\nexport type RequiredInsertKeys<TTable extends Table, TColumns extends Record<string, Column> = TTable['_']['columns']> =\n\t{\n\t\t[K in keyof TColumns & string]: RequiredKeyOnly<K, TColumns[K]>;\n\t}[keyof TColumns & string];\n", "export const OriginalColumn = Symbol.for('drizzle:OriginalColumn');\n", "import type {\n\tColumnBuilderRuntimeConfig,\n\tColumnType,\n\tGeneratedColumnConfig,\n\tGeneratedIdentityConfig,\n} from './column-builder.ts';\nimport { OriginalColumn } from './column-common.ts';\nimport { entityKind, is } from './entity.ts';\nimport type { DriverValueDecoderFn, DriverValueEncoderFn, DriverValueMapper, SQL, SQLWrapper } from './sql/sql.ts';\nimport type { Table } from './table.ts';\nimport type { Update } from './utils.ts';\n\nexport type Columns = Record<string, Column<any>>;\n\nexport interface ColumnBaseConfig<TDataType extends ColumnType> {\n\tname: string;\n\tdataType: TDataType;\n\ttableName: string;\n\tnotNull: boolean;\n\thasDefault: boolean;\n\tisPrimaryKey: boolean;\n\tisAutoincrement: boolean;\n\thasRuntimeDefault: boolean;\n\tdata: unknown;\n\tdriverParam: unknown;\n\tenumValues: string[] | undefined;\n\tgenerated: unknown;\n\tidentity: undefined | 'always' | 'byDefault';\n}\n\nconst noop: DriverValueDecoderFn<any, any> | DriverValueEncoderFn<any, any> = (v) => v;\nnoop.isNoop = true;\n\nexport interface Column<\n\tout T extends ColumnBaseConfig<ColumnType> = ColumnBaseConfig<ColumnType>,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tout TRuntimeConfig extends object = object,\n> extends DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n\t// `as` runtime implementation is defined in 'alias.ts'\n\tas(alias: string): this;\n}\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\tout T extends ColumnBaseConfig<ColumnType> = ColumnBaseConfig<ColumnType>,\n\tout TRuntimeConfig extends object = object,\n> implements DriverValueMapper<T['data'], T['driverParam']>, SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Column';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tdeclare readonly _: T;\n\n\t/** @internal */\n\treadonly codec?: string;\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: string;\n\treadonly enumValues: T['enumValues'] = undefined;\n\treadonly generated: GeneratedColumnConfig<T['data']> | undefined = undefined;\n\treadonly generatedIdentity: GeneratedIdentityConfig | undefined = undefined;\n\treadonly length: number | undefined;\n\treadonly isLengthExact: boolean | undefined;\n\treadonly isAlias: boolean;\n\n\t/** @internal */\n\tprotected config: ColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig;\n\n\t/** @internal */\n\treadonly table: Table;\n\n\t/** @internal */\n\tprotected onInit(): void {}\n\n\tconstructor(\n\t\ttable: Table,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig,\n\t) {\n\t\tthis.config = config;\n\t\tthis.onInit();\n\t\tthis.table = table;\n\n\t\tthis.name = config.name;\n\t\tthis.isAlias = false;\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\tthis.length = (<{ length?: number }> config)['length'];\n\t\tthis.isLengthExact = (<{ isLengthExact?: boolean }> config)['isLengthExact'];\n\t}\n\n\tabstract getSQLType(): string;\n\n\tmapFromDriverValue = noop;\n\n\tmapToDriverValue = noop;\n\n\t// TODO: Revisit\n\t/** @internal */\n\tpostBuild() {\n\t\treturn this;\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\t/** @internal */\n\t[OriginalColumn](): this {\n\t\treturn this;\n\t}\n}\n\nexport type UpdateColConfig<\n\tT extends ColumnBaseConfig<ColumnType>,\n\tTUpdate extends Partial<ColumnBaseConfig<ColumnType>>,\n> = Update<T, TUpdate>;\n\nexport type AnyColumn<TPartial extends Partial<ColumnBaseConfig<ColumnType>> = {}> = Column<\n\tRequired<Update<ColumnBaseConfig<ColumnType>, 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\nexport function getColumnTable<TTable extends Table<any> = Table<any>>(column: Column<any>): TTable {\n\treturn column.table as TTable;\n}\n", "import { entityKind, is } from '~/entity.ts';\nimport type { SQLWrapper } from './sql.ts';\n\nexport interface StringChunk extends SQLWrapper {\n\t// SQLWrapper runtime implementation is defined in 'sql/sql.ts'\n}\nexport class StringChunk implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'StringChunk';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tconstructor(readonly value: string) {}\n}\n\n/** Shared string chunks, keyed by their values */\nexport const commonStringChunks = {\n\t', ': new StringChunk(', '),\n\t' ': new StringChunk(' '),\n\t'(': new StringChunk('('),\n\t')': new StringChunk(')'),\n\t'((': new StringChunk('(('),\n\t'))': new StringChunk('))'),\n\t'), (': new StringChunk('), ('),\n\t'.': new StringChunk('.'),\n\tdefault: new StringChunk('default'),\n\tnull: new StringChunk('null'),\n\t'1 = 0': new StringChunk('1 = 0'),\n\t'1 = 1': new StringChunk('1 = 1'),\n\t// Operators\n\t' = ': new StringChunk(' = '),\n\t' <> ': new StringChunk(' <> '),\n\t' > ': new StringChunk(' > '),\n\t' >= ': new StringChunk(' >= '),\n\t' < ': new StringChunk(' < '),\n\t' <= ': new StringChunk(' <= '),\n\t' in ': new StringChunk(' in '),\n\t' not in ': new StringChunk(' not in '),\n\t') and (': new StringChunk(') and ('),\n\t') or (': new StringChunk(') or ('),\n\t'not (': new StringChunk('not ('),\n\t// Clauses\n\t'with ': new StringChunk('with '),\n\t'select ': new StringChunk('select '),\n\t'(select ': new StringChunk('(select '),\n\t'values ': new StringChunk('values '),\n\t' from ': new StringChunk(' from '),\n\t'.* from ': new StringChunk('.* from '),\n\t' as ': new StringChunk(' as '),\n\t') as ': new StringChunk(') as '),\n\t' inner join ': new StringChunk(' inner join '),\n\t' cross join ': new StringChunk(' cross join '),\n\t' on ': new StringChunk(' on '),\n\t' where ': new StringChunk(' where '),\n\t' order by ': new StringChunk(' order by '),\n\t' asc': new StringChunk(' asc'),\n\t' desc': new StringChunk(' desc'),\n\t' limit ': new StringChunk(' limit '),\n\t' limit 1': new StringChunk(' limit 1'),\n\t' offset ': new StringChunk(' offset '),\n\t'top(1) ': new StringChunk('top(1) '),\n\t// Relational queries\n\t'exists (select * from ': new StringChunk('exists (select * from '),\n\t'not exists (select * from ': new StringChunk('not exists (select * from '),\n\t'select count(*) as ': new StringChunk('select count(*) as '),\n\t'(select count(*) from ': new StringChunk('(select count(*) from '),\n\t'min(': new StringChunk('min('),\n\t'max(': new StringChunk('max('),\n\t'count(': new StringChunk('count('),\n\t'avg(': new StringChunk('avg('),\n\t'first(': new StringChunk('first('),\n} as const satisfies Record<string, StringChunk>;\n", "export const ViewBaseConfig = Symbol.for('drizzle:ViewBaseConfig');\n", "import { entityKind, is } from '~/entity.ts';\nimport type { SelectResult } from '~/query-builders/select.types.ts';\nimport type { ColumnsSelection, SQL, SQLChunk } from '~/sql/sql.ts';\nimport { IsAlias, OriginalName, Qualifier, TableColumns, TableName, TableSchema } from '~/table.utils.ts';\nimport type { Equal, Update } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\n\nconst IsDrizzleView = Symbol.for('drizzle:IsDrizzleView');\n\nexport interface ViewConfig<TSelection extends ColumnsSelection = ColumnsSelection> {\n\tname: string;\n\tschema: string | undefined;\n\texisting: boolean;\n\tselectedFields: TSelection;\n\tisAlias: boolean;\n}\n\nexport type UpdateViewConfig<T extends ViewConfig, TUpdate extends Partial<ViewConfig>> = Required<Update<T, TUpdate>>;\n\nexport type ViewQuery<TExisting extends boolean> = TExisting extends true ? undefined : SQL;\n\nexport interface ViewTypeConfig<T extends ViewConfig> {\n\treadonly brand: 'View';\n\treadonly viewBrand: string;\n\treadonly name: T['name'];\n\treadonly schema: T['schema'];\n\treadonly existing: T['existing'];\n\treadonly selectedFields: T['selectedFields'];\n\treadonly isAlias: T['isAlias'];\n}\n\n/**\n * Any view with a subset of its config overridden, e.g. `AnyView<{ name: 'my_view' }>`.\n */\nexport type AnyView<TPartial extends Partial<ViewConfig>> = View<UpdateViewConfig<ViewConfig, TPartial>>;\n\nexport abstract class View<T extends ViewConfig = ViewConfig> {\n\tstatic readonly [entityKind]: string = 'View';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tdeclare _: ViewTypeConfig<T>;\n\n\t/** @internal */\n\t[ViewBaseConfig]: {\n\t\tname: T['name'];\n\t\toriginalName: T['name'];\n\t\tschema: T['schema'];\n\t\tselectedFields: ColumnsSelection;\n\t\tisExisting: T['existing'];\n\t\tquery: ViewQuery<T['existing']>;\n\t\tisAlias: boolean;\n\t};\n\n\t/** @internal */\n\t[IsDrizzleView] = true;\n\n\t/** @internal */\n\tpublic get [TableName]() {\n\t\treturn this[ViewBaseConfig].name;\n\t}\n\n\t/** @internal */\n\tpublic get [TableSchema]() {\n\t\treturn this[ViewBaseConfig].schema;\n\t}\n\n\t/** @internal */\n\tpublic get [IsAlias]() {\n\t\treturn this[ViewBaseConfig].isAlias;\n\t}\n\n\t/** @internal */\n\tpublic get [OriginalName]() {\n\t\treturn this[ViewBaseConfig].originalName;\n\t}\n\n\t/** @internal */\n\tpublic get [TableColumns]() {\n\t\treturn (this[ViewBaseConfig].selectedFields) as any as Record<string, unknown>;\n\t}\n\n\t/** @internal */\n\tdeclare readonly [Qualifier]: SQLChunk;\n\n\tdeclare readonly $inferSelect: InferViewSelectModel<View<T>>;\n\n\tconstructor(\n\t\t{ name, schema, selectedFields, query }: {\n\t\t\tname: T['name'];\n\t\t\tschema: T['schema'];\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 ViewQuery<T['existing']>,\n\t\t\tisExisting: !query as T['existing'],\n\t\t\tisAlias: false,\n\t\t};\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 InferViewSelectModel<TView extends View<any>> =\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", "import { entityKind, is } from './entity.ts';\nimport type { SQL, SQLChunk, SQLWrapper } from './sql/sql.ts';\nimport { IsAlias, OriginalName, Qualifier, TableColumns, TableName, TableSchema } from './table.utils.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\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\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\t/** @internal */\n\tdeclare readonly [Qualifier]: SQLChunk;\n\n\t/** @internal */\n\tpublic get [TableName](): string {\n\t\treturn this._.alias;\n\t}\n\n\t/** @internal */\n\tpublic get [TableSchema](): string | undefined {\n\t\treturn undefined;\n\t}\n\n\t/** @internal */\n\tpublic get [OriginalName](): string {\n\t\treturn this._.alias;\n\t}\n\n\t/** @internal */\n\tpublic get [IsAlias](): boolean {\n\t\treturn false;\n\t}\n\n\t/** @internal */\n\tpublic get [TableColumns](): Record<string, unknown> {\n\t\treturn this._.selectedFields as Record<string, unknown>;\n\t}\n\n\tconstructor(sql: SQL, fields: TSelectedFields, alias: string, isWith = false) {\n\t\tthis._ = {\n\t\t\tbrand: 'Subquery',\n\t\t\tsql,\n\t\t\tselectedFields: fields 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", "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; // oxlint-disable-line\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\nexport const hasTelemetry = !!otel;\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',\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", "import type { CodecsCollection, ResolvedCodecs } from '~/codecs.ts';\nimport { entityKind, entityKindsOf, is } from '~/entity.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { hasTelemetry, tracer } from '~/tracing.ts';\nimport type { Equal } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { View } from '~/view.ts';\nimport type { AnyColumn } from '../column.ts';\nimport { Column } from '../column.ts';\nimport { IsAlias, Table } from '../table.ts';\nimport { CacheKey, Qualifier, TableName, TableSchema } from '../table.utils.ts';\nimport { commonStringChunks, StringChunk } from './common-chunks.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\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\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\tescapeName(name: string): string;\n\tescapeParam(num: number, value: unknown): string;\n\tescapeString(str: string): string;\n\tcodecs?: CodecsCollection;\n\tparamStartIndex?: { value: number };\n\tinlineParams?: boolean;\n\tinvokeSource?: 'indexes' | 'mssql-check' | 'mssql-view-with-schemabinding' | undefined;\n\ttagged?: true;\n}\n\nexport interface Query {\n\tsql: string;\n\tparams: unknown[];\n\t_sql?: TemplateStringsArray;\n\t// ^ TODO: revisit\n\t// for Bun.SQL cache performance\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<T = unknown> {\n\tgetSQL(): SQL<T>;\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\nexport class SQL<T = unknown> implements SQLWrapper<T> {\n\tstatic readonly [entityKind]: string = 'SQL';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tdeclare _: {\n\t\tbrand: 'SQL';\n\t\ttype: T;\n\t};\n\n\t/** @internal */\n\tdecoder: DriverValueDecoder<T, any> = noopDecoder;\n\t/** @internal */\n\tpublic 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): Query {\n\t\tif (!hasTelemetry) return this.buildQueryFromSourceParams(this.queryChunks, config);\n\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 out = { sql: '' };\n\t\tconst params: unknown[] = [];\n\t\tconst bounds: number[] | undefined = _config.tagged ? [] : undefined;\n\n\t\tthis.collectSQL(\n\t\t\tchunks,\n\t\t\t_config,\n\t\t\t_config.paramStartIndex || { value: 0 },\n\t\t\t_config.inlineParams || this.shouldInlineParams,\n\t\t\tout,\n\t\t\tparams,\n\t\t\tbounds,\n\t\t);\n\n\t\tconst query = out.sql;\n\t\tif (bounds === undefined) {\n\t\t\treturn {\n\t\t\t\tsql: query,\n\t\t\t\tparams,\n\t\t\t} as Query;\n\t\t}\n\n\t\tconst segments: string[] = new Array(bounds.length);\n\t\tfor (let i = 0; i < bounds.length; ++i) {\n\t\t\tsegments[i] = query.slice(bounds[i], i + 1 < bounds.length ? bounds[i + 1] : query.length);\n\t\t}\n\n\t\treturn {\n\t\t\tsql: query,\n\t\t\tparams,\n\t\t\t_sql: Object.assign(segments, { raw: segments }),\n\t\t} as Query;\n\t}\n\n\tprivate collectSQL(\n\t\tchunks: SQLChunk[],\n\t\tconfig: BuildQueryConfig,\n\t\tparamStartIndex: { value: number },\n\t\tinlineParams: boolean,\n\t\tout: { sql: string },\n\t\tparams: unknown[],\n\t\tbounds: number[] | undefined,\n\t): void {\n\t\tconst {\n\t\t\tescapeName,\n\t\t\tescapeParam,\n\t\t\tcodecs,\n\t\t\tinvokeSource,\n\t\t} = config;\n\n\t\tfor (let i = 0; i < chunks.length; ++i) {\n\t\t\tif (bounds !== undefined) bounds.push(out.sql.length);\n\n\t\t\tconst chunk = chunks[i]!;\n\t\t\tconst kind = chunkKindOf(chunk);\n\n\t\t\tif (isChunk(chunk, kind, chunkKinds.string)) {\n\t\t\t\tout.sql += chunk.value ?? '';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isChunk(chunk, kind, chunkKinds.sql)) {\n\t\t\t\tthis.collectSQL(\n\t\t\t\t\tchunk.queryChunks,\n\t\t\t\t\tconfig,\n\t\t\t\t\tparamStartIndex,\n\t\t\t\t\tinlineParams || chunk.shouldInlineParams,\n\t\t\t\t\tout,\n\t\t\t\t\tparams,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isChunk(chunk, kind, chunkKinds.name)) {\n\t\t\t\tout.sql += escapeName(chunk.value);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (chunk === undefined) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isChunk(chunk, kind, chunkKinds.column)) {\n\t\t\t\tconst columnName = chunk.name;\n\t\t\t\tif (invokeSource === 'indexes') {\n\t\t\t\t\tout.sql += escapeName(columnName);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst schemaName = invokeSource === 'mssql-check' ? undefined : chunk.table[Table.Symbol.Schema];\n\t\t\t\tout.sql += chunk.isAlias ? escapeName(chunk.name) : chunk.table[IsAlias] || schemaName === undefined\n\t\t\t\t\t? escapeName(chunk.table[Table.Symbol.Name]) + '.' + escapeName(columnName)\n\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(chunk.table[Table.Symbol.Name]) + '.'\n\t\t\t\t\t\t+ escapeName(columnName);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isChunk(chunk, kind, chunkKinds.param)) {\n\t\t\t\tconst paramValue = chunk.value;\n\t\t\t\tconst valueKind = chunkKindOf(paramValue);\n\n\t\t\t\tif (isChunk(paramValue, valueKind, chunkKinds.sql)) {\n\t\t\t\t\tconst nested = paramValue;\n\t\t\t\t\tthis.collectSQL(\n\t\t\t\t\t\tnested.queryChunks,\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tparamStartIndex,\n\t\t\t\t\t\tinlineParams || nested.shouldInlineParams,\n\t\t\t\t\t\tout,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst encoder = chunk.encoder;\n\t\t\t\tconst paramCodecs = codecs && chunkKindOf(encoder) === chunkKinds.column\n\t\t\t\t\t? codecs.codecsOf(encoder as Column)\n\t\t\t\t\t: undefined;\n\n\t\t\t\tif (valueKind === chunkKinds.placeholder) {\n\t\t\t\t\tconst escaped = escapeParam(paramStartIndex.value++, chunk);\n\t\t\t\t\tconst normalize = paramCodecs?.normalizeParam;\n\t\t\t\t\tconst cast = paramCodecs?.castParam;\n\t\t\t\t\tchunk.codec = normalize\n\t\t\t\t\t\t? (value) => normalize(value, (<any> encoder).dimensions)\n\t\t\t\t\t\t: undefined;\n\t\t\t\t\tout.sql += cast\n\t\t\t\t\t\t? cast(escaped, encoder as Column, (<any> encoder).dimensions)\n\t\t\t\t\t\t: escaped;\n\t\t\t\t\tparams.push(chunk);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tthis.collectBoundValue(paramValue, encoder, paramCodecs, config, paramStartIndex, inlineParams, out, params);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isChunk(chunk, kind, chunkKinds.placeholder)) {\n\t\t\t\tout.sql += escapeParam(paramStartIndex.value++, chunk);\n\t\t\t\tparams.push(chunk);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isChunk(chunk, kind, chunkKinds.table)) {\n\t\t\t\tconst schemaName = chunk[Table.Symbol.Schema];\n\t\t\t\tconst tableName = chunk[Table.Symbol.Name];\n\n\t\t\t\tif (invokeSource === 'mssql-view-with-schemabinding') {\n\t\t\t\t\tout.sql += (schemaName === undefined ? escapeName('dbo') : escapeName(schemaName)) + '.'\n\t\t\t\t\t\t+ escapeName(tableName);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tout.sql += schemaName === undefined || chunk[IsAlias]\n\t\t\t\t\t? escapeName(tableName)\n\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(tableName);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isChunk(chunk, kind, chunkKinds.view)) {\n\t\t\t\tconst schemaName = chunk[ViewBaseConfig].schema;\n\t\t\t\tconst viewName = chunk[ViewBaseConfig].name;\n\t\t\t\tout.sql += schemaName === undefined || chunk[ViewBaseConfig].isAlias\n\t\t\t\t\t? escapeName(viewName)\n\t\t\t\t\t: escapeName(schemaName) + '.' + escapeName(viewName);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isChunk(chunk, kind, chunkKinds.aliased) && chunk.fieldAlias !== undefined) {\n\t\t\t\tout.sql += (chunk.origin !== undefined ? escapeName(chunk.origin) + '.' : '') + escapeName(chunk.fieldAlias);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isChunk(chunk, kind, chunkKinds.valueRows)) {\n\t\t\t\tconst { cells, encoders } = chunk;\n\t\t\t\tconst width = encoders.length;\n\t\t\t\tconst paramCodecs: (ResolvedCodecs | undefined)[] = new Array(width);\n\t\t\t\tfor (let j = 0; j < width; ++j) {\n\t\t\t\t\tconst encoder = encoders[j]!;\n\t\t\t\t\tparamCodecs[j] = codecs && chunkKindOf(encoder) === chunkKinds.column\n\t\t\t\t\t\t? codecs.codecsOf(encoder as Column)\n\t\t\t\t\t\t: undefined;\n\t\t\t\t}\n\n\t\t\t\tout.sql += '(';\n\t\t\t\tfor (let j = 0, column = 0; j < cells.length; ++j, ++column) {\n\t\t\t\t\tif (column === width) {\n\t\t\t\t\t\tcolumn = 0;\n\t\t\t\t\t\tout.sql += '), (';\n\t\t\t\t\t} else if (column > 0) out.sql += ', ';\n\n\t\t\t\t\tconst cell = cells[j];\n\t\t\t\t\tconst cellKind = chunkKindOf(cell);\n\t\t\t\t\tif (cellKind === chunkKinds.other) {\n\t\t\t\t\t\tthis.collectBoundValue(\n\t\t\t\t\t\t\tcell,\n\t\t\t\t\t\t\tencoders[column]!,\n\t\t\t\t\t\t\tparamCodecs[column],\n\t\t\t\t\t\t\tconfig,\n\t\t\t\t\t\t\tparamStartIndex,\n\t\t\t\t\t\t\tinlineParams,\n\t\t\t\t\t\t\tout,\n\t\t\t\t\t\t\tparams,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (isChunk(cell, cellKind, chunkKinds.string)) {\n\t\t\t\t\t\tout.sql += cell.value ?? '';\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tthis.collectSQL(\n\t\t\t\t\t\t[cellKind === chunkKinds.sql ? cell as SQL : new Param(cell, encoders[column])],\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tparamStartIndex,\n\t\t\t\t\t\tinlineParams,\n\t\t\t\t\t\tout,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\tout.sql += ')';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isChunk(chunk, kind, chunkKinds.subquery)) {\n\t\t\t\tif (chunk._.isWith) {\n\t\t\t\t\tout.sql += escapeName(chunk._.alias);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst nested = chunk._.sql;\n\t\t\t\tout.sql += '(';\n\t\t\t\tthis.collectSQL(\n\t\t\t\t\tnested.queryChunks,\n\t\t\t\t\tconfig,\n\t\t\t\t\tparamStartIndex,\n\t\t\t\t\tinlineParams || nested.shouldInlineParams,\n\t\t\t\t\tout,\n\t\t\t\t\tparams,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tout.sql += ') ' + escapeName(chunk._.alias);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (typeof chunk === 'function' && 'enumName' in chunk) {\n\t\t\t\tif ('schema' in chunk && chunk.schema) {\n\t\t\t\t\tout.sql += escapeName(chunk.schema as string) + '.' + escapeName(chunk.enumName as string);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tout.sql += escapeName(chunk.enumName as string);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isSQLWrapper(chunk)) {\n\t\t\t\tconst nested = chunk.getSQL();\n\t\t\t\tconst nestedInlineParams = inlineParams || nested.shouldInlineParams;\n\n\t\t\t\tif (chunk.shouldOmitSQLParens?.()) {\n\t\t\t\t\tthis.collectSQL(\n\t\t\t\t\t\tnested.queryChunks,\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tparamStartIndex,\n\t\t\t\t\t\tnestedInlineParams,\n\t\t\t\t\t\tout,\n\t\t\t\t\t\tparams,\n\t\t\t\t\t\tundefined,\n\t\t\t\t\t);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tout.sql += '(';\n\t\t\t\tthis.collectSQL(\n\t\t\t\t\tnested.queryChunks,\n\t\t\t\t\tconfig,\n\t\t\t\t\tparamStartIndex,\n\t\t\t\t\tnestedInlineParams,\n\t\t\t\t\tout,\n\t\t\t\t\tparams,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\tout.sql += ')';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (Array.isArray(chunk)) {\n\t\t\t\tout.sql += '(';\n\t\t\t\tconst element: SQLChunk[] = [undefined];\n\t\t\t\tfor (let j = 0; j < chunk.length; ++j) {\n\t\t\t\t\tif (j > 0) out.sql += ', ';\n\t\t\t\t\telement[0] = chunk[j];\n\t\t\t\t\tthis.collectSQL(element, config, paramStartIndex, inlineParams, out, params, undefined);\n\t\t\t\t}\n\t\t\t\tout.sql += ')';\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (inlineParams) {\n\t\t\t\tout.sql += this.mapInlineParam(chunk, config);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tout.sql += escapeParam(paramStartIndex.value++, chunk);\n\t\t\tparams.push(chunk);\n\t\t}\n\t}\n\n\tprivate collectBoundValue(\n\t\tvalue: unknown,\n\t\tencoder: DriverValueEncoder<unknown, unknown>,\n\t\tparamCodecs: ResolvedCodecs | undefined,\n\t\tconfig: BuildQueryConfig,\n\t\tparamStartIndex: { value: number },\n\t\tinlineParams: boolean,\n\t\tout: { sql: string },\n\t\tparams: unknown[],\n\t): void {\n\t\tlet mappedValue: any = value;\n\t\tif (value !== null) {\n\t\t\tif (!encoder.mapToDriverValue.isNoop) mappedValue = encoder.mapToDriverValue(value);\n\n\t\t\tif (chunkKindOf(mappedValue) === chunkKinds.sql) {\n\t\t\t\tconst nested: SQL = mappedValue;\n\t\t\t\tthis.collectSQL(\n\t\t\t\t\tnested.queryChunks,\n\t\t\t\t\tconfig,\n\t\t\t\t\tparamStartIndex,\n\t\t\t\t\tinlineParams || nested.shouldInlineParams,\n\t\t\t\t\tout,\n\t\t\t\t\tparams,\n\t\t\t\t\tundefined,\n\t\t\t\t);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst normalize = paramCodecs?.normalizeParam;\n\t\t\tif (!inlineParams && normalize) mappedValue = normalize(mappedValue, (<any> encoder).dimensions);\n\t\t}\n\n\t\tif (inlineParams) {\n\t\t\tout.sql += this.mapInlineParam(mappedValue, config);\n\t\t\treturn;\n\t\t}\n\n\t\tconst { escapeParam } = config;\n\t\tconst escaped = escapeParam(paramStartIndex.value++, mappedValue);\n\t\tconst cast = paramCodecs?.castParam;\n\t\tout.sql += cast ? cast(escaped, encoder as Column, (<any> encoder).dimensions) : escaped;\n\t\tparams.push(mappedValue);\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' || typeof chunk === 'bigint') {\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<T> {\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, Exclude<T, null>>\n\t\t\t| DriverValueDecoder<any, Exclude<T, null>>['mapFromDriverValue'],\n\t>(\n\t\tdecoder: TDecoder,\n\t): Equal<T, unknown> extends true ? SQL<GetDecoderResult<TDecoder>>\n\t\t: Equal<T, any> extends true ? SQL<GetDecoderResult<TDecoder>>\n\t\t: SQL<GetDecoderResult<TDecoder> | (null extends T ? null : never)>\n\t{\n\t\tthis.decoder = typeof decoder === 'function' ? { mapFromDriverValue: decoder } : decoder;\n\t\treturn this as SQL<any>;\n\t}\n\n\tnullable(): SQL<T | null> {\n\t\treturn this;\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\n/**\n * Ids of the chunk classes `chunkKindOf` tells apart\n */\nexport const chunkKinds = {\n\tother: 0,\n\tstring: 1,\n\tsql: 2,\n\tname: 3,\n\tcolumn: 4,\n\tparam: 5,\n\tplaceholder: 6,\n\ttable: 7,\n\tview: 8,\n\taliased: 9,\n\tsubquery: 10,\n\tvalueRows: 11,\n} as const;\n\nconst chunkKindByConstructor = new WeakMap<object, number>();\nconst chunkKindKey = Symbol('drizzle:chunkKind');\nfunction resolveChunkKind(ctor: object, kinds: Set<string>): number {\n\tconst kind = kinds.has(StringChunk[entityKind])\n\t\t? chunkKinds.string\n\t\t: kinds.has(SQL[entityKind])\n\t\t? chunkKinds.sql\n\t\t: kinds.has(Name[entityKind])\n\t\t? chunkKinds.name\n\t\t: kinds.has(Column[entityKind])\n\t\t? chunkKinds.column\n\t\t: kinds.has(Param[entityKind])\n\t\t? chunkKinds.param\n\t\t: kinds.has(Placeholder[entityKind])\n\t\t? chunkKinds.placeholder\n\t\t: kinds.has(Table[entityKind])\n\t\t? chunkKinds.table\n\t\t: kinds.has(View[entityKind])\n\t\t? chunkKinds.view\n\t\t: kinds.has(SQL.Aliased[entityKind])\n\t\t? chunkKinds.aliased\n\t\t: kinds.has(Subquery[entityKind])\n\t\t? chunkKinds.subquery\n\t\t: kinds.has(ValueRows[entityKind])\n\t\t? chunkKinds.valueRows\n\t\t: chunkKinds.other;\n\tchunkKindByConstructor.set(ctor, kind);\n\t// Set cache directly on entity\n\t// TODO: predefine statically\n\tif (kind !== chunkKinds.other) {\n\t\tObject.defineProperty((ctor as { prototype: object }).prototype, chunkKindKey, { value: kind });\n\t}\n\treturn kind;\n}\n\nexport function chunkKindOf(chunk: unknown): number {\n\tif (chunk === null || typeof chunk !== 'object') return chunkKinds.other;\n\n\tconst cached = (chunk as { [chunkKindKey]?: number })[chunkKindKey];\n\tif (cached !== undefined) return cached;\n\n\tconst ctor = Object.getPrototypeOf(chunk)?.constructor;\n\tif (typeof ctor !== 'function') return chunkKinds.other;\n\n\treturn chunkKindByConstructor.get(ctor) ?? resolveChunkKind(ctor, entityKindsOf(chunk)!);\n}\n\nexport interface ChunkTypes {\n\t[chunkKinds.string]: StringChunk;\n\t[chunkKinds.sql]: SQL;\n\t[chunkKinds.name]: Name;\n\t[chunkKinds.column]: Column;\n\t[chunkKinds.param]: Param;\n\t[chunkKinds.placeholder]: Placeholder;\n\t[chunkKinds.table]: Table;\n\t[chunkKinds.view]: View;\n\t[chunkKinds.aliased]: SQL.Aliased;\n\t[chunkKinds.subquery]: Subquery;\n\t[chunkKinds.valueRows]: ValueRows;\n}\n\nexport function isChunk<TKind extends keyof ChunkTypes>(\n\t_chunk: unknown,\n\tkind: number,\n\texpected: TKind,\n): _chunk is ChunkTypes[TKind] {\n\treturn kind === expected;\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\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\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 DriverValueDecoderFn<TData, TDriverParam> {\n\t(value: TDriverParam): TData;\n\t/** @internal */\n\tisNoop?: true | undefined;\n}\n\nexport interface DriverValueDecoder<TData, TDriverParam> {\n\tmapFromDriverValue: DriverValueDecoderFn<TData, TDriverParam>;\n}\n\nexport interface DriverValueEncoderFn<TData, TDriverParam> {\n\t(value: TData): TDriverParam;\n\t/** @internal */\n\tisNoop?: true | undefined;\n}\n\nexport interface DriverValueEncoder<TData, TDriverParam> {\n\tmapToDriverValue: DriverValueEncoderFn<TData, TDriverParam>;\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\nnoopDecoder.mapFromDriverValue.isNoop = true;\n\nexport const noopEncoder: DriverValueEncoder<any, any> = {\n\tmapToDriverValue: (value) => value,\n};\n\nnoopEncoder.mapToDriverValue.isNoop = true;\n\nexport interface DriverValueMapper<TData, TDriverParam>\n\textends DriverValueDecoder<TData, TDriverParam>, DriverValueEncoder<TData, TDriverParam>\n{}\n\nexport function isNoop(mapper: DriverValueEncoderFn<any, any> | DriverValueDecoderFn<any, any>) {\n\treturn mapper.isNoop;\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 = any, TDriverParamType = TDataType> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'Param';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\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 | Placeholder<string, TDataType>,\n\t\treadonly encoder: DriverValueEncoder<TDataType, TDriverParamType> = noopEncoder,\n\t\tpublic codec?: (value: any) => any,\n\t) {}\n\n\tgetSQL(): SQL<unknown> {\n\t\treturn new SQL([this]);\n\t}\n}\n\nexport class ValueRows implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'ValueRows';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tconstructor(\n\t\treadonly cells: unknown[],\n\t\treadonly encoders: DriverValueEncoder<unknown, unknown>[],\n\t) {}\n\n\t// Backwards compatibility for builders unaware of this chunk type\n\tgetSQL(): SQL {\n\t\tconst { cells, encoders } = this;\n\t\tconst width = encoders.length;\n\t\tconst chunks: SQLChunk[] = [];\n\t\tfor (let i = 0; i < cells.length; ++i) {\n\t\t\tconst column = i % width;\n\t\t\tchunks.push(\n\t\t\t\tcolumn === 0 ? (i === 0 ? commonStringChunks['('] : commonStringChunks['), (']) : commonStringChunks[', '],\n\t\t\t);\n\t\t\tconst cell = cells[i];\n\t\t\tconst kind = chunkKindOf(cell);\n\t\t\tchunks.push(\n\t\t\t\tkind === chunkKinds.sql || kind === chunkKinds.string ? cell as SQLChunk : new Param(cell, encoders[column]),\n\t\t\t);\n\t\t}\n\t\tchunks.push(commonStringChunks[')']);\n\n\t\treturn new SQL(chunks);\n\t}\n\n\tshouldOmitSQLParens(): boolean {\n\t\treturn true;\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 type SQLGenerator<T = unknown> = typeof sql<T>;\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 (strings[0]) queryChunks.push(new StringChunk(strings[0]));\n\tfor (let paramIdx = 0; paramIdx < params.length; ++paramIdx) {\n\t\tconst param = params[paramIdx];\n\t\tif (param !== undefined) queryChunks.push(param);\n\t\tconst string = strings[paramIdx + 1];\n\t\tif (string) queryChunks.push(new StringChunk(string));\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 { length } = chunks;\n\t\tif (separator === undefined || length === 0) return new SQL(chunks.slice());\n\n\t\tconst result: SQLChunk[] = new Array(length * 2 - 1);\n\t\tfor (let i = 0, writeIdx = 0; i < length; ++i) {\n\t\t\tresult[writeIdx++] = chunks[i];\n\n\t\t\tif (i < length - 1) {\n\t\t\t\tresult[writeIdx++] = separator;\n\t\t\t}\n\t\t}\n\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 | Placeholder<string, TData>,\n\t\tencoder?: DriverValueEncoder<TData, TDriver>,\n\t): Param<TData, TDriver> {\n\t\treturn new Param(value, encoder);\n\t}\n\n\t/**\n\t * Attach [sqlcommenter](https://google.github.io/sqlcommenter) comment to a query\n\t */\n\texport function comment(input: CommentInput): SQL | undefined {\n\t\tconst encoded = sqlCommenter(input);\n\t\tif (!encoded.length) return undefined;\n\n\t\treturn sql.raw(encoded);\n\t}\n}\n\nexport function sqlCommenter(input: CommentInput): string {\n\tconst encoded = sqlCommenter.encodeInput(input);\n\tif (!encoded.length) return '';\n\n\treturn `/*${encoded}*/`;\n}\n\nexport namespace sqlCommenter {\n\texport function merge(input1: CommentInput | undefined, input2: CommentInput | undefined) {\n\t\tlet encoded: CommentInput;\n\t\tif (typeof input1 === 'object' && typeof input2 === 'object') {\n\t\t\tencoded = encodeInput({ ...input1, ...input2 });\n\t\t} else if (input1 && input2) {\n\t\t\tencoded = [encodeInput(input1), encodeInput(input2)].filter((i) => i.length).join(',');\n\t\t} else if (input2) {\n\t\t\tencoded = encodeInput(input2);\n\t\t} else if (input1) {\n\t\t\tencoded = encodeInput(input1);\n\t\t} else {\n\t\t\treturn '';\n\t\t}\n\n\t\tif (!encoded.length) return '';\n\n\t\treturn `/*${encoded}*/`;\n\t}\n\n\texport function encodeInput(input: CommentInput): string {\n\t\tif (typeof input === 'string') {\n\t\t\tif (!input.length) return input;\n\n\t\t\treturn sanitizeStringInput(input);\n\t\t}\n\n\t\tconst parts: string[] = [];\n\n\t\tfor (const [key, value] of Object.entries(input)) {\n\t\t\tif (value === null || value === undefined || value === '') continue;\n\n\t\t\tconst encodedKey = sanitizeObjectElement(key);\n\t\t\tconst encodedValue = sanitizeObjectElement(String(value));\n\n\t\t\tparts.push(`${encodedKey}='${encodedValue}'`);\n\t\t}\n\n\t\tif (!parts.length) return '';\n\n\t\treturn parts.sort().join(',');\n\t}\n\n\texport function sanitizeObjectElement(key: string): string {\n\t\tconst urlEncoded = encodeURIComponent(key);\n\t\treturn urlEncoded.replace(/'/g, `\\\\'`);\n\t}\n\n\texport function sanitizeStringInput(input: string): string {\n\t\treturn input.replace(/\\/\\*/g, '/ *').replace(/\\*\\//g, '* /');\n\t}\n}\n\nexport type CommentInput = string | SqlCommenterInput;\n\nexport type SqlCommenterInput = Record<\n\tstring,\n\tstring | number | bigint | boolean | null | undefined\n>;\n\nexport namespace SQL {\n\texport class Aliased<T = unknown> implements SQLWrapper<T> {\n\t\tstatic readonly [entityKind]: string = 'SQL.Aliased';\n\n\t\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\t\treturn is(value, this);\n\t\t}\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\t\t/** @internal */\n\t\torigin?: string;\n\n\t\tconstructor(\n\t\t\treadonly sql: SQL<T>,\n\t\t\treadonly fieldAlias: string,\n\t\t) {}\n\n\t\tgetSQL(): SQL<T> {\n\t\t\treturn this.sql as SQL<T>;\n\t\t}\n\n\t\t/** @internal */\n\t\tclone() {\n\t\t\treturn new Aliased<T>(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\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\t// Keep values as protected to avoid bleeding into autocomplete (ex.: relational queries' \"where\")\n\tdeclare protected value: TValue;\n\n\tconstructor(protected readonly name: TName) {}\n\n\t/**\n\t * @deprecated Field hidden to prevent bleeding into autocomplete\n\t */\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\n/**\n * @internal\n * Replaces top-level columns of `query` with their unqualified names (e.g. for `order by` of set operations) -\n * returns a copy if any are present, never modifying `query` itself\n */\nexport function unqualifyColumns(query: SQL): SQL {\n\tconst source = query.queryChunks;\n\tlet chunks: SQLChunk[] | undefined;\n\tfor (let i = 0; i < source.length; ++i) {\n\t\tconst chunk = source[i];\n\t\tif (is(chunk, Column)) (chunks ??= [...source])[i] = sql.identifier(chunk.name);\n\t}\n\tif (!chunks) return query;\n\n\tconst copy = new SQL(chunks);\n\tcopy.decoder = query.decoder;\n\tcopy.shouldInlineParams = query.shouldInlineParams;\n\treturn copy;\n}\n\nexport function fillPlaceholders(params: unknown[], values: Record<string, unknown>): unknown[] {\n\tconst filled: unknown[] = new Array(params.length);\n\n\tfor (let i = 0; i < params.length; ++i) {\n\t\tconst p = params[i]!;\n\n\t\tif (is(p, Placeholder)) {\n\t\t\t// Bypass Placeholder's field protection\n\t\t\tconst { name } = p as any as { name: string };\n\t\t\tif (!(name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${name}\" was provided`);\n\t\t\t}\n\n\t\t\tfilled[i] = values[name];\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (is(p, Param) && is(p.value, Placeholder)) {\n\t\t\t// Bypass Placeholder's field protection\n\t\t\tconst { name } = p.value as any as { name: string };\n\n\t\t\tif (!(name in values)) {\n\t\t\t\tthrow new Error(`No value for placeholder \"${name}\" was provided`);\n\t\t\t}\n\n\t\t\tconst value = values[name];\n\t\t\tif (value === null) {\n\t\t\t\tfilled[i] = value;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst mapped = p.encoder.mapToDriverValue.isNoop\n\t\t\t\t? value\n\t\t\t\t: p.encoder.mapToDriverValue(value);\n\n\t\t\tfilled[i] = p.codec ? p.codec(mapped) : mapped;\n\t\t\tcontinue;\n\t\t}\n\n\t\tfilled[i] = p;\n\t}\n\n\treturn filled;\n}\n\nexport type ColumnsSelection = Record<string, unknown>;\n\n/**\n * @internal\n *\n * Adds cache key of every table referenced anywhere within `chunks` to `out`\n */\nexport function collectChunksUsedTables(chunks: readonly SQLChunk[], out: Set<string>): void {\n\tfor (let i = 0; i < chunks.length; ++i) {\n\t\tconst chunk = chunks[i];\n\t\tconst kind = chunkKindOf(chunk);\n\t\tswitch (kind) {\n\t\t\tcase chunkKinds.table: {\n\t\t\t\tout.add((chunk as Table)[CacheKey]);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase chunkKinds.sql: {\n\t\t\t\tcollectChunksUsedTables((chunk as SQL).queryChunks, out);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase chunkKinds.param: {\n\t\t\t\tconst value = (chunk as { value: unknown }).value;\n\t\t\t\tif (chunkKindOf(value) === chunkKinds.sql) collectChunksUsedTables((value as SQL).queryChunks, out);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase chunkKinds.subquery: {\n\t\t\t\tcollectChunksUsedTables((chunk as Subquery)._.sql.queryChunks, out);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase chunkKinds.valueRows: {\n\t\t\t\tcollectChunksUsedTables((chunk as { cells: SQLChunk[] }).cells, out);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase chunkKinds.other:\n\t\t\tcase chunkKinds.aliased: {\n\t\t\t\tif (Array.isArray(chunk)) collectChunksUsedTables(chunk, out);\n\t\t\t\telse if (isSQLWrapper(chunk)) collectChunksUsedTables(chunk.getSQL().queryChunks, out);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n\n// Defined separately from the Column class to resolve circular dependency\nColumn.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n// Defined separately from the StringChunk class to resolve circular dependency\nStringChunk.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n// Defined separately from the Subquery class to resolve circular dependency\nSubquery.prototype.getSQL = function() {\n\treturn new SQL([this]);\n};\n\n// `[Qualifier]` defined separately to resolve circular dependency\nfunction defineQualifier<T extends object>(prototype: T, build: (self: T) => SQLChunk): void {\n\tObject.defineProperty(prototype, Qualifier, {\n\t\tget(this: T) {\n\t\t\tconst value = build(this);\n\t\t\tObject.defineProperty(this, Qualifier, { value, enumerable: false, configurable: true, writable: true });\n\t\t\treturn value;\n\t\t},\n\t\tconfigurable: true,\n\t});\n}\n\nfunction qualifiedName(schema: string | undefined, name: string): SQL {\n\treturn new SQL(schema === undefined ? [new Name(name)] : [new Name(schema), commonStringChunks['.'], new Name(name)]);\n}\n\ndefineQualifier(Table.prototype, (table) => qualifiedName(table[TableSchema], table[TableName]));\ndefineQualifier(View.prototype, (view) => qualifiedName(view[ViewBaseConfig].schema, view[ViewBaseConfig].name));\ndefineQualifier(Subquery.prototype, (subquery) => new Name(subquery._.alias));\n\nexport type SQLEntity = SQL | SQLWrapper | SQL.Aliased | Table | View;\n", "import type { AnyColumn, Column, GetColumnData } from '~/column.ts';\nimport { is } from '~/entity.ts';\nimport { commonStringChunks, type StringChunk } from '../common-chunks.ts';\nimport {\n\tchunkKindOf,\n\tchunkKinds,\n\tisDriverValueEncoder,\n\tisSQLWrapper,\n\tParam,\n\ttype Placeholder,\n\tSQL,\n\tsql,\n\ttype SQLChunk,\n\ttype SQLWrapper,\n} from '../sql.ts';\n\nexport function bindIfParam(value: unknown, column: SQLWrapper): SQLChunk {\n\tif (isDriverValueEncoder(column) && !isSQLWrapper(value)) {\n\t\tconst kind = chunkKindOf(value);\n\t\tif (\n\t\t\tkind !== chunkKinds.param && kind !== chunkKinds.placeholder && kind !== chunkKinds.column\n\t\t\t&& kind !== chunkKinds.table\n\t\t\t&& kind !== chunkKinds.view\n\t\t) {\n\t\t\treturn new Param(value, column);\n\t\t}\n\t}\n\treturn value as SQLChunk;\n}\n\nconst checkColumnWithValue = (column: SQLWrapper, op: StringChunk, value: unknown) =>\n\tnew SQL([\n\t\tcolumn,\n\t\top,\n\t\tbindIfParam(value, column),\n\t]);\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\tcheckColumnWithValue(left, commonStringChunks[' = '], right);\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\tcheckColumnWithValue(left, commonStringChunks[' <> '], right);\n\nconst joinConditions = (conditions: SQLWrapper<unknown>[], separatorWithParenChunk: SQLChunk) => {\n\tconst chunks: SQLChunk[] = new Array(conditions.length * 2 + 1),\n\t\tlastIdx = conditions.length - 1;\n\n\t// ['((']\n\tchunks[0] = commonStringChunks['(('];\n\n\tfor (let i = 0; i < lastIdx; i++) {\n\t\t// [..., condition, ') and (']\n\t\tchunks[i * 2 + 1] = conditions[i];\n\t\tchunks[i * 2 + 2] = separatorWithParenChunk;\n\t}\n\t// [..., condition, '))']\n\tchunks[lastIdx * 2 + 1] = conditions[lastIdx];\n\tchunks[lastIdx * 2 + 2] = commonStringChunks['))'];\n\n\treturn new SQL(chunks);\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 joinConditions(conditions, commonStringChunks[') and (']);\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 joinConditions(conditions, commonStringChunks[') or (']);\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 | undefined): SQL | undefined {\n\tif (!condition) return undefined;\n\treturn is(condition, SQL) ? sql`not (${condition})` : 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\tcheckColumnWithValue(left, commonStringChunks[' > '], right);\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\tcheckColumnWithValue(left, commonStringChunks[' >= '], right);\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\tcheckColumnWithValue(left, commonStringChunks[' < '], right);\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\tcheckColumnWithValue(left, commonStringChunks[' <= '], right);\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: ReadonlyArray<GetColumnData<TColumn, 'raw'> | Placeholder> | SQLWrapper,\n): SQL;\nexport function inArray<T extends SQLWrapper>(\n\tcolumn: Exclude<T, SQL.Aliased | Column>,\n\tvalues: ReadonlyArray<unknown | Placeholder> | SQLWrapper,\n): SQL;\nexport function inArray(\n\tcolumn: SQLWrapper,\n\tvalues: ReadonlyArray<unknown | Placeholder> | SQLWrapper,\n): SQL {\n\tif (Array.isArray(values)) {\n\t\tif (values.length === 0) {\n\t\t\treturn new SQL([\n\t\t\t\tcommonStringChunks['1 = 0'],\n\t\t\t]);\n\t\t}\n\n\t\treturn new SQL([\n\t\t\tcolumn,\n\t\t\tcommonStringChunks[' in '],\n\t\t\tvalues.map((v) => bindIfParam(v, column)),\n\t\t]);\n\t}\n\n\treturn checkColumnWithValue(column, commonStringChunks[' in '], values);\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 new SQL([\n\t\t\t\tcommonStringChunks['1 = 1'],\n\t\t\t]);\n\t\t}\n\n\t\treturn new SQL([\n\t\t\tcolumn,\n\t\t\tcommonStringChunks[' not in '],\n\t\t\tvalues.map((v) => bindIfParam(v, column)),\n\t\t]);\n\t}\n\n\treturn checkColumnWithValue(column, commonStringChunks[' not in '], values);\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 | SQLWrapper, 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 | SQLWrapper, 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 | SQLWrapper, 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 | SQLWrapper, 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 par = bindIfParam(values, column);\n\t\tconst array = sql`${Array.isArray(par) ? new Param(par) : par}`;\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 par = bindIfParam(values, column);\n\t\tconst array = sql`${Array.isArray(par) ? new Param(par) : par}`;\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 par = bindIfParam(values, column);\n\t\tconst array = sql`${Array.isArray(par) ? new Param(par) : par}`;\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 { entityKind, is } from '~/entity.ts';\nimport type { CockroachColumn, ExtraConfigColumn as CockroachExtraConfigColumn } from './cockroach-core/index.ts';\nimport type { Column, ColumnBaseConfig } from './column.ts';\nimport type { MsSqlColumn } from './mssql-core/index.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 } from './utils.ts';\n\nexport type ColumnDataType =\n\t| 'array'\n\t| 'bigint'\n\t| 'boolean'\n\t| 'custom'\n\t| 'number'\n\t| 'object'\n\t| 'string';\n\nexport type ColumnDataArrayConstraint =\n\t| 'vector'\n\t| 'int64vector'\n\t| 'halfvector'\n\t| 'point'\n\t| 'geometry'\n\t| 'line';\n\nexport type ColumnDataBigIntConstraint = 'int64' | 'uint64';\n\nexport type ColumnDataNumberConstraint =\n\t| 'double'\n\t| 'float'\n\t| 'int8'\n\t| 'int16'\n\t| 'int24'\n\t| 'int32'\n\t| 'int53'\n\t| 'udouble'\n\t| 'ufloat'\n\t| 'uint8'\n\t| 'uint16'\n\t| 'uint24'\n\t| 'uint32'\n\t| 'uint53'\n\t| 'unsigned'\n\t| 'year';\n\nexport type ColumnDataObjectConstraint =\n\t| 'buffer'\n\t| 'date'\n\t| 'geometry'\n\t| 'json'\n\t| 'line'\n\t| 'point'\n\t// Gel-specific\n\t| 'dateDuration'\n\t| 'duration'\n\t| 'localDate'\n\t| 'localDateTime'\n\t| 'localTime'\n\t| 'relDuration';\n\nexport type ColumnDataStringConstraint =\n\t| 'binary'\n\t| 'cidr'\n\t| 'date'\n\t| 'datetime'\n\t| 'enum'\n\t| 'inet'\n\t| 'int64'\n\t| 'interval'\n\t| 'macaddr'\n\t| 'macaddr8'\n\t| 'numeric'\n\t| 'sparsevec'\n\t| 'time'\n\t| 'timestamp'\n\t| 'uint64'\n\t| 'unumeric'\n\t| 'uuid';\n\nexport type ColumnDataConstraint =\n\t| ColumnDataArrayConstraint\n\t| ColumnDataBigIntConstraint\n\t| ColumnDataNumberConstraint\n\t| ColumnDataObjectConstraint\n\t| ColumnDataStringConstraint;\n\nexport type ColumnType =\n\t| ColumnDataType\n\t| `array ${ColumnDataArrayConstraint}`\n\t| `bigint ${ColumnDataBigIntConstraint}`\n\t| `number ${ColumnDataNumberConstraint}`\n\t| `object ${ColumnDataObjectConstraint}`\n\t| `string ${ColumnDataStringConstraint}`;\n\nexport interface ColumnTypeData<\n\tTType extends ColumnDataType = ColumnDataType,\n\tTConstraint extends ColumnDataConstraint | undefined = ColumnDataConstraint | undefined,\n> {\n\ttype: TType;\n\tconstraint: TConstraint;\n}\n\nexport type ExtractColumnTypeData<T extends ColumnType> = T extends\n\t`${infer Type extends ColumnDataType} ${infer Constraint extends ColumnDataConstraint}`\n\t? ColumnTypeData<Type, Constraint>\n\t: ColumnTypeData<Assume<T, ColumnDataType>, undefined>;\n\nexport function extractExtendedColumnType<TColumn extends Column>(\n\tcolumn: TColumn,\n): ExtractColumnTypeData<TColumn['_']['dataType']> {\n\tconst [type, constraint] = column.dataType.split(' ');\n\n\treturn { type, constraint } as any;\n}\n\nexport type Dialect = 'pg' | 'mysql' | 'sqlite' | 'singlestore' | 'mssql' | 'common' | 'cockroach';\n\n// TODO update description\n// 'virtual' | 'stored' for postgres\n// 'stored' for mysql\n// 'virtual' | 'persisted' for mssql\n// We should remove this option from common Column and store it per dialect common\n// Was discussed with Andrew\nexport type GeneratedStorageMode = 'virtual' | 'stored' | 'persisted';\n\nexport type GeneratedType = 'always' | 'byDefault';\n\nexport interface GeneratedColumnConfig<TDataType> {\n\tas: TDataType | SQL | (() => SQL);\n\ttype?: GeneratedType;\n\tmode?: GeneratedStorageMode;\n}\n\nexport interface GeneratedIdentityConfig {\n\tsequenceName?: string;\n\tsequenceOptions?: PgSequenceOptions;\n\ttype: 'always' | 'byDefault';\n}\n\nexport interface ColumnBuilderBaseConfig<TDataType extends ColumnType> {\n\tdataType: TDataType;\n\tdata: unknown;\n\tdriverParam: unknown;\n\tnotNull?: boolean;\n\thasDefault?: boolean;\n}\n\nexport type MakeColumnConfig<\n\tT extends ColumnBuilderBaseConfig<ColumnType>,\n\tTTableName extends string,\n\tTDialect extends Dialect = 'common',\n\tTData = T extends { $type: infer U } ? U : T['data'],\n> = {\n\tname: string;\n\ttableName: TTableName;\n\tdataType: T['dataType'];\n\tdata: TData;\n\tdriverParam: T['driverParam'];\n\tnotNull: T['notNull'] extends true ? true : false;\n\thasDefault: T['hasDefault'] extends 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 extends { enumValues: [string, ...string[]] } ? T['enumValues'] : undefined;\n\tbaseColumn: T extends { baseBuilder: infer U extends ColumnBuilderBase } ? BuildColumn<TTableName, U, TDialect>\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 interface ColumnBuilderRuntimeConfig<TData> {\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}\n\nexport interface ColumnBuilderExtraConfig {\n\tprimaryKeyHasDefault?: boolean;\n}\n\nexport type NotNull<T> = T & {\n\t_: {\n\t\tnotNull: true;\n\t};\n};\n\nexport type HasDefault<T> = T & {\n\t_: {\n\t\thasDefault: true;\n\t};\n};\n\nexport type IsPrimaryKey<T> = T & {\n\t_: {\n\t\tisPrimaryKey: true;\n\t\tnotNull: true;\n\t};\n};\n\nexport type IsAutoincrement<T> = T & {\n\t_: {\n\t\tisAutoincrement: true;\n\t};\n};\n\nexport type HasRuntimeDefault<T> = T & {\n\t_: {\n\t\thasRuntimeDefault: true;\n\t};\n};\n\nexport type $Type<T, TType> = T & {\n\t_: {\n\t\t$type: TType;\n\t};\n};\n\nexport type HasGenerated<T, TGenerated = {}> = T & {\n\t_: {\n\t\thasDefault: true;\n\t\tgenerated: TGenerated;\n\t};\n};\n\nexport type IsIdentity<T, TType extends 'always' | 'byDefault'> = T & {\n\t_: {\n\t\tnotNull: true;\n\t\thasDefault: true;\n\t\tidentity: TType;\n\t};\n};\n\nexport interface ColumnBuilderBase<\n\tout T extends ColumnBuilderBaseConfig<ColumnType> = ColumnBuilderBaseConfig<ColumnType>,\n> {\n\t_: T;\n}\n\n// To understand how to use `ColumnBuilder` and `AnyColumnBuilder`, see `Column` and `AnyColumn` documentation.\nexport abstract class ColumnBuilder<\n\tout T extends ColumnBuilderBaseConfig<ColumnType>,\n\tTRuntimeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = ColumnBuilderExtraConfig,\n> implements ColumnBuilderBase<T> {\n\tstatic readonly [entityKind]: string = 'ColumnBuilder';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tdeclare _: T;\n\n\t/** @internal */\n\tprotected config: ColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig;\n\n\tconstructor(name: string, dataType: ColumnType, columnType: string) {\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; // TODO: ??\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(\n\t\tfn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,\n\t): HasRuntimeDefault<HasDefault<this>> {\n\t\treturn this.$defaultFn(fn);\n\t}\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(\n\t\tfn: () => (this['_'] extends { $type: infer U } ? U : this['_']['data']) | SQL,\n\t): HasDefault<this> {\n\t\treturn this.$onUpdateFn(fn);\n\t}\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<this>>\n\t\t: IsPrimaryKey<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<this>>\n\t\t\t: IsPrimaryKey<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, casingFn: (name: string) => string) {\n\t\tif (this.config.name !== '') return;\n\t\tthis.config.name = casingFn(name);\n\t}\n}\n\nexport type BuildColumn<\n\tTTableName extends string,\n\tTBuilder extends ColumnBuilderBase,\n\tTDialect extends Dialect,\n\tTBuiltConfig extends ColumnBaseConfig<ColumnType> = MakeColumnConfig<TBuilder['_'], TTableName, TDialect>,\n> =\n\t// TDialect extends 'pg' ? PgColumn<TBuiltConfig, {}>\n\tTDialect extends 'mysql' ? MySqlColumn<TBuiltConfig, {}>\n\t\t: TDialect extends 'mssql' ? MsSqlColumn<TBuiltConfig, {}>\n\t\t: TDialect extends 'sqlite' ? SQLiteColumn<TBuiltConfig, {}>\n\t\t: TDialect extends 'singlestore' ? SingleStoreColumn<TBuiltConfig, {}>\n\t\t// : TDialect extends 'cockroach' ? CockroachColumn<TBuiltConfig, {}>\n\t\t: TDialect extends 'common' ? Column<TBuiltConfig, {}>\n\t\t: never;\n\nexport type BuildIndexColumn<\n\tTDialect extends Dialect,\n> = TDialect extends 'pg' ? ExtraConfigColumn\n\t: TDialect extends 'cockroach' ? CockroachExtraConfigColumn\n\t: 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<\n\t\t\tTTableName,\n\t\t\tTConfigMap[Key],\n\t\t\tTDialect\n\t\t>;\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<\n\tTColumn extends Column,\n\tTAlias extends string,\n\tTDialect extends Dialect,\n> =\n\t// TODO: optimise\n\tTDialect extends 'pg' ? PgColumn<\n\t\t\tTColumn['_']['dataType'],\n\t\t\tOmit<TColumn['_'], 'tableName'> & { tableName: TAlias; insertType: unknown }\n\t\t>\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: TDialect extends 'mssql' ? MsSqlColumn<MakeColumnConfig<TColumn['_'], TAlias>>\n\t\t: TDialect extends 'cockroach' ? CockroachColumn<\n\t\t\t\tTColumn['_']['dataType'],\n\t\t\t\tOmit<TColumn['_'], 'tableName'> & { tableName: TAlias; insertType: unknown }\n\t\t\t>\n\t\t: never;\n", "import { entityKind, is } 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\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\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\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\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\tisNameExplicit() {\n\t\treturn !!this.reference().name;\n\t}\n}\n\ntype ColumnsWithTable<\n\tTTableName extends string,\n\tTColumns extends SQLiteColumn[],\n> = { [Key in keyof TColumns]: AnySQLiteColumn<{ tableName: TTableName }> };\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\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 type {\n\tColumnBuilderBaseConfig,\n\tColumnBuilderExtraConfig,\n\tColumnBuilderRuntimeConfig,\n\tColumnType,\n\tHasGenerated,\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 { SQLiteType } from '~/sqlite-core/codecs.ts';\nimport type { ForeignKey, UpdateDeleteAction } from '~/sqlite-core/foreign-keys.ts';\nimport { ForeignKeyBuilder } from '~/sqlite-core/foreign-keys.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport type { Update } from '~/utils.ts';\n\nexport type SQLiteColumns = Record<string, SQLiteColumn<any>>;\n\nexport interface ReferenceConfig {\n\tref: () => SQLiteColumn;\n\tactions: {\n\t\tonUpdate?: UpdateDeleteAction;\n\t\tonDelete?: UpdateDeleteAction;\n\t};\n}\n\nexport interface SQLiteGeneratedColumnConfig {\n\tmode?: 'virtual' | 'stored';\n}\n\nexport abstract class SQLiteColumnBuilder<\n\tT extends ColumnBuilderBaseConfig<ColumnType> = ColumnBuilderBaseConfig<ColumnType>,\n\tTRuntimeConfig extends object = object,\n\tTExtraConfig extends ColumnBuilderExtraConfig = object,\n> extends ColumnBuilder<T, TRuntimeConfig, TExtraConfig> {\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 | (() => 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(table: SQLiteTable): SQLiteColumn;\n}\n\n// To understand how to use `SQLiteColumn` and `AnySQLiteColumn`, see `Column` and `AnyColumn` documentation.\nexport abstract class SQLiteColumn<\n\tT extends ColumnBaseConfig<ColumnType> = ColumnBaseConfig<ColumnType>,\n\tTRuntimeConfig extends object = {},\n> extends Column<T, TRuntimeConfig> {\n\tstatic override readonly [entityKind]: string = 'SQLiteColumn';\n\n\t/** @internal */\n\tabstract override readonly codec?: SQLiteType;\n\n\t/** @internal */\n\toverride readonly table: SQLiteTable;\n\n\tconstructor(\n\t\ttable: SQLiteTable,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data']> & TRuntimeConfig,\n\t) {\n\t\tsuper(table, config);\n\t\tthis.table = table;\n\t}\n}\n\nexport type AnySQLiteColumn<TPartial extends Partial<ColumnBaseConfig<ColumnType>> = {}> = SQLiteColumn<\n\tRequired<Update<ColumnBaseConfig<ColumnType>, TPartial>>\n>;\n", "import { View } from '~/view.ts';\nimport type { Cache } from './cache/core/cache.ts';\nimport type { CodecsCollection } from './codecs.ts';\nimport type { AnyColumn } from './column.ts';\nimport { Column } from './column.ts';\nimport { is } from './entity.ts';\nimport type { Logger } from './logger.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './operations.ts';\nimport type { TableLike } from './query-builders/select.types.ts';\nimport type { AnyRelations, EmptyRelations } from './relations.ts';\nimport { chunkKindOf, chunkKinds, isChunk, Param, SQL } from './sql/sql.ts';\nimport type { DriverValueDecoder, SQLWrapper } 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 resolveNullableObjectPaths(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\tjoinsNotNullableMap: Record<string, boolean> | undefined,\n): string[] | undefined {\n\tif (!joinsNotNullableMap) return undefined;\n\n\t// prefix -> table\n\tconst tableOf = new Map<string, string | false>();\n\tconst order: string[] = [];\n\tconst seen = new Set<string>();\n\n\tfor (const { path, field, fieldType } of columns) {\n\t\tif (path.length < 2) continue;\n\t\tconst key = path[0]!;\n\t\tif (!seen.has(key)) {\n\t\t\tseen.add(key);\n\t\t\torder.push(key);\n\t\t}\n\t\tif (fieldType !== 'Column') continue;\n\t\tconst tableName = getTableName(field.table);\n\t\tconst current = tableOf.get(key);\n\t\tif (current === undefined) tableOf.set(key, tableName);\n\t\telse if (current !== false && current !== tableName) tableOf.set(key, false);\n\t}\n\n\tconst result: string[] = [];\n\tfor (const key of order) {\n\t\tconst table = tableOf.get(key);\n\t\t// sql field only group remains not nullable due to lack of table to be bound to\n\t\tif (typeof table === 'string' && !joinsNotNullableMap[table]) result.push(key);\n\t}\n\n\treturn result;\n}\n\nfunction nullablePathTargets(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\tnullableObjectPaths: string[],\n): { key: string; leaves: number[] }[] {\n\tconst targets: {\n\t\tkey: string;\n\t\tleaves: number[];\n\t}[] = new Array(nullableObjectPaths.length);\n\n\tfor (let i = 0; i < nullableObjectPaths.length; ++i) {\n\t\tconst key = nullableObjectPaths[i]!;\n\t\tconst leaves: number[] = [];\n\t\tfor (let j = 0; j < columns.length; ++j) {\n\t\t\tconst cp = columns[j]!.path;\n\t\t\tif (cp.length > 1 && cp[0] === key) leaves.push(j);\n\t\t}\n\n\t\ttargets[i] = { key, leaves };\n\t}\n\n\treturn targets;\n}\n\n/** @internal bypass bundle-time filtering */\nexport const FnConstructor = Object.getPrototypeOf(() => null).constructor as typeof Function;\n\n/** @internal */\nfunction makeJitQueryMapperInner(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\tnullableObjectPaths?: string[],\n): string {\n\tconst preFn = [] as string[];\n\tconst fn = [] as string[];\n\tfn.push(`const [ ${columns.map((_, i) => `c${i}`).join(', ')} ] = rows[i];`);\n\n\t// top-level key -> the c-ids of every leaf nested under it, so a nullable group can test them all at once.\n\tconst descendantIds: Record<string, string[]> = {};\n\tconst nullableKeys = new Set(nullableObjectPaths ?? []);\n\tconst decodes = new Array<string>(columns.length);\n\n\tfor (let idx = 0; idx < columns.length; ++idx) {\n\t\tconst { field, fieldType, path, codec, arrayDimensions } = columns[idx]!;\n\t\tlet decoder: DriverValueDecoder<unknown, unknown>;\n\t\tlet decoderStr: string;\n\t\tlet decoderFieldDestructure: string;\n\t\tswitch (fieldType) {\n\t\t\tcase 'Column':\n\t\t\t\tdecoder = field;\n\t\t\t\tdecoderFieldDestructure = `field: decoder${idx}`;\n\t\t\t\tbreak;\n\t\t\tcase 'SQL':\n\t\t\t\tdecoder = field.decoder;\n\t\t\t\tdecoderFieldDestructure = `field: { decoder: decoder${idx} }`;\n\t\t\t\tbreak;\n\t\t\tcase 'Subquery':\n\t\t\t\tdecoder = field._.sql.decoder;\n\t\t\t\tdecoderFieldDestructure = `field: { _: { sql: { decoder: decoder${idx} } } }`;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t\tdecoderFieldDestructure = `field: { sql: { decoder: decoder${idx} } }`;\n\t\t}\n\t\tdecoderStr = `decoder${idx}.mapFromDriverValue`;\n\t\tif (decoder.mapFromDriverValue.isNoop) decoderStr = '';\n\t\tif (decoderStr) {\n\t\t\tpreFn.push(`const { ${decoderFieldDestructure}${codec ? `, codec: codec${idx}` : ''} } = columns[${idx}];`);\n\t\t} else if (codec) {\n\t\t\tpreFn.push(`const { codec: codec${idx} } = columns[${idx}];`);\n\t\t}\n\n\t\tconst colStr = `c${idx}`;\n\t\tlet decodedValue = colStr;\n\t\tif (codec) decodedValue = `codec${idx}(${decodedValue}, ${arrayDimensions})`;\n\t\tif (decoderStr) decodedValue = `${decoderStr}(${decodedValue})`;\n\t\tdecodes[idx] = colStr === decodedValue\n\t\t\t? `${colStr}`\n\t\t\t: `${colStr} === null ? ${colStr} : ${decodedValue}`;\n\n\t\tif (path.length > 1) (descendantIds[path[0]!] ??= []).push(colStr);\n\t}\n\n\tfn.push(`mapped[i] = {`);\n\tlet currentObjectPath: string[] = [];\n\tfor (let idx = 0; idx < columns.length; ++idx) {\n\t\tconst { path } = columns[idx]!;\n\t\tconst jsonPath = path.map((e) => JSON.stringify(e));\n\t\tconst decodedValue = decodes[idx]!;\n\n\t\tconst objectPath = path.slice(0, -1);\n\t\tlet commonLen = 0;\n\t\twhile (\n\t\t\tcommonLen < currentObjectPath.length\n\t\t\t&& commonLen < objectPath.length\n\t\t\t&& currentObjectPath[commonLen] === objectPath[commonLen]\n\t\t) commonLen++;\n\n\t\tfor (let d = currentObjectPath.length - 1; d >= commonLen; --d) {\n\t\t\tfn.push(`${'\\t'.repeat(d + 1)}},`);\n\t\t}\n\n\t\tfor (let d = commonLen; d < objectPath.length; ++d) {\n\t\t\tconst nullable = d === 0 && nullableKeys.has(path[0]!);\n\t\t\tfn.push(\n\t\t\t\t`${'\\t'.repeat(d + 1)}${jsonPath[d]}: ${\n\t\t\t\t\tnullable\n\t\t\t\t\t\t? `${descendantIds[path[0]!]!.map((c) => `${c} === null`).join(' && ')} ? null : {`\n\t\t\t\t\t\t: '{'\n\t\t\t\t}`,\n\t\t\t);\n\t\t}\n\n\t\tcurrentObjectPath = objectPath;\n\t\tfn.push(`${'\\t'.repeat(path.length)}${jsonPath[path.length - 1]}: ${decodedValue},`);\n\t}\n\n\tfor (let d = currentObjectPath.length - 1; d >= 0; --d) {\n\t\tfn.push(`${'\\t'.repeat(d + 1)}},`);\n\t}\n\tfn.push(`};`);\n\n\treturn `${preFn.length ? `${preFn.join('\\n\\t')}\\n\\t` : ''}for (let i = 0; i < length; ++i) {\n\t\t${fn.join('\\n\\t\\t')}\n\t}`;\n}\n\nexport type RowsMapperGenerator = <TResult = any>(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\tnullableObjectPaths: string[] | undefined,\n) => RowsMapper<TResult> | undefined;\nexport interface RowsMapper<TResult = Record<string, unknown>[]> {\n\t(rows: unknown[][]): TResult;\n\t/** @internal jit mapper's function body for debugging */\n\tbody?: string;\n}\n\nexport function makeJitQueryMapper<TResult>(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\tnullableObjectPaths: string[] | undefined,\n): RowsMapper<TResult> {\n\tconst internals = `\\t\"use strict\";\n\tconst { columns } = this;\n\tconst { length } = rows;\n\tconst mapped = new Array(length);\n\t${makeJitQueryMapperInner(columns, nullableObjectPaths)}\n\treturn mapped;\n\t//# sourceURL=drizzle:jit-query-mapper`;\n\n\tconst fn = Object.assign(\n\t\tnew FnConstructor(\n\t\t\t'rows',\n\t\t\tinternals,\n\t\t).bind({\n\t\t\tcolumns,\n\t\t}),\n\t\t{ body: `function jitQueryMapper (rows) {\\n${internals}\\n}` },\n\t) as RowsMapper<TResult>;\n\n\treturn fn;\n}\n\n/** @internal */\nexport function jitCompatCheck(isEnabled?: boolean): boolean {\n\tif (!isEnabled) return false;\n\n\ttry {\n\t\tconst res = new FnConstructor('input', '\"use strict\"; return input;')(true);\n\t\tif (res !== true) {\n\t\t\t// In case it's broken in runtime but not forbidden\n\t\t\tconsole.warn(\n\t\t\t\t'Unable to use jit mappers due to incompatibility: corrupted jit function output.\\nFalling back to premade mappers.\\nError details:',\n\t\t\t);\n\t\t\tconsole.error(`Expected to receive \\`true\\`, got: ${res}`);\n\t\t}\n\t\treturn true;\n\t} catch (e) {\n\t\tconsole.warn(\n\t\t\t'Unable to use jit mappers due to incompatibility.\\nFalling back to premade mappers.\\nError details:',\n\t\t);\n\t\tconsole.error(e);\n\t\treturn false;\n\t}\n}\n\nexport function makeDefaultQueryMapper<TResult>(\n\tcolumns: SelectedFieldsOrdered<AnyColumn>,\n\tnullableObjectPaths: string[] | undefined,\n): RowsMapper<TResult> {\n\tconst interpretedData: (((v: any) => any) | undefined)[] = new Array(columns.length);\n\tfor (let i = 0; i < columns.length; ++i) {\n\t\tconst { field, fieldType, codec, arrayDimensions } = columns[i]!;\n\n\t\tlet decoderSrc: DriverValueDecoder<unknown, unknown>;\n\t\tswitch (fieldType) {\n\t\t\tcase 'Column':\n\t\t\t\tdecoderSrc = field;\n\t\t\t\tbreak;\n\t\t\tcase 'SQL':\n\t\t\t\tdecoderSrc = field.decoder;\n\t\t\t\tbreak;\n\t\t\tcase 'Subquery':\n\t\t\t\tdecoderSrc = field._.sql.decoder;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tdecoderSrc = field.sql.decoder;\n\t\t}\n\n\t\tlet decoder: ((v: any) => any) | undefined;\n\t\tif (decoderSrc.mapFromDriverValue.isNoop) {\n\t\t\tdecoder = codec ? (v: any) => codec(v, arrayDimensions!) : undefined;\n\t\t} else {\n\t\t\tdecoder = codec\n\t\t\t\t? (v: any) => decoderSrc.mapFromDriverValue(codec(v, arrayDimensions!))\n\t\t\t\t: (v: any) => decoderSrc.mapFromDriverValue(v);\n\t\t}\n\n\t\tinterpretedData[i] = decoder;\n\t}\n\n\tconst targets = nullableObjectPaths?.length\n\t\t? nullablePathTargets(columns, nullableObjectPaths)\n\t\t: undefined;\n\n\treturn ((rows) => {\n\t\tconst { length: rowLength } = rows;\n\t\tconst output: TResult[] = new Array(rowLength);\n\t\tfor (let j = 0; j < rowLength; ++j) {\n\t\t\tconst row = rows[j]!;\n\n\t\t\tconst result: Record<string, any> = {};\n\n\t\t\tfor (let i = 0; i < columns.length; ++i) {\n\t\t\t\tconst { path } = columns[i]!;\n\n\t\t\t\tlet node = result;\n\t\t\t\tfor (let p = 0; p < path.length; ++p) {\n\t\t\t\t\tconst pathChunk = path[p]!;\n\t\t\t\t\tif (p < path.length - 1) {\n\t\t\t\t\t\tif (!(pathChunk in node)) {\n\t\t\t\t\t\t\tnode[pathChunk] = {};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnode = node[pathChunk];\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconst decoder = interpretedData[i]!;\n\t\t\t\t\t\tconst rawValue = row[i]!;\n\t\t\t\t\t\tnode[pathChunk] = rawValue === null\n\t\t\t\t\t\t\t? null\n\t\t\t\t\t\t\t: decoder\n\t\t\t\t\t\t\t? decoder(rawValue)\n\t\t\t\t\t\t\t: rawValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Nullify every top-level nullable group whose leaves are all null on this row.\n\t\t\tif (targets) {\n\t\t\t\tfor (let i = 0; i < targets.length; ++i) {\n\t\t\t\t\tconst { key, leaves } = targets[i]!;\n\n\t\t\t\t\tlet allNull = true;\n\t\t\t\t\tfor (let j = 0; j < leaves.length; ++j) {\n\t\t\t\t\t\tconst i = leaves[j]!;\n\n\t\t\t\t\t\tif (row[i] !== null) {\n\t\t\t\t\t\t\tallNull = false;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (allNull) result[key] = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\toutput[j] = result as TResult;\n\t\t}\n\n\t\treturn output;\n\t}) as RowsMapper<TResult>;\n}\n\nexport function make$ReturningResponseMapper(\n\treturningIds: SelectedFieldsOrdered<Column> | undefined,\n\tgeneratedIds?: Record<string, unknown>[],\n) {\n\tif (!returningIds) return;\n\n\treturn ({ insertId, affectedRows }: {\n\t\tinsertId: number;\n\t\taffectedRows: number;\n\t}) => {\n\t\tconst returningResponse = [];\n\t\tlet j = 0;\n\t\tfor (let i = insertId; i < insertId + affectedRows; i++) {\n\t\t\tfor (const column of returningIds) {\n\t\t\t\tconst key = returningIds[0]!.path[0]!;\n\t\t\t\tif (is(column.field, Column)) {\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\tif (column.field.primary && column.field.autoIncrement) {\n\t\t\t\t\t\treturningResponse.push({ [key]: i });\n\t\t\t\t\t}\n\t\t\t\t\tif (column.field.defaultFn && generatedIds) {\n\t\t\t\t\t\t// generatedIds[rowIdx][key]\n\t\t\t\t\t\treturningResponse.push({ [key]: generatedIds[j]![key] });\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tj++;\n\t\t}\n\n\t\treturn returningResponse;\n\t};\n}\n\n/** @internal */\nexport function orderSelectedFields<TColumn extends AnyColumn>(\n\tfields: Record<string, unknown>,\n\tpathPrefix?: string[],\n\tcodecs?: CodecsCollection,\n): SelectedFieldsOrdered<TColumn>;\n/**\n * @deprecated `result` argument is used for internal recursion, do not use outside of the function\n * @internal\n */\nexport function orderSelectedFields<TColumn extends AnyColumn>(\n\tfields: Record<string, unknown>,\n\tpathPrefix?: string[],\n\tcodecs?: CodecsCollection,\n\tresult?: SelectedFieldsOrdered<AnyColumn>,\n): SelectedFieldsOrdered<TColumn>;\n/** @internal */\nexport function orderSelectedFields<TColumn extends AnyColumn>(\n\tfields: Record<string, unknown>,\n\tpathPrefix?: string[],\n\tcodecs?: CodecsCollection,\n\tresult: SelectedFieldsOrdered<AnyColumn> = [],\n): SelectedFieldsOrdered<TColumn> {\n\tconst entries = Object.entries(fields);\n\n\tfor (let i = 0; i < entries.length; ++i) {\n\t\tconst [name, field] = entries[i]!;\n\t\tif (typeof name !== 'string') {\n\t\t\treturn result as SelectedFieldsOrdered<TColumn>;\n\t\t}\n\n\t\tconst newPath = pathPrefix ? [...pathPrefix, name] : [name];\n\t\tif (is(field, Column)) {\n\t\t\tresult.push({\n\t\t\t\tpath: newPath,\n\t\t\t\tfield: field,\n\t\t\t\tfieldType: 'Column',\n\t\t\t\tcodec: codecs?.get(field, 'normalize'),\n\t\t\t\tarrayDimensions: (<any> field).dimensions,\n\t\t\t\tcolumn: field,\n\t\t\t});\n\t\t} else if (is(field, SQL)) {\n\t\t\tconst col = getColumnFromDecoder(field);\n\t\t\tresult.push(\n\t\t\t\tcol\n\t\t\t\t\t? {\n\t\t\t\t\t\tpath: newPath,\n\t\t\t\t\t\tfield,\n\t\t\t\t\t\tfieldType: 'SQL',\n\t\t\t\t\t\tcodec: codecs?.get(col, 'normalize'),\n\t\t\t\t\t\tarrayDimensions: (<any> col).dimensions,\n\t\t\t\t\t\tcolumn: col,\n\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\tpath: newPath,\n\t\t\t\t\t\tfield,\n\t\t\t\t\t\tfieldType: 'SQL',\n\t\t\t\t\t},\n\t\t\t);\n\t\t} else if (is(field, SQL.Aliased)) {\n\t\t\tconst col = getColumnFromDecoder(field);\n\t\t\tresult.push(\n\t\t\t\tcol\n\t\t\t\t\t? {\n\t\t\t\t\t\tpath: newPath,\n\t\t\t\t\t\tfield,\n\t\t\t\t\t\tfieldType: 'SQL.Aliased',\n\t\t\t\t\t\tcodec: codecs?.get(col, 'normalize'),\n\t\t\t\t\t\tarrayDimensions: (<any> col).dimensions,\n\t\t\t\t\t\tcolumn: col,\n\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\tpath: newPath,\n\t\t\t\t\t\tfield,\n\t\t\t\t\t\tfieldType: 'SQL.Aliased',\n\t\t\t\t\t},\n\t\t\t);\n\t\t} else if (is(field, Subquery)) {\n\t\t\tlet column: Column | undefined;\n\t\t\tconst entries = Object.values(field._.selectedFields) as (SQL.Aliased | Column | SQL)[];\n\t\t\tconst entry = entries[0]!;\n\n\t\t\tlet fieldDecoder: DriverValueDecoder<any, any>;\n\t\t\tif (is(entry, Column)) {\n\t\t\t\tcolumn = entry;\n\t\t\t\tfieldDecoder = entry;\n\t\t\t} else if (is(entry, SQL)) {\n\t\t\t\tcolumn = getColumnFromDecoder(entry);\n\t\t\t\tfieldDecoder = entry.decoder;\n\t\t\t} else {\n\t\t\t\tcolumn = getColumnFromDecoder(entry);\n\t\t\t\tfieldDecoder = entry.sql.decoder;\n\t\t\t}\n\n\t\t\tif (fieldDecoder) {\n\t\t\t\tfield._.sql.decoder = fieldDecoder;\n\t\t\t}\n\n\t\t\tresult.push(\n\t\t\t\tcolumn\n\t\t\t\t\t? {\n\t\t\t\t\t\tpath: newPath,\n\t\t\t\t\t\tfield,\n\t\t\t\t\t\tfieldType: 'Subquery',\n\t\t\t\t\t\tcodec: codecs?.get(column, 'normalize'),\n\t\t\t\t\t\tarrayDimensions: (<any> column).dimensions,\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\tpath: newPath,\n\t\t\t\t\t\tfield,\n\t\t\t\t\t\tfieldType: 'Subquery',\n\t\t\t\t\t},\n\t\t\t);\n\t\t} else if (is(field, Table)) {\n\t\t\torderSelectedFields(field[Table.Symbol.Columns], newPath, codecs, result);\n\t\t} else {\n\t\t\torderSelectedFields(field as Record<string, unknown>, newPath, codecs, result);\n\t\t}\n\t}\n\n\treturn result as SelectedFieldsOrdered<TColumn>;\n}\n\nexport function getColumnFromDecoder(source: SQL | SQL.Aliased | SQLWrapper): Column | undefined {\n\tconst { decoder } = source.getSQL();\n\n\treturn isChunk(decoder, chunkKindOf(decoder), chunkKinds.column) ? decoder : undefined;\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 = Object.entries(values).filter(([, value]) => value !== undefined);\n\n\tif (entries.length === 0) {\n\t\tthrow new Error('No values to set');\n\t}\n\n\tconst mapped: [string, UpdateSet[string]][] = new Array(entries.length);\n\tfor (let i = 0; i < entries.length; ++i) {\n\t\tconst [key, value] = entries[i]!;\n\t\t// eslint-disable-next-line unicorn/prefer-ternary\n\t\tconst kind = chunkKindOf(value);\n\t\tif (isChunk(value, kind, chunkKinds.sql) || isChunk(value, kind, chunkKinds.column)) {\n\t\t\tmapped[i] = [key, value];\n\t\t} else {\n\t\t\tmapped[i] = [key, new Param(value, table[Table.Symbol.Columns][key])];\n\t\t}\n\t}\n\n\treturn Object.fromEntries(mapped);\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 Not<T extends boolean> = T extends true ? false : true;\n\nexport type IsNever<T> = [T] extends [never] ? true : false;\n\nexport type IsUnion<T, U extends T = T> = (T extends any ? (U extends T ? false : true) : never) extends false ? false\n\t: true;\n\nexport type SingleKeyObject<T, TError extends string, K = keyof T> = IsNever<K> extends true ? never\n\t: IsUnion<K> extends true ? DrizzleTypeError<TError>\n\t: T;\n\nexport type FromSingleKeyObject<T, Result, TError extends string, K = keyof T> = IsNever<K> extends true ? never\n\t: IsUnion<K> extends true ? DrizzleTypeError<TError>\n\t: Result;\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 type NonArray<T> = T extends any[] ? never : T;\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\nexport function getColumns<T extends Table | View | Subquery>(\n\ttable: T,\n): T extends Table ? T['_']['columns']\n\t: T extends View ? T['_']['selectedFields']\n\t: T extends Subquery ? T['_']['selectedFields']\n\t: never\n{\n\treturn (is(table, Table)\n\t\t? table[Table.Symbol.Columns]\n\t\t: is(table, View)\n\t\t? table[ViewBaseConfig].selectedFields\n\t\t: table._.selectedFields) as any;\n}\n\n/** @internal */\nexport function getTableLikeName(table: TableLike): string | undefined {\n\tconst kind = chunkKindOf(table);\n\treturn isChunk(table, kind, chunkKinds.subquery)\n\t\t? table._.alias\n\t\t: isChunk(table, kind, chunkKinds.view)\n\t\t? table[ViewBaseConfig].name\n\t\t: isChunk(table, kind, chunkKinds.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 interface DrizzleConfig<TRelationConfigs extends AnyRelations = EmptyRelations> {\n\tlogger?: boolean | Logger | undefined;\n\trelations?: TRelationConfigs | undefined;\n\tcache?: Cache | undefined;\n\tjit?: boolean | undefined;\n\t/** Put query params in `DrizzleQueryError` instances\n\t *\n\t * @default false\n\t */\n\tparamsInErrors?: boolean | undefined;\n}\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\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 ('relations' in data) {\n\t\tconst type = typeof data['relations'];\n\t\tif (type !== 'object' && type !== '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 ('paramsInErrors' in data) {\n\t\tconst type = typeof data['paramsInErrors'];\n\t\tif (type !== 'boolean' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('jit' in data) {\n\t\tconst type = typeof data['jit'];\n\t\tif (type !== 'boolean' && type !== 'undefined') return false;\n\n\t\treturn true;\n\t}\n\n\tif ('codecs' in data) {\n\t\tconst type = typeof data['codecs'];\n\t\tif (type !== 'object' && 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\nexport const textDecoder = typeof TextDecoder === 'undefined' ? null : new TextDecoder();\n\nexport function memoizeEscape(escape: (name: string) => string, limit = 4096): (name: string) => string {\n\tconst cache = new Map<string, string>();\n\treturn (name) => {\n\t\tlet escaped = cache.get(name);\n\t\tif (escaped === undefined) {\n\t\t\tif (cache.size >= limit) cache.clear();\n\t\t\tescaped = escape(name);\n\t\t\tcache.set(name, escaped);\n\t\t}\n\t\treturn escaped;\n\t};\n}\n\nexport function assertUnreachable(_x: never | undefined): never {\n\tthrow new Error(\"Didn't expect to get here\");\n}\n\nexport function isWithEnum(column: Column<any>): column is typeof column & { enumValues: [string, ...string[]] };\nexport function isWithEnum(value: unknown): value is { enumValues: [string, ...string[]] };\nexport function isWithEnum(value: unknown): boolean {\n\treturn ((typeof value === 'object' && value !== null) || typeof value === 'function') && 'enumValues' in value\n\t\t&& Array.isArray(value.enumValues)\n\t\t&& value.enumValues.length > 0;\n}\n\nexport type Literal = string | number | boolean | null;\nexport type Json = Literal | { [key: string]: any } | any[];\n\nexport type ColumnIsGeneratedAlwaysAs<TColumn> = TColumn extends Column<any>\n\t? TColumn['_']['identity'] extends 'always' ? true\n\t: TColumn['_'] extends { generated: undefined } ? false\n\t: TColumn['_']['generated'] extends { type: 'byDefault' } ? false\n\t: true\n\t: false;\n\nexport type GetSelection<T extends SelectedFieldsFlat<Column<any>> | Table<any> | View> = T extends Table<any>\n\t? T['_']['columns']\n\t: T extends View ? T['_']['selectedFields']\n\t: T;\n\nexport type RemoveNeverElements<T extends any[]> = T extends [infer First, ...infer Rest]\n\t? IsNever<First> extends true ? RemoveNeverElements<Rest>\n\t: [First, ...RemoveNeverElements<Rest>]\n\t: [];\n\nexport type EnumValuesToEnum<TEnumValues extends [string, ...string[]]> = { [K in TEnumValues[number]]: K };\n\nexport type EnumValuesToReadonlyEnum<TEnumValues extends [string, ...string[]]> = {\n\treadonly [K in TEnumValues[number]]: K;\n};\n\nexport const CONSTANTS = {\n\tINT8_MIN: -128,\n\tINT8_MAX: 127,\n\tINT8_UNSIGNED_MAX: 255,\n\tINT16_MIN: -32768,\n\tINT16_MAX: 32767,\n\tINT16_UNSIGNED_MAX: 65535,\n\tINT24_MIN: -8388608,\n\tINT24_MAX: 8388607,\n\tINT24_UNSIGNED_MAX: 16777215,\n\tINT32_MIN: -2147483648,\n\tINT32_MAX: 2147483647,\n\tINT32_UNSIGNED_MAX: 4294967295,\n\tINT48_MIN: -140737488355328,\n\tINT48_MAX: 140737488355327,\n\tINT48_UNSIGNED_MAX: 281474976710655,\n\tINT64_MIN: -9223372036854775808n,\n\tINT64_MAX: 9223372036854775807n,\n\tINT64_UNSIGNED_MAX: 18446744073709551615n,\n};\n\nexport function base64ToUint8Array(base64: string): Uint8Array {\n\tif (!base64) return new Uint8Array(0);\n\tconst binary = atob(base64);\n\tconst len = binary.length;\n\tconst bytes = new Uint8Array(len);\n\n\tfor (let i = 0; i < len; ++i) {\n\t\tbytes[i] = binary.charCodeAt(i);\n\t}\n\n\treturn bytes;\n}\n\nexport function pgHexToUint8Array(hex: string): Uint8Array {\n\tconst len = (hex.length - 2) >> 1;\n\tconst bytes = new Uint8Array(len);\n\n\tfor (let i = 0; i < len; ++i) {\n\t\tbytes[i] = Number.parseInt(hex.slice(2 + i * 2, 4 + i * 2), 16);\n\t}\n\n\treturn bytes;\n}\n\nexport type PartialWithUndefined<T> = {\n\t[K in keyof T]?: T[K] | undefined;\n};\n\nexport type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends ((k: infer I) => void) ? I\n\t: never;\n\nexport type LastInUnion<U> = UnionToIntersection<U extends any ? (x: U) => void : never> extends (x: infer M) => void\n\t? M\n\t: never;\n\nexport type UnionToTuple<U, Last = LastInUnion<U>> = [U] extends [never] ? []\n\t: [...UnionToTuple<Exclude<U, Last>>, Last];\n\nexport type JoinTuple<T extends any[], Separator extends string> = T extends [] ? ''\n\t: T extends [string | number | boolean | bigint] ? `${T[0]}`\n\t: T extends [string | number | boolean | bigint, ...infer U] ? `${T[0]}${Separator}${JoinTuple<U, Separator>}`\n\t: string;\n\nexport type JoinUnion<U extends string, Separator extends string> = JoinTuple<UnionToTuple<U>, Separator>;\n", "import type { Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport type { SQLChunk } from './sql/sql.ts';\nimport type { Writable } from './utils.ts';\n\nexport type NormalizeCodec = (value: any) => any;\nexport type NormalizeArrayCodec = (value: any, arrayDimensions: number) => any;\nexport type CastCodec = (name: SQLChunk) => SQLChunk;\nexport type CastArrayCodec = (name: SQLChunk, arrayDimensions: number) => SQLChunk;\nexport type CastParamCodec = (name: string, column: Column) => string;\nexport type CastArrayParamCodec = (name: string, column: Column, arrayDimensions: number) => string;\n\nexport interface Codec {\n\treadonly cast?: CastCodec | undefined;\n\treadonly castArray?: CastArrayCodec | undefined;\n\treadonly castInJson?: CastCodec | undefined;\n\treadonly castArrayInJson?: CastArrayCodec | undefined;\n\treadonly castParam?: CastParamCodec | undefined;\n\treadonly castArrayParam?: CastArrayParamCodec | undefined;\n\treadonly normalize?: NormalizeCodec | undefined;\n\treadonly normalizeArray?: NormalizeArrayCodec | undefined;\n\treadonly normalizeInJson?: NormalizeCodec | undefined;\n\treadonly normalizeArrayInJson?: NormalizeArrayCodec | undefined;\n\treadonly normalizeParam?: NormalizeCodec | undefined;\n\treadonly normalizeParamArray?: NormalizeArrayCodec | undefined;\n}\n\nexport type Codecs<TTypeSet extends string = string> = {\n\treadonly [K in TTypeSet]?: Codec | undefined;\n};\n\nexport const noopCodecs: Codecs = {};\n\n/** Holds array-type codecs for array columns */\nexport interface ResolvedCodecs {\n\treadonly cast: CastCodec | CastArrayCodec | undefined;\n\treadonly castInJson: CastCodec | CastArrayCodec | undefined;\n\treadonly castParam: CastParamCodec | CastArrayParamCodec | undefined;\n\treadonly normalize: NormalizeCodec | NormalizeArrayCodec | undefined;\n\treadonly normalizeInJson: NormalizeCodec | NormalizeArrayCodec | undefined;\n\treadonly normalizeParam: NormalizeCodec | NormalizeArrayCodec | undefined;\n}\n\nconst noCodecs: ResolvedCodecs = {\n\tcast: undefined,\n\tcastInJson: undefined,\n\tcastParam: undefined,\n\tnormalize: undefined,\n\tnormalizeInJson: undefined,\n\tnormalizeParam: undefined,\n};\n\nconst arrayToItemTypeCodecNameMap = {\n\tcast: 'cast',\n\tcastArray: 'cast',\n\tcastInJson: 'castInJson',\n\tcastArrayInJson: 'castInJson',\n\tcastParam: 'castParam',\n\tcastArrayParam: 'castParam',\n\tnormalize: 'normalize',\n\tnormalizeArray: 'normalize',\n\tnormalizeInJson: 'normalizeInJson',\n\tnormalizeArrayInJson: 'normalizeInJson',\n\tnormalizeParam: 'normalizeParam',\n\tnormalizeParamArray: 'normalizeParam',\n} as const satisfies Record<keyof Codec, keyof Codec>;\n\nexport type ItemToArrayTypeCodecNameMap = {\n\tcast: 'castArray';\n\tcastArray: 'castArray';\n\tcastInJson: 'castArrayInJson';\n\tcastArrayInJson: 'castArrayInJson';\n\tcastParam: 'castArrayParam';\n\tcastArrayParam: 'castArrayParam';\n\tnormalize: 'normalizeArray';\n\tnormalizeArray: 'normalizeArray';\n\tnormalizeInJson: 'normalizeArrayInJson';\n\tnormalizeArrayInJson: 'normalizeArrayInJson';\n\tnormalizeParam: 'normalizeParamArray';\n\tnormalizeParamArray: 'normalizeParamArray';\n};\n\nexport class CodecsCollection<TTypeSet extends string = string> {\n\tstatic readonly [entityKind]: string = 'CodecsCollection';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tconstructor(protected resolveTypes: (type: string) => string, readonly codecs: Codecs<TTypeSet> = noopCodecs) {}\n\n\tprivate itemCodecsCache: Map<string, ResolvedCodecs> = new Map();\n\tprivate arrayCodecsCache: Map<string, ResolvedCodecs> = new Map();\n\n\t/** @internal */\n\tcodecsOf(column: Column, override?: TTypeSet): ResolvedCodecs {\n\t\tconst sqlType = (override ?? column.codec) as TTypeSet | undefined;\n\t\tif (!sqlType) return noCodecs;\n\n\t\tconst isArray = !!(<any> column).dimensions;\n\t\tconst cache = isArray ? this.arrayCodecsCache : this.itemCodecsCache;\n\t\tlet resolved = cache.get(sqlType);\n\t\tif (resolved === undefined) {\n\t\t\tconst codec = this.codecs[sqlType];\n\t\t\tresolved = codec\n\t\t\t\t? isArray\n\t\t\t\t\t? {\n\t\t\t\t\t\tcast: codec.castArray,\n\t\t\t\t\t\tcastInJson: codec.castArrayInJson,\n\t\t\t\t\t\tcastParam: codec.castArrayParam,\n\t\t\t\t\t\tnormalize: codec.normalizeArray,\n\t\t\t\t\t\tnormalizeInJson: codec.normalizeArrayInJson,\n\t\t\t\t\t\tnormalizeParam: codec.normalizeParamArray,\n\t\t\t\t\t}\n\t\t\t\t\t: {\n\t\t\t\t\t\tcast: codec.cast,\n\t\t\t\t\t\tcastInJson: codec.castInJson,\n\t\t\t\t\t\tcastParam: codec.castParam,\n\t\t\t\t\t\tnormalize: codec.normalize,\n\t\t\t\t\t\tnormalizeInJson: codec.normalizeInJson,\n\t\t\t\t\t\tnormalizeParam: codec.normalizeParam,\n\t\t\t\t\t}\n\t\t\t\t: noCodecs;\n\t\t\tcache.set(sqlType, resolved);\n\t\t}\n\n\t\treturn resolved;\n\t}\n\n\tget<TCodecType extends keyof Codec>(\n\t\tcolumn: Column,\n\t\ttype: TCodecType,\n\t\toverride?: TTypeSet,\n\t):\n\t\t| Codec[typeof arrayToItemTypeCodecNameMap[TCodecType]]\n\t\t| Codec[ItemToArrayTypeCodecNameMap[TCodecType]]\n\t{\n\t\treturn this.codecsOf(column, override)[arrayToItemTypeCodecNameMap[type]] as any;\n\t}\n\n\tapply<TCodecType extends keyof Codec>(\n\t\tcolumn: Column,\n\t\ttype: TCodecType,\n\t\tvalue: Codec[TCodecType] extends ((v: infer TValue, ...rest: any[]) => any) ? TValue : unknown,\n\t\toverride?: TTypeSet,\n\t): ReturnType<Exclude<Codec[TCodecType], undefined>> {\n\t\tconst codecType = arrayToItemTypeCodecNameMap[type];\n\t\tconst codec = this.codecsOf(column, override)[codecType];\n\t\tif (!codec) return value as any;\n\n\t\tif (codecType === 'castParam') {\n\t\t\treturn (<CastParamCodec | CastArrayParamCodec> codec)(value as string, column, (<any> column).dimensions) as any;\n\t\t}\n\n\t\treturn (<NormalizeCodec | NormalizeArrayCodec | CastCodec | CastArrayCodec> codec)(\n\t\t\tvalue as any,\n\t\t\t(<any> column).dimensions,\n\t\t);\n\t}\n}\n\nexport function refineCodecs<TTypeSet extends string>(\n\tsource: Codecs<TTypeSet>,\n\textension: Codecs<TTypeSet> = {},\n): Codecs<TTypeSet> {\n\tconst keys = new Set<TTypeSet>([...Object.keys(source), ...Object.keys(extension)] as TTypeSet[]).values();\n\tconst result: { [K in TTypeSet]?: Writable<Codec> | undefined } = {};\n\n\tfor (const k of keys) {\n\t\tif (!(k in extension)) {\n\t\t\tresult[k] = source[k] ? { ...source[k] } : undefined;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!(k in source) || (extension[k] === undefined)) {\n\t\t\tresult[k] = extension[k] ? { ...extension[k] } : undefined;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst innerKeys = new Set<keyof Codec>(\n\t\t\t[...Object.keys(extension[k]), ...(Object.keys(source[k] ?? {}))] as (keyof Codec)[],\n\t\t).values();\n\n\t\tresult[k] = {};\n\t\tfor (const ik of innerKeys) {\n\t\t\tresult[k][ik] = (ik in extension[k] ? extension[k][ik] : source[k]?.[ik]) as any;\n\t\t}\n\t}\n\n\treturn result;\n}\n", "import { type CastCodec, type Codecs, refineCodecs } from '~/codecs.ts';\nimport { sql } from '~/sql/sql.ts';\nimport type { PartialWithUndefined } from '~/utils.ts';\n\nexport type SQLiteType =\n\t// Integer\n\t| 'integer'\n\t| 'integer:boolean'\n\t| 'integer:timestamp'\n\t| 'integer:timestamp_ms'\n\t// Real\n\t| 'real'\n\t// Text\n\t| 'text'\n\t| 'text:json'\n\t// Blob\n\t| 'blob'\n\t| 'blob:json'\n\t| 'blob:bigint'\n\t// Numeric\n\t| 'numeric'\n\t| 'numeric:number'\n\t| 'numeric:bigint';\n\nconst SQLITE_ALIAS_TO_TYPE_MAP = {\n\tint: 'integer',\n\tint2: 'integer',\n\tint8: 'integer',\n\ttinyint: 'integer',\n\tsmallint: 'integer',\n\tmediumint: 'integer',\n\tbool: 'integer:boolean',\n\tboolean: 'integer:boolean',\n\tfloat: 'real',\n\tdouble: 'real',\n\t'double precision': 'real',\n\tdecimal: 'numeric',\n\tcharacter: 'text',\n\tvarchar: 'text',\n\t'varying character': 'text',\n\tnchar: 'text',\n\t'native character': 'text',\n\tnvarchar: 'text',\n\tclob: 'text',\n\tjson: 'text:json',\n} as const satisfies Record<string, SQLiteType>;\n\nexport type SQLiteAliasType = keyof typeof SQLITE_ALIAS_TO_TYPE_MAP;\n\nexport type SQLiteColumnType =\n\t| SQLiteType\n\t| SQLiteAliasType;\n\nexport function resolveSQLiteTypeAlias(type: string) {\n\treturn (SQLITE_ALIAS_TO_TYPE_MAP as Record<string, SQLiteType | undefined>)[type] ?? type;\n}\n\nexport type SQLiteCodecs = Codecs<SQLiteType>;\n\nexport const castToText: CastCodec = (name) => sql`cast(${name} as text)`;\nexport const castToHex: CastCodec = (name) => sql`hex(${name})`;\n\nconst uint8ArrayFromHex = (value: string): Uint8Array => {\n\tconst bytes = new Uint8Array(value.length >> 1);\n\tfor (let i = 0; i < bytes.length; ++i) bytes[i] = Number.parseInt(value.substring(i * 2, i * 2 + 2), 16);\n\treturn bytes;\n};\n\nexport const bufferFromHex = typeof Buffer === 'undefined'\n\t? uint8ArrayFromHex\n\t: (value: string): Buffer => Buffer.from(value, 'hex');\n\nexport const bufferFromBytes = (value: Uint8Array): Buffer =>\n\tBuffer.from(value.buffer, value.byteOffset, value.byteLength);\nexport const bufferFromBytesIfAvailable = typeof Buffer === 'undefined' ? undefined : bufferFromBytes;\nexport const bufferFromBinary = (value: ArrayBuffer | ArrayLike<number>): Buffer => Buffer.from(value as ArrayBuffer);\nexport const bufferFromBinaryIfAvailable = typeof Buffer === 'undefined'\n\t? (value: ArrayBuffer | ArrayLike<number>): Uint8Array => new Uint8Array(value as ArrayBuffer)\n\t: bufferFromBinary;\n\nconst utf8Encoder = typeof Buffer === 'undefined' ? new TextEncoder() : undefined;\nexport const bytesFromUtf8 = utf8Encoder\n\t? (value: string): Buffer => utf8Encoder.encode(value) as Buffer\n\t: (value: string): Buffer => Buffer.from(value);\n\nexport const dateFromSeconds = (value: number): Date => new Date(value * 1000);\nexport const dateFromMilliseconds = (value: number): Date => new Date(value);\n// Sqlite picks a storage class per row, so the two scenarios only separate on the value itself\nexport const dateFromStoredSeconds = (value: number | string): Date =>\n\ttypeof value === 'string' ? new Date(value.replaceAll('\"', '')) : new Date(value * 1000);\nexport const dateFromStoredMilliseconds = (value: number | string): Date =>\n\ttypeof value === 'string' ? new Date(value.replaceAll('\"', '')) : new Date(value);\nexport const booleanFromInteger = (value: number): boolean => value === 1;\n\nexport const genericSQLiteCodecs = {\n\t'integer:boolean': {\n\t\tnormalizeInJson: booleanFromInteger,\n\t},\n\t'integer:timestamp': {\n\t\tnormalizeInJson: dateFromStoredSeconds,\n\t},\n\t'integer:timestamp_ms': {\n\t\tnormalizeInJson: dateFromStoredMilliseconds,\n\t},\n\t'text:json': {\n\t\tnormalizeInJson: JSON.parse,\n\t},\n\tblob: {\n\t\tcastInJson: castToHex,\n\t\tnormalizeInJson: bufferFromHex,\n\t},\n\t'blob:json': {\n\t\tcastInJson: castToText,\n\t\tnormalizeInJson: JSON.parse,\n\t},\n\t'blob:bigint': {\n\t\tcastInJson: castToText,\n\t\tnormalizeInJson: BigInt,\n\t},\n\tnumeric: {\n\t\tcastInJson: castToText,\n\t\tnormalizeInJson: String,\n\t},\n\t'numeric:number': {\n\t\tcastInJson: castToText,\n\t\tnormalizeInJson: Number,\n\t},\n\t'numeric:bigint': {\n\t\tcastInJson: castToText,\n\t\tnormalizeInJson: BigInt,\n\t},\n} as const satisfies SQLiteCodecs;\n\nexport const unionsTypeTable = {\n\tinteger: {\n\t\tinteger: 'integer',\n\t\t'integer:boolean': 'integer',\n\t\t'integer:timestamp': 'integer',\n\t\t'integer:timestamp_ms': 'integer',\n\t\treal: 'integer',\n\t\ttext: 'integer',\n\t\t'text:json': 'integer',\n\t\tblob: 'integer',\n\t\t'blob:json': 'integer',\n\t\t'blob:bigint': 'integer',\n\t\tnumeric: 'integer',\n\t\t'numeric:number': 'integer',\n\t\t'numeric:bigint': 'integer',\n\t},\n\t'integer:boolean': {\n\t\tinteger: 'integer:boolean',\n\t\t'integer:boolean': 'integer:boolean',\n\t\t'integer:timestamp': 'integer:boolean',\n\t\t'integer:timestamp_ms': 'integer:boolean',\n\t\treal: 'integer:boolean',\n\t\ttext: 'integer:boolean',\n\t\t'text:json': 'integer:boolean',\n\t\tblob: 'integer:boolean',\n\t\t'blob:json': 'integer:boolean',\n\t\t'blob:bigint': 'integer:boolean',\n\t\tnumeric: 'integer:boolean',\n\t\t'numeric:number': 'integer:boolean',\n\t\t'numeric:bigint': 'integer:boolean',\n\t},\n\t'integer:timestamp': {\n\t\tinteger: 'integer:timestamp',\n\t\t'integer:boolean': 'integer:timestamp',\n\t\t'integer:timestamp': 'integer:timestamp',\n\t\t'integer:timestamp_ms': 'integer:timestamp',\n\t\treal: 'integer:timestamp',\n\t\ttext: 'integer:timestamp',\n\t\t'text:json': 'integer:timestamp',\n\t\tblob: 'integer:timestamp',\n\t\t'blob:json': 'integer:timestamp',\n\t\t'blob:bigint': 'integer:timestamp',\n\t\tnumeric: 'integer:timestamp',\n\t\t'numeric:number': 'integer:timestamp',\n\t\t'numeric:bigint': 'integer:timestamp',\n\t},\n\t'integer:timestamp_ms': {\n\t\tinteger: 'integer:timestamp_ms',\n\t\t'integer:boolean': 'integer:timestamp_ms',\n\t\t'integer:timestamp': 'integer:timestamp_ms',\n\t\t'integer:timestamp_ms': 'integer:timestamp_ms',\n\t\treal: 'integer:timestamp_ms',\n\t\ttext: 'integer:timestamp_ms',\n\t\t'text:json': 'integer:timestamp_ms',\n\t\tblob: 'integer:timestamp_ms',\n\t\t'blob:json': 'integer:timestamp_ms',\n\t\t'blob:bigint': 'integer:timestamp_ms',\n\t\tnumeric: 'integer:timestamp_ms',\n\t\t'numeric:number': 'integer:timestamp_ms',\n\t\t'numeric:bigint': 'integer:timestamp_ms',\n\t},\n\treal: {\n\t\tinteger: 'real',\n\t\t'integer:boolean': 'real',\n\t\t'integer:timestamp': 'real',\n\t\t'integer:timestamp_ms': 'real',\n\t\treal: 'real',\n\t\ttext: 'real',\n\t\t'text:json': 'real',\n\t\tblob: 'real',\n\t\t'blob:json': 'real',\n\t\t'blob:bigint': 'real',\n\t\tnumeric: 'real',\n\t\t'numeric:number': 'real',\n\t\t'numeric:bigint': 'real',\n\t},\n\ttext: {\n\t\tinteger: 'text',\n\t\t'integer:boolean': 'text',\n\t\t'integer:timestamp': 'text',\n\t\t'integer:timestamp_ms': 'text',\n\t\treal: 'text',\n\t\ttext: 'text',\n\t\t'text:json': 'text',\n\t\tblob: 'text',\n\t\t'blob:json': 'text',\n\t\t'blob:bigint': 'text',\n\t\tnumeric: 'numeric',\n\t\t'numeric:number': 'text',\n\t\t'numeric:bigint': 'text',\n\t},\n\t'text:json': {\n\t\tinteger: 'text:json',\n\t\t'integer:boolean': 'text:json',\n\t\t'integer:timestamp': 'text:json',\n\t\t'integer:timestamp_ms': 'text:json',\n\t\treal: 'text:json',\n\t\ttext: 'text:json',\n\t\t'text:json': 'text:json',\n\t\tblob: 'text:json',\n\t\t'blob:json': 'blob:json',\n\t\t'blob:bigint': 'text:json',\n\t\tnumeric: 'text:json',\n\t\t'numeric:number': 'text:json',\n\t\t'numeric:bigint': 'text:json',\n\t},\n\tblob: {\n\t\tinteger: 'blob',\n\t\t'integer:boolean': 'blob',\n\t\t'integer:timestamp': 'blob',\n\t\t'integer:timestamp_ms': 'blob',\n\t\treal: 'blob',\n\t\ttext: 'blob',\n\t\t'text:json': 'blob',\n\t\tblob: 'blob',\n\t\t'blob:json': 'blob',\n\t\t'blob:bigint': 'blob',\n\t\tnumeric: 'blob',\n\t\t'numeric:number': 'blob',\n\t\t'numeric:bigint': 'blob',\n\t},\n\t'blob:json': {\n\t\tinteger: 'blob:json',\n\t\t'integer:boolean': 'blob:json',\n\t\t'integer:timestamp': 'blob:json',\n\t\t'integer:timestamp_ms': 'blob:json',\n\t\treal: 'blob:json',\n\t\ttext: 'blob:json',\n\t\t'text:json': 'blob:json',\n\t\tblob: 'blob:json',\n\t\t'blob:json': 'blob:json',\n\t\t'blob:bigint': 'blob:json',\n\t\tnumeric: 'blob:json',\n\t\t'numeric:number': 'blob:json',\n\t\t'numeric:bigint': 'blob:json',\n\t},\n\t'blob:bigint': {\n\t\tinteger: 'blob:bigint',\n\t\t'integer:boolean': 'blob:bigint',\n\t\t'integer:timestamp': 'blob:bigint',\n\t\t'integer:timestamp_ms': 'blob:bigint',\n\t\treal: 'blob:bigint',\n\t\ttext: 'blob:bigint',\n\t\t'text:json': 'blob:bigint',\n\t\tblob: 'blob:bigint',\n\t\t'blob:json': 'blob:bigint',\n\t\t'blob:bigint': 'blob:bigint',\n\t\tnumeric: 'blob:bigint',\n\t\t'numeric:number': 'blob:bigint',\n\t\t'numeric:bigint': 'blob:bigint',\n\t},\n\tnumeric: {\n\t\tinteger: 'numeric',\n\t\t'integer:boolean': 'numeric',\n\t\t'integer:timestamp': 'numeric',\n\t\t'integer:timestamp_ms': 'numeric',\n\t\treal: 'numeric',\n\t\ttext: 'numeric',\n\t\t'text:json': 'numeric',\n\t\tblob: 'numeric',\n\t\t'blob:json': 'numeric',\n\t\t'blob:bigint': 'numeric',\n\t\tnumeric: 'numeric',\n\t\t'numeric:number': 'numeric',\n\t\t'numeric:bigint': 'numeric',\n\t},\n\t'numeric:number': {\n\t\tinteger: 'numeric:number',\n\t\t'integer:boolean': 'numeric:number',\n\t\t'integer:timestamp': 'numeric:number',\n\t\t'integer:timestamp_ms': 'numeric:number',\n\t\treal: 'numeric:number',\n\t\ttext: 'numeric:number',\n\t\t'text:json': 'numeric:number',\n\t\tblob: 'numeric:number',\n\t\t'blob:json': 'numeric:number',\n\t\t'blob:bigint': 'numeric:number',\n\t\tnumeric: 'numeric:number',\n\t\t'numeric:number': 'numeric:number',\n\t\t'numeric:bigint': 'numeric:number',\n\t},\n\t'numeric:bigint': {\n\t\tinteger: 'numeric:bigint',\n\t\t'integer:boolean': 'numeric:bigint',\n\t\t'integer:timestamp': 'numeric:bigint',\n\t\t'integer:timestamp_ms': 'numeric:bigint',\n\t\treal: 'numeric:bigint',\n\t\ttext: 'numeric:bigint',\n\t\t'text:json': 'numeric:bigint',\n\t\tblob: 'numeric:bigint',\n\t\t'blob:json': 'numeric:bigint',\n\t\t'blob:bigint': 'numeric:bigint',\n\t\tnumeric: 'numeric:bigint',\n\t\t'numeric:number': 'numeric:bigint',\n\t\t'numeric:bigint': 'numeric:bigint',\n\t},\n} as const satisfies Record<SQLiteType, Record<SQLiteType, SQLiteType>>;\n\nexport function resolveUnionType(left: SQLiteType, right: SQLiteType): SQLiteType | undefined {\n\treturn (unionsTypeTable as Record<string, Record<string, SQLiteType> | undefined>)[left]?.[right];\n}\n\nexport const refineSqliteCodecs = (extension?: PartialWithUndefined<SQLiteCodecs>): SQLiteCodecs =>\n\trefineCodecs<SQLiteType>(genericSQLiteCodecs, extension);\n", "import type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport { bytesFromUtf8 } from '~/sqlite-core/codecs.ts';\nimport type { SQLiteTable } 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 class SQLiteBigIntBuilder extends SQLiteColumnBuilder<{\n\tdataType: 'bigint int64';\n\tdata: bigint;\n\tdriverParam: Buffer;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBigIntBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'bigint int64', 'SQLiteBigInt');\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteBigInt(table, this.config as any);\n\t}\n}\n\nexport class SQLiteBigInt<T extends ColumnBaseConfig<'bigint int64'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBigInt';\n\n\t/** @internal */\n\toverride readonly codec = 'blob:bigint';\n\n\tgetSQLType(): string {\n\t\treturn 'blob';\n\t}\n\n\toverride mapToDriverValue = (value: bigint): Buffer => {\n\t\treturn bytesFromUtf8(value.toString());\n\t};\n}\n\nexport class SQLiteBlobJsonBuilder extends SQLiteColumnBuilder<{\n\tdataType: 'object json';\n\tdata: unknown;\n\tdriverParam: Buffer;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobJsonBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'object json', 'SQLiteBlobJson');\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteBlobJson(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteBlobJson<T extends ColumnBaseConfig<'object json'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobJson';\n\n\t/** @internal */\n\toverride readonly codec = 'blob:json';\n\n\tgetSQLType(): string {\n\t\treturn 'blob';\n\t}\n\n\toverride mapToDriverValue = (value: T['data']): Buffer => {\n\t\treturn bytesFromUtf8(JSON.stringify(value));\n\t};\n}\n\nexport class SQLiteBlobBufferBuilder extends SQLiteColumnBuilder<{\n\tdataType: 'object buffer';\n\tdata: Buffer;\n\tdriverParam: Buffer;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobBufferBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'object buffer', 'SQLiteBlobBuffer');\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteBlobBuffer(table, this.config as any);\n\t}\n}\n\nexport class SQLiteBlobBuffer<T extends ColumnBaseConfig<'object buffer'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBlobBuffer';\n\n\t/** @internal */\n\toverride readonly codec = 'blob';\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<TMode extends BlobMode = BlobMode>(\n\tconfig?: BlobConfig<TMode>,\n): Equal<TMode, 'bigint'> extends true ? SQLiteBigIntBuilder\n\t: Equal<TMode, 'buffer'> extends true ? SQLiteBlobBufferBuilder\n\t: SQLiteBlobJsonBuilder;\nexport function blob<TMode extends BlobMode = BlobMode>(\n\tname: string,\n\tconfig?: BlobConfig<TMode>,\n): Equal<TMode, 'bigint'> extends true ? SQLiteBigIntBuilder\n\t: Equal<TMode, 'buffer'> extends true ? SQLiteBlobBufferBuilder\n\t: SQLiteBlobJsonBuilder;\nexport function blob(a?: string | BlobConfig, b?: BlobConfig) {\n\tconst { name, config } = getColumnNameAndConfig<BlobConfig | undefined>(a, b);\n\tif (config?.mode === 'bigint') {\n\t\treturn new SQLiteBigIntBuilder(name);\n\t}\n\tif (config?.mode === 'buffer') {\n\t\treturn new SQLiteBlobBufferBuilder(name);\n\t}\n\treturn new SQLiteBlobJsonBuilder(name);\n}\n", "import type { ColumnBuilderBaseConfig, ColumnType, HasDefault, IsPrimaryKey, NotNull } 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 { SQLiteTable } 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<ColumnType>,\n\tTRuntimeConfig extends object = object,\n> extends SQLiteColumnBuilder<\n\tT,\n\tTRuntimeConfig & { autoIncrement: boolean },\n\t{ primaryKeyHasDefault: true }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBaseIntegerBuilder';\n\n\tconstructor(name: string, dataType: T['dataType'], columnType: string) {\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\nexport abstract class SQLiteBaseInteger<\n\tT extends ColumnBaseConfig<ColumnType>,\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 class SQLiteIntegerBuilder extends SQLiteBaseIntegerBuilder<{\n\tdataType: 'number int53';\n\tdata: number;\n\tdriverParam: number;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteIntegerBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number int53', 'SQLiteInteger');\n\t}\n\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteInteger(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteInteger<T extends ColumnBaseConfig<'number int53'>> extends SQLiteBaseInteger<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteInteger';\n\n\t/** @internal */\n\toverride readonly codec = 'integer';\n}\n\nexport class SQLiteTimestampBuilder extends SQLiteBaseIntegerBuilder<{\n\tdataType: 'object date';\n\tdata: Date;\n\tdriverParam: number;\n}, { mode: 'timestamp' | 'timestamp_ms' }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTimestampBuilder';\n\n\tconstructor(name: string, mode: 'timestamp' | 'timestamp_ms') {\n\t\tsuper(name, 'object 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\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteTimestamp(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteTimestamp<T extends ColumnBaseConfig<'object date'>>\n\textends SQLiteBaseInteger<T, { mode: 'timestamp' | 'timestamp_ms' }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTimestamp';\n\n\t/** @internal */\n\toverride readonly codec: 'integer:timestamp' | 'integer:timestamp_ms' = `integer:${this.config.mode}`;\n\n\treadonly mode: 'timestamp' | 'timestamp_ms' = this.config.mode;\n\n\toverride mapToDriverValue = (value: Date | number): number => {\n\t\tif (typeof value === 'number') return value;\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 class SQLiteBooleanBuilder extends SQLiteBaseIntegerBuilder<{\n\tdataType: 'boolean';\n\tdata: boolean;\n\tdriverParam: number;\n}, { mode: 'boolean' }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBooleanBuilder';\n\n\tconstructor(name: string, mode: 'boolean') {\n\t\tsuper(name, 'boolean', 'SQLiteBoolean');\n\t\tthis.config.mode = mode;\n\t}\n\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteBoolean(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteBoolean<T extends ColumnBaseConfig<'boolean'>> extends SQLiteBaseInteger<T, { mode: 'boolean' }> {\n\tstatic override readonly [entityKind]: string = 'SQLiteBoolean';\n\n\t/** @internal */\n\toverride readonly codec = 'integer:boolean';\n\n\treadonly mode: 'boolean' = this.config.mode;\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<TMode extends IntegerConfig['mode']>(\n\tconfig?: IntegerConfig<TMode>,\n): Or<Equal<TMode, 'timestamp'>, Equal<TMode, 'timestamp_ms'>> extends true ? SQLiteTimestampBuilder\n\t: Equal<TMode, 'boolean'> extends true ? SQLiteBooleanBuilder\n\t: SQLiteIntegerBuilder;\nexport function integer<TMode extends IntegerConfig['mode']>(\n\tname: string,\n\tconfig?: IntegerConfig<TMode>,\n): Or<Equal<TMode, 'timestamp'>, Equal<TMode, 'timestamp_ms'>> extends true ? SQLiteTimestampBuilder\n\t: Equal<TMode, 'boolean'> extends true ? SQLiteBooleanBuilder\n\t: SQLiteIntegerBuilder;\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 { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { SQLiteTable } from '../table.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport class SQLiteRealBuilder extends SQLiteColumnBuilder<{\n\tdataType: 'number double';\n\tdata: number;\n\tdriverParam: number;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteRealBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number double', 'SQLiteReal');\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteReal(table, this.config as any);\n\t}\n}\n\nexport class SQLiteReal<T extends ColumnBaseConfig<'number double'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteReal';\n\n\t/** @internal */\n\toverride readonly codec = 'real';\n\n\tgetSQLType(): string {\n\t\treturn 'real';\n\t}\n}\n\nexport function real(name?: string): SQLiteRealBuilder {\n\treturn new SQLiteRealBuilder(name ?? '');\n}\n", "import type { ColumnBuilderRuntimeConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { AnySQLiteTable, SQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Equal, getColumnNameAndConfig, type Writable } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport class SQLiteTextBuilder<\n\tTEnum extends [string, ...string[]],\n> extends SQLiteColumnBuilder<\n\t{\n\t\tdataType: Equal<TEnum, [string, ...string[]]> extends true ? 'string' : 'string enum';\n\t\tdata: TEnum[number];\n\t\tdriverParam: string;\n\t\tenumValues: TEnum;\n\t},\n\t{ enumValues: TEnum; length: number | undefined }\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTextBuilder';\n\n\tconstructor(name: string, config: SQLiteTextConfig<'text', TEnum>) {\n\t\tsuper(name, config.enum?.length ? 'string enum' : '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(table: SQLiteTable) {\n\t\treturn new SQLiteText(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteText<T extends ColumnBaseConfig<'string' | 'string enum'>>\n\textends SQLiteColumn<T, { length: number | undefined; enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteText';\n\n\t/** @internal */\n\toverride readonly codec = 'text';\n\n\toverride readonly enumValues = this.config.enumValues;\n\n\tconstructor(\n\t\ttable: AnySQLiteTable<{ name: T['tableName'] }>,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data']> & { enumValues: T['enumValues']; length: number | undefined },\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 class SQLiteTextJsonBuilder extends SQLiteColumnBuilder<{\n\tdataType: 'object json';\n\tdata: unknown;\n\tdriverParam: string;\n\n\tgenerated: undefined;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteTextJsonBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'object json', 'SQLiteTextJson');\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteTextJson(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteTextJson<T extends ColumnBaseConfig<'object json'>>\n\textends SQLiteColumn<T, { length: number | undefined; enumValues: T['enumValues'] }>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteTextJson';\n\n\t/** @internal */\n\toverride readonly codec = 'text:json';\n\n\tgetSQLType(): string {\n\t\treturn 'text';\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> = TMode extends 'text' ? {\n\t\tmode?: TMode;\n\t\tlength?: number;\n\t\tenum?: TEnum;\n\t}\n\t: {\n\t\tmode?: TMode;\n\t};\n\nexport function text<\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tTMode extends 'text' | 'json' = 'text' | 'json',\n>(\n\tconfig?: SQLiteTextConfig<TMode, T | Writable<T>>,\n): Equal<TMode, 'json'> extends true ? SQLiteTextJsonBuilder\n\t: SQLiteTextBuilder<Writable<T>>;\nexport function text<\n\tU extends string,\n\tT extends Readonly<[U, ...U[]]>,\n\tTMode extends 'text' | 'json' = 'text' | 'json',\n>(\n\tname: string,\n\tconfig?: SQLiteTextConfig<TMode, T | Writable<T>>,\n): Equal<TMode, 'json'> extends true ? SQLiteTextJsonBuilder\n\t: SQLiteTextBuilder<Writable<T>>;\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 type { ColumnBuilderBaseConfig, ColumnBuilderRuntimeConfig } from '~/column-builder.ts';\nimport type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { SQL, SQLGenerator } from '~/sql/sql.ts';\nimport { resolveSQLiteTypeAlias, type SQLiteColumnType, type SQLiteType } from '~/sqlite-core/codecs.ts';\nimport type { AnySQLiteTable, SQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport type ConvertCustomConfig<T extends Partial<CustomTypeValues>> =\n\t& {\n\t\tdataType: 'custom';\n\t\tdata: T['data'];\n\t\tdriverParam: T['driverData'];\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'>> extends SQLiteColumnBuilder<\n\tT,\n\t{\n\t\tfieldConfig: CustomTypeValues['config'];\n\t\tcustomTypeParams: CustomTypeParams<any>;\n\t}\n> {\n\tstatic override readonly [entityKind]: string = 'SQLiteCustomColumnBuilder';\n\n\tconstructor(\n\t\tname: string,\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\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteCustomColumn(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteCustomColumn<T extends ColumnBaseConfig<'custom'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteCustomColumn';\n\n\t/** @internal */\n\toverride readonly codec?: SQLiteType | undefined;\n\n\tprivate sqlName: string;\n\treadonly mapFromJsonValue?: (value: unknown) => T['data'];\n\treadonly jsonSelectIdentifier?: (identifier: SQL, sql: SQLGenerator) => SQL;\n\n\tconstructor(\n\t\ttable: AnySQLiteTable<{ name: T['tableName'] }>,\n\t\tconfig: ColumnBuilderRuntimeConfig<T['data']> & {\n\t\t\tfieldConfig: CustomTypeValues['config'];\n\t\t\tcustomTypeParams: CustomTypeParams<any>;\n\t\t},\n\t) {\n\t\tsuper(table, config);\n\t\tthis.sqlName = config.customTypeParams.dataType(config.fieldConfig);\n\t\tthis.mapToDriverValue = config.customTypeParams.toDriver ?? this.mapToDriverValue;\n\t\tthis.mapFromDriverValue = config.customTypeParams.fromDriver ?? this.mapFromDriverValue;\n\t\tthis.mapFromJsonValue = config.customTypeParams.fromJson;\n\t\tthis.jsonSelectIdentifier = config.customTypeParams.forJsonSelect;\n\t\tconst cfgCodec =\n\t\t\ttypeof config.customTypeParams.codec === 'string' || typeof config.customTypeParams.codec === 'undefined'\n\t\t\t\t? config.customTypeParams.codec\n\t\t\t\t: config.customTypeParams.codec(config.fieldConfig);\n\t\tthis.codec = typeof cfgCodec === 'string'\n\t\t\t? resolveSQLiteTypeAlias(cfgCodec) as SQLiteType // If it isn't `SQLiteType`, codec search will simply resolve to no codec, which is supported behaviour\n\t\t\t: undefined;\n\t}\n\n\tgetSQLType(): string {\n\t\treturn this.sqlName;\n\t}\n}\n\nexport interface 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 * Type helper, that represents what type database driver is returning for specific database data type\n\t *\n\t * Needed only in case driver's output and input for type differ\n\t *\n\t * Defaults to {@link driverData}\n\t */\n\tdriverOutput?: unknown;\n\n\t/**\n\t * Type helper, that represents what type field returns after being aggregated to JSON\n\t */\n\tjsonData?: 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, that is used to transform inputs from desired to be used in code format to one suitable for 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 used for transforming data returned by driver to desired column's output format\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\t * It'll cause the returned data to change from:\n\t * ```\n\t * {\n\t * \tcustomField: \"2025-04-07T03:25:16.635Z\";\n\t * }\n\t * ```\n\t * to:\n\t * ```\n\t * {\n\t * \tcustomField: new Date(\"2025-04-07T03:25:16.635Z\");\n\t * }\n\t * ```\n\t */\n\tfromDriver?: (value: 'driverOutput' extends keyof T ? T['driverOutput'] : T['driverData']) => T['data'];\n\n\t/**\n\t * Bypasses JSON codecs if used\n\t *\n\t * Optional mapping function, that is used for transforming data returned by transofmed to JSON in database data to desired format\n\t *\n\t * Used by [relational queries](https://orm.drizzle.team/docs/rqb-v2)\n\t *\n\t * Defaults to {@link fromDriver} function\n\t * @example\n\t * For example, when querying blob column via [RQB](https://orm.drizzle.team/docs/rqb-v2) or [JSON functions](https://orm.drizzle.team/docs/json-functions), the result field will be returned as it's hex string representation, as opposed to Buffer from regular query\n\t * To handle that, we need a separate function to handle such field's mapping:\n\t * ```\n\t * fromJson(value: string): Buffer {\n\t * \treturn Buffer.from(value, 'hex');\n\t * },\n\t * ```\n\t *\n\t * It'll cause the returned data to change from:\n\t * ```\n\t * {\n\t * \tcustomField: \"04A8...\";\n\t * }\n\t * ```\n\t * to:\n\t * ```\n\t * {\n\t * \tcustomField: Buffer([...]);\n\t * }\n\t * ```\n\t */\n\tfromJson?: (value: T['jsonData']) => T['data'];\n\n\t/**\n\t * Bypasses JSON codecs if used\n\t *\n\t * Optional selection modifier function, that is used for modifying selection of column inside [JSON functions](https://orm.drizzle.team/docs/json-functions)\n\t *\n\t * Additional mapping that could be required for such scenarios can be handled using {@link fromJson} function\n\t *\n\t * Used by [relational queries](https://orm.drizzle.team/docs/rqb-v2)\n\t *\n\t * Following types are being casted to text by default: `numeric`, `numeric:number`, `numeric:bigint`, `blob:json`, `blob:bigint`; `blob` is converted via `hex()`\n\t * @example\n\t * For example, when using numeric field for bigint storage we need to cast field to text to preserve data integrity\n\t * ```\n\t * forJsonSelect(identifier: SQL, sql: SQLGenerator): SQL {\n\t * \treturn sql`cast(${identifier} as text)`\n\t * },\n\t * ```\n\t *\n\t * This will change query from:\n\t * ```\n\t * SELECT\n\t * \tjson_object('bigint', `t`.`bigint`)\n\t * \tFROM\n\t * \t(\n\t * \t\tSELECT\n\t * \t\t`table`.`custom_bigint` AS \"bigint\"\n\t * \t\tFROM\n\t * \t\t`table`\n\t * \t) AS `t`\n\t * ```\n\t * to:\n\t * ```\n\t * SELECT\n\t * \tjson_object('bigint', `t`.`bigint`)\n\t * \tFROM\n\t * \t(\n\t * \t\tSELECT\n\t * \t\tcast(`table`.`custom_bigint` as text) AS `bigint`\n\t * \t\tFROM\n\t * \t\t`table`\n\t * \t) AS `t`\n\t * ```\n\t *\n\t * Returned by query object will change from:\n\t * ```\n\t * {\n\t * \tbigint: 5044565289845416000; // Partial data loss due to direct conversion to JSON format\n\t * }\n\t * ```\n\t * to:\n\t * ```\n\t * {\n\t * \tbigint: \"5044565289845416380\"; // Data is preserved due to conversion of field to text before JSON-ification\n\t * }\n\t * ```\n\t */\n\tforJsonSelect?: (identifier: SQL, sql: SQLGenerator) => SQL;\n\n\t/**\n\t * Select which column type codec will be used for this column\n\t */\n\tcodec?:\n\t\t| SQLiteColumnType\n\t\t| undefined\n\t\t| ((\n\t\t\tconfig: T['config'] | (Equal<T['configRequired'], true> extends true ? never : undefined),\n\t\t) => SQLiteColumnType | undefined);\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(\n\t\t\tdbname: string,\n\t\t\tfieldConfig: T['config'],\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<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(\n\t\t\tdbname: string,\n\t\t\tfieldConfig?: T['config'],\n\t\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<T>>;\n\t}\n{\n\treturn (\n\t\ta?: string | T['config'],\n\t\tb?: T['config'],\n\t): SQLiteCustomColumnBuilder<ConvertCustomConfig<T>> => {\n\t\tconst { name, config } = getColumnNameAndConfig<T['config']>(a, b);\n\t\treturn new SQLiteCustomColumnBuilder(\n\t\t\tname,\n\t\t\tconfig,\n\t\t\tcustomTypeParams,\n\t\t);\n\t};\n}\n", "import type { ColumnBaseConfig } from '~/column.ts';\nimport { entityKind } from '~/entity.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { type Equal, getColumnNameAndConfig } from '~/utils.ts';\nimport { SQLiteColumn, SQLiteColumnBuilder } from './common.ts';\n\nexport class SQLiteNumericBuilder extends SQLiteColumnBuilder<{\n\tdataType: 'string numeric';\n\tdata: string;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'string numeric', 'SQLiteNumeric');\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteNumeric(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteNumeric<T extends ColumnBaseConfig<'string numeric'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumeric';\n\n\t/** @internal */\n\toverride readonly codec = 'numeric';\n\n\tgetSQLType(): string {\n\t\treturn 'numeric';\n\t}\n}\nexport class SQLiteNumericNumberBuilder extends SQLiteColumnBuilder<{\n\tdataType: 'number';\n\tdata: number;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericNumberBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'number', 'SQLiteNumericNumber');\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteNumericNumber(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteNumericNumber<T extends ColumnBaseConfig<'number'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericNumber';\n\n\t/** @internal */\n\toverride readonly codec = 'numeric:number';\n\n\toverride mapToDriverValue = String;\n\n\tgetSQLType(): string {\n\t\treturn 'numeric';\n\t}\n}\n\nexport class SQLiteNumericBigIntBuilder extends SQLiteColumnBuilder<{\n\tdataType: 'bigint int64';\n\tdata: bigint;\n\tdriverParam: string;\n}> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericBigIntBuilder';\n\n\tconstructor(name: string) {\n\t\tsuper(name, 'bigint int64', 'SQLiteNumericBigInt');\n\t}\n\n\t/** @internal */\n\toverride build(table: SQLiteTable) {\n\t\treturn new SQLiteNumericBigInt(\n\t\t\ttable,\n\t\t\tthis.config as any,\n\t\t);\n\t}\n}\n\nexport class SQLiteNumericBigInt<T extends ColumnBaseConfig<'bigint int64'>> extends SQLiteColumn<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteNumericBigInt';\n\n\t/** @internal */\n\toverride readonly codec = 'numeric:bigint';\n\n\toverride mapToDriverValue = String;\n\n\tgetSQLType(): string {\n\t\treturn 'numeric';\n\t}\n}\n\nexport type SQLiteNumericConfig<T extends 'string' | 'number' | 'bigint' = 'string' | 'number' | 'bigint'> = {\n\tmode: T;\n};\n\nexport function numeric<TMode extends SQLiteNumericConfig['mode']>(\n\tconfig?: SQLiteNumericConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? SQLiteNumericNumberBuilder\n\t: Equal<TMode, 'bigint'> extends true ? SQLiteNumericBigIntBuilder\n\t: SQLiteNumericBuilder;\nexport function numeric<TMode extends SQLiteNumericConfig['mode']>(\n\tname: string,\n\tconfig?: SQLiteNumericConfig<TMode>,\n): Equal<TMode, 'number'> extends true ? SQLiteNumericNumberBuilder\n\t: Equal<TMode, 'bigint'> extends true ? SQLiteNumericBigIntBuilder\n\t: SQLiteNumericBuilder;\nexport function numeric(a?: string | SQLiteNumericConfig, b?: SQLiteNumericConfig) {\n\tconst { name, config } = getColumnNameAndConfig<SQLiteNumericConfig>(a, b);\n\tconst mode = config?.mode;\n\treturn mode === 'number'\n\t\t? new SQLiteNumericNumberBuilder(name)\n\t\t: mode === 'bigint'\n\t\t? new SQLiteNumericBigIntBuilder(name)\n\t\t: new SQLiteNumericBuilder(name);\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", "export type Casing = 'snake_case' | 'camelCase';\n\nexport function toSnakeCase(input: string) {\n\tconst words = input\n\t\t.replace(/['\\u2019]/g, '')\n\t\t.match(/[\\d\\p{Ll}\\p{Lo}]+|[\\p{Lu}]+(?![\\p{Ll}\\p{Lo}])|[\\p{Lu}][\\d\\p{Ll}\\p{Lo}]+/gu) ?? [];\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(/[\\d\\p{Ll}\\p{Lo}]+|[\\p{Lu}]+(?![\\p{Ll}\\p{Lo}])|[\\p{Lu}][\\d\\p{Ll}\\p{Lo}]+/gu) ?? [];\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\nexport function getCasingFn(casing: Casing | undefined) {\n\tif (casing === 'snake_case') return toSnakeCase;\n\tif (casing === 'camelCase') return toCamelCase;\n\treturn (name: string) => name;\n}\n", "import { type Casing, getCasingFn } from '~/casing.ts';\nimport type { BuildColumns, BuildExtraConfigColumns, ColumnBuilderBase } from '~/column-builder.ts';\nimport { entityKind } from '~/entity.ts';\nimport {\n\ttype InferTableColumnsModels,\n\tTable,\n\ttype TableConfig as TableConfigBase,\n\ttype UpdateTableConfig,\n} from '~/table.ts';\nimport type { CheckBuilder } from './checks.ts';\nimport { getSQLiteColumnBuilders, type SQLiteColumnBuilders } from './columns/all.ts';\nimport type { SQLiteColumn, SQLiteColumnBuilder, SQLiteColumns } 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<SQLiteColumns>;\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& T['columns']\n\t& InferTableColumnsModels<T['columns']>;\n\nexport interface SQLiteTableFn<TSchema extends string | undefined = undefined> {\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, ColumnBuilderBase>,\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 | 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\tisAlias: false;\n\t}>;\n\n\t<\n\t\tTTableName extends string,\n\t\tTColumnsMap extends Record<string, ColumnBuilderBase>,\n\t>(\n\t\tname: TTableName,\n\t\tcolumns: (columnTypes: SQLiteColumnBuilders) => TColumnsMap,\n\t\textraConfig?: (\n\t\t\tself: BuildColumns<TTableName, TColumnsMap, 'sqlite'>,\n\t\t) => (SQLiteTableExtraConfigValue | 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\tisAlias: false;\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, ColumnBuilderBase>,\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\tisAlias: false;\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, ColumnBuilderBase>,\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\tisAlias: false;\n\t}>;\n}\n\n/** @internal */\nexport function sqliteTableBase<\n\tTTableName extends string,\n\tTColumnsMap extends Record<string, ColumnBuilderBase>,\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 | SQLiteTableExtraConfigValue[])[])\n\t\t| undefined,\n\tschema: TSchema | undefined,\n\tcasing: Casing | undefined,\n\tbaseName = name,\n): SQLiteTableWithColumns<{\n\tname: TTableName;\n\tschema: TSchema;\n\tcolumns: BuildColumns<TTableName, TColumnsMap, 'sqlite'>;\n\tdialect: 'sqlite';\n\tisAlias: false;\n}> {\n\tconst casingFn = getCasingFn(casing);\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\tisAlias: false;\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, casingFn);\n\t\t\tconst column = colBuilder.build(rawTable).postBuild();\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 as any;\n}\n\n/** @internal */\nexport function sqliteTableWithCasing(casing: Casing | undefined): SQLiteTableFn {\n\treturn (name, columns, extraConfig) => sqliteTableBase(name, columns, extraConfig, undefined, casing);\n}\n\nexport const sqliteTable = sqliteTableWithCasing(undefined);\n\nexport function sqliteTableCreator(\n\tcustomizeTableName: (name: string) => string,\n\tcasing?: Casing | undefined,\n): SQLiteTableFn {\n\treturn (name, columns, extraConfig) => {\n\t\treturn sqliteTableBase(customizeTableName(name) as typeof name, columns, extraConfig, undefined, casing, name);\n\t};\n}\n", "import type { View } from '~/view.ts';\nimport type * as V1 from './_relations.ts';\nimport { OriginalColumn } from './column-common.ts';\nimport type { AnyColumn } from './column.ts';\nimport { Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { chunkKindOf, chunkKinds, isChunk, isSQLWrapper, type Name, SQL, sql } from './sql/sql.ts';\nimport type { Subquery } from './subquery.ts';\nimport { Qualifier, Table } from './table.ts';\nimport { ViewBaseConfig } from './view-common.ts';\n\nexport class ColumnTableAliasProxyHandler<TColumn extends Column> implements ProxyHandler<TColumn> {\n\tstatic readonly [entityKind]: string = 'ColumnTableAliasProxyHandler';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tconstructor(private table: Table | View, private ignoreColumnAlias?: boolean) {}\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\tif (prop === 'isAlias' && this.ignoreColumnAlias) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (prop === OriginalColumn && !this.ignoreColumnAlias) {\n\t\t\treturn () => columnObj;\n\t\t}\n\n\t\treturn columnObj[prop as keyof TColumn];\n\t}\n}\n\nexport class ViewSelectionAliasProxyHandler<TSelection extends Record<string, unknown>>\n\timplements ProxyHandler<TSelection>\n{\n\tstatic readonly [entityKind]: string = 'ViewSelectionAliasProxyHandler';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tconstructor(protected view: View, protected selection: TSelection, private ignoreColumnAlias?: boolean) {}\n\n\tprivate memo: WeakMap<object, any> | undefined;\n\tprivate columnHandler: ColumnTableAliasProxyHandler<Column> | undefined;\n\n\tget(selection: TSelection, prop: string | symbol): any {\n\t\tconst value = selection[prop as keyof TSelection];\n\t\tif (typeof value !== 'object' || value === null) return value;\n\n\t\tconst memo = this.memo ??= new WeakMap();\n\t\tlet result = memo.get(value);\n\t\tif (result !== undefined) return result;\n\n\t\tif (isChunk(value, chunkKindOf(value), chunkKinds.column)) {\n\t\t\tresult = new Proxy(\n\t\t\t\tvalue,\n\t\t\t\tthis.columnHandler ??= new ColumnTableAliasProxyHandler(this.view, this.ignoreColumnAlias),\n\t\t\t);\n\t\t} else if (isSQLWrapper(value)) {\n\t\t\tresult = value;\n\t\t} else {\n\t\t\tresult = new Proxy(value as Record<string, unknown>, this);\n\t\t}\n\n\t\tmemo.set(value, result);\n\t\treturn result;\n\t}\n}\n\nexport class TableAliasProxyHandler<T extends Table | View> implements ProxyHandler<T> {\n\tstatic readonly [entityKind]: string = 'TableAliasProxyHandler';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tconstructor(private alias: string, private replaceOriginalName: boolean, private ignoreColumnAlias?: boolean) {}\n\n\t/** Alias as identifier, replaces `[Qualifier]` of tables */\n\tprivate qualifier: Name | undefined;\n\t/** Aliased columns by name, fast path for table columns */\n\tprivate proxiedColumns: Record<string, any> | undefined;\n\t/** For other props, columns & qualifier are hot paths and defined in their own variables due to performance benefits */\n\tprivate memo: WeakMap<object, any> | undefined;\n\tprivate columnHandler: ColumnTableAliasProxyHandler<Column> | undefined;\n\n\tget(target: T, prop: string | symbol, receiver: any): any {\n\t\tif (prop === Qualifier) {\n\t\t\treturn this.qualifier ??= sql.identifier(this.alias);\n\t\t}\n\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 === Table.Symbol.Columns) {\n\t\t\tconst columns = (target as Table)[Table.Symbol.Columns];\n\t\t\tif (!columns) return columns;\n\n\t\t\treturn isChunk(target, chunkKindOf(target), chunkKinds.view)\n\t\t\t\t? this.aliasSelection(columns, receiver)\n\t\t\t\t: this.getProxiedColumns(columns, receiver);\n\t\t}\n\n\t\tif (prop === ViewBaseConfig) {\n\t\t\tconst config = (<View> target)[ViewBaseConfig];\n\t\t\tconst memo = this.memo ??= new WeakMap();\n\t\t\tlet result = memo.get(config);\n\t\t\tif (result === undefined) {\n\t\t\t\tmemo.set(\n\t\t\t\t\tconfig,\n\t\t\t\t\tresult = {\n\t\t\t\t\t\t...config,\n\t\t\t\t\t\tname: this.alias,\n\t\t\t\t\t\tisAlias: true,\n\t\t\t\t\t\tselectedFields: this.aliasSelection(config.selectedFields, receiver),\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\n\t\tconst value = target[prop as keyof typeof target];\n\t\tif (isChunk(value, chunkKindOf(value), chunkKinds.column)) {\n\t\t\tconst columns = (target as Table)[Table.Symbol.Columns];\n\t\t\tif (typeof prop === 'string' && columns?.[prop] === value) {\n\t\t\t\treturn this.getProxiedColumns(columns, receiver)[prop];\n\t\t\t}\n\n\t\t\tconst memo = this.memo ??= new WeakMap();\n\t\t\tlet result = memo.get(value);\n\t\t\tif (result === undefined) memo.set(value, result = this.aliasColumn(value, receiver));\n\n\t\t\treturn result;\n\t\t}\n\n\t\treturn value;\n\t}\n\n\tprivate aliasColumn(column: AnyColumn, receiver: any): AnyColumn {\n\t\treturn new Proxy(\n\t\t\tcolumn,\n\t\t\tthis.columnHandler ??= new ColumnTableAliasProxyHandler(receiver, this.ignoreColumnAlias),\n\t\t);\n\t}\n\n\tprivate aliasSelection(selection: Record<string, unknown>, receiver: any): Record<string, unknown> {\n\t\tconst memo = this.memo ??= new WeakMap();\n\t\tlet result = memo.get(selection);\n\t\tif (result === undefined) {\n\t\t\tmemo.set(\n\t\t\t\tselection,\n\t\t\t\tresult = new Proxy(selection, new ViewSelectionAliasProxyHandler(receiver, selection, this.ignoreColumnAlias)),\n\t\t\t);\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tprivate getProxiedColumns(columns: Record<string, AnyColumn>, receiver: any): Record<string, any> {\n\t\tif (this.proxiedColumns) return this.proxiedColumns;\n\n\t\tconst proxiedColumns: Record<string, any> = {};\n\t\tfor (const key of Object.keys(columns)) {\n\t\t\tproxiedColumns[key] = this.aliasColumn(columns[key]!, receiver);\n\t\t}\n\n\t\treturn this.proxiedColumns = proxiedColumns;\n\t}\n}\n\nexport class SubquerySelectionAliasProxyHandler<TSelection extends Record<string, unknown>>\n\timplements ProxyHandler<TSelection>\n{\n\tstatic readonly [entityKind]: string = 'SubquerySelectionAliasProxyHandler';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tconstructor(private subquery: Subquery, private alias: string) {}\n\n\tprivate memo: WeakMap<object, any> | undefined;\n\tprivate columnHandler: ColumnTableAliasProxyHandler<Column> | undefined;\n\n\tget(selection: TSelection, prop: string | symbol): any {\n\t\tconst value = selection[prop as keyof TSelection];\n\t\tif (typeof value !== 'object' || value === null) return value;\n\n\t\tconst memo = this.memo ??= new WeakMap();\n\t\tlet result = memo.get(value);\n\t\tif (result !== undefined) return result;\n\n\t\tconst kind = chunkKindOf(value);\n\t\tif (isChunk(value, kind, chunkKinds.column)) {\n\t\t\tresult = new Proxy(value, this.columnHandler ??= new ColumnTableAliasProxyHandler(this.subquery as any, true));\n\t\t} else if (isChunk(value, kind, chunkKinds.aliased)) {\n\t\t\tresult = value.clone();\n\t\t\tresult.isSelectionField = true;\n\t\t\tresult.origin = this.alias;\n\t\t} else {\n\t\t\tresult = value;\n\t\t}\n\n\t\tmemo.set(value, result);\n\t\treturn result;\n\t}\n}\n\nexport class SubqueryAliasProxyHandler<T extends Subquery> implements ProxyHandler<T> {\n\tstatic readonly [entityKind]: string = 'SubqueryAliasProxyHandler';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tconstructor(private alias: string) {}\n\n\t/** Alias as identifier, replaces `[Qualifier]` of subqueries */\n\tprivate qualifier: Name | undefined;\n\tprivate config: T['_'] | undefined;\n\tprivate selection: Record<string, unknown> | undefined;\n\n\tget(target: T, prop: string | symbol, receiver: any): any {\n\t\tif (prop === Qualifier) {\n\t\t\treturn this.qualifier ??= sql.identifier(this.alias);\n\t\t}\n\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 (prop === Table.Symbol.OriginalName) {\n\t\t\treturn target._.alias;\n\t\t}\n\n\t\tif (prop === Table.Symbol.Schema) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (prop === '_') {\n\t\t\treturn this.config ??= {\n\t\t\t\t...target._,\n\t\t\t\talias: this.alias,\n\t\t\t\tisWith: true,\n\t\t\t\tselectedFields: this.aliasSelection(target, receiver),\n\t\t\t};\n\t\t}\n\n\t\tif (prop === Table.Symbol.Columns) {\n\t\t\treturn this.aliasSelection(target, receiver);\n\t\t}\n\n\t\treturn target[prop as keyof T];\n\t}\n\n\tprivate aliasSelection(target: T, receiver: any): Record<string, unknown> {\n\t\treturn this.selection ??= new Proxy(\n\t\t\ttarget._.selectedFields,\n\t\t\tnew SubquerySelectionAliasProxyHandler(receiver, this.alias),\n\t\t);\n\t}\n}\n\nexport class ColumnAliasProxyHandler<T extends Column> implements ProxyHandler<T> {\n\tstatic readonly [entityKind]: string = 'ColumnAliasProxyHandler';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tconstructor(private alias: string) {}\n\n\tget(target: T, prop: keyof Column): any {\n\t\tif (prop === 'isAlias') {\n\t\t\treturn true;\n\t\t}\n\n\t\tif (prop === 'name') {\n\t\t\treturn this.alias;\n\t\t}\n\n\t\tif (prop === 'keyAsName') {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (prop === OriginalColumn) {\n\t\t\treturn () => target;\n\t\t}\n\n\t\treturn target[prop];\n\t}\n}\n\nexport class RelationTableAliasProxyHandler<T extends V1.Relation> implements ProxyHandler<T> {\n\tstatic readonly [entityKind]: string = 'RelationTableAliasProxyHandler';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\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\n/**\n * Does not apply type-level transformation\n *\n * For typed alias, use `import { alias } from 'drizzle-orm/dialect-core/alias'`\n */\nexport function aliasedTable<T extends Table | View | Subquery>(table: T, tableAlias: string): T {\n\treturn isChunk(table, chunkKindOf(table), chunkKinds.subquery)\n\t\t? new Proxy(table, new SubqueryAliasProxyHandler(tableAlias)) as T\n\t\t: new Proxy(table, new TableAliasProxyHandler(tableAlias, false, false) as ProxyHandler<T>);\n}\n\nexport function aliasedTableSQL(table: Table): SQL {\n\tconst schema = table[Table.Symbol.Schema];\n\tconst name = sql.identifier(table[Table.Symbol.OriginalName]);\n\treturn schema ? sql`${sql.identifier(schema)}.${name} ${table}` : sql`${name} ${table}`;\n}\n\nexport function aliasedColumn<T extends Column>(column: T, alias: string): T {\n\treturn new Proxy(column, new ColumnAliasProxyHandler(alias));\n}\n\nexport function aliasedRelation<T extends V1.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 ColumnTableAliasProxyHandler(\n\t\t\tnew Proxy(column.table, new TableAliasProxyHandler(tableAlias, false, false)),\n\t\t\tfalse,\n\t\t),\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\tconst kind = chunkKindOf(c);\n\t\tif (isChunk(c, kind, chunkKinds.column)) {\n\t\t\treturn aliasedTableColumn(c, alias);\n\t\t}\n\t\tif (isChunk(c, kind, chunkKinds.sql)) {\n\t\t\treturn mapColumnsInSQLToAlias(c, alias);\n\t\t}\n\t\tif (isChunk(c, kind, chunkKinds.aliased)) {\n\t\t\treturn mapColumnsInAliasedSQLToAlias(c, alias);\n\t\t}\n\t\treturn c;\n\t}));\n}\n\n// Defined separately from the Column class to resolve circular dependency\nColumn.prototype.as = function(alias: string): Column {\n\treturn aliasedColumn(this, alias);\n};\n\nexport function getOriginalColumnFromAlias<T extends Column>(column: T): T {\n\treturn column[OriginalColumn]();\n}\n", "import { entityKind, is } 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\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\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\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\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\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tlogQuery(): void {\n\t\t// noop\n\t}\n}\n", "import { entityKind, is } from '~/entity.ts';\n\nexport abstract class QueryPromise<T> implements Promise<T> {\n\tstatic readonly [entityKind]: string = 'QueryPromise';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\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 { CacheKey, IsAlias, OriginalName, Qualifier, Table, TableColumns, TableSchema } from '~/table.ts';\nimport { View, type ViewConfig } from '~/view.ts';\nimport { aliasedTable } from './alias.ts';\nimport type { QueryMetadata, WithCacheConfig } from './cache/core/types.ts';\nimport type { CodecsCollection, NormalizeArrayCodec, NormalizeCodec } from './codecs.ts';\nimport type { AnyColumn, Column } from './column.ts';\nimport { entityKind, is } from './entity.ts';\nimport { DrizzleError } from './errors.ts';\nimport type { SelectResultFields } from './query-builders/select.types.ts';\nimport { commonStringChunks, type StringChunk } from './sql/common-chunks.ts';\nimport {\n\tand,\n\tarrayContained,\n\tarrayContains,\n\tarrayOverlaps,\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 {\n\ttype CommentInput,\n\ttype DriverValueDecoder,\n\tisSQLWrapper,\n\ttype Name,\n\tnoopDecoder,\n\tPlaceholder,\n\tSQL,\n\tsql,\n\ttype SQLChunk,\n\ttype SQLGenerator,\n\ttype SQLWrapper,\n} from './sql/sql.ts';\nimport { chunkKindOf, chunkKinds, collectChunksUsedTables, isChunk } from './sql/sql.ts';\nimport { Subquery } from './subquery.ts';\nimport {\n\ttype Assume,\n\ttype DrizzleTypeError,\n\ttype Equal,\n\tFnConstructor,\n\tgetColumnFromDecoder,\n\ttype Simplify,\n\ttype ValueOrArray,\n} from './utils.ts';\n\nexport type FilteredSchemaEntry =\n\t| Table<any>\n\t| View<ViewConfig<FieldSelection>>\n\t| Subquery<string, FieldSelection>;\n\nexport type SchemaEntry = Table<any> | View<ViewConfig<any>> | Subquery<string, any>;\n\nexport type Schema = Record<string, SchemaEntry>;\n\nexport type GetTableViewColumns<T extends SchemaEntry> = T extends View<ViewConfig<any>> | Subquery<string, any>\n\t? T['_']['selectedFields']\n\t: T extends Table<any> ? T['_']['columns']\n\t: never;\n\nexport type GetTableViewFieldSelection<T extends SchemaEntry> = T extends\n\tView<ViewConfig<FieldSelection>> | Subquery<string, FieldSelection> ? T['_']['selectedFields']\n\t: T extends Table<any> ? T['_']['columns']\n\t: never;\n\nexport type FieldValue =\n\t| Column<any>\n\t| SQLWrapper\n\t| SQL.Aliased\n\t| SQL;\n\nexport type FieldSelection = Record<string, FieldValue>;\n\nexport function processRelations(tablesConfig: TablesRelationalConfig, tables: Schema) {\n\tfor (const tableConfig of Object.values(tablesConfig)) {\n\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\tif (!is(relation, Relation)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\trelation.sourceTable = tableConfig.table;\n\t\t\trelation.fieldName = relationFieldName;\n\t\t}\n\t}\n\n\tfor (const [sourceTableName, tableConfig] of Object.entries(tablesConfig)) {\n\t\tfor (const [relationFieldName, relation] of Object.entries(tableConfig.relations)) {\n\t\t\tif (!is(relation, Relation)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tlet reverseRelation: Relation | undefined;\n\t\t\tconst {\n\t\t\t\ttargetTableName,\n\t\t\t\talias,\n\t\t\t\tsourceColumns,\n\t\t\t\ttargetColumns,\n\t\t\t\tthroughTable,\n\t\t\t\tsourceTable,\n\t\t\t\tthrough,\n\t\t\t\twhere,\n\t\t\t} = relation;\n\t\t\tconst relationPrintName = `relations -> ${tableConfig.name}: { ${relationFieldName}: r.${\n\t\t\t\tis(relation, One) ? 'one' : 'many'\n\t\t\t}.${targetTableName}(...) }`;\n\n\t\t\tif (Object.prototype.hasOwnProperty.call(tableConfig.table[TableColumns], relationFieldName)) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${relationPrintName}: relation name collides with column \"${relationFieldName}\" of table \"${tableConfig.name}\"`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tif (typeof alias === 'string' && !alias) {\n\t\t\t\tthrow new Error(`${relationPrintName}: \"alias\" cannot be an empty string - omit it if you don't need it`);\n\t\t\t}\n\n\t\t\tif (sourceColumns?.length === 0) {\n\t\t\t\tthrow new Error(`${relationPrintName}: \"from\" cannot be empty`);\n\t\t\t}\n\n\t\t\tif (targetColumns?.length === 0) {\n\t\t\t\tthrow new Error(`${relationPrintName}: \"to\" cannot be empty`);\n\t\t\t}\n\n\t\t\tif (sourceColumns && targetColumns) {\n\t\t\t\tif (sourceColumns.length !== targetColumns.length && !throughTable) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: \"from\" and \"to\" fields without \"through\" must have the same length`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tfor (const { _: { tableName } } of sourceColumns) {\n\t\t\t\t\tif (tableName !== sourceTableName) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: all \"from\" columns must belong to table \"${sourceTableName}\", found column of table \"${tableName}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (const { _: { tableName } } of targetColumns) {\n\t\t\t\t\tif (tableName !== targetTableName) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: all \"to\" columns must belong to table \"${targetTableName}\", found column of table \"${tableName}\"`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (through) {\n\t\t\t\t\tif (\n\t\t\t\t\t\tthrough.source.length !== sourceColumns.length\n\t\t\t\t\t\t|| through.target.length !== targetColumns.length\n\t\t\t\t\t) {\n\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t`${relationPrintName}: \".through(column)\" must be used either on all columns in \"from\" and \"to\" or not defined on any of them`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const column of through.source) {\n\t\t\t\t\t\tif (tables[column._.tableName] !== throughTable) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`${relationPrintName}: \".through(column)\" must be used on the same table by all columns of the relation`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const column of through.target) {\n\t\t\t\t\t\tif (tables[column._.tableName] !== throughTable) {\n\t\t\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\t\t`${relationPrintName}: \".through(column)\" must be used on the same table by all columns of the relation`,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (sourceColumns || targetColumns) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${relationPrintName}: relation must have either both \"from\" and \"to\" defined, or none of them`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tconst reverseTableConfig = tablesConfig[targetTableName];\n\t\t\tif (!reverseTableConfig) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relations of table \"${targetTableName}\" were found\"`,\n\t\t\t\t);\n\t\t\t}\n\t\t\tif (alias) {\n\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\tis(it, Relation) && it.alias === alias && it !== relation\n\t\t\t\t);\n\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations with alias \"${alias}\" found in table \"${targetTableName}\": ${\n\t\t\t\t\t\t\treverseRelations.map((it) => `\"${it.fieldName}\"`).join(', ')\n\t\t\t\t\t\t}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and there is no reverse relation of table \"${targetTableName}\" with alias \"${alias}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst reverseRelations = Object.values(reverseTableConfig.relations).filter((it): it is Relation =>\n\t\t\t\t\tis(it, Relation) && it.targetTable === sourceTable && !it.alias && it !== relation\n\t\t\t\t);\n\t\t\t\tif (reverseRelations.length > 1) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and multiple relations between \"${targetTableName}\" and \"${sourceTableName}\" were found.\\nHint: you can specify \"alias\" on both sides of the relation with the same value`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\treverseRelation = reverseRelations[0];\n\t\t\t\tif (!reverseRelation) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and no reverse relation of table \"${targetTableName}\" with target table \"${sourceTableName}\" was found`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!reverseRelation.sourceColumns || !reverseRelation.targetColumns) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`${relationPrintName}: not enough data provided to build the relation - \"from\"/\"to\" are not defined, and reverse relation \"${targetTableName}.${reverseRelation.fieldName}\" does not have \"from\"/\"to\" defined`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\trelation.sourceColumns = reverseRelation.targetColumns;\n\t\t\trelation.targetColumns = reverseRelation.sourceColumns;\n\t\t\trelation.through = reverseRelation.through\n\t\t\t\t? {\n\t\t\t\t\tsource: reverseRelation.through.target,\n\t\t\t\t\ttarget: reverseRelation.through.source,\n\t\t\t\t}\n\t\t\t\t: undefined;\n\t\t\trelation.throughTable = reverseRelation.throughTable;\n\t\t\trelation.isFilterReversed = where === EmptyFilter;\n\t\t\trelation.where = where === EmptyFilter ? reverseRelation.where : where;\n\t\t}\n\t}\n\n\treturn tablesConfig;\n}\n\n/** Builds relational config for every table in schema */\nexport function buildRelations<TTables extends Schema, TConfig extends AnyRelationsBuilderConfig>(\n\ttables: TTables,\n\tconfig: TConfig,\n): ExtractTablesWithRelations<TConfig, TTables> {\n\tconst tablesConfig = {} as TablesRelationalConfig;\n\n\tfor (const [tsName, table] of Object.entries(tables)) {\n\t\ttablesConfig[tsName] = {\n\t\t\ttable,\n\t\t\tname: tsName,\n\t\t\trelations: config[tsName] ?? {},\n\t\t};\n\t}\n\n\treturn processRelations(tablesConfig, tables) as any;\n}\n\n/** Builds relational config only for tables present in relational config */\nexport function buildRelationsParts<TTables extends Schema, TConfig extends AnyRelationsBuilderConfig>(\n\ttables: TTables,\n\tconfig: TConfig,\n): ExtractTablesWithRelationsParts<TConfig, TTables> {\n\tconst tablesConfig = {} as TablesRelationalConfig;\n\n\tfor (const [tsName, relations] of Object.entries(config)) {\n\t\tif (!relations || !tables[tsName]) continue;\n\t\ttablesConfig[tsName] = {\n\t\t\ttable: tables[tsName],\n\t\t\tname: tsName,\n\t\t\trelations,\n\t\t};\n\t}\n\n\treturn processRelations(tablesConfig, tables) as any;\n}\n\nexport type RelationsRecord = Record<string, AnyRelation>;\nexport type EmptyRelations = {};\nexport type AnyRelations = TablesRelationalConfig;\n\nexport abstract class Relation<\n\tTTargetTableName extends string = string,\n> {\n\tstatic readonly [entityKind]: string = 'RelationV2';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tdeclare readonly $brand: 'RelationV2';\n\tdeclare public readonly relationType: 'many' | 'one';\n\n\tfieldName!: string;\n\tsourceColumns!: RelationsBuilderColumnBase[];\n\ttargetColumns!: RelationsBuilderColumnBase[];\n\talias: string | undefined;\n\twhere!: AnyTableFilter | EmptyFilter;\n\tsourceTable!: SchemaEntry;\n\ttargetTable: SchemaEntry;\n\tthrough?: {\n\t\tsource: RelationsBuilderColumnBase[];\n\t\ttarget: RelationsBuilderColumnBase[];\n\t};\n\tthroughTable?: SchemaEntry;\n\tisFilterReversed?: boolean;\n\n\tconstructor(\n\t\ttargetTable: SchemaEntry,\n\t\treadonly targetTableName: TTargetTableName,\n\t) {\n\t\tthis.targetTable = targetTable;\n\t}\n}\n\nexport type AnyRelation = Relation<string>;\n\nexport class One<\n\tTTargetTableName extends string,\n\tTOptional extends boolean = boolean,\n> extends Relation<TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'OneV2';\n\tdeclare protected $relationBrand: 'OneV2';\n\n\tpublic override readonly relationType = 'one' as const;\n\n\treadonly optional: TOptional;\n\n\tconstructor(\n\t\ttables: Schema,\n\t\ttargetTable: SchemaEntry,\n\t\ttargetTableName: TTargetTableName,\n\t\tconfig: AnyOneConfig | undefined,\n\t) {\n\t\tsuper(targetTable, targetTableName);\n\t\tthis.alias = config?.alias;\n\t\tif (config && 'where' in config) {\n\t\t\tif (config.where === undefined) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Unexpected 'undefined' in filter value. Use 'EmptyFilter' if you want the filter field to be skipped.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.where = config.where;\n\t\t} else {\n\t\t\tthis.where = EmptyFilter;\n\t\t}\n\n\t\tconst from = config?.from\n\t\t\t? (Array.isArray(config.from) ? config.from : [config.from]) as RelationsBuilderColumnBase[]\n\t\t\t: undefined;\n\t\tconst to = config?.to\n\t\t\t? (Array.isArray(config.to) ? config.to : [config.to]) as RelationsBuilderColumnBase[]\n\t\t\t: undefined;\n\n\t\tif (from) {\n\t\t\tfor (const { _: { through } } of from) {\n\t\t\t\tif (through) this.throughTable ??= tables[through._.tableName]! as SchemaEntry;\n\t\t\t}\n\n\t\t\tthis.sourceColumns = from;\n\t\t}\n\t\tif (to) {\n\t\t\tfor (const { _: { through } } of to) {\n\t\t\t\tif (through) this.throughTable ??= tables[through._.tableName]! as SchemaEntry;\n\t\t\t}\n\n\t\t\tthis.targetColumns = to;\n\t\t}\n\n\t\tif (this.throughTable) {\n\t\t\tthis.through = {\n\t\t\t\tsource: from?.flatMap((c) => c._.through ?? []) ?? [],\n\t\t\t\ttarget: to?.flatMap((c) => c._.through ?? []) ?? [],\n\t\t\t};\n\t\t}\n\t\tthis.optional = (config?.optional ?? true) as TOptional;\n\t}\n}\n\nexport type AnyOne = One<string, boolean>;\n\nexport class Many<TTargetTableName extends string> extends Relation<TTargetTableName> {\n\tstatic override readonly [entityKind]: string = 'ManyV2';\n\tdeclare protected $relationBrand: 'ManyV2';\n\n\tpublic override readonly relationType = 'many' as const;\n\n\tconstructor(\n\t\ttables: Schema,\n\t\ttargetTable: SchemaEntry,\n\t\ttargetTableName: TTargetTableName,\n\t\treadonly config: AnyManyConfig | undefined,\n\t) {\n\t\tsuper(targetTable, targetTableName);\n\t\tthis.alias = config?.alias;\n\t\tif (config && 'where' in config) {\n\t\t\tif (config.where === undefined) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t`Unexpected 'undefined' in filter value. Use 'EmptyFilter' if you want the filter field to be skipped.`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tthis.where = config.where;\n\t\t} else {\n\t\t\tthis.where = EmptyFilter;\n\t\t}\n\n\t\tconst from = config?.from\n\t\t\t? (Array.isArray(config.from) ? config.from : [config.from]) as RelationsBuilderColumnBase[]\n\t\t\t: undefined;\n\t\tconst to = config?.to\n\t\t\t? (Array.isArray(config.to) ? config.to : [config.to]) as RelationsBuilderColumnBase[]\n\t\t\t: undefined;\n\n\t\tif (from) {\n\t\t\tfor (const { _: { through } } of from) {\n\t\t\t\tif (through) this.throughTable ??= tables[through._.tableName]! as SchemaEntry;\n\t\t\t}\n\n\t\t\tthis.sourceColumns = from;\n\t\t}\n\t\tif (to) {\n\t\t\tfor (const { _: { through } } of to) {\n\t\t\t\tif (through) this.throughTable ??= tables[through._.tableName]! as SchemaEntry;\n\t\t\t}\n\n\t\t\tthis.targetColumns = to;\n\t\t}\n\t\tif (this.throughTable) {\n\t\t\tthis.through = {\n\t\t\t\tsource: from?.flatMap((c) => c._.through ?? []) ?? [],\n\t\t\t\ttarget: to?.flatMap((c) => c._.through ?? []) ?? [],\n\t\t\t};\n\t\t}\n\t}\n}\n\nexport type AnyMany = Many<string>;\n\nexport abstract class AggregatedField<T = unknown> implements SQLWrapper<T> {\n\tstatic readonly [entityKind]: string = 'AggregatedField';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tdeclare readonly $brand: 'AggregatedField';\n\n\tdeclare readonly _: {\n\t\treadonly data: T;\n\t};\n\n\tprotected table: SchemaEntry | undefined;\n\n\tonTable(table: SchemaEntry) {\n\t\tthis.table = table;\n\n\t\treturn this;\n\t}\n\n\tabstract getSQL(): SQL<T>;\n}\n\nexport class Count extends AggregatedField<number> {\n\tstatic override readonly [entityKind]: string = 'AggregatedFieldCount';\n\n\tdeclare protected $aggregatedFieldBrand: 'Count';\n\n\tprivate query: SQL<number> | undefined;\n\n\tgetSQL(): SQL<number> {\n\t\tif (!this.query) {\n\t\t\tif (!this.table) throw new Error('Table must be set before building aggregate field');\n\t\t\tthis.query = new SQL(\n\t\t\t\tgetTableAsAliasSQL(this.table, [\n\t\t\t\t\tcommonStringChunks['select count(*) as '],\n\t\t\t\t\tsql.identifier('r'),\n\t\t\t\t\tcommonStringChunks[' from '],\n\t\t\t\t]),\n\t\t\t).mapWith(Number);\n\t\t}\n\n\t\treturn this.query;\n\t}\n}\n\nexport type ExtractObjectValues<T> = T[keyof T];\n\nexport const operators = {\n\tand,\n\tbetween,\n\teq,\n\texists,\n\tgt,\n\tgte,\n\tilike,\n\tinArray,\n\tarrayContains,\n\tarrayContained,\n\tarrayOverlaps,\n\tisNull,\n\tisNotNull,\n\tlike,\n\tlt,\n\tlte,\n\tne,\n\tnot,\n\tnotBetween,\n\tnotExists,\n\tnotLike,\n\tnotIlike,\n\tnotInArray,\n\tor,\n\tsql,\n};\n\nexport type Operators = typeof operators;\n\nexport const orderByOperators = {\n\tsql,\n\tasc,\n\tdesc,\n};\n\nexport type OrderByOperators = typeof orderByOperators;\n\nexport function getOrderByOperators(): OrderByOperators {\n\treturn orderByOperators;\n}\n\nexport type FindTargetTableInRelationalConfig<\n\tTConfig extends TablesRelationalConfig,\n\tTRelation extends AnyRelation,\n> = TConfig[TRelation['targetTableName']];\n\nexport interface SQLOperator {\n\tsql: Operators['sql'];\n}\n\nexport type DBQueryConfigColumns<TColumns extends FieldSelection> = {\n\t[K in keyof TColumns]?: boolean | undefined;\n};\n\nexport type DBQueryConfigExtras<TTable extends SchemaEntry> = Record<\n\tstring,\n\t| SQLWrapper\n\t| ((\n\t\ttable: TTable,\n\t\toperators: SQLOperator,\n\t) => SQLWrapper | undefined)\n>;\n\nexport type DBQueryConfigOrderByCallback<TTable extends SchemaEntry> = (\n\ttable: TTable,\n\toperators: OrderByOperators,\n) => ValueOrArray<AnyColumn | SQL> | undefined;\n\nexport type DBQueryConfigOrderByObject<TColumns extends FieldSelection> = {\n\t[K in keyof TColumns]?: 'asc' | 'desc' | undefined;\n};\n\nexport type DBQueryConfigOrderBy<TTable extends SchemaEntry, TColumns extends FieldSelection> =\n\t| DBQueryConfigOrderByCallback<TTable>\n\t| DBQueryConfigOrderByObject<TColumns>;\n\nexport type RelationsOrderDirection = 'asc' | 'desc';\n\n/**`first` takes the field of whichever related row the database returns first, the rest aggregate over all of them */\nexport type RelationsOrderAggregate = 'min' | 'max' | 'count' | 'avg' | 'first';\n\n/** Order of rows by an aggregate over fields of rows of a `many` relation */\nexport type RelationsAggregatedOrderDirection = `${RelationsOrderDirection}(${RelationsOrderAggregate})`;\n\n/** Order of rows by the number of rows of a `many` relation */\nexport type RelationsCountOrderDirection = `${RelationsOrderDirection}(count)`;\n\nexport type RelationsOrderColumns<\n\tTColumns extends Record<string, unknown>,\n\tTAggregated extends boolean = false,\n> = {\n\t[K in keyof TColumns]?:\n\t\t| (TAggregated extends true ? RelationsAggregatedOrderDirection : RelationsOrderDirection)\n\t\t| undefined;\n};\n\nexport type RelationsOrderRelations<\n\tTTable extends TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig,\n\tTAggregated extends boolean = false,\n\tTRelations extends RelationsRecord = TTable['relations'],\n> = {\n\t[K in keyof TRelations]?:\n\t\t| RelationsOrderBy<\n\t\t\tFindTargetTableInRelationalConfig<TSchema, TRelations[K]>,\n\t\t\tTSchema,\n\t\t\t// Everything under a `many` relation resolves to multiple rows\n\t\t\tTAggregated extends true ? true : TRelations[K]['relationType'] extends 'one' ? false : true\n\t\t>\n\t\t| (TRelations[K]['relationType'] extends 'many' ? RelationsCountOrderDirection : never)\n\t\t| undefined;\n};\n\nexport type RelationsOrderBy<\n\tTTable extends TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig,\n\tTAggregated extends boolean = false,\n\tTColumns extends FieldSelection = GetTableViewFieldSelection<TTable['table']>,\n> = TTable['relations'] extends Record<string, never> ? RelationsOrderColumns<TColumns, TAggregated>\n\t:\n\t\t& RelationsOrderColumns<TColumns, TAggregated>\n\t\t& RelationsOrderRelations<TTable, TSchema, TAggregated>;\n\nexport type AnyRelationsOrder = {\n\t[K: string]:\n\t\t| RelationsOrderDirection\n\t\t| RelationsAggregatedOrderDirection\n\t\t| RelationsCountOrderDirection\n\t\t| AnyRelationsOrder\n\t\t| undefined;\n};\n\nexport type DBQueryConfigRelationsOrderBy<\n\tTTable extends TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig,\n> =\n\t| DBQueryConfigOrderByCallback<TTable['table']>\n\t| RelationsOrderBy<TTable, TSchema>;\n\nexport type DBQueryConfigWith<TSchema extends TablesRelationalConfig, TRelations extends RelationsRecord> = {\n\t[K in keyof TRelations]?:\n\t\t| boolean\n\t\t| (DBQueryConfig<\n\t\t\tTRelations[K]['relationType'],\n\t\t\tTSchema,\n\t\t\tFindTargetTableInRelationalConfig<TSchema, TRelations[K]>\n\t\t>)\n\t\t| undefined;\n};\n\nexport type DBQueryConfig<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> =\n\t& (TTableConfig['relations'] extends Record<string, never> ? {}\n\t\t: {\n\t\t\twith?:\n\t\t\t\t| DBQueryConfigWith<TSchema, TTableConfig['relations']>\n\t\t\t\t| undefined;\n\t\t})\n\t& {\n\t\tcolumns?: DBQueryConfigColumns<GetTableViewFieldSelection<TTableConfig['table']>> | undefined;\n\t\twhere?: RelationsFilter<TTableConfig, TSchema> | EmptyFilter;\n\t\textras?:\n\t\t\t| DBQueryConfigExtras<TTableConfig['table']>\n\t\t\t| undefined;\n\t\torderBy?:\n\t\t\t| DBQueryConfigRelationsOrderBy<TTableConfig, TSchema>\n\t\t\t| undefined;\n\t\toffset?: number | Placeholder | undefined;\n\t}\n\t& (TRelationType extends 'many' ? {\n\t\t\tlimit?: number | Placeholder | undefined;\n\t\t}\n\t\t: {});\n\nexport type RelationalQueryStrategy = 'basic' | 'optimized';\n\n/** Config of root relational query, dialects omit options they don't support */\nexport type DBQueryConfigRoot<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> = DBQueryConfig<TRelationType, TSchema, TTableConfig> & {\n\t/**\n\t * Query build strategy\n\t *\n\t * - `optimized` - applies query optimizations based on presence of pagination, ordering & filters to avoid slow query plans. Conditions vary per dialect.\n\t * - `basic` - keeps original query shape regardless of conditions.\n\t * Use to opt out of `optimized` if the query refers to relations' subqueries from raw SQL in `where` or `orderBy` or causes performance issues\n\t *\n\t * @default 'optimized'\n\t */\n\tstrategy?: RelationalQueryStrategy | undefined;\n\t/**\n\t * Attach [sqlcommenter](https://google.github.io/sqlcommenter) comment to a query\n\t */\n\tcomment?: CommentInput | undefined;\n\t/**\n\t * Cache query results, requires `cache` to be set in drizzle config\n\t *\n\t * - `true` - cache enabled for query\n\t * - `false` - cache disabled for query\n\t *\n\t * If cache's strategy is `all` - query is cached by default\n\t */\n\twithCache?: boolean | undefined;\n};\n\nexport type AnyDBQueryConfig = {\n\tcolumns?:\n\t\t| DBQueryConfigColumns<GetTableViewFieldSelection<TableRelationalConfig['table']>>\n\t\t| undefined;\n\twhere?: RelationsFilter<TableRelationalConfig, TablesRelationalConfig> | EmptyFilter;\n\textras?:\n\t\t| DBQueryConfigExtras<TableRelationalConfig['table']>\n\t\t| undefined;\n\twith?:\n\t\t| Record<string, AnyDBQueryConfig>\n\t\t| undefined;\n\torderBy?:\n\t\t| DBQueryConfigOrderByCallback<TableRelationalConfig['table']>\n\t\t| AnyRelationsOrder\n\t\t| undefined;\n\toffset?: number | Placeholder | undefined;\n\tlimit?: number | Placeholder | undefined;\n\tcomment?: CommentInput | undefined;\n\tstrategy?: RelationalQueryStrategy | undefined;\n\twithCache?: boolean | undefined;\n};\n\nexport interface TableRelationalConfig {\n\ttable: SchemaEntry;\n\tname: string;\n\trelations: RelationsRecord;\n}\n\nexport type TablesRelationalConfig = Record<string, TableRelationalConfig>;\n\nexport type ExtractTablesWithRelations<\n\tTConfig extends AnyRelationsBuilderConfig,\n\tTTables extends Schema,\n> = {\n\t[K in keyof TTables]: {\n\t\ttable: TTables[K];\n\t\tname: K & string;\n\t\trelations: TConfig extends { [CK in K]: Record<string, any> } ? TConfig[K] : {};\n\t};\n};\n\nexport type ExtractTablesWithRelationsParts<\n\tTConfig extends AnyRelationsBuilderConfig,\n\tTTables extends Schema,\n> = {\n\t[K in NonUndefinedKeysOnly<TConfig> & keyof TTables]: {\n\t\ttable: TTables[K & string];\n\t\tname: K & string;\n\t\trelations: TConfig[K] extends Record<string, any> ? TConfig[K] : {};\n\t};\n};\n\nexport type ReturnTypeOrValue<T> = T extends (...args: any[]) => infer R ? R\n\t: T;\n\nexport type RelationResultKind<TResult, TInclude, TRelation extends AnyRelation> = TRelation extends AnyOne ? (\n\t\t| TResult\n\t\t| (Equal<TRelation['optional'], true> extends true ? null\n\t\t\t: TInclude extends Record<string, unknown> ? TInclude['where'] extends Record<string, any> ? null\n\t\t\t\t: never\n\t\t\t: never)\n\t)\n\t: TResult[];\n\nexport type BuildRelationResult<\n\tTConfig extends TablesRelationalConfig,\n\tTInclude,\n\tTRelations extends RelationsRecord,\n> = {\n\t[\n\t\tK in\n\t\t\t& TruthyKeysOnly<TInclude>\n\t\t\t& keyof TRelations\n\t]: TRelations[K] extends infer TRel extends AnyRelation ? RelationResultKind<\n\t\t\tBuildQueryResult<\n\t\t\t\tTConfig,\n\t\t\t\tFindTargetTableInRelationalConfig<TConfig, TRel>,\n\t\t\t\tAssume<TInclude[K], true | Record<string, unknown>>\n\t\t\t>,\n\t\t\tTInclude[K],\n\t\t\tTRel\n\t\t>\n\t\t: TRelations[K] extends AggregatedField<infer TData> ? TData\n\t\t: never;\n};\n\nexport type NonUndefinedKeysOnly<T> = {\n\t[K in keyof T]: T[K] extends undefined ? never : K;\n}[keyof T];\n\nexport type TruthyKeysOnly<T> = {\n\t[K in keyof T]: T[K] extends undefined | false ? never : K;\n}[keyof T];\n\nexport type InferRelationalQueryTableResult<\n\tTRawSelection extends Record<string, unknown>,\n\tTSelectedFields extends Record<string, unknown> | 'Full' = 'Full',\n> = TSelectedFields extends 'Full' ? TRawSelection : {\n\t[\n\t\tK in Equal<\n\t\t\tExclude<\n\t\t\t\tTSelectedFields[\n\t\t\t\t\t& keyof TSelectedFields\n\t\t\t\t\t& keyof TRawSelection\n\t\t\t\t],\n\t\t\t\tundefined\n\t\t\t>,\n\t\t\tfalse\n\t\t> extends true ? Exclude<\n\t\t\t\tkeyof TRawSelection,\n\t\t\t\tNonUndefinedKeysOnly<TSelectedFields>\n\t\t\t>\n\t\t\t:\n\t\t\t\t& {\n\t\t\t\t\t[K in keyof TSelectedFields]: Equal<\n\t\t\t\t\t\tTSelectedFields[K],\n\t\t\t\t\t\ttrue\n\t\t\t\t\t> extends true ? K\n\t\t\t\t\t\t: never;\n\t\t\t\t}[keyof TSelectedFields]\n\t\t\t\t& keyof TRawSelection\n\t]: TRawSelection[K];\n};\n\nexport type InferSchemaEntrySelectModel<TEntry extends SchemaEntry> = TEntry extends Subquery<string, any>\n\t? SelectResultFields<TEntry['_']['selectedFields']>\n\t: Assume<\n\t\tTEntry,\n\t\t{ $inferSelect: Record<string, unknown> }\n\t>['$inferSelect'];\n\nexport type BuildQueryResult<\n\tTSchema extends TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig,\n\tTFullSelection extends true | Record<string, unknown>,\n\tTModel extends Record<string, unknown> = InferSchemaEntrySelectModel<TTableConfig['table']>,\n> = TFullSelection extends true | Record<string, never> ? TModel\n\t: TFullSelection extends Record<string, unknown> ? Simplify<\n\t\t\t& (InferRelationalQueryTableResult<\n\t\t\t\tTModel,\n\t\t\t\tTFullSelection['columns'] extends Record<string, unknown> ? TFullSelection['columns'] : 'Full'\n\t\t\t>)\n\t\t\t& (TFullSelection['extras'] extends Record<string, SQLWrapper | ((...args: any[]) => SQLWrapper)> ? {\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]: ReturnType<\n\t\t\t\t\t\tAssume<\n\t\t\t\t\t\t\tReturnTypeOrValue<TFullSelection['extras'][K & string]>,\n\t\t\t\t\t\t\tSQLWrapper\n\t\t\t\t\t\t>['getSQL']\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 RelationalThroughJoin {\n\ttable: SchemaEntry;\n\tcondition: SQLChunk[];\n}\n\nexport interface BuildRelationalQueryConfig<TQueryConfig = DBQueryConfigRoot<'many'>> {\n\tschema: TablesRelationalConfig;\n\ttable: SchemaEntry;\n\ttableConfig: TableRelationalConfig;\n\tqueryConfig?: TQueryConfig | true;\n\t/** Filter of relation the query is built for */\n\trelationWhere?: SQLChunk[];\n\tmode: 'first' | 'many';\n\terrorPath?: string;\n\tdepth?: number;\n\tthrough?: RelationalThroughJoin;\n\t/** Whether query is built for a relation of another query */\n\tnested?: boolean;\n\twithSubqueries?: RelationalWithSubqueries;\n\tstrategy?: RelationalQueryStrategy;\n\t/**\n\t * Collects cache keys of tables query is built from, except for ones referenced in raw SQL - see {@link relationalQueryCacheMetadata}\n\t *\n\t * Root query only\n\t */\n\tusedTables?: Set<string>;\n}\n\nexport interface BuildRelationalQueryResult {\n\tselection: (\n\t\t& {\n\t\t\tkey: string;\n\t\t\tcodec?: NormalizeCodec | NormalizeArrayCodec;\n\t\t\t/** For array type columns */\n\t\t\tarrayDimensions?: number;\n\t\t\t// Subquery only\n\t\t\tsubqueryDecoder?: DriverValueDecoder<any, any>;\n\t\t\t// Nested selection only fields\n\t\t\t/** For array type relations */\n\t\t\tisArray?: boolean;\n\t\t\tselection?: BuildRelationalQueryResult['selection'];\n\t\t\tisOptional?: boolean;\n\t\t}\n\t\t& ({\n\t\t\tfield: Column<any>;\n\t\t\tfieldType: 'Column';\n\t\t} | {\n\t\t\tfield: SQL;\n\t\t\tfieldType: 'SQL';\n\t\t} | {\n\t\t\tfield: SQL.Aliased;\n\t\t\tfieldType: 'SQL.Aliased';\n\t\t} | {\n\t\t\tfield: Subquery;\n\t\t\tfieldType: 'Subquery';\n\t\t} | {\n\t\t\tfield: SQLWrapper;\n\t\t\tfieldType: 'SQLWrapper';\n\t\t} | {\n\t\t\tfield: AggregatedField;\n\t\t\tfieldType: 'AggregatedField';\n\t\t} | {\n\t\t\tfield: SchemaEntry;\n\t\t\tfieldType: 'Nested';\n\t\t})\n\t)[];\n\tsql: SQL;\n}\n\n/** @internal */\nexport function relationalQueryUsedTablesInit(config: DBQueryConfigRoot | true): Set<string> | undefined {\n\treturn config !== true && config.withCache ? new Set() : undefined;\n}\n\n/** @internal */\nexport function relationalQueryCacheMetadata(\n\tconfig: DBQueryConfigRoot | true,\n\tsql: SQL,\n\tusedTables: Set<string> | undefined,\n\tsource: { _getQuery(usedTables: Set<string>): unknown },\n): QueryMetadata | undefined {\n\tif (config !== true && config.withCache === false) return;\n\n\tlet collected: string[] | undefined;\n\treturn {\n\t\ttype: 'select',\n\t\ttables: () => {\n\t\t\tif (collected) return collected;\n\n\t\t\tif (!usedTables) {\n\t\t\t\tusedTables = new Set();\n\t\t\t\tsource._getQuery(usedTables);\n\t\t\t}\n\t\t\tcollectChunksUsedTables(sql.queryChunks, usedTables);\n\n\t\t\treturn collected = [...usedTables];\n\t\t},\n\t};\n}\n\n/** @internal */\nexport function relationalQueryCacheConfig(config: DBQueryConfigRoot | true): WithCacheConfig | undefined {\n\treturn config !== true && config.withCache ? { config: {}, enabled: true, autoInvalidate: true } : undefined;\n}\n\nexport function mapRelationalRow(\n\trows: Record<string, unknown> | Record<string, unknown>[],\n\tisOne: boolean,\n\tbuildQueryResultSelection: BuildRelationalQueryResult['selection'],\n\t/** Needed for SQLite as it returns JSON values as strings */\n\tparseJson: boolean = false,\n\t/** Needed for SingleStore as it returns JSON arrays as strings */\n\tparseJsonIfString: boolean = false,\n\t/** Root level data of query is usually not nested in JSON */\n\tuseJsonMappers: boolean = true,\n): Record<string, unknown> | Record<string, unknown>[] {\n\tconst maxIdx = isOne ? 1 : (rows as Record<string, unknown>[]).length;\n\tconst decoders: (undefined | ((v: any) => any))[] = buildQueryResultSelection.map(\n\t\t({ field, fieldType, codec, arrayDimensions, subqueryDecoder }) => {\n\t\t\tlet decoder;\n\t\t\tswitch (fieldType) {\n\t\t\t\tcase 'Column':\n\t\t\t\t\tdecoder = field;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'SQL':\n\t\t\t\t\tdecoder = field.decoder;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'SQL.Aliased':\n\t\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Subquery':\n\t\t\t\t\tdecoder = subqueryDecoder ?? noopDecoder;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Nested':\n\t\t\t\t\tdecoder = noopDecoder;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tdecoder = field.getSQL().decoder;\n\t\t\t}\n\n\t\t\t// Support for old custom column JSON field API\n\t\t\tif (useJsonMappers && (<any> field).mapFromJsonValue) {\n\t\t\t\treturn (v) => (<(value: unknown) => unknown> (<any> field).mapFromJsonValue)(v);\n\t\t\t}\n\n\t\t\treturn decoder.mapFromDriverValue.isNoop\n\t\t\t\t? codec\n\t\t\t\t\t? (value) => codec(value, arrayDimensions!)\n\t\t\t\t\t: undefined\n\t\t\t\t: codec\n\t\t\t\t? (value) => decoder.mapFromDriverValue(codec(value, arrayDimensions!))\n\t\t\t\t: (value) => decoder.mapFromDriverValue(value);\n\t\t},\n\t);\n\n\tfor (let i = 0; i < maxIdx; ++i) {\n\t\tconst row = (isOne ? rows : (rows as Record<string, unknown>[])[i]) as Record<string, unknown>;\n\n\t\tfor (let selectionItemIdx = 0; selectionItemIdx < buildQueryResultSelection.length; ++selectionItemIdx) {\n\t\t\tconst selectionItem = buildQueryResultSelection[selectionItemIdx]!;\n\n\t\t\tif (selectionItem.selection) {\n\t\t\t\tif (row[selectionItem.key] === null) continue;\n\n\t\t\t\tif (parseJson) {\n\t\t\t\t\trow[selectionItem.key] = JSON.parse(row[selectionItem.key] as string);\n\t\t\t\t\tif (row[selectionItem.key] === null) continue;\n\t\t\t\t} else if (parseJsonIfString && typeof row[selectionItem.key] === 'string') {\n\t\t\t\t\trow[selectionItem.key] = JSON.parse(row[selectionItem.key] as string);\n\t\t\t\t}\n\n\t\t\t\tif (selectionItem.isArray) {\n\t\t\t\t\tmapRelationalRow(\n\t\t\t\t\t\trow[selectionItem.key] as Array<Record<string, unknown>>,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tselectionItem.selection!,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tparseJsonIfString,\n\t\t\t\t\t);\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tmapRelationalRow(\n\t\t\t\t\trow[selectionItem.key] as Record<string, unknown>,\n\t\t\t\t\ttrue,\n\t\t\t\t\tselectionItem.selection!,\n\t\t\t\t\tfalse,\n\t\t\t\t\tparseJsonIfString,\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (row[selectionItem.key] === null) continue;\n\n\t\t\tconst decoder = decoders[selectionItemIdx];\n\t\t\tif (!decoder) continue;\n\n\t\t\trow[selectionItem.key] = decoder(row[selectionItem.key]);\n\t\t}\n\t}\n\n\treturn rows;\n}\n\nexport function mapRelationalRowFromArrays(\n\trows: unknown[][] | unknown[],\n\tisOne: boolean,\n\tbuildQueryResultSelection: BuildRelationalQueryResult['selection'],\n\t/** Needed for SQLite as it returns JSON values as strings */\n\tparseJson: boolean = false,\n\t/** Needed for SingleStore as it returns JSON arrays as strings */\n\tparseJsonIfString: boolean = false,\n): Record<string, unknown> | Record<string, unknown>[] {\n\tconst maxIdx = isOne ? 1 : rows.length;\n\tconst decoders: (undefined | ((v: any) => any))[] = buildQueryResultSelection.map(\n\t\t({ field, fieldType, codec, arrayDimensions, subqueryDecoder }) => {\n\t\t\tlet decoder;\n\t\t\tswitch (fieldType) {\n\t\t\t\tcase 'Column':\n\t\t\t\t\tdecoder = field;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'SQL':\n\t\t\t\t\tdecoder = field.decoder;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'SQL.Aliased':\n\t\t\t\t\tdecoder = field.sql.decoder;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Subquery':\n\t\t\t\t\tdecoder = subqueryDecoder ?? noopDecoder;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'Nested':\n\t\t\t\t\tdecoder = noopDecoder;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tdecoder = field.getSQL().decoder;\n\t\t\t}\n\n\t\t\treturn decoder.mapFromDriverValue.isNoop\n\t\t\t\t? codec\n\t\t\t\t\t? (value) => codec(value, arrayDimensions!)\n\t\t\t\t\t: undefined\n\t\t\t\t: codec\n\t\t\t\t? (value) => decoder.mapFromDriverValue(codec(value, arrayDimensions!))\n\t\t\t\t: (value) => decoder.mapFromDriverValue(value);\n\t\t},\n\t);\n\n\tconst results: Record<string, unknown>[] = new Array(maxIdx);\n\n\tfor (let i = 0; i < maxIdx; ++i) {\n\t\tconst row = (isOne ? rows : rows[i]!) as unknown[];\n\t\tconst result: Record<string, unknown> = {};\n\n\t\tfor (let selectionItemIdx = 0; selectionItemIdx < buildQueryResultSelection.length; ++selectionItemIdx) {\n\t\t\tconst selectionItem = buildQueryResultSelection[selectionItemIdx]!;\n\t\t\tlet value = row[selectionItemIdx];\n\n\t\t\tif (selectionItem.selection) {\n\t\t\t\tif (value === null) {\n\t\t\t\t\tresult[selectionItem.key] = null;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (parseJson) {\n\t\t\t\t\tvalue = JSON.parse(value as string);\n\t\t\t\t\tif (value === null) {\n\t\t\t\t\t\tresult[selectionItem.key] = null;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t} else if (parseJsonIfString && typeof value === 'string') {\n\t\t\t\t\tvalue = JSON.parse(value);\n\t\t\t\t}\n\n\t\t\t\tif (selectionItem.isArray) {\n\t\t\t\t\tmapRelationalRow(\n\t\t\t\t\t\tvalue as Array<Record<string, unknown>>,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tselectionItem.selection!,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tparseJsonIfString,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tmapRelationalRow(\n\t\t\t\t\t\tvalue as Record<string, unknown>,\n\t\t\t\t\t\ttrue,\n\t\t\t\t\t\tselectionItem.selection!,\n\t\t\t\t\t\tfalse,\n\t\t\t\t\t\tparseJsonIfString,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tresult[selectionItem.key] = value;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (value === null) {\n\t\t\t\tresult[selectionItem.key] = null;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst decoder = decoders[selectionItemIdx];\n\t\t\tresult[selectionItem.key] = decoder ? decoder(value) : value;\n\t\t}\n\n\t\tresults[i] = result;\n\t}\n\n\treturn isOne ? results[0]! : results;\n}\n\nexport interface RelationalRowsMapper<T = any> {\n\t(rows: unknown[][] | Record<string, unknown>[]): T;\n\t/** @internal jit mapper's function body for debugging */\n\tbody?: string;\n}\n\nexport type RelationalRowsMapperGenerator<T = any> = (\n\tconfig: RelationalQueryMapperConfig,\n) => RelationalRowsMapper<T> | undefined;\n\nexport function makeDefaultRqbMapper<T = any>(\n\t{ selection, isFirst, parseJson, parseJsonIfString, rootJsonMappers, arrayModeRoot }: RelationalQueryMapperConfig,\n): RelationalRowsMapper<T> {\n\treturn ((rows) => {\n\t\tif (isFirst && !rows[0]) return rows[0];\n\n\t\treturn arrayModeRoot\n\t\t\t? mapRelationalRowFromArrays(\n\t\t\t\t(isFirst ? rows[0]! : rows) as unknown[][] | unknown[],\n\t\t\t\tisFirst,\n\t\t\t\tselection,\n\t\t\t\tparseJson,\n\t\t\t\tparseJsonIfString,\n\t\t\t)\n\t\t\t: mapRelationalRow(\n\t\t\t\t(isFirst ? rows[0]! : rows) as Record<string, unknown>[] | Record<string, unknown>,\n\t\t\t\tisFirst,\n\t\t\t\tselection,\n\t\t\t\tparseJson,\n\t\t\t\tparseJsonIfString,\n\t\t\t\trootJsonMappers,\n\t\t\t);\n\t}) as RelationalRowsMapper<T>;\n}\n\nfunction makeJitRqbMapperInner(\n\tselection: BuildRelationalQueryResult['selection'],\n\trowExpr: string,\n\tselectionVar: string,\n\t/** Needed for SQLite as it returns JSON values as strings */\n\tparseJson: boolean,\n\t/** Needed for SingleStore as it returns JSON arrays as strings */\n\tparseJsonIfString: boolean,\n\t/** Root level data of query is usually not nested in JSON */\n\tuseJsonMappers: boolean,\n\tpreFn: string[],\n\tcounter: { n: number },\n\taccessByIdx: boolean,\n): { bodyStmts: string[]; literal: string; hasWork: boolean } {\n\tconst bodyStmts: string[] = [];\n\tconst literalEntries: string[] = [];\n\tlet hasWork = false;\n\n\tconst fieldVars: string[] = selection.map(() => `c${counter.n++}`);\n\tconst destructurePieces = selection.map((item, idx) =>\n\t\taccessByIdx ? fieldVars[idx]! : `${JSON.stringify(item.key)}: ${fieldVars[idx]}`\n\t);\n\tbodyStmts.push(\n\t\taccessByIdx\n\t\t\t? `let [ ${destructurePieces.join(', ')} ] = ${rowExpr};`\n\t\t\t: `let { ${destructurePieces.join(', ')} } = ${rowExpr};`,\n\t);\n\n\tfor (\n\t\tconst [\n\t\t\tidx,\n\t\t\t{\n\t\t\t\tfield,\n\t\t\t\tfieldType,\n\t\t\t\tkey,\n\t\t\t\tcodec,\n\t\t\t\tisArray,\n\t\t\t\tselection: innerSelection,\n\t\t\t\tarrayDimensions,\n\t\t\t\tsubqueryDecoder,\n\t\t\t},\n\t\t] of selection\n\t\t\t.entries()\n\t) {\n\t\tconst sel = `${selectionVar}[${idx}]`;\n\t\tconst keyStr = JSON.stringify(key);\n\t\tconst slot = fieldVars[idx]!;\n\n\t\tif (innerSelection) {\n\t\t\tif (parseJson) {\n\t\t\t\tbodyStmts.push(`if (${slot} !== null) ${slot} = JSON.parse(${slot});`);\n\t\t\t\thasWork = true;\n\t\t\t} else if (parseJsonIfString) {\n\t\t\t\tbodyStmts.push(`if (typeof ${slot} === 'string') ${slot} = JSON.parse(${slot});`);\n\t\t\t\thasWork = true;\n\t\t\t}\n\n\t\t\tconst nestedSelVar = `s${counter.n++}`;\n\t\t\tconst savedPreFnLen = preFn.length;\n\t\t\tpreFn.push(`const { selection: ${nestedSelVar} } = ${sel};`);\n\n\t\t\tif (isArray) {\n\t\t\t\tconst j = `j${counter.n++}`;\n\t\t\t\tconst inner = makeJitRqbMapperInner(\n\t\t\t\t\tinnerSelection,\n\t\t\t\t\t`${slot}[${j}]`,\n\t\t\t\t\tnestedSelVar,\n\t\t\t\t\tfalse,\n\t\t\t\t\tparseJsonIfString,\n\t\t\t\t\ttrue,\n\t\t\t\t\tpreFn,\n\t\t\t\t\tcounter,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t\tif (inner.hasWork) {\n\t\t\t\t\thasWork = true;\n\t\t\t\t\tbodyStmts.push(`if (${slot} !== null) {`);\n\t\t\t\t\tbodyStmts.push(`\\tfor (let ${j} = 0; ${j} < ${slot}.length; ++${j}) {`);\n\t\t\t\t\tfor (const s of inner.bodyStmts) bodyStmts.push(`\\t\\t${s}`);\n\t\t\t\t\tbodyStmts.push(`\\t\\t${slot}[${j}] = ${inner.literal};`);\n\t\t\t\t\tbodyStmts.push(`\\t}`);\n\t\t\t\t\tbodyStmts.push(`}`);\n\t\t\t\t} else {\n\t\t\t\t\tpreFn.splice(savedPreFnLen, 1);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconst inner = makeJitRqbMapperInner(\n\t\t\t\t\tinnerSelection,\n\t\t\t\t\tslot,\n\t\t\t\t\tnestedSelVar,\n\t\t\t\t\tfalse,\n\t\t\t\t\tparseJsonIfString,\n\t\t\t\t\ttrue,\n\t\t\t\t\tpreFn,\n\t\t\t\t\tcounter,\n\t\t\t\t\tfalse,\n\t\t\t\t);\n\t\t\t\tif (inner.hasWork) {\n\t\t\t\t\thasWork = true;\n\t\t\t\t\tbodyStmts.push(`if (${slot} !== null) {`);\n\t\t\t\t\tfor (const s of inner.bodyStmts) bodyStmts.push(`\\t${s}`);\n\t\t\t\t\tbodyStmts.push(`\\t${slot} = ${inner.literal};`);\n\t\t\t\t\tbodyStmts.push(`}`);\n\t\t\t\t} else {\n\t\t\t\t\tpreFn.splice(savedPreFnLen, 1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tliteralEntries.push(`${keyStr}: ${slot}`);\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet decoderExpr = '';\n\t\tlet destructure = '';\n\t\tlet bypassCodecs = false;\n\t\tswitch (fieldType) {\n\t\t\tcase 'Column': {\n\t\t\t\tif (useJsonMappers && (<any> field).mapFromJsonValue) {\n\t\t\t\t\tbypassCodecs = true;\n\t\t\t\t\tconst id = counter.n++;\n\t\t\t\t\tdestructure = `field: dec${id}`;\n\t\t\t\t\tdecoderExpr = `dec${id}.mapFromJsonValue`;\n\t\t\t\t} else if (!field.mapFromDriverValue.isNoop) {\n\t\t\t\t\tconst id = counter.n++;\n\t\t\t\t\tdestructure = `field: dec${id}`;\n\t\t\t\t\tdecoderExpr = `dec${id}.mapFromDriverValue`;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'SQL': {\n\t\t\t\tif (useJsonMappers && (<any> field.decoder).mapFromJsonValue) {\n\t\t\t\t\tbypassCodecs = true;\n\t\t\t\t\tconst id = counter.n++;\n\t\t\t\t\tdestructure = `field: { decoder: dec${id} }`;\n\t\t\t\t\tdecoderExpr = `dec${id}.mapFromJsonValue`;\n\t\t\t\t} else if (!field.decoder.mapFromDriverValue.isNoop) {\n\t\t\t\t\tconst id = counter.n++;\n\t\t\t\t\tdestructure = `field: { decoder: dec${id} }`;\n\t\t\t\t\tdecoderExpr = `dec${id}.mapFromDriverValue`;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'SQL.Aliased': {\n\t\t\t\tif (useJsonMappers && (<any> field.sql.decoder).mapFromJsonValue) {\n\t\t\t\t\tbypassCodecs = true;\n\t\t\t\t\tconst id = counter.n++;\n\t\t\t\t\tdestructure = `field: { sql: { decoder: dec${id} } }`;\n\t\t\t\t\tdecoderExpr = `dec${id}.mapFromJsonValue`;\n\t\t\t\t} else if (!field.sql.decoder.mapFromDriverValue.isNoop) {\n\t\t\t\t\tconst id = counter.n++;\n\t\t\t\t\tdestructure = `field: { sql: { decoder: dec${id} } }`;\n\t\t\t\t\tdecoderExpr = `dec${id}.mapFromDriverValue`;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Subquery': {\n\t\t\t\tif (useJsonMappers && (<any> subqueryDecoder)?.mapFromJsonValue) {\n\t\t\t\t\tbypassCodecs = true;\n\t\t\t\t\tconst id = counter.n++;\n\t\t\t\t\tdestructure = `subqueryDecoder: dec${id}`;\n\t\t\t\t\tdecoderExpr = `dec${id}.mapFromJsonValue`;\n\t\t\t\t} else if (subqueryDecoder && !subqueryDecoder.mapFromDriverValue.isNoop) {\n\t\t\t\t\tconst id = counter.n++;\n\t\t\t\t\tdestructure = `subqueryDecoder: dec${id}`;\n\t\t\t\t\tdecoderExpr = `dec${id}.mapFromDriverValue`;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tcase 'Nested': {\n\t\t\t\t// no decoder\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tconst sqlExpr = field.getSQL();\n\n\t\t\t\tif (useJsonMappers && (<any> sqlExpr.decoder).mapFromJsonValue) {\n\t\t\t\t\tbypassCodecs = true;\n\t\t\t\t\tconst id = counter.n++;\n\t\t\t\t\tpreFn.push(`const dec${id} = ${sel}.field.getSQL().decoder;`);\n\t\t\t\t\tdecoderExpr = `dec${id}.mapFromJsonValue`;\n\t\t\t\t} else if (!sqlExpr.decoder.mapFromDriverValue.isNoop) {\n\t\t\t\t\tconst id = counter.n++;\n\t\t\t\t\tpreFn.push(`const dec${id} = ${sel}.field.getSQL().decoder;`);\n\t\t\t\t\tdecoderExpr = `dec${id}.mapFromDriverValue`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet codecVar = '';\n\t\tif (!bypassCodecs && codec) {\n\t\t\tcodecVar = `codec${counter.n++}`;\n\t\t}\n\n\t\tif (destructure || codecVar) {\n\t\t\tconst parts: string[] = [];\n\t\t\tif (destructure) parts.push(destructure);\n\t\t\tif (codecVar) parts.push(`codec: ${codecVar}`);\n\t\t\tpreFn.push(`const { ${parts.join(', ')} } = ${sel};`);\n\t\t}\n\n\t\tif (decoderExpr || codecVar) {\n\t\t\thasWork = true;\n\t\t\tlet decoded = slot;\n\t\t\tif (codecVar) decoded = `${codecVar}(${decoded}, ${arrayDimensions})`;\n\t\t\tif (decoderExpr) decoded = `${decoderExpr}(${decoded})`;\n\t\t\tliteralEntries.push(`${keyStr}: ${slot} === null ? null : ${decoded}`);\n\t\t} else {\n\t\t\tliteralEntries.push(`${keyStr}: ${slot}`);\n\t\t}\n\t}\n\n\tconst literal = `{ ${literalEntries.join(', ')} }`;\n\n\treturn { bodyStmts, literal, hasWork };\n}\n\nexport interface RelationalQueryMapperConfig {\n\tselection: BuildRelationalQueryResult['selection'];\n\t/** Used for `db.query.table.findFirst(...)` */\n\tisFirst: boolean;\n\t/** Used by SQLite & drivers that return JSON-s as strings by default */\n\tparseJson: boolean;\n\t/** Used by SingleStore to fix malformed outputs for empty JSON arrays */\n\tparseJsonIfString: boolean;\n\t/** Enable for non-reworked dialects & drivers with JSON-ified root level of relational query */\n\trootJsonMappers: boolean;\n\t/** Used when root level of data is in array mode */\n\tarrayModeRoot?: boolean;\n}\n\nexport function makeJitRqbMapper<T = unknown>(\n\t{ selection, isFirst, parseJson, parseJsonIfString, rootJsonMappers, arrayModeRoot }: RelationalQueryMapperConfig,\n): RelationalRowsMapper<T> {\n\tconst preFn: string[] = [];\n\tconst counter = { n: 0 };\n\n\tconst inner = makeJitRqbMapperInner(\n\t\tselection,\n\t\t'row',\n\t\t'selection',\n\t\tparseJson,\n\t\tparseJsonIfString,\n\t\tarrayModeRoot ? false : rootJsonMappers,\n\t\tpreFn,\n\t\tcounter,\n\t\t!!arrayModeRoot,\n\t);\n\n\tconst lines: string[] = [];\n\tlines.push(`\\t\"use strict\";\n\tconst { selection } = this;`);\n\tfor (const p of preFn) lines.push(`\\t${p}`);\n\n\tif (arrayModeRoot) {\n\t\tif (isFirst) {\n\t\t\tlines.push(`\\tconst row = rows[0];`);\n\t\t\tlines.push(`\\tif (!row) return undefined;`);\n\t\t\tfor (const s of inner.bodyStmts) lines.push(`\\t${s}`);\n\t\t\tlines.push(`\\treturn ${inner.literal};`);\n\t\t} else {\n\t\t\tlines.push(`\\tconst { length } = rows;`);\n\t\t\tlines.push(`\\tconst mapped = new Array(length);`);\n\t\t\tlines.push(`\\tfor (let i = 0; i < length; ++i) {`);\n\t\t\tlines.push(`\\t\\tconst row = rows[i];`);\n\t\t\tfor (const s of inner.bodyStmts) lines.push(`\\t\\t${s}`);\n\t\t\tlines.push(`\\t\\tmapped[i] = ${inner.literal};`);\n\t\t\tlines.push(`\\t}`);\n\t\t\tlines.push(`\\treturn mapped;`);\n\t\t}\n\t} else if (!inner.hasWork) {\n\t\tlines.push(isFirst ? `\\treturn rows[0];` : `\\treturn rows;`);\n\t} else if (isFirst) {\n\t\tlines.push(`\\tconst row = rows[0];`);\n\t\tlines.push(`\\tif (!row) return undefined;`);\n\t\tfor (const s of inner.bodyStmts) lines.push(`\\t${s}`);\n\t\tlines.push(`\\trows[0] = ${inner.literal};`);\n\t\tlines.push(`\\treturn rows[0];`);\n\t} else {\n\t\tlines.push(`\\tfor (let i = 0; i < rows.length; ++i) {`);\n\t\tlines.push(`\\t\\tconst row = rows[i];`);\n\t\tfor (const s of inner.bodyStmts) lines.push(`\\t\\t${s}`);\n\t\tlines.push(`\\t\\trows[i] = ${inner.literal};`);\n\t\tlines.push(`\\t}`);\n\t\tlines.push(`\\treturn rows;`);\n\t}\n\n\tlines.push('\\t//# sourceURL=drizzle:jit-relational-query-mapper');\n\tconst compiled = lines.join('\\n');\n\n\treturn Object.assign(\n\t\tnew FnConstructor(\n\t\t\t'rows',\n\t\t\tcompiled,\n\t\t).bind({\n\t\t\tselection,\n\t\t}),\n\t\t{ body: `function jitRqbMapper (rows) {\\n${compiled}\\n}` },\n\t) as RelationalRowsMapper<T>;\n}\n\nexport class RelationsBuilderTable<TTableName extends string = string> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderTable';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tprotected readonly _: {\n\t\treadonly name: TTableName;\n\t\treadonly table: SchemaEntry;\n\t};\n\n\tconstructor(table: SchemaEntry, name: TTableName) {\n\t\tthis._ = {\n\t\t\tname,\n\t\t\ttable,\n\t\t};\n\t}\n}\n\nexport interface RelationsBuilderColumnConfig<\n\tTTableName extends string = string,\n> {\n\treadonly tableName: TTableName;\n\treadonly column: FieldValue;\n\treadonly through?: RelationsBuilderColumnBase;\n\treadonly key: string;\n}\n\nexport interface RelationsBuilderColumnBase<\n\tTTableName extends string = string,\n> {\n\t_: RelationsBuilderColumnConfig<TTableName>;\n}\n\nexport class RelationsBuilderColumn<\n\tTTableName extends string = string,\n> implements RelationsBuilderColumnBase<TTableName> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderColumn';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\treadonly _: {\n\t\treadonly tableName: TTableName;\n\t\treadonly column: FieldValue;\n\t\treadonly key: string;\n\t};\n\n\tconstructor(\n\t\tcolumn: FieldValue,\n\t\ttableName: TTableName,\n\t\tkey: string,\n\t) {\n\t\tthis._ = {\n\t\t\ttableName: tableName,\n\t\t\tcolumn,\n\t\t\tkey,\n\t\t};\n\t}\n\n\tthrough(column: RelationsBuilderColumn): RelationsBuilderJunctionColumn<TTableName> {\n\t\treturn new RelationsBuilderJunctionColumn(\n\t\t\tthis._.column,\n\t\t\tthis._.tableName,\n\t\t\tthis._.key,\n\t\t\tcolumn,\n\t\t);\n\t}\n}\n\nexport class RelationsBuilderJunctionColumn<\n\tTTableName extends string = string,\n> implements RelationsBuilderColumnBase<TTableName> {\n\tstatic readonly [entityKind]: string = 'RelationsBuilderColumn';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\treadonly _: {\n\t\treadonly tableName: TTableName;\n\t\treadonly column: FieldValue;\n\t\treadonly through: RelationsBuilderColumnBase;\n\t\treadonly key: string;\n\t};\n\n\tconstructor(\n\t\tcolumn: FieldValue,\n\t\ttableName: TTableName,\n\t\tkey: string,\n\t\tthrough: RelationsBuilderColumnBase,\n\t) {\n\t\tthis._ = {\n\t\t\ttableName: tableName,\n\t\t\tcolumn,\n\t\t\tthrough,\n\t\t\tkey,\n\t\t};\n\t}\n}\n\nexport interface RelationFieldsFilterInternals<T> {\n\teq?: T | Placeholder | EmptyFilter;\n\tne?: T | Placeholder | EmptyFilter;\n\tgt?: T | Placeholder | EmptyFilter;\n\tgte?: T | Placeholder | EmptyFilter;\n\tlt?: T | Placeholder | EmptyFilter;\n\tlte?: T | Placeholder | EmptyFilter;\n\tin?: (T | Placeholder)[] | Placeholder | EmptyFilter;\n\tnotIn?: (T | Placeholder)[] | Placeholder | EmptyFilter;\n\tarrayContains?: (T extends Array<infer E> ? (E | Placeholder)[] : (T | Placeholder)[]) | Placeholder | EmptyFilter;\n\tarrayContained?: (T extends Array<infer E> ? (E | Placeholder)[] : (T | Placeholder)[]) | Placeholder | EmptyFilter;\n\tarrayOverlaps?: (T extends Array<infer E> ? (E | Placeholder)[] : (T | Placeholder)[]) | Placeholder | EmptyFilter;\n\tlike?: string | Placeholder | EmptyFilter;\n\tilike?: string | Placeholder | EmptyFilter;\n\tnotLike?: string | Placeholder | EmptyFilter;\n\tnotIlike?: string | Placeholder | EmptyFilter;\n\tisNull?: true | EmptyFilter;\n\tisNotNull?: true | EmptyFilter;\n\tNOT?: RelationsFieldFilter<T> | EmptyFilter;\n\tOR?: (RelationsFieldFilter<T> | EmptyFilter)[] | EmptyFilter;\n\tAND?: (RelationsFieldFilter<T> | EmptyFilter)[] | EmptyFilter;\n}\n\nexport type Primitive = string | number | bigint | boolean | symbol | null | undefined;\n\nexport type RelationsFieldFilter<T = unknown> =\n\t| RelationFieldsFilterInternals<T>\n\t| (\n\t\tunknown extends T ? never : T extends Primitive ? T : never\n\t)\n\t| Placeholder;\n\nexport interface RelationsFilterCommons<\n\tTTable extends TableRelationalConfig = TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n> {\n\tOR?: (RelationsFilter<TTable, TSchema> | EmptyFilter)[] | EmptyFilter;\n\tNOT?: RelationsFilter<TTable, TSchema> | EmptyFilter;\n\tAND?: (RelationsFilter<TTable, TSchema> | EmptyFilter)[] | EmptyFilter;\n\tRAW?:\n\t\t| SQLWrapper\n\t\t| ((\n\t\t\ttable: TTable['table'],\n\t\t\toperators: Operators,\n\t\t) => SQL | EmptyFilter)\n\t\t| EmptyFilter;\n}\n\nexport type RelationsFilterColumns<\n\tTColumns extends Record<string, unknown>,\n> = {\n\t[K in keyof TColumns]?:\n\t\t| (TColumns[K] extends { _: { data: infer Data } } ? RelationsFieldFilter<Data>\n\t\t\t: RelationsFieldFilter<unknown>)\n\t\t| EmptyFilter;\n};\n\nexport type RelationsFilterRelations<\n\tTTable extends TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig,\n\tTRelations extends RelationsRecord = TTable['relations'],\n> = {\n\t[K in keyof TRelations]?:\n\t\t| boolean\n\t\t| RelationsFilter<FindTargetTableInRelationalConfig<TSchema, TRelations[K]>, TSchema>\n\t\t| EmptyFilter;\n};\n\nexport type RelationsFilter<\n\tTTable extends TableRelationalConfig,\n\tTSchema extends TablesRelationalConfig,\n\tTColumns extends FieldSelection = GetTableViewFieldSelection<TTable['table']>,\n> = TTable['relations'] extends Record<string, never> ? TableFilter<TTable['table']>\n\t:\n\t\t& RelationsFilterColumns<TColumns>\n\t\t& RelationsFilterRelations<TTable, TSchema>\n\t\t& RelationsFilterCommons<TTable, TSchema>;\n\nexport interface TableFilterCommons<\n\tTTable extends SchemaEntry = SchemaEntry,\n\tTColumns extends Record<string, unknown> = GetTableViewColumns<TTable>,\n> {\n\tOR?: (TableFilter<TTable, TColumns> | EmptyFilter)[] | EmptyFilter;\n\tNOT?: TableFilter<TTable, TColumns> | EmptyFilter;\n\tAND?: (TableFilter<TTable, TColumns> | EmptyFilter)[] | EmptyFilter;\n\tRAW?:\n\t\t| SQLWrapper\n\t\t| ((\n\t\t\ttable: TTable,\n\t\t\toperators: Operators,\n\t\t) => SQL | EmptyFilter)\n\t\t| EmptyFilter;\n}\n\nexport type TableFilterColumns<\n\tTColumns extends Record<string, unknown>,\n> = {\n\t[K in keyof TColumns]?:\n\t\t| (TColumns[K] extends { _: { data: infer Data } } ? RelationsFieldFilter<Data>\n\t\t\t: RelationsFieldFilter<unknown>)\n\t\t| EmptyFilter;\n};\n\nexport type TableFilter<\n\tTTable extends SchemaEntry = SchemaEntry,\n\tTColumns extends Record<string, unknown> = GetTableViewColumns<TTable>,\n> =\n\t& TableFilterColumns<TColumns>\n\t& TableFilterCommons<TTable, TColumns>;\n\nexport type AnyRelationsFilter = RelationsFilter<\n\tTableRelationalConfig,\n\tTablesRelationalConfig,\n\tFieldSelection\n>;\n\nexport type AnyTableFilter = TableFilter<\n\tSchemaEntry,\n\tFieldSelection\n>;\n\nexport interface OneConfig<TTargetTable extends SchemaEntry, TOptional extends boolean> {\n\tfrom?: RelationsBuilderColumnBase | [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]];\n\tto?: RelationsBuilderColumnBase | [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]];\n\twhere?: TableFilter<TTargetTable> | EmptyFilter;\n\toptional?: TOptional;\n\talias?: string;\n}\n\nexport type AnyOneConfig = OneConfig<\n\tSchemaEntry,\n\tboolean\n>;\n\nexport interface ManyConfig<TTargetTable extends SchemaEntry> {\n\tfrom?: RelationsBuilderColumnBase | [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]];\n\tto?: RelationsBuilderColumnBase | [RelationsBuilderColumnBase, ...RelationsBuilderColumnBase[]];\n\twhere?: TableFilter<TTargetTable> | EmptyFilter;\n\talias?: string;\n}\n\nexport type AnyManyConfig = ManyConfig<SchemaEntry>;\n\nexport interface OneFn<TTargetTable extends SchemaEntry, TTargetTableName extends string> {\n\t<TOptional extends boolean = true>(config?: OneConfig<TTargetTable, TOptional>): One<TTargetTableName, TOptional>;\n}\n\nexport interface ManyFn<TTargetTable extends SchemaEntry, TTargetTableName extends string> {\n\t(config?: ManyConfig<TTargetTable>): Many<TTargetTableName>;\n}\n\nexport class RelationsHelperStatic<TTables extends Schema> {\n\tstatic readonly [entityKind]: string = 'RelationsHelperStatic';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tconstructor(tables: TTables) {\n\t\tconst one: Record<string, OneFn<TTables[string], string>> = {};\n\t\tconst many: Record<string, ManyFn<TTables[string], string>> = {};\n\n\t\tfor (const [tableName, table] of Object.entries(tables)) {\n\t\t\tone[tableName] = (config) => {\n\t\t\t\treturn new One(tables, table, tableName, config as unknown as AnyOneConfig);\n\t\t\t};\n\n\t\t\tmany[tableName] = (config) => {\n\t\t\t\treturn new Many(tables, table, tableName, config as AnyManyConfig);\n\t\t\t};\n\t\t}\n\n\t\tthis.one = one as any as this['one'];\n\t\tthis.many = many as any as this['many'];\n\t}\n\n\tone: {\n\t\t[K in keyof TTables]: TTables[K] extends FilteredSchemaEntry ? OneFn<TTables[K], K & string>\n\t\t\t: DrizzleTypeError<\n\t\t\t\t'Views and subqueries with nested selections are not supported by the relational query builder'\n\t\t\t>;\n\t};\n\n\tmany: {\n\t\t[K in keyof TTables]: TTables[K] extends FilteredSchemaEntry ? ManyFn<TTables[K], K & string>\n\t\t\t: DrizzleTypeError<\n\t\t\t\t'Views and subqueries with nested selections are not supported by the relational query builder'\n\t\t\t>;\n\t};\n\n\t/** @internal - to be reworked */\n\taggs = {\n\t\tcount(): Count {\n\t\t\treturn new Count();\n\t\t},\n\t};\n}\n\nexport type RelationsBuilderColumns<TTable extends SchemaEntry, TTableName extends string> = {\n\t[\n\t\tTColumnName in keyof GetTableViewColumns<TTable>\n\t]: RelationsBuilderColumn<\n\t\tTTableName\n\t>;\n};\n\nexport type RelationsBuilderTables<TSchema extends Schema> = {\n\t[TTableName in keyof TSchema]: TSchema[TTableName] extends FilteredSchemaEntry ? (\n\t\t\t& RelationsBuilderColumns<TSchema[TTableName], TTableName & string>\n\t\t\t& RelationsBuilderTable<TTableName & string>\n\t\t)\n\t\t: DrizzleTypeError<'Views and subqueries with nested selections are not supported by the relational query builder'>;\n};\n\nexport type RelationsBuilder<TSchema extends Schema> =\n\t& RelationsBuilderTables<TSchema>\n\t& RelationsHelperStatic<TSchema>;\n\nexport type RelationsBuilderConfigValue =\n\t| RelationsRecord\n\t| undefined;\n\nexport type RelationsBuilderConfig<TTables extends Schema> = {\n\t[TTableName in keyof TTables]?: RelationsBuilderConfigValue;\n};\n\nexport type AnyRelationsBuilderConfig = Record<string, RelationsBuilderConfigValue>;\n\nexport type ExtractTablesFromSchema<TSchema extends Record<string, unknown>> = {\n\t[K in keyof TSchema as TSchema[K] extends SchemaEntry ? K extends string ? K : never : never]: Assume<\n\t\tTSchema[K],\n\t\tSchemaEntry\n\t>;\n};\n\nexport function createRelationsHelper<\n\tTTables extends Schema,\n>(tables: TTables): RelationsBuilder<TTables> {\n\tconst helperStatic = new RelationsHelperStatic(tables);\n\tconst relationsTables = Object.entries(tables).reduce<Record<string, RelationsBuilderTable>>((acc, [tKey, value]) => {\n\t\tconst rTable = new RelationsBuilderTable(value, tKey);\n\t\tconst columns = Object.entries(value[TableColumns]).reduce<\n\t\t\tRecord<string, RelationsBuilderColumnBase>\n\t\t>(\n\t\t\t(acc, [cKey, column]) => {\n\t\t\t\tconst rbColumn = new RelationsBuilderColumn(column as FieldValue, tKey, cKey);\n\t\t\t\tacc[cKey] = rbColumn;\n\t\t\t\treturn acc;\n\t\t\t},\n\t\t\t{},\n\t\t);\n\n\t\tacc[tKey] = Object.assign(rTable, columns);\n\n\t\treturn acc;\n\t}, {});\n\n\treturn Object.assign(helperStatic, relationsTables) as any;\n}\n\nexport function extractTablesFromSchema<TSchema extends Record<string, unknown>>(\n\tschema: TSchema,\n): ExtractTablesFromSchema<TSchema> {\n\treturn Object.fromEntries(\n\t\tObject.entries(schema).filter(([_, e]) => is(e, Table) || is(e, View) || is(e, Subquery)),\n\t) as ExtractTablesFromSchema<TSchema>;\n}\n\nexport type IncludeEveryTable<TTables extends Schema> = { [K in keyof TTables]: {} };\n\n/** Builds relational config for every table in schema */\nexport function defineRelations<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Schema = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n): ExtractTablesWithRelations<{}, TTables>;\n/** Builds relational config for every table in schema */\nexport function defineRelations<\n\tTSchema extends Record<string, unknown>,\n\tTConfig extends RelationsBuilderConfig<TTables>,\n\tTTables extends Schema = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n\trelations: (helpers: RelationsBuilder<TTables>) => TConfig,\n): ExtractTablesWithRelations<TConfig, TTables>;\nexport function defineRelations(\n\tschema: Record<string, unknown>,\n\trelations?: (helpers: RelationsBuilder<Schema>) => AnyRelationsBuilderConfig,\n): TablesRelationalConfig {\n\tconst tables = extractTablesFromSchema(schema);\n\tconst config = relations\n\t\t? relations(\n\t\t\tcreateRelationsHelper(tables) as RelationsBuilder<Schema>,\n\t\t)\n\t\t: {};\n\n\treturn buildRelations(tables, config);\n}\n\n/** Builds relational config for every table in schema */\nexport function defineRelationsPart<\n\tTSchema extends Record<string, unknown>,\n\tTTables extends Schema = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n): ExtractTablesWithRelationsParts<IncludeEveryTable<TTables>, TTables>;\n/** Builds relational config only for tables present in relational config */\nexport function defineRelationsPart<\n\tTSchema extends Record<string, unknown>,\n\tTConfig extends RelationsBuilderConfig<TTables>,\n\tTTables extends Schema = ExtractTablesFromSchema<TSchema>,\n>(\n\tschema: TSchema,\n\trelations: (helpers: RelationsBuilder<TTables>) => TConfig,\n): ExtractTablesWithRelationsParts<TConfig, TTables>;\nexport function defineRelationsPart(\n\tschema: Record<string, unknown>,\n\trelations?: (helpers: RelationsBuilder<Schema>) => AnyRelationsBuilderConfig,\n): TablesRelationalConfig {\n\tconst tables = extractTablesFromSchema(schema);\n\tconst config = relations\n\t\t? relations(\n\t\t\tcreateRelationsHelper(tables) as RelationsBuilder<Schema>,\n\t\t)\n\t\t: Object.fromEntries(Object.keys(tables).map((k) => [k, {}])) as AnyRelationsBuilderConfig;\n\n\treturn buildRelationsParts(tables, config);\n}\n\nexport interface WithContainer {\n\twith?: Record<string, boolean | AnyDBQueryConfig | undefined>;\n}\n\nexport type RelationsOrder<TColumns extends FieldSelection> = {\n\t[K in keyof TColumns]?: 'asc' | 'desc';\n};\n\nexport type OrderBy = Exclude<AnyDBQueryConfig['orderBy'], undefined>;\n\nexport type Extras = Exclude<AnyDBQueryConfig['extras'], undefined>;\n\n/** @internal */\nexport function fieldSelectionToSQL(table: SchemaEntry, target: string): Column | SQL {\n\tconst field = table[TableColumns][target];\n\tconst kind = chunkKindOf(field);\n\tif (isChunk(field, kind, chunkKinds.column)) return field;\n\n\treturn new SQL([\n\t\ttable,\n\t\tcommonStringChunks['.'],\n\t\tsql.identifier(isChunk(field, kind, chunkKinds.aliased) ? field.fieldAlias : target),\n\t]);\n}\n\nclass ConditionsCollector {\n\tstatic readonly [entityKind]: string = 'ConditionsCollector';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tprivate readonly start: number;\n\tprivate count = 0;\n\tprivate mark = 0;\n\tprivate conditionStart = 0;\n\n\tconstructor(private readonly chunks: SQLChunk[], private readonly separator: StringChunk) {\n\t\tthis.start = chunks.length;\n\t\t// Reserved for opening parentheses, filled once there are multiple conditions\n\t\tchunks.push(undefined);\n\t}\n\n\t/** Must be called before pushing a condition's chunks */\n\topen(): void {\n\t\tthis.mark = this.chunks.length;\n\t\tif (this.count) this.chunks.push(this.separator);\n\t\tthis.conditionStart = this.chunks.length;\n\t}\n\n\t/** Must be called after pushing a condition's chunks, drops the condition if nothing was pushed */\n\tclose(): void {\n\t\tif (this.chunks.length === this.conditionStart) {\n\t\t\tthis.chunks.length = this.mark;\n\t\t\treturn;\n\t\t}\n\n\t\t++this.count;\n\t}\n\n\tpush(condition: SQLChunk): void {\n\t\tif (condition === undefined) return;\n\n\t\tif (this.count) this.chunks.push(this.separator);\n\t\tthis.chunks.push(condition);\n\t\t++this.count;\n\t}\n\n\tpushChunks(condition: SQLChunk[] | undefined): void {\n\t\tif (!condition?.length) return;\n\n\t\tif (this.count) this.chunks.push(this.separator);\n\t\tfor (let i = 0; i < condition.length; ++i) this.chunks.push(condition[i]);\n\t\t++this.count;\n\t}\n\n\t/** Returns whether any condition was collected, removes reserved chunk otherwise */\n\tfinish(): boolean {\n\t\tif (!this.count) {\n\t\t\tthis.chunks.length = this.start;\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.count > 1) {\n\t\t\tthis.chunks[this.start] = commonStringChunks['(('];\n\t\t\tthis.chunks.push(commonStringChunks['))']);\n\t\t}\n\n\t\treturn true;\n\t}\n}\n\nfunction relationsFieldFilterToSQL(\n\tcolumn: SQLWrapper,\n\tfilter: RelationsFieldFilter<unknown> | EmptyFilter | undefined,\n\tcollectTo: SQLChunk[] = [],\n): SQLChunk[] | undefined {\n\tif (filter === EmptyFilter) return undefined;\n\tif (filter === undefined) {\n\t\tthrow new Error(\n\t\t\t`Unexpected 'undefined' in filter value. Use 'EmptyFilter' if you want the filter field to be skipped.`,\n\t\t);\n\t}\n\tif (typeof filter !== 'object' || is(filter, Placeholder)) {\n\t\tcollectTo.push(eq(column, filter));\n\t\treturn collectTo;\n\t}\n\n\tconst entries = Object.entries(filter as RelationFieldsFilterInternals<unknown>);\n\tif (!entries.length) return undefined;\n\n\tconst conditions = new ConditionsCollector(collectTo, commonStringChunks[') and (']);\n\tfor (const [target, value] of entries) {\n\t\tif (value === EmptyFilter) continue;\n\t\tif (value === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`Unexpected 'undefined' in filter value. Use 'EmptyFilter' if you want the filter field to be skipped.`,\n\t\t\t);\n\t\t}\n\n\t\tswitch (target as keyof RelationFieldsFilterInternals<unknown>) {\n\t\t\tcase 'NOT': {\n\t\t\t\tconditions.open();\n\t\t\t\tconst notStart = collectTo.length;\n\t\t\t\tcollectTo.push(commonStringChunks['not (']);\n\t\t\t\trelationsFieldFilterToSQL(column, value as RelationsFieldFilter<unknown>, collectTo);\n\t\t\t\tif (collectTo.length === notStart + 1) collectTo.length = notStart;\n\t\t\t\telse collectTo.push(commonStringChunks[')']);\n\t\t\t\tconditions.close();\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'OR':\n\t\t\tcase 'AND': {\n\t\t\t\tconst subFilters = value as RelationsFieldFilter<unknown>[];\n\t\t\t\tif (!subFilters.length) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Unexpected empty array in filters' '${target}' section. Omit field or use 'EmptyFilter' if you want filter to be skipped.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconditions.open();\n\t\t\t\tconst subConditions = new ConditionsCollector(\n\t\t\t\t\tcollectTo,\n\t\t\t\t\ttarget === 'OR' ? commonStringChunks[') or ('] : commonStringChunks[') and ('],\n\t\t\t\t);\n\t\t\t\tfor (const subFilter of subFilters) {\n\t\t\t\t\tsubConditions.open();\n\t\t\t\t\trelationsFieldFilterToSQL(column, subFilter, collectTo);\n\t\t\t\t\tsubConditions.close();\n\t\t\t\t}\n\t\t\t\tsubConditions.finish();\n\t\t\t\tconditions.close();\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'isNotNull':\n\t\t\tcase 'isNull': {\n\t\t\t\tif (!value) continue;\n\n\t\t\t\tconditions.push(operators[target as 'isNull' | 'isNotNull'](column));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'in': {\n\t\t\t\tconditions.push(operators.inArray(column, value as any[] | Placeholder));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tcase 'notIn': {\n\t\t\t\tconditions.push(operators.notInArray(column, value as any[] | Placeholder));\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tconditions.push(\n\t\t\t\t\t(operators[target as keyof typeof operators] as ((col: SQLWrapper, data: any) => SQL | undefined))(\n\t\t\t\t\t\tcolumn,\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t),\n\t\t\t\t);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn conditions.finish() ? collectTo : undefined;\n}\n\nexport type BuiltRelationsFilter = {\n\t/** Chunks collection filter was pushed to, `undefined` if filter is empty */\n\tsql: SQLChunk[] | undefined;\n\thasRelationFilters: boolean;\n};\n\nexport function relationsFilterToSQL(\n\ttable: SchemaEntry,\n\tfilter: AnyRelationsFilter | AnyTableFilter | undefined | EmptyFilter,\n): BuiltRelationsFilter;\nexport function relationsFilterToSQL(\n\ttable: SchemaEntry,\n\tfilter: AnyRelationsFilter | AnyTableFilter | undefined | EmptyFilter,\n\ttableRelations: RelationsRecord,\n\ttablesRelations: TablesRelationalConfig,\n\twithSubqueries: RelationalWithSubqueries | undefined,\n\tdepth?: number,\n\tcollectTo?: SQLChunk[],\n): BuiltRelationsFilter;\nexport function relationsFilterToSQL(\n\ttable: SchemaEntry,\n\tfilter: AnyRelationsFilter | AnyTableFilter | undefined | EmptyFilter,\n\ttableRelations: RelationsRecord = {},\n\ttablesRelations: TablesRelationalConfig = {},\n\twithSubqueries?: RelationalWithSubqueries,\n\tdepth: number = 0,\n\tcollectTo: SQLChunk[] = [],\n): BuiltRelationsFilter {\n\tif (filter === EmptyFilter) return { sql: undefined, hasRelationFilters: false };\n\tif (filter === undefined) {\n\t\tthrow new Error(\n\t\t\t`Unexpected 'undefined' in filter value. Use 'EmptyFilter' if you want the filter field to be skipped.`,\n\t\t);\n\t}\n\tconst entries = Object.entries(filter);\n\tif (!entries.length) return { sql: undefined, hasRelationFilters: false };\n\n\tconst conditions = new ConditionsCollector(collectTo, commonStringChunks[') and (']);\n\tlet hasRelationFilters = false;\n\tconst buildNested = (subFilter: AnyRelationsFilter) => {\n\t\tconst built = relationsFilterToSQL(\n\t\t\ttable,\n\t\t\tsubFilter,\n\t\t\ttableRelations,\n\t\t\ttablesRelations,\n\t\t\twithSubqueries,\n\t\t\tdepth,\n\t\t\tcollectTo,\n\t\t);\n\t\tif (built.hasRelationFilters) hasRelationFilters = true;\n\t};\n\n\tfor (const [target, value] of entries) {\n\t\tif (value === EmptyFilter) continue;\n\t\tif (value === undefined) {\n\t\t\tthrow new Error(\n\t\t\t\t`Unexpected 'undefined' in filter value. Use 'EmptyFilter' if you want the filter field to be skipped.`,\n\t\t\t);\n\t\t}\n\n\t\tswitch (target) {\n\t\t\tcase 'RAW': {\n\t\t\t\tconst processed = typeof value === 'function'\n\t\t\t\t\t? (value as unknown as (table: FieldSelection, operators: Operators) => SQL | EmptyFilter)(\n\t\t\t\t\t\ttable as any,\n\t\t\t\t\t\toperators,\n\t\t\t\t\t)\n\t\t\t\t\t: (value as SQLWrapper).getSQL();\n\t\t\t\tif (processed === EmptyFilter) continue;\n\n\t\t\t\tconditions.push(processed);\n\t\t\t\thasRelationFilters = true;\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'OR':\n\t\t\tcase 'AND': {\n\t\t\t\tconst subFilters = value as AnyRelationsFilter[];\n\t\t\t\tif (!subFilters.length) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Unexpected empty array in filters' '${target}' section. Omit field or use 'EmptyFilter' if you want filter to be skipped.`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tconditions.open();\n\t\t\t\tconst subConditions = new ConditionsCollector(\n\t\t\t\t\tcollectTo,\n\t\t\t\t\ttarget === 'OR' ? commonStringChunks[') or ('] : commonStringChunks[') and ('],\n\t\t\t\t);\n\t\t\t\tfor (const subFilter of subFilters) {\n\t\t\t\t\tsubConditions.open();\n\t\t\t\t\tbuildNested(subFilter);\n\t\t\t\t\tsubConditions.close();\n\t\t\t\t}\n\t\t\t\tsubConditions.finish();\n\t\t\t\tconditions.close();\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcase 'NOT': {\n\t\t\t\tconditions.open();\n\t\t\t\tconst notStart = collectTo.length;\n\t\t\t\tcollectTo.push(commonStringChunks['not (']);\n\t\t\t\tbuildNested(value as AnyRelationsFilter);\n\t\t\t\tif (collectTo.length === notStart + 1) collectTo.length = notStart;\n\t\t\t\telse collectTo.push(commonStringChunks[')']);\n\t\t\t\tconditions.close();\n\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tif (Object.prototype.hasOwnProperty.call(table[TableColumns], target) && table[TableColumns][target]) {\n\t\t\t\t\tconditions.open();\n\t\t\t\t\trelationsFieldFilterToSQL(\n\t\t\t\t\t\tfieldSelectionToSQL(table, target),\n\t\t\t\t\t\tvalue as RelationsFieldFilter,\n\t\t\t\t\t\tcollectTo,\n\t\t\t\t\t);\n\t\t\t\t\tconditions.close();\n\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tconst relation = Object.prototype.hasOwnProperty.call(tableRelations, target)\n\t\t\t\t\t? tableRelations[target]\n\t\t\t\t\t: undefined;\n\t\t\t\tif (!relation) {\n\t\t\t\t\t// Should never trigger unless the types've been violated\n\t\t\t\t\tthrow new DrizzleError({\n\t\t\t\t\t\tmessage: `Unknown relational filter field: \"${target}\"`,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (withSubqueries) {\n\t\t\t\t\tcollectSubqueryAndUsedTables(withSubqueries, relation.targetTable);\n\t\t\t\t\tcollectSubqueryAndUsedTables(withSubqueries, relation.throughTable);\n\t\t\t\t}\n\n\t\t\t\tconst targetTable = aliasedTable(relation.targetTable, `f${depth}`);\n\t\t\t\tconst throughTable = relation.throughTable ? aliasedTable(relation.throughTable, `ft${depth}`) : undefined;\n\t\t\t\tconst targetConfig = tablesRelations[relation.targetTableName]!;\n\t\t\t\tconst isExistsOnly = typeof value === 'boolean';\n\n\t\t\t\tconditions.open();\n\t\t\t\tconst conditionStart = collectTo.length;\n\t\t\t\tcollectTo.push(\n\t\t\t\t\tvalue ? commonStringChunks['exists (select * from '] : commonStringChunks['not exists (select * from '],\n\t\t\t\t);\n\t\t\t\tgetTableAsAliasSQL(targetTable, collectTo);\n\t\t\t\tif (throughTable) {\n\t\t\t\t\tcollectTo.push(commonStringChunks[' inner join ']);\n\t\t\t\t\tgetTableAsAliasSQL(throughTable, collectTo);\n\t\t\t\t\tcollectTo.push(commonStringChunks[' on ']);\n\t\t\t\t}\n\t\t\t\tconst { filter: relationFilter } = relationToSQL(relation, table, targetTable, throughTable, [], collectTo);\n\n\t\t\t\tcollectTo.push(commonStringChunks[' where ']);\n\t\t\t\tconst where = new ConditionsCollector(collectTo, commonStringChunks[') and (']);\n\t\t\t\twhere.pushChunks(relationFilter);\n\t\t\t\tif (!isExistsOnly) {\n\t\t\t\t\twhere.open();\n\t\t\t\t\tconst subfilter = relationsFilterToSQL(\n\t\t\t\t\t\ttargetTable,\n\t\t\t\t\t\tvalue as AnyRelationsFilter,\n\t\t\t\t\t\ttargetConfig.relations,\n\t\t\t\t\t\ttablesRelations,\n\t\t\t\t\t\twithSubqueries,\n\t\t\t\t\t\tdepth + 1,\n\t\t\t\t\t\tcollectTo,\n\t\t\t\t\t);\n\t\t\t\t\twhere.close();\n\n\t\t\t\t\t// Relation filter without conditions is skipped\n\t\t\t\t\tif (!subfilter.sql) {\n\t\t\t\t\t\tcollectTo.length = conditionStart;\n\t\t\t\t\t\tconditions.close();\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\twhere.finish();\n\t\t\t\tcollectTo.push(commonStringChunks[')']);\n\t\t\t\tconditions.close();\n\t\t\t\thasRelationFilters = true;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn { sql: conditions.finish() ? collectTo : undefined, hasRelationFilters };\n}\n\nconst relationsOrderAggregates: ReadonlySet<string> = new Set<RelationsOrderAggregate>([\n\t'min',\n\t'max',\n\t'count',\n\t'avg',\n\t'first',\n]);\n\nexport function parseRelationsOrderValue(\n\tvalue: unknown,\n\tpath: string,\n): { direction: RelationsOrderDirection; aggregate?: RelationsOrderAggregate } {\n\tif (typeof value !== 'string') {\n\t\tthrow new DrizzleError({\n\t\t\tmessage: `Invalid order \"${path}\": expected a string, got ${value === null ? 'null' : typeof value}`,\n\t\t});\n\t}\n\n\tconst parts = value.split('(');\n\tconst direction = parts[0];\n\tif (direction !== 'asc' && direction !== 'desc') {\n\t\tthrow new DrizzleError({\n\t\t\tmessage: `Invalid order \"${path}\": unknown direction \"${direction}\" in \"${value}\", expected \"asc\" or \"desc\"`,\n\t\t});\n\t}\n\tif (parts.length === 1) return { direction };\n\n\tif (parts.length > 2 || !parts[1]!.endsWith(')')) {\n\t\tthrow new DrizzleError({\n\t\t\tmessage:\n\t\t\t\t`Invalid order \"${path}\": malformed value \"${value}\", expected \"${direction}\" or \"${direction}(<aggregate>)\"`,\n\t\t});\n\t}\n\n\tconst aggregate = parts[1]!.slice(0, -1);\n\tif (!relationsOrderAggregates.has(aggregate)) {\n\t\tthrow new DrizzleError({\n\t\t\tmessage: `Invalid order \"${path}\": unknown aggregate \"${aggregate}\" in \"${value}\", expected one of: ${\n\t\t\t\t[...relationsOrderAggregates].join(', ')\n\t\t\t}`,\n\t\t});\n\t}\n\n\treturn { direction, aggregate: aggregate as RelationsOrderAggregate };\n}\n\nexport type RelationsOrderSource = {\n\t/** Relations' tables between the ordered table and the field */\n\tfrom: SQLChunk[];\n\tfilters: SQLChunk[][];\n\t/** Whether there's a `many` relation on the way: fields have to be aggregated */\n\tisAggregated: boolean;\n\tdepth: number;\n\tpath: string;\n};\n\nexport function relationsOrderEntriesToSQL(\n\ttable: SchemaEntry,\n\torders: AnyRelationsOrder,\n\ttableRelations: RelationsRecord,\n\ttablesRelations: TablesRelationalConfig,\n\twithSubqueries: RelationalWithSubqueries | undefined,\n\t/** 'top' for MSSQL, 'limit' for rest */\n\tsingleRowLimit: 'limit' | 'top',\n\tsource: RelationsOrderSource | undefined,\n\tcollectTo: SQLChunk[],\n\t/** Index of `collectTo` order starts at, orders after it are separated by commas */\n\tstart: number = collectTo.length,\n): SQLChunk[] {\n\tfor (const [target, value] of Object.entries(orders)) {\n\t\tif (!value) continue;\n\n\t\tconst path = source ? `${source.path}.${target}` : target;\n\n\t\tif (Object.prototype.hasOwnProperty.call(table[TableColumns], target) && table[TableColumns][target]) {\n\t\t\tconst { direction, aggregate } = parseRelationsOrderValue(value, path);\n\t\t\tif (!!aggregate !== !!source?.isAggregated) {\n\t\t\t\tthrow new DrizzleError({\n\t\t\t\t\tmessage: `Invalid order \"${path}\": expected ${\n\t\t\t\t\t\tsource?.isAggregated\n\t\t\t\t\t\t\t? '\"asc(<aggregate>)\" or \"desc(<aggregate>)\", with aggregate being one of: min, max, count, avg, first'\n\t\t\t\t\t\t\t: '\"asc\" or \"desc\"'\n\t\t\t\t\t}, got \"${value}\"`,\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tconst column = fieldSelectionToSQL(table, target);\n\t\t\tif (collectTo.length > start) collectTo.push(commonStringChunks[', ']);\n\t\t\tif (!source) {\n\t\t\t\tcollectTo.push(column, direction === 'asc' ? commonStringChunks[' asc'] : commonStringChunks[' desc']);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst isSingleRowLimited = !aggregate || aggregate === 'first';\n\t\t\tcollectTo.push(commonStringChunks['(select ']);\n\t\t\tif (isSingleRowLimited) {\n\t\t\t\tif (singleRowLimit === 'top') collectTo.push(commonStringChunks['top(1) ']);\n\t\t\t\tcollectTo.push(column);\n\t\t\t} else {\n\t\t\t\tcollectTo.push(commonStringChunks[`${aggregate!}(`], column, commonStringChunks[')']);\n\t\t\t}\n\t\t\tcollectTo.push(commonStringChunks[' from ']);\n\t\t\tfor (let i = 0; i < source.from.length; ++i) collectTo.push(source.from[i]);\n\t\t\tconst whereStart = collectTo.length;\n\t\t\tcollectTo.push(commonStringChunks[' where ']);\n\t\t\tconst where = new ConditionsCollector(collectTo, commonStringChunks[') and (']);\n\t\t\tfor (let i = 0; i < source.filters.length; ++i) where.pushChunks(source.filters[i]);\n\t\t\tif (!where.finish()) collectTo.length = whereStart;\n\t\t\tif (isSingleRowLimited && singleRowLimit === 'limit') collectTo.push(commonStringChunks[' limit 1']);\n\t\t\tcollectTo.push(\n\t\t\t\tcommonStringChunks[')'],\n\t\t\t\tdirection === 'asc' ? commonStringChunks[' asc'] : commonStringChunks[' desc'],\n\t\t\t);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst relation = Object.prototype.hasOwnProperty.call(tableRelations, target)\n\t\t\t? tableRelations[target]\n\t\t\t: undefined;\n\t\tif (!relation) {\n\t\t\t// Should never trigger unless the types've been violated\n\t\t\tthrow new DrizzleError({ message: `Unknown relational order field: \"${path}\"` });\n\t\t}\n\t\tconst count = relation.relationType === 'many' && typeof value === 'string'\n\t\t\t? parseRelationsOrderValue(value, path)\n\t\t\t: undefined;\n\t\tconst countDirection = count?.aggregate === 'count' ? count.direction : undefined;\n\t\tif (typeof value !== 'object' && !countDirection) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage: `Invalid order \"${path}\": expected an object with fields of relation to order by${\n\t\t\t\t\trelation.relationType === 'many' ? ', \"asc(count)\" or \"desc(count)\"' : ''\n\t\t\t\t}, got \"${value}\"`,\n\t\t\t});\n\t\t}\n\n\t\tif (withSubqueries) {\n\t\t\tcollectSubqueryAndUsedTables(withSubqueries, relation.targetTable);\n\t\t\tcollectSubqueryAndUsedTables(withSubqueries, relation.throughTable);\n\t\t}\n\n\t\tconst depth = source?.depth ?? 0;\n\t\tconst targetTable = aliasedTable(relation.targetTable, `o${depth}`);\n\t\tconst throughTable = relation.throughTable ? aliasedTable(relation.throughTable, `ot${depth}`) : undefined;\n\n\t\tconst from: SQLChunk[] = source ? [...source.from, commonStringChunks[' cross join ']] : [];\n\t\tgetTableAsAliasSQL(targetTable, from);\n\t\tif (throughTable) {\n\t\t\tfrom.push(commonStringChunks[' inner join ']);\n\t\t\tgetTableAsAliasSQL(throughTable, from);\n\t\t\tfrom.push(commonStringChunks[' on ']);\n\t\t}\n\t\tconst { filter } = relationToSQL(relation, table, targetTable, throughTable, [], from);\n\t\tconst filters = source ? [...source.filters, filter] : [filter];\n\n\t\tif (typeof value !== 'object') {\n\t\t\tif (collectTo.length > start) collectTo.push(commonStringChunks[', ']);\n\t\t\tcollectTo.push(commonStringChunks['(select count(*) from ']);\n\t\t\tfor (let i = 0; i < from.length; ++i) collectTo.push(from[i]);\n\t\t\tconst whereStart = collectTo.length;\n\t\t\tcollectTo.push(commonStringChunks[' where ']);\n\t\t\tconst where = new ConditionsCollector(collectTo, commonStringChunks[') and (']);\n\t\t\tfor (let i = 0; i < filters.length; ++i) where.pushChunks(filters[i]);\n\t\t\tif (!where.finish()) collectTo.length = whereStart;\n\t\t\tcollectTo.push(\n\t\t\t\tcommonStringChunks[')'],\n\t\t\t\tcountDirection === 'asc' ? commonStringChunks[' asc'] : commonStringChunks[' desc'],\n\t\t\t);\n\n\t\t\tcontinue;\n\t\t}\n\n\t\trelationsOrderEntriesToSQL(\n\t\t\ttargetTable,\n\t\t\tvalue,\n\t\t\ttablesRelations[relation.targetTableName]?.relations ?? {},\n\t\t\ttablesRelations,\n\t\t\twithSubqueries,\n\t\t\tsingleRowLimit,\n\t\t\t{\n\t\t\t\tfrom,\n\t\t\t\tfilters,\n\t\t\t\tisAggregated: !!source?.isAggregated || relation.relationType === 'many',\n\t\t\t\tdepth: depth + 1,\n\t\t\t\tpath,\n\t\t\t},\n\t\t\tcollectTo,\n\t\t\tstart,\n\t\t);\n\t}\n\n\treturn collectTo;\n}\n\n/** Returns chunks collection order was pushed to, `undefined` if order is empty */\nexport function relationsOrderToSQL(\n\ttable: SchemaEntry,\n\torders: OrderBy,\n): SQLChunk[] | undefined;\nexport function relationsOrderToSQL(\n\ttable: SchemaEntry,\n\torders: OrderBy,\n\ttableRelations: RelationsRecord,\n\ttablesRelations: TablesRelationalConfig,\n\twithSubqueries: RelationalWithSubqueries | undefined,\n\t/** 'top' for MSSQL, 'limit' for rest */\n\tsingleRowLimit?: 'limit' | 'top',\n\tcollectTo?: SQLChunk[],\n): SQLChunk[] | undefined;\nexport function relationsOrderToSQL(\n\ttable: SchemaEntry,\n\torders: OrderBy,\n\ttableRelations: RelationsRecord = {},\n\ttablesRelations: TablesRelationalConfig = {},\n\twithSubqueries?: RelationalWithSubqueries,\n\t/** 'top' for MSSQL, 'limit' for rest */\n\tsingleRowLimit: 'limit' | 'top' = 'limit',\n\tcollectTo: SQLChunk[] = [],\n): SQLChunk[] | undefined {\n\tconst start = collectTo.length;\n\n\tif (typeof orders === 'function') {\n\t\tconst data = orders(table as any, orderByOperators);\n\t\tif (!data) return undefined;\n\n\t\tconst kind = chunkKindOf(data);\n\t\tif (isChunk(data, kind, chunkKinds.sql)) {\n\t\t\tcollectTo.push(data);\n\t\t} else if (Array.isArray(data)) {\n\t\t\tfor (let i = 0; i < data.length; ++i) {\n\t\t\t\tif (i) collectTo.push(commonStringChunks[', ']);\n\n\t\t\t\tconst item = data[i];\n\t\t\t\tcollectTo.push(item);\n\t\t\t\tif (chunkKindOf(item) !== chunkKinds.sql) collectTo.push(commonStringChunks[' asc']);\n\t\t\t}\n\t\t} else if (isChunk(data, kind, chunkKinds.column)) {\n\t\t\tcollectTo.push(data, commonStringChunks[' asc']);\n\t\t}\n\n\t\treturn collectTo.length > start ? collectTo : undefined;\n\t}\n\n\trelationsOrderEntriesToSQL(\n\t\ttable,\n\t\torders,\n\t\ttableRelations,\n\t\ttablesRelations,\n\t\twithSubqueries,\n\t\tsingleRowLimit,\n\t\tundefined,\n\t\tcollectTo,\n\t\tstart,\n\t);\n\n\treturn collectTo.length > start ? collectTo : undefined;\n}\n\nexport function relationExtrasToSQL(\n\ttable: SchemaEntry,\n\textras: Extras,\n\tcodecs?: CodecsCollection,\n\tinJson?: boolean,\n\tcollectTo: SQLChunk[] = [],\n): {\n\t/** Chunks collection extras were pushed to, `undefined` if there are none */\n\tsql: SQLChunk[] | undefined;\n\tselection: BuildRelationalQueryResult['selection'];\n} {\n\tconst start = collectTo.length;\n\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\n\tfor (\n\t\tconst [key, field] of Object.entries(extras)\n\t) {\n\t\tconst extra = typeof field === 'function' ? field(table as any, { sql: operators.sql }) : field;\n\t\tif (!extra) continue;\n\n\t\tconst subq = extra.getSQL();\n\t\tconst column = codecs ? getColumnFromDecoder(subq) : undefined;\n\t\t// Codec bypass for custom columns with enabled legacy JSON api\n\t\tconst query = column && (!inJson || !(<any> column).jsonSelectIdentifier)\n\t\t\t? new SQL([\n\t\t\t\tcodecs!.apply(\n\t\t\t\t\tcolumn,\n\t\t\t\t\tinJson ? 'castInJson' : 'cast',\n\t\t\t\t\tnew SQL([commonStringChunks['('], subq, commonStringChunks[')']]),\n\t\t\t\t),\n\t\t\t\tcommonStringChunks[' as '],\n\t\t\t\tsql.identifier(key),\n\t\t\t])\n\t\t\t: new SQL([commonStringChunks['('], subq, commonStringChunks[') as '], sql.identifier(key)]);\n\t\tquery.decoder = subq.decoder;\n\n\t\tif (collectTo.length > start) collectTo.push(commonStringChunks[', ']);\n\t\tcollectTo.push(query);\n\t\tselection.push(\n\t\t\t// Codec bypass for custom columns with enabled legacy JSON api\n\t\t\tcolumn && (!inJson || !(<any> column).mapFromJsonValue)\n\t\t\t\t? {\n\t\t\t\t\tkey,\n\t\t\t\t\tfield: query,\n\t\t\t\t\tfieldType: 'SQL',\n\t\t\t\t\tcodec: codecs!.get(column, inJson ? 'normalizeInJson' : 'normalize'),\n\t\t\t\t\tarrayDimensions: (<any> column).dimensions,\n\t\t\t\t}\n\t\t\t\t: {\n\t\t\t\t\tkey,\n\t\t\t\t\tfield: query,\n\t\t\t\t\tfieldType: 'SQL',\n\t\t\t\t},\n\t\t);\n\t}\n\n\treturn {\n\t\tsql: collectTo.length > start ? collectTo : undefined,\n\t\tselection,\n\t};\n}\n\nfunction relationFieldIdentifier({ _: { column, key } }: RelationsBuilderColumnBase): Name {\n\tconst kind = chunkKindOf(column);\n\n\treturn sql.identifier(\n\t\tisChunk(column, kind, chunkKinds.column)\n\t\t\t? column.name\n\t\t\t: isChunk(column, kind, chunkKinds.aliased)\n\t\t\t? column.fieldAlias\n\t\t\t: key,\n\t);\n}\n\n/** Pushes `\"left\".\"field\" = \"right\".\"field\"` as a condition */\nfunction collectRelationFieldsEquality(\n\tconditions: ConditionsCollector,\n\tcollectTo: SQLChunk[],\n\tleftTable: SQLChunk,\n\tleftField: RelationsBuilderColumnBase,\n\trightTable: SQLChunk,\n\trightField: RelationsBuilderColumnBase,\n): void {\n\tconditions.open();\n\tcollectTo.push(\n\t\tleftTable,\n\t\tcommonStringChunks['.'],\n\t\trelationFieldIdentifier(leftField),\n\t\tcommonStringChunks[' = '],\n\t\trightTable,\n\t\tcommonStringChunks['.'],\n\t\trelationFieldIdentifier(rightField),\n\t);\n\tconditions.close();\n}\n\nexport interface BuiltRelationFilters {\n\t/** Chunks collection relation's filter was pushed to */\n\tfilter: SQLChunk[];\n\t/** Chunks collection join condition of relation's junction table was pushed to */\n\tjoinCondition?: SQLChunk[];\n}\n\nexport function relationToSQL(\n\trelation: Relation,\n\tsourceTable: SchemaEntry,\n\ttargetTable: SchemaEntry,\n\tthroughTable?: SchemaEntry,\n\tfilterTo: SQLChunk[] = [],\n\tjoinConditionTo: SQLChunk[] = [],\n): BuiltRelationFilters {\n\tconst whereTable = relation.isFilterReversed ? sourceTable : targetTable;\n\tconst sourceRef = sourceTable[Qualifier];\n\tconst targetRef = targetTable[Qualifier];\n\tconst throughRef = throughTable?.[Qualifier];\n\tconst filter = new ConditionsCollector(filterTo, commonStringChunks[') and (']);\n\n\tif (relation.through) {\n\t\tconst { sourceColumns, targetColumns, through: { source, target } } = relation as Relation & {\n\t\t\tthrough: NonNullable<Relation['through']>;\n\t\t};\n\n\t\tfilter.open();\n\t\trelationsFilterToSQL(whereTable, relation.where, {}, {}, undefined, 0, filterTo);\n\t\tfilter.close();\n\t\tfor (let i = 0; i < sourceColumns.length; ++i) {\n\t\t\tcollectRelationFieldsEquality(filter, filterTo, sourceRef, sourceColumns[i]!, throughRef!, source[i]!);\n\t\t}\n\t\tfilter.finish();\n\n\t\tconst joinCondition = new ConditionsCollector(joinConditionTo, commonStringChunks[') and (']);\n\t\tfor (let i = 0; i < targetColumns.length; ++i) {\n\t\t\tcollectRelationFieldsEquality(\n\t\t\t\tjoinCondition,\n\t\t\t\tjoinConditionTo,\n\t\t\t\tthroughRef!,\n\t\t\t\ttarget[i]!,\n\t\t\t\ttargetRef,\n\t\t\t\ttargetColumns[i]!,\n\t\t\t);\n\t\t}\n\t\tjoinCondition.finish();\n\n\t\treturn { filter: filterTo, joinCondition: joinConditionTo };\n\t}\n\n\tconst { sourceColumns, targetColumns } = relation;\n\tfor (let i = 0; i < sourceColumns.length; ++i) {\n\t\tcollectRelationFieldsEquality(filter, filterTo, sourceRef, sourceColumns[i]!, targetRef, targetColumns[i]!);\n\t}\n\tfilter.open();\n\trelationsFilterToSQL(whereTable, relation.where, {}, {}, undefined, 0, filterTo);\n\tfilter.close();\n\tfilter.finish();\n\n\treturn { filter: filterTo };\n}\n\n/**\n * @internal\n * Pushes `where` of relational query: its own filter and filter of relation it's queried through\n */\nexport function relationalQueryWhereToSQL(\n\ttable: SchemaEntry,\n\tparams: { where?: unknown } | undefined,\n\ttableRelations: RelationsRecord,\n\ttablesRelations: TablesRelationalConfig,\n\twithSubqueries: RelationalWithSubqueries,\n\trelationWhere: SQLChunk[] | undefined,\n\tcollectTo: SQLChunk[] = [],\n): BuiltRelationsFilter {\n\tconst conditions = new ConditionsCollector(collectTo, commonStringChunks[') and (']);\n\tlet hasRelationFilters = false;\n\tif (params && 'where' in params) {\n\t\tconditions.open();\n\t\thasRelationFilters = relationsFilterToSQL(\n\t\t\ttable,\n\t\t\tparams.where as AnyRelationsFilter,\n\t\t\ttableRelations,\n\t\t\ttablesRelations,\n\t\t\twithSubqueries,\n\t\t\t0,\n\t\t\tcollectTo,\n\t\t).hasRelationFilters;\n\t\tconditions.close();\n\t}\n\tconditions.pushChunks(relationWhere);\n\n\treturn { sql: conditions.finish() ? collectTo : undefined, hasRelationFilters };\n}\n\n/** Legacy JSON api of custom columns */\ninterface RqbCustomColumn {\n\treadonly mapFromJsonValue?: (value: unknown) => unknown;\n\treadonly jsonSelectIdentifier?: (identifier: SQL, sql: SQLGenerator, arrayDimensions?: number) => SQL;\n\treadonly dimensions?: number;\n}\n\nfunction collectRqbFieldSelection(\n\tcollectTo: SQLChunk[],\n\ttableRef: SQLChunk,\n\tname: string,\n\tkey: string,\n\tcodecs: CodecsCollection,\n\tdecoderColumn: Column | undefined,\n\tinJson: boolean,\n): void {\n\tif (decoderColumn) {\n\t\tcollectTo.push(\n\t\t\tcodecs.apply(\n\t\t\t\tdecoderColumn,\n\t\t\t\tinJson ? 'castInJson' : 'cast',\n\t\t\t\tnew SQL([tableRef, commonStringChunks['.'], sql.identifier(name)]),\n\t\t\t),\n\t\t);\n\t} else {\n\t\tcollectTo.push(tableRef, commonStringChunks['.'], sql.identifier(name));\n\t}\n\n\tcollectTo.push(commonStringChunks[' as '], sql.identifier(key));\n}\n\n/** Pushes field of table selected by relational query, adds it to `selection` */\nexport function buildRqbColumn(\n\ttableRef: SQLChunk,\n\tfield: unknown,\n\tkey: string,\n\tinJson: boolean,\n\tselection: BuildRelationalQueryResult['selection'],\n\ttableTsName: string,\n\tcodecs: CodecsCollection,\n\tcollectTo: SQLChunk[],\n): void {\n\tlet decoderColumn: Column | undefined;\n\tlet subqueryDecoder: DriverValueDecoder<any, any> | undefined;\n\tlet fieldType: BuildRelationalQueryResult['selection'][number]['fieldType'];\n\n\tconst kind = chunkKindOf(field);\n\tif (isChunk(field, kind, chunkKinds.column)) {\n\t\tdecoderColumn = field;\n\t\tfieldType = 'Column';\n\n\t\tconst { jsonSelectIdentifier, dimensions } = field as Column & RqbCustomColumn;\n\t\tconst cast = inJson && jsonSelectIdentifier\n\t\t\t? undefined\n\t\t\t: codecs.codecsOf(field)[inJson ? 'castInJson' : 'cast'];\n\t\tif (cast || (inJson && jsonSelectIdentifier)) {\n\t\t\tconst name = new SQL([tableRef, commonStringChunks['.'], sql.identifier(field.name)]);\n\t\t\tconst casted = cast\n\t\t\t\t? cast(name, dimensions!)\n\t\t\t\t: jsonSelectIdentifier!.call(field, name, sql, dimensions);\n\t\t\tcollectTo.push(casted, commonStringChunks[' as '], sql.identifier(key));\n\t\t} else {\n\t\t\tcollectTo.push(\n\t\t\t\ttableRef,\n\t\t\t\tcommonStringChunks['.'],\n\t\t\t\tsql.identifier(field.name),\n\t\t\t\tcommonStringChunks[' as '],\n\t\t\t\tsql.identifier(key),\n\t\t\t);\n\t\t}\n\t} else if (isChunk(field, kind, chunkKinds.sql)) {\n\t\tdecoderColumn = getColumnFromDecoder(field);\n\t\tfieldType = 'SQL';\n\n\t\tcollectRqbFieldSelection(collectTo, tableRef, key, key, codecs, decoderColumn, inJson);\n\t} else if (isChunk(field, kind, chunkKinds.aliased)) {\n\t\tdecoderColumn = getColumnFromDecoder(field);\n\t\tfieldType = 'SQL.Aliased';\n\n\t\tcollectRqbFieldSelection(collectTo, tableRef, field.fieldAlias, key, codecs, decoderColumn, inJson);\n\t} else if (isChunk(field, kind, chunkKinds.subquery)) {\n\t\tconst innerField = Object.values(field._.selectedFields)[0];\n\t\tconst innerKind = chunkKindOf(innerField);\n\n\t\tif (isChunk(innerField, innerKind, chunkKinds.column)) {\n\t\t\tdecoderColumn = innerField;\n\t\t\tsubqueryDecoder = innerField;\n\t\t} else if (isChunk(innerField, innerKind, chunkKinds.aliased)) {\n\t\t\tdecoderColumn = getColumnFromDecoder(innerField);\n\t\t\tsubqueryDecoder = innerField.sql.decoder;\n\t\t} else if (isChunk(innerField, innerKind, chunkKinds.sql)) {\n\t\t\tdecoderColumn = getColumnFromDecoder(innerField);\n\t\t\tsubqueryDecoder = innerField.decoder;\n\t\t}\n\t\tfieldType = 'Subquery';\n\n\t\tcollectRqbFieldSelection(collectTo, tableRef, field._.alias, key, codecs, decoderColumn, inJson);\n\t} else if (isSQLWrapper(field)) {\n\t\tdecoderColumn = getColumnFromDecoder(field);\n\t\tfieldType = 'SQLWrapper';\n\n\t\tcollectRqbFieldSelection(collectTo, tableRef, key, key, codecs, decoderColumn, inJson);\n\t} else {\n\t\tthrow new DrizzleError({\n\t\t\tmessage: field === undefined\n\t\t\t\t? `Unknown column: \"${tableTsName}\".\"${key}\"`\n\t\t\t\t: `Views and subqueries with nested selections are not supported by the relational query builder`,\n\t\t});\n\t}\n\n\tselection.push(\n\t\t(decoderColumn\n\t\t\t? {\n\t\t\t\tkey,\n\t\t\t\tfield,\n\t\t\t\tfieldType,\n\t\t\t\tsubqueryDecoder,\n\t\t\t\tcodec: !inJson || !(<RqbCustomColumn> decoderColumn).mapFromJsonValue\n\t\t\t\t\t? codecs.get(decoderColumn, inJson ? 'normalizeInJson' : 'normalize')\n\t\t\t\t\t: undefined,\n\t\t\t\tarrayDimensions: (<RqbCustomColumn> decoderColumn).dimensions,\n\t\t\t}\n\t\t\t: {\n\t\t\t\tkey,\n\t\t\t\tfield,\n\t\t\t\tfieldType,\n\t\t\t\tsubqueryDecoder,\n\t\t\t}) as BuildRelationalQueryResult['selection'][number],\n\t);\n}\n\n/** Pushes table's columns selected by relational query separated by commas, returns whether any were selected */\nexport function buildRqbColumns(\n\ttableRef: SQLChunk,\n\tcolumns: Record<string, unknown>,\n\tselection: BuildRelationalQueryResult['selection'],\n\tinJson: boolean,\n\ttableTsName: string,\n\tcodecs: CodecsCollection,\n\tcollectTo: SQLChunk[],\n\tcolumnsConfig?: Record<string, boolean | undefined>,\n): boolean {\n\tconst start = collectTo.length;\n\tif (!columnsConfig) {\n\t\tfor (const k of Object.keys(columns)) {\n\t\t\tif (collectTo.length > start) collectTo.push(commonStringChunks[', ']);\n\t\t\tbuildRqbColumn(tableRef, columns[k], k, inJson, selection, tableTsName, codecs, collectTo);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\tlet colSelectionMode: boolean | undefined;\n\tfor (const k of Object.keys(columnsConfig)) {\n\t\tconst v = columnsConfig[k];\n\t\tif (v === undefined) continue;\n\t\tcolSelectionMode = colSelectionMode || v;\n\n\t\tif (v) {\n\t\t\tif (collectTo.length > start) collectTo.push(commonStringChunks[', ']);\n\t\t\tbuildRqbColumn(tableRef, columns[k], k, inJson, selection, tableTsName, codecs, collectTo);\n\t\t}\n\t}\n\n\tif (colSelectionMode === false) {\n\t\tfor (const k of Object.keys(columns)) {\n\t\t\tif (columnsConfig[k] === false) continue;\n\n\t\t\tif (collectTo.length > start) collectTo.push(commonStringChunks[', ']);\n\t\t\tbuildRqbColumn(tableRef, columns[k], k, inJson, selection, tableTsName, codecs, collectTo);\n\t\t}\n\t}\n\n\treturn collectTo.length > start;\n}\n\n// `Subquery` instances used in relational queries are collected into `WITH` on query's root level, table cache keys are collected for cache invalidation\nexport interface RelationalWithSubqueries {\n\tsubqueries: Map<string, Subquery>;\n\t/** Cache keys of tables query is built from, collected only when query is cached */\n\tusedTables?: Set<string>;\n}\nexport function collectSubqueryAndUsedTables(\n\tcollector: RelationalWithSubqueries,\n\tentity: SchemaEntry | undefined,\n): void {\n\tconst kind = chunkKindOf(entity);\n\tif (collector.usedTables !== undefined && isChunk(entity, kind, chunkKinds.table)) {\n\t\tcollector.usedTables.add(entity[CacheKey]);\n\t\treturn;\n\t}\n\n\tif (!isChunk(entity, kind, chunkKinds.subquery)) return;\n\n\tconst name = entity._.alias;\n\tconst existing = collector.subqueries.get(name);\n\n\tif (existing && existing._.sql !== entity._.sql) {\n\t\tthrow new DrizzleError({\n\t\t\tmessage:\n\t\t\t\t`Different subqueries with the same alias \"${name}\" are used in a single relational query - make sure every subquery in schema has a unique alias`,\n\t\t});\n\t}\n\n\tcollector.subqueries.set(name, entity);\n}\n\nexport function getTableAsAliasSQL(table: SchemaEntry, collectTo: SQLChunk[] = []): SQLChunk[] {\n\tif (!table[IsAlias]) {\n\t\tcollectTo.push(table);\n\t\treturn collectTo;\n\t}\n\n\tconst schema = table[TableSchema];\n\tif (schema) collectTo.push(sql.identifier(schema), commonStringChunks['.']);\n\tcollectTo.push(sql.identifier(table[OriginalName]), commonStringChunks[' as '], table[Qualifier]);\n\n\treturn collectTo;\n}\n\nexport const EmptyFilter = Symbol.for('drizzle:EmptyFilter');\nexport type EmptyFilter = typeof EmptyFilter;\n", "import { aliasedTable, aliasedTableSQL, getOriginalColumnFromAlias } from '~/alias.ts';\nimport { CodecsCollection } from '~/codecs.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport {\n\ttype AnyOne,\n\t// AggregatedField,\n\ttype BuildRelationalQueryConfig,\n\ttype BuildRelationalQueryResult,\n\tbuildRqbColumns,\n\tcollectSubqueryAndUsedTables,\n\ttype DBQueryConfig,\n\tgetTableAsAliasSQL,\n\tmakeDefaultRqbMapper,\n\tmakeJitRqbMapper,\n\trelationalQueryWhereToSQL,\n\ttype RelationalRowsMapperGenerator,\n\ttype RelationalWithSubqueries,\n\trelationExtrasToSQL,\n\trelationsOrderToSQL,\n\trelationToSQL,\n\ttype WithContainer,\n} from '~/relations.ts';\nimport { commonStringChunks, StringChunk } from '~/sql/common-chunks.ts';\nimport type { Name, Placeholder } from '~/sql/index.ts';\nimport { type Query, SQL, sql, type SQLChunk } from '~/sql/sql.ts';\nimport { chunkKindOf, chunkKinds, isChunk, unqualifyColumns } from '~/sql/sql.ts';\nimport { ValueRows } from '~/sql/sql.ts';\nimport { resolveSQLiteTypeAlias, resolveUnionType, type SQLiteCodecs, type SQLiteType } from '~/sqlite-core/codecs.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 type { Subquery } from '~/subquery.ts';\nimport { getTableName, Qualifier, Table, TableColumns } from '~/table.ts';\nimport {\n\tmakeDefaultQueryMapper,\n\tmakeJitQueryMapper,\n\tmemoizeEscape,\n\torderSelectedFields,\n\ttype RowsMapperGenerator,\n\ttype UpdateSet,\n} from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { View } from '~/view.ts';\nimport type {\n\tSelectedFieldsOrdered,\n\tSQLiteSelectConfig,\n\tSQLiteSelectJoinConfig,\n} from './query-builders/select.types.ts';\nimport type { SQLiteViewBase } from './view-base.ts';\n\nexport interface SQLiteDialectConfig {\n\tcodecs?: SQLiteCodecs;\n\tuseJitMappers?: boolean;\n}\n\nconst escapeSQLiteName = memoizeEscape((name) => `\"${name.replace(/\"/g, '\"\"')}\"`);\n// Stored separately - differ per dialect\nconst rqbChunks = {\n\tjson: new StringChunk('json'),\n\tobject: new StringChunk('_object('),\n\tgroupArray: new StringChunk('_group_array(json_object('),\n\tgroupArrayClose: new StringChunk('))'),\n\trelationFrom: new StringChunk(' as \"r\" from ('),\n\trelationClose: new StringChunk(') as \"t\") as '),\n} as const;\n\nexport interface SQLiteBuildRelationalQueryConfig\n\textends Omit<BuildRelationalQueryConfig<DBQueryConfig<'many'>>, 'strategy'>\n{\n\tjsonb: SQL;\n}\n\nexport class SQLiteDialect {\n\tstatic readonly [entityKind]: string = 'SQLiteDialect';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\treadonly codecs: CodecsCollection<SQLiteType>;\n\treadonly mapperGenerators: {\n\t\trows: RowsMapperGenerator;\n\t\trelationalRows: RelationalRowsMapperGenerator;\n\t};\n\n\tconstructor(config?: SQLiteDialectConfig) {\n\t\tthis.codecs = new CodecsCollection<SQLiteType>(resolveSQLiteTypeAlias, config?.codecs);\n\t\tthis.mapperGenerators = config?.useJitMappers\n\t\t\t? {\n\t\t\t\trows: makeJitQueryMapper,\n\t\t\t\trelationalRows: makeJitRqbMapper,\n\t\t\t}\n\t\t\t: {\n\t\t\t\trows: makeDefaultQueryMapper,\n\t\t\t\trelationalRows: makeDefaultRqbMapper,\n\t\t\t};\n\t}\n\n\tescapeName(name: string): string {\n\t\treturn escapeSQLiteName(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 queriesLen = queries.length;\n\t\tconst withSqlChunks: SQLChunk[] = new Array(queriesLen + 1);\n\t\tlet writeIdx = 0;\n\t\twithSqlChunks[writeIdx++] = commonStringChunks['with '];\n\n\t\tfor (let i = 0; i < queriesLen; ++i) {\n\t\t\tconst w = queries[i]!;\n\t\t\twithSqlChunks[writeIdx++] = (i < queriesLen - 1)\n\t\t\t\t? sql`${sql.identifier(w._.alias)} as (${w._.sql}), `\n\t\t\t\t: sql`${sql.identifier(w._.alias)} as (${w._.sql}) `;\n\t\t}\n\n\t\treturn new SQL(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({\n\t\ttable,\n\t\twhere,\n\t\treturning,\n\t\twithList,\n\t\tlimit,\n\t\torderBy,\n\t\tuseSelectionCastCodecs,\n\t}: SQLiteDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${\n\t\t\t\tthis.buildSelection(returning, { isSingleTable: true, ignoreCastCodecs: !useSelectionCastCodecs, table })\n\t\t\t}`\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(\n\t\t\t(colName) =>\n\t\t\t\tset[colName] !== undefined\n\t\t\t\t|| tableColumns[colName]?.onUpdateFn !== undefined,\n\t\t);\n\n\t\tconst setLength = columnNames.length;\n\t\tconst setArr: SQLChunk[] = new Array(setLength);\n\n\t\tfor (let i = 0; i < columnNames.length; ++i) {\n\t\t\tconst colName = columnNames[i]!;\n\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\tlet value;\n\t\t\tif (set[colName] !== undefined) {\n\t\t\t\tvalue = set[colName];\n\t\t\t} else {\n\t\t\t\tconst updateRes = col.onUpdateFn?.();\n\t\t\t\tvalue = is(updateRes, SQL) ? updateRes : sql.param(updateRes, col);\n\t\t\t}\n\n\t\t\tsetArr[i] = i < setLength - 1\n\t\t\t\t? sql`${sql.identifier(col.name)} = ${value}, `\n\t\t\t\t: sql`${sql.identifier(col.name)} = ${value}`;\n\t\t}\n\n\t\treturn new SQL(setArr);\n\t}\n\n\tbuildUpdateQuery({\n\t\ttable,\n\t\tset,\n\t\twhere,\n\t\treturning,\n\t\twithList,\n\t\tjoins,\n\t\tfrom,\n\t\tlimit,\n\t\torderBy,\n\t\tuseSelectionCastCodecs,\n\t}: SQLiteUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst fromSql = from && new SQL([commonStringChunks[' from '], this.buildFromTable(from)]);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${\n\t\t\t\tthis.buildSelection(returning, { isSingleTable: true, ignoreCastCodecs: !useSelectionCastCodecs, table })\n\t\t\t}`\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, ignoreCastCodecs = false, table }: {\n\t\t\tisSingleTable?: boolean;\n\t\t\tignoreCastCodecs?: boolean;\n\t\t\ttable?: SQLiteTable | SQLiteViewBase | SQL | Subquery;\n\t\t} = {},\n\t): SQL {\n\t\tconst { length: columnsLen } = fields;\n\t\tconst chunks: SQLChunk[] = [];\n\t\tconst tableKind = chunkKindOf(table);\n\t\tconst tableName = table\n\t\t\t? isChunk(table, tableKind, chunkKinds.sql) || isChunk(table, tableKind, chunkKinds.subquery)\n\t\t\t\t? undefined\n\t\t\t\t: (table[Table.Symbol.IsAlias] || table[Table.Symbol.Schema] === undefined\n\t\t\t\t\t? table[Table.Symbol.Name]\n\t\t\t\t\t: `${table[Table.Symbol.Schema]}.${table[Table.Symbol.Name]}`)\n\t\t\t: undefined;\n\n\t\tfor (let i = 0; i < columnsLen; ++i) {\n\t\t\tconst { field, codecOverride, column, fieldType } = fields[i]!;\n\t\t\tconst override = codecOverride as SQLiteType | undefined;\n\n\t\t\tswitch (fieldType) {\n\t\t\t\tcase 'Column': {\n\t\t\t\t\tlet name: Name | Column;\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tname = field.isAlias\n\t\t\t\t\t\t\t? sql.identifier(getOriginalColumnFromAlias(field).name)\n\t\t\t\t\t\t\t: sql.identifier(field.name);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tname = field.isAlias ? getOriginalColumnFromAlias(field) : field;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst casted = ignoreCastCodecs ? name : this.codecs.apply(field, 'cast', name, override);\n\t\t\t\t\tchunks.push(field.isAlias ? sql`${casted} as ${field}` : casted);\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'SQL.Aliased': {\n\t\t\t\t\tif (field.isSelectionField) {\n\t\t\t\t\t\tconst query = !isSingleTable && field.origin !== undefined\n\t\t\t\t\t\t\t? sql`${sql.identifier(field.origin)}.${sql.identifier(field.fieldAlias)}`\n\t\t\t\t\t\t\t: sql.identifier(field.fieldAlias);\n\t\t\t\t\t\tif (column && !ignoreCastCodecs) chunks.push(this.codecs.apply(column, 'cast', query, override));\n\t\t\t\t\t\telse chunks.push(query);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (isSingleTable && tableName !== undefined) {\n\t\t\t\t\t\t\tconst { queryChunks } = field.sql;\n\t\t\t\t\t\t\tconst newChunks: SQLChunk[] = new Array(queryChunks.length);\n\t\t\t\t\t\t\tlet abort = false;\n\n\t\t\t\t\t\t\tfor (let i = 0; i < queryChunks.length; ++i) {\n\t\t\t\t\t\t\t\tconst c = queryChunks[i]!;\n\t\t\t\t\t\t\t\tif (is(c, Column)) {\n\t\t\t\t\t\t\t\t\tconst { table } = c;\n\t\t\t\t\t\t\t\t\tconst columnTableName = table[Table.Symbol.IsAlias] || table[Table.Symbol.Schema] === undefined\n\t\t\t\t\t\t\t\t\t\t? table[Table.Symbol.Name]\n\t\t\t\t\t\t\t\t\t\t: `${table[Table.Symbol.Schema]}.${table[Table.Symbol.Name]}`;\n\t\t\t\t\t\t\t\t\tif (columnTableName !== tableName) {\n\t\t\t\t\t\t\t\t\t\tabort = true;\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tnewChunks[i] = sql.identifier(c.name);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tnewChunks[i] = c;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (abort) {\n\t\t\t\t\t\t\t\tchunks.push(\n\t\t\t\t\t\t\t\t\tcolumn && !ignoreCastCodecs ? this.codecs.apply(column, 'cast', field.sql, override) : field.sql,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tconst newSql = new SQL(newChunks);\n\n\t\t\t\t\t\t\t\tif (field.sql.shouldInlineParams) newSql.inlineParams();\n\t\t\t\t\t\t\t\tchunks.push(\n\t\t\t\t\t\t\t\t\tcolumn && !ignoreCastCodecs ? this.codecs.apply(column, 'cast', newSql, override) : newSql,\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tchunks.push(\n\t\t\t\t\t\t\t\tcolumn && !ignoreCastCodecs ? this.codecs.apply(column, 'cast', field.sql, override) : field.sql,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tchunks.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'SQL': {\n\t\t\t\t\tif (isSingleTable && tableName !== undefined) {\n\t\t\t\t\t\tconst { queryChunks } = field;\n\t\t\t\t\t\tconst newChunks: SQLChunk[] = new Array(queryChunks.length);\n\t\t\t\t\t\tlet abort = false;\n\n\t\t\t\t\t\tfor (let i = 0; i < queryChunks.length; ++i) {\n\t\t\t\t\t\t\tconst c = queryChunks[i]!;\n\t\t\t\t\t\t\tif (is(c, Column)) {\n\t\t\t\t\t\t\t\tconst { table } = c;\n\t\t\t\t\t\t\t\tconst columnTableName = table[Table.Symbol.IsAlias] || table[Table.Symbol.Schema] === undefined\n\t\t\t\t\t\t\t\t\t? table[Table.Symbol.Name]\n\t\t\t\t\t\t\t\t\t: `${table[Table.Symbol.Schema]}.${table[Table.Symbol.Name]}`;\n\t\t\t\t\t\t\t\tif (columnTableName !== tableName) {\n\t\t\t\t\t\t\t\t\tabort = true;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tnewChunks[i] = sql.identifier(c.name);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tnewChunks[i] = c;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (abort) {\n\t\t\t\t\t\t\tchunks.push(column && !ignoreCastCodecs ? this.codecs.apply(column, 'cast', field, override) : field);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst newSql = new SQL(newChunks);\n\t\t\t\t\t\t\tif (field.shouldInlineParams) newSql.inlineParams();\n\t\t\t\t\t\t\tchunks.push(column && !ignoreCastCodecs ? this.codecs.apply(column, 'cast', newSql, override) : newSql);\n\t\t\t\t\t\t}\n\t\t\t\t\t} else chunks.push(column && !ignoreCastCodecs ? this.codecs.apply(column, 'cast', field, override) : field);\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase 'Subquery': {\n\t\t\t\t\tif (!field._.isWith) {\n\t\t\t\t\t\tconst inner = sql`(${field._.sql})`;\n\t\t\t\t\t\tchunks.push(\n\t\t\t\t\t\t\tsql`${column && !ignoreCastCodecs ? this.codecs.apply(column, 'cast', inner, override) : inner} ${\n\t\t\t\t\t\t\t\tsql.identifier(field._.alias)\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\tchunks.push(column && !ignoreCastCodecs ? this.codecs.apply(column, 'cast', field, override) : field);\n\t\t\t\t\t}\n\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (i < columnsLen - 1) {\n\t\t\t\tchunks.push(commonStringChunks[', ']);\n\t\t\t}\n\t\t}\n\n\t\treturn new SQL(chunks);\n\t}\n\n\tprivate buildJoins(\n\t\tjoins: SQLiteSelectJoinConfig[] | undefined,\n\t): SQL | undefined {\n\t\tif (!joins || joins.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tconst joinsArray: SQLChunk[] = [];\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(commonStringChunks[' ']);\n\t\t\t\t}\n\t\t\t\tconst table = joinMeta.table;\n\t\t\t\tconst onSql = joinMeta.on ? sql` on ${joinMeta.on}` : undefined;\n\n\t\t\t\tif (is(table, SQLiteTable)) {\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${new StringChunk(joinMeta.joinType)} join ${\n\t\t\t\t\t\t\ttable[Table.Symbol.IsAlias] ? aliasedTableSQL(table) : table\n\t\t\t\t\t\t}${onSql}`,\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`${new StringChunk(joinMeta.joinType)} join ${table}${onSql}`,\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(commonStringChunks[' ']);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new SQL(joinsArray);\n\t}\n\n\tprivate buildLimit(limit: number | Placeholder | undefined): SQL | undefined {\n\t\treturn typeof limit === 'object'\n\t\t\t\t|| (typeof limit === 'number')\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\t}\n\n\tprivate buildOrderBy(\n\t\torderBy: (SQLiteColumn | SQL | SQL.Aliased)[] | undefined,\n\t): SQL | undefined {\n\t\tconst orderByList: SQLChunk[] = [];\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(commonStringChunks[', ']);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn orderByList.length > 0\n\t\t\t? sql` order by ${sql.join(orderByList)}`\n\t\t\t: 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.IsAlias]) return aliasedTableSQL(table);\n\n\t\tif (is(table, View) && table[ViewBaseConfig].isAlias) {\n\t\t\tlet fullName = sql`${sql.identifier(table[ViewBaseConfig].originalName)}`;\n\t\t\tif (table[ViewBaseConfig].schema) {\n\t\t\t\tfullName = sql`${sql.identifier(table[ViewBaseConfig].schema)}.${fullName}`;\n\t\t\t}\n\t\t\treturn sql`${fullName} ${sql.identifier(table[ViewBaseConfig].name)}`;\n\t\t}\n\n\t\treturn table;\n\t}\n\n\tbuildSelectQuery({\n\t\twithList,\n\t\tfields,\n\t\tfieldsFlat,\n\t\twhere,\n\t\thaving,\n\t\ttable,\n\t\tjoins,\n\t\torderBy,\n\t\tgroupBy,\n\t\tlimit,\n\t\toffset,\n\t\tdistinct,\n\t\tsetOperators,\n\t\tuseSelectionCastCodecs,\n\t}: SQLiteSelectConfig): SQL {\n\t\tconst fieldsList = fieldsFlat ?? orderSelectedFields<SQLiteColumn>(fields, undefined, this.codecs);\n\n\t\tconst tableKind = chunkKindOf(table);\n\t\tconst ownTableName = isChunk(table, tableKind, chunkKinds.subquery)\n\t\t\t? table._.alias\n\t\t\t: isChunk(table, tableKind, chunkKinds.view)\n\t\t\t? table[ViewBaseConfig].name\n\t\t\t: isChunk(table, tableKind, chunkKinds.sql)\n\t\t\t? undefined\n\t\t\t: getTableName(table);\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) !== ownTableName\n\t\t\t\t&& !((table) =>\n\t\t\t\t\tjoins?.some(\n\t\t\t\t\t\t({ alias }) =>\n\t\t\t\t\t\t\talias\n\t\t\t\t\t\t\t\t=== (table[Table.Symbol.IsAlias]\n\t\t\t\t\t\t\t\t\t? getTableName(table)\n\t\t\t\t\t\t\t\t\t: 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\t\t'->',\n\t\t\t\t\t\t)\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, {\n\t\t\tisSingleTable,\n\t\t\ttable,\n\t\t\tignoreCastCodecs: !useSelectionCastCodecs || setOperators.length > 0,\n\t\t});\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: SQLChunk[] = [];\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(commonStringChunks[', ']);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst groupBySql = groupByList.length > 0\n\t\t\t? sql` group by ${sql.join(groupByList)}`\n\t\t\t: 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, fieldsList, useSelectionCastCodecs, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(\n\t\tleftSelect: SQL,\n\t\toutputSelection: SelectedFieldsOrdered,\n\t\tuseSelectionCastCodecs: boolean | undefined,\n\t\tsetOperators: SQLiteSelectConfig['setOperators'],\n\t): SQL {\n\t\tfor (let i = 0; i < setOperators.length; ++i) {\n\t\t\tconst setOperator = setOperators[i]!;\n\n\t\t\tleftSelect = this.buildSetOperationQuery({ leftSelect, setOperator });\n\n\t\t\tconst rightSelection = orderSelectedFields(setOperator.rightSelect.getSelectedFields());\n\t\t\tfor (let j = 0; j < outputSelection.length; ++j) {\n\t\t\t\tconst l = outputSelection[j]!;\n\t\t\t\tconst lPath = l.path.join('.');\n\t\t\t\tconst r = rightSelection.find((e) => e.path.join('.') === lPath)!; // Equivalency of selections is a pre-requisite for unions\n\n\t\t\t\tconst lc = (l.codecOverride ?? l.column?.codec) as SQLiteType | undefined;\n\t\t\t\tconst rc = (r.codecOverride ?? r.column?.codec) as SQLiteType | undefined;\n\n\t\t\t\tl.codecOverride = lc && rc ? resolveUnionType(lc, rc) : lc;\n\t\t\t}\n\t\t}\n\n\t\tfor (let i = 0; i < outputSelection.length; ++i) {\n\t\t\tconst out = outputSelection[i]!;\n\t\t\tout.codec = out.codecOverride\n\t\t\t\t? this.codecs.get(out.column!, 'normalize', out.codecOverride as SQLiteType)\n\t\t\t\t: out.codec;\n\t\t}\n\n\t\treturn !useSelectionCastCodecs ? leftSelect : sql`select ${\n\t\t\tthis.buildSelection(\n\t\t\t\toutputSelection.map((field) => {\n\t\t\t\t\tif (field.fieldType === 'SQL.Aliased') {\n\t\t\t\t\t\tconst ref = field.field.clone();\n\t\t\t\t\t\tref.isSelectionField = true;\n\t\t\t\t\t\treturn { ...field, field: ref, fieldType: 'SQL.Aliased' };\n\t\t\t\t\t}\n\t\t\t\t\tif (field.fieldType === 'Column' && field.field.isAlias) {\n\t\t\t\t\t\tconst ref = new SQL.Aliased(sql`${sql.identifier(field.field.name)}`, field.field.name);\n\t\t\t\t\t\tref.isSelectionField = true;\n\t\t\t\t\t\treturn { ...field, field: ref, fieldType: 'SQL.Aliased' };\n\t\t\t\t\t}\n\t\t\t\t\tif (field.fieldType === 'Subquery') {\n\t\t\t\t\t\tconst ref = new SQL.Aliased(sql`${field.field.getSQL()}`, field.field._.alias);\n\t\t\t\t\t\tref.isSelectionField = true;\n\t\t\t\t\t\treturn { ...field, field: ref, fieldType: 'SQL.Aliased' };\n\t\t\t\t\t}\n\t\t\t\t\treturn field;\n\t\t\t\t}),\n\t\t\t\t{\n\t\t\t\t\tisSingleTable: true,\n\t\t\t\t\tignoreCastCodecs: !useSelectionCastCodecs,\n\t\t\t\t},\n\t\t\t)\n\t\t} from (${leftSelect}) ${sql.identifier('drizzle_union')}`;\n\t}\n\n\tbuildSetOperationQuery({\n\t\tleftSelect,\n\t\tsetOperator: { type, isAll, rightSelect, limit, orderBy, offset },\n\t}: {\n\t\tleftSelect: SQL;\n\t\tsetOperator: SQLiteSelectConfig['setOperators'][number];\n\t}): 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\torderByValues.push(sql`${unqualifyColumns(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, commonStringChunks[', '])}`;\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 = new StringChunk(`${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\ttable,\n\t\tvalues: valuesOrSelect,\n\t\tonConflict,\n\t\treturning,\n\t\twithList,\n\t\tselect,\n\t\tcolumnList,\n\t\tuseSelectionCastCodecs,\n\t}: SQLiteInsertConfig): SQL {\n\t\t// const isSingleValue = values.length === 1;\n\t\tconst columns: Record<string, SQLiteColumn> = table[Table.Symbol.Columns];\n\n\t\tconst colEntries: [string, SQLiteColumn][] = columnList\n\t\t\t? columnList.map((name) => [name, columns[name]!])\n\t\t\t: Object.entries(columns);\n\t\tconst colEntriesFiltered: [string, SQLiteColumn][] = select && !is(valuesOrSelect, SQL)\n\t\t\t? Object\n\t\t\t\t.keys((valuesOrSelect as TypedQueryBuilder<any>).getSelectedFields())\n\t\t\t\t.map((key) => [key, columns[key]] as [string, SQLiteColumn])\n\t\t\t: colEntries.filter(([_, col]) => !col.shouldDisableInsert());\n\n\t\tconst insertOrderArr: SQLChunk[] = new Array(colEntriesFiltered.length * 2 + 1);\n\t\tlet writeIdx = 0;\n\t\tinsertOrderArr[writeIdx++] = commonStringChunks['('];\n\t\tfor (let i = 0; i < colEntriesFiltered.length; ++i) {\n\t\t\tconst [, { name }] = colEntriesFiltered[i]!;\n\t\t\tinsertOrderArr[writeIdx++] = sql.identifier(name);\n\n\t\t\tif (i < colEntriesFiltered.length - 1) insertOrderArr[writeIdx++] = commonStringChunks[', '];\n\t\t}\n\t\tinsertOrderArr[writeIdx++] = commonStringChunks[')'];\n\t\tconst insertOrder = new SQL(insertOrderArr);\n\n\t\tlet valuesSqlList: SQLChunk[];\n\n\t\tif (select) {\n\t\t\tvaluesSqlList = [(valuesOrSelect as AnySQLiteSelectQueryBuilder | SQL).getSQL()];\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, unknown>[];\n\t\t\tconst cells: unknown[] = new Array(values.length * colEntriesFiltered.length);\n\n\t\t\tlet writeIdx = 0;\n\n\t\t\tfor (let valueIndex = 0; valueIndex < values.length; ++valueIndex) {\n\t\t\t\tconst value = values[valueIndex]!;\n\n\t\t\t\tfor (let i = 0; i < colEntriesFiltered.length; ++i) {\n\t\t\t\t\tconst [fieldName, col] = colEntriesFiltered[i]!;\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (colValue === undefined) {\n\t\t\t\t\t\tif (col.defaultFn !== undefined) {\n\t\t\t\t\t\t\tcells[writeIdx++] = col.defaultFn();\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 !== null && col.default !== undefined) {\n\t\t\t\t\t\t\tcells[writeIdx++] = col.default;\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.onUpdateFn !== undefined) {\n\t\t\t\t\t\t\tcells[writeIdx++] = col.onUpdateFn();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcells[writeIdx++] = commonStringChunks['null'];\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tcells[writeIdx++] = colValue;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvaluesSqlList = [commonStringChunks['values '], new ValueRows(cells, colEntriesFiltered.map(([, col]) => col))];\n\t\t}\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst valuesSql = new SQL(valuesSqlList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${\n\t\t\t\tthis.buildSelection(returning, { isSingleTable: true, ignoreCastCodecs: !useSelectionCastCodecs, table })\n\t\t\t}`\n\t\t\t: undefined;\n\n\t\tconst onConflictSql = onConflict?.length ? sql.join(onConflict) : 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): Query {\n\t\treturn sql.toQuery({\n\t\t\tescapeName: this.escapeName,\n\t\t\tescapeParam: this.escapeParam,\n\t\t\tescapeString: this.escapeString,\n\t\t\tcodecs: this.codecs,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\n\tbuildRelationalQuery(\n\t\tconfig: Omit<SQLiteBuildRelationalQueryConfig, 'through'>,\n\t): BuildRelationalQueryResult {\n\t\tconst chunks: SQLChunk[] = [];\n\t\tconst selection = this.collectRelationalQuery(config, chunks);\n\n\t\treturn {\n\t\t\tsql: new SQL(chunks),\n\t\t\tselection,\n\t\t};\n\t}\n\n\tprivate collectRelationalQuery({\n\t\tschema,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\trelationWhere,\n\t\tmode,\n\t\tnested,\n\t\terrorPath,\n\t\tdepth,\n\t\tthrough,\n\t\tjsonb,\n\t\twithSubqueries,\n\t\tusedTables,\n\t}: SQLiteBuildRelationalQueryConfig, collectTo: SQLChunk[]): BuildRelationalQueryResult['selection'] {\n\t\tconst selection: BuildRelationalQueryResult['selection'] = [];\n\t\tconst isSingle = mode === 'first';\n\t\tconst params = config === true ? undefined : config;\n\t\tconst currentPath = errorPath ?? '';\n\t\tconst currentDepth = depth ?? 0;\n\t\tconst collector: RelationalWithSubqueries = withSubqueries ?? { subqueries: new Map(), usedTables };\n\t\tif (!currentDepth) {\n\t\t\tcollectSubqueryAndUsedTables(collector, table);\n\t\t\ttable = aliasedTable(table, `d${currentDepth}`);\n\t\t}\n\t\tconst tableRef = table[Qualifier];\n\n\t\tconst limit = isSingle ? 1 : params?.limit;\n\t\tconst offset = params?.offset;\n\n\t\tconst { sql: where } = relationalQueryWhereToSQL(\n\t\t\ttable,\n\t\t\tparams,\n\t\t\ttableConfig.relations,\n\t\t\tschema,\n\t\t\tcollector,\n\t\t\trelationWhere,\n\t\t);\n\t\tconst order = params?.orderBy\n\t\t\t? relationsOrderToSQL(table, params.orderBy, tableConfig.relations, schema, collector)\n\t\t\t: undefined;\n\n\t\tconst withParam = params ? (params as WithContainer).with : undefined;\n\t\tconst withKeys: string[] = [];\n\t\tif (withParam) {\n\t\t\tfor (const key of Object.keys(withParam)) {\n\t\t\t\tif (withParam[key]) withKeys.push(key);\n\t\t\t}\n\t\t}\n\n\t\t// Reserved for `with` clause, filled once all subqueries are collected\n\t\tconst withIdx = currentDepth ? -1 : collectTo.length;\n\t\tif (!currentDepth) collectTo.push(undefined);\n\n\t\tcollectTo.push(commonStringChunks['select ']);\n\t\tconst hasColumns = buildRqbColumns(\n\t\t\ttableRef,\n\t\t\ttableConfig.table[TableColumns],\n\t\t\tselection,\n\t\t\t!!nested,\n\t\t\ttableConfig.name,\n\t\t\tthis.codecs,\n\t\t\tcollectTo,\n\t\t\tparams?.columns,\n\t\t);\n\t\tlet selected = hasColumns ? 1 : 0;\n\t\tif (params?.extras) {\n\t\t\tconst mark = collectTo.length;\n\t\t\tif (selected) collectTo.push(commonStringChunks[', ']);\n\t\t\tconst extras = relationExtrasToSQL(table, params.extras, this.codecs, !!nested, collectTo);\n\t\t\tselection.push(...extras.selection);\n\t\t\tif (extras.sql) ++selected;\n\t\t\telse collectTo.length = mark;\n\t\t}\n\n\t\tif (!selected && !withKeys.length) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage: `No fields selected for table \"${tableConfig.name}\"${currentPath ? ` (\"${currentPath}\")` : ''}`,\n\t\t\t});\n\t\t}\n\n\t\tfor (const k of withKeys) {\n\t\t\tconst join = withParam![k]!;\n\n\t\t\tconst relation = tableConfig.relations[k];\n\t\t\tif (!relation) throw new DrizzleError({ message: `Unknown relation \"${tableConfig.name}\" -> \"${k}\"` });\n\t\t\tconst isSingle = relation.relationType === 'one';\n\t\t\tcollectSubqueryAndUsedTables(collector, relation.targetTable);\n\t\t\tcollectSubqueryAndUsedTables(collector, relation.throughTable);\n\n\t\t\tconst targetTable = aliasedTable(\n\t\t\t\trelation.targetTable,\n\t\t\t\t`d${currentDepth + 1}`,\n\t\t\t);\n\t\t\tconst throughTable = relation.throughTable\n\t\t\t\t? aliasedTable(relation.throughTable, `tr${currentDepth}`)\n\t\t\t\t: undefined;\n\n\t\t\tconst { filter, joinCondition } = relationToSQL(\n\t\t\t\trelation,\n\t\t\t\ttable,\n\t\t\t\ttargetTable,\n\t\t\t\tthroughTable,\n\t\t\t);\n\n\t\t\tif (selected++) collectTo.push(commonStringChunks[', ']);\n\t\t\t// Reserved for JSON of relation's fields, known once relation's query is built\n\t\t\tconst jsonIdx = collectTo.length;\n\t\t\tcollectTo.push(undefined, rqbChunks.relationFrom);\n\t\t\tconst innerSelection = this.collectRelationalQuery({\n\t\t\t\ttable: targetTable,\n\t\t\t\tmode: isSingle ? 'first' : 'many',\n\t\t\t\tschema,\n\t\t\t\tqueryConfig: join as DBQueryConfig,\n\t\t\t\ttableConfig: schema[relation.targetTableName]!,\n\t\t\t\trelationWhere: filter,\n\t\t\t\tnested: true,\n\t\t\t\terrorPath: `${currentPath.length ? `${currentPath}.` : ''}${k}`,\n\t\t\t\tdepth: currentDepth + 1,\n\t\t\t\twithSubqueries: collector,\n\t\t\t\tthrough: throughTable ? { table: throughTable, condition: joinCondition! } : undefined,\n\t\t\t\tjsonb,\n\t\t\t}, collectTo);\n\t\t\tcollectTo.push(rqbChunks.relationClose, sql.identifier(k));\n\n\t\t\tconst jsonChunks: SQLChunk[] = [\n\t\t\t\tcommonStringChunks['(select '],\n\t\t\t\tnested ? jsonb : rqbChunks.json,\n\t\t\t\tisSingle ? rqbChunks.object : rqbChunks.groupArray,\n\t\t\t];\n\t\t\tfor (let i = 0; i < innerSelection.length; ++i) {\n\t\t\t\tconst s = innerSelection[i]!;\n\t\t\t\tif (i) jsonChunks.push(commonStringChunks[', ']);\n\t\t\t\tjsonChunks.push(new StringChunk(this.escapeString(s.key)), commonStringChunks[', ']);\n\t\t\t\tif (s.selection) {\n\t\t\t\t\tjsonChunks.push(jsonb, commonStringChunks['('], sql.identifier(s.key), commonStringChunks[')']);\n\t\t\t\t} else {\n\t\t\t\t\tjsonChunks.push(sql.identifier(s.key));\n\t\t\t\t}\n\t\t\t}\n\t\t\tjsonChunks.push(isSingle ? commonStringChunks[')'] : rqbChunks.groupArrayClose);\n\t\t\tcollectTo[jsonIdx] = new SQL(jsonChunks);\n\n\t\t\tselection.push({\n\t\t\t\tfield: targetTable,\n\t\t\t\tfieldType: 'Nested',\n\t\t\t\tkey: k,\n\t\t\t\tselection: innerSelection,\n\t\t\t\tisArray: !isSingle,\n\t\t\t\tisOptional: ((relation as AnyOne).optional ?? false)\n\t\t\t\t\t|| (join !== true\n\t\t\t\t\t\t&& !!(join as Exclude<typeof join, boolean | undefined>)\n\t\t\t\t\t\t\t.where),\n\t\t\t});\n\t\t}\n\n\t\tcollectTo.push(commonStringChunks[' from ']);\n\t\tgetTableAsAliasSQL(table, collectTo);\n\t\tif (through) {\n\t\t\tcollectTo.push(commonStringChunks[' inner join ']);\n\t\t\tgetTableAsAliasSQL(through.table, collectTo);\n\t\t\tcollectTo.push(commonStringChunks[' on '], ...through.condition);\n\t\t}\n\t\tif (where) collectTo.push(commonStringChunks[' where '], ...where);\n\t\tif (order) collectTo.push(commonStringChunks[' order by '], ...order);\n\t\tif (limit !== undefined) collectTo.push(commonStringChunks[' limit '], limit as SQLChunk);\n\t\tif (offset !== undefined) collectTo.push(commonStringChunks[' offset '], offset as SQLChunk);\n\n\t\tif (withIdx !== -1) collectTo[withIdx] = this.buildWithCTE([...collector.subqueries.values()]);\n\n\t\treturn selection;\n\t}\n}\n", "import { entityKind } from '~/entity.ts';\nimport { View, type ViewConfig } from '~/view.ts';\n\nexport abstract class SQLiteViewBase<T extends ViewConfig = ViewConfig> extends View<T> {\n\tstatic override readonly [entityKind]: string = 'SQLiteViewBase';\n\n\tdeclare readonly _: View<T>['_'] & {\n\t\treadonly viewBrand: 'SQLiteView';\n\t};\n}\n", "import type { View } from '~/view.ts';\nimport { ColumnTableAliasProxyHandler, TableAliasProxyHandler } from './alias.ts';\nimport { entityKind, is } from './entity.ts';\nimport { chunkKindOf, chunkKinds, isChunk } from './sql/sql.ts';\nimport type { 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\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\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, receiver: any): 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 sourceKind = chunkKindOf(subquery);\n\t\tconst columns = isChunk(subquery, sourceKind, chunkKinds.subquery)\n\t\t\t? subquery._.selectedFields\n\t\t\t: isChunk(subquery, sourceKind, chunkKinds.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\t// value === undefined check must stay for actual selection fields named `getSQL`\n\t\tif (value === undefined && prop === 'getSQL') {\n\t\t\tconst target = subquery[prop as keyof T];\n\t\t\tif (typeof target !== 'function') return target;\n\n\t\t\treturn target.bind(receiver ?? subquery);\n\t\t}\n\n\t\tconst valueKind = chunkKindOf(value);\n\t\tif (isChunk(value, valueKind, chunkKinds.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\tnewValue.origin = this.config.alias;\n\t\t\treturn newValue;\n\t\t}\n\n\t\tif (isChunk(value, valueKind, chunkKinds.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 (isChunk(value, valueKind, chunkKinds.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 ColumnTableAliasProxyHandler(\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, true),\n\t\t\t\t\t\t),\n\t\t\t\t\t\ttrue,\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 { is } from '~/entity.ts';\nimport { collectChunksUsedTables, type SQL } from '~/sql/sql.ts';\nimport { CacheKey, Table } from '~/table.ts';\n\n/**\n * Collects cache keys of tables used for query's cache invalidation\n * `Table` contributes it's cache key, `SQL` - cache key of every table referenced within it\n */\nexport function usedTablesOf(source: Table | SQL): string[] {\n\tif (is(source, Table)) return [source[CacheKey]];\n\tconst out = new Set<string>();\n\tcollectChunksUsedTables(source.queryChunks, out);\n\treturn [...out];\n}\n", "import { entityKind, is } from '~/entity.ts';\nimport type { SQL, SQLWrapper } from '~/sql/index.ts';\n\nexport abstract class TypedQueryBuilder<TSelection, TResult = unknown, TConfig = unknown> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'TypedQueryBuilder';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tdeclare _: {\n\t\tselectedFields: TSelection;\n\t\tresult: TResult;\n\t\tconfig?: TConfig;\n\t};\n\n\t/** @internal */\n\tgetSelectedFields(): TSelection {\n\t\treturn this._.selectedFields;\n\t}\n\n\tabstract getSQL(): SQL;\n}\n", "import type { CacheConfig, WithCacheConfig } from '~/cache/core/types.ts';\nimport { 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 { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { SQL } from '~/sql/sql.ts';\nimport type { ColumnsSelection, Placeholder, Query } 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 { usedTablesOf } from '~/used-tables.ts';\nimport { getTableColumns, getTableLikeName, haveSameKeys, orderSelectedFields, type ValueOrArray } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport { View } from '~/view.ts';\nimport { SQLiteViewBase } from '../view-base.ts';\nimport type {\n\tAnySQLiteSelect,\n\tAnySQLiteSelectQueryBuilder,\n\tGetSQLiteSetOperators,\n\tSelectedFields,\n\tSetOperatorRightSelect,\n\tSQLiteCreateSetOperatorFn,\n\tSQLiteSelectConfig,\n\tSQLiteSelectCrossJoinFn,\n\tSQLiteSelectDynamic,\n\tSQLiteSelectHKTBase,\n\tSQLiteSelectJoinFn,\n\tSQLiteSelectKind,\n\tSQLiteSelectQueryBuilderHKT,\n\tSQLiteSelectWithout,\n\tSQLiteSetOperatorExcludedMethods,\n\tSQLiteSetOperatorWithResult,\n} from './select.types.ts';\n\nexport interface SQLiteSelectBuilderConstructor {\n\tnew(\n\t\tconfig: {\n\t\t\ttable: SQLiteSelectConfig['table'];\n\t\t\tfields: SQLiteSelectConfig['fields'];\n\t\t\tisPartialSelect: boolean;\n\t\t\tsession: SQLiteSession<any, any> | undefined;\n\t\t\tdialect: SQLiteDialect;\n\t\t\twithList: Subquery[];\n\t\t\tdistinct: boolean | undefined;\n\t\t},\n\t): AnySQLiteSelectQueryBuilder;\n}\n\nexport class SQLiteSelectBuilder<\n\tTSelection extends SelectedFields | undefined,\n\tTRunResult,\n\tTHKT extends SQLiteSelectHKTBase = SQLiteSelectQueryBuilderHKT,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteSelectBuilder';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tprivate fields: TSelection;\n\tprivate session: SQLiteSession<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> | undefined;\n\t\t\tdialect: SQLiteDialect;\n\t\t\twithList?: Subquery[];\n\t\t\tdistinct?: boolean;\n\t\t},\n\t\tprivate builder: SQLiteSelectBuilderConstructor = SQLiteSelectBase,\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): SQLiteSelectKind<\n\t\tTHKT,\n\t\tGetSelectTableName<TFrom>,\n\t\tTRunResult,\n\t\tTSelection extends undefined ? GetSelectTableSelection<TFrom> : TSelection,\n\t\tTSelection extends undefined ? 'single' : 'partial',\n\t\tGetSelectTableName<TFrom> extends string ? Record<GetSelectTableName<TFrom>, 'not-null'> : {},\n\t\tfalse,\n\t\tnever\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 this.builder({\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 class SQLiteSelectBase<\n\tTHKT extends SQLiteSelectHKTBase,\n\tTTableName extends string | undefined,\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 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\treadonly config: SQLiteSelectConfig;\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> | undefined;\n\tprotected dialect: SQLiteDialect;\n\tprotected cacheConfig?: WithCacheConfig = undefined;\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> | 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\tconfig: this.config,\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\t/**\n\t * @internal\n\t * Collects every table query's SQL references - `from`, joins, CTEs, set operators, raw SQL & subqueries of fields, filters, etc.\n\t * @param sql - query's already built SQL, to avoid rebuilding it\n\t */\n\tgetUsedTables(sql: SQL = this.getSQL()) {\n\t\treturn usedTablesOf(sql);\n\t}\n\n\tprivate createJoin<TJoinType extends JoinType>(\n\t\tjoinType: TJoinType,\n\t): 'cross' extends TJoinType ? SQLiteSelectCrossJoinFn<this, TDynamic>\n\t\t: SQLiteSelectJoinFn<this, TDynamic, TJoinType>\n\t{\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\tthis.config.fieldsFlat = undefined;\n\t\t\tthis.config.mapper = undefined;\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 'cross':\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\t/**\n\t * Executes a `cross 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 all rows from each table.\n\t *\n\t * See docs: {@link https://orm.drizzle.team/docs/joins#cross-join}\n\t *\n\t * @param table the table to join.\n\t *\n\t * @example\n\t *\n\t * ```ts\n\t * // Select all users, each user with every pet\n\t * const usersWithPets: { user: User; pets: Pet; }[] = await db.select()\n\t * .from(users)\n\t * .crossJoin(pets)\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 * .crossJoin(pets)\n\t * ```\n\t */\n\tcrossJoin = this.createJoin('cross');\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 | SQL.Aliased)[]): 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 | SQL.Aliased)[]): 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$withCache(config?: { config?: CacheConfig; tag?: string; autoInvalidate?: boolean } | false) {\n\t\tthis.cacheConfig = config === undefined\n\t\t\t? { config: {}, enabled: true, autoInvalidate: true }\n\t\t\t: config === false\n\t\t\t? { enabled: false }\n\t\t\t: { enabled: true, autoInvalidate: true, ...config };\n\t\treturn this;\n\t}\n\n\tgetSQL(withCastCodecs = false): SQL {\n\t\tthis.config.fieldsFlat ??= orderSelectedFields<SQLiteColumn>(this.config.fields, undefined, this.dialect.codecs);\n\t\treturn this.dialect.buildSelectQuery(\n\t\t\twithCastCodecs ? { ...this.config, useSelectionCastCodecs: true } : this.config,\n\t\t);\n\t}\n\n\ttoSQL(withCastCodecs = true): Query {\n\t\treturn this.dialect.sqlToQuery(this.getSQL(withCastCodecs));\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\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 } 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\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\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\tconst sql = qb.getSQL();\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tsql,\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, void>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, void>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection | undefined, void> {\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, void>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection, void>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields?: TSelection,\n\t\t): SQLiteSelectBuilder<TSelection | undefined, void> {\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, void>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, void>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields?: TSelection,\n\t): SQLiteSelectBuilder<TSelection | undefined, void> {\n\t\treturn new SQLiteSelectBuilder({ fields: fields ?? undefined, session: undefined, dialect: this.getDialect() });\n\t}\n\n\tselectDistinct(): SQLiteSelectBuilder<undefined, void>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteSelectBuilder<TSelection, void>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields?: TSelection,\n\t): SQLiteSelectBuilder<TSelection | undefined, void> {\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 SQLiteDialect(this.dialectConfig);\n\t\t}\n\n\t\treturn this.dialect;\n\t}\n}\n", "import type { QueryMetadata, WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport type { Query } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\n\nexport interface PreparedQueryConfig {\n\trun: unknown;\n\tall: unknown;\n\tget: unknown;\n\tvalues: unknown;\n\texecute: unknown;\n}\n\nexport interface SQLiteTransactionConfig {\n\tbehavior?: 'deferred' | 'immediate' | 'exclusive' | 'concurrent';\n}\n\nexport type SQLiteExecuteMethod = 'run' | 'all' | 'get' | 'values';\n\nexport abstract class SQLitePreparedQuery implements PreparedQuery {\n\tstatic readonly [entityKind]: string = 'SQLiteBasePreparedQuery';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\t/** @internal */\n\treadonly mapper: {\n\t\t(rows: any[]): any;\n\t\tbody?: string;\n\t} | undefined;\n\t/** @internal */\n\treadonly executeMethod: SQLiteExecuteMethod;\n\n\tconstructor(\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tprotected query: Query,\n\t\tmapper: ((rows: any[]) => any) | undefined,\n\t\treadonly mode: 'arrays' | 'objects' | 'raw',\n\t) {\n\t\tthis.mapper = mapper;\n\t\tthis.executeMethod = executeMethod;\n\t}\n\n\tgetQuery(): Query {\n\t\treturn this.query;\n\t}\n\n\tabstract run(placeholderValues?: Record<string, unknown>): unknown;\n\tabstract all(placeholderValues?: Record<string, unknown>): unknown;\n\tabstract get(placeholderValues?: Record<string, unknown>): unknown;\n\tabstract values(placeholderValues?: Record<string, unknown>): unknown;\n\tabstract execute(placeholderValues?: Record<string, unknown>): unknown;\n}\n\nexport abstract class SQLiteSession<TRunResult = unknown, TRelations extends AnyRelations = EmptyRelations> {\n\tstatic readonly [entityKind]: string = 'SQLiteSession';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tdeclare readonly _: {\n\t\treadonly runResult: TRunResult;\n\t\treadonly relations: TRelations;\n\t};\n\n\tconstructor(\n\t\t/** @internal */\n\t\treadonly dialect: SQLiteDialect,\n\t) {}\n\n\tabstract prepareQuery(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tprepare: boolean,\n\t\texecuteMethod?: SQLiteExecuteMethod,\n\t\tmapper?: (rows: any[]) => any,\n\t\tqueryMetadata?: QueryMetadata,\n\t\tcacheConfig?: WithCacheConfig,\n\t): SQLitePreparedQuery;\n}\n", "import { entityKind } from '~/entity.ts';\nimport type { Query } from '~/sql/sql.ts';\nimport { SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '../dialect.ts';\nimport type { SQLiteSession } from '../session.ts';\nimport type { SQLiteTable } from '../table.ts';\nimport type { SQLiteViewBase } from '../view-base.ts';\n\nexport class SQLiteCountBuilder extends SQL<number> implements SQLWrapper<number> {\n\tstatic override readonly [entityKind]: string = 'SQLiteCountBuilder';\n\n\tprotected dialect: SQLiteDialect;\n\tprotected session: SQLiteSession<any, any>;\n\n\tprivate static buildCount(\n\t\tsource: SQLiteTable | SQLiteViewBase | SQL | SQLWrapper,\n\t\tfilters?: SQL<unknown>,\n\t\tparens?: boolean,\n\t): SQL<number> {\n\t\tconst where = sql` where ${filters}`.if(filters);\n\t\tconst query = sql<number>`select count(*) from ${source}${where}`;\n\n\t\treturn parens ? sql`(${query})` : query;\n\t}\n\n\tconstructor(\n\t\tprotected countConfig: {\n\t\t\tsource: SQLiteTable | SQLiteViewBase | SQL | SQLWrapper;\n\t\t\tfilters?: SQL<unknown>;\n\t\t\tdialect: SQLiteDialect;\n\t\t\tsession: SQLiteSession<any, any>;\n\t\t},\n\t) {\n\t\tsuper(SQLiteCountBuilder.buildCount(countConfig.source, countConfig.filters, true).queryChunks);\n\t\tthis.dialect = countConfig.dialect;\n\t\tthis.session = countConfig.session;\n\t\tthis.mapWith((e) => {\n\t\t\tif (typeof e === 'number') return e;\n\n\t\t\treturn Number(e ?? 0);\n\t\t});\n\t}\n\n\tprivate executableSql: SQL<number> | undefined;\n\tprotected build(): Query {\n\t\tif (!this.executableSql) {\n\t\t\tconst { source, filters } = this.countConfig;\n\t\t\tthis.executableSql = SQLiteCountBuilder.buildCount(source, filters);\n\t\t}\n\n\t\treturn this.dialect.sqlToQuery(this.executableSql);\n\t}\n}\n", "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { ExecuteResultSync } from '~/sqlite-core/async/session.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport { SQLiteCountBuilder } from '~/sqlite-core/query-builders/count.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport type { SQLiteViewBase } from '~/sqlite-core/view-base.ts';\nimport { applyMixins } from '~/utils.ts';\nimport type { SQLiteAsyncSession } from './session.ts';\n\nexport type SQLiteAsyncCountBuilderKind<TMode extends 'sync' | 'async'> = TMode extends 'async'\n\t? SQLiteAsyncCountBuilder\n\t: SQLiteSyncCountBuilder;\n\n// oxlint-disable-next-line no-unused-vars\nexport interface SQLiteAsyncCountBuilder extends SQL<number>, SQLWrapper<number>, QueryPromise<number> {}\n\nexport class SQLiteAsyncCountBuilder extends SQLiteCountBuilder {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncCountBuilder';\n\n\tdeclare protected session: SQLiteAsyncSession<any, any, any>;\n\n\tconstructor(\n\t\tcountConfig: {\n\t\t\tsource: SQLiteTable | SQLiteViewBase | SQL | SQLWrapper;\n\t\t\tfilters?: SQL<unknown>;\n\t\t\tdialect: SQLiteDialect;\n\t\t\tsession: SQLiteAsyncSession<any, any, any>;\n\t\t},\n\t) {\n\t\tsuper(countConfig);\n\t}\n\n\t/** @internal */\n\texecuteRaw(placeholderValues?: Record<string, unknown>): Promise<number> | ExecuteResultSync<number> {\n\t\treturn this.session.prepareQuery(\n\t\t\tthis.build(),\n\t\t\t'arrays',\n\t\t\tfalse,\n\t\t\t'all', // Do not use 'get' - mapper returns an item instead of an array, would break on session's destructuring; query itself is already aggregated into 1 item, so no performance overhead occurs.\n\t\t\t(rows) => {\n\t\t\t\tconst v = rows[0]?.[0];\n\t\t\t\tif (typeof v === 'number') return v;\n\t\t\t\treturn v ? Number(v) : 0;\n\t\t\t},\n\t\t).execute(placeholderValues) as any;\n\t}\n\n\t// async-await to avoid crashing when used on sync drivers with .then(), .catch() for compatibility\n\tasync execute(placeholderValues?: Record<string, unknown>): Promise<number> {\n\t\treturn await (this.executeRaw(placeholderValues));\n\t}\n}\n\napplyMixins(SQLiteAsyncCountBuilder, [QueryPromise]);\n\nexport class SQLiteSyncCountBuilder extends SQLiteAsyncCountBuilder {\n\tstatic override readonly [entityKind]: string = 'SQLiteSyncCountBuilder';\n\n\tsync(placeholderValues?: Record<string, unknown>): number {\n\t\treturn (this.executeRaw(placeholderValues) as ExecuteResultSync<number>).sync();\n\t}\n}\n", "import { entityKind, is } from '~/entity.ts';\nimport {\n\ttype BuildQueryResult,\n\ttype BuildRelationalQueryResult,\n\ttype DBQueryConfigRoot,\n\trelationalQueryUsedTablesInit,\n\ttype RelationalRowsMapper,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n} from '~/relations.ts';\nimport { type Query, type SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '../dialect.ts';\nimport type { SQLiteSession } from '../session.ts';\nimport type { SQLiteTable } from '../table.ts';\n\nexport type SQLiteDBQueryConfigRoot<\n\tTRelationType extends 'one' | 'many' = 'one' | 'many',\n\tTSchema extends TablesRelationalConfig = TablesRelationalConfig,\n\tTTableConfig extends TableRelationalConfig = TableRelationalConfig,\n> = Omit<DBQueryConfigRoot<TRelationType, TSchema, TTableConfig>, 'strategy' | 'comment'>;\n\nexport interface SQLiteRelationalQueryHKTBase {\n\ttype: unknown;\n\tresult: unknown;\n\t_type: unknown;\n}\n\nexport interface SQLiteRelationalQueryHKT extends SQLiteRelationalQueryHKTBase {\n\t_type: SQLiteRelationalQuery<SQLiteRelationalQueryHKT, this['result']>;\n}\n\nexport type SQLiteRelationalQueryKind<\n\tT extends SQLiteRelationalQueryHKTBase,\n\tTType,\n\tTResult,\n> = (T & {\n\ttype: TType;\n\tresult: TResult;\n})['_type'];\n\nexport interface SQLiteRelationalQueryConstructor {\n\tnew(\n\t\tmode: unknown,\n\t\tschema: TablesRelationalConfig,\n\t\ttable: SQLiteTable,\n\t\ttableConfig: TableRelationalConfig,\n\t\tdialect: SQLiteDialect,\n\t\tsession: SQLiteSession<any, any>,\n\t\tconfig: SQLiteDBQueryConfigRoot<'many' | 'one'> | true,\n\t\tqueryMode: 'many' | 'first',\n\t\tforbidJsonb: boolean | undefined,\n\t): AnySQLiteRelationalQuery;\n}\n\nexport type AnySQLiteRelationalQuery = SQLiteRelationalQuery<any, any>;\n\nexport class RelationalQueryBuilder<\n\tTMode,\n\tTSchema extends TablesRelationalConfig,\n\tTFields extends TableRelationalConfig,\n\tTBuilderHKT extends SQLiteRelationalQueryHKTBase = SQLiteRelationalQueryHKT,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteRelationalQueryBuilderV2';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tconstructor(\n\t\tprivate mode: TMode,\n\t\tprivate schema: TSchema,\n\t\tprivate table: SQLiteTable,\n\t\tprivate tableConfig: TableRelationalConfig,\n\t\tprivate dialect: SQLiteDialect,\n\t\tprivate session: SQLiteSession<any, any>,\n\t\tprivate forbidJsonb: boolean | undefined,\n\t\tprivate builder: SQLiteRelationalQueryConstructor = SQLiteRelationalQuery,\n\t) {}\n\n\tfindMany<TConfig extends SQLiteDBQueryConfigRoot<'many', TSchema, TFields>>(\n\t\tconfig?: SQLiteDBQueryConfigRoot<'many', TSchema, TFields> extends TConfig ? TConfig\n\t\t\t: SQLiteDBQueryConfigRoot<'many', TSchema, TFields>,\n\t): SQLiteRelationalQueryKind<TBuilderHKT, TMode, BuildQueryResult<TSchema, TFields, TConfig>[]> {\n\t\treturn new this.builder(\n\t\t\tthis.mode,\n\t\t\tthis.schema,\n\t\t\tthis.table,\n\t\t\tthis.tableConfig,\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tconfig as SQLiteDBQueryConfigRoot<'many'> | undefined ?? true,\n\t\t\t'many',\n\t\t\tthis.forbidJsonb,\n\t\t) as any;\n\t}\n\n\tfindFirst<TConfig extends SQLiteDBQueryConfigRoot<'one', TSchema, TFields>>(\n\t\tconfig?: SQLiteDBQueryConfigRoot<'one', TSchema, TFields> extends TConfig ? TConfig\n\t\t\t: SQLiteDBQueryConfigRoot<'one', TSchema, TFields>,\n\t): SQLiteRelationalQueryKind<TBuilderHKT, TMode, BuildQueryResult<TSchema, TFields, TConfig> | undefined> {\n\t\treturn new this.builder(\n\t\t\tthis.mode,\n\t\t\tthis.schema,\n\t\t\tthis.table,\n\t\t\tthis.tableConfig,\n\t\t\tthis.dialect,\n\t\t\tthis.session,\n\t\t\tconfig as SQLiteDBQueryConfigRoot<'one'> | undefined ?? true,\n\t\t\t'first',\n\t\t\tthis.forbidJsonb,\n\t\t) as any;\n\t}\n}\n\nexport class SQLiteRelationalQuery<THKT extends SQLiteRelationalQueryHKTBase, TResult> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'SQLiteRelationalQueryV2';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\t/** @internal */\n\tprotected mapper?: RelationalRowsMapper;\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly hkt: THKT;\n\t\treadonly result: TResult;\n\t};\n\n\t/** @internal */\n\tmode: 'many' | 'first';\n\t/** @internal */\n\ttable: SQLiteTable;\n\t/** @internal */\n\tresultKind: unknown;\n\n\tconstructor(\n\t\tresultKind: unknown,\n\t\tprotected schema: TablesRelationalConfig,\n\t\ttable: SQLiteTable,\n\t\tprotected tableConfig: TableRelationalConfig,\n\t\tprotected dialect: SQLiteDialect,\n\t\tprotected session: SQLiteSession<any, any>,\n\t\tprotected config: SQLiteDBQueryConfigRoot<'many' | 'one'> | true,\n\t\tmode: 'many' | 'first',\n\t\tprotected forbidJsonb?: boolean,\n\t) {\n\t\tthis.resultKind = resultKind;\n\t\tthis.mode = mode;\n\t\tthis.table = table;\n\t}\n\n\tgetSQL(): SQL {\n\t\treturn this._getQuery().sql;\n\t}\n\n\t/** @internal */\n\t_getQuery(usedTables?: Set<string>) {\n\t\tconst jsonb = this.forbidJsonb ? sql`json` : sql`jsonb`;\n\n\t\treturn this.dialect.buildRelationalQuery({\n\t\t\tschema: this.schema,\n\t\t\ttable: this.table,\n\t\t\ttableConfig: this.tableConfig,\n\t\t\tqueryConfig: this.config,\n\t\t\tmode: this.mode,\n\t\t\tjsonb,\n\t\t\tusedTables,\n\t\t});\n\t}\n\n\tprotected _toSQL(): { query: BuildRelationalQueryResult; builtQuery: Query; usedTables: Set<string> | undefined } {\n\t\tconst usedTables = relationalQueryUsedTablesInit(this.config);\n\t\tconst query = this._getQuery(usedTables);\n\n\t\tconst builtQuery = this.dialect.sqlToQuery(query.sql);\n\n\t\treturn { query, builtQuery, usedTables };\n\t}\n\n\ttoSQL(): Query {\n\t\treturn this._toSQL().builtQuery;\n\t}\n}\n", "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport { relationalQueryCacheConfig, relationalQueryCacheMetadata } from '~/relations.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport { SQLiteRelationalQuery, type SQLiteRelationalQueryHKTBase } from '~/sqlite-core/query-builders/query.ts';\nimport { applyMixins, type Assume } from '~/utils.ts';\nimport type { PreparedQueryConfig } from '../session.ts';\nimport type { SQLiteAsyncPreparedQuery, SQLiteAsyncSession } from './session.ts';\n\nexport interface SQLiteAsyncRelationalQueryHKT extends SQLiteRelationalQueryHKTBase {\n\t_type: SQLiteAsyncRelationalQueryKind<Assume<this['type'], 'sync' | 'async'>, this['result']>;\n}\n\nexport type SQLiteAsyncRelationalQueryKind<TType extends 'sync' | 'async', TResult> = TType extends 'async'\n\t? SQLiteAsyncRelationalQuery<'async', TResult>\n\t: SQLiteSyncRelationalQuery<TResult>;\n\nexport type AnySQLiteAsyncRelationalQuery = SQLiteAsyncRelationalQuery<any, any>;\n\n// oxlint-disable-next-line no-unused-vars\nexport interface SQLiteAsyncRelationalQuery<TType extends 'sync' | 'async', TResult> extends QueryPromise<TResult> {}\n\nexport class SQLiteAsyncRelationalQuery<TType extends 'sync' | 'async', TResult>\n\textends SQLiteRelationalQuery<SQLiteAsyncRelationalQueryHKT, TResult>\n\timplements RunnableQuery<TResult, 'sqlite'>\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncRelationalQueryV2';\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly hkt: SQLiteAsyncRelationalQueryHKT;\n\t\treadonly type: TType;\n\t\treadonly result: TResult;\n\t};\n\n\tdeclare protected session: SQLiteAsyncSession<TType, any, any>;\n\n\t/** @internal */\n\t_prepare(\n\t\tprepare = false,\n\t): SQLiteAsyncPreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }> {\n\t\tconst { query, builtQuery, usedTables } = this._toSQL();\n\n\t\tconst mapper = this.mapper ??= this.dialect.mapperGenerators.relationalRows({\n\t\t\tisFirst: this.mode === 'first',\n\t\t\tparseJson: true,\n\t\t\tparseJsonIfString: false,\n\t\t\trootJsonMappers: false,\n\t\t\tselection: query.selection,\n\t\t\tarrayModeRoot: true,\n\t\t});\n\n\t\treturn this.session.prepareQuery(\n\t\t\tbuiltQuery,\n\t\t\t'arrays',\n\t\t\tprepare,\n\t\t\t// Do not use 'get' - mapper returns an item instead of an array, would break on session's destructuring; query itself is already limited to 1 item, so no performance overhead occurs.\n\t\t\t'all',\n\t\t\tmapper,\n\t\t\trelationalQueryCacheMetadata(this.config, query.sql, usedTables, this),\n\t\t\trelationalQueryCacheConfig(this.config),\n\t\t) as SQLiteAsyncPreparedQuery<PreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }>;\n\t}\n\n\tprepare(): SQLiteAsyncPreparedQuery<\n\t\tPreparedQueryConfig & { type: TType; all: TResult; get: TResult; execute: TResult }\n\t> {\n\t\treturn this._prepare(true);\n\t}\n\n\tasync execute(placeholderValues?: Record<string, unknown>): Promise<TResult> {\n\t\treturn this._prepare().execute(placeholderValues) as Promise<TResult>;\n\t}\n}\n\nexport class SQLiteSyncRelationalQuery<TResult> extends SQLiteAsyncRelationalQuery<'sync', TResult> {\n\tstatic override readonly [entityKind]: string = 'SQLiteSyncRelationalQueryV2';\n\n\tsync(placeholderValues?: Record<string, unknown>): TResult {\n\t\treturn this._prepare().execute(placeholderValues).sync() as TResult;\n\t}\n}\n\napplyMixins(SQLiteAsyncRelationalQuery, [QueryPromise]);\n", "import { entityKind, is } from '~/entity.ts';\nimport type { SelectResultFields } from '~/query-builders/select.types.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 { 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 Assume, orderSelectedFields, type ValueOrArray } from '~/utils.ts';\nimport type { SQLiteColumn } from '../columns/common.ts';\nimport type { SelectedFieldsFlat, SelectedFieldsOrdered } from './select.types.ts';\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\tuseSelectionCastCodecs?: boolean;\n}\n\nexport interface SQLiteDeleteHKTBase {\n\ttable: unknown;\n\tresultType: unknown;\n\trunResult: unknown;\n\treturning: unknown;\n\tdynamic: boolean;\n\texcludedMethods: string;\n\tresult: unknown;\n\t_type: unknown;\n}\n\nexport interface SQLiteDeleteQueryBuilderHKT extends SQLiteDeleteHKTBase {\n\t_type: SQLiteDeleteBase<\n\t\tSQLiteDeleteQueryBuilderHKT,\n\t\tAssume<this['table'], SQLiteTable>,\n\t\tthis['runResult'],\n\t\tAssume<this['returning'], Record<string, unknown> | undefined>,\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods']\n\t>;\n}\n\nexport type SQLiteDeleteKind<\n\tT extends SQLiteDeleteHKTBase,\n\tTTable extends SQLiteTable,\n\tTRunResult,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> = (T & {\n\ttable: TTable;\n\trunResult: TRunResult;\n\treturning: TReturning;\n\tdynamic: TDynamic;\n\texcludedMethods: TExcludedMethods;\n\tresult: TReturning extends undefined ? TRunResult : TReturning[];\n})['_type'];\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\tSQLiteDeleteKind<\n\t\t\tT['_']['hkt'],\n\t\t\tT['_']['table'],\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\tTRunResult = unknown,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n> = SQLiteDeleteBase<SQLiteDeleteQueryBuilderHKT, TTable, TRunResult, TReturning, true, never>;\n\nexport type SQLiteDeleteReturningAll<\n\tT extends AnySQLiteDeleteBase,\n\tTDynamic extends boolean,\n> = SQLiteDeleteWithout<\n\tSQLiteDeleteKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['table'],\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\tSQLiteDeleteKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['table'],\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 SQLiteDeleteDynamic<T extends AnySQLiteDeleteBase> = SQLiteDeleteKind<\n\tT['_']['hkt'],\n\tT['_']['table'],\n\tT['_']['runResult'],\n\tT['_']['returning'],\n\ttrue,\n\tnever\n>;\n\nexport type AnySQLiteDeleteBase = SQLiteDeleteBase<any, any, any, any, any, any>;\n\nexport interface SQLiteDeleteBase<\n\tTHKT extends SQLiteDeleteHKTBase,\n\tTTable extends SQLiteTable,\n\tTRunResult,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends SQLWrapper {\n\treadonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly hkt: THKT;\n\t\treadonly table: TTable;\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\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTHKT extends SQLiteDeleteHKTBase,\n\tTTable extends SQLiteTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTRunResult,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\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> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'SQLiteDelete';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\t/** @internal */\n\tconfig: SQLiteDeleteConfig;\n\n\tconstructor(\n\t\tprivate table: TTable,\n\t\tprotected session: SQLiteSession<any, any>,\n\t\tprotected dialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t) {\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> | SQLiteDeleteReturningAll<this, TDynamic> {\n\t\tthis.config.returning = orderSelectedFields<SQLiteColumn>(fields, undefined, this.dialect.codecs);\n\t\treturn this as any;\n\t}\n\n\tgetSQL(withCastCodecs = false): SQL {\n\t\treturn this.dialect.buildDeleteQuery(\n\t\t\twithCastCodecs ? { ...this.config, useSelectionCastCodecs: true } : this.config,\n\t\t);\n\t}\n\n\ttoSQL(withCastCodecs = true): Query {\n\t\treturn this.dialect.sqlToQuery(this.getSQL(withCastCodecs));\n\t}\n\n\t$dynamic(): SQLiteDeleteDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n", "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteDeleteHKTBase } from '~/sqlite-core/query-builders/delete.ts';\nimport { SQLiteDeleteBase } from '~/sqlite-core/query-builders/delete.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { usedTablesOf } from '~/used-tables.ts';\nimport { applyMixins, type Assume, type DrizzleTypeError } from '~/utils.ts';\nimport type { SQLiteAsyncPreparedQuery, SQLiteAsyncPreparedQueryConfig, SQLiteAsyncSession } from './session.ts';\n\nexport interface SQLiteAsyncDeleteHKT extends SQLiteDeleteHKTBase {\n\t_type: SQLiteAsyncDeleteBase<\n\t\tAssume<this['table'], SQLiteTable>,\n\t\tAssume<this['resultType'], 'sync' | 'async'>,\n\t\tthis['runResult'],\n\t\tAssume<this['returning'], Record<string, unknown> | undefined>,\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods']\n\t>;\n}\n\nexport type AnySQLiteAsyncDelete = SQLiteAsyncDeleteBase<any, any, any, any, any, any>;\n\nexport type SQLiteAsyncDelete<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n> = SQLiteAsyncDeleteBase<TTable, TResultType, TRunResult, TReturning, true, never>;\n\nexport type SQLiteAsyncDeleteExecute<T extends AnySQLiteAsyncDelete> = T['_']['returning'] extends undefined\n\t? T['_']['runResult']\n\t: T['_']['returning'][];\n\nexport type SQLiteAsyncDeletePrepare<T extends AnySQLiteAsyncDelete> = SQLiteAsyncPreparedQuery<\n\tSQLiteAsyncPreparedQueryConfig & {\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'] | undefined;\n\t\tvalues: T['_']['returning'] extends undefined ? DrizzleTypeError<'.values() cannot be used without .returning()'>\n\t\t\t: any[][];\n\t\texecute: SQLiteAsyncDeleteExecute<T>;\n\t}\n>;\n\nexport interface SQLiteAsyncDeleteBase<\n\t// oxlint-disable-next-line no-unused-vars\n\tTTable extends SQLiteTable,\n\t// oxlint-disable-next-line no-unused-vars\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning extends Record<string, unknown> | undefined = undefined,\n\t// oxlint-disable-next-line no-unused-vars\n\tTDynamic extends boolean = false,\n\t// oxlint-disable-next-line no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends\n\tSQLiteDeleteBase<\n\t\tSQLiteAsyncDeleteHKT & { resultType: TResultType },\n\t\tTTable,\n\t\tTRunResult,\n\t\tTReturning,\n\t\tTDynamic,\n\t\tTExcludedMethods\n\t>,\n\tQueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>\n{\n\treadonly _:\n\t\t& SQLiteDeleteBase<\n\t\t\tSQLiteAsyncDeleteHKT & { resultType: TResultType },\n\t\t\tTTable,\n\t\t\tTRunResult,\n\t\t\tTReturning,\n\t\t\tTDynamic,\n\t\t\tTExcludedMethods\n\t\t>['_']\n\t\t& { readonly resultType: TResultType };\n}\n\nexport class SQLiteAsyncDeleteBase<\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 SQLiteDeleteBase<\n\tSQLiteAsyncDeleteHKT & { resultType: TResultType },\n\tTTable,\n\tTRunResult,\n\tTReturning,\n\tTDynamic,\n\tTExcludedMethods\n> implements RunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>, SQLWrapper {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncDelete';\n\n\tdeclare protected session: SQLiteAsyncSession<TResultType, TRunResult, any>;\n\n\t/** @internal */\n\t_prepare(prepare = false): SQLiteAsyncDeletePrepare<this> {\n\t\treturn this.session.prepareQuery(\n\t\t\tthis.dialect.sqlToQuery(this.getSQL(true)),\n\t\t\t'arrays',\n\t\t\tprepare,\n\t\t\tthis.config.returning ? 'all' : 'run',\n\t\t\tthis.config.returning ? this.dialect.mapperGenerators.rows(this.config.returning, undefined) : undefined,\n\t\t\t{\n\t\t\t\ttype: 'delete',\n\t\t\t\ttables: () => usedTablesOf(this.config.table),\n\t\t\t},\n\t\t) as SQLiteAsyncDeletePrepare<this>;\n\t}\n\n\tprepare(): SQLiteAsyncDeletePrepare<this> {\n\t\treturn this._prepare(true);\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(placeholderValues?: Record<string, unknown>): Promise<SQLiteAsyncDeleteExecute<this>> {\n\t\treturn this._prepare().execute(placeholderValues) as SQLiteAsyncDeleteExecute<this>;\n\t}\n}\n\napplyMixins(SQLiteAsyncDeleteBase, [QueryPromise]);\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 type { Placeholder, Query, SQLWrapper } from '~/sql/sql.ts';\nimport { SQL, sql } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport type { IndexColumn } from '~/sqlite-core/indexes.ts';\nimport type { SQLiteSession } from '~/sqlite-core/session.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { type InferInsertModel, Table } from '~/table.ts';\nimport { type Assume, type DrizzleTypeError, mapUpdateSet, orderSelectedFields } 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, unknown>[] | TypedQueryBuilder<SQLiteInsertSelection<TTable>> | SQL;\n\twithList?: Subquery[];\n\tonConflict?: SQL[];\n\treturning?: SelectedFieldsOrdered;\n\tselect?: boolean;\n\tcolumnList?: string[];\n\tuseSelectionCastCodecs?: boolean;\n}\n\nexport type SQLiteInsertValue<\n\tTTable extends SQLiteTable,\n\tTColumnsList extends string[] | 'all' = 'all',\n\tTModel extends Record<string, any> = InferInsertModel<TTable>,\n> =\n\t& {\n\t\t[K in keyof TModel as TColumnsList extends 'all' ? K : Extract<K, TColumnsList[number]>]:\n\t\t\t| TModel[K]\n\t\t\t| SQL\n\t\t\t| Placeholder;\n\t}\n\t& {};\n\nexport type SQLiteInsertSelection<\n\tTTable extends SQLiteTable,\n\tTColumnsList extends string[] | 'all' = 'all',\n\tTModel extends Record<string, unknown> = InferInsertModel<TTable>,\n> =\n\t& {\n\t\t[K in keyof TModel as TColumnsList extends 'all' ? K : Extract<K, TColumnsList[number]>]:\n\t\t\t| AnySQLiteColumn\n\t\t\t| SQL\n\t\t\t| SQL.Aliased\n\t\t\t| TModel[K];\n\t}\n\t& {};\n\nexport type NoDuplicateColumns<\n\tT extends readonly unknown[],\n\tTSeen = never,\n> = T extends readonly [infer Head, ...infer Tail] ? [\n\t\tHead extends TSeen ? DrizzleTypeError<`Duplicate columns are not allowed in insert selection: \"${Head & string}\"`>\n\t\t\t: Head,\n\t\t...NoDuplicateColumns<Tail, TSeen | Head>,\n\t]\n\t: T;\n\nexport type ValidateInsertSelectionKey<\n\tTTable extends SQLiteTable,\n\tTSelection extends SQLiteInsertSelection<any>,\n\tK extends keyof TSelection,\n> = K extends keyof InferInsertModel<TTable> ? TSelection[K]\n\t: K extends keyof InferInsertModel<TTable, { override: true }> ? DrizzleTypeError<\n\t\t\t`Column \"${\n\t\t\t\t& K\n\t\t\t\t& string}\" in table \"${TTable['_'][\n\t\t\t\t'name'\n\t\t\t]}\" is a generated column - manual value insertion restricted`\n\t\t>\n\t: DrizzleTypeError<`Column \"${K & string}\" does not exist in table \"${TTable['_']['name']}\"`>;\n\nexport type NoUnknownKeysInInsertSelection<\n\tTTable extends SQLiteTable,\n\tTSelection extends SQLiteInsertSelection<any>,\n\tTColumnList extends string[] | 'all' = 'all',\n> = {\n\t[K in keyof TSelection]: TColumnList extends string[]\n\t\t? K extends TColumnList[number] ? ValidateInsertSelectionKey<TTable, TSelection, K>\n\t\t: DrizzleTypeError<`Column \"${K & string}\" is not included in the insert column selection`>\n\t\t: ValidateInsertSelectionKey<TTable, TSelection, K>;\n};\n\nexport interface SQLiteInsertBuilderConstructor {\n\tnew(\n\t\ttable: SQLiteTable,\n\t\tvalues: SQLiteInsertConfig['values'],\n\t\tsession: SQLiteSession<any, any>,\n\t\tdialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t\tselect?: boolean,\n\t\tcolumnList?: string[],\n\t): AnySQLiteInsert;\n}\n\nexport class SQLiteInsertBuilder<\n\tTTable extends SQLiteTable,\n\tTRunResult,\n\tTColumnList extends string[] | 'all' = 'all',\n\tTHKT extends SQLiteInsertHKTBase = SQLiteInsertQueryBuilderHKT,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteInsertBuilder';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tconstructor(\n\t\tprotected table: TTable,\n\t\tprotected session: SQLiteSession<any, any>,\n\t\tprotected dialect: SQLiteDialect,\n\t\tprivate withList?: Subquery[],\n\t\tprivate columnList?: string[],\n\t\tprivate builder: SQLiteInsertBuilderConstructor = SQLiteInsertBase,\n\t) {}\n\n\tvalues(value: SQLiteInsertValue<TTable, TColumnList>): SQLiteInsertKind<THKT, TTable, TRunResult>;\n\tvalues(values: SQLiteInsertValue<TTable, TColumnList>[]): SQLiteInsertKind<THKT, TTable, TRunResult>;\n\tvalues(\n\t\tvalues: SQLiteInsertValue<TTable, TColumnList> | SQLiteInsertValue<TTable, TColumnList>[],\n\t): SQLiteInsertKind<THKT, TTable, 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\t// if (values.length > 1 && values.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 this.builder(\n\t\t\tthis.table,\n\t\t\tvalues,\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tthis.withList,\n\t\t\tfalse,\n\t\t\tthis.columnList,\n\t\t) as any;\n\t}\n\n\tselect<TSelection extends SQLiteInsertSelection<TTable, TColumnList>>(\n\t\tselectQuery: (\n\t\t\tqb: QueryBuilder,\n\t\t) => TypedQueryBuilder<NoUnknownKeysInInsertSelection<TTable, TSelection, TColumnList>>,\n\t): SQLiteInsertKind<THKT, TTable, TRunResult, undefined, true>;\n\tselect(\n\t\tselectQuery: (qb: QueryBuilder) => SQL,\n\t): SQLiteInsertKind<THKT, TTable, TRunResult, undefined, true>;\n\tselect(selectQuery: SQL): SQLiteInsertKind<THKT, TTable, TRunResult, undefined, true>;\n\tselect<TSelection extends SQLiteInsertSelection<TTable, TColumnList>>(\n\t\tselectQuery: TypedQueryBuilder<NoUnknownKeysInInsertSelection<TTable, TSelection, TColumnList>>,\n\t): SQLiteInsertKind<THKT, TTable, TRunResult, undefined, true>;\n\tselect(\n\t\tselectQuery:\n\t\t\t| SQL\n\t\t\t| TypedQueryBuilder<\n\t\t\t\tNoUnknownKeysInInsertSelection<TTable, SQLiteInsertSelection<TTable, TColumnList>, TColumnList>\n\t\t\t>\n\t\t\t| ((qb: QueryBuilder) =>\n\t\t\t\t| TypedQueryBuilder<\n\t\t\t\t\tNoUnknownKeysInInsertSelection<TTable, SQLiteInsertSelection<TTable, TColumnList>, TColumnList>\n\t\t\t\t>\n\t\t\t\t| SQL),\n\t): SQLiteInsertKind<THKT, TTable, TRunResult, undefined, true> {\n\t\tconst select = typeof selectQuery === 'function' ? selectQuery(new QueryBuilder()) : selectQuery;\n\t\tif (!is(select, SQL)) {\n\t\t\tconst insertCols = Object.keys(this.table[Table.Symbol.Columns]);\n\t\t\tconst selected = Object.keys(select._.selectedFields);\n\n\t\t\tfor (const col of selected) {\n\t\t\t\tif (!insertCols.includes(col)) {\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t`Insert select error: column \"${col}\" does not exist in table \"${this.table[Table.Symbol.Name]}\"`,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn new this.builder(\n\t\t\tthis.table,\n\t\t\tselect,\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tthis.withList,\n\t\t\ttrue,\n\t\t\tthis.columnList,\n\t\t) as any;\n\t}\n}\n\nexport interface SQLiteInsertHKTBase {\n\ttable: unknown;\n\tresultType: unknown;\n\trunResult: unknown;\n\treturning: unknown;\n\tmayReturnEmpty: boolean;\n\tdynamic: boolean;\n\texcludedMethods: string;\n\tresult: unknown;\n\t_type: unknown;\n}\n\nexport interface SQLiteInsertQueryBuilderHKT extends SQLiteInsertHKTBase {\n\t_type: SQLiteInsertBase<\n\t\tSQLiteInsertQueryBuilderHKT,\n\t\tAssume<this['table'], SQLiteTable>,\n\t\tthis['runResult'],\n\t\tthis['returning'],\n\t\tthis['mayReturnEmpty'],\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods']\n\t>;\n}\n\nexport type SQLiteInsertKind<\n\tT extends SQLiteInsertHKTBase,\n\tTTable extends SQLiteTable,\n\tTRunResult,\n\tTReturning = undefined,\n\tTMayReturnEmpty extends boolean = false,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> = (T & {\n\ttable: TTable;\n\trunResult: TRunResult;\n\treturning: TReturning;\n\tmayReturnEmpty: TMayReturnEmpty;\n\tdynamic: TDynamic;\n\texcludedMethods: TExcludedMethods;\n})['_type'];\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\tSQLiteInsertKind<\n\t\t\t\tT['_']['hkt'],\n\t\t\t\tT['_']['table'],\n\t\t\t\tT['_']['runResult'],\n\t\t\t\tT['_']['returning'],\n\t\t\t\tT['_']['mayReturnEmpty'],\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\tSQLiteInsertKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['table'],\n\t\tT['_']['runResult'],\n\t\tSelectResultFields<TSelectedFields>,\n\t\tT['_']['mayReturnEmpty'],\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\tSQLiteInsertKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['table'],\n\t\tT['_']['runResult'],\n\t\tT['_']['table']['$inferSelect'],\n\t\tT['_']['mayReturnEmpty'],\n\t\tTDynamic,\n\t\tT['_']['excludedMethods']\n\t>,\n\tTDynamic,\n\t'returning'\n>;\n\nexport type SQLiteInsertOnConflict<\n\tT extends AnySQLiteInsert,\n\tTDynamic extends boolean,\n\tTMayReturnEmpty extends boolean,\n> = [TDynamic] extends [false] ? SQLiteInsertWithout<\n\t\tSQLiteInsertKind<\n\t\t\tT['_']['hkt'],\n\t\t\tT['_']['table'],\n\t\t\tT['_']['runResult'],\n\t\t\tT['_']['returning'],\n\t\t\tTMayReturnEmpty,\n\t\t\tfalse,\n\t\t\tT['_']['excludedMethods']\n\t\t>,\n\t\tfalse,\n\t\tnever\n\t>\n\t: SQLiteInsertKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['table'],\n\t\tT['_']['runResult'],\n\t\tT['_']['returning'],\n\t\tTMayReturnEmpty,\n\t\ttrue,\n\t\tnever\n\t>;\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> = SQLiteInsertKind<\n\tT['_']['hkt'],\n\tT['_']['table'],\n\tT['_']['runResult'],\n\tT['_']['returning'],\n\tT['_']['mayReturnEmpty'],\n\ttrue,\n\tnever\n>;\n\nexport type AnySQLiteInsert = SQLiteInsertBase<any, any, any, any, any, any, any>;\n\nexport type SQLiteInsert<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTRunResult = unknown,\n\tTReturning = any,\n> = SQLiteInsertBase<SQLiteInsertQueryBuilderHKT, TTable, TRunResult, TReturning, boolean, true, never>;\n\nexport interface SQLiteInsertBase<\n\tTHKT extends SQLiteInsertHKTBase,\n\tTTable extends SQLiteTable,\n\tTRunResult,\n\tTReturning = undefined,\n\tTMayReturnEmpty extends boolean = false,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> extends SQLWrapper {\n\treadonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly hkt: THKT;\n\t\treadonly table: TTable;\n\t\treadonly runResult: TRunResult;\n\t\treadonly returning: TReturning;\n\t\treadonly mayReturnEmpty: TMayReturnEmpty;\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\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTHKT extends SQLiteInsertHKTBase,\n\tTTable extends SQLiteTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTRunResult,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTReturning = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTMayReturnEmpty extends boolean = false,\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'SQLiteInsert';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\t/** @internal */\n\tconfig: SQLiteInsertConfig<TTable>;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tvalues: SQLiteInsertConfig['values'],\n\t\tprotected session: SQLiteSession<any, any>,\n\t\tprotected dialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t\tselect?: boolean,\n\t\tcolumnList?: string[],\n\t) {\n\t\tthis.config = { table, values: values as any, withList, select, columnList };\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, undefined, this.dialect.codecs);\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(\n\t\tconfig: { target?: IndexColumn | IndexColumn[]; where?: SQL } = {},\n\t): SQLiteInsertOnConflict<this, TDynamic, true> {\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 as any;\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(\n\t\tconfig: SQLiteInsertOnConflictDoUpdateConfig<this> & { where?: undefined; setWhere?: undefined },\n\t): SQLiteInsertOnConflict<this, TDynamic, this['_']['mayReturnEmpty']>;\n\tonConflictDoUpdate(config: SQLiteInsertOnConflictDoUpdateConfig<this>): SQLiteInsertOnConflict<this, TDynamic, true>;\n\tonConflictDoUpdate(\n\t\tconfig: SQLiteInsertOnConflictDoUpdateConfig<this>,\n\t): SQLiteInsertOnConflict<this, TDynamic, boolean> {\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 as any;\n\t}\n\n\tgetSQL(withCastCodecs = false): SQL {\n\t\treturn this.dialect.buildInsertQuery(\n\t\t\twithCastCodecs ? { ...this.config, useSelectionCastCodecs: true } : this.config,\n\t\t);\n\t}\n\n\ttoSQL(withCastCodecs = true): Query {\n\t\treturn this.dialect.sqlToQuery(this.getSQL(withCastCodecs));\n\t}\n\n\t$dynamic(): SQLiteInsertDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n", "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteInsertBuilder, SQLiteInsertHKTBase } from '~/sqlite-core/query-builders/insert.ts';\nimport { SQLiteInsertBase } from '~/sqlite-core/query-builders/insert.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { usedTablesOf } from '~/used-tables.ts';\nimport type { DrizzleTypeError } from '~/utils.ts';\nimport { applyMixins, type Assume } from '~/utils.ts';\nimport type { SQLiteAsyncPreparedQuery, SQLiteAsyncPreparedQueryConfig, SQLiteAsyncSession } from './session.ts';\n\nexport interface SQLiteAsyncInsertHKT extends SQLiteInsertHKTBase {\n\t_type: SQLiteAsyncInsertBase<\n\t\tAssume<this['table'], SQLiteTable>,\n\t\tAssume<this['resultType'], 'sync' | 'async'>,\n\t\tthis['runResult'],\n\t\tthis['returning'],\n\t\tthis['mayReturnEmpty'],\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods']\n\t>;\n}\n\nexport type AnySQLiteAsyncInsert = SQLiteAsyncInsertBase<any, any, any, any, any, any, any>;\n\nexport type SQLiteAsyncInsert<\n\tTTable extends SQLiteTable = SQLiteTable,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTReturning = any,\n> = SQLiteAsyncInsertBase<TTable, TResultType, TRunResult, TReturning, boolean, true, never>;\n\nexport type SQLiteAsyncInsertBuilder<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTColumnList extends string[] | 'all' = 'all',\n> = SQLiteInsertBuilder<TTable, TRunResult, TColumnList, SQLiteAsyncInsertHKT & { resultType: TResultType }>;\n\nexport type SQLiteAsyncInsertExecute<T extends AnySQLiteAsyncInsert> = T['_']['returning'] extends undefined\n\t? T['_']['runResult']\n\t: T['_']['returning'][];\n\nexport type SQLiteAsyncInsertPrepare<T extends AnySQLiteAsyncInsert> = SQLiteAsyncPreparedQuery<\n\tSQLiteAsyncPreparedQueryConfig & {\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['_']['mayReturnEmpty'] extends false ? T['_']['returning']\n\t\t\t: T['_']['returning'] | undefined;\n\t\tvalues: T['_']['returning'] extends undefined ? DrizzleTypeError<'.values() cannot be used without .returning()'>\n\t\t\t: any[][];\n\t\texecute: SQLiteAsyncInsertExecute<T>;\n\t}\n>;\n\nexport interface SQLiteAsyncInsertBase<\n\t// oxlint-disable-next-line no-unused-vars\n\tTTable extends SQLiteTable,\n\t// oxlint-disable-next-line no-unused-vars\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTReturning = undefined,\n\t// oxlint-disable-next-line no-unused-vars\n\tTMayReturnEmpty extends boolean = false,\n\t// oxlint-disable-next-line no-unused-vars\n\tTDynamic extends boolean = false,\n\t// oxlint-disable-next-line no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends\n\tSQLiteInsertBase<\n\t\tSQLiteAsyncInsertHKT & { resultType: TResultType },\n\t\tTTable,\n\t\tTRunResult,\n\t\tTReturning,\n\t\tTMayReturnEmpty,\n\t\tTDynamic,\n\t\tTExcludedMethods\n\t>,\n\tQueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>\n{\n\treadonly _:\n\t\t& SQLiteInsertBase<\n\t\t\tSQLiteAsyncInsertHKT & { resultType: TResultType },\n\t\t\tTTable,\n\t\t\tTRunResult,\n\t\t\tTReturning,\n\t\t\tTMayReturnEmpty,\n\t\t\tTDynamic,\n\t\t\tTExcludedMethods\n\t\t>['_']\n\t\t& { readonly resultType: TResultType };\n}\n\nexport class SQLiteAsyncInsertBase<\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\tTMayReturnEmpty extends boolean = false,\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 SQLiteInsertBase<\n\tSQLiteAsyncInsertHKT & { resultType: TResultType },\n\tTTable,\n\tTRunResult,\n\tTReturning,\n\tTMayReturnEmpty,\n\tTDynamic,\n\tTExcludedMethods\n> implements RunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>, SQLWrapper {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncInsert';\n\n\tdeclare protected session: SQLiteAsyncSession<TResultType, TRunResult, any>;\n\n\t/** @internal */\n\t_prepare(prepare = false): SQLiteAsyncInsertPrepare<this> {\n\t\treturn this.session.prepareQuery(\n\t\t\tthis.dialect.sqlToQuery(this.getSQL(true)),\n\t\t\t'arrays',\n\t\t\tprepare,\n\t\t\tthis.config.returning ? 'all' : 'run',\n\t\t\tthis.config.returning ? this.dialect.mapperGenerators.rows(this.config.returning, undefined) : undefined,\n\t\t\t{\n\t\t\t\ttype: 'insert',\n\t\t\t\ttables: () => usedTablesOf(this.config.table),\n\t\t\t},\n\t\t) as SQLiteAsyncInsertPrepare<this>;\n\t}\n\n\tprepare(): SQLiteAsyncInsertPrepare<this> {\n\t\treturn this._prepare(true);\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<SQLiteAsyncInsertExecute<this>> {\n\t\treturn this._prepare().execute() as SQLiteAsyncInsertExecute<this>;\n\t}\n}\n\napplyMixins(SQLiteAsyncInsertBase, [QueryPromise]);\n", "import { entityKind, is } from '~/entity.ts';\nimport type { PreparedQuery } from '~/session.ts';\nimport type { Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLitePreparedQuery } from '../session.ts';\n\n// TODO: remove Raw builders & replace them with preparedQuery instances directly\n// oxlint-disable-next-line no-unused-vars\nexport interface SQLiteRaw<TResult> extends SQLWrapper {}\nexport class SQLiteRaw<TResult> implements SQLWrapper, PreparedQuery {\n\tstatic readonly [entityKind]: string = 'SQLiteRaw';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tdeclare readonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly result: TResult;\n\t};\n\n\tconstructor(\n\t\tprotected prepared: SQLitePreparedQuery,\n\t\tprotected sql: SQL,\n\t\tprotected query: Query,\n\t) {\n\t}\n\n\tgetSQL() {\n\t\treturn this.sql;\n\t}\n\n\tgetQuery() {\n\t\treturn this.query;\n\t}\n\n\t/** @internal */\n\t_prepare(): PreparedQuery {\n\t\treturn this.prepared;\n\t}\n}\n", "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { Query, SQL, SQLWrapper } from '~/sql/sql.ts';\nimport { SQLiteRaw } from '~/sqlite-core/query-builders/raw.ts';\nimport { applyMixins } from '~/utils.ts';\nimport type { SQLiteAsyncPreparedQuery, SQLiteAsyncPreparedQueryConfig } from './session.ts';\n\nexport interface SQLiteAsyncRaw<TResult>\n\textends SQLiteRaw<TResult>, QueryPromise<TResult>, RunnableQuery<TResult, 'sqlite'>, SQLWrapper\n{}\n\nexport class SQLiteAsyncRaw<TResult> extends SQLiteRaw<TResult>\n\timplements RunnableQuery<TResult, 'sqlite'>, SQLWrapper\n{\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncRaw';\n\n\tdeclare protected prepared: SQLiteAsyncPreparedQuery<\n\t\tSQLiteAsyncPreparedQueryConfig & {\n\t\t\texecute: TResult;\n\t\t}\n\t>;\n\n\tconstructor(\n\t\tprepared: SQLiteAsyncPreparedQuery<\n\t\t\tSQLiteAsyncPreparedQueryConfig & {\n\t\t\t\texecute: TResult;\n\t\t\t}\n\t\t>,\n\t\tsql: SQL,\n\t\tquery: Query,\n\t) {\n\t\tsuper(prepared, sql, query);\n\t}\n\n\texecute(placeholderValues?: Record<string, undefined>): Promise<TResult> {\n\t\treturn this.prepared.execute(placeholderValues) as Promise<TResult>;\n\t}\n}\n\napplyMixins(SQLiteAsyncRaw, [QueryPromise]);\n\nexport type DBResult<TKind extends 'sync' | 'async', TResult> = TKind extends 'async' ? SQLiteAsyncRaw<TResult>\n\t: TResult;\n", "import { entityKind } from '~/entity.ts';\nimport type {\n\tBuildSubquerySelection,\n\tJoinNullability,\n\tSelectMode,\n\tSelectResult,\n} from '~/query-builders/select.types.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { ColumnsSelection, SQLWrapper } from '~/sql/sql.ts';\nimport { SQLiteSelectBase, type SQLiteSelectBuilder } from '~/sqlite-core/query-builders/select.ts';\nimport type { SelectedFields, SQLiteSelectHKTBase } from '~/sqlite-core/query-builders/select.types.ts';\nimport { applyMixins, type Assume, resolveNullableObjectPaths } from '~/utils.ts';\nimport type { SQLiteAsyncPreparedQuery, SQLiteAsyncPreparedQueryConfig, SQLiteAsyncSession } from './session.ts';\n\nexport type SQLiteAsyncSelectExecute<T extends AnySQLiteAsyncSelect> = T['_']['result'];\n\nexport type SQLiteAsyncSelectPrepare<T extends AnySQLiteAsyncSelect> = SQLiteAsyncPreparedQuery<\n\tSQLiteAsyncPreparedQueryConfig & {\n\t\ttype: T['_']['resultType'];\n\t\trun: T['_']['runResult'];\n\t\tall: T['_']['result'];\n\t\tget: T['_']['result'][number] | undefined;\n\t\tvalues: any[][];\n\t\texecute: SQLiteAsyncSelectExecute<T>;\n\t}\n>;\n\nexport type SQLiteAsyncSelectBuilder<\n\tTSelection extends SelectedFields | undefined,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n> = SQLiteSelectBuilder<TSelection, TRunResult, SQLiteAsyncSelectHKT & { resultType: TResultType }>;\n\nexport type SQLiteAsyncSelect<\n\tTTableName extends string | undefined = string | undefined,\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\tTSelection extends ColumnsSelection = Record<string, any>,\n\tTSelectMode extends SelectMode = SelectMode,\n\tTNullabilityMap extends Record<string, JoinNullability> = Record<string, JoinNullability>,\n> = SQLiteAsyncSelectBase<TTableName, TResultType, TRunResult, TSelection, TSelectMode, TNullabilityMap, true, never>;\n\nexport interface SQLiteAsyncSelectHKT extends SQLiteSelectHKTBase {\n\t_type: SQLiteAsyncSelectBase<\n\t\tthis['tableName'],\n\t\tAssume<this['resultType'], 'sync' | 'async'>,\n\t\tthis['runResult'],\n\t\tAssume<this['selection'], ColumnsSelection>,\n\t\tthis['selectMode'],\n\t\tAssume<this['nullabilityMap'], Record<string, JoinNullability>>,\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods'],\n\t\tAssume<this['result'], any[]>,\n\t\tAssume<this['selectedFields'], ColumnsSelection>\n\t>;\n}\n\nexport interface SQLiteAsyncSelectBase<\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\t// oxlint-disable-next-line no-unused-vars\n\tTDynamic extends boolean = false,\n\t// oxlint-disable-next-line no-unused-vars\n\tTExcludedMethods extends string = never,\n\tTResult extends any[] = SelectResult<TSelection, TSelectMode, TNullabilityMap>[],\n\t// oxlint-disable-next-line no-unused-vars\n\tTSelectedFields extends ColumnsSelection = BuildSubquerySelection<TSelection, TNullabilityMap>,\n> extends\n\tSQLiteSelectBase<\n\t\tSQLiteAsyncSelectHKT & { resultType: TResultType },\n\t\tTTableName,\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\treadonly _:\n\t\t& SQLiteSelectBase<\n\t\t\tSQLiteAsyncSelectHKT & { resultType: TResultType },\n\t\t\tTTableName,\n\t\t\tTRunResult,\n\t\t\tTSelection,\n\t\t\tTSelectMode,\n\t\t\tTNullabilityMap,\n\t\t\tTDynamic,\n\t\t\tTExcludedMethods,\n\t\t\tTResult,\n\t\t\tTSelectedFields\n\t\t>['_']\n\t\t& { readonly resultType: TResultType };\n}\n\nexport class SQLiteAsyncSelectBase<\n\tTTableName extends string | undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\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 SQLiteSelectBase<\n\tSQLiteAsyncSelectHKT & { resultType: TResultType },\n\tTTableName,\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 = 'SQLiteAsyncSelect';\n\n\tdeclare protected session: SQLiteAsyncSession<TResultType, TRunResult, any>;\n\n\t/** @internal */\n\t_prepare(prepare = false): SQLiteAsyncSelectPrepare<this> {\n\t\t// Build query before accessing `fieldsFlat` - build mutates it\n\t\tconst sequel = this.getSQL(true);\n\t\tconst query = this.dialect.sqlToQuery(sequel);\n\t\tconst fieldsList = this.config.fieldsFlat!;\n\t\tconst mapper = this.config.mapper ??= this.dialect.mapperGenerators.rows(\n\t\t\tfieldsList,\n\t\t\tresolveNullableObjectPaths(fieldsList, this.joinsNotNullableMap),\n\t\t);\n\n\t\tconst preparedQuery = this.session.prepareQuery(\n\t\t\tquery,\n\t\t\t'arrays',\n\t\t\tprepare,\n\t\t\t'all',\n\t\t\tmapper,\n\t\t\t{ type: 'select', tables: () => this.getUsedTables(sequel) },\n\t\t\tthis.cacheConfig,\n\t\t);\n\t\treturn preparedQuery as ReturnType<this['prepare']>;\n\t}\n\n\tprepare(): SQLiteAsyncSelectPrepare<this> {\n\t\treturn this._prepare(true);\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<SQLiteAsyncSelectExecute<this>> {\n\t\treturn this._prepare().execute() as Promise<SQLiteAsyncSelectExecute<this>>;\n\t}\n}\n\napplyMixins(SQLiteAsyncSelectBase, [QueryPromise]);\n\nexport type AnySQLiteAsyncSelect = SQLiteAsyncSelectBase<any, any, any, any, any, any, any, any, any, any>;\n", "import type { GetColumnData } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { JoinType, SelectResultFields } from '~/query-builders/select.types.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 { SQLiteSession } from '~/sqlite-core/session.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { type InferInsertModel, Table } from '~/table.ts';\nimport {\n\ttype Assume,\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\tuseSelectionCastCodecs?: boolean;\n}\n\nexport type SQLiteUpdateSetSource<\n\tTTable extends SQLiteTable,\n\tTModel extends Record<string, any> = InferInsertModel<TTable>,\n> =\n\t& {\n\t\t[Key in keyof TModel & string]?:\n\t\t\t| GetColumnData<TTable['_']['columns'][Key], 'query'>\n\t\t\t| SQL\n\t\t\t| SQLiteColumn\n\t\t\t| Placeholder\n\t\t\t| undefined;\n\t}\n\t& {};\n\nexport interface SQLiteUpdateBuilderConstructor {\n\tnew(\n\t\ttable: SQLiteTable,\n\t\tset: UpdateSet,\n\t\tsession: SQLiteSession<any, any>,\n\t\tdialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t): AnySQLiteUpdate;\n}\n\nexport class SQLiteUpdateBuilder<\n\tTTable extends SQLiteTable,\n\tTRunResult,\n\tTHKT extends SQLiteUpdateHKTBase = SQLiteUpdateQueryBuilderHKT,\n> {\n\tstatic readonly [entityKind]: string = 'SQLiteUpdateBuilder';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\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>,\n\t\tprotected dialect: SQLiteDialect,\n\t\tprivate withList?: Subquery[],\n\t\tprivate builder: SQLiteUpdateBuilderConstructor = SQLiteUpdateBase,\n\t) {}\n\n\tset(\n\t\tvalues: SQLiteUpdateSetSource<TTable>,\n\t): SQLiteUpdateWithout<\n\t\tAssume<SQLiteUpdateKind<THKT, TTable, TRunResult>, AnySQLiteUpdate>,\n\t\tfalse,\n\t\t'leftJoin' | 'rightJoin' | 'innerJoin' | 'fullJoin'\n\t> {\n\t\treturn new this.builder(\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 interface SQLiteUpdateHKTBase {\n\ttable: unknown;\n\tresultType: unknown;\n\trunResult: unknown;\n\tfrom: unknown;\n\treturning: unknown;\n\tdynamic: boolean;\n\texcludedMethods: string;\n\tresult: unknown;\n\t_type: unknown;\n}\n\nexport interface SQLiteUpdateQueryBuilderHKT extends SQLiteUpdateHKTBase {\n\t_type: SQLiteUpdateBase<\n\t\tSQLiteUpdateQueryBuilderHKT,\n\t\tAssume<this['table'], SQLiteTable>,\n\t\tthis['runResult'],\n\t\tAssume<this['from'], SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined>,\n\t\tthis['returning'],\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods']\n\t>;\n}\n\nexport type SQLiteUpdateKind<\n\tT extends SQLiteUpdateHKTBase,\n\tTTable extends SQLiteTable,\n\tTRunResult,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning = undefined,\n\tTDynamic extends boolean = false,\n\tTExcludedMethods extends string = never,\n> = (T & {\n\ttable: TTable;\n\trunResult: TRunResult;\n\tfrom: TFrom;\n\treturning: TReturning;\n\tdynamic: TDynamic;\n\texcludedMethods: TExcludedMethods;\n\tresult: TReturning extends undefined ? TRunResult : TReturning[];\n})['_type'];\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\tSQLiteUpdateKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['table'],\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\tSQLiteUpdateKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['table'],\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\tSQLiteUpdateKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['table'],\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\tSQLiteUpdateKind<\n\t\tT['_']['hkt'],\n\t\tT['_']['table'],\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 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> = SQLiteUpdateKind<\n\tT['_']['hkt'],\n\tT['_']['table'],\n\tT['_']['runResult'],\n\tT['_']['from'],\n\tT['_']['returning'],\n\ttrue,\n\tnever\n>;\n\nexport type SQLiteUpdate<\n\tTTable extends SQLiteTable = SQLiteTable,\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<SQLiteUpdateQueryBuilderHKT, TTable, TRunResult, TFrom, TReturning, true, never>;\n\nexport type AnySQLiteUpdate = SQLiteUpdateBase<any, any, any, any, any, any, any>;\n\nexport interface SQLiteUpdateBase<\n\tTHKT extends SQLiteUpdateHKTBase,\n\tTTable extends SQLiteTable = SQLiteTable,\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 {\n\treadonly _: {\n\t\treadonly dialect: 'sqlite';\n\t\treadonly hkt: THKT;\n\t\treadonly table: TTable;\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\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTHKT extends SQLiteUpdateHKTBase,\n\tTTable extends SQLiteTable = SQLiteTable,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTRunResult = unknown,\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTReturning = undefined,\n\tTDynamic extends boolean = false,\n\t// eslint-disable-next-line @typescript-eslint/no-unused-vars\n\tTExcludedMethods extends string = never,\n> implements SQLWrapper {\n\tstatic readonly [entityKind]: string = 'SQLiteUpdate';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\t/** @internal */\n\tconfig: SQLiteUpdateConfig;\n\n\tconstructor(\n\t\ttable: TTable,\n\t\tset: UpdateSet,\n\t\tprotected session: SQLiteSession<any, any>,\n\t\tprotected dialect: SQLiteDialect,\n\t\twithList?: Subquery[],\n\t) {\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, undefined, this.dialect.codecs);\n\t\treturn this as any;\n\t}\n\n\tgetSQL(withCastCodecs = false): SQL {\n\t\treturn this.dialect.buildUpdateQuery(\n\t\t\twithCastCodecs ? { ...this.config, useSelectionCastCodecs: true } : this.config,\n\t\t);\n\t}\n\n\ttoSQL(withCastCodecs = true): Query {\n\t\treturn this.dialect.sqlToQuery(this.getSQL(withCastCodecs));\n\t}\n\n\t$dynamic(): SQLiteUpdateDynamic<this> {\n\t\treturn this as any;\n\t}\n}\n", "import { entityKind } from '~/entity.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { RunnableQuery } from '~/runnable-query.ts';\nimport type { SQL, SQLWrapper } from '~/sql/sql.ts';\nimport type { SQLiteUpdateBuilder, SQLiteUpdateHKTBase } from '~/sqlite-core/query-builders/update.ts';\nimport { SQLiteUpdateBase } from '~/sqlite-core/query-builders/update.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport type { Subquery } from '~/subquery.ts';\nimport { usedTablesOf } from '~/used-tables.ts';\nimport { applyMixins, type Assume, type DrizzleTypeError } from '~/utils.ts';\nimport type { SQLiteViewBase } from '../view-base.ts';\nimport type { SQLiteAsyncPreparedQuery, SQLiteAsyncPreparedQueryConfig, SQLiteAsyncSession } from './session.ts';\n\nexport interface SQLiteAsyncUpdateHKT extends SQLiteUpdateHKTBase {\n\t_type: SQLiteAsyncUpdateBase<\n\t\tAssume<this['table'], SQLiteTable>,\n\t\tAssume<this['resultType'], 'sync' | 'async'>,\n\t\tthis['runResult'],\n\t\tAssume<this['from'], SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined>,\n\t\tthis['returning'],\n\t\tthis['dynamic'],\n\t\tthis['excludedMethods']\n\t>;\n}\n\nexport type AnySQLiteAsyncUpdate = SQLiteAsyncUpdateBase<any, any, any, any, any, any, any>;\n\nexport type SQLiteAsyncUpdate<\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> = SQLiteAsyncUpdateBase<TTable, TResultType, TRunResult, TFrom, TReturning, true, never>;\n\nexport type SQLiteAsyncUpdateBuilder<\n\tTTable extends SQLiteTable,\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n> = SQLiteUpdateBuilder<TTable, TRunResult, SQLiteAsyncUpdateHKT & { resultType: TResultType }>;\n\nexport type SQLiteAsyncUpdateExecute<T extends AnySQLiteAsyncUpdate> = T['_']['returning'] extends undefined\n\t? T['_']['runResult']\n\t: T['_']['returning'][];\n\nexport type SQLiteAsyncUpdatePrepare<T extends AnySQLiteAsyncUpdate> = SQLiteAsyncPreparedQuery<\n\tSQLiteAsyncPreparedQueryConfig & {\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'] | undefined;\n\t\tvalues: T['_']['returning'] extends undefined ? DrizzleTypeError<'.values() cannot be used without .returning()'>\n\t\t\t: any[][];\n\t\texecute: SQLiteAsyncUpdateExecute<T>;\n\t}\n>;\n\nexport interface SQLiteAsyncUpdateBase<\n\t// oxlint-disable-next-line no-unused-vars\n\tTTable extends SQLiteTable = SQLiteTable,\n\t// oxlint-disable-next-line no-unused-vars\n\tTResultType extends 'sync' | 'async' = 'sync' | 'async',\n\tTRunResult = unknown,\n\t// oxlint-disable-next-line no-unused-vars\n\tTFrom extends SQLiteTable | Subquery | SQLiteViewBase | SQL | undefined = undefined,\n\tTReturning = undefined,\n\t// oxlint-disable-next-line no-unused-vars\n\tTDynamic extends boolean = false,\n\t// oxlint-disable-next-line no-unused-vars\n\tTExcludedMethods extends string = never,\n> extends\n\tSQLiteUpdateBase<\n\t\tSQLiteAsyncUpdateHKT & { resultType: TResultType },\n\t\tTTable,\n\t\tTRunResult,\n\t\tTFrom,\n\t\tTReturning,\n\t\tTDynamic,\n\t\tTExcludedMethods\n\t>,\n\tQueryPromise<TReturning extends undefined ? TRunResult : TReturning[]>\n{\n\treadonly _:\n\t\t& SQLiteUpdateBase<\n\t\t\tSQLiteAsyncUpdateHKT & { resultType: TResultType },\n\t\t\tTTable,\n\t\t\tTRunResult,\n\t\t\tTFrom,\n\t\t\tTReturning,\n\t\t\tTDynamic,\n\t\t\tTExcludedMethods\n\t\t>['_']\n\t\t& { readonly resultType: TResultType };\n}\n\nexport class SQLiteAsyncUpdateBase<\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 SQLiteUpdateBase<\n\tSQLiteAsyncUpdateHKT & { resultType: TResultType },\n\tTTable,\n\tTRunResult,\n\tTFrom,\n\tTReturning,\n\tTDynamic,\n\tTExcludedMethods\n> implements RunnableQuery<TReturning extends undefined ? TRunResult : TReturning[], 'sqlite'>, SQLWrapper {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncUpdate';\n\n\tdeclare protected session: SQLiteAsyncSession<TResultType, TRunResult, any>;\n\n\t/** @internal */\n\t_prepare(prepare = false): SQLiteAsyncUpdatePrepare<this> {\n\t\treturn this.session.prepareQuery(\n\t\t\tthis.dialect.sqlToQuery(this.getSQL(true)),\n\t\t\t'arrays',\n\t\t\tprepare,\n\t\t\tthis.config.returning ? 'all' : 'run',\n\t\t\tthis.config.returning ? this.dialect.mapperGenerators.rows(this.config.returning, undefined) : undefined,\n\t\t\t{\n\t\t\t\ttype: 'update',\n\t\t\t\ttables: () => usedTablesOf(this.config.table),\n\t\t\t},\n\t\t) as SQLiteAsyncUpdatePrepare<this>;\n\t}\n\n\tprepare(): SQLiteAsyncUpdatePrepare<this> {\n\t\treturn this._prepare(true);\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<SQLiteAsyncUpdateExecute<this>> {\n\t\treturn (this.config.returning ? this.all() : this.run()) as SQLiteAsyncUpdateExecute<this>;\n\t}\n}\n\napplyMixins(SQLiteAsyncUpdateBase, [QueryPromise]);\n", "import type { Cache } from '~/cache/core/cache.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport type { TypedQueryBuilder } from '~/query-builders/query-builder.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { SelectionProxyHandler } from '~/selection-proxy.ts';\nimport { type ColumnsSelection, type SQL, sql, type SQLWrapper } from '~/sql/sql.ts';\nimport { SQLiteAsyncDeleteBase } from '~/sqlite-core/async/delete.ts';\nimport { SQLiteAsyncInsertBase, type SQLiteAsyncInsertBuilder } from '~/sqlite-core/async/insert.ts';\nimport { type DBResult, SQLiteAsyncRaw } from '~/sqlite-core/async/raw.ts';\nimport { SQLiteAsyncSelectBase, type SQLiteAsyncSelectBuilder } from '~/sqlite-core/async/select.ts';\nimport type { Result, SQLiteAsyncSession, SQLiteAsyncTransaction } from '~/sqlite-core/async/session.ts';\nimport { SQLiteAsyncUpdateBase, type SQLiteAsyncUpdateBuilder } from '~/sqlite-core/async/update.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport {\n\ttype NoDuplicateColumns,\n\tQueryBuilder,\n\tSQLiteInsertBuilder,\n\tSQLiteSelectBuilder,\n\tSQLiteUpdateBuilder,\n} from '~/sqlite-core/query-builders/index.ts';\nimport type { SQLiteTransactionConfig } from '~/sqlite-core/session.ts';\nimport type { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { WithSubquery } from '~/subquery.ts';\nimport type { InferInsertModel, RequiredInsertKeys } from '~/table.ts';\nimport type { DrizzleTypeError, IsNever, JoinUnion } from '~/utils.ts';\nimport { RelationalQueryBuilder } from '../query-builders/query.ts';\nimport type { SelectedFields } from '../query-builders/select.types.ts';\nimport type { WithBuilder } from '../subquery.ts';\nimport type { SQLiteViewBase } from '../view-base.ts';\nimport { SQLiteAsyncCountBuilder, type SQLiteAsyncCountBuilderKind, SQLiteSyncCountBuilder } from './count.ts';\nimport { SQLiteAsyncRelationalQuery, type SQLiteAsyncRelationalQueryHKT, SQLiteSyncRelationalQuery } from './query.ts';\n\nexport class SQLiteAsyncDatabase<\n\tTResultKind extends 'sync' | 'async',\n\tTRunResult,\n\tTRelations extends AnyRelations = EmptyRelations,\n> {\n\tstatic readonly [entityKind]: string = 'BaseSQLiteDatabase';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tdeclare readonly _: {\n\t\treadonly relations: TRelations;\n\t\treadonly session: SQLiteAsyncSession<TResultKind, TRunResult, TRelations>;\n\t\treadonly resultKind: TResultKind;\n\t};\n\n\t// TO-DO: Figure out how to pass DrizzleTypeError without breaking withReplicas\n\tquery: {\n\t\t[K in keyof TRelations]: RelationalQueryBuilder<\n\t\t\tTResultKind,\n\t\t\tTRelations,\n\t\t\tTRelations[K],\n\t\t\tSQLiteAsyncRelationalQueryHKT\n\t\t>;\n\t};\n\n\tconstructor(\n\t\tprivate resultKind: TResultKind,\n\t\t/** @internal */\n\t\treadonly dialect: SQLiteDialect,\n\t\t/** @internal */\n\t\treadonly session: SQLiteAsyncSession<TResultKind, TRunResult, TRelations>,\n\t\trelations: TRelations,\n\t\treadonly forbidJsonb?: boolean,\n\t) {\n\t\tthis._ = {\n\t\t\trelations,\n\t\t\tsession,\n\t\t\tresultKind,\n\t\t};\n\t\tthis.query = {} as typeof this['query'];\n\t\tfor (const [tableName, relation] of Object.entries(relations)) {\n\t\t\t(this.query as SQLiteAsyncDatabase<\n\t\t\t\tTResultKind,\n\t\t\t\tTRunResult,\n\t\t\t\tAnyRelations\n\t\t\t>['query'])[tableName] = new RelationalQueryBuilder(\n\t\t\t\tresultKind,\n\t\t\t\trelations,\n\t\t\t\trelations[relation.name]!.table as SQLiteTable,\n\t\t\t\trelation,\n\t\t\t\tdialect,\n\t\t\t\tsession as SQLiteAsyncSession<any, any, any>,\n\t\t\t\tforbidJsonb,\n\t\t\t\tresultKind === 'sync' ? SQLiteSyncRelationalQuery : SQLiteAsyncRelationalQuery,\n\t\t\t);\n\t\t}\n\t\tthis.$cache = { invalidate: async (_params: any) => {} };\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\tconst sql = qb.getSQL();\n\t\t\treturn new Proxy(\n\t\t\t\tnew WithSubquery(\n\t\t\t\t\tsql,\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): SQLiteAsyncCountBuilderKind<TResultKind> {\n\t\treturn this.resultKind === 'async'\n\t\t\t? new SQLiteAsyncCountBuilder({\n\t\t\t\tsource,\n\t\t\t\tfilters,\n\t\t\t\tsession: this.session,\n\t\t\t\tdialect: this.dialect,\n\t\t\t}) as SQLiteAsyncCountBuilderKind<TResultKind>\n\t\t\t: new SQLiteSyncCountBuilder({\n\t\t\t\tsource,\n\t\t\t\tfilters,\n\t\t\t\tsession: this.session,\n\t\t\t\tdialect: this.dialect,\n\t\t\t});\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(): SQLiteAsyncSelectBuilder<undefined, TResultKind, TRunResult>;\n\t\tfunction select<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteAsyncSelectBuilder<TSelection, TResultKind, TRunResult>;\n\t\tfunction select(\n\t\t\tfields?: SelectedFields,\n\t\t): SQLiteAsyncSelectBuilder<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}, SQLiteAsyncSelectBase);\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(): SQLiteAsyncSelectBuilder<undefined, TResultKind, TRunResult>;\n\t\tfunction selectDistinct<TSelection extends SelectedFields>(\n\t\t\tfields: TSelection,\n\t\t): SQLiteAsyncSelectBuilder<TSelection, TResultKind, TRunResult>;\n\t\tfunction selectDistinct(\n\t\t\tfields?: SelectedFields,\n\t\t): SQLiteAsyncSelectBuilder<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}, SQLiteAsyncSelectBase);\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>(\n\t\t\ttable: TTable,\n\t\t): SQLiteAsyncUpdateBuilder<TTable, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteUpdateBuilder(table, self.session, self.dialect, queries, SQLiteAsyncUpdateBase);\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 only selected columns\n\t\t * await db.insert(cars, 'brand', 'productionYear').values([{ brand: 'BMW', productionYear: 1995 }, { brand: 'Porsche', productionYear: 1989 }]);\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<\n\t\t\tTTable extends SQLiteTable,\n\t\t\tTColumnList extends (keyof InferInsertModel<TTable>)[] = [],\n\t\t\tTRequiredKeys extends string = RequiredInsertKeys<TTable>,\n\t\t>(\n\t\t\tinto: TTable,\n\t\t\t...columns: TColumnList extends [] ? []\n\t\t\t\t: IsNever<TRequiredKeys> extends true ? TColumnList & NoDuplicateColumns<TColumnList>\n\t\t\t\t: [TRequiredKeys] extends [TColumnList[number]] ? TColumnList & NoDuplicateColumns<TColumnList>\n\t\t\t\t: DrizzleTypeError<\n\t\t\t\t\t`Column selection is missing following required columns: ${JoinUnion<\n\t\t\t\t\t\t`\"${Exclude<TRequiredKeys, TColumnList[number]>}\"`,\n\t\t\t\t\t\t', '\n\t\t\t\t\t>}`\n\t\t\t\t>[]\n\t\t): SQLiteAsyncInsertBuilder<TTable, TResultKind, TRunResult, TColumnList extends [] ? 'all' : TColumnList>;\n\t\tfunction insert<TTable extends SQLiteTable>(\n\t\t\tinto: TTable,\n\t\t\t...columns: string[]\n\t\t): SQLiteAsyncInsertBuilder<TTable, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteInsertBuilder(\n\t\t\t\tinto,\n\t\t\t\tself.session,\n\t\t\t\tself.dialect,\n\t\t\t\tqueries,\n\t\t\t\tcolumns.length ? columns : undefined,\n\t\t\t\tSQLiteAsyncInsertBase,\n\t\t\t);\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): SQLiteAsyncDeleteBase<TTable, TResultKind, TRunResult> {\n\t\t\treturn new SQLiteAsyncDeleteBase(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(): SQLiteAsyncSelectBuilder<undefined, TResultKind, TRunResult>;\n\tselect<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteAsyncSelectBuilder<TSelection, TResultKind, TRunResult>;\n\tselect(fields?: SelectedFields): SQLiteAsyncSelectBuilder<SelectedFields | undefined, TResultKind, TRunResult> {\n\t\treturn new SQLiteSelectBuilder(\n\t\t\t{ fields: fields ?? undefined, session: this.session, dialect: this.dialect },\n\t\t\tSQLiteAsyncSelectBase,\n\t\t);\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(): SQLiteAsyncSelectBuilder<undefined, TResultKind, TRunResult>;\n\tselectDistinct<TSelection extends SelectedFields>(\n\t\tfields: TSelection,\n\t): SQLiteAsyncSelectBuilder<TSelection, TResultKind, TRunResult>;\n\tselectDistinct(\n\t\tfields?: SelectedFields,\n\t): SQLiteAsyncSelectBuilder<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}, SQLiteAsyncSelectBase);\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): SQLiteAsyncUpdateBuilder<TTable, TResultKind, TRunResult> {\n\t\treturn new SQLiteUpdateBuilder(table, this.session, this.dialect, undefined, SQLiteAsyncUpdateBase);\n\t}\n\n\t$cache: { invalidate: Cache['onMutate'] };\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 only selected columns\n\t * await db.insert(cars, 'brand', 'productionYear').values([{ brand: 'BMW', productionYear: 1995 }, { brand: 'Porsche', productionYear: 1989 }]);\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<\n\t\tTTable extends SQLiteTable,\n\t\tTColumnList extends (keyof InferInsertModel<TTable>)[] = [],\n\t\tTRequiredKeys extends string = RequiredInsertKeys<TTable>,\n\t>(\n\t\tinto: TTable,\n\t\t...columns: TColumnList extends [] ? []\n\t\t\t: IsNever<TRequiredKeys> extends true ? TColumnList & NoDuplicateColumns<TColumnList>\n\t\t\t: [TRequiredKeys] extends [TColumnList[number]] ? TColumnList & NoDuplicateColumns<TColumnList>\n\t\t\t: DrizzleTypeError<\n\t\t\t\t`Column selection is missing following required columns: ${JoinUnion<\n\t\t\t\t\t`\"${Exclude<TRequiredKeys, TColumnList[number]>}\"`,\n\t\t\t\t\t', '\n\t\t\t\t>}`\n\t\t\t>[]\n\t): SQLiteAsyncInsertBuilder<TTable, TResultKind, TRunResult, TColumnList extends [] ? 'all' : TColumnList>;\n\tinsert<TTable extends SQLiteTable>(\n\t\tinto: TTable,\n\t\t...columns: string[]\n\t): SQLiteAsyncInsertBuilder<TTable, TResultKind, TRunResult> {\n\t\treturn new SQLiteInsertBuilder(\n\t\t\tinto,\n\t\t\tthis.session,\n\t\t\tthis.dialect,\n\t\t\tundefined,\n\t\t\tcolumns.length ? columns : undefined,\n\t\t\tSQLiteAsyncInsertBase,\n\t\t);\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): SQLiteAsyncDeleteBase<TTable, TResultKind, TRunResult> {\n\t\treturn new SQLiteAsyncDeleteBase(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\tconst builtQuery = this.dialect.sqlToQuery(sequel);\n\t\tconst prepared = this.session.prepareQuery(builtQuery, 'raw', false, 'run');\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteAsyncRaw(prepared, sequel, builtQuery) as DBResult<TResultKind, TRunResult>;\n\t\t}\n\t\treturn this.session.run(sequel) as DBResult<TResultKind, TRunResult>;\n\t}\n\n\tall<TRow extends unknown[] = unknown[]>(\n\t\tquery: SQLWrapper | string,\n\t\tmode: 'arrays',\n\t): DBResult<TResultKind, TRow[]>;\n\tall<TRow extends Record<string, any> = Record<string, unknown>>(\n\t\tquery: SQLWrapper | string,\n\t\tmode?: 'objects' | undefined,\n\t): DBResult<TResultKind, TRow[]>;\n\tall(\n\t\tquery: SQLWrapper | string,\n\t\tmode?: 'arrays' | 'objects' | undefined,\n\t): unknown {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tconst builtQuery = this.dialect.sqlToQuery(sequel);\n\t\tconst prepared = this.session.prepareQuery(builtQuery, mode ?? 'objects', false, 'all');\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteAsyncRaw(prepared, sequel, builtQuery);\n\t\t}\n\t\treturn mode === 'arrays' ? this.session.arrays(sequel) : this.session.objects(sequel);\n\t}\n\n\tget<TRow extends unknown[] = unknown[]>(\n\t\tquery: SQLWrapper | string,\n\t\tmode: 'arrays',\n\t): DBResult<TResultKind, TRow | undefined>;\n\tget<TRow extends Record<string, any> = Record<string, unknown>>(\n\t\tquery: SQLWrapper | string,\n\t\tmode?: 'objects' | undefined,\n\t): DBResult<TResultKind, TRow | undefined>;\n\tget(\n\t\tquery: SQLWrapper | string,\n\t\tmode?: 'arrays' | 'objects' | undefined,\n\t): unknown {\n\t\tconst sequel = typeof query === 'string' ? sql.raw(query) : query.getSQL();\n\t\tconst builtQuery = this.dialect.sqlToQuery(sequel);\n\t\tconst prepared = this.session.prepareQuery(builtQuery, mode ?? 'objects', false, 'get');\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteAsyncRaw(prepared, sequel, builtQuery);\n\t\t}\n\t\treturn mode === 'arrays' ? this.session.array(sequel) : this.session.object(sequel);\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\tconst builtQuery = this.dialect.sqlToQuery(sequel);\n\t\tconst prepared = this.session.prepareQuery(builtQuery, 'arrays', false, 'values');\n\t\tif (this.resultKind === 'async') {\n\t\t\treturn new SQLiteAsyncRaw(prepared, sequel, builtQuery) as DBResult<TResultKind, T[]>;\n\t\t}\n\t\treturn this.session.arrays(sequel) as DBResult<TResultKind, T[]>;\n\t}\n\n\ttransaction<T>(\n\t\ttransaction: (\n\t\t\ttx: SQLiteAsyncTransaction<TResultKind, TRunResult, TRelations>,\n\t\t) => TResultKind extends 'sync'\n\t\t\t? T extends Promise<any> ? DrizzleTypeError<\"Sync drivers can't use async functions in transactions!\"> : T\n\t\t\t: Result<TResultKind, T>,\n\t\tconfig?: SQLiteTransactionConfig,\n\t): Result<TResultKind, T> {\n\t\treturn this.session.transaction(\n\t\t\ttransaction as (\n\t\t\t\ttx: SQLiteAsyncTransaction<TResultKind, TRunResult, TRelations>,\n\t\t\t) => Result<TResultKind, T>,\n\t\t\tconfig,\n\t\t);\n\t}\n}\n\nexport type SQLiteWithReplicas<Q> = Q & {\n\t$replica: Q;\n\t/**\n\t * @deprecated `withReplicas` db now defaults to using primary\n\t *\n\t * Use `db.$replica` to redirect query to replica\n\t */\n\t$primary: Q;\n\t$replicas: Q[];\n};\n\nexport const withReplicas = <\n\tTResultKind extends 'sync' | 'async',\n\tTRunResult,\n\tTRelations extends AnyRelations,\n\tQ extends SQLiteAsyncDatabase<\n\t\tTResultKind,\n\t\tTRunResult,\n\t\tTRelations\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\treturn Object.create(primary, {\n\t\t$replica: { get: () => getReplica(replicas) },\n\t\t$primary: { value: primary },\n\t\t$replicas: { value: replicas },\n\t});\n};\n", "import { entityKind, is } from '~/entity.ts';\nimport type { Table } from '~/table.ts';\nimport type { CacheConfig, QueryMetadata, WithCacheConfig } from './types.ts';\n\nexport abstract class Cache {\n\tstatic readonly [entityKind]: string = 'Cache';\n\tstatic [Symbol.hasInstance](value: unknown): boolean {\n\t\treturn is(value, this);\n\t}\n\n\tabstract strategy(): 'explicit' | 'all';\n\n\t/**\n\t * Invoked if we should check cache for cached response\n\t * @param sql\n\t * @param tables\n\t */\n\tabstract get(\n\t\tkey: string,\n\t\ttables: string[],\n\t\tisTag: boolean,\n\t\tisAutoInvalidate?: boolean,\n\t): Promise<any[] | undefined>;\n\n\t/**\n\t * Invoked if new query should be inserted to cache\n\t * @param sql\n\t * @param tables\n\t */\n\tabstract put(\n\t\thashedQuery: string,\n\t\tresponse: any,\n\t\ttables: string[],\n\t\tisTag: boolean,\n\t\tconfig?: CacheConfig,\n\t): Promise<void>;\n\n\t/**\n\t * Invoked if insert, update, delete was invoked\n\t * @param tables\n\t */\n\tabstract onMutate(\n\t\tparams: MutationOption,\n\t): Promise<void>;\n}\n\nexport class NoopCache extends Cache {\n\tstatic override readonly [entityKind]: string = 'NoopCache';\n\n\toverride strategy() {\n\t\treturn 'all' as const;\n\t}\n\n\toverride async get(_key: string): Promise<any[] | undefined> {\n\t\treturn undefined;\n\t}\n\toverride async put(\n\t\t_hashedQuery: string,\n\t\t_response: any,\n\t\t_tables: string[],\n\t\t_config?: any,\n\t): Promise<void> {\n\t\t// noop\n\t}\n\toverride async onMutate(_params: MutationOption): Promise<void> {\n\t\t// noop\n\t}\n}\n\n// TODO: one place for all dialects\nexport const strategyFor = async (\n\tquery: string,\n\tparams: any[] | undefined,\n\tqueryMetadata: QueryMetadata | undefined,\n\twithCacheConfig?: WithCacheConfig,\n) => {\n\tif (!queryMetadata) return { type: 'skip' as const };\n\n\tconst { type } = queryMetadata;\n\n\tif (type === 'insert' || type === 'update' || type === 'delete') {\n\t\tconst tables = queryMetadata.tables();\n\t\treturn tables.length > 0 ? { type: 'invalidate' as const, tables } : { type: 'skip' as const };\n\t}\n\n\tif (!withCacheConfig) return { type: 'skip' as const };\n\tif (!withCacheConfig.enabled) return { type: 'skip' as const };\n\n\tif (type === 'select') {\n\t\tconst tag = withCacheConfig.tag ?? await hashQuery(query, params);\n\n\t\treturn {\n\t\t\ttype: 'try' as const,\n\t\t\tkey: tag,\n\t\t\tisTag: typeof withCacheConfig.tag !== 'undefined',\n\t\t\tautoInvalidate: withCacheConfig.autoInvalidate,\n\t\t\ttables: queryMetadata.tables(),\n\t\t\tconfig: withCacheConfig.config,\n\t\t};\n\t}\n\treturn { type: 'skip' as const };\n};\n\nexport type MutationOption = { tags?: string | string[]; tables?: Table<any> | Table<any>[] | string | string[] };\n\nconst SHA256_K = /* @__PURE__ */ new Uint32Array([\n\t0x428a2f98,\n\t0x71374491,\n\t0xb5c0fbcf,\n\t0xe9b5dba5,\n\t0x3956c25b,\n\t0x59f111f1,\n\t0x923f82a4,\n\t0xab1c5ed5,\n\t0xd807aa98,\n\t0x12835b01,\n\t0x243185be,\n\t0x550c7dc3,\n\t0x72be5d74,\n\t0x80deb1fe,\n\t0x9bdc06a7,\n\t0xc19bf174,\n\t0xe49b69c1,\n\t0xefbe4786,\n\t0x0fc19dc6,\n\t0x240ca1cc,\n\t0x2de92c6f,\n\t0x4a7484aa,\n\t0x5cb0a9dc,\n\t0x76f988da,\n\t0x983e5152,\n\t0xa831c66d,\n\t0xb00327c8,\n\t0xbf597fc7,\n\t0xc6e00bf3,\n\t0xd5a79147,\n\t0x06ca6351,\n\t0x14292967,\n\t0x27b70a85,\n\t0x2e1b2138,\n\t0x4d2c6dfc,\n\t0x53380d13,\n\t0x650a7354,\n\t0x766a0abb,\n\t0x81c2c92e,\n\t0x92722c85,\n\t0xa2bfe8a1,\n\t0xa81a664b,\n\t0xc24b8b70,\n\t0xc76c51a3,\n\t0xd192e819,\n\t0xd6990624,\n\t0xf40e3585,\n\t0x106aa070,\n\t0x19a4c116,\n\t0x1e376c08,\n\t0x2748774c,\n\t0x34b0bcb5,\n\t0x391c0cb3,\n\t0x4ed8aa4a,\n\t0x5b9cca4f,\n\t0x682e6ff3,\n\t0x748f82ee,\n\t0x78a5636f,\n\t0x84c87814,\n\t0x8cc70208,\n\t0x90befffa,\n\t0xa4506ceb,\n\t0xbef9a3f7,\n\t0xc67178f2,\n]);\n\nfunction rotr(x: number, n: number): number {\n\treturn (x >>> n) | (x << (32 - n));\n}\n\nfunction sha256(bytes: Uint8Array): Uint8Array {\n\tconst h = new Uint32Array([\n\t\t0x6a09e667,\n\t\t0xbb67ae85,\n\t\t0x3c6ef372,\n\t\t0xa54ff53a,\n\t\t0x510e527f,\n\t\t0x9b05688c,\n\t\t0x1f83d9ab,\n\t\t0x5be0cd19,\n\t]);\n\n\tconst byteLength = bytes.length;\n\tconst padded = new Uint8Array(Math.ceil((byteLength + 9) / 64) * 64);\n\tpadded.set(bytes);\n\tpadded[byteLength] = 0x80;\n\n\tconst view = new DataView(padded.buffer);\n\tconst bitLength = byteLength * 8;\n\tview.setUint32(padded.length - 8, Math.floor(bitLength / 0x100000000));\n\tview.setUint32(padded.length - 4, bitLength >>> 0);\n\n\tconst w = new Uint32Array(64);\n\n\tfor (let offset = 0; offset < padded.length; offset += 64) {\n\t\tfor (let i = 0; i < 16; i++) w[i] = view.getUint32(offset + i * 4);\n\t\tfor (let i = 16; i < 64; i++) {\n\t\t\tconst a0 = w[i - 15]!;\n\t\t\tconst a1 = w[i - 2]!;\n\t\t\tconst s0 = rotr(a0, 7) ^ rotr(a0, 18) ^ (a0 >>> 3);\n\t\t\tconst s1 = rotr(a1, 17) ^ rotr(a1, 19) ^ (a1 >>> 10);\n\t\t\tw[i] = (w[i - 16]! + s0 + w[i - 7]! + s1) >>> 0;\n\t\t}\n\n\t\tlet a = h[0]!, b = h[1]!, c = h[2]!, d = h[3]!, e = h[4]!, f = h[5]!, g = h[6]!, hh = h[7]!;\n\n\t\tfor (let i = 0; i < 64; i++) {\n\t\t\tconst s1 = rotr(e, 6) ^ rotr(e, 11) ^ rotr(e, 25);\n\t\t\tconst ch = (e & f) ^ (~e & g);\n\t\t\tconst t1 = (hh + s1 + ch + SHA256_K[i]! + w[i]!) >>> 0;\n\t\t\tconst s0 = rotr(a, 2) ^ rotr(a, 13) ^ rotr(a, 22);\n\t\t\tconst maj = (a & b) ^ (a & c) ^ (b & c);\n\t\t\tconst t2 = (s0 + maj) >>> 0;\n\n\t\t\thh = g;\n\t\t\tg = f;\n\t\t\tf = e;\n\t\t\te = (d + t1) >>> 0;\n\t\t\td = c;\n\t\t\tc = b;\n\t\t\tb = a;\n\t\t\ta = (t1 + t2) >>> 0;\n\t\t}\n\n\t\th[0] = h[0]! + a;\n\t\th[1] = h[1]! + b;\n\t\th[2] = h[2]! + c;\n\t\th[3] = h[3]! + d;\n\t\th[4] = h[4]! + e;\n\t\th[5] = h[5]! + f;\n\t\th[6] = h[6]! + g;\n\t\th[7] = h[7]! + hh;\n\t}\n\n\tconst out = new Uint8Array(32);\n\tconst outView = new DataView(out.buffer);\n\tfor (let i = 0; i < 8; i++) outView.setUint32(i * 4, h[i]!);\n\treturn out;\n}\n\nconst HEX = /* @__PURE__ */ (() => {\n\tconst table = new Array<string>(256);\n\tfor (let i = 0; i < 256; i++) table[i] = i.toString(16).padStart(2, '0');\n\treturn table;\n})();\n\nconst HEX_CODES = /* @__PURE__ */ (() => {\n\tconst codes = new Uint8Array(512);\n\tfor (let i = 0; i < 256; i++) {\n\t\tcodes[i * 2] = HEX[i]!.charCodeAt(0);\n\t\tcodes[i * 2 + 1] = HEX[i]!.charCodeAt(1);\n\t}\n\treturn codes;\n})();\n\nfunction toHex(bytes: Uint8Array): string {\n\tif (bytes.length > 65536) return toHexLarge(bytes);\n\n\tlet hex = '';\n\tfor (let i = 0; i < bytes.length; i++) hex += HEX[bytes[i]!];\n\treturn hex;\n}\n\nfunction toHexLarge(bytes: Uint8Array): string {\n\tconst codes = new Uint8Array(bytes.length * 2);\n\tfor (let i = 0, j = 0; i < bytes.length; i++, j += 2) {\n\t\tconst k = bytes[i]! * 2;\n\t\tcodes[j] = HEX_CODES[k]!;\n\t\tcodes[j + 1] = HEX_CODES[k + 1]!;\n\t}\n\n\t// Chunked to stay below engine argument count limits of `apply`\n\tconst parts: string[] = [];\n\tfor (let offset = 0; offset < codes.length; offset += 16384) {\n\t\tparts.push(String.fromCharCode.apply(null, codes.subarray(offset, offset + 16384) as unknown as number[]));\n\t}\n\treturn parts.join('');\n}\n\ntype NodeCreateHash = (algorithm: string) => {\n\tupdate(data: string): { digest(encoding: 'hex'): string };\n};\n\nlet nodeCreateHash: NodeCreateHash | null | undefined;\n\nfunction getNodeCreateHash(): NodeCreateHash | null {\n\tif (nodeCreateHash !== undefined) return nodeCreateHash;\n\n\tlet resolved: NodeCreateHash | null;\n\ttry {\n\t\tconst nodeCrypto = (globalThis as any).process?.getBuiltinModule?.('node:crypto');\n\t\tresolved = typeof nodeCrypto?.createHash === 'function' ? nodeCrypto.createHash : null;\n\t} catch {\n\t\tresolved = null;\n\t}\n\n\treturn (nodeCreateHash = resolved);\n}\n\nlet encoder: TextEncoder | undefined;\n\nconst VIEW_TAGS: Record<string, string> = {\n\t// Stays empty - UInt8Array & Buffer params are processed identically by drivers\n\tUint8Array: '',\n\tInt8Array: 'i8',\n\tUint8ClampedArray: 'u8c',\n\tInt16Array: 'i16',\n\tUint16Array: 'u16',\n\tInt32Array: 'i32',\n\tUint32Array: 'u32',\n\tFloat16Array: 'f16',\n\tFloat32Array: 'f32',\n\tFloat64Array: 'f64',\n\tBigInt64Array: 'i64',\n\tBigUint64Array: 'u64',\n\tDataView: 'dv',\n};\n\nexport function serializeParam(value: unknown): string {\n\tswitch (typeof value) {\n\t\tcase 'undefined':\n\t\t\treturn 'u';\n\t\tcase 'string':\n\t\t\treturn 's' + JSON.stringify(value);\n\t\tcase 'number':\n\t\t\treturn 'd' + String(value);\n\t\tcase 'bigint':\n\t\t\treturn 'b' + value.toString();\n\t\tcase 'boolean':\n\t\t\treturn value ? 't' : 'f';\n\t\tcase 'object': {\n\t\t\tif (value === null) return 'n';\n\t\t\tif (Array.isArray(value)) return 'a[' + value.map(serializeParam).join(',') + ']';\n\t\t\tif (ArrayBuffer.isView(value)) {\n\t\t\t\tconst type = Object.prototype.toString.call(value).slice(8, -1);\n\t\t\t\treturn 'y' + (VIEW_TAGS[type] ?? type) + ':'\n\t\t\t\t\t+ toHex(new Uint8Array(value.buffer, value.byteOffset, value.byteLength));\n\t\t\t}\n\t\t\tif (typeof (value as { toJSON?: unknown }).toJSON === 'function') {\n\t\t\t\treturn 'J' + serializeParam((value as { toJSON(): unknown }).toJSON());\n\t\t\t}\n\t\t\tconst keys = Object.keys(value);\n\t\t\tlet out = 'o{';\n\t\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\t\tconst key = keys[i]!;\n\t\t\t\tout += (i ? ',' : '') + JSON.stringify(key) + ':' + serializeParam((value as any)[key]);\n\t\t\t}\n\t\t\treturn out + '}';\n\t\t}\n\t\tdefault:\n\t\t\treturn 'x' + String(value);\n\t}\n}\n\nexport async function hashQuery(sql: string, params?: any[]) {\n\tconst dataToHash = `${sql}-${serializeParam(params)}`;\n\n\tconst createHash = getNodeCreateHash();\n\tif (createHash) return createHash('sha256').update(dataToHash).digest('hex');\n\n\tencoder ??= new TextEncoder();\n\tconst data = encoder.encode(dataToHash);\n\n\tconst subtle = typeof globalThis.crypto !== 'undefined' ? globalThis.crypto.subtle : undefined;\n\n\treturn toHex(subtle ? new Uint8Array(await subtle.digest('SHA-256', data)) : sha256(data));\n}\n", "import { type Cache, NoopCache, strategyFor } from '~/cache/core/cache.ts';\nimport type { QueryMetadata, WithCacheConfig } from '~/cache/core/types.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleQueryError, TransactionRollbackError } from '~/errors.ts';\nimport type { Logger } from '~/logger.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport { getMigrationsToRun } from '~/migrator.utils.ts';\nimport { QueryPromise } from '~/query-promise.ts';\nimport type { AnyRelations, EmptyRelations } from '~/relations.ts';\nimport { fillPlaceholders, type Query, type SQL, sql } from '~/sql/sql.ts';\nimport type { SQLiteDialect } from '~/sqlite-core/dialect.ts';\nimport {\n\ttype PreparedQueryConfig as BasePreparedQueryConfig,\n\ttype SQLiteExecuteMethod,\n\tSQLitePreparedQuery,\n\tSQLiteSession,\n\ttype SQLiteTransactionConfig,\n} from '~/sqlite-core/session.ts';\nimport { upgradeAsyncIfNeeded, upgradeSyncIfNeeded } from '~/up-migrations/sqlite.ts';\nimport { assertUnreachable } from '~/utils.ts';\nimport { SQLiteAsyncDatabase } from './db.ts';\n\nexport interface SQLiteAsyncPreparedQueryConfig extends BasePreparedQueryConfig {\n\ttype: 'sync' | 'async';\n}\n\nexport type ExecuteResult<TType extends 'sync' | 'async', TResult> = TType extends 'async' ? Promise<TResult>\n\t: ExecuteResultSync<TResult>;\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 SQLiteQueryExecutors<TType extends 'sync' | 'async'> = Record<\n\t// `values` mirrors `all` in array mode, no need to define separate executor\n\tExclude<SQLiteExecuteMethod, 'values'>,\n\t(params: unknown[]) => Result<TType, any>\n>;\n\nexport type Result<TKind extends 'sync' | 'async', TResult> = TKind extends 'async' ? Promise<TResult> : TResult;\n\nexport class SQLiteAsyncPreparedQuery<T extends SQLiteAsyncPreparedQueryConfig> extends SQLitePreparedQuery {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncPreparedQuery';\n\n\tprivate fastPath: boolean;\n\n\tconstructor(\n\t\tprivate resultKind: 'sync' | 'async',\n\t\texecuteMethod: SQLiteExecuteMethod = 'all',\n\t\tprotected executors: SQLiteQueryExecutors<T['type']>,\n\t\tquery: Query,\n\t\tmapper: ((rows: any[]) => any) | undefined,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tprotected logger: Logger,\n\t\t// cache instance\n\t\tprotected cache: Cache | undefined,\n\t\t// per query related metadata\n\t\tprotected queryMetadata: QueryMetadata | undefined,\n\t\t// config that was passed through $withCache\n\t\tprotected cacheConfig: WithCacheConfig | undefined,\n\t\tprotected paramsInErrors: boolean | undefined,\n\t) {\n\t\tsuper(executeMethod, query, mapper, mode);\n\n\t\t// it means that no $withCache options were passed and it should be just enabled\n\t\tif (cache && cache.strategy() === 'all' && cacheConfig === undefined) {\n\t\t\tthis.cacheConfig = { enabled: true, autoInvalidate: true };\n\t\t}\n\t\tif (!this.cacheConfig?.enabled) {\n\t\t\tthis.cacheConfig = undefined;\n\t\t}\n\n\t\tthis.fastPath = cacheConfig === undefined && (cache === undefined || is(cache, NoopCache));\n\t}\n\n\t/** @internal */\n\tprotected async queryWithCache<T>(\n\t\tqueryString: string,\n\t\tparams: any[],\n\t\texecuteMethod: SQLiteExecuteMethod,\n\t\tquery: () => Promise<T>,\n\t): Promise<T> {\n\t\tconst cacheStrat = this.cache !== undefined && !is(this.cache, NoopCache)\n\t\t\t? await strategyFor(queryString, params, this.queryMetadata, this.cacheConfig)\n\t\t\t: { type: 'skip' as const };\n\n\t\tif (cacheStrat.type === 'skip') {\n\t\t\treturn query().catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(queryString, this.paramsInErrors ? params : undefined, e as Error);\n\t\t\t});\n\t\t}\n\n\t\tconst cache = this.cache!;\n\n\t\tif (cacheStrat.type === 'invalidate') {\n\t\t\treturn query().then(async (res) => {\n\t\t\t\tawait cache.onMutate({ tables: cacheStrat.tables });\n\t\t\t\treturn res;\n\t\t\t}).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(queryString, this.paramsInErrors ? params : undefined, e as Error);\n\t\t\t});\n\t\t}\n\n\t\tif (cacheStrat.type === 'try') {\n\t\t\tconst { tables, key: _key, isTag, autoInvalidate, config } = cacheStrat;\n\t\t\tconst key = `${executeMethod}_${_key}`;\n\n\t\t\tconst fromCache = await cache.get(\n\t\t\t\tkey,\n\t\t\t\ttables,\n\t\t\t\tisTag,\n\t\t\t\tautoInvalidate,\n\t\t\t);\n\n\t\t\tif (fromCache === undefined) {\n\t\t\t\tconst result = await query().catch((e) => {\n\t\t\t\t\tthrow new DrizzleQueryError(queryString, this.paramsInErrors ? params : undefined, e as Error);\n\t\t\t\t});\n\t\t\t\t// put actual key\n\t\t\t\tawait cache.put(\n\t\t\t\t\tkey,\n\t\t\t\t\tresult,\n\t\t\t\t\t// make sure we send tables that were used in a query only if user wants to invalidate it on each write\n\t\t\t\t\tautoInvalidate ? tables : [],\n\t\t\t\t\tisTag,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t\t// put flag if we should invalidate or not\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\treturn fromCache as unknown as T;\n\t\t}\n\n\t\tassertUnreachable(cacheStrat);\n\t}\n\n\toverride run(placeholderValues: Record<string, unknown> = {}): Result<T['type'], T['run']> {\n\t\tconst { query, logger, executors, fastPath, resultKind } = this;\n\t\tconst sql = query._sql ? query._sql.join(' ') : query.sql;\n\t\tconst params = query.params.length === 0\n\t\t\t? query.params\n\t\t\t: fillPlaceholders(query.params, placeholderValues);\n\t\tlogger.logQuery(sql, params);\n\n\t\tif (resultKind === 'sync') {\n\t\t\ttry {\n\t\t\t\treturn (<SQLiteQueryExecutors<'sync'>> executors).run(params);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(sql, this.paramsInErrors ? params : undefined, e as Error);\n\t\t\t}\n\t\t}\n\n\t\treturn fastPath\n\t\t\t? (<SQLiteQueryExecutors<'async'>> executors).run(params).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(sql, this.paramsInErrors ? params : undefined, e as Error);\n\t\t\t})\n\t\t\t: this.queryWithCache(sql, params, 'run', () => (<SQLiteQueryExecutors<'async'>> executors).run(params));\n\t}\n\n\toverride all(placeholderValues: Record<string, unknown> = {}): Result<T['type'], T['all']> {\n\t\tconst { query, logger, executors, mapper, fastPath, resultKind } = this;\n\t\tconst sql = query._sql ? query._sql.join(' ') : query.sql;\n\t\tconst params = query.params.length === 0\n\t\t\t? query.params\n\t\t\t: fillPlaceholders(query.params, placeholderValues);\n\t\tlogger.logQuery(sql, params);\n\n\t\tif (resultKind === 'sync') {\n\t\t\tlet res: any;\n\t\t\ttry {\n\t\t\t\tres = (<SQLiteQueryExecutors<'sync'>> executors).all(params);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(sql, this.paramsInErrors ? params : undefined, e as Error);\n\t\t\t}\n\n\t\t\tif (!mapper) return res;\n\t\t\treturn mapper(res);\n\t\t}\n\n\t\tconst res = fastPath\n\t\t\t? (<SQLiteQueryExecutors<'async'>> executors).all(params).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(sql, this.paramsInErrors ? params : undefined, e as Error);\n\t\t\t})\n\t\t\t: this.queryWithCache(sql, params, 'all', () => (<SQLiteQueryExecutors<'async'>> executors).all(params));\n\t\tif (!mapper) return res;\n\n\t\treturn res.then((rows) => mapper(rows)) as Result<T['type'], T['all']>;\n\t}\n\n\toverride get(placeholderValues: Record<string, unknown> = {}): Result<T['type'], T['get']> {\n\t\tconst { query, logger, executors, mapper, fastPath, resultKind } = this;\n\t\tconst sql = query._sql ? query._sql.join(' ') : query.sql;\n\t\tconst params = query.params.length === 0\n\t\t\t? query.params\n\t\t\t: fillPlaceholders(query.params, placeholderValues);\n\t\tlogger.logQuery(sql, params);\n\n\t\tif (resultKind === 'sync') {\n\t\t\tlet res: any;\n\t\t\ttry {\n\t\t\t\tres = (<SQLiteQueryExecutors<'sync'>> executors).get(params);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(sql, this.paramsInErrors ? params : undefined, e as Error);\n\t\t\t}\n\n\t\t\tif (!res) return undefined as Result<T['type'], T['get']>;\n\t\t\tif (!mapper) return res;\n\n\t\t\treturn mapper([res])[0];\n\t\t}\n\n\t\tconst res = fastPath\n\t\t\t? (<SQLiteQueryExecutors<'async'>> executors).get(params).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(sql, this.paramsInErrors ? params : undefined, e as Error);\n\t\t\t})\n\t\t\t: this.queryWithCache(sql, params, 'get', () => (<SQLiteQueryExecutors<'async'>> executors).get(params));\n\n\t\t// Convert potential nulls from drivers to undefined\n\t\tif (!mapper) return res.then((row) => row ? row : undefined);\n\n\t\treturn res.then((row) => row ? mapper([row])[0] : undefined) as Result<T['type'], T['get']>;\n\t}\n\n\toverride values(placeholderValues: Record<string, unknown> = {}): Result<T['type'], T['values']> {\n\t\tconst { query, logger, executors, fastPath, resultKind } = this;\n\t\tconst sql = query._sql ? query._sql.join(' ') : query.sql;\n\t\tconst params = query.params.length === 0\n\t\t\t? query.params\n\t\t\t: fillPlaceholders(query.params, placeholderValues);\n\t\tlogger.logQuery(sql, params);\n\n\t\tif (resultKind === 'sync') {\n\t\t\ttry {\n\t\t\t\treturn (<SQLiteQueryExecutors<'sync'>> executors).all(params);\n\t\t\t} catch (e) {\n\t\t\t\tthrow new DrizzleQueryError(sql, this.paramsInErrors ? params : undefined, e as Error);\n\t\t\t}\n\t\t}\n\n\t\tconst res = fastPath\n\t\t\t? (<SQLiteQueryExecutors<'async'>> executors).all(params).catch((e) => {\n\t\t\t\tthrow new DrizzleQueryError(sql, this.paramsInErrors ? params : undefined, e as Error);\n\t\t\t})\n\t\t\t: this.queryWithCache(sql, params, 'values', () => (<SQLiteQueryExecutors<'async'>> executors).all(params));\n\n\t\treturn res;\n\t}\n\n\toverride execute(placeholderValues?: Record<string, unknown>): ExecuteResult<T['type'], T['execute']> {\n\t\tif (this.resultKind === '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)) as ExecuteResult<\n\t\t\tT['type'],\n\t\t\tT['execute']\n\t\t>;\n\t}\n}\n\nexport abstract class SQLiteAsyncSession<\n\tTResultKind extends 'sync' | 'async',\n\tTRunResult,\n\tTRelations extends AnyRelations = EmptyRelations,\n> extends SQLiteSession<TRunResult, TRelations> {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncSession';\n\n\tdeclare readonly dialect: SQLiteDialect;\n\n\tconstructor(\n\t\tdialect: SQLiteDialect,\n\t\tprotected resultKind: TResultKind,\n\t) {\n\t\tsuper(dialect);\n\t}\n\n\tabstract override prepareQuery(\n\t\tquery: Query,\n\t\tmode: 'arrays' | 'objects' | 'raw',\n\t\tprepare: boolean,\n\t\texecuteMethod?: SQLiteExecuteMethod,\n\t\tmapper?: (rows: any[]) => any,\n\t\tqueryMetadata?: QueryMetadata,\n\t\tcacheConfig?: WithCacheConfig,\n\t): SQLiteAsyncPreparedQuery<SQLiteAsyncPreparedQueryConfig & { type: TResultKind }>;\n\n\tabstract transaction<T>(\n\t\ttransaction: (\n\t\t\ttx: SQLiteAsyncTransaction<TResultKind, TRunResult, TRelations>,\n\t\t) => Result<TResultKind, T>,\n\t\tconfig?: SQLiteTransactionConfig,\n\t): Result<TResultKind, T>;\n\n\trun(query: SQL): Result<TResultKind, TRunResult> {\n\t\treturn this.prepareQuery(this.dialect.sqlToQuery(query), 'raw', false).run() as Result<\n\t\t\tTResultKind,\n\t\t\tTRunResult\n\t\t>;\n\t}\n\n\tobjects<T = unknown>(query: SQL): Result<TResultKind, T[]> {\n\t\treturn this.prepareQuery(this.dialect.sqlToQuery(query), 'objects', false).all() as Result<\n\t\t\tTResultKind,\n\t\t\tT[]\n\t\t>;\n\t}\n\n\tobject<T = unknown>(query: SQL): Result<TResultKind, T> {\n\t\treturn this.prepareQuery(this.dialect.sqlToQuery(query), 'objects', false).get() as Result<\n\t\t\tTResultKind,\n\t\t\tT\n\t\t>;\n\t}\n\n\tarrays<T extends any[] = unknown[]>(\n\t\tquery: SQL,\n\t): Result<TResultKind, T[]> {\n\t\treturn this.prepareQuery(this.dialect.sqlToQuery(query), 'arrays', false).all() as Result<\n\t\t\tTResultKind,\n\t\t\tT[]\n\t\t>;\n\t}\n\n\tarray<T extends any[] = unknown[]>(\n\t\tquery: SQL,\n\t): Result<TResultKind, T> {\n\t\treturn this.prepareQuery(this.dialect.sqlToQuery(query), 'arrays', false).get() as Result<\n\t\t\tTResultKind,\n\t\t\tT\n\t\t>;\n\t}\n}\n\nexport abstract class SQLiteAsyncTransaction<\n\tTResultType extends 'sync' | 'async',\n\tTRunResult,\n\tTRelations extends AnyRelations = EmptyRelations,\n> extends SQLiteAsyncDatabase<TResultType, TRunResult, TRelations> {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncTransaction';\n\n\tconstructor(\n\t\tresultType: TResultType,\n\t\tdialect: SQLiteDialect,\n\t\tsession: SQLiteAsyncSession<TResultType, TRunResult, TRelations>,\n\t\trelations: TRelations,\n\t\tprotected readonly nestedIndex = 0,\n\t\tforbidJsonb?: boolean,\n\t) {\n\t\tsuper(resultType, dialect, session, relations, forbidJsonb);\n\t}\n\n\trollback(): never {\n\t\tthrow new TransactionRollbackError();\n\t}\n}\n\nexport function migrateSync(\n\tmigrations: MigrationMeta[],\n\tsession: SQLiteAsyncSession<'sync', unknown, AnyRelations>,\n\tconfig?: string | Omit<MigrationConfig, 'migrationsFolder'>,\n): void | MigratorInitFailResponse {\n\tconst migrationsTable = config === undefined\n\t\t? '__drizzle_migrations'\n\t\t: typeof config === 'string'\n\t\t? '__drizzle_migrations'\n\t\t: (config.migrationsTable ?? '__drizzle_migrations');\n\n\t// Detect DB version and upgrade table schema if needed\n\tconst { newDb } = upgradeSyncIfNeeded(migrationsTable, session, migrations);\n\n\tif (newDb) {\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid INTEGER PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric,\n\t\t\t\tname text,\n\t\t\t\tapplied_at TEXT\n\t\t\t)`;\n\t\tsession.run(migrationTableCreate);\n\t}\n\n\tconst dbMigrations = session.objects<{\n\t\tid: number;\n\t\thash: string;\n\t\tcreated_at: string;\n\t\tname: string | null;\n\t}>(\n\t\tsql`SELECT id, hash, created_at, name FROM ${sql.identifier(migrationsTable)}`,\n\t);\n\n\tif (typeof config === 'object' && config.init) {\n\t\tif (dbMigrations.length) {\n\t\t\treturn { exitCode: 'databaseMigrations' as const };\n\t\t}\n\n\t\tif (migrations.length > 1) {\n\t\t\treturn { exitCode: 'localMigrations' as const };\n\t\t}\n\n\t\tconst [migration] = migrations;\n\n\t\tif (!migration) return;\n\n\t\tsession.run(\n\t\t\tsql`insert into ${\n\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\tnew Date().toISOString()\n\t\t\t})`,\n\t\t);\n\n\t\treturn;\n\t}\n\n\tconst migrationsToRun = getMigrationsToRun({\n\t\tlocalMigrations: migrations,\n\t\tdbMigrations,\n\t});\n\tsession.run(sql`BEGIN`);\n\n\ttry {\n\t\tfor (const migration of migrationsToRun) {\n\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\tsession.run(sql.raw(stmt));\n\t\t\t}\n\t\t\tsession.run(\n\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\t\tnew Date().toISOString()\n\t\t\t\t})`,\n\t\t\t);\n\t\t}\n\n\t\tsession.run(sql`COMMIT`);\n\t} catch (e) {\n\t\ttry {\n\t\t\tsession.run(sql`ROLLBACK`);\n\t\t} catch {\n\t\t\t// original error takes priority\n\t\t}\n\t\tthrow e;\n\t}\n}\n\nexport async function migrateAsync(\n\tmigrations: MigrationMeta[],\n\tdb: SQLiteAsyncDatabase<'async', unknown, AnyRelations>,\n\tconfig?: string | Omit<MigrationConfig, 'migrationsFolder'>,\n): Promise<void | MigratorInitFailResponse> {\n\tconst migrationsTable = config === undefined\n\t\t? '__drizzle_migrations'\n\t\t: typeof config === 'string'\n\t\t? '__drizzle_migrations'\n\t\t: (config.migrationsTable ?? '__drizzle_migrations');\n\n\t// Detect DB version and upgrade table schema if needed\n\tconst { newDb } = await upgradeAsyncIfNeeded(\n\t\tmigrationsTable,\n\t\tdb,\n\t\tmigrations,\n\t);\n\n\tif (newDb) {\n\t\tconst migrationTableCreate = sql`\n\t\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\t\tid INTEGER PRIMARY KEY,\n\t\t\t\thash text NOT NULL,\n\t\t\t\tcreated_at numeric,\n\t\t\t\tname text,\n\t\t\t\tapplied_at TEXT\n\t\t\t)\n\t\t`;\n\t\tawait db.session.run(migrationTableCreate);\n\t}\n\n\tconst dbMigrations = await db.session.objects<{\n\t\tid: number;\n\t\thash: string;\n\t\tcreated_at: string;\n\t\tname: string | null;\n\t}>(\n\t\tsql`SELECT id, hash, created_at, name FROM ${sql.identifier(migrationsTable)};`,\n\t);\n\n\tif (typeof config === 'object' && config.init) {\n\t\tif (dbMigrations.length) {\n\t\t\treturn { exitCode: 'databaseMigrations' as const };\n\t\t}\n\n\t\tif (migrations.length > 1) {\n\t\t\treturn { exitCode: 'localMigrations' as const };\n\t\t}\n\n\t\tconst [migration] = migrations;\n\n\t\tif (!migration) return;\n\n\t\tawait db.session.run(\n\t\t\tsql`insert into ${\n\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\tnew Date().toISOString()\n\t\t\t})`,\n\t\t);\n\n\t\treturn;\n\t}\n\n\tconst migrationsToRun = getMigrationsToRun({\n\t\tlocalMigrations: migrations,\n\t\tdbMigrations,\n\t});\n\tawait db.session.transaction(async (tx) => {\n\t\tfor (const migration of migrationsToRun) {\n\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\tawait tx.run(sql.raw(stmt));\n\t\t\t}\n\t\t\tawait tx.run(\n\t\t\t\tsql`insert into ${\n\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\t\tnew Date().toISOString()\n\t\t\t\t})`,\n\t\t\t);\n\t\t}\n\t});\n}\n"],
5
+ "mappings": ";AAAA,IAAa,aAAa,uBAAO,IAAI,oBAAoB;AAWzD,IAAM,qBAAqB,oBAAI,QAA6B;AAC5D,SAAS,aAAa,MAA2B;AAChD,QAAM,QAAQ,oBAAI,IAAY;AAC9B,WAAS,MAAW,MAAM,KAAK,MAAM,OAAO,eAAe,GAAG,EAC7D,KAAI,cAAc,IAAK,OAAM,IAAI,IAAI,UAAA,CAAW;AAEjD,qBAAmB,IAAI,MAAM,KAAK;AAClC,SAAO;AACR;AAEA,IAAM,oBAAoB,SAAS,UAAU,OAAO,WAAA;AACpD,SAAgB,GAAsC,OAAY,MAAmC;AAEpG,MAAI,kBAAkB,KAAK,MAAM,KAAK,EAAG,QAAO;AAChD,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AAExD,QAAM,OAAO,OAAO,eAAe,KAAK,GAAG;AAC3C,MAAI,OAAO,SAAS,WAAY,QAAO;AAEvC,UAAQ,mBAAmB,IAAI,IAAI,KAAK,aAAa,IAAI,GAAG,IAAI,KAAK,UAAA,CAAW;AACjF;AAEA,SAAgB,cAAc,OAAyC;AACtE,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO;AAExD,QAAM,OAAO,OAAO,eAAe,KAAK,GAAG;AAC3C,MAAI,OAAO,SAAS,WAAY,QAAO;AAEvC,SAAO,mBAAmB,IAAI,IAAI,KAAK,aAAa,IAAI;AACzD;;;ACtCA,IAAa,eAAb,cAAkC,MAAM;EACvC,QAAiB,UAAA,IAAsB;EAEvC,QAAiB,OAAO,WAAA,EAAa,OAAyB;AAC7D,WAAO,GAAG,OAAO,IAAI;EACtB;EAEA,YAAY,EAAE,SAAS,MAAA,GAAgD;AACtE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,QAAQ;EACd;AACD;AAEA,IAAa,oBAAb,MAAaA,2BAA0B,MAAM;EAQpC;EACA;EACS;EATjB,QAAiB,UAAA,IAAsB;EAEvC,QAAiB,OAAO,WAAA,EAAa,OAAyB;AAC7D,WAAO,GAAG,OAAO,IAAI;EACtB;EAEA,YACC,OACA,QACA,OACC;AACD,UAAM,SAAS,iBAAiB,KAAA;UAAkB,MAAA,KAAW,iBAAiB,KAAA,EAAO;AAJ9E,SAAA,QAAA;AACA,SAAA,SAAA;AACS,SAAA,QAAA;AAGhB,SAAK,OAAO;AACZ,UAAM,kBAAkB,MAAMA,kBAAiB;AAG/C,QAAI,MAAO,MAAc,QAAQ;EAClC;AACD;AAEA,IAAa,2BAAb,cAA8C,aAAa;EAC1D,QAA0B,UAAA,IAAsB;EAEhD,cAAc;AACb,UAAM,EAAE,SAAS,WAAW,CAAC;AAC7B,SAAK,OAAO;EACb;AACD;;;ACzCA,IAAa,YAAY,uBAAO,IAAI,cAAc;AAGlD,IAAa,cAAc,uBAAO,IAAI,gBAAgB;AAGtD,IAAa,eAAe,uBAAO,IAAI,iBAAiB;AAGxD,IAAa,qBAAqB,uBAAO,IAAI,4BAA4B;AAGzE,IAAa,eAAe,uBAAO,IAAI,sBAAsB;AAG7D,IAAa,WAAW,uBAAO,IAAI,kBAAkB;AAGrD,IAAa,WAAW,uBAAO,IAAI,kBAAkB;AAGrD,IAAa,UAAU,uBAAO,IAAI,iBAAiB;AAGnD,IAAa,YAAY,uBAAO,IAAI,mBAAmB;AAGvD,IAAa,qBAAqB,uBAAO,IAAI,4BAA4B;;;ACczE,IAAM,iBAAiB,uBAAO,IAAI,wBAAwB;AAW1D,IAAa,QAAb,MAA4D;EAC3D,QAAiB,UAAA,IAAsB;EACvC,QAAQ,OAAO,WAAA,EAAa,OAAyB;AACpD,WAAO,GAAG,OAAO,IAAI;EACtB;;EAKA,OAAgB,SAAS;IACxB,MAAM;IACN,QAAQ;IACM;IACd,SAAS;IACW;IACV;IACD;IACW;IACV;EACX;;;;;EAMA,CAAC,SAAA;;;;;EAMD,CAAC,YAAA;;EAGD,CAAC,WAAA;;EAGD,CAAC,YAAA;;EAGD,CAAC,kBAAA;;;;;EAMD,CAAC,QAAA;;;;;;EAOD,CAAC,QAAA;;EAMD,CAAC,OAAA,IAAW;;EAGZ,CAAC,cAAA,IAAkB;;EAGnB,CAAC,kBAAA,IAAwF;EAEzF,YAAY,MAAc,QAA4B,UAAkB;AACvE,SAAK,SAAA,IAAa,KAAK,YAAA,IAAgB;AACvC,SAAK,WAAA,IAAe;AACpB,SAAK,QAAA,IAAY;AACjB,SAAK,QAAA,IAAY,SAAS,GAAG,MAAA,IAAU,IAAA,KAAS;EACjD;AACD;AAyBA,SAAgB,aAAqC,OAA0B;AAC9E,SAAO,MAAM,SAAA;AACd;;;AC3JA,IAAa,iBAAiB,uBAAO,IAAI,wBAAwB;;;AC8BjE,IAAM,OAAA,CAAyE,MAAM;AACrF,KAAK,SAAS;AAiBd,IAAsB,SAAtB,MAGwE;EACvE,QAAiB,UAAA,IAAsB;EACvC,QAAQ,OAAO,WAAA,EAAa,OAAyB;AACpD,WAAO,GAAG,OAAO,IAAI;EACtB;;EAKA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,aAAuC;EACvC,YAAmE;EACnE,oBAAkE;EAClE;EACA;EACA;;EAGA;;EAGA;;EAGA,SAAyB;EAAC;EAE1B,YACC,OACA,QACC;AACD,SAAK,SAAS;AACd,SAAK,OAAO;AACZ,SAAK,QAAQ;AAEb,SAAK,OAAO,OAAO;AACnB,SAAK,UAAU;AACf,SAAK,YAAY,OAAO;AACxB,SAAK,UAAU,OAAO;AACtB,SAAK,UAAU,OAAO;AACtB,SAAK,YAAY,OAAO;AACxB,SAAK,aAAa,OAAO;AACzB,SAAK,aAAa,OAAO;AACzB,SAAK,UAAU,OAAO;AACtB,SAAK,WAAW,OAAO;AACvB,SAAK,aAAa,OAAO;AACzB,SAAK,aAAa,OAAO;AACzB,SAAK,WAAW,OAAO;AACvB,SAAK,aAAa,OAAO;AACzB,SAAK,YAAY,OAAO;AACxB,SAAK,oBAAoB,OAAO;AAChC,SAAK,SAAgC,OAAQ,QAAA;AAC7C,SAAK,gBAA+C,OAAQ,eAAA;EAC7D;EAIA,qBAAqB;EAErB,mBAAmB;;EAInB,YAAY;AACX,WAAO;EACR;;EAGA,sBAA+B;AAC9B,WAAO,KAAK,OAAO,cAAc,UAAa,KAAK,OAAO,UAAU,SAAS;EAC9E;;EAGA,CAAC,cAAA,IAAwB;AACxB,WAAO;EACR;AACD;;;ACtIA,IAAa,cAAb,MAA+C;EAMzB;EALrB,QAAiB,UAAA,IAAsB;EACvC,QAAQ,OAAO,WAAA,EAAa,OAAyB;AACpD,WAAO,GAAG,OAAO,IAAI;EACtB;EAEA,YAAY,OAAwB;AAAf,SAAA,QAAA;EAAgB;AACtC;AAGA,IAAa,qBAAqB;EACjC,MAAM,IAAI,YAAY,IAAI;EAC1B,KAAK,IAAI,YAAY,GAAG;EACxB,KAAK,IAAI,YAAY,GAAG;EACxB,KAAK,IAAI,YAAY,GAAG;EACxB,MAAM,IAAI,YAAY,IAAI;EAC1B,MAAM,IAAI,YAAY,IAAI;EAC1B,QAAQ,IAAI,YAAY,MAAM;EAC9B,KAAK,IAAI,YAAY,GAAG;EACxB,SAAS,IAAI,YAAY,SAAS;EAClC,MAAM,IAAI,YAAY,MAAM;EAC5B,SAAS,IAAI,YAAY,OAAO;EAChC,SAAS,IAAI,YAAY,OAAO;EAEhC,OAAO,IAAI,YAAY,KAAK;EAC5B,QAAQ,IAAI,YAAY,MAAM;EAC9B,OAAO,IAAI,YAAY,KAAK;EAC5B,QAAQ,IAAI,YAAY,MAAM;EAC9B,OAAO,IAAI,YAAY,KAAK;EAC5B,QAAQ,IAAI,YAAY,MAAM;EAC9B,QAAQ,IAAI,YAAY,MAAM;EAC9B,YAAY,IAAI,YAAY,UAAU;EACtC,WAAW,IAAI,YAAY,SAAS;EACpC,UAAU,IAAI,YAAY,QAAQ;EAClC,SAAS,IAAI,YAAY,OAAO;EAEhC,SAAS,IAAI,YAAY,OAAO;EAChC,WAAW,IAAI,YAAY,SAAS;EACpC,YAAY,IAAI,YAAY,UAAU;EACtC,WAAW,IAAI,YAAY,SAAS;EACpC,UAAU,IAAI,YAAY,QAAQ;EAClC,YAAY,IAAI,YAAY,UAAU;EACtC,QAAQ,IAAI,YAAY,MAAM;EAC9B,SAAS,IAAI,YAAY,OAAO;EAChC,gBAAgB,IAAI,YAAY,cAAc;EAC9C,gBAAgB,IAAI,YAAY,cAAc;EAC9C,QAAQ,IAAI,YAAY,MAAM;EAC9B,WAAW,IAAI,YAAY,SAAS;EACpC,cAAc,IAAI,YAAY,YAAY;EAC1C,QAAQ,IAAI,YAAY,MAAM;EAC9B,SAAS,IAAI,YAAY,OAAO;EAChC,WAAW,IAAI,YAAY,SAAS;EACpC,YAAY,IAAI,YAAY,UAAU;EACtC,YAAY,IAAI,YAAY,UAAU;EACtC,WAAW,IAAI,YAAY,SAAS;EAEpC,0BAA0B,IAAI,YAAY,wBAAwB;EAClE,8BAA8B,IAAI,YAAY,4BAA4B;EAC1E,uBAAuB,IAAI,YAAY,qBAAqB;EAC5D,0BAA0B,IAAI,YAAY,wBAAwB;EAClE,QAAQ,IAAI,YAAY,MAAM;EAC9B,QAAQ,IAAI,YAAY,MAAM;EAC9B,UAAU,IAAI,YAAY,QAAQ;EAClC,QAAQ,IAAI,YAAY,MAAM;EAC9B,UAAU,IAAI,YAAY,QAAQ;AACnC;;;ACvEA,IAAa,iBAAiB,uBAAO,IAAI,wBAAwB;;;ACOjE,IAAM,gBAAgB,uBAAO,IAAI,uBAAuB;AA6BxD,IAAsB,OAAtB,MAA8D;EAC7D,QAAiB,UAAA,IAAsB;EACvC,QAAQ,OAAO,WAAA,EAAa,OAAyB;AACpD,WAAO,GAAG,OAAO,IAAI;EACtB;;EAKA,CAAC,cAAA;;EAWD,CAAC,aAAA,IAAiB;;EAGlB,KAAY,SAAA,IAAa;AACxB,WAAO,KAAK,cAAA,EAAgB;EAC7B;;EAGA,KAAY,WAAA,IAAe;AAC1B,WAAO,KAAK,cAAA,EAAgB;EAC7B;;EAGA,KAAY,OAAA,IAAW;AACtB,WAAO,KAAK,cAAA,EAAgB;EAC7B;;EAGA,KAAY,YAAA,IAAgB;AAC3B,WAAO,KAAK,cAAA,EAAgB;EAC7B;;EAGA,KAAY,YAAA,IAAgB;AAC3B,WAAQ,KAAK,cAAA,EAAgB;EAC9B;EAOA,YACC,EAAE,MAAM,QAAQ,gBAAgB,MAAA,GAM/B;AACD,SAAK,cAAA,IAAkB;MACtB;MACA,cAAc;MACd;MACA;MACO;MACP,YAAY,CAAC;MACb,SAAS;IACV;EACD;AACD;;;AC9FA,IAAa,WAAb,MAGwB;EACvB,QAAiB,UAAA,IAAsB;EACvC,QAAQ,OAAO,WAAA,EAAa,OAAyB;AACpD,WAAO,GAAG,OAAO,IAAI;EACtB;;EAcA,KAAY,SAAA,IAAqB;AAChC,WAAO,KAAK,EAAE;EACf;;EAGA,KAAY,WAAA,IAAmC;EAE/C;;EAGA,KAAY,YAAA,IAAwB;AACnC,WAAO,KAAK,EAAE;EACf;;EAGA,KAAY,OAAA,IAAoB;AAC/B,WAAO;EACR;;EAGA,KAAY,YAAA,IAAyC;AACpD,WAAO,KAAK,EAAE;EACf;EAEA,YAAYC,MAAU,QAAyB,OAAe,SAAS,OAAO;AAC7E,SAAK,IAAI;MACR,OAAO;MACP,KAAAA;MACA,gBAAgB;MACT;MACP;IACD;EACD;AAKD;AAEA,IAAa,eAAb,cAGU,SAA6B;EACtC,QAA0B,UAAA,IAAsB;AACjD;;;ACvDA,IAAa,eAAe;AAG5B,IAAa,SAAS,EACrB,gBAAoD,MAAgB,IAAsB;AAExF,SAAO,GAAG;AA4BZ,EACD;;;ACvCA,IAAa,qBAAb,MAAgC;EAC/B,QAAiB,UAAA,IAAsB;EACvC,QAAQ,OAAO,WAAA,EAAa,OAAyB;AACpD,WAAO,GAAG,OAAO,IAAI;EACtB;AACD;AA+CA,SAAgB,aAAa,OAAqC;AACjE,SAAO,UAAU,QAAQ,UAAU,UAAa,OAAQ,MAAc,WAAW;AAClF;AAEA,IAAa,MAAb,MAAaC,KAA0C;EAgBjC;EAfrB,QAAiB,UAAA,IAAsB;EACvC,QAAQ,OAAO,WAAA,EAAa,OAAyB;AACpD,WAAO,GAAG,OAAO,IAAI;EACtB;;EAQA,UAAsC;;EAEtC,qBAA4B;EAE5B,YAAY,aAAkC;AAAzB,SAAA,cAAA;EAA0B;EAE/C,OAAO,OAAkB;AACxB,SAAK,YAAY,KAAK,GAAG,MAAM,WAAW;AAC1C,WAAO;EACR;EAEA,QAAQ,QAAiC;AACxC,QAAI,CAAC,aAAc,QAAO,KAAK,2BAA2B,KAAK,aAAa,MAAM;AAElF,WAAO,OAAO,gBAAgB,oBAAA,CAAqB,SAAS;AAC3D,YAAM,QAAQ,KAAK,2BAA2B,KAAK,aAAa,MAAM;AACtE,YAAM,cAAc;QACnB,sBAAsB,MAAM;QAC5B,wBAAwB,KAAK,UAAU,MAAM,MAAM;MACpD,CAAC;AACD,aAAO;IACR,CAAC;EACF;EAEA,2BAA2B,QAAoB,SAAkC;AAChF,UAAM,MAAM,EAAE,KAAK,GAAG;AACtB,UAAM,SAAoB,CAAC;AAC3B,UAAM,SAA+B,QAAQ,SAAS,CAAC,IAAI;AAE3D,SAAK,WACJ,QACA,SACA,QAAQ,mBAAmB,EAAE,OAAO,EAAE,GACtC,QAAQ,gBAAgB,KAAK,oBAC7B,KACA,QACA,MACD;AAEA,UAAM,QAAQ,IAAI;AAClB,QAAI,WAAW,OACd,QAAO;MACN,KAAK;MACL;IACD;AAGD,UAAM,WAAqB,IAAI,MAAM,OAAO,MAAM;AAClD,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,EAAE,EACpC,UAAS,CAAA,IAAK,MAAM,MAAM,OAAO,CAAA,GAAI,IAAI,IAAI,OAAO,SAAS,OAAO,IAAI,CAAA,IAAK,MAAM,MAAM;AAG1F,WAAO;MACN,KAAK;MACL;MACA,MAAM,OAAO,OAAO,UAAU,EAAE,KAAK,SAAS,CAAC;IAChD;EACD;EAEA,WACC,QACA,QACA,iBACA,cACA,KACA,QACA,QACO;AACP,UAAM,EACL,YACA,aACA,QACA,aAAA,IACG;AAEJ,aAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,EAAE,GAAG;AACvC,UAAI,WAAW,OAAW,QAAO,KAAK,IAAI,IAAI,MAAM;AAEpD,YAAM,QAAQ,OAAO,CAAA;AACrB,YAAM,OAAO,YAAY,KAAK;AAE9B,UAAI,QAAQ,OAAO,MAAM,WAAW,MAAM,GAAG;AAC5C,YAAI,OAAO,MAAM,SAAS;AAC1B;MACD;AAEA,UAAI,QAAQ,OAAO,MAAM,WAAW,GAAG,GAAG;AACzC,aAAK,WACJ,MAAM,aACN,QACA,iBACA,gBAAgB,MAAM,oBACtB,KACA,QACA,MACD;AACA;MACD;AAEA,UAAI,QAAQ,OAAO,MAAM,WAAW,IAAI,GAAG;AAC1C,YAAI,OAAO,WAAW,MAAM,KAAK;AACjC;MACD;AAEA,UAAI,UAAU,OACb;AAGD,UAAI,QAAQ,OAAO,MAAM,WAAW,MAAM,GAAG;AAC5C,cAAM,aAAa,MAAM;AACzB,YAAI,iBAAiB,WAAW;AAC/B,cAAI,OAAO,WAAW,UAAU;AAChC;QACD;AAEA,cAAM,aAAa,iBAAiB,gBAAgB,SAAY,MAAM,MAAM,MAAM,OAAO,MAAA;AACzF,YAAI,OAAO,MAAM,UAAU,WAAW,MAAM,IAAI,IAAI,MAAM,MAAM,OAAA,KAAY,eAAe,SACxF,WAAW,MAAM,MAAM,MAAM,OAAO,IAAA,CAAK,IAAI,MAAM,WAAW,UAAU,IACxE,WAAW,UAAU,IAAI,MAAM,WAAW,MAAM,MAAM,MAAM,OAAO,IAAA,CAAK,IAAI,MAC3E,WAAW,UAAU;AACzB;MACD;AAEA,UAAI,QAAQ,OAAO,MAAM,WAAW,KAAK,GAAG;AAC3C,cAAM,aAAa,MAAM;AACzB,cAAM,YAAY,YAAY,UAAU;AAExC,YAAI,QAAQ,YAAY,WAAW,WAAW,GAAG,GAAG;AACnD,gBAAM,SAAS;AACf,eAAK,WACJ,OAAO,aACP,QACA,iBACA,gBAAgB,OAAO,oBACvB,KACA,QACA,MACD;AACA;QACD;AAEA,cAAMC,WAAU,MAAM;AACtB,cAAM,cAAc,UAAU,YAAYA,QAAO,MAAM,WAAW,SAC/D,OAAO,SAASA,QAAiB,IACjC;AAEH,YAAI,cAAc,WAAW,aAAa;AACzC,gBAAM,UAAU,YAAY,gBAAgB,SAAS,KAAK;AAC1D,gBAAM,YAAY,aAAa;AAC/B,gBAAM,OAAO,aAAa;AAC1B,gBAAM,QAAQ,YAAA,CACV,UAAU,UAAU,OAAcA,SAAS,UAAU,IACtD;AACH,cAAI,OAAO,OACR,KAAK,SAASA,UAA0BA,SAAS,UAAU,IAC3D;AACH,iBAAO,KAAK,KAAK;AACjB;QACD;AAEA,aAAK,kBAAkB,YAAYA,UAAS,aAAa,QAAQ,iBAAiB,cAAc,KAAK,MAAM;AAC3G;MACD;AAEA,UAAI,QAAQ,OAAO,MAAM,WAAW,WAAW,GAAG;AACjD,YAAI,OAAO,YAAY,gBAAgB,SAAS,KAAK;AACrD,eAAO,KAAK,KAAK;AACjB;MACD;AAEA,UAAI,QAAQ,OAAO,MAAM,WAAW,KAAK,GAAG;AAC3C,cAAM,aAAa,MAAM,MAAM,OAAO,MAAA;AACtC,cAAM,YAAY,MAAM,MAAM,OAAO,IAAA;AAErC,YAAI,iBAAiB,iCAAiC;AACrD,cAAI,QAAQ,eAAe,SAAY,WAAW,KAAK,IAAI,WAAW,UAAU,KAAK,MAClF,WAAW,SAAS;AACvB;QACD;AAEA,YAAI,OAAO,eAAe,UAAa,MAAM,OAAA,IAC1C,WAAW,SAAS,IACpB,WAAW,UAAU,IAAI,MAAM,WAAW,SAAS;AACtD;MACD;AAEA,UAAI,QAAQ,OAAO,MAAM,WAAW,IAAI,GAAG;AAC1C,cAAM,aAAa,MAAM,cAAA,EAAgB;AACzC,cAAM,WAAW,MAAM,cAAA,EAAgB;AACvC,YAAI,OAAO,eAAe,UAAa,MAAM,cAAA,EAAgB,UAC1D,WAAW,QAAQ,IACnB,WAAW,UAAU,IAAI,MAAM,WAAW,QAAQ;AACrD;MACD;AAEA,UAAI,QAAQ,OAAO,MAAM,WAAW,OAAO,KAAK,MAAM,eAAe,QAAW;AAC/E,YAAI,QAAQ,MAAM,WAAW,SAAY,WAAW,MAAM,MAAM,IAAI,MAAM,MAAM,WAAW,MAAM,UAAU;AAC3G;MACD;AAEA,UAAI,QAAQ,OAAO,MAAM,WAAW,SAAS,GAAG;AAC/C,cAAM,EAAE,OAAO,SAAA,IAAa;AAC5B,cAAM,QAAQ,SAAS;AACvB,cAAM,cAA8C,IAAI,MAAM,KAAK;AACnE,iBAAS,IAAI,GAAG,IAAI,OAAO,EAAE,GAAG;AAC/B,gBAAMA,WAAU,SAAS,CAAA;AACzB,sBAAY,CAAA,IAAK,UAAU,YAAYA,QAAO,MAAM,WAAW,SAC5D,OAAO,SAASA,QAAiB,IACjC;QACJ;AAEA,YAAI,OAAO;AACX,iBAAS,IAAI,GAAG,SAAS,GAAG,IAAI,MAAM,QAAQ,EAAE,GAAG,EAAE,QAAQ;AAC5D,cAAI,WAAW,OAAO;AACrB,qBAAS;AACT,gBAAI,OAAO;UACZ,WAAW,SAAS,EAAG,KAAI,OAAO;AAElC,gBAAM,OAAO,MAAM,CAAA;AACnB,gBAAM,WAAW,YAAY,IAAI;AACjC,cAAI,aAAa,WAAW,OAAO;AAClC,iBAAK,kBACJ,MACA,SAAS,MAAA,GACT,YAAY,MAAA,GACZ,QACA,iBACA,cACA,KACA,MACD;AACA;UACD;AAEA,cAAI,QAAQ,MAAM,UAAU,WAAW,MAAM,GAAG;AAC/C,gBAAI,OAAO,KAAK,SAAS;AACzB;UACD;AAEA,eAAK,WACJ,CAAC,aAAa,WAAW,MAAM,OAAc,IAAI,MAAM,MAAM,SAAS,MAAA,CAAO,CAAC,GAC9E,QACA,iBACA,cACA,KACA,QACA,MACD;QACD;AACA,YAAI,OAAO;AACX;MACD;AAEA,UAAI,QAAQ,OAAO,MAAM,WAAW,QAAQ,GAAG;AAC9C,YAAI,MAAM,EAAE,QAAQ;AACnB,cAAI,OAAO,WAAW,MAAM,EAAE,KAAK;AACnC;QACD;AAEA,cAAM,SAAS,MAAM,EAAE;AACvB,YAAI,OAAO;AACX,aAAK,WACJ,OAAO,aACP,QACA,iBACA,gBAAgB,OAAO,oBACvB,KACA,QACA,MACD;AACA,YAAI,OAAO,OAAO,WAAW,MAAM,EAAE,KAAK;AAC1C;MACD;AAEA,UAAI,OAAO,UAAU,cAAc,cAAc,OAAO;AACvD,YAAI,YAAY,SAAS,MAAM,QAAQ;AACtC,cAAI,OAAO,WAAW,MAAM,MAAgB,IAAI,MAAM,WAAW,MAAM,QAAkB;AACzF;QACD;AACA,YAAI,OAAO,WAAW,MAAM,QAAkB;AAC9C;MACD;AAEA,UAAI,aAAa,KAAK,GAAG;AACxB,cAAM,SAAS,MAAM,OAAO;AAC5B,cAAM,qBAAqB,gBAAgB,OAAO;AAElD,YAAI,MAAM,sBAAsB,GAAG;AAClC,eAAK,WACJ,OAAO,aACP,QACA,iBACA,oBACA,KACA,QACA,MACD;AACA;QACD;AAEA,YAAI,OAAO;AACX,aAAK,WACJ,OAAO,aACP,QACA,iBACA,oBACA,KACA,QACA,MACD;AACA,YAAI,OAAO;AACX;MACD;AAEA,UAAI,MAAM,QAAQ,KAAK,GAAG;AACzB,YAAI,OAAO;AACX,cAAM,UAAsB,CAAC,MAAS;AACtC,iBAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,EAAE,GAAG;AACtC,cAAI,IAAI,EAAG,KAAI,OAAO;AACtB,kBAAQ,CAAA,IAAK,MAAM,CAAA;AACnB,eAAK,WAAW,SAAS,QAAQ,iBAAiB,cAAc,KAAK,QAAQ,MAAS;QACvF;AACA,YAAI,OAAO;AACX;MACD;AAEA,UAAI,cAAc;AACjB,YAAI,OAAO,KAAK,eAAe,OAAO,MAAM;AAC5C;MACD;AAEA,UAAI,OAAO,YAAY,gBAAgB,SAAS,KAAK;AACrD,aAAO,KAAK,KAAK;IAClB;EACD;EAEA,kBACC,OACAA,UACA,aACA,QACA,iBACA,cACA,KACA,QACO;AACP,QAAI,cAAmB;AACvB,QAAI,UAAU,MAAM;AACnB,UAAI,CAACA,SAAQ,iBAAiB,OAAQ,eAAcA,SAAQ,iBAAiB,KAAK;AAElF,UAAI,YAAY,WAAW,MAAM,WAAW,KAAK;AAChD,cAAM,SAAc;AACpB,aAAK,WACJ,OAAO,aACP,QACA,iBACA,gBAAgB,OAAO,oBACvB,KACA,QACA,MACD;AACA;MACD;AAEA,YAAM,YAAY,aAAa;AAC/B,UAAI,CAAC,gBAAgB,UAAW,eAAc,UAAU,aAAoBA,SAAS,UAAU;IAChG;AAEA,QAAI,cAAc;AACjB,UAAI,OAAO,KAAK,eAAe,aAAa,MAAM;AAClD;IACD;AAEA,UAAM,EAAE,YAAA,IAAgB;AACxB,UAAM,UAAU,YAAY,gBAAgB,SAAS,WAAW;AAChE,UAAM,OAAO,aAAa;AAC1B,QAAI,OAAO,OAAO,KAAK,SAASA,UAA0BA,SAAS,UAAU,IAAI;AACjF,WAAO,KAAK,WAAW;EACxB;EAEA,eACC,OACA,EAAE,aAAA,GACO;AACT,QAAI,UAAU,KACb,QAAO;AAER,QAAI,OAAO,UAAU,YAAY,OAAO,UAAU,aAAa,OAAO,UAAU,SAC/E,QAAO,MAAM,SAAS;AAEvB,QAAI,OAAO,UAAU,SACpB,QAAO,aAAa,KAAK;AAE1B,QAAI,OAAO,UAAU,UAAU;AAC9B,YAAM,sBAAsB,MAAM,SAAS;AAC3C,UAAI,wBAAwB,kBAC3B,QAAO,aAAa,KAAK,UAAU,KAAK,CAAC;AAE1C,aAAO,aAAa,mBAAmB;IACxC;AACA,UAAM,IAAI,MAAM,6BAA6B,KAAK;EACnD;EAEA,SAAiB;AAChB,WAAO;EACR;EAaA,GAAG,OAAyC;AAE3C,QAAI,UAAU,OACb,QAAO;AAGR,WAAO,IAAID,KAAI,QAAQ,MAAM,KAAK;EACnC;EAEA,QAKC,SAID;AACC,SAAK,UAAU,OAAO,YAAY,aAAa,EAAE,oBAAoB,QAAQ,IAAI;AACjF,WAAO;EACR;EAEA,WAA0B;AACzB,WAAO;EACR;EAEA,eAAqB;AACpB,SAAK,qBAAqB;AAC1B,WAAO;EACR;;;;;;;EAQA,GAAG,WAA8C;AAChD,WAAO,YAAY,OAAO;EAC3B;AACD;AAKA,IAAa,aAAa;EACzB,OAAO;EACP,QAAQ;EACR,KAAK;EACL,MAAM;EACN,QAAQ;EACR,OAAO;EACP,aAAa;EACb,OAAO;EACP,MAAM;EACN,SAAS;EACT,UAAU;EACV,WAAW;AACZ;AAEA,IAAM,yBAAyB,oBAAI,QAAwB;AAC3D,IAAM,eAAe,uBAAO,mBAAmB;AAC/C,SAAS,iBAAiB,MAAc,OAA4B;AACnE,QAAM,OAAO,MAAM,IAAI,YAAY,UAAA,CAAW,IAC3C,WAAW,SACX,MAAM,IAAI,IAAI,UAAA,CAAW,IACzB,WAAW,MACX,MAAM,IAAI,KAAK,UAAA,CAAW,IAC1B,WAAW,OACX,MAAM,IAAI,OAAO,UAAA,CAAW,IAC5B,WAAW,SACX,MAAM,IAAI,MAAM,UAAA,CAAW,IAC3B,WAAW,QACX,MAAM,IAAI,YAAY,UAAA,CAAW,IACjC,WAAW,cACX,MAAM,IAAI,MAAM,UAAA,CAAW,IAC3B,WAAW,QACX,MAAM,IAAI,KAAK,UAAA,CAAW,IAC1B,WAAW,OACX,MAAM,IAAI,IAAI,QAAQ,UAAA,CAAW,IACjC,WAAW,UACX,MAAM,IAAI,SAAS,UAAA,CAAW,IAC9B,WAAW,WACX,MAAM,IAAI,UAAU,UAAA,CAAW,IAC/B,WAAW,YACX,WAAW;AACd,yBAAuB,IAAI,MAAM,IAAI;AAGrC,MAAI,SAAS,WAAW,MACvB,QAAO,eAAgB,KAA+B,WAAW,cAAc,EAAE,OAAO,KAAK,CAAC;AAE/F,SAAO;AACR;AAEA,SAAgB,YAAY,OAAwB;AACnD,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO,WAAW;AAEnE,QAAM,SAAU,MAAsC,YAAA;AACtD,MAAI,WAAW,OAAW,QAAO;AAEjC,QAAM,OAAO,OAAO,eAAe,KAAK,GAAG;AAC3C,MAAI,OAAO,SAAS,WAAY,QAAO,WAAW;AAElD,SAAO,uBAAuB,IAAI,IAAI,KAAK,iBAAiB,MAAM,cAAc,KAAK,CAAE;AACxF;AAgBA,SAAgB,QACf,QACA,MACA,UAC8B;AAC9B,SAAO,SAAS;AACjB;AAUA,IAAa,OAAb,MAAwC;EAQlB;EAPrB,QAAiB,UAAA,IAAsB;EACvC,QAAQ,OAAO,WAAA,EAAa,OAAyB;AACpD,WAAO,GAAG,OAAO,IAAI;EACtB;EAEA;EAEA,YAAY,OAAwB;AAAf,SAAA,QAAA;EAAgB;EAErC,SAAuB;AACtB,WAAO,IAAI,IAAI,CAAC,IAAI,CAAC;EACtB;AACD;AA8BA,SAAgB,qBAAqB,OAAuD;AAC3F,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,sBAAsB,SACxE,OAAQ,MAAc,qBAAqB;AAChD;AAEA,IAAa,cAA4C,EACxD,oBAAA,CAAqB,UAAU,MAChC;AAEA,YAAY,mBAAmB,SAAS;AAExC,IAAa,cAA4C,EACxD,kBAAA,CAAmB,UAAU,MAC9B;AAEA,YAAY,iBAAiB,SAAS;AAUtC,IAAa,aAA0C;EACtD,GAAG;EACH,GAAG;AACJ;AAGA,IAAa,QAAb,MAAwF;EAa7E;EACA;EACF;EAdR,QAAiB,UAAA,IAAsB;EACvC,QAAQ,OAAO,WAAA,EAAa,OAAyB;AACpD,WAAO,GAAG,OAAO,IAAI;EACtB;EAEA;;;;;EAMA,YACC,OACAE,WAAoE,aACpE,OACC;AAHQ,SAAA,QAAA;AACA,SAAA,UAAAA;AACF,SAAA,QAAA;EACL;EAEH,SAAuB;AACtB,WAAO,IAAI,IAAI,CAAC,IAAI,CAAC;EACtB;AACD;AAEA,IAAa,YAAb,MAA6C;EAOlC;EACA;EAPV,QAAiB,UAAA,IAAsB;EACvC,QAAQ,OAAO,WAAA,EAAa,OAAyB;AACpD,WAAO,GAAG,OAAO,IAAI;EACtB;EAEA,YACC,OACA,UACC;AAFQ,SAAA,QAAA;AACA,SAAA,WAAA;EACP;EAGH,SAAc;AACb,UAAM,EAAE,OAAO,SAAA,IAAa;AAC5B,UAAM,QAAQ,SAAS;AACvB,UAAM,SAAqB,CAAC;AAC5B,aAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,EAAE,GAAG;AACtC,YAAM,SAAS,IAAI;AACnB,aAAO,KACN,WAAW,IAAK,MAAM,IAAI,mBAAmB,GAAA,IAAO,mBAAmB,MAAA,IAAW,mBAAmB,IAAA,CACtG;AACA,YAAM,OAAO,MAAM,CAAA;AACnB,YAAM,OAAO,YAAY,IAAI;AAC7B,aAAO,KACN,SAAS,WAAW,OAAO,SAAS,WAAW,SAAS,OAAmB,IAAI,MAAM,MAAM,SAAS,MAAA,CAAO,CAC5G;IACD;AACA,WAAO,KAAK,mBAAmB,GAAA,CAAI;AAEnC,WAAO,IAAI,IAAI,MAAM;EACtB;EAEA,sBAA+B;AAC9B,WAAO;EACR;AACD;AAqCA,SAAgB,IAAI,YAAkC,QAAyB;AAC9E,QAAM,cAA0B,CAAC;AACjC,MAAI,QAAQ,CAAA,EAAI,aAAY,KAAK,IAAI,YAAY,QAAQ,CAAA,CAAE,CAAC;AAC5D,WAAS,WAAW,GAAG,WAAW,OAAO,QAAQ,EAAE,UAAU;AAC5D,UAAM,QAAQ,OAAO,QAAA;AACrB,QAAI,UAAU,OAAW,aAAY,KAAK,KAAK;AAC/C,UAAM,SAAS,QAAQ,WAAW,CAAA;AAClC,QAAI,OAAQ,aAAY,KAAK,IAAI,YAAY,MAAM,CAAC;EACrD;AAEA,SAAO,IAAI,IAAI,WAAW;AAC3B;CAEO,SAAA,MAAA;AACC,WAAS,QAAa;AAC5B,WAAO,IAAI,IAAI,CAAC,CAAC;EAClB;;AAGO,WAAS,SAAS,MAAuB;AAC/C,WAAO,IAAI,IAAI,IAAI;EACpB;;AAMO,WAAS,IAAI,KAAkB;AACrC,WAAO,IAAI,IAAI,CAAC,IAAI,YAAY,GAAG,CAAC,CAAC;EACtC;;AAeO,WAAS,KAAK,QAAoB,WAA2B;AACnE,UAAM,EAAE,OAAA,IAAW;AACnB,QAAI,cAAc,UAAa,WAAW,EAAG,QAAO,IAAI,IAAI,OAAO,MAAM,CAAC;AAE1E,UAAM,SAAqB,IAAI,MAAM,SAAS,IAAI,CAAC;AACnD,aAAS,IAAI,GAAG,WAAW,GAAG,IAAI,QAAQ,EAAE,GAAG;AAC9C,aAAO,UAAA,IAAc,OAAO,CAAA;AAE5B,UAAI,IAAI,SAAS,EAChB,QAAO,UAAA,IAAc;IAEvB;AAEA,WAAO,IAAI,IAAI,MAAM;EACtB;;AAcO,WAAS,WAAW,OAAqB;AAC/C,WAAO,IAAI,KAAK,KAAK;EACtB;;AAEO,WAAS,YAAkC,MAAiC;AAClF,WAAO,IAAI,YAAY,IAAI;EAC5B;;AAEO,WAAS,MACf,OACAC,UACwB;AACxB,WAAO,IAAI,MAAM,OAAOA,QAAO;EAChC;;AAKO,WAAS,QAAQ,OAAsC;AAC7D,UAAM,UAAU,aAAa,KAAK;AAClC,QAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,WAAO,IAAI,IAAI,OAAO;EACvB;;AACA,GAAA,QAAA,MAAA,CAAA,EAAD;AAEA,SAAgB,aAAa,OAA6B;AACzD,QAAM,UAAU,aAAa,YAAY,KAAK;AAC9C,MAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,SAAO,KAAK,OAAA;AACb;CAEO,SAAA,eAAA;AACC,WAAS,MAAM,QAAkC,QAAkC;AACzF,QAAI;AACJ,QAAI,OAAO,WAAW,YAAY,OAAO,WAAW,SACnD,WAAU,YAAY;MAAE,GAAG;MAAQ,GAAG;IAAO,CAAC;aACpC,UAAU,OACpB,WAAU,CAAC,YAAY,MAAM,GAAG,YAAY,MAAM,CAAC,EAAE,OAAA,CAAQ,MAAM,EAAE,MAAM,EAAE,KAAK,GAAG;aAC3E,OACV,WAAU,YAAY,MAAM;aAClB,OACV,WAAU,YAAY,MAAM;QAE5B,QAAO;AAGR,QAAI,CAAC,QAAQ,OAAQ,QAAO;AAE5B,WAAO,KAAK,OAAA;EACb;;AAEO,WAAS,YAAY,OAA6B;AACxD,QAAI,OAAO,UAAU,UAAU;AAC9B,UAAI,CAAC,MAAM,OAAQ,QAAO;AAE1B,aAAO,oBAAoB,KAAK;IACjC;AAEA,UAAM,QAAkB,CAAC;AAEzB,eAAW,CAAC,KAAK,KAAA,KAAU,OAAO,QAAQ,KAAK,GAAG;AACjD,UAAI,UAAU,QAAQ,UAAU,UAAa,UAAU,GAAI;AAE3D,YAAM,aAAa,sBAAsB,GAAG;AAC5C,YAAM,eAAe,sBAAsB,OAAO,KAAK,CAAC;AAExD,YAAM,KAAK,GAAG,UAAA,KAAe,YAAA,GAAe;IAC7C;AAEA,QAAI,CAAC,MAAM,OAAQ,QAAO;AAE1B,WAAO,MAAM,KAAK,EAAE,KAAK,GAAG;EAC7B;;AAEO,WAAS,sBAAsB,KAAqB;AAE1D,WADmB,mBAAmB,GACtB,EAAE,QAAQ,MAAM,KAAK;EACtC;;AAEO,WAAS,oBAAoB,OAAuB;AAC1D,WAAO,MAAM,QAAQ,SAAS,KAAK,EAAE,QAAQ,SAAS,KAAK;EAC5D;;AACA,GAAA,iBAAA,eAAA,CAAA,EAAD;CASO,SAAA,MAAA;EACC,MAAM,QAA8C;IAkBhD;IACA;IAlBV,QAAiB,UAAA,IAAsB;IAEvC,QAAQ,OAAO,WAAA,EAAa,OAAyB;AACpD,aAAO,GAAG,OAAO,IAAI;IACtB;;IAQA,mBAAmB;;IAEnB;IAEA,YACCC,MACA,YACC;AAFQ,WAAA,MAAAA;AACA,WAAA,aAAA;IACP;IAEH,SAAiB;AAChB,aAAO,KAAK;IACb;;IAGA,QAAQ;AACP,aAAO,IAAI,QAAW,KAAK,KAAK,KAAK,UAAU;IAChD;EACD;;AACA,GAAA,QAAA,MAAA,CAAA,EAAD;AAEA,IAAa,cAAb,MAA4F;EAS5D;EAR/B,QAAiB,UAAA,IAAsB;EACvC,QAAQ,OAAO,WAAA,EAAa,OAAyB;AACpD,WAAO,GAAG,OAAO,IAAI;EACtB;EAKA,YAAY,MAAgC;AAAb,SAAA,OAAA;EAAc;;;;EAK7C,SAAc;AACb,WAAO,IAAI,IAAI,CAAC,IAAI,CAAC;EACtB;AACD;AAYA,SAAgB,iBAAiB,OAAiB;AACjD,QAAM,SAAS,MAAM;AACrB,MAAI;AACJ,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,EAAE,GAAG;AACvC,UAAM,QAAQ,OAAO,CAAA;AACrB,QAAI,GAAG,OAAO,MAAM,EAAG,EAAC,WAAW,CAAC,GAAG,MAAM,GAAG,CAAA,IAAK,IAAI,WAAW,MAAM,IAAI;EAC/E;AACA,MAAI,CAAC,OAAQ,QAAO;AAEpB,QAAM,OAAO,IAAI,IAAI,MAAM;AAC3B,OAAK,UAAU,MAAM;AACrB,OAAK,qBAAqB,MAAM;AAChC,SAAO;AACR;AAEA,SAAgB,iBAAiB,QAAmB,QAA4C;AAC/F,QAAM,SAAoB,IAAI,MAAM,OAAO,MAAM;AAEjD,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,EAAE,GAAG;AACvC,UAAM,IAAI,OAAO,CAAA;AAEjB,QAAI,GAAG,GAAG,WAAW,GAAG;AAEvB,YAAM,EAAE,KAAA,IAAS;AACjB,UAAI,EAAE,QAAQ,QACb,OAAM,IAAI,MAAM,6BAA6B,IAAA,gBAAoB;AAGlE,aAAO,CAAA,IAAK,OAAO,IAAA;AACnB;IACD;AAEA,QAAI,GAAG,GAAG,KAAK,KAAK,GAAG,EAAE,OAAO,WAAW,GAAG;AAE7C,YAAM,EAAE,KAAA,IAAS,EAAE;AAEnB,UAAI,EAAE,QAAQ,QACb,OAAM,IAAI,MAAM,6BAA6B,IAAA,gBAAoB;AAGlE,YAAM,QAAQ,OAAO,IAAA;AACrB,UAAI,UAAU,MAAM;AACnB,eAAO,CAAA,IAAK;AACZ;MACD;AAEA,YAAM,SAAS,EAAE,QAAQ,iBAAiB,SACvC,QACA,EAAE,QAAQ,iBAAiB,KAAK;AAEnC,aAAO,CAAA,IAAK,EAAE,QAAQ,EAAE,MAAM,MAAM,IAAI;AACxC;IACD;AAEA,WAAO,CAAA,IAAK;EACb;AAEA,SAAO;AACR;AASA,SAAgB,wBAAwB,QAA6B,KAAwB;AAC5F,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,EAAE,GAAG;AACvC,UAAM,QAAQ,OAAO,CAAA;AAErB,YADa,YAAY,KACd,GAAX;MACC,KAAK,WAAW;AACf,YAAI,IAAK,MAAgB,QAAA,CAAS;AAClC;MAED,KAAK,WAAW;AACf,gCAAyB,MAAc,aAAa,GAAG;AACvD;MAED,KAAK,WAAW,OAAO;AACtB,cAAM,QAAS,MAA6B;AAC5C,YAAI,YAAY,KAAK,MAAM,WAAW,IAAK,yBAAyB,MAAc,aAAa,GAAG;AAClG;MACD;MACA,KAAK,WAAW;AACf,gCAAyB,MAAmB,EAAE,IAAI,aAAa,GAAG;AAClE;MAED,KAAK,WAAW;AACf,gCAAyB,MAAgC,OAAO,GAAG;AACnE;MAED,KAAK,WAAW;MAChB,KAAK,WAAW;AACf,YAAI,MAAM,QAAQ,KAAK,EAAG,yBAAwB,OAAO,GAAG;iBACnD,aAAa,KAAK,EAAG,yBAAwB,MAAM,OAAO,EAAE,aAAa,GAAG;IAGvF;EACD;AACD;AAGA,OAAO,UAAU,SAAS,WAAW;AACpC,SAAO,IAAI,IAAI,CAAC,IAAI,CAAC;AACtB;AAEA,YAAY,UAAU,SAAS,WAAW;AACzC,SAAO,IAAI,IAAI,CAAC,IAAI,CAAC;AACtB;AAEA,SAAS,UAAU,SAAS,WAAW;AACtC,SAAO,IAAI,IAAI,CAAC,IAAI,CAAC;AACtB;AAGA,SAAS,gBAAkC,WAAc,OAAoC;AAC5F,SAAO,eAAe,WAAW,WAAW;IAC3C,MAAa;AACZ,YAAM,QAAQ,MAAM,IAAI;AACxB,aAAO,eAAe,MAAM,WAAW;QAAE;QAAO,YAAY;QAAO,cAAc;QAAM,UAAU;MAAK,CAAC;AACvG,aAAO;IACR;IACA,cAAc;EACf,CAAC;AACF;AAEA,SAAS,cAAc,QAA4B,MAAmB;AACrE,SAAO,IAAI,IAAI,WAAW,SAAY,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;IAAC,IAAI,KAAK,MAAM;IAAG,mBAAmB,GAAA;IAAM,IAAI,KAAK,IAAI;EAAC,CAAC;AACrH;AAEA,gBAAgB,MAAM,WAAA,CAAY,UAAU,cAAc,MAAM,WAAA,GAAc,MAAM,SAAA,CAAU,CAAC;AAC/F,gBAAgB,KAAK,WAAA,CAAY,SAAS,cAAc,KAAK,cAAA,EAAgB,QAAQ,KAAK,cAAA,EAAgB,IAAI,CAAC;AAC/G,gBAAgB,SAAS,WAAA,CAAY,aAAa,IAAI,KAAK,SAAS,EAAE,KAAK,CAAC;;;ACroC5E,SAAgB,YAAY,OAAgB,QAA8B;AACzE,MAAI,qBAAqB,MAAM,KAAK,CAAC,aAAa,KAAK,GAAG;AACzD,UAAM,OAAO,YAAY,KAAK;AAC9B,QACC,SAAS,WAAW,SAAS,SAAS,WAAW,eAAe,SAAS,WAAW,UACjF,SAAS,WAAW,SACpB,SAAS,WAAW,KAEvB,QAAO,IAAI,MAAM,OAAO,MAAM;EAEhC;AACA,SAAO;AACR;AAEA,IAAM,uBAAA,CAAwB,QAAoB,IAAiB,UAClE,IAAI,IAAI;EACP;EACA;EACA,YAAY,OAAO,MAAM;AAC1B,CAAC;AAgCF,IAAa,KAAA,CAAsB,MAAkB,UACpD,qBAAqB,MAAM,mBAAmB,KAAA,GAAQ,KAAK;AAoB5D,IAAa,KAAA,CAAsB,MAAkB,UACpD,qBAAqB,MAAM,mBAAmB,MAAA,GAAS,KAAK;AAE7D,IAAM,iBAAA,CAAkB,YAAmC,4BAAsC;AAChG,QAAM,SAAqB,IAAI,MAAM,WAAW,SAAS,IAAI,CAAC,GAC7D,UAAU,WAAW,SAAS;AAG/B,SAAO,CAAA,IAAK,mBAAmB,IAAA;AAE/B,WAAS,IAAI,GAAG,IAAI,SAAS,KAAK;AAEjC,WAAO,IAAI,IAAI,CAAA,IAAK,WAAW,CAAA;AAC/B,WAAO,IAAI,IAAI,CAAA,IAAK;EACrB;AAEA,SAAO,UAAU,IAAI,CAAA,IAAK,WAAW,OAAA;AACrC,SAAO,UAAU,IAAI,CAAA,IAAK,mBAAmB,IAAA;AAE7C,SAAO,IAAI,IAAI,MAAM;AACtB;AAkBA,SAAgB,OACZ,sBACe;AAClB,QAAM,aAAa,qBAAqB,OAAA,CACtC,MAAyC,MAAM,MACjD;AAEA,MAAI,WAAW,WAAW,EACzB;AAGD,MAAI,WAAW,WAAW,EACzB,QAAO,IAAI,IAAI,UAAU;AAG1B,SAAO,eAAe,YAAY,mBAAmB,SAAA,CAAU;AAChE;AAmBA,SAAgB,MACZ,sBACe;AAClB,QAAM,aAAa,qBAAqB,OAAA,CACtC,MAAyC,MAAM,MACjD;AAEA,MAAI,WAAW,WAAW,EACzB;AAGD,MAAI,WAAW,WAAW,EACzB,QAAO,IAAI,IAAI,UAAU;AAG1B,SAAO,eAAe,YAAY,mBAAmB,QAAA,CAAS;AAC/D;AAaA,SAAgB,IAAI,WAAoD;AACvE,MAAI,CAAC,UAAW,QAAO;AACvB,SAAO,GAAG,WAAW,GAAG,IAAI,WAAW,SAAA,MAAe,UAAU,SAAA;AACjE;AAgBA,IAAa,KAAA,CAAsB,MAAkB,UACpD,qBAAqB,MAAM,mBAAmB,KAAA,GAAQ,KAAK;AAkB5D,IAAa,MAAA,CAAuB,MAAkB,UACrD,qBAAqB,MAAM,mBAAmB,MAAA,GAAS,KAAK;AAgB7D,IAAa,KAAA,CAAsB,MAAkB,UACpD,qBAAqB,MAAM,mBAAmB,KAAA,GAAQ,KAAK;AAgB5D,IAAa,MAAA,CAAuB,MAAkB,UACrD,qBAAqB,MAAM,mBAAmB,MAAA,GAAS,KAAK;AA4B7D,SAAgB,QACf,QACA,QACM;AACN,MAAI,MAAM,QAAQ,MAAM,GAAG;AAC1B,QAAI,OAAO,WAAW,EACrB,QAAO,IAAI,IAAI,CACd,mBAAmB,OAAA,CACpB,CAAC;AAGF,WAAO,IAAI,IAAI;MACd;MACA,mBAAmB,MAAA;MACnB,OAAO,IAAA,CAAK,MAAM,YAAY,GAAG,MAAM,CAAC;IACzC,CAAC;EACF;AAEA,SAAO,qBAAqB,QAAQ,mBAAmB,MAAA,GAAS,MAAM;AACvE;AA6BA,SAAgB,WACf,QACA,QACM;AACN,MAAI,MAAM,QAAQ,MAAM,GAAG;AAC1B,QAAI,OAAO,WAAW,EACrB,QAAO,IAAI,IAAI,CACd,mBAAmB,OAAA,CACpB,CAAC;AAGF,WAAO,IAAI,IAAI;MACd;MACA,mBAAmB,UAAA;MACnB,OAAO,IAAA,CAAK,MAAM,YAAY,GAAG,MAAM,CAAC;IACzC,CAAC;EACF;AAEA,SAAO,qBAAqB,QAAQ,mBAAmB,UAAA,GAAa,MAAM;AAC3E;AAkBA,SAAgB,OAAO,OAAwB;AAC9C,SAAO,OAAO,KAAA;AACf;AAkBA,SAAgB,UAAU,OAAwB;AACjD,SAAO,OAAO,KAAA;AACf;AAsBA,SAAgB,OAAO,UAA2B;AACjD,SAAO,aAAa,QAAA;AACrB;AAuBA,SAAgB,UAAU,UAA2B;AACpD,SAAO,iBAAiB,QAAA;AACzB;AAoCA,SAAgB,QAAQ,QAAoB,KAAc,KAAmB;AAC5E,SAAO,MAAM,MAAA,YAAkB,YAAY,KAAK,MAAM,CAAA,QACrD,YACC,KACA,MACD,CAAA;AAEF;AAkCA,SAAgB,WACf,QACA,KACA,KACM;AACN,SAAO,MAAM,MAAA,gBACZ,YACC,KACA,MACD,CAAA,QACO,YAAY,KAAK,MAAM,CAAA;AAChC;AAkBA,SAAgB,KAAK,QAAiD,OAAiC;AACtG,SAAO,MAAM,MAAA,SAAe,KAAA;AAC7B;AAoBA,SAAgB,QAAQ,QAAiD,OAAiC;AACzG,SAAO,MAAM,MAAA,aAAmB,KAAA;AACjC;AAqBA,SAAgB,MAAM,QAAiD,OAAiC;AACvG,SAAO,MAAM,MAAA,UAAgB,KAAA;AAC9B;AAoBA,SAAgB,SAAS,QAAiD,OAAiC;AAC1G,SAAO,MAAM,MAAA,cAAoB,KAAA;AAClC;AAkCA,SAAgB,cACf,QACA,QACM;AACN,MAAI,MAAM,QAAQ,MAAM,GAAG;AAC1B,QAAI,OAAO,WAAW,EACrB,OAAM,IAAI,MAAM,2CAA2C;AAE5D,UAAM,MAAM,YAAY,QAAQ,MAAM;AACtC,UAAM,QAAQ,MAAM,MAAM,QAAQ,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI,GAAA;AAC1D,WAAO,MAAM,MAAA,OAAa,KAAA;EAC3B;AAEA,SAAO,MAAM,MAAA,OAAa,YAAY,QAAQ,MAAM,CAAA;AACrD;AAmCA,SAAgB,eACf,QACA,QACM;AACN,MAAI,MAAM,QAAQ,MAAM,GAAG;AAC1B,QAAI,OAAO,WAAW,EACrB,OAAM,IAAI,MAAM,4CAA4C;AAE7D,UAAM,MAAM,YAAY,QAAQ,MAAM;AACtC,UAAM,QAAQ,MAAM,MAAM,QAAQ,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI,GAAA;AAC1D,WAAO,MAAM,MAAA,OAAa,KAAA;EAC3B;AAEA,SAAO,MAAM,MAAA,OAAa,YAAY,QAAQ,MAAM,CAAA;AACrD;AAkCA,SAAgB,cACf,QACA,QACM;AACN,MAAI,MAAM,QAAQ,MAAM,GAAG;AAC1B,QAAI,OAAO,WAAW,EACrB,OAAM,IAAI,MAAM,2CAA2C;AAE5D,UAAM,MAAM,YAAY,QAAQ,MAAM;AACtC,UAAM,QAAQ,MAAM,MAAM,QAAQ,GAAG,IAAI,IAAI,MAAM,GAAG,IAAI,GAAA;AAC1D,WAAO,MAAM,MAAA,OAAa,KAAA;EAC3B;AAEA,SAAO,MAAM,MAAA,OAAa,YAAY,QAAQ,MAAM,CAAA;AACrD;;;ACzuBA,SAAgB,IAAI,QAAqC;AACxD,SAAO,MAAM,MAAA;AACd;AAkBA,SAAgB,KAAK,QAAqC;AACzD,SAAO,MAAM,MAAA;AACd;;;ACqNA,IAAsB,gBAAtB,MAIkC;EACjC,QAAiB,UAAA,IAAsB;EACvC,QAAQ,OAAO,WAAA,EAAa,OAAyB;AACpD,WAAO,GAAG,OAAO,IAAI;EACtB;;EAKA;EAEA,YAAY,MAAc,UAAsB,YAAoB;AACnE,SAAK,SAAS;MACb;MACA,WAAW,SAAS;MACpB,SAAS;MACT,SAAS;MACT,YAAY;MACZ,YAAY;MACZ,UAAU;MACV,YAAY;MACZ,YAAY;MACZ;MACA;MACA,WAAW;IACZ;EACD;;;;;;;;;;;;EAaA,QAAmC;AAClC,WAAO;EACR;;;;;;EAOA,UAAyB;AACxB,SAAK,OAAO,UAAU;AACtB,WAAO;EACR;;;;;;;;EASA,QAAQ,OAA+F;AACtG,SAAK,OAAO,UAAU;AACtB,SAAK,OAAO,aAAa;AACzB,WAAO;EACR;;;;;;;EAQA,WACC,IACsC;AACtC,SAAK,OAAO,YAAY;AACxB,SAAK,OAAO,aAAa;AACzB,WAAO;EACR;;;;EAKA,SACC,IACsC;AACtC,WAAO,KAAK,WAAW,EAAE;EAC1B;;;;;;;;EASA,YACC,IACmB;AACnB,SAAK,OAAO,aAAa;AACzB,SAAK,OAAO,aAAa;AACzB,WAAO;EACR;;;;EAKA,UACC,IACmB;AACnB,WAAO,KAAK,YAAY,EAAE;EAC3B;;;;;;EAOA,aAEA;AACC,SAAK,OAAO,aAAa;AACzB,SAAK,OAAO,UAAU;AACtB,WAAO;EAER;;EAUA,QAAQ,MAAc,UAAoC;AACzD,QAAI,KAAK,OAAO,SAAS,GAAI;AAC7B,SAAK,OAAO,OAAO,SAAS,IAAI;EACjC;AACD;;;AClYA,IAAa,oBAAb,MAA+B;EAC9B,QAAiB,UAAA,IAAsB;EACvC,QAAQ,OAAO,WAAA,EAAa,OAAyB;AACpD,WAAO,GAAG,OAAO,IAAI;EACtB;;EAQA;;EAGA;;EAGA;EAEA,YACC,QAKA,SAIC;AACD,SAAK,YAAA,MAAkB;AACtB,YAAM,EAAE,MAAM,SAAS,eAAA,IAAmB,OAAO;AACjD,aAAO;QAAE;QAAM;QAAS,cAAc,eAAe,CAAA,EAAI;QAAsB;MAAe;IAC/F;AACA,QAAI,SAAS;AACZ,WAAK,YAAY,QAAQ;AACzB,WAAK,YAAY,QAAQ;IAC1B;EACD;EAEA,SAAS,QAAkC;AAC1C,SAAK,YAAY;AACjB,WAAO;EACR;EAEA,SAAS,QAAkC;AAC1C,SAAK,YAAY;AACjB,WAAO;EACR;;EAGA,MAAM,OAAgC;AACrC,WAAO,IAAI,WAAW,OAAO,IAAI;EAClC;AACD;AAEA,IAAa,aAAb,MAAwB;EAUF;EATrB,QAAiB,UAAA,IAAsB;EACvC,QAAQ,OAAO,WAAA,EAAa,OAAyB;AACpD,WAAO,GAAG,OAAO,IAAI;EACtB;EAEA;EACA;EACA;EAEA,YAAY,OAA6B,SAA4B;AAAhD,SAAA,QAAA;AACpB,SAAK,YAAY,QAAQ;AACzB,SAAK,WAAW,QAAQ;AACxB,SAAK,WAAW,QAAQ;EACzB;EAEA,UAAkB;AACjB,UAAM,EAAE,MAAM,SAAS,eAAA,IAAmB,KAAK,UAAU;AACzD,UAAM,cAAc,QAAQ,IAAA,CAAK,WAAW,OAAO,IAAI;AACvD,UAAM,qBAAqB,eAAe,IAAA,CAAK,WAAW,OAAO,IAAI;AACrE,UAAM,SAAS;MACd,KAAK,MAAM,SAAA;MACX,GAAG;MACH,eAAe,CAAA,EAAI,MAAM,SAAA;MACzB,GAAG;IACJ;AACA,WAAO,QAAQ,GAAG,OAAO,KAAK,GAAG,CAAA;EAClC;EAEA,iBAAiB;AAChB,WAAO,CAAC,CAAC,KAAK,UAAU,EAAE;EAC3B;AACD;;;ACvEA,IAAsB,sBAAtB,cAIU,cAA+C;EACxD,QAA0B,UAAA,IAAsB;EAEhD,oBAA+C,CAAC;EAEhD,WACC,KACA,UAAsC,CAAC,GAChC;AACP,SAAK,kBAAkB,KAAK;MAAE;MAAK;IAAQ,CAAC;AAC5C,WAAO;EACR;EAEA,OACC,MACO;AACP,SAAK,OAAO,WAAW;AACvB,SAAK,OAAO,aAAa;AACzB,WAAO;EACR;EAEA,kBAAkB,IAAuB,QAEtC;AACF,SAAK,OAAO,YAAY;MACvB;MACA,MAAM;MACN,MAAM,QAAQ,QAAQ;IACvB;AACA,WAAO;EACR;;EAGA,iBAAiB,QAAsB,OAAkC;AACxE,WAAO,KAAK,kBAAkB,IAAA,CAAK,EAAE,KAAK,QAAA,MAAc;AACvD,cAAA,CAASC,MAAKC,aAAY;AACzB,cAAM,UAAU,IAAI,kBAAA,MAAwB;AAC3C,gBAAM,gBAAgBD,KAAI;AAC1B,iBAAO;YAAE,SAAS,CAAC,MAAM;YAAG,gBAAgB,CAAC,aAAa;UAAE;QAC7D,CAAC;AACD,YAAIC,SAAQ,SACX,SAAQ,SAASA,SAAQ,QAAQ;AAElC,YAAIA,SAAQ,SACX,SAAQ,SAASA,SAAQ,QAAQ;AAElC,eAAO,QAAQ,MAAM,KAAK;MAC3B,GAAG,KAAK,OAAO;IAChB,CAAC;EACF;AAID;AAGA,IAAsB,eAAtB,cAGU,OAA0B;EACnC,QAA0B,UAAA,IAAsB;;EAMhD;EAEA,YACC,OACA,QACC;AACD,UAAM,OAAO,MAAM;AACnB,SAAK,QAAQ;EACd;AACD;;;AC9FA,SAAgB,2BACf,SACA,qBACuB;AACvB,MAAI,CAAC,oBAAqB,QAAO;AAGjC,QAAM,UAAU,oBAAI,IAA4B;AAChD,QAAM,QAAkB,CAAC;AACzB,QAAM,OAAO,oBAAI,IAAY;AAE7B,aAAW,EAAE,MAAM,OAAO,UAAA,KAAe,SAAS;AACjD,QAAI,KAAK,SAAS,EAAG;AACrB,UAAM,MAAM,KAAK,CAAA;AACjB,QAAI,CAAC,KAAK,IAAI,GAAG,GAAG;AACnB,WAAK,IAAI,GAAG;AACZ,YAAM,KAAK,GAAG;IACf;AACA,QAAI,cAAc,SAAU;AAC5B,UAAM,YAAY,aAAa,MAAM,KAAK;AAC1C,UAAM,UAAU,QAAQ,IAAI,GAAG;AAC/B,QAAI,YAAY,OAAW,SAAQ,IAAI,KAAK,SAAS;aAC5C,YAAY,SAAS,YAAY,UAAW,SAAQ,IAAI,KAAK,KAAK;EAC5E;AAEA,QAAM,SAAmB,CAAC;AAC1B,aAAW,OAAO,OAAO;AACxB,UAAM,QAAQ,QAAQ,IAAI,GAAG;AAE7B,QAAI,OAAO,UAAU,YAAY,CAAC,oBAAoB,KAAA,EAAQ,QAAO,KAAK,GAAG;EAC9E;AAEA,SAAO;AACR;AAEA,SAAS,oBACR,SACA,qBACsC;AACtC,QAAM,UAGA,IAAI,MAAM,oBAAoB,MAAM;AAE1C,WAAS,IAAI,GAAG,IAAI,oBAAoB,QAAQ,EAAE,GAAG;AACpD,UAAM,MAAM,oBAAoB,CAAA;AAChC,UAAM,SAAmB,CAAC;AAC1B,aAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,EAAE,GAAG;AACxC,YAAM,KAAK,QAAQ,CAAA,EAAI;AACvB,UAAI,GAAG,SAAS,KAAK,GAAG,CAAA,MAAO,IAAK,QAAO,KAAK,CAAC;IAClD;AAEA,YAAQ,CAAA,IAAK;MAAE;MAAK;IAAO;EAC5B;AAEA,SAAO;AACR;AAGA,IAAa,gBAAgB,OAAO,eAAA,MAAqB,IAAI,EAAE;AAG/D,SAAS,wBACR,SACA,qBACS;AACT,QAAM,QAAQ,CAAC;AACf,QAAM,KAAK,CAAC;AACZ,KAAG,KAAK,WAAW,QAAQ,IAAA,CAAK,GAAG,MAAM,IAAI,CAAA,EAAG,EAAE,KAAK,IAAI,CAAA,eAAgB;AAG3E,QAAM,gBAA0C,CAAC;AACjD,QAAM,eAAe,IAAI,IAAI,uBAAuB,CAAC,CAAC;AACtD,QAAM,UAAU,IAAI,MAAc,QAAQ,MAAM;AAEhD,WAAS,MAAM,GAAG,MAAM,QAAQ,QAAQ,EAAE,KAAK;AAC9C,UAAM,EAAE,OAAO,WAAW,MAAM,OAAO,gBAAA,IAAoB,QAAQ,GAAA;AACnE,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,YAAQ,WAAR;MACC,KAAK;AACJ,kBAAU;AACV,kCAA0B,iBAAiB,GAAA;AAC3C;MACD,KAAK;AACJ,kBAAU,MAAM;AAChB,kCAA0B,4BAA4B,GAAA;AACtD;MACD,KAAK;AACJ,kBAAU,MAAM,EAAE,IAAI;AACtB,kCAA0B,wCAAwC,GAAA;AAClE;MACD;AACC,kBAAU,MAAM,IAAI;AACpB,kCAA0B,mCAAmC,GAAA;IAC/D;AACA,iBAAa,UAAU,GAAA;AACvB,QAAI,QAAQ,mBAAmB,OAAQ,cAAa;AACpD,QAAI,WACH,OAAM,KAAK,WAAW,uBAAA,GAA0B,QAAQ,iBAAiB,GAAA,KAAQ,EAAA,gBAAkB,GAAA,IAAO;aAChG,MACV,OAAM,KAAK,uBAAuB,GAAA,gBAAmB,GAAA,IAAO;AAG7D,UAAM,SAAS,IAAI,GAAA;AACnB,QAAI,eAAe;AACnB,QAAI,MAAO,gBAAe,QAAQ,GAAA,IAAO,YAAA,KAAiB,eAAA;AAC1D,QAAI,WAAY,gBAAe,GAAG,UAAA,IAAc,YAAA;AAChD,YAAQ,GAAA,IAAO,WAAW,eACvB,GAAG,MAAA,KACH,GAAG,MAAA,eAAqB,MAAA,MAAY,YAAA;AAEvC,QAAI,KAAK,SAAS,EAAG,EAAC,cAAc,KAAK,CAAA,CAAA,MAAS,CAAC,GAAG,KAAK,MAAM;EAClE;AAEA,KAAG,KAAK,eAAe;AACvB,MAAI,oBAA8B,CAAC;AACnC,WAAS,MAAM,GAAG,MAAM,QAAQ,QAAQ,EAAE,KAAK;AAC9C,UAAM,EAAE,KAAA,IAAS,QAAQ,GAAA;AACzB,UAAM,WAAW,KAAK,IAAA,CAAK,MAAM,KAAK,UAAU,CAAC,CAAC;AAClD,UAAM,eAAe,QAAQ,GAAA;AAE7B,UAAM,aAAa,KAAK,MAAM,GAAG,EAAE;AACnC,QAAI,YAAY;AAChB,WACC,YAAY,kBAAkB,UAC3B,YAAY,WAAW,UACvB,kBAAkB,SAAA,MAAe,WAAW,SAAA,EAC9C;AAEF,aAAS,IAAI,kBAAkB,SAAS,GAAG,KAAK,WAAW,EAAE,EAC5D,IAAG,KAAK,GAAG,IAAK,OAAO,IAAI,CAAC,CAAA,IAAK;AAGlC,aAAS,IAAI,WAAW,IAAI,WAAW,QAAQ,EAAE,GAAG;AACnD,YAAM,WAAW,MAAM,KAAK,aAAa,IAAI,KAAK,CAAA,CAAG;AACrD,SAAG,KACF,GAAG,IAAK,OAAO,IAAI,CAAC,CAAA,GAAI,SAAS,CAAA,CAAA,KAChC,WACG,GAAG,cAAc,KAAK,CAAA,CAAA,EAAM,IAAA,CAAK,MAAM,GAAG,CAAA,WAAY,EAAE,KAAK,MAAM,CAAA,gBACnE,GAAA,EAEL;IACD;AAEA,wBAAoB;AACpB,OAAG,KAAK,GAAG,IAAK,OAAO,KAAK,MAAM,CAAA,GAAI,SAAS,KAAK,SAAS,CAAA,CAAA,KAAO,YAAA,GAAe;EACpF;AAEA,WAAS,IAAI,kBAAkB,SAAS,GAAG,KAAK,GAAG,EAAE,EACpD,IAAG,KAAK,GAAG,IAAK,OAAO,IAAI,CAAC,CAAA,IAAK;AAElC,KAAG,KAAK,IAAI;AAEZ,SAAO,GAAG,MAAM,SAAS,GAAG,MAAM,KAAK,KAAM,CAAA;KAAU,EAAA;IACpD,GAAG,KAAK,MAAQ,CAAA;;AAEpB;AAYA,SAAgB,mBACf,SACA,qBACsB;AACtB,QAAM,YAAY;;;;GAIhB,wBAAwB,SAAS,mBAAmB,CAAA;;;AActD,SAVW,OAAO,OACjB,IAAI,cACH,QACA,SACD,EAAE,KAAK,EACN,QACD,CAAC,GACD,EAAE,MAAM;EAAqC,SAAA;GAAe,CAGrD;AACT;AAGA,SAAgB,eAAe,WAA8B;AAC5D,MAAI,CAAC,UAAW,QAAO;AAEvB,MAAI;AACH,UAAM,MAAM,IAAI,cAAc,SAAS,6BAA6B,EAAE,IAAI;AAC1E,QAAI,QAAQ,MAAM;AAEjB,cAAQ,KACP,oIACD;AACA,cAAQ,MAAM,sCAAsC,GAAA,EAAK;IAC1D;AACA,WAAO;EACR,SAAS,GAAG;AACX,YAAQ,KACP,qGACD;AACA,YAAQ,MAAM,CAAC;AACf,WAAO;EACR;AACD;AAEA,SAAgB,uBACf,SACA,qBACsB;AACtB,QAAM,kBAAqD,IAAI,MAAM,QAAQ,MAAM;AACnF,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,EAAE,GAAG;AACxC,UAAM,EAAE,OAAO,WAAW,OAAO,gBAAA,IAAoB,QAAQ,CAAA;AAE7D,QAAI;AACJ,YAAQ,WAAR;MACC,KAAK;AACJ,qBAAa;AACb;MACD,KAAK;AACJ,qBAAa,MAAM;AACnB;MACD,KAAK;AACJ,qBAAa,MAAM,EAAE,IAAI;AACzB;MACD;AACC,qBAAa,MAAM,IAAI;IACzB;AAEA,QAAI;AACJ,QAAI,WAAW,mBAAmB,OACjC,WAAU,QAAA,CAAS,MAAW,MAAM,GAAG,eAAgB,IAAI;QAE3D,WAAU,QAAA,CACN,MAAW,WAAW,mBAAmB,MAAM,GAAG,eAAgB,CAAC,IAAA,CACnE,MAAW,WAAW,mBAAmB,CAAC;AAG/C,oBAAgB,CAAA,IAAK;EACtB;AAEA,QAAM,UAAU,qBAAqB,SAClC,oBAAoB,SAAS,mBAAmB,IAChD;AAEH,UAAA,CAAS,SAAS;AACjB,UAAM,EAAE,QAAQ,UAAA,IAAc;AAC9B,UAAM,SAAoB,IAAI,MAAM,SAAS;AAC7C,aAAS,IAAI,GAAG,IAAI,WAAW,EAAE,GAAG;AACnC,YAAM,MAAM,KAAK,CAAA;AAEjB,YAAM,SAA8B,CAAC;AAErC,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,EAAE,GAAG;AACxC,cAAM,EAAE,KAAA,IAAS,QAAQ,CAAA;AAEzB,YAAI,OAAO;AACX,iBAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,EAAE,GAAG;AACrC,gBAAM,YAAY,KAAK,CAAA;AACvB,cAAI,IAAI,KAAK,SAAS,GAAG;AACxB,gBAAI,EAAE,aAAa,MAClB,MAAK,SAAA,IAAa,CAAC;AAEpB,mBAAO,KAAK,SAAA;UACb,OAAO;AACN,kBAAM,UAAU,gBAAgB,CAAA;AAChC,kBAAM,WAAW,IAAI,CAAA;AACrB,iBAAK,SAAA,IAAa,aAAa,OAC5B,OACA,UACA,QAAQ,QAAQ,IAChB;UACJ;QACD;MACD;AAGA,UAAI,QACH,UAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,EAAE,GAAG;AACxC,cAAM,EAAE,KAAK,OAAA,IAAW,QAAQ,CAAA;AAEhC,YAAI,UAAU;AACd,iBAASC,KAAI,GAAGA,KAAI,OAAO,QAAQ,EAAEA,GAGpC,KAAI,IAFM,OAAOA,EAAA,CAAA,MAEF,MAAM;AACpB,oBAAU;AACV;QACD;AAED,YAAI,QAAS,QAAO,GAAA,IAAO;MAC5B;AAGD,aAAO,CAAA,IAAK;IACb;AAEA,WAAO;EACR;AACD;AAoDA,SAAgB,oBACf,QACA,YACA,QACA,SAA2C,CAAC,GACX;AACjC,QAAM,UAAU,OAAO,QAAQ,MAAM;AAErC,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,EAAE,GAAG;AACxC,UAAM,CAAC,MAAM,KAAA,IAAS,QAAQ,CAAA;AAC9B,QAAI,OAAO,SAAS,SACnB,QAAO;AAGR,UAAM,UAAU,aAAa,CAAC,GAAG,YAAY,IAAI,IAAI,CAAC,IAAI;AAC1D,QAAI,GAAG,OAAO,MAAM,EACnB,QAAO,KAAK;MACX,MAAM;MACC;MACP,WAAW;MACX,OAAO,QAAQ,IAAI,OAAO,WAAW;MACrC,iBAAwB,MAAO;MAC/B,QAAQ;IACT,CAAC;aACS,GAAG,OAAO,GAAG,GAAG;AAC1B,YAAM,MAAM,qBAAqB,KAAK;AACtC,aAAO,KACN,MACG;QACD,MAAM;QACN;QACA,WAAW;QACX,OAAO,QAAQ,IAAI,KAAK,WAAW;QACnC,iBAAwB,IAAK;QAC7B,QAAQ;MACT,IACE;QACD,MAAM;QACN;QACA,WAAW;MACZ,CACF;IACD,WAAW,GAAG,OAAO,IAAI,OAAO,GAAG;AAClC,YAAM,MAAM,qBAAqB,KAAK;AACtC,aAAO,KACN,MACG;QACD,MAAM;QACN;QACA,WAAW;QACX,OAAO,QAAQ,IAAI,KAAK,WAAW;QACnC,iBAAwB,IAAK;QAC7B,QAAQ;MACT,IACE;QACD,MAAM;QACN;QACA,WAAW;MACZ,CACF;IACD,WAAW,GAAG,OAAO,QAAQ,GAAG;AAC/B,UAAI;AAEJ,YAAM,QADU,OAAO,OAAO,MAAM,EAAE,cAClB,EAAE,CAAA;AAEtB,UAAI;AACJ,UAAI,GAAG,OAAO,MAAM,GAAG;AACtB,iBAAS;AACT,uBAAe;MAChB,WAAW,GAAG,OAAO,GAAG,GAAG;AAC1B,iBAAS,qBAAqB,KAAK;AACnC,uBAAe,MAAM;MACtB,OAAO;AACN,iBAAS,qBAAqB,KAAK;AACnC,uBAAe,MAAM,IAAI;MAC1B;AAEA,UAAI,aACH,OAAM,EAAE,IAAI,UAAU;AAGvB,aAAO,KACN,SACG;QACD,MAAM;QACN;QACA,WAAW;QACX,OAAO,QAAQ,IAAI,QAAQ,WAAW;QACtC,iBAAwB,OAAQ;QAChC;MACD,IACE;QACD,MAAM;QACN;QACA,WAAW;MACZ,CACF;IACD,WAAW,GAAG,OAAO,KAAK,EACzB,qBAAoB,MAAM,MAAM,OAAO,OAAA,GAAU,SAAS,QAAQ,MAAM;QAExE,qBAAoB,OAAkC,SAAS,QAAQ,MAAM;EAE/E;AAEA,SAAO;AACR;AAEA,SAAgB,qBAAqB,QAA4D;AAChG,QAAM,EAAE,QAAA,IAAY,OAAO,OAAO;AAElC,SAAO,QAAQ,SAAS,YAAY,OAAO,GAAG,WAAW,MAAM,IAAI,UAAU;AAC9E;AAEA,SAAgB,aAAa,MAA+B,OAAgC;AAC3F,QAAM,WAAW,OAAO,KAAK,IAAI;AACjC,QAAM,YAAY,OAAO,KAAK,KAAK;AAEnC,MAAI,SAAS,WAAW,UAAU,OACjC,QAAO;AAGR,aAAW,CAAC,OAAO,GAAA,KAAQ,SAAS,QAAQ,EAC3C,KAAI,QAAQ,UAAU,KAAA,EACrB,QAAO;AAIT,SAAO;AACR;AAGA,SAAgB,aAAa,OAAc,QAA4C;AACtF,QAAM,UAAU,OAAO,QAAQ,MAAM,EAAE,OAAA,CAAQ,CAAA,EAAG,KAAA,MAAW,UAAU,MAAS;AAEhF,MAAI,QAAQ,WAAW,EACtB,OAAM,IAAI,MAAM,kBAAkB;AAGnC,QAAM,SAAwC,IAAI,MAAM,QAAQ,MAAM;AACtE,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,EAAE,GAAG;AACxC,UAAM,CAAC,KAAK,KAAA,IAAS,QAAQ,CAAA;AAE7B,UAAM,OAAO,YAAY,KAAK;AAC9B,QAAI,QAAQ,OAAO,MAAM,WAAW,GAAG,KAAK,QAAQ,OAAO,MAAM,WAAW,MAAM,EACjF,QAAO,CAAA,IAAK,CAAC,KAAK,KAAK;QAEvB,QAAO,CAAA,IAAK,CAAC,KAAK,IAAI,MAAM,OAAO,MAAM,MAAM,OAAO,OAAA,EAAS,GAAA,CAAI,CAAC;EAEtE;AAEA,SAAO,OAAO,YAAY,MAAM;AACjC;AAiDA,SAAgB,YAAY,WAAgB,iBAAwB;AACnE,aAAW,iBAAiB,gBAC3B,YAAW,QAAQ,OAAO,oBAAoB,cAAc,SAAS,GAAG;AACvE,QAAI,SAAS,cAAe;AAE5B,WAAO,eACN,UAAU,WACV,MACA,OAAO,yBAAyB,cAAc,WAAW,IAAI,KAAK,uBAAO,OAAO,IAAI,CACrF;EACD;AAEF;AAcA,SAAgB,gBAAiC,OAA6B;AAC7E,SAAO,MAAM,MAAM,OAAO,OAAA;AAC3B;AAqBA,SAAgB,iBAAiB,OAAsC;AACtE,QAAM,OAAO,YAAY,KAAK;AAC9B,SAAO,QAAQ,OAAO,MAAM,WAAW,QAAQ,IAC5C,MAAM,EAAE,QACR,QAAQ,OAAO,MAAM,WAAW,IAAI,IACpC,MAAM,cAAA,EAAgB,OACtB,QAAQ,OAAO,MAAM,WAAW,GAAG,IACnC,SACA,MAAM,MAAM,OAAO,OAAA,IACnB,MAAM,MAAM,OAAO,IAAA,IACnB,MAAM,MAAM,OAAO,QAAA;AACvB;AAkCA,SAAgB,uBAEd,GAAiC,GAAwB;AAC1D,SAAO;IACN,MAAM,OAAO,MAAM,YAAY,EAAE,SAAS,IAAI,IAAI;IAClD,QAAQ,OAAO,MAAM,WAAW,IAAI;EACrC;AACD;AA2EA,IAAa,cAAc,OAAO,gBAAgB,cAAc,OAAO,IAAI,YAAY;AAEvF,SAAgB,cAAc,QAAkC,QAAQ,MAAgC;AACvG,QAAM,QAAQ,oBAAI,IAAoB;AACtC,SAAA,CAAQ,SAAS;AAChB,QAAI,UAAU,MAAM,IAAI,IAAI;AAC5B,QAAI,YAAY,QAAW;AAC1B,UAAI,MAAM,QAAQ,MAAO,OAAM,MAAM;AACrC,gBAAU,OAAO,IAAI;AACrB,YAAM,IAAI,MAAM,OAAO;IACxB;AACA,WAAO;EACR;AACD;AAEA,SAAgB,kBAAkB,IAA8B;AAC/D,QAAM,IAAI,MAAM,2BAA2B;AAC5C;;;ACtuBA,IAAa,aAAqB,CAAC;AAYnC,IAAM,WAA2B;EAChC,MAAM;EACN,YAAY;EACZ,WAAW;EACX,WAAW;EACX,iBAAiB;EACjB,gBAAgB;AACjB;AAEA,IAAM,8BAA8B;EACnC,MAAM;EACN,WAAW;EACX,YAAY;EACZ,iBAAiB;EACjB,WAAW;EACX,gBAAgB;EAChB,WAAW;EACX,gBAAgB;EAChB,iBAAiB;EACjB,sBAAsB;EACtB,gBAAgB;EAChB,qBAAqB;AACtB;AAiBA,IAAa,mBAAb,MAAgE;EAMzC;EAAiD;EALvE,QAAiB,UAAA,IAAsB;EACvC,QAAQ,OAAO,WAAA,EAAa,OAAyB;AACpD,WAAO,GAAG,OAAO,IAAI;EACtB;EAEA,YAAY,cAAkD,SAAoC,YAAY;AAAxF,SAAA,eAAA;AAAiD,SAAA,SAAA;EAAwC;EAE/G,kBAAuD,oBAAI,IAAI;EAC/D,mBAAwD,oBAAI,IAAI;;EAGhE,SAAS,QAAgB,UAAqC;AAC7D,UAAM,UAAW,YAAY,OAAO;AACpC,QAAI,CAAC,QAAS,QAAO;AAErB,UAAM,UAAU,CAAC,CAAQ,OAAQ;AACjC,UAAM,QAAQ,UAAU,KAAK,mBAAmB,KAAK;AACrD,QAAI,WAAW,MAAM,IAAI,OAAO;AAChC,QAAI,aAAa,QAAW;AAC3B,YAAM,QAAQ,KAAK,OAAO,OAAA;AAC1B,iBAAW,QACR,UACC;QACD,MAAM,MAAM;QACZ,YAAY,MAAM;QAClB,WAAW,MAAM;QACjB,WAAW,MAAM;QACjB,iBAAiB,MAAM;QACvB,gBAAgB,MAAM;MACvB,IACE;QACD,MAAM,MAAM;QACZ,YAAY,MAAM;QAClB,WAAW,MAAM;QACjB,WAAW,MAAM;QACjB,iBAAiB,MAAM;QACvB,gBAAgB,MAAM;MACvB,IACC;AACH,YAAM,IAAI,SAAS,QAAQ;IAC5B;AAEA,WAAO;EACR;EAEA,IACC,QACA,MACA,UAID;AACC,WAAO,KAAK,SAAS,QAAQ,QAAQ,EAAE,4BAA4B,IAAA,CAAA;EACpE;EAEA,MACC,QACA,MACA,OACA,UACoD;AACpD,UAAM,YAAY,4BAA4B,IAAA;AAC9C,UAAM,QAAQ,KAAK,SAAS,QAAQ,QAAQ,EAAE,SAAA;AAC9C,QAAI,CAAC,MAAO,QAAO;AAEnB,QAAI,cAAc,YACjB,QAA+C,MAAO,OAAiB,QAAe,OAAQ,UAAU;AAGzG,WAA4E,MAC3E,OACO,OAAQ,UAChB;EACD;AACD;AAEA,SAAgB,aACf,QACA,YAA8B,CAAC,GACZ;AACnB,QAAM,QAAO,oBAAI,IAAc,CAAC,GAAG,OAAO,KAAK,MAAM,GAAG,GAAG,OAAO,KAAK,SAAS,CAAC,CAAe,GAAE,OAAO;AACzG,QAAM,SAA4D,CAAC;AAEnE,aAAW,KAAK,MAAM;AACrB,QAAI,EAAE,KAAK,YAAY;AACtB,aAAO,CAAA,IAAK,OAAO,CAAA,IAAK,EAAE,GAAG,OAAO,CAAA,EAAG,IAAI;AAC3C;IACD;AAEA,QAAI,EAAE,KAAK,WAAY,UAAU,CAAA,MAAO,QAAY;AACnD,aAAO,CAAA,IAAK,UAAU,CAAA,IAAK,EAAE,GAAG,UAAU,CAAA,EAAG,IAAI;AACjD;IACD;AAEA,UAAM,aAAY,oBAAI,IACrB,CAAC,GAAG,OAAO,KAAK,UAAU,CAAA,CAAE,GAAG,GAAI,OAAO,KAAK,OAAO,CAAA,KAAM,CAAC,CAAC,CAAE,CACjE,GAAE,OAAO;AAET,WAAO,CAAA,IAAK,CAAC;AACb,eAAW,MAAM,UAChB,QAAO,CAAA,EAAG,EAAA,IAAO,MAAM,UAAU,CAAA,IAAK,UAAU,CAAA,EAAG,EAAA,IAAM,OAAO,CAAA,IAAK,EAAA;EAEvE;AAEA,SAAO;AACR;;;ACrKA,IAAM,2BAA2B;EAChC,KAAK;EACL,MAAM;EACN,MAAM;EACN,SAAS;EACT,UAAU;EACV,WAAW;EACX,MAAM;EACN,SAAS;EACT,OAAO;EACP,QAAQ;EACR,oBAAoB;EACpB,SAAS;EACT,WAAW;EACX,SAAS;EACT,qBAAqB;EACrB,OAAO;EACP,oBAAoB;EACpB,UAAU;EACV,MAAM;EACN,MAAM;AACP;AAQA,SAAgB,uBAAuB,MAAc;AACpD,SAAQ,yBAAoE,IAAA,KAAS;AACtF;AAIA,IAAa,aAAA,CAAyB,SAAS,WAAW,IAAA;AAC1D,IAAa,YAAA,CAAwB,SAAS,UAAU,IAAA;AAExD,IAAM,oBAAA,CAAqB,UAA8B;AACxD,QAAM,QAAQ,IAAI,WAAW,MAAM,UAAU,CAAC;AAC9C,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,EAAE,EAAG,OAAM,CAAA,IAAK,OAAO,SAAS,MAAM,UAAU,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE;AACvG,SAAO;AACR;AAEA,IAAa,gBAAgB,OAAO,WAAW,cAC5C,oBAAA,CACC,UAA0B,OAAO,KAAK,OAAO,KAAK;AAEtD,IAAa,kBAAA,CAAmB,UAC/B,OAAO,KAAK,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAO7D,IAAM,cAAc,OAAO,WAAW,cAAc,IAAI,YAAY,IAAI;AACxE,IAAa,gBAAgB,cAAA,CACzB,UAA0B,YAAY,OAAO,KAAK,IAAA,CAClD,UAA0B,OAAO,KAAK,KAAK;AAK/C,IAAa,wBAAA,CAAyB,UACrC,OAAO,UAAU,WAAW,IAAI,KAAK,MAAM,WAAW,KAAK,EAAE,CAAC,IAAI,oBAAI,KAAK,QAAQ,GAAI;AACxF,IAAa,6BAAA,CAA8B,UAC1C,OAAO,UAAU,WAAW,IAAI,KAAK,MAAM,WAAW,KAAK,EAAE,CAAC,IAAI,IAAI,KAAK,KAAK;AACjF,IAAa,qBAAA,CAAsB,UAA2B,UAAU;AAExE,IAAa,sBAAsB;EAClC,mBAAmB,EAClB,iBAAiB,mBAClB;EACA,qBAAqB,EACpB,iBAAiB,sBAClB;EACA,wBAAwB,EACvB,iBAAiB,2BAClB;EACA,aAAa,EACZ,iBAAiB,KAAK,MACvB;EACA,MAAM;IACL,YAAY;IACZ,iBAAiB;EAClB;EACA,aAAa;IACZ,YAAY;IACZ,iBAAiB,KAAK;EACvB;EACA,eAAe;IACd,YAAY;IACZ,iBAAiB;EAClB;EACA,SAAS;IACR,YAAY;IACZ,iBAAiB;EAClB;EACA,kBAAkB;IACjB,YAAY;IACZ,iBAAiB;EAClB;EACA,kBAAkB;IACjB,YAAY;IACZ,iBAAiB;EAClB;AACD;AAEA,IAAa,kBAAkB;EAC9B,SAAS;IACR,SAAS;IACT,mBAAmB;IACnB,qBAAqB;IACrB,wBAAwB;IACxB,MAAM;IACN,MAAM;IACN,aAAa;IACb,MAAM;IACN,aAAa;IACb,eAAe;IACf,SAAS;IACT,kBAAkB;IAClB,kBAAkB;EACnB;EACA,mBAAmB;IAClB,SAAS;IACT,mBAAmB;IACnB,qBAAqB;IACrB,wBAAwB;IACxB,MAAM;IACN,MAAM;IACN,aAAa;IACb,MAAM;IACN,aAAa;IACb,eAAe;IACf,SAAS;IACT,kBAAkB;IAClB,kBAAkB;EACnB;EACA,qBAAqB;IACpB,SAAS;IACT,mBAAmB;IACnB,qBAAqB;IACrB,wBAAwB;IACxB,MAAM;IACN,MAAM;IACN,aAAa;IACb,MAAM;IACN,aAAa;IACb,eAAe;IACf,SAAS;IACT,kBAAkB;IAClB,kBAAkB;EACnB;EACA,wBAAwB;IACvB,SAAS;IACT,mBAAmB;IACnB,qBAAqB;IACrB,wBAAwB;IACxB,MAAM;IACN,MAAM;IACN,aAAa;IACb,MAAM;IACN,aAAa;IACb,eAAe;IACf,SAAS;IACT,kBAAkB;IAClB,kBAAkB;EACnB;EACA,MAAM;IACL,SAAS;IACT,mBAAmB;IACnB,qBAAqB;IACrB,wBAAwB;IACxB,MAAM;IACN,MAAM;IACN,aAAa;IACb,MAAM;IACN,aAAa;IACb,eAAe;IACf,SAAS;IACT,kBAAkB;IAClB,kBAAkB;EACnB;EACA,MAAM;IACL,SAAS;IACT,mBAAmB;IACnB,qBAAqB;IACrB,wBAAwB;IACxB,MAAM;IACN,MAAM;IACN,aAAa;IACb,MAAM;IACN,aAAa;IACb,eAAe;IACf,SAAS;IACT,kBAAkB;IAClB,kBAAkB;EACnB;EACA,aAAa;IACZ,SAAS;IACT,mBAAmB;IACnB,qBAAqB;IACrB,wBAAwB;IACxB,MAAM;IACN,MAAM;IACN,aAAa;IACb,MAAM;IACN,aAAa;IACb,eAAe;IACf,SAAS;IACT,kBAAkB;IAClB,kBAAkB;EACnB;EACA,MAAM;IACL,SAAS;IACT,mBAAmB;IACnB,qBAAqB;IACrB,wBAAwB;IACxB,MAAM;IACN,MAAM;IACN,aAAa;IACb,MAAM;IACN,aAAa;IACb,eAAe;IACf,SAAS;IACT,kBAAkB;IAClB,kBAAkB;EACnB;EACA,aAAa;IACZ,SAAS;IACT,mBAAmB;IACnB,qBAAqB;IACrB,wBAAwB;IACxB,MAAM;IACN,MAAM;IACN,aAAa;IACb,MAAM;IACN,aAAa;IACb,eAAe;IACf,SAAS;IACT,kBAAkB;IAClB,kBAAkB;EACnB;EACA,eAAe;IACd,SAAS;IACT,mBAAmB;IACnB,qBAAqB;IACrB,wBAAwB;IACxB,MAAM;IACN,MAAM;IACN,aAAa;IACb,MAAM;IACN,aAAa;IACb,eAAe;IACf,SAAS;IACT,kBAAkB;IAClB,kBAAkB;EACnB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",
6
+ "names": ["DrizzleQueryError", "sql", "SQL", "encoder", "encoder", "encoder", "sql", "ref", "actions", "j", "name", "sql", "sourceColumns", "targetColumns", "i", "table", "writeIdx", "sql", "isSingle", "SelectionProxyHandler", "sql", "sql", "SQLiteCountBuilder", "sql", "sql", "sql", "sql", "sql", "res"]
7
+ }