@fragno-dev/db 0.2.0 → 0.2.1

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 (32) hide show
  1. package/.turbo/turbo-build.log +20 -20
  2. package/CHANGELOG.md +17 -0
  3. package/dist/db-fragment-definition-builder.d.ts +55 -1
  4. package/dist/db-fragment-definition-builder.d.ts.map +1 -1
  5. package/dist/db-fragment-definition-builder.js +49 -5
  6. package/dist/db-fragment-definition-builder.js.map +1 -1
  7. package/dist/fragments/internal-fragment.d.ts.map +1 -1
  8. package/dist/fragments/internal-fragment.js.map +1 -1
  9. package/dist/mod.d.ts.map +1 -1
  10. package/dist/query/unit-of-work/execute-unit-of-work.d.ts +37 -1
  11. package/dist/query/unit-of-work/execute-unit-of-work.d.ts.map +1 -1
  12. package/dist/query/unit-of-work/execute-unit-of-work.js +133 -1
  13. package/dist/query/unit-of-work/execute-unit-of-work.js.map +1 -1
  14. package/dist/query/unit-of-work/unit-of-work.d.ts +18 -3
  15. package/dist/query/unit-of-work/unit-of-work.d.ts.map +1 -1
  16. package/dist/query/unit-of-work/unit-of-work.js +25 -11
  17. package/dist/query/unit-of-work/unit-of-work.js.map +1 -1
  18. package/dist/schema/create.d.ts +0 -3
  19. package/dist/schema/create.d.ts.map +1 -1
  20. package/dist/schema/create.js +0 -4
  21. package/dist/schema/create.js.map +1 -1
  22. package/dist/sql-driver/dialects/durable-object-dialect.d.ts.map +1 -1
  23. package/package.json +3 -3
  24. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +1 -0
  25. package/src/db-fragment-definition-builder.ts +187 -7
  26. package/src/fragments/internal-fragment.ts +0 -1
  27. package/src/hooks/hooks.test.ts +28 -16
  28. package/src/query/unit-of-work/execute-unit-of-work.test.ts +555 -1
  29. package/src/query/unit-of-work/execute-unit-of-work.ts +312 -4
  30. package/src/query/unit-of-work/unit-of-work-coordinator.test.ts +249 -1
  31. package/src/query/unit-of-work/unit-of-work.ts +39 -17
  32. package/src/schema/create.ts +0 -5
@@ -1,5 +1,5 @@
1
1
 
2
- > @fragno-dev/db@0.2.0 build /home/runner/work/fragno/fragno/packages/fragno-db
2
+ > @fragno-dev/db@0.2.1 build /home/runner/work/fragno/fragno/packages/fragno-db
3
3
  > tsdown
4
4
 
5
5
  ℹ tsdown v0.15.12 powered by rolldown v1.0.0-beta.45
@@ -7,11 +7,11 @@
7
7
  ℹ entry: src/db-fragment-definition-builder.ts, src/id.ts, src/mod.ts, src/adapters/adapters.ts, src/migration-engine/generation-engine.ts, src/query/cursor.ts, src/query/simple-query-interface.ts, src/schema/create.ts, src/sql-driver/sql-driver.ts, src/adapters/drizzle/drizzle-adapter.ts, src/adapters/drizzle/generate.ts, src/adapters/generic-sql/driver-config.ts, src/adapters/generic-sql/generic-sql-adapter.ts, src/adapters/kysely/kysely-adapter.ts, src/query/unit-of-work/unit-of-work.ts, src/sql-driver/dialects/dialects.ts, src/sql-driver/dialects/durable-object-dialect.ts
8
8
  ℹ tsconfig: tsconfig.json
9
9
  ℹ Build start
10
- ℹ dist/query/unit-of-work/unit-of-work.js 32.02 kB │ gzip: 7.11 kB
11
- ℹ dist/schema/create.js 20.01 kB │ gzip: 5.24 kB
10
+ ℹ dist/query/unit-of-work/unit-of-work.js 32.66 kB │ gzip: 7.28 kB
11
+ ℹ dist/schema/create.js 19.85 kB │ gzip: 5.20 kB
12
12
  ℹ dist/adapters/drizzle/generate.js 14.69 kB │ gzip: 3.69 kB
13
+ ℹ dist/db-fragment-definition-builder.js  9.56 kB │ gzip: 2.45 kB
13
14
  ℹ dist/migration-engine/generation-engine.js  8.05 kB │ gzip: 2.27 kB
14
- ℹ dist/db-fragment-definition-builder.js  7.68 kB │ gzip: 2.24 kB
15
15
  ℹ dist/query/cursor.js  4.81 kB │ gzip: 1.70 kB
16
16
  ℹ dist/mod.js  4.22 kB │ gzip: 1.37 kB
17
17
  ℹ dist/sql-driver/dialects/durable-object-dialect.js  3.51 kB │ gzip: 1.10 kB
@@ -24,23 +24,24 @@
24
24
  ℹ dist/id.js  0.07 kB │ gzip: 0.07 kB
25
25
  ℹ dist/query/simple-query-interface.js  0.01 kB │ gzip: 0.03 kB
26
26
  ℹ dist/sql-driver/sql-driver.js  0.01 kB │ gzip: 0.03 kB
27
- ℹ dist/query/unit-of-work/unit-of-work.js.map 80.52 kB │ gzip: 17.30 kB
28
- ℹ dist/schema/create.js.map 49.08 kB │ gzip: 11.85 kB
27
+ ℹ dist/query/unit-of-work/unit-of-work.js.map 81.66 kB │ gzip: 17.56 kB
28
+ ℹ dist/schema/create.js.map 48.81 kB │ gzip: 11.78 kB
29
29
  ℹ dist/adapters/drizzle/generate.js.map 34.97 kB │ gzip: 8.55 kB
30
+ ℹ dist/db-fragment-definition-builder.js.map 34.65 kB │ gzip: 7.54 kB
31
+ ℹ dist/query/unit-of-work/execute-unit-of-work.js.map 31.97 kB │ gzip: 6.83 kB
30
32
  ℹ dist/packages/fragno/dist/api/fragment-instantiator.js.map 26.88 kB │ gzip: 6.61 kB
31
- ℹ dist/db-fragment-definition-builder.js.map 26.82 kB │ gzip: 6.27 kB
32
- ℹ dist/query/unit-of-work/execute-unit-of-work.js.map 19.76 kB │ gzip: 5.32 kB
33
33
  ℹ dist/adapters/generic-sql/migration/sql-generator.js.map 17.35 kB │ gzip: 4.35 kB
34
34
  ℹ dist/migration-engine/generation-engine.js.map 16.86 kB │ gzip: 4.69 kB
35
35
  ℹ dist/packages/fragno/dist/api/fragment-instantiator.js 16.69 kB │ gzip: 4.17 kB
36
36
  ℹ dist/packages/fragno/dist/api/fragment-definition-builder.js.map 15.85 kB │ gzip: 3.10 kB
37
37
  ℹ dist/adapters/generic-sql/query/sql-query-compiler.js.map 15.39 kB │ gzip: 4.43 kB
38
38
  ℹ dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js.map 15.11 kB │ gzip: 3.75 kB
39
- ℹ dist/query/unit-of-work/unit-of-work.d.ts.map 13.88 kB │ gzip: 5.09 kB
39
+ ℹ dist/query/unit-of-work/unit-of-work.d.ts.map 13.96 kB │ gzip: 5.11 kB
40
40
  ℹ dist/adapters/shared/from-unit-of-work-compiler.js.map 13.87 kB │ gzip: 3.79 kB
41
+ ℹ dist/query/unit-of-work/execute-unit-of-work.js 12.41 kB │ gzip: 2.81 kB
41
42
  ℹ dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js.map 12.39 kB │ gzip: 3.32 kB
42
- ℹ dist/fragments/internal-fragment.js.map 12.04 kB │ gzip: 3.51 kB
43
- ℹ dist/schema/create.d.ts.map 11.90 kB │ gzip: 4.68 kB
43
+ ℹ dist/fragments/internal-fragment.js.map 12.00 kB │ gzip: 3.49 kB
44
+ ℹ dist/schema/create.d.ts.map 11.85 kB │ gzip: 4.65 kB
44
45
  ℹ dist/adapters/generic-sql/query/where-builder.js.map 11.09 kB │ gzip: 2.88 kB
45
46
  ℹ dist/packages/fragno/dist/api/fragment-definition-builder.js 11.03 kB │ gzip: 2.24 kB
46
47
  ℹ dist/adapters/generic-sql/migration/prepared-migrations.js.map  9.48 kB │ gzip: 2.67 kB
@@ -56,7 +57,6 @@
56
57
  ℹ dist/adapters/generic-sql/migration/sql-generator.js  7.79 kB │ gzip: 2.15 kB
57
58
  ℹ dist/query/serialize/dialect/sqlite-serializer.js.map  7.41 kB │ gzip: 2.04 kB
58
59
  ℹ dist/hooks/hooks.js.map  7.34 kB │ gzip: 2.47 kB
59
- ℹ dist/query/unit-of-work/execute-unit-of-work.js  7.14 kB │ gzip: 2.21 kB
60
60
  ℹ dist/adapters/generic-sql/query/generic-sql-uow-operation-compiler.js  6.96 kB │ gzip: 1.71 kB
61
61
  ℹ dist/adapters/generic-sql/uow-decoder.js.map  6.89 kB │ gzip: 2.43 kB
62
62
  ℹ dist/adapters/generic-sql/driver-config.js.map  6.86 kB │ gzip: 1.40 kB
@@ -69,6 +69,7 @@
69
69
  ℹ dist/adapters/generic-sql/uow-encoder.js.map  5.91 kB │ gzip: 2.17 kB
70
70
  ℹ dist/packages/fragno/dist/api/request-output-context.js.map  5.82 kB │ gzip: 1.69 kB
71
71
  ℹ dist/adapters/generic-sql/query/sql-query-compiler.js  5.76 kB │ gzip: 1.89 kB
72
+ ℹ dist/db-fragment-definition-builder.d.ts.map  5.76 kB │ gzip: 2.40 kB
72
73
  ℹ dist/schema/type-conversion/type-mapping.js.map  5.72 kB │ gzip: 1.90 kB
73
74
  ℹ dist/query/serialize/dialect/postgres-serializer.js.map  5.59 kB │ gzip: 1.49 kB
74
75
  ℹ dist/packages/fragno/dist/api/request-input-context.js.map  5.39 kB │ gzip: 1.72 kB
@@ -78,7 +79,6 @@
78
79
  ℹ dist/adapters/generic-sql/result-interpreter.js.map  4.94 kB │ gzip: 1.62 kB
79
80
  ℹ dist/fragments/internal-fragment.js  4.94 kB │ gzip: 1.46 kB
80
81
  ℹ dist/query/unit-of-work/retry-policy.js.map  4.93 kB │ gzip: 1.38 kB
81
- ℹ dist/db-fragment-definition-builder.d.ts.map  4.91 kB │ gzip: 2.07 kB
82
82
  ℹ dist/node_modules/.pnpm/rou3@0.7.10/node_modules/rou3/dist/index.js  4.85 kB │ gzip: 1.62 kB
83
83
  ℹ dist/adapters/generic-sql/migration/dialect/postgres.js.map  4.67 kB │ gzip: 1.79 kB
84
84
  ℹ dist/sql-driver/sql-driver-adapter.js.map  4.67 kB │ gzip: 1.61 kB
@@ -106,6 +106,7 @@
106
106
  ℹ dist/query/serialize/sql-serializer.js  3.00 kB │ gzip: 1.09 kB
107
107
  ℹ dist/query/serialize/dialect/mysql-serializer.js  2.94 kB │ gzip: 0.83 kB
108
108
  ℹ dist/adapters/generic-sql/query/cursor-utils.js.map  2.78 kB │ gzip: 1.22 kB
109
+ ℹ dist/query/unit-of-work/execute-unit-of-work.d.ts.map  2.75 kB │ gzip: 1.17 kB
109
110
  ℹ dist/adapters/adapters.js.map  2.71 kB │ gzip: 1.03 kB
110
111
  ℹ dist/adapters/generic-sql/generic-sql-uow-executor.js  2.68 kB │ gzip: 0.85 kB
111
112
  ℹ dist/query/serialize/dialect/postgres-serializer.js  2.65 kB │ gzip: 0.78 kB
@@ -119,7 +120,6 @@
119
120
  ℹ dist/schema/type-conversion/dialect/sqlite.js.map  2.37 kB │ gzip: 0.86 kB
120
121
  ℹ dist/adapters/generic-sql/migration/dialect/postgres.js  2.33 kB │ gzip: 1.02 kB
121
122
  ℹ dist/sql-driver/sql.js.map  2.32 kB │ gzip: 1.03 kB
122
- ℹ dist/query/unit-of-work/execute-unit-of-work.d.ts.map  2.25 kB │ gzip: 0.92 kB
123
123
  ℹ dist/schema/type-conversion/dialect/mysql.js.map  2.23 kB │ gzip: 0.83 kB
124
124
  ℹ dist/packages/fragno/dist/api/request-middleware.js  2.18 kB │ gzip: 0.79 kB
125
125
  ℹ dist/schema/type-conversion/type-mapping.js  2.17 kB │ gzip: 0.94 kB
@@ -209,9 +209,9 @@
209
209
  ℹ dist/adapters/generic-sql/migration/executor.d.ts.map  0.18 kB │ gzip: 0.15 kB
210
210
  ℹ dist/adapters/shared/table-name-mapper.d.ts.map  0.17 kB │ gzip: 0.14 kB
211
211
  ℹ dist/shared/providers.d.ts.map  0.15 kB │ gzip: 0.13 kB
212
- ℹ dist/query/unit-of-work/unit-of-work.d.ts 26.66 kB │ gzip: 6.28 kB
213
- ℹ dist/schema/create.d.ts 19.53 kB │ gzip: 4.76 kB
214
- ℹ dist/db-fragment-definition-builder.d.ts 10.44 kB │ gzip: 2.62 kB
212
+ ℹ dist/query/unit-of-work/unit-of-work.d.ts 27.28 kB │ gzip: 6.41 kB
213
+ ℹ dist/schema/create.d.ts 19.46 kB │ gzip: 4.72 kB
214
+ ℹ dist/db-fragment-definition-builder.d.ts 12.80 kB │ gzip: 3.23 kB
215
215
  ℹ dist/query/simple-query-interface.d.ts  7.58 kB │ gzip: 1.83 kB
216
216
  ℹ dist/mod.d.ts  4.22 kB │ gzip: 1.36 kB
217
217
  ℹ dist/query/cursor.d.ts  3.60 kB │ gzip: 1.31 kB
@@ -226,7 +226,7 @@
226
226
  ℹ dist/adapters/kysely/kysely-adapter.d.ts  0.81 kB │ gzip: 0.39 kB
227
227
  ℹ dist/sql-driver/dialects/dialects.d.ts  0.13 kB │ gzip: 0.08 kB
228
228
  ℹ dist/id.d.ts  0.07 kB │ gzip: 0.07 kB
229
- ℹ dist/query/unit-of-work/execute-unit-of-work.d.ts  5.25 kB │ gzip: 1.60 kB
229
+ ℹ dist/query/unit-of-work/execute-unit-of-work.d.ts  6.97 kB │ gzip: 2.00 kB
230
230
  ℹ dist/fragments/internal-fragment.d.ts  3.88 kB │ gzip: 1.16 kB
231
231
  ℹ dist/adapters/generic-sql/migration/prepared-migrations.d.ts  2.90 kB │ gzip: 0.86 kB
232
232
  ℹ dist/query/unit-of-work/retry-policy.d.ts  2.73 kB │ gzip: 0.76 kB
@@ -245,5 +245,5 @@
245
245
  ℹ dist/shared/providers.d.ts  0.26 kB │ gzip: 0.19 kB
246
246
  ℹ dist/util/types.d.ts  0.26 kB │ gzip: 0.21 kB
247
247
  ℹ dist/sql-driver/dialect-adapter/dialect-adapter.d.ts  0.21 kB │ gzip: 0.16 kB
248
- ℹ 238 files, total: 1109.33 kB
249
- ✔ Build complete in 12506ms
248
+ ℹ 238 files, total: 1143.83 kB
249
+ ✔ Build complete in 12790ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,22 @@
1
1
  # @fragno-dev/db
2
2
 
3
+ ## 0.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - aecfa70: feat(db): allow user callbacks in uow options
8
+ - 3faac77: fix(db): child UOWs not reflecting parent's state after execution
9
+ - 01a9c6d: feat(db): add tx() API for simplified transaction handling
10
+
11
+ Add new tx() method to both service and handler contexts that provides a simpler API for
12
+ transaction handling with automatic retry support. Supports two syntaxes: array syntax for
13
+ multiple service calls and callback syntax for direct UOW access. Also enhances restrict() to
14
+ accept options for controlling readiness signaling.
15
+
16
+ - 5028ad3: fix(db): remove dependency on `node:inspect`
17
+ - 20d824a: fix(db): preserve internal IDs in child UOWs when using two-phase pattern with
18
+ mutationPhase
19
+
3
20
  ## 0.2.0
4
21
 
5
22
  ### Minor Changes
@@ -1,5 +1,5 @@
1
1
  import { AnySchema } from "./schema/create.js";
2
- import { AwaitedPromisesInObject, ExecuteRestrictedUnitOfWorkOptions } from "./query/unit-of-work/execute-unit-of-work.js";
2
+ import { AwaitedPromisesInObject, ExecuteRestrictedUnitOfWorkOptions, HandlerTxCallbacks, ServiceTxCallbacks } from "./query/unit-of-work/execute-unit-of-work.js";
3
3
  import { HookContext, HookFn, HooksMap } from "./hooks/hooks.js";
4
4
  import { IUnitOfWork, TypedUnitOfWork } from "./query/unit-of-work/unit-of-work.js";
5
5
  import { SimpleQueryInterface } from "./query/simple-query-interface.js";
@@ -47,6 +47,26 @@ type DatabaseServiceContext<THooks extends HooksMap> = RequestThisContext & {
47
47
  * @returns TypedUnitOfWork (restricted version without execute methods)
48
48
  */
49
49
  uow<TSchema extends AnySchema>(schema: TSchema): TypedUnitOfWork<TSchema, [], unknown, THooks>;
50
+ /**
51
+ * Execute a transaction with two-phase callbacks (retrieve + mutate).
52
+ *
53
+ * @param schema - Schema to use for the transaction
54
+ * @param callbacks - Object containing retrieve and mutate callbacks
55
+ * @returns Promise resolving to the mutation result with promises awaited 1 level deep
56
+ *
57
+ * @example
58
+ * ```ts
59
+ * return this.tx(schema, {
60
+ * retrieve: (uow) => uow.findFirst("users", ...),
61
+ * mutate: async (uow, [user]) => {
62
+ * await validateUser(user);
63
+ * uow.update("users", user.id, ...).check();
64
+ * return { ok: true };
65
+ * }
66
+ * });
67
+ * ```
68
+ */
69
+ tx<TSchema extends AnySchema, TRetrievalResults extends unknown[], TMutationResult = void>(schema: TSchema, callbacks: ServiceTxCallbacks<TSchema, TRetrievalResults, TMutationResult, THooks>): Promise<AwaitedPromisesInObject<TMutationResult>>;
50
70
  };
51
71
  /**
52
72
  * Handler context for database fragments - provides UOW execution with automatic retry support.
@@ -90,6 +110,40 @@ type DatabaseHandlerContext<THooks extends HooksMap = {}> = RequestThisContext &
90
110
  nonce: string;
91
111
  currentAttempt: number;
92
112
  }) => Promise<TResult> | TResult, options?: Omit<ExecuteRestrictedUnitOfWorkOptions, "createUnitOfWork">): Promise<AwaitedPromisesInObject<TResult>>;
113
+ /**
114
+ * Execute a transaction with automatic retry support.
115
+ * Provides two overloads: array syntax (common case) and callback syntax (advanced).
116
+ *
117
+ * Array syntax - pass a factory function that returns service calls:
118
+ * ```ts
119
+ * const [transfer, notify] = await this.tx(
120
+ * () => [
121
+ * services.transfer({ from, to, amount }),
122
+ * services.notify({ userId, message })
123
+ * ]
124
+ * );
125
+ * ```
126
+ *
127
+ * Callback syntax - for handlers that need direct UOW access:
128
+ * ```ts
129
+ * const result = await this.tx({
130
+ * retrieve: ({ forSchema }) => {
131
+ * const uow = forSchema(schema);
132
+ * uow.find("users", ...);
133
+ * return services.transfer({ ... });
134
+ * },
135
+ * mutate: ({ forSchema }, transferPromise) => {
136
+ * const uow = forSchema(schema);
137
+ * uow.create("auditLog", { ... });
138
+ * return transferPromise;
139
+ * }
140
+ * });
141
+ * ```
142
+ *
143
+ * Note: Handler callbacks are synchronous only to prevent accidentally awaiting services in wrong place.
144
+ */
145
+ tx<T extends readonly unknown[]>(servicesFactory: () => readonly [...{ [K in keyof T]: Promise<T[K]> }], options?: Omit<ExecuteRestrictedUnitOfWorkOptions, "createUnitOfWork">): Promise<{ [K in keyof T]: T[K] }>;
146
+ tx<TRetrieveResult, TMutationResult>(callbacks: HandlerTxCallbacks<TRetrieveResult, TMutationResult, THooks>, options?: Omit<ExecuteRestrictedUnitOfWorkOptions, "createUnitOfWork">): Promise<AwaitedPromisesInObject<TMutationResult>>;
93
147
  };
94
148
  /**
95
149
  * Database fragment context provided to user callbacks.
@@ -1 +1 @@
1
- {"version":3,"file":"db-fragment-definition-builder.d.ts","names":[],"sources":["../src/db-fragment-definition-builder.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"db-fragment-definition-builder.d.ts","names":[],"sources":["../src/db-fragment-definition-builder.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;AAsCA;AASA;;;AAIM,KAbM,8BAAA,GAAiC,kBAavC,GAAA;EAII,eAAA,EAfS,eAeT,CAAA,GAAA,CAAA;CAQgB;;AAM1B;;;AAMsB,KA5BV,4BA4BU,CAAA,gBA5BmC,SA4BnC,CAAA,GAAA;EAAmB;;;EAAU,EAAA,EAxB7C,oBAwB6C,CAxBxB,OAwBwB,CAAA;EAqB9B;;;EAEsB,MAAA,EA3CjC,OA2CiC;EAAmB;;;EACzB,SAAA,EAAA,MAAA;EAAxB;;;EAMD,gBAAA,EAAA,GAAA,GA1Cc,WA0CQ;CAAgB;;;;AAkCgB,KAtEtD,sBAsEsD,CAAA,eAtEhB,QAsEgB,CAAA,GAtEJ,kBAsEI,GAAA;EAClD;;;;;EAGa,GAAA,CAAA,gBApEP,SAoEO,CAAA,CAAA,MAAA,EApEY,OAoEZ,CAAA,EApEsB,eAoEtB,CApEsC,OAoEtC,EAAA,EAAA,EAAA,OAAA,EApE4D,MAoE5D,CAAA;EACF;;;;;;;;;;;;;;;;;;;EA8CO,EAAA,CAAA,gBA9Fb,SA8Fa,EAAA,0BAAA,OAAA,EAAA,EAAA,kBAAA,IAAA,CAAA,CAAA,MAAA,EA7FtB,OA6FsB,EAAA,SAAA,EA5FnB,kBA4FmB,CA5FA,OA4FA,EA5FS,iBA4FT,EA5F4B,eA4F5B,EA5F6C,MA4F7C,CAAA,CAAA,EA3F7B,OA2F6B,CA3FrB,uBA2FqB,CA3FG,eA2FH,CAAA,CAAA;CAAiB;;;;AACrC,KAtFF,sBAsFE,CAAA,eAtFoC,QAsFpC,GAAA,CAAA,CAAA,CAAA,GAtFqD,kBAsFrD,GAAA;EACuB;;;;AAMrC;;;;;;AAoCA;AAUA;;;;;;;;;;;;;;;;;;;;EAgCiB,GAAA,CAAA,OAAA,CAAA,CAAA,QAAA,EAAA,CAAA,OAAA,EAAA;IAaL,SAAA,EAAA,CAAA,gBAtJsB,SAsJtB,EAAA,UAtJ2C,QAsJ3C,GAtJsD,MAsJtD,CAAA,CAAA,MAAA,EArJI,OAqJJ,EAAA,KAAA,CAAA,EApJI,CAoJJ,EAAA,GAnJD,eAmJC,CAnJe,OAmJf,EAAA,EAAA,EAAA,OAAA,EAnJqC,CAmJrC,CAAA;IAGE,eAAA,EAAA,GAAA,GArJe,OAqJf,CAAA,IAAA,CAAA;IACC,aAAA,EAAA,GAAA,GArJY,OAqJZ,CAAA,IAAA,CAAA;IACL,KAAA,EAAA,MAAA;IAcI,cAAA,EAAA,MAAA;EACC,CAAA,EAAA,GAlKL,OAkKK,CAlKG,OAkKH,CAAA,GAlKc,OAkKd,EAAA,OAAA,CAAA,EAjKD,IAiKC,CAjKI,kCAiKJ,EAAA,kBAAA,CAAA,CAAA,EAhKV,OAgKU,CAhKF,uBAgKE,CAhKsB,OAgKtB,CAAA,CAAA;EACgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0E3B,EAAA,CAAA,UAAA,SAAA,OAAA,EAAA,CAAA,CAAA,eAAA,EAAA,GAAA,GAAA,SAAA,CAAA,GAAA,QACA,MAxMkD,CAwMlD,GAxMsD,OAwMtD,CAxM8D,CAwM9D,CAxMgE,CAwMhE,CAAA,CAAA,EAXC,CAAA,EAAA,OAAA,CAAA,EA5LS,IA4LT,CA5Lc,kCA4Ld,EAAA,kBAAA,CAAA,CAAA,EA3LA,OA2LA,CAAA,QAwBY,MAnNU,CAmNV,GAnNc,CAmNd,CAnNgB,CAmNhB,CAAA,EAEX,CAAA;EACA,EAAA,CAAA,eAAA,EAAA,eAAA,CAAA,CAAA,SAAA,EAnNS,kBAmNT,CAnN4B,eAmN5B,EAnN6C,eAmN7C,EAnN8D,MAmN9D,CAAA,EAAA,OAAA,CAAA,EAlNQ,IAkNR,CAlNa,kCAkNb,EAAA,kBAAA,CAAA,CAAA,EAjND,OAiNC,CAjNO,uBAiNP,CAjN+B,eAiN/B,CAAA,CAAA;CACA;;;;AAIA,KAhNM,uBAgNN,CAAA,gBAhN8C,SAgN9C,CAAA,GAAA;EAPE;;;EAYJ,eAAA,EAjNe,eAiNf,CAAA,GAAA,CAAA;EACA;;;EACmC,EAAA,EA/MjC,oBA+MiC,CA/MZ,OA+MY,CAAA;CACnC;;;;AAIA,KAxLQ,sBAAA,GAwLR;EACA,GAAA,EAxLG,WAwLH;CAXC;;;;;;;AAyCC,cA7MO,iCA6MP,CAAA,gBA5MY,SA4MZ,EAAA,OAAA,EAAA,KAAA,EAAA,aAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,gBAAA,EAAA,eArMW,QAqMX,GAAA,CAAA,CAAA,EAAA,4BApMwB,kBAoMxB,GApM6C,sBAoM7C,EAAA,4BAnMwB,kBAmMxB,GAnM6C,sBAmM7C,EAAA,yBAlMqB,MAkMrB,CAAA,MAAA,EAlMoC,6BAkMpC,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA;EACA,CAAA,OAAA;EAPE,WAAA,CAAA,WAAA,EAvKS,yBAuKT,CAtKF,OAsKE,EArKF,8BAqKE,EApKF,KAoKE,EAnKF,aAmKE,EAlKF,SAkKE,EAjKF,oBAiKE,EAhKF,gBAgKE,EA/JF,mBA+JE,EA9JF,mBA8JE,EA7JF,sBA6JE,EA5JF,gBA4JE,CAAA,EAAA,MAAA,EA1JI,OA0JJ,EAAA,SAAA,CAAA,EAAA,MAAA,EAAA,YAYJ,CAZI,EAAA,CAAA,OAAA,EAAA;IAUJ,MAAA,EAjKU,OAiKV;IACA,OAAA,EAjKW,8BAiKX;EACA,CAAA,EAAA,GAjKM,MAiKN;EACA;;;;EAG2B,gBAAA,CAAA,QAAA,CAAA,CAAA,EAAA,EAAA,CAAA,OAAA,EAAA;IAAe,MAAA,EAvJhC,OAuJgC;IAC1C,OAAA,EAvJW,8BAuJX;IACA,EAAA,EAvJM,oBAuJN,CAvJ2B,OAuJ3B,CAAA;IACA,eAAA,EAvJmB,eAuJnB,CAAA,GAAA,CAAA;EACA,CAAA,EAAA,GAvJM,QAuJN,CAAA,EAtJC,iCAsJD,CArJA,OAqJA,EApJA,OAoJA,EAnJA,QAmJA,GAnJW,4BAmJX,CAnJwC,OAmJxC,CAAA,EAAA,CAAA,CAAA,EAAA,CAAA,CAAA,EAhJA,oBAgJA,EAAA,CAAA,CAAA,EA9IA,MA8IA,EA7IA,mBA6IA,EA5IA,mBA4IA,EA3IA,gBA2IA,CAAA;EAXC,mBAAA,CAAA,WAAA,CAAA,CAAA,EAAA,EAvFG,oBAuFH,CAtFC,OAsFD,EArFC,8BAqFD,EApFC,KAoFD,EAnFC,oBAmFD,EAlFC,gBAkFD,EAjFC,WAiFD,EAhFC,mBAgFD,CAAA,CAAA,EA9EA,iCA8EA,CA7ED,OA6EC,EA5ED,OA4EC,EA3ED,KA2EC,EA1ED,WA0EC,EAzED,SAyEC,EAxED,oBAwEC,EAvED,gBAuEC,EAtED,MAsEC,EArED,mBAqEC,EApED,mBAoEC,EAnED,gBAmEC,CAAA;EA2C4B,eAAA,CAAA,qBAAA,MAAA,EAAA,QAAA,CAAA,CAAA,WAAA,EAjGhB,YAiGgB,EAAA,EAAA,EAhGzB,oBAgGyB,CA/F3B,OA+F2B,EA9F3B,8BA8F2B,EA7F3B,KA6F2B,EA5F3B,oBA4F2B,EA3F3B,gBA2F2B,EA1F3B,QA0F2B,EAzF3B,mBAyF2B,CAAA,CAAA,EAvF5B,iCAuF4B,CAtF7B,OAsF6B,EArF7B,OAqF6B,EApF7B,KAoF6B,EAnF7B,aAmF6B,EAlF7B,SAkF6B,GAAA,QAlFT,YAoFV,GApFyB,QAoFzB,EACC,EApFX,oBAoFW,EAnFX,gBAmFW,EAlFX,MAkFW,EAjFX,mBAiFW,EAhFX,mBAgFW,EA/EX,gBA+EW,CAAA;EAEM;;;;;;;EAKjB,sBAAA,CAAA,qBAAA,MAAA,EAAA,QAAA,CAAA,CAAA,WAAA,EA/Da,YA+Db,EAAA,EAAA,EA9DI,oBA8DJ,CA7DE,OA6DF,EA5DE,8BA4DF,EA3DE,KA2DF,EA1DE,oBA0DF,EAzDE,gBAyDF,EAxDE,QAwDF,EAvDE,mBAuDF,CAAA,CAAA,EArDC,iCAqDD,CApDA,OAoDA,EAnDA,OAmDA,EAlDA,KAkDA,EAjDA,aAiDA,EAhDA,SAgDA,EA/CA,oBA+CA,EA9CA,gBA8CA,GAAA,QA9C2B,YA+C3B,GA/C0C,QA+C1C,EACA,EA/CA,MA+CA,EA9CA,mBA8CA,EA7CA,mBA6CA,EA5CA,gBA4CA,CAAA;EACA;;;;;;;;;;;;;;;;;EA+D8C,YAAA,CAAA,kBA5EjB,QA4EiB,CAAA,CAAA,EAAA,EAAA,CAAA,OAAA,EAAA;IAC9C,MAAA,EA3EU,OA2EV;IACA,OAAA,EA3EW,8BA2EX;IACA,UAAA,EAAA,CAAA,QAAA,CAAA,CAAA,IAAA,EAAA,CAAA,IAAA,EA1EiB,WA0EjB,EAAA,OAAA,EA1EuC,QA0EvC,EAAA,GAAA,IAAA,GA1E2D,OA0E3D,CAAA,IAAA,CAAA,EAAA,GAzEO,MAyEP,CAzEc,QAyEd,CAAA;EACA,CAAA,EAAA,GAzEM,SAyEN,CAAA,EAxEC,iCAwED,CAvEA,OAuEA,EAtEA,OAsEA,EArEA,KAqEA,EApEA,aAoEA,EAnEA,SAmEA,EAlEA,oBAkEA,EAjEA,gBAiEA,EAhEA,SAgEA,EA/DA,sBA+DA,CA/DuB,SA+DvB,CAAA,EA9DA,mBA8DA,EA7DA,gBA6DA,CAAA;EACA;;;;EAoBA,WAAA,CAAA,qBAAA,MAAA,EAAA,QAAA,CAAA,CAAA,WAAA,EAhCa,YAgCb,CAAA,EA/BC,iCA+BD,CA9BA,OA8BA,EA7BA,OA6BA,EA5BA,KA4BA,EA3BA,aA2BA,EA1BA,SA0BA,EAzBA,oBAyBA,GAAA,QAzB+B,YA0B/B,GA1B8C,QA0B9C,EACA,EA1BA,gBA0BA,EAzBA,MAyBA,EAxBA,mBAwBA,EAvBA,mBAuBA,EAtBA,gBAsBA,CAAA;EACA;;;;EAEA,mBAAA,CAAA,qBAAA,MAAA,EAAA,QAAA,CAAA,CAAA,WAAA,EARa,YAQb,CAAA,EAPC,iCAOD,CANA,OAMA,EALA,OAKA,EAJA,KAIA,EAHA,aAGA,EAFA,SAEA,EADA,oBACA,GAAA,QAD+B,YAE/B,GAF8C,QAE9C,GAAA,SAAA,EACA,EAFA,gBAEA,EADA,MACA,EAAA,mBAAA,EACA,mBADA,EAEA,gBAFA,CAAA;EACA;;;;;EAuBA,KAAA,CAAA,CAAA,EAHO,kBAGP,CAFA,OAEA,EADA,8BACA,EAAA,KAAA,EACA,aADA,EAEA,SAFA,EAGA,oBAHA,EAIA,gBAJA,EAKA,sBALA,CAKuB,MALvB,CAAA,EAMA,sBANA,CAMuB,MANvB,CAAA,EAOA,sBAPA,EAQA,gBARA,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import "./query/unit-of-work/unit-of-work.js";
2
- import { executeRestrictedUnitOfWork } from "./query/unit-of-work/execute-unit-of-work.js";
2
+ import { executeRestrictedUnitOfWork, executeServiceTx, executeTxArray, executeTxCallbacks } from "./query/unit-of-work/execute-unit-of-work.js";
3
3
  import { prepareHookMutations, processHooks } from "./hooks/hooks.js";
4
4
 
5
5
  //#region src/db-fragment-definition-builder.ts
@@ -174,13 +174,23 @@ var DatabaseFragmentDefinitionBuilder = class DatabaseFragmentDefinitionBuilder
174
174
  if (!uow$1) throw new Error("No UnitOfWork in context. Service must be called within a route handler OR using `withUnitOfWork`.");
175
175
  return uow$1.restrict().forSchema(schema);
176
176
  }
177
- const serviceContext = { uow: forSchema };
177
+ const serviceTx = async (schema, callbacks) => {
178
+ const uow$1 = storage.getStore()?.uow;
179
+ if (!uow$1) throw new Error("No UnitOfWork in context. Service must be called within a route handler OR using `withUnitOfWork`.");
180
+ return executeServiceTx(schema, callbacks, uow$1);
181
+ };
182
+ const serviceContext = {
183
+ uow: forSchema,
184
+ tx: serviceTx
185
+ };
178
186
  async function uow(callback, execOptions) {
179
187
  const currentStorage = storage.getStore();
180
188
  if (!currentStorage) throw new Error("No storage in context. Handler must be called within a request context.");
181
189
  const wrappedCallback = async (context) => {
182
190
  return callback(context);
183
191
  };
192
+ const userOnBeforeMutate = execOptions?.onBeforeMutate;
193
+ const userOnSuccess = execOptions?.onSuccess;
184
194
  return executeRestrictedUnitOfWork(wrappedCallback, {
185
195
  ...execOptions,
186
196
  createUnitOfWork: () => {
@@ -188,13 +198,47 @@ var DatabaseFragmentDefinitionBuilder = class DatabaseFragmentDefinitionBuilder
188
198
  if (hooksConfig) currentStorage.uow.registerSchema(hooksConfig.internalFragment.$internal.deps.schema, hooksConfig.internalFragment.$internal.deps.namespace);
189
199
  return currentStorage.uow;
190
200
  },
191
- onBeforeMutate: hooksConfig ? (uow$1) => prepareHookMutations(uow$1, hooksConfig) : void 0,
192
- onSuccess: hooksConfig ? () => processHooks(hooksConfig) : void 0
201
+ onBeforeMutate: (uow$1) => {
202
+ if (hooksConfig) prepareHookMutations(uow$1, hooksConfig);
203
+ if (userOnBeforeMutate) userOnBeforeMutate(uow$1);
204
+ },
205
+ onSuccess: async (uow$1) => {
206
+ if (hooksConfig) await processHooks(hooksConfig);
207
+ if (userOnSuccess) await userOnSuccess(uow$1);
208
+ }
193
209
  });
194
210
  }
211
+ async function handlerTx(factoryOrCallbacks, execOptions) {
212
+ const currentStorage = storage.getStore();
213
+ if (!currentStorage) throw new Error("No storage in context. Handler must be called within a request context.");
214
+ const userOnBeforeMutate = execOptions?.onBeforeMutate;
215
+ const userOnSuccess = execOptions?.onSuccess;
216
+ const createUow = () => {
217
+ currentStorage.uow.reset();
218
+ if (hooksConfig) currentStorage.uow.registerSchema(hooksConfig.internalFragment.$internal.deps.schema, hooksConfig.internalFragment.$internal.deps.namespace);
219
+ return currentStorage.uow;
220
+ };
221
+ const options$1 = {
222
+ ...execOptions,
223
+ createUnitOfWork: createUow,
224
+ onBeforeMutate: (uow$1) => {
225
+ if (hooksConfig) prepareHookMutations(uow$1, hooksConfig);
226
+ if (userOnBeforeMutate) userOnBeforeMutate(uow$1);
227
+ },
228
+ onSuccess: async (uow$1) => {
229
+ if (hooksConfig) await processHooks(hooksConfig);
230
+ if (userOnSuccess) await userOnSuccess(uow$1);
231
+ }
232
+ };
233
+ if (typeof factoryOrCallbacks === "function") return executeTxArray(factoryOrCallbacks, options$1);
234
+ else return executeTxCallbacks(factoryOrCallbacks, options$1);
235
+ }
195
236
  return {
196
237
  serviceContext,
197
- handlerContext: { uow }
238
+ handlerContext: {
239
+ uow,
240
+ tx: handlerTx
241
+ }
198
242
  };
199
243
  }).build(),
200
244
  dependencies
@@ -1 +1 @@
1
- {"version":3,"file":"db-fragment-definition-builder.js","names":["#baseBuilder","#schema","#namespace","#hooksFactory","implicitDeps: ImplicitDatabaseDependencies<TSchema>","uow","serviceContext: DatabaseServiceContext<THooks>"],"sources":["../src/db-fragment-definition-builder.ts"],"sourcesContent":["import type { AnySchema } from \"./schema/create\";\nimport type { SimpleQueryInterface } from \"./query/simple-query-interface\";\nimport type { DatabaseAdapter } from \"./adapters/adapters\";\nimport type { IUnitOfWork } from \"./query/unit-of-work/unit-of-work\";\nimport { TypedUnitOfWork, UnitOfWork } from \"./query/unit-of-work/unit-of-work\";\nimport type {\n RequestThisContext,\n FragnoPublicConfig,\n AnyFragnoInstantiatedFragment,\n} from \"@fragno-dev/core\";\nimport {\n FragmentDefinitionBuilder,\n type FragmentDefinition,\n type ServiceConstructorFn,\n} from \"@fragno-dev/core\";\nimport {\n executeRestrictedUnitOfWork,\n type AwaitedPromisesInObject,\n type ExecuteRestrictedUnitOfWorkOptions,\n} from \"./query/unit-of-work/execute-unit-of-work\";\nimport {\n prepareHookMutations,\n processHooks,\n type HooksMap,\n type HookFn,\n type HookContext,\n} from \"./hooks/hooks\";\nimport type { InternalFragmentInstance } from \"./fragments/internal-fragment\";\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 * Implicit dependencies that database fragments get automatically.\n * These are injected without requiring explicit configuration.\n */\nexport type ImplicitDatabaseDependencies<TSchema extends AnySchema> = {\n /**\n * Database query engine for the fragment's schema.\n */\n db: SimpleQueryInterface<TSchema>;\n /**\n * The schema definition for this fragment.\n */\n schema: TSchema;\n /**\n * The database namespace for this fragment.\n */\n namespace: string;\n /**\n * Create a new Unit of Work for database operations.\n */\n createUnitOfWork: () => IUnitOfWork;\n};\n\n/**\n * Service context for database fragments - provides restricted UOW access without execute methods.\n */\nexport type DatabaseServiceContext<THooks extends HooksMap> = RequestThisContext & {\n /**\n * Get a typed, restricted Unit of Work for the given schema.\n * @param schema - Schema to get a typed view for\n * @returns TypedUnitOfWork (restricted version without execute methods)\n */\n uow<TSchema extends AnySchema>(schema: TSchema): TypedUnitOfWork<TSchema, [], unknown, THooks>;\n};\n\n/**\n * Handler context for database fragments - provides UOW execution with automatic retry support.\n */\nexport type DatabaseHandlerContext<THooks extends HooksMap = {}> = RequestThisContext & {\n /**\n * Execute a Unit of Work with explicit phase control and automatic retry support.\n * This method provides an API where users call forSchema to create a schema-specific\n * UOW, then call executeRetrieve() and executeMutate() to execute the phases. The entire\n * callback is re-executed on optimistic concurrency conflicts, ensuring retries work properly.\n * Automatically provides the UOW factory from context.\n * Promises in the returned object are awaited 1 level deep.\n *\n * @param callback - Async function that receives a context with forSchema, executeRetrieve, executeMutate, nonce, and currentAttempt\n * @param options - Optional configuration for retry policy and abort signal\n * @returns Promise resolving to the callback's return value with promises awaited 1 level deep\n * @throws Error if retries are exhausted or callback throws an error\n *\n * @example\n * ```ts\n * const result = await this.uow(async ({ forSchema, executeRetrieve, executeMutate, nonce, currentAttempt }) => {\n * const uow = forSchema(schema);\n * const userId = uow.create(\"users\", { name: \"John\" });\n *\n * // Execute retrieval phase\n * await executeRetrieve();\n *\n * const profileId = uow.create(\"profiles\", { userId });\n *\n * // Execute mutation phase\n * await executeMutate();\n *\n * return { userId, profileId };\n * });\n * ```\n */\n uow<TResult>(\n callback: (context: {\n forSchema: <TSchema extends AnySchema, H extends HooksMap = THooks>(\n schema: TSchema,\n hooks?: H,\n ) => TypedUnitOfWork<TSchema, [], unknown, H>;\n executeRetrieve: () => Promise<void>;\n executeMutate: () => Promise<void>;\n nonce: string;\n currentAttempt: number;\n }) => Promise<TResult> | TResult,\n options?: Omit<ExecuteRestrictedUnitOfWorkOptions, \"createUnitOfWork\">,\n ): Promise<AwaitedPromisesInObject<TResult>>;\n};\n\n/**\n * Database fragment context provided to user callbacks.\n */\nexport type DatabaseFragmentContext<TSchema extends AnySchema> = {\n /**\n * Database adapter instance.\n */\n databaseAdapter: DatabaseAdapter<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n /**\n * ORM query engine for the fragment's schema.\n */\n db: SimpleQueryInterface<TSchema>;\n};\n\n/**\n * Create database context from options.\n * This extracts the database adapter and creates the ORM instance.\n */\nfunction createDatabaseContext<TSchema extends AnySchema>(\n options: FragnoPublicConfigWithDatabase,\n schema: TSchema,\n namespace: string,\n): DatabaseFragmentContext<TSchema> {\n const databaseAdapter = options.databaseAdapter;\n\n if (!databaseAdapter) {\n throw new Error(\n \"Database fragment requires a database adapter to be provided in options.databaseAdapter\",\n );\n }\n\n const db = databaseAdapter.createQueryEngine(schema, namespace);\n\n return { databaseAdapter, db };\n}\n\n/**\n * Storage type for database fragments - stores the Unit of Work.\n */\nexport type DatabaseRequestStorage = {\n uow: IUnitOfWork;\n};\n\n/**\n * Builder for database fragments that wraps the core fragment builder\n * and provides database-specific functionality.\n *\n * Database fragments always require FragnoPublicConfigWithDatabase (which includes databaseAdapter).\n */\nexport class DatabaseFragmentDefinitionBuilder<\n TSchema extends AnySchema,\n TConfig,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n THooks extends HooksMap = {},\n TServiceThisContext extends RequestThisContext = DatabaseHandlerContext,\n THandlerThisContext extends RequestThisContext = DatabaseHandlerContext,\n TLinkedFragments extends Record<string, AnyFragnoInstantiatedFragment> = {},\n> {\n // Store the base builder - we'll replace its storage and context setup when building\n #baseBuilder: FragmentDefinitionBuilder<\n TConfig,\n FragnoPublicConfigWithDatabase,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n TServiceThisContext,\n THandlerThisContext,\n DatabaseRequestStorage,\n TLinkedFragments\n >;\n #schema: TSchema;\n #namespace: string;\n #hooksFactory?: (context: { config: TConfig; options: FragnoPublicConfigWithDatabase }) => THooks;\n\n constructor(\n baseBuilder: FragmentDefinitionBuilder<\n TConfig,\n FragnoPublicConfigWithDatabase,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n TServiceThisContext,\n THandlerThisContext,\n DatabaseRequestStorage,\n TLinkedFragments\n >,\n schema: TSchema,\n namespace?: string,\n hooksFactory?: (context: {\n config: TConfig;\n options: FragnoPublicConfigWithDatabase;\n }) => THooks,\n ) {\n this.#baseBuilder = baseBuilder;\n this.#schema = schema;\n this.#namespace = namespace ?? baseBuilder.name;\n this.#hooksFactory = hooksFactory;\n }\n\n /**\n * Define dependencies for this database fragment.\n * The context includes database adapter and ORM instance.\n */\n withDependencies<TNewDeps>(\n fn: (context: {\n config: TConfig;\n options: FragnoPublicConfigWithDatabase;\n db: SimpleQueryInterface<TSchema>;\n databaseAdapter: DatabaseAdapter<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n }) => TNewDeps,\n ): DatabaseFragmentDefinitionBuilder<\n TSchema,\n TConfig,\n TNewDeps & ImplicitDatabaseDependencies<TSchema>,\n {},\n {},\n TServiceDependencies,\n {},\n THooks,\n TServiceThisContext,\n THandlerThisContext,\n TLinkedFragments\n > {\n // Wrap user function to inject DB context\n const wrappedFn = (context: { config: TConfig; options: FragnoPublicConfigWithDatabase }) => {\n const dbContext = createDatabaseContext(context.options, this.#schema, this.#namespace);\n\n // Call user function with enriched context\n const userDeps = fn({\n config: context.config,\n options: context.options,\n db: dbContext.db,\n databaseAdapter: dbContext.databaseAdapter,\n });\n\n // Create implicit dependencies\n const createUow = () => dbContext.db.createUnitOfWork();\n const implicitDeps: ImplicitDatabaseDependencies<TSchema> = {\n db: dbContext.db,\n schema: this.#schema,\n namespace: this.#namespace,\n createUnitOfWork: createUow,\n };\n\n return {\n ...userDeps,\n ...implicitDeps,\n };\n };\n\n // Create new base builder with wrapped function\n const newBaseBuilder = this.#baseBuilder.withDependencies(wrappedFn);\n\n return new DatabaseFragmentDefinitionBuilder(\n newBaseBuilder,\n this.#schema,\n this.#namespace,\n this.#hooksFactory,\n );\n }\n\n providesBaseService<TNewService>(\n fn: ServiceConstructorFn<\n TConfig,\n FragnoPublicConfigWithDatabase,\n TDeps,\n TServiceDependencies,\n TPrivateServices,\n TNewService,\n TServiceThisContext\n >,\n ): DatabaseFragmentDefinitionBuilder<\n TSchema,\n TConfig,\n TDeps,\n TNewService,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n THooks,\n TServiceThisContext,\n THandlerThisContext,\n TLinkedFragments\n > {\n const newBaseBuilder = this.#baseBuilder.providesBaseService<TNewService>(fn);\n\n return new DatabaseFragmentDefinitionBuilder(\n newBaseBuilder,\n this.#schema,\n this.#namespace,\n this.#hooksFactory,\n );\n }\n\n providesService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n fn: ServiceConstructorFn<\n TConfig,\n FragnoPublicConfigWithDatabase,\n TDeps,\n TServiceDependencies,\n TPrivateServices,\n TService,\n TServiceThisContext\n >,\n ): DatabaseFragmentDefinitionBuilder<\n TSchema,\n TConfig,\n TDeps,\n TBaseServices,\n TServices & { [K in TServiceName]: TService },\n TServiceDependencies,\n TPrivateServices,\n THooks,\n TServiceThisContext,\n THandlerThisContext,\n TLinkedFragments\n > {\n const newBaseBuilder = this.#baseBuilder.providesService<TServiceName, TService>(\n serviceName,\n fn,\n );\n\n return new DatabaseFragmentDefinitionBuilder(\n newBaseBuilder,\n this.#schema,\n this.#namespace,\n this.#hooksFactory,\n );\n }\n\n /**\n * Provide a private service that is only accessible to the fragment author.\n * Private services are NOT exposed on the fragment instance, but can be used\n * when defining other services (baseServices, namedServices, and other privateServices).\n * Private services are instantiated in order, so earlier private services are available\n * to later ones.\n */\n providesPrivateService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n fn: ServiceConstructorFn<\n TConfig,\n FragnoPublicConfigWithDatabase,\n TDeps,\n TServiceDependencies,\n TPrivateServices,\n TService,\n TServiceThisContext\n >,\n ): DatabaseFragmentDefinitionBuilder<\n TSchema,\n TConfig,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices & { [K in TServiceName]: TService },\n THooks,\n TServiceThisContext,\n THandlerThisContext,\n TLinkedFragments\n > {\n const newBaseBuilder = this.#baseBuilder.providesPrivateService<TServiceName, TService>(\n serviceName,\n fn,\n );\n\n return new DatabaseFragmentDefinitionBuilder(\n newBaseBuilder,\n this.#schema,\n this.#namespace,\n this.#hooksFactory,\n );\n }\n\n /**\n * Define durable hooks for this fragment.\n * Hooks are automatically persisted and retried on failure.\n *\n * @param fn - Function that receives defineHook helper and returns a hooks map\n * @returns Builder with hooks type set\n *\n * @example\n * ```ts\n * .provideHooks(({ defineHook, config }) => ({\n * onSubscribe: defineHook(async function (payload: { email: string }) {\n * // 'this' context available (HookServiceContext with nonce)\n * await config.onSubscribe?.(payload.email);\n * }),\n * }))\n * ```\n */\n provideHooks<TNewHooks extends HooksMap>(\n fn: (context: {\n config: TConfig;\n options: FragnoPublicConfigWithDatabase;\n defineHook: <TPayload>(\n hook: (this: HookContext, payload: TPayload) => void | Promise<void>,\n ) => HookFn<TPayload>;\n }) => TNewHooks,\n ): DatabaseFragmentDefinitionBuilder<\n TSchema,\n TConfig,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n TNewHooks,\n DatabaseServiceContext<TNewHooks>,\n THandlerThisContext,\n TLinkedFragments\n > {\n const defineHook = <TPayload>(\n hook: (this: HookContext, payload: TPayload) => void | Promise<void>,\n ): HookFn<TPayload> => {\n return hook;\n };\n\n // Store the hooks factory - it will be called in build() with config/options\n const hooksFactory = (context: {\n config: TConfig;\n options: FragnoPublicConfigWithDatabase;\n }) => {\n return fn({\n config: context.config,\n options: context.options,\n defineHook,\n });\n };\n\n // Create new builder with hooks factory stored\n // Cast is safe: we're only changing THooks and TServiceThisContext type parameters\n const newBuilder = new DatabaseFragmentDefinitionBuilder(\n this.#baseBuilder,\n this.#schema,\n this.#namespace,\n ) as unknown as DatabaseFragmentDefinitionBuilder<\n TSchema,\n TConfig,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n TNewHooks,\n DatabaseServiceContext<TNewHooks>,\n THandlerThisContext,\n TLinkedFragments\n >;\n\n newBuilder.#hooksFactory = hooksFactory;\n\n return newBuilder;\n }\n\n /**\n * Declare that this fragment uses a required service provided by the runtime.\n * Delegates to the base builder.\n */\n usesService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n ): DatabaseFragmentDefinitionBuilder<\n TSchema,\n TConfig,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies & { [K in TServiceName]: TService },\n TPrivateServices,\n THooks,\n TServiceThisContext,\n THandlerThisContext,\n TLinkedFragments\n > {\n const newBaseBuilder = this.#baseBuilder.usesService<TServiceName, TService>(serviceName);\n\n return new DatabaseFragmentDefinitionBuilder(\n newBaseBuilder,\n this.#schema,\n this.#namespace,\n this.#hooksFactory,\n );\n }\n\n /**\n * Declare that this fragment uses an optional service provided by the runtime.\n * Delegates to the base builder.\n */\n usesOptionalService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n ): DatabaseFragmentDefinitionBuilder<\n TSchema,\n TConfig,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies & { [K in TServiceName]: TService | undefined },\n TPrivateServices,\n THooks,\n TServiceThisContext,\n THandlerThisContext,\n TLinkedFragments\n > {\n const newBaseBuilder = this.#baseBuilder.usesOptionalService<TServiceName, TService>(\n serviceName,\n );\n\n return new DatabaseFragmentDefinitionBuilder(\n newBaseBuilder,\n this.#schema,\n this.#namespace,\n this.#hooksFactory,\n );\n }\n\n /**\n * Build the final database fragment definition.\n * This includes the request context setup for UnitOfWork management.\n * Note: TDeps already includes ImplicitDatabaseDependencies from withDatabase().\n */\n build(): FragmentDefinition<\n TConfig,\n FragnoPublicConfigWithDatabase,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n DatabaseServiceContext<THooks>,\n DatabaseHandlerContext<THooks>,\n DatabaseRequestStorage,\n TLinkedFragments\n > {\n const baseDef = this.#baseBuilder.build();\n\n // Ensure dependencies callback always exists for database fragments\n // If no user dependencies were defined, create a minimal one that only adds implicit deps\n const dependencies = (context: {\n config: TConfig;\n options: FragnoPublicConfigWithDatabase;\n }): TDeps => {\n // In dry run mode, allow user deps to fail gracefully.\n // This is critical for database fragments because the CLI needs access to the schema\n // even when user dependencies (like API clients) can't be initialized.\n // Without this, if user deps fail, we'd lose the implicit database dependencies\n // (including schema), and the CLI couldn't extract schema information.\n let userDeps;\n try {\n userDeps = baseDef.dependencies?.(context);\n } catch (error) {\n if (process.env[\"FRAGNO_INIT_DRY_RUN\"] === \"true\") {\n console.warn(\n \"Warning: Failed to initialize user dependencies in dry run mode:\",\n error instanceof Error ? error.message : String(error),\n );\n userDeps = {};\n } else {\n throw error;\n }\n }\n\n const { db } = createDatabaseContext(context.options, this.#schema, this.#namespace);\n\n const implicitDeps: ImplicitDatabaseDependencies<TSchema> = {\n db,\n schema: this.#schema,\n namespace: this.#namespace,\n createUnitOfWork: () => db.createUnitOfWork(),\n };\n\n return {\n ...userDeps,\n ...implicitDeps,\n } as TDeps;\n };\n\n // Use the adapter's shared context storage (all fragments using the same adapter share this storage)\n const builderWithExternalStorage = this.#baseBuilder.withExternalRequestStorage(\n ({ options }) => {\n const dbContext = createDatabaseContext(options, this.#schema, this.#namespace);\n return dbContext.databaseAdapter.contextStorage;\n },\n );\n\n // Set up request storage to initialize the Unit of Work\n const builderWithStorage = builderWithExternalStorage.withRequestStorage(\n ({ options }): DatabaseRequestStorage => {\n // Create database context - needed here to create the UOW\n const dbContextForStorage = createDatabaseContext(options, this.#schema, this.#namespace);\n\n // Create a new Unit of Work for this request\n const uow: IUnitOfWork = dbContextForStorage.db.createUnitOfWork();\n\n return { uow };\n },\n );\n\n // Get the internal fragment factory from linked fragments (added by withDatabase)\n // Cast is safe: withDatabase() guarantees this fragment exists and has the correct type\n const internalFragmentFactory = baseDef.linkedFragments?.[\"_fragno_internal\"] as (context: {\n config: TConfig;\n options: FragnoPublicConfigWithDatabase;\n }) => InternalFragmentInstance;\n\n const builderWithContext = builderWithStorage.withThisContext<\n DatabaseServiceContext<THooks>,\n DatabaseHandlerContext<THooks>\n >(({ storage, config, options }) => {\n // Create hooks config if hooks factory is defined\n const hooksConfig = this.#hooksFactory\n ? {\n hooks: this.#hooksFactory({ config, options }),\n namespace: this.#namespace,\n internalFragment: internalFragmentFactory({ config, options }),\n }\n : undefined;\n\n function forSchema<TSchema extends AnySchema>(\n schema: TSchema,\n ): TypedUnitOfWork<TSchema, [], unknown, THooks> {\n const uow = storage.getStore()?.uow;\n if (!uow) {\n throw new Error(\n \"No UnitOfWork in context. Service must be called within a route handler OR using `withUnitOfWork`.\",\n );\n }\n\n return uow.restrict().forSchema<TSchema, THooks>(schema);\n }\n\n const serviceContext: DatabaseServiceContext<THooks> = {\n uow: forSchema,\n };\n\n async function uow<TResult>(\n callback: (context: {\n forSchema: <S extends AnySchema, H extends HooksMap = THooks>(\n schema: S,\n hooks?: H,\n ) => TypedUnitOfWork<S, [], unknown, H>;\n executeRetrieve: () => Promise<void>;\n executeMutate: () => Promise<void>;\n nonce: string;\n currentAttempt: number;\n }) => Promise<TResult> | TResult,\n execOptions?: Omit<\n ExecuteRestrictedUnitOfWorkOptions,\n \"createUnitOfWork\" | \"onBeforeMutate\" | \"onSuccess\"\n >,\n ): Promise<AwaitedPromisesInObject<TResult>> {\n const currentStorage = storage.getStore();\n if (!currentStorage) {\n throw new Error(\n \"No storage in context. Handler must be called within a request context.\",\n );\n }\n\n const wrappedCallback = async (context: {\n forSchema: <S extends AnySchema, H extends HooksMap = THooks>(\n schema: S,\n hooks?: H,\n ) => TypedUnitOfWork<S, [], unknown, H>;\n executeRetrieve: () => Promise<void>;\n executeMutate: () => Promise<void>;\n nonce: string;\n currentAttempt: number;\n }): Promise<TResult> => {\n return callback(context);\n };\n\n return executeRestrictedUnitOfWork(wrappedCallback, {\n ...execOptions,\n createUnitOfWork: () => {\n currentStorage.uow.reset();\n // Register internal schema for hook mutations\n if (hooksConfig) {\n currentStorage.uow.registerSchema(\n hooksConfig.internalFragment.$internal.deps.schema,\n hooksConfig.internalFragment.$internal.deps.namespace,\n );\n }\n return currentStorage.uow as UnitOfWork;\n },\n onBeforeMutate: hooksConfig ? (uow) => prepareHookMutations(uow, hooksConfig) : undefined,\n onSuccess: hooksConfig ? () => processHooks(hooksConfig) : undefined,\n });\n }\n\n const handlerContext: DatabaseHandlerContext<THooks> = {\n uow,\n };\n\n return { serviceContext, handlerContext };\n });\n\n // Build the final definition\n const finalDef = builderWithContext.build();\n\n // Return the complete definition with proper typing and dependencies\n return {\n ...finalDef,\n dependencies,\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"db-fragment-definition-builder.js","names":["#baseBuilder","#schema","#namespace","#hooksFactory","implicitDeps: ImplicitDatabaseDependencies<TSchema>","uow","serviceContext: DatabaseServiceContext<THooks>","options: ExecuteRestrictedUnitOfWorkOptions","options"],"sources":["../src/db-fragment-definition-builder.ts"],"sourcesContent":["import type { AnySchema } from \"./schema/create\";\nimport type { SimpleQueryInterface } from \"./query/simple-query-interface\";\nimport type { DatabaseAdapter } from \"./adapters/adapters\";\nimport type { IUnitOfWork } from \"./query/unit-of-work/unit-of-work\";\nimport { TypedUnitOfWork, UnitOfWork } from \"./query/unit-of-work/unit-of-work\";\nimport type {\n RequestThisContext,\n FragnoPublicConfig,\n AnyFragnoInstantiatedFragment,\n} from \"@fragno-dev/core\";\nimport {\n FragmentDefinitionBuilder,\n type FragmentDefinition,\n type ServiceConstructorFn,\n} from \"@fragno-dev/core\";\nimport {\n executeRestrictedUnitOfWork,\n executeTxArray,\n executeTxCallbacks,\n executeServiceTx,\n type AwaitedPromisesInObject,\n type ExecuteRestrictedUnitOfWorkOptions,\n type HandlerTxCallbacks,\n type ServiceTxCallbacks,\n} from \"./query/unit-of-work/execute-unit-of-work\";\nimport {\n prepareHookMutations,\n processHooks,\n type HooksMap,\n type HookFn,\n type HookContext,\n} from \"./hooks/hooks\";\nimport type { InternalFragmentInstance } from \"./fragments/internal-fragment\";\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 * Implicit dependencies that database fragments get automatically.\n * These are injected without requiring explicit configuration.\n */\nexport type ImplicitDatabaseDependencies<TSchema extends AnySchema> = {\n /**\n * Database query engine for the fragment's schema.\n */\n db: SimpleQueryInterface<TSchema>;\n /**\n * The schema definition for this fragment.\n */\n schema: TSchema;\n /**\n * The database namespace for this fragment.\n */\n namespace: string;\n /**\n * Create a new Unit of Work for database operations.\n */\n createUnitOfWork: () => IUnitOfWork;\n};\n\n/**\n * Service context for database fragments - provides restricted UOW access without execute methods.\n */\nexport type DatabaseServiceContext<THooks extends HooksMap> = RequestThisContext & {\n /**\n * Get a typed, restricted Unit of Work for the given schema.\n * @param schema - Schema to get a typed view for\n * @returns TypedUnitOfWork (restricted version without execute methods)\n */\n uow<TSchema extends AnySchema>(schema: TSchema): TypedUnitOfWork<TSchema, [], unknown, THooks>;\n\n /**\n * Execute a transaction with two-phase callbacks (retrieve + mutate).\n *\n * @param schema - Schema to use for the transaction\n * @param callbacks - Object containing retrieve and mutate callbacks\n * @returns Promise resolving to the mutation result with promises awaited 1 level deep\n *\n * @example\n * ```ts\n * return this.tx(schema, {\n * retrieve: (uow) => uow.findFirst(\"users\", ...),\n * mutate: async (uow, [user]) => {\n * await validateUser(user);\n * uow.update(\"users\", user.id, ...).check();\n * return { ok: true };\n * }\n * });\n * ```\n */\n tx<TSchema extends AnySchema, TRetrievalResults extends unknown[], TMutationResult = void>(\n schema: TSchema,\n callbacks: ServiceTxCallbacks<TSchema, TRetrievalResults, TMutationResult, THooks>,\n ): Promise<AwaitedPromisesInObject<TMutationResult>>;\n};\n\n/**\n * Handler context for database fragments - provides UOW execution with automatic retry support.\n */\nexport type DatabaseHandlerContext<THooks extends HooksMap = {}> = RequestThisContext & {\n /**\n * Execute a Unit of Work with explicit phase control and automatic retry support.\n * This method provides an API where users call forSchema to create a schema-specific\n * UOW, then call executeRetrieve() and executeMutate() to execute the phases. The entire\n * callback is re-executed on optimistic concurrency conflicts, ensuring retries work properly.\n * Automatically provides the UOW factory from context.\n * Promises in the returned object are awaited 1 level deep.\n *\n * @param callback - Async function that receives a context with forSchema, executeRetrieve, executeMutate, nonce, and currentAttempt\n * @param options - Optional configuration for retry policy and abort signal\n * @returns Promise resolving to the callback's return value with promises awaited 1 level deep\n * @throws Error if retries are exhausted or callback throws an error\n *\n * @example\n * ```ts\n * const result = await this.uow(async ({ forSchema, executeRetrieve, executeMutate, nonce, currentAttempt }) => {\n * const uow = forSchema(schema);\n * const userId = uow.create(\"users\", { name: \"John\" });\n *\n * // Execute retrieval phase\n * await executeRetrieve();\n *\n * const profileId = uow.create(\"profiles\", { userId });\n *\n * // Execute mutation phase\n * await executeMutate();\n *\n * return { userId, profileId };\n * });\n * ```\n */\n uow<TResult>(\n callback: (context: {\n forSchema: <TSchema extends AnySchema, H extends HooksMap = THooks>(\n schema: TSchema,\n hooks?: H,\n ) => TypedUnitOfWork<TSchema, [], unknown, H>;\n executeRetrieve: () => Promise<void>;\n executeMutate: () => Promise<void>;\n nonce: string;\n currentAttempt: number;\n }) => Promise<TResult> | TResult,\n options?: Omit<ExecuteRestrictedUnitOfWorkOptions, \"createUnitOfWork\">,\n ): Promise<AwaitedPromisesInObject<TResult>>;\n\n /**\n * Execute a transaction with automatic retry support.\n * Provides two overloads: array syntax (common case) and callback syntax (advanced).\n *\n * Array syntax - pass a factory function that returns service calls:\n * ```ts\n * const [transfer, notify] = await this.tx(\n * () => [\n * services.transfer({ from, to, amount }),\n * services.notify({ userId, message })\n * ]\n * );\n * ```\n *\n * Callback syntax - for handlers that need direct UOW access:\n * ```ts\n * const result = await this.tx({\n * retrieve: ({ forSchema }) => {\n * const uow = forSchema(schema);\n * uow.find(\"users\", ...);\n * return services.transfer({ ... });\n * },\n * mutate: ({ forSchema }, transferPromise) => {\n * const uow = forSchema(schema);\n * uow.create(\"auditLog\", { ... });\n * return transferPromise;\n * }\n * });\n * ```\n *\n * Note: Handler callbacks are synchronous only to prevent accidentally awaiting services in wrong place.\n */\n // Overload 1: Array syntax (common case) - accepts a factory\n tx<T extends readonly unknown[]>(\n servicesFactory: () => readonly [...{ [K in keyof T]: Promise<T[K]> }],\n options?: Omit<ExecuteRestrictedUnitOfWorkOptions, \"createUnitOfWork\">,\n ): Promise<{ [K in keyof T]: T[K] }>;\n // Overload 2: Callback syntax (advanced, sync callbacks only)\n tx<TRetrieveResult, TMutationResult>(\n callbacks: HandlerTxCallbacks<TRetrieveResult, TMutationResult, THooks>,\n options?: Omit<ExecuteRestrictedUnitOfWorkOptions, \"createUnitOfWork\">,\n ): Promise<AwaitedPromisesInObject<TMutationResult>>;\n};\n\n/**\n * Database fragment context provided to user callbacks.\n */\nexport type DatabaseFragmentContext<TSchema extends AnySchema> = {\n /**\n * Database adapter instance.\n */\n databaseAdapter: DatabaseAdapter<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n /**\n * ORM query engine for the fragment's schema.\n */\n db: SimpleQueryInterface<TSchema>;\n};\n\n/**\n * Create database context from options.\n * This extracts the database adapter and creates the ORM instance.\n */\nfunction createDatabaseContext<TSchema extends AnySchema>(\n options: FragnoPublicConfigWithDatabase,\n schema: TSchema,\n namespace: string,\n): DatabaseFragmentContext<TSchema> {\n const databaseAdapter = options.databaseAdapter;\n\n if (!databaseAdapter) {\n throw new Error(\n \"Database fragment requires a database adapter to be provided in options.databaseAdapter\",\n );\n }\n\n const db = databaseAdapter.createQueryEngine(schema, namespace);\n\n return { databaseAdapter, db };\n}\n\n/**\n * Storage type for database fragments - stores the Unit of Work.\n */\nexport type DatabaseRequestStorage = {\n uow: IUnitOfWork;\n};\n\n/**\n * Builder for database fragments that wraps the core fragment builder\n * and provides database-specific functionality.\n *\n * Database fragments always require FragnoPublicConfigWithDatabase (which includes databaseAdapter).\n */\nexport class DatabaseFragmentDefinitionBuilder<\n TSchema extends AnySchema,\n TConfig,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n THooks extends HooksMap = {},\n TServiceThisContext extends RequestThisContext = DatabaseHandlerContext,\n THandlerThisContext extends RequestThisContext = DatabaseHandlerContext,\n TLinkedFragments extends Record<string, AnyFragnoInstantiatedFragment> = {},\n> {\n // Store the base builder - we'll replace its storage and context setup when building\n #baseBuilder: FragmentDefinitionBuilder<\n TConfig,\n FragnoPublicConfigWithDatabase,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n TServiceThisContext,\n THandlerThisContext,\n DatabaseRequestStorage,\n TLinkedFragments\n >;\n #schema: TSchema;\n #namespace: string;\n #hooksFactory?: (context: { config: TConfig; options: FragnoPublicConfigWithDatabase }) => THooks;\n\n constructor(\n baseBuilder: FragmentDefinitionBuilder<\n TConfig,\n FragnoPublicConfigWithDatabase,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n TServiceThisContext,\n THandlerThisContext,\n DatabaseRequestStorage,\n TLinkedFragments\n >,\n schema: TSchema,\n namespace?: string,\n hooksFactory?: (context: {\n config: TConfig;\n options: FragnoPublicConfigWithDatabase;\n }) => THooks,\n ) {\n this.#baseBuilder = baseBuilder;\n this.#schema = schema;\n this.#namespace = namespace ?? baseBuilder.name;\n this.#hooksFactory = hooksFactory;\n }\n\n /**\n * Define dependencies for this database fragment.\n * The context includes database adapter and ORM instance.\n */\n withDependencies<TNewDeps>(\n fn: (context: {\n config: TConfig;\n options: FragnoPublicConfigWithDatabase;\n db: SimpleQueryInterface<TSchema>;\n databaseAdapter: DatabaseAdapter<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n }) => TNewDeps,\n ): DatabaseFragmentDefinitionBuilder<\n TSchema,\n TConfig,\n TNewDeps & ImplicitDatabaseDependencies<TSchema>,\n {},\n {},\n TServiceDependencies,\n {},\n THooks,\n TServiceThisContext,\n THandlerThisContext,\n TLinkedFragments\n > {\n // Wrap user function to inject DB context\n const wrappedFn = (context: { config: TConfig; options: FragnoPublicConfigWithDatabase }) => {\n const dbContext = createDatabaseContext(context.options, this.#schema, this.#namespace);\n\n // Call user function with enriched context\n const userDeps = fn({\n config: context.config,\n options: context.options,\n db: dbContext.db,\n databaseAdapter: dbContext.databaseAdapter,\n });\n\n // Create implicit dependencies\n const createUow = () => dbContext.db.createUnitOfWork();\n const implicitDeps: ImplicitDatabaseDependencies<TSchema> = {\n db: dbContext.db,\n schema: this.#schema,\n namespace: this.#namespace,\n createUnitOfWork: createUow,\n };\n\n return {\n ...userDeps,\n ...implicitDeps,\n };\n };\n\n // Create new base builder with wrapped function\n const newBaseBuilder = this.#baseBuilder.withDependencies(wrappedFn);\n\n return new DatabaseFragmentDefinitionBuilder(\n newBaseBuilder,\n this.#schema,\n this.#namespace,\n this.#hooksFactory,\n );\n }\n\n providesBaseService<TNewService>(\n fn: ServiceConstructorFn<\n TConfig,\n FragnoPublicConfigWithDatabase,\n TDeps,\n TServiceDependencies,\n TPrivateServices,\n TNewService,\n TServiceThisContext\n >,\n ): DatabaseFragmentDefinitionBuilder<\n TSchema,\n TConfig,\n TDeps,\n TNewService,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n THooks,\n TServiceThisContext,\n THandlerThisContext,\n TLinkedFragments\n > {\n const newBaseBuilder = this.#baseBuilder.providesBaseService<TNewService>(fn);\n\n return new DatabaseFragmentDefinitionBuilder(\n newBaseBuilder,\n this.#schema,\n this.#namespace,\n this.#hooksFactory,\n );\n }\n\n providesService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n fn: ServiceConstructorFn<\n TConfig,\n FragnoPublicConfigWithDatabase,\n TDeps,\n TServiceDependencies,\n TPrivateServices,\n TService,\n TServiceThisContext\n >,\n ): DatabaseFragmentDefinitionBuilder<\n TSchema,\n TConfig,\n TDeps,\n TBaseServices,\n TServices & { [K in TServiceName]: TService },\n TServiceDependencies,\n TPrivateServices,\n THooks,\n TServiceThisContext,\n THandlerThisContext,\n TLinkedFragments\n > {\n const newBaseBuilder = this.#baseBuilder.providesService<TServiceName, TService>(\n serviceName,\n fn,\n );\n\n return new DatabaseFragmentDefinitionBuilder(\n newBaseBuilder,\n this.#schema,\n this.#namespace,\n this.#hooksFactory,\n );\n }\n\n /**\n * Provide a private service that is only accessible to the fragment author.\n * Private services are NOT exposed on the fragment instance, but can be used\n * when defining other services (baseServices, namedServices, and other privateServices).\n * Private services are instantiated in order, so earlier private services are available\n * to later ones.\n */\n providesPrivateService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n fn: ServiceConstructorFn<\n TConfig,\n FragnoPublicConfigWithDatabase,\n TDeps,\n TServiceDependencies,\n TPrivateServices,\n TService,\n TServiceThisContext\n >,\n ): DatabaseFragmentDefinitionBuilder<\n TSchema,\n TConfig,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices & { [K in TServiceName]: TService },\n THooks,\n TServiceThisContext,\n THandlerThisContext,\n TLinkedFragments\n > {\n const newBaseBuilder = this.#baseBuilder.providesPrivateService<TServiceName, TService>(\n serviceName,\n fn,\n );\n\n return new DatabaseFragmentDefinitionBuilder(\n newBaseBuilder,\n this.#schema,\n this.#namespace,\n this.#hooksFactory,\n );\n }\n\n /**\n * Define durable hooks for this fragment.\n * Hooks are automatically persisted and retried on failure.\n *\n * @param fn - Function that receives defineHook helper and returns a hooks map\n * @returns Builder with hooks type set\n *\n * @example\n * ```ts\n * .provideHooks(({ defineHook, config }) => ({\n * onSubscribe: defineHook(async function (payload: { email: string }) {\n * // 'this' context available (HookServiceContext with nonce)\n * await config.onSubscribe?.(payload.email);\n * }),\n * }))\n * ```\n */\n provideHooks<TNewHooks extends HooksMap>(\n fn: (context: {\n config: TConfig;\n options: FragnoPublicConfigWithDatabase;\n defineHook: <TPayload>(\n hook: (this: HookContext, payload: TPayload) => void | Promise<void>,\n ) => HookFn<TPayload>;\n }) => TNewHooks,\n ): DatabaseFragmentDefinitionBuilder<\n TSchema,\n TConfig,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n TNewHooks,\n DatabaseServiceContext<TNewHooks>,\n THandlerThisContext,\n TLinkedFragments\n > {\n const defineHook = <TPayload>(\n hook: (this: HookContext, payload: TPayload) => void | Promise<void>,\n ): HookFn<TPayload> => {\n return hook;\n };\n\n // Store the hooks factory - it will be called in build() with config/options\n const hooksFactory = (context: {\n config: TConfig;\n options: FragnoPublicConfigWithDatabase;\n }) => {\n return fn({\n config: context.config,\n options: context.options,\n defineHook,\n });\n };\n\n // Create new builder with hooks factory stored\n // Cast is safe: we're only changing THooks and TServiceThisContext type parameters\n const newBuilder = new DatabaseFragmentDefinitionBuilder(\n this.#baseBuilder,\n this.#schema,\n this.#namespace,\n ) as unknown as DatabaseFragmentDefinitionBuilder<\n TSchema,\n TConfig,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n TNewHooks,\n DatabaseServiceContext<TNewHooks>,\n THandlerThisContext,\n TLinkedFragments\n >;\n\n newBuilder.#hooksFactory = hooksFactory;\n\n return newBuilder;\n }\n\n /**\n * Declare that this fragment uses a required service provided by the runtime.\n * Delegates to the base builder.\n */\n usesService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n ): DatabaseFragmentDefinitionBuilder<\n TSchema,\n TConfig,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies & { [K in TServiceName]: TService },\n TPrivateServices,\n THooks,\n TServiceThisContext,\n THandlerThisContext,\n TLinkedFragments\n > {\n const newBaseBuilder = this.#baseBuilder.usesService<TServiceName, TService>(serviceName);\n\n return new DatabaseFragmentDefinitionBuilder(\n newBaseBuilder,\n this.#schema,\n this.#namespace,\n this.#hooksFactory,\n );\n }\n\n /**\n * Declare that this fragment uses an optional service provided by the runtime.\n * Delegates to the base builder.\n */\n usesOptionalService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n ): DatabaseFragmentDefinitionBuilder<\n TSchema,\n TConfig,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies & { [K in TServiceName]: TService | undefined },\n TPrivateServices,\n THooks,\n TServiceThisContext,\n THandlerThisContext,\n TLinkedFragments\n > {\n const newBaseBuilder = this.#baseBuilder.usesOptionalService<TServiceName, TService>(\n serviceName,\n );\n\n return new DatabaseFragmentDefinitionBuilder(\n newBaseBuilder,\n this.#schema,\n this.#namespace,\n this.#hooksFactory,\n );\n }\n\n /**\n * Build the final database fragment definition.\n * This includes the request context setup for UnitOfWork management.\n * Note: TDeps already includes ImplicitDatabaseDependencies from withDatabase().\n */\n build(): FragmentDefinition<\n TConfig,\n FragnoPublicConfigWithDatabase,\n TDeps,\n TBaseServices,\n TServices,\n TServiceDependencies,\n TPrivateServices,\n DatabaseServiceContext<THooks>,\n DatabaseHandlerContext<THooks>,\n DatabaseRequestStorage,\n TLinkedFragments\n > {\n const baseDef = this.#baseBuilder.build();\n\n // Ensure dependencies callback always exists for database fragments\n // If no user dependencies were defined, create a minimal one that only adds implicit deps\n const dependencies = (context: {\n config: TConfig;\n options: FragnoPublicConfigWithDatabase;\n }): TDeps => {\n // In dry run mode, allow user deps to fail gracefully.\n // This is critical for database fragments because the CLI needs access to the schema\n // even when user dependencies (like API clients) can't be initialized.\n // Without this, if user deps fail, we'd lose the implicit database dependencies\n // (including schema), and the CLI couldn't extract schema information.\n let userDeps;\n try {\n userDeps = baseDef.dependencies?.(context);\n } catch (error) {\n if (process.env[\"FRAGNO_INIT_DRY_RUN\"] === \"true\") {\n console.warn(\n \"Warning: Failed to initialize user dependencies in dry run mode:\",\n error instanceof Error ? error.message : String(error),\n );\n userDeps = {};\n } else {\n throw error;\n }\n }\n\n const { db } = createDatabaseContext(context.options, this.#schema, this.#namespace);\n\n const implicitDeps: ImplicitDatabaseDependencies<TSchema> = {\n db,\n schema: this.#schema,\n namespace: this.#namespace,\n createUnitOfWork: () => db.createUnitOfWork(),\n };\n\n return {\n ...userDeps,\n ...implicitDeps,\n } as TDeps;\n };\n\n // Use the adapter's shared context storage (all fragments using the same adapter share this storage)\n const builderWithExternalStorage = this.#baseBuilder.withExternalRequestStorage(\n ({ options }) => {\n const dbContext = createDatabaseContext(options, this.#schema, this.#namespace);\n return dbContext.databaseAdapter.contextStorage;\n },\n );\n\n // Set up request storage to initialize the Unit of Work\n const builderWithStorage = builderWithExternalStorage.withRequestStorage(\n ({ options }): DatabaseRequestStorage => {\n // Create database context - needed here to create the UOW\n const dbContextForStorage = createDatabaseContext(options, this.#schema, this.#namespace);\n\n // Create a new Unit of Work for this request\n const uow: IUnitOfWork = dbContextForStorage.db.createUnitOfWork();\n\n return { uow };\n },\n );\n\n // Get the internal fragment factory from linked fragments (added by withDatabase)\n // Cast is safe: withDatabase() guarantees this fragment exists and has the correct type\n const internalFragmentFactory = baseDef.linkedFragments?.[\"_fragno_internal\"] as (context: {\n config: TConfig;\n options: FragnoPublicConfigWithDatabase;\n }) => InternalFragmentInstance;\n\n const builderWithContext = builderWithStorage.withThisContext<\n DatabaseServiceContext<THooks>,\n DatabaseHandlerContext<THooks>\n >(({ storage, config, options }) => {\n // Create hooks config if hooks factory is defined\n const hooksConfig = this.#hooksFactory\n ? {\n hooks: this.#hooksFactory({ config, options }),\n namespace: this.#namespace,\n internalFragment: internalFragmentFactory({ config, options }),\n }\n : undefined;\n\n function forSchema<TSchema extends AnySchema>(\n schema: TSchema,\n ): TypedUnitOfWork<TSchema, [], unknown, THooks> {\n const uow = storage.getStore()?.uow;\n if (!uow) {\n throw new Error(\n \"No UnitOfWork in context. Service must be called within a route handler OR using `withUnitOfWork`.\",\n );\n }\n\n return uow.restrict().forSchema<TSchema, THooks>(schema);\n }\n\n const serviceTx = async <\n TSchema extends AnySchema,\n TRetrievalResults extends unknown[],\n TMutationResult = void,\n >(\n schema: TSchema,\n callbacks: ServiceTxCallbacks<TSchema, TRetrievalResults, TMutationResult, THooks>,\n ): Promise<AwaitedPromisesInObject<TMutationResult>> => {\n const uow = storage.getStore()?.uow;\n if (!uow) {\n throw new Error(\n \"No UnitOfWork in context. Service must be called within a route handler OR using `withUnitOfWork`.\",\n );\n }\n\n return executeServiceTx(schema, callbacks, uow);\n };\n\n const serviceContext: DatabaseServiceContext<THooks> = {\n uow: forSchema,\n tx: serviceTx,\n };\n\n async function uow<TResult>(\n callback: (context: {\n forSchema: <S extends AnySchema, H extends HooksMap = THooks>(\n schema: S,\n hooks?: H,\n ) => TypedUnitOfWork<S, [], unknown, H>;\n executeRetrieve: () => Promise<void>;\n executeMutate: () => Promise<void>;\n nonce: string;\n currentAttempt: number;\n }) => Promise<TResult> | TResult,\n execOptions?: Omit<ExecuteRestrictedUnitOfWorkOptions, \"createUnitOfWork\">,\n ): Promise<AwaitedPromisesInObject<TResult>> {\n const currentStorage = storage.getStore();\n if (!currentStorage) {\n throw new Error(\n \"No storage in context. Handler must be called within a request context.\",\n );\n }\n\n const wrappedCallback = async (context: {\n forSchema: <S extends AnySchema, H extends HooksMap = THooks>(\n schema: S,\n hooks?: H,\n ) => TypedUnitOfWork<S, [], unknown, H>;\n executeRetrieve: () => Promise<void>;\n executeMutate: () => Promise<void>;\n nonce: string;\n currentAttempt: number;\n }): Promise<TResult> => {\n return callback(context);\n };\n\n const userOnBeforeMutate = execOptions?.onBeforeMutate;\n const userOnSuccess = execOptions?.onSuccess;\n\n return executeRestrictedUnitOfWork(wrappedCallback, {\n ...execOptions,\n createUnitOfWork: () => {\n currentStorage.uow.reset();\n if (hooksConfig) {\n currentStorage.uow.registerSchema(\n hooksConfig.internalFragment.$internal.deps.schema,\n hooksConfig.internalFragment.$internal.deps.namespace,\n );\n }\n // Safe cast: currentStorage.uow is always a UnitOfWork instance\n return currentStorage.uow as UnitOfWork;\n },\n onBeforeMutate: (uow) => {\n if (hooksConfig) {\n prepareHookMutations(uow, hooksConfig);\n }\n if (userOnBeforeMutate) {\n userOnBeforeMutate(uow);\n }\n },\n onSuccess: async (uow) => {\n if (hooksConfig) {\n await processHooks(hooksConfig);\n }\n if (userOnSuccess) {\n await userOnSuccess(uow);\n }\n },\n });\n }\n\n // Handler tx method with two overloads\n function handlerTx<T extends readonly unknown[]>(\n servicesFactory: () => readonly [...{ [K in keyof T]: Promise<T[K]> }],\n execOptions?: Omit<ExecuteRestrictedUnitOfWorkOptions, \"createUnitOfWork\">,\n ): Promise<{ [K in keyof T]: T[K] }>;\n function handlerTx<TRetrieveResult, TMutationResult>(\n callbacks: HandlerTxCallbacks<TRetrieveResult, TMutationResult, THooks>,\n execOptions?: Omit<ExecuteRestrictedUnitOfWorkOptions, \"createUnitOfWork\">,\n ): Promise<AwaitedPromisesInObject<TMutationResult>>;\n async function handlerTx<T extends readonly unknown[], TRetrieveResult, TMutationResult>(\n factoryOrCallbacks:\n | (() => readonly [...{ [K in keyof T]: Promise<T[K]> }])\n | HandlerTxCallbacks<TRetrieveResult, TMutationResult, THooks>,\n execOptions?: Omit<ExecuteRestrictedUnitOfWorkOptions, \"createUnitOfWork\">,\n ): Promise<{ [K in keyof T]: T[K] } | AwaitedPromisesInObject<TMutationResult>> {\n const currentStorage = storage.getStore();\n if (!currentStorage) {\n throw new Error(\n \"No storage in context. Handler must be called within a request context.\",\n );\n }\n\n const userOnBeforeMutate = execOptions?.onBeforeMutate;\n const userOnSuccess = execOptions?.onSuccess;\n\n const createUow = () => {\n currentStorage.uow.reset();\n\n if (hooksConfig) {\n currentStorage.uow.registerSchema(\n hooksConfig.internalFragment.$internal.deps.schema,\n hooksConfig.internalFragment.$internal.deps.namespace,\n );\n }\n // Safe cast: currentStorage.uow is always a UnitOfWork instance\n return currentStorage.uow as UnitOfWork;\n };\n\n const options: ExecuteRestrictedUnitOfWorkOptions = {\n ...execOptions,\n createUnitOfWork: createUow,\n onBeforeMutate: (uow) => {\n if (hooksConfig) {\n prepareHookMutations(uow, hooksConfig);\n }\n if (userOnBeforeMutate) {\n userOnBeforeMutate(uow);\n }\n },\n onSuccess: async (uow) => {\n if (hooksConfig) {\n await processHooks(hooksConfig);\n }\n if (userOnSuccess) {\n await userOnSuccess(uow);\n }\n },\n };\n\n // Check if it's a function (array syntax factory) or callbacks object (callback syntax)\n if (typeof factoryOrCallbacks === \"function\") {\n // Array syntax - factoryOrCallbacks is a factory function\n return executeTxArray(\n factoryOrCallbacks as () => readonly [...{ [K in keyof T]: Promise<T[K]> }],\n options,\n ) as Promise<{ [K in keyof T]: T[K] }>;\n } else {\n return executeTxCallbacks(\n factoryOrCallbacks as HandlerTxCallbacks<TRetrieveResult, TMutationResult, THooks>,\n options,\n );\n }\n }\n\n const handlerContext: DatabaseHandlerContext<THooks> = {\n uow,\n tx: handlerTx,\n };\n\n return { serviceContext, handlerContext };\n });\n\n // Build the final definition\n const finalDef = builderWithContext.build();\n\n // Return the complete definition with proper typing and dependencies\n return {\n ...finalDef,\n dependencies,\n };\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"internal-fragment.d.ts","names":[],"sources":["../../src/fragments/internal-fragment.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"internal-fragment.d.ts","names":[],"sources":["../../src/fragments/internal-fragment.ts"],"sourcesContent":[],"mappings":"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"}