drizzle-orm 1.0.0-beta.22-41a7d21 → 1.0.0-beta.22-bf0fa46

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 (127) hide show
  1. package/bun-sql/sqlite/migrator.cjs +1 -1
  2. package/bun-sql/sqlite/migrator.cjs.map +1 -1
  3. package/bun-sql/sqlite/migrator.js +1 -1
  4. package/bun-sql/sqlite/migrator.js.map +1 -1
  5. package/d1/migrator.cjs +1 -1
  6. package/d1/migrator.cjs.map +1 -1
  7. package/d1/migrator.js +1 -1
  8. package/d1/migrator.js.map +1 -1
  9. package/durable-sqlite/migrator.cjs +1 -1
  10. package/durable-sqlite/migrator.js +1 -1
  11. package/libsql/migrator.cjs +1 -1
  12. package/libsql/migrator.cjs.map +1 -1
  13. package/libsql/migrator.js +1 -1
  14. package/libsql/migrator.js.map +1 -1
  15. package/mysql-proxy/migrator.cjs +2 -2
  16. package/mysql-proxy/migrator.cjs.map +1 -1
  17. package/mysql-proxy/migrator.js +2 -2
  18. package/mysql-proxy/migrator.js.map +1 -1
  19. package/op-sqlite/migrator.cjs +1 -1
  20. package/op-sqlite/migrator.cjs.map +1 -1
  21. package/op-sqlite/migrator.js +1 -1
  22. package/op-sqlite/migrator.js.map +1 -1
  23. package/package.json +67 -13
  24. package/pg-proxy/migrator.cjs +2 -2
  25. package/pg-proxy/migrator.cjs.map +1 -1
  26. package/pg-proxy/migrator.js +2 -2
  27. package/pg-proxy/migrator.js.map +1 -1
  28. package/singlestore-proxy/migrator.cjs +2 -2
  29. package/singlestore-proxy/migrator.cjs.map +1 -1
  30. package/singlestore-proxy/migrator.js +2 -2
  31. package/singlestore-proxy/migrator.js.map +1 -1
  32. package/sqlite-cloud/migrator.cjs +1 -1
  33. package/sqlite-cloud/migrator.cjs.map +1 -1
  34. package/sqlite-cloud/migrator.js +1 -1
  35. package/sqlite-cloud/migrator.js.map +1 -1
  36. package/sqlite-core/dialect.cjs +7 -7
  37. package/sqlite-core/dialect.cjs.map +1 -1
  38. package/sqlite-core/dialect.d.cts +2 -1
  39. package/sqlite-core/dialect.d.ts +2 -1
  40. package/sqlite-core/dialect.js +7 -7
  41. package/sqlite-core/dialect.js.map +1 -1
  42. package/sqlite-proxy/migrator.cjs +40 -2
  43. package/sqlite-proxy/migrator.cjs.map +1 -1
  44. package/sqlite-proxy/migrator.js +39 -2
  45. package/sqlite-proxy/migrator.js.map +1 -1
  46. package/tursodatabase/migrator.cjs +1 -1
  47. package/tursodatabase/migrator.cjs.map +1 -1
  48. package/tursodatabase/migrator.js +1 -1
  49. package/tursodatabase/migrator.js.map +1 -1
  50. package/up-migrations/cockroach.cjs +6 -12
  51. package/up-migrations/cockroach.cjs.map +1 -1
  52. package/up-migrations/cockroach.d.cts +1 -5
  53. package/up-migrations/cockroach.d.ts +1 -5
  54. package/up-migrations/cockroach.js +6 -12
  55. package/up-migrations/cockroach.js.map +1 -1
  56. package/up-migrations/effect-pg.cjs +6 -12
  57. package/up-migrations/effect-pg.cjs.map +1 -1
  58. package/up-migrations/effect-pg.d.cts +1 -5
  59. package/up-migrations/effect-pg.d.ts +1 -5
  60. package/up-migrations/effect-pg.js +6 -12
  61. package/up-migrations/effect-pg.js.map +1 -1
  62. package/up-migrations/mssql.cjs +6 -12
  63. package/up-migrations/mssql.cjs.map +1 -1
  64. package/up-migrations/mssql.d.cts +1 -5
  65. package/up-migrations/mssql.d.ts +1 -5
  66. package/up-migrations/mssql.js +6 -12
  67. package/up-migrations/mssql.js.map +1 -1
  68. package/up-migrations/mysql-proxy.cjs +73 -0
  69. package/up-migrations/mysql-proxy.cjs.map +1 -0
  70. package/up-migrations/mysql-proxy.d.cts +16 -0
  71. package/up-migrations/mysql-proxy.d.ts +16 -0
  72. package/up-migrations/mysql-proxy.js +71 -0
  73. package/up-migrations/mysql-proxy.js.map +1 -0
  74. package/up-migrations/mysql.cjs +12 -28
  75. package/up-migrations/mysql.cjs.map +1 -1
  76. package/up-migrations/mysql.d.cts +1 -5
  77. package/up-migrations/mysql.d.ts +1 -5
  78. package/up-migrations/mysql.js +12 -28
  79. package/up-migrations/mysql.js.map +1 -1
  80. package/up-migrations/pg-proxy.cjs +79 -0
  81. package/up-migrations/pg-proxy.cjs.map +1 -0
  82. package/up-migrations/pg-proxy.d.cts +16 -0
  83. package/up-migrations/pg-proxy.d.ts +16 -0
  84. package/up-migrations/pg-proxy.js +77 -0
  85. package/up-migrations/pg-proxy.js.map +1 -0
  86. package/up-migrations/pg.cjs +9 -13
  87. package/up-migrations/pg.cjs.map +1 -1
  88. package/up-migrations/pg.d.cts +2 -6
  89. package/up-migrations/pg.d.ts +2 -6
  90. package/up-migrations/pg.js +9 -13
  91. package/up-migrations/pg.js.map +1 -1
  92. package/up-migrations/singlestore-proxy.cjs +73 -0
  93. package/up-migrations/singlestore-proxy.cjs.map +1 -0
  94. package/up-migrations/singlestore-proxy.d.cts +16 -0
  95. package/up-migrations/singlestore-proxy.d.ts +16 -0
  96. package/up-migrations/singlestore-proxy.js +71 -0
  97. package/up-migrations/singlestore-proxy.js.map +1 -0
  98. package/up-migrations/singlestore.cjs +9 -25
  99. package/up-migrations/singlestore.cjs.map +1 -1
  100. package/up-migrations/singlestore.d.cts +1 -5
  101. package/up-migrations/singlestore.d.ts +1 -5
  102. package/up-migrations/singlestore.js +9 -25
  103. package/up-migrations/singlestore.js.map +1 -1
  104. package/up-migrations/sqlite-proxy.cjs +80 -0
  105. package/up-migrations/sqlite-proxy.cjs.map +1 -0
  106. package/up-migrations/sqlite-proxy.d.cts +16 -0
  107. package/up-migrations/sqlite-proxy.d.ts +16 -0
  108. package/up-migrations/sqlite-proxy.js +78 -0
  109. package/up-migrations/sqlite-proxy.js.map +1 -0
  110. package/up-migrations/sqlite.cjs +17 -48
  111. package/up-migrations/sqlite.cjs.map +1 -1
  112. package/up-migrations/sqlite.d.cts +3 -10
  113. package/up-migrations/sqlite.d.ts +5 -12
  114. package/up-migrations/sqlite.js +17 -48
  115. package/up-migrations/sqlite.js.map +1 -1
  116. package/up-migrations/utils.cjs +47 -0
  117. package/up-migrations/utils.cjs.map +1 -0
  118. package/up-migrations/utils.d.cts +25 -0
  119. package/up-migrations/utils.d.ts +25 -0
  120. package/up-migrations/utils.js +44 -0
  121. package/up-migrations/utils.js.map +1 -0
  122. package/sqlite-proxy/migrator.internal.cjs +0 -61
  123. package/sqlite-proxy/migrator.internal.cjs.map +0 -1
  124. package/sqlite-proxy/migrator.internal.d.cts +0 -26
  125. package/sqlite-proxy/migrator.internal.d.ts +0 -26
  126. package/sqlite-proxy/migrator.internal.js +0 -59
  127. package/sqlite-proxy/migrator.internal.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"dialect.js","names":["isSQLWrapper"],"sources":["../../src/sqlite-core/dialect.ts"],"sourcesContent":["import * as V1 from '~/_relations.ts';\nimport {\n\taliasedTable,\n\taliasedTableColumn,\n\tgetOriginalColumnFromAlias,\n\tmapColumnsInAliasedSQLToAlias,\n\tmapColumnsInSQLToAlias,\n} from '~/alias.ts';\nimport { CasingCache } from '~/casing.ts';\nimport type { AnyColumn } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport { getMigrationsToRun } from '~/migrator.utils.ts';\nimport {\n\ttype AnyOne,\n\t// AggregatedField,\n\ttype AnyRelations,\n\ttype BuildRelationalQueryResult,\n\ttype ColumnWithTSName,\n\ttype DBQueryConfig,\n\tgetTableAsAliasSQL,\n\tOne,\n\ttype Relation,\n\trelationExtrasToSQL,\n\trelationsFilterToSQL,\n\trelationsOrderToSQL,\n\trelationToSQL,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n\ttype WithContainer,\n} from '~/relations.ts';\nimport type { Name, Placeholder, SQLWrapper } from '~/sql/index.ts';\nimport { and, eq, isSQLWrapper } from '~/sql/index.ts';\nimport { Param, type QueryWithTypings, SQL, sql, type SQLChunk, View } from '~/sql/sql.ts';\nimport { SQLiteColumn, type SQLiteCustomColumn } from '~/sqlite-core/columns/index.ts';\nimport type {\n\tAnySQLiteSelectQueryBuilder,\n\tSQLiteDeleteConfig,\n\tSQLiteInsertConfig,\n\tSQLiteUpdateConfig,\n} from '~/sqlite-core/query-builders/index.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { getTableName, getTableUniqueName, Table, TableColumns } from '~/table.ts';\nimport { upgradeAsyncIfNeeded, upgradeSyncIfNeeded } from '~/up-migrations/sqlite.ts';\nimport { type Casing, orderSelectedFields, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type {\n\tSelectedFieldsOrdered,\n\tSQLiteSelectConfig,\n\tSQLiteSelectJoinConfig,\n} from './query-builders/select.types.ts';\nimport type { SQLiteSession } from './session.ts';\nimport { SQLiteViewBase } from './view-base.ts';\nimport type { SQLiteView } from './view.ts';\n\nexport interface SQLiteDialectConfig {\n\tcasing?: Casing;\n}\n\nexport abstract class SQLiteDialect {\n\tstatic readonly [entityKind]: string = 'SQLiteDialect';\n\n\t/** @internal */\n\treadonly casing: CasingCache;\n\n\tconstructor(config?: SQLiteDialectConfig) {\n\t\tthis.casing = new CasingCache(config?.casing);\n\t}\n\n\tescapeName(name: string): string {\n\t\treturn `\"${name.replace(/\"/g, '\"\"')}\"`;\n\t}\n\n\tescapeParam(_num: number): string {\n\t\treturn '?';\n\t}\n\n\tescapeString(str: string): string {\n\t\treturn `'${str.replace(/'/g, \"''\")}'`;\n\t}\n\n\tprivate buildWithCTE(queries: Subquery[] | undefined): SQL | undefined {\n\t\tif (!queries?.length) return undefined;\n\n\t\tconst withSqlChunks = [sql`with `];\n\t\tfor (const [i, w] of queries.entries()) {\n\t\t\twithSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);\n\t\t\tif (i < queries.length - 1) {\n\t\t\t\twithSqlChunks.push(sql`, `);\n\t\t\t}\n\t\t}\n\t\twithSqlChunks.push(sql` `);\n\t\treturn sql.join(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({\n\t\ttable,\n\t\twhere,\n\t\treturning,\n\t\twithList,\n\t\tlimit,\n\t\torderBy,\n\t}: SQLiteDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n\t}\n\n\tbuildUpdateSet(table: SQLiteTable, set: UpdateSet): SQL {\n\t\tconst tableColumns = table[Table.Symbol.Columns];\n\n\t\tconst columnNames = Object.keys(tableColumns).filter(\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\treturn sql.join(\n\t\t\tcolumnNames.flatMap((colName, i) => {\n\t\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\t\tconst onUpdateFnResult = col.onUpdateFn?.();\n\t\t\t\tconst value = set[colName]\n\t\t\t\t\t?? (is(onUpdateFnResult, SQL)\n\t\t\t\t\t\t? onUpdateFnResult\n\t\t\t\t\t\t: sql.param(onUpdateFnResult, col));\n\t\t\t\tconst res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;\n\n\t\t\t\tif (i < setLength - 1) {\n\t\t\t\t\treturn [res, sql.raw(', ')];\n\t\t\t\t}\n\t\t\t\treturn [res];\n\t\t\t}),\n\t\t);\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}: SQLiteUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst fromSql = from && sql.join([sql.raw(' from '), this.buildFromTable(from)]);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n\t}\n\n\t/**\n\t * Builds selection SQL with provided fields/expressions\n\t *\n\t * Examples:\n\t *\n\t * `select <selection> from`\n\t *\n\t * `insert ... returning <selection>`\n\t *\n\t * If `isSingleTable` is true, then columns won't be prefixed with table name\n\t */\n\tprivate buildSelection(\n\t\tfields: SelectedFieldsOrdered,\n\t\t{ isSingleTable = false }: { isSingleTable?: boolean } = {},\n\t): SQL {\n\t\tconst columnsLen = fields.length;\n\n\t\tconst chunks = fields.flatMap(({ field }, i) => {\n\t\t\tconst chunk: SQLChunk[] = [];\n\n\t\t\tif (is(field, SQL.Aliased) && field.isSelectionField) {\n\t\t\t\tif (!isSingleTable && field.origin !== undefined) {\n\t\t\t\t\tchunk.push(sql.identifier(field.origin), sql.raw('.'));\n\t\t\t\t}\n\t\t\t\tchunk.push(sql.identifier(field.fieldAlias));\n\t\t\t} else if (is(field, SQL.Aliased) || is(field, SQL)) {\n\t\t\t\tconst query = is(field, SQL.Aliased) ? field.sql : field;\n\n\t\t\t\tif (isSingleTable) {\n\t\t\t\t\tconst newSql = new SQL(\n\t\t\t\t\t\tquery.queryChunks.map((c) => {\n\t\t\t\t\t\t\tif (is(c, Column)) {\n\t\t\t\t\t\t\t\treturn sql.identifier(this.casing.getColumnCasing(c));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn c;\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\n\t\t\t\t\tchunk.push(query.shouldInlineParams ? newSql.inlineParams() : newSql);\n\t\t\t\t} else {\n\t\t\t\t\tchunk.push(query);\n\t\t\t\t}\n\n\t\t\t\tif (is(field, SQL.Aliased)) {\n\t\t\t\t\tchunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t}\n\t\t\t} else if (is(field, Column)) {\n\t\t\t\tif (field.columnType === 'SQLiteNumericBigInt') {\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tfield.isAlias\n\t\t\t\t\t\t\t\t? sql`cast(${\n\t\t\t\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\t\t\t\tthis.casing.getColumnCasing(\n\t\t\t\t\t\t\t\t\t\t\tgetOriginalColumnFromAlias(field),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} as text) as ${field}`\n\t\t\t\t\t\t\t\t: sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tfield.isAlias\n\t\t\t\t\t\t\t\t? sql`cast(${getOriginalColumnFromAlias(field)} as text) as ${field}`\n\t\t\t\t\t\t\t\t: sql`cast(${field} as text)`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tfield.isAlias\n\t\t\t\t\t\t\t\t? sql`${sql.identifier(this.casing.getColumnCasing(getOriginalColumnFromAlias(field)))} as ${field}`\n\t\t\t\t\t\t\t\t: sql.identifier(this.casing.getColumnCasing(field)),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tfield.isAlias\n\t\t\t\t\t\t\t\t? sql`${getOriginalColumnFromAlias(field)} as ${field}`\n\t\t\t\t\t\t\t\t: field,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (is(field, Subquery)) {\n\t\t\t\tconst entries = Object.entries(field._.selectedFields) as [\n\t\t\t\t\tstring,\n\t\t\t\t\tSQL.Aliased | Column | SQL,\n\t\t\t\t][];\n\n\t\t\t\tif (entries.length === 1) {\n\t\t\t\t\tconst entry = entries[0]![1];\n\n\t\t\t\t\tconst fieldDecoder = is(entry, SQL)\n\t\t\t\t\t\t? entry.decoder\n\t\t\t\t\t\t: is(entry, Column)\n\t\t\t\t\t\t? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }\n\t\t\t\t\t\t: entry.sql.decoder;\n\t\t\t\t\tif (fieldDecoder) field._.sql.decoder = fieldDecoder;\n\t\t\t\t}\n\t\t\t\tchunk.push(field);\n\t\t\t}\n\n\t\t\tif (i < columnsLen - 1) {\n\t\t\t\tchunk.push(sql`, `);\n\t\t\t}\n\n\t\t\treturn chunk;\n\t\t});\n\n\t\treturn sql.join(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: SQL[] = [];\n\n\t\tif (joins) {\n\t\t\tfor (const [index, joinMeta] of joins.entries()) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t\tconst table = joinMeta.table;\n\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\tconst tableName = table[SQLiteTable.Symbol.Name];\n\t\t\t\t\tconst tableSchema = table[SQLiteTable.Symbol.Schema];\n\t\t\t\t\tconst origTableName = table[SQLiteTable.Symbol.OriginalName];\n\t\t\t\t\tconst alias = tableName === origTableName ? undefined : joinMeta.alias;\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${\n\t\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\t\torigTableName,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}${alias && sql` ${sql.identifier(alias)}`}${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`${sql.raw(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(sql` `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sql.join(joinsArray);\n\t}\n\n\tprivate buildLimit(limit: number | Placeholder | undefined): SQL | undefined {\n\t\treturn typeof limit === 'object'\n\t\t\t\t|| (typeof limit === 'number' && limit >= 0)\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: (SQLiteColumn | SQL | SQL.Aliased)[] = [];\n\n\t\tif (orderBy) {\n\t\t\tfor (const [index, orderByValue] of orderBy.entries()) {\n\t\t\t\torderByList.push(orderByValue);\n\n\t\t\t\tif (index < orderBy.length - 1) {\n\t\t\t\t\torderByList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn orderByList.length > 0\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]) {\n\t\t\treturn sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? '')}.`.if(table[Table.Symbol.Schema])}${\n\t\t\t\tsql.identifier(\n\t\t\t\t\ttable[Table.Symbol.OriginalName],\n\t\t\t\t)\n\t\t\t} ${sql.identifier(table[Table.Symbol.Name])}`;\n\t\t}\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}: SQLiteSelectConfig): SQL {\n\t\tconst fieldsList = fieldsFlat ?? orderSelectedFields<SQLiteColumn>(fields);\n\t\tfor (const f of fieldsList) {\n\t\t\tif (\n\t\t\t\tis(f.field, Column)\n\t\t\t\t&& getTableName(f.field.table)\n\t\t\t\t\t!== (is(table, Subquery)\n\t\t\t\t\t\t? table._.alias\n\t\t\t\t\t\t: is(table, SQLiteViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].name\n\t\t\t\t\t\t: is(table, SQL)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: getTableName(table))\n\t\t\t\t&& !((table) =>\n\t\t\t\t\tjoins?.some(\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, { isSingleTable });\n\n\t\tconst tableSql = this.buildFromTable(table);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst havingSql = having ? sql` having ${having}` : undefined;\n\n\t\tconst groupByList: (SQL | AnyColumn | SQL.Aliased)[] = [];\n\t\tif (groupBy) {\n\t\t\tfor (const [index, groupByValue] of groupBy.entries()) {\n\t\t\t\tgroupByList.push(groupByValue);\n\n\t\t\t\tif (index < groupBy.length - 1) {\n\t\t\t\t\tgroupByList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst groupBySql = groupByList.length > 0\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, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(\n\t\tleftSelect: SQL,\n\t\tsetOperators: SQLiteSelectConfig['setOperators'],\n\t): SQL {\n\t\tconst [setOperator, ...rest] = setOperators;\n\n\t\tif (!setOperator) {\n\t\t\tthrow new Error('Cannot pass undefined values to any set operator');\n\t\t}\n\n\t\tif (rest.length === 0) {\n\t\t\treturn this.buildSetOperationQuery({ leftSelect, setOperator });\n\t\t}\n\n\t\t// Some recursive magic here\n\t\treturn this.buildSetOperations(\n\t\t\tthis.buildSetOperationQuery({ leftSelect, setOperator }),\n\t\t\trest,\n\t\t);\n\t}\n\n\tbuildSetOperationQuery({\n\t\tleftSelect,\n\t\tsetOperator: { type, isAll, rightSelect, limit, orderBy, offset },\n\t}: {\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\tfor (let i = 0; i < singleOrderBy.queryChunks.length; i++) {\n\t\t\t\t\t\tconst chunk = singleOrderBy.queryChunks[i];\n\n\t\t\t\t\t\tif (is(chunk, SQLiteColumn)) {\n\t\t\t\t\t\t\tsingleOrderBy.queryChunks[i] = sql.identifier(\n\t\t\t\t\t\t\t\tthis.casing.getColumnCasing(chunk),\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\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t} else {\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\torderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst operatorChunk = sql.raw(`${type} ${isAll ? 'all ' : ''}`);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\treturn sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;\n\t}\n\n\tbuildInsertQuery({\n\t\ttable,\n\t\tvalues: valuesOrSelect,\n\t\tonConflict,\n\t\treturning,\n\t\twithList,\n\t\tselect,\n\t}: SQLiteInsertConfig): SQL {\n\t\t// const isSingleValue = values.length === 1;\n\t\tconst valuesSqlList: ((SQLChunk | SQL)[] | SQL)[] = [];\n\t\tconst columns: Record<string, SQLiteColumn> = table[Table.Symbol.Columns];\n\n\t\tconst colEntries: [string, SQLiteColumn][] = Object.entries(columns).filter(\n\t\t\t([_, col]) => !col.shouldDisableInsert(),\n\t\t);\n\t\tconst insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));\n\n\t\tif (select) {\n\t\t\tconst select = valuesOrSelect as AnySQLiteSelectQueryBuilder | SQL;\n\n\t\t\tif (is(select, SQL)) {\n\t\t\t\tvaluesSqlList.push(select);\n\t\t\t} else {\n\t\t\t\tvaluesSqlList.push(select.getSQL());\n\t\t\t}\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, Param | SQL>[];\n\t\t\tvaluesSqlList.push(sql.raw('values '));\n\n\t\t\tfor (const [valueIndex, value] of values.entries()) {\n\t\t\t\tconst valueList: (SQLChunk | SQL)[] = [];\n\t\t\t\tfor (const [fieldName, col] of colEntries) {\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (\n\t\t\t\t\t\tcolValue === undefined\n\t\t\t\t\t\t|| (is(colValue, Param) && colValue.value === undefined)\n\t\t\t\t\t) {\n\t\t\t\t\t\tlet defaultValue;\n\t\t\t\t\t\tif (col.default !== null && col.default !== undefined) {\n\t\t\t\t\t\t\tdefaultValue = is(col.default, SQL)\n\t\t\t\t\t\t\t\t? col.default\n\t\t\t\t\t\t\t\t: sql.param(col.default, col);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (col.defaultFn !== undefined) {\n\t\t\t\t\t\t\tconst defaultFnResult = col.defaultFn();\n\t\t\t\t\t\t\tdefaultValue = is(defaultFnResult, SQL)\n\t\t\t\t\t\t\t\t? defaultFnResult\n\t\t\t\t\t\t\t\t: sql.param(defaultFnResult, col);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (!col.default && col.onUpdateFn !== undefined) {\n\t\t\t\t\t\t\tconst onUpdateFnResult = col.onUpdateFn();\n\t\t\t\t\t\t\tdefaultValue = is(onUpdateFnResult, SQL)\n\t\t\t\t\t\t\t\t? onUpdateFnResult\n\t\t\t\t\t\t\t\t: sql.param(onUpdateFnResult, col);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdefaultValue = sql`null`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalueList.push(defaultValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalueList.push(colValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvaluesSqlList.push(valueList);\n\t\t\t\tif (valueIndex < values.length - 1) {\n\t\t\t\t\tvaluesSqlList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst valuesSql = sql.join(valuesSqlList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst onConflictSql = onConflict?.length ? 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): QueryWithTypings {\n\t\treturn sql.toQuery({\n\t\t\tcasing: this.casing,\n\t\t\tescapeName: this.escapeName,\n\t\t\tescapeParam: this.escapeParam,\n\t\t\tescapeString: this.escapeString,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\n\t/** @deprecated */\n\t_buildRelationalQuery({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: V1.TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: SQLiteTable;\n\t\ttableConfig: V1.TableRelationalConfig;\n\t\tqueryConfig: true | V1.DBQueryConfig<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: V1.Relation;\n\t\tjoinOn?: SQL;\n\t}): V1.BuildRelationalQueryResult<SQLiteTable, SQLiteColumn> {\n\t\tlet selection: V1.BuildRelationalQueryResult<\n\t\t\tSQLiteTable,\n\t\t\tSQLiteColumn\n\t\t>['selection'] = [];\n\t\tlet limit,\n\t\t\toffset,\n\t\t\torderBy: SQLiteSelectConfig['orderBy'] = [],\n\t\t\twhere;\n\t\tconst joins: SQLiteSelectJoinConfig[] = [];\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map(([key, value]) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as SQLiteColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map(([key, value]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\taliasedTableColumn(value, tableAlias),\n\t\t\t\t]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, V1.getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: {\n\t\t\t\ttsKey: string;\n\t\t\t\tvalue: SQLiteColumn | SQL.Aliased;\n\t\t\t}[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter(\n\t\t\t\t\t\t\t(key) => !selectedColumns.includes(key),\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as SQLiteColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | V1.DBQueryConfig<'many', false>;\n\t\t\t\trelation: V1.Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\tentry,\n\t\t\t\t\t\t): entry is [(typeof entry)[0], NonNullable<(typeof entry)[1]>] => !!entry[1],\n\t\t\t\t\t)\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tqueryConfig,\n\t\t\t\t\t\trelation: tableConfig.relations[tsKey]!,\n\t\t\t\t\t}));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased)\n\t\t\t\t\t\t? value.fieldAlias\n\t\t\t\t\t\t: tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column)\n\t\t\t\t\t\t? aliasedTableColumn(value, tableAlias)\n\t\t\t\t\t\t: value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, V1.getOrderByOperators())\n\t\t\t\t: (config.orderBy ?? []);\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as SQLiteColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = V1.normalizeRelation(\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\trelation,\n\t\t\t\t);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\t// const relationTable = schema[relationTableTsName]!;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(\n\t\t\t\t\t\t\t\tnormalizedRelation.references[i]!,\n\t\t\t\t\t\t\t\trelationTableAlias,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this._buildRelationalQuery({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as SQLiteTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, V1.One)\n\t\t\t\t\t\t? selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 }\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tconst field = sql`(${builtRelation.sql})`.as(selectedRelationTsKey);\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage:\n\t\t\t\t\t`No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\"). You need to have at least one item in \"columns\", \"with\" or \"extras\". If you need to select all columns, omit the \"columns\" key or set it to undefined.`,\n\t\t\t});\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field }) =>\n\t\t\t\t\t\tis(field, SQLiteColumn)\n\t\t\t\t\t\t\t? sql.identifier(this.casing.getColumnCasing(field))\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, V1.Many)) {\n\t\t\t\tfield = sql`coalesce(json_group_array(${field}), json_array())`;\n\t\t\t}\n\t\t\tconst nestedSelection = [\n\t\t\t\t{\n\t\t\t\t\tdbKey: 'data',\n\t\t\t\t\ttsKey: 'data',\n\t\t\t\t\tfield: field.as('data'),\n\t\t\t\t\tisJson: true,\n\t\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\t\tselection,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\torderBy,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = undefined;\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, SQLiteTable)\n\t\t\t\t\t? result\n\t\t\t\t\t: new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column)\n\t\t\t\t\t\t? aliasedTableColumn(field, tableAlias)\n\t\t\t\t\t\t: field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column)\n\t\t\t\t\t\t? aliasedTableColumn(field, tableAlias)\n\t\t\t\t\t\t: field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n\n\tprivate nestedSelectionerror() {\n\t\tthrow new DrizzleError({\n\t\t\tmessage: `Views with nested selections are not supported by the relational query builder`,\n\t\t});\n\t}\n\n\tprivate buildRqbColumn(table: Table | View, column: unknown, key: string) {\n\t\tif (is(column, Column)) {\n\t\t\tconst name = sql`${table}.${sql.identifier(this.casing.getColumnCasing(column))}`;\n\n\t\t\tswitch (column.columnType) {\n\t\t\t\tcase 'SQLiteBigInt':\n\t\t\t\tcase 'SQLiteBlobJson':\n\t\t\t\tcase 'SQLiteBlobBuffer': {\n\t\t\t\t\treturn sql`hex(${name}) as ${sql.identifier(key)}`;\n\t\t\t\t}\n\n\t\t\t\tcase 'SQLiteNumeric':\n\t\t\t\tcase 'SQLiteNumericNumber':\n\t\t\t\tcase 'SQLiteNumericBigInt': {\n\t\t\t\t\treturn sql`cast(${name} as text) as ${sql.identifier(key)}`;\n\t\t\t\t}\n\n\t\t\t\tcase 'SQLiteCustomColumn': {\n\t\t\t\t\treturn sql`${(<SQLiteCustomColumn<any>> column).jsonSelectIdentifier(name, sql)} as ${sql.identifier(key)}`;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\treturn sql`${name} as ${sql.identifier(key)}`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sql`${table}.${\n\t\t\tis(column, SQL.Aliased)\n\t\t\t\t? sql.identifier(column.fieldAlias)\n\t\t\t\t: isSQLWrapper(column)\n\t\t\t\t? sql.identifier(key)\n\t\t\t\t: this.nestedSelectionerror()\n\t\t} as ${sql.identifier(key)}`;\n\t}\n\n\tprivate unwrapAllColumns = (\n\t\ttable: Table | View,\n\t\tselection: BuildRelationalQueryResult['selection'],\n\t) => {\n\t\treturn sql.join(\n\t\t\tObject.entries(table[TableColumns]).map(([k, v]) => {\n\t\t\t\tselection.push({\n\t\t\t\t\tkey: k,\n\t\t\t\t\tfield: v as Column | SQL | SQLWrapper | SQL.Aliased,\n\t\t\t\t});\n\n\t\t\t\treturn this.buildRqbColumn(table, v, k);\n\t\t\t}),\n\t\t\tsql`, `,\n\t\t);\n\t};\n\n\tprivate getSelectedTableColumns = (\n\t\ttable: Table | View,\n\t\tcolumns: Record<string, boolean | undefined>,\n\t) => {\n\t\tconst selectedColumns: ColumnWithTSName[] = [];\n\t\tconst columnContainer = table[TableColumns];\n\t\tconst entries = Object.entries(columns);\n\n\t\tlet colSelectionMode: boolean | undefined;\n\t\tfor (const [k, v] of entries) {\n\t\t\tif (v === undefined) continue;\n\t\t\tcolSelectionMode = colSelectionMode || v;\n\n\t\t\tif (v) {\n\t\t\t\tconst column = columnContainer[k]!;\n\n\t\t\t\tselectedColumns.push({\n\t\t\t\t\tcolumn: column as Column | SQL | SQLWrapper | SQL.Aliased,\n\t\t\t\t\ttsName: k,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (colSelectionMode === false) {\n\t\t\tfor (const [k, v] of Object.entries(columnContainer)) {\n\t\t\t\tif (columns[k] === false) continue;\n\n\t\t\t\tselectedColumns.push({\n\t\t\t\t\tcolumn: v as Column | SQL | SQLWrapper | SQL.Aliased | Table,\n\t\t\t\t\ttsName: k,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn selectedColumns;\n\t};\n\n\tprivate buildColumns = (\n\t\ttable: SQLiteTable | SQLiteView,\n\t\tselection: BuildRelationalQueryResult['selection'],\n\t\tparams?: DBQueryConfig<'many'>,\n\t) =>\n\t\tparams?.columns\n\t\t\t? (() => {\n\t\t\t\tconst columnIdentifiers: SQL[] = [];\n\n\t\t\t\tconst selectedColumns = this.getSelectedTableColumns(\n\t\t\t\t\ttable,\n\t\t\t\t\tparams?.columns,\n\t\t\t\t);\n\n\t\t\t\tfor (const { column, tsName } of selectedColumns) {\n\t\t\t\t\tcolumnIdentifiers.push(this.buildRqbColumn(table, column, tsName));\n\t\t\t\t\tselection.push({\n\t\t\t\t\t\tkey: tsName,\n\t\t\t\t\t\tfield: column,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn columnIdentifiers.length\n\t\t\t\t\t? sql.join(columnIdentifiers, sql`, `)\n\t\t\t\t\t: undefined;\n\t\t\t})()\n\t\t\t: this.unwrapAllColumns(table, selection);\n\n\tbuildRelationalQuery({\n\t\tschema,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\trelationWhere,\n\t\tmode,\n\t\tisNested,\n\t\terrorPath,\n\t\tdepth,\n\t\tthroughJoin,\n\t\tjsonb,\n\t}: {\n\t\tschema: TablesRelationalConfig;\n\t\ttable: SQLiteTable | SQLiteView;\n\t\ttableConfig: TableRelationalConfig;\n\t\tqueryConfig?: DBQueryConfig<'many'> | true;\n\t\trelationWhere?: SQL;\n\t\tmode: 'first' | 'many';\n\t\tisNested?: boolean;\n\t\terrorPath?: string;\n\t\tdepth?: number;\n\t\tthroughJoin?: SQL;\n\t\tjsonb: SQL;\n\t}): BuildRelationalQueryResult {\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\tif (!currentDepth) table = aliasedTable(table, `d${currentDepth}`);\n\n\t\tconst limit = isSingle ? 1 : params?.limit;\n\t\tconst offset = params?.offset;\n\n\t\tconst columns = this.buildColumns(table, selection, params);\n\n\t\tconst where: SQL | undefined = params?.where && relationWhere\n\t\t\t? and(\n\t\t\t\trelationsFilterToSQL(\n\t\t\t\t\ttable,\n\t\t\t\t\tparams.where,\n\t\t\t\t\ttableConfig.relations,\n\t\t\t\t\tschema,\n\t\t\t\t\tthis.casing,\n\t\t\t\t),\n\t\t\t\trelationWhere,\n\t\t\t)\n\t\t\t: params?.where\n\t\t\t? relationsFilterToSQL(\n\t\t\t\ttable,\n\t\t\t\tparams.where,\n\t\t\t\ttableConfig.relations,\n\t\t\t\tschema,\n\t\t\t\tthis.casing,\n\t\t\t)\n\t\t\t: relationWhere;\n\t\tconst order = params?.orderBy\n\t\t\t? relationsOrderToSQL(table, params.orderBy)\n\t\t\t: undefined;\n\t\tconst extras = params?.extras\n\t\t\t? relationExtrasToSQL(table, params.extras)\n\t\t\t: undefined;\n\t\tif (extras) selection.push(...extras.selection);\n\n\t\tconst joins = params\n\t\t\t? (() => {\n\t\t\t\tconst { with: joins } = params as WithContainer;\n\t\t\t\tif (!joins) return;\n\n\t\t\t\tconst withEntries = Object.entries(joins).filter(([_, v]) => v);\n\t\t\t\tif (!withEntries.length) return;\n\n\t\t\t\treturn sql.join(\n\t\t\t\t\twithEntries.map(([k, join]) => {\n\t\t\t\t\t\t// if (is(tableConfig.relations[k]!, AggregatedField)) {\n\t\t\t\t\t\t// \tconst relation = tableConfig.relations[k]!;\n\n\t\t\t\t\t\t// \trelation.onTable(table);\n\t\t\t\t\t\t// \tconst query = relation.getSQL();\n\n\t\t\t\t\t\t// \tselection.push({\n\t\t\t\t\t\t// \t\tkey: k,\n\t\t\t\t\t\t// \t\tfield: relation,\n\t\t\t\t\t\t// \t});\n\n\t\t\t\t\t\t// \treturn sql`(${query}) as ${sql.identifier(k)}`;\n\t\t\t\t\t\t// }\n\n\t\t\t\t\t\tconst relation = tableConfig.relations[k]! as Relation;\n\t\t\t\t\t\tconst isSingle = is(relation, One);\n\t\t\t\t\t\tconst targetTable = aliasedTable(\n\t\t\t\t\t\t\trelation.targetTable,\n\t\t\t\t\t\t\t`d${currentDepth + 1}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst throughTable = relation.throughTable\n\t\t\t\t\t\t\t? aliasedTable(relation.throughTable, `tr${currentDepth}`)\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tconst { filter, joinCondition } = relationToSQL(\n\t\t\t\t\t\t\tthis.casing,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttable,\n\t\t\t\t\t\t\ttargetTable,\n\t\t\t\t\t\t\tthroughTable,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst throughJoin = throughTable\n\t\t\t\t\t\t\t? sql` inner join ${getTableAsAliasSQL(throughTable)} on ${joinCondition!}`\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\tconst innerQuery = this.buildRelationalQuery({\n\t\t\t\t\t\t\ttable: targetTable as SQLiteTable | SQLiteView,\n\t\t\t\t\t\t\tmode: isSingle ? 'first' : 'many',\n\t\t\t\t\t\t\tschema,\n\t\t\t\t\t\t\tqueryConfig: join as DBQueryConfig,\n\t\t\t\t\t\t\ttableConfig: schema[relation.targetTableName]!,\n\t\t\t\t\t\t\trelationWhere: filter,\n\t\t\t\t\t\t\tisNested: true,\n\t\t\t\t\t\t\terrorPath: `${currentPath.length ? `${currentPath}.` : ''}${k}`,\n\t\t\t\t\t\t\tdepth: currentDepth + 1,\n\t\t\t\t\t\t\tthroughJoin,\n\t\t\t\t\t\t\tjsonb,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tselection.push({\n\t\t\t\t\t\t\tfield: targetTable,\n\t\t\t\t\t\t\tkey: k,\n\t\t\t\t\t\t\tselection: innerQuery.selection,\n\t\t\t\t\t\t\tisArray: !isSingle,\n\t\t\t\t\t\t\tisOptional: ((relation as AnyOne).optional ?? false)\n\t\t\t\t\t\t\t\t|| (join !== true\n\t\t\t\t\t\t\t\t\t&& !!(join as Exclude<typeof join, boolean | undefined>)\n\t\t\t\t\t\t\t\t\t\t.where),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst jsonColumns = sql.join(\n\t\t\t\t\t\t\tinnerQuery.selection.map((s) => {\n\t\t\t\t\t\t\t\treturn sql`${sql.raw(this.escapeString(s.key))}, ${\n\t\t\t\t\t\t\t\t\ts.selection\n\t\t\t\t\t\t\t\t\t\t? sql`${jsonb}(${sql.identifier(s.key)})`\n\t\t\t\t\t\t\t\t\t\t: sql.identifier(s.key)\n\t\t\t\t\t\t\t\t}`;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tsql`, `,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst json = isNested ? jsonb : sql`json`;\n\n\t\t\t\t\t\tconst joinQuery = isSingle\n\t\t\t\t\t\t\t? sql`(select ${json}_object(${jsonColumns}) as ${sql.identifier('r')} from (${innerQuery.sql}) as ${\n\t\t\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\t\t\t't',\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}) as ${sql.identifier(k)}`\n\t\t\t\t\t\t\t: sql`coalesce((select ${json}_group_array(json_object(${jsonColumns})) as ${\n\t\t\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\t\t\t'r',\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} from (${innerQuery.sql}) as ${sql.identifier('t')}), ${jsonb}_array()) as ${sql.identifier(k)}`;\n\n\t\t\t\t\t\treturn joinQuery;\n\t\t\t\t\t}),\n\t\t\t\t\tsql`, `,\n\t\t\t\t);\n\t\t\t})()\n\t\t\t: undefined;\n\n\t\tconst selectionArr = [columns, extras?.sql, joins].filter(\n\t\t\t(e) => e !== undefined,\n\t\t);\n\t\tif (!selectionArr.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\t\tconst selectionSet = sql.join(selectionArr, sql`, `);\n\n\t\tconst query = sql`select ${selectionSet} from ${getTableAsAliasSQL(table)}${throughJoin}${\n\t\t\tsql` where ${where}`.if(\n\t\t\t\twhere,\n\t\t\t)\n\t\t}${sql` order by ${order}`.if(order)}${sql` limit ${limit}`.if(limit !== undefined)}${\n\t\t\tsql` offset ${offset}`.if(\n\t\t\t\toffset !== undefined,\n\t\t\t)\n\t\t}`;\n\n\t\treturn {\n\t\t\tsql: query,\n\t\t\tselection,\n\t\t};\n\t}\n}\n\nexport class SQLiteSyncDialect extends SQLiteDialect {\n\tstatic override readonly [entityKind]: string = 'SQLiteSyncDialect';\n\n\tmigrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: SQLiteSession<\n\t\t\t'sync',\n\t\t\tunknown,\n\t\t\tRecord<string, unknown>,\n\t\t\tAnyRelations,\n\t\t\tV1.TablesRelationalConfig\n\t\t>,\n\t\tconfig?: string | Omit<MigrationConfig, 'migrationsFolder'>,\n\t): void | MigratorInitFailResponse {\n\t\tconst migrationsTable = config === undefined\n\t\t\t? '__drizzle_migrations'\n\t\t\t: typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: (config.migrationsTable ?? '__drizzle_migrations');\n\n\t\t// Detect DB version and upgrade table schema if needed\n\t\tconst { newDb } = upgradeSyncIfNeeded(migrationsTable, session, migrations);\n\n\t\tif (newDb) {\n\t\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\tsession.run(migrationTableCreate);\n\t\t}\n\n\t\tconst dbMigrations = session.all<{\n\t\t\tid: number;\n\t\t\thash: string;\n\t\t\tcreated_at: string;\n\t\t\tname: string | null;\n\t\t}>(\n\t\t\tsql`SELECT id, hash, created_at, name FROM ${sql.identifier(migrationsTable)}`,\n\t\t);\n\n\t\tif (typeof config === 'object' && config.init) {\n\t\t\tif (dbMigrations.length) {\n\t\t\t\treturn { exitCode: 'databaseMigrations' as const };\n\t\t\t}\n\n\t\t\tif (migrations.length > 1) {\n\t\t\t\treturn { exitCode: 'localMigrations' as const };\n\t\t\t}\n\n\t\t\tconst [migration] = migrations;\n\n\t\t\tif (!migration) return;\n\n\t\t\tsession.run(\n\t\t\t\tsql`insert into ${\n\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\tmigrationsTable,\n\t\t\t\t\t)\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\n\t\t\treturn;\n\t\t}\n\n\t\tconst migrationsToRun = getMigrationsToRun({\n\t\t\tlocalMigrations: migrations,\n\t\t\tdbMigrations,\n\t\t});\n\t\tsession.run(sql`BEGIN`);\n\n\t\ttry {\n\t\t\tfor (const migration of migrationsToRun) {\n\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\tsession.run(sql.raw(stmt));\n\t\t\t\t}\n\t\t\t\tsession.run(\n\t\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\tmigrationsTable,\n\t\t\t\t\t\t)\n\t\t\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\t\t\tnew Date().toISOString()\n\t\t\t\t\t})`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsession.run(sql`COMMIT`);\n\t\t} catch (e) {\n\t\t\tsession.run(sql`ROLLBACK`);\n\t\t\tthrow e;\n\t\t}\n\t}\n}\n\nexport class SQLiteAsyncDialect extends SQLiteDialect {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncDialect';\n\n\tasync migrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: SQLiteSession<\n\t\t\t'async',\n\t\t\tunknown,\n\t\t\tRecord<string, unknown>,\n\t\t\tAnyRelations,\n\t\t\tV1.TablesRelationalConfig\n\t\t>,\n\t\tconfig?: string | Omit<MigrationConfig, 'migrationsFolder'>,\n\t): Promise<void | MigratorInitFailResponse> {\n\t\tconst migrationsTable = config === undefined\n\t\t\t? '__drizzle_migrations'\n\t\t\t: typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: (config.migrationsTable ?? '__drizzle_migrations');\n\n\t\t// Detect DB version and upgrade table schema if needed\n\t\tconst { newDb } = await upgradeAsyncIfNeeded(\n\t\t\tmigrationsTable,\n\t\t\tsession,\n\t\t\tmigrations,\n\t\t);\n\n\t\tif (newDb) {\n\t\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)\n\t\t`;\n\t\t\tawait session.run(migrationTableCreate);\n\t\t}\n\n\t\tconst dbMigrations = await session.all<{\n\t\t\tid: number;\n\t\t\thash: string;\n\t\t\tcreated_at: string;\n\t\t\tname: string | null;\n\t\t}>(\n\t\t\tsql`SELECT id, hash, created_at, name FROM ${sql.identifier(migrationsTable)};`,\n\t\t);\n\n\t\tif (typeof config === 'object' && config.init) {\n\t\t\tif (dbMigrations.length) {\n\t\t\t\treturn { exitCode: 'databaseMigrations' as const };\n\t\t\t}\n\n\t\t\tif (migrations.length > 1) {\n\t\t\t\treturn { exitCode: 'localMigrations' as const };\n\t\t\t}\n\n\t\t\tconst [migration] = migrations;\n\n\t\t\tif (!migration) return;\n\n\t\t\tawait session.run(\n\t\t\t\tsql`insert into ${\n\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\tmigrationsTable,\n\t\t\t\t\t)\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\n\t\t\treturn;\n\t\t}\n\n\t\tconst migrationsToRun = getMigrationsToRun({\n\t\t\tlocalMigrations: migrations,\n\t\t\tdbMigrations,\n\t\t});\n\t\tawait session.transaction(async (tx) => {\n\t\t\tfor (const migration of migrationsToRun) {\n\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\tawait tx.run(sql.raw(stmt));\n\t\t\t\t}\n\t\t\t\tawait tx.run(\n\t\t\t\t\tsql`insert into ${\n\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\tmigrationsTable,\n\t\t\t\t\t\t)\n\t\t\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\t\t\tnew Date().toISOString()\n\t\t\t\t\t})`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"dialect.js","names":["isSQLWrapper"],"sources":["../../src/sqlite-core/dialect.ts"],"sourcesContent":["import * as V1 from '~/_relations.ts';\nimport {\n\taliasedTable,\n\taliasedTableColumn,\n\tgetOriginalColumnFromAlias,\n\tmapColumnsInAliasedSQLToAlias,\n\tmapColumnsInSQLToAlias,\n} from '~/alias.ts';\nimport { CasingCache } from '~/casing.ts';\nimport type { AnyColumn } from '~/column.ts';\nimport { Column } from '~/column.ts';\nimport { entityKind, is } from '~/entity.ts';\nimport { DrizzleError } from '~/errors.ts';\nimport type { MigrationConfig, MigrationMeta, MigratorInitFailResponse } from '~/migrator.ts';\nimport { getMigrationsToRun } from '~/migrator.utils.ts';\nimport {\n\ttype AnyOne,\n\t// AggregatedField,\n\ttype AnyRelations,\n\ttype BuildRelationalQueryResult,\n\ttype ColumnWithTSName,\n\ttype DBQueryConfig,\n\tgetTableAsAliasSQL,\n\tOne,\n\ttype Relation,\n\trelationExtrasToSQL,\n\trelationsFilterToSQL,\n\trelationsOrderToSQL,\n\trelationToSQL,\n\ttype TableRelationalConfig,\n\ttype TablesRelationalConfig,\n\ttype WithContainer,\n} from '~/relations.ts';\nimport type { Name, Placeholder, SQLWrapper } from '~/sql/index.ts';\nimport { and, eq, isSQLWrapper } from '~/sql/index.ts';\nimport { Param, type QueryWithTypings, SQL, sql, type SQLChunk, View } from '~/sql/sql.ts';\nimport { SQLiteColumn, type SQLiteCustomColumn } from '~/sqlite-core/columns/index.ts';\nimport type {\n\tAnySQLiteSelectQueryBuilder,\n\tSQLiteDeleteConfig,\n\tSQLiteInsertConfig,\n\tSQLiteUpdateConfig,\n} from '~/sqlite-core/query-builders/index.ts';\nimport { SQLiteTable } from '~/sqlite-core/table.ts';\nimport { Subquery } from '~/subquery.ts';\nimport { getTableName, getTableUniqueName, Table, TableColumns } from '~/table.ts';\nimport { upgradeAsyncIfNeeded, upgradeSyncIfNeeded } from '~/up-migrations/sqlite.ts';\nimport { type Casing, orderSelectedFields, type UpdateSet } from '~/utils.ts';\nimport { ViewBaseConfig } from '~/view-common.ts';\nimport type { BaseSQLiteDatabase } from './db.ts';\nimport type {\n\tSelectedFieldsOrdered,\n\tSQLiteSelectConfig,\n\tSQLiteSelectJoinConfig,\n} from './query-builders/select.types.ts';\nimport type { SQLiteSession } from './session.ts';\nimport { SQLiteViewBase } from './view-base.ts';\nimport type { SQLiteView } from './view.ts';\n\nexport interface SQLiteDialectConfig {\n\tcasing?: Casing;\n}\n\nexport abstract class SQLiteDialect {\n\tstatic readonly [entityKind]: string = 'SQLiteDialect';\n\n\t/** @internal */\n\treadonly casing: CasingCache;\n\n\tconstructor(config?: SQLiteDialectConfig) {\n\t\tthis.casing = new CasingCache(config?.casing);\n\t}\n\n\tescapeName(name: string): string {\n\t\treturn `\"${name.replace(/\"/g, '\"\"')}\"`;\n\t}\n\n\tescapeParam(_num: number): string {\n\t\treturn '?';\n\t}\n\n\tescapeString(str: string): string {\n\t\treturn `'${str.replace(/'/g, \"''\")}'`;\n\t}\n\n\tprivate buildWithCTE(queries: Subquery[] | undefined): SQL | undefined {\n\t\tif (!queries?.length) return undefined;\n\n\t\tconst withSqlChunks = [sql`with `];\n\t\tfor (const [i, w] of queries.entries()) {\n\t\t\twithSqlChunks.push(sql`${sql.identifier(w._.alias)} as (${w._.sql})`);\n\t\t\tif (i < queries.length - 1) {\n\t\t\t\twithSqlChunks.push(sql`, `);\n\t\t\t}\n\t\t}\n\t\twithSqlChunks.push(sql` `);\n\t\treturn sql.join(withSqlChunks);\n\t}\n\n\tbuildDeleteQuery({\n\t\ttable,\n\t\twhere,\n\t\treturning,\n\t\twithList,\n\t\tlimit,\n\t\torderBy,\n\t}: SQLiteDeleteConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}delete from ${table}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n\t}\n\n\tbuildUpdateSet(table: SQLiteTable, set: UpdateSet): SQL {\n\t\tconst tableColumns = table[Table.Symbol.Columns];\n\n\t\tconst columnNames = Object.keys(tableColumns).filter(\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\treturn sql.join(\n\t\t\tcolumnNames.flatMap((colName, i) => {\n\t\t\t\tconst col = tableColumns[colName]!;\n\n\t\t\t\tconst onUpdateFnResult = col.onUpdateFn?.();\n\t\t\t\tconst value = set[colName]\n\t\t\t\t\t?? (is(onUpdateFnResult, SQL)\n\t\t\t\t\t\t? onUpdateFnResult\n\t\t\t\t\t\t: sql.param(onUpdateFnResult, col));\n\t\t\t\tconst res = sql`${sql.identifier(this.casing.getColumnCasing(col))} = ${value}`;\n\n\t\t\t\tif (i < setLength - 1) {\n\t\t\t\t\treturn [res, sql.raw(', ')];\n\t\t\t\t}\n\t\t\t\treturn [res];\n\t\t\t}),\n\t\t);\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}: SQLiteUpdateConfig): SQL {\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst setSql = this.buildUpdateSet(table, set);\n\n\t\tconst fromSql = from && sql.join([sql.raw(' from '), this.buildFromTable(from)]);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst orderBySql = this.buildOrderBy(orderBy);\n\n\t\tconst limitSql = this.buildLimit(limit);\n\n\t\treturn sql`${withSql}update ${table} set ${setSql}${fromSql}${joinsSql}${whereSql}${returningSql}${orderBySql}${limitSql}`;\n\t}\n\n\t/**\n\t * Builds selection SQL with provided fields/expressions\n\t *\n\t * Examples:\n\t *\n\t * `select <selection> from`\n\t *\n\t * `insert ... returning <selection>`\n\t *\n\t * If `isSingleTable` is true, then columns won't be prefixed with table name\n\t */\n\tprivate buildSelection(\n\t\tfields: SelectedFieldsOrdered,\n\t\t{ isSingleTable = false }: { isSingleTable?: boolean } = {},\n\t): SQL {\n\t\tconst columnsLen = fields.length;\n\n\t\tconst chunks = fields.flatMap(({ field }, i) => {\n\t\t\tconst chunk: SQLChunk[] = [];\n\n\t\t\tif (is(field, SQL.Aliased) && field.isSelectionField) {\n\t\t\t\tif (!isSingleTable && field.origin !== undefined) {\n\t\t\t\t\tchunk.push(sql.identifier(field.origin), sql.raw('.'));\n\t\t\t\t}\n\t\t\t\tchunk.push(sql.identifier(field.fieldAlias));\n\t\t\t} else if (is(field, SQL.Aliased) || is(field, SQL)) {\n\t\t\t\tconst query = is(field, SQL.Aliased) ? field.sql : field;\n\n\t\t\t\tif (isSingleTable) {\n\t\t\t\t\tconst newSql = new SQL(\n\t\t\t\t\t\tquery.queryChunks.map((c) => {\n\t\t\t\t\t\t\tif (is(c, Column)) {\n\t\t\t\t\t\t\t\treturn sql.identifier(this.casing.getColumnCasing(c));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn c;\n\t\t\t\t\t\t}),\n\t\t\t\t\t);\n\n\t\t\t\t\tchunk.push(query.shouldInlineParams ? newSql.inlineParams() : newSql);\n\t\t\t\t} else {\n\t\t\t\t\tchunk.push(query);\n\t\t\t\t}\n\n\t\t\t\tif (is(field, SQL.Aliased)) {\n\t\t\t\t\tchunk.push(sql` as ${sql.identifier(field.fieldAlias)}`);\n\t\t\t\t}\n\t\t\t} else if (is(field, Column)) {\n\t\t\t\tif (field.columnType === 'SQLiteNumericBigInt') {\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tfield.isAlias\n\t\t\t\t\t\t\t\t? sql`cast(${\n\t\t\t\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\t\t\t\tthis.casing.getColumnCasing(\n\t\t\t\t\t\t\t\t\t\t\tgetOriginalColumnFromAlias(field),\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\t} as text) as ${field}`\n\t\t\t\t\t\t\t\t: sql`cast(${sql.identifier(this.casing.getColumnCasing(field))} as text)`,\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tfield.isAlias\n\t\t\t\t\t\t\t\t? sql`cast(${getOriginalColumnFromAlias(field)} as text) as ${field}`\n\t\t\t\t\t\t\t\t: sql`cast(${field} as text)`,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (isSingleTable) {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tfield.isAlias\n\t\t\t\t\t\t\t\t? sql`${sql.identifier(this.casing.getColumnCasing(getOriginalColumnFromAlias(field)))} as ${field}`\n\t\t\t\t\t\t\t\t: sql.identifier(this.casing.getColumnCasing(field)),\n\t\t\t\t\t\t);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tchunk.push(\n\t\t\t\t\t\t\tfield.isAlias\n\t\t\t\t\t\t\t\t? sql`${getOriginalColumnFromAlias(field)} as ${field}`\n\t\t\t\t\t\t\t\t: field,\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (is(field, Subquery)) {\n\t\t\t\tconst entries = Object.entries(field._.selectedFields) as [\n\t\t\t\t\tstring,\n\t\t\t\t\tSQL.Aliased | Column | SQL,\n\t\t\t\t][];\n\n\t\t\t\tif (entries.length === 1) {\n\t\t\t\t\tconst entry = entries[0]![1];\n\n\t\t\t\t\tconst fieldDecoder = is(entry, SQL)\n\t\t\t\t\t\t? entry.decoder\n\t\t\t\t\t\t: is(entry, Column)\n\t\t\t\t\t\t? { mapFromDriverValue: (v: any) => entry.mapFromDriverValue(v) }\n\t\t\t\t\t\t: entry.sql.decoder;\n\t\t\t\t\tif (fieldDecoder) field._.sql.decoder = fieldDecoder;\n\t\t\t\t}\n\t\t\t\tchunk.push(field);\n\t\t\t}\n\n\t\t\tif (i < columnsLen - 1) {\n\t\t\t\tchunk.push(sql`, `);\n\t\t\t}\n\n\t\t\treturn chunk;\n\t\t});\n\n\t\treturn sql.join(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: SQL[] = [];\n\n\t\tif (joins) {\n\t\t\tfor (const [index, joinMeta] of joins.entries()) {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\tjoinsArray.push(sql` `);\n\t\t\t\t}\n\t\t\t\tconst table = joinMeta.table;\n\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\tconst tableName = table[SQLiteTable.Symbol.Name];\n\t\t\t\t\tconst tableSchema = table[SQLiteTable.Symbol.Schema];\n\t\t\t\t\tconst origTableName = table[SQLiteTable.Symbol.OriginalName];\n\t\t\t\t\tconst alias = tableName === origTableName ? undefined : joinMeta.alias;\n\t\t\t\t\tjoinsArray.push(\n\t\t\t\t\t\tsql`${sql.raw(joinMeta.joinType)} join ${tableSchema ? sql`${sql.identifier(tableSchema)}.` : undefined}${\n\t\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\t\torigTableName,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t}${alias && sql` ${sql.identifier(alias)}`}${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`${sql.raw(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(sql` `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sql.join(joinsArray);\n\t}\n\n\tprivate buildLimit(limit: number | Placeholder | undefined): SQL | undefined {\n\t\treturn typeof limit === 'object'\n\t\t\t\t|| (typeof limit === 'number' && limit >= 0)\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: (SQLiteColumn | SQL | SQL.Aliased)[] = [];\n\n\t\tif (orderBy) {\n\t\t\tfor (const [index, orderByValue] of orderBy.entries()) {\n\t\t\t\torderByList.push(orderByValue);\n\n\t\t\t\tif (index < orderBy.length - 1) {\n\t\t\t\t\torderByList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn orderByList.length > 0\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]) {\n\t\t\treturn sql`${sql`${sql.identifier(table[Table.Symbol.Schema] ?? '')}.`.if(table[Table.Symbol.Schema])}${\n\t\t\t\tsql.identifier(\n\t\t\t\t\ttable[Table.Symbol.OriginalName],\n\t\t\t\t)\n\t\t\t} ${sql.identifier(table[Table.Symbol.Name])}`;\n\t\t}\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}: SQLiteSelectConfig): SQL {\n\t\tconst fieldsList = fieldsFlat ?? orderSelectedFields<SQLiteColumn>(fields);\n\t\tfor (const f of fieldsList) {\n\t\t\tif (\n\t\t\t\tis(f.field, Column)\n\t\t\t\t&& getTableName(f.field.table)\n\t\t\t\t\t!== (is(table, Subquery)\n\t\t\t\t\t\t? table._.alias\n\t\t\t\t\t\t: is(table, SQLiteViewBase)\n\t\t\t\t\t\t? table[ViewBaseConfig].name\n\t\t\t\t\t\t: is(table, SQL)\n\t\t\t\t\t\t? undefined\n\t\t\t\t\t\t: getTableName(table))\n\t\t\t\t&& !((table) =>\n\t\t\t\t\tjoins?.some(\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, { isSingleTable });\n\n\t\tconst tableSql = this.buildFromTable(table);\n\n\t\tconst joinsSql = this.buildJoins(joins);\n\n\t\tconst whereSql = where ? sql` where ${where}` : undefined;\n\n\t\tconst havingSql = having ? sql` having ${having}` : undefined;\n\n\t\tconst groupByList: (SQL | AnyColumn | SQL.Aliased)[] = [];\n\t\tif (groupBy) {\n\t\t\tfor (const [index, groupByValue] of groupBy.entries()) {\n\t\t\t\tgroupByList.push(groupByValue);\n\n\t\t\t\tif (index < groupBy.length - 1) {\n\t\t\t\t\tgroupByList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst groupBySql = groupByList.length > 0\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, setOperators);\n\t\t}\n\n\t\treturn finalQuery;\n\t}\n\n\tbuildSetOperations(\n\t\tleftSelect: SQL,\n\t\tsetOperators: SQLiteSelectConfig['setOperators'],\n\t): SQL {\n\t\tconst [setOperator, ...rest] = setOperators;\n\n\t\tif (!setOperator) {\n\t\t\tthrow new Error('Cannot pass undefined values to any set operator');\n\t\t}\n\n\t\tif (rest.length === 0) {\n\t\t\treturn this.buildSetOperationQuery({ leftSelect, setOperator });\n\t\t}\n\n\t\t// Some recursive magic here\n\t\treturn this.buildSetOperations(\n\t\t\tthis.buildSetOperationQuery({ leftSelect, setOperator }),\n\t\t\trest,\n\t\t);\n\t}\n\n\tbuildSetOperationQuery({\n\t\tleftSelect,\n\t\tsetOperator: { type, isAll, rightSelect, limit, orderBy, offset },\n\t}: {\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\tfor (let i = 0; i < singleOrderBy.queryChunks.length; i++) {\n\t\t\t\t\t\tconst chunk = singleOrderBy.queryChunks[i];\n\n\t\t\t\t\t\tif (is(chunk, SQLiteColumn)) {\n\t\t\t\t\t\t\tsingleOrderBy.queryChunks[i] = sql.identifier(\n\t\t\t\t\t\t\t\tthis.casing.getColumnCasing(chunk),\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\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t} else {\n\t\t\t\t\torderByValues.push(sql`${singleOrderBy}`);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\torderBySql = sql` order by ${sql.join(orderByValues, sql`, `)}`;\n\t\t}\n\n\t\tconst limitSql = typeof limit === 'object' || (typeof limit === 'number' && limit >= 0)\n\t\t\t? sql` limit ${limit}`\n\t\t\t: undefined;\n\n\t\tconst operatorChunk = sql.raw(`${type} ${isAll ? 'all ' : ''}`);\n\n\t\tconst offsetSql = offset ? sql` offset ${offset}` : undefined;\n\n\t\treturn sql`${leftChunk}${operatorChunk}${rightChunk}${orderBySql}${limitSql}${offsetSql}`;\n\t}\n\n\tbuildInsertQuery({\n\t\ttable,\n\t\tvalues: valuesOrSelect,\n\t\tonConflict,\n\t\treturning,\n\t\twithList,\n\t\tselect,\n\t}: SQLiteInsertConfig): SQL {\n\t\t// const isSingleValue = values.length === 1;\n\t\tconst valuesSqlList: ((SQLChunk | SQL)[] | SQL)[] = [];\n\t\tconst columns: Record<string, SQLiteColumn> = table[Table.Symbol.Columns];\n\n\t\tconst colEntries: [string, SQLiteColumn][] = Object.entries(columns).filter(\n\t\t\t([_, col]) => !col.shouldDisableInsert(),\n\t\t);\n\t\tconst insertOrder = colEntries.map(([, column]) => sql.identifier(this.casing.getColumnCasing(column)));\n\n\t\tif (select) {\n\t\t\tconst select = valuesOrSelect as AnySQLiteSelectQueryBuilder | SQL;\n\n\t\t\tif (is(select, SQL)) {\n\t\t\t\tvaluesSqlList.push(select);\n\t\t\t} else {\n\t\t\t\tvaluesSqlList.push(select.getSQL());\n\t\t\t}\n\t\t} else {\n\t\t\tconst values = valuesOrSelect as Record<string, Param | SQL>[];\n\t\t\tvaluesSqlList.push(sql.raw('values '));\n\n\t\t\tfor (const [valueIndex, value] of values.entries()) {\n\t\t\t\tconst valueList: (SQLChunk | SQL)[] = [];\n\t\t\t\tfor (const [fieldName, col] of colEntries) {\n\t\t\t\t\tconst colValue = value[fieldName];\n\t\t\t\t\tif (\n\t\t\t\t\t\tcolValue === undefined\n\t\t\t\t\t\t|| (is(colValue, Param) && colValue.value === undefined)\n\t\t\t\t\t) {\n\t\t\t\t\t\tlet defaultValue;\n\t\t\t\t\t\tif (col.default !== null && col.default !== undefined) {\n\t\t\t\t\t\t\tdefaultValue = is(col.default, SQL)\n\t\t\t\t\t\t\t\t? col.default\n\t\t\t\t\t\t\t\t: sql.param(col.default, col);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (col.defaultFn !== undefined) {\n\t\t\t\t\t\t\tconst defaultFnResult = col.defaultFn();\n\t\t\t\t\t\t\tdefaultValue = is(defaultFnResult, SQL)\n\t\t\t\t\t\t\t\t? defaultFnResult\n\t\t\t\t\t\t\t\t: sql.param(defaultFnResult, col);\n\t\t\t\t\t\t\t// eslint-disable-next-line unicorn/no-negated-condition\n\t\t\t\t\t\t} else if (!col.default && col.onUpdateFn !== undefined) {\n\t\t\t\t\t\t\tconst onUpdateFnResult = col.onUpdateFn();\n\t\t\t\t\t\t\tdefaultValue = is(onUpdateFnResult, SQL)\n\t\t\t\t\t\t\t\t? onUpdateFnResult\n\t\t\t\t\t\t\t\t: sql.param(onUpdateFnResult, col);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdefaultValue = sql`null`;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvalueList.push(defaultValue);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalueList.push(colValue);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tvaluesSqlList.push(valueList);\n\t\t\t\tif (valueIndex < values.length - 1) {\n\t\t\t\t\tvaluesSqlList.push(sql`, `);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst withSql = this.buildWithCTE(withList);\n\n\t\tconst valuesSql = sql.join(valuesSqlList);\n\n\t\tconst returningSql = returning\n\t\t\t? sql` returning ${this.buildSelection(returning, { isSingleTable: true })}`\n\t\t\t: undefined;\n\n\t\tconst onConflictSql = onConflict?.length ? 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): QueryWithTypings {\n\t\treturn sql.toQuery({\n\t\t\tcasing: this.casing,\n\t\t\tescapeName: this.escapeName,\n\t\t\tescapeParam: this.escapeParam,\n\t\t\tescapeString: this.escapeString,\n\t\t\tinvokeSource,\n\t\t});\n\t}\n\n\t/** @deprecated */\n\t_buildRelationalQuery({\n\t\tfullSchema,\n\t\tschema,\n\t\ttableNamesMap,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\ttableAlias,\n\t\tnestedQueryRelation,\n\t\tjoinOn,\n\t}: {\n\t\tfullSchema: Record<string, unknown>;\n\t\tschema: V1.TablesRelationalConfig;\n\t\ttableNamesMap: Record<string, string>;\n\t\ttable: SQLiteTable;\n\t\ttableConfig: V1.TableRelationalConfig;\n\t\tqueryConfig: true | V1.DBQueryConfig<'many', true>;\n\t\ttableAlias: string;\n\t\tnestedQueryRelation?: V1.Relation;\n\t\tjoinOn?: SQL;\n\t}): V1.BuildRelationalQueryResult<SQLiteTable, SQLiteColumn> {\n\t\tlet selection: V1.BuildRelationalQueryResult<\n\t\t\tSQLiteTable,\n\t\t\tSQLiteColumn\n\t\t>['selection'] = [];\n\t\tlet limit,\n\t\t\toffset,\n\t\t\torderBy: SQLiteSelectConfig['orderBy'] = [],\n\t\t\twhere;\n\t\tconst joins: SQLiteSelectJoinConfig[] = [];\n\n\t\tif (config === true) {\n\t\t\tconst selectionEntries = Object.entries(tableConfig.columns);\n\t\t\tselection = selectionEntries.map(([key, value]) => ({\n\t\t\t\tdbKey: value.name,\n\t\t\t\ttsKey: key,\n\t\t\t\tfield: aliasedTableColumn(value as SQLiteColumn, tableAlias),\n\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\tisJson: false,\n\t\t\t\tselection: [],\n\t\t\t}));\n\t\t} else {\n\t\t\tconst aliasedColumns = Object.fromEntries(\n\t\t\t\tObject.entries(tableConfig.columns).map(([key, value]) => [\n\t\t\t\t\tkey,\n\t\t\t\t\taliasedTableColumn(value, tableAlias),\n\t\t\t\t]),\n\t\t\t);\n\n\t\t\tif (config.where) {\n\t\t\t\tconst whereSql = typeof config.where === 'function'\n\t\t\t\t\t? config.where(aliasedColumns, V1.getOperators())\n\t\t\t\t\t: config.where;\n\t\t\t\twhere = whereSql && mapColumnsInSQLToAlias(whereSql, tableAlias);\n\t\t\t}\n\n\t\t\tconst fieldsSelection: {\n\t\t\t\ttsKey: string;\n\t\t\t\tvalue: SQLiteColumn | SQL.Aliased;\n\t\t\t}[] = [];\n\t\t\tlet selectedColumns: string[] = [];\n\n\t\t\t// Figure out which columns to select\n\t\t\tif (config.columns) {\n\t\t\t\tlet isIncludeMode = false;\n\n\t\t\t\tfor (const [field, value] of Object.entries(config.columns)) {\n\t\t\t\t\tif (value === undefined) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (field in tableConfig.columns) {\n\t\t\t\t\t\tif (!isIncludeMode && value === true) {\n\t\t\t\t\t\t\tisIncludeMode = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselectedColumns.push(field);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (selectedColumns.length > 0) {\n\t\t\t\t\tselectedColumns = isIncludeMode\n\t\t\t\t\t\t? selectedColumns.filter((c) => config.columns?.[c] === true)\n\t\t\t\t\t\t: Object.keys(tableConfig.columns).filter(\n\t\t\t\t\t\t\t(key) => !selectedColumns.includes(key),\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Select all columns if selection is not specified\n\t\t\t\tselectedColumns = Object.keys(tableConfig.columns);\n\t\t\t}\n\n\t\t\tfor (const field of selectedColumns) {\n\t\t\t\tconst column = tableConfig.columns[field]! as SQLiteColumn;\n\t\t\t\tfieldsSelection.push({ tsKey: field, value: column });\n\t\t\t}\n\n\t\t\tlet selectedRelations: {\n\t\t\t\ttsKey: string;\n\t\t\t\tqueryConfig: true | V1.DBQueryConfig<'many', false>;\n\t\t\t\trelation: V1.Relation;\n\t\t\t}[] = [];\n\n\t\t\t// Figure out which relations to select\n\t\t\tif (config.with) {\n\t\t\t\tselectedRelations = Object.entries(config.with)\n\t\t\t\t\t.filter(\n\t\t\t\t\t\t(\n\t\t\t\t\t\t\tentry,\n\t\t\t\t\t\t): entry is [(typeof entry)[0], NonNullable<(typeof entry)[1]>] => !!entry[1],\n\t\t\t\t\t)\n\t\t\t\t\t.map(([tsKey, queryConfig]) => ({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tqueryConfig,\n\t\t\t\t\t\trelation: tableConfig.relations[tsKey]!,\n\t\t\t\t\t}));\n\t\t\t}\n\n\t\t\tlet extras;\n\n\t\t\t// Figure out which extras to select\n\t\t\tif (config.extras) {\n\t\t\t\textras = typeof config.extras === 'function'\n\t\t\t\t\t? config.extras(aliasedColumns, { sql })\n\t\t\t\t\t: config.extras;\n\t\t\t\tfor (const [tsKey, value] of Object.entries(extras)) {\n\t\t\t\t\tfieldsSelection.push({\n\t\t\t\t\t\ttsKey,\n\t\t\t\t\t\tvalue: mapColumnsInAliasedSQLToAlias(value, tableAlias),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Transform `fieldsSelection` into `selection`\n\t\t\t// `fieldsSelection` shouldn't be used after this point\n\t\t\tfor (const { tsKey, value } of fieldsSelection) {\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: is(value, SQL.Aliased)\n\t\t\t\t\t\t? value.fieldAlias\n\t\t\t\t\t\t: tableConfig.columns[tsKey]!.name,\n\t\t\t\t\ttsKey,\n\t\t\t\t\tfield: is(value, Column)\n\t\t\t\t\t\t? aliasedTableColumn(value, tableAlias)\n\t\t\t\t\t\t: value,\n\t\t\t\t\trelationTableTsKey: undefined,\n\t\t\t\t\tisJson: false,\n\t\t\t\t\tselection: [],\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tlet orderByOrig = typeof config.orderBy === 'function'\n\t\t\t\t? config.orderBy(aliasedColumns, V1.getOrderByOperators())\n\t\t\t\t: (config.orderBy ?? []);\n\t\t\tif (!Array.isArray(orderByOrig)) {\n\t\t\t\torderByOrig = [orderByOrig];\n\t\t\t}\n\t\t\torderBy = orderByOrig.map((orderByValue) => {\n\t\t\t\tif (is(orderByValue, Column)) {\n\t\t\t\t\treturn aliasedTableColumn(orderByValue, tableAlias) as SQLiteColumn;\n\t\t\t\t}\n\t\t\t\treturn mapColumnsInSQLToAlias(orderByValue, tableAlias);\n\t\t\t});\n\n\t\t\tlimit = config.limit;\n\t\t\toffset = config.offset;\n\n\t\t\t// Process all relations\n\t\t\tfor (\n\t\t\t\tconst {\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tqueryConfig: selectedRelationConfigValue,\n\t\t\t\t\trelation,\n\t\t\t\t} of selectedRelations\n\t\t\t) {\n\t\t\t\tconst normalizedRelation = V1.normalizeRelation(\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\trelation,\n\t\t\t\t);\n\t\t\t\tconst relationTableName = getTableUniqueName(relation.referencedTable);\n\t\t\t\tconst relationTableTsName = tableNamesMap[relationTableName]!;\n\t\t\t\tconst relationTableAlias = `${tableAlias}_${selectedRelationTsKey}`;\n\t\t\t\t// const relationTable = schema[relationTableTsName]!;\n\t\t\t\tconst joinOn = and(\n\t\t\t\t\t...normalizedRelation.fields.map((field, i) =>\n\t\t\t\t\t\teq(\n\t\t\t\t\t\t\taliasedTableColumn(\n\t\t\t\t\t\t\t\tnormalizedRelation.references[i]!,\n\t\t\t\t\t\t\t\trelationTableAlias,\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\taliasedTableColumn(field, tableAlias),\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t);\n\t\t\t\tconst builtRelation = this._buildRelationalQuery({\n\t\t\t\t\tfullSchema,\n\t\t\t\t\tschema,\n\t\t\t\t\ttableNamesMap,\n\t\t\t\t\ttable: fullSchema[relationTableTsName] as SQLiteTable,\n\t\t\t\t\ttableConfig: schema[relationTableTsName]!,\n\t\t\t\t\tqueryConfig: is(relation, V1.One)\n\t\t\t\t\t\t? selectedRelationConfigValue === true\n\t\t\t\t\t\t\t? { limit: 1 }\n\t\t\t\t\t\t\t: { ...selectedRelationConfigValue, limit: 1 }\n\t\t\t\t\t\t: selectedRelationConfigValue,\n\t\t\t\t\ttableAlias: relationTableAlias,\n\t\t\t\t\tjoinOn,\n\t\t\t\t\tnestedQueryRelation: relation,\n\t\t\t\t});\n\t\t\t\tconst field = sql`(${builtRelation.sql})`.as(selectedRelationTsKey);\n\t\t\t\tselection.push({\n\t\t\t\t\tdbKey: selectedRelationTsKey,\n\t\t\t\t\ttsKey: selectedRelationTsKey,\n\t\t\t\t\tfield,\n\t\t\t\t\trelationTableTsKey: relationTableTsName,\n\t\t\t\t\tisJson: true,\n\t\t\t\t\tselection: builtRelation.selection,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (selection.length === 0) {\n\t\t\tthrow new DrizzleError({\n\t\t\t\tmessage:\n\t\t\t\t\t`No fields selected for table \"${tableConfig.tsName}\" (\"${tableAlias}\"). You need to have at least one item in \"columns\", \"with\" or \"extras\". If you need to select all columns, omit the \"columns\" key or set it to undefined.`,\n\t\t\t});\n\t\t}\n\n\t\tlet result;\n\n\t\twhere = and(joinOn, where);\n\n\t\tif (nestedQueryRelation) {\n\t\t\tlet field = sql`json_array(${\n\t\t\t\tsql.join(\n\t\t\t\t\tselection.map(({ field }) =>\n\t\t\t\t\t\tis(field, SQLiteColumn)\n\t\t\t\t\t\t\t? sql.identifier(this.casing.getColumnCasing(field))\n\t\t\t\t\t\t\t: is(field, SQL.Aliased)\n\t\t\t\t\t\t\t? field.sql\n\t\t\t\t\t\t\t: field\n\t\t\t\t\t),\n\t\t\t\t\tsql`, `,\n\t\t\t\t)\n\t\t\t})`;\n\t\t\tif (is(nestedQueryRelation, V1.Many)) {\n\t\t\t\tfield = sql`coalesce(json_group_array(${field}), json_array())`;\n\t\t\t}\n\t\t\tconst nestedSelection = [\n\t\t\t\t{\n\t\t\t\t\tdbKey: 'data',\n\t\t\t\t\ttsKey: 'data',\n\t\t\t\t\tfield: field.as('data'),\n\t\t\t\t\tisJson: true,\n\t\t\t\t\trelationTableTsKey: tableConfig.tsName,\n\t\t\t\t\tselection,\n\t\t\t\t},\n\t\t\t];\n\n\t\t\tconst needsSubquery = limit !== undefined || offset !== undefined || orderBy.length > 0;\n\n\t\t\tif (needsSubquery) {\n\t\t\t\tresult = this.buildSelectQuery({\n\t\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\t\tfields: {},\n\t\t\t\t\tfieldsFlat: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tpath: [],\n\t\t\t\t\t\t\tfield: sql.raw('*'),\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t\twhere,\n\t\t\t\t\tlimit,\n\t\t\t\t\toffset,\n\t\t\t\t\torderBy,\n\t\t\t\t\tsetOperators: [],\n\t\t\t\t});\n\n\t\t\t\twhere = undefined;\n\t\t\t\tlimit = undefined;\n\t\t\t\toffset = undefined;\n\t\t\t\torderBy = undefined;\n\t\t\t} else {\n\t\t\t\tresult = aliasedTable(table, tableAlias);\n\t\t\t}\n\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: is(result, SQLiteTable)\n\t\t\t\t\t? result\n\t\t\t\t\t: new Subquery(result, {}, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: nestedSelection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column)\n\t\t\t\t\t\t? aliasedTableColumn(field, tableAlias)\n\t\t\t\t\t\t: field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t} else {\n\t\t\tresult = this.buildSelectQuery({\n\t\t\t\ttable: aliasedTable(table, tableAlias),\n\t\t\t\tfields: {},\n\t\t\t\tfieldsFlat: selection.map(({ field }) => ({\n\t\t\t\t\tpath: [],\n\t\t\t\t\tfield: is(field, Column)\n\t\t\t\t\t\t? aliasedTableColumn(field, tableAlias)\n\t\t\t\t\t\t: field,\n\t\t\t\t})),\n\t\t\t\tjoins,\n\t\t\t\twhere,\n\t\t\t\tlimit,\n\t\t\t\toffset,\n\t\t\t\torderBy,\n\t\t\t\tsetOperators: [],\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\ttableTsKey: tableConfig.tsName,\n\t\t\tsql: result,\n\t\t\tselection,\n\t\t};\n\t}\n\n\tprivate nestedSelectionerror() {\n\t\tthrow new DrizzleError({\n\t\t\tmessage: `Views with nested selections are not supported by the relational query builder`,\n\t\t});\n\t}\n\n\tprivate buildRqbColumn(table: Table | View, column: unknown, key: string) {\n\t\tif (is(column, Column)) {\n\t\t\tconst name = sql`${table}.${sql.identifier(this.casing.getColumnCasing(column))}`;\n\n\t\t\tswitch (column.columnType) {\n\t\t\t\tcase 'SQLiteBigInt':\n\t\t\t\tcase 'SQLiteBlobJson':\n\t\t\t\tcase 'SQLiteBlobBuffer': {\n\t\t\t\t\treturn sql`hex(${name}) as ${sql.identifier(key)}`;\n\t\t\t\t}\n\n\t\t\t\tcase 'SQLiteNumeric':\n\t\t\t\tcase 'SQLiteNumericNumber':\n\t\t\t\tcase 'SQLiteNumericBigInt': {\n\t\t\t\t\treturn sql`cast(${name} as text) as ${sql.identifier(key)}`;\n\t\t\t\t}\n\n\t\t\t\tcase 'SQLiteCustomColumn': {\n\t\t\t\t\treturn sql`${(<SQLiteCustomColumn<any>> column).jsonSelectIdentifier(name, sql)} as ${sql.identifier(key)}`;\n\t\t\t\t}\n\n\t\t\t\tdefault: {\n\t\t\t\t\treturn sql`${name} as ${sql.identifier(key)}`;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn sql`${table}.${\n\t\t\tis(column, SQL.Aliased)\n\t\t\t\t? sql.identifier(column.fieldAlias)\n\t\t\t\t: isSQLWrapper(column)\n\t\t\t\t? sql.identifier(key)\n\t\t\t\t: this.nestedSelectionerror()\n\t\t} as ${sql.identifier(key)}`;\n\t}\n\n\tprivate unwrapAllColumns = (\n\t\ttable: Table | View,\n\t\tselection: BuildRelationalQueryResult['selection'],\n\t) => {\n\t\treturn sql.join(\n\t\t\tObject.entries(table[TableColumns]).map(([k, v]) => {\n\t\t\t\tselection.push({\n\t\t\t\t\tkey: k,\n\t\t\t\t\tfield: v as Column | SQL | SQLWrapper | SQL.Aliased,\n\t\t\t\t});\n\n\t\t\t\treturn this.buildRqbColumn(table, v, k);\n\t\t\t}),\n\t\t\tsql`, `,\n\t\t);\n\t};\n\n\tprivate getSelectedTableColumns = (\n\t\ttable: Table | View,\n\t\tcolumns: Record<string, boolean | undefined>,\n\t) => {\n\t\tconst selectedColumns: ColumnWithTSName[] = [];\n\t\tconst columnContainer = table[TableColumns];\n\t\tconst entries = Object.entries(columns);\n\n\t\tlet colSelectionMode: boolean | undefined;\n\t\tfor (const [k, v] of entries) {\n\t\t\tif (v === undefined) continue;\n\t\t\tcolSelectionMode = colSelectionMode || v;\n\n\t\t\tif (v) {\n\t\t\t\tconst column = columnContainer[k]!;\n\n\t\t\t\tselectedColumns.push({\n\t\t\t\t\tcolumn: column as Column | SQL | SQLWrapper | SQL.Aliased,\n\t\t\t\t\ttsName: k,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tif (colSelectionMode === false) {\n\t\t\tfor (const [k, v] of Object.entries(columnContainer)) {\n\t\t\t\tif (columns[k] === false) continue;\n\n\t\t\t\tselectedColumns.push({\n\t\t\t\t\tcolumn: v as Column | SQL | SQLWrapper | SQL.Aliased | Table,\n\t\t\t\t\ttsName: k,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn selectedColumns;\n\t};\n\n\tprivate buildColumns = (\n\t\ttable: SQLiteTable | SQLiteView,\n\t\tselection: BuildRelationalQueryResult['selection'],\n\t\tparams?: DBQueryConfig<'many'>,\n\t) =>\n\t\tparams?.columns\n\t\t\t? (() => {\n\t\t\t\tconst columnIdentifiers: SQL[] = [];\n\n\t\t\t\tconst selectedColumns = this.getSelectedTableColumns(\n\t\t\t\t\ttable,\n\t\t\t\t\tparams?.columns,\n\t\t\t\t);\n\n\t\t\t\tfor (const { column, tsName } of selectedColumns) {\n\t\t\t\t\tcolumnIdentifiers.push(this.buildRqbColumn(table, column, tsName));\n\t\t\t\t\tselection.push({\n\t\t\t\t\t\tkey: tsName,\n\t\t\t\t\t\tfield: column,\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn columnIdentifiers.length\n\t\t\t\t\t? sql.join(columnIdentifiers, sql`, `)\n\t\t\t\t\t: undefined;\n\t\t\t})()\n\t\t\t: this.unwrapAllColumns(table, selection);\n\n\tbuildRelationalQuery({\n\t\tschema,\n\t\ttable,\n\t\ttableConfig,\n\t\tqueryConfig: config,\n\t\trelationWhere,\n\t\tmode,\n\t\tisNested,\n\t\terrorPath,\n\t\tdepth,\n\t\tthroughJoin,\n\t\tjsonb,\n\t}: {\n\t\tschema: TablesRelationalConfig;\n\t\ttable: SQLiteTable | SQLiteView;\n\t\ttableConfig: TableRelationalConfig;\n\t\tqueryConfig?: DBQueryConfig<'many'> | true;\n\t\trelationWhere?: SQL;\n\t\tmode: 'first' | 'many';\n\t\tisNested?: boolean;\n\t\terrorPath?: string;\n\t\tdepth?: number;\n\t\tthroughJoin?: SQL;\n\t\tjsonb: SQL;\n\t}): BuildRelationalQueryResult {\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\tif (!currentDepth) table = aliasedTable(table, `d${currentDepth}`);\n\n\t\tconst limit = isSingle ? 1 : params?.limit;\n\t\tconst offset = params?.offset;\n\n\t\tconst columns = this.buildColumns(table, selection, params);\n\n\t\tconst where: SQL | undefined = params?.where && relationWhere\n\t\t\t? and(\n\t\t\t\trelationsFilterToSQL(\n\t\t\t\t\ttable,\n\t\t\t\t\tparams.where,\n\t\t\t\t\ttableConfig.relations,\n\t\t\t\t\tschema,\n\t\t\t\t\tthis.casing,\n\t\t\t\t),\n\t\t\t\trelationWhere,\n\t\t\t)\n\t\t\t: params?.where\n\t\t\t? relationsFilterToSQL(\n\t\t\t\ttable,\n\t\t\t\tparams.where,\n\t\t\t\ttableConfig.relations,\n\t\t\t\tschema,\n\t\t\t\tthis.casing,\n\t\t\t)\n\t\t\t: relationWhere;\n\t\tconst order = params?.orderBy\n\t\t\t? relationsOrderToSQL(table, params.orderBy)\n\t\t\t: undefined;\n\t\tconst extras = params?.extras\n\t\t\t? relationExtrasToSQL(table, params.extras)\n\t\t\t: undefined;\n\t\tif (extras) selection.push(...extras.selection);\n\n\t\tconst joins = params\n\t\t\t? (() => {\n\t\t\t\tconst { with: joins } = params as WithContainer;\n\t\t\t\tif (!joins) return;\n\n\t\t\t\tconst withEntries = Object.entries(joins).filter(([_, v]) => v);\n\t\t\t\tif (!withEntries.length) return;\n\n\t\t\t\treturn sql.join(\n\t\t\t\t\twithEntries.map(([k, join]) => {\n\t\t\t\t\t\t// if (is(tableConfig.relations[k]!, AggregatedField)) {\n\t\t\t\t\t\t// \tconst relation = tableConfig.relations[k]!;\n\n\t\t\t\t\t\t// \trelation.onTable(table);\n\t\t\t\t\t\t// \tconst query = relation.getSQL();\n\n\t\t\t\t\t\t// \tselection.push({\n\t\t\t\t\t\t// \t\tkey: k,\n\t\t\t\t\t\t// \t\tfield: relation,\n\t\t\t\t\t\t// \t});\n\n\t\t\t\t\t\t// \treturn sql`(${query}) as ${sql.identifier(k)}`;\n\t\t\t\t\t\t// }\n\n\t\t\t\t\t\tconst relation = tableConfig.relations[k]! as Relation;\n\t\t\t\t\t\tconst isSingle = is(relation, One);\n\t\t\t\t\t\tconst targetTable = aliasedTable(\n\t\t\t\t\t\t\trelation.targetTable,\n\t\t\t\t\t\t\t`d${currentDepth + 1}`,\n\t\t\t\t\t\t);\n\t\t\t\t\t\tconst throughTable = relation.throughTable\n\t\t\t\t\t\t\t? aliasedTable(relation.throughTable, `tr${currentDepth}`)\n\t\t\t\t\t\t\t: undefined;\n\t\t\t\t\t\tconst { filter, joinCondition } = relationToSQL(\n\t\t\t\t\t\t\tthis.casing,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttable,\n\t\t\t\t\t\t\ttargetTable,\n\t\t\t\t\t\t\tthroughTable,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst throughJoin = throughTable\n\t\t\t\t\t\t\t? sql` inner join ${getTableAsAliasSQL(throughTable)} on ${joinCondition!}`\n\t\t\t\t\t\t\t: undefined;\n\n\t\t\t\t\t\tconst innerQuery = this.buildRelationalQuery({\n\t\t\t\t\t\t\ttable: targetTable as SQLiteTable | SQLiteView,\n\t\t\t\t\t\t\tmode: isSingle ? 'first' : 'many',\n\t\t\t\t\t\t\tschema,\n\t\t\t\t\t\t\tqueryConfig: join as DBQueryConfig,\n\t\t\t\t\t\t\ttableConfig: schema[relation.targetTableName]!,\n\t\t\t\t\t\t\trelationWhere: filter,\n\t\t\t\t\t\t\tisNested: true,\n\t\t\t\t\t\t\terrorPath: `${currentPath.length ? `${currentPath}.` : ''}${k}`,\n\t\t\t\t\t\t\tdepth: currentDepth + 1,\n\t\t\t\t\t\t\tthroughJoin,\n\t\t\t\t\t\t\tjsonb,\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tselection.push({\n\t\t\t\t\t\t\tfield: targetTable,\n\t\t\t\t\t\t\tkey: k,\n\t\t\t\t\t\t\tselection: innerQuery.selection,\n\t\t\t\t\t\t\tisArray: !isSingle,\n\t\t\t\t\t\t\tisOptional: ((relation as AnyOne).optional ?? false)\n\t\t\t\t\t\t\t\t|| (join !== true\n\t\t\t\t\t\t\t\t\t&& !!(join as Exclude<typeof join, boolean | undefined>)\n\t\t\t\t\t\t\t\t\t\t.where),\n\t\t\t\t\t\t});\n\n\t\t\t\t\t\tconst jsonColumns = sql.join(\n\t\t\t\t\t\t\tinnerQuery.selection.map((s) => {\n\t\t\t\t\t\t\t\treturn sql`${sql.raw(this.escapeString(s.key))}, ${\n\t\t\t\t\t\t\t\t\ts.selection\n\t\t\t\t\t\t\t\t\t\t? sql`${jsonb}(${sql.identifier(s.key)})`\n\t\t\t\t\t\t\t\t\t\t: sql.identifier(s.key)\n\t\t\t\t\t\t\t\t}`;\n\t\t\t\t\t\t\t}),\n\t\t\t\t\t\t\tsql`, `,\n\t\t\t\t\t\t);\n\n\t\t\t\t\t\tconst json = isNested ? jsonb : sql`json`;\n\n\t\t\t\t\t\tconst joinQuery = isSingle\n\t\t\t\t\t\t\t? sql`(select ${json}_object(${jsonColumns}) as ${sql.identifier('r')} from (${innerQuery.sql}) as ${\n\t\t\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\t\t\t't',\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t}) as ${sql.identifier(k)}`\n\t\t\t\t\t\t\t: sql`coalesce((select ${json}_group_array(json_object(${jsonColumns})) as ${\n\t\t\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\t\t\t'r',\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t} from (${innerQuery.sql}) as ${sql.identifier('t')}), ${jsonb}_array()) as ${sql.identifier(k)}`;\n\n\t\t\t\t\t\treturn joinQuery;\n\t\t\t\t\t}),\n\t\t\t\t\tsql`, `,\n\t\t\t\t);\n\t\t\t})()\n\t\t\t: undefined;\n\n\t\tconst selectionArr = [columns, extras?.sql, joins].filter(\n\t\t\t(e) => e !== undefined,\n\t\t);\n\t\tif (!selectionArr.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\t\tconst selectionSet = sql.join(selectionArr, sql`, `);\n\n\t\tconst query = sql`select ${selectionSet} from ${getTableAsAliasSQL(table)}${throughJoin}${\n\t\t\tsql` where ${where}`.if(\n\t\t\t\twhere,\n\t\t\t)\n\t\t}${sql` order by ${order}`.if(order)}${sql` limit ${limit}`.if(limit !== undefined)}${\n\t\t\tsql` offset ${offset}`.if(\n\t\t\t\toffset !== undefined,\n\t\t\t)\n\t\t}`;\n\n\t\treturn {\n\t\t\tsql: query,\n\t\t\tselection,\n\t\t};\n\t}\n}\n\nexport class SQLiteSyncDialect extends SQLiteDialect {\n\tstatic override readonly [entityKind]: string = 'SQLiteSyncDialect';\n\n\tmigrate(\n\t\tmigrations: MigrationMeta[],\n\t\tsession: SQLiteSession<\n\t\t\t'sync',\n\t\t\tunknown,\n\t\t\tRecord<string, unknown>,\n\t\t\tAnyRelations,\n\t\t\tV1.TablesRelationalConfig\n\t\t>,\n\t\tconfig?: string | Omit<MigrationConfig, 'migrationsFolder'>,\n\t): void | MigratorInitFailResponse {\n\t\tconst migrationsTable = config === undefined\n\t\t\t? '__drizzle_migrations'\n\t\t\t: typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: (config.migrationsTable ?? '__drizzle_migrations');\n\n\t\t// Detect DB version and upgrade table schema if needed\n\t\tconst { newDb } = upgradeSyncIfNeeded(migrationsTable, session, migrations);\n\n\t\tif (newDb) {\n\t\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\tsession.run(migrationTableCreate);\n\t\t}\n\n\t\tconst dbMigrations = session.all<{\n\t\t\tid: number;\n\t\t\thash: string;\n\t\t\tcreated_at: string;\n\t\t\tname: string | null;\n\t\t}>(\n\t\t\tsql`SELECT id, hash, created_at, name FROM ${sql.identifier(migrationsTable)}`,\n\t\t);\n\n\t\tif (typeof config === 'object' && config.init) {\n\t\t\tif (dbMigrations.length) {\n\t\t\t\treturn { exitCode: 'databaseMigrations' as const };\n\t\t\t}\n\n\t\t\tif (migrations.length > 1) {\n\t\t\t\treturn { exitCode: 'localMigrations' as const };\n\t\t\t}\n\n\t\t\tconst [migration] = migrations;\n\n\t\t\tif (!migration) return;\n\n\t\t\tsession.run(\n\t\t\t\tsql`insert into ${\n\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\tmigrationsTable,\n\t\t\t\t\t)\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\n\t\t\treturn;\n\t\t}\n\n\t\tconst migrationsToRun = getMigrationsToRun({\n\t\t\tlocalMigrations: migrations,\n\t\t\tdbMigrations,\n\t\t});\n\t\tsession.run(sql`BEGIN`);\n\n\t\ttry {\n\t\t\tfor (const migration of migrationsToRun) {\n\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\tsession.run(sql.raw(stmt));\n\t\t\t\t}\n\t\t\t\tsession.run(\n\t\t\t\t\tsql`INSERT INTO ${\n\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\tmigrationsTable,\n\t\t\t\t\t\t)\n\t\t\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\t\t\tnew Date().toISOString()\n\t\t\t\t\t})`,\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsession.run(sql`COMMIT`);\n\t\t} catch (e) {\n\t\t\tsession.run(sql`ROLLBACK`);\n\t\t\tthrow e;\n\t\t}\n\t}\n}\n\nexport class SQLiteAsyncDialect extends SQLiteDialect {\n\tstatic override readonly [entityKind]: string = 'SQLiteAsyncDialect';\n\n\tasync migrate(\n\t\tmigrations: MigrationMeta[],\n\t\tdb: BaseSQLiteDatabase<'async', unknown, Record<string, unknown>>,\n\t\tconfig?: string | Omit<MigrationConfig, 'migrationsFolder'>,\n\t): Promise<void | MigratorInitFailResponse> {\n\t\tconst migrationsTable = config === undefined\n\t\t\t? '__drizzle_migrations'\n\t\t\t: typeof config === 'string'\n\t\t\t? '__drizzle_migrations'\n\t\t\t: (config.migrationsTable ?? '__drizzle_migrations');\n\n\t\t// Detect DB version and upgrade table schema if needed\n\t\tconst { newDb } = await upgradeAsyncIfNeeded(\n\t\t\tmigrationsTable,\n\t\t\tdb,\n\t\t\tmigrations,\n\t\t);\n\n\t\tif (newDb) {\n\t\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)\n\t\t`;\n\t\t\tawait db.session.run(migrationTableCreate);\n\t\t}\n\n\t\tconst dbMigrations = await db.session.all<{\n\t\t\tid: number;\n\t\t\thash: string;\n\t\t\tcreated_at: string;\n\t\t\tname: string | null;\n\t\t}>(\n\t\t\tsql`SELECT id, hash, created_at, name FROM ${sql.identifier(migrationsTable)};`,\n\t\t);\n\n\t\tif (typeof config === 'object' && config.init) {\n\t\t\tif (dbMigrations.length) {\n\t\t\t\treturn { exitCode: 'databaseMigrations' as const };\n\t\t\t}\n\n\t\t\tif (migrations.length > 1) {\n\t\t\t\treturn { exitCode: 'localMigrations' as const };\n\t\t\t}\n\n\t\t\tconst [migration] = migrations;\n\n\t\t\tif (!migration) return;\n\n\t\t\tawait db.session.run(\n\t\t\t\tsql`insert into ${\n\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\tmigrationsTable,\n\t\t\t\t\t)\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\n\t\t\treturn;\n\t\t}\n\n\t\tconst migrationsToRun = getMigrationsToRun({\n\t\t\tlocalMigrations: migrations,\n\t\t\tdbMigrations,\n\t\t});\n\t\tawait db.session.transaction(async (tx) => {\n\t\t\tfor (const migration of migrationsToRun) {\n\t\t\t\tfor (const stmt of migration.sql) {\n\t\t\t\t\tawait tx.run(sql.raw(stmt));\n\t\t\t\t}\n\t\t\t\tawait tx.run(\n\t\t\t\t\tsql`insert into ${\n\t\t\t\t\t\tsql.identifier(\n\t\t\t\t\t\t\tmigrationsTable,\n\t\t\t\t\t\t)\n\t\t\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\t\t\tnew Date().toISOString()\n\t\t\t\t\t})`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t}\n}\n"],"mappings":"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"}
@@ -1,9 +1,47 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
- const require_sqlite_proxy_migrator_internal = require('./migrator.internal.cjs');
2
+ const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
3
+ let __sql_sql_ts = require("../sql/sql.cjs");
4
+ let __migrator_ts = require("../migrator.cjs");
5
+ let __migrator_utils_ts = require("../migrator.utils.cjs");
6
+ let __up_migrations_sqlite_proxy_ts = require("../up-migrations/sqlite-proxy.cjs");
3
7
 
4
8
  //#region src/sqlite-proxy/migrator.ts
5
9
  async function migrate(db, callback, config) {
6
- return require_sqlite_proxy_migrator_internal.migrateInternal(db, callback, config, "transaction");
10
+ const migrations = (0, __migrator_ts.readMigrationFiles)(config);
11
+ const migrationsTable = typeof config === "string" ? "__drizzle_migrations" : config.migrationsTable ?? "__drizzle_migrations";
12
+ const { newDb } = await (0, __up_migrations_sqlite_proxy_ts.upgradeAsyncIfNeeded)(migrationsTable, db, callback, migrations);
13
+ if (newDb) {
14
+ const migrationTableCreate = __sql_sql_ts.sql`
15
+ CREATE TABLE IF NOT EXISTS ${__sql_sql_ts.sql.identifier(migrationsTable)} (
16
+ id INTEGER PRIMARY KEY,
17
+ hash text NOT NULL,
18
+ created_at numeric,
19
+ name text,
20
+ applied_at TEXT
21
+ );`;
22
+ await db.run(migrationTableCreate);
23
+ }
24
+ const dbMigrations = (await db.values(__sql_sql_ts.sql`SELECT id, hash, created_at, name FROM ${__sql_sql_ts.sql.identifier(migrationsTable)}`)).map(([id, hash, created_at, name]) => ({
25
+ id,
26
+ hash,
27
+ created_at,
28
+ name
29
+ }));
30
+ if (typeof config === "object" && config.init) {
31
+ if (dbMigrations.length) return { exitCode: "databaseMigrations" };
32
+ if (migrations.length > 1) return { exitCode: "localMigrations" };
33
+ const [migration] = migrations;
34
+ if (!migration) return;
35
+ await callback([db.dialect.sqlToQuery(__sql_sql_ts.sql`insert into ${__sql_sql_ts.sql.identifier(migrationsTable)} ("hash", "created_at", "name", "applied_at") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${(/* @__PURE__ */ new Date()).toISOString()})`.inlineParams()).sql]);
36
+ return;
37
+ }
38
+ const migrationsToRun = (0, __migrator_utils_ts.getMigrationsToRun)({
39
+ localMigrations: migrations,
40
+ dbMigrations
41
+ });
42
+ const queriesToRun = [];
43
+ for (const migration of migrationsToRun) queriesToRun.push(...migration.sql, db.dialect.sqlToQuery(__sql_sql_ts.sql`insert into ${__sql_sql_ts.sql.identifier(migrationsTable)} ("hash", "created_at", "name", "applied_at") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${(/* @__PURE__ */ new Date()).toISOString()})`.inlineParams()).sql);
44
+ await callback(queriesToRun);
7
45
  }
8
46
 
9
47
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"migrator.cjs","names":["migrateInternal"],"sources":["../../src/sqlite-proxy/migrator.ts"],"sourcesContent":["import type { MigrationConfig } from '~/migrator.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport type { SqliteRemoteDatabase } from './driver.ts';\nimport { migrateInternal } from './migrator.internal.ts';\n\nexport type ProxyMigrator = (migrationQueries: string[]) => Promise<void>;\n\nexport async function migrate<TSchema extends Record<string, unknown>, TRelations extends AnyRelations>(\n\tdb: SqliteRemoteDatabase<TSchema, TRelations>,\n\tcallback: ProxyMigrator,\n\tconfig: MigrationConfig,\n) {\n\treturn migrateInternal(db, callback, config, 'transaction');\n}\n"],"mappings":";;;;AAOA,eAAsB,QACrB,IACA,UACA,QACC;AACD,QAAOA,uDAAgB,IAAI,UAAU,QAAQ,cAAc"}
1
+ {"version":3,"file":"migrator.cjs","names":["sql"],"sources":["../../src/sqlite-proxy/migrator.ts"],"sourcesContent":["import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport { getMigrationsToRun } from '~/migrator.utils.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { upgradeAsyncIfNeeded } from '~/up-migrations/sqlite-proxy.ts';\nimport type { SqliteRemoteDatabase } from './driver.ts';\n\nexport type ProxyMigrator = (migrationQueries: string[]) => Promise<void>;\n\nexport async function migrate<TSchema extends Record<string, unknown>, TRelations extends AnyRelations>(\n\tdb: SqliteRemoteDatabase<TSchema, TRelations>,\n\tcallback: ProxyMigrator,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\n\tconst migrationsTable = 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(migrationsTable, db, callback, migrations);\n\n\tif (newDb) {\n\t\tconst migrationTableCreate = sql`\n\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\tid INTEGER PRIMARY KEY,\n\t\t\thash text NOT NULL,\n\t\t\tcreated_at numeric,\n\t\t\tname text,\n\t\t\tapplied_at TEXT\n\t\t);`;\n\n\t\tawait db.run(migrationTableCreate);\n\t}\n\n\tconst dbMigrations = (await db.values<[number, string, string, string | null]>(\n\t\tsql`SELECT id, hash, created_at, name FROM ${sql.identifier(migrationsTable)}`,\n\t)).map(([id, hash, created_at, name]) => ({ id, hash, created_at, name }));\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 callback(\n\t\t\t[\n\t\t\t\tdb.dialect.sqlToQuery(\n\t\t\t\t\tsql`insert into ${\n\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\t\t\tnew Date().toISOString()\n\t\t\t\t\t})`\n\t\t\t\t\t\t.inlineParams(),\n\t\t\t\t).sql,\n\t\t\t],\n\t\t);\n\n\t\treturn;\n\t}\n\n\tconst migrationsToRun = getMigrationsToRun({ localMigrations: migrations, dbMigrations });\n\tconst queriesToRun: string[] = [];\n\tfor (const migration of migrationsToRun) {\n\t\tqueriesToRun.push(\n\t\t\t...migration.sql,\n\t\t\tdb.dialect.sqlToQuery(\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\t\t.inlineParams(),\n\t\t\t).sql,\n\t\t);\n\t}\n\n\tawait callback(queriesToRun);\n\n\treturn;\n}\n"],"mappings":";;;;;;;;AAUA,eAAsB,QACrB,IACA,UACA,QACC;CACD,MAAM,mDAAgC,OAAO;CAE7C,MAAM,kBAAkB,OAAO,WAAW,WACvC,yBACA,OAAO,mBAAmB;CAG7B,MAAM,EAAE,UAAU,gEAA2B,iBAAiB,IAAI,UAAU,WAAW;AAEvF,KAAI,OAAO;EACV,MAAM,uBAAuB,gBAAG;+BACHA,iBAAI,WAAW,gBAAgB,CAAC;;;;;;;AAQ7D,QAAM,GAAG,IAAI,qBAAqB;;CAGnC,MAAM,gBAAgB,MAAM,GAAG,OAC9B,gBAAG,0CAA0CA,iBAAI,WAAW,gBAAgB,GAC5E,EAAE,KAAK,CAAC,IAAI,MAAM,YAAY,WAAW;EAAE;EAAI;EAAM;EAAY;EAAM,EAAE;AAE1E,KAAI,OAAO,WAAW,YAAY,OAAO,MAAM;AAC9C,MAAI,aAAa,OAChB,QAAO,EAAE,UAAU,sBAA+B;AAGnD,MAAI,WAAW,SAAS,EACvB,QAAO,EAAE,UAAU,mBAA4B;EAGhD,MAAM,CAAC,aAAa;AAEpB,MAAI,CAAC,UAAW;AAEhB,QAAM,SACL,CACC,GAAG,QAAQ,WACV,gBAAG,eACFA,iBAAI,WAAW,gBAAgB,CAC/B,uDAAuD,UAAU,KAAK,IAAI,UAAU,aAAa,IAAI,UAAU,KAAK,qBACpH,IAAI,MAAM,EAAC,aAAa,CACxB,GACC,cAAc,CAChB,CAAC,IACF,CACD;AAED;;CAGD,MAAM,8DAAqC;EAAE,iBAAiB;EAAY;EAAc,CAAC;CACzF,MAAM,eAAyB,EAAE;AACjC,MAAK,MAAM,aAAa,gBACvB,cAAa,KACZ,GAAG,UAAU,KACb,GAAG,QAAQ,WACV,gBAAG,eACFA,iBAAI,WAAW,gBAAgB,CAC/B,uDAAuD,UAAU,KAAK,IAAI,UAAU,aAAa,IAAI,UAAU,KAAK,qBACpH,IAAI,MAAM,EAAC,aAAa,CACxB,GACC,cAAc,CAChB,CAAC,IACF;AAGF,OAAM,SAAS,aAAa"}
@@ -1,8 +1,45 @@
1
- import { migrateInternal } from "./migrator.internal.js";
1
+ import { sql } from "../sql/sql.js";
2
+ import { readMigrationFiles } from "../migrator.js";
3
+ import { getMigrationsToRun } from "../migrator.utils.js";
4
+ import { upgradeAsyncIfNeeded } from "../up-migrations/sqlite-proxy.js";
2
5
 
3
6
  //#region src/sqlite-proxy/migrator.ts
4
7
  async function migrate(db, callback, config) {
5
- return migrateInternal(db, callback, config, "transaction");
8
+ const migrations = readMigrationFiles(config);
9
+ const migrationsTable = typeof config === "string" ? "__drizzle_migrations" : config.migrationsTable ?? "__drizzle_migrations";
10
+ const { newDb } = await upgradeAsyncIfNeeded(migrationsTable, db, callback, migrations);
11
+ if (newDb) {
12
+ const migrationTableCreate = sql`
13
+ CREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (
14
+ id INTEGER PRIMARY KEY,
15
+ hash text NOT NULL,
16
+ created_at numeric,
17
+ name text,
18
+ applied_at TEXT
19
+ );`;
20
+ await db.run(migrationTableCreate);
21
+ }
22
+ const dbMigrations = (await db.values(sql`SELECT id, hash, created_at, name FROM ${sql.identifier(migrationsTable)}`)).map(([id, hash, created_at, name]) => ({
23
+ id,
24
+ hash,
25
+ created_at,
26
+ name
27
+ }));
28
+ if (typeof config === "object" && config.init) {
29
+ if (dbMigrations.length) return { exitCode: "databaseMigrations" };
30
+ if (migrations.length > 1) return { exitCode: "localMigrations" };
31
+ const [migration] = migrations;
32
+ if (!migration) return;
33
+ await callback([db.dialect.sqlToQuery(sql`insert into ${sql.identifier(migrationsTable)} ("hash", "created_at", "name", "applied_at") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${(/* @__PURE__ */ new Date()).toISOString()})`.inlineParams()).sql]);
34
+ return;
35
+ }
36
+ const migrationsToRun = getMigrationsToRun({
37
+ localMigrations: migrations,
38
+ dbMigrations
39
+ });
40
+ const queriesToRun = [];
41
+ for (const migration of migrationsToRun) queriesToRun.push(...migration.sql, db.dialect.sqlToQuery(sql`insert into ${sql.identifier(migrationsTable)} ("hash", "created_at", "name", "applied_at") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${(/* @__PURE__ */ new Date()).toISOString()})`.inlineParams()).sql);
42
+ await callback(queriesToRun);
6
43
  }
7
44
 
8
45
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"migrator.js","names":[],"sources":["../../src/sqlite-proxy/migrator.ts"],"sourcesContent":["import type { MigrationConfig } from '~/migrator.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport type { SqliteRemoteDatabase } from './driver.ts';\nimport { migrateInternal } from './migrator.internal.ts';\n\nexport type ProxyMigrator = (migrationQueries: string[]) => Promise<void>;\n\nexport async function migrate<TSchema extends Record<string, unknown>, TRelations extends AnyRelations>(\n\tdb: SqliteRemoteDatabase<TSchema, TRelations>,\n\tcallback: ProxyMigrator,\n\tconfig: MigrationConfig,\n) {\n\treturn migrateInternal(db, callback, config, 'transaction');\n}\n"],"mappings":";;;AAOA,eAAsB,QACrB,IACA,UACA,QACC;AACD,QAAO,gBAAgB,IAAI,UAAU,QAAQ,cAAc"}
1
+ {"version":3,"file":"migrator.js","names":[],"sources":["../../src/sqlite-proxy/migrator.ts"],"sourcesContent":["import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport { getMigrationsToRun } from '~/migrator.utils.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { upgradeAsyncIfNeeded } from '~/up-migrations/sqlite-proxy.ts';\nimport type { SqliteRemoteDatabase } from './driver.ts';\n\nexport type ProxyMigrator = (migrationQueries: string[]) => Promise<void>;\n\nexport async function migrate<TSchema extends Record<string, unknown>, TRelations extends AnyRelations>(\n\tdb: SqliteRemoteDatabase<TSchema, TRelations>,\n\tcallback: ProxyMigrator,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\n\tconst migrationsTable = 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(migrationsTable, db, callback, migrations);\n\n\tif (newDb) {\n\t\tconst migrationTableCreate = sql`\n\t\tCREATE TABLE IF NOT EXISTS ${sql.identifier(migrationsTable)} (\n\t\t\tid INTEGER PRIMARY KEY,\n\t\t\thash text NOT NULL,\n\t\t\tcreated_at numeric,\n\t\t\tname text,\n\t\t\tapplied_at TEXT\n\t\t);`;\n\n\t\tawait db.run(migrationTableCreate);\n\t}\n\n\tconst dbMigrations = (await db.values<[number, string, string, string | null]>(\n\t\tsql`SELECT id, hash, created_at, name FROM ${sql.identifier(migrationsTable)}`,\n\t)).map(([id, hash, created_at, name]) => ({ id, hash, created_at, name }));\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 callback(\n\t\t\t[\n\t\t\t\tdb.dialect.sqlToQuery(\n\t\t\t\t\tsql`insert into ${\n\t\t\t\t\t\tsql.identifier(migrationsTable)\n\t\t\t\t\t} (\"hash\", \"created_at\", \"name\", \"applied_at\") values(${migration.hash}, ${migration.folderMillis}, ${migration.name}, ${\n\t\t\t\t\t\tnew Date().toISOString()\n\t\t\t\t\t})`\n\t\t\t\t\t\t.inlineParams(),\n\t\t\t\t).sql,\n\t\t\t],\n\t\t);\n\n\t\treturn;\n\t}\n\n\tconst migrationsToRun = getMigrationsToRun({ localMigrations: migrations, dbMigrations });\n\tconst queriesToRun: string[] = [];\n\tfor (const migration of migrationsToRun) {\n\t\tqueriesToRun.push(\n\t\t\t...migration.sql,\n\t\t\tdb.dialect.sqlToQuery(\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\t\t.inlineParams(),\n\t\t\t).sql,\n\t\t);\n\t}\n\n\tawait callback(queriesToRun);\n\n\treturn;\n}\n"],"mappings":";;;;;;AAUA,eAAsB,QACrB,IACA,UACA,QACC;CACD,MAAM,aAAa,mBAAmB,OAAO;CAE7C,MAAM,kBAAkB,OAAO,WAAW,WACvC,yBACA,OAAO,mBAAmB;CAG7B,MAAM,EAAE,UAAU,MAAM,qBAAqB,iBAAiB,IAAI,UAAU,WAAW;AAEvF,KAAI,OAAO;EACV,MAAM,uBAAuB,GAAG;+BACH,IAAI,WAAW,gBAAgB,CAAC;;;;;;;AAQ7D,QAAM,GAAG,IAAI,qBAAqB;;CAGnC,MAAM,gBAAgB,MAAM,GAAG,OAC9B,GAAG,0CAA0C,IAAI,WAAW,gBAAgB,GAC5E,EAAE,KAAK,CAAC,IAAI,MAAM,YAAY,WAAW;EAAE;EAAI;EAAM;EAAY;EAAM,EAAE;AAE1E,KAAI,OAAO,WAAW,YAAY,OAAO,MAAM;AAC9C,MAAI,aAAa,OAChB,QAAO,EAAE,UAAU,sBAA+B;AAGnD,MAAI,WAAW,SAAS,EACvB,QAAO,EAAE,UAAU,mBAA4B;EAGhD,MAAM,CAAC,aAAa;AAEpB,MAAI,CAAC,UAAW;AAEhB,QAAM,SACL,CACC,GAAG,QAAQ,WACV,GAAG,eACF,IAAI,WAAW,gBAAgB,CAC/B,uDAAuD,UAAU,KAAK,IAAI,UAAU,aAAa,IAAI,UAAU,KAAK,qBACpH,IAAI,MAAM,EAAC,aAAa,CACxB,GACC,cAAc,CAChB,CAAC,IACF,CACD;AAED;;CAGD,MAAM,kBAAkB,mBAAmB;EAAE,iBAAiB;EAAY;EAAc,CAAC;CACzF,MAAM,eAAyB,EAAE;AACjC,MAAK,MAAM,aAAa,gBACvB,cAAa,KACZ,GAAG,UAAU,KACb,GAAG,QAAQ,WACV,GAAG,eACF,IAAI,WAAW,gBAAgB,CAC/B,uDAAuD,UAAU,KAAK,IAAI,UAAU,aAAa,IAAI,UAAU,KAAK,qBACpH,IAAI,MAAM,EAAC,aAAa,CACxB,GACC,cAAc,CAChB,CAAC,IACF;AAGF,OAAM,SAAS,aAAa"}
@@ -5,7 +5,7 @@ let __migrator_ts = require("../migrator.cjs");
5
5
  //#region src/tursodatabase/migrator.ts
6
6
  async function migrate(db, config) {
7
7
  const migrations = (0, __migrator_ts.readMigrationFiles)(config);
8
- return await db.dialect.migrate(migrations, db.session, config);
8
+ return await db.dialect.migrate(migrations, db, config);
9
9
  }
10
10
 
11
11
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"migrator.cjs","names":[],"sources":["../../src/tursodatabase/migrator.ts"],"sourcesContent":["import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport type { TursoDatabaseDatabase } from './driver-core.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>, TRelations extends AnyRelations>(\n\tdb: TursoDatabaseDatabase<TSchema, TRelations>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\treturn await db.dialect.migrate(migrations, db.session as any, config);\n}\n"],"mappings":";;;;;AAKA,eAAsB,QACrB,IACA,QACC;CACD,MAAM,mDAAgC,OAAO;AAC7C,QAAO,MAAM,GAAG,QAAQ,QAAQ,YAAY,GAAG,SAAgB,OAAO"}
1
+ {"version":3,"file":"migrator.cjs","names":[],"sources":["../../src/tursodatabase/migrator.ts"],"sourcesContent":["import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport type { TursoDatabaseDatabase } from './driver-core.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>, TRelations extends AnyRelations>(\n\tdb: TursoDatabaseDatabase<TSchema, TRelations>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\treturn await db.dialect.migrate(migrations, db, config);\n}\n"],"mappings":";;;;;AAKA,eAAsB,QACrB,IACA,QACC;CACD,MAAM,mDAAgC,OAAO;AAC7C,QAAO,MAAM,GAAG,QAAQ,QAAQ,YAAY,IAAI,OAAO"}
@@ -3,7 +3,7 @@ import { readMigrationFiles } from "../migrator.js";
3
3
  //#region src/tursodatabase/migrator.ts
4
4
  async function migrate(db, config) {
5
5
  const migrations = readMigrationFiles(config);
6
- return await db.dialect.migrate(migrations, db.session, config);
6
+ return await db.dialect.migrate(migrations, db, config);
7
7
  }
8
8
 
9
9
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"migrator.js","names":[],"sources":["../../src/tursodatabase/migrator.ts"],"sourcesContent":["import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport type { TursoDatabaseDatabase } from './driver-core.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>, TRelations extends AnyRelations>(\n\tdb: TursoDatabaseDatabase<TSchema, TRelations>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\treturn await db.dialect.migrate(migrations, db.session as any, config);\n}\n"],"mappings":";;;AAKA,eAAsB,QACrB,IACA,QACC;CACD,MAAM,aAAa,mBAAmB,OAAO;AAC7C,QAAO,MAAM,GAAG,QAAQ,QAAQ,YAAY,GAAG,SAAgB,OAAO"}
1
+ {"version":3,"file":"migrator.js","names":[],"sources":["../../src/tursodatabase/migrator.ts"],"sourcesContent":["import type { MigrationConfig } from '~/migrator.ts';\nimport { readMigrationFiles } from '~/migrator.ts';\nimport type { AnyRelations } from '~/relations.ts';\nimport type { TursoDatabaseDatabase } from './driver-core.ts';\n\nexport async function migrate<TSchema extends Record<string, unknown>, TRelations extends AnyRelations>(\n\tdb: TursoDatabaseDatabase<TSchema, TRelations>,\n\tconfig: MigrationConfig,\n) {\n\tconst migrations = readMigrationFiles(config);\n\treturn await db.dialect.migrate(migrations, db, config);\n}\n"],"mappings":";;;AAKA,eAAsB,QACrB,IACA,QACC;CACD,MAAM,aAAa,mBAAmB,OAAO;AAC7C,QAAO,MAAM,GAAG,QAAQ,QAAQ,YAAY,IAAI,OAAO"}
@@ -1,13 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
2
  const require_runtime = require('../_virtual/_rolldown/runtime.cjs');
3
+ const require_up_migrations_utils = require('./utils.cjs');
3
4
  let __sql_sql_ts = require("../sql/sql.cjs");
4
5
 
5
6
  //#region src/up-migrations/cockroach.ts
6
- const CURRENT_MIGRATION_TABLE_VERSION = 1;
7
- function getVersion(columns) {
8
- if (columns.includes("name")) return 1;
9
- return 0;
10
- }
11
7
  /**
12
8
  * Map of upgrade functions. Each key is the version being upgraded FROM,
13
9
  * and the function upgrades the table to the next version.
@@ -56,7 +52,7 @@ async function upgradeIfNeeded(migrationsSchema, migrationsTable, session, local
56
52
  if ((await session.all(__sql_sql_ts.sql`SELECT 1 FROM information_schema.tables
57
53
  WHERE table_schema = ${migrationsSchema}
58
54
  AND table_name = ${migrationsTable}`)).length === 0) return { newDb: true };
59
- let version = getVersion((await session.all(__sql_sql_ts.sql`SELECT
55
+ const rows = await session.all(__sql_sql_ts.sql`SELECT
60
56
  n.nspname AS "schema",
61
57
  c.relname AS "table_name",
62
58
  a.attname AS "column_name",
@@ -70,16 +66,14 @@ async function upgradeIfNeeded(migrationsSchema, migrationsTable, session, local
70
66
  AND NOT a.attisdropped
71
67
  AND n.nspname = ${migrationsSchema}
72
68
  AND c.relname = ${migrationsTable}
73
- ORDER BY a.attnum;`)).map((r) => r.column_name));
74
- for (let v = version; v < CURRENT_MIGRATION_TABLE_VERSION; v++) {
69
+ ORDER BY a.attnum;`);
70
+ let version = require_up_migrations_utils.GET_VERSION_FOR.cockroach(rows.map((r) => r.column_name));
71
+ for (let v = version; v < require_up_migrations_utils.MIGRATIONS_TABLE_VERSIONS.cockroach; v++) {
75
72
  const upgradeFn = upgradeFunctions[v];
76
73
  if (!upgradeFn) throw new Error(`No upgrade path from migration table version ${v} to ${v + 1}`);
77
74
  await upgradeFn(migrationsSchema, migrationsTable, session, localMigrations);
78
75
  }
79
- return {
80
- prevVersion: version,
81
- currentVersion: CURRENT_MIGRATION_TABLE_VERSION
82
- };
76
+ return { newDb: false };
83
77
  }
84
78
 
85
79
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"cockroach.cjs","names":["sql"],"sources":["../../src/up-migrations/cockroach.ts"],"sourcesContent":["import type { CockroachSession } from '~/cockroach-core/session.ts';\nimport type { MigrationMeta } from '~/migrator.ts';\nimport { sql } from '~/sql/sql.ts';\n\nconst CURRENT_MIGRATION_TABLE_VERSION = 1;\n\ninterface UpgradeResult {\n\tnewDb?: boolean;\n\tprevVersion?: number;\n\tcurrentVersion?: number;\n}\n\nfunction getVersion(columns: string[]) {\n\tif (columns.includes('name')) return 1;\n\treturn 0;\n}\n\n/**\n * Map of upgrade functions. Each key is the version being upgraded FROM,\n * and the function upgrades the table to the next version.\n */\nconst upgradeFunctions: Record<\n\tnumber,\n\t(\n\t\tmigrationsSchema: string,\n\t\tmigrationsTable: string,\n\t\tsession: CockroachSession,\n\t\tlocalMigrations: MigrationMeta[],\n\t) => Promise<void>\n> = {\n\t/**\n\t * Upgrade from version 0 to version 1:\n\t * 1. Read all existing DB migrations\n\t * 2. Sort localMigrations ASC by millis and if the same - sort by name\n\t * 3. Match each DB row to a local migration\n\t * If multiple migrations share the same second, use hash matching as a tiebreaker\n\t * Not implemented for now -> If hash matching fails, fall back to serial id ordering\n\t * 5. Create extra column and backfill names for matched migrations\n\t */\n\t0: async (migrationsSchema, migrationsTable, session, localMigrations) => {\n\t\tconst table = sql`${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)}`;\n\n\t\t// 1. Read all existing DB migrations\n\t\t// Sort them by ids asc (order how they were applied)\n\t\tconst dbRows = await session.all<{ id: number; hash: string; created_at: string }>(\n\t\t\tsql`SELECT id, hash, created_at FROM ${table} ORDER BY id ASC`,\n\t\t);\n\n\t\t// 2. Sort ASC by millis and if the same - sort by name\n\t\tlocalMigrations.sort((a, b) =>\n\t\t\ta.folderMillis !== b.folderMillis ? a.folderMillis - b.folderMillis : (a.name ?? '').localeCompare(b.name ?? '')\n\t\t);\n\n\t\tconst byMillis = new Map<number, MigrationMeta[]>();\n\t\tconst byHash = new Map<string, MigrationMeta>();\n\t\tfor (const lm of localMigrations) {\n\t\t\tif (!byMillis.has(lm.folderMillis)) {\n\t\t\t\tbyMillis.set(lm.folderMillis, []);\n\t\t\t}\n\t\t\tbyMillis.get(lm.folderMillis)!.push(lm);\n\t\t\tbyHash.set(lm.hash, lm);\n\t\t}\n\n\t\t// \t3. Match each DB row to a local migration\n\t\t// \tPriority: millis -> hash\n\t\tconst toApply: { id: number; name: string }[] = [];\n\t\tlet unmatchedIds: number[] = [];\n\n\t\tfor (const dbRow of dbRows) {\n\t\t\tconst stringified = String(dbRow.created_at);\n\t\t\tconst millis = Number(stringified.substring(0, stringified.length - 3) + '000');\n\t\t\tconst candidates = byMillis.get(millis);\n\n\t\t\tlet matched: MigrationMeta | undefined;\n\n\t\t\tif (candidates && candidates.length === 1) {\n\t\t\t\tmatched = candidates[0];\n\t\t\t} else if (candidates && candidates.length > 1) {\n\t\t\t\tmatched = candidates.find((c) => c.hash === dbRow.hash);\n\t\t\t} else {\n\t\t\t\tmatched = byHash.get(dbRow.hash);\n\t\t\t}\n\n\t\t\tif (matched) toApply.push({ id: dbRow.id, name: matched.name });\n\t\t\telse unmatchedIds.push(dbRow.id);\n\t\t}\n\n\t\t// 4. Check for unmatched\n\t\t// Our assumption on this migration flow is that all DB entries should be matched to a local migration\n\t\t// (if same seconds - fallback to hash, if hash fails - corner case)\n\t\t// If there are unmatched entries, it means that the local environment is missing migrations that have been applied to the DB,\n\t\t// which can lead to inconsistencies and potential issues when running future migrations\n\t\tif (unmatchedIds.length > 0) {\n\t\t\tthrow Error(\n\t\t\t\t`While upgrading your database migrations table we found ${unmatchedIds.length} migrations (ids: ${\n\t\t\t\t\tunmatchedIds.join(', ')\n\t\t\t\t}) in the database that do not match any local migration. This means that some migrations were applied to the database but are missing from the local environment`,\n\t\t\t);\n\t\t}\n\n\t\t// 5. Create extra column and backfill names for matched migrations\n\t\tawait session.transaction(async (tx) => {\n\t\t\t// 1. Add new columns\n\t\t\tawait tx.execute(sql`ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS ${sql.identifier('name')} text`);\n\t\t\tawait tx.execute(\n\t\t\t\tsql`ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS ${\n\t\t\t\t\tsql.identifier('applied_at')\n\t\t\t\t} timestamp with time zone DEFAULT now()`,\n\t\t\t);\n\n\t\t\tfor (const backfillEntry of toApply) {\n\t\t\t\tawait tx.execute(\n\t\t\t\t\tsql`UPDATE ${table} SET ${sql.identifier('name')} = ${backfillEntry.name}, ${\n\t\t\t\t\t\tsql.identifier('applied_at')\n\t\t\t\t\t} = NULL WHERE ${sql.identifier('id')} = ${backfillEntry.id}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t},\n};\n\n/**\n * Detects the current version of the migrations table schema and upgrades it if needed.\n *\n * Version 0: Original schema (id, hash, created_at)\n * Version 1: Extended schema (id, hash, created_at, name, applied_at)\n */\nexport async function upgradeIfNeeded(\n\tmigrationsSchema: string,\n\tmigrationsTable: string,\n\tsession: CockroachSession,\n\tlocalMigrations: MigrationMeta[],\n): Promise<UpgradeResult> {\n\t// Check if the table exists at all\n\tconst tableExists = await session.all<{ 1: '1' }>(\n\t\tsql`SELECT 1 FROM information_schema.tables\n\t\t\tWHERE table_schema = ${migrationsSchema}\n\t\t\tAND table_name = ${migrationsTable}`,\n\t);\n\n\tif (tableExists.length === 0) {\n\t\treturn { newDb: true };\n\t}\n\n\t// Table exists, check table shape\n\tconst rows = await session.all<{ schema: string; table_name: string; column_name: string; type: string }>(\n\t\tsql`SELECT\n n.nspname AS \"schema\",\n c.relname AS \"table_name\",\n a.attname AS \"column_name\",\n pg_catalog.format_type(a.atttypid, a.atttypmod) AS \"type\"\n FROM\n pg_catalog.pg_attribute a\n JOIN pg_catalog.pg_class c ON c.oid = a.attrelid\n JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n WHERE\n a.attnum > 0\n AND NOT a.attisdropped\n AND n.nspname = ${migrationsSchema}\n AND c.relname = ${migrationsTable}\n ORDER BY a.attnum;`,\n\t);\n\n\tlet version = getVersion(rows.map((r) => r.column_name));\n\n\tfor (let v = version; v < CURRENT_MIGRATION_TABLE_VERSION; v++) {\n\t\tconst upgradeFn = upgradeFunctions[v];\n\t\tif (!upgradeFn) {\n\t\t\tthrow new Error(`No upgrade path from migration table version ${v} to ${v + 1}`);\n\t\t}\n\t\tawait upgradeFn(migrationsSchema, migrationsTable, session, localMigrations);\n\t}\n\n\treturn { prevVersion: version, currentVersion: CURRENT_MIGRATION_TABLE_VERSION };\n}\n"],"mappings":";;;;;AAIA,MAAM,kCAAkC;AAQxC,SAAS,WAAW,SAAmB;AACtC,KAAI,QAAQ,SAAS,OAAO,CAAE,QAAO;AACrC,QAAO;;;;;;AAOR,MAAM,mBAQF,EAUH,GAAG,OAAO,kBAAkB,iBAAiB,SAAS,oBAAoB;CACzE,MAAM,QAAQ,gBAAG,GAAGA,iBAAI,WAAW,iBAAiB,CAAC,GAAGA,iBAAI,WAAW,gBAAgB;CAIvF,MAAM,SAAS,MAAM,QAAQ,IAC5B,gBAAG,oCAAoC,MAAM,kBAC7C;AAGD,iBAAgB,MAAM,GAAG,MACxB,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,QAAQ,IAAI,cAAc,EAAE,QAAQ,GAAG,CAChH;CAED,MAAM,2BAAW,IAAI,KAA8B;CACnD,MAAM,yBAAS,IAAI,KAA4B;AAC/C,MAAK,MAAM,MAAM,iBAAiB;AACjC,MAAI,CAAC,SAAS,IAAI,GAAG,aAAa,CACjC,UAAS,IAAI,GAAG,cAAc,EAAE,CAAC;AAElC,WAAS,IAAI,GAAG,aAAa,CAAE,KAAK,GAAG;AACvC,SAAO,IAAI,GAAG,MAAM,GAAG;;CAKxB,MAAM,UAA0C,EAAE;CAClD,IAAI,eAAyB,EAAE;AAE/B,MAAK,MAAM,SAAS,QAAQ;EAC3B,MAAM,cAAc,OAAO,MAAM,WAAW;EAC5C,MAAM,SAAS,OAAO,YAAY,UAAU,GAAG,YAAY,SAAS,EAAE,GAAG,MAAM;EAC/E,MAAM,aAAa,SAAS,IAAI,OAAO;EAEvC,IAAI;AAEJ,MAAI,cAAc,WAAW,WAAW,EACvC,WAAU,WAAW;WACX,cAAc,WAAW,SAAS,EAC5C,WAAU,WAAW,MAAM,MAAM,EAAE,SAAS,MAAM,KAAK;MAEvD,WAAU,OAAO,IAAI,MAAM,KAAK;AAGjC,MAAI,QAAS,SAAQ,KAAK;GAAE,IAAI,MAAM;GAAI,MAAM,QAAQ;GAAM,CAAC;MAC1D,cAAa,KAAK,MAAM,GAAG;;AAQjC,KAAI,aAAa,SAAS,EACzB,OAAM,MACL,2DAA2D,aAAa,OAAO,oBAC9E,aAAa,KAAK,KAAK,CACvB,kKACD;AAIF,OAAM,QAAQ,YAAY,OAAO,OAAO;AAEvC,QAAM,GAAG,QAAQ,gBAAG,eAAe,MAAM,4BAA4BA,iBAAI,WAAW,OAAO,CAAC,OAAO;AACnG,QAAM,GAAG,QACR,gBAAG,eAAe,MAAM,4BACvBA,iBAAI,WAAW,aAAa,CAC5B,yCACD;AAED,OAAK,MAAM,iBAAiB,QAC3B,OAAM,GAAG,QACR,gBAAG,UAAU,MAAM,OAAOA,iBAAI,WAAW,OAAO,CAAC,KAAK,cAAc,KAAK,IACxEA,iBAAI,WAAW,aAAa,CAC5B,gBAAgBA,iBAAI,WAAW,KAAK,CAAC,KAAK,cAAc,KACzD;GAED;GAEH;;;;;;;AAQD,eAAsB,gBACrB,kBACA,iBACA,SACA,iBACyB;AAQzB,MANoB,MAAM,QAAQ,IACjC,gBAAG;0BACqB,iBAAiB;sBACrB,kBACpB,EAEe,WAAW,EAC1B,QAAO,EAAE,OAAO,MAAM;CAsBvB,IAAI,UAAU,YAlBD,MAAM,QAAQ,IAC1B,gBAAG;;;;;;;;;;;;8BAYyB,iBAAiB;8BACjB,gBAAgB;4BAE5C,EAE6B,KAAK,MAAM,EAAE,YAAY,CAAC;AAExD,MAAK,IAAI,IAAI,SAAS,IAAI,iCAAiC,KAAK;EAC/D,MAAM,YAAY,iBAAiB;AACnC,MAAI,CAAC,UACJ,OAAM,IAAI,MAAM,gDAAgD,EAAE,MAAM,IAAI,IAAI;AAEjF,QAAM,UAAU,kBAAkB,iBAAiB,SAAS,gBAAgB;;AAG7E,QAAO;EAAE,aAAa;EAAS,gBAAgB;EAAiC"}
1
+ {"version":3,"file":"cockroach.cjs","names":["sql","GET_VERSION_FOR","MIGRATIONS_TABLE_VERSIONS"],"sources":["../../src/up-migrations/cockroach.ts"],"sourcesContent":["import type { CockroachSession } from '~/cockroach-core/session.ts';\nimport type { MigrationMeta } from '~/migrator.ts';\nimport { sql } from '~/sql/sql.ts';\nimport { GET_VERSION_FOR, MIGRATIONS_TABLE_VERSIONS, type UpgradeResult } from './utils.ts';\n\n/**\n * Map of upgrade functions. Each key is the version being upgraded FROM,\n * and the function upgrades the table to the next version.\n */\nconst upgradeFunctions: Record<\n\tnumber,\n\t(\n\t\tmigrationsSchema: string,\n\t\tmigrationsTable: string,\n\t\tsession: CockroachSession,\n\t\tlocalMigrations: MigrationMeta[],\n\t) => Promise<void>\n> = {\n\t/**\n\t * Upgrade from version 0 to version 1:\n\t * 1. Read all existing DB migrations\n\t * 2. Sort localMigrations ASC by millis and if the same - sort by name\n\t * 3. Match each DB row to a local migration\n\t * If multiple migrations share the same second, use hash matching as a tiebreaker\n\t * Not implemented for now -> If hash matching fails, fall back to serial id ordering\n\t * 5. Create extra column and backfill names for matched migrations\n\t */\n\t0: async (migrationsSchema, migrationsTable, session, localMigrations) => {\n\t\tconst table = sql`${sql.identifier(migrationsSchema)}.${sql.identifier(migrationsTable)}`;\n\n\t\t// 1. Read all existing DB migrations\n\t\t// Sort them by ids asc (order how they were applied)\n\t\tconst dbRows = await session.all<{ id: number; hash: string; created_at: string }>(\n\t\t\tsql`SELECT id, hash, created_at FROM ${table} ORDER BY id ASC`,\n\t\t);\n\n\t\t// 2. Sort ASC by millis and if the same - sort by name\n\t\tlocalMigrations.sort((a, b) =>\n\t\t\ta.folderMillis !== b.folderMillis ? a.folderMillis - b.folderMillis : (a.name ?? '').localeCompare(b.name ?? '')\n\t\t);\n\n\t\tconst byMillis = new Map<number, MigrationMeta[]>();\n\t\tconst byHash = new Map<string, MigrationMeta>();\n\t\tfor (const lm of localMigrations) {\n\t\t\tif (!byMillis.has(lm.folderMillis)) {\n\t\t\t\tbyMillis.set(lm.folderMillis, []);\n\t\t\t}\n\t\t\tbyMillis.get(lm.folderMillis)!.push(lm);\n\t\t\tbyHash.set(lm.hash, lm);\n\t\t}\n\n\t\t// \t3. Match each DB row to a local migration\n\t\t// \tPriority: millis -> hash\n\t\tconst toApply: { id: number; name: string }[] = [];\n\t\tlet unmatchedIds: number[] = [];\n\n\t\tfor (const dbRow of dbRows) {\n\t\t\tconst stringified = String(dbRow.created_at);\n\t\t\tconst millis = Number(stringified.substring(0, stringified.length - 3) + '000');\n\t\t\tconst candidates = byMillis.get(millis);\n\n\t\t\tlet matched: MigrationMeta | undefined;\n\n\t\t\tif (candidates && candidates.length === 1) {\n\t\t\t\tmatched = candidates[0];\n\t\t\t} else if (candidates && candidates.length > 1) {\n\t\t\t\tmatched = candidates.find((c) => c.hash === dbRow.hash);\n\t\t\t} else {\n\t\t\t\tmatched = byHash.get(dbRow.hash);\n\t\t\t}\n\n\t\t\tif (matched) toApply.push({ id: dbRow.id, name: matched.name });\n\t\t\telse unmatchedIds.push(dbRow.id);\n\t\t}\n\n\t\t// 4. Check for unmatched\n\t\t// Our assumption on this migration flow is that all DB entries should be matched to a local migration\n\t\t// (if same seconds - fallback to hash, if hash fails - corner case)\n\t\t// If there are unmatched entries, it means that the local environment is missing migrations that have been applied to the DB,\n\t\t// which can lead to inconsistencies and potential issues when running future migrations\n\t\tif (unmatchedIds.length > 0) {\n\t\t\tthrow Error(\n\t\t\t\t`While upgrading your database migrations table we found ${unmatchedIds.length} migrations (ids: ${\n\t\t\t\t\tunmatchedIds.join(', ')\n\t\t\t\t}) in the database that do not match any local migration. This means that some migrations were applied to the database but are missing from the local environment`,\n\t\t\t);\n\t\t}\n\n\t\t// 5. Create extra column and backfill names for matched migrations\n\t\tawait session.transaction(async (tx) => {\n\t\t\t// 1. Add new columns\n\t\t\tawait tx.execute(sql`ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS ${sql.identifier('name')} text`);\n\t\t\tawait tx.execute(\n\t\t\t\tsql`ALTER TABLE ${table} ADD COLUMN IF NOT EXISTS ${\n\t\t\t\t\tsql.identifier('applied_at')\n\t\t\t\t} timestamp with time zone DEFAULT now()`,\n\t\t\t);\n\n\t\t\tfor (const backfillEntry of toApply) {\n\t\t\t\tawait tx.execute(\n\t\t\t\t\tsql`UPDATE ${table} SET ${sql.identifier('name')} = ${backfillEntry.name}, ${\n\t\t\t\t\t\tsql.identifier('applied_at')\n\t\t\t\t\t} = NULL WHERE ${sql.identifier('id')} = ${backfillEntry.id}`,\n\t\t\t\t);\n\t\t\t}\n\t\t});\n\t},\n};\n\n/**\n * Detects the current version of the migrations table schema and upgrades it if needed.\n *\n * Version 0: Original schema (id, hash, created_at)\n * Version 1: Extended schema (id, hash, created_at, name, applied_at)\n */\nexport async function upgradeIfNeeded(\n\tmigrationsSchema: string,\n\tmigrationsTable: string,\n\tsession: CockroachSession,\n\tlocalMigrations: MigrationMeta[],\n): Promise<UpgradeResult> {\n\t// Check if the table exists at all\n\tconst tableExists = await session.all<{ 1: '1' }>(\n\t\tsql`SELECT 1 FROM information_schema.tables\n\t\t\tWHERE table_schema = ${migrationsSchema}\n\t\t\tAND table_name = ${migrationsTable}`,\n\t);\n\n\tif (tableExists.length === 0) {\n\t\treturn { newDb: true };\n\t}\n\n\t// Table exists, check table shape\n\tconst rows = await session.all<{ schema: string; table_name: string; column_name: string; type: string }>(\n\t\tsql`SELECT\n n.nspname AS \"schema\",\n c.relname AS \"table_name\",\n a.attname AS \"column_name\",\n pg_catalog.format_type(a.atttypid, a.atttypmod) AS \"type\"\n FROM\n pg_catalog.pg_attribute a\n JOIN pg_catalog.pg_class c ON c.oid = a.attrelid\n JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace\n WHERE\n a.attnum > 0\n AND NOT a.attisdropped\n AND n.nspname = ${migrationsSchema}\n AND c.relname = ${migrationsTable}\n ORDER BY a.attnum;`,\n\t);\n\n\tlet version = GET_VERSION_FOR.cockroach(rows.map((r) => r.column_name));\n\n\tfor (let v = version; v < MIGRATIONS_TABLE_VERSIONS.cockroach; v++) {\n\t\tconst upgradeFn = upgradeFunctions[v];\n\t\tif (!upgradeFn) {\n\t\t\tthrow new Error(`No upgrade path from migration table version ${v} to ${v + 1}`);\n\t\t}\n\t\tawait upgradeFn(migrationsSchema, migrationsTable, session, localMigrations);\n\t}\n\n\treturn { newDb: false };\n}\n"],"mappings":";;;;;;;;;;AASA,MAAM,mBAQF,EAUH,GAAG,OAAO,kBAAkB,iBAAiB,SAAS,oBAAoB;CACzE,MAAM,QAAQ,gBAAG,GAAGA,iBAAI,WAAW,iBAAiB,CAAC,GAAGA,iBAAI,WAAW,gBAAgB;CAIvF,MAAM,SAAS,MAAM,QAAQ,IAC5B,gBAAG,oCAAoC,MAAM,kBAC7C;AAGD,iBAAgB,MAAM,GAAG,MACxB,EAAE,iBAAiB,EAAE,eAAe,EAAE,eAAe,EAAE,gBAAgB,EAAE,QAAQ,IAAI,cAAc,EAAE,QAAQ,GAAG,CAChH;CAED,MAAM,2BAAW,IAAI,KAA8B;CACnD,MAAM,yBAAS,IAAI,KAA4B;AAC/C,MAAK,MAAM,MAAM,iBAAiB;AACjC,MAAI,CAAC,SAAS,IAAI,GAAG,aAAa,CACjC,UAAS,IAAI,GAAG,cAAc,EAAE,CAAC;AAElC,WAAS,IAAI,GAAG,aAAa,CAAE,KAAK,GAAG;AACvC,SAAO,IAAI,GAAG,MAAM,GAAG;;CAKxB,MAAM,UAA0C,EAAE;CAClD,IAAI,eAAyB,EAAE;AAE/B,MAAK,MAAM,SAAS,QAAQ;EAC3B,MAAM,cAAc,OAAO,MAAM,WAAW;EAC5C,MAAM,SAAS,OAAO,YAAY,UAAU,GAAG,YAAY,SAAS,EAAE,GAAG,MAAM;EAC/E,MAAM,aAAa,SAAS,IAAI,OAAO;EAEvC,IAAI;AAEJ,MAAI,cAAc,WAAW,WAAW,EACvC,WAAU,WAAW;WACX,cAAc,WAAW,SAAS,EAC5C,WAAU,WAAW,MAAM,MAAM,EAAE,SAAS,MAAM,KAAK;MAEvD,WAAU,OAAO,IAAI,MAAM,KAAK;AAGjC,MAAI,QAAS,SAAQ,KAAK;GAAE,IAAI,MAAM;GAAI,MAAM,QAAQ;GAAM,CAAC;MAC1D,cAAa,KAAK,MAAM,GAAG;;AAQjC,KAAI,aAAa,SAAS,EACzB,OAAM,MACL,2DAA2D,aAAa,OAAO,oBAC9E,aAAa,KAAK,KAAK,CACvB,kKACD;AAIF,OAAM,QAAQ,YAAY,OAAO,OAAO;AAEvC,QAAM,GAAG,QAAQ,gBAAG,eAAe,MAAM,4BAA4BA,iBAAI,WAAW,OAAO,CAAC,OAAO;AACnG,QAAM,GAAG,QACR,gBAAG,eAAe,MAAM,4BACvBA,iBAAI,WAAW,aAAa,CAC5B,yCACD;AAED,OAAK,MAAM,iBAAiB,QAC3B,OAAM,GAAG,QACR,gBAAG,UAAU,MAAM,OAAOA,iBAAI,WAAW,OAAO,CAAC,KAAK,cAAc,KAAK,IACxEA,iBAAI,WAAW,aAAa,CAC5B,gBAAgBA,iBAAI,WAAW,KAAK,CAAC,KAAK,cAAc,KACzD;GAED;GAEH;;;;;;;AAQD,eAAsB,gBACrB,kBACA,iBACA,SACA,iBACyB;AAQzB,MANoB,MAAM,QAAQ,IACjC,gBAAG;0BACqB,iBAAiB;sBACrB,kBACpB,EAEe,WAAW,EAC1B,QAAO,EAAE,OAAO,MAAM;CAIvB,MAAM,OAAO,MAAM,QAAQ,IAC1B,gBAAG;;;;;;;;;;;;8BAYyB,iBAAiB;8BACjB,gBAAgB;4BAE5C;CAED,IAAI,UAAUC,4CAAgB,UAAU,KAAK,KAAK,MAAM,EAAE,YAAY,CAAC;AAEvE,MAAK,IAAI,IAAI,SAAS,IAAIC,sDAA0B,WAAW,KAAK;EACnE,MAAM,YAAY,iBAAiB;AACnC,MAAI,CAAC,UACJ,OAAM,IAAI,MAAM,gDAAgD,EAAE,MAAM,IAAI,IAAI;AAEjF,QAAM,UAAU,kBAAkB,iBAAiB,SAAS,gBAAgB;;AAG7E,QAAO,EAAE,OAAO,OAAO"}
@@ -1,12 +1,8 @@
1
+ import { UpgradeResult } from "./utils.cjs";
1
2
  import { CockroachSession } from "../cockroach-core/session.cjs";
2
3
  import { MigrationMeta } from "../migrator.cjs";
3
4
 
4
5
  //#region src/up-migrations/cockroach.d.ts
5
- interface UpgradeResult {
6
- newDb?: boolean;
7
- prevVersion?: number;
8
- currentVersion?: number;
9
- }
10
6
  /**
11
7
  * Detects the current version of the migrations table schema and upgrades it if needed.
12
8
  *
@@ -1,12 +1,8 @@
1
+ import { UpgradeResult } from "./utils.js";
1
2
  import { MigrationMeta } from "../migrator.js";
2
3
  import { CockroachSession } from "../cockroach-core/session.js";
3
4
 
4
5
  //#region src/up-migrations/cockroach.d.ts
5
- interface UpgradeResult {
6
- newDb?: boolean;
7
- prevVersion?: number;
8
- currentVersion?: number;
9
- }
10
6
  /**
11
7
  * Detects the current version of the migrations table schema and upgrades it if needed.
12
8
  *