@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
@@ -189,7 +189,7 @@ describe("generateSchema", () => {
189
189
  it("should generate SQLite schema", () => {
190
190
  const generated = generateSchema([{ namespace: "test", schema: testSchema }], "sqlite");
191
191
  expect(generated).toMatchInlineSnapshot(`
192
- "import { sqliteTable, text, integer, uniqueIndex, index, blob, foreignKey } from "drizzle-orm/sqlite-core"
192
+ "import { sqliteTable, text, integer, uniqueIndex, index, foreignKey } from "drizzle-orm/sqlite-core"
193
193
  import { createId } from "@fragno-dev/db/id"
194
194
  import { relations } from "drizzle-orm"
195
195
 
@@ -201,7 +201,7 @@ describe("generateSchema", () => {
201
201
  id: text("id").notNull().$defaultFn(() => createId()),
202
202
  key: text("key").notNull(),
203
203
  value: text("value").notNull(),
204
- _internalId: integer("_internalId").primaryKey().autoincrement().notNull(),
204
+ _internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
205
205
  _version: integer("_version").notNull().default(0)
206
206
  }, (table) => [
207
207
  uniqueIndex("unique_key").on(table.key)
@@ -218,7 +218,7 @@ describe("generateSchema", () => {
218
218
  name: text("name").notNull(),
219
219
  email: text("email").notNull(),
220
220
  age: integer("age"),
221
- _internalId: integer("_internalId").primaryKey().autoincrement().notNull(),
221
+ _internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
222
222
  _version: integer("_version").notNull().default(0)
223
223
  }, (table) => [
224
224
  uniqueIndex("idx_email_test").on(table.email),
@@ -229,9 +229,9 @@ describe("generateSchema", () => {
229
229
  id: text("id").notNull().$defaultFn(() => createId()),
230
230
  title: text("title").notNull(),
231
231
  content: text("content").notNull(),
232
- userId: blob("userId", { mode: "bigint" }).notNull(),
232
+ userId: integer("userId").notNull(),
233
233
  viewCount: integer("viewCount").notNull().default(0),
234
- _internalId: integer("_internalId").primaryKey().autoincrement().notNull(),
234
+ _internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
235
235
  _version: integer("_version").notNull().default(0)
236
236
  }, (table) => [
237
237
  foreignKey({
@@ -612,7 +612,7 @@ describe("generateSchema", () => {
612
612
  it("should generate SQLite schema with many relations", () => {
613
613
  const generated = generateSchema([{ namespace: "test", schema: oneToManySchema }], "sqlite");
614
614
  expect(generated).toMatchInlineSnapshot(`
615
- "import { sqliteTable, text, integer, uniqueIndex, blob, foreignKey, index } from "drizzle-orm/sqlite-core"
615
+ "import { sqliteTable, text, integer, uniqueIndex, foreignKey, index } from "drizzle-orm/sqlite-core"
616
616
  import { createId } from "@fragno-dev/db/id"
617
617
  import { relations } from "drizzle-orm"
618
618
 
@@ -624,7 +624,7 @@ describe("generateSchema", () => {
624
624
  id: text("id").notNull().$defaultFn(() => createId()),
625
625
  key: text("key").notNull(),
626
626
  value: text("value").notNull(),
627
- _internalId: integer("_internalId").primaryKey().autoincrement().notNull(),
627
+ _internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
628
628
  _version: integer("_version").notNull().default(0)
629
629
  }, (table) => [
630
630
  uniqueIndex("unique_key").on(table.key)
@@ -639,7 +639,7 @@ describe("generateSchema", () => {
639
639
  export const users_test = sqliteTable("users_test", {
640
640
  id: text("id").notNull().$defaultFn(() => createId()),
641
641
  name: text("name").notNull(),
642
- _internalId: integer("_internalId").primaryKey().autoincrement().notNull(),
642
+ _internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
643
643
  _version: integer("_version").notNull().default(0)
644
644
  })
645
645
 
@@ -652,8 +652,8 @@ describe("generateSchema", () => {
652
652
  export const posts_test = sqliteTable("posts_test", {
653
653
  id: text("id").notNull().$defaultFn(() => createId()),
654
654
  title: text("title").notNull(),
655
- userId: blob("userId", { mode: "bigint" }).notNull(),
656
- _internalId: integer("_internalId").primaryKey().autoincrement().notNull(),
655
+ userId: integer("userId").notNull(),
656
+ _internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
657
657
  _version: integer("_version").notNull().default(0)
658
658
  }, (table) => [
659
659
  foreignKey({
@@ -1008,7 +1008,7 @@ describe("generateSchema", () => {
1008
1008
  it("should generate SQLite self-referencing foreign key using table parameter", () => {
1009
1009
  const generated = generateSchema([{ namespace: "test", schema: selfRefSchema }], "sqlite");
1010
1010
  expect(generated).toMatchInlineSnapshot(`
1011
- "import { sqliteTable, text, integer, uniqueIndex, blob, foreignKey, index } from "drizzle-orm/sqlite-core"
1011
+ "import { sqliteTable, text, integer, uniqueIndex, foreignKey, index } from "drizzle-orm/sqlite-core"
1012
1012
  import { createId } from "@fragno-dev/db/id"
1013
1013
  import { relations } from "drizzle-orm"
1014
1014
 
@@ -1020,7 +1020,7 @@ describe("generateSchema", () => {
1020
1020
  id: text("id").notNull().$defaultFn(() => createId()),
1021
1021
  key: text("key").notNull(),
1022
1022
  value: text("value").notNull(),
1023
- _internalId: integer("_internalId").primaryKey().autoincrement().notNull(),
1023
+ _internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
1024
1024
  _version: integer("_version").notNull().default(0)
1025
1025
  }, (table) => [
1026
1026
  uniqueIndex("unique_key").on(table.key)
@@ -1035,8 +1035,8 @@ describe("generateSchema", () => {
1035
1035
  export const comment_test = sqliteTable("comment_test", {
1036
1036
  id: text("id").notNull().$defaultFn(() => createId()),
1037
1037
  content: text("content").notNull(),
1038
- parentId: blob("parentId", { mode: "bigint" }),
1039
- _internalId: integer("_internalId").primaryKey().autoincrement().notNull(),
1038
+ parentId: integer("parentId"),
1039
+ _internalId: integer("_internalId").primaryKey({ autoIncrement: true }).notNull(),
1040
1040
  _version: integer("_version").notNull().default(0)
1041
1041
  }, (table) => [
1042
1042
  foreignKey({
@@ -1063,4 +1063,101 @@ describe("generateSchema", () => {
1063
1063
  `);
1064
1064
  });
1065
1065
  });
1066
+
1067
+ describe("namespace sanitization", () => {
1068
+ it("should sanitize namespace with special characters in foreign key references", () => {
1069
+ const generated = generateSchema(
1070
+ [{ namespace: "my-fragment-v2", schema: testSchema }],
1071
+ "postgresql",
1072
+ );
1073
+
1074
+ // Should generate valid JavaScript identifiers (underscores instead of hyphens)
1075
+ expect(generated).toContain("export const users_my_fragment_v2 =");
1076
+ expect(generated).toContain("export const posts_my_fragment_v2 =");
1077
+
1078
+ // Foreign key should reference sanitized table name
1079
+ expect(generated).toContain("foreignColumns: [users_my_fragment_v2._internalId]");
1080
+
1081
+ // Relations should also use sanitized names
1082
+ expect(generated).toContain("author: one(users_my_fragment_v2");
1083
+ expect(generated).toContain("fields: [posts_my_fragment_v2.userId]");
1084
+ expect(generated).toContain("references: [users_my_fragment_v2._internalId]");
1085
+
1086
+ // Physical table names in the database can keep hyphens
1087
+ expect(generated).toContain('pgTable("users_my-fragment-v2"');
1088
+ expect(generated).toContain('pgTable("posts_my-fragment-v2"');
1089
+
1090
+ expect(generated).toMatchInlineSnapshot(`
1091
+ "import { pgTable, varchar, text, bigserial, integer, uniqueIndex, index, bigint, foreignKey } from "drizzle-orm/pg-core"
1092
+ import { createId } from "@fragno-dev/db/id"
1093
+ import { relations } from "drizzle-orm"
1094
+
1095
+ // ============================================================================
1096
+ // Settings Table (shared across all fragments)
1097
+ // ============================================================================
1098
+
1099
+ export const fragno_db_settings = pgTable("fragno_db_settings", {
1100
+ id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
1101
+ key: text("key").notNull(),
1102
+ value: text("value").notNull(),
1103
+ _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
1104
+ _version: integer("_version").notNull().default(0)
1105
+ }, (table) => [
1106
+ uniqueIndex("unique_key").on(table.key)
1107
+ ])
1108
+
1109
+ export const fragnoDbSettingSchemaVersion = 1;
1110
+
1111
+ // ============================================================================
1112
+ // Fragment: my-fragment-v2
1113
+ // ============================================================================
1114
+
1115
+ export const users_my_fragment_v2 = pgTable("users_my-fragment-v2", {
1116
+ id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
1117
+ name: text("name").notNull(),
1118
+ email: text("email").notNull(),
1119
+ age: integer("age"),
1120
+ _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
1121
+ _version: integer("_version").notNull().default(0)
1122
+ }, (table) => [
1123
+ uniqueIndex("idx_email_my-fragment-v2").on(table.email),
1124
+ index("idx_name_my-fragment-v2").on(table.name)
1125
+ ])
1126
+
1127
+ export const posts_my_fragment_v2 = pgTable("posts_my-fragment-v2", {
1128
+ id: varchar("id", { length: 30 }).notNull().$defaultFn(() => createId()),
1129
+ title: text("title").notNull(),
1130
+ content: text("content").notNull(),
1131
+ userId: bigint("userId", { mode: "number" }).notNull(),
1132
+ viewCount: integer("viewCount").notNull().default(0),
1133
+ _internalId: bigserial("_internalId", { mode: "number" }).primaryKey().notNull(),
1134
+ _version: integer("_version").notNull().default(0)
1135
+ }, (table) => [
1136
+ foreignKey({
1137
+ columns: [table.userId],
1138
+ foreignColumns: [users_my_fragment_v2._internalId],
1139
+ name: "fk_posts_users_author_my-fragment-v2"
1140
+ }),
1141
+ index("idx_user_my-fragment-v2").on(table.userId),
1142
+ index("idx_title_my-fragment-v2").on(table.title)
1143
+ ])
1144
+
1145
+ export const posts_my_fragment_v2Relations = relations(posts_my_fragment_v2, ({ one }) => ({
1146
+ author: one(users_my_fragment_v2, {
1147
+ relationName: "posts_users",
1148
+ fields: [posts_my_fragment_v2.userId],
1149
+ references: [users_my_fragment_v2._internalId]
1150
+ })
1151
+ }));
1152
+
1153
+ export const my_fragment_v2_schema = {
1154
+ "users_my-fragment-v2": users_my_fragment_v2,
1155
+ users: users_my_fragment_v2,
1156
+ "posts_my-fragment-v2": posts_my_fragment_v2,
1157
+ posts: posts_my_fragment_v2,
1158
+ schemaVersion: 3
1159
+ }"
1160
+ `);
1161
+ });
1162
+ });
1066
1163
  });
@@ -248,12 +248,16 @@ function generateColumnDefinition(
248
248
 
249
249
  // Primary key for internal ID
250
250
  if (column instanceof InternalIdColumn || column.role === "internal-id") {
251
- parts.push("primaryKey()");
252
-
253
- // Auto-increment based on provider
254
- // Note: PostgreSQL uses bigserial/serial which handle auto-increment automatically
255
- if (ctx.provider === "mysql" || ctx.provider === "sqlite") {
251
+ if (ctx.provider === "sqlite") {
252
+ // SQLite uses primaryKey({ autoIncrement: true })
253
+ parts.push("primaryKey({ autoIncrement: true })");
254
+ } else if (ctx.provider === "mysql") {
255
+ // MySQL uses primaryKey().autoincrement()
256
+ parts.push("primaryKey()");
256
257
  parts.push("autoincrement()");
258
+ } else {
259
+ // PostgreSQL just uses primaryKey()
260
+ parts.push("primaryKey()");
257
261
  }
258
262
  }
259
263
 
@@ -334,8 +338,9 @@ function generateForeignKeys(ctx: GeneratorContext, table: AnyTable, namespace?:
334
338
  foreignColumns.push(`table.${actualRefCol}`);
335
339
  } else {
336
340
  // Suffix the foreign table reference with namespace if provided
337
- const foreignTableRef =
338
- mapper && namespace ? mapper.toPhysical(relation.table.ormName) : relation.table.ormName;
341
+ const foreignTableRef = namespace
342
+ ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`
343
+ : relation.table.ormName;
339
344
  foreignColumns.push(`${foreignTableRef}.${actualRefCol}`);
340
345
  }
341
346
  }
@@ -4,7 +4,7 @@ import type { DatabaseAdapter } from "../adapters";
4
4
  import { createMigrator, type Migrator } from "../../migration-engine/create";
5
5
  import type { AnySchema } from "../../schema/create";
6
6
  import type { CustomOperation, MigrationOperation } from "../../migration-engine/shared";
7
- import { execute } from "./migration/execute";
7
+ import { execute, preprocessOperations } from "./migration/execute";
8
8
  import type { AbstractQuery } from "../../query/query";
9
9
  import { fromKysely } from "./kysely-query";
10
10
  import { createTableNameMapper } from "./kysely-shared";
@@ -47,40 +47,50 @@ export class KyselyAdapter implements DatabaseAdapter {
47
47
  const manager = createSettingsManager(this.#kyselyConfig.db, namespace);
48
48
  const mapper = namespace ? createTableNameMapper(namespace) : undefined;
49
49
 
50
- const onCustomNode = (node: CustomOperation, db: KyselyAny) => {
51
- const statement = sql.raw(node["sql"] as string);
50
+ const preprocessMigrationOperations = (operations: MigrationOperation[]) => {
51
+ let preprocessed = preprocessOperations(operations, this.#kyselyConfig);
52
52
 
53
- return {
54
- compile() {
55
- return statement.compile(db);
56
- },
57
- execute() {
58
- return statement.execute(db);
59
- },
60
- };
61
- };
62
-
63
- const preprocess = (operations: MigrationOperation[], db: KyselyAny) => {
64
53
  if (this.#kyselyConfig.provider === "mysql") {
65
- operations.unshift({ type: "custom", sql: "SET FOREIGN_KEY_CHECKS = 0" });
66
- operations.push({ type: "custom", sql: "SET FOREIGN_KEY_CHECKS = 1" });
67
- } else if (this.#kyselyConfig.provider === "sqlite") {
68
- operations.unshift({
69
- type: "custom",
70
- sql: "PRAGMA defer_foreign_keys = ON",
71
- });
54
+ preprocessed.unshift({ type: "custom", sql: "SET FOREIGN_KEY_CHECKS = 0" });
55
+ preprocessed.push({ type: "custom", sql: "SET FOREIGN_KEY_CHECKS = 1" });
72
56
  }
73
57
 
58
+ return preprocessed;
59
+ };
60
+
61
+ // Convert operations to executable nodes bound to specific db instance
62
+ const toExecutableNodes = (operations: MigrationOperation[], db: KyselyAny) => {
63
+ const onCustomNode = (node: CustomOperation, db: KyselyAny) => {
64
+ const statement = sql.raw(node["sql"] as string);
65
+
66
+ return {
67
+ compile() {
68
+ return statement.compile(db);
69
+ },
70
+ execute() {
71
+ return statement.execute(db);
72
+ },
73
+ };
74
+ };
75
+
76
+ const dbConfig: KyselyConfig = { db, provider: this.#kyselyConfig.provider };
74
77
  return operations.flatMap((op) =>
75
- execute(op, this.#kyselyConfig, (node) => onCustomNode(node, db), mapper),
78
+ execute(op, dbConfig, (node) => onCustomNode(node, db), mapper),
76
79
  );
77
80
  };
78
81
 
79
82
  const migrator = createMigrator({
80
83
  schema,
81
84
  executor: async (operations) => {
85
+ // For SQLite, execute PRAGMA defer_foreign_keys BEFORE transaction
86
+ if (this.#kyselyConfig.provider === "sqlite") {
87
+ await sql.raw("PRAGMA defer_foreign_keys = ON").execute(this.#kyselyConfig.db);
88
+ }
89
+
82
90
  await this.#kyselyConfig.db.transaction().execute(async (tx) => {
83
- for (const node of preprocess(operations, tx)) {
91
+ const preprocessed = preprocessMigrationOperations(operations);
92
+ const nodes = toExecutableNodes(preprocessed, tx);
93
+ for (const node of nodes) {
84
94
  try {
85
95
  await node.execute();
86
96
  } catch (e) {
@@ -92,11 +102,20 @@ export class KyselyAdapter implements DatabaseAdapter {
92
102
  },
93
103
  sql: {
94
104
  toSql: (operations) => {
95
- const compiled = preprocess(operations, this.#kyselyConfig.db).map(
96
- (m) => `${m.compile().sql};`,
97
- );
105
+ const parts: string[] = [];
106
+
107
+ // Add SQLite PRAGMA at the beginning
108
+ if (this.#kyselyConfig.provider === "sqlite") {
109
+ parts.push("PRAGMA defer_foreign_keys = ON;");
110
+ }
111
+
112
+ const preprocessed = preprocessMigrationOperations(operations);
113
+ const nodes = toExecutableNodes(preprocessed, this.#kyselyConfig.db);
114
+ const compiled = nodes.map((node) => `${node.compile().sql};`);
115
+
116
+ parts.push(...compiled);
98
117
 
99
- return compiled.join("\n\n");
118
+ return parts.join("\n\n");
100
119
  },
101
120
  },
102
121
 
@@ -0,0 +1,256 @@
1
+ import { type ColumnBuilderCallback, type Kysely, type RawBuilder, sql } from "kysely";
2
+ import type {
3
+ ColumnInfo,
4
+ MigrationOperation,
5
+ MigrationOperationMetadata,
6
+ } from "../../../migration-engine/shared";
7
+ import type { SQLProvider } from "../../../shared/providers";
8
+ import { schemaToDBType } from "../../../schema/serialize";
9
+ import type { TableNameMapper } from "../kysely-shared";
10
+ import { SETTINGS_TABLE_NAME } from "../../../shared/settings-schema";
11
+
12
+ export type ExecuteNode = {
13
+ compile(): { sql: string; parameters: readonly unknown[] };
14
+ execute(): Promise<unknown>;
15
+ };
16
+
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
+ type KyselyAny = Kysely<any>;
19
+
20
+ /**
21
+ * Migration executor interface.
22
+ * Each provider implements this to handle database-specific migration execution.
23
+ */
24
+ export interface MigrationExecutor<
25
+ TMeta extends MigrationOperationMetadata = MigrationOperationMetadata,
26
+ > {
27
+ /**
28
+ * Preprocess operations before execution.
29
+ * Allows executors to combine, split, or transform operations based on provider capabilities.
30
+ *
31
+ * For example, SQLite can merge add-foreign-key operations into create-table operations.
32
+ */
33
+ preprocessOperations(operations: MigrationOperation[]): MigrationOperation<TMeta>[];
34
+
35
+ /**
36
+ * Execute a single migration operation.
37
+ */
38
+ executeOperation(
39
+ operation: MigrationOperation<TMeta>,
40
+ mapper?: TableNameMapper,
41
+ ): ExecuteNode | ExecuteNode[];
42
+ }
43
+
44
+ /**
45
+ * Base migration executor with common functionality.
46
+ * Provider-specific executors should extend this class.
47
+ */
48
+ export abstract class BaseMigrationExecutor<
49
+ TMeta extends MigrationOperationMetadata = MigrationOperationMetadata,
50
+ > implements MigrationExecutor<TMeta>
51
+ {
52
+ constructor(
53
+ protected readonly db: KyselyAny,
54
+ protected readonly provider: SQLProvider,
55
+ ) {}
56
+
57
+ /**
58
+ * Default implementation: no preprocessing, no metadata.
59
+ * Providers can override to transform operations.
60
+ */
61
+ preprocessOperations(operations: MigrationOperation[]): MigrationOperation<TMeta>[] {
62
+ return operations as MigrationOperation<TMeta>[];
63
+ }
64
+
65
+ /**
66
+ * Execute a single migration operation.
67
+ * Must be implemented by provider-specific executors.
68
+ */
69
+ abstract executeOperation(
70
+ operation: MigrationOperation<TMeta>,
71
+ mapper?: TableNameMapper,
72
+ ): ExecuteNode | ExecuteNode[];
73
+
74
+ /**
75
+ * Get table name, applying namespace mapping if provided.
76
+ * Settings table is never namespaced.
77
+ */
78
+ protected getTableName(tableName: string, mapper?: TableNameMapper): string {
79
+ return tableName === SETTINGS_TABLE_NAME
80
+ ? tableName
81
+ : mapper
82
+ ? mapper.toPhysical(tableName)
83
+ : tableName;
84
+ }
85
+
86
+ /**
87
+ * Get column builder callback for creating/altering columns.
88
+ */
89
+ protected getColumnBuilderCallback(col: ColumnInfo): ColumnBuilderCallback {
90
+ return (build) => {
91
+ if (!col.isNullable) {
92
+ build = build.notNull();
93
+ }
94
+
95
+ // Internal ID is the primary key with auto-increment
96
+ if (col.role === "internal-id") {
97
+ build = build.primaryKey();
98
+ // Auto-increment for internal ID
99
+ if (this.provider === "postgresql" || this.provider === "cockroachdb") {
100
+ // SERIAL/BIGSERIAL handles auto-increment
101
+ // Already handled in schemaToDBType
102
+ } else if (this.provider === "mysql") {
103
+ build = build.autoIncrement();
104
+ } else if (this.provider === "sqlite") {
105
+ build = build.autoIncrement();
106
+ } else if (this.provider === "mssql") {
107
+ build = build.identity();
108
+ }
109
+ }
110
+
111
+ // External ID must be unique
112
+ if (col.role === "external-id") {
113
+ build = build.unique();
114
+ }
115
+
116
+ const defaultValue = this.defaultValueToDB(col);
117
+ if (defaultValue) {
118
+ build = build.defaultTo(defaultValue);
119
+ }
120
+ return build;
121
+ };
122
+ }
123
+
124
+ /**
125
+ * Convert column default value to database representation.
126
+ */
127
+ protected defaultValueToDB(column: ColumnInfo): RawBuilder<unknown> | undefined {
128
+ const value = column.default;
129
+ if (!value) {
130
+ return undefined;
131
+ }
132
+
133
+ // MySQL doesn't support default values for TEXT columns
134
+ if (this.provider === "mysql" && column.type === "string") {
135
+ return undefined;
136
+ }
137
+
138
+ // Static default values: defaultTo(value)
139
+ if ("value" in value && value.value !== undefined) {
140
+ return sql.lit(value.value);
141
+ }
142
+
143
+ // Database-level special functions: defaultTo(b => b.now())
144
+ if ("dbSpecial" in value && value.dbSpecial === "now") {
145
+ return sql`CURRENT_TIMESTAMP`;
146
+ }
147
+
148
+ // Runtime defaults (defaultTo$) are NOT generated in SQL - they're handled in application code
149
+ if ("runtime" in value) {
150
+ return undefined;
151
+ }
152
+
153
+ return undefined;
154
+ }
155
+
156
+ /**
157
+ * Wrap a raw SQL builder in an ExecuteNode.
158
+ */
159
+ protected rawToNode(raw: RawBuilder<unknown>): ExecuteNode {
160
+ return {
161
+ compile: () => raw.compile(this.db),
162
+ execute: () => raw.execute(this.db),
163
+ };
164
+ }
165
+
166
+ /**
167
+ * Get the database type string for a column.
168
+ */
169
+ protected getDBType(col: ColumnInfo): string {
170
+ return schemaToDBType(col, this.provider);
171
+ }
172
+ }
173
+
174
+ // ============================================================================
175
+ // Provider-Specific Helper Functions
176
+ // ============================================================================
177
+
178
+ /**
179
+ * Returns the appropriate foreign key action based on the provider.
180
+ * MSSQL doesn't support RESTRICT, so we use NO ACTION (functionally equivalent).
181
+ */
182
+ export function getForeignKeyAction(provider: SQLProvider): "restrict" | "no action" {
183
+ return provider === "mssql" ? "no action" : "restrict";
184
+ }
185
+
186
+ /**
187
+ * Generates MSSQL default constraint name following the DF_tableName_columnName pattern.
188
+ */
189
+ export function getMssqlDefaultConstraintName(tableName: string, columnName: string): string {
190
+ const MSSQL_DEFAULT_CONSTRAINT_PREFIX = "DF" as const;
191
+ return `${MSSQL_DEFAULT_CONSTRAINT_PREFIX}_${tableName}_${columnName}`;
192
+ }
193
+
194
+ /**
195
+ * Generate SQL to drop MSSQL default constraint.
196
+ */
197
+ export function mssqlDropDefaultConstraint(tableName: string, columnName: string) {
198
+ return sql`
199
+ DECLARE @ConstraintName NVARCHAR(200);
200
+
201
+ SELECT @ConstraintName = dc.name
202
+ FROM sys.default_constraints dc
203
+ JOIN sys.columns c ON dc.parent_object_id = c.object_id AND dc.parent_column_id = c.column_id
204
+ JOIN sys.tables t ON t.object_id = c.object_id
205
+ JOIN sys.schemas s ON t.schema_id = s.schema_id
206
+ WHERE s.name = 'dbo' AND t.name = ${sql.lit(tableName)} AND c.name = ${sql.lit(columnName)};
207
+
208
+ IF @ConstraintName IS NOT NULL
209
+ BEGIN
210
+ EXEC('ALTER TABLE [dbo].[' + ${sql.lit(tableName)} + '] DROP CONSTRAINT [' + @ConstraintName + ']');
211
+ END`;
212
+ }
213
+
214
+ /**
215
+ * Create a unique index with provider-specific handling.
216
+ */
217
+ export function createUniqueIndex(
218
+ db: KyselyAny,
219
+ name: string,
220
+ tableName: string,
221
+ cols: string[],
222
+ provider: SQLProvider,
223
+ ) {
224
+ const query = db.schema.createIndex(name).on(tableName).columns(cols).unique();
225
+
226
+ if (provider === "mssql") {
227
+ // MSSQL: ignore null values in unique indexes by default
228
+ return query.where((b) => {
229
+ return b.and(cols.map((col) => b(col, "is not", null)));
230
+ });
231
+ }
232
+
233
+ return query;
234
+ }
235
+
236
+ /**
237
+ * Drop a unique index with provider-specific handling.
238
+ */
239
+ export function dropUniqueIndex(
240
+ db: KyselyAny,
241
+ name: string,
242
+ tableName: string,
243
+ provider: SQLProvider,
244
+ ) {
245
+ let query = db.schema.dropIndex(name).ifExists();
246
+
247
+ if (provider === "cockroachdb") {
248
+ query = query.cascade();
249
+ }
250
+
251
+ if (provider === "mssql") {
252
+ query = query.on(tableName);
253
+ }
254
+
255
+ return query;
256
+ }
@@ -0,0 +1,30 @@
1
+ import type { KyselyConfig } from "../kysely-adapter";
2
+ import type { MigrationExecutor } from "./execute-base";
3
+ import { SqliteMigrationExecutor } from "./execute-sqlite";
4
+ import { PostgresMigrationExecutor } from "./execute-postgres";
5
+ import { MysqlMigrationExecutor } from "./execute-mysql";
6
+ import { MssqlMigrationExecutor } from "./execute-mssql";
7
+
8
+ /**
9
+ * Create a provider-specific migration executor.
10
+ */
11
+ export function createMigrationExecutor(config: KyselyConfig): MigrationExecutor {
12
+ const { db, provider } = config;
13
+
14
+ switch (provider) {
15
+ case "sqlite":
16
+ return new SqliteMigrationExecutor(db, provider);
17
+ case "postgresql":
18
+ case "cockroachdb":
19
+ return new PostgresMigrationExecutor(db, provider);
20
+ case "mysql":
21
+ return new MysqlMigrationExecutor(db, provider);
22
+ case "mssql":
23
+ return new MssqlMigrationExecutor(db, provider);
24
+ default: {
25
+ // Ensure exhaustive switch
26
+ const _exhaustive: never = provider;
27
+ throw new Error(`Unsupported provider: ${_exhaustive}`);
28
+ }
29
+ }
30
+ }