@fragno-dev/db 0.1.2 → 0.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (176) hide show
  1. package/.turbo/turbo-build.log +210 -146
  2. package/CHANGELOG.md +19 -0
  3. package/LICENSE.md +16 -0
  4. package/dist/adapters/adapters.js +1 -0
  5. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  6. package/dist/adapters/drizzle/drizzle-adapter.js +4 -2
  7. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  8. package/dist/adapters/drizzle/drizzle-query.js +2 -2
  9. package/dist/adapters/drizzle/drizzle-query.js.map +1 -1
  10. package/dist/adapters/drizzle/drizzle-uow-compiler.js +4 -4
  11. package/dist/adapters/drizzle/drizzle-uow-decoder.js +14 -4
  12. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +1 -1
  13. package/dist/adapters/drizzle/drizzle-uow-executor.js +78 -60
  14. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +1 -1
  15. package/dist/adapters/drizzle/generate.js +5 -4
  16. package/dist/adapters/drizzle/generate.js.map +1 -1
  17. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  18. package/dist/adapters/kysely/kysely-adapter.js +33 -22
  19. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  20. package/dist/adapters/kysely/migration/execute-base.js +128 -0
  21. package/dist/adapters/kysely/migration/execute-base.js.map +1 -0
  22. package/dist/adapters/kysely/migration/execute-factory.js +27 -0
  23. package/dist/adapters/kysely/migration/execute-factory.js.map +1 -0
  24. package/dist/adapters/kysely/migration/execute-mssql.js +112 -0
  25. package/dist/adapters/kysely/migration/execute-mssql.js.map +1 -0
  26. package/dist/adapters/kysely/migration/execute-mysql.js +93 -0
  27. package/dist/adapters/kysely/migration/execute-mysql.js.map +1 -0
  28. package/dist/adapters/kysely/migration/execute-postgres.js +104 -0
  29. package/dist/adapters/kysely/migration/execute-postgres.js.map +1 -0
  30. package/dist/adapters/kysely/migration/execute-sqlite.js +123 -0
  31. package/dist/adapters/kysely/migration/execute-sqlite.js.map +1 -0
  32. package/dist/adapters/kysely/migration/execute.js +23 -168
  33. package/dist/adapters/kysely/migration/execute.js.map +1 -1
  34. package/dist/migration-engine/shared.d.ts +24 -5
  35. package/dist/migration-engine/shared.d.ts.map +1 -1
  36. package/dist/migration-engine/shared.js.map +1 -1
  37. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/alias.js +77 -0
  38. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/alias.js.map +1 -0
  39. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/casing.js +49 -0
  40. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/casing.js.map +1 -0
  41. package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/column-builder.js +1 -1
  42. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/column-builder.js.map +1 -0
  43. package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/column.js +1 -1
  44. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/column.js.map +1 -0
  45. package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/entity.js +1 -1
  46. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/entity.js.map +1 -0
  47. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/errors.js +21 -0
  48. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/errors.js.map +1 -0
  49. package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/pg-core/columns/common.js +1 -1
  50. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/pg-core/columns/common.js.map +1 -0
  51. package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/pg-core/columns/enum.js +1 -1
  52. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/pg-core/columns/enum.js.map +1 -0
  53. package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/pg-core/foreign-keys.js +1 -1
  54. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/pg-core/foreign-keys.js.map +1 -0
  55. package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/pg-core/unique-constraint.js +1 -1
  56. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/pg-core/unique-constraint.js.map +1 -0
  57. package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/pg-core/utils/array.js +1 -1
  58. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/pg-core/utils/array.js.map +1 -0
  59. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/query-builders/query-builder.js +14 -0
  60. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/query-builders/query-builder.js.map +1 -0
  61. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/query-promise.js +26 -0
  62. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/query-promise.js.map +1 -0
  63. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/relations.js +127 -0
  64. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/relations.js.map +1 -0
  65. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/selection-proxy.js +47 -0
  66. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/selection-proxy.js.map +1 -0
  67. package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/sql/expressions/conditions.js +20 -2
  68. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/expressions/conditions.js.map +1 -0
  69. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/expressions/select.js +13 -0
  70. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/expressions/select.js.map +1 -0
  71. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/functions/aggregate.js +10 -0
  72. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/functions/aggregate.js.map +1 -0
  73. package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/sql/sql.js +1 -1
  74. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sql/sql.js.map +1 -0
  75. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/columns/common.js +60 -0
  76. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/columns/common.js.map +1 -0
  77. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/db.js +269 -0
  78. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/db.js.map +1 -0
  79. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/dialect.js +457 -0
  80. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/dialect.js.map +1 -0
  81. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/foreign-keys.js +68 -0
  82. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/foreign-keys.js.map +1 -0
  83. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/count.js +41 -0
  84. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/count.js.map +1 -0
  85. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js +119 -0
  86. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/delete.js.map +1 -0
  87. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/insert.js +170 -0
  88. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/insert.js.map +1 -0
  89. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.js +75 -0
  90. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/query-builder.js.map +1 -0
  91. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/query.js +107 -0
  92. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/query.js.map +1 -0
  93. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js +37 -0
  94. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/raw.js.map +1 -0
  95. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/select.js +621 -0
  96. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/select.js.map +1 -0
  97. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/update.js +170 -0
  98. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/query-builders/update.js.map +1 -0
  99. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/table.js +20 -0
  100. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/table.js.map +1 -0
  101. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/unique-constraint.js +48 -0
  102. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/unique-constraint.js.map +1 -0
  103. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/utils.js +17 -0
  104. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/utils.js.map +1 -0
  105. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/view-base.js +11 -0
  106. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/sqlite-core/view-base.js.map +1 -0
  107. package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/subquery.js +2 -2
  108. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/subquery.js.map +1 -0
  109. package/dist/node_modules/{.bun/drizzle-orm@0.44.6_4fae081eecb963e2 → .pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8}/node_modules/drizzle-orm/table.js +8 -2
  110. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/table.js.map +1 -0
  111. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/table.utils.js +6 -0
  112. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/table.utils.js.map +1 -0
  113. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/tracing-utils.js +8 -0
  114. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/tracing-utils.js.map +1 -0
  115. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/tracing.js +8 -0
  116. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/tracing.js.map +1 -0
  117. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/utils.js +53 -0
  118. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/utils.js.map +1 -0
  119. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/view-common.js +6 -0
  120. package/dist/node_modules/.pnpm/drizzle-orm@0.44.7_@electric-sql_pglite@0.3.11_@types_better-sqlite3@7.6.13_better-sqlite3@12.4.1_kysely@0.28.8/node_modules/drizzle-orm/view-common.js.map +1 -0
  121. package/dist/query/query.d.ts +4 -4
  122. package/dist/query/query.d.ts.map +1 -1
  123. package/dist/query/unit-of-work.d.ts +22 -22
  124. package/dist/query/unit-of-work.d.ts.map +1 -1
  125. package/dist/schema/create.d.ts +41 -41
  126. package/dist/schema/create.d.ts.map +1 -1
  127. package/dist/schema/serialize.js +3 -0
  128. package/dist/schema/serialize.js.map +1 -1
  129. package/package.json +20 -24
  130. package/src/adapters/drizzle/drizzle-adapter-sqlite.test.ts +585 -0
  131. package/src/adapters/drizzle/drizzle-adapter.test.ts +2 -2
  132. package/src/adapters/drizzle/drizzle-adapter.ts +11 -4
  133. package/src/adapters/drizzle/drizzle-query.ts +2 -2
  134. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +1 -1
  135. package/src/adapters/drizzle/drizzle-uow-decoder.ts +21 -4
  136. package/src/adapters/drizzle/drizzle-uow-executor.ts +155 -115
  137. package/src/adapters/drizzle/generate.test.ts +111 -14
  138. package/src/adapters/drizzle/generate.ts +12 -7
  139. package/src/adapters/kysely/kysely-adapter.ts +46 -27
  140. package/src/adapters/kysely/migration/execute-base.ts +256 -0
  141. package/src/adapters/kysely/migration/execute-factory.ts +30 -0
  142. package/src/adapters/kysely/migration/execute-mssql.ts +250 -0
  143. package/src/adapters/kysely/migration/execute-mysql.ts +211 -0
  144. package/src/adapters/kysely/migration/execute-postgres.ts +234 -0
  145. package/src/adapters/kysely/migration/execute-sqlite.test.ts +1363 -0
  146. package/src/adapters/kysely/migration/execute-sqlite.ts +247 -0
  147. package/src/adapters/kysely/migration/execute.ts +33 -396
  148. package/src/adapters/kysely/migration/kysely-migrator.test.ts +84 -2
  149. package/src/migration-engine/shared.ts +29 -11
  150. package/src/schema/serialize.test.ts +1 -0
  151. package/src/schema/serialize.ts +7 -0
  152. package/tsdown.config.ts +1 -0
  153. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column-builder.js.map +0 -1
  154. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column.js.map +0 -1
  155. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/entity.js.map +0 -1
  156. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/common.js.map +0 -1
  157. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/enum.js.map +0 -1
  158. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/foreign-keys.js.map +0 -1
  159. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/unique-constraint.js.map +0 -1
  160. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/utils/array.js.map +0 -1
  161. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/conditions.js.map +0 -1
  162. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/select.js +0 -13
  163. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/select.js.map +0 -1
  164. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/functions/aggregate.js +0 -10
  165. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/functions/aggregate.js.map +0 -1
  166. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/sql.js.map +0 -1
  167. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/subquery.js.map +0 -1
  168. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.js.map +0 -1
  169. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.utils.js +0 -6
  170. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.utils.js.map +0 -1
  171. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing-utils.js +0 -8
  172. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing-utils.js.map +0 -1
  173. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing.js +0 -8
  174. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing.js.map +0 -1
  175. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/view-common.js +0 -6
  176. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/view-common.js.map +0 -1
@@ -0,0 +1,247 @@
1
+ import { sql } from "kysely";
2
+ import type {
3
+ ColumnOperation,
4
+ MigrationOperation,
5
+ SqliteCreateTableMetadata,
6
+ } from "../../../migration-engine/shared";
7
+ import type { TableNameMapper } from "../kysely-shared";
8
+ import {
9
+ BaseMigrationExecutor,
10
+ createUniqueIndex,
11
+ dropUniqueIndex,
12
+ type ExecuteNode,
13
+ } from "./execute-base";
14
+
15
+ const errors = {
16
+ IdColumnUpdate:
17
+ "ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds.",
18
+ SQLiteUpdateColumn: "SQLite doesn't support updating columns. Recreate the table instead.",
19
+ SQLiteUpdateForeignKeys:
20
+ "SQLite doesn't support modifying foreign keys directly. Use `recreate-table` instead.",
21
+ } as const;
22
+
23
+ /**
24
+ * SQLite-specific migration executor.
25
+ * Handles SQLite's limitations around foreign keys and column updates.
26
+ */
27
+ export class SqliteMigrationExecutor extends BaseMigrationExecutor<SqliteCreateTableMetadata> {
28
+ /**
29
+ * SQLite preprocessing: merge add-foreign-key operations into create-table operations
30
+ * when both exist in the same batch.
31
+ *
32
+ * SQLite requires foreign keys to be defined at table creation time. This preprocessing
33
+ * step identifies create-table + add-foreign-key pairs and merges them.
34
+ */
35
+ preprocessOperations(
36
+ operations: MigrationOperation[],
37
+ ): MigrationOperation<SqliteCreateTableMetadata>[] {
38
+ const result: MigrationOperation<SqliteCreateTableMetadata>[] = [];
39
+ const createTableIndices = new Map<string, number>(); // table name -> index in result
40
+ const foreignKeysByTable = new Map<string, (typeof operations)[number][]>();
41
+
42
+ // First pass: identify create-table operations and collect foreign keys
43
+ for (const op of operations) {
44
+ if (op.type === "create-table") {
45
+ createTableIndices.set(op.name, result.length);
46
+ result.push(op);
47
+ } else if (op.type === "add-foreign-key") {
48
+ if (!foreignKeysByTable.has(op.table)) {
49
+ foreignKeysByTable.set(op.table, []);
50
+ }
51
+ foreignKeysByTable.get(op.table)!.push(op);
52
+ } else {
53
+ result.push(op);
54
+ }
55
+ }
56
+
57
+ // Second pass: attach foreign keys as metadata to create-table ops
58
+ for (const [tableName, fkOps] of foreignKeysByTable.entries()) {
59
+ const createTableIdx = createTableIndices.get(tableName);
60
+
61
+ if (createTableIdx !== undefined) {
62
+ // Table is being created in this batch - attach FKs as metadata
63
+ const createOp = result[createTableIdx];
64
+ if (createOp.type === "create-table") {
65
+ result[createTableIdx] = {
66
+ ...createOp,
67
+ metadata: {
68
+ ...createOp.metadata,
69
+ inlineForeignKeys: fkOps.map((fkOp) => {
70
+ if (fkOp.type === "add-foreign-key") {
71
+ return fkOp.value;
72
+ }
73
+ throw new Error("Unexpected operation type");
74
+ }),
75
+ },
76
+ };
77
+ }
78
+ } else {
79
+ // Table already exists - keep add-foreign-key operations (will throw error during execution)
80
+ result.push(...fkOps);
81
+ }
82
+ }
83
+
84
+ return result;
85
+ }
86
+
87
+ executeOperation(
88
+ operation: MigrationOperation<SqliteCreateTableMetadata>,
89
+ mapper?: TableNameMapper,
90
+ ): ExecuteNode | ExecuteNode[] {
91
+ switch (operation.type) {
92
+ case "create-table":
93
+ return this.createTable(operation, mapper);
94
+ case "rename-table":
95
+ return this.renameTable(operation, mapper);
96
+ case "alter-table":
97
+ return this.alterTable(operation, mapper);
98
+ case "drop-table":
99
+ return this.dropTable(operation, mapper);
100
+ case "add-foreign-key":
101
+ throw new Error(errors.SQLiteUpdateForeignKeys);
102
+ case "drop-foreign-key":
103
+ throw new Error(errors.SQLiteUpdateForeignKeys);
104
+ case "add-index":
105
+ return this.addIndex(operation, mapper);
106
+ case "drop-index":
107
+ return this.dropIndex(operation, mapper);
108
+ case "custom":
109
+ return this.handleCustomOperation(operation);
110
+ }
111
+ }
112
+
113
+ private createTable(
114
+ operation: Extract<MigrationOperation<SqliteCreateTableMetadata>, { type: "create-table" }>,
115
+ mapper?: TableNameMapper,
116
+ ): ExecuteNode {
117
+ const tableName = this.getTableName(operation.name, mapper);
118
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
119
+ let builder: any = this.db.schema.createTable(tableName);
120
+
121
+ // Add columns
122
+ for (const columnInfo of operation.columns) {
123
+ builder = builder.addColumn(
124
+ columnInfo.name,
125
+ sql.raw(this.getDBType(columnInfo)),
126
+ this.getColumnBuilderCallback(columnInfo),
127
+ );
128
+ }
129
+
130
+ // Add inline foreign keys from metadata (SQLite-specific)
131
+ const inlineForeignKeys = operation.metadata?.inlineForeignKeys;
132
+ if (inlineForeignKeys) {
133
+ for (const fk of inlineForeignKeys) {
134
+ builder = builder.addForeignKeyConstraint(
135
+ fk.name,
136
+ fk.columns,
137
+ this.getTableName(fk.referencedTable, mapper),
138
+ fk.referencedColumns,
139
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
140
+ (cb: any) => cb.onUpdate("restrict").onDelete("restrict"),
141
+ );
142
+ }
143
+ }
144
+
145
+ return builder;
146
+ }
147
+
148
+ private renameTable(
149
+ operation: Extract<MigrationOperation, { type: "rename-table" }>,
150
+ mapper?: TableNameMapper,
151
+ ): ExecuteNode {
152
+ return this.db.schema
153
+ .alterTable(this.getTableName(operation.from, mapper))
154
+ .renameTo(this.getTableName(operation.to, mapper));
155
+ }
156
+
157
+ private alterTable(
158
+ operation: Extract<MigrationOperation, { type: "alter-table" }>,
159
+ mapper?: TableNameMapper,
160
+ ): ExecuteNode[] {
161
+ const results: ExecuteNode[] = [];
162
+ const tableName = this.getTableName(operation.name, mapper);
163
+
164
+ for (const columnOp of operation.value) {
165
+ results.push(...this.executeColumnOperation(tableName, columnOp));
166
+ }
167
+
168
+ return results;
169
+ }
170
+
171
+ private executeColumnOperation(tableName: string, operation: ColumnOperation): ExecuteNode[] {
172
+ const next = () => this.db.schema.alterTable(tableName);
173
+ const results: ExecuteNode[] = [];
174
+
175
+ switch (operation.type) {
176
+ case "rename-column":
177
+ results.push(next().renameColumn(operation.from, operation.to));
178
+ return results;
179
+
180
+ case "drop-column":
181
+ results.push(next().dropColumn(operation.name));
182
+ return results;
183
+
184
+ case "create-column": {
185
+ const col = operation.value;
186
+ results.push(
187
+ next().addColumn(
188
+ col.name,
189
+ sql.raw(this.getDBType(col)),
190
+ this.getColumnBuilderCallback(col),
191
+ ),
192
+ );
193
+ return results;
194
+ }
195
+
196
+ case "update-column": {
197
+ const col = operation.value;
198
+ // Check for ID columns first to provide a more specific error message
199
+ if (col.role === "external-id" || col.role === "internal-id") {
200
+ throw new Error(errors.IdColumnUpdate);
201
+ }
202
+ throw new Error(errors.SQLiteUpdateColumn);
203
+ }
204
+ }
205
+ }
206
+
207
+ private dropTable(
208
+ operation: Extract<MigrationOperation, { type: "drop-table" }>,
209
+ mapper?: TableNameMapper,
210
+ ): ExecuteNode {
211
+ return this.db.schema.dropTable(this.getTableName(operation.name, mapper));
212
+ }
213
+
214
+ private addIndex(
215
+ operation: Extract<MigrationOperation, { type: "add-index" }>,
216
+ mapper?: TableNameMapper,
217
+ ): ExecuteNode {
218
+ const tableName = this.getTableName(operation.table, mapper);
219
+
220
+ if (operation.unique) {
221
+ return createUniqueIndex(
222
+ this.db,
223
+ operation.name,
224
+ tableName,
225
+ operation.columns,
226
+ this.provider,
227
+ );
228
+ }
229
+
230
+ return this.db.schema.createIndex(operation.name).on(tableName).columns(operation.columns);
231
+ }
232
+
233
+ private dropIndex(
234
+ operation: Extract<MigrationOperation, { type: "drop-index" }>,
235
+ mapper?: TableNameMapper,
236
+ ): ExecuteNode {
237
+ const tableName = this.getTableName(operation.table, mapper);
238
+ return dropUniqueIndex(this.db, operation.name, tableName, this.provider);
239
+ }
240
+
241
+ private handleCustomOperation(
242
+ operation: Extract<MigrationOperation, { type: "custom" }>,
243
+ ): ExecuteNode {
244
+ const statement = sql.raw(operation["sql"] as string);
245
+ return this.rawToNode(statement);
246
+ }
247
+ }
@@ -1,413 +1,50 @@
1
- import {
2
- type ColumnBuilderCallback,
3
- type Compilable,
4
- type CreateTableBuilder,
5
- type Kysely,
6
- type RawBuilder,
7
- sql,
8
- } from "kysely";
9
- import {
10
- type CustomOperation,
11
- isUpdated,
12
- type ColumnOperation,
13
- type MigrationOperation,
14
- type ColumnInfo,
15
- } from "../../../migration-engine/shared";
16
- import type { SQLProvider } from "../../../shared/providers";
17
- import { schemaToDBType } from "../../../schema/serialize";
1
+ import type { CustomOperation, MigrationOperation } from "../../../migration-engine/shared";
18
2
  import type { KyselyConfig } from "../kysely-adapter";
19
3
  import type { TableNameMapper } from "../kysely-shared";
20
- import { SETTINGS_TABLE_NAME } from "../../../shared/settings-schema";
4
+ import type { ExecuteNode } from "./execute-base";
5
+ import { createMigrationExecutor } from "./execute-factory";
21
6
 
22
- export type ExecuteNode = Compilable & {
23
- execute(): Promise<unknown>;
24
- };
25
-
26
- type KyselyAny = Kysely<any>; // eslint-disable-line @typescript-eslint/no-explicit-any
27
-
28
- const errors = {
29
- IdColumnUpdate:
30
- "ID columns cannot be updated. Not every database supports updating primary keys and often requires workarounds.",
31
- SQLiteUpdateColumn: "SQLite doesn't support updating columns. Recreate the table instead.",
32
- SQLiteUpdateForeignKeys:
33
- "SQLite doesn't support modifying foreign keys directly. Use `recreate-table` instead.",
34
- } as const;
35
-
36
- /**
37
- * Returns the appropriate foreign key action based on the provider.
38
- * MSSQL doesn't support RESTRICT, so we use NO ACTION (functionally equivalent).
39
- */
40
- function getForeignKeyAction(provider: SQLProvider): "restrict" | "no action" {
41
- return provider === "mssql" ? "no action" : "restrict";
42
- }
7
+ export type { ExecuteNode };
43
8
 
44
9
  /**
45
- * Generates MSSQL default constraint name following the DF_tableName_columnName pattern.
10
+ * Execute a single migration operation using the appropriate provider-specific executor.
11
+ *
12
+ * @param operation - The migration operation to execute
13
+ * @param config - Kysely configuration with database instance and provider
14
+ * @param onCustomNode - Handler for custom operations
15
+ * @param mapper - Optional table name mapper for namespacing
16
+ * @returns ExecuteNode(s) that can be compiled to SQL or executed
46
17
  */
47
- function getMssqlDefaultConstraintName(tableName: string, columnName: string): string {
48
- const MSSQL_DEFAULT_CONSTRAINT_PREFIX = "DF" as const;
49
- return `${MSSQL_DEFAULT_CONSTRAINT_PREFIX}_${tableName}_${columnName}`;
50
- }
51
-
52
- function createUniqueIndex(
53
- db: KyselyAny,
54
- name: string,
55
- tableName: string,
56
- cols: string[],
57
- provider: SQLProvider,
58
- ) {
59
- const query = db.schema.createIndex(name).on(tableName).columns(cols).unique();
60
-
61
- if (provider === "mssql") {
62
- // MSSQL: ignore null values in unique indexes by default
63
- return query.where((b) => {
64
- return b.and(cols.map((col) => b(col, "is not", null)));
65
- });
66
- }
67
-
68
- return query;
69
- }
70
-
71
- function dropUniqueIndex(db: KyselyAny, name: string, tableName: string, provider: SQLProvider) {
72
- let query = db.schema.dropIndex(name).ifExists();
73
-
74
- if (provider === "cockroachdb") {
75
- query = query.cascade();
76
- }
77
-
78
- if (provider === "mssql") {
79
- query = query.on(tableName);
80
- }
81
-
82
- return query;
83
- }
84
-
85
- function executeColumn(
86
- tableName: string,
87
- operation: ColumnOperation,
88
- config: KyselyConfig,
89
- ): ExecuteNode[] {
90
- const { db, provider } = config;
91
- const next = () => db.schema.alterTable(tableName);
92
- const results: ExecuteNode[] = [];
93
-
94
- switch (operation.type) {
95
- case "rename-column":
96
- results.push(next().renameColumn(operation.from, operation.to));
97
- return results;
98
-
99
- case "drop-column":
100
- results.push(next().dropColumn(operation.name));
101
-
102
- return results;
103
- case "create-column": {
104
- const col = operation.value;
105
-
106
- results.push(
107
- next().addColumn(
108
- col.name,
109
- sql.raw(schemaToDBType(col, provider)),
110
- getColumnBuilderCallback(col, provider),
111
- ),
112
- );
113
-
114
- return results;
115
- }
116
- case "update-column": {
117
- const col = operation.value;
118
-
119
- if (col.role === "external-id" || col.role === "internal-id") {
120
- throw new Error(errors.IdColumnUpdate);
121
- }
122
- if (provider === "sqlite") {
123
- throw new Error(errors.SQLiteUpdateColumn);
124
- }
125
-
126
- if (!isUpdated(operation)) {
127
- return results;
128
- }
129
- if (provider === "mysql") {
130
- results.push(
131
- next().modifyColumn(
132
- operation.name,
133
- sql.raw(schemaToDBType(col, provider)),
134
- getColumnBuilderCallback(col, provider),
135
- ),
136
- );
137
- return results;
138
- }
139
-
140
- // MSSQL requires dropping and recreating default constraints when changing data type or default value
141
- const mssqlRecreateDefaultConstraint = operation.updateDataType || operation.updateDefault;
142
-
143
- if (provider === "mssql" && mssqlRecreateDefaultConstraint) {
144
- results.push(rawToNode(db, mssqlDropDefaultConstraint(tableName, col.name)));
145
- }
146
-
147
- // TODO: We should maybe do some of these operations in a single query
148
-
149
- if (operation.updateDataType) {
150
- const dbType = sql.raw(schemaToDBType(col, provider));
151
-
152
- if (provider === "postgresql" || provider === "cockroachdb") {
153
- // PostgreSQL/CockroachDB: Use explicit USING clause for type conversion
154
- results.push(
155
- rawToNode(
156
- db,
157
- sql`ALTER TABLE ${sql.ref(tableName)} ALTER COLUMN ${sql.ref(operation.name)} TYPE ${dbType} USING (${sql.ref(operation.name)}::${dbType})`,
158
- ),
159
- );
160
- } else {
161
- results.push(next().alterColumn(operation.name, (b) => b.setDataType(dbType)));
162
- }
163
- }
164
-
165
- if (operation.updateNullable) {
166
- results.push(
167
- next().alterColumn(operation.name, (build) =>
168
- col.isNullable ? build.dropNotNull() : build.setNotNull(),
169
- ),
170
- );
171
- }
172
-
173
- if (provider === "mssql" && mssqlRecreateDefaultConstraint) {
174
- const defaultValue = defaultValueToDB(col, provider);
175
-
176
- if (defaultValue) {
177
- const constraintName = getMssqlDefaultConstraintName(tableName, col.name);
178
-
179
- results.push(
180
- rawToNode(
181
- db,
182
- sql`ALTER TABLE ${sql.ref(tableName)} ADD CONSTRAINT ${sql.ref(constraintName)} DEFAULT ${defaultValue} FOR ${sql.ref(col.name)}`,
183
- ),
184
- );
185
- }
186
- } else if (operation.updateDefault) {
187
- const defaultValue = defaultValueToDB(col, provider);
188
-
189
- results.push(
190
- next().alterColumn(operation.name, (build) => {
191
- if (!defaultValue) {
192
- return build.dropDefault();
193
- }
194
- return build.setDefault(defaultValue);
195
- }),
196
- );
197
- }
198
-
199
- return results;
200
- }
201
- }
202
- }
203
-
204
18
  export function execute(
205
19
  operation: MigrationOperation,
206
20
  config: KyselyConfig,
207
21
  onCustomNode: (op: CustomOperation) => ExecuteNode | ExecuteNode[],
208
22
  mapper?: TableNameMapper,
209
23
  ): ExecuteNode | ExecuteNode[] {
210
- const { db, provider } = config;
211
-
212
- // Settings table is never namespaced
213
- const getTableName = (tableName: string) =>
214
- tableName === SETTINGS_TABLE_NAME
215
- ? tableName
216
- : mapper
217
- ? mapper.toPhysical(tableName)
218
- : tableName;
219
-
220
- function createTable(tableName: string, columns: ColumnInfo[]) {
221
- let builder = db.schema.createTable(getTableName(tableName)) as CreateTableBuilder<
222
- string,
223
- string
224
- >;
225
-
226
- // Add columns from the column info array
227
- for (const columnInfo of columns) {
228
- builder = builder.addColumn(
229
- columnInfo.name,
230
- sql.raw(schemaToDBType(columnInfo, provider)),
231
- getColumnBuilderCallback(columnInfo, provider),
232
- );
233
- }
234
-
235
- return builder;
236
- }
237
-
238
- switch (operation.type) {
239
- case "create-table":
240
- return createTable(operation.name, operation.columns);
241
- case "rename-table":
242
- if (provider === "mssql") {
243
- return rawToNode(
244
- db,
245
- sql`EXEC sp_rename ${sql.lit(getTableName(operation.from))}, ${sql.lit(getTableName(operation.to))}`,
246
- );
247
- }
248
-
249
- return db.schema
250
- .alterTable(getTableName(operation.from))
251
- .renameTo(getTableName(operation.to));
252
- case "alter-table": {
253
- const results: ExecuteNode[] = [];
254
-
255
- for (const op of operation.value) {
256
- results.push(...executeColumn(getTableName(operation.name), op, config));
257
- }
258
-
259
- return results;
260
- }
261
- case "drop-table":
262
- return db.schema.dropTable(getTableName(operation.name));
263
- case "custom":
264
- return onCustomNode(operation);
265
- case "add-foreign-key": {
266
- if (provider === "sqlite") {
267
- throw new Error(errors.SQLiteUpdateForeignKeys);
268
- }
269
-
270
- const { table, value } = operation;
271
- const action = getForeignKeyAction(provider);
272
-
273
- return db.schema
274
- .alterTable(getTableName(table))
275
- .addForeignKeyConstraint(
276
- value.name,
277
- value.columns,
278
- getTableName(value.referencedTable),
279
- value.referencedColumns,
280
- (b) => b.onUpdate(action).onDelete(action),
281
- );
282
- }
283
- case "drop-foreign-key": {
284
- if (provider === "sqlite") {
285
- throw new Error(errors.SQLiteUpdateForeignKeys);
286
- }
287
-
288
- const { table, name } = operation;
289
- let query = db.schema.alterTable(getTableName(table)).dropConstraint(name);
290
-
291
- // MySQL doesn't support IF EXISTS for dropping constraints
292
- if (provider !== "mysql") {
293
- query = query.ifExists();
294
- }
295
-
296
- return query;
297
- }
298
- case "add-index": {
299
- if (operation.unique) {
300
- return createUniqueIndex(
301
- db,
302
- operation.name,
303
- getTableName(operation.table),
304
- operation.columns,
305
- provider,
306
- );
307
- }
308
- return db.schema
309
- .createIndex(operation.name)
310
- .on(getTableName(operation.table))
311
- .columns(operation.columns);
312
- }
313
- case "drop-index": {
314
- return dropUniqueIndex(db, operation.name, getTableName(operation.table), provider);
315
- }
24
+ // For custom operations, use the provided handler
25
+ if (operation.type === "custom") {
26
+ return onCustomNode(operation);
316
27
  }
317
- }
318
-
319
- // ============================================================================
320
- // Helper Functions
321
- // ============================================================================
322
-
323
- function getColumnBuilderCallback(col: ColumnInfo, provider: SQLProvider): ColumnBuilderCallback {
324
- return (build) => {
325
- if (!col.isNullable) {
326
- build = build.notNull();
327
- }
328
-
329
- // Internal ID is the primary key with auto-increment
330
- if (col.role === "internal-id") {
331
- build = build.primaryKey();
332
- // Auto-increment for internal ID
333
- if (provider === "postgresql" || provider === "cockroachdb") {
334
- // SERIAL/BIGSERIAL handles auto-increment
335
- // Already handled in schemaToDBType
336
- } else if (provider === "mysql") {
337
- build = build.autoIncrement();
338
- } else if (provider === "sqlite") {
339
- build = build.autoIncrement();
340
- } else if (provider === "mssql") {
341
- build = build.identity();
342
- }
343
- }
344
28
 
345
- // External ID must be unique
346
- if (col.role === "external-id") {
347
- build = build.unique();
348
- }
349
-
350
- const defaultValue = defaultValueToDB(col, provider);
351
- if (defaultValue) {
352
- build = build.defaultTo(defaultValue);
353
- }
354
- return build;
355
- };
356
- }
357
-
358
- function rawToNode(db: KyselyAny, raw: RawBuilder<unknown>): ExecuteNode {
359
- return {
360
- compile() {
361
- return raw.compile(db);
362
- },
363
- execute() {
364
- return raw.execute(db);
365
- },
366
- };
367
- }
368
-
369
- function mssqlDropDefaultConstraint(tableName: string, columnName: string) {
370
- return sql`
371
- DECLARE @ConstraintName NVARCHAR(200);
372
-
373
- SELECT @ConstraintName = dc.name
374
- FROM sys.default_constraints dc
375
- JOIN sys.columns c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id
376
- JOIN sys.tables t ON t.object_id = c.object_id
377
- JOIN sys.schemas s ON t.schema_id = s.schema_id
378
- WHERE s.name = 'dbo' AND t.name = ${sql.lit(tableName)} AND c.name = ${sql.lit(columnName)};
379
-
380
- IF @ConstraintName IS NOT NULL
381
- BEGIN
382
- EXEC('ALTER TABLE [dbo].[' + ${sql.lit(tableName)} + '] DROP CONSTRAINT [' + @ConstraintName + ']');
383
- END`;
29
+ const executor = createMigrationExecutor(config);
30
+ return executor.executeOperation(operation, mapper);
384
31
  }
385
32
 
386
- function defaultValueToDB(column: ColumnInfo, provider: SQLProvider) {
387
- const value = column.default;
388
- if (!value) {
389
- return undefined;
390
- }
391
-
392
- // MySQL doesn't support default values for TEXT columns
393
- if (provider === "mysql" && column.type === "string") {
394
- return undefined;
395
- }
396
-
397
- // Static default values: defaultTo(value)
398
- if ("value" in value && value.value !== undefined) {
399
- return sql.lit(value.value);
400
- }
401
-
402
- // Database-level special functions: defaultTo(b => b.now())
403
- if ("dbSpecial" in value && value.dbSpecial === "now") {
404
- return sql`CURRENT_TIMESTAMP`;
405
- }
406
-
407
- // Runtime defaults (defaultTo$) are NOT generated in SQL - they're handled in application code
408
- if ("runtime" in value) {
409
- return undefined;
410
- }
411
-
412
- return undefined;
33
+ /**
34
+ * Preprocess a batch of migration operations.
35
+ * This allows provider-specific transformations before execution.
36
+ *
37
+ * For example, SQLite merges add-foreign-key operations into create-table operations
38
+ * since foreign keys must be defined at table creation time.
39
+ *
40
+ * @param operations - The migration operations to preprocess
41
+ * @param config - Kysely configuration with database instance and provider
42
+ * @returns Preprocessed migration operations
43
+ */
44
+ export function preprocessOperations(
45
+ operations: MigrationOperation[],
46
+ config: KyselyConfig,
47
+ ): MigrationOperation[] {
48
+ const executor = createMigrationExecutor(config);
49
+ return executor.preprocessOperations(operations);
413
50
  }