@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
package/package.json CHANGED
@@ -1,89 +1,78 @@
1
1
  {
2
2
  "name": "@fragno-dev/db",
3
- "version": "0.1.2",
3
+ "version": "0.1.5",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": {
7
- "bun": "./src/mod.ts",
8
7
  "development": "./src/mod.ts",
9
8
  "types": "./dist/mod.d.ts",
10
9
  "default": "./dist/mod.js"
11
10
  },
12
11
  "./id": {
13
- "bun": "./src/id.ts",
14
12
  "development": "./src/id.ts",
15
13
  "types": "./dist/id.d.ts",
16
14
  "default": "./dist/id.js"
17
15
  },
18
16
  "./schema": {
19
- "bun": "./src/schema/create.ts",
20
17
  "development": "./src/schema/create.ts",
21
18
  "types": "./dist/schema/create.d.ts",
22
19
  "default": "./dist/schema/create.js"
23
20
  },
24
21
  "./query": {
25
- "bun": "./src/query/query.ts",
26
22
  "development": "./src/query/query.ts",
27
23
  "types": "./dist/query/query.d.ts",
28
24
  "default": "./dist/query/query.js"
29
25
  },
26
+ "./adapters": {
27
+ "development": "./src/adapters/adapters.ts",
28
+ "types": "./dist/adapters/adapters.d.ts",
29
+ "default": "./dist/adapters/adapters.js"
30
+ },
30
31
  "./adapters/kysely": {
31
- "bun": "./src/adapters/kysely/kysely-adapter.ts",
32
32
  "development": "./src/adapters/kysely/kysely-adapter.ts",
33
33
  "types": "./dist/adapters/kysely/kysely-adapter.d.ts",
34
34
  "default": "./dist/adapters/kysely/kysely-adapter.js"
35
35
  },
36
36
  "./adapters/drizzle": {
37
- "bun": "./src/adapters/drizzle/drizzle-adapter.ts",
38
37
  "development": "./src/adapters/drizzle/drizzle-adapter.ts",
39
38
  "types": "./dist/adapters/drizzle/drizzle-adapter.d.ts",
40
39
  "default": "./dist/adapters/drizzle/drizzle-adapter.js"
41
40
  },
42
41
  "./unit-of-work": {
43
- "bun": "./src/query/unit-of-work.ts",
44
42
  "development": "./src/query/unit-of-work.ts",
45
43
  "types": "./dist/query/unit-of-work.d.ts",
46
44
  "default": "./dist/query/unit-of-work.js"
47
45
  },
48
46
  "./cursor": {
49
- "bun": "./src/query/cursor.ts",
50
47
  "development": "./src/query/cursor.ts",
51
48
  "types": "./dist/query/cursor.d.ts",
52
49
  "default": "./dist/query/cursor.js"
53
50
  },
54
51
  "./fragment": {
55
- "bun": "./src/fragment.ts",
56
52
  "development": "./src/fragment.ts",
57
53
  "types": "./dist/fragment.d.ts",
58
54
  "default": "./dist/fragment.js"
59
55
  },
60
56
  "./generation-engine": {
61
- "bun": "./src/migration-engine/generation-engine.ts",
62
57
  "development": "./src/migration-engine/generation-engine.ts",
63
58
  "types": "./dist/migration-engine/generation-engine.d.ts",
64
59
  "default": "./dist/migration-engine/generation-engine.js"
65
60
  }
66
61
  },
67
- "scripts": {
68
- "build": "tsdown",
69
- "build:watch": "tsdown --watch",
70
- "types:check": "tsc --noEmit",
71
- "test": "vitest run",
72
- "test:watch": "vitest --watch"
73
- },
74
62
  "devDependencies": {
75
63
  "@electric-sql/pglite": "^0.3.10",
76
- "@fragno-dev/core": "0.1.2",
77
- "@fragno-private/typescript-config": "0.0.1",
78
- "@fragno-private/vitest-config": "0.0.0",
79
- "@types/bun": "^1.2.23",
64
+ "@types/better-sqlite3": "^7.6.13",
80
65
  "@types/node": "^22",
81
66
  "@vitest/coverage-istanbul": "^3.2.4",
67
+ "better-sqlite3": "^12.4.1",
82
68
  "drizzle-kit": "^0.31.5",
83
69
  "drizzle-orm": "^0.44.6",
84
70
  "kysely-pglite": "^0.6.1",
85
71
  "vitest": "^3.2.4",
86
- "zod": "^4.1.12"
72
+ "zod": "^4.1.12",
73
+ "@fragno-dev/core": "0.1.3",
74
+ "@fragno-private/typescript-config": "0.0.1",
75
+ "@fragno-private/vitest-config": "0.0.0"
87
76
  },
88
77
  "repository": {
89
78
  "type": "git",
@@ -95,5 +84,12 @@
95
84
  "dependencies": {
96
85
  "@paralleldrive/cuid2": "^2.2.2",
97
86
  "kysely": "^0.28.7"
87
+ },
88
+ "scripts": {
89
+ "build": "tsdown",
90
+ "build:watch": "tsdown --watch",
91
+ "types:check": "tsc --noEmit",
92
+ "test": "vitest run",
93
+ "test:watch": "vitest --watch"
98
94
  }
99
- }
95
+ }
@@ -0,0 +1,585 @@
1
+ import { drizzle } from "drizzle-orm/better-sqlite3";
2
+ import Database from "better-sqlite3";
3
+ import { DrizzleAdapter } from "./drizzle-adapter";
4
+ import { beforeAll, describe, expect, expectTypeOf, it } from "vitest";
5
+ import { column, idColumn, referenceColumn, schema } from "../../schema/create";
6
+ import type { DBType } from "./shared";
7
+ import { createRequire } from "node:module";
8
+ import { writeAndLoadSchema } from "./test-utils";
9
+ import { encodeCursor } from "../../query/cursor";
10
+
11
+ // Import drizzle-kit for migrations
12
+ const require = createRequire(import.meta.url);
13
+ const { generateSQLiteDrizzleJson, generateSQLiteMigration } =
14
+ require("drizzle-kit/api") as typeof import("drizzle-kit/api");
15
+
16
+ describe("DrizzleAdapter SQLite", () => {
17
+ const testSchema = schema((s) => {
18
+ return s
19
+ .addTable("users", (t) => {
20
+ return t
21
+ .addColumn("id", idColumn())
22
+ .addColumn("name", column("string"))
23
+ .addColumn("age", column("integer").nullable())
24
+ .createIndex("name_idx", ["name"]);
25
+ })
26
+ .addTable("emails", (t) => {
27
+ return t
28
+ .addColumn("id", idColumn())
29
+ .addColumn("user_id", referenceColumn())
30
+ .addColumn("email", column("string"))
31
+ .addColumn("is_primary", column("bool").defaultTo(false))
32
+ .createIndex("unique_email", ["email"], { unique: true })
33
+ .createIndex("user_emails", ["user_id"]);
34
+ })
35
+ .addTable("posts", (t) => {
36
+ return t
37
+ .addColumn("id", idColumn())
38
+ .addColumn("user_id", referenceColumn())
39
+ .addColumn("title", column("string"))
40
+ .addColumn("content", column("string"))
41
+ .createIndex("posts_user_idx", ["user_id"]);
42
+ })
43
+ .addTable("comments", (t) => {
44
+ return t
45
+ .addColumn("id", idColumn())
46
+ .addColumn("post_id", referenceColumn())
47
+ .addColumn("user_id", referenceColumn())
48
+ .addColumn("text", column("string"))
49
+ .createIndex("comments_post_idx", ["post_id"])
50
+ .createIndex("comments_user_idx", ["user_id"]);
51
+ })
52
+ .addReference("user", {
53
+ type: "one",
54
+ from: { table: "emails", column: "user_id" },
55
+ to: { table: "users", column: "id" },
56
+ })
57
+ .addReference("author", {
58
+ type: "one",
59
+ from: { table: "posts", column: "user_id" },
60
+ to: { table: "users", column: "id" },
61
+ })
62
+ .addReference("post", {
63
+ type: "one",
64
+ from: { table: "comments", column: "post_id" },
65
+ to: { table: "posts", column: "id" },
66
+ })
67
+ .addReference("commenter", {
68
+ type: "one",
69
+ from: { table: "comments", column: "user_id" },
70
+ to: { table: "users", column: "id" },
71
+ });
72
+ });
73
+
74
+ let adapter: DrizzleAdapter;
75
+ let db: DBType;
76
+ let sqliteDb: Database.Database;
77
+
78
+ beforeAll(async () => {
79
+ // Write schema to file and dynamically import it
80
+ const { schemaModule, cleanup } = await writeAndLoadSchema(
81
+ "drizzle-adapter-sqlite",
82
+ testSchema,
83
+ "sqlite",
84
+ "namespace",
85
+ );
86
+
87
+ // Create in-memory SQLite database
88
+ sqliteDb = new Database(":memory:");
89
+
90
+ // Create Drizzle instance with better-sqlite3
91
+ db = drizzle({
92
+ client: sqliteDb,
93
+ schema: schemaModule,
94
+ }) as unknown as DBType;
95
+
96
+ // Generate and run migrations
97
+ const emptyJson = await generateSQLiteDrizzleJson({});
98
+ const targetJson = await generateSQLiteDrizzleJson(schemaModule);
99
+
100
+ const migrationStatements = await generateSQLiteMigration(emptyJson, targetJson);
101
+
102
+ // Execute migration SQL - for better-sqlite3, use exec on the raw database
103
+ for (const statement of migrationStatements) {
104
+ sqliteDb.exec(statement);
105
+ }
106
+
107
+ adapter = new DrizzleAdapter({
108
+ db,
109
+ provider: "sqlite",
110
+ });
111
+
112
+ return async () => {
113
+ sqliteDb.close();
114
+ await cleanup();
115
+ };
116
+ }, 12000);
117
+
118
+ it("should execute Unit of Work with version checking", async () => {
119
+ // Pass namespace to ensure mapper translates logical table names to physical (prefixed) names
120
+ const queryEngine = adapter.createQueryEngine(testSchema, "namespace");
121
+
122
+ // Create two users at once using UOW
123
+ const createUow = queryEngine
124
+ .createUnitOfWork("create-users")
125
+ .create("users", {
126
+ name: "Alice",
127
+ age: 25,
128
+ })
129
+ .create("users", {
130
+ name: "Bob",
131
+ age: 30,
132
+ });
133
+
134
+ expectTypeOf(createUow.find).parameter(0).toEqualTypeOf<keyof typeof testSchema.tables>();
135
+
136
+ const { success: createSuccess } = await createUow.executeMutations();
137
+ expect(createSuccess).toBe(true);
138
+
139
+ const createdIds = createUow.getCreatedIds();
140
+ expect(createdIds).toHaveLength(2);
141
+
142
+ // Verify both users were created by fetching them
143
+ const [allUsers] = await queryEngine
144
+ .createUnitOfWork("get-all-users")
145
+ .find("users")
146
+ .executeRetrieve();
147
+
148
+ expect(allUsers).toHaveLength(2);
149
+
150
+ // Verify Alice (first created user)
151
+ expect(allUsers[0]).toMatchObject({
152
+ name: "Alice",
153
+ age: 25,
154
+ id: expect.objectContaining({
155
+ externalId: createdIds[0].externalId,
156
+ version: 0,
157
+ }),
158
+ });
159
+
160
+ // Verify Bob (second created user)
161
+ expect(allUsers[1]).toMatchObject({
162
+ name: "Bob",
163
+ age: 30,
164
+ id: expect.objectContaining({
165
+ externalId: createdIds[1].externalId,
166
+ version: 0,
167
+ }),
168
+ });
169
+
170
+ // Use Alice (first user) for the rest of the test
171
+ const initialUserId = createdIds[0];
172
+
173
+ // Build a UOW to update Alice with optimistic locking
174
+ const uow = queryEngine
175
+ .createUnitOfWork("update-user-age")
176
+ // Retrieval phase: find Alice
177
+ .find("users", (b) => b.whereIndex("primary", (eb) => eb("id", "=", initialUserId)));
178
+
179
+ // Execute retrieval and transition to mutation phase
180
+ const [users] = await uow.executeRetrieve();
181
+
182
+ // Mutation phase: update with version check
183
+ uow.update("users", initialUserId, (b) => b.set({ age: 26 }).check());
184
+
185
+ // Execute mutations
186
+ const { success } = await uow.executeMutations();
187
+
188
+ // Should succeed
189
+ expect(success).toBe(true);
190
+ expect(users).toHaveLength(1);
191
+ expect(users[0].name).toBe("Alice");
192
+
193
+ // Verify Alice was updated
194
+ const [[updatedUser]] = await queryEngine
195
+ .createUnitOfWork("get-updated-user")
196
+ .find("users", (b) => b.whereIndex("primary", (eb) => eb("id", "=", initialUserId)))
197
+ .executeRetrieve();
198
+
199
+ expect(updatedUser).toMatchObject({
200
+ id: expect.objectContaining({
201
+ externalId: initialUserId.externalId,
202
+ version: 1, // Version incremented
203
+ }),
204
+ name: "Alice",
205
+ age: 26,
206
+ });
207
+
208
+ // Try to update Alice again with stale version (should fail)
209
+ const uow2 = queryEngine.createUnitOfWork("update-user-stale");
210
+
211
+ // Use the old version (0) which is now stale
212
+ uow2.update("users", initialUserId, (b) => b.set({ age: 27 }).check());
213
+
214
+ const { success: success2 } = await uow2.executeMutations();
215
+
216
+ // Should fail due to version conflict
217
+ expect(success2).toBe(false);
218
+
219
+ // Verify Alice was NOT updated
220
+ const [[unchangedUser]] = await queryEngine
221
+ .createUnitOfWork("verify-unchanged")
222
+ .find("users", (b) => b.whereIndex("primary", (eb) => eb("id", "=", initialUserId)))
223
+ .executeRetrieve();
224
+
225
+ expect(unchangedUser).toMatchObject({
226
+ id: expect.objectContaining({
227
+ version: 1, // Still version 1
228
+ }),
229
+ age: 26, // Still 26, not 27
230
+ });
231
+ });
232
+
233
+ it("should support count operations", async () => {
234
+ const queryEngine = adapter.createQueryEngine(testSchema, "namespace");
235
+
236
+ // Create some users
237
+ await queryEngine
238
+ .createUnitOfWork("create-users")
239
+ .create("users", { name: "User1", age: 20 })
240
+ .create("users", { name: "User2", age: 30 })
241
+ .create("users", { name: "User3", age: 40 })
242
+ .executeMutations();
243
+
244
+ // Count all users
245
+ const [totalCount] = await queryEngine
246
+ .createUnitOfWork("count-all")
247
+ .find("users", (b) => b.whereIndex("primary").selectCount())
248
+ .executeRetrieve();
249
+
250
+ // Tests are not isolated, so we can't use expect(totalCount).toBe(3)
251
+ expect(totalCount).toBeGreaterThanOrEqual(5); // At least Alice, Bob, and 3 new users
252
+ expect(typeof totalCount).toBe("number");
253
+ });
254
+
255
+ it("should support cursor-based pagination", async () => {
256
+ const queryEngine = adapter.createQueryEngine(testSchema, "namespace");
257
+
258
+ const createUow = queryEngine
259
+ .createUnitOfWork("create-users")
260
+ .create("users", { name: "Page User A", age: 20 })
261
+ .create("users", { name: "Page User B", age: 30 })
262
+ .create("users", { name: "Page User C", age: 40 })
263
+ .create("users", { name: "Page User D", age: 50 })
264
+ .create("users", { name: "Page User E", age: 60 });
265
+
266
+ await createUow.executeMutations();
267
+
268
+ // Fetch first page ordered by name
269
+ const [firstPage] = await queryEngine
270
+ .createUnitOfWork("first-page")
271
+ .find("users", (b) => b.whereIndex("name_idx").orderByIndex("name_idx", "asc").pageSize(2))
272
+ .executeRetrieve();
273
+
274
+ // Verify first page contains the first 2 users alphabetically
275
+ expect(firstPage).toHaveLength(2);
276
+ expect(firstPage.map((u) => u.name)).toEqual(["Alice", "Bob"]);
277
+
278
+ // Create cursor from last item of first page
279
+ const lastItem = firstPage[firstPage.length - 1]!;
280
+ const cursor = encodeCursor({
281
+ indexValues: { name: lastItem.name },
282
+ direction: "forward",
283
+ });
284
+
285
+ // Fetch next page using cursor
286
+ const [secondPage] = await queryEngine
287
+ .createUnitOfWork("second-page")
288
+ .find("users", (b) =>
289
+ b.whereIndex("name_idx").orderByIndex("name_idx", "asc").after(cursor).pageSize(2),
290
+ )
291
+ .executeRetrieve();
292
+
293
+ // Verify page 2 continues alphabetically
294
+ expect(secondPage).toHaveLength(2);
295
+ expect(secondPage.map((u) => u.name)).toEqual(["Page User A", "Page User B"]);
296
+
297
+ // Ensure no overlap between pages
298
+ const firstPageNames = new Set(firstPage.map((u) => u.name));
299
+ for (const user of secondPage) {
300
+ expect(firstPageNames.has(user.name)).toBe(false);
301
+ }
302
+ });
303
+
304
+ it("should support joins", async () => {
305
+ const queryEngine = adapter.createQueryEngine(testSchema, "namespace");
306
+
307
+ const createUow = queryEngine
308
+ .createUnitOfWork("create-users")
309
+ .create("users", { name: "Email User", age: 20 });
310
+
311
+ const { success } = await createUow.executeMutations();
312
+ expect(success).toBe(true);
313
+
314
+ // Fetch the created user to get the proper ID
315
+ const [usersResult] = await queryEngine
316
+ .createUnitOfWork("get-created-user")
317
+ .find("users", (b) => b.whereIndex("name_idx", (eb) => eb("name", "=", "Email User")))
318
+ .executeRetrieve();
319
+
320
+ expect(usersResult).toHaveLength(1);
321
+ const createdUser = usersResult[0];
322
+ expect(createdUser).toBeDefined();
323
+ expect(createdUser.name).toBe("Email User");
324
+
325
+ // Create an email for testing joins
326
+ const createEmailUow = queryEngine.createUnitOfWork("create-test-email").create("emails", {
327
+ user_id: createdUser.id,
328
+ email: "test@example.com",
329
+ is_primary: true,
330
+ });
331
+ await createEmailUow.executeMutations();
332
+
333
+ // Test join query
334
+ const uow = queryEngine
335
+ .createUnitOfWork("test-joins")
336
+ .find("emails", (b) =>
337
+ b
338
+ .whereIndex("user_emails", (eb) => eb("user_id", "=", createdUser.id))
339
+ .join((jb) => jb.user((builder) => builder.select(["name", "id", "age"]))),
340
+ );
341
+
342
+ const [[email]] = await uow.executeRetrieve();
343
+
344
+ expect(email).toMatchObject({
345
+ id: expect.objectContaining({
346
+ externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
347
+ internalId: expect.any(Number),
348
+ }),
349
+ user_id: expect.objectContaining({
350
+ internalId: expect.any(Number),
351
+ }),
352
+ email: "test@example.com",
353
+ is_primary: true,
354
+ user: {
355
+ id: expect.objectContaining({
356
+ externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
357
+ internalId: expect.any(Number),
358
+ }),
359
+ name: "Email User",
360
+ age: 20,
361
+ },
362
+ });
363
+ });
364
+
365
+ it("should support complex nested joins (comments -> post -> author)", async () => {
366
+ const queryEngine = adapter.createQueryEngine(testSchema, "namespace");
367
+
368
+ // Create a user (author)
369
+ const createAuthorUow = queryEngine
370
+ .createUnitOfWork("create-author")
371
+ .create("users", { name: "Blog Author", age: 30 });
372
+ await createAuthorUow.executeMutations();
373
+
374
+ // Fetch the created author to get the proper ID
375
+ const [[author]] = await queryEngine
376
+ .createUnitOfWork("get-author")
377
+ .find("users", (b) => b.whereIndex("name_idx", (eb) => eb("name", "=", "Blog Author")))
378
+ .executeRetrieve();
379
+
380
+ // Create a post by the author
381
+ const createPostUow = queryEngine.createUnitOfWork("create-post").create("posts", {
382
+ user_id: author.id,
383
+ title: "My First Post",
384
+ content: "This is the content of my first post",
385
+ });
386
+ await createPostUow.executeMutations();
387
+
388
+ // Fetch the created post to get the proper ID
389
+ const [[post]] = await queryEngine
390
+ .createUnitOfWork("get-post")
391
+ .find("posts", (b) => b.whereIndex("posts_user_idx", (eb) => eb("user_id", "=", author.id)))
392
+ .executeRetrieve();
393
+
394
+ // Create a commenter
395
+ const createCommenterUow = queryEngine
396
+ .createUnitOfWork("create-commenter")
397
+ .create("users", { name: "Commenter User", age: 25 });
398
+ await createCommenterUow.executeMutations();
399
+
400
+ // Fetch the created commenter to get the proper ID
401
+ const [[commenter]] = await queryEngine
402
+ .createUnitOfWork("get-commenter")
403
+ .find("users", (b) => b.whereIndex("name_idx", (eb) => eb("name", "=", "Commenter User")))
404
+ .executeRetrieve();
405
+
406
+ // Create a comment on the post
407
+ const createCommentUow = queryEngine.createUnitOfWork("create-comment").create("comments", {
408
+ post_id: post.id,
409
+ user_id: commenter.id,
410
+ text: "Great post!",
411
+ });
412
+ await createCommentUow.executeMutations();
413
+
414
+ // Now perform a complex nested join: comments -> post -> author, and comments -> commenter
415
+ const uow = queryEngine.createUnitOfWork("test-complex-joins").find("comments", (b) =>
416
+ b.whereIndex("primary").join((jb) =>
417
+ jb
418
+ .post((postBuilder) =>
419
+ postBuilder
420
+ .select(["id", "title", "content"])
421
+ .orderByIndex("primary", "desc")
422
+ .pageSize(1)
423
+ .join((jb2) =>
424
+ // Nested join to the post's author
425
+ jb2.author((authorBuilder) =>
426
+ authorBuilder.select(["id", "name", "age"]).orderByIndex("name_idx", "asc"),
427
+ ),
428
+ ),
429
+ )
430
+ .commenter((commenterBuilder) => commenterBuilder.select(["id", "name"])),
431
+ ),
432
+ );
433
+
434
+ const [[comment]] = await uow.executeRetrieve();
435
+
436
+ // Verify the result structure with nested joins
437
+ expect(comment).toMatchObject({
438
+ id: expect.objectContaining({
439
+ externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
440
+ internalId: expect.any(Number),
441
+ }),
442
+ text: "Great post!",
443
+ // Post join (first level)
444
+ post: {
445
+ id: expect.objectContaining({
446
+ externalId: post.id.externalId,
447
+ }),
448
+ title: "My First Post",
449
+ content: "This is the content of my first post",
450
+ // Nested author join (second level)
451
+ author: {
452
+ id: expect.objectContaining({
453
+ externalId: author.id.externalId,
454
+ }),
455
+ name: "Blog Author",
456
+ age: 30,
457
+ },
458
+ },
459
+ // Commenter join (first level)
460
+ commenter: {
461
+ id: expect.objectContaining({
462
+ externalId: commenter.id.externalId,
463
+ }),
464
+ name: "Commenter User",
465
+ },
466
+ });
467
+ });
468
+
469
+ it("should return created IDs from UOW create operations", async () => {
470
+ const queryEngine = adapter.createQueryEngine(testSchema, "namespace");
471
+
472
+ // Test 1: Create operations return IDs with both external and internal IDs
473
+ const uow1 = queryEngine.createUnitOfWork("create-multiple-users");
474
+
475
+ uow1.create("users", { name: "Test User 1", age: 30 });
476
+ uow1.create("users", { name: "Test User 2", age: 35 });
477
+ uow1.create("users", { name: "Test User 3", age: 40 });
478
+
479
+ const { success: success1 } = await uow1.executeMutations();
480
+ expect(success1).toBe(true);
481
+
482
+ const createdIds1 = uow1.getCreatedIds();
483
+ expect(createdIds1).toMatchObject([
484
+ expect.objectContaining({
485
+ externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
486
+ internalId: expect.any(BigInt),
487
+ }),
488
+ expect.objectContaining({
489
+ externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
490
+ internalId: expect.any(BigInt),
491
+ }),
492
+ expect.objectContaining({
493
+ externalId: expect.stringMatching(/^[a-z0-9]{20,}$/),
494
+ internalId: expect.any(BigInt),
495
+ }),
496
+ ]);
497
+
498
+ // All external IDs should be unique
499
+ const externalIds = createdIds1.map((id) => id.externalId);
500
+ expect(new Set(externalIds).size).toBe(3);
501
+
502
+ // Verify we can use these IDs to query the created users
503
+ const user1 = await queryEngine.findFirst("users", (b) =>
504
+ b.whereIndex("primary", (eb) => eb("id", "=", createdIds1[0].externalId)),
505
+ );
506
+
507
+ const user2 = await queryEngine.findFirst("users", (b) =>
508
+ b.whereIndex("primary", (eb) => eb("id", "=", createdIds1[1].externalId)),
509
+ );
510
+
511
+ const user3 = await queryEngine.findFirst("users", (b) =>
512
+ b.whereIndex("primary", (eb) => eb("id", "=", createdIds1[2].externalId)),
513
+ );
514
+
515
+ expect(user1).toMatchObject({
516
+ id: expect.objectContaining({
517
+ externalId: createdIds1[0].externalId,
518
+ }),
519
+ name: "Test User 1",
520
+ age: 30,
521
+ });
522
+
523
+ expect(user2).toMatchObject({
524
+ id: expect.objectContaining({
525
+ externalId: createdIds1[1].externalId,
526
+ }),
527
+ name: "Test User 2",
528
+ age: 35,
529
+ });
530
+
531
+ expect(user3).toMatchObject({
532
+ id: expect.objectContaining({
533
+ externalId: createdIds1[2].externalId,
534
+ }),
535
+ name: "Test User 3",
536
+ age: 40,
537
+ });
538
+
539
+ // Test 2: Mixed operations (creates, updates, deletes) - only creates return IDs
540
+ const uow2 = queryEngine.createUnitOfWork("mixed-operations");
541
+
542
+ uow2.create("users", { name: "New User", age: 50 });
543
+ uow2.update("users", createdIds1[0], (b) => b.set({ age: 31 }));
544
+ uow2.create("users", { name: "Another New User", age: 55 });
545
+ uow2.delete("users", createdIds1[2]);
546
+
547
+ const { success: success2 } = await uow2.executeMutations();
548
+ expect(success2).toBe(true);
549
+
550
+ const createdIds2 = uow2.getCreatedIds();
551
+
552
+ // Only 2 creates, so only 2 IDs
553
+ expect(createdIds2).toHaveLength(2);
554
+ expect(createdIds2[0].externalId).toBeDefined();
555
+ expect(createdIds2[1].externalId).toBeDefined();
556
+
557
+ // Test 3: User-provided IDs are preserved
558
+ const customId = "my-custom-user-id-12345";
559
+ const uow3 = queryEngine.createUnitOfWork("create-with-custom-id");
560
+
561
+ uow3.create("users", { id: customId, name: "Custom ID User", age: 60 });
562
+
563
+ const { success: success3 } = await uow3.executeMutations();
564
+ expect(success3).toBe(true);
565
+
566
+ const createdIds3 = uow3.getCreatedIds();
567
+
568
+ expect(createdIds3).toHaveLength(1);
569
+ expect(createdIds3[0].externalId).toBe(customId);
570
+ expect(createdIds3[0].internalId).toBeDefined();
571
+
572
+ // Verify the user was created with the custom ID
573
+ const customIdUser = await queryEngine.findFirst("users", (b) =>
574
+ b.whereIndex("primary", (eb) => eb("id", "=", customId)),
575
+ );
576
+
577
+ expect(customIdUser).toMatchObject({
578
+ id: expect.objectContaining({
579
+ externalId: customId,
580
+ }),
581
+ name: "Custom ID User",
582
+ age: 60,
583
+ });
584
+ });
585
+ });