@fragno-dev/db 0.1.12 → 0.1.14

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 (85) hide show
  1. package/.turbo/turbo-build.log +51 -44
  2. package/CHANGELOG.md +12 -0
  3. package/dist/adapters/adapters.d.ts +13 -1
  4. package/dist/adapters/adapters.d.ts.map +1 -1
  5. package/dist/adapters/adapters.js.map +1 -1
  6. package/dist/adapters/drizzle/drizzle-adapter.d.ts +2 -0
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  8. package/dist/adapters/drizzle/drizzle-adapter.js +7 -2
  9. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  10. package/dist/adapters/drizzle/drizzle-query.d.ts.map +1 -1
  11. package/dist/adapters/drizzle/drizzle-query.js +10 -4
  12. package/dist/adapters/drizzle/drizzle-query.js.map +1 -1
  13. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -1
  14. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +1 -1
  15. package/dist/adapters/drizzle/drizzle-uow-compiler.js +51 -37
  16. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +1 -1
  17. package/dist/adapters/drizzle/drizzle-uow-decoder.js +26 -2
  18. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +1 -1
  19. package/dist/adapters/drizzle/generate.js +1 -1
  20. package/dist/adapters/drizzle/shared.d.ts +14 -1
  21. package/dist/adapters/drizzle/shared.d.ts.map +1 -0
  22. package/dist/adapters/kysely/kysely-adapter.d.ts +3 -1
  23. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  24. package/dist/adapters/kysely/kysely-adapter.js +7 -2
  25. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  26. package/dist/adapters/kysely/kysely-query.d.ts.map +1 -1
  27. package/dist/adapters/kysely/kysely-query.js +34 -4
  28. package/dist/adapters/kysely/kysely-query.js.map +1 -1
  29. package/dist/adapters/kysely/kysely-shared.d.ts +11 -0
  30. package/dist/adapters/kysely/kysely-shared.d.ts.map +1 -0
  31. package/dist/adapters/kysely/kysely-uow-compiler.js +40 -10
  32. package/dist/adapters/kysely/kysely-uow-compiler.js.map +1 -1
  33. package/dist/adapters/kysely/migration/execute-base.js +1 -1
  34. package/dist/bind-services.d.ts +7 -0
  35. package/dist/bind-services.d.ts.map +1 -0
  36. package/dist/bind-services.js +14 -0
  37. package/dist/bind-services.js.map +1 -0
  38. package/dist/fragment.d.ts +131 -12
  39. package/dist/fragment.d.ts.map +1 -1
  40. package/dist/fragment.js +107 -8
  41. package/dist/fragment.js.map +1 -1
  42. package/dist/mod.d.ts +5 -2
  43. package/dist/mod.d.ts.map +1 -1
  44. package/dist/mod.js +4 -2
  45. package/dist/mod.js.map +1 -1
  46. package/dist/query/cursor.d.ts +67 -32
  47. package/dist/query/cursor.d.ts.map +1 -1
  48. package/dist/query/cursor.js +84 -31
  49. package/dist/query/cursor.js.map +1 -1
  50. package/dist/query/query.d.ts +7 -2
  51. package/dist/query/query.d.ts.map +1 -1
  52. package/dist/query/unit-of-work.d.ts +113 -18
  53. package/dist/query/unit-of-work.d.ts.map +1 -1
  54. package/dist/query/unit-of-work.js +266 -16
  55. package/dist/query/unit-of-work.js.map +1 -1
  56. package/package.json +2 -2
  57. package/src/adapters/adapters.ts +14 -0
  58. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +78 -6
  59. package/src/adapters/drizzle/drizzle-adapter-sqlite.test.ts +139 -9
  60. package/src/adapters/drizzle/drizzle-adapter.ts +16 -1
  61. package/src/adapters/drizzle/drizzle-query.ts +35 -15
  62. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +76 -60
  63. package/src/adapters/drizzle/drizzle-uow-compiler.ts +82 -41
  64. package/src/adapters/drizzle/drizzle-uow-decoder.ts +42 -6
  65. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +104 -6
  66. package/src/adapters/kysely/kysely-adapter.ts +16 -1
  67. package/src/adapters/kysely/kysely-query.ts +76 -16
  68. package/src/adapters/kysely/kysely-uow-compiler.test.ts +62 -46
  69. package/src/adapters/kysely/kysely-uow-compiler.ts +53 -16
  70. package/src/adapters/kysely/kysely-uow-joins.test.ts +30 -30
  71. package/src/bind-services.test.ts +214 -0
  72. package/src/bind-services.ts +37 -0
  73. package/src/db-fragment.test.ts +800 -0
  74. package/src/fragment.ts +557 -28
  75. package/src/mod.ts +25 -1
  76. package/src/query/cursor.test.ts +113 -68
  77. package/src/query/cursor.ts +127 -36
  78. package/src/query/query.ts +21 -2
  79. package/src/query/unit-of-work-multi-schema.test.ts +64 -0
  80. package/src/query/unit-of-work-types.test.ts +13 -0
  81. package/src/query/unit-of-work.test.ts +5 -9
  82. package/src/query/unit-of-work.ts +629 -62
  83. package/src/uow-context-integration.test.ts +102 -0
  84. package/src/uow-context.test.ts +182 -0
  85. package/src/fragment.test.ts +0 -341
@@ -1,5 +1,5 @@
1
1
 
2
- > @fragno-dev/db@0.1.12 build /home/runner/work/fragno/fragno/packages/fragno-db
2
+ > @fragno-dev/db@0.1.14 build /home/runner/work/fragno/fragno/packages/fragno-db
3
3
  > tsdown
4
4
 
5
5
  ℹ tsdown v0.15.12 powered by rolldown v1.0.0-beta.45
@@ -7,65 +7,66 @@
7
7
  ℹ entry: src/fragment.ts, src/id.ts, src/mod.ts, src/adapters/adapters.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/drizzle/generate.ts, src/adapters/kysely/kysely-adapter.ts
8
8
  ℹ tsconfig: tsconfig.json
9
9
  ℹ Build start
10
+ ℹ dist/query/unit-of-work.js 24.77 kB │ gzip: 5.11 kB
10
11
  ℹ dist/schema/create.js 19.85 kB │ gzip: 5.20 kB
11
- ℹ dist/query/unit-of-work.js 16.49 kB │ gzip: 3.87 kB
12
12
  ℹ dist/adapters/drizzle/generate.js 14.82 kB │ gzip: 3.64 kB
13
13
  ℹ dist/migration-engine/generation-engine.js  8.40 kB │ gzip: 2.26 kB
14
- ℹ dist/adapters/kysely/kysely-adapter.js  5.27 kB │ gzip: 1.64 kB
15
- ℹ dist/query/cursor.js  2.99 kB │ gzip: 1.13 kB
16
- ℹ dist/mod.js  2.72 kB │ gzip: 0.90 kB
17
- ℹ dist/fragment.js  2.49 kB │ gzip: 0.71 kB
18
- ℹ dist/adapters/drizzle/drizzle-adapter.js  2.04 kB │ gzip: 0.77 kB
14
+ ℹ dist/fragment.js  5.75 kB │ gzip: 1.45 kB
15
+ ℹ dist/adapters/kysely/kysely-adapter.js  5.49 kB │ gzip: 1.70 kB
16
+ ℹ dist/query/cursor.js  4.32 kB │ gzip: 1.51 kB
17
+ ℹ dist/mod.js  3.03 kB │ gzip: 1.00 kB
18
+ ℹ dist/adapters/drizzle/drizzle-adapter.js  2.26 kB │ gzip: 0.83 kB
19
19
  ℹ dist/adapters/adapters.js  0.33 kB │ gzip: 0.17 kB
20
20
  ℹ dist/id.js  0.07 kB │ gzip: 0.07 kB
21
21
  ℹ dist/query/query.js  0.01 kB │ gzip: 0.03 kB
22
+ ℹ dist/query/unit-of-work.js.map 69.11 kB │ gzip: 13.49 kB
22
23
  ℹ dist/schema/create.js.map 48.81 kB │ gzip: 11.78 kB
23
- ℹ dist/query/unit-of-work.js.map 46.06 kB │ gzip: 10.25 kB
24
24
  ℹ dist/adapters/drizzle/generate.js.map 34.28 kB │ gzip: 8.39 kB
25
- ℹ dist/adapters/drizzle/drizzle-uow-compiler.js.map 31.70 kB │ gzip: 7.84 kB
25
+ ℹ dist/adapters/drizzle/drizzle-uow-compiler.js.map 34.18 kB │ gzip: 8.32 kB
26
26
  ℹ dist/adapters/kysely/kysely-query-builder.js.map 30.22 kB │ gzip: 7.85 kB
27
+ ℹ dist/fragment.js.map 27.71 kB │ gzip: 5.95 kB
28
+ ℹ dist/adapters/kysely/kysely-query.js.map 18.65 kB │ gzip: 5.13 kB
29
+ ℹ dist/query/unit-of-work.d.ts.map 17.00 kB │ gzip: 6.23 kB
27
30
  ℹ dist/migration-engine/generation-engine.js.map 16.40 kB │ gzip: 4.39 kB
28
- ℹ dist/adapters/kysely/kysely-query.js.map 15.71 kB │ gzip: 4.41 kB
29
- ℹ dist/adapters/drizzle/drizzle-uow-compiler.js 14.29 kB │ gzip: 3.65 kB
30
- ℹ dist/adapters/drizzle/drizzle-query.js.map 14.14 kB │ gzip: 3.85 kB
31
- ℹ dist/adapters/kysely/kysely-uow-compiler.js.map 13.93 kB │ gzip: 4.01 kB
31
+ ℹ dist/adapters/kysely/kysely-uow-compiler.js.map 16.11 kB │ gzip: 4.53 kB
32
+ ℹ dist/adapters/drizzle/drizzle-uow-compiler.js 15.54 kB │ gzip: 3.91 kB
33
+ ℹ dist/adapters/drizzle/drizzle-query.js.map 15.00 kB │ gzip: 3.99 kB
32
34
  ℹ dist/adapters/kysely/kysely-query-builder.js 13.63 kB │ gzip: 3.77 kB
33
35
  ℹ dist/schema/serialize.js.map 12.70 kB │ gzip: 2.80 kB
34
36
  ℹ dist/adapters/drizzle/drizzle-uow-executor.js.map 12.65 kB │ gzip: 3.76 kB
37
+ ℹ dist/adapters/kysely/kysely-adapter.js.map 12.15 kB │ gzip: 3.68 kB
35
38
  ℹ dist/schema/create.d.ts.map 11.85 kB │ gzip: 4.65 kB
36
39
  ℹ dist/adapters/kysely/migration/execute-sqlite.js.map 11.80 kB │ gzip: 3.28 kB
37
- ℹ dist/adapters/kysely/kysely-adapter.js.map 11.66 kB │ gzip: 3.55 kB
38
40
  ℹ dist/query/result-transform.js.map 11.61 kB │ gzip: 3.42 kB
39
41
  ℹ dist/adapters/kysely/migration/execute-mssql.js.map 11.48 kB │ gzip: 2.94 kB
40
42
  ℹ dist/adapters/kysely/migration/execute-postgres.js.map 10.44 kB │ gzip: 2.64 kB
41
- ℹ dist/query/unit-of-work.d.ts.map  9.84 kB │ gzip: 3.81 kB
42
43
  ℹ dist/adapters/kysely/migration/execute-base.js.map  9.77 kB │ gzip: 3.27 kB
44
+ ℹ dist/adapters/drizzle/drizzle-uow-decoder.js.map  9.56 kB │ gzip: 3.34 kB
43
45
  ℹ dist/adapters/kysely/migration/execute-mysql.js.map  9.30 kB │ gzip: 2.37 kB
44
46
  ℹ dist/query/condition-builder.js.map  9.18 kB │ gzip: 2.42 kB
47
+ ℹ dist/adapters/kysely/kysely-query.js  8.34 kB │ gzip: 2.41 kB
45
48
  ℹ dist/migration-engine/auto-from-schema.js.map  8.31 kB │ gzip: 2.18 kB
46
- ℹ dist/fragment.js.map  8.01 kB │ gzip: 2.12 kB
47
- ℹ dist/adapters/drizzle/drizzle-uow-decoder.js.map  7.73 kB │ gzip: 2.82 kB
49
+ ℹ dist/query/cursor.js.map  8.07 kB │ gzip: 2.57 kB
50
+ ℹ dist/query/query.d.ts.map  7.79 kB │ gzip: 2.90 kB
48
51
  ℹ dist/migration-engine/create.js.map  7.32 kB │ gzip: 2.14 kB
49
- ℹ dist/query/query.d.ts.map  7.31 kB │ gzip: 2.73 kB
50
- ℹ dist/adapters/kysely/kysely-query.js  7.10 kB │ gzip: 2.10 kB
52
+ ℹ dist/adapters/kysely/kysely-uow-compiler.js  7.16 kB │ gzip: 2.13 kB
51
53
  ℹ dist/adapters/kysely/kysely-uow-executor.js.map  6.98 kB │ gzip: 2.48 kB
52
- ℹ dist/adapters/drizzle/drizzle-query.js  6.63 kB │ gzip: 1.87 kB
54
+ ℹ dist/adapters/drizzle/drizzle-query.js  6.96 kB │ gzip: 1.93 kB
53
55
  ℹ dist/adapters/kysely/kysely-query-compiler.js.map  6.50 kB │ gzip: 1.62 kB
54
56
  ℹ dist/adapters/drizzle/drizzle-uow-executor.js  6.18 kB │ gzip: 1.90 kB
55
- ℹ dist/adapters/kysely/kysely-uow-compiler.js  6.02 kB │ gzip: 1.85 kB
56
57
  ℹ dist/query/result-transform.js  6.01 kB │ gzip: 1.92 kB
58
+ ℹ dist/mod.js.map  5.76 kB │ gzip: 1.89 kB
57
59
  ℹ dist/adapters/kysely/migration/execute-mssql.js  5.51 kB │ gzip: 1.52 kB
58
60
  ℹ dist/adapters/kysely/migration/execute-sqlite.js  5.48 kB │ gzip: 1.63 kB
59
- ℹ dist/mod.js.map  5.15 kB │ gzip: 1.72 kB
60
- ℹ dist/query/cursor.js.map  5.13 kB │ gzip: 1.81 kB
61
+ ℹ dist/adapters/drizzle/drizzle-adapter.js.map  5.09 kB │ gzip: 1.85 kB
61
62
  ℹ dist/adapters/kysely/migration/execute-postgres.js  4.91 kB │ gzip: 1.39 kB
62
- ℹ dist/adapters/drizzle/drizzle-adapter.js.map  4.61 kB │ gzip: 1.71 kB
63
+ ℹ dist/adapters/drizzle/drizzle-uow-decoder.js  4.64 kB │ gzip: 1.70 kB
64
+ ℹ dist/fragment.d.ts.map  4.64 kB │ gzip: 1.86 kB
63
65
  ℹ dist/adapters/kysely/migration/execute-mysql.js  4.34 kB │ gzip: 1.20 kB
64
66
  ℹ dist/migration-engine/auto-from-schema.js  4.33 kB │ gzip: 1.21 kB
65
67
  ℹ dist/adapters/kysely/migration/execute-base.js  4.31 kB │ gzip: 1.69 kB
66
68
  ℹ dist/schema/serialize.js  4.04 kB │ gzip: 1.07 kB
67
69
  ℹ dist/migration-engine/shared.js.map  3.89 kB │ gzip: 1.25 kB
68
- ℹ dist/adapters/drizzle/drizzle-uow-decoder.js  3.78 kB │ gzip: 1.46 kB
69
70
  ℹ dist/adapters/kysely/kysely-uow-executor.js  3.56 kB │ gzip: 1.26 kB
70
71
  ℹ dist/query/orm/orm.js.map  3.49 kB │ gzip: 1.38 kB
71
72
  ℹ dist/shared/settings-schema.js.map  3.19 kB │ gzip: 1.24 kB
@@ -77,11 +78,11 @@
77
78
  ℹ dist/adapters/kysely/migration/execute.js.map  2.34 kB │ gzip: 0.88 kB
78
79
  ℹ dist/adapters/kysely/kysely-query-compiler.js  2.31 kB │ gzip: 0.61 kB
79
80
  ℹ dist/query/condition-builder.d.ts.map  2.01 kB │ gzip: 0.74 kB
81
+ ℹ dist/adapters/adapters.js.map  2.01 kB │ gzip: 0.80 kB
80
82
  ℹ dist/adapters/drizzle/join-column-utils.js.map  1.98 kB │ gzip: 0.88 kB
81
83
  ℹ dist/query/condition-builder.js  1.89 kB │ gzip: 0.70 kB
82
- ℹ dist/fragment.d.ts.map  1.82 kB │ gzip: 0.81 kB
84
+ ℹ dist/bind-services.js.map  1.66 kB │ gzip: 0.72 kB
83
85
  ℹ dist/shared/settings-schema.js  1.57 kB │ gzip: 0.65 kB
84
- ℹ dist/adapters/adapters.js.map  1.55 kB │ gzip: 0.65 kB
85
86
  ℹ dist/adapters/kysely/migration/execute.js  1.40 kB │ gzip: 0.59 kB
86
87
  ℹ dist/adapters/kysely/migration/execute-factory.js  1.34 kB │ gzip: 0.55 kB
87
88
  ℹ dist/query/orm/orm.js  1.33 kB │ gzip: 0.60 kB
@@ -92,36 +93,40 @@
92
93
  ℹ dist/adapters/drizzle/join-column-utils.js  1.14 kB │ gzip: 0.55 kB
93
94
  ℹ dist/adapters/drizzle/drizzle-connection-pool.js  1.11 kB │ gzip: 0.53 kB
94
95
  ℹ dist/adapters/kysely/kysely-shared.js.map  1.07 kB │ gzip: 0.53 kB
95
- ℹ dist/adapters/drizzle/drizzle-adapter.d.ts.map  0.92 kB │ gzip: 0.42 kB
96
+ ℹ dist/adapters/drizzle/drizzle-adapter.d.ts.map  0.94 kB │ gzip: 0.43 kB
96
97
  ℹ dist/util/parse.js.map  0.83 kB │ gzip: 0.48 kB
97
- ℹ dist/adapters/kysely/kysely-adapter.d.ts.map  0.82 kB │ gzip: 0.42 kB
98
- ℹ dist/adapters/adapters.d.ts.map  0.73 kB │ gzip: 0.36 kB
98
+ ℹ dist/adapters/kysely/kysely-adapter.d.ts.map  0.82 kB │ gzip: 0.43 kB
99
+ ℹ dist/adapters/adapters.d.ts.map  0.77 kB │ gzip: 0.38 kB
99
100
  ℹ dist/migration-engine/generation-engine.d.ts.map  0.69 kB │ gzip: 0.36 kB
100
101
  ℹ dist/util/import-generator.js  0.65 kB │ gzip: 0.36 kB
102
+ ℹ dist/query/cursor.d.ts.map  0.58 kB │ gzip: 0.33 kB
103
+ ℹ dist/bind-services.d.ts.map  0.58 kB │ gzip: 0.32 kB
101
104
  ℹ dist/adapters/kysely/kysely-shared.js  0.54 kB │ gzip: 0.31 kB
105
+ ℹ dist/bind-services.js  0.52 kB │ gzip: 0.29 kB
102
106
  ℹ dist/migration-engine/shared.d.ts.map  0.51 kB │ gzip: 0.30 kB
103
107
  ℹ dist/query/orm/orm.d.ts.map  0.45 kB │ gzip: 0.28 kB
104
108
  ℹ dist/util/parse.js  0.45 kB │ gzip: 0.29 kB
105
- ℹ dist/query/cursor.d.ts.map  0.42 kB │ gzip: 0.26 kB
106
109
  ℹ dist/adapters/drizzle/generate.d.ts.map  0.31 kB │ gzip: 0.22 kB
107
110
  ℹ dist/migration-engine/create.d.ts.map  0.28 kB │ gzip: 0.22 kB
108
111
  ℹ dist/schema-generator/schema-generator.d.ts.map  0.23 kB │ gzip: 0.17 kB
109
112
  ℹ dist/util/types.d.ts.map  0.22 kB │ gzip: 0.16 kB
110
113
  ℹ dist/migration-engine/shared.js  0.21 kB │ gzip: 0.17 kB
114
+ ℹ dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map  0.19 kB │ gzip: 0.15 kB
111
115
  ℹ dist/adapters/drizzle/drizzle-query.d.ts.map  0.18 kB │ gzip: 0.14 kB
112
- ℹ dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map  0.18 kB │ gzip: 0.14 kB
113
116
  ℹ dist/adapters/kysely/kysely-query.d.ts.map  0.17 kB │ gzip: 0.14 kB
117
+ ℹ dist/adapters/kysely/kysely-shared.d.ts.map  0.16 kB │ gzip: 0.14 kB
118
+ ℹ dist/adapters/drizzle/shared.d.ts.map  0.15 kB │ gzip: 0.13 kB
114
119
  ℹ dist/shared/providers.d.ts.map  0.15 kB │ gzip: 0.13 kB
120
+ ℹ dist/query/unit-of-work.d.ts 23.75 kB │ gzip: 5.18 kB
115
121
  ℹ dist/schema/create.d.ts 19.46 kB │ gzip: 4.72 kB
116
- ℹ dist/query/unit-of-work.d.ts 17.68 kB │ gzip: 4.33 kB
117
- ℹ dist/query/query.d.ts  6.96 kB │ gzip: 1.75 kB
118
- ℹ dist/query/cursor.d.ts  2.57 kB │ gzip: 0.93 kB
119
- ℹ dist/fragment.d.ts  2.39 kB │ gzip: 0.75 kB
120
- ℹ dist/mod.d.ts  2.32 kB │ gzip: 0.76 kB
122
+ ℹ dist/fragment.d.ts  7.84 kB │ gzip: 1.95 kB
123
+ ℹ dist/query/query.d.ts  7.50 kB │ gzip: 1.80 kB
124
+ ℹ dist/query/cursor.d.ts  3.23 kB │ gzip: 1.15 kB
125
+ ℹ dist/mod.d.ts  3.01 kB │ gzip: 0.95 kB
121
126
  ℹ dist/migration-engine/generation-engine.d.ts  2.00 kB │ gzip: 0.72 kB
122
- ℹ dist/adapters/adapters.d.ts  1.48 kB │ gzip: 0.60 kB
123
- ℹ dist/adapters/drizzle/drizzle-adapter.d.ts  1.35 kB │ gzip: 0.56 kB
124
- ℹ dist/adapters/kysely/kysely-adapter.d.ts  1.28 kB │ gzip: 0.54 kB
127
+ ℹ dist/adapters/adapters.d.ts  1.94 kB │ gzip: 0.75 kB
128
+ ℹ dist/adapters/drizzle/drizzle-adapter.d.ts  1.46 kB │ gzip: 0.59 kB
129
+ ℹ dist/adapters/kysely/kysely-adapter.d.ts  1.40 kB │ gzip: 0.56 kB
125
130
  ℹ dist/adapters/drizzle/generate.d.ts  0.82 kB │ gzip: 0.42 kB
126
131
  ℹ dist/id.d.ts  0.07 kB │ gzip: 0.07 kB
127
132
  ℹ dist/migration-engine/shared.d.ts  2.76 kB │ gzip: 0.99 kB
@@ -130,10 +135,12 @@
130
135
  ℹ dist/adapters/drizzle/drizzle-query.d.ts  0.71 kB │ gzip: 0.41 kB
131
136
  ℹ dist/adapters/kysely/kysely-query.d.ts  0.65 kB │ gzip: 0.39 kB
132
137
  ℹ dist/query/orm/orm.d.ts  0.61 kB │ gzip: 0.34 kB
138
+ ℹ dist/bind-services.d.ts  0.54 kB │ gzip: 0.30 kB
139
+ ℹ dist/adapters/drizzle/shared.d.ts  0.37 kB │ gzip: 0.24 kB
133
140
  ℹ dist/schema-generator/schema-generator.d.ts  0.37 kB │ gzip: 0.20 kB
141
+ ℹ dist/adapters/kysely/kysely-shared.d.ts  0.36 kB │ gzip: 0.23 kB
134
142
  ℹ dist/shared/providers.d.ts  0.26 kB │ gzip: 0.19 kB
135
143
  ℹ dist/util/types.d.ts  0.26 kB │ gzip: 0.21 kB
136
- ℹ dist/adapters/drizzle/drizzle-uow-compiler.d.ts  0.25 kB │ gzip: 0.18 kB
137
- ℹ dist/adapters/drizzle/shared.d.ts  0.02 kB │ gzip: 0.04 kB
138
- ℹ 128 files, total: 753.71 kB
139
- ✔ Build complete in 9805ms
144
+ ℹ dist/adapters/drizzle/drizzle-uow-compiler.d.ts  0.24 kB │ gzip: 0.18 kB
145
+ ℹ 135 files, total: 859.29 kB
146
+ ✔ Build complete in 9769ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @fragno-dev/db
2
2
 
3
+ ## 0.1.14
4
+
5
+ ### Patch Changes
6
+
7
+ - acb0877: feat: add instantiateFragment helper function
8
+
9
+ ## 0.1.13
10
+
11
+ ### Patch Changes
12
+
13
+ - b54ff8b: Refactor cursor-based pagination API to make it more consistent and easier to use.
14
+
3
15
  ## 0.1.12
4
16
 
5
17
  ### Patch Changes
@@ -6,6 +6,13 @@ import { SchemaGenerator } from "../schema-generator/schema-generator.js";
6
6
  //#region src/adapters/adapters.d.ts
7
7
  declare const fragnoDatabaseAdapterNameFakeSymbol: "$fragno-database-adapter-name";
8
8
  declare const fragnoDatabaseAdapterVersionFakeSymbol: "$fragno-database-adapter-version";
9
+ /**
10
+ * Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)
11
+ */
12
+ interface TableNameMapper {
13
+ toPhysical(logicalName: string): string;
14
+ toLogical(physicalName: string): string;
15
+ }
9
16
  interface DatabaseAdapter<TUOWConfig = void> {
10
17
  [fragnoDatabaseAdapterNameFakeSymbol]: string;
11
18
  [fragnoDatabaseAdapterVersionFakeSymbol]: number;
@@ -25,9 +32,14 @@ interface DatabaseAdapter<TUOWConfig = void> {
25
32
  }[], options?: {
26
33
  path?: string;
27
34
  }) => SchemaGenerator;
35
+ /**
36
+ * Creates a table name mapper for the given namespace.
37
+ * Used to convert between logical table names and physical table names.
38
+ */
39
+ createTableNameMapper: (namespace: string) => TableNameMapper;
28
40
  isConnectionHealthy: () => Promise<boolean>;
29
41
  close: () => Promise<void>;
30
42
  }
31
43
  //#endregion
32
- export { DatabaseAdapter, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol };
44
+ export { DatabaseAdapter, TableNameMapper, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol };
33
45
  //# sourceMappingURL=adapters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.d.ts","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":[],"mappings":";;;;;;cAKa;cACA;AADA,UAGI,eAHJ,CAAA,aAA8E,IAAA,CAAA,CAAA;EAC9E,CAGV,mCAAA,CAHU,EAAA,MAAoF;EAEhF,CAEd,sCAAA,CAF6B,EAAA,MAAA;EAC7B;;;EAQmC,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,OAEP,CAFO,EAAA;IAEd,IAAA,CAAA,EAAA,MAAA;EAAO,CAAA,EAAA,GAJf,eAIe;6BAFO;eAEd"}
1
+ {"version":3,"file":"adapters.d.ts","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":[],"mappings":";;;;;;cAKa;cACA;AADb;AACA;AAKA;AAKiB,UALA,eAAA,CAKe;EAC7B,UAAA,CAAA,WAAA,EAAA,MAAA,CAAA,EAAA,MAAA;EACA,SAAA,CAAA,YAAA,EAAA,MAAA,CAAA,EAAA,MAAA;;AAOmC,UATrB,eASqB,CAAA,aAAA,IAAA,CAAA,CAAA;EAC1B,CATT,mCAAA,CASS,EAAA,MAAA;EAES,CAVlB,sCAAA,CAUkB,EAAA,MAAA;EAAG;;;EAEsC,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAPvB,OAOuB,CAAA,MAAA,GAAA,SAAA,CAAA;EAAyB,iBAAA,EAAA,CAAA,gBALjD,SAKiD,CAAA,CAAA,MAAA,EAJ3E,CAI2E,EAAA,SAAA,EAAA,MAAA,EAAA,GAFhF,aAEgF,CAFlE,CAEkE,EAF/D,UAE+D,CAAA;EAO9D,qBAAA,CAAA,EAAA,CAAA,gBAPkB,SAOlB,CAAA,CAAA,MAAA,EAPqC,CAOrC,EAAA,SAAA,EAAA,MAAA,EAAA,GAP8D,QAO9D;EAElB;;;;EAUe,qBAAA,CAAA,EAAA,CAAA,SAAA,EAAA;YAZG;;;;QAElB;;;;;gDAMyC;6BAEnB;eAEd"}
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.js","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":["import type { Migrator } from \"../migration-engine/create\";\nimport type { AbstractQuery } from \"../query/query\";\nimport type { SchemaGenerator } from \"../schema-generator/schema-generator\";\nimport type { AnySchema } from \"../schema/create\";\n\nexport const fragnoDatabaseAdapterNameFakeSymbol = \"$fragno-database-adapter-name\" as const;\nexport const fragnoDatabaseAdapterVersionFakeSymbol = \"$fragno-database-adapter-version\" as const;\n\nexport interface DatabaseAdapter<TUOWConfig = void> {\n [fragnoDatabaseAdapterNameFakeSymbol]: string;\n [fragnoDatabaseAdapterVersionFakeSymbol]: number;\n\n /**\n * Get current schema version, undefined if not initialized.\n */\n getSchemaVersion(namespace: string): Promise<string | undefined>;\n\n createQueryEngine: <const T extends AnySchema>(\n schema: T,\n namespace: string,\n ) => AbstractQuery<T, TUOWConfig>;\n\n createMigrationEngine?: <const T extends AnySchema>(schema: T, namespace: string) => Migrator;\n\n /**\n * Generate a combined schema file from one or more fragments.\n * If not implemented, schema generation is not supported for this adapter.\n */\n createSchemaGenerator?: (\n fragments: { schema: AnySchema; namespace: string }[],\n options?: { path?: string },\n ) => SchemaGenerator;\n\n isConnectionHealthy: () => Promise<boolean>;\n\n close: () => Promise<void>;\n}\n"],"mappings":";AAKA,MAAa,sCAAsC;AACnD,MAAa,yCAAyC"}
1
+ {"version":3,"file":"adapters.js","names":[],"sources":["../../src/adapters/adapters.ts"],"sourcesContent":["import type { Migrator } from \"../migration-engine/create\";\nimport type { AbstractQuery } from \"../query/query\";\nimport type { SchemaGenerator } from \"../schema-generator/schema-generator\";\nimport type { AnySchema } from \"../schema/create\";\n\nexport const fragnoDatabaseAdapterNameFakeSymbol = \"$fragno-database-adapter-name\" as const;\nexport const fragnoDatabaseAdapterVersionFakeSymbol = \"$fragno-database-adapter-version\" as const;\n\n/**\n * Maps logical table names (used by fragment authors) to physical table names (with namespace suffix)\n */\nexport interface TableNameMapper {\n toPhysical(logicalName: string): string;\n toLogical(physicalName: string): string;\n}\n\nexport interface DatabaseAdapter<TUOWConfig = void> {\n [fragnoDatabaseAdapterNameFakeSymbol]: string;\n [fragnoDatabaseAdapterVersionFakeSymbol]: number;\n\n /**\n * Get current schema version, undefined if not initialized.\n */\n getSchemaVersion(namespace: string): Promise<string | undefined>;\n\n createQueryEngine: <const T extends AnySchema>(\n schema: T,\n namespace: string,\n ) => AbstractQuery<T, TUOWConfig>;\n\n createMigrationEngine?: <const T extends AnySchema>(schema: T, namespace: string) => Migrator;\n\n /**\n * Generate a combined schema file from one or more fragments.\n * If not implemented, schema generation is not supported for this adapter.\n */\n createSchemaGenerator?: (\n fragments: { schema: AnySchema; namespace: string }[],\n options?: { path?: string },\n ) => SchemaGenerator;\n\n /**\n * Creates a table name mapper for the given namespace.\n * Used to convert between logical table names and physical table names.\n */\n createTableNameMapper: (namespace: string) => TableNameMapper;\n\n isConnectionHealthy: () => Promise<boolean>;\n\n close: () => Promise<void>;\n}\n"],"mappings":";AAKA,MAAa,sCAAsC;AACnD,MAAa,yCAAyC"}
@@ -2,6 +2,7 @@ import { AnySchema } from "../../schema/create.js";
2
2
  import { AbstractQuery } from "../../query/query.js";
3
3
  import { SchemaGenerator } from "../../schema-generator/schema-generator.js";
4
4
  import { DatabaseAdapter, fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
5
+ import { TableNameMapper } from "./shared.js";
5
6
  import { DrizzleUOWConfig } from "./drizzle-query.js";
6
7
 
7
8
  //#region src/adapters/drizzle/drizzle-adapter.d.ts
@@ -15,6 +16,7 @@ declare class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
15
16
  get [fragnoDatabaseAdapterNameFakeSymbol](): string;
16
17
  get [fragnoDatabaseAdapterVersionFakeSymbol](): number;
17
18
  close(): Promise<void>;
19
+ createTableNameMapper(namespace: string): TableNameMapper;
18
20
  get provider(): "sqlite" | "mysql" | "postgresql";
19
21
  isConnectionHealthy(): Promise<boolean>;
20
22
  getSchemaVersion(namespace: string): Promise<string | undefined>;
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-adapter.d.ts","names":[],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;UAgBiB,aAAA;EAAA,EAAA,EAAA,OAAA,GAAA,CAAA,GAAa,GAAA,OAAA,GACG,OAAO,CAAA,OAAA,CAAA,CAAA;EAI3B,QAAA,EAAA,QAAe,GAAA,OAAA,GAAA,YAAA;;AAIN,cAJT,cAAA,YAA0B,eAIjB,CAJiC,gBAIjC,CAAA,CAAA;EAOf,CAAA,OAAA;EAIA,WAAA,CAAA,MAAA,EAXe,aAWf;EAIU,KARV,mCAAA,GAQU,EAAA,MAAA;EAQc,KAZxB,sCAAA,GAYwB,EAAA,MAAA;EAqBc,KAAA,CAAA,CAAA,EA7B5B,OA6B4B,CAAA,IAAA,CAAA;EAST,IAAA,QAAA,CAAA,CAAA,EAAA,QAAA,GAAA,OAAA,GAAA,YAAA;EACxB,mBAAA,CAAA,CAAA,EA/BmB,OA+BnB,CAAA,OAAA,CAAA;EAEO,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAZ0B,OAY1B,CAAA,MAAA,GAAA,SAAA,CAAA;EAAS,iBAAA,CAAA,gBAHQ,SAGR,CAAA,CAAA,MAAA,EAFhB,OAEgB,EAAA,SAAA,EAAA,MAAA,CAAA,EAAvB,aAAuB,CAAT,OAAS,EAAA,gBAAA,CAAA;EAAvB,qBAAA,CAAA,SAAA,EAAA;IAOoB,MAAA,EAAA,SAAA;IAEpB,SAAA,EAAA,MAAA;EArEkC,CAAA,EAAA,EAAA,QAAA,EAAA;IAAe,IAAA,CAAA,EAAA,MAAA;MAqEjD"}
1
+ {"version":3,"file":"drizzle-adapter.d.ts","names":[],"sources":["../../../src/adapters/drizzle/drizzle-adapter.ts"],"sourcesContent":[],"mappings":";;;;;;;;UAgBiB,aAAA;iCACgB;EADhB,QAAA,EAAA,QAAa,GAAA,OAAA,GACG,YAAO;AAIxC;AAAuD,cAA1C,cAAA,YAA0B,eAAgB,CAAA,gBAAA,CAAA,CAAA;EAKjC,CAAA,OAAA;EAOf,WAAA,CAAA,MAAA,EAPe,aAOf;EAIA,KAJA,mCAAA,GAIA,EAAA,MAAA;EAIU,KAJV,sCAAA,GAIU,EAAA,MAAA;EAAO,KAAA,CAAA,CAAA,EAAP,OAAO,CAAA,IAAA,CAAA;EAYO,qBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,EAZP,eAYO;EAqBc,IAAA,QAAA,CAAA,CAAA,EAAA,QAAA,GAAA,OAAA,GAAA,YAAA;EAST,mBAAA,CAAA,CAAA,EA9BL,OA8BK,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,EAiBoB,SAjBpB;IAiBoB,SAAA,EAAA,MAAA;EAEpB,CAAA,EAAA,EAAA,OApFiD,CAoFjD,EAAA;IApFkC,IAAA,CAAA,EAAA,MAAA;EAAe,CAAA,CAAA,EAoFjD,eApFiD"}
@@ -1,5 +1,5 @@
1
- import { fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
2
1
  import "../../schema/create.js";
2
+ import { fragnoDatabaseAdapterNameFakeSymbol, fragnoDatabaseAdapterVersionFakeSymbol } from "../adapters.js";
3
3
  import { createSettingsManager, settingsSchema } from "../../shared/settings-schema.js";
4
4
  import { createTableNameMapper } from "./shared.js";
5
5
  import { generateSchema } from "./generate.js";
@@ -11,6 +11,7 @@ import { sql } from "drizzle-orm";
11
11
  var DrizzleAdapter = class {
12
12
  #connectionPool;
13
13
  #provider;
14
+ #schemaNamespaceMap = /* @__PURE__ */ new WeakMap();
14
15
  constructor(config) {
15
16
  this.#connectionPool = createDrizzleConnectionPool(config.db);
16
17
  this.#provider = config.provider;
@@ -24,6 +25,9 @@ var DrizzleAdapter = class {
24
25
  async close() {
25
26
  await this.#connectionPool.close();
26
27
  }
28
+ createTableNameMapper(namespace) {
29
+ return createTableNameMapper(namespace);
30
+ }
27
31
  get provider() {
28
32
  return this.#provider;
29
33
  }
@@ -43,8 +47,9 @@ var DrizzleAdapter = class {
43
47
  return (await createSettingsManager(this.createQueryEngine(settingsSchema, namespace), namespace).get("version"))?.value;
44
48
  }
45
49
  createQueryEngine(schema, namespace) {
50
+ this.#schemaNamespaceMap.set(schema, namespace);
46
51
  const mapper = namespace ? createTableNameMapper(namespace) : void 0;
47
- return fromDrizzle(schema, this.#connectionPool, this.#provider, mapper);
52
+ return fromDrizzle(schema, this.#connectionPool, this.#provider, mapper, void 0, this.#schemaNamespaceMap);
48
53
  }
49
54
  createSchemaGenerator(fragments, options) {
50
55
  return { generateSchema: (genOptions) => {
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-adapter.js","names":["#connectionPool","#provider"],"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\";\nimport {\n fragnoDatabaseAdapterNameFakeSymbol,\n fragnoDatabaseAdapterVersionFakeSymbol,\n} from \"../adapters\";\nimport type { ConnectionPool } from \"../../shared/connection-pool\";\nimport { createDrizzleConnectionPool } from \"./drizzle-connection-pool\";\n\nexport interface DrizzleConfig {\n db: unknown | (() => unknown | Promise<unknown>);\n provider: \"sqlite\" | \"mysql\" | \"postgresql\";\n}\n\nexport class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {\n #connectionPool: ConnectionPool<DBType>;\n #provider: \"sqlite\" | \"mysql\" | \"postgresql\";\n\n constructor(config: DrizzleConfig) {\n this.#connectionPool = createDrizzleConnectionPool(\n config.db as DBType | (() => DBType | Promise<DBType>),\n );\n this.#provider = config.provider;\n }\n\n get [fragnoDatabaseAdapterNameFakeSymbol](): string {\n return \"drizzle\";\n }\n\n get [fragnoDatabaseAdapterVersionFakeSymbol](): number {\n return 0;\n }\n\n async close(): Promise<void> {\n await this.#connectionPool.close();\n }\n\n get provider(): \"sqlite\" | \"mysql\" | \"postgresql\" {\n return this.#provider;\n }\n\n async isConnectionHealthy(): Promise<boolean> {\n const conn = await this.#connectionPool.connect();\n try {\n const result = await conn.db.execute(sql`SELECT 1 as healthy`);\n\n // Handle different result formats across providers\n // PostgreSQL/MySQL: { rows: [...] }\n // SQLite: array directly or { rows: [...] }\n if (Array.isArray(result)) {\n return result.length > 0 && result[0][\"healthy\"] === 1;\n } else {\n const drizzleResult = result as DrizzleResult;\n return drizzleResult.rows[0][\"healthy\"] === 1;\n }\n } catch {\n return false;\n } finally {\n await conn.release();\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.#connectionPool, this.#provider, 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.#provider),\n path,\n };\n },\n };\n }\n}\n"],"mappings":";;;;;;;;;;AAqBA,IAAa,iBAAb,MAAyE;CACvE;CACA;CAEA,YAAY,QAAuB;AACjC,QAAKA,iBAAkB,4BACrB,OAAO,GACR;AACD,QAAKC,WAAY,OAAO;;CAG1B,KAAK,uCAA+C;AAClD,SAAO;;CAGT,KAAK,0CAAkD;AACrD,SAAO;;CAGT,MAAM,QAAuB;AAC3B,QAAM,MAAKD,eAAgB,OAAO;;CAGpC,IAAI,WAA8C;AAChD,SAAO,MAAKC;;CAGd,MAAM,sBAAwC;EAC5C,MAAM,OAAO,MAAM,MAAKD,eAAgB,SAAS;AACjD,MAAI;GACF,MAAM,SAAS,MAAM,KAAK,GAAG,QAAQ,GAAG,sBAAsB;AAK9D,OAAI,MAAM,QAAQ,OAAO,CACvB,QAAO,OAAO,SAAS,KAAK,OAAO,GAAG,eAAe;OAGrD,QADsB,OACD,KAAK,GAAG,eAAe;UAExC;AACN,UAAO;YACC;AACR,SAAM,KAAK,SAAS;;;CAIxB,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,gBAAiB,MAAKC,UAAW,OAAO;;CAG1E,sBACE,WACA,SACiB;AACjB,SAAO,EACL,iBAAiB,eAAe;GAC9B,MAAM,OAAO,YAAY,QAAQ,SAAS,QAAQ;AAElD,UAAO;IACL,QAAQ,eAAe,WAAW,MAAKA,SAAU;IACjD;IACD;KAEJ"}
1
+ {"version":3,"file":"drizzle-adapter.js","names":["#connectionPool","#provider","#schemaNamespaceMap"],"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\";\nimport {\n fragnoDatabaseAdapterNameFakeSymbol,\n fragnoDatabaseAdapterVersionFakeSymbol,\n} from \"../adapters\";\nimport type { ConnectionPool } from \"../../shared/connection-pool\";\nimport { createDrizzleConnectionPool } from \"./drizzle-connection-pool\";\n\nexport interface DrizzleConfig {\n db: unknown | (() => unknown | Promise<unknown>);\n provider: \"sqlite\" | \"mysql\" | \"postgresql\";\n}\n\nexport class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {\n #connectionPool: ConnectionPool<DBType>;\n #provider: \"sqlite\" | \"mysql\" | \"postgresql\";\n #schemaNamespaceMap = new WeakMap<AnySchema, string>();\n\n constructor(config: DrizzleConfig) {\n this.#connectionPool = createDrizzleConnectionPool(\n config.db as DBType | (() => DBType | Promise<DBType>),\n );\n this.#provider = config.provider;\n }\n\n get [fragnoDatabaseAdapterNameFakeSymbol](): string {\n return \"drizzle\";\n }\n\n get [fragnoDatabaseAdapterVersionFakeSymbol](): number {\n return 0;\n }\n\n async close(): Promise<void> {\n await this.#connectionPool.close();\n }\n\n createTableNameMapper(namespace: string) {\n return createTableNameMapper(namespace);\n }\n\n get provider(): \"sqlite\" | \"mysql\" | \"postgresql\" {\n return this.#provider;\n }\n\n async isConnectionHealthy(): Promise<boolean> {\n const conn = await this.#connectionPool.connect();\n try {\n const result = await conn.db.execute(sql`SELECT 1 as healthy`);\n\n // Handle different result formats across providers\n // PostgreSQL/MySQL: { rows: [...] }\n // SQLite: array directly or { rows: [...] }\n if (Array.isArray(result)) {\n return result.length > 0 && result[0][\"healthy\"] === 1;\n } else {\n const drizzleResult = result as DrizzleResult;\n return drizzleResult.rows[0][\"healthy\"] === 1;\n }\n } catch {\n return false;\n } finally {\n await conn.release();\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 // Register schema-namespace mapping\n this.#schemaNamespaceMap.set(schema, namespace);\n\n // Only create mapper if namespace is non-empty\n const mapper = namespace ? createTableNameMapper(namespace) : undefined;\n return fromDrizzle(\n schema,\n this.#connectionPool,\n this.#provider,\n mapper,\n undefined,\n this.#schemaNamespaceMap,\n );\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.#provider),\n path,\n };\n },\n };\n }\n}\n"],"mappings":";;;;;;;;;;AAqBA,IAAa,iBAAb,MAAyE;CACvE;CACA;CACA,sCAAsB,IAAI,SAA4B;CAEtD,YAAY,QAAuB;AACjC,QAAKA,iBAAkB,4BACrB,OAAO,GACR;AACD,QAAKC,WAAY,OAAO;;CAG1B,KAAK,uCAA+C;AAClD,SAAO;;CAGT,KAAK,0CAAkD;AACrD,SAAO;;CAGT,MAAM,QAAuB;AAC3B,QAAM,MAAKD,eAAgB,OAAO;;CAGpC,sBAAsB,WAAmB;AACvC,SAAO,sBAAsB,UAAU;;CAGzC,IAAI,WAA8C;AAChD,SAAO,MAAKC;;CAGd,MAAM,sBAAwC;EAC5C,MAAM,OAAO,MAAM,MAAKD,eAAgB,SAAS;AACjD,MAAI;GACF,MAAM,SAAS,MAAM,KAAK,GAAG,QAAQ,GAAG,sBAAsB;AAK9D,OAAI,MAAM,QAAQ,OAAO,CACvB,QAAO,OAAO,SAAS,KAAK,OAAO,GAAG,eAAe;OAGrD,QADsB,OACD,KAAK,GAAG,eAAe;UAExC;AACN,UAAO;YACC;AACR,SAAM,KAAK,SAAS;;;CAIxB,MAAM,iBAAiB,WAAgD;AAMrE,UADe,MAHC,sBADI,KAAK,kBAAkB,gBAAgB,UAAU,EAClB,UAAU,CAGhC,IAAI,UAAU,GAC5B;;CAGjB,kBACE,QACA,WAC0C;AAE1C,QAAKE,mBAAoB,IAAI,QAAQ,UAAU;EAG/C,MAAM,SAAS,YAAY,sBAAsB,UAAU,GAAG;AAC9D,SAAO,YACL,QACA,MAAKF,gBACL,MAAKC,UACL,QACA,QACA,MAAKC,mBACN;;CAGH,sBACE,WACA,SACiB;AACjB,SAAO,EACL,iBAAiB,eAAe;GAC9B,MAAM,OAAO,YAAY,QAAQ,SAAS,QAAQ;AAElD,UAAO;IACL,QAAQ,eAAe,WAAW,MAAKD,SAAU;IACjD;IACD;KAEJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-query.d.ts","names":[],"sources":["../../../src/adapters/drizzle/drizzle-query.ts"],"sourcesContent":[],"mappings":";;;;;;;;UAciB,gBAAA;;;;;oBAKG"}
1
+ {"version":3,"file":"drizzle-query.d.ts","names":[],"sources":["../../../src/adapters/drizzle/drizzle-query.ts"],"sourcesContent":[],"mappings":";;;;;;;;UAeiB,gBAAA;;;;;oBAKG"}
@@ -40,6 +40,8 @@ var UpdateManySpecialBuilder = class {
40
40
  * @param pool - Connection pool for acquiring database connections
41
41
  * @param provider - SQL provider (sqlite, mysql, postgresql)
42
42
  * @param mapper - Optional table name mapper for namespace prefixing
43
+ * @param uowConfig - Optional UOW configuration
44
+ * @param schemaNamespaceMap - Optional WeakMap for schema-to-namespace lookups
43
45
  * @returns An AbstractQuery instance for performing database operations
44
46
  *
45
47
  * @example
@@ -50,9 +52,9 @@ var UpdateManySpecialBuilder = class {
50
52
  * const uow = queryEngine.createUnitOfWork('myOperation');
51
53
  * ```
52
54
  */
53
- function fromDrizzle(schema, pool, provider, mapper, uowConfig) {
55
+ function fromDrizzle(schema, pool, provider, mapper, uowConfig, schemaNamespaceMap) {
54
56
  function createUOW(opts) {
55
- const uowCompiler = createDrizzleUOWCompiler(schema, pool, provider, mapper);
57
+ const uowCompiler = createDrizzleUOWCompiler(pool, provider, mapper);
56
58
  const executor = {
57
59
  async executeRetrievalPhase(retrievalBatch) {
58
60
  if (opts.config?.dryRun) return retrievalBatch.map(() => ({
@@ -81,7 +83,7 @@ function fromDrizzle(schema, pool, provider, mapper, uowConfig) {
81
83
  }
82
84
  }
83
85
  };
84
- const decoder = createDrizzleUOWDecoder(schema, provider);
86
+ const decoder = createDrizzleUOWDecoder(provider);
85
87
  const { onQuery,...restUowConfig } = opts.config ?? {};
86
88
  return new UnitOfWork(schema, uowCompiler, executor, decoder, opts.name, {
87
89
  ...restUowConfig,
@@ -89,13 +91,17 @@ function fromDrizzle(schema, pool, provider, mapper, uowConfig) {
89
91
  const actualQuery = query && typeof query === "object" && "query" in query ? query.query : query;
90
92
  opts.config?.onQuery?.(actualQuery);
91
93
  }
92
- });
94
+ }, schemaNamespaceMap);
93
95
  }
94
96
  return {
95
97
  async find(tableName, builderFn) {
96
98
  const [result] = await createUOW({ config: uowConfig }).find(tableName, builderFn).executeRetrieve();
97
99
  return result;
98
100
  },
101
+ async findWithCursor(tableName, builderFn) {
102
+ const [result] = await createUOW({ config: uowConfig }).findWithCursor(tableName, builderFn).executeRetrieve();
103
+ return result;
104
+ },
99
105
  async findFirst(tableName, builderFn) {
100
106
  const uow = createUOW({ config: uowConfig });
101
107
  if (builderFn) uow.find(tableName, (b) => {
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-query.js","names":["#indexName","#condition","#setValues","executor: UOWExecutor<DrizzleCompiledQuery, DrizzleResult>"],"sources":["../../../src/adapters/drizzle/drizzle-query.ts"],"sourcesContent":["import type { AbstractQuery } from \"../../query/query\";\nimport type { AnySchema, AnyTable } from \"../../schema/create\";\nimport type { CompiledMutation, UOWExecutor, ValidIndexName } 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, type DBType } from \"./shared\";\nimport { createDrizzleUOWDecoder } from \"./drizzle-uow-decoder\";\nimport type { ConnectionPool } from \"../../shared/connection-pool\";\nimport type { TableToUpdateValues } from \"../../query/query\";\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 * If true, the query will not be executed and the query will be returned. Not respected for UOWs\n * since those have to be manually executed.\n */\n dryRun?: boolean;\n}\n\n/**\n * Special builder for updateMany operations that captures configuration\n */\nclass UpdateManySpecialBuilder<TTable extends AnyTable> {\n #indexName?: string;\n #condition?: unknown;\n #setValues?: TableToUpdateValues<TTable>;\n\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: unknown,\n ): this {\n this.#indexName = indexName as string;\n this.#condition = condition;\n return this;\n }\n\n set(values: TableToUpdateValues<TTable>): this {\n this.#setValues = values;\n return this;\n }\n\n getConfig() {\n return {\n indexName: this.#indexName,\n condition: this.#condition,\n setValues: this.#setValues,\n };\n }\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 pool - Connection pool for acquiring database connections\n * @param provider - SQL provider (sqlite, mysql, postgresql)\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 pool = createSimpleConnectionPool(drizzle);\n * const queryEngine = fromDrizzle(mySchema, pool, 'postgresql');\n *\n * const uow = queryEngine.createUnitOfWork('myOperation');\n * ```\n */\nexport function fromDrizzle<T extends AnySchema>(\n schema: T,\n pool: ConnectionPool<DBType>,\n provider: \"sqlite\" | \"mysql\" | \"postgresql\",\n mapper?: TableNameMapper,\n uowConfig?: DrizzleUOWConfig,\n): AbstractQuery<T, DrizzleUOWConfig> {\n function createUOW(opts: { name?: string; config?: DrizzleUOWConfig }) {\n const uowCompiler = createDrizzleUOWCompiler(schema, pool, provider, mapper);\n\n const executor: UOWExecutor<DrizzleCompiledQuery, DrizzleResult> = {\n async executeRetrievalPhase(retrievalBatch: DrizzleCompiledQuery[]) {\n // In dryRun mode, skip execution and return empty results\n if (opts.config?.dryRun) {\n return retrievalBatch.map(() => ({\n rows: [],\n affectedRows: 0,\n }));\n }\n\n const conn = await pool.connect();\n try {\n const db = parseDrizzle(conn.db)[0];\n return await executeDrizzleRetrievalPhase(db, retrievalBatch, provider);\n } finally {\n await conn.release();\n }\n },\n async executeMutationPhase(mutationBatch: CompiledMutation<DrizzleCompiledQuery>[]) {\n // In dryRun mode, skip execution and return success with mock internal IDs\n if (opts.config?.dryRun) {\n return {\n success: true,\n createdInternalIds: mutationBatch.map(() => null),\n };\n }\n\n const conn = await pool.connect();\n try {\n const db = parseDrizzle(conn.db)[0];\n return await executeDrizzleMutationPhase(db, mutationBatch, provider);\n } finally {\n await conn.release();\n }\n },\n };\n\n const decoder = createDrizzleUOWDecoder(schema, provider);\n\n const { onQuery, ...restUowConfig } = opts.config ?? {};\n\n return new UnitOfWork(schema, uowCompiler, executor, decoder, opts.name, {\n ...restUowConfig,\n onQuery: (query) => {\n // Handle both CompiledQuery and CompiledMutation structures\n // Retrieval operations return DrizzleCompiledQuery directly: { sql, params }\n // Mutation operations return CompiledMutation: { query: DrizzleCompiledQuery, expectedAffectedRows }\n const actualQuery =\n query && typeof query === \"object\" && \"query\" in query\n ? (query as CompiledMutation<DrizzleCompiledQuery>).query\n : (query as DrizzleCompiledQuery);\n\n opts.config?.onQuery?.(actualQuery);\n },\n });\n }\n\n return {\n async find(tableName, builderFn) {\n // Safe: builderFn returns a FindBuilder (or void), which matches UnitOfWork signature\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const uow = createUOW({ config: uowConfig }).find(tableName, builderFn as any);\n const [result] = await uow.executeRetrieve();\n return result;\n },\n\n async findFirst(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig });\n if (builderFn) {\n uow.find(tableName, (b) => {\n builderFn(b);\n return b.pageSize(1);\n });\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({ config: uowConfig });\n uow.create(tableName, values);\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({ config: uowConfig });\n for (const values of valuesArray) {\n uow.create(tableName, values);\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({ config: uowConfig });\n uow.update(tableName, id, builderFn);\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 const table = schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const specialBuilder = new UpdateManySpecialBuilder<typeof table>();\n builderFn(specialBuilder);\n\n const { indexName, condition, setValues } = specialBuilder.getConfig();\n\n if (!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({ config: uowConfig });\n findUow.find(tableName, (b) => {\n if (condition) {\n // Safe: condition is captured from whereIndex call with proper typing\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return b.whereIndex(indexName as ValidIndexName<typeof table>, condition as any);\n }\n return b.whereIndex(indexName as ValidIndexName<typeof table>);\n });\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const updateUow = createUOW({ config: uowConfig });\n for (const record of records as Array<{ id: unknown }>) {\n updateUow.update(tableName, record.id as string, (b) => b.set(setValues));\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({ config: uowConfig });\n uow.delete(tableName, id, builderFn);\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 const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, builderFn);\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const deleteUow = createUOW({ config: uowConfig });\n for (const record of records as Array<{ id: unknown }>) {\n deleteUow.delete(tableName, 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, nestedUowConfig) {\n return createUOW({\n name,\n config: {\n ...uowConfig,\n ...nestedUowConfig,\n },\n });\n },\n } as AbstractQuery<T, DrizzleUOWConfig>;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"drizzle-query.js","names":["#indexName","#condition","#setValues","executor: UOWExecutor<DrizzleCompiledQuery, DrizzleResult>"],"sources":["../../../src/adapters/drizzle/drizzle-query.ts"],"sourcesContent":["import type { AbstractQuery } from \"../../query/query\";\nimport type { AnySchema, AnyTable } from \"../../schema/create\";\nimport type { CompiledMutation, UOWExecutor, ValidIndexName } 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, type DBType } from \"./shared\";\nimport { createDrizzleUOWDecoder } from \"./drizzle-uow-decoder\";\nimport type { ConnectionPool } from \"../../shared/connection-pool\";\nimport type { TableToUpdateValues } from \"../../query/query\";\nimport type { CursorResult } from \"../../query/cursor\";\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 * If true, the query will not be executed and the query will be returned. Not respected for UOWs\n * since those have to be manually executed.\n */\n dryRun?: boolean;\n}\n\n/**\n * Special builder for updateMany operations that captures configuration\n */\nclass UpdateManySpecialBuilder<TTable extends AnyTable> {\n #indexName?: string;\n #condition?: unknown;\n #setValues?: TableToUpdateValues<TTable>;\n\n whereIndex<TIndexName extends ValidIndexName<TTable>>(\n indexName: TIndexName,\n condition?: unknown,\n ): this {\n this.#indexName = indexName as string;\n this.#condition = condition;\n return this;\n }\n\n set(values: TableToUpdateValues<TTable>): this {\n this.#setValues = values;\n return this;\n }\n\n getConfig() {\n return {\n indexName: this.#indexName,\n condition: this.#condition,\n setValues: this.#setValues,\n };\n }\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 pool - Connection pool for acquiring database connections\n * @param provider - SQL provider (sqlite, mysql, postgresql)\n * @param mapper - Optional table name mapper for namespace prefixing\n * @param uowConfig - Optional UOW configuration\n * @param schemaNamespaceMap - Optional WeakMap for schema-to-namespace lookups\n * @returns An AbstractQuery instance for performing database operations\n *\n * @example\n * ```ts\n * const pool = createSimpleConnectionPool(drizzle);\n * const queryEngine = fromDrizzle(mySchema, pool, 'postgresql');\n *\n * const uow = queryEngine.createUnitOfWork('myOperation');\n * ```\n */\nexport function fromDrizzle<T extends AnySchema>(\n schema: T,\n pool: ConnectionPool<DBType>,\n provider: \"sqlite\" | \"mysql\" | \"postgresql\",\n mapper?: TableNameMapper,\n uowConfig?: DrizzleUOWConfig,\n schemaNamespaceMap?: WeakMap<AnySchema, string>,\n): AbstractQuery<T, DrizzleUOWConfig> {\n function createUOW(opts: { name?: string; config?: DrizzleUOWConfig }) {\n const uowCompiler = createDrizzleUOWCompiler(pool, provider, mapper);\n\n const executor: UOWExecutor<DrizzleCompiledQuery, DrizzleResult> = {\n async executeRetrievalPhase(retrievalBatch: DrizzleCompiledQuery[]) {\n // In dryRun mode, skip execution and return empty results\n if (opts.config?.dryRun) {\n return retrievalBatch.map(() => ({\n rows: [],\n affectedRows: 0,\n }));\n }\n\n const conn = await pool.connect();\n try {\n const db = parseDrizzle(conn.db)[0];\n return await executeDrizzleRetrievalPhase(db, retrievalBatch, provider);\n } finally {\n await conn.release();\n }\n },\n async executeMutationPhase(mutationBatch: CompiledMutation<DrizzleCompiledQuery>[]) {\n // In dryRun mode, skip execution and return success with mock internal IDs\n if (opts.config?.dryRun) {\n return {\n success: true,\n createdInternalIds: mutationBatch.map(() => null),\n };\n }\n\n const conn = await pool.connect();\n try {\n const db = parseDrizzle(conn.db)[0];\n return await executeDrizzleMutationPhase(db, mutationBatch, provider);\n } finally {\n await conn.release();\n }\n },\n };\n\n const decoder = createDrizzleUOWDecoder(provider);\n\n const { onQuery, ...restUowConfig } = opts.config ?? {};\n\n return new UnitOfWork(\n schema,\n uowCompiler,\n executor,\n decoder,\n opts.name,\n {\n ...restUowConfig,\n onQuery: (query) => {\n // Handle both CompiledQuery and CompiledMutation structures\n // Retrieval operations return DrizzleCompiledQuery directly: { sql, params }\n // Mutation operations return CompiledMutation: { query: DrizzleCompiledQuery, expectedAffectedRows }\n const actualQuery =\n query && typeof query === \"object\" && \"query\" in query\n ? (query as CompiledMutation<DrizzleCompiledQuery>).query\n : (query as DrizzleCompiledQuery);\n\n opts.config?.onQuery?.(actualQuery);\n },\n },\n schemaNamespaceMap,\n );\n }\n\n return {\n async find(tableName, builderFn) {\n // Safe: builderFn returns a FindBuilder (or void), which matches UnitOfWork signature\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const uow = createUOW({ config: uowConfig }).find(tableName, builderFn as any);\n const [result] = await uow.executeRetrieve();\n return result;\n },\n\n async findWithCursor(tableName, builderFn) {\n // Safe: builderFn returns a FindBuilder, which matches UnitOfWork signature\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const uow = createUOW({ config: uowConfig }).findWithCursor(tableName, builderFn as any);\n const [result] = await uow.executeRetrieve();\n return result as CursorResult<unknown>;\n },\n\n async findFirst(tableName, builderFn) {\n const uow = createUOW({ config: uowConfig });\n if (builderFn) {\n uow.find(tableName, (b) => {\n builderFn(b);\n return b.pageSize(1);\n });\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({ config: uowConfig });\n uow.create(tableName, values);\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({ config: uowConfig });\n for (const values of valuesArray) {\n uow.create(tableName, values);\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({ config: uowConfig });\n uow.update(tableName, id, builderFn);\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 const table = schema.tables[tableName];\n if (!table) {\n throw new Error(`Table ${tableName} not found in schema`);\n }\n\n const specialBuilder = new UpdateManySpecialBuilder<typeof table>();\n builderFn(specialBuilder);\n\n const { indexName, condition, setValues } = specialBuilder.getConfig();\n\n if (!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({ config: uowConfig });\n findUow.find(tableName, (b) => {\n if (condition) {\n // Safe: condition is captured from whereIndex call with proper typing\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return b.whereIndex(indexName as ValidIndexName<typeof table>, condition as any);\n }\n return b.whereIndex(indexName as ValidIndexName<typeof table>);\n });\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const updateUow = createUOW({ config: uowConfig });\n for (const record of records as Array<{ id: unknown }>) {\n updateUow.update(tableName, record.id as string, (b) => b.set(setValues));\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({ config: uowConfig });\n uow.delete(tableName, id, builderFn);\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 const findUow = createUOW({ config: uowConfig });\n findUow.find(tableName, builderFn);\n const [records]: unknown[][] = await findUow.executeRetrieve();\n\n if (!records || records.length === 0) {\n return;\n }\n\n const deleteUow = createUOW({ config: uowConfig });\n for (const record of records as Array<{ id: unknown }>) {\n deleteUow.delete(tableName, 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, nestedUowConfig) {\n return createUOW({\n name,\n config: {\n ...uowConfig,\n ...nestedUowConfig,\n },\n });\n },\n } as AbstractQuery<T, DrizzleUOWConfig>;\n}\n"],"mappings":"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"}
@@ -1,7 +1,6 @@
1
1
  import "./shared.js";
2
2
 
3
3
  //#region src/adapters/drizzle/drizzle-uow-compiler.d.ts
4
-
5
4
  type DrizzleCompiledQuery = {
6
5
  sql: string;
7
6
  params: unknown[];
@@ -1 +1 @@
1
- {"version":3,"file":"drizzle-uow-compiler.d.ts","names":[],"sources":["../../../src/adapters/drizzle/drizzle-uow-compiler.ts"],"sourcesContent":[],"mappings":";;;;KAwBY,oBAAA"}
1
+ {"version":3,"file":"drizzle-uow-compiler.d.ts","names":[],"sources":["../../../src/adapters/drizzle/drizzle-uow-compiler.ts"],"sourcesContent":[],"mappings":";;;AAyBY,KAAA,oBAAA,GAAoB"}