@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,79 @@
1
+ import { AnySchema, AnyTable, FragnoId, IdColumn, Relation } from "../schema/create.js";
2
+ import { Condition, ConditionBuilder } from "./condition-builder.js";
3
+ import { DeleteBuilder, FindBuilder, UnitOfWork, UpdateBuilder, UpdateManyBuilder } from "./unit-of-work.js";
4
+ import { Prettify } from "../util/types.js";
5
+
6
+ //#region src/query/query.d.ts
7
+ type AnySelectClause = SelectClause<AnyTable>;
8
+ type SelectClause<T extends AnyTable> = true | (keyof T["columns"])[];
9
+ type RawColumnValues<T extends AnyTable> = { [K in keyof T["columns"] as string extends K ? never : K]: T["columns"][K]["$out"] };
10
+ type TableToColumnValues<T extends AnyTable> = RawColumnValues<T>;
11
+ type PickNullable<T> = { [P in keyof T as null extends T[P] ? P : never]: T[P] };
12
+ type PickNotNullable<T> = { [P in keyof T as null extends T[P] ? never : P]: T[P] };
13
+ type RawInsertValues<T extends AnyTable> = { [K in keyof T["columns"] as string extends K ? never : K]: T["columns"][K]["$in"] };
14
+ type TableToInsertValues<T extends AnyTable> = Prettify<Partial<PickNullable<RawInsertValues<T>>> & PickNotNullable<RawInsertValues<T>>>;
15
+ type TableToUpdateValues<T extends AnyTable> = { [K in keyof T["columns"] as string extends K ? never : K]?: T["columns"][K] extends IdColumn ? never : T["columns"][K]["$in"] };
16
+ type MainSelectResult<S extends SelectClause<T>, T extends AnyTable> = S extends true ? TableToColumnValues<T> : S extends (keyof T["columns"])[] ? { [K in S[number] as string extends K ? never : K]: K extends keyof T["columns"] ? T["columns"][K]["$out"] : never } : never;
17
+ type SelectResult<T extends AnyTable, JoinOut$1, Select$1 extends SelectClause<T>> = MainSelectResult<Select$1, T> & JoinOut$1;
18
+ interface MapRelationType<Type$1> {
19
+ one: Type$1 | null;
20
+ many: Type$1[];
21
+ }
22
+ type JoinBuilder<T extends AnyTable, Out = {}> = { [K in keyof T["relations"]]: T["relations"][K] extends Relation<infer Type, infer Target> ? <Select extends SelectClause<Target> = true, JoinOut = {}>(options?: FindManyOptions<Target, Select, JoinOut, false>) => JoinBuilder<T, Out & { [$K in K]: MapRelationType<SelectResult<Target, JoinOut, Select>>[Type] }> : never };
23
+ type OrderBy<Column = string> = [columnName: Column, "asc" | "desc"];
24
+ type FindFirstOptions<T extends AnyTable = AnyTable, Select$1 extends SelectClause<T> = SelectClause<T>, JoinOut$1 = {}, IsRoot extends boolean = true> = Omit<FindManyOptions<T, Select$1, JoinOut$1, IsRoot>, IsRoot extends true ? "limit" : "limit" | "offset" | "orderBy">;
25
+ type FindManyOptions<T extends AnyTable = AnyTable, Select$1 extends SelectClause<T> = SelectClause<T>, _JoinOut = {}, IsRoot extends boolean = true> = {
26
+ select?: Select$1;
27
+ where?: (eb: ConditionBuilder<T["columns"]>) => Condition | boolean;
28
+ limit?: number;
29
+ orderBy?: OrderBy<keyof T["columns"]> | OrderBy<keyof T["columns"]>[];
30
+ join?: (jb: JoinBuilder<T>) => void;
31
+ } & (IsRoot extends true ? {
32
+ offset?: number;
33
+ } : {});
34
+ interface AbstractQuery<TSchema extends AnySchema, TUOWConfig = void> {
35
+ /**
36
+ * Find multiple records using a builder pattern
37
+ */
38
+ find: <TableName extends keyof TSchema["tables"] & string, Select extends SelectClause<TSchema["tables"][TableName]> = true, JoinOut = {}>(table: TableName, builderFn?: (builder: Omit<FindBuilder<TSchema["tables"][TableName]>, "build">) => Omit<FindBuilder<TSchema["tables"][TableName], Select, JoinOut>, "build">) => Promise<SelectResult<TSchema["tables"][TableName], JoinOut, Select>[]>;
39
+ /**
40
+ * Find the first record matching the criteria
41
+ * Implemented as a wrapper around find() with pageSize(1)
42
+ */
43
+ findFirst: <TableName extends keyof TSchema["tables"] & string, Select extends SelectClause<TSchema["tables"][TableName]> = true, JoinOut = {}>(table: TableName, builderFn?: (builder: Omit<FindBuilder<TSchema["tables"][TableName]>, "build">) => Omit<FindBuilder<TSchema["tables"][TableName], Select, JoinOut>, "build">) => Promise<SelectResult<TSchema["tables"][TableName], JoinOut, Select> | null>;
44
+ /**
45
+ * Create a single record
46
+ * @returns The ID of the created record
47
+ */
48
+ create: <TableName extends keyof TSchema["tables"] & string>(table: TableName, values: TableToInsertValues<TSchema["tables"][TableName]>) => Promise<FragnoId>;
49
+ /**
50
+ * Create multiple records
51
+ * @returns Array of IDs of the created records
52
+ */
53
+ createMany: <TableName extends keyof TSchema["tables"] & string>(table: TableName, values: TableToInsertValues<TSchema["tables"][TableName]>[]) => Promise<FragnoId[]>;
54
+ /**
55
+ * Update a single record by ID
56
+ * Note: you cannot update the id of a row, some databases don't support that (including MongoDB).
57
+ */
58
+ update: <TableName extends keyof TSchema["tables"] & string>(table: TableName, id: FragnoId | string, builderFn: (builder: Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build" | "check">) => Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build">) => Promise<void>;
59
+ /**
60
+ * Update multiple records matching a where clause
61
+ * Note: you cannot update the id of a row, some databases don't support that (including MongoDB).
62
+ */
63
+ updateMany: <TableName extends keyof TSchema["tables"] & string>(table: TableName, builderFn: (builder: UpdateManyBuilder<TSchema["tables"][TableName]>) => void) => Promise<void>;
64
+ /**
65
+ * Delete a single record by ID
66
+ */
67
+ delete: <TableName extends keyof TSchema["tables"] & string>(table: TableName, id: FragnoId | string, builderFn?: (builder: Omit<DeleteBuilder, "build">) => Omit<DeleteBuilder, "build" | "check">) => Promise<void>;
68
+ /**
69
+ * Delete multiple records matching a where clause
70
+ */
71
+ deleteMany: <TableName extends keyof TSchema["tables"] & string>(table: TableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TableName]>, "build" | "check">) => void) => Promise<void>;
72
+ /**
73
+ * Create a Unit of Work bound to this query engine
74
+ */
75
+ createUnitOfWork: (name?: string, config?: TUOWConfig) => UnitOfWork<TSchema, []>;
76
+ }
77
+ //#endregion
78
+ export { AbstractQuery, AnySelectClause, FindFirstOptions, FindManyOptions, JoinBuilder, OrderBy, RawColumnValues, SelectClause, SelectResult, TableToColumnValues, TableToInsertValues, TableToUpdateValues };
79
+ //# sourceMappingURL=query.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.d.ts","names":[],"sources":["../../src/query/query.ts"],"sourcesContent":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export { };
@@ -0,0 +1,155 @@
1
+ import { createId } from "../id.js";
2
+ import { FragnoId, FragnoReference } from "../schema/create.js";
3
+ import { deserialize, serialize } from "../schema/serialize.js";
4
+
5
+ //#region src/query/result-transform.ts
6
+ /**
7
+ * Marker class for reference column values that need subquery resolution.
8
+ * When a reference column receives a string (external ID), this marker tells
9
+ * the query builder to generate a subquery to look up the internal ID.
10
+ * @internal
11
+ */
12
+ var ReferenceSubquery = class {
13
+ #referencedTable;
14
+ #externalIdValue;
15
+ constructor(referencedTable, externalIdValue) {
16
+ this.#referencedTable = referencedTable;
17
+ this.#externalIdValue = externalIdValue;
18
+ }
19
+ get referencedTable() {
20
+ return this.#referencedTable;
21
+ }
22
+ get externalIdValue() {
23
+ return this.#externalIdValue;
24
+ }
25
+ };
26
+ /**
27
+ * Generate a runtime default value for a column that has defaultTo$()
28
+ *
29
+ * Only generates values for runtime defaults (defaultTo$), NOT static defaults (defaultTo).
30
+ * Static defaults should be handled by the database via DEFAULT constraints.
31
+ *
32
+ * @param column - The column with a default value configuration
33
+ * @returns The generated default value, or undefined if the column has no runtime default
34
+ *
35
+ * @internal
36
+ */
37
+ function generateRuntimeDefault(column) {
38
+ if (!column.default) return;
39
+ if ("value" in column.default) return;
40
+ const runtime = column.default.runtime;
41
+ if (runtime === "auto") return createId();
42
+ if (runtime === "now") return /* @__PURE__ */ new Date();
43
+ if (typeof runtime === "function") return runtime();
44
+ }
45
+ /**
46
+ * Encodes a record of values from the application format to database format.
47
+ *
48
+ * This function transforms object keys to match SQL column names and serializes
49
+ * values according to the database provider's requirements (e.g., converting
50
+ * JavaScript Date objects to numbers for SQLite).
51
+ *
52
+ * @param values - The record of values to encode in application format
53
+ * @param table - The table schema definition containing column information
54
+ * @param generateDefault - Whether to generate default values for undefined columns
55
+ * @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)
56
+ * @returns A record with database-compatible column names and serialized values
57
+ *
58
+ * @example
59
+ * ```ts
60
+ * const encoded = encodeValues(
61
+ * { userId: 123, createdAt: new Date() },
62
+ * userTable,
63
+ * true,
64
+ * 'sqlite'
65
+ * );
66
+ * // Returns: { user_id: 123, created_at: 1234567890 }
67
+ * ```
68
+ */
69
+ function encodeValues(values, table, generateDefault, provider) {
70
+ const result = {};
71
+ for (const k in table.columns) {
72
+ const col = table.columns[k];
73
+ if (col.role === "internal-id") continue;
74
+ let value = values[k];
75
+ if (generateDefault && value === void 0) value = generateRuntimeDefault(col);
76
+ if (value !== void 0) {
77
+ if (col.role === "reference" && typeof value === "string") {
78
+ const relation = Object.values(table.relations).find((rel) => rel.on.some(([localCol]) => localCol === k));
79
+ if (relation) {
80
+ result[col.name] = new ReferenceSubquery(relation.table, value);
81
+ continue;
82
+ }
83
+ throw new Error(`Reference column ${k} not found in table ${table.name}`);
84
+ }
85
+ result[col.name] = serialize(value, col, provider);
86
+ }
87
+ }
88
+ return result;
89
+ }
90
+ /**
91
+ * Decodes a database result record to application format.
92
+ *
93
+ * This function transforms database column names back to application property names
94
+ * and deserializes values according to the database provider's format (e.g., converting
95
+ * SQLite integers back to JavaScript Date objects).
96
+ *
97
+ * Supports relation data encoded with the pattern `relationName:columnName`.
98
+ *
99
+ * @param result - The raw database result record
100
+ * @param table - The table schema definition containing column and relation information
101
+ * @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)
102
+ * @returns A record in application format with deserialized values
103
+ *
104
+ * @example
105
+ * ```ts
106
+ * const decoded = decodeResult(
107
+ * { user_id: 123, created_at: 1234567890, 'posts:title': 'Hello' },
108
+ * userTable,
109
+ * 'sqlite'
110
+ * );
111
+ * // Returns: { userId: 123, createdAt: Date, posts: { title: 'Hello' } }
112
+ * ```
113
+ */
114
+ function decodeResult(result, table, provider) {
115
+ const output = {};
116
+ const columnValues = {};
117
+ const relationData = {};
118
+ for (const k in result) {
119
+ const colonIndex = k.indexOf(":");
120
+ const value = result[k];
121
+ if (colonIndex === -1) {
122
+ const col = table.columns[k];
123
+ if (!col) continue;
124
+ columnValues[k] = deserialize(value, col, provider);
125
+ continue;
126
+ }
127
+ const relationName = k.slice(0, colonIndex);
128
+ const remainder = k.slice(colonIndex + 1);
129
+ if (table.relations[relationName] === void 0) continue;
130
+ relationData[relationName] ??= {};
131
+ relationData[relationName][remainder] = value;
132
+ }
133
+ for (const relationName in relationData) {
134
+ const relation = table.relations[relationName];
135
+ if (!relation) continue;
136
+ output[relationName] = decodeResult(relationData[relationName], relation.table, provider);
137
+ }
138
+ for (const k in columnValues) {
139
+ const col = table.columns[k];
140
+ if (!col) continue;
141
+ if (col.isHidden) continue;
142
+ if (col.role === "external-id" && columnValues["_internalId"] !== void 0) output[k] = new FragnoId({
143
+ externalId: columnValues[k],
144
+ internalId: columnValues["_internalId"],
145
+ version: columnValues["_version"]
146
+ });
147
+ else if (col.role === "reference") output[k] = FragnoReference.fromInternal(columnValues[k]);
148
+ else output[k] = columnValues[k];
149
+ }
150
+ return output;
151
+ }
152
+
153
+ //#endregion
154
+ export { ReferenceSubquery, decodeResult, encodeValues };
155
+ //# sourceMappingURL=result-transform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-transform.js","names":["#referencedTable","#externalIdValue","result: Record<string, unknown>","output: Record<string, unknown>","columnValues: Record<string, unknown>","relationData: Record<string, Record<string, unknown>>"],"sources":["../../src/query/result-transform.ts"],"sourcesContent":["import type { AnyColumn, AnyTable } from \"../schema/create\";\nimport type { SQLProvider } from \"../shared/providers\";\nimport { deserialize, serialize } from \"../schema/serialize\";\nimport { FragnoId, FragnoReference } from \"../schema/create\";\nimport { createId } from \"../id\";\n\n/**\n * Marker class for reference column values that need subquery resolution.\n * When a reference column receives a string (external ID), this marker tells\n * the query builder to generate a subquery to look up the internal ID.\n * @internal\n */\nexport class ReferenceSubquery {\n #referencedTable: AnyTable;\n #externalIdValue: string;\n\n constructor(referencedTable: AnyTable, externalIdValue: string) {\n this.#referencedTable = referencedTable;\n this.#externalIdValue = externalIdValue;\n }\n\n get referencedTable() {\n return this.#referencedTable;\n }\n\n get externalIdValue() {\n return this.#externalIdValue;\n }\n}\n\n/**\n * Generate a runtime default value for a column that has defaultTo$()\n *\n * Only generates values for runtime defaults (defaultTo$), NOT static defaults (defaultTo).\n * Static defaults should be handled by the database via DEFAULT constraints.\n *\n * @param column - The column with a default value configuration\n * @returns The generated default value, or undefined if the column has no runtime default\n *\n * @internal\n */\nexport function generateRuntimeDefault(column: AnyColumn): unknown {\n // Check if column has a default value configuration\n if (!column.default) {\n return undefined;\n }\n\n // If it's a static default value (defaultTo), return undefined\n // as the database should handle this via DEFAULT constraint\n if (\"value\" in column.default) {\n return undefined;\n }\n\n // Handle runtime defaults (defaultTo$)\n const runtime = column.default.runtime;\n\n if (runtime === \"auto\") {\n return createId();\n }\n\n if (runtime === \"now\") {\n return new Date();\n }\n\n if (typeof runtime === \"function\") {\n return runtime();\n }\n\n return undefined;\n}\n\n/**\n * Encodes a record of values from the application format to database format.\n *\n * This function transforms object keys to match SQL column names and serializes\n * values according to the database provider's requirements (e.g., converting\n * JavaScript Date objects to numbers for SQLite).\n *\n * @param values - The record of values to encode in application format\n * @param table - The table schema definition containing column information\n * @param generateDefault - Whether to generate default values for undefined columns\n * @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)\n * @returns A record with database-compatible column names and serialized values\n *\n * @example\n * ```ts\n * const encoded = encodeValues(\n * { userId: 123, createdAt: new Date() },\n * userTable,\n * true,\n * 'sqlite'\n * );\n * // Returns: { user_id: 123, created_at: 1234567890 }\n * ```\n */\nexport function encodeValues(\n values: Record<string, unknown>,\n table: AnyTable,\n generateDefault: boolean,\n provider: SQLProvider,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n for (const k in table.columns) {\n const col = table.columns[k];\n\n // Skip internal ID - never provided by user, auto-generated by database\n if (col.role === \"internal-id\") {\n continue;\n }\n let value = values[k];\n\n if (generateDefault && value === undefined) {\n // Only generate runtime defaults (defaultTo$), not static defaults (defaultTo).\n // Static defaults should be handled by the database via DEFAULT constraints.\n value = generateRuntimeDefault(col);\n }\n\n if (value !== undefined) {\n // Handle string references - convert external ID to internal ID via subquery\n if (col.role === \"reference\" && typeof value === \"string\") {\n // Find relation that uses this column\n const relation = Object.values(table.relations).find((rel) =>\n rel.on.some(([localCol]) => localCol === k),\n );\n if (relation) {\n result[col.name] = new ReferenceSubquery(relation.table, value);\n continue;\n }\n\n throw new Error(`Reference column ${k} not found in table ${table.name}`);\n }\n\n result[col.name] = serialize(value, col, provider);\n }\n }\n\n return result;\n}\n\n/**\n * Decodes a database result record to application format.\n *\n * This function transforms database column names back to application property names\n * and deserializes values according to the database provider's format (e.g., converting\n * SQLite integers back to JavaScript Date objects).\n *\n * Supports relation data encoded with the pattern `relationName:columnName`.\n *\n * @param result - The raw database result record\n * @param table - The table schema definition containing column and relation information\n * @param provider - The SQL provider (sqlite, postgresql, mysql, etc.)\n * @returns A record in application format with deserialized values\n *\n * @example\n * ```ts\n * const decoded = decodeResult(\n * { user_id: 123, created_at: 1234567890, 'posts:title': 'Hello' },\n * userTable,\n * 'sqlite'\n * );\n * // Returns: { userId: 123, createdAt: Date, posts: { title: 'Hello' } }\n * ```\n */\nexport function decodeResult(\n result: Record<string, unknown>,\n table: AnyTable,\n provider: SQLProvider,\n): Record<string, unknown> {\n const output: Record<string, unknown> = {};\n // First pass: collect all column values\n const columnValues: Record<string, unknown> = {};\n\n // Collect all relation data (including nested) keyed by relation name\n const relationData: Record<string, Record<string, unknown>> = {};\n\n for (const k in result) {\n const colonIndex = k.indexOf(\":\");\n const value = result[k];\n\n // Direct column (no colon)\n if (colonIndex === -1) {\n const col = table.columns[k];\n if (!col) {\n continue;\n }\n\n // Store all column values (including hidden ones for FragnoId creation)\n columnValues[k] = deserialize(value, col, provider);\n continue;\n }\n\n // Relation column (has colon)\n const relationName = k.slice(0, colonIndex);\n const remainder = k.slice(colonIndex + 1);\n\n const relation = table.relations[relationName];\n if (relation === undefined) {\n continue;\n }\n\n // Collect relation data with the remaining key path\n relationData[relationName] ??= {};\n relationData[relationName][remainder] = value;\n }\n\n // Process each relation's data recursively\n for (const relationName in relationData) {\n const relation = table.relations[relationName];\n if (!relation) {\n continue;\n }\n\n // Recursively decode the relation data\n output[relationName] = decodeResult(relationData[relationName], relation.table, provider);\n }\n\n // Second pass: create output with FragnoId objects where appropriate\n for (const k in columnValues) {\n const col = table.columns[k];\n if (!col) {\n continue;\n }\n\n // Filter out hidden columns (like _internalId, _version) from results\n if (col.isHidden) {\n continue;\n }\n\n // For external ID columns, create FragnoId if we have both external and internal IDs\n if (col.role === \"external-id\" && columnValues[\"_internalId\"] !== undefined) {\n output[k] = new FragnoId({\n externalId: columnValues[k] as string,\n internalId: columnValues[\"_internalId\"] as bigint,\n // _version is always selected as a hidden column, so it should always be present\n version: columnValues[\"_version\"] as number,\n });\n } else if (col.role === \"reference\") {\n // For reference columns, create FragnoReference with internal ID\n output[k] = FragnoReference.fromInternal(columnValues[k] as bigint);\n } else {\n output[k] = columnValues[k];\n }\n }\n\n return output;\n}\n"],"mappings":";;;;;;;;;;;AAYA,IAAa,oBAAb,MAA+B;CAC7B;CACA;CAEA,YAAY,iBAA2B,iBAAyB;AAC9D,QAAKA,kBAAmB;AACxB,QAAKC,kBAAmB;;CAG1B,IAAI,kBAAkB;AACpB,SAAO,MAAKD;;CAGd,IAAI,kBAAkB;AACpB,SAAO,MAAKC;;;;;;;;;;;;;;AAehB,SAAgB,uBAAuB,QAA4B;AAEjE,KAAI,CAAC,OAAO,QACV;AAKF,KAAI,WAAW,OAAO,QACpB;CAIF,MAAM,UAAU,OAAO,QAAQ;AAE/B,KAAI,YAAY,OACd,QAAO,UAAU;AAGnB,KAAI,YAAY,MACd,wBAAO,IAAI,MAAM;AAGnB,KAAI,OAAO,YAAY,WACrB,QAAO,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;AA8BpB,SAAgB,aACd,QACA,OACA,iBACA,UACyB;CACzB,MAAMC,SAAkC,EAAE;AAE1C,MAAK,MAAM,KAAK,MAAM,SAAS;EAC7B,MAAM,MAAM,MAAM,QAAQ;AAG1B,MAAI,IAAI,SAAS,cACf;EAEF,IAAI,QAAQ,OAAO;AAEnB,MAAI,mBAAmB,UAAU,OAG/B,SAAQ,uBAAuB,IAAI;AAGrC,MAAI,UAAU,QAAW;AAEvB,OAAI,IAAI,SAAS,eAAe,OAAO,UAAU,UAAU;IAEzD,MAAM,WAAW,OAAO,OAAO,MAAM,UAAU,CAAC,MAAM,QACpD,IAAI,GAAG,MAAM,CAAC,cAAc,aAAa,EAAE,CAC5C;AACD,QAAI,UAAU;AACZ,YAAO,IAAI,QAAQ,IAAI,kBAAkB,SAAS,OAAO,MAAM;AAC/D;;AAGF,UAAM,IAAI,MAAM,oBAAoB,EAAE,sBAAsB,MAAM,OAAO;;AAG3E,UAAO,IAAI,QAAQ,UAAU,OAAO,KAAK,SAAS;;;AAItD,QAAO;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BT,SAAgB,aACd,QACA,OACA,UACyB;CACzB,MAAMC,SAAkC,EAAE;CAE1C,MAAMC,eAAwC,EAAE;CAGhD,MAAMC,eAAwD,EAAE;AAEhE,MAAK,MAAM,KAAK,QAAQ;EACtB,MAAM,aAAa,EAAE,QAAQ,IAAI;EACjC,MAAM,QAAQ,OAAO;AAGrB,MAAI,eAAe,IAAI;GACrB,MAAM,MAAM,MAAM,QAAQ;AAC1B,OAAI,CAAC,IACH;AAIF,gBAAa,KAAK,YAAY,OAAO,KAAK,SAAS;AACnD;;EAIF,MAAM,eAAe,EAAE,MAAM,GAAG,WAAW;EAC3C,MAAM,YAAY,EAAE,MAAM,aAAa,EAAE;AAGzC,MADiB,MAAM,UAAU,kBAChB,OACf;AAIF,eAAa,kBAAkB,EAAE;AACjC,eAAa,cAAc,aAAa;;AAI1C,MAAK,MAAM,gBAAgB,cAAc;EACvC,MAAM,WAAW,MAAM,UAAU;AACjC,MAAI,CAAC,SACH;AAIF,SAAO,gBAAgB,aAAa,aAAa,eAAe,SAAS,OAAO,SAAS;;AAI3F,MAAK,MAAM,KAAK,cAAc;EAC5B,MAAM,MAAM,MAAM,QAAQ;AAC1B,MAAI,CAAC,IACH;AAIF,MAAI,IAAI,SACN;AAIF,MAAI,IAAI,SAAS,iBAAiB,aAAa,mBAAmB,OAChE,QAAO,KAAK,IAAI,SAAS;GACvB,YAAY,aAAa;GACzB,YAAY,aAAa;GAEzB,SAAS,aAAa;GACvB,CAAC;WACO,IAAI,SAAS,YAEtB,QAAO,KAAK,gBAAgB,aAAa,aAAa,GAAa;MAEnE,QAAO,KAAK,aAAa;;AAI7B,QAAO"}