@fragno-dev/db 0.1.13 → 0.1.15

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 (178) hide show
  1. package/.turbo/turbo-build.log +179 -132
  2. package/CHANGELOG.md +30 -0
  3. package/dist/adapters/adapters.d.ts +27 -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 +5 -1
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  8. package/dist/adapters/drizzle/drizzle-adapter.js +15 -3
  9. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  10. package/dist/adapters/drizzle/drizzle-query.js +7 -5
  11. package/dist/adapters/drizzle/drizzle-query.js.map +1 -1
  12. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -1
  13. package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +1 -1
  14. package/dist/adapters/drizzle/drizzle-uow-compiler.js +76 -44
  15. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +1 -1
  16. package/dist/adapters/drizzle/drizzle-uow-decoder.js +23 -16
  17. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +1 -1
  18. package/dist/adapters/drizzle/drizzle-uow-executor.js +18 -7
  19. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +1 -1
  20. package/dist/adapters/drizzle/generate.d.ts +4 -1
  21. package/dist/adapters/drizzle/generate.d.ts.map +1 -1
  22. package/dist/adapters/drizzle/generate.js +11 -18
  23. package/dist/adapters/drizzle/generate.js.map +1 -1
  24. package/dist/adapters/drizzle/shared.d.ts +14 -1
  25. package/dist/adapters/drizzle/shared.d.ts.map +1 -0
  26. package/dist/adapters/kysely/kysely-adapter.d.ts +5 -1
  27. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  28. package/dist/adapters/kysely/kysely-adapter.js +14 -3
  29. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  30. package/dist/adapters/kysely/kysely-query-builder.js +1 -1
  31. package/dist/adapters/kysely/kysely-query-compiler.js +3 -2
  32. package/dist/adapters/kysely/kysely-query-compiler.js.map +1 -1
  33. package/dist/adapters/kysely/kysely-query.d.ts +1 -0
  34. package/dist/adapters/kysely/kysely-query.d.ts.map +1 -1
  35. package/dist/adapters/kysely/kysely-query.js +28 -19
  36. package/dist/adapters/kysely/kysely-query.js.map +1 -1
  37. package/dist/adapters/kysely/kysely-shared.d.ts +14 -0
  38. package/dist/adapters/kysely/kysely-shared.d.ts.map +1 -0
  39. package/dist/adapters/kysely/kysely-shared.js +16 -1
  40. package/dist/adapters/kysely/kysely-shared.js.map +1 -1
  41. package/dist/adapters/kysely/kysely-uow-compiler.js +68 -16
  42. package/dist/adapters/kysely/kysely-uow-compiler.js.map +1 -1
  43. package/dist/adapters/kysely/kysely-uow-executor.js +8 -4
  44. package/dist/adapters/kysely/kysely-uow-executor.js.map +1 -1
  45. package/dist/adapters/kysely/migration/execute-base.js +1 -1
  46. package/dist/adapters/kysely/migration/execute-base.js.map +1 -1
  47. package/dist/db-fragment-definition-builder.d.ts +152 -0
  48. package/dist/db-fragment-definition-builder.d.ts.map +1 -0
  49. package/dist/db-fragment-definition-builder.js +137 -0
  50. package/dist/db-fragment-definition-builder.js.map +1 -0
  51. package/dist/fragments/internal-fragment.d.ts +19 -0
  52. package/dist/fragments/internal-fragment.d.ts.map +1 -0
  53. package/dist/fragments/internal-fragment.js +39 -0
  54. package/dist/fragments/internal-fragment.js.map +1 -0
  55. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  56. package/dist/migration-engine/generation-engine.js +35 -15
  57. package/dist/migration-engine/generation-engine.js.map +1 -1
  58. package/dist/mod.d.ts +8 -18
  59. package/dist/mod.d.ts.map +1 -1
  60. package/dist/mod.js +7 -34
  61. package/dist/mod.js.map +1 -1
  62. package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js +165 -0
  63. package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js.map +1 -0
  64. package/dist/packages/fragno/dist/api/bind-services.js +20 -0
  65. package/dist/packages/fragno/dist/api/bind-services.js.map +1 -0
  66. package/dist/packages/fragno/dist/api/error.js +48 -0
  67. package/dist/packages/fragno/dist/api/error.js.map +1 -0
  68. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +320 -0
  69. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -0
  70. package/dist/packages/fragno/dist/api/fragment-instantiator.js +487 -0
  71. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -0
  72. package/dist/packages/fragno/dist/api/fragno-response.js +73 -0
  73. package/dist/packages/fragno/dist/api/fragno-response.js.map +1 -0
  74. package/dist/packages/fragno/dist/api/internal/response-stream.js +81 -0
  75. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
  76. package/dist/packages/fragno/dist/api/internal/route.js +10 -0
  77. package/dist/packages/fragno/dist/api/internal/route.js.map +1 -0
  78. package/dist/packages/fragno/dist/api/mutable-request-state.js +97 -0
  79. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +1 -0
  80. package/dist/packages/fragno/dist/api/request-context-storage.js +43 -0
  81. package/dist/packages/fragno/dist/api/request-context-storage.js.map +1 -0
  82. package/dist/packages/fragno/dist/api/request-input-context.js +118 -0
  83. package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -0
  84. package/dist/packages/fragno/dist/api/request-middleware.js +83 -0
  85. package/dist/packages/fragno/dist/api/request-middleware.js.map +1 -0
  86. package/dist/packages/fragno/dist/api/request-output-context.js +119 -0
  87. package/dist/packages/fragno/dist/api/request-output-context.js.map +1 -0
  88. package/dist/packages/fragno/dist/api/route.js +17 -0
  89. package/dist/packages/fragno/dist/api/route.js.map +1 -0
  90. package/dist/packages/fragno/dist/internal/symbols.js +10 -0
  91. package/dist/packages/fragno/dist/internal/symbols.js.map +1 -0
  92. package/dist/query/cursor.d.ts +10 -2
  93. package/dist/query/cursor.d.ts.map +1 -1
  94. package/dist/query/cursor.js +11 -4
  95. package/dist/query/cursor.js.map +1 -1
  96. package/dist/query/execute-unit-of-work.d.ts +123 -0
  97. package/dist/query/execute-unit-of-work.d.ts.map +1 -0
  98. package/dist/query/execute-unit-of-work.js +184 -0
  99. package/dist/query/execute-unit-of-work.js.map +1 -0
  100. package/dist/query/query.d.ts +3 -3
  101. package/dist/query/query.d.ts.map +1 -1
  102. package/dist/query/result-transform.js +4 -2
  103. package/dist/query/result-transform.js.map +1 -1
  104. package/dist/query/retry-policy.d.ts +88 -0
  105. package/dist/query/retry-policy.d.ts.map +1 -0
  106. package/dist/query/retry-policy.js +61 -0
  107. package/dist/query/retry-policy.js.map +1 -0
  108. package/dist/query/unit-of-work.d.ts +171 -32
  109. package/dist/query/unit-of-work.d.ts.map +1 -1
  110. package/dist/query/unit-of-work.js +530 -133
  111. package/dist/query/unit-of-work.js.map +1 -1
  112. package/dist/schema/serialize.js +12 -7
  113. package/dist/schema/serialize.js.map +1 -1
  114. package/dist/with-database.d.ts +28 -0
  115. package/dist/with-database.d.ts.map +1 -0
  116. package/dist/with-database.js +34 -0
  117. package/dist/with-database.js.map +1 -0
  118. package/package.json +10 -3
  119. package/src/adapters/adapters.ts +30 -0
  120. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +86 -17
  121. package/src/adapters/drizzle/drizzle-adapter-sqlite.test.ts +291 -7
  122. package/src/adapters/drizzle/drizzle-adapter.test.ts +3 -51
  123. package/src/adapters/drizzle/drizzle-adapter.ts +35 -7
  124. package/src/adapters/drizzle/drizzle-query.ts +25 -15
  125. package/src/adapters/drizzle/drizzle-uow-compiler-mysql.test.ts +1442 -0
  126. package/src/adapters/drizzle/drizzle-uow-compiler-sqlite.test.ts +1414 -0
  127. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +78 -61
  128. package/src/adapters/drizzle/drizzle-uow-compiler.ts +123 -42
  129. package/src/adapters/drizzle/drizzle-uow-decoder.ts +34 -27
  130. package/src/adapters/drizzle/drizzle-uow-executor.ts +41 -8
  131. package/src/adapters/drizzle/generate.test.ts +102 -269
  132. package/src/adapters/drizzle/generate.ts +12 -30
  133. package/src/adapters/drizzle/test-utils.ts +36 -5
  134. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +66 -22
  135. package/src/adapters/kysely/kysely-adapter-sqlite.test.ts +156 -0
  136. package/src/adapters/kysely/kysely-adapter.ts +25 -2
  137. package/src/adapters/kysely/kysely-query-compiler.ts +3 -8
  138. package/src/adapters/kysely/kysely-query.ts +57 -37
  139. package/src/adapters/kysely/kysely-shared.ts +34 -0
  140. package/src/adapters/kysely/kysely-uow-compiler.test.ts +62 -74
  141. package/src/adapters/kysely/kysely-uow-compiler.ts +92 -24
  142. package/src/adapters/kysely/kysely-uow-executor.ts +26 -7
  143. package/src/adapters/kysely/kysely-uow-joins.test.ts +33 -50
  144. package/src/adapters/kysely/migration/execute-base.ts +1 -1
  145. package/src/db-fragment-definition-builder.test.ts +887 -0
  146. package/src/db-fragment-definition-builder.ts +506 -0
  147. package/src/db-fragment-instantiator.test.ts +467 -0
  148. package/src/db-fragment-integration.test.ts +408 -0
  149. package/src/fragments/internal-fragment.test.ts +160 -0
  150. package/src/fragments/internal-fragment.ts +85 -0
  151. package/src/migration-engine/generation-engine.test.ts +58 -15
  152. package/src/migration-engine/generation-engine.ts +78 -25
  153. package/src/mod.ts +35 -43
  154. package/src/query/cursor.test.ts +119 -0
  155. package/src/query/cursor.ts +17 -4
  156. package/src/query/execute-unit-of-work.test.ts +1310 -0
  157. package/src/query/execute-unit-of-work.ts +463 -0
  158. package/src/query/query.ts +4 -4
  159. package/src/query/result-transform.test.ts +129 -0
  160. package/src/query/result-transform.ts +4 -1
  161. package/src/query/retry-policy.test.ts +217 -0
  162. package/src/query/retry-policy.ts +141 -0
  163. package/src/query/unit-of-work-coordinator.test.ts +833 -0
  164. package/src/query/unit-of-work-types.test.ts +15 -2
  165. package/src/query/unit-of-work.test.ts +878 -200
  166. package/src/query/unit-of-work.ts +963 -321
  167. package/src/schema/serialize.ts +22 -11
  168. package/src/with-database.ts +140 -0
  169. package/tsdown.config.ts +1 -0
  170. package/dist/fragment.d.ts +0 -54
  171. package/dist/fragment.d.ts.map +0 -1
  172. package/dist/fragment.js +0 -92
  173. package/dist/fragment.js.map +0 -1
  174. package/dist/shared/settings-schema.js +0 -36
  175. package/dist/shared/settings-schema.js.map +0 -1
  176. package/src/fragment.test.ts +0 -341
  177. package/src/fragment.ts +0 -198
  178. package/src/shared/settings-schema.ts +0 -61
@@ -337,8 +337,16 @@ export function deserialize(value: unknown, col: AnyColumn, provider: SQLProvide
337
337
 
338
338
  /**
339
339
  * Encode to driver value
340
+ *
341
+ * @param skipDriverConversions - Skip driver-level type conversions (Date->number, boolean->0/1, bigint->Buffer).
342
+ * Set to true when using ORMs like Drizzle that handle these conversions internally.
340
343
  */
341
- export function serialize(value: unknown, col: AnyColumn, provider: SQLProvider) {
344
+ export function serialize(
345
+ value: unknown,
346
+ col: AnyColumn,
347
+ provider: SQLProvider,
348
+ skipDriverConversions = false,
349
+ ) {
342
350
  if (value === null) {
343
351
  return null;
344
352
  }
@@ -373,18 +381,21 @@ export function serialize(value: unknown, col: AnyColumn, provider: SQLProvider)
373
381
  return JSON.stringify(value);
374
382
  }
375
383
 
376
- if (provider === "sqlite" && value instanceof Date) {
377
- return value.getTime();
378
- }
384
+ // Skip driver-specific type conversions when using ORMs that handle them internally
385
+ if (!skipDriverConversions) {
386
+ if (provider === "sqlite" && value instanceof Date) {
387
+ return value.getTime();
388
+ }
379
389
 
380
- if (provider === "sqlite" && typeof value === "boolean") {
381
- return value ? 1 : 0;
382
- }
390
+ if (provider === "sqlite" && typeof value === "boolean") {
391
+ return value ? 1 : 0;
392
+ }
383
393
 
384
- if (provider === "sqlite" && typeof value === "bigint") {
385
- const buf = Buffer.alloc(8);
386
- buf.writeBigInt64BE(value);
387
- return buf;
394
+ if (provider === "sqlite" && typeof value === "bigint") {
395
+ const buf = Buffer.alloc(8);
396
+ buf.writeBigInt64BE(value);
397
+ return buf;
398
+ }
388
399
  }
389
400
 
390
401
  // most drivers accept Buffer
@@ -0,0 +1,140 @@
1
+ import type { AnySchema } from "./schema/create";
2
+ import type { RequestThisContext, FragnoPublicConfig } from "@fragno-dev/core";
3
+ import { FragmentDefinitionBuilder, instantiate } from "@fragno-dev/core";
4
+ import {
5
+ DatabaseFragmentDefinitionBuilder,
6
+ type DatabaseServiceContext,
7
+ type DatabaseHandlerContext,
8
+ type ImplicitDatabaseDependencies,
9
+ type FragnoPublicConfigWithDatabase,
10
+ type DatabaseRequestStorage,
11
+ } from "./db-fragment-definition-builder";
12
+ import { internalFragmentDef } from "./fragments/internal-fragment";
13
+
14
+ /**
15
+ * Helper to add database support to a fragment builder.
16
+ * Automatically links the internal fragment and adds ImplicitDatabaseDependencies to the TDeps type.
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * // With .extend() - recommended
21
+ * const def = defineFragment("my-frag")
22
+ * .extend(withDatabase(mySchema))
23
+ * .withDependencies(...)
24
+ * .build();
25
+ *
26
+ * // Or as a function wrapper
27
+ * const def = withDatabase(mySchema)(defineFragment("my-frag"))
28
+ * .withDependencies(...)
29
+ * .build();
30
+ * ```
31
+ */
32
+ export function withDatabase<TSchema extends AnySchema>(
33
+ schema: TSchema,
34
+ namespace?: string,
35
+ ): <
36
+ TConfig,
37
+ TDeps,
38
+ TBaseServices,
39
+ TServices,
40
+ TServiceDeps,
41
+ TPrivateServices,
42
+ TServiceThisContext extends RequestThisContext,
43
+ THandlerThisContext extends RequestThisContext,
44
+ TRequestStorage,
45
+ >(
46
+ builder: FragmentDefinitionBuilder<
47
+ TConfig,
48
+ FragnoPublicConfig,
49
+ TDeps,
50
+ TBaseServices,
51
+ TServices,
52
+ TServiceDeps,
53
+ TPrivateServices,
54
+ TServiceThisContext,
55
+ THandlerThisContext,
56
+ TRequestStorage
57
+ >,
58
+ ) => DatabaseFragmentDefinitionBuilder<
59
+ TSchema,
60
+ TConfig,
61
+ TDeps & ImplicitDatabaseDependencies<TSchema>,
62
+ TBaseServices,
63
+ TServices,
64
+ TServiceDeps,
65
+ TPrivateServices,
66
+ DatabaseServiceContext,
67
+ DatabaseHandlerContext
68
+ > {
69
+ return <
70
+ TConfig,
71
+ TDeps,
72
+ TBaseServices,
73
+ TServices,
74
+ TServiceDeps,
75
+ TPrivateServices,
76
+ TServiceThisContext extends RequestThisContext,
77
+ THandlerThisContext extends RequestThisContext,
78
+ TRequestStorage,
79
+ >(
80
+ builder: FragmentDefinitionBuilder<
81
+ TConfig,
82
+ FragnoPublicConfig,
83
+ TDeps,
84
+ TBaseServices,
85
+ TServices,
86
+ TServiceDeps,
87
+ TPrivateServices,
88
+ TServiceThisContext,
89
+ THandlerThisContext,
90
+ TRequestStorage
91
+ >,
92
+ ) => {
93
+ // Link the internal fragment to all database fragments (except the internal fragment itself)
94
+ // No circular dependency: internal-fragment.ts uses DatabaseFragmentDefinitionBuilder directly
95
+ const isInternalFragment = builder.name === "$fragno-internal-fragment";
96
+ const builderWithInternal = isInternalFragment
97
+ ? builder
98
+ : builder.withLinkedFragment("_fragno_internal", ({ config, options }) => {
99
+ // Cast is safe: by the time this callback is invoked during fragment instantiation,
100
+ // the options will be FragnoPublicConfigWithDatabase (enforced by DatabaseFragmentDefinitionBuilder)
101
+ return instantiate(internalFragmentDef)
102
+ .withConfig(config as {})
103
+ .withOptions(options as FragnoPublicConfigWithDatabase)
104
+ .build();
105
+ });
106
+
107
+ // Cast is safe: we're creating a DatabaseFragmentDefinitionBuilder which internally uses
108
+ // FragnoPublicConfigWithDatabase, but the input builder uses FragnoPublicConfig.
109
+ // The database builder's build() method will enforce FragnoPublicConfigWithDatabase at the end.
110
+ // We also add ImplicitDatabaseDependencies to TDeps so they're available in service constructors.
111
+ // Note: We discard TRequestStorage here because database fragments manage their own storage (DatabaseRequestStorage).
112
+ // We set TServiceThisContext to DatabaseServiceContext (restricted) and THandlerThisContext to DatabaseHandlerContext (full).
113
+ return new DatabaseFragmentDefinitionBuilder<
114
+ TSchema,
115
+ TConfig,
116
+ TDeps & ImplicitDatabaseDependencies<TSchema>,
117
+ TBaseServices,
118
+ TServices,
119
+ TServiceDeps,
120
+ TPrivateServices,
121
+ DatabaseServiceContext,
122
+ DatabaseHandlerContext
123
+ >(
124
+ builderWithInternal as unknown as FragmentDefinitionBuilder<
125
+ TConfig,
126
+ FragnoPublicConfigWithDatabase,
127
+ TDeps & ImplicitDatabaseDependencies<TSchema>,
128
+ TBaseServices,
129
+ TServices,
130
+ TServiceDeps,
131
+ TPrivateServices,
132
+ DatabaseServiceContext,
133
+ DatabaseHandlerContext,
134
+ DatabaseRequestStorage
135
+ >,
136
+ schema,
137
+ namespace,
138
+ );
139
+ };
140
+ }
package/tsdown.config.ts CHANGED
@@ -13,6 +13,7 @@ export default defineConfig({
13
13
  "./src/query/unit-of-work.ts",
14
14
  "./src/query/cursor.ts",
15
15
  "./src/fragment.ts",
16
+ "./src/db-fragment-definition-builder.ts",
16
17
  "./src/migration-engine/generation-engine.ts",
17
18
  ],
18
19
  dts: true,
@@ -1,54 +0,0 @@
1
- import { AnySchema } from "./schema/create.js";
2
- import { AbstractQuery } from "./query/query.js";
3
- import { DatabaseAdapter } from "./adapters/adapters.js";
4
- import { FragmentDefinition, FragnoPublicConfig } from "@fragno-dev/core";
5
-
6
- //#region src/fragment.d.ts
7
-
8
- /**
9
- * Extended FragnoPublicConfig that includes a database adapter.
10
- * Use this type when creating fragments with database support.
11
- */
12
- type FragnoPublicConfigWithDatabase = FragnoPublicConfig & {
13
- databaseAdapter: DatabaseAdapter<any>;
14
- };
15
- /**
16
- * Additional context provided to database fragments containing the database adapter and ORM instance.
17
- */
18
- type DatabaseFragmentContext<TSchema extends AnySchema> = {
19
- databaseAdapter: DatabaseAdapter<any>;
20
- orm: AbstractQuery<TSchema>;
21
- };
22
- declare class DatabaseFragmentBuilder<const TSchema extends AnySchema, const TConfig, const TDeps = {}, const TServices extends Record<string, unknown> = {}> {
23
- #private;
24
- constructor(options: {
25
- name: string;
26
- schema?: TSchema;
27
- namespace?: string;
28
- dependencies?: (context: {
29
- config: TConfig;
30
- fragnoConfig: FragnoPublicConfig;
31
- } & DatabaseFragmentContext<TSchema>) => TDeps;
32
- services?: (context: {
33
- config: TConfig;
34
- fragnoConfig: FragnoPublicConfig;
35
- deps: TDeps;
36
- } & DatabaseFragmentContext<TSchema>) => TServices;
37
- });
38
- get $requiredOptions(): FragnoPublicConfigWithDatabase;
39
- get definition(): FragmentDefinition<TConfig, TDeps, TServices>;
40
- withDatabase<TNewSchema extends AnySchema>(schema: TNewSchema, namespace?: string): DatabaseFragmentBuilder<TNewSchema, TConfig, TDeps, TServices>;
41
- withDependencies<TNewDeps>(fn: (context: {
42
- config: TConfig;
43
- fragnoConfig: FragnoPublicConfig;
44
- } & DatabaseFragmentContext<TSchema>) => TNewDeps): DatabaseFragmentBuilder<TSchema, TConfig, TNewDeps, {}>;
45
- withServices<TNewServices extends Record<string, unknown>>(fn: (context: {
46
- config: TConfig;
47
- fragnoConfig: FragnoPublicConfig;
48
- deps: TDeps;
49
- } & DatabaseFragmentContext<TSchema>) => TNewServices): DatabaseFragmentBuilder<TSchema, TConfig, TDeps, TNewServices>;
50
- }
51
- declare function defineFragmentWithDatabase<TConfig = {}>(name: string): DatabaseFragmentBuilder<never, TConfig, {}, {}>;
52
- //#endregion
53
- export { DatabaseFragmentBuilder, DatabaseFragmentContext, FragnoPublicConfigWithDatabase, defineFragmentWithDatabase };
54
- //# sourceMappingURL=fragment.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fragment.d.ts","names":[],"sources":["../src/fragment.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AASA;AAQA;AAAoD,KARxC,8BAAA,GAAiC,kBAQO,GAAA;EAEjC,eAAA,EARA,eAQA,CAAA,GAAA,CAAA;CACE;;;AAGrB;AACwB,KAPZ,uBAOY,CAAA,gBAP4B,SAO5B,CAAA,GAAA;EAGE,eAAA,EARP,eAQO,CAAA,GAAA,CAAA;EAqBb,GAAA,EA5BN,aA4BM,CA5BQ,OA4BR,CAAA;CAIG;AACM,cA9BT,uBA8BS,CAAA,sBA7BE,SA6BF,EAAA,aAAA,EAAA,cAAA,CAAA,CAAA,EAAA,wBA1BI,MA0BJ,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA;EACY,CAAA,OAAA;EAAxB,WAAA,CAAA,OAAA,EAAA;IACD,IAAA,EAAA,MAAA;IAGO,MAAA,CAAA,EAVH,OAUG;IACM,SAAA,CAAA,EAAA,MAAA;IACR,YAAA,CAAA,EAAA,CAAA,OAAA,EAAA;MACoB,MAAA,EATlB,OASkB;MAAxB,YAAA,EARY,kBAQZ;IACD,CAAA,GARC,uBAQD,CARyB,OAQzB,CAAA,EAAA,GAPA,KAOA;IASiB,QAAA,CAAA,EAAA,CAAA,OAAA,EAAA;MAIa,MAAA,EAjBvB,OAiBuB;MAAS,YAAA,EAhB1B,kBAgB0B;MAAO,IAAA,EAfzC,KAeyC;IAAnC,CAAA,GAdV,uBAcU,CAdc,OAcd,CAAA,EAAA,GAbX,SAaW;EAoDc,CAAA;EACtB,IAAA,gBAAA,CAAA,CAAA,EAzDc,8BAyDd;EAEiB,IAAA,UAAA,CAAA,CAAA,EAvDT,kBAuDS,CAvDU,OAuDV,EAvDmB,KAuDnB,EAvD0B,SAuD1B,CAAA;EAAY,YAAA,CAAA,mBAHP,SAGO,CAAA,CAAA,MAAA,EAF7B,UAE6B,EAAA,SAAA,CAAA,EAAA,MAAA,CAAA,EAApC,uBAAoC,CAAZ,UAAY,EAAA,OAAA,EAAS,KAAT,EAAgB,SAAhB,CAAA;EAAS,gBAAA,CAAA,QAAA,CAAA,CAAA,EAAA,EAAA,CAAA,OAAA,EAAA;IAAO,MAAA,EA4BzC,OA5ByC;IAApD,YAAA,EA6BiB,kBA7BjB;EA4BW,CAAA,GAEN,uBAFM,CAEkB,OAFlB,CAAA,EAAA,GAGP,QAHO,CAAA,EAIX,uBAJW,CAIa,OAJb,EAIsB,OAJtB,EAI+B,QAJ/B,EAAA,CAAA,CAAA,CAAA;EACM,YAAA,CAAA,qBAac,MAbd,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,OAAA,EAAA;IACY,MAAA,EAelB,OAfkB;IAAxB,YAAA,EAgBY,kBAhBZ;IACD,IAAA,EAgBK,KAhBL;EACoB,CAAA,GAgBnB,uBAhBmB,CAgBK,OAhBL,CAAA,EAAA,GAiBpB,YAjBoB,CAAA,EAkBxB,uBAlBwB,CAkBA,OAlBA,EAkBS,OAlBT,EAkBkB,KAlBlB,EAkByB,YAlBzB,CAAA;;AAAkB,iBA6B/B,0BA7B+B,CAAA,UAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EA+B5C,uBA/B4C,CAAA,KAAA,EA+Bb,OA/Ba,EAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA"}
package/dist/fragment.js DELETED
@@ -1,92 +0,0 @@
1
- //#region src/fragment.ts
2
- var DatabaseFragmentBuilder = class DatabaseFragmentBuilder {
3
- #name;
4
- #schema;
5
- #namespace;
6
- #dependencies;
7
- #services;
8
- constructor(options) {
9
- this.#name = options.name;
10
- this.#schema = options.schema;
11
- this.#namespace = options.namespace;
12
- this.#dependencies = options.dependencies;
13
- this.#services = options.services;
14
- }
15
- get $requiredOptions() {
16
- throw new Error("Type only method. Do not call.");
17
- }
18
- get definition() {
19
- const schema = this.#schema;
20
- const namespace = this.#namespace ?? "";
21
- const name = this.#name;
22
- const dependencies = this.#dependencies;
23
- const services = this.#services;
24
- return {
25
- name,
26
- dependencies: (config, options) => {
27
- const dbContext = this.#createDatabaseContext(options, schema, namespace, name);
28
- return dependencies?.({
29
- config,
30
- fragnoConfig: options,
31
- ...dbContext
32
- }) ?? {};
33
- },
34
- services: (config, options, deps) => {
35
- const dbContext = this.#createDatabaseContext(options, schema, namespace, name);
36
- return services?.({
37
- config,
38
- fragnoConfig: options,
39
- deps,
40
- ...dbContext
41
- }) ?? {};
42
- },
43
- additionalContext: {
44
- databaseSchema: schema,
45
- databaseNamespace: namespace
46
- }
47
- };
48
- }
49
- #createDatabaseContext(options, schema, namespace, name) {
50
- const databaseAdapter = options.databaseAdapter;
51
- if (!databaseAdapter) throw new Error(`Fragment '${name}' requires a database adapter in options.databaseAdapter`);
52
- if (!schema) throw new Error(`Fragment '${name}' requires a schema. Use withDatabase() to provide one.`);
53
- return {
54
- databaseAdapter,
55
- orm: databaseAdapter.createQueryEngine(schema, namespace)
56
- };
57
- }
58
- withDatabase(schema, namespace) {
59
- return new DatabaseFragmentBuilder({
60
- name: this.#name,
61
- schema,
62
- namespace: namespace ?? this.#name + "-db",
63
- dependencies: this.#dependencies,
64
- services: this.#services
65
- });
66
- }
67
- withDependencies(fn) {
68
- return new DatabaseFragmentBuilder({
69
- name: this.#name,
70
- schema: this.#schema,
71
- namespace: this.#namespace,
72
- dependencies: fn,
73
- services: void 0
74
- });
75
- }
76
- withServices(fn) {
77
- return new DatabaseFragmentBuilder({
78
- name: this.#name,
79
- schema: this.#schema,
80
- namespace: this.#namespace,
81
- dependencies: this.#dependencies,
82
- services: fn
83
- });
84
- }
85
- };
86
- function defineFragmentWithDatabase(name) {
87
- return new DatabaseFragmentBuilder({ name });
88
- }
89
-
90
- //#endregion
91
- export { DatabaseFragmentBuilder, defineFragmentWithDatabase };
92
- //# sourceMappingURL=fragment.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fragment.js","names":["#name","#schema","#namespace","#dependencies","#services","#createDatabaseContext"],"sources":["../src/fragment.ts"],"sourcesContent":["import type { AnySchema } from \"./schema/create\";\nimport type { AbstractQuery } from \"./query/query\";\nimport type { DatabaseAdapter } from \"./adapters/adapters\";\nimport type { FragnoPublicConfig, FragmentDefinition } from \"@fragno-dev/core\";\n\n/**\n * Extended FragnoPublicConfig that includes a database adapter.\n * Use this type when creating fragments with database support.\n */\nexport type FragnoPublicConfigWithDatabase = FragnoPublicConfig & {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n databaseAdapter: DatabaseAdapter<any>;\n};\n\n/**\n * Additional context provided to database fragments containing the database adapter and ORM instance.\n */\nexport type DatabaseFragmentContext<TSchema extends AnySchema> = {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n databaseAdapter: DatabaseAdapter<any>;\n orm: AbstractQuery<TSchema>;\n};\n\nexport class DatabaseFragmentBuilder<\n const TSchema extends AnySchema,\n const TConfig,\n const TDeps = {},\n const TServices extends Record<string, unknown> = {},\n> {\n #name: string;\n #schema?: TSchema;\n #namespace?: string;\n #dependencies?: (\n context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n } & DatabaseFragmentContext<TSchema>,\n ) => TDeps;\n #services?: (\n context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps;\n } & DatabaseFragmentContext<TSchema>,\n ) => TServices;\n\n constructor(options: {\n name: string;\n schema?: TSchema;\n namespace?: string;\n dependencies?: (\n context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n } & DatabaseFragmentContext<TSchema>,\n ) => TDeps;\n services?: (\n context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps;\n } & DatabaseFragmentContext<TSchema>,\n ) => TServices;\n }) {\n this.#name = options.name;\n this.#schema = options.schema;\n this.#namespace = options.namespace;\n this.#dependencies = options.dependencies;\n this.#services = options.services;\n }\n\n get $requiredOptions(): FragnoPublicConfigWithDatabase {\n throw new Error(\"Type only method. Do not call.\");\n }\n\n get definition(): FragmentDefinition<TConfig, TDeps, TServices> {\n const schema = this.#schema;\n const namespace = this.#namespace ?? \"\";\n const name = this.#name;\n const dependencies = this.#dependencies;\n const services = this.#services;\n\n return {\n name,\n dependencies: (config: TConfig, options: FragnoPublicConfig) => {\n const dbContext = this.#createDatabaseContext(options, schema, namespace, name);\n return dependencies?.({ config, fragnoConfig: options, ...dbContext }) ?? ({} as TDeps);\n },\n services: (config: TConfig, options: FragnoPublicConfig, deps: TDeps) => {\n const dbContext = this.#createDatabaseContext(options, schema, namespace, name);\n return (\n services?.({ config, fragnoConfig: options, deps, ...dbContext }) ?? ({} as TServices)\n );\n },\n additionalContext: {\n databaseSchema: schema,\n databaseNamespace: namespace,\n },\n };\n }\n\n #createDatabaseContext(\n options: FragnoPublicConfig,\n schema: TSchema | undefined,\n namespace: string,\n name: string,\n ): DatabaseFragmentContext<TSchema> {\n // Safe cast: FragnoPublicConfig is extended with databaseAdapter by the user\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const databaseAdapter = (options as any).databaseAdapter as DatabaseAdapter<any> | undefined;\n\n if (!databaseAdapter) {\n throw new Error(`Fragment '${name}' requires a database adapter in options.databaseAdapter`);\n }\n if (!schema) {\n throw new Error(`Fragment '${name}' requires a schema. Use withDatabase() to provide one.`);\n }\n\n // Safe cast: we create a query engine for TSchema and know it will be AbstractQuery<TSchema>\n const orm = databaseAdapter.createQueryEngine(\n schema,\n namespace,\n ) as unknown as AbstractQuery<TSchema>;\n\n return { databaseAdapter, orm };\n }\n\n withDatabase<TNewSchema extends AnySchema>(\n schema: TNewSchema,\n namespace?: string,\n ): DatabaseFragmentBuilder<TNewSchema, TConfig, TDeps, TServices> {\n return new DatabaseFragmentBuilder<TNewSchema, TConfig, TDeps, TServices>({\n name: this.#name,\n schema,\n namespace: namespace ?? this.#name + \"-db\",\n dependencies: this.#dependencies as\n | ((\n context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n } & DatabaseFragmentContext<TNewSchema>,\n ) => TDeps)\n | undefined,\n services: this.#services as\n | ((\n context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps;\n } & DatabaseFragmentContext<TNewSchema>,\n ) => TServices)\n | undefined,\n });\n }\n\n withDependencies<TNewDeps>(\n fn: (\n context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n } & DatabaseFragmentContext<TSchema>,\n ) => TNewDeps,\n ): DatabaseFragmentBuilder<TSchema, TConfig, TNewDeps, {}> {\n return new DatabaseFragmentBuilder<TSchema, TConfig, TNewDeps, {}>({\n name: this.#name,\n schema: this.#schema,\n namespace: this.#namespace,\n dependencies: fn,\n services: undefined,\n });\n }\n\n withServices<TNewServices extends Record<string, unknown>>(\n fn: (\n context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps;\n } & DatabaseFragmentContext<TSchema>,\n ) => TNewServices,\n ): DatabaseFragmentBuilder<TSchema, TConfig, TDeps, TNewServices> {\n return new DatabaseFragmentBuilder<TSchema, TConfig, TDeps, TNewServices>({\n name: this.#name,\n schema: this.#schema,\n namespace: this.#namespace,\n dependencies: this.#dependencies,\n services: fn,\n });\n }\n}\n\nexport function defineFragmentWithDatabase<TConfig = {}>(\n name: string,\n): DatabaseFragmentBuilder<never, TConfig, {}, {}> {\n return new DatabaseFragmentBuilder<never, TConfig, {}, {}>({\n name,\n });\n}\n"],"mappings":";AAuBA,IAAa,0BAAb,MAAa,wBAKX;CACA;CACA;CACA;CACA;CAMA;CAQA,YAAY,SAiBT;AACD,QAAKA,OAAQ,QAAQ;AACrB,QAAKC,SAAU,QAAQ;AACvB,QAAKC,YAAa,QAAQ;AAC1B,QAAKC,eAAgB,QAAQ;AAC7B,QAAKC,WAAY,QAAQ;;CAG3B,IAAI,mBAAmD;AACrD,QAAM,IAAI,MAAM,iCAAiC;;CAGnD,IAAI,aAA4D;EAC9D,MAAM,SAAS,MAAKH;EACpB,MAAM,YAAY,MAAKC,aAAc;EACrC,MAAM,OAAO,MAAKF;EAClB,MAAM,eAAe,MAAKG;EAC1B,MAAM,WAAW,MAAKC;AAEtB,SAAO;GACL;GACA,eAAe,QAAiB,YAAgC;IAC9D,MAAM,YAAY,MAAKC,sBAAuB,SAAS,QAAQ,WAAW,KAAK;AAC/E,WAAO,eAAe;KAAE;KAAQ,cAAc;KAAS,GAAG;KAAW,CAAC,IAAK,EAAE;;GAE/E,WAAW,QAAiB,SAA6B,SAAgB;IACvE,MAAM,YAAY,MAAKA,sBAAuB,SAAS,QAAQ,WAAW,KAAK;AAC/E,WACE,WAAW;KAAE;KAAQ,cAAc;KAAS;KAAM,GAAG;KAAW,CAAC,IAAK,EAAE;;GAG5E,mBAAmB;IACjB,gBAAgB;IAChB,mBAAmB;IACpB;GACF;;CAGH,uBACE,SACA,QACA,WACA,MACkC;EAGlC,MAAM,kBAAmB,QAAgB;AAEzC,MAAI,CAAC,gBACH,OAAM,IAAI,MAAM,aAAa,KAAK,0DAA0D;AAE9F,MAAI,CAAC,OACH,OAAM,IAAI,MAAM,aAAa,KAAK,yDAAyD;AAS7F,SAAO;GAAE;GAAiB,KALd,gBAAgB,kBAC1B,QACA,UACD;GAE8B;;CAGjC,aACE,QACA,WACgE;AAChE,SAAO,IAAI,wBAA+D;GACxE,MAAM,MAAKL;GACX;GACA,WAAW,aAAa,MAAKA,OAAQ;GACrC,cAAc,MAAKG;GAQnB,UAAU,MAAKC;GAShB,CAAC;;CAGJ,iBACE,IAMyD;AACzD,SAAO,IAAI,wBAAwD;GACjE,MAAM,MAAKJ;GACX,QAAQ,MAAKC;GACb,WAAW,MAAKC;GAChB,cAAc;GACd,UAAU;GACX,CAAC;;CAGJ,aACE,IAOgE;AAChE,SAAO,IAAI,wBAA+D;GACxE,MAAM,MAAKF;GACX,QAAQ,MAAKC;GACb,WAAW,MAAKC;GAChB,cAAc,MAAKC;GACnB,UAAU;GACX,CAAC;;;AAIN,SAAgB,2BACd,MACiD;AACjD,QAAO,IAAI,wBAAgD,EACzD,MACD,CAAC"}
@@ -1,36 +0,0 @@
1
- import { column, idColumn, schema } from "../schema/create.js";
2
-
3
- //#region src/shared/settings-schema.ts
4
- const SETTINGS_TABLE_NAME = "fragno_db_settings";
5
- const SETTINGS_NAMESPACE = "fragno-db-settings";
6
- const settingsSchema = schema((s) => {
7
- return s.addTable(SETTINGS_TABLE_NAME, (t) => {
8
- return t.addColumn("id", idColumn()).addColumn("key", column("string")).addColumn("value", column("string")).createIndex("unique_key", ["key"], { unique: true });
9
- });
10
- });
11
- function createSettingsManager(queryEngine, namespace) {
12
- return {
13
- async get(key) {
14
- const [[result]] = await queryEngine.createUnitOfWork().find(SETTINGS_TABLE_NAME, (b) => b.whereIndex("unique_key", (eb) => eb("key", "=", `${namespace}.${key}`))).executeRetrieve();
15
- return result;
16
- },
17
- async set(key, value) {
18
- const uow = queryEngine.createUnitOfWork("createSettingsManager#set").find(SETTINGS_TABLE_NAME, (b) => b.whereIndex("unique_key", (eb) => eb("key", "=", `${namespace}.${key}`)));
19
- const [[existing]] = await uow.executeRetrieve();
20
- if (existing) uow.update(SETTINGS_TABLE_NAME, existing.id, (b) => b.set({ value }).check());
21
- else uow.create(SETTINGS_TABLE_NAME, {
22
- key: `${namespace}.${key}`,
23
- value
24
- });
25
- const { success } = await uow.executeMutations();
26
- if (!success) throw new Error("Failed to set schema version");
27
- },
28
- async delete(id) {
29
- await queryEngine.delete(SETTINGS_TABLE_NAME, id);
30
- }
31
- };
32
- }
33
-
34
- //#endregion
35
- export { SETTINGS_NAMESPACE, SETTINGS_TABLE_NAME, createSettingsManager, settingsSchema };
36
- //# sourceMappingURL=settings-schema.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"settings-schema.js","names":[],"sources":["../../src/shared/settings-schema.ts"],"sourcesContent":["import type { AbstractQuery } from \"../query/query\";\nimport { schema, idColumn, column, type FragnoId } from \"../schema/create\";\n\nexport const SETTINGS_TABLE_NAME = \"fragno_db_settings\" as const;\nexport const SETTINGS_NAMESPACE = \"fragno-db-settings\" as const;\n\nexport const settingsSchema = schema((s) => {\n return s.addTable(SETTINGS_TABLE_NAME, (t) => {\n return t\n .addColumn(\"id\", idColumn())\n .addColumn(\"key\", column(\"string\"))\n .addColumn(\"value\", column(\"string\"))\n .createIndex(\"unique_key\", [\"key\"], { unique: true });\n });\n});\n\nexport function createSettingsManager(\n // oxlint-disable-next-line no-explicit-any\n queryEngine: AbstractQuery<typeof settingsSchema, any>,\n namespace: string,\n) {\n return {\n async get(key: string): Promise<{ id: FragnoId; key: string; value: string } | undefined> {\n const uow = queryEngine\n .createUnitOfWork()\n .find(SETTINGS_TABLE_NAME, (b) =>\n b.whereIndex(\"unique_key\", (eb) => eb(\"key\", \"=\", `${namespace}.${key}`)),\n );\n const [[result]] = await uow.executeRetrieve();\n return result; // Safe: result can be undefined if key doesn't exist\n },\n\n async set(key: string, value: string) {\n const uow = queryEngine\n .createUnitOfWork(\"createSettingsManager#set\")\n .find(SETTINGS_TABLE_NAME, (b) =>\n b.whereIndex(\"unique_key\", (eb) => eb(\"key\", \"=\", `${namespace}.${key}`)),\n );\n const [[existing]] = await uow.executeRetrieve();\n\n if (existing) {\n uow.update(SETTINGS_TABLE_NAME, existing.id, (b) => b.set({ value }).check());\n } else {\n uow.create(SETTINGS_TABLE_NAME, {\n key: `${namespace}.${key}`,\n value,\n });\n }\n\n const { success } = await uow.executeMutations();\n\n if (!success) {\n throw new Error(\"Failed to set schema version\");\n }\n },\n\n async delete(id: FragnoId) {\n await queryEngine.delete(SETTINGS_TABLE_NAME, id);\n },\n };\n}\n"],"mappings":";;;AAGA,MAAa,sBAAsB;AACnC,MAAa,qBAAqB;AAElC,MAAa,iBAAiB,QAAQ,MAAM;AAC1C,QAAO,EAAE,SAAS,sBAAsB,MAAM;AAC5C,SAAO,EACJ,UAAU,MAAM,UAAU,CAAC,CAC3B,UAAU,OAAO,OAAO,SAAS,CAAC,CAClC,UAAU,SAAS,OAAO,SAAS,CAAC,CACpC,YAAY,cAAc,CAAC,MAAM,EAAE,EAAE,QAAQ,MAAM,CAAC;GACvD;EACF;AAEF,SAAgB,sBAEd,aACA,WACA;AACA,QAAO;EACL,MAAM,IAAI,KAAgF;GAMxF,MAAM,CAAC,CAAC,WAAW,MALP,YACT,kBAAkB,CAClB,KAAK,sBAAsB,MAC1B,EAAE,WAAW,eAAe,OAAO,GAAG,OAAO,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC,CAC1E,CAC0B,iBAAiB;AAC9C,UAAO;;EAGT,MAAM,IAAI,KAAa,OAAe;GACpC,MAAM,MAAM,YACT,iBAAiB,4BAA4B,CAC7C,KAAK,sBAAsB,MAC1B,EAAE,WAAW,eAAe,OAAO,GAAG,OAAO,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC,CAC1E;GACH,MAAM,CAAC,CAAC,aAAa,MAAM,IAAI,iBAAiB;AAEhD,OAAI,SACF,KAAI,OAAO,qBAAqB,SAAS,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC;OAE7E,KAAI,OAAO,qBAAqB;IAC9B,KAAK,GAAG,UAAU,GAAG;IACrB;IACD,CAAC;GAGJ,MAAM,EAAE,YAAY,MAAM,IAAI,kBAAkB;AAEhD,OAAI,CAAC,QACH,OAAM,IAAI,MAAM,+BAA+B;;EAInD,MAAM,OAAO,IAAc;AACzB,SAAM,YAAY,OAAO,qBAAqB,GAAG;;EAEpD"}