@fragno-dev/db 0.1.1 → 0.1.2

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 (108) hide show
  1. package/.turbo/turbo-build.log +61 -53
  2. package/CHANGELOG.md +12 -0
  3. package/dist/adapters/adapters.d.ts +11 -1
  4. package/dist/adapters/adapters.d.ts.map +1 -1
  5. package/dist/adapters/drizzle/drizzle-adapter.d.ts +9 -2
  6. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  7. package/dist/adapters/drizzle/drizzle-adapter.js +21 -39
  8. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  9. package/dist/adapters/drizzle/drizzle-query.d.ts.map +1 -1
  10. package/dist/adapters/drizzle/drizzle-query.js +3 -2
  11. package/dist/adapters/drizzle/drizzle-query.js.map +1 -1
  12. package/dist/adapters/drizzle/drizzle-uow-compiler.js +8 -6
  13. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +1 -1
  14. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +1 -1
  15. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +1 -1
  16. package/dist/adapters/drizzle/generate.js +107 -34
  17. package/dist/adapters/drizzle/generate.js.map +1 -1
  18. package/dist/adapters/drizzle/shared.js +14 -1
  19. package/dist/adapters/drizzle/shared.js.map +1 -1
  20. package/dist/adapters/kysely/kysely-adapter.d.ts +2 -1
  21. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  22. package/dist/adapters/kysely/kysely-adapter.js +25 -30
  23. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  24. package/dist/adapters/kysely/kysely-query-builder.js +48 -44
  25. package/dist/adapters/kysely/kysely-query-builder.js.map +1 -1
  26. package/dist/adapters/kysely/kysely-query-compiler.js +2 -2
  27. package/dist/adapters/kysely/kysely-query-compiler.js.map +1 -1
  28. package/dist/adapters/kysely/kysely-query.js +3 -2
  29. package/dist/adapters/kysely/kysely-query.js.map +1 -1
  30. package/dist/adapters/kysely/kysely-shared.js +18 -0
  31. package/dist/adapters/kysely/kysely-shared.js.map +1 -0
  32. package/dist/adapters/kysely/kysely-uow-compiler.js +4 -3
  33. package/dist/adapters/kysely/kysely-uow-compiler.js.map +1 -1
  34. package/dist/adapters/kysely/migration/execute.js +15 -12
  35. package/dist/adapters/kysely/migration/execute.js.map +1 -1
  36. package/dist/migration-engine/auto-from-schema.js +2 -8
  37. package/dist/migration-engine/auto-from-schema.js.map +1 -1
  38. package/dist/migration-engine/create.d.ts +1 -5
  39. package/dist/migration-engine/create.js +1 -1
  40. package/dist/migration-engine/create.js.map +1 -1
  41. package/dist/migration-engine/generation-engine.d.ts +51 -0
  42. package/dist/migration-engine/generation-engine.d.ts.map +1 -0
  43. package/dist/migration-engine/generation-engine.js +165 -0
  44. package/dist/migration-engine/generation-engine.js.map +1 -0
  45. package/dist/migration-engine/shared.d.ts +5 -2
  46. package/dist/migration-engine/shared.d.ts.map +1 -1
  47. package/dist/migration-engine/shared.js.map +1 -1
  48. package/dist/mod.d.ts +0 -8
  49. package/dist/mod.d.ts.map +1 -1
  50. package/dist/mod.js +0 -32
  51. package/dist/mod.js.map +1 -1
  52. package/dist/query/condition-builder.js.map +1 -1
  53. package/dist/query/result-transform.js +2 -1
  54. package/dist/query/result-transform.js.map +1 -1
  55. package/dist/schema/create.d.ts +74 -16
  56. package/dist/schema/create.d.ts.map +1 -1
  57. package/dist/schema/create.js +76 -11
  58. package/dist/schema/create.js.map +1 -1
  59. package/dist/schema/serialize.js.map +1 -1
  60. package/dist/shared/settings-schema.js +36 -0
  61. package/dist/shared/settings-schema.js.map +1 -0
  62. package/dist/util/import-generator.js.map +1 -1
  63. package/dist/util/parse.js.map +1 -1
  64. package/package.json +8 -2
  65. package/src/adapters/adapters.ts +10 -3
  66. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +11 -7
  67. package/src/adapters/drizzle/drizzle-adapter.test.ts +77 -29
  68. package/src/adapters/drizzle/drizzle-adapter.ts +31 -78
  69. package/src/adapters/drizzle/drizzle-query.ts +4 -7
  70. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +9 -3
  71. package/src/adapters/drizzle/drizzle-uow-compiler.ts +12 -6
  72. package/src/adapters/drizzle/drizzle-uow-decoder.ts +1 -1
  73. package/src/adapters/drizzle/drizzle-uow-executor.ts +1 -1
  74. package/src/adapters/drizzle/generate.test.ts +573 -150
  75. package/src/adapters/drizzle/generate.ts +187 -36
  76. package/src/adapters/drizzle/migrate-drizzle.test.ts +30 -6
  77. package/src/adapters/drizzle/shared.ts +31 -1
  78. package/src/adapters/drizzle/test-utils.ts +3 -1
  79. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +25 -27
  80. package/src/adapters/kysely/kysely-adapter.ts +35 -58
  81. package/src/adapters/kysely/kysely-query-builder.ts +75 -44
  82. package/src/adapters/kysely/kysely-query-compiler.ts +3 -1
  83. package/src/adapters/kysely/kysely-query.ts +8 -2
  84. package/src/adapters/kysely/kysely-shared.ts +23 -0
  85. package/src/adapters/kysely/kysely-uow-compiler.ts +5 -2
  86. package/src/adapters/kysely/migration/execute-mysql.test.ts +2 -2
  87. package/src/adapters/kysely/migration/execute-postgres.test.ts +19 -19
  88. package/src/adapters/kysely/migration/execute.ts +48 -17
  89. package/src/adapters/kysely/migration/kysely-migrator.test.ts +19 -37
  90. package/src/fragment.test.ts +1 -0
  91. package/src/migration-engine/auto-from-schema.ts +14 -18
  92. package/src/migration-engine/create.ts +1 -6
  93. package/src/migration-engine/generation-engine.test.ts +597 -0
  94. package/src/migration-engine/generation-engine.ts +356 -0
  95. package/src/migration-engine/shared.ts +1 -4
  96. package/src/mod.ts +0 -66
  97. package/src/query/condition-builder.ts +24 -8
  98. package/src/query/result-transform.ts +7 -1
  99. package/src/schema/create.test.ts +4 -1
  100. package/src/schema/create.ts +132 -24
  101. package/src/schema/serialize.ts +21 -7
  102. package/src/shared/settings-schema.ts +61 -0
  103. package/src/util/deep-equal.ts +21 -7
  104. package/src/util/import-generator.ts +3 -1
  105. package/src/util/parse.ts +3 -1
  106. package/tsdown.config.ts +1 -0
  107. package/.turbo/turbo-test.log +0 -37
  108. package/.turbo/turbo-types$colon$check.log +0 -1
@@ -1,59 +1,60 @@
1
1
  $ tsdown
2
2
  ℹ tsdown v0.15.9 powered by rolldown v1.0.0-beta.44
3
3
  ℹ Using tsdown config: /home/runner/work/fragno/fragno/packages/fragno-db/tsdown.config.ts
4
- ℹ entry: src/fragment.ts, src/id.ts, src/mod.ts, src/query/cursor.ts, src/query/query.ts, src/query/unit-of-work.ts, src/schema/create.ts, src/adapters/kysely/kysely-adapter.ts, src/adapters/drizzle/drizzle-adapter.ts
4
+ ℹ entry: src/fragment.ts, src/id.ts, src/mod.ts, src/migration-engine/generation-engine.ts, src/query/cursor.ts, src/query/query.ts, src/query/unit-of-work.ts, src/schema/create.ts, src/adapters/drizzle/drizzle-adapter.ts, src/adapters/kysely/kysely-adapter.ts
5
5
  ℹ tsconfig: tsconfig.json
6
6
  ℹ Build start
7
- ℹ dist/schema/create.js 17.16 kB │ gzip: 4.51 kB
7
+ ℹ dist/schema/create.js 19.85 kB │ gzip: 5.20 kB
8
8
  ℹ dist/query/unit-of-work.js 16.08 kB │ gzip: 3.74 kB
9
- ℹ dist/mod.js  4.41 kB │ gzip: 1.36 kB
10
- ℹ dist/adapters/kysely/kysely-adapter.js  4.01 kB │ gzip: 1.45 kB
9
+ ℹ dist/migration-engine/generation-engine.js  7.87 kB │ gzip: 2.17 kB
10
+ ℹ dist/adapters/kysely/kysely-adapter.js  3.69 kB │ gzip: 1.34 kB
11
11
  ℹ dist/query/cursor.js  2.99 kB │ gzip: 1.13 kB
12
+ ℹ dist/mod.js  2.72 kB │ gzip: 0.90 kB
12
13
  ℹ dist/fragment.js  2.49 kB │ gzip: 0.71 kB
13
- ℹ dist/adapters/drizzle/drizzle-adapter.js  2.38 kB │ gzip: 0.93 kB
14
+ ℹ dist/adapters/drizzle/drizzle-adapter.js  1.48 kB │ gzip: 0.64 kB
14
15
  ℹ dist/id.js  0.07 kB │ gzip: 0.07 kB
15
16
  ℹ dist/query/query.js  0.01 kB │ gzip: 0.03 kB
17
+ ℹ dist/schema/create.js.map 48.81 kB │ gzip: 11.78 kB
16
18
  ℹ dist/query/unit-of-work.js.map 45.16 kB │ gzip: 9.98 kB
17
- ℹ dist/schema/create.js.map 43.84 kB │ gzip: 10.67 kB
18
- ℹ dist/adapters/drizzle/drizzle-uow-compiler.js.map 28.59 kB │ gzip: 7.06 kB
19
- ℹ dist/adapters/kysely/kysely-query-builder.js.map 26.89 kB │ gzip: 7.13 kB
20
- ℹ dist/adapters/drizzle/generate.js.map 22.22 kB │ gzip: 5.68 kB
19
+ ℹ dist/adapters/drizzle/generate.js.map 30.03 kB │ gzip: 7.45 kB
20
+ ℹ dist/adapters/drizzle/drizzle-uow-compiler.js.map 29.11 kB │ gzip: 7.20 kB
21
+ ℹ dist/adapters/kysely/kysely-query-builder.js.map 28.64 kB │ gzip: 7.42 kB
21
22
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/sql.js.map 20.20 kB │ gzip: 5.21 kB
22
- ℹ dist/adapters/kysely/migration/execute.js.map 16.41 kB │ gzip: 4.67 kB
23
- ℹ dist/adapters/drizzle/drizzle-uow-compiler.js 13.37 kB │ gzip: 3.43 kB
24
- ℹ dist/adapters/kysely/kysely-uow-compiler.js.map 13.33 kB │ gzip: 3.78 kB
25
- ℹ dist/adapters/kysely/kysely-query.js.map 12.66 kB │ gzip: 3.40 kB
26
- ℹ dist/schema/create.d.ts.map 12.26 kB │ gzip: 4.66 kB
27
- ℹ dist/adapters/kysely/kysely-query-builder.js 12.02 kB │ gzip: 3.47 kB
28
- ℹ dist/schema/serialize.js.map 11.74 kB │ gzip: 2.73 kB
29
- ℹ dist/adapters/drizzle/drizzle-query.js.map 11.10 kB │ gzip: 2.85 kB
23
+ ℹ dist/adapters/kysely/migration/execute.js.map 17.61 kB │ gzip: 5.02 kB
24
+ ℹ dist/migration-engine/generation-engine.js.map 15.63 kB │ gzip: 4.22 kB
25
+ ℹ dist/adapters/drizzle/drizzle-uow-compiler.js 13.64 kB │ gzip: 3.52 kB
26
+ ℹ dist/adapters/kysely/kysely-uow-compiler.js.map 13.52 kB │ gzip: 3.84 kB
27
+ ℹ dist/adapters/drizzle/generate.js 13.34 kB │ gzip: 3.46 kB
28
+ ℹ dist/adapters/kysely/kysely-query.js.map 12.85 kB │ gzip: 3.47 kB
29
+ ℹ dist/adapters/kysely/kysely-query-builder.js 12.83 kB │ gzip: 3.58 kB
30
+ ℹ dist/schema/serialize.js.map 11.87 kB │ gzip: 2.71 kB
31
+ ℹ dist/schema/create.d.ts.map 11.85 kB │ gzip: 4.64 kB
32
+ ℹ dist/adapters/drizzle/drizzle-query.js.map 11.16 kB │ gzip: 2.87 kB
30
33
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/sql.js 10.57 kB │ gzip: 2.92 kB
31
- ℹ dist/query/result-transform.js.map 10.24 kB │ gzip: 3.20 kB
32
- ℹ dist/adapters/drizzle/drizzle-uow-executor.js.map 10.15 kB │ gzip: 3.51 kB
34
+ ℹ dist/query/result-transform.js.map 10.51 kB │ gzip: 3.26 kB
35
+ ℹ dist/adapters/drizzle/drizzle-uow-executor.js.map 10.14 kB │ gzip: 3.50 kB
33
36
  ℹ dist/query/unit-of-work.d.ts.map  9.79 kB │ gzip: 3.77 kB
34
- ℹ dist/adapters/drizzle/generate.js  9.46 kB │ gzip: 2.64 kB
35
- ℹ dist/query/condition-builder.js.map  9.04 kB │ gzip: 2.46 kB
37
+ ℹ dist/query/condition-builder.js.map  9.18 kB │ gzip: 2.42 kB
36
38
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/common.js.map  8.89 kB │ gzip: 2.93 kB
37
- ℹ dist/adapters/kysely/kysely-adapter.js.map  8.68 kB │ gzip: 2.86 kB
38
- ℹ dist/migration-engine/auto-from-schema.js.map  8.23 kB │ gzip: 2.17 kB
39
- ℹ dist/mod.js.map  8.21 kB │ gzip: 2.61 kB
39
+ ℹ dist/adapters/kysely/migration/execute.js  8.34 kB │ gzip: 2.46 kB
40
+ ℹ dist/migration-engine/auto-from-schema.js.map  8.31 kB │ gzip: 2.18 kB
40
41
  ℹ dist/fragment.js.map  8.01 kB │ gzip: 2.12 kB
41
- ℹ dist/adapters/kysely/migration/execute.js  7.90 kB │ gzip: 2.34 kB
42
- ℹ dist/migration-engine/create.js.map  7.47 kB │ gzip: 2.19 kB
42
+ ℹ dist/adapters/kysely/kysely-adapter.js.map  8.01 kB │ gzip: 2.69 kB
43
+ ℹ dist/migration-engine/create.js.map  7.32 kB │ gzip: 2.14 kB
43
44
  ℹ dist/adapters/kysely/kysely-uow-executor.js.map  7.10 kB │ gzip: 2.53 kB
44
45
  ℹ dist/adapters/drizzle/drizzle-uow-decoder.js.map  7.00 kB │ gzip: 2.58 kB
45
46
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/conditions.js.map  6.92 kB │ gzip: 1.53 kB
46
47
  ℹ dist/query/query.d.ts.map  6.51 kB │ gzip: 2.43 kB
47
- ℹ dist/adapters/kysely/kysely-query-compiler.js.map  6.10 kB │ gzip: 1.48 kB
48
- ℹ dist/adapters/kysely/kysely-query.js  5.92 kB │ gzip: 1.65 kB
49
- ℹ dist/adapters/kysely/kysely-uow-compiler.js  5.84 kB │ gzip: 1.77 kB
48
+ ℹ dist/adapters/kysely/kysely-query-compiler.js.map  6.21 kB │ gzip: 1.51 kB
49
+ ℹ dist/adapters/kysely/kysely-query.js  6.00 kB │ gzip: 1.69 kB
50
+ ℹ dist/adapters/kysely/kysely-uow-compiler.js  5.93 kB │ gzip: 1.81 kB
50
51
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/common.js  5.72 kB │ gzip: 1.99 kB
51
- ℹ dist/query/result-transform.js  5.48 kB │ gzip: 1.86 kB
52
- ℹ dist/adapters/drizzle/drizzle-query.js  5.30 kB │ gzip: 1.40 kB
53
- ℹ dist/adapters/drizzle/drizzle-adapter.js.map  5.28 kB │ gzip: 1.97 kB
52
+ ℹ dist/query/result-transform.js  5.52 kB │ gzip: 1.87 kB
53
+ ℹ dist/adapters/drizzle/drizzle-query.js  5.39 kB │ gzip: 1.43 kB
54
54
  ℹ dist/query/cursor.js.map  5.13 kB │ gzip: 1.81 kB
55
+ ℹ dist/mod.js.map  5.02 kB │ gzip: 1.68 kB
55
56
  ℹ dist/adapters/drizzle/drizzle-uow-executor.js  4.96 kB │ gzip: 1.77 kB
56
- ℹ dist/migration-engine/auto-from-schema.js  4.25 kB │ gzip: 1.21 kB
57
+ ℹ dist/migration-engine/auto-from-schema.js  4.33 kB │ gzip: 1.21 kB
57
58
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column-builder.js.map  4.25 kB │ gzip: 1.42 kB
58
59
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/utils/array.js.map  3.78 kB │ gzip: 1.19 kB
59
60
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/enum.js.map  3.68 kB │ gzip: 1.07 kB
@@ -61,15 +62,18 @@ $ tsdown
61
62
  ℹ dist/adapters/kysely/kysely-uow-executor.js  3.54 kB │ gzip: 1.25 kB
62
63
  ℹ dist/query/orm/orm.js.map  3.49 kB │ gzip: 1.38 kB
63
64
  ℹ dist/adapters/drizzle/drizzle-uow-decoder.js  3.43 kB │ gzip: 1.34 kB
65
+ ℹ dist/shared/settings-schema.js.map  3.19 kB │ gzip: 1.24 kB
66
+ ℹ dist/adapters/drizzle/drizzle-adapter.js.map  3.17 kB │ gzip: 1.28 kB
64
67
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column-builder.js  3.13 kB │ gzip: 1.11 kB
65
- ℹ dist/migration-engine/shared.js.map  3.11 kB │ gzip: 1.00 kB
68
+ ℹ dist/migration-engine/shared.js.map  3.12 kB │ gzip: 1.01 kB
66
69
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/foreign-keys.js.map  3.11 kB │ gzip: 1.10 kB
67
70
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.js.map  2.90 kB │ gzip: 1.03 kB
68
71
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/conditions.js  2.78 kB │ gzip: 0.79 kB
69
72
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/unique-constraint.js.map  2.58 kB │ gzip: 0.95 kB
70
73
  ℹ dist/migration-engine/create.js  2.52 kB │ gzip: 0.80 kB
71
- ℹ dist/adapters/kysely/kysely-query-compiler.js  2.31 kB │ gzip: 0.60 kB
74
+ ℹ dist/adapters/kysely/kysely-query-compiler.js  2.32 kB │ gzip: 0.61 kB
72
75
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column.js.map  2.25 kB │ gzip: 0.80 kB
76
+ ℹ dist/adapters/drizzle/shared.js.map  2.16 kB │ gzip: 1.01 kB
73
77
  ℹ dist/query/condition-builder.d.ts.map  2.01 kB │ gzip: 0.74 kB
74
78
  ℹ dist/adapters/drizzle/join-column-utils.js.map  1.98 kB │ gzip: 0.88 kB
75
79
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/utils/array.js  1.97 kB │ gzip: 0.66 kB
@@ -78,29 +82,32 @@ $ tsdown
78
82
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/foreign-keys.js  1.75 kB │ gzip: 0.66 kB
79
83
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/enum.js  1.67 kB │ gzip: 0.55 kB
80
84
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.js  1.62 kB │ gzip: 0.61 kB
85
+ ℹ dist/shared/settings-schema.js  1.57 kB │ gzip: 0.65 kB
81
86
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/entity.js.map  1.54 kB │ gzip: 0.78 kB
82
87
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/unique-constraint.js  1.51 kB │ gzip: 0.56 kB
83
88
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/functions/aggregate.js.map  1.41 kB │ gzip: 0.51 kB
84
89
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column.js  1.35 kB │ gzip: 0.53 kB
85
90
  ℹ dist/query/orm/orm.js  1.33 kB │ gzip: 0.60 kB
86
- ℹ dist/util/import-generator.js.map  1.28 kB │ gzip: 0.62 kB
91
+ ℹ dist/util/import-generator.js.map  1.30 kB │ gzip: 0.62 kB
87
92
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing.js.map  1.24 kB │ gzip: 0.59 kB
88
93
  ℹ dist/adapters/drizzle/join-column-utils.js  1.14 kB │ gzip: 0.55 kB
89
- ℹ dist/adapters/drizzle/shared.js.map  1.12 kB │ gzip: 0.63 kB
94
+ ℹ dist/adapters/kysely/kysely-shared.js.map  1.07 kB │ gzip: 0.53 kB
90
95
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/subquery.js.map  0.99 kB │ gzip: 0.55 kB
91
- ℹ dist/mod.d.ts.map  0.97 kB │ gzip: 0.51 kB
96
+ ℹ dist/mod.d.ts.map  0.92 kB │ gzip: 0.49 kB
92
97
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/entity.js  0.88 kB │ gzip: 0.49 kB
93
- ℹ dist/util/parse.js.map  0.82 kB │ gzip: 0.48 kB
98
+ ℹ dist/adapters/drizzle/shared.js  0.87 kB │ gzip: 0.48 kB
99
+ ℹ dist/util/parse.js.map  0.83 kB │ gzip: 0.48 kB
100
+ ℹ dist/adapters/drizzle/drizzle-adapter.d.ts.map  0.77 kB │ gzip: 0.36 kB
101
+ ℹ dist/migration-engine/generation-engine.d.ts.map  0.68 kB │ gzip: 0.35 kB
94
102
  ℹ dist/util/import-generator.js  0.65 kB │ gzip: 0.36 kB
95
103
  ℹ dist/migration-engine/shared.d.ts.map  0.63 kB │ gzip: 0.32 kB
96
- ℹ dist/adapters/drizzle/drizzle-adapter.d.ts.map  0.57 kB │ gzip: 0.30 kB
104
+ ℹ dist/adapters/kysely/kysely-adapter.d.ts.map  0.60 kB │ gzip: 0.32 kB
105
+ ℹ dist/adapters/adapters.d.ts.map  0.60 kB │ gzip: 0.30 kB
97
106
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/select.js.map  0.57 kB │ gzip: 0.34 kB
98
- ℹ dist/adapters/kysely/kysely-adapter.d.ts.map  0.56 kB │ gzip: 0.30 kB
99
107
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/subquery.js  0.55 kB │ gzip: 0.33 kB
100
- ℹ dist/adapters/adapters.d.ts.map  0.54 kB │ gzip: 0.27 kB
108
+ ℹ dist/adapters/kysely/kysely-shared.js  0.54 kB │ gzip: 0.31 kB
101
109
  ℹ dist/query/orm/orm.d.ts.map  0.45 kB │ gzip: 0.28 kB
102
110
  ℹ dist/util/parse.js  0.45 kB │ gzip: 0.29 kB
103
- ℹ dist/adapters/drizzle/shared.js  0.44 kB │ gzip: 0.30 kB
104
111
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing-utils.js.map  0.42 kB │ gzip: 0.29 kB
105
112
  ℹ dist/query/cursor.d.ts.map  0.42 kB │ gzip: 0.26 kB
106
113
  ℹ dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/view-common.js.map  0.41 kB │ gzip: 0.28 kB
@@ -115,27 +122,28 @@ $ tsdown
115
122
  ℹ dist/schema-generator/schema-generator.d.ts.map  0.23 kB │ gzip: 0.17 kB
116
123
  ℹ dist/util/types.d.ts.map  0.22 kB │ gzip: 0.16 kB
117
124
  ℹ dist/migration-engine/shared.js  0.21 kB │ gzip: 0.17 kB
118
- ℹ dist/adapters/drizzle/drizzle-query.d.ts.map  0.18 kB │ gzip: 0.14 kB
125
+ ℹ dist/adapters/drizzle/drizzle-query.d.ts.map  0.17 kB │ gzip: 0.14 kB
119
126
  ℹ dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map  0.17 kB │ gzip: 0.14 kB
120
127
  ℹ dist/shared/providers.d.ts.map  0.15 kB │ gzip: 0.13 kB
128
+ ℹ dist/schema/create.d.ts 19.65 kB │ gzip: 4.78 kB
121
129
  ℹ dist/query/unit-of-work.d.ts 17.49 kB │ gzip: 4.26 kB
122
- ℹ dist/schema/create.d.ts 17.28 kB │ gzip: 4.20 kB
123
130
  ℹ dist/query/query.d.ts  6.19 kB │ gzip: 1.59 kB
124
131
  ℹ dist/query/cursor.d.ts  2.57 kB │ gzip: 0.93 kB
125
132
  ℹ dist/fragment.d.ts  2.39 kB │ gzip: 0.75 kB
126
- ℹ dist/mod.d.ts  2.38 kB │ gzip: 0.78 kB
127
- ℹ dist/adapters/drizzle/drizzle-adapter.d.ts  0.94 kB │ gzip: 0.42 kB
128
- ℹ dist/adapters/kysely/kysely-adapter.d.ts  0.89 kB │ gzip: 0.42 kB
133
+ ℹ dist/mod.d.ts  2.23 kB │ gzip: 0.73 kB
134
+ ℹ dist/migration-engine/generation-engine.d.ts  1.99 kB │ gzip: 0.72 kB
135
+ ℹ dist/adapters/drizzle/drizzle-adapter.d.ts  1.09 kB │ gzip: 0.49 kB
136
+ ℹ dist/adapters/kysely/kysely-adapter.d.ts  0.94 kB │ gzip: 0.44 kB
129
137
  ℹ dist/id.d.ts  0.07 kB │ gzip: 0.07 kB
130
- ℹ dist/migration-engine/shared.d.ts  2.23 kB │ gzip: 0.82 kB
138
+ ℹ dist/migration-engine/shared.d.ts  2.26 kB │ gzip: 0.83 kB
131
139
  ℹ dist/query/condition-builder.d.ts  2.00 kB │ gzip: 0.68 kB
132
- ℹ dist/migration-engine/create.d.ts  1.23 kB │ gzip: 0.56 kB
133
- ℹ dist/adapters/adapters.d.ts  0.85 kB │ gzip: 0.38 kB
140
+ ℹ dist/adapters/adapters.d.ts  1.10 kB │ gzip: 0.51 kB
141
+ ℹ dist/migration-engine/create.d.ts  1.10 kB │ gzip: 0.51 kB
134
142
  ℹ dist/query/orm/orm.d.ts  0.61 kB │ gzip: 0.34 kB
135
143
  ℹ dist/adapters/drizzle/drizzle-query.d.ts  0.51 kB │ gzip: 0.31 kB
136
144
  ℹ dist/schema-generator/schema-generator.d.ts  0.37 kB │ gzip: 0.20 kB
137
145
  ℹ dist/shared/providers.d.ts  0.26 kB │ gzip: 0.19 kB
138
146
  ℹ dist/util/types.d.ts  0.26 kB │ gzip: 0.21 kB
139
147
  ℹ dist/adapters/drizzle/drizzle-uow-compiler.d.ts  0.22 kB │ gzip: 0.17 kB
140
- ℹ 133 files, total: 687.12 kB
141
- ✔ Build complete in 12650ms
148
+ ℹ 141 files, total: 740.43 kB
149
+ ✔ Build complete in 21880ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @fragno-dev/db
2
2
 
3
+ ## 0.1.2
4
+
5
+ ### Patch Changes
6
+
7
+ - e7122f2: DrizzleAdapter: now export Fragment schema version from generate schema file
8
+ - 921ef11: Schema definition: redesign the default value API to more clearly distinguish between
9
+ database-level and runtime defaults
10
+ - be17727: Added support for generating migrations in multi-Fragment applications
11
+ - 8362d9a: Added support for using multiple database Fragments in a single application
12
+ - 8362d9a: DrizzleAdapter: support collecting schemas of multiple Fragments into a single Drizzle
13
+ schema
14
+
3
15
  ## 0.1.1
4
16
 
5
17
  ### Patch Changes
@@ -11,7 +11,17 @@ interface DatabaseAdapter<TUOWConfig = void> {
11
11
  getSchemaVersion(namespace: string): Promise<string | undefined>;
12
12
  createQueryEngine: <const T extends AnySchema>(schema: T, namespace: string) => AbstractQuery<T, TUOWConfig>;
13
13
  createMigrationEngine?: <const T extends AnySchema>(schema: T, namespace: string) => Migrator;
14
- createSchemaGenerator?: <const T extends AnySchema>(schema: T, namespace: string) => SchemaGenerator;
14
+ /**
15
+ * Generate a combined schema file from one or more fragments.
16
+ * If not implemented, schema generation is not supported for this adapter.
17
+ */
18
+ createSchemaGenerator?: (fragments: {
19
+ schema: AnySchema;
20
+ namespace: string;
21
+ }[], options?: {
22
+ path?: string;
23
+ }) => SchemaGenerator;
24
+ isConnectionHealthy: () => Promise<boolean>;
15
25
  }
16
26
  //#endregion
17
27
  export { DatabaseAdapter };
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.d.ts","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":[],"mappings":";;;;;;UAKiB;;AAAjB;;EAMsC,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAFC,OAED,CAAA,MAAA,GAAA,SAAA,CAAA;EAC1B,iBAAA,EAAA,CAAA,gBAD0B,SAC1B,CAAA,CAAA,MAAA,EAAA,CAAA,EAAA,SAAA,EAAA,MAAA,EAAA,GAEL,aAFK,CAES,CAFT,EAEY,UAFZ,CAAA;EAES,qBAAA,CAAA,EAAA,CAAA,gBAEsB,SAFtB,CAAA,CAAA,MAAA,EAEyC,CAFzC,EAAA,SAAA,EAAA,MAAA,EAAA,GAEkE,QAFlE;EAAG,qBAAA,CAAA,EAAA,CAAA,gBAGmB,SAHnB,CAAA,CAAA,MAAA,EAIZ,CAJY,EAAA,SAAA,EAAA,MAAA,EAAA,GAMjB,eANiB"}
1
+ {"version":3,"file":"adapters.d.ts","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":[],"mappings":";;;;;;UAKiB;;AAAjB;;EAMsC,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAFC,OAED,CAAA,MAAA,GAAA,SAAA,CAAA;EAC1B,iBAAA,EAAA,CAAA,gBAD0B,SAC1B,CAAA,CAAA,MAAA,EAAA,CAAA,EAAA,SAAA,EAAA,MAAA,EAAA,GAEL,aAFK,CAES,CAFT,EAEY,UAFZ,CAAA;EAES,qBAAA,CAAA,EAAA,CAAA,gBAEsB,SAFtB,CAAA,CAAA,MAAA,EAEyC,CAFzC,EAAA,SAAA,EAAA,MAAA,EAAA,GAEkE,QAFlE;EAAG;;;;EAE+D,qBAAA,CAAA,EAAA,CAAA,SAAA,EAAA;IAO9D,MAAA,EAAA,SAAA;IAElB,SAAA,EAAA,MAAA;EAEsB,CAAA,EAAA,EAAA,QAAA,EAAA;IAAO,IAAA,CAAA,EAAA,MAAA;QAF7B;6BAEsB"}
@@ -12,9 +12,16 @@ interface DrizzleConfig {
12
12
  declare class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
13
13
  #private;
14
14
  constructor(config: DrizzleConfig);
15
+ get provider(): "sqlite" | "mysql" | "postgresql";
16
+ isConnectionHealthy(): Promise<boolean>;
15
17
  getSchemaVersion(namespace: string): Promise<string | undefined>;
16
- createQueryEngine<TSchema extends AnySchema>(schema: TSchema, _namespace: string): AbstractQuery<TSchema, DrizzleUOWConfig>;
17
- createSchemaGenerator(schema: AnySchema, namespace: string): SchemaGenerator;
18
+ createQueryEngine<TSchema extends AnySchema>(schema: TSchema, namespace: string): AbstractQuery<TSchema, DrizzleUOWConfig>;
19
+ createSchemaGenerator(fragments: {
20
+ schema: AnySchema;
21
+ namespace: string;
22
+ }[], options?: {
23
+ path?: string;
24
+ }): SchemaGenerator;
18
25
  }
19
26
  //#endregion
20
27
  export { DrizzleAdapter, DrizzleConfig };
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-adapter.d.ts","names":[],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;UAiBiB,aAAA;;EAAA,QAAA,EAAA,QAAa,GAAA,OAAA,GAAA,YAAA;AAK9B;AAAuD,cAA1C,cAAA,YAA0B,eAAgB,CAAA,gBAAA,CAAA,CAAA;EAGjC,CAAA,OAAA;EAWuB,WAAA,CAAA,MAAA,EAXvB,aAWuB;EAaT,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAbS,OAaT,CAAA,MAAA,GAAA,SAAA,CAAA;EACxB,iBAAA,CAAA,gBADwB,SACxB,CAAA,CAAA,MAAA,EAAA,OAAA,EAAA,UAAA,EAAA,MAAA,CAAA,EAEP,aAFO,CAEO,OAFP,EAEgB,gBAFhB,CAAA;EAEO,qBAAA,CAAA,MAAA,EAIa,SAJb,EAAA,SAAA,EAAA,MAAA,CAAA,EAI4C,eAJ5C"}
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,61 +1,43 @@
1
- import { createId } from "../../id.js";
2
- import { SchemaBuilder, column, idColumn, schema } from "../../schema/create.js";
1
+ import "../../schema/create.js";
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";
4
+ import { createTableNameMapper } from "./shared.js";
3
5
  import { generateSchema } from "./generate.js";
4
6
  import { fromDrizzle } from "./drizzle-query.js";
5
7
 
6
8
  //#region src/adapters/drizzle/drizzle-adapter.ts
7
- const SETTINGS_TABLE_NAME = "fragno_db_settings";
8
9
  var DrizzleAdapter = class {
9
10
  #drizzleConfig;
10
11
  constructor(config) {
11
12
  this.#drizzleConfig = config;
12
13
  }
13
- #createFullSchema(schema$1) {
14
- return new SchemaBuilder().mergeWithExistingSchema(schema$1).mergeWithExistingSchema(createSettingsSchema(schema$1.version)).build();
14
+ get provider() {
15
+ return this.#drizzleConfig.provider;
16
+ }
17
+ async isConnectionHealthy() {
18
+ try {
19
+ return (await this.#drizzleConfig.db.execute(sql`SELECT 1 as healthy`)).rows[0]["healthy"] === 1;
20
+ } catch {
21
+ return false;
22
+ }
15
23
  }
16
24
  async getSchemaVersion(namespace) {
17
- const manager = createSettingsManager(this.createQueryEngine(createSettingsSchema(0), namespace), namespace);
18
- const randomId = createId();
19
- const result = await manager.createKeyWithDefault(randomId);
20
- if (result) await manager.delete(result.id);
21
- return result?.value;
25
+ return (await createSettingsManager(this.createQueryEngine(settingsSchema, namespace), namespace).get("version"))?.value;
22
26
  }
23
- createQueryEngine(schema$1, _namespace) {
24
- return fromDrizzle(schema$1, this.#drizzleConfig);
27
+ createQueryEngine(schema, namespace) {
28
+ const mapper = namespace ? createTableNameMapper(namespace) : void 0;
29
+ return fromDrizzle(schema, this.#drizzleConfig, mapper);
25
30
  }
26
- createSchemaGenerator(schema$1, namespace) {
27
- return { generateSchema: (options) => {
28
- const path = options?.path ?? `drizzle-schema-${namespace}.ts`;
31
+ createSchemaGenerator(fragments, options) {
32
+ return { generateSchema: (genOptions) => {
33
+ const path = genOptions?.path ?? options?.path ?? "fragno-schema.ts";
29
34
  return {
30
- schema: generateSchema(this.#createFullSchema(schema$1), this.#drizzleConfig.provider),
35
+ schema: generateSchema(fragments, this.#drizzleConfig.provider),
31
36
  path
32
37
  };
33
38
  } };
34
39
  }
35
40
  };
36
- function createSettingsSchema(version) {
37
- return schema((s) => {
38
- return s.addTable(SETTINGS_TABLE_NAME, (t) => {
39
- return t.addColumn("id", idColumn()).addColumn("key", column("string")).addColumn("value", column("string").defaultTo(String(version))).createIndex("unique_key", ["key"], { unique: true });
40
- });
41
- });
42
- }
43
- function createSettingsManager(queryEngine, namespace) {
44
- return {
45
- async createKeyWithDefault(key) {
46
- const { success } = await queryEngine.createUnitOfWork("createKeyWithDefault").create(SETTINGS_TABLE_NAME, { key: `${namespace}.${key}` }).executeMutations();
47
- if (!success) throw new Error("Failed to create key with default");
48
- return this.get(key);
49
- },
50
- async get(key) {
51
- const [[result]] = await queryEngine.createUnitOfWork().find(SETTINGS_TABLE_NAME, (b) => b.whereIndex("unique_key", (eb) => eb("key", "=", `${namespace}.${key}`))).executeRetrieve();
52
- return result;
53
- },
54
- async delete(id) {
55
- await queryEngine.delete(SETTINGS_TABLE_NAME, id);
56
- }
57
- };
58
- }
59
41
 
60
42
  //#endregion
61
43
  export { DrizzleAdapter };
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-adapter.js","names":["#drizzleConfig","schema","#createFullSchema"],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":["import type { DatabaseAdapter } from \"../adapters\";\nimport {\n column,\n idColumn,\n schema,\n SchemaBuilder,\n type AnySchema,\n type FragnoId,\n} 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 { createId } from \"../../id\";\n\nconst SETTINGS_TABLE_NAME = \"fragno_db_settings\" as const;\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 #createFullSchema<T extends AnySchema>(schema: T) {\n return new SchemaBuilder()\n .mergeWithExistingSchema(schema)\n .mergeWithExistingSchema(createSettingsSchema(schema.version))\n .build();\n }\n\n async getSchemaVersion(namespace: string): Promise<string | undefined> {\n const queryEngine = this.createQueryEngine(createSettingsSchema(0), namespace);\n const manager = createSettingsManager(queryEngine, namespace);\n const randomId = createId();\n\n const result = await manager.createKeyWithDefault(randomId);\n if (result) {\n await manager.delete(result.id);\n }\n\n return result?.value;\n }\n\n createQueryEngine<TSchema extends AnySchema>(\n schema: TSchema,\n _namespace: string,\n ): AbstractQuery<TSchema, DrizzleUOWConfig> {\n return fromDrizzle(schema, this.#drizzleConfig);\n }\n\n createSchemaGenerator(schema: AnySchema, namespace: string): SchemaGenerator {\n return {\n generateSchema: (options) => {\n const path = options?.path ?? `drizzle-schema-${namespace}.ts`;\n\n const schemaWithSettingsTable = this.#createFullSchema(schema);\n\n return {\n schema: generateSchema(schemaWithSettingsTable, this.#drizzleConfig.provider),\n path,\n };\n },\n };\n }\n}\n\nfunction createSettingsSchema(version: number) {\n return schema((s) => {\n return s.addTable(SETTINGS_TABLE_NAME, (t) => {\n return t\n .addColumn(\"id\", idColumn())\n .addColumn(\"key\", column(\"string\"))\n .addColumn(\"value\", column(\"string\").defaultTo(String(version)))\n .createIndex(\"unique_key\", [\"key\"], { unique: true });\n });\n });\n}\n\nfunction createSettingsManager(\n queryEngine: AbstractQuery<ReturnType<typeof createSettingsSchema>, DrizzleUOWConfig>,\n namespace: string,\n) {\n return {\n async createKeyWithDefault(key: string) {\n const writeUow = queryEngine\n .createUnitOfWork(\"createKeyWithDefault\")\n .create(SETTINGS_TABLE_NAME, {\n key: `${namespace}.${key}`,\n });\n const { success } = await writeUow.executeMutations();\n if (!success) {\n throw new Error(\"Failed to create key with default\");\n }\n\n return this.get(key);\n },\n\n async get(key: string): Promise<{ id: FragnoId; key: string; value: string } | undefined> {\n const uow = queryEngine\n .createUnitOfWork()\n .find(SETTINGS_TABLE_NAME, (b) =>\n b.whereIndex(\"unique_key\", (eb) => eb(\"key\", \"=\", `${namespace}.${key}`)),\n );\n const [[result]] = await uow.executeRetrieve();\n return result; // FIXME: result should be maybe undefined\n },\n\n async delete(id: FragnoId) {\n await queryEngine.delete(SETTINGS_TABLE_NAME, id);\n },\n };\n}\n"],"mappings":";;;;;;AAeA,MAAM,sBAAsB;AAO5B,IAAa,iBAAb,MAAyE;CACvE;CAEA,YAAY,QAAuB;AACjC,QAAKA,gBAAiB;;CAGxB,kBAAuC,UAAW;AAChD,SAAO,IAAI,eAAe,CACvB,wBAAwBC,SAAO,CAC/B,wBAAwB,qBAAqBA,SAAO,QAAQ,CAAC,CAC7D,OAAO;;CAGZ,MAAM,iBAAiB,WAAgD;EAErE,MAAM,UAAU,sBADI,KAAK,kBAAkB,qBAAqB,EAAE,EAAE,UAAU,EAC3B,UAAU;EAC7D,MAAM,WAAW,UAAU;EAE3B,MAAM,SAAS,MAAM,QAAQ,qBAAqB,SAAS;AAC3D,MAAI,OACF,OAAM,QAAQ,OAAO,OAAO,GAAG;AAGjC,SAAO,QAAQ;;CAGjB,kBACE,UACA,YAC0C;AAC1C,SAAO,YAAYA,UAAQ,MAAKD,cAAe;;CAGjD,sBAAsB,UAAmB,WAAoC;AAC3E,SAAO,EACL,iBAAiB,YAAY;GAC3B,MAAM,OAAO,SAAS,QAAQ,kBAAkB,UAAU;AAI1D,UAAO;IACL,QAAQ,eAHsB,MAAKE,iBAAkBD,SAAO,EAGZ,MAAKD,cAAe,SAAS;IAC7E;IACD;KAEJ;;;AAIL,SAAS,qBAAqB,SAAiB;AAC7C,QAAO,QAAQ,MAAM;AACnB,SAAO,EAAE,SAAS,sBAAsB,MAAM;AAC5C,UAAO,EACJ,UAAU,MAAM,UAAU,CAAC,CAC3B,UAAU,OAAO,OAAO,SAAS,CAAC,CAClC,UAAU,SAAS,OAAO,SAAS,CAAC,UAAU,OAAO,QAAQ,CAAC,CAAC,CAC/D,YAAY,cAAc,CAAC,MAAM,EAAE,EAAE,QAAQ,MAAM,CAAC;IACvD;GACF;;AAGJ,SAAS,sBACP,aACA,WACA;AACA,QAAO;EACL,MAAM,qBAAqB,KAAa;GAMtC,MAAM,EAAE,YAAY,MALH,YACd,iBAAiB,uBAAuB,CACxC,OAAO,qBAAqB,EAC3B,KAAK,GAAG,UAAU,GAAG,OACtB,CAAC,CAC+B,kBAAkB;AACrD,OAAI,CAAC,QACH,OAAM,IAAI,MAAM,oCAAoC;AAGtD,UAAO,KAAK,IAAI,IAAI;;EAGtB,MAAM,IAAI,KAAgF;GAMxF,MAAM,CAAC,CAAC,WAAW,MALP,YACT,kBAAkB,CAClB,KAAK,sBAAsB,MAC1B,EAAE,WAAW,eAAe,OAAO,GAAG,OAAO,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC,CAC1E,CAC0B,iBAAiB;AAC9C,UAAO;;EAGT,MAAM,OAAO,IAAc;AACzB,SAAM,YAAY,OAAO,qBAAqB,GAAG;;EAEpD"}
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 +1 @@
1
- {"version":3,"file":"drizzle-query.d.ts","names":[],"sources":["../../../src/adapters/drizzle/drizzle-query.ts"],"sourcesContent":[],"mappings":";;;;;;;UAkBiB,gBAAA;;;;;oBAKG"}
1
+ {"version":3,"file":"drizzle-query.d.ts","names":[],"sources":["../../../src/adapters/drizzle/drizzle-query.ts"],"sourcesContent":[],"mappings":";;;;;;;UAaiB,gBAAA;;;;;oBAKG"}
@@ -14,6 +14,7 @@ import { createDrizzleUOWDecoder } from "./drizzle-uow-decoder.js";
14
14
  *
15
15
  * @param schema - The database schema definition
16
16
  * @param config - Drizzle configuration containing the database instance and provider
17
+ * @param mapper - Optional table name mapper for namespace prefixing
17
18
  * @returns An AbstractQuery instance for performing database operations
18
19
  *
19
20
  * @example
@@ -26,11 +27,11 @@ import { createDrizzleUOWDecoder } from "./drizzle-uow-decoder.js";
26
27
  * const uow = queryEngine.createUnitOfWork('myOperation');
27
28
  * ```
28
29
  */
29
- function fromDrizzle(schema, config) {
30
+ function fromDrizzle(schema, config, mapper) {
30
31
  const [db] = parseDrizzle(config.db);
31
32
  const { provider } = config;
32
33
  function createUOW(name, uowConfig) {
33
- return new UnitOfWork(schema, createDrizzleUOWCompiler(schema, config, uowConfig?.onQuery), {
34
+ return new UnitOfWork(schema, createDrizzleUOWCompiler(schema, config, mapper, uowConfig?.onQuery), {
34
35
  executeRetrievalPhase: (retrievalBatch) => executeDrizzleRetrievalPhase(db, retrievalBatch),
35
36
  executeMutationPhase: (mutationBatch) => executeDrizzleMutationPhase(db, mutationBatch)
36
37
  }, createDrizzleUOWDecoder(schema, provider), name);
@@ -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 } from \"./shared\";\nimport { createDrizzleUOWDecoder } from \"./drizzle-uow-decoder\";\n\nexport interface DrizzleResult {\n rows: Record<string, unknown>[];\n affectedRows: number;\n}\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 * @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): 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, 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),\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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"}
@@ -2,12 +2,12 @@ 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 { ReferenceSubquery, encodeValues } from "../../query/result-transform.js";
6
5
  import { sql } from "../../node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/sql.js";
7
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";
8
7
  import { asc, desc } from "../../node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/select.js";
9
8
  import { count } from "../../node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/functions/aggregate.js";
10
9
  import { parseDrizzle } from "./shared.js";
10
+ import { ReferenceSubquery, encodeValues } from "../../query/result-transform.js";
11
11
  import { getOrderedJoinColumns } from "./join-column-utils.js";
12
12
 
13
13
  //#region src/adapters/drizzle/drizzle-uow-compiler.ts
@@ -19,10 +19,11 @@ import { getOrderedJoinColumns } from "./join-column-utils.js";
19
19
  *
20
20
  * @param schema - The database schema
21
21
  * @param config - Drizzle configuration
22
+ * @param mapper - Optional table name mapper for namespace prefixing
22
23
  * @param onQuery - Optional callback to receive compiled queries for logging/debugging
23
24
  * @returns A UOWCompiler instance for Drizzle
24
25
  */
25
- function createDrizzleUOWCompiler(schema, config, onQuery) {
26
+ function createDrizzleUOWCompiler(schema, config, mapper, onQuery) {
26
27
  const [db, drizzleTables] = parseDrizzle(config.db);
27
28
  const { provider } = config;
28
29
  /**
@@ -30,10 +31,10 @@ function createDrizzleUOWCompiler(schema, config, onQuery) {
30
31
  * @throws Error if table is not found in Drizzle schema
31
32
  */
32
33
  function toDrizzleTable(table) {
33
- const tableName = table.ormName;
34
- const out = drizzleTables[tableName];
34
+ const physicalTableName = mapper ? mapper.toPhysical(table.ormName) : table.ormName;
35
+ const out = drizzleTables[physicalTableName];
35
36
  if (out) return out;
36
- throw new Error(`[Drizzle] Unknown table name ${tableName}, is it included in your Drizzle schema?`);
37
+ throw new Error(`[Drizzle] Unknown table name ${physicalTableName} (logical: ${table.ormName}), is it included in your Drizzle schema?`);
37
38
  }
38
39
  /**
39
40
  * Convert a Fragno column to a Drizzle column
@@ -235,7 +236,8 @@ function createDrizzleUOWCompiler(schema, config, onQuery) {
235
236
  with: {}
236
237
  };
237
238
  if (joins) queryConfig.with = processJoins(joins);
238
- const compiledQuery = db.query[op.table.ormName].findMany(queryConfig).toSQL();
239
+ const physicalTableName = mapper ? mapper.toPhysical(op.table.ormName) : op.table.ormName;
240
+ const compiledQuery = db.query[physicalTableName].findMany(queryConfig).toSQL();
239
241
  onQuery?.(compiledQuery);
240
242
  return compiledQuery;
241
243
  }