@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
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-adapter.d.ts","names":[],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;UAUiB,aAAA;;EAAA,QAAA,EAAA,QAAa,GAAA,OAAA,GAAA,YAAA;AAK9B;AAAuD,cAA1C,cAAA,YAA0B,eAAgB,CAAA,gBAAA,CAAA,CAAA;EAGjC,CAAA,OAAA;EAQS,WAAA,CAAA,MAAA,EART,aAQS;EAWc,IAAA,QAAA,CAAA,CAAA,EAAA,QAAA,GAAA,OAAA,GAAA,YAAA;EAST,mBAAA,CAAA,CAAA,EApBL,OAoBK,CAAA,OAAA,CAAA;EACxB,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAViC,OAUjC,CAAA,MAAA,GAAA,SAAA,CAAA;EAEO,iBAAA,CAAA,gBAHiB,SAGjB,CAAA,CAAA,MAAA,EAFP,OAEO,EAAA,SAAA,EAAA,MAAA,CAAA,EAAd,aAAc,CAAA,OAAA,EAAS,gBAAT,CAAA;EAAS,qBAAA,CAAA,SAAA,EAAA;IAAvB,MAAA,EAOoB,SAPpB;IAOoB,SAAA,EAAA,MAAA;EAEpB,CAAA,EAAA,EAAA,OA3CiD,CA2CjD,EAAA;IA3CkC,IAAA,CAAA,EAAA,MAAA;EAAe,CAAA,CAAA,EA2CjD,eA3CiD"}
1
+ {"version":3,"file":"drizzle-adapter.d.ts","names":[],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;UAUiB,aAAA;;EAAA,QAAA,EAAA,QAAa,GAAA,OAAA,GAAA,YAAA;AAK9B;AAAuD,cAA1C,cAAA,YAA0B,eAAgB,CAAA,gBAAA,CAAA,CAAA;EAGjC,CAAA,OAAA;EAQS,WAAA,CAAA,MAAA,EART,aAQS;EAkBc,IAAA,QAAA,CAAA,CAAA,EAAA,QAAA,GAAA,OAAA,GAAA,YAAA;EAST,mBAAA,CAAA,CAAA,EA3BL,OA2BK,CAAA,OAAA,CAAA;EACxB,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAViC,OAUjC,CAAA,MAAA,GAAA,SAAA,CAAA;EAEO,iBAAA,CAAA,gBAHiB,SAGjB,CAAA,CAAA,MAAA,EAFP,OAEO,EAAA,SAAA,EAAA,MAAA,CAAA,EAAd,aAAc,CAAA,OAAA,EAAS,gBAAT,CAAA;EAAS,qBAAA,CAAA,SAAA,EAAA;IAAvB,MAAA,EAOoB,SAPpB;IAOoB,SAAA,EAAA,MAAA;EAEpB,CAAA,EAAA,EAAA,OAlDiD,CAkDjD,EAAA;IAlDkC,IAAA,CAAA,EAAA,MAAA;EAAe,CAAA,CAAA,EAkDjD,eAlDiD"}
@@ -1,6 +1,6 @@
1
1
  import "../../schema/create.js";
2
2
  import { createSettingsManager, settingsSchema } from "../../shared/settings-schema.js";
3
- import { sql } from "../../node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/sql.js";
3
+ import { sql } from "../../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";
4
4
  import { createTableNameMapper } from "./shared.js";
5
5
  import { generateSchema } from "./generate.js";
6
6
  import { fromDrizzle } from "./drizzle-query.js";
@@ -16,7 +16,9 @@ var DrizzleAdapter = class {
16
16
  }
17
17
  async isConnectionHealthy() {
18
18
  try {
19
- return (await this.#drizzleConfig.db.execute(sql`SELECT 1 as healthy`)).rows[0]["healthy"] === 1;
19
+ const result = await this.#drizzleConfig.db.execute(sql`SELECT 1 as healthy`);
20
+ if (Array.isArray(result)) return result.length > 0 && result[0]["healthy"] === 1;
21
+ else return result.rows[0]["healthy"] === 1;
20
22
  } catch {
21
23
  return false;
22
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-adapter.js","names":["#drizzleConfig"],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":["import type { DatabaseAdapter } from \"../adapters\";\nimport { type AnySchema } from \"../../schema/create\";\nimport type { AbstractQuery } from \"../../query/query\";\nimport type { SchemaGenerator } from \"../../schema-generator/schema-generator\";\nimport { generateSchema } from \"./generate\";\nimport { fromDrizzle, type DrizzleUOWConfig } from \"./drizzle-query\";\nimport { createTableNameMapper, type DBType, type DrizzleResult } from \"./shared\";\nimport { createSettingsManager, settingsSchema } from \"../../shared/settings-schema\";\nimport { sql } from \"drizzle-orm\";\n\nexport interface DrizzleConfig {\n db: unknown;\n provider: \"sqlite\" | \"mysql\" | \"postgresql\";\n}\n\nexport class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {\n #drizzleConfig: DrizzleConfig;\n\n constructor(config: DrizzleConfig) {\n this.#drizzleConfig = config;\n }\n\n get provider(): \"sqlite\" | \"mysql\" | \"postgresql\" {\n return this.#drizzleConfig.provider;\n }\n\n async isConnectionHealthy(): Promise<boolean> {\n try {\n const result = (await (this.#drizzleConfig.db as DBType).execute(\n sql`SELECT 1 as healthy`,\n )) as DrizzleResult;\n return result.rows[0][\"healthy\"] === 1;\n } catch {\n return false;\n }\n }\n\n async getSchemaVersion(namespace: string): Promise<string | undefined> {\n const queryEngine = this.createQueryEngine(settingsSchema, namespace);\n const manager = createSettingsManager(queryEngine, namespace);\n\n // Try to read the version key directly\n const result = await manager.get(\"version\");\n return result?.value;\n }\n\n createQueryEngine<TSchema extends AnySchema>(\n schema: TSchema,\n namespace: string,\n ): AbstractQuery<TSchema, DrizzleUOWConfig> {\n // Only create mapper if namespace is non-empty\n const mapper = namespace ? createTableNameMapper(namespace) : undefined;\n return fromDrizzle(schema, this.#drizzleConfig, mapper);\n }\n\n createSchemaGenerator(\n fragments: { schema: AnySchema; namespace: string }[],\n options?: { path?: string },\n ): SchemaGenerator {\n return {\n generateSchema: (genOptions) => {\n const path = genOptions?.path ?? options?.path ?? \"fragno-schema.ts\";\n\n return {\n schema: generateSchema(fragments, this.#drizzleConfig.provider),\n path,\n };\n },\n };\n }\n}\n"],"mappings":";;;;;;;;AAeA,IAAa,iBAAb,MAAyE;CACvE;CAEA,YAAY,QAAuB;AACjC,QAAKA,gBAAiB;;CAGxB,IAAI,WAA8C;AAChD,SAAO,MAAKA,cAAe;;CAG7B,MAAM,sBAAwC;AAC5C,MAAI;AAIF,WAHgB,MAAO,MAAKA,cAAe,GAAc,QACvD,GAAG,sBACJ,EACa,KAAK,GAAG,eAAe;UAC/B;AACN,UAAO;;;CAIX,MAAM,iBAAiB,WAAgD;AAMrE,UADe,MAHC,sBADI,KAAK,kBAAkB,gBAAgB,UAAU,EAClB,UAAU,CAGhC,IAAI,UAAU,GAC5B;;CAGjB,kBACE,QACA,WAC0C;EAE1C,MAAM,SAAS,YAAY,sBAAsB,UAAU,GAAG;AAC9D,SAAO,YAAY,QAAQ,MAAKA,eAAgB,OAAO;;CAGzD,sBACE,WACA,SACiB;AACjB,SAAO,EACL,iBAAiB,eAAe;GAC9B,MAAM,OAAO,YAAY,QAAQ,SAAS,QAAQ;AAElD,UAAO;IACL,QAAQ,eAAe,WAAW,MAAKA,cAAe,SAAS;IAC/D;IACD;KAEJ"}
1
+ {"version":3,"file":"drizzle-adapter.js","names":["#drizzleConfig"],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":["import type { DatabaseAdapter } from \"../adapters\";\nimport { type AnySchema } from \"../../schema/create\";\nimport type { AbstractQuery } from \"../../query/query\";\nimport type { SchemaGenerator } from \"../../schema-generator/schema-generator\";\nimport { generateSchema } from \"./generate\";\nimport { fromDrizzle, type DrizzleUOWConfig } from \"./drizzle-query\";\nimport { createTableNameMapper, type DBType, type DrizzleResult } from \"./shared\";\nimport { createSettingsManager, settingsSchema } from \"../../shared/settings-schema\";\nimport { sql } from \"drizzle-orm\";\n\nexport interface DrizzleConfig {\n db: unknown;\n provider: \"sqlite\" | \"mysql\" | \"postgresql\";\n}\n\nexport class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {\n #drizzleConfig: DrizzleConfig;\n\n constructor(config: DrizzleConfig) {\n this.#drizzleConfig = config;\n }\n\n get provider(): \"sqlite\" | \"mysql\" | \"postgresql\" {\n return this.#drizzleConfig.provider;\n }\n\n async isConnectionHealthy(): Promise<boolean> {\n try {\n const result = await (this.#drizzleConfig.db as DBType).execute(sql`SELECT 1 as healthy`);\n\n // Handle different result formats across providers\n // PostgreSQL/MySQL: { rows: [...] }\n // SQLite: array directly or { rows: [...] }\n if (Array.isArray(result)) {\n return result.length > 0 && result[0][\"healthy\"] === 1;\n } else {\n const drizzleResult = result as DrizzleResult;\n return drizzleResult.rows[0][\"healthy\"] === 1;\n }\n } catch {\n return false;\n }\n }\n\n async getSchemaVersion(namespace: string): Promise<string | undefined> {\n const queryEngine = this.createQueryEngine(settingsSchema, namespace);\n const manager = createSettingsManager(queryEngine, namespace);\n\n // Try to read the version key directly\n const result = await manager.get(\"version\");\n return result?.value;\n }\n\n createQueryEngine<TSchema extends AnySchema>(\n schema: TSchema,\n namespace: string,\n ): AbstractQuery<TSchema, DrizzleUOWConfig> {\n // Only create mapper if namespace is non-empty\n const mapper = namespace ? createTableNameMapper(namespace) : undefined;\n return fromDrizzle(schema, this.#drizzleConfig, mapper);\n }\n\n createSchemaGenerator(\n fragments: { schema: AnySchema; namespace: string }[],\n options?: { path?: string },\n ): SchemaGenerator {\n return {\n generateSchema: (genOptions) => {\n const path = genOptions?.path ?? options?.path ?? \"fragno-schema.ts\";\n\n return {\n schema: generateSchema(fragments, this.#drizzleConfig.provider),\n path,\n };\n },\n };\n }\n}\n"],"mappings":";;;;;;;;AAeA,IAAa,iBAAb,MAAyE;CACvE;CAEA,YAAY,QAAuB;AACjC,QAAKA,gBAAiB;;CAGxB,IAAI,WAA8C;AAChD,SAAO,MAAKA,cAAe;;CAG7B,MAAM,sBAAwC;AAC5C,MAAI;GACF,MAAM,SAAS,MAAO,MAAKA,cAAe,GAAc,QAAQ,GAAG,sBAAsB;AAKzF,OAAI,MAAM,QAAQ,OAAO,CACvB,QAAO,OAAO,SAAS,KAAK,OAAO,GAAG,eAAe;OAGrD,QADsB,OACD,KAAK,GAAG,eAAe;UAExC;AACN,UAAO;;;CAIX,MAAM,iBAAiB,WAAgD;AAMrE,UADe,MAHC,sBADI,KAAK,kBAAkB,gBAAgB,UAAU,EAClB,UAAU,CAGhC,IAAI,UAAU,GAC5B;;CAGjB,kBACE,QACA,WAC0C;EAE1C,MAAM,SAAS,YAAY,sBAAsB,UAAU,GAAG;AAC9D,SAAO,YAAY,QAAQ,MAAKA,eAAgB,OAAO;;CAGzD,sBACE,WACA,SACiB;AACjB,SAAO,EACL,iBAAiB,eAAe;GAC9B,MAAM,OAAO,YAAY,QAAQ,SAAS,QAAQ;AAElD,UAAO;IACL,QAAQ,eAAe,WAAW,MAAKA,cAAe,SAAS;IAC/D;IACD;KAEJ"}
@@ -32,8 +32,8 @@ function fromDrizzle(schema, config, mapper) {
32
32
  const { provider } = config;
33
33
  function createUOW(name, uowConfig) {
34
34
  return new UnitOfWork(schema, createDrizzleUOWCompiler(schema, config, mapper, uowConfig?.onQuery), {
35
- executeRetrievalPhase: (retrievalBatch) => executeDrizzleRetrievalPhase(db, retrievalBatch),
36
- executeMutationPhase: (mutationBatch) => executeDrizzleMutationPhase(db, mutationBatch)
35
+ executeRetrievalPhase: (retrievalBatch) => executeDrizzleRetrievalPhase(db, retrievalBatch, provider),
36
+ executeMutationPhase: (mutationBatch) => executeDrizzleMutationPhase(db, mutationBatch, provider)
37
37
  }, createDrizzleUOWDecoder(schema, provider), name);
38
38
  }
39
39
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-query.js","names":["whereConfig: { indexName?: string; condition?: unknown }","setValues: unknown"],"sources":["../../../src/adapters/drizzle/drizzle-query.ts"],"sourcesContent":["import type { AbstractQuery } from \"../../query/query\";\nimport type { AnySchema } from \"../../schema/create\";\nimport type { DrizzleConfig } from \"./drizzle-adapter\";\nimport type { CompiledMutation, UOWExecutor } from \"../../query/unit-of-work\";\nimport { createDrizzleUOWCompiler, type DrizzleCompiledQuery } from \"./drizzle-uow-compiler\";\nimport { executeDrizzleRetrievalPhase, executeDrizzleMutationPhase } from \"./drizzle-uow-executor\";\nimport { UnitOfWork } from \"../../query/unit-of-work\";\nimport { parseDrizzle, type DrizzleResult, type TableNameMapper } from \"./shared\";\nimport { createDrizzleUOWDecoder } from \"./drizzle-uow-decoder\";\n\n/**\n * Configuration options for creating a Drizzle Unit of Work\n */\nexport interface DrizzleUOWConfig {\n /**\n * Optional callback to receive compiled SQL queries for logging/debugging\n * This callback is invoked for each query as it's compiled\n */\n onQuery?: (query: DrizzleCompiledQuery) => void;\n}\n\n/**\n * Creates a Drizzle-based query engine for the given schema.\n *\n * This is the main entry point for creating a database query interface using Drizzle.\n * It uses a compiler-based architecture where queries are compiled to SQL and then executed,\n * enabling features like SQL snapshot testing.\n *\n * @param schema - The database schema definition\n * @param config - Drizzle configuration containing the database instance and provider\n * @param mapper - Optional table name mapper for namespace prefixing\n * @returns An AbstractQuery instance for performing database operations\n *\n * @example\n * ```ts\n * const queryEngine = fromDrizzle(mySchema, {\n * db: drizzle,\n * provider: 'postgresql'\n * });\n *\n * const uow = queryEngine.createUnitOfWork('myOperation');\n * ```\n */\nexport function fromDrizzle<T extends AnySchema>(\n schema: T,\n config: DrizzleConfig,\n mapper?: TableNameMapper,\n): AbstractQuery<T, DrizzleUOWConfig> {\n const [db] = parseDrizzle(config.db);\n const { provider } = config;\n\n function createUOW(name?: string, uowConfig?: DrizzleUOWConfig) {\n const uowCompiler = createDrizzleUOWCompiler(schema, config, mapper, uowConfig?.onQuery);\n\n const executor: UOWExecutor<DrizzleCompiledQuery, DrizzleResult> = {\n executeRetrievalPhase: (retrievalBatch: DrizzleCompiledQuery[]) =>\n executeDrizzleRetrievalPhase(db, retrievalBatch),\n executeMutationPhase: (mutationBatch: CompiledMutation<DrizzleCompiledQuery>[]) =>\n executeDrizzleMutationPhase(db, mutationBatch),\n };\n\n const decoder = createDrizzleUOWDecoder(schema, provider);\n\n return new UnitOfWork(schema, uowCompiler, executor, decoder, name);\n }\n\n return {\n find(tableName, builderFn) {\n const uow = createUOW();\n uow.find(tableName, builderFn);\n return uow.executeRetrieve();\n },\n\n async findFirst(tableName, builderFn) {\n const uow = createUOW();\n if (builderFn) {\n uow.find(tableName, (b) => builderFn(b as never).pageSize(1));\n } else {\n uow.find(tableName, (b) => b.whereIndex(\"primary\").pageSize(1));\n }\n // executeRetrieve runs an array of `find` operation results, which each return an array of rows\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result?.[0] ?? null;\n },\n\n async create(tableName, values) {\n const uow = createUOW();\n uow.create(tableName as string, values as never);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create record\");\n }\n\n const createdIds = uow.getCreatedIds();\n const createdId = createdIds[0];\n if (!createdId) {\n throw new Error(\"Failed to get created ID\");\n }\n return createdId;\n },\n\n async createMany(tableName, valuesArray) {\n const uow = createUOW();\n for (const values of valuesArray) {\n uow.create(tableName as string, values as never);\n }\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create records\");\n }\n\n return uow.getCreatedIds();\n },\n\n async update(tableName, id, builderFn) {\n const uow = createUOW();\n uow.update(tableName as string, id, builderFn as never);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update record (version conflict or record not found)\");\n }\n },\n\n async updateMany(tableName, builderFn) {\n // FIXME: This is not correct\n\n let whereConfig: { indexName?: string; condition?: unknown } = {};\n let setValues: unknown;\n\n const specialBuilder = {\n whereIndex(indexName: string, condition?: unknown) {\n whereConfig = { indexName, condition };\n return this;\n },\n set(values: unknown) {\n setValues = values;\n return this;\n },\n };\n\n builderFn(specialBuilder);\n\n if (!whereConfig.indexName) {\n throw new Error(\"whereIndex() must be called in updateMany\");\n }\n if (!setValues) {\n throw new Error(\"set() must be called in updateMany\");\n }\n\n const findUow = createUOW();\n findUow.find(tableName, (b) => {\n if (whereConfig.condition) {\n return b.whereIndex(whereConfig.indexName as never, whereConfig.condition as never);\n }\n return b.whereIndex(whereConfig.indexName as never);\n });\n const findResults = await findUow.executeRetrieve();\n const records = (findResults as unknown as [unknown])[0];\n\n // @ts-expect-error - Type narrowing doesn't work through unknown cast\n if (!records || records.length === 0) {\n return;\n }\n\n const updateUow = createUOW();\n for (const record of records as never as Array<{ id: unknown }>) {\n updateUow.update(tableName as string, record.id as string, (b) =>\n b.set(setValues as never),\n );\n }\n const { success } = await updateUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update records (version conflict)\");\n }\n },\n\n async delete(tableName, id, builderFn) {\n const uow = createUOW();\n uow.delete(tableName as string, id, builderFn as never);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete record (version conflict or record not found)\");\n }\n },\n\n async deleteMany(tableName, builderFn) {\n let whereConfig: { indexName?: string; condition?: unknown } = {};\n\n const specialBuilder = {\n whereIndex(indexName: string, condition?: unknown) {\n whereConfig = { indexName, condition };\n return this;\n },\n };\n\n builderFn(specialBuilder as never);\n\n if (!whereConfig.indexName) {\n throw new Error(\"whereIndex() must be called in deleteMany\");\n }\n\n const findUow = createUOW();\n findUow.find(tableName as string, (b) => {\n if (whereConfig.condition) {\n return b.whereIndex(whereConfig.indexName as never, whereConfig.condition as never);\n }\n return b.whereIndex(whereConfig.indexName as never);\n });\n const findResults2 = await findUow.executeRetrieve();\n const records = (findResults2 as unknown as [unknown])[0];\n\n // @ts-expect-error - Type narrowing doesn't work through unknown cast\n if (!records || records.length === 0) {\n return;\n }\n\n const deleteUow = createUOW();\n for (const record of records as never as Array<{ id: unknown }>) {\n deleteUow.delete(tableName as string, record.id as string);\n }\n const { success } = await deleteUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete records (version conflict)\");\n }\n },\n\n createUnitOfWork(name, uowConfig) {\n return createUOW(name, uowConfig);\n },\n } as AbstractQuery<T, DrizzleUOWConfig>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"drizzle-query.js","names":["whereConfig: { indexName?: string; condition?: unknown }","setValues: unknown"],"sources":["../../../src/adapters/drizzle/drizzle-query.ts"],"sourcesContent":["import type { AbstractQuery } from \"../../query/query\";\nimport type { AnySchema } from \"../../schema/create\";\nimport type { DrizzleConfig } from \"./drizzle-adapter\";\nimport type { CompiledMutation, UOWExecutor } from \"../../query/unit-of-work\";\nimport { createDrizzleUOWCompiler, type DrizzleCompiledQuery } from \"./drizzle-uow-compiler\";\nimport { executeDrizzleRetrievalPhase, executeDrizzleMutationPhase } from \"./drizzle-uow-executor\";\nimport { UnitOfWork } from \"../../query/unit-of-work\";\nimport { parseDrizzle, type DrizzleResult, type TableNameMapper } from \"./shared\";\nimport { createDrizzleUOWDecoder } from \"./drizzle-uow-decoder\";\n\n/**\n * Configuration options for creating a Drizzle Unit of Work\n */\nexport interface DrizzleUOWConfig {\n /**\n * Optional callback to receive compiled SQL queries for logging/debugging\n * This callback is invoked for each query as it's compiled\n */\n onQuery?: (query: DrizzleCompiledQuery) => void;\n}\n\n/**\n * Creates a Drizzle-based query engine for the given schema.\n *\n * This is the main entry point for creating a database query interface using Drizzle.\n * It uses a compiler-based architecture where queries are compiled to SQL and then executed,\n * enabling features like SQL snapshot testing.\n *\n * @param schema - The database schema definition\n * @param config - Drizzle configuration containing the database instance and provider\n * @param mapper - Optional table name mapper for namespace prefixing\n * @returns An AbstractQuery instance for performing database operations\n *\n * @example\n * ```ts\n * const queryEngine = fromDrizzle(mySchema, {\n * db: drizzle,\n * provider: 'postgresql'\n * });\n *\n * const uow = queryEngine.createUnitOfWork('myOperation');\n * ```\n */\nexport function fromDrizzle<T extends AnySchema>(\n schema: T,\n config: DrizzleConfig,\n mapper?: TableNameMapper,\n): AbstractQuery<T, DrizzleUOWConfig> {\n const [db] = parseDrizzle(config.db);\n const { provider } = config;\n\n function createUOW(name?: string, uowConfig?: DrizzleUOWConfig) {\n const uowCompiler = createDrizzleUOWCompiler(schema, config, mapper, uowConfig?.onQuery);\n\n const executor: UOWExecutor<DrizzleCompiledQuery, DrizzleResult> = {\n executeRetrievalPhase: (retrievalBatch: DrizzleCompiledQuery[]) =>\n executeDrizzleRetrievalPhase(db, retrievalBatch, provider),\n executeMutationPhase: (mutationBatch: CompiledMutation<DrizzleCompiledQuery>[]) =>\n executeDrizzleMutationPhase(db, mutationBatch, provider),\n };\n\n const decoder = createDrizzleUOWDecoder(schema, provider);\n\n return new UnitOfWork(schema, uowCompiler, executor, decoder, name);\n }\n\n return {\n find(tableName, builderFn) {\n const uow = createUOW();\n uow.find(tableName, builderFn);\n return uow.executeRetrieve();\n },\n\n async findFirst(tableName, builderFn) {\n const uow = createUOW();\n if (builderFn) {\n uow.find(tableName, (b) => builderFn(b as never).pageSize(1));\n } else {\n uow.find(tableName, (b) => b.whereIndex(\"primary\").pageSize(1));\n }\n // executeRetrieve runs an array of `find` operation results, which each return an array of rows\n const [result]: unknown[][] = await uow.executeRetrieve();\n return result?.[0] ?? null;\n },\n\n async create(tableName, values) {\n const uow = createUOW();\n uow.create(tableName as string, values as never);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create record\");\n }\n\n const createdIds = uow.getCreatedIds();\n const createdId = createdIds[0];\n if (!createdId) {\n throw new Error(\"Failed to get created ID\");\n }\n return createdId;\n },\n\n async createMany(tableName, valuesArray) {\n const uow = createUOW();\n for (const values of valuesArray) {\n uow.create(tableName as string, values as never);\n }\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create records\");\n }\n\n return uow.getCreatedIds();\n },\n\n async update(tableName, id, builderFn) {\n const uow = createUOW();\n uow.update(tableName as string, id, builderFn as never);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update record (version conflict or record not found)\");\n }\n },\n\n async updateMany(tableName, builderFn) {\n // FIXME: This is not correct\n\n let whereConfig: { indexName?: string; condition?: unknown } = {};\n let setValues: unknown;\n\n const specialBuilder = {\n whereIndex(indexName: string, condition?: unknown) {\n whereConfig = { indexName, condition };\n return this;\n },\n set(values: unknown) {\n setValues = values;\n return this;\n },\n };\n\n builderFn(specialBuilder);\n\n if (!whereConfig.indexName) {\n throw new Error(\"whereIndex() must be called in updateMany\");\n }\n if (!setValues) {\n throw new Error(\"set() must be called in updateMany\");\n }\n\n const findUow = createUOW();\n findUow.find(tableName, (b) => {\n if (whereConfig.condition) {\n return b.whereIndex(whereConfig.indexName as never, whereConfig.condition as never);\n }\n return b.whereIndex(whereConfig.indexName as never);\n });\n const findResults = await findUow.executeRetrieve();\n const records = (findResults as unknown as [unknown])[0];\n\n // @ts-expect-error - Type narrowing doesn't work through unknown cast\n if (!records || records.length === 0) {\n return;\n }\n\n const updateUow = createUOW();\n for (const record of records as never as Array<{ id: unknown }>) {\n updateUow.update(tableName as string, record.id as string, (b) =>\n b.set(setValues as never),\n );\n }\n const { success } = await updateUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to update records (version conflict)\");\n }\n },\n\n async delete(tableName, id, builderFn) {\n const uow = createUOW();\n uow.delete(tableName as string, id, builderFn as never);\n const { success } = await uow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete record (version conflict or record not found)\");\n }\n },\n\n async deleteMany(tableName, builderFn) {\n let whereConfig: { indexName?: string; condition?: unknown } = {};\n\n const specialBuilder = {\n whereIndex(indexName: string, condition?: unknown) {\n whereConfig = { indexName, condition };\n return this;\n },\n };\n\n builderFn(specialBuilder as never);\n\n if (!whereConfig.indexName) {\n throw new Error(\"whereIndex() must be called in deleteMany\");\n }\n\n const findUow = createUOW();\n findUow.find(tableName as string, (b) => {\n if (whereConfig.condition) {\n return b.whereIndex(whereConfig.indexName as never, whereConfig.condition as never);\n }\n return b.whereIndex(whereConfig.indexName as never);\n });\n const findResults2 = await findUow.executeRetrieve();\n const records = (findResults2 as unknown as [unknown])[0];\n\n // @ts-expect-error - Type narrowing doesn't work through unknown cast\n if (!records || records.length === 0) {\n return;\n }\n\n const deleteUow = createUOW();\n for (const record of records as never as Array<{ id: unknown }>) {\n deleteUow.delete(tableName as string, record.id as string);\n }\n const { success } = await deleteUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to delete records (version conflict)\");\n }\n },\n\n createUnitOfWork(name, uowConfig) {\n return createUOW(name, uowConfig);\n },\n } as AbstractQuery<T, DrizzleUOWConfig>;\n}\n"],"mappings":"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"}
@@ -2,10 +2,10 @@ import { Column } from "../../schema/create.js";
2
2
  import { serialize } from "../../schema/serialize.js";
3
3
  import { decodeCursor, serializeCursorValues } from "../../query/cursor.js";
4
4
  import { buildCondition } from "../../query/condition-builder.js";
5
- import { sql } from "../../node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/sql.js";
6
- import { and, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, not, notInArray, notLike, or } from "../../node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/conditions.js";
7
- import { asc, desc } from "../../node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/select.js";
8
- import { count } from "../../node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/functions/aggregate.js";
5
+ import { sql } from "../../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";
6
+ import { and, eq, gt, gte, inArray, isNotNull, isNull, like, lt, lte, ne, not, notInArray, notLike, or } from "../../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";
7
+ import { asc, desc } from "../../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";
8
+ import { count } from "../../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";
9
9
  import { parseDrizzle } from "./shared.js";
10
10
  import { ReferenceSubquery, encodeValues } from "../../query/result-transform.js";
11
11
  import { getOrderedJoinColumns } from "./join-column-utils.js";
@@ -45,12 +45,17 @@ function transformJoinArray(value, joinInfo, relationName) {
45
45
  * @param op - The retrieval operation containing join information
46
46
  * @returns Transformed row with join arrays converted to objects
47
47
  */
48
- function transformJoinArraysToObjects(row, op) {
48
+ function transformJoinArraysToObjects(row, op, provider) {
49
49
  if (op.type !== "find" || !op.options?.joins) return row;
50
50
  const transformedRow = { ...row };
51
51
  for (const join of op.options.joins) {
52
52
  const relationName = join.relation.name;
53
- const value = row[relationName];
53
+ let value = row[relationName];
54
+ if (provider === "sqlite" && typeof value === "string") try {
55
+ value = JSON.parse(value);
56
+ } catch {
57
+ continue;
58
+ }
54
59
  if (!Array.isArray(value)) continue;
55
60
  if (join.options === false) continue;
56
61
  if (!op.table.relations[relationName]) continue;
@@ -67,11 +72,16 @@ function createDrizzleUOWDecoder(_schema, provider) {
67
72
  const op = ops[index];
68
73
  if (!op) throw new Error("op must be defined");
69
74
  if (op.type === "count") {
70
- if (result.rows.length > 0 && result.rows[0]) return result.rows[0]["count"];
75
+ if (result.rows.length > 0 && result.rows[0]) {
76
+ const row = result.rows[0];
77
+ const countValue = row["count"] ?? row["count(*)"];
78
+ if (typeof countValue !== "number") throw new Error(`Unexpected result for count, received: ${countValue}`);
79
+ return countValue;
80
+ }
71
81
  return 0;
72
82
  }
73
83
  return result.rows.map((row) => {
74
- return decodeResult(transformJoinArraysToObjects(row, op), op.table, provider);
84
+ return decodeResult(transformJoinArraysToObjects(row, op, provider), op.table, provider);
75
85
  });
76
86
  });
77
87
  };
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-uow-decoder.js","names":["result: Record<string, unknown>"],"sources":["../../../src/adapters/drizzle/drizzle-uow-decoder.ts"],"sourcesContent":["import type { AnySchema, AnyTable } from \"../../schema/create\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport type { RetrievalOperation, UOWDecoder } from \"../../query/unit-of-work\";\nimport { decodeResult } from \"../../query/result-transform\";\nimport { getOrderedJoinColumns } from \"./join-column-utils\";\nimport type { DrizzleResult } from \"./shared\";\n\n/**\n * Join information with nested join support\n */\ninterface JoinInfo {\n relation: { name: string; table: AnyTable };\n options:\n | {\n select: true | string[];\n join?: JoinInfo[];\n }\n | false;\n}\n\n/**\n * Recursively transform join arrays to objects, handling nested joins.\n *\n * Drizzle joins use `json_build_array` where nested join data is appended after the parent's columns.\n * For example, if post has columns [id, title, content, _internalId, _version] and a nested author join,\n * the array will be: [id, title, content, _internalId, _version, authorArray]\n *\n * @param value - The join array from Drizzle\n * @param joinInfo - Join metadata including nested joins\n * @param relationName - Name of the current relation (for prefixing column names)\n * @returns Object with flattened keys (relationName:columnName) for all levels\n */\nfunction transformJoinArray(\n value: unknown[],\n joinInfo: JoinInfo,\n relationName: string,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n if (joinInfo.options === false) {\n return result;\n }\n\n const targetTable = joinInfo.relation.table;\n\n // Get ordered columns using shared utility (must match compiler's column order)\n const orderedSelectedColumns = getOrderedJoinColumns(targetTable, joinInfo.options.select);\n\n // Map column values to flattened format: relationName:columnName\n for (let i = 0; i < orderedSelectedColumns.length && i < value.length; i++) {\n const columnName = orderedSelectedColumns[i];\n if (columnName) {\n result[`${relationName}:${columnName}`] = value[i];\n }\n }\n\n // Handle nested joins - they appear after all columns in the array\n if (joinInfo.options.join && joinInfo.options.join.length > 0) {\n let nestedArrayIndex = orderedSelectedColumns.length;\n\n for (const nestedJoin of joinInfo.options.join) {\n const nestedRelationName = `${relationName}:${nestedJoin.relation.name}`;\n const nestedValue = value[nestedArrayIndex];\n\n if (Array.isArray(nestedValue)) {\n // Recursively transform nested join\n const nestedResult = transformJoinArray(nestedValue, nestedJoin, nestedRelationName);\n Object.assign(result, nestedResult);\n }\n\n nestedArrayIndex++;\n }\n }\n\n return result;\n}\n\n/**\n * Drizzle joins using `json_build_array` so the result is a tuple of values that we need to map to\n * the correct columns. This function handles nested joins recursively.\n *\n * @param row - Raw database result row that may contain join arrays\n * @param op - The retrieval operation containing join information\n * @returns Transformed row with join arrays converted to objects\n */\nfunction transformJoinArraysToObjects(\n row: Record<string, unknown>,\n op: {\n type: string;\n table: AnyTable;\n options?: {\n joins?: JoinInfo[];\n };\n },\n): Record<string, unknown> {\n // Only process find operations with joins\n if (op.type !== \"find\" || !op.options?.joins) {\n return row;\n }\n\n const transformedRow = { ...row };\n\n for (const join of op.options.joins) {\n const relationName = join.relation.name;\n const value = row[relationName];\n\n // Skip if not an array (join didn't return data)\n if (!Array.isArray(value)) {\n continue;\n }\n\n // Skip if join options are false (join was disabled)\n if (join.options === false) {\n continue;\n }\n\n // Get the target table for this relation\n const relation = op.table.relations[relationName];\n if (!relation) {\n continue;\n }\n\n // Recursively transform this join and its nested joins\n const joinResult = transformJoinArray(value, join, relationName);\n Object.assign(transformedRow, joinResult);\n\n // Remove the original array property\n delete transformedRow[relationName];\n }\n\n return transformedRow;\n}\n\nexport function createDrizzleUOWDecoder<TSchema extends AnySchema>(\n _schema: TSchema,\n provider: SQLProvider,\n): UOWDecoder<TSchema, DrizzleResult> {\n return (rawResults, ops) => {\n if (rawResults.length !== ops.length) {\n throw new Error(\"rawResults and ops must have the same length\");\n }\n\n return rawResults.map((result, index) => {\n const op = ops[index] as RetrievalOperation<TSchema>;\n if (!op) {\n throw new Error(\"op must be defined\");\n }\n\n // Handle count operations - return the count value directly\n if (op.type === \"count\") {\n if (result.rows.length > 0 && result.rows[0]) {\n const row = result.rows[0];\n return (row as Record<string, unknown>)[\"count\"] as number;\n }\n return 0;\n }\n\n // Handle find operations - decode each row\n return result.rows.map((row) => {\n const transformedRow = transformJoinArraysToObjects(row, op);\n return decodeResult(transformedRow, op.table, provider);\n });\n });\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAgCA,SAAS,mBACP,OACA,UACA,cACyB;CACzB,MAAMA,SAAkC,EAAE;AAE1C,KAAI,SAAS,YAAY,MACvB,QAAO;CAGT,MAAM,cAAc,SAAS,SAAS;CAGtC,MAAM,yBAAyB,sBAAsB,aAAa,SAAS,QAAQ,OAAO;AAG1F,MAAK,IAAI,IAAI,GAAG,IAAI,uBAAuB,UAAU,IAAI,MAAM,QAAQ,KAAK;EAC1E,MAAM,aAAa,uBAAuB;AAC1C,MAAI,WACF,QAAO,GAAG,aAAa,GAAG,gBAAgB,MAAM;;AAKpD,KAAI,SAAS,QAAQ,QAAQ,SAAS,QAAQ,KAAK,SAAS,GAAG;EAC7D,IAAI,mBAAmB,uBAAuB;AAE9C,OAAK,MAAM,cAAc,SAAS,QAAQ,MAAM;GAC9C,MAAM,qBAAqB,GAAG,aAAa,GAAG,WAAW,SAAS;GAClE,MAAM,cAAc,MAAM;AAE1B,OAAI,MAAM,QAAQ,YAAY,EAAE;IAE9B,MAAM,eAAe,mBAAmB,aAAa,YAAY,mBAAmB;AACpF,WAAO,OAAO,QAAQ,aAAa;;AAGrC;;;AAIJ,QAAO;;;;;;;;;;AAWT,SAAS,6BACP,KACA,IAOyB;AAEzB,KAAI,GAAG,SAAS,UAAU,CAAC,GAAG,SAAS,MACrC,QAAO;CAGT,MAAM,iBAAiB,EAAE,GAAG,KAAK;AAEjC,MAAK,MAAM,QAAQ,GAAG,QAAQ,OAAO;EACnC,MAAM,eAAe,KAAK,SAAS;EACnC,MAAM,QAAQ,IAAI;AAGlB,MAAI,CAAC,MAAM,QAAQ,MAAM,CACvB;AAIF,MAAI,KAAK,YAAY,MACnB;AAKF,MAAI,CADa,GAAG,MAAM,UAAU,cAElC;EAIF,MAAM,aAAa,mBAAmB,OAAO,MAAM,aAAa;AAChE,SAAO,OAAO,gBAAgB,WAAW;AAGzC,SAAO,eAAe;;AAGxB,QAAO;;AAGT,SAAgB,wBACd,SACA,UACoC;AACpC,SAAQ,YAAY,QAAQ;AAC1B,MAAI,WAAW,WAAW,IAAI,OAC5B,OAAM,IAAI,MAAM,+CAA+C;AAGjE,SAAO,WAAW,KAAK,QAAQ,UAAU;GACvC,MAAM,KAAK,IAAI;AACf,OAAI,CAAC,GACH,OAAM,IAAI,MAAM,qBAAqB;AAIvC,OAAI,GAAG,SAAS,SAAS;AACvB,QAAI,OAAO,KAAK,SAAS,KAAK,OAAO,KAAK,GAExC,QADY,OAAO,KAAK,GACgB;AAE1C,WAAO;;AAIT,UAAO,OAAO,KAAK,KAAK,QAAQ;AAE9B,WAAO,aADgB,6BAA6B,KAAK,GAAG,EACxB,GAAG,OAAO,SAAS;KACvD;IACF"}
1
+ {"version":3,"file":"drizzle-uow-decoder.js","names":["result: Record<string, unknown>"],"sources":["../../../src/adapters/drizzle/drizzle-uow-decoder.ts"],"sourcesContent":["import type { AnySchema, AnyTable } from \"../../schema/create\";\nimport type { SQLProvider } from \"../../shared/providers\";\nimport type { RetrievalOperation, UOWDecoder } from \"../../query/unit-of-work\";\nimport { decodeResult } from \"../../query/result-transform\";\nimport { getOrderedJoinColumns } from \"./join-column-utils\";\nimport type { DrizzleResult } from \"./shared\";\n\n/**\n * Join information with nested join support\n */\ninterface JoinInfo {\n relation: { name: string; table: AnyTable };\n options:\n | {\n select: true | string[];\n join?: JoinInfo[];\n }\n | false;\n}\n\n/**\n * Recursively transform join arrays to objects, handling nested joins.\n *\n * Drizzle joins use `json_build_array` where nested join data is appended after the parent's columns.\n * For example, if post has columns [id, title, content, _internalId, _version] and a nested author join,\n * the array will be: [id, title, content, _internalId, _version, authorArray]\n *\n * @param value - The join array from Drizzle\n * @param joinInfo - Join metadata including nested joins\n * @param relationName - Name of the current relation (for prefixing column names)\n * @returns Object with flattened keys (relationName:columnName) for all levels\n */\nfunction transformJoinArray(\n value: unknown[],\n joinInfo: JoinInfo,\n relationName: string,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n if (joinInfo.options === false) {\n return result;\n }\n\n const targetTable = joinInfo.relation.table;\n\n // Get ordered columns using shared utility (must match compiler's column order)\n const orderedSelectedColumns = getOrderedJoinColumns(targetTable, joinInfo.options.select);\n\n // Map column values to flattened format: relationName:columnName\n for (let i = 0; i < orderedSelectedColumns.length && i < value.length; i++) {\n const columnName = orderedSelectedColumns[i];\n if (columnName) {\n result[`${relationName}:${columnName}`] = value[i];\n }\n }\n\n // Handle nested joins - they appear after all columns in the array\n if (joinInfo.options.join && joinInfo.options.join.length > 0) {\n let nestedArrayIndex = orderedSelectedColumns.length;\n\n for (const nestedJoin of joinInfo.options.join) {\n const nestedRelationName = `${relationName}:${nestedJoin.relation.name}`;\n const nestedValue = value[nestedArrayIndex];\n\n if (Array.isArray(nestedValue)) {\n // Recursively transform nested join\n const nestedResult = transformJoinArray(nestedValue, nestedJoin, nestedRelationName);\n Object.assign(result, nestedResult);\n }\n\n nestedArrayIndex++;\n }\n }\n\n return result;\n}\n\n/**\n * Drizzle joins using `json_build_array` so the result is a tuple of values that we need to map to\n * the correct columns. This function handles nested joins recursively.\n *\n * @param row - Raw database result row that may contain join arrays\n * @param op - The retrieval operation containing join information\n * @returns Transformed row with join arrays converted to objects\n */\nfunction transformJoinArraysToObjects(\n row: Record<string, unknown>,\n op: {\n type: string;\n table: AnyTable;\n options?: {\n joins?: JoinInfo[];\n };\n },\n provider: SQLProvider,\n): Record<string, unknown> {\n // Only process find operations with joins\n if (op.type !== \"find\" || !op.options?.joins) {\n return row;\n }\n\n const transformedRow = { ...row };\n\n for (const join of op.options.joins) {\n const relationName = join.relation.name;\n let value = row[relationName];\n\n // For SQLite, json_array returns a JSON string that needs to be parsed\n if (provider === \"sqlite\" && typeof value === \"string\") {\n try {\n value = JSON.parse(value) as unknown;\n } catch {\n // If parsing fails, skip this join\n continue;\n }\n }\n\n // Skip if not an array (join didn't return data)\n if (!Array.isArray(value)) {\n continue;\n }\n\n // Skip if join options are false (join was disabled)\n if (join.options === false) {\n continue;\n }\n\n // Get the target table for this relation\n const relation = op.table.relations[relationName];\n if (!relation) {\n continue;\n }\n\n // Recursively transform this join and its nested joins\n const joinResult = transformJoinArray(value, join, relationName);\n Object.assign(transformedRow, joinResult);\n\n // Remove the original array property\n delete transformedRow[relationName];\n }\n\n return transformedRow;\n}\n\nexport function createDrizzleUOWDecoder<TSchema extends AnySchema>(\n _schema: TSchema,\n provider: SQLProvider,\n): UOWDecoder<TSchema, DrizzleResult> {\n return (rawResults, ops) => {\n if (rawResults.length !== ops.length) {\n throw new Error(\"rawResults and ops must have the same length\");\n }\n\n return rawResults.map((result, index) => {\n const op = ops[index] as RetrievalOperation<TSchema>;\n if (!op) {\n throw new Error(\"op must be defined\");\n }\n\n // Handle count operations - return the count value directly\n if (op.type === \"count\") {\n if (result.rows.length > 0 && result.rows[0]) {\n const row = result.rows[0] as Record<string, unknown>;\n const countValue = row[\"count\"] ?? row[\"count(*)\"];\n\n if (typeof countValue !== \"number\") {\n throw new Error(`Unexpected result for count, received: ${countValue}`);\n }\n\n return countValue;\n }\n return 0;\n }\n\n // Handle find operations - decode each row\n return result.rows.map((row) => {\n const transformedRow = transformJoinArraysToObjects(row, op, provider);\n return decodeResult(transformedRow, op.table, provider);\n });\n });\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAgCA,SAAS,mBACP,OACA,UACA,cACyB;CACzB,MAAMA,SAAkC,EAAE;AAE1C,KAAI,SAAS,YAAY,MACvB,QAAO;CAGT,MAAM,cAAc,SAAS,SAAS;CAGtC,MAAM,yBAAyB,sBAAsB,aAAa,SAAS,QAAQ,OAAO;AAG1F,MAAK,IAAI,IAAI,GAAG,IAAI,uBAAuB,UAAU,IAAI,MAAM,QAAQ,KAAK;EAC1E,MAAM,aAAa,uBAAuB;AAC1C,MAAI,WACF,QAAO,GAAG,aAAa,GAAG,gBAAgB,MAAM;;AAKpD,KAAI,SAAS,QAAQ,QAAQ,SAAS,QAAQ,KAAK,SAAS,GAAG;EAC7D,IAAI,mBAAmB,uBAAuB;AAE9C,OAAK,MAAM,cAAc,SAAS,QAAQ,MAAM;GAC9C,MAAM,qBAAqB,GAAG,aAAa,GAAG,WAAW,SAAS;GAClE,MAAM,cAAc,MAAM;AAE1B,OAAI,MAAM,QAAQ,YAAY,EAAE;IAE9B,MAAM,eAAe,mBAAmB,aAAa,YAAY,mBAAmB;AACpF,WAAO,OAAO,QAAQ,aAAa;;AAGrC;;;AAIJ,QAAO;;;;;;;;;;AAWT,SAAS,6BACP,KACA,IAOA,UACyB;AAEzB,KAAI,GAAG,SAAS,UAAU,CAAC,GAAG,SAAS,MACrC,QAAO;CAGT,MAAM,iBAAiB,EAAE,GAAG,KAAK;AAEjC,MAAK,MAAM,QAAQ,GAAG,QAAQ,OAAO;EACnC,MAAM,eAAe,KAAK,SAAS;EACnC,IAAI,QAAQ,IAAI;AAGhB,MAAI,aAAa,YAAY,OAAO,UAAU,SAC5C,KAAI;AACF,WAAQ,KAAK,MAAM,MAAM;UACnB;AAEN;;AAKJ,MAAI,CAAC,MAAM,QAAQ,MAAM,CACvB;AAIF,MAAI,KAAK,YAAY,MACnB;AAKF,MAAI,CADa,GAAG,MAAM,UAAU,cAElC;EAIF,MAAM,aAAa,mBAAmB,OAAO,MAAM,aAAa;AAChE,SAAO,OAAO,gBAAgB,WAAW;AAGzC,SAAO,eAAe;;AAGxB,QAAO;;AAGT,SAAgB,wBACd,SACA,UACoC;AACpC,SAAQ,YAAY,QAAQ;AAC1B,MAAI,WAAW,WAAW,IAAI,OAC5B,OAAM,IAAI,MAAM,+CAA+C;AAGjE,SAAO,WAAW,KAAK,QAAQ,UAAU;GACvC,MAAM,KAAK,IAAI;AACf,OAAI,CAAC,GACH,OAAM,IAAI,MAAM,qBAAqB;AAIvC,OAAI,GAAG,SAAS,SAAS;AACvB,QAAI,OAAO,KAAK,SAAS,KAAK,OAAO,KAAK,IAAI;KAC5C,MAAM,MAAM,OAAO,KAAK;KACxB,MAAM,aAAa,IAAI,YAAY,IAAI;AAEvC,SAAI,OAAO,eAAe,SACxB,OAAM,IAAI,MAAM,0CAA0C,aAAa;AAGzE,YAAO;;AAET,WAAO;;AAIT,UAAO,OAAO,KAAK,KAAK,QAAQ;AAE9B,WAAO,aADgB,6BAA6B,KAAK,IAAI,SAAS,EAClC,GAAG,OAAO,SAAS;KACvD;IACF"}
@@ -1,15 +1,15 @@
1
- import { SQL, StringChunk, sql } from "../../node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/sql.js";
1
+ import { SQL, StringChunk, sql } from "../../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";
2
+ import { SQLiteSyncDialect } from "../../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";
3
+ import { BaseSQLiteDatabase } from "../../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";
2
4
 
3
5
  //#region src/adapters/drizzle/drizzle-uow-executor.ts
4
- /**
5
- * Convert a DrizzleCompiledQuery (SQL string + params) to a Drizzle SQL object
6
- *
7
- * This reconstructs the SQL object with proper parameter chunks by parsing
8
- * the SQL string and replacing placeholders ($1, $2, etc.) with Param objects.
9
- * Uses Drizzle's exported classes (StringChunk, Param, SQL) to build the queryChunks.
10
- */
11
- function toSQL(query) {
12
- const { sql: sqlString, params } = query;
6
+ function isSyncSQLite(db) {
7
+ return db instanceof BaseSQLiteDatabase && "dialect" in db && db.dialect instanceof SQLiteSyncDialect;
8
+ }
9
+ function assertSyncSQLite(db) {
10
+ if (!isSyncSQLite(db)) throw new Error("Expected synchronous SQLite database (better-sqlite3)");
11
+ }
12
+ function postgresToSQL(sqlString, params) {
13
13
  const placeholderRegex = /\$(\d+)/g;
14
14
  const queryChunks = [];
15
15
  let lastIndex = 0;
@@ -23,46 +23,78 @@ function toSQL(query) {
23
23
  }
24
24
  const textAfter = sqlString.substring(lastIndex);
25
25
  if (textAfter) queryChunks.push(new StringChunk(textAfter));
26
- return new SQL(queryChunks);
26
+ return queryChunks;
27
+ }
28
+ function sqliteToSQL(sqlString, params) {
29
+ const chunks = [];
30
+ let currentIndex = 0;
31
+ const parts = sqlString.split("?");
32
+ for (let i = 0; i < parts.length; i++) {
33
+ if (parts[i]) chunks.push(new StringChunk(parts[i]));
34
+ if (i < parts.length - 1 && currentIndex < params.length) chunks.push(sql.param(params[currentIndex++]));
35
+ }
36
+ return chunks;
37
+ }
38
+ function toSQL(query, provider) {
39
+ const { sql: sqlString, params } = query;
40
+ return new SQL(provider === "sqlite" ? sqliteToSQL(sqlString, params) : postgresToSQL(sqlString, params));
27
41
  }
28
- /**
29
- * Get the number of affected rows from a Drizzle query result
30
- */
31
42
  function getAffectedRows(result) {
32
43
  if (Array.isArray(result)) return result.length;
33
- if (result && typeof result === "object" && "affectedRows" in result && typeof result["affectedRows"] === "number") return result["affectedRows"];
34
- if (result && typeof result === "object" && "rowCount" in result && (typeof result["rowCount"] === "number" || typeof result["rowCount"] === "bigint")) {
35
- const rowCount = result["rowCount"];
36
- if (rowCount > Number.MAX_SAFE_INTEGER) throw new Error(`rowCount BigInt value ${rowCount.toString()} exceeds JS safe integer range`);
37
- return Number(rowCount);
38
- }
39
44
  if (result && typeof result === "object") {
45
+ if ("affectedRows" in result && typeof result["affectedRows"] === "number") return result["affectedRows"];
46
+ if ("rowCount" in result && (typeof result["rowCount"] === "number" || typeof result["rowCount"] === "bigint")) {
47
+ const rowCount = result["rowCount"];
48
+ if (rowCount > Number.MAX_SAFE_INTEGER) throw new Error(`rowCount BigInt value ${rowCount.toString()} exceeds JS safe integer range`);
49
+ return Number(rowCount);
50
+ }
40
51
  if ("changes" in result && typeof result["changes"] === "number") return result["changes"];
41
52
  }
42
53
  throw new Error(`Unable to determine affected rows from result: ${JSON.stringify(result)}`);
43
54
  }
55
+ async function executeInTransaction(db, provider, syncExecutor, asyncExecutor) {
56
+ if (provider === "sqlite" && isSyncSQLite(db)) {
57
+ assertSyncSQLite(db);
58
+ db.transaction(() => syncExecutor(db));
59
+ } else await db.transaction(async (tx) => await asyncExecutor(tx));
60
+ }
61
+ function extractCreatedInternalId(result) {
62
+ if (result && typeof result === "object" && "lastInsertRowid" in result) {
63
+ if (typeof result.lastInsertRowid === "bigint") return result.lastInsertRowid;
64
+ if (typeof result.lastInsertRowid === "number") return BigInt(result.lastInsertRowid);
65
+ throw new Error(`Unexpected lastInsertRowid type: ${typeof result.lastInsertRowid}`);
66
+ }
67
+ if (Array.isArray(result) && result.length > 0) {
68
+ const row = result[0];
69
+ if ("_internalId" in row || "_internal_id" in row) return row["_internalId"] ?? row["_internal_id"];
70
+ }
71
+ return null;
72
+ }
73
+ function validateAffectedRows(result, expected) {
74
+ const actual = getAffectedRows(result);
75
+ if (actual !== expected) throw new Error(`Version conflict: expected ${expected} rows affected, but got ${actual}`);
76
+ }
44
77
  /**
45
78
  * Execute the retrieval phase of a Unit of Work using Drizzle
46
79
  *
47
80
  * All retrieval queries are executed inside a single transaction to ensure
48
81
  * snapshot isolation - all reads see a consistent view of the database.
49
- *
50
- * @param db - The Drizzle database instance
51
- * @param retrievalBatch - Array of Drizzle SQL queries
52
- * @returns Array of query results matching the retrieval operations order
53
- *
54
- * @example
55
- * ```ts
56
- * const retrievalResults = await executeDrizzleRetrievalPhase(db, compiled.retrievalBatch);
57
- * const [users, posts] = retrievalResults;
58
- * ```
59
82
  */
60
- async function executeDrizzleRetrievalPhase(db, retrievalBatch) {
83
+ async function executeDrizzleRetrievalPhase(db, retrievalBatch, provider) {
61
84
  if (retrievalBatch.length === 0) return [];
62
85
  const retrievalResults = [];
63
- await db.transaction(async (tx) => {
86
+ await executeInTransaction(db, provider, (syncDb) => {
64
87
  for (const query of retrievalBatch) {
65
- const result = await tx.execute(toSQL(query));
88
+ const sqlObj = toSQL(query, provider);
89
+ const result = {
90
+ rows: syncDb.all(sqlObj),
91
+ affectedRows: 0
92
+ };
93
+ retrievalResults.push(result);
94
+ }
95
+ }, async (tx) => {
96
+ for (const query of retrievalBatch) {
97
+ const result = await tx.execute(toSQL(query, provider));
66
98
  retrievalResults.push(result);
67
99
  }
68
100
  });
@@ -74,40 +106,26 @@ async function executeDrizzleRetrievalPhase(db, retrievalBatch) {
74
106
  * All mutation queries are executed in a transaction with optimistic locking.
75
107
  * If any version check fails, the entire transaction is rolled back and
76
108
  * success=false is returned.
77
- *
78
- * @param db - The Drizzle database instance
79
- * @param mutationBatch - Array of compiled mutation SQL queries with expected affected rows
80
- * @returns Object with success flag and internal IDs from create operations
81
- *
82
- * @example
83
- * ```ts
84
- * const { success } = await executeDrizzleMutationPhase(db, compiled.mutationBatch);
85
- * if (!success) {
86
- * console.log("Version conflict detected, retrying...");
87
- * }
88
- * ```
89
109
  */
90
- async function executeDrizzleMutationPhase(db, mutationBatch) {
110
+ async function executeDrizzleMutationPhase(db, mutationBatch, provider) {
91
111
  if (mutationBatch.length === 0) return {
92
112
  success: true,
93
113
  createdInternalIds: []
94
114
  };
95
115
  const createdInternalIds = [];
96
116
  try {
97
- await db.transaction(async (tx) => {
98
- for (const compiledMutation of mutationBatch) {
99
- const result = await tx.execute(toSQL(compiledMutation.query));
100
- if (compiledMutation.expectedAffectedRows === null) if (Array.isArray(result) && result.length > 0) {
101
- const row = result[0];
102
- if ("_internalId" in row || "_internal_id" in row) {
103
- const internalId = row["_internalId"] ?? row["_internal_id"];
104
- createdInternalIds.push(internalId);
105
- } else createdInternalIds.push(null);
106
- } else createdInternalIds.push(null);
107
- else {
108
- const affectedRows = getAffectedRows(result);
109
- if (affectedRows !== compiledMutation.expectedAffectedRows) throw new Error(`Version conflict: expected ${compiledMutation.expectedAffectedRows} rows affected, but got ${affectedRows}`);
110
- }
117
+ await executeInTransaction(db, provider, (syncDb) => {
118
+ for (const { query, expectedAffectedRows } of mutationBatch) {
119
+ const sqlObj = toSQL(query, provider);
120
+ const result = syncDb.run(sqlObj);
121
+ if (expectedAffectedRows === null) createdInternalIds.push(extractCreatedInternalId(result));
122
+ else validateAffectedRows(result, expectedAffectedRows);
123
+ }
124
+ }, async (tx) => {
125
+ for (const { query, expectedAffectedRows } of mutationBatch) {
126
+ const result = await tx.execute(toSQL(query, provider));
127
+ if (expectedAffectedRows === null) createdInternalIds.push(extractCreatedInternalId(result));
128
+ else validateAffectedRows(result, expectedAffectedRows);
111
129
  }
112
130
  });
113
131
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-uow-executor.js","names":["queryChunks: SQLChunk[]","match: RegExpExecArray | null","retrievalResults: DrizzleResult[]","createdInternalIds: (bigint | null)[]"],"sources":["../../../src/adapters/drizzle/drizzle-uow-executor.ts"],"sourcesContent":["import { SQL, StringChunk, sql, type SQLChunk } from \"drizzle-orm\";\nimport type { CompiledMutation, MutationResult } from \"../../query/unit-of-work\";\nimport type { DBType } from \"./shared\";\nimport type { DrizzleCompiledQuery } from \"./drizzle-uow-compiler\";\nimport type { DrizzleResult } from \"./shared\";\n\n/**\n * Convert a DrizzleCompiledQuery (SQL string + params) to a Drizzle SQL object\n *\n * This reconstructs the SQL object with proper parameter chunks by parsing\n * the SQL string and replacing placeholders ($1, $2, etc.) with Param objects.\n * Uses Drizzle's exported classes (StringChunk, Param, SQL) to build the queryChunks.\n */\nfunction toSQL(query: DrizzleCompiledQuery): SQL {\n const { sql: sqlString, params } = query;\n\n // Match parameter placeholders like $1, $2, etc.\n const placeholderRegex = /\\$(\\d+)/g;\n const queryChunks: SQLChunk[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = placeholderRegex.exec(sqlString)) !== null) {\n // Add the string chunk before the placeholder\n const textBefore = sqlString.substring(lastIndex, match.index);\n if (textBefore) {\n queryChunks.push(new StringChunk(textBefore));\n }\n\n // Add the parameter value as a Param\n const paramIndex = parseInt(match[1]!, 10) - 1; // $1 is index 0\n queryChunks.push(sql.param(params[paramIndex]));\n\n lastIndex = match.index + match[0].length;\n }\n\n // Add any remaining string after the last placeholder\n const textAfter = sqlString.substring(lastIndex);\n if (textAfter) {\n queryChunks.push(new StringChunk(textAfter));\n }\n\n // Construct SQL object directly with queryChunks (same pattern as sql`` tagged template)\n // Safe: We're reusing Drizzle's SQL constructor the same way the sql`` function does\n return new SQL(queryChunks);\n}\n\n/**\n * Get the number of affected rows from a Drizzle query result\n */\nfunction getAffectedRows(result: unknown): number {\n // Drizzle returns different formats depending on the database\n // For MySQL: array with affectedRows property\n // For PostgreSQL/SQLite: array with rowCount or similar\n if (Array.isArray(result)) {\n // This is likely a select/returning result\n return result.length;\n }\n\n // Check for MySQL-style result\n if (\n result &&\n typeof result === \"object\" &&\n \"affectedRows\" in result &&\n typeof result[\"affectedRows\"] === \"number\"\n ) {\n return result[\"affectedRows\"];\n }\n\n // Check for PostgreSQL-style result with rowCount\n if (\n result &&\n typeof result === \"object\" &&\n \"rowCount\" in result &&\n (typeof result[\"rowCount\"] === \"number\" || typeof result[\"rowCount\"] === \"bigint\")\n ) {\n const rowCount = result[\"rowCount\"];\n if (rowCount > Number.MAX_SAFE_INTEGER) {\n throw new Error(`rowCount BigInt value ${rowCount.toString()} exceeds JS safe integer range`);\n }\n return Number(rowCount);\n }\n\n // For update/delete operations, Drizzle might return an object with affected rows info\n // Try to extract it from common patterns\n if (result && typeof result === \"object\") {\n // Check for changes/changes count\n if (\"changes\" in result && typeof result[\"changes\"] === \"number\") {\n return result[\"changes\"];\n }\n }\n\n throw new Error(`Unable to determine affected rows from result: ${JSON.stringify(result)}`);\n}\n\n/**\n * Execute the retrieval phase of a Unit of Work using Drizzle\n *\n * All retrieval queries are executed inside a single transaction to ensure\n * snapshot isolation - all reads see a consistent view of the database.\n *\n * @param db - The Drizzle database instance\n * @param retrievalBatch - Array of Drizzle SQL queries\n * @returns Array of query results matching the retrieval operations order\n *\n * @example\n * ```ts\n * const retrievalResults = await executeDrizzleRetrievalPhase(db, compiled.retrievalBatch);\n * const [users, posts] = retrievalResults;\n * ```\n */\nexport async function executeDrizzleRetrievalPhase(\n db: DBType,\n retrievalBatch: DrizzleCompiledQuery[],\n): Promise<DrizzleResult[]> {\n // If no retrieval operations, return empty array immediately\n if (retrievalBatch.length === 0) {\n return [];\n }\n\n const retrievalResults: DrizzleResult[] = [];\n\n // Execute all retrieval queries inside a transaction for snapshot isolation\n await db.transaction(async (tx) => {\n for (const query of retrievalBatch) {\n const result = (await tx.execute(toSQL(query))) as DrizzleResult;\n retrievalResults.push(result);\n }\n });\n\n return retrievalResults;\n}\n\n/**\n * Execute the mutation phase of a Unit of Work using Drizzle\n *\n * All mutation queries are executed in a transaction with optimistic locking.\n * If any version check fails, the entire transaction is rolled back and\n * success=false is returned.\n *\n * @param db - The Drizzle database instance\n * @param mutationBatch - Array of compiled mutation SQL queries with expected affected rows\n * @returns Object with success flag and internal IDs from create operations\n *\n * @example\n * ```ts\n * const { success } = await executeDrizzleMutationPhase(db, compiled.mutationBatch);\n * if (!success) {\n * console.log(\"Version conflict detected, retrying...\");\n * }\n * ```\n */\nexport async function executeDrizzleMutationPhase(\n db: DBType,\n mutationBatch: CompiledMutation<DrizzleCompiledQuery>[],\n): Promise<MutationResult> {\n // If there are no mutations, return success immediately\n if (mutationBatch.length === 0) {\n return { success: true, createdInternalIds: [] };\n }\n\n const createdInternalIds: (bigint | null)[] = [];\n\n // Execute mutation batch in a transaction\n try {\n await db.transaction(async (tx) => {\n for (const compiledMutation of mutationBatch) {\n const result = await tx.execute(toSQL(compiledMutation.query));\n\n // For creates (expectedAffectedRows === null), try to extract internal ID\n if (compiledMutation.expectedAffectedRows === null) {\n // Check if result is an array with rows (RETURNING clause supported)\n if (Array.isArray(result) && result.length > 0) {\n const row = result[0] as Record<string, unknown>;\n // Look for _internalId column in the returned row\n if (\"_internalId\" in row || \"_internal_id\" in row) {\n const internalId = (row[\"_internalId\"] ?? row[\"_internal_id\"]) as bigint;\n createdInternalIds.push(internalId);\n } else {\n // RETURNING supported but _internalId not found\n createdInternalIds.push(null);\n }\n } else {\n // No RETURNING support (e.g., MySQL)\n createdInternalIds.push(null);\n }\n } else {\n // Check affected rows for updates/deletes\n const affectedRows = getAffectedRows(result);\n\n if (affectedRows !== compiledMutation.expectedAffectedRows) {\n // Version conflict detected - the UPDATE/DELETE didn't affect the expected number of rows\n // This means either the row doesn't exist or the version has changed\n throw new Error(\n `Version conflict: expected ${compiledMutation.expectedAffectedRows} rows affected, but got ${affectedRows}`,\n );\n }\n }\n }\n });\n\n return { success: true, createdInternalIds };\n } catch (error) {\n // Transaction failed - could be version conflict or other constraint violation\n // Return success=false to indicate the UOW should be retried\n if (error instanceof Error && error.message.includes(\"Version conflict\")) {\n return { success: false };\n }\n\n // Other database errors should be thrown\n throw error;\n }\n}\n"],"mappings":";;;;;;;;;;AAaA,SAAS,MAAM,OAAkC;CAC/C,MAAM,EAAE,KAAK,WAAW,WAAW;CAGnC,MAAM,mBAAmB;CACzB,MAAMA,cAA0B,EAAE;CAClC,IAAI,YAAY;CAChB,IAAIC;AAEJ,SAAQ,QAAQ,iBAAiB,KAAK,UAAU,MAAM,MAAM;EAE1D,MAAM,aAAa,UAAU,UAAU,WAAW,MAAM,MAAM;AAC9D,MAAI,WACF,aAAY,KAAK,IAAI,YAAY,WAAW,CAAC;EAI/C,MAAM,aAAa,SAAS,MAAM,IAAK,GAAG,GAAG;AAC7C,cAAY,KAAK,IAAI,MAAM,OAAO,YAAY,CAAC;AAE/C,cAAY,MAAM,QAAQ,MAAM,GAAG;;CAIrC,MAAM,YAAY,UAAU,UAAU,UAAU;AAChD,KAAI,UACF,aAAY,KAAK,IAAI,YAAY,UAAU,CAAC;AAK9C,QAAO,IAAI,IAAI,YAAY;;;;;AAM7B,SAAS,gBAAgB,QAAyB;AAIhD,KAAI,MAAM,QAAQ,OAAO,CAEvB,QAAO,OAAO;AAIhB,KACE,UACA,OAAO,WAAW,YAClB,kBAAkB,UAClB,OAAO,OAAO,oBAAoB,SAElC,QAAO,OAAO;AAIhB,KACE,UACA,OAAO,WAAW,YAClB,cAAc,WACb,OAAO,OAAO,gBAAgB,YAAY,OAAO,OAAO,gBAAgB,WACzE;EACA,MAAM,WAAW,OAAO;AACxB,MAAI,WAAW,OAAO,iBACpB,OAAM,IAAI,MAAM,yBAAyB,SAAS,UAAU,CAAC,gCAAgC;AAE/F,SAAO,OAAO,SAAS;;AAKzB,KAAI,UAAU,OAAO,WAAW,UAE9B;MAAI,aAAa,UAAU,OAAO,OAAO,eAAe,SACtD,QAAO,OAAO;;AAIlB,OAAM,IAAI,MAAM,kDAAkD,KAAK,UAAU,OAAO,GAAG;;;;;;;;;;;;;;;;;;AAmB7F,eAAsB,6BACpB,IACA,gBAC0B;AAE1B,KAAI,eAAe,WAAW,EAC5B,QAAO,EAAE;CAGX,MAAMC,mBAAoC,EAAE;AAG5C,OAAM,GAAG,YAAY,OAAO,OAAO;AACjC,OAAK,MAAM,SAAS,gBAAgB;GAClC,MAAM,SAAU,MAAM,GAAG,QAAQ,MAAM,MAAM,CAAC;AAC9C,oBAAiB,KAAK,OAAO;;GAE/B;AAEF,QAAO;;;;;;;;;;;;;;;;;;;;;AAsBT,eAAsB,4BACpB,IACA,eACyB;AAEzB,KAAI,cAAc,WAAW,EAC3B,QAAO;EAAE,SAAS;EAAM,oBAAoB,EAAE;EAAE;CAGlD,MAAMC,qBAAwC,EAAE;AAGhD,KAAI;AACF,QAAM,GAAG,YAAY,OAAO,OAAO;AACjC,QAAK,MAAM,oBAAoB,eAAe;IAC5C,MAAM,SAAS,MAAM,GAAG,QAAQ,MAAM,iBAAiB,MAAM,CAAC;AAG9D,QAAI,iBAAiB,yBAAyB,KAE5C,KAAI,MAAM,QAAQ,OAAO,IAAI,OAAO,SAAS,GAAG;KAC9C,MAAM,MAAM,OAAO;AAEnB,SAAI,iBAAiB,OAAO,kBAAkB,KAAK;MACjD,MAAM,aAAc,IAAI,kBAAkB,IAAI;AAC9C,yBAAmB,KAAK,WAAW;WAGnC,oBAAmB,KAAK,KAAK;UAI/B,oBAAmB,KAAK,KAAK;SAE1B;KAEL,MAAM,eAAe,gBAAgB,OAAO;AAE5C,SAAI,iBAAiB,iBAAiB,qBAGpC,OAAM,IAAI,MACR,8BAA8B,iBAAiB,qBAAqB,0BAA0B,eAC/F;;;IAIP;AAEF,SAAO;GAAE,SAAS;GAAM;GAAoB;UACrC,OAAO;AAGd,MAAI,iBAAiB,SAAS,MAAM,QAAQ,SAAS,mBAAmB,CACtE,QAAO,EAAE,SAAS,OAAO;AAI3B,QAAM"}
1
+ {"version":3,"file":"drizzle-uow-executor.js","names":["queryChunks: SQLChunk[]","match: RegExpExecArray | null","chunks: SQLChunk[]","retrievalResults: DrizzleResult[]","result: DrizzleResult","createdInternalIds: (bigint | null)[]"],"sources":["../../../src/adapters/drizzle/drizzle-uow-executor.ts"],"sourcesContent":["import { SQL, StringChunk, sql, type SQLChunk } from \"drizzle-orm\";\nimport type { CompiledMutation, MutationResult } from \"../../query/unit-of-work\";\nimport type { DBType } from \"./shared\";\nimport type { DrizzleCompiledQuery } from \"./drizzle-uow-compiler\";\nimport type { DrizzleResult } from \"./shared\";\nimport { BaseSQLiteDatabase } from \"drizzle-orm/sqlite-core\";\nimport { SQLiteSyncDialect } from \"drizzle-orm/sqlite-core\";\n\ntype SyncSQLiteDB = BaseSQLiteDatabase<\n \"sync\",\n unknown,\n Record<string, never>,\n Record<string, never>\n>;\n\nfunction isSyncSQLite(db: unknown): boolean {\n return (\n db instanceof BaseSQLiteDatabase &&\n \"dialect\" in db &&\n (db as { dialect?: unknown }).dialect instanceof SQLiteSyncDialect\n );\n}\n\nfunction assertSyncSQLite(db: unknown): asserts db is SyncSQLiteDB {\n if (!isSyncSQLite(db)) {\n throw new Error(\"Expected synchronous SQLite database (better-sqlite3)\");\n }\n}\n\nfunction postgresToSQL(sqlString: string, params: unknown[]): SQLChunk[] {\n const placeholderRegex = /\\$(\\d+)/g;\n const queryChunks: SQLChunk[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n\n while ((match = placeholderRegex.exec(sqlString)) !== null) {\n const textBefore = sqlString.substring(lastIndex, match.index);\n if (textBefore) {\n queryChunks.push(new StringChunk(textBefore));\n }\n\n const paramIndex = parseInt(match[1]!, 10) - 1;\n queryChunks.push(sql.param(params[paramIndex]));\n\n lastIndex = match.index + match[0].length;\n }\n\n const textAfter = sqlString.substring(lastIndex);\n if (textAfter) {\n queryChunks.push(new StringChunk(textAfter));\n }\n\n return queryChunks;\n}\n\nfunction sqliteToSQL(sqlString: string, params: unknown[]): SQLChunk[] {\n const chunks: SQLChunk[] = [];\n let currentIndex = 0;\n\n const parts = sqlString.split(\"?\");\n for (let i = 0; i < parts.length; i++) {\n if (parts[i]) {\n chunks.push(new StringChunk(parts[i]));\n }\n if (i < parts.length - 1 && currentIndex < params.length) {\n chunks.push(sql.param(params[currentIndex++]));\n }\n }\n\n return chunks;\n}\n\nfunction toSQL(query: DrizzleCompiledQuery, provider: \"sqlite\" | \"mysql\" | \"postgresql\"): SQL {\n const { sql: sqlString, params } = query;\n\n const queryChunks =\n provider === \"sqlite\" ? sqliteToSQL(sqlString, params) : postgresToSQL(sqlString, params);\n\n return new SQL(queryChunks);\n}\n\nfunction getAffectedRows(result: unknown): number {\n if (Array.isArray(result)) {\n return result.length;\n }\n\n if (result && typeof result === \"object\") {\n if (\"affectedRows\" in result && typeof result[\"affectedRows\"] === \"number\") {\n return result[\"affectedRows\"];\n }\n\n if (\n \"rowCount\" in result &&\n (typeof result[\"rowCount\"] === \"number\" || typeof result[\"rowCount\"] === \"bigint\")\n ) {\n const rowCount = result[\"rowCount\"];\n if (rowCount > Number.MAX_SAFE_INTEGER) {\n throw new Error(\n `rowCount BigInt value ${rowCount.toString()} exceeds JS safe integer range`,\n );\n }\n return Number(rowCount);\n }\n\n if (\"changes\" in result && typeof result[\"changes\"] === \"number\") {\n return result[\"changes\"];\n }\n }\n\n throw new Error(`Unable to determine affected rows from result: ${JSON.stringify(result)}`);\n}\n\nasync function executeInTransaction(\n db: DBType,\n provider: \"sqlite\" | \"mysql\" | \"postgresql\",\n syncExecutor: (db: SyncSQLiteDB) => void,\n asyncExecutor: (tx: { execute: (sql: SQL) => Promise<unknown> }) => Promise<void>,\n): Promise<void> {\n if (provider === \"sqlite\" && isSyncSQLite(db)) {\n assertSyncSQLite(db);\n db.transaction(() => syncExecutor(db));\n } else {\n await db.transaction(\n async (tx) => await asyncExecutor(tx as { execute: (sql: SQL) => Promise<unknown> }),\n );\n }\n}\n\nfunction extractCreatedInternalId(result: unknown): bigint | null {\n if (result && typeof result === \"object\" && \"lastInsertRowid\" in result) {\n if (typeof result.lastInsertRowid === \"bigint\") {\n return result.lastInsertRowid;\n }\n\n if (typeof result.lastInsertRowid === \"number\") {\n return BigInt(result.lastInsertRowid);\n }\n\n throw new Error(`Unexpected lastInsertRowid type: ${typeof result.lastInsertRowid}`);\n }\n\n if (Array.isArray(result) && result.length > 0) {\n const row = result[0] as Record<string, unknown>;\n if (\"_internalId\" in row || \"_internal_id\" in row) {\n return (row[\"_internalId\"] ?? row[\"_internal_id\"]) as bigint;\n }\n }\n\n return null;\n}\n\nfunction validateAffectedRows(result: unknown, expected: number): void {\n const actual = getAffectedRows(result);\n if (actual !== expected) {\n throw new Error(`Version conflict: expected ${expected} rows affected, but got ${actual}`);\n }\n}\n\n/**\n * Execute the retrieval phase of a Unit of Work using Drizzle\n *\n * All retrieval queries are executed inside a single transaction to ensure\n * snapshot isolation - all reads see a consistent view of the database.\n */\nexport async function executeDrizzleRetrievalPhase(\n db: DBType,\n retrievalBatch: DrizzleCompiledQuery[],\n provider: \"sqlite\" | \"mysql\" | \"postgresql\",\n): Promise<DrizzleResult[]> {\n if (retrievalBatch.length === 0) {\n return [];\n }\n\n const retrievalResults: DrizzleResult[] = [];\n\n await executeInTransaction(\n db,\n provider,\n (syncDb) => {\n for (const query of retrievalBatch) {\n const sqlObj = toSQL(query, provider);\n const rows = syncDb.all(sqlObj as never) as Record<string, unknown>[];\n const result: DrizzleResult = { rows, affectedRows: 0 };\n retrievalResults.push(result);\n }\n },\n async (tx) => {\n for (const query of retrievalBatch) {\n const result = (await tx.execute(toSQL(query, provider))) as DrizzleResult;\n retrievalResults.push(result);\n }\n },\n );\n\n return retrievalResults;\n}\n\n/**\n * Execute the mutation phase of a Unit of Work using Drizzle\n *\n * All mutation queries are executed in a transaction with optimistic locking.\n * If any version check fails, the entire transaction is rolled back and\n * success=false is returned.\n */\nexport async function executeDrizzleMutationPhase(\n db: DBType,\n mutationBatch: CompiledMutation<DrizzleCompiledQuery>[],\n provider: \"sqlite\" | \"mysql\" | \"postgresql\",\n): Promise<MutationResult> {\n if (mutationBatch.length === 0) {\n return { success: true, createdInternalIds: [] };\n }\n\n const createdInternalIds: (bigint | null)[] = [];\n\n try {\n await executeInTransaction(\n db,\n provider,\n (syncDb) => {\n for (const { query, expectedAffectedRows } of mutationBatch) {\n const sqlObj = toSQL(query, provider);\n // Type assertion needed due to drizzle-orm version mismatch in dependencies\n const result = syncDb.run(sqlObj as never);\n\n if (expectedAffectedRows === null) {\n createdInternalIds.push(extractCreatedInternalId(result));\n } else {\n validateAffectedRows(result, expectedAffectedRows);\n }\n }\n },\n async (tx) => {\n for (const { query, expectedAffectedRows } of mutationBatch) {\n const result = await tx.execute(toSQL(query, provider));\n\n if (expectedAffectedRows === null) {\n createdInternalIds.push(extractCreatedInternalId(result));\n } else {\n validateAffectedRows(result, expectedAffectedRows);\n }\n }\n },\n );\n\n return { success: true, createdInternalIds };\n } catch (error) {\n if (error instanceof Error && error.message.includes(\"Version conflict\")) {\n return { success: false };\n }\n throw error;\n }\n}\n"],"mappings":"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"}
@@ -145,10 +145,11 @@ function generateColumnDefinition(ctx, column, customTypes) {
145
145
  const params = [`"${column.name}"`, ...typeFn.params ?? []];
146
146
  if (!typeFn.isCustomType) ctx.imports.addImport(typeFn.name, ctx.importSource);
147
147
  parts.push(`${typeFn.name}(${params.join(", ")})`);
148
- if (column instanceof InternalIdColumn || column.role === "internal-id") {
148
+ if (column instanceof InternalIdColumn || column.role === "internal-id") if (ctx.provider === "sqlite") parts.push("primaryKey({ autoIncrement: true })");
149
+ else if (ctx.provider === "mysql") {
149
150
  parts.push("primaryKey()");
150
- if (ctx.provider === "mysql" || ctx.provider === "sqlite") parts.push("autoincrement()");
151
- }
151
+ parts.push("autoincrement()");
152
+ } else parts.push("primaryKey()");
152
153
  if (!column.isNullable) parts.push("notNull()");
153
154
  if (column.default) {
154
155
  if ("value" in column.default) {
@@ -189,7 +190,7 @@ function generateForeignKeys(ctx, table, namespace) {
189
190
  const actualRefCol = refCol === "id" ? "_internalId" : refCol;
190
191
  if (isSelfReference) foreignColumns.push(`table.${actualRefCol}`);
191
192
  else {
192
- const foreignTableRef = mapper && namespace ? mapper.toPhysical(relation.table.ormName) : relation.table.ormName;
193
+ const foreignTableRef = namespace ? `${relation.table.ormName}_${sanitizeNamespace(namespace)}` : relation.table.ormName;
193
194
  foreignColumns.push(`${foreignTableRef}.${actualRefCol}`);
194
195
  }
195
196
  }