@fragno-dev/db 0.1.13 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/.turbo/turbo-build.log +48 -41
  2. package/CHANGELOG.md +6 -0
  3. package/dist/adapters/adapters.d.ts +13 -1
  4. package/dist/adapters/adapters.d.ts.map +1 -1
  5. package/dist/adapters/adapters.js.map +1 -1
  6. package/dist/adapters/drizzle/drizzle-adapter.d.ts +2 -0
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  8. package/dist/adapters/drizzle/drizzle-adapter.js +6 -1
  9. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  10. package/dist/adapters/drizzle/drizzle-query.js +6 -4
  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 +49 -36
  15. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +1 -1
  16. package/dist/adapters/drizzle/drizzle-uow-decoder.js +1 -1
  17. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +1 -1
  18. package/dist/adapters/drizzle/shared.d.ts +14 -1
  19. package/dist/adapters/drizzle/shared.d.ts.map +1 -0
  20. package/dist/adapters/kysely/kysely-adapter.d.ts +2 -0
  21. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  22. package/dist/adapters/kysely/kysely-adapter.js +7 -2
  23. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  24. package/dist/adapters/kysely/kysely-query.js +5 -3
  25. package/dist/adapters/kysely/kysely-query.js.map +1 -1
  26. package/dist/adapters/kysely/kysely-shared.d.ts +11 -0
  27. package/dist/adapters/kysely/kysely-shared.d.ts.map +1 -0
  28. package/dist/adapters/kysely/kysely-uow-compiler.js +38 -9
  29. package/dist/adapters/kysely/kysely-uow-compiler.js.map +1 -1
  30. package/dist/bind-services.d.ts +7 -0
  31. package/dist/bind-services.d.ts.map +1 -0
  32. package/dist/bind-services.js +14 -0
  33. package/dist/bind-services.js.map +1 -0
  34. package/dist/fragment.d.ts +131 -12
  35. package/dist/fragment.d.ts.map +1 -1
  36. package/dist/fragment.js +107 -8
  37. package/dist/fragment.js.map +1 -1
  38. package/dist/mod.d.ts +4 -2
  39. package/dist/mod.d.ts.map +1 -1
  40. package/dist/mod.js +3 -2
  41. package/dist/mod.js.map +1 -1
  42. package/dist/query/query.d.ts +2 -2
  43. package/dist/query/query.d.ts.map +1 -1
  44. package/dist/query/unit-of-work.d.ts +100 -15
  45. package/dist/query/unit-of-work.d.ts.map +1 -1
  46. package/dist/query/unit-of-work.js +214 -7
  47. package/dist/query/unit-of-work.js.map +1 -1
  48. package/package.json +3 -3
  49. package/src/adapters/adapters.ts +14 -0
  50. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +6 -1
  51. package/src/adapters/drizzle/drizzle-adapter-sqlite.test.ts +133 -5
  52. package/src/adapters/drizzle/drizzle-adapter.ts +16 -1
  53. package/src/adapters/drizzle/drizzle-query.ts +26 -15
  54. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +57 -57
  55. package/src/adapters/drizzle/drizzle-uow-compiler.ts +79 -39
  56. package/src/adapters/drizzle/drizzle-uow-decoder.ts +2 -5
  57. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +2 -2
  58. package/src/adapters/kysely/kysely-adapter.ts +16 -1
  59. package/src/adapters/kysely/kysely-query.ts +26 -15
  60. package/src/adapters/kysely/kysely-uow-compiler.test.ts +43 -43
  61. package/src/adapters/kysely/kysely-uow-compiler.ts +50 -14
  62. package/src/adapters/kysely/kysely-uow-joins.test.ts +30 -30
  63. package/src/bind-services.test.ts +214 -0
  64. package/src/bind-services.ts +37 -0
  65. package/src/db-fragment.test.ts +800 -0
  66. package/src/fragment.ts +557 -28
  67. package/src/mod.ts +19 -0
  68. package/src/query/query.ts +2 -2
  69. package/src/query/unit-of-work-multi-schema.test.ts +64 -0
  70. package/src/query/unit-of-work-types.test.ts +13 -0
  71. package/src/query/unit-of-work.test.ts +5 -9
  72. package/src/query/unit-of-work.ts +511 -62
  73. package/src/uow-context-integration.test.ts +102 -0
  74. package/src/uow-context.test.ts +182 -0
  75. package/src/fragment.test.ts +0 -341
package/dist/fragment.js CHANGED
@@ -1,16 +1,34 @@
1
+ import { bindServicesToContext } from "./bind-services.js";
2
+ import { AsyncLocalStorage } from "async_hooks";
3
+
1
4
  //#region src/fragment.ts
5
+ const uowStorage = new AsyncLocalStorage();
6
+ const serviceContext = { getUnitOfWork(schema) {
7
+ const uow = uowStorage.getStore();
8
+ if (!uow) throw new Error("No UnitOfWork in context. Service must be called within a route handler.");
9
+ if (schema) return uow.forSchema(schema);
10
+ return uow;
11
+ } };
12
+ function withUnitOfWork(uow, callback) {
13
+ return Promise.resolve(uowStorage.run(uow, callback));
14
+ }
2
15
  var DatabaseFragmentBuilder = class DatabaseFragmentBuilder {
16
+ $types;
3
17
  #name;
4
18
  #schema;
5
19
  #namespace;
6
20
  #dependencies;
7
21
  #services;
22
+ #usedServices;
23
+ #providedServices;
8
24
  constructor(options) {
9
25
  this.#name = options.name;
10
26
  this.#schema = options.schema;
11
27
  this.#namespace = options.namespace;
12
28
  this.#dependencies = options.dependencies;
13
29
  this.#services = options.services;
30
+ this.#usedServices = options.usedServices;
31
+ this.#providedServices = options.providedServices;
14
32
  }
15
33
  get $requiredOptions() {
16
34
  throw new Error("Type only method. Do not call.");
@@ -21,6 +39,7 @@ var DatabaseFragmentBuilder = class DatabaseFragmentBuilder {
21
39
  const name = this.#name;
22
40
  const dependencies = this.#dependencies;
23
41
  const services = this.#services;
42
+ const providedServices = this.#providedServices;
24
43
  return {
25
44
  name,
26
45
  dependencies: (config, options) => {
@@ -33,17 +52,31 @@ var DatabaseFragmentBuilder = class DatabaseFragmentBuilder {
33
52
  },
34
53
  services: (config, options, deps) => {
35
54
  const dbContext = this.#createDatabaseContext(options, schema, namespace, name);
36
- return services?.({
55
+ const defineService = (services$1) => services$1;
56
+ return bindServicesToContext(services?.({
37
57
  config,
38
58
  fragnoConfig: options,
39
59
  deps,
60
+ defineService,
40
61
  ...dbContext
41
- }) ?? {};
62
+ }) ?? {});
42
63
  },
43
64
  additionalContext: {
44
65
  databaseSchema: schema,
45
66
  databaseNamespace: namespace
46
- }
67
+ },
68
+ createHandlerWrapper: schema ? (options) => {
69
+ const { orm } = this.#createDatabaseContext(options, schema, namespace, name);
70
+ return (handler) => {
71
+ return async (inputContext, outputContext) => {
72
+ return withUnitOfWork(orm.createUnitOfWork(), async () => {
73
+ return handler.bind(serviceContext)(inputContext, outputContext);
74
+ });
75
+ };
76
+ };
77
+ } : void 0,
78
+ usedServices: this.#usedServices,
79
+ providedServices
47
80
  };
48
81
  }
49
82
  #createDatabaseContext(options, schema, namespace, name) {
@@ -61,7 +94,9 @@ var DatabaseFragmentBuilder = class DatabaseFragmentBuilder {
61
94
  schema,
62
95
  namespace: namespace ?? this.#name + "-db",
63
96
  dependencies: this.#dependencies,
64
- services: this.#services
97
+ services: this.#services,
98
+ usedServices: this.#usedServices,
99
+ providedServices: this.#providedServices
65
100
  });
66
101
  }
67
102
  withDependencies(fn) {
@@ -70,23 +105,87 @@ var DatabaseFragmentBuilder = class DatabaseFragmentBuilder {
70
105
  schema: this.#schema,
71
106
  namespace: this.#namespace,
72
107
  dependencies: fn,
73
- services: void 0
108
+ services: void 0,
109
+ usedServices: this.#usedServices,
110
+ providedServices: this.#providedServices
74
111
  });
75
112
  }
76
- withServices(fn) {
113
+ usesService(serviceName, options) {
114
+ const isOptional = options?.optional ?? false;
77
115
  return new DatabaseFragmentBuilder({
78
116
  name: this.#name,
79
117
  schema: this.#schema,
80
118
  namespace: this.#namespace,
81
119
  dependencies: this.#dependencies,
82
- services: fn
120
+ services: this.#services,
121
+ usedServices: {
122
+ ...this.#usedServices,
123
+ [serviceName]: {
124
+ name: serviceName,
125
+ required: !isOptional
126
+ }
127
+ },
128
+ providedServices: this.#providedServices
83
129
  });
84
130
  }
131
+ providesService(...args) {
132
+ if (args.length === 1) {
133
+ const [fn] = args;
134
+ const servicesCallback = (context) => {
135
+ const defineService = (services) => services;
136
+ return fn({
137
+ config: context.config,
138
+ fragnoConfig: context.fragnoConfig,
139
+ deps: context.deps,
140
+ db: context.orm,
141
+ defineService
142
+ });
143
+ };
144
+ return new DatabaseFragmentBuilder({
145
+ name: this.#name,
146
+ schema: this.#schema,
147
+ namespace: this.#namespace,
148
+ dependencies: this.#dependencies,
149
+ services: servicesCallback,
150
+ usedServices: this.#usedServices,
151
+ providedServices: this.#providedServices
152
+ });
153
+ } else {
154
+ const [serviceName, fnOrService] = args;
155
+ const createService = (config, options, deps) => {
156
+ const dbContext = this.#createDatabaseContext(options, this.#schema, this.#namespace ?? "", this.#name);
157
+ let implementation;
158
+ if (typeof fnOrService === "function") {
159
+ const defineService = (services) => services;
160
+ implementation = fnOrService({
161
+ config,
162
+ fragnoConfig: options,
163
+ deps,
164
+ db: dbContext.orm,
165
+ defineService
166
+ });
167
+ } else implementation = fnOrService;
168
+ return bindServicesToContext(implementation);
169
+ };
170
+ return new DatabaseFragmentBuilder({
171
+ name: this.#name,
172
+ schema: this.#schema,
173
+ namespace: this.#namespace,
174
+ dependencies: this.#dependencies,
175
+ services: this.#services,
176
+ usedServices: this.#usedServices,
177
+ providedServices: {
178
+ ...this.#providedServices,
179
+ [serviceName]: createService
180
+ }
181
+ });
182
+ }
183
+ }
85
184
  };
86
185
  function defineFragmentWithDatabase(name) {
87
186
  return new DatabaseFragmentBuilder({ name });
88
187
  }
89
188
 
90
189
  //#endregion
91
- export { DatabaseFragmentBuilder, defineFragmentWithDatabase };
190
+ export { DatabaseFragmentBuilder, bindServicesToContext, defineFragmentWithDatabase, serviceContext, uowStorage, withUnitOfWork };
92
191
  //# sourceMappingURL=fragment.js.map
@@ -1 +1 @@
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
+ {"version":3,"file":"fragment.js","names":["serviceContext: DatabaseRequestThisContext","#name","#schema","#namespace","#dependencies","#services","#usedServices","#providedServices","#createDatabaseContext","services","implementation: TService"],"sources":["../src/fragment.ts"],"sourcesContent":["import type { AnySchema } from \"./schema/create\";\nimport type { AbstractQuery } from \"./query/query\";\nimport type { DatabaseAdapter } from \"./adapters/adapters\";\nimport { bindServicesToContext, type BoundServices } from \"./bind-services\";\nimport { AsyncLocalStorage } from \"async_hooks\";\nimport type { IUnitOfWorkBase, UnitOfWorkSchemaView } from \"./query/unit-of-work\";\nimport type { RequestThisContext } from \"@fragno-dev/core/api\";\n\nexport const uowStorage = new AsyncLocalStorage<IUnitOfWorkBase>();\n\n/**\n * Service context for database fragments, providing access to the Unit of Work.\n */\nexport interface DatabaseRequestThisContext extends RequestThisContext {\n /**\n * Get the Unit of Work from the current context.\n * @param schema - Optional schema to get a typed view. If not provided, returns the base UOW.\n * @returns IUnitOfWorkBase if no schema provided, or typed UnitOfWorkSchemaView if schema provided.\n */\n getUnitOfWork(): IUnitOfWorkBase;\n getUnitOfWork<TSchema extends AnySchema>(\n schema: TSchema,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): UnitOfWorkSchemaView<TSchema, [], any>;\n}\n\nexport const serviceContext: DatabaseRequestThisContext = {\n getUnitOfWork<TSchema extends AnySchema>(\n schema?: TSchema,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ): any {\n const uow = uowStorage.getStore();\n if (!uow) {\n throw new Error(\"No UnitOfWork in context. Service must be called within a route handler.\");\n }\n if (schema) {\n return uow.forSchema(schema);\n }\n return uow;\n },\n};\n\nexport function withUnitOfWork<T>(uow: IUnitOfWorkBase, callback: () => T): Promise<T> {\n return Promise.resolve(uowStorage.run(uow, callback));\n}\n\n/**\n * Type helper that enforces DatabaseRequestThisContext on all functions in a service object\n */\ntype WithDatabaseThis<T> = {\n [K in keyof T]: T[K] extends (...args: infer A) => infer R\n ? (this: DatabaseRequestThisContext, ...args: A) => R\n : T[K] extends Record<string, unknown>\n ? WithDatabaseThis<T[K]>\n : T[K];\n};\n\n// Import types from fragno package\nimport type {\n FragmentDefinition,\n RouteHandler,\n FragnoPublicConfig,\n RequestInputContext,\n RequestOutputContext,\n} from \"@fragno-dev/core\";\n\nexport { bindServicesToContext, type BoundServices };\n\n/**\n * Route handler type for database fragments with access to Unit of Work.\n */\nexport type DatabaseRouteHandler = (\n this: DatabaseRequestThisContext,\n inputContext: RequestInputContext,\n outputContext: RequestOutputContext,\n) => Promise<Response>;\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 = {},\n const TUsedServices = {},\n const TProvidedServices = {},\n> {\n // Type-only property to expose type parameters for better inference\n readonly $types!: {\n schema: TSchema;\n config: TConfig;\n deps: TDeps;\n services: TServices;\n usedServices: TUsedServices;\n providedServices: TProvidedServices;\n };\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 & TUsedServices;\n defineService: <T extends Record<string, unknown>>(\n services: WithDatabaseThis<T>,\n ) => WithDatabaseThis<T>;\n } & DatabaseFragmentContext<TSchema>,\n ) => TServices;\n #usedServices?: Record<string, { name: string; required: boolean }>;\n #providedServices?: Record<string, unknown>;\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 & TUsedServices;\n defineService: <T extends Record<string, unknown>>(\n services: WithDatabaseThis<T>,\n ) => WithDatabaseThis<T>;\n } & DatabaseFragmentContext<TSchema>,\n ) => TServices;\n usedServices?: Record<string, { name: string; required: boolean }>;\n providedServices?: Record<string, unknown>;\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 this.#usedServices = options.usedServices;\n this.#providedServices = options.providedServices;\n }\n\n get $requiredOptions(): FragnoPublicConfigWithDatabase {\n throw new Error(\"Type only method. Do not call.\");\n }\n\n get definition(): FragmentDefinition<\n TConfig,\n TDeps,\n BoundServices<TServices>,\n { databaseSchema?: TSchema; databaseNamespace: string },\n BoundServices<TUsedServices>,\n BoundServices<TProvidedServices>,\n DatabaseRequestThisContext\n > {\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 const providedServices = this.#providedServices;\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: (\n config: TConfig,\n options: FragnoPublicConfig,\n deps: TDeps & BoundServices<TUsedServices>,\n ) => {\n const dbContext = this.#createDatabaseContext(options, schema, namespace, name);\n // Cast deps back to raw type for internal services function.\n // This is safe because:\n // 1. deps are already bound (their 'this' parameters are stripped)\n // 2. The services function expects raw types but only uses the public API\n // 3. BoundServices<T> has the same runtime shape as T (just without 'this')\n\n // defineService provides typing for service functions\n // It expects the input to already have proper 'this' types on functions\n const defineService = <T extends Record<string, unknown>>(\n services: WithDatabaseThis<T>,\n ): WithDatabaseThis<T> => services;\n\n const rawServices =\n services?.({\n config,\n fragnoConfig: options,\n deps: deps as TDeps & TUsedServices,\n defineService,\n ...dbContext,\n }) ?? ({} as TServices);\n\n // Bind all service methods to serviceContext\n return bindServicesToContext(\n rawServices as Record<string, unknown>,\n ) as BoundServices<TServices>;\n },\n additionalContext: {\n databaseSchema: schema,\n databaseNamespace: namespace,\n },\n createHandlerWrapper: schema\n ? (options: FragnoPublicConfig) => {\n const dbContext = this.#createDatabaseContext(options, schema, namespace, name);\n const { orm } = dbContext;\n\n // Return handler wrapper function\n return (handler: DatabaseRouteHandler): RouteHandler => {\n return async (inputContext, outputContext) => {\n // Create UOW for this request\n const uow = orm.createUnitOfWork();\n\n // Execute handler within AsyncLocalStorage context\n return withUnitOfWork(uow, async () => {\n // Bind handler to serviceContext so it has access to getUnitOfWork via 'this'\n const boundHandler = handler.bind(serviceContext);\n return boundHandler(inputContext, outputContext);\n });\n };\n };\n }\n : undefined,\n usedServices: this.#usedServices as\n | {\n [K in keyof TUsedServices]: { name: string; required: boolean };\n }\n | undefined,\n // Pass providedServices as-is - let fragment-instantiation.ts handle resolution\n // The factory functions will be called by createFragment\n providedServices: providedServices as\n | {\n [K in keyof BoundServices<TProvidedServices>]: BoundServices<TProvidedServices>[K];\n }\n | ((\n config: TConfig,\n options: FragnoPublicConfig,\n deps: TDeps & BoundServices<TUsedServices>,\n ) => BoundServices<TProvidedServices>)\n | undefined,\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<\n TNewSchema,\n TConfig,\n TDeps,\n TServices,\n TUsedServices,\n TProvidedServices\n > {\n return new DatabaseFragmentBuilder<\n TNewSchema,\n TConfig,\n TDeps,\n TServices,\n TUsedServices,\n TProvidedServices\n >({\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 & TUsedServices;\n defineService: <T extends Record<string, unknown>>(\n services: WithDatabaseThis<T>,\n ) => WithDatabaseThis<T>;\n } & DatabaseFragmentContext<TNewSchema>,\n ) => TServices)\n | undefined,\n usedServices: this.#usedServices,\n providedServices: this.#providedServices,\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, {}, TUsedServices, TProvidedServices> {\n return new DatabaseFragmentBuilder<\n TSchema,\n TConfig,\n TNewDeps,\n {},\n TUsedServices,\n TProvidedServices\n >({\n name: this.#name,\n schema: this.#schema,\n namespace: this.#namespace,\n dependencies: fn,\n services: undefined,\n usedServices: this.#usedServices,\n providedServices: this.#providedServices,\n });\n }\n\n /**\n * Declare that this fragment uses a service.\n * @param serviceName - The name of the service to use\n * @param options - Optional configuration: { optional: boolean } (defaults to required)\n */\n usesService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n options?: { optional?: false },\n ): DatabaseFragmentBuilder<\n TSchema,\n TConfig,\n TDeps,\n TServices,\n TUsedServices & { [K in TServiceName]: TService },\n TProvidedServices\n >;\n usesService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n options: { optional: true },\n ): DatabaseFragmentBuilder<\n TSchema,\n TConfig,\n TDeps,\n TServices,\n TUsedServices & { [K in TServiceName]: TService | undefined },\n TProvidedServices\n >;\n usesService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n options?: { optional?: boolean },\n ): DatabaseFragmentBuilder<\n TSchema,\n TConfig,\n TDeps,\n TServices,\n TUsedServices & { [K in TServiceName]: TService | TService | undefined },\n TProvidedServices\n > {\n const isOptional = options?.optional ?? false;\n return new DatabaseFragmentBuilder<\n TSchema,\n TConfig,\n TDeps,\n TServices,\n TUsedServices & { [K in TServiceName]: TService | (TService | undefined) },\n TProvidedServices\n >({\n name: this.#name,\n schema: this.#schema,\n namespace: this.#namespace,\n dependencies: this.#dependencies as unknown as\n | ((\n context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n } & DatabaseFragmentContext<TSchema>,\n ) => TDeps)\n | undefined,\n services: this.#services as unknown as\n | ((\n context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps &\n (TUsedServices & { [K in TServiceName]: TService | (TService | undefined) });\n } & DatabaseFragmentContext<TSchema>,\n ) => TServices)\n | undefined,\n usedServices: {\n ...this.#usedServices,\n [serviceName]: { name: serviceName, required: !isOptional },\n },\n providedServices: this.#providedServices,\n });\n }\n\n /**\n * Define services for this fragment (unnamed).\n * Functions in the service will have access to DatabaseRequestThisContext via `this` if using `defineService`.\n *\n * @example\n * With `this` context:\n * ```ts\n * .providesService(({ defineService }) => defineService({\n * createUser: function(name: string) {\n * const uow = this.getUnitOfWork(mySchema);\n * return uow.create('user', { name });\n * }\n * }))\n * ```\n *\n * Without `this` context:\n * ```ts\n * .providesService(({ db }) => ({\n * createUser: async (name: string) => {\n * return db.create('user', { name });\n * }\n * }))\n * ```\n */\n providesService<TNewServices>(\n fn: (context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps & TUsedServices;\n db: AbstractQuery<TSchema>;\n defineService: <T extends Record<string, unknown>>(\n services: WithDatabaseThis<T>,\n ) => WithDatabaseThis<T>;\n }) => TNewServices,\n ): DatabaseFragmentBuilder<\n TSchema,\n TConfig,\n TDeps,\n TNewServices,\n TUsedServices,\n TProvidedServices\n >;\n\n /**\n * Provide a named service that other fragments can use.\n * Functions in the service will have access to DatabaseRequestThisContext via `this` if using `defineService`.\n * You can also pass a service object directly instead of a callback.\n *\n * @example\n * With callback and `this` context:\n * ```ts\n * .providesService(\"myService\", ({ defineService }) => defineService({\n * createUser: function(name: string) {\n * const uow = this.getUnitOfWork(mySchema);\n * return uow.create('user', { name });\n * }\n * }))\n * ```\n *\n * With callback, no `this` context:\n * ```ts\n * .providesService(\"myService\", ({ db }) => ({\n * createUser: async (name: string) => {\n * return db.create('user', { name });\n * }\n * }))\n * ```\n *\n * With direct object:\n * ```ts\n * .providesService(\"myService\", {\n * createUser: async (name: string) => { ... }\n * })\n * ```\n */\n providesService<TServiceName extends string, TService>(\n serviceName: TServiceName,\n fnOrService:\n | ((context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps & TUsedServices;\n db: AbstractQuery<TSchema>;\n defineService: <T extends Record<string, unknown>>(\n services: WithDatabaseThis<T>,\n ) => WithDatabaseThis<T>;\n }) => TService)\n | TService,\n ): DatabaseFragmentBuilder<\n TSchema,\n TConfig,\n TDeps,\n TServices,\n TUsedServices,\n TProvidedServices & { [K in TServiceName]: BoundServices<TService> }\n >;\n\n providesService<TServiceName extends string, TService>(\n ...args:\n | [\n fn: (context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps & TUsedServices;\n db: AbstractQuery<TSchema>;\n defineService: <T extends Record<string, unknown>>(\n services: WithDatabaseThis<T>,\n ) => WithDatabaseThis<T>;\n }) => TService,\n ]\n | [\n serviceName: TServiceName,\n fnOrService:\n | ((context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps & TUsedServices;\n db: AbstractQuery<TSchema>;\n defineService: <T extends Record<string, unknown>>(\n services: WithDatabaseThis<T>,\n ) => WithDatabaseThis<T>;\n }) => TService)\n | TService,\n ]\n ):\n | DatabaseFragmentBuilder<TSchema, TConfig, TDeps, TService, TUsedServices, TProvidedServices>\n | DatabaseFragmentBuilder<\n TSchema,\n TConfig,\n TDeps,\n TServices,\n TUsedServices,\n TProvidedServices & { [K in TServiceName]: BoundServices<TService> }\n > {\n if (args.length === 1) {\n // Unnamed service - replaces withServices\n const [fn] = args;\n\n // Create a callback that takes a single context object (matching #services signature)\n // Note: We don't explicitly type the return to preserve the WithDatabaseThis wrapper\n const servicesCallback = (\n context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps & TUsedServices;\n } & DatabaseFragmentContext<TSchema>,\n ) => {\n // defineService provides typing for service functions\n // It expects the input to already have proper 'this' types on functions\n const defineService = <T extends Record<string, unknown>>(\n services: WithDatabaseThis<T>,\n ): WithDatabaseThis<T> => services;\n\n const services = fn({\n config: context.config,\n fragnoConfig: context.fragnoConfig,\n deps: context.deps,\n db: context.orm,\n defineService,\n });\n\n // Return without casting to preserve the WithDatabaseThis wrapper\n return services;\n };\n\n return new DatabaseFragmentBuilder<\n TSchema,\n TConfig,\n TDeps,\n TService,\n TUsedServices,\n TProvidedServices\n >({\n name: this.#name,\n schema: this.#schema,\n namespace: this.#namespace,\n dependencies: this.#dependencies,\n // Safe cast: servicesCallback returns WithDatabaseThis<TService> but we store it as TService.\n // At runtime, bindServicesToContext will handle the 'this' binding properly.\n services: servicesCallback as (\n context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps & TUsedServices;\n defineService: <T extends Record<string, unknown>>(\n services: WithDatabaseThis<T>,\n ) => WithDatabaseThis<T>;\n } & DatabaseFragmentContext<TSchema>,\n ) => TService,\n usedServices: this.#usedServices,\n providedServices: this.#providedServices,\n });\n } else {\n // Named service\n const [serviceName, fnOrService] = args;\n\n // Create a callback that provides the full context\n const createService = (\n config: TConfig,\n options: FragnoPublicConfig,\n deps: TDeps & TUsedServices,\n ): BoundServices<TService> => {\n const dbContext = this.#createDatabaseContext(\n options,\n this.#schema,\n this.#namespace ?? \"\",\n this.#name,\n );\n\n // Check if fnOrService is a function or a direct object\n let implementation: TService;\n if (typeof fnOrService === \"function\") {\n // It's a callback - call it with context\n // defineService provides typing for service functions\n // It expects the input to already have proper 'this' types on functions\n const defineService = <T extends Record<string, unknown>>(\n services: WithDatabaseThis<T>,\n ): WithDatabaseThis<T> => services;\n\n // Safe cast: we checked that fnOrService is a function\n implementation = (\n fnOrService as (context: {\n config: TConfig;\n fragnoConfig: FragnoPublicConfig;\n deps: TDeps & TUsedServices;\n db: AbstractQuery<TSchema>;\n defineService: <T extends Record<string, unknown>>(\n services: WithDatabaseThis<T>,\n ) => WithDatabaseThis<T>;\n }) => TService\n )({\n config,\n fragnoConfig: options,\n deps,\n db: dbContext.orm,\n defineService,\n });\n } else {\n // It's a direct object\n implementation = fnOrService;\n }\n\n // Bind the service implementation so methods have access to serviceContext\n return bindServicesToContext(\n implementation as Record<string, unknown>,\n ) as BoundServices<TService>;\n };\n\n // We need to evaluate this immediately to store in providedServices\n // For now, we'll create a placeholder that will be evaluated when fragment is instantiated\n // Actually, we need to defer this until fragment instantiation\n // Let's store a function that creates the service\n return new DatabaseFragmentBuilder<\n TSchema,\n TConfig,\n TDeps,\n TServices,\n TUsedServices,\n TProvidedServices & { [K in TServiceName]: BoundServices<TService> }\n >({\n name: this.#name,\n schema: this.#schema,\n namespace: this.#namespace,\n dependencies: this.#dependencies,\n services: this.#services,\n usedServices: this.#usedServices,\n providedServices: {\n ...this.#providedServices,\n [serviceName]: createService,\n } as Record<string, unknown>,\n });\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":"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"}
package/dist/mod.d.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  import { AnySchema } from "./schema/create.js";
2
2
  import { Cursor, CursorData, CursorResult, decodeCursor } from "./query/cursor.js";
3
+ import { IUnitOfWorkBase, UOWCompiler, UOWDecoder, UOWExecutor, UnitOfWork, UnitOfWorkSchemaView, createUnitOfWork } from "./query/unit-of-work.js";
3
4
  import { AbstractQuery } from "./query/query.js";
4
5
  import { DatabaseAdapter } from "./adapters/adapters.js";
5
- import { DatabaseFragmentBuilder, DatabaseFragmentContext, FragnoPublicConfigWithDatabase, defineFragmentWithDatabase } from "./fragment.js";
6
+ import { BoundServices } from "./bind-services.js";
7
+ import { DatabaseFragmentBuilder, DatabaseFragmentContext, DatabaseRequestThisContext, DatabaseRouteHandler, FragnoPublicConfigWithDatabase, defineFragmentWithDatabase, serviceContext, uowStorage, withUnitOfWork } from "./fragment.js";
6
8
 
7
9
  //#region src/mod.d.ts
8
10
  declare const fragnoDatabaseFakeSymbol: "$fragno-database";
@@ -47,5 +49,5 @@ declare class FragnoDatabase<const T extends AnySchema, TUOWConfig = void> {
47
49
  }
48
50
  declare function defineFragnoDatabase<const TSchema extends AnySchema>(options: CreateFragnoDatabaseDefinitionOptions<TSchema>): FragnoDatabaseDefinition<TSchema>;
49
51
  //#endregion
50
- export { CreateFragnoDatabaseDefinitionOptions, Cursor, type CursorData, type CursorResult, type DatabaseAdapter, DatabaseFragmentBuilder, type DatabaseFragmentContext, FragnoDatabase, FragnoDatabaseDefinition, type FragnoPublicConfigWithDatabase, decodeCursor, defineFragmentWithDatabase, defineFragnoDatabase, fragnoDatabaseFakeSymbol, fragnoDatabaseLibraryVersion, isFragnoDatabase };
52
+ export { type BoundServices, CreateFragnoDatabaseDefinitionOptions, Cursor, type CursorData, type CursorResult, type DatabaseAdapter, DatabaseFragmentBuilder, type DatabaseFragmentContext, type DatabaseRequestThisContext, type DatabaseRouteHandler, FragnoDatabase, FragnoDatabaseDefinition, type FragnoPublicConfigWithDatabase, type IUnitOfWorkBase, type UOWCompiler, type UOWDecoder, type UOWExecutor, UnitOfWork, UnitOfWorkSchemaView, createUnitOfWork, decodeCursor, defineFragmentWithDatabase, defineFragnoDatabase, fragnoDatabaseFakeSymbol, fragnoDatabaseLibraryVersion, isFragnoDatabase, serviceContext, uowStorage, withUnitOfWork };
51
53
  //# sourceMappingURL=mod.d.ts.map
package/dist/mod.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","names":[],"sources":["../src/mod.ts"],"sourcesContent":[],"mappings":";;;;;;;AASa,cAAA,wBAAsD,EAAA,kBAAA;AACtD,cAAA,4BAA6C,EAAA,KAAA;AAEzC,UAAA,qCAAqC,CAAA,UAAW,SAEtD,CAAA,CAAA;EAGK,SAAA,EAAA,MAAA;EAoBH,MAAA,EAvBH,CAuBG;;AAIgD,iBAxB7C,gBAAA,CAwB6C,KAAA,EAAA,OAAA,CAAA,EAAA,KAAA,IAxBF,cAwBE,CAxBa,SAwBb,CAAA;;;;;;AAgBwB,cApBxE,wBAoBwE,CAAA,gBApB/B,SAoB+B,CAAA,CAAA;EAAlB,CAAA,OAAA;EAAc,WAAA,CAAA,OAAA,EAhB1D,qCAgB0D,CAhBpB,CAgBoB,CAAA;EAapE,IAAA,SAAA,CAAA,CAAA,EAAc,MAAA;EAAiB,IAAA,MAAA,CAAA,CAAA,EApBhC,CAoBgC;EAKQ;;;EAMT,MAAA,CAAA,aAAA,IAAA,CAAA,CAAA,OAAA,EAxBN,eAwBM,CAxBU,UAwBV,CAAA,CAAA,EAxBwB,cAwBxB,CAxBuC,CAwBvC,EAxB0C,UAwB1C,CAAA;;;;;;AAgBlB,cA3BZ,cA2BY,CAAA,gBA3BmB,SA2BnB,EAAA,aAAA,IAAA,CAAA,CAAA;EAgBb,CAAA,OAAA;EAIqB,WAAA,CAAA,OAAA,EAAA;IAAhB,SAAA,EAAA,MAAA;IAAe,MAAA,EA1CoB,CA0CpB;IAKhB,OAAA,EA/CgD,eA+C5B,CA/C4C,UA+C5C,CAAA;EAAuB,CAAA;EACV,KA1C1C,wBAAA,GA0C0C,EAAA,OA1CN,wBA0CM;EAAtC,YAAA,CAAA,CAAA,EAtCa,OAsCb,CAtCqB,aAsCrB,CAtCmC,CAsCnC,EAtCsC,UAsCtC,CAAA,CAAA;EACiB,aAAA,CAAA,CAAA,EA3BH,OA2BG,CAAA,OAAA,CAAA;EAAzB,IAAA,SAAA,CAAA,CAAA,EAAA,MAAA;EAAwB,IAAA,MAAA,CAAA,CAAA,EAXf,CAWe;iBAPV,gBAAgB;;iBAKjB,2CAA2C,oBAChD,sCAAsC,WAC9C,yBAAyB"}
1
+ {"version":3,"file":"mod.d.ts","names":[],"sources":["../src/mod.ts"],"sourcesContent":[],"mappings":";;;;;;;;;cASa;cACA;AADA,UAGI,qCAHkD,CAAA,UAGF,SAHE,CAAA,CAAA;EACtD,SAAA,EAAA,MAAA;EAEI,MAAA,EAEP,CAFO;AAKjB;AAoBa,iBApBG,gBAAA,CAoBqB,KAAA,EAAA,OAAA,CAAA,EAAA,KAAA,IApBsB,cAoBtB,CApBqC,SAoBrC,CAAA;;;;;;AAoBA,cApBxB,wBAoBwB,CAAA,gBApBiB,SAoBjB,CAAA,CAAA;EAA6C,CAAA,OAAA;EAAG,WAAA,CAAA,OAAA,EAhB9D,qCAgB8D,CAhBxB,CAgBwB,CAAA;EAAlB,IAAA,SAAA,CAAA,CAAA,EAAA,MAAA;EAAc,IAAA,MAAA,CAAA,CAAA,EAPrE,CAOqE;EAapE;;;EAKmE,MAAA,CAAA,aAAA,IAAA,CAAA,CAAA,OAAA,EAlB3C,eAkB2C,CAlB3B,UAkB2B,CAAA,CAAA,EAlBb,cAkBa,CAlBE,CAkBF,EAlBK,UAkBL,CAAA;;;;;;AAUhD,cAfnB,cAemB,CAAA,gBAfY,SAeZ,EAAA,aAAA,IAAA,CAAA,CAAA;EAAR,CAAA,OAAA;EAYC,WAAA,CAAA,OAAA,EAAA;IAgBb,SAAA,EAAA,MAAA;IAIqB,MAAA,EA1CmB,CA0CnB;IAAhB,OAAA,EA1C+C,eA0C/C,CA1C+D,UA0C/D,CAAA;EAAe,CAAA;EAKhB,KAzCT,wBAAA,GAyC6B,EAAA,OAzCO,wBAyCP;EAAuB,YAAA,CAAA,CAAA,EArCnC,OAqCmC,CArC3B,aAqC2B,CArCb,CAqCa,EArCV,UAqCU,CAAA,CAAA;EACV,aAAA,CAAA,CAAA,EA1BxB,OA0BwB,CAAA,OAAA,CAAA;EAAtC,IAAA,SAAA,CAAA,CAAA,EAAA,MAAA;EACiB,IAAA,MAAA,CAAA,CAAA,EAXhB,CAWgB;EAAzB,IAAA,OAAA,CAAA,CAAA,EAPc,eAOd,CAP8B,UAO9B,CAAA;;iBAFa,2CAA2C,oBAChD,sCAAsC,WAC9C,yBAAyB"}
package/dist/mod.js CHANGED
@@ -1,5 +1,6 @@
1
- import { DatabaseFragmentBuilder, defineFragmentWithDatabase } from "./fragment.js";
1
+ import { DatabaseFragmentBuilder, defineFragmentWithDatabase, serviceContext, uowStorage, withUnitOfWork } from "./fragment.js";
2
2
  import { Cursor, decodeCursor } from "./query/cursor.js";
3
+ import { UnitOfWork, UnitOfWorkSchemaView, createUnitOfWork } from "./query/unit-of-work.js";
3
4
 
4
5
  //#region src/mod.ts
5
6
  const fragnoDatabaseFakeSymbol = "$fragno-database";
@@ -80,5 +81,5 @@ function defineFragnoDatabase(options) {
80
81
  }
81
82
 
82
83
  //#endregion
83
- export { Cursor, DatabaseFragmentBuilder, FragnoDatabase, FragnoDatabaseDefinition, decodeCursor, defineFragmentWithDatabase, defineFragnoDatabase, fragnoDatabaseFakeSymbol, fragnoDatabaseLibraryVersion, isFragnoDatabase };
84
+ export { Cursor, DatabaseFragmentBuilder, FragnoDatabase, FragnoDatabaseDefinition, UnitOfWork, UnitOfWorkSchemaView, createUnitOfWork, decodeCursor, defineFragmentWithDatabase, defineFragnoDatabase, fragnoDatabaseFakeSymbol, fragnoDatabaseLibraryVersion, isFragnoDatabase, serviceContext, uowStorage, withUnitOfWork };
84
85
  //# sourceMappingURL=mod.js.map
package/dist/mod.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mod.js","names":["#namespace","#schema","#adapter"],"sources":["../src/mod.ts"],"sourcesContent":["import type { DatabaseAdapter } from \"./adapters/adapters\";\nimport type { AnySchema } from \"./schema/create\";\nimport type { AbstractQuery } from \"./query/query\";\nimport type { CursorResult } from \"./query/cursor\";\nimport { Cursor } from \"./query/cursor\";\n\nexport type { DatabaseAdapter, CursorResult };\nexport { Cursor };\n\nexport const fragnoDatabaseFakeSymbol = \"$fragno-database\" as const;\nexport const fragnoDatabaseLibraryVersion = \"0.1\" as const;\n\nexport interface CreateFragnoDatabaseDefinitionOptions<T extends AnySchema> {\n namespace: string;\n schema: T;\n}\n\nexport function isFragnoDatabase(value: unknown): value is FragnoDatabase<AnySchema> {\n if (value instanceof FragnoDatabase) {\n return true;\n }\n\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n return (\n fragnoDatabaseFakeSymbol in value &&\n value[fragnoDatabaseFakeSymbol] === fragnoDatabaseFakeSymbol\n );\n}\n\n/**\n * Definition of a Fragno database schema and namespace.\n * Created by library authors using defineFragnoDatabase().\n * Apps instantiate it by calling .create(adapter).\n */\nexport class FragnoDatabaseDefinition<const T extends AnySchema> {\n #namespace: string;\n #schema: T;\n\n constructor(options: CreateFragnoDatabaseDefinitionOptions<T>) {\n this.#namespace = options.namespace;\n this.#schema = options.schema;\n }\n\n get namespace() {\n return this.#namespace;\n }\n\n get schema() {\n return this.#schema;\n }\n\n /**\n * Creates a FragnoDatabase instance by binding an adapter to this definition.\n */\n create<TUOWConfig = void>(adapter: DatabaseAdapter<TUOWConfig>): FragnoDatabase<T, TUOWConfig> {\n return new FragnoDatabase({\n namespace: this.#namespace,\n schema: this.#schema,\n adapter,\n });\n }\n}\n\n/**\n * A Fragno database instance with a bound adapter.\n * Created from a FragnoDatabaseDefinition by calling .create(adapter).\n */\nexport class FragnoDatabase<const T extends AnySchema, TUOWConfig = void> {\n #namespace: string;\n #schema: T;\n #adapter: DatabaseAdapter<TUOWConfig>;\n\n constructor(options: { namespace: string; schema: T; adapter: DatabaseAdapter<TUOWConfig> }) {\n this.#namespace = options.namespace;\n this.#schema = options.schema;\n this.#adapter = options.adapter;\n }\n\n get [fragnoDatabaseFakeSymbol](): typeof fragnoDatabaseFakeSymbol {\n return fragnoDatabaseFakeSymbol;\n }\n\n async createClient(): Promise<AbstractQuery<T, TUOWConfig>> {\n const dbVersion = await this.#adapter.getSchemaVersion(this.#namespace);\n if (dbVersion !== this.#schema.version.toString()) {\n throw new Error(\n `Database is not at expected version. Did you forget to run migrations?` +\n ` Current version: ${dbVersion}, Expected version: ${this.#schema.version}`,\n );\n }\n\n return this.#adapter.createQueryEngine(this.#schema, this.#namespace);\n }\n\n async runMigrations(): Promise<boolean> {\n if (!this.#adapter.createMigrationEngine) {\n throw new Error(\"Migration engine not supported for this adapter.\");\n }\n\n const migrator = this.#adapter.createMigrationEngine(this.#schema, this.#namespace);\n const preparedMigration = await migrator.prepareMigration();\n await preparedMigration.execute();\n\n return preparedMigration.operations.length > 0;\n }\n\n get namespace() {\n return this.#namespace;\n }\n\n get schema() {\n return this.#schema;\n }\n\n get adapter(): DatabaseAdapter<TUOWConfig> {\n return this.#adapter;\n }\n}\n\nexport function defineFragnoDatabase<const TSchema extends AnySchema>(\n options: CreateFragnoDatabaseDefinitionOptions<TSchema>,\n): FragnoDatabaseDefinition<TSchema> {\n return new FragnoDatabaseDefinition(options);\n}\n\nexport {\n defineFragmentWithDatabase,\n DatabaseFragmentBuilder,\n type FragnoPublicConfigWithDatabase,\n type DatabaseFragmentContext,\n} from \"./fragment\";\n\nexport { decodeCursor, type CursorData } from \"./query/cursor\";\n"],"mappings":";;;;AASA,MAAa,2BAA2B;AACxC,MAAa,+BAA+B;AAO5C,SAAgB,iBAAiB,OAAoD;AACnF,KAAI,iBAAiB,eACnB,QAAO;AAGT,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC,QAAO;AAGT,QACE,4BAA4B,SAC5B,MAAM,8BAA8B;;;;;;;AASxC,IAAa,2BAAb,MAAiE;CAC/D;CACA;CAEA,YAAY,SAAmD;AAC7D,QAAKA,YAAa,QAAQ;AAC1B,QAAKC,SAAU,QAAQ;;CAGzB,IAAI,YAAY;AACd,SAAO,MAAKD;;CAGd,IAAI,SAAS;AACX,SAAO,MAAKC;;;;;CAMd,OAA0B,SAAqE;AAC7F,SAAO,IAAI,eAAe;GACxB,WAAW,MAAKD;GAChB,QAAQ,MAAKC;GACb;GACD,CAAC;;;;;;;AAQN,IAAa,iBAAb,MAA0E;CACxE;CACA;CACA;CAEA,YAAY,SAAiF;AAC3F,QAAKD,YAAa,QAAQ;AAC1B,QAAKC,SAAU,QAAQ;AACvB,QAAKC,UAAW,QAAQ;;CAG1B,KAAK,4BAA6D;AAChE,SAAO;;CAGT,MAAM,eAAsD;EAC1D,MAAM,YAAY,MAAM,MAAKA,QAAS,iBAAiB,MAAKF,UAAW;AACvE,MAAI,cAAc,MAAKC,OAAQ,QAAQ,UAAU,CAC/C,OAAM,IAAI,MACR,2FACuB,UAAU,sBAAsB,MAAKA,OAAQ,UACrE;AAGH,SAAO,MAAKC,QAAS,kBAAkB,MAAKD,QAAS,MAAKD,UAAW;;CAGvE,MAAM,gBAAkC;AACtC,MAAI,CAAC,MAAKE,QAAS,sBACjB,OAAM,IAAI,MAAM,mDAAmD;EAIrE,MAAM,oBAAoB,MADT,MAAKA,QAAS,sBAAsB,MAAKD,QAAS,MAAKD,UAAW,CAC1C,kBAAkB;AAC3D,QAAM,kBAAkB,SAAS;AAEjC,SAAO,kBAAkB,WAAW,SAAS;;CAG/C,IAAI,YAAY;AACd,SAAO,MAAKA;;CAGd,IAAI,SAAS;AACX,SAAO,MAAKC;;CAGd,IAAI,UAAuC;AACzC,SAAO,MAAKC;;;AAIhB,SAAgB,qBACd,SACmC;AACnC,QAAO,IAAI,yBAAyB,QAAQ"}
1
+ {"version":3,"file":"mod.js","names":["#namespace","#schema","#adapter"],"sources":["../src/mod.ts"],"sourcesContent":["import type { DatabaseAdapter } from \"./adapters/adapters\";\nimport type { AnySchema } from \"./schema/create\";\nimport type { AbstractQuery } from \"./query/query\";\nimport type { CursorResult } from \"./query/cursor\";\nimport { Cursor } from \"./query/cursor\";\n\nexport type { DatabaseAdapter, CursorResult };\nexport { Cursor };\n\nexport const fragnoDatabaseFakeSymbol = \"$fragno-database\" as const;\nexport const fragnoDatabaseLibraryVersion = \"0.1\" as const;\n\nexport interface CreateFragnoDatabaseDefinitionOptions<T extends AnySchema> {\n namespace: string;\n schema: T;\n}\n\nexport function isFragnoDatabase(value: unknown): value is FragnoDatabase<AnySchema> {\n if (value instanceof FragnoDatabase) {\n return true;\n }\n\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n return (\n fragnoDatabaseFakeSymbol in value &&\n value[fragnoDatabaseFakeSymbol] === fragnoDatabaseFakeSymbol\n );\n}\n\n/**\n * Definition of a Fragno database schema and namespace.\n * Created by library authors using defineFragnoDatabase().\n * Apps instantiate it by calling .create(adapter).\n */\nexport class FragnoDatabaseDefinition<const T extends AnySchema> {\n #namespace: string;\n #schema: T;\n\n constructor(options: CreateFragnoDatabaseDefinitionOptions<T>) {\n this.#namespace = options.namespace;\n this.#schema = options.schema;\n }\n\n get namespace() {\n return this.#namespace;\n }\n\n get schema() {\n return this.#schema;\n }\n\n /**\n * Creates a FragnoDatabase instance by binding an adapter to this definition.\n */\n create<TUOWConfig = void>(adapter: DatabaseAdapter<TUOWConfig>): FragnoDatabase<T, TUOWConfig> {\n return new FragnoDatabase({\n namespace: this.#namespace,\n schema: this.#schema,\n adapter,\n });\n }\n}\n\n/**\n * A Fragno database instance with a bound adapter.\n * Created from a FragnoDatabaseDefinition by calling .create(adapter).\n */\nexport class FragnoDatabase<const T extends AnySchema, TUOWConfig = void> {\n #namespace: string;\n #schema: T;\n #adapter: DatabaseAdapter<TUOWConfig>;\n\n constructor(options: { namespace: string; schema: T; adapter: DatabaseAdapter<TUOWConfig> }) {\n this.#namespace = options.namespace;\n this.#schema = options.schema;\n this.#adapter = options.adapter;\n }\n\n get [fragnoDatabaseFakeSymbol](): typeof fragnoDatabaseFakeSymbol {\n return fragnoDatabaseFakeSymbol;\n }\n\n async createClient(): Promise<AbstractQuery<T, TUOWConfig>> {\n const dbVersion = await this.#adapter.getSchemaVersion(this.#namespace);\n if (dbVersion !== this.#schema.version.toString()) {\n throw new Error(\n `Database is not at expected version. Did you forget to run migrations?` +\n ` Current version: ${dbVersion}, Expected version: ${this.#schema.version}`,\n );\n }\n\n return this.#adapter.createQueryEngine(this.#schema, this.#namespace);\n }\n\n async runMigrations(): Promise<boolean> {\n if (!this.#adapter.createMigrationEngine) {\n throw new Error(\"Migration engine not supported for this adapter.\");\n }\n\n const migrator = this.#adapter.createMigrationEngine(this.#schema, this.#namespace);\n const preparedMigration = await migrator.prepareMigration();\n await preparedMigration.execute();\n\n return preparedMigration.operations.length > 0;\n }\n\n get namespace() {\n return this.#namespace;\n }\n\n get schema() {\n return this.#schema;\n }\n\n get adapter(): DatabaseAdapter<TUOWConfig> {\n return this.#adapter;\n }\n}\n\nexport function defineFragnoDatabase<const TSchema extends AnySchema>(\n options: CreateFragnoDatabaseDefinitionOptions<TSchema>,\n): FragnoDatabaseDefinition<TSchema> {\n return new FragnoDatabaseDefinition(options);\n}\n\nexport {\n defineFragmentWithDatabase,\n DatabaseFragmentBuilder,\n type FragnoPublicConfigWithDatabase,\n type DatabaseFragmentContext,\n type DatabaseRouteHandler,\n} from \"./fragment\";\n\nexport { decodeCursor, type CursorData } from \"./query/cursor\";\n\nexport {\n createUnitOfWork,\n UnitOfWork,\n UnitOfWorkSchemaView,\n type IUnitOfWorkBase,\n type UOWCompiler,\n type UOWExecutor,\n type UOWDecoder,\n} from \"./query/unit-of-work\";\n\nexport {\n withUnitOfWork,\n serviceContext,\n uowStorage,\n type DatabaseRequestThisContext,\n} from \"./fragment\";\nexport { type BoundServices } from \"./bind-services\";\n"],"mappings":";;;;;AASA,MAAa,2BAA2B;AACxC,MAAa,+BAA+B;AAO5C,SAAgB,iBAAiB,OAAoD;AACnF,KAAI,iBAAiB,eACnB,QAAO;AAGT,KAAI,OAAO,UAAU,YAAY,UAAU,KACzC,QAAO;AAGT,QACE,4BAA4B,SAC5B,MAAM,8BAA8B;;;;;;;AASxC,IAAa,2BAAb,MAAiE;CAC/D;CACA;CAEA,YAAY,SAAmD;AAC7D,QAAKA,YAAa,QAAQ;AAC1B,QAAKC,SAAU,QAAQ;;CAGzB,IAAI,YAAY;AACd,SAAO,MAAKD;;CAGd,IAAI,SAAS;AACX,SAAO,MAAKC;;;;;CAMd,OAA0B,SAAqE;AAC7F,SAAO,IAAI,eAAe;GACxB,WAAW,MAAKD;GAChB,QAAQ,MAAKC;GACb;GACD,CAAC;;;;;;;AAQN,IAAa,iBAAb,MAA0E;CACxE;CACA;CACA;CAEA,YAAY,SAAiF;AAC3F,QAAKD,YAAa,QAAQ;AAC1B,QAAKC,SAAU,QAAQ;AACvB,QAAKC,UAAW,QAAQ;;CAG1B,KAAK,4BAA6D;AAChE,SAAO;;CAGT,MAAM,eAAsD;EAC1D,MAAM,YAAY,MAAM,MAAKA,QAAS,iBAAiB,MAAKF,UAAW;AACvE,MAAI,cAAc,MAAKC,OAAQ,QAAQ,UAAU,CAC/C,OAAM,IAAI,MACR,2FACuB,UAAU,sBAAsB,MAAKA,OAAQ,UACrE;AAGH,SAAO,MAAKC,QAAS,kBAAkB,MAAKD,QAAS,MAAKD,UAAW;;CAGvE,MAAM,gBAAkC;AACtC,MAAI,CAAC,MAAKE,QAAS,sBACjB,OAAM,IAAI,MAAM,mDAAmD;EAIrE,MAAM,oBAAoB,MADT,MAAKA,QAAS,sBAAsB,MAAKD,QAAS,MAAKD,UAAW,CAC1C,kBAAkB;AAC3D,QAAM,kBAAkB,SAAS;AAEjC,SAAO,kBAAkB,WAAW,SAAS;;CAG/C,IAAI,YAAY;AACd,SAAO,MAAKA;;CAGd,IAAI,SAAS;AACX,SAAO,MAAKC;;CAGd,IAAI,UAAuC;AACzC,SAAO,MAAKC;;;AAIhB,SAAgB,qBACd,SACmC;AACnC,QAAO,IAAI,yBAAyB,QAAQ"}
@@ -1,8 +1,8 @@
1
1
  import { AnySchema, AnyTable, FragnoId, IdColumn, Relation } from "../schema/create.js";
2
2
  import { Condition, ConditionBuilder } from "./condition-builder.js";
3
3
  import { CursorResult } from "./cursor.js";
4
- import { DeleteBuilder, FindBuilder, UnitOfWork, UpdateBuilder, UpdateManyBuilder } from "./unit-of-work.js";
5
4
  import { Prettify } from "../util/types.js";
5
+ import { DeleteBuilder, FindBuilder, UnitOfWork, UpdateBuilder, UpdateManyBuilder } from "./unit-of-work.js";
6
6
 
7
7
  //#region src/query/query.d.ts
8
8
  type AnySelectClause = SelectClause<AnyTable>;
@@ -96,5 +96,5 @@ interface AbstractQuery<TSchema extends AnySchema, TUOWConfig = void> {
96
96
  createUnitOfWork: (name?: string, config?: TUOWConfig) => UnitOfWork<TSchema, []>;
97
97
  }
98
98
  //#endregion
99
- export { AbstractQuery, AnySelectClause, FindFirstOptions, FindManyOptions, JoinBuilder, OrderBy, RawColumnValues, SelectClause, SelectResult, TableToColumnValues, TableToInsertValues, TableToUpdateValues };
99
+ export { AbstractQuery, AnySelectClause, ExtractJoinOut, ExtractSelect, FindFirstOptions, FindManyOptions, JoinBuilder, OrderBy, RawColumnValues, SelectClause, SelectResult, TableToColumnValues, TableToInsertValues, TableToUpdateValues };
100
100
  //# sourceMappingURL=query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","names":[],"sources":["../../src/query/query.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"query.d.ts","names":[],"sources":["../../src/query/query.ts"],"sourcesContent":[],"mappings":"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"}
@@ -2,7 +2,8 @@ import { AnySchema, AnyTable, FragnoId, IdColumn, Index, Relation } from "../sch
2
2
  import { Condition, ConditionBuilder } from "./condition-builder.js";
3
3
  import { CompiledJoin } from "./orm/orm.js";
4
4
  import { Cursor, CursorResult } from "./cursor.js";
5
- import { SelectClause, SelectResult, TableToInsertValues, TableToUpdateValues } from "./query.js";
5
+ import { Prettify } from "../util/types.js";
6
+ import { ExtractJoinOut, ExtractSelect, SelectClause, SelectResult, TableToInsertValues, TableToUpdateValues } from "./query.js";
6
7
 
7
8
  //#region src/query/unit-of-work.d.ts
8
9
 
@@ -96,12 +97,16 @@ type UOWState = "building-retrieval" | "building-mutation" | "executed";
96
97
  */
97
98
  type RetrievalOperation<TSchema extends AnySchema, TTable extends AnyTable = TSchema["tables"][keyof TSchema["tables"]]> = {
98
99
  type: "find";
100
+ schema: TSchema;
101
+ namespace?: string;
99
102
  table: TTable;
100
103
  indexName: string;
101
104
  options: FindOptions<TTable, SelectClause<TTable>>;
102
105
  withCursor?: boolean;
103
106
  } | {
104
107
  type: "count";
108
+ schema: TSchema;
109
+ namespace?: string;
105
110
  table: TTable;
106
111
  indexName: string;
107
112
  options: Pick<FindOptions<TTable>, "where" | "useIndex">;
@@ -111,17 +116,23 @@ type RetrievalOperation<TSchema extends AnySchema, TTable extends AnyTable = TSc
111
116
  */
112
117
  type MutationOperation<TSchema extends AnySchema, TTable extends AnyTable = TSchema["tables"][keyof TSchema["tables"]]> = {
113
118
  type: "update";
119
+ schema: TSchema;
120
+ namespace?: string;
114
121
  table: TTable["name"];
115
122
  id: FragnoId | string;
116
123
  checkVersion: boolean;
117
124
  set: TableToUpdateValues<TTable>;
118
125
  } | {
119
126
  type: "create";
127
+ schema: TSchema;
128
+ namespace?: string;
120
129
  table: TTable["name"];
121
130
  values: TableToInsertValues<TTable>;
122
131
  generatedExternalId: string;
123
132
  } | {
124
133
  type: "delete";
134
+ schema: TSchema;
135
+ namespace?: string;
125
136
  table: TTable["name"];
126
137
  id: FragnoId | string;
127
138
  checkVersion: boolean;
@@ -141,15 +152,15 @@ interface CompiledMutation<TOutput> {
141
152
  /**
142
153
  * Compiler interface for Unit of Work operations
143
154
  */
144
- interface UOWCompiler<TSchema extends AnySchema, TOutput> {
155
+ interface UOWCompiler<TOutput> {
145
156
  /**
146
157
  * Compile a retrieval operation to the adapter's query format
147
158
  */
148
- compileRetrievalOperation(op: RetrievalOperation<TSchema>): TOutput | null;
159
+ compileRetrievalOperation(op: RetrievalOperation<AnySchema>): TOutput | null;
149
160
  /**
150
161
  * Compile a mutation operation to the adapter's query format
151
162
  */
152
- compileMutationOperation(op: MutationOperation<TSchema>): CompiledMutation<TOutput> | null;
163
+ compileMutationOperation(op: MutationOperation<AnySchema>): CompiledMutation<TOutput> | null;
153
164
  }
154
165
  type MutationResult = {
155
166
  success: true;
@@ -178,7 +189,7 @@ interface UOWExecutor<TOutput, TRawResult = unknown> {
178
189
  * Transforms raw database results into application format (e.g., converting raw columns
179
190
  * into FragnoId objects with external ID, internal ID, and version).
180
191
  */
181
- interface UOWDecoder<TSchema extends AnySchema, TRawInput = unknown> {
192
+ interface UOWDecoder<TRawInput = unknown> {
182
193
  /**
183
194
  * Decode raw database results from the retrieval phase
184
195
  *
@@ -186,7 +197,7 @@ interface UOWDecoder<TSchema extends AnySchema, TRawInput = unknown> {
186
197
  * @param operations - Array of retrieval operations that produced these results
187
198
  * @returns Decoded results in application format
188
199
  */
189
- (rawResults: TRawInput[], operations: RetrievalOperation<TSchema>[]): unknown[];
200
+ (rawResults: TRawInput[], operations: RetrievalOperation<AnySchema>[]): unknown[];
190
201
  }
191
202
  /**
192
203
  * Builder for find operations in Unit of Work
@@ -346,7 +357,25 @@ type IndexedJoinBuilder<TTable extends AnyTable, TJoinOut> = { [K in keyof TTabl
346
357
  * This ensures all join conditions can leverage indexes for optimal performance
347
358
  */
348
359
  declare function buildJoinIndexed<TTable extends AnyTable, TJoinOut>(table: TTable, fn: (builder: IndexedJoinBuilder<TTable, {}>) => IndexedJoinBuilder<TTable, TJoinOut>): CompiledJoin[];
349
- declare function createUnitOfWork<const TSchema extends AnySchema, const TRetrievalResults extends unknown[] = [], const TRawInput = unknown>(schema: TSchema, compiler: UOWCompiler<TSchema, unknown>, executor: UOWExecutor<unknown, TRawInput>, decoder: UOWDecoder<TSchema, TRawInput>, name?: string): UnitOfWork<TSchema, TRetrievalResults, TRawInput>;
360
+ /**
361
+ * Base interface for Unit of Work with schema-agnostic methods only.
362
+ * This allows UOW instances to be passed between services that use different schemas.
363
+ */
364
+ interface IUnitOfWorkBase {
365
+ readonly state: UOWState;
366
+ readonly name: string | undefined;
367
+ readonly retrievalPhase: Promise<unknown[]>;
368
+ readonly mutationPhase: Promise<void>;
369
+ executeRetrieve(): Promise<unknown[]>;
370
+ executeMutations(): Promise<{
371
+ success: boolean;
372
+ }>;
373
+ getRetrievalOperations(): ReadonlyArray<RetrievalOperation<AnySchema>>;
374
+ getMutationOperations(): ReadonlyArray<MutationOperation<AnySchema>>;
375
+ getCreatedIds(): FragnoId[];
376
+ forSchema<TOtherSchema extends AnySchema>(schema: TOtherSchema): UnitOfWorkSchemaView<TOtherSchema, [], any>;
377
+ }
378
+ declare function createUnitOfWork<const TSchema extends AnySchema, const TRetrievalResults extends unknown[] = [], const TRawInput = unknown>(schema: TSchema, compiler: UOWCompiler<unknown>, executor: UOWExecutor<unknown, TRawInput>, decoder: UOWDecoder<TRawInput>, name?: string): UnitOfWork<TSchema, TRetrievalResults, TRawInput>;
350
379
  interface UnitOfWorkConfig {
351
380
  dryRun?: boolean;
352
381
  onQuery?: (query: unknown) => void;
@@ -379,12 +408,29 @@ interface UnitOfWorkConfig {
379
408
  * }
380
409
  * ```
381
410
  */
382
- declare class UnitOfWork<const TSchema extends AnySchema, const TRetrievalResults extends unknown[] = [], const TRawInput = unknown> {
411
+ declare class UnitOfWork<const TSchema extends AnySchema, const TRetrievalResults extends unknown[] = [], const TRawInput = unknown> implements IUnitOfWorkBase {
383
412
  #private;
384
- constructor(schema: TSchema, compiler: UOWCompiler<TSchema, unknown>, executor: UOWExecutor<unknown, TRawInput>, decoder: UOWDecoder<TSchema, TRawInput>, name?: string, config?: UnitOfWorkConfig);
413
+ constructor(schema: TSchema, compiler: UOWCompiler<unknown>, executor: UOWExecutor<unknown, TRawInput>, decoder: UOWDecoder<TRawInput>, name?: string, config?: UnitOfWorkConfig, schemaNamespaceMap?: WeakMap<AnySchema, string>);
385
414
  get schema(): TSchema;
415
+ get $results(): Prettify<TRetrievalResults>;
416
+ /**
417
+ * Get a schema-specific view of this UOW for type-safe operations
418
+ * Returns a wrapper that uses a different schema for operations.
419
+ * The namespace is automatically resolved from the schema-namespace map.
420
+ */
421
+ forSchema<TOtherSchema extends AnySchema>(schema: TOtherSchema): UnitOfWorkSchemaView<TOtherSchema, [], TRawInput>;
386
422
  get state(): UOWState;
387
423
  get name(): string | undefined;
424
+ /**
425
+ * Promise that resolves when the retrieval phase is executed
426
+ * Service methods can await this to coordinate multi-phase logic
427
+ */
428
+ get retrievalPhase(): Promise<TRetrievalResults>;
429
+ /**
430
+ * Promise that resolves when the mutation phase is executed
431
+ * Service methods can await this to coordinate multi-phase logic
432
+ */
433
+ get mutationPhase(): Promise<void>;
388
434
  /**
389
435
  * Execute the retrieval phase and transition to mutation phase
390
436
  * Returns all results from find operations
@@ -393,11 +439,12 @@ declare class UnitOfWork<const TSchema extends AnySchema, const TRetrievalResult
393
439
  /**
394
440
  * Add a find operation using a builder callback (retrieval phase only)
395
441
  */
396
- find<TTableName extends keyof TSchema["tables"] & string, TSelect extends SelectClause<TSchema["tables"][TTableName]> = true, TJoinOut = {}>(tableName: TTableName, builderFn?: (builder: Omit<FindBuilder<TSchema["tables"][TTableName]>, "build">) => Omit<FindBuilder<TSchema["tables"][TTableName], TSelect, TJoinOut>, "build"> | void): UnitOfWork<TSchema, [...TRetrievalResults, SelectResult<TSchema["tables"][TTableName], TJoinOut, TSelect>[]], TRawInput>;
442
+ find<TTableName extends keyof TSchema["tables"] & string, const TBuilderResult>(tableName: TTableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TTableName]>, "build">) => TBuilderResult): UnitOfWork<TSchema, [...TRetrievalResults, SelectResult<TSchema["tables"][TTableName], ExtractJoinOut<TBuilderResult>, Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema["tables"][TTableName]>>>[]], TRawInput>;
443
+ find<TTableName extends keyof TSchema["tables"] & string>(tableName: TTableName): UnitOfWork<TSchema, [...TRetrievalResults, SelectResult<TSchema["tables"][TTableName], {}, true>[]], TRawInput>;
397
444
  /**
398
445
  * Add a find operation with cursor metadata (retrieval phase only)
399
446
  */
400
- findWithCursor<TTableName extends keyof TSchema["tables"] & string, TSelect extends SelectClause<TSchema["tables"][TTableName]> = true, TJoinOut = {}>(tableName: TTableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TTableName]>, "build">) => Omit<FindBuilder<TSchema["tables"][TTableName], TSelect, TJoinOut>, "build"> | void): UnitOfWork<TSchema, [...TRetrievalResults, CursorResult<SelectResult<TSchema["tables"][TTableName], TJoinOut, TSelect>>], TRawInput>;
447
+ findWithCursor<TTableName extends keyof TSchema["tables"] & string, const TBuilderResult>(tableName: TTableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TTableName]>, "build">) => TBuilderResult): UnitOfWork<TSchema, [...TRetrievalResults, CursorResult<SelectResult<TSchema["tables"][TTableName], ExtractJoinOut<TBuilderResult>, Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema["tables"][TTableName]>>>>], TRawInput>;
401
448
  /**
402
449
  * Add a create operation (mutation phase only)
403
450
  * Returns a FragnoId with the external ID that can be used immediately in subsequent operations
@@ -421,11 +468,21 @@ declare class UnitOfWork<const TSchema extends AnySchema, const TRetrievalResult
421
468
  /**
422
469
  * Get the retrieval operations (for inspection/debugging)
423
470
  */
424
- getRetrievalOperations(): ReadonlyArray<RetrievalOperation<TSchema>>;
471
+ getRetrievalOperations(): ReadonlyArray<RetrievalOperation<AnySchema>>;
425
472
  /**
426
473
  * Get the mutation operations (for inspection/debugging)
427
474
  */
428
- getMutationOperations(): ReadonlyArray<MutationOperation<TSchema>>;
475
+ getMutationOperations(): ReadonlyArray<MutationOperation<AnySchema>>;
476
+ /**
477
+ * @internal
478
+ * Add a retrieval operation (used by SchemaView)
479
+ */
480
+ addRetrievalOperation(op: RetrievalOperation<AnySchema>): number;
481
+ /**
482
+ * @internal
483
+ * Add a mutation operation (used by SchemaView)
484
+ */
485
+ addMutationOperation(op: MutationOperation<AnySchema>): void;
429
486
  /**
430
487
  * Get the IDs of created entities after executeMutations() has been called.
431
488
  * Returns FragnoId objects with external IDs (always available) and internal IDs
@@ -439,12 +496,40 @@ declare class UnitOfWork<const TSchema extends AnySchema, const TRetrievalResult
439
496
  * @internal
440
497
  * Compile the unit of work to executable queries for testing
441
498
  */
442
- compile<TOutput>(compiler: UOWCompiler<TSchema, TOutput>): {
499
+ compile<TOutput>(compiler: UOWCompiler<TOutput>): {
443
500
  name?: string;
444
501
  retrievalBatch: TOutput[];
445
502
  mutationBatch: CompiledMutation<TOutput>[];
446
503
  };
447
504
  }
505
+ /**
506
+ * A lightweight wrapper around a parent UOW that provides type-safe operations for a different schema.
507
+ * All operations are stored in the parent UOW, but this wrapper ensures the correct schema is used.
508
+ */
509
+ declare class UnitOfWorkSchemaView<const TSchema extends AnySchema, const TRetrievalResults extends unknown[] = [], const TRawInput = unknown> implements IUnitOfWorkBase {
510
+ #private;
511
+ constructor(schema: TSchema, namespace: string | undefined, parent: UnitOfWork<AnySchema, unknown[], TRawInput>);
512
+ get $results(): Prettify<TRetrievalResults>;
513
+ get schema(): TSchema;
514
+ get name(): string | undefined;
515
+ get state(): UOWState;
516
+ get retrievalPhase(): Promise<TRetrievalResults>;
517
+ get mutationPhase(): Promise<void>;
518
+ getRetrievalOperations(): readonly RetrievalOperation<AnySchema, AnyTable>[];
519
+ getMutationOperations(): readonly MutationOperation<AnySchema, AnyTable>[];
520
+ getCreatedIds(): FragnoId[];
521
+ executeRetrieve(): Promise<unknown[]>;
522
+ executeMutations(): Promise<{
523
+ success: boolean;
524
+ }>;
525
+ find<TTableName extends keyof TSchema["tables"] & string, const TBuilderResult>(tableName: TTableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TTableName]>, "build">) => TBuilderResult): UnitOfWorkSchemaView<TSchema, [...TRetrievalResults, SelectResult<TSchema["tables"][TTableName], ExtractJoinOut<TBuilderResult>, Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema["tables"][TTableName]>>>[]], TRawInput>;
526
+ find<TTableName extends keyof TSchema["tables"] & string>(tableName: TTableName): UnitOfWorkSchemaView<TSchema, [...TRetrievalResults, SelectResult<TSchema["tables"][TTableName], {}, true>[]], TRawInput>;
527
+ findWithCursor<TTableName extends keyof TSchema["tables"] & string, const TBuilderResult>(tableName: TTableName, builderFn: (builder: Omit<FindBuilder<TSchema["tables"][TTableName]>, "build">) => TBuilderResult): UnitOfWorkSchemaView<TSchema, [...TRetrievalResults, CursorResult<SelectResult<TSchema["tables"][TTableName], ExtractJoinOut<TBuilderResult>, Extract<ExtractSelect<TBuilderResult>, SelectClause<TSchema["tables"][TTableName]>>>>], TRawInput>;
528
+ create<TableName extends keyof TSchema["tables"] & string>(tableName: TableName, values: TableToInsertValues<TSchema["tables"][TableName]>): FragnoId;
529
+ update<TableName extends keyof TSchema["tables"] & string>(tableName: TableName, id: FragnoId | string, builderFn: (builder: Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build">) => Omit<UpdateBuilder<TSchema["tables"][TableName]>, "build"> | void): void;
530
+ delete<TableName extends keyof TSchema["tables"] & string>(tableName: TableName, id: FragnoId | string, builderFn?: (builder: Omit<DeleteBuilder, "build">) => Omit<DeleteBuilder, "build"> | void): void;
531
+ forSchema<TOtherSchema extends AnySchema>(schema: TOtherSchema): UnitOfWorkSchemaView<TOtherSchema, [], TRawInput>;
532
+ }
448
533
  //#endregion
449
- export { CompiledMutation, DeleteBuilder, FindBuilder, IndexColumns, IndexedConditionBuilder, IndexedJoinBuilder, InferIdColumnName, JoinFindBuilder, MutationOperation, MutationResult, RetrievalOperation, UOWCompiler, UOWDecoder, UOWExecutor, UOWState, UnitOfWork, UnitOfWorkConfig, UpdateBuilder, UpdateManyBuilder, ValidIndexName, buildJoinIndexed, createUnitOfWork };
534
+ export { CompiledMutation, DeleteBuilder, FindBuilder, IUnitOfWorkBase, IndexColumns, IndexedConditionBuilder, IndexedJoinBuilder, InferIdColumnName, JoinFindBuilder, MutationOperation, MutationResult, RetrievalOperation, UOWCompiler, UOWDecoder, UOWExecutor, UOWState, UnitOfWork, UnitOfWorkConfig, UnitOfWorkSchemaView, UpdateBuilder, UpdateManyBuilder, ValidIndexName, buildJoinIndexed, createUnitOfWork };
450
535
  //# sourceMappingURL=unit-of-work.d.ts.map