@fragno-dev/db 0.1.1 → 0.1.3

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 (222) hide show
  1. package/.turbo/turbo-build.log +196 -137
  2. package/CHANGELOG.md +18 -0
  3. package/LICENSE.md +16 -0
  4. package/dist/adapters/adapters.d.ts +11 -1
  5. package/dist/adapters/adapters.d.ts.map +1 -1
  6. package/dist/adapters/drizzle/drizzle-adapter.d.ts +9 -2
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  8. package/dist/adapters/drizzle/drizzle-adapter.js +23 -39
  9. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  10. package/dist/adapters/drizzle/drizzle-query.d.ts.map +1 -1
  11. package/dist/adapters/drizzle/drizzle-query.js +5 -4
  12. package/dist/adapters/drizzle/drizzle-query.js.map +1 -1
  13. package/dist/adapters/drizzle/drizzle-uow-compiler.js +12 -10
  14. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +1 -1
  15. package/dist/adapters/drizzle/drizzle-uow-decoder.js +14 -4
  16. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +1 -1
  17. package/dist/adapters/drizzle/drizzle-uow-executor.js +78 -60
  18. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +1 -1
  19. package/dist/adapters/drizzle/generate.js +111 -37
  20. package/dist/adapters/drizzle/generate.js.map +1 -1
  21. package/dist/adapters/drizzle/shared.js +14 -1
  22. package/dist/adapters/drizzle/shared.js.map +1 -1
  23. package/dist/adapters/kysely/kysely-adapter.d.ts +2 -1
  24. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  25. package/dist/adapters/kysely/kysely-adapter.js +25 -30
  26. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  27. package/dist/adapters/kysely/kysely-query-builder.js +48 -44
  28. package/dist/adapters/kysely/kysely-query-builder.js.map +1 -1
  29. package/dist/adapters/kysely/kysely-query-compiler.js +2 -2
  30. package/dist/adapters/kysely/kysely-query-compiler.js.map +1 -1
  31. package/dist/adapters/kysely/kysely-query.js +3 -2
  32. package/dist/adapters/kysely/kysely-query.js.map +1 -1
  33. package/dist/adapters/kysely/kysely-shared.js +18 -0
  34. package/dist/adapters/kysely/kysely-shared.js.map +1 -0
  35. package/dist/adapters/kysely/kysely-uow-compiler.js +4 -3
  36. package/dist/adapters/kysely/kysely-uow-compiler.js.map +1 -1
  37. package/dist/adapters/kysely/migration/execute.js +15 -12
  38. package/dist/adapters/kysely/migration/execute.js.map +1 -1
  39. package/dist/migration-engine/auto-from-schema.js +2 -8
  40. package/dist/migration-engine/auto-from-schema.js.map +1 -1
  41. package/dist/migration-engine/create.d.ts +1 -5
  42. package/dist/migration-engine/create.js +1 -1
  43. package/dist/migration-engine/create.js.map +1 -1
  44. package/dist/migration-engine/generation-engine.d.ts +51 -0
  45. package/dist/migration-engine/generation-engine.d.ts.map +1 -0
  46. package/dist/migration-engine/generation-engine.js +165 -0
  47. package/dist/migration-engine/generation-engine.js.map +1 -0
  48. package/dist/migration-engine/shared.d.ts +5 -2
  49. package/dist/migration-engine/shared.d.ts.map +1 -1
  50. package/dist/migration-engine/shared.js.map +1 -1
  51. package/dist/mod.d.ts +0 -8
  52. package/dist/mod.d.ts.map +1 -1
  53. package/dist/mod.js +0 -32
  54. package/dist/mod.js.map +1 -1
  55. 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
  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/alias.js.map +1 -0
  57. 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
  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/casing.js.map +1 -0
  59. 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
  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/column-builder.js.map +1 -0
  61. 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
  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/column.js.map +1 -0
  63. 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
  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/entity.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/errors.js +21 -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/errors.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/pg-core/columns/common.js +1 -1
  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/pg-core/columns/common.js.map +1 -0
  69. 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
  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/pg-core/columns/enum.js.map +1 -0
  71. 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
  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/pg-core/foreign-keys.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/pg-core/unique-constraint.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/pg-core/unique-constraint.js.map +1 -0
  75. 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
  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/pg-core/utils/array.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/query-builders/query-builder.js +14 -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/query-builders/query-builder.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/query-promise.js +26 -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/query-promise.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/relations.js +127 -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/relations.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/selection-proxy.js +47 -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/selection-proxy.js.map +1 -0
  85. 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
  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/sql/expressions/conditions.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/sql/expressions/select.js +13 -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/sql/expressions/select.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/sql/functions/aggregate.js +10 -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/sql/functions/aggregate.js.map +1 -0
  91. 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
  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/sql/sql.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/columns/common.js +60 -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/columns/common.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/db.js +269 -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/db.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/dialect.js +457 -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/dialect.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/foreign-keys.js +68 -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/foreign-keys.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/query-builders/count.js +41 -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/query-builders/count.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/query-builders/delete.js +119 -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/query-builders/delete.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/query-builders/insert.js +170 -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/query-builders/insert.js.map +1 -0
  107. 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
  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/sqlite-core/query-builders/query-builder.js.map +1 -0
  109. 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
  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/sqlite-core/query-builders/query.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/sqlite-core/query-builders/raw.js +37 -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/sqlite-core/query-builders/raw.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/sqlite-core/query-builders/select.js +621 -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/sqlite-core/query-builders/select.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/sqlite-core/query-builders/update.js +170 -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/sqlite-core/query-builders/update.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/sqlite-core/table.js +20 -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/sqlite-core/table.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/sqlite-core/unique-constraint.js +48 -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/sqlite-core/unique-constraint.js.map +1 -0
  121. 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
  122. 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
  123. 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
  124. 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
  125. 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
  126. 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
  127. 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
  128. 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
  129. 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
  130. 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
  131. 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
  132. 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
  133. 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
  134. 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
  135. 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
  136. 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
  137. 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
  138. 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
  139. package/dist/query/condition-builder.js.map +1 -1
  140. package/dist/query/result-transform.js +2 -1
  141. package/dist/query/result-transform.js.map +1 -1
  142. package/dist/schema/create.d.ts +74 -16
  143. package/dist/schema/create.d.ts.map +1 -1
  144. package/dist/schema/create.js +76 -11
  145. package/dist/schema/create.js.map +1 -1
  146. package/dist/schema/serialize.js +3 -0
  147. package/dist/schema/serialize.js.map +1 -1
  148. package/dist/shared/settings-schema.js +36 -0
  149. package/dist/shared/settings-schema.js.map +1 -0
  150. package/dist/util/import-generator.js.map +1 -1
  151. package/dist/util/parse.js.map +1 -1
  152. package/package.json +20 -23
  153. package/src/adapters/adapters.ts +10 -3
  154. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +11 -7
  155. package/src/adapters/drizzle/drizzle-adapter-sqlite.test.ts +585 -0
  156. package/src/adapters/drizzle/drizzle-adapter.test.ts +78 -30
  157. package/src/adapters/drizzle/drizzle-adapter.ts +38 -78
  158. package/src/adapters/drizzle/drizzle-query.ts +6 -9
  159. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +10 -4
  160. package/src/adapters/drizzle/drizzle-uow-compiler.ts +12 -6
  161. package/src/adapters/drizzle/drizzle-uow-decoder.ts +22 -5
  162. package/src/adapters/drizzle/drizzle-uow-executor.ts +156 -116
  163. package/src/adapters/drizzle/generate.test.ts +582 -159
  164. package/src/adapters/drizzle/generate.ts +196 -41
  165. package/src/adapters/drizzle/migrate-drizzle.test.ts +30 -6
  166. package/src/adapters/drizzle/shared.ts +31 -1
  167. package/src/adapters/drizzle/test-utils.ts +3 -1
  168. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +25 -27
  169. package/src/adapters/kysely/kysely-adapter.ts +35 -58
  170. package/src/adapters/kysely/kysely-query-builder.ts +75 -44
  171. package/src/adapters/kysely/kysely-query-compiler.ts +3 -1
  172. package/src/adapters/kysely/kysely-query.ts +8 -2
  173. package/src/adapters/kysely/kysely-shared.ts +23 -0
  174. package/src/adapters/kysely/kysely-uow-compiler.ts +5 -2
  175. package/src/adapters/kysely/migration/execute-mysql.test.ts +2 -2
  176. package/src/adapters/kysely/migration/execute-postgres.test.ts +19 -19
  177. package/src/adapters/kysely/migration/execute.ts +48 -17
  178. package/src/adapters/kysely/migration/kysely-migrator.test.ts +19 -37
  179. package/src/fragment.test.ts +1 -0
  180. package/src/migration-engine/auto-from-schema.ts +14 -18
  181. package/src/migration-engine/create.ts +1 -6
  182. package/src/migration-engine/generation-engine.test.ts +597 -0
  183. package/src/migration-engine/generation-engine.ts +356 -0
  184. package/src/migration-engine/shared.ts +1 -4
  185. package/src/mod.ts +0 -66
  186. package/src/query/condition-builder.ts +24 -8
  187. package/src/query/result-transform.ts +7 -1
  188. package/src/schema/create.test.ts +4 -1
  189. package/src/schema/create.ts +132 -24
  190. package/src/schema/serialize.test.ts +1 -0
  191. package/src/schema/serialize.ts +28 -7
  192. package/src/shared/settings-schema.ts +61 -0
  193. package/src/util/deep-equal.ts +21 -7
  194. package/src/util/import-generator.ts +3 -1
  195. package/src/util/parse.ts +3 -1
  196. package/tsdown.config.ts +1 -0
  197. package/.turbo/turbo-test.log +0 -37
  198. package/.turbo/turbo-types$colon$check.log +0 -1
  199. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column-builder.js.map +0 -1
  200. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column.js.map +0 -1
  201. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/entity.js.map +0 -1
  202. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/common.js.map +0 -1
  203. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/enum.js.map +0 -1
  204. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/foreign-keys.js.map +0 -1
  205. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/unique-constraint.js.map +0 -1
  206. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/utils/array.js.map +0 -1
  207. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/conditions.js.map +0 -1
  208. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/select.js +0 -13
  209. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/select.js.map +0 -1
  210. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/functions/aggregate.js +0 -10
  211. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/functions/aggregate.js.map +0 -1
  212. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/sql.js.map +0 -1
  213. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/subquery.js.map +0 -1
  214. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.js.map +0 -1
  215. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.utils.js +0 -6
  216. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.utils.js.map +0 -1
  217. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing-utils.js +0 -8
  218. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing-utils.js.map +0 -1
  219. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing.js +0 -8
  220. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing.js.map +0 -1
  221. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/view-common.js +0 -6
  222. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/view-common.js.map +0 -1
@@ -8,6 +8,8 @@ import {
8
8
  } from "../../schema/create";
9
9
  import type { SQLProvider } from "../../shared/providers";
10
10
  import { schemaToDBType, type DBTypeLiteral } from "../../schema/serialize";
11
+ import { createTableNameMapper } from "./shared";
12
+ import { settingsSchema, SETTINGS_TABLE_NAME } from "../../shared/settings-schema";
11
13
 
12
14
  // ============================================================================
13
15
  // PROVIDER CONFIGURATION
@@ -246,12 +248,16 @@ function generateColumnDefinition(
246
248
 
247
249
  // Primary key for internal ID
248
250
  if (column instanceof InternalIdColumn || column.role === "internal-id") {
249
- parts.push("primaryKey()");
250
-
251
- // Auto-increment based on provider
252
- // Note: PostgreSQL uses bigserial/serial which handle auto-increment automatically
253
- 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()");
254
257
  parts.push("autoincrement()");
258
+ } else {
259
+ // PostgreSQL just uses primaryKey()
260
+ parts.push("primaryKey()");
255
261
  }
256
262
  }
257
263
 
@@ -263,6 +269,7 @@ function generateColumnDefinition(
263
269
  // Default values
264
270
  if (column.default) {
265
271
  if ("value" in column.default) {
272
+ // Static defaults: defaultTo(value)
266
273
  let value: string;
267
274
  if (typeof column.default.value === "bigint") {
268
275
  ctx.imports.addImport("sql", "drizzle-orm");
@@ -271,12 +278,22 @@ function generateColumnDefinition(
271
278
  value = JSON.stringify(column.default.value);
272
279
  }
273
280
  parts.push(`default(${value})`);
274
- } else if (column.default.runtime === "auto") {
275
- const idGen = ctx.idGeneratorImport ?? { name: "createId", from: "@fragno-dev/db/id" };
276
- ctx.imports.addImport(idGen.name, idGen.from);
277
- parts.push(`$defaultFn(() => ${idGen.name}())`);
278
- } else if (column.default.runtime === "now") {
279
- parts.push("defaultNow()");
281
+ } else if ("dbSpecial" in column.default) {
282
+ // Database-level special functions: defaultTo(b => b.now())
283
+ if (column.default.dbSpecial === "now") {
284
+ parts.push("defaultNow()");
285
+ }
286
+ } else if ("runtime" in column.default) {
287
+ // Runtime defaults: defaultTo$()
288
+ if (column.default.runtime === "cuid") {
289
+ const idGen = ctx.idGeneratorImport ?? { name: "createId", from: "@fragno-dev/db/id" };
290
+ ctx.imports.addImport(idGen.name, idGen.from);
291
+ parts.push(`$defaultFn(() => ${idGen.name}())`);
292
+ } else if (column.default.runtime === "now") {
293
+ // Runtime-generated timestamp (not database-level)
294
+ parts.push("$defaultFn(() => new Date())");
295
+ }
296
+ // Note: Custom functions in defaultTo$(() => ...) are not supported in schema generation
280
297
  }
281
298
  }
282
299
 
@@ -297,7 +314,8 @@ function generateAllColumns(
297
314
  // CONSTRAINT GENERATION
298
315
  // ============================================================================
299
316
 
300
- function generateForeignKeys(ctx: GeneratorContext, table: AnyTable): string[] {
317
+ function generateForeignKeys(ctx: GeneratorContext, table: AnyTable, namespace?: string): string[] {
318
+ const mapper = namespace ? createTableNameMapper(namespace) : undefined;
301
319
  const keys: string[] = [];
302
320
 
303
321
  for (const relation of Object.values(table.relations)) {
@@ -319,12 +337,19 @@ function generateForeignKeys(ctx: GeneratorContext, table: AnyTable): string[] {
319
337
  if (isSelfReference) {
320
338
  foreignColumns.push(`table.${actualRefCol}`);
321
339
  } else {
322
- foreignColumns.push(`${relation.table.ormName}.${actualRefCol}`);
340
+ // Suffix the foreign table reference with namespace if provided
341
+ const foreignTableRef =
342
+ mapper && namespace ? mapper.toPhysical(relation.table.ormName) : relation.table.ormName;
343
+ foreignColumns.push(`${foreignTableRef}.${actualRefCol}`);
323
344
  }
324
345
  }
325
346
 
326
347
  ctx.imports.addImport("foreignKey", ctx.importSource);
327
- const fkName = `${table.ormName}_${relation.table.ormName}_${relation.name}_fk`;
348
+ // Include namespace in FK name to avoid collisions
349
+ const fkName =
350
+ namespace && mapper
351
+ ? "fk_" + mapper.toPhysical(`${table.ormName}_${relation.table.ormName}_${relation.name}`)
352
+ : `${table.ormName}_${relation.table.ormName}_${relation.name}_fk`;
328
353
 
329
354
  keys.push(`foreignKey({
330
355
  columns: [${columns.join(", ")}],
@@ -336,53 +361,74 @@ function generateForeignKeys(ctx: GeneratorContext, table: AnyTable): string[] {
336
361
  return keys;
337
362
  }
338
363
 
339
- function generateIndexes(ctx: GeneratorContext, table: AnyTable): string[] {
364
+ function generateIndexes(ctx: GeneratorContext, table: AnyTable, namespace?: string): string[] {
340
365
  const indexes: string[] = [];
341
366
 
342
367
  for (const idx of Object.values(table.indexes)) {
343
368
  const columns = idx.columns.map((col) => `table.${col.ormName}`).join(", ");
344
369
 
370
+ // Include namespace in index name to avoid collisions
371
+ const indexName = namespace ? `${idx.name}_${namespace}` : idx.name;
372
+
345
373
  if (idx.unique) {
346
374
  ctx.imports.addImport("uniqueIndex", ctx.importSource);
347
- indexes.push(`uniqueIndex("${idx.name}").on(${columns})`);
375
+ indexes.push(`uniqueIndex("${indexName}").on(${columns})`);
348
376
  } else {
349
377
  ctx.imports.addImport("index", ctx.importSource);
350
- indexes.push(`index("${idx.name}").on(${columns})`);
378
+ indexes.push(`index("${indexName}").on(${columns})`);
351
379
  }
352
380
  }
353
381
 
354
382
  return indexes;
355
383
  }
356
384
 
357
- function generateTableConstraints(ctx: GeneratorContext, table: AnyTable): string[] {
358
- return [...generateForeignKeys(ctx, table), ...generateIndexes(ctx, table)];
385
+ function generateTableConstraints(
386
+ ctx: GeneratorContext,
387
+ table: AnyTable,
388
+ namespace?: string,
389
+ ): string[] {
390
+ return [...generateForeignKeys(ctx, table, namespace), ...generateIndexes(ctx, table, namespace)];
359
391
  }
360
392
 
361
393
  // ============================================================================
362
394
  // TABLE GENERATION
363
395
  // ============================================================================
364
396
 
365
- function generateTable(ctx: GeneratorContext, table: AnyTable, customTypes: string[]): string {
397
+ function generateTable(
398
+ ctx: GeneratorContext,
399
+ table: AnyTable,
400
+ customTypes: string[],
401
+ namespace?: string,
402
+ ): string {
366
403
  const tableFn = PROVIDER_TABLE_FUNCTIONS[ctx.provider];
367
404
  ctx.imports.addImport(tableFn, ctx.importSource);
368
405
 
369
406
  const columns = generateAllColumns(ctx, table, customTypes);
370
- const constraints = generateTableConstraints(ctx, table);
407
+ const constraints = generateTableConstraints(ctx, table, namespace);
408
+
409
+ // Suffix table name with namespace if provided
410
+ const physicalTableName = namespace ? `${table.ormName}_${namespace}` : table.ormName;
411
+ // Sanitize namespace for use in export name (valid JS identifier)
412
+ const exportName = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
371
413
 
372
- const args: string[] = [`"${table.ormName}"`, `{\n${columns.join(",\n")}\n}`];
414
+ const args: string[] = [`"${physicalTableName}"`, `{\n${columns.join(",\n")}\n}`];
373
415
 
374
416
  if (constraints.length > 0) {
375
417
  args.push(`(table) => [\n${ident(constraints.join(",\n"))}\n]`);
376
418
  }
377
419
 
378
- return `export const ${table.ormName} = ${tableFn}(${args.join(", ")})`;
420
+ return `export const ${exportName} = ${tableFn}(${args.join(", ")})`;
379
421
  }
380
422
 
381
423
  // ============================================================================
382
424
  // RELATION GENERATION
383
425
  // ============================================================================
384
426
 
385
- function generateRelation(ctx: GeneratorContext, table: AnyTable): string | undefined {
427
+ function generateRelation(
428
+ ctx: GeneratorContext,
429
+ table: AnyTable,
430
+ namespace?: string,
431
+ ): string | undefined {
386
432
  const relations: string[] = [];
387
433
  let hasOne = false;
388
434
  let hasMany = false;
@@ -402,17 +448,29 @@ function generateRelation(ctx: GeneratorContext, table: AnyTable): string | unde
402
448
  const fields: string[] = [];
403
449
  const references: string[] = [];
404
450
 
451
+ // Use sanitized namespace for identifier references
452
+ const tableRef = namespace
453
+ ? `${table.ormName}_${sanitizeNamespace(namespace)}`
454
+ : table.ormName;
455
+ const relatedTableRef = namespace
456
+ ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`
457
+ : relation.table.ormName;
458
+
405
459
  for (const [left, right] of relation.on) {
406
- fields.push(`${table.ormName}.${left}`);
460
+ fields.push(`${tableRef}.${left}`);
407
461
  // Relations reference internal IDs
408
462
  const actualRight = right === "id" ? "_internalId" : right;
409
- references.push(`${relation.table.ormName}.${actualRight}`);
463
+ references.push(`${relatedTableRef}.${actualRight}`);
410
464
  }
411
465
 
412
466
  options.push(`fields: [${fields.join(", ")}]`, `references: [${references.join(", ")}]`);
413
467
  }
414
468
 
415
- const args: string[] = [relation.table.ormName];
469
+ const relatedTableRef = namespace
470
+ ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}`
471
+ : relation.table.ormName;
472
+
473
+ const args: string[] = [relatedTableRef];
416
474
  if (options.length > 0) {
417
475
  args.push(`{\n${ident(options.join(",\n"))}\n}`);
418
476
  }
@@ -434,12 +492,59 @@ function generateRelation(ctx: GeneratorContext, table: AnyTable): string | unde
434
492
  }
435
493
  const relationParams = params.length > 0 ? `{ ${params.join(", ")} }` : "{}";
436
494
 
495
+ const tableRef = namespace ? `${table.ormName}_${sanitizeNamespace(namespace)}` : table.ormName;
496
+ const relationsName = namespace
497
+ ? `${table.ormName}_${sanitizeNamespace(namespace)}Relations`
498
+ : `${table.ormName}Relations`;
499
+
437
500
  ctx.imports.addImport("relations", "drizzle-orm");
438
- return `export const ${table.ormName}Relations = relations(${table.ormName}, (${relationParams}) => ({
501
+ return `export const ${relationsName} = relations(${tableRef}, (${relationParams}) => ({
439
502
  ${relations.join(",\n")}
440
503
  }));`;
441
504
  }
442
505
 
506
+ // ============================================================================
507
+ // UTILITIES
508
+ // ============================================================================
509
+
510
+ /**
511
+ * Sanitize a namespace to be a valid JavaScript identifier
512
+ * Replaces hyphens and other invalid characters with underscores
513
+ */
514
+ function sanitizeNamespace(namespace: string): string {
515
+ return namespace.replace(/[^a-zA-Z0-9_]/g, "_");
516
+ }
517
+
518
+ /**
519
+ * Generate a schema export object for a fragment
520
+ * This groups all tables by their logical names for easier access
521
+ */
522
+ function generateFragmentSchemaExport(schema: AnySchema, namespace: string): string {
523
+ const entries: string[] = [];
524
+
525
+ for (const table of Object.values(schema.tables)) {
526
+ const physicalExportName = namespace
527
+ ? `${table.ormName}_${sanitizeNamespace(namespace)}`
528
+ : table.ormName;
529
+
530
+ if (namespace) {
531
+ const physicalTableName = namespace ? `${table.ormName}_${namespace}` : table.ormName;
532
+ // Use physical table name as key for Drizzle schema lookups
533
+ entries.push(` "${physicalTableName}": ${physicalExportName}`);
534
+ }
535
+
536
+ // Also provide logical name for convenience
537
+ entries.push(` ${table.ormName}: ${physicalExportName}`);
538
+ }
539
+
540
+ // Add schema version as a number
541
+ entries.push(` schemaVersion: ${schema.version}`);
542
+
543
+ const exportName = namespace ? `${sanitizeNamespace(namespace)}_schema` : "_schema";
544
+
545
+ return `export const ${exportName} = {\n${entries.join(",\n")}\n}`;
546
+ }
547
+
443
548
  // ============================================================================
444
549
  // MAIN GENERATION
445
550
  // ============================================================================
@@ -454,28 +559,78 @@ export interface GenerateSchemaOptions {
454
559
  };
455
560
  }
456
561
 
562
+ /**
563
+ * Generate a settings table for storing fragment versions
564
+ */
565
+ function generateSettingsTable(ctx: GeneratorContext): string {
566
+ // Use centralized settings schema
567
+
568
+ // Extract the table from the schema
569
+ const settingsTable =
570
+ settingsSchema.tables[SETTINGS_TABLE_NAME as keyof typeof settingsSchema.tables];
571
+
572
+ // Generate the table using the existing generateTable function
573
+ const customTypes: string[] = [];
574
+ return generateTable(ctx, settingsTable, customTypes);
575
+ }
576
+
577
+ /**
578
+ * Generate a schema file from one or more fragments with a shared settings table
579
+ */
457
580
  export function generateSchema(
458
- schema: AnySchema,
581
+ fragments: { namespace: string; schema: AnySchema }[],
459
582
  provider: SupportedProvider,
460
583
  options?: GenerateSchemaOptions,
461
584
  ): string {
462
585
  const ctx = createContext(provider, options?.idGeneratorImport);
463
586
  const customTypes: string[] = [];
464
- const tables: string[] = [];
587
+ const sections: string[] = [];
588
+
589
+ // Generate settings table first
590
+ sections.push("");
591
+ sections.push("// ============================================================================");
592
+ sections.push("// Settings Table (shared across all fragments)");
593
+ sections.push("// ============================================================================");
594
+ sections.push("");
595
+ sections.push(generateSettingsTable(ctx));
596
+ sections.push("");
597
+ sections.push(`export const fragnoDbSettingSchemaVersion = ${settingsSchema.version};`);
598
+
599
+ // Generate each fragment's tables
600
+ for (const { namespace, schema } of fragments) {
601
+ const fragmentTables: string[] = [];
602
+
603
+ // Add section header
604
+ fragmentTables.push("");
605
+ fragmentTables.push(
606
+ "// ============================================================================",
607
+ );
608
+ fragmentTables.push(`// Fragment: ${namespace}`);
609
+ fragmentTables.push(
610
+ "// ============================================================================",
611
+ );
612
+
613
+ // Generate tables for this fragment
614
+ for (const table of Object.values(schema.tables)) {
615
+ const tableCode = generateTable(ctx, table, customTypes, namespace);
616
+ fragmentTables.push("");
617
+ fragmentTables.push(tableCode);
618
+
619
+ const relationCode = generateRelation(ctx, table, namespace);
620
+ if (relationCode) {
621
+ fragmentTables.push("");
622
+ fragmentTables.push(relationCode);
623
+ }
624
+ }
465
625
 
466
- // Generate tables and collect custom types
467
- for (const table of Object.values(schema.tables)) {
468
- // Custom types might be generated during column processing
469
- const tableCode = generateTable(ctx, table, customTypes);
470
- tables.push(tableCode);
626
+ // Generate schema export object
627
+ fragmentTables.push("");
628
+ fragmentTables.push(generateFragmentSchemaExport(schema, namespace));
471
629
 
472
- const relationCode = generateRelation(ctx, table);
473
- if (relationCode) {
474
- tables.push(relationCode);
475
- }
630
+ sections.push(...fragmentTables);
476
631
  }
477
632
 
478
633
  // Assemble final output
479
- const lines: string[] = [ctx.imports.format(), ...customTypes, ...tables];
480
- return lines.join("\n\n");
634
+ const lines: string[] = [ctx.imports.format(), ...customTypes, ...sections];
635
+ return lines.join("\n");
481
636
  }
@@ -19,8 +19,14 @@ describe("generateSchema and migrate", () => {
19
19
  .addColumn("age", column("integer").nullable())
20
20
  .addColumn("isActive", column("bool").defaultTo(true))
21
21
  .addColumn("bio", column("string").nullable())
22
- .addColumn("createdAt", column("timestamp").defaultTo$("now"))
23
- .addColumn("updatedAt", column("timestamp").defaultTo$("now"))
22
+ .addColumn(
23
+ "createdAt",
24
+ column("timestamp").defaultTo((b) => b.now()),
25
+ )
26
+ .addColumn(
27
+ "updatedAt",
28
+ column("timestamp").defaultTo((b) => b.now()),
29
+ )
24
30
  .createIndex("idx_users_email", ["email"], { unique: true })
25
31
  .createIndex("idx_users_name", ["name"])
26
32
  .createIndex("idx_users_active", ["isActive"]);
@@ -40,7 +46,10 @@ describe("generateSchema and migrate", () => {
40
46
  .addColumn("metadata", column("json").nullable())
41
47
  .addColumn("rating", column("decimal").nullable())
42
48
  .addColumn("thumbnail", column("binary").nullable())
43
- .addColumn("createdAt", column("timestamp").defaultTo$("now"))
49
+ .addColumn(
50
+ "createdAt",
51
+ column("timestamp").defaultTo((b) => b.now()),
52
+ )
44
53
  .createIndex("idx_posts_user", ["userId"])
45
54
  .createIndex("idx_posts_title", ["title"])
46
55
  .createIndex("idx_posts_slug", ["slug"], { unique: true })
@@ -53,7 +62,10 @@ describe("generateSchema and migrate", () => {
53
62
  .addColumn("postId", referenceColumn())
54
63
  .addColumn("userId", referenceColumn())
55
64
  .addColumn("parentId", referenceColumn().nullable())
56
- .addColumn("createdAt", column("timestamp").defaultTo$("now"))
65
+ .addColumn(
66
+ "createdAt",
67
+ column("timestamp").defaultTo((b) => b.now()),
68
+ )
57
69
  .addColumn("editedAt", column("timestamp").nullable())
58
70
  .addColumn("isDeleted", column("bool").defaultTo(false))
59
71
  .createIndex("idx_comments_post", ["postId"])
@@ -77,7 +89,10 @@ describe("generateSchema and migrate", () => {
77
89
  .addColumn("postId", referenceColumn())
78
90
  .addColumn("tagId", referenceColumn())
79
91
  .addColumn("order", column("integer").defaultTo(0))
80
- .addColumn("createdAt", column("timestamp").defaultTo$("now"))
92
+ .addColumn(
93
+ "createdAt",
94
+ column("timestamp").defaultTo((b) => b.now()),
95
+ )
81
96
  .createIndex("idx_postTags_post_tag", ["postId", "tagId"], { unique: true })
82
97
  .createIndex("idx_postTags_tag", ["tagId"]);
83
98
  })
@@ -135,7 +150,15 @@ describe("generateSchema and migrate", () => {
135
150
  );
136
151
 
137
152
  expect(migrationStatements.join("\n")).toMatchInlineSnapshot(`
138
- "CREATE TABLE "users" (
153
+ "CREATE TABLE "fragno_db_settings" (
154
+ "id" varchar(30) NOT NULL,
155
+ "key" text NOT NULL,
156
+ "value" text NOT NULL,
157
+ "_internalId" bigserial PRIMARY KEY NOT NULL,
158
+ "_version" integer DEFAULT 0 NOT NULL
159
+ );
160
+
161
+ CREATE TABLE "users" (
139
162
  "id" varchar(30) NOT NULL,
140
163
  "name" text NOT NULL,
141
164
  "email" text NOT NULL,
@@ -207,6 +230,7 @@ describe("generateSchema and migrate", () => {
207
230
  ALTER TABLE "comments" ADD CONSTRAINT "comments_comments_parent_fk" FOREIGN KEY ("parentId") REFERENCES "public"."comments"("_internalId") ON DELETE no action ON UPDATE no action;
208
231
  ALTER TABLE "postTags" ADD CONSTRAINT "postTags_posts_post_fk" FOREIGN KEY ("postId") REFERENCES "public"."posts"("_internalId") ON DELETE no action ON UPDATE no action;
209
232
  ALTER TABLE "postTags" ADD CONSTRAINT "postTags_tags_tag_fk" FOREIGN KEY ("tagId") REFERENCES "public"."tags"("_internalId") ON DELETE no action ON UPDATE no action;
233
+ CREATE UNIQUE INDEX "unique_key" ON "fragno_db_settings" USING btree ("key");
210
234
  CREATE UNIQUE INDEX "idx_users_email" ON "users" USING btree ("email");
211
235
  CREATE INDEX "idx_users_name" ON "users" USING btree ("name");
212
236
  CREATE INDEX "idx_users_active" ON "users" USING btree ("isActive");
@@ -13,10 +13,40 @@ export type DBType = MySQL.MySqlDatabase<
13
13
  export function parseDrizzle(drizzle: unknown) {
14
14
  const db = drizzle as DBType;
15
15
  const drizzleTables = db._.fullSchema as Record<string, TableType>;
16
- if (!drizzleTables || Object.keys(drizzleTables).length === 0)
16
+ if (!drizzleTables || Object.keys(drizzleTables).length === 0) {
17
17
  throw new Error(
18
18
  "Drizzle adapter requires query mode, make sure to configure it following their guide: https://orm.drizzle.team/docs/rqb.",
19
19
  );
20
+ }
20
21
 
21
22
  return [db, drizzleTables] as const;
22
23
  }
24
+
25
+ /**
26
+ * Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)
27
+ */
28
+ export interface TableNameMapper {
29
+ toPhysical(logicalName: string): string;
30
+ toLogical(physicalName: string): string;
31
+ }
32
+
33
+ /**
34
+ * Creates a table name mapper for a given namespace.
35
+ * Physical names have format: {logicalName}_{namespace}
36
+ */
37
+ export function createTableNameMapper(namespace: string): TableNameMapper {
38
+ return {
39
+ toPhysical: (logicalName: string) => `${logicalName}_${namespace}`,
40
+ toLogical: (physicalName: string) => {
41
+ if (physicalName.endsWith(`_${namespace}`)) {
42
+ return physicalName.slice(0, -(namespace.length + 1));
43
+ }
44
+ return physicalName;
45
+ },
46
+ };
47
+ }
48
+
49
+ export interface DrizzleResult {
50
+ rows: Record<string, unknown>[];
51
+ affectedRows: number;
52
+ }
@@ -18,6 +18,7 @@ export async function writeAndLoadSchema(
18
18
  testFileName: string,
19
19
  schema: Schema,
20
20
  dialect: SupportedProvider,
21
+ namespace?: string,
21
22
  ) {
22
23
  // Create test-specific directory inside _generated
23
24
  const baseDir = join(import.meta.dirname, "_generated");
@@ -37,7 +38,8 @@ export async function writeAndLoadSchema(
37
38
  );
38
39
 
39
40
  // Generate and write the Drizzle schema to file
40
- const drizzleSchemaTs = generateSchema(schema, dialect);
41
+ // Use empty namespace for tests to avoid table name prefixing
42
+ const drizzleSchemaTs = generateSchema([{ namespace: namespace ?? "", schema }], dialect);
41
43
  await writeFile(schemaFilePath, drizzleSchemaTs, "utf-8");
42
44
 
43
45
  // Dynamically import the generated schema (with cache busting)
@@ -116,57 +116,55 @@ describe("KyselyAdapter PGLite", () => {
116
116
  expect(schemaVersion).toBeUndefined();
117
117
 
118
118
  const migrator = adapter.createMigrationEngine(testSchema, "test");
119
- const preparedMigration = await migrator.prepareMigration();
119
+ const preparedMigration = await migrator.prepareMigration({
120
+ updateSettings: false,
121
+ });
120
122
  assert(preparedMigration.getSQL);
121
123
 
122
124
  expect(preparedMigration.getSQL()).toMatchInlineSnapshot(`
123
- "create table "fragno_db_settings" ("key" varchar(255) primary key, "value" text not null);
124
-
125
- insert into "fragno_db_settings" ("key", "value") values ('test.schema_version', '12');
126
-
127
- create table "users" ("id" varchar(30) not null unique, "name" text not null, "age" integer, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
125
+ "create table "users_test" ("id" varchar(30) not null unique, "name" text not null, "age" integer, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
128
126
 
129
- create index "name_idx" on "users" ("name");
127
+ create index "name_idx" on "users_test" ("name");
130
128
 
131
- create index "age_idx" on "users" ("age");
129
+ create index "age_idx" on "users_test" ("age");
132
130
 
133
- create table "emails" ("id" varchar(30) not null unique, "user_id" bigint not null, "email" text not null, "is_primary" boolean default false not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
131
+ create table "emails_test" ("id" varchar(30) not null unique, "user_id" bigint not null, "email" text not null, "is_primary" boolean default false not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
134
132
 
135
- create unique index "unique_email" on "emails" ("email");
133
+ create unique index "unique_email" on "emails_test" ("email");
136
134
 
137
- create index "user_emails" on "emails" ("user_id");
135
+ create index "user_emails" on "emails_test" ("user_id");
138
136
 
139
- create table "posts" ("id" varchar(30) not null unique, "user_id" bigint not null, "title" text not null, "content" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
137
+ create table "posts_test" ("id" varchar(30) not null unique, "user_id" bigint not null, "title" text not null, "content" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
140
138
 
141
- create index "posts_user_idx" on "posts" ("user_id");
139
+ create index "posts_user_idx" on "posts_test" ("user_id");
142
140
 
143
- create table "tags" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
141
+ create table "tags_test" ("id" varchar(30) not null unique, "name" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
144
142
 
145
- create index "tag_name" on "tags" ("name");
143
+ create index "tag_name" on "tags_test" ("name");
146
144
 
147
- create table "post_tags" ("id" varchar(30) not null unique, "post_id" bigint not null, "tag_id" bigint not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
145
+ create table "post_tags_test" ("id" varchar(30) not null unique, "post_id" bigint not null, "tag_id" bigint not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
148
146
 
149
- create index "pt_post" on "post_tags" ("post_id");
147
+ create index "pt_post" on "post_tags_test" ("post_id");
150
148
 
151
- create index "pt_tag" on "post_tags" ("tag_id");
149
+ create index "pt_tag" on "post_tags_test" ("tag_id");
152
150
 
153
- create table "comments" ("id" varchar(30) not null unique, "post_id" bigint not null, "user_id" bigint not null, "text" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
151
+ create table "comments_test" ("id" varchar(30) not null unique, "post_id" bigint not null, "user_id" bigint not null, "text" text not null, "_internalId" bigserial not null primary key, "_version" integer default 0 not null);
154
152
 
155
- create index "comments_post_idx" on "comments" ("post_id");
153
+ create index "comments_post_idx" on "comments_test" ("post_id");
156
154
 
157
- create index "comments_user_idx" on "comments" ("user_id");
155
+ create index "comments_user_idx" on "comments_test" ("user_id");
158
156
 
159
- alter table "emails" add constraint "emails_users_user_fk" foreign key ("user_id") references "users" ("_internalId") on delete restrict on update restrict;
157
+ alter table "emails_test" add constraint "emails_users_user_fk" foreign key ("user_id") references "users_test" ("_internalId") on delete restrict on update restrict;
160
158
 
161
- alter table "posts" add constraint "posts_users_author_fk" foreign key ("user_id") references "users" ("_internalId") on delete restrict on update restrict;
159
+ alter table "posts_test" add constraint "posts_users_author_fk" foreign key ("user_id") references "users_test" ("_internalId") on delete restrict on update restrict;
162
160
 
163
- alter table "post_tags" add constraint "post_tags_posts_post_fk" foreign key ("post_id") references "posts" ("_internalId") on delete restrict on update restrict;
161
+ alter table "post_tags_test" add constraint "post_tags_posts_post_fk" foreign key ("post_id") references "posts_test" ("_internalId") on delete restrict on update restrict;
164
162
 
165
- alter table "post_tags" add constraint "post_tags_tags_tag_fk" foreign key ("tag_id") references "tags" ("_internalId") on delete restrict on update restrict;
163
+ alter table "post_tags_test" add constraint "post_tags_tags_tag_fk" foreign key ("tag_id") references "tags_test" ("_internalId") on delete restrict on update restrict;
166
164
 
167
- alter table "comments" add constraint "comments_posts_post_fk" foreign key ("post_id") references "posts" ("_internalId") on delete restrict on update restrict;
165
+ alter table "comments_test" add constraint "comments_posts_post_fk" foreign key ("post_id") references "posts_test" ("_internalId") on delete restrict on update restrict;
168
166
 
169
- alter table "comments" add constraint "comments_users_commenter_fk" foreign key ("user_id") references "users" ("_internalId") on delete restrict on update restrict;"
167
+ alter table "comments_test" add constraint "comments_users_commenter_fk" foreign key ("user_id") references "users_test" ("_internalId") on delete restrict on update restrict;"
170
168
  `);
171
169
 
172
170
  await preparedMigration.execute();