@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.
- package/.turbo/turbo-build.log +48 -41
- package/CHANGELOG.md +6 -0
- package/dist/adapters/adapters.d.ts +13 -1
- package/dist/adapters/adapters.d.ts.map +1 -1
- package/dist/adapters/adapters.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.d.ts +2 -0
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +6 -1
- package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-query.js +6 -4
- package/dist/adapters/drizzle/drizzle-query.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts +0 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.d.ts.map +1 -1
- package/dist/adapters/drizzle/drizzle-uow-compiler.js +49 -36
- package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-uow-decoder.js +1 -1
- package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +1 -1
- package/dist/adapters/drizzle/shared.d.ts +14 -1
- package/dist/adapters/drizzle/shared.d.ts.map +1 -0
- package/dist/adapters/kysely/kysely-adapter.d.ts +2 -0
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.js +7 -2
- package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
- package/dist/adapters/kysely/kysely-query.js +5 -3
- package/dist/adapters/kysely/kysely-query.js.map +1 -1
- package/dist/adapters/kysely/kysely-shared.d.ts +11 -0
- package/dist/adapters/kysely/kysely-shared.d.ts.map +1 -0
- package/dist/adapters/kysely/kysely-uow-compiler.js +38 -9
- package/dist/adapters/kysely/kysely-uow-compiler.js.map +1 -1
- package/dist/bind-services.d.ts +7 -0
- package/dist/bind-services.d.ts.map +1 -0
- package/dist/bind-services.js +14 -0
- package/dist/bind-services.js.map +1 -0
- package/dist/fragment.d.ts +131 -12
- package/dist/fragment.d.ts.map +1 -1
- package/dist/fragment.js +107 -8
- package/dist/fragment.js.map +1 -1
- package/dist/mod.d.ts +4 -2
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +3 -2
- package/dist/mod.js.map +1 -1
- package/dist/query/query.d.ts +2 -2
- package/dist/query/query.d.ts.map +1 -1
- package/dist/query/unit-of-work.d.ts +100 -15
- package/dist/query/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work.js +214 -7
- package/dist/query/unit-of-work.js.map +1 -1
- package/package.json +3 -3
- package/src/adapters/adapters.ts +14 -0
- package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +6 -1
- package/src/adapters/drizzle/drizzle-adapter-sqlite.test.ts +133 -5
- package/src/adapters/drizzle/drizzle-adapter.ts +16 -1
- package/src/adapters/drizzle/drizzle-query.ts +26 -15
- package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +57 -57
- package/src/adapters/drizzle/drizzle-uow-compiler.ts +79 -39
- package/src/adapters/drizzle/drizzle-uow-decoder.ts +2 -5
- package/src/adapters/kysely/kysely-adapter-pglite.test.ts +2 -2
- package/src/adapters/kysely/kysely-adapter.ts +16 -1
- package/src/adapters/kysely/kysely-query.ts +26 -15
- package/src/adapters/kysely/kysely-uow-compiler.test.ts +43 -43
- package/src/adapters/kysely/kysely-uow-compiler.ts +50 -14
- package/src/adapters/kysely/kysely-uow-joins.test.ts +30 -30
- package/src/bind-services.test.ts +214 -0
- package/src/bind-services.ts +37 -0
- package/src/db-fragment.test.ts +800 -0
- package/src/fragment.ts +557 -28
- package/src/mod.ts +19 -0
- package/src/query/query.ts +2 -2
- package/src/query/unit-of-work-multi-schema.test.ts +64 -0
- package/src/query/unit-of-work-types.test.ts +13 -0
- package/src/query/unit-of-work.test.ts +5 -9
- package/src/query/unit-of-work.ts +511 -62
- package/src/uow-context-integration.test.ts +102 -0
- package/src/uow-context.test.ts +182 -0
- 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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
package/dist/fragment.js.map
CHANGED
|
@@ -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 {
|
|
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":"
|
|
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":"
|
|
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"}
|
package/dist/query/query.d.ts
CHANGED
|
@@ -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 {
|
|
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<
|
|
155
|
+
interface UOWCompiler<TOutput> {
|
|
145
156
|
/**
|
|
146
157
|
* Compile a retrieval operation to the adapter's query format
|
|
147
158
|
*/
|
|
148
|
-
compileRetrievalOperation(op: RetrievalOperation<
|
|
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<
|
|
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<
|
|
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<
|
|
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
|
-
|
|
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<
|
|
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,
|
|
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,
|
|
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<
|
|
471
|
+
getRetrievalOperations(): ReadonlyArray<RetrievalOperation<AnySchema>>;
|
|
425
472
|
/**
|
|
426
473
|
* Get the mutation operations (for inspection/debugging)
|
|
427
474
|
*/
|
|
428
|
-
getMutationOperations(): ReadonlyArray<MutationOperation<
|
|
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<
|
|
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
|