@fragno-dev/db 0.0.1 → 0.1.0

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 (200) hide show
  1. package/.turbo/turbo-build.log +137 -13
  2. package/.turbo/turbo-test.log +36 -0
  3. package/CHANGELOG.md +7 -0
  4. package/dist/adapters/adapters.d.ts +18 -0
  5. package/dist/adapters/adapters.d.ts.map +1 -0
  6. package/dist/adapters/drizzle/drizzle-adapter.d.ts +21 -0
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -0
  8. package/dist/adapters/drizzle/drizzle-adapter.js +62 -0
  9. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -0
  10. package/dist/adapters/drizzle/drizzle-query.d.ts +17 -0
  11. package/dist/adapters/drizzle/drizzle-query.d.ts.map +1 -0
  12. package/dist/adapters/drizzle/drizzle-query.js +139 -0
  13. package/dist/adapters/drizzle/drizzle-query.js.map +1 -0
  14. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +9 -0
  15. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +1 -0
  16. package/dist/adapters/drizzle/drizzle-uow-compiler.js +300 -0
  17. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +1 -0
  18. package/dist/adapters/drizzle/drizzle-uow-decoder.js +82 -0
  19. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +1 -0
  20. package/dist/adapters/drizzle/drizzle-uow-executor.js +125 -0
  21. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +1 -0
  22. package/dist/adapters/drizzle/generate.js +273 -0
  23. package/dist/adapters/drizzle/generate.js.map +1 -0
  24. package/dist/adapters/drizzle/join-column-utils.js +28 -0
  25. package/dist/adapters/drizzle/join-column-utils.js.map +1 -0
  26. package/dist/adapters/drizzle/shared.js +11 -0
  27. package/dist/adapters/drizzle/shared.js.map +1 -0
  28. package/dist/adapters/kysely/kysely-adapter.d.ts +23 -0
  29. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -0
  30. package/dist/adapters/kysely/kysely-adapter.js +119 -0
  31. package/dist/adapters/kysely/kysely-adapter.js.map +1 -0
  32. package/dist/adapters/kysely/kysely-query-builder.js +306 -0
  33. package/dist/adapters/kysely/kysely-query-builder.js.map +1 -0
  34. package/dist/adapters/kysely/kysely-query-compiler.js +67 -0
  35. package/dist/adapters/kysely/kysely-query-compiler.js.map +1 -0
  36. package/dist/adapters/kysely/kysely-query.js +158 -0
  37. package/dist/adapters/kysely/kysely-query.js.map +1 -0
  38. package/dist/adapters/kysely/kysely-uow-compiler.js +139 -0
  39. package/dist/adapters/kysely/kysely-uow-compiler.js.map +1 -0
  40. package/dist/adapters/kysely/kysely-uow-executor.js +89 -0
  41. package/dist/adapters/kysely/kysely-uow-executor.js.map +1 -0
  42. package/dist/adapters/kysely/migration/execute.js +176 -0
  43. package/dist/adapters/kysely/migration/execute.js.map +1 -0
  44. package/dist/fragment.d.ts +54 -0
  45. package/dist/fragment.d.ts.map +1 -0
  46. package/dist/fragment.js +92 -0
  47. package/dist/fragment.js.map +1 -0
  48. package/dist/id.d.ts +2 -0
  49. package/dist/migration-engine/auto-from-schema.js +116 -0
  50. package/dist/migration-engine/auto-from-schema.js.map +1 -0
  51. package/dist/migration-engine/create.d.ts +41 -0
  52. package/dist/migration-engine/create.d.ts.map +1 -0
  53. package/dist/migration-engine/create.js +58 -0
  54. package/dist/migration-engine/create.js.map +1 -0
  55. package/dist/migration-engine/shared.d.ts +90 -0
  56. package/dist/migration-engine/shared.d.ts.map +1 -0
  57. package/dist/migration-engine/shared.js +8 -0
  58. package/dist/migration-engine/shared.js.map +1 -0
  59. package/dist/mod.d.ts +55 -2
  60. package/dist/mod.d.ts.map +1 -1
  61. package/dist/mod.js +111 -2
  62. package/dist/mod.js.map +1 -1
  63. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column-builder.js +108 -0
  64. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column-builder.js.map +1 -0
  65. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column.js +55 -0
  66. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/column.js.map +1 -0
  67. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/entity.js +18 -0
  68. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/entity.js.map +1 -0
  69. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/common.js +183 -0
  70. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/common.js.map +1 -0
  71. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/enum.js +58 -0
  72. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/columns/enum.js.map +1 -0
  73. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/foreign-keys.js +68 -0
  74. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/foreign-keys.js.map +1 -0
  75. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/unique-constraint.js +56 -0
  76. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/unique-constraint.js.map +1 -0
  77. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/utils/array.js +65 -0
  78. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/pg-core/utils/array.js.map +1 -0
  79. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/conditions.js +81 -0
  80. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/conditions.js.map +1 -0
  81. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/select.js +13 -0
  82. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/expressions/select.js.map +1 -0
  83. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/functions/aggregate.js +10 -0
  84. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/functions/aggregate.js.map +1 -0
  85. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/sql.js +372 -0
  86. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/sql/sql.js.map +1 -0
  87. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/subquery.js +23 -0
  88. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/subquery.js.map +1 -0
  89. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.js +62 -0
  90. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.js.map +1 -0
  91. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.utils.js +6 -0
  92. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/table.utils.js.map +1 -0
  93. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing-utils.js +8 -0
  94. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing-utils.js.map +1 -0
  95. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing.js +8 -0
  96. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/tracing.js.map +1 -0
  97. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/view-common.js +6 -0
  98. package/dist/node_modules/.bun/drizzle-orm@0.44.6_4fae081eecb963e2/node_modules/drizzle-orm/view-common.js.map +1 -0
  99. package/dist/query/condition-builder.d.ts +41 -0
  100. package/dist/query/condition-builder.d.ts.map +1 -0
  101. package/dist/query/condition-builder.js +93 -0
  102. package/dist/query/condition-builder.js.map +1 -0
  103. package/dist/query/cursor.d.ts +88 -0
  104. package/dist/query/cursor.d.ts.map +1 -0
  105. package/dist/query/cursor.js +103 -0
  106. package/dist/query/cursor.js.map +1 -0
  107. package/dist/query/orm/orm.d.ts +18 -0
  108. package/dist/query/orm/orm.d.ts.map +1 -0
  109. package/dist/query/orm/orm.js +48 -0
  110. package/dist/query/orm/orm.js.map +1 -0
  111. package/dist/query/query.d.ts +79 -0
  112. package/dist/query/query.d.ts.map +1 -0
  113. package/dist/query/query.js +1 -0
  114. package/dist/query/result-transform.js +155 -0
  115. package/dist/query/result-transform.js.map +1 -0
  116. package/dist/query/unit-of-work.d.ts +435 -0
  117. package/dist/query/unit-of-work.d.ts.map +1 -0
  118. package/dist/query/unit-of-work.js +549 -0
  119. package/dist/query/unit-of-work.js.map +1 -0
  120. package/dist/schema/create.d.ts +273 -116
  121. package/dist/schema/create.d.ts.map +1 -1
  122. package/dist/schema/create.js +410 -222
  123. package/dist/schema/create.js.map +1 -1
  124. package/dist/schema/serialize.js +101 -0
  125. package/dist/schema/serialize.js.map +1 -0
  126. package/dist/schema-generator/schema-generator.d.ts +15 -0
  127. package/dist/schema-generator/schema-generator.d.ts.map +1 -0
  128. package/dist/shared/providers.d.ts +6 -0
  129. package/dist/shared/providers.d.ts.map +1 -0
  130. package/dist/util/import-generator.js +26 -0
  131. package/dist/util/import-generator.js.map +1 -0
  132. package/dist/util/parse.js +15 -0
  133. package/dist/util/parse.js.map +1 -0
  134. package/dist/util/types.d.ts +8 -0
  135. package/dist/util/types.d.ts.map +1 -0
  136. package/package.json +63 -2
  137. package/src/adapters/adapters.ts +22 -0
  138. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +433 -0
  139. package/src/adapters/drizzle/drizzle-adapter.test.ts +122 -0
  140. package/src/adapters/drizzle/drizzle-adapter.ts +118 -0
  141. package/src/adapters/drizzle/drizzle-query.ts +234 -0
  142. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +1084 -0
  143. package/src/adapters/drizzle/drizzle-uow-compiler.ts +546 -0
  144. package/src/adapters/drizzle/drizzle-uow-decoder.ts +165 -0
  145. package/src/adapters/drizzle/drizzle-uow-executor.ts +213 -0
  146. package/src/adapters/drizzle/generate.test.ts +643 -0
  147. package/src/adapters/drizzle/generate.ts +481 -0
  148. package/src/adapters/drizzle/join-column-utils.test.ts +79 -0
  149. package/src/adapters/drizzle/join-column-utils.ts +39 -0
  150. package/src/adapters/drizzle/migrate-drizzle.test.ts +226 -0
  151. package/src/adapters/drizzle/shared.ts +22 -0
  152. package/src/adapters/drizzle/test-utils.ts +56 -0
  153. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +789 -0
  154. package/src/adapters/kysely/kysely-adapter.ts +196 -0
  155. package/src/adapters/kysely/kysely-query-builder.test.ts +1344 -0
  156. package/src/adapters/kysely/kysely-query-builder.ts +611 -0
  157. package/src/adapters/kysely/kysely-query-compiler.ts +124 -0
  158. package/src/adapters/kysely/kysely-query.ts +254 -0
  159. package/src/adapters/kysely/kysely-uow-compiler.test.ts +916 -0
  160. package/src/adapters/kysely/kysely-uow-compiler.ts +271 -0
  161. package/src/adapters/kysely/kysely-uow-executor.ts +149 -0
  162. package/src/adapters/kysely/kysely-uow-joins.test.ts +811 -0
  163. package/src/adapters/kysely/migration/execute-mysql.test.ts +1173 -0
  164. package/src/adapters/kysely/migration/execute-postgres.test.ts +2657 -0
  165. package/src/adapters/kysely/migration/execute.ts +382 -0
  166. package/src/adapters/kysely/migration/kysely-migrator.test.ts +197 -0
  167. package/src/fragment.test.ts +287 -0
  168. package/src/fragment.ts +198 -0
  169. package/src/migration-engine/auto-from-schema.test.ts +118 -58
  170. package/src/migration-engine/auto-from-schema.ts +103 -32
  171. package/src/migration-engine/create.test.ts +34 -46
  172. package/src/migration-engine/create.ts +41 -26
  173. package/src/migration-engine/shared.ts +26 -6
  174. package/src/mod.ts +197 -1
  175. package/src/query/condition-builder.test.ts +379 -0
  176. package/src/query/condition-builder.ts +294 -0
  177. package/src/query/cursor.test.ts +296 -0
  178. package/src/query/cursor.ts +147 -0
  179. package/src/query/orm/orm.ts +92 -0
  180. package/src/query/query-type.test.ts +429 -0
  181. package/src/query/query.ts +200 -0
  182. package/src/query/result-transform.test.ts +795 -0
  183. package/src/query/result-transform.ts +247 -0
  184. package/src/query/unit-of-work-types.test.ts +192 -0
  185. package/src/query/unit-of-work.test.ts +947 -0
  186. package/src/query/unit-of-work.ts +1199 -0
  187. package/src/schema/create.test.ts +653 -110
  188. package/src/schema/create.ts +708 -337
  189. package/src/schema/serialize.test.ts +559 -0
  190. package/src/schema/serialize.ts +359 -0
  191. package/src/schema-generator/schema-generator.ts +12 -0
  192. package/src/shared/config.ts +0 -8
  193. package/src/util/import-generator.ts +28 -0
  194. package/src/util/parse.ts +16 -0
  195. package/src/util/types.ts +4 -0
  196. package/tsconfig.json +1 -1
  197. package/tsdown.config.ts +11 -1
  198. package/vitest.config.ts +3 -0
  199. /package/dist/{cuid.js → id.js} +0 -0
  200. /package/src/{cuid.ts → id.ts} +0 -0
@@ -0,0 +1,359 @@
1
+ import type { SQLProvider } from "../shared/providers";
2
+ import type { AnyColumn } from "./create";
3
+ import { FragnoId, FragnoReference } from "./create";
4
+
5
+ export interface AdditionalColumnMetadata {
6
+ length?: number;
7
+ precision?: number;
8
+ scale?: number;
9
+ }
10
+
11
+ /**
12
+ * Get the possible column types that the raw DB type can map to.
13
+ */
14
+ export function dbToSchemaType(
15
+ dbType: string,
16
+ provider: SQLProvider,
17
+ additional: AdditionalColumnMetadata,
18
+ ): (AnyColumn["type"] | "varchar(n)")[] {
19
+ dbType = dbType.toLowerCase();
20
+ if (provider === "sqlite") {
21
+ switch (dbType) {
22
+ case "integer":
23
+ return ["bool", "date", "timestamp", "bigint", "integer"];
24
+ case "text":
25
+ return ["json", "string", "bigint", "varchar(n)"];
26
+ case "real":
27
+ case "numeric":
28
+ return ["decimal"];
29
+ case "blob":
30
+ return ["bigint", "binary"];
31
+ default:
32
+ return [dbType as AnyColumn["type"]];
33
+ }
34
+ }
35
+
36
+ if (provider === "postgresql" || provider === "cockroachdb") {
37
+ switch (dbType) {
38
+ case "decimal":
39
+ case "real":
40
+ case "numeric":
41
+ case "double precision":
42
+ return ["decimal"];
43
+ case "timestamp":
44
+ case "timestamptz":
45
+ return ["timestamp"];
46
+ case "varchar": {
47
+ const len = additional.length;
48
+ if (len != null) {
49
+ return [`varchar(${len})`];
50
+ }
51
+ return ["string"];
52
+ }
53
+ case "text":
54
+ return ["string"];
55
+ case "boolean":
56
+ case "bool":
57
+ return ["bool"];
58
+ case "bytea":
59
+ return ["binary"];
60
+ default:
61
+ return [dbType as AnyColumn["type"]];
62
+ }
63
+ }
64
+
65
+ if (provider === "mysql") {
66
+ switch (dbType) {
67
+ case "bool":
68
+ case "boolean":
69
+ return ["bool"];
70
+ case "integer":
71
+ case "int":
72
+ return ["integer"];
73
+ case "decimal":
74
+ case "numeric":
75
+ case "float":
76
+ case "double":
77
+ return ["decimal"];
78
+ case "datetime":
79
+ return ["timestamp"];
80
+ case "varchar": {
81
+ const len = additional.length;
82
+ if (len != null) {
83
+ return [`varchar(${len})`];
84
+ }
85
+ return ["string"];
86
+ }
87
+ case "text":
88
+ return ["string"];
89
+ case "longblob":
90
+ case "blob":
91
+ case "mediumblob":
92
+ case "tinyblob":
93
+ return ["binary"];
94
+ default:
95
+ return [dbType as AnyColumn["type"]];
96
+ }
97
+ }
98
+
99
+ if (provider === "mssql") {
100
+ switch (dbType) {
101
+ case "int":
102
+ return ["integer"];
103
+ case "decimal":
104
+ case "float":
105
+ case "real":
106
+ case "numeric":
107
+ return ["decimal"];
108
+ case "bit":
109
+ return ["bool"];
110
+ case "datetime":
111
+ case "datetime2":
112
+ return ["timestamp"];
113
+ case "nvarchar":
114
+ case "varchar": {
115
+ const len = additional.length;
116
+ if (len != null) {
117
+ return [`varchar(${len})`];
118
+ }
119
+ return ["string", "json"];
120
+ }
121
+ case "ntext":
122
+ case "text":
123
+ case "varchar(max)":
124
+ case "nvarchar(max)":
125
+ return ["string", "json"];
126
+ case "binary":
127
+ case "varbinary":
128
+ return ["binary"];
129
+ default:
130
+ return [dbType as AnyColumn["type"]];
131
+ }
132
+ }
133
+
134
+ throw new Error(`unhandled database provider: ${provider}`);
135
+ }
136
+
137
+ /**
138
+ * Database type literals that can be returned by schemaToDBType
139
+ */
140
+ export type DBTypeLiteral =
141
+ // PostgreSQL/CockroachDB types
142
+ | "bigserial"
143
+ | "serial"
144
+ | "boolean"
145
+ | "bool"
146
+ | "json"
147
+ | "text"
148
+ | "bytea"
149
+ | "timestamp"
150
+ | "timestamptz"
151
+ | "bigint"
152
+ | "integer"
153
+ | "decimal"
154
+ | "date"
155
+ // MySQL types
156
+ | "longblob"
157
+ | "datetime"
158
+ // SQLite types
159
+ | "blob"
160
+ | "real"
161
+ // MSSQL types
162
+ | "bit"
163
+ | "int"
164
+ | "varbinary(max)"
165
+ | "varchar(max)"
166
+ // varchar with length parameter
167
+ | `varchar(${number})`;
168
+
169
+ export function schemaToDBType(
170
+ column: AnyColumn | Pick<AnyColumn, "type">,
171
+ provider: SQLProvider,
172
+ ): DBTypeLiteral {
173
+ const { type } = column;
174
+
175
+ // Handle internal ID columns with auto-increment
176
+ if ("role" in column && column.role === "internal-id") {
177
+ if (provider === "postgresql" || provider === "cockroachdb") {
178
+ return "bigserial";
179
+ }
180
+ if (provider === "mysql") {
181
+ return "bigint";
182
+ }
183
+ if (provider === "sqlite") {
184
+ return "integer"; // SQLite uses INTEGER for auto-increment
185
+ }
186
+ if (provider === "mssql") {
187
+ return "bigint";
188
+ }
189
+ }
190
+
191
+ if (provider === "sqlite") {
192
+ switch (type) {
193
+ case "integer":
194
+ case "timestamp":
195
+ case "date":
196
+ case "bool":
197
+ return "integer";
198
+ case "binary":
199
+ case "bigint":
200
+ return "blob";
201
+ case "json":
202
+ case "string":
203
+ return "text";
204
+ case "decimal":
205
+ return "real";
206
+ default:
207
+ // sqlite doesn't support varchar
208
+ if (type.startsWith("varchar")) return "text";
209
+ }
210
+ }
211
+
212
+ if (provider === "mssql") {
213
+ switch (type) {
214
+ case "bool":
215
+ return "bit";
216
+ case "timestamp":
217
+ return "datetime";
218
+ case "integer":
219
+ return "int";
220
+ case "string":
221
+ return "varchar(max)";
222
+ case "binary":
223
+ return "varbinary(max)";
224
+ // only 2025 preview supports JSON natively
225
+ case "json":
226
+ return "varchar(max)";
227
+ default:
228
+ if (type.startsWith("varchar")) return type as `varchar(${number})`;
229
+ return type;
230
+ }
231
+ }
232
+
233
+ if (provider === "postgresql" || provider === "cockroachdb") {
234
+ switch (type) {
235
+ case "bool":
236
+ return "boolean";
237
+ case "json":
238
+ return "json";
239
+ case "string":
240
+ return "text";
241
+ case "binary":
242
+ return "bytea";
243
+ default:
244
+ if (type.startsWith("varchar")) return type as `varchar(${number})`;
245
+ return type;
246
+ }
247
+ }
248
+
249
+ if (provider === "mysql") {
250
+ switch (type) {
251
+ case "bool":
252
+ return "boolean";
253
+ case "string":
254
+ return "text";
255
+ case "binary":
256
+ return "longblob";
257
+ default:
258
+ if (type.startsWith("varchar")) return type as `varchar(${number})`;
259
+ return type;
260
+ }
261
+ }
262
+
263
+ throw new Error(`cannot handle ${provider} ${type}`);
264
+ }
265
+
266
+ const supportJson: SQLProvider[] = ["postgresql", "cockroachdb", "mysql"];
267
+
268
+ /**
269
+ * Parse from driver value
270
+ */
271
+ export function deserialize(value: unknown, col: AnyColumn, provider: SQLProvider) {
272
+ if (value === null) return null;
273
+
274
+ if (!supportJson.includes(provider) && col.type === "json" && typeof value === "string") {
275
+ return JSON.parse(value);
276
+ }
277
+
278
+ if (
279
+ provider === "sqlite" &&
280
+ (col.type === "timestamp" || col.type === "date") &&
281
+ (typeof value === "number" || typeof value === "string")
282
+ ) {
283
+ return new Date(value);
284
+ }
285
+
286
+ if (col.type === "bool" && typeof value === "number") return value === 1;
287
+
288
+ if (col.type === "bigint" && value instanceof Buffer) {
289
+ return value.readBigInt64BE(0);
290
+ }
291
+
292
+ if (col.type === "bigint" && typeof value === "string") {
293
+ return BigInt(value);
294
+ }
295
+
296
+ if (col.type === "binary" && value instanceof Buffer) {
297
+ return new Uint8Array(value.buffer, value.byteOffset, value.byteLength);
298
+ }
299
+
300
+ return value;
301
+ }
302
+
303
+ /**
304
+ * Encode to driver value
305
+ */
306
+ export function serialize(value: unknown, col: AnyColumn, provider: SQLProvider) {
307
+ if (value === null) {
308
+ return null;
309
+ }
310
+
311
+ // Handle FragnoReference objects (for reference columns)
312
+ if (value instanceof FragnoReference) {
313
+ return value.internalId;
314
+ }
315
+
316
+ // Handle FragnoId objects
317
+ if (value instanceof FragnoId) {
318
+ // For external ID columns, use the external ID
319
+ if (col.role === "external-id") {
320
+ return value.externalId;
321
+ }
322
+ // For internal ID columns, use the internal ID (must be present)
323
+ if (col.role === "internal-id") {
324
+ if (!value.internalId) {
325
+ throw new Error(`FragnoId must have internalId for internal-id column ${col.name}`);
326
+ }
327
+ return value.internalId;
328
+ }
329
+ // For reference columns, prefer internal ID if available
330
+ if (col.role === "reference") {
331
+ return value.databaseId;
332
+ }
333
+ // Default to external ID for other columns
334
+ return value.externalId;
335
+ }
336
+
337
+ if (!supportJson.includes(provider) && col.type === "json") {
338
+ return JSON.stringify(value);
339
+ }
340
+
341
+ if (provider === "sqlite" && value instanceof Date) {
342
+ return value.getTime();
343
+ }
344
+
345
+ if (provider === "sqlite" && typeof value === "boolean") return value ? 1 : 0;
346
+
347
+ if (provider === "sqlite" && typeof value === "bigint") {
348
+ const buf = Buffer.alloc(8);
349
+ buf.writeBigInt64BE(value);
350
+ return buf;
351
+ }
352
+
353
+ // most drivers accept Buffer
354
+ if (col.type === "binary" && value instanceof Uint8Array) {
355
+ return Buffer.from(value);
356
+ }
357
+
358
+ return value;
359
+ }
@@ -0,0 +1,12 @@
1
+ export interface GenerateSchemaOptions {
2
+ path: string;
3
+ toVersion?: number;
4
+ fromVersion?: number;
5
+ }
6
+
7
+ export interface SchemaGenerator {
8
+ generateSchema: (options?: GenerateSchemaOptions) => {
9
+ schema: string;
10
+ path: string;
11
+ };
12
+ }
@@ -1,5 +1,3 @@
1
- import type { Kysely } from "kysely";
2
- import type { SQLProvider } from "./providers";
3
1
  import type { AnySchema } from "../schema/create";
4
2
 
5
3
  export interface LibraryConfig<TSchemas extends AnySchema[] = AnySchema[]> {
@@ -10,9 +8,3 @@ export interface LibraryConfig<TSchemas extends AnySchema[] = AnySchema[]> {
10
8
  */
11
9
  schemas: TSchemas;
12
10
  }
13
-
14
- export interface KyselyConfig {
15
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
- db: Kysely<any>;
17
- provider: SQLProvider;
18
- }
@@ -0,0 +1,28 @@
1
+ export function importGenerator() {
2
+ const names = new Set<string>();
3
+ // specifier -> import name
4
+ const map = new Map<string, string[]>();
5
+
6
+ return {
7
+ addImport(name: string, specifier: string) {
8
+ if (names.has(name)) {
9
+ return;
10
+ }
11
+
12
+ names.add(name);
13
+ const list = map.get(specifier) ?? [];
14
+ list.push(name);
15
+ map.set(specifier, list);
16
+ },
17
+ format(): string {
18
+ const v: string[] = [];
19
+ for (const [specifier, names] of map) {
20
+ if (names.length === 0) continue;
21
+
22
+ v.push(`import { ${names.join(", ")} } from "${specifier}"`);
23
+ }
24
+
25
+ return v.join("\n");
26
+ },
27
+ };
28
+ }
@@ -0,0 +1,16 @@
1
+ const RegexVarchar = /^varchar\((\d+)\)$/;
2
+
3
+ export function parseVarchar(template: string): number {
4
+ const match = RegexVarchar.exec(template);
5
+ if (!match) throw new Error("Failed to match varchar(n)");
6
+ return Number(match[1]);
7
+ }
8
+
9
+ export function ident(s: string, identation = 2): string {
10
+ const tab = " ".repeat(identation);
11
+
12
+ return s
13
+ .split("\n")
14
+ .map((v) => tab + v)
15
+ .join("\n");
16
+ }
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Forces TypeScript to simplify/flatten complex intersection types for better display in IDE hovers
3
+ */
4
+ export type Prettify<T> = { [K in keyof T]: T[K] } & {};
package/tsconfig.json CHANGED
@@ -6,5 +6,5 @@
6
6
  "composite": true
7
7
  },
8
8
  "include": ["src"],
9
- "exclude": ["node_modules", "dist"]
9
+ "exclude": ["node_modules", "dist", "**/_generated"]
10
10
  }
package/tsdown.config.ts CHANGED
@@ -1,7 +1,17 @@
1
1
  import { defineConfig } from "tsdown";
2
2
 
3
3
  export default defineConfig({
4
- entry: ["./src/mod.ts", "./src/schema/create.ts"],
4
+ entry: [
5
+ "./src/mod.ts",
6
+ "./src/id.ts",
7
+ "./src/schema/create.ts",
8
+ "./src/query/query.ts",
9
+ "./src/adapters/kysely/kysely-adapter.ts",
10
+ "./src/adapters/drizzle/drizzle-adapter.ts",
11
+ "./src/query/unit-of-work.ts",
12
+ "./src/query/cursor.ts",
13
+ "./src/fragment.ts",
14
+ ],
5
15
  dts: true,
6
16
  unbundle: true,
7
17
  });
package/vitest.config.ts CHANGED
@@ -1,7 +1,10 @@
1
1
  import { defineConfig } from "vitest/config";
2
+ import { baseConfig } from "@fragno-private/vitest-config";
2
3
 
3
4
  export default defineConfig({
5
+ ...baseConfig,
4
6
  test: {
7
+ ...baseConfig.test,
5
8
  environment: "node",
6
9
  },
7
10
  });
File without changes
File without changes