@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/src/mod.ts
CHANGED
|
@@ -131,6 +131,25 @@ export {
|
|
|
131
131
|
DatabaseFragmentBuilder,
|
|
132
132
|
type FragnoPublicConfigWithDatabase,
|
|
133
133
|
type DatabaseFragmentContext,
|
|
134
|
+
type DatabaseRouteHandler,
|
|
134
135
|
} from "./fragment";
|
|
135
136
|
|
|
136
137
|
export { decodeCursor, type CursorData } from "./query/cursor";
|
|
138
|
+
|
|
139
|
+
export {
|
|
140
|
+
createUnitOfWork,
|
|
141
|
+
UnitOfWork,
|
|
142
|
+
UnitOfWorkSchemaView,
|
|
143
|
+
type IUnitOfWorkBase,
|
|
144
|
+
type UOWCompiler,
|
|
145
|
+
type UOWExecutor,
|
|
146
|
+
type UOWDecoder,
|
|
147
|
+
} from "./query/unit-of-work";
|
|
148
|
+
|
|
149
|
+
export {
|
|
150
|
+
withUnitOfWork,
|
|
151
|
+
serviceContext,
|
|
152
|
+
uowStorage,
|
|
153
|
+
type DatabaseRequestThisContext,
|
|
154
|
+
} from "./fragment";
|
|
155
|
+
export { type BoundServices } from "./bind-services";
|
package/src/query/query.ts
CHANGED
|
@@ -82,7 +82,7 @@ export type OrderBy<Column = string> = [columnName: Column, "asc" | "desc"];
|
|
|
82
82
|
* Extract Select type parameter from a FindBuilder type (handles Omit wrapper)
|
|
83
83
|
* @internal
|
|
84
84
|
*/
|
|
85
|
-
type ExtractSelect<T> =
|
|
85
|
+
export type ExtractSelect<T> =
|
|
86
86
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
87
87
|
T extends FindBuilder<any, infer TSelect, any>
|
|
88
88
|
? TSelect
|
|
@@ -95,7 +95,7 @@ type ExtractSelect<T> =
|
|
|
95
95
|
* Extract JoinOut type parameter from a FindBuilder type (handles Omit wrapper)
|
|
96
96
|
* @internal
|
|
97
97
|
*/
|
|
98
|
-
type ExtractJoinOut<T> =
|
|
98
|
+
export type ExtractJoinOut<T> =
|
|
99
99
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
100
100
|
T extends FindBuilder<any, any, infer TJoinOut>
|
|
101
101
|
? TJoinOut
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { describe, test } from "vitest";
|
|
2
|
+
import { schema, column, idColumn, referenceColumn } from "../schema/create";
|
|
3
|
+
import type { UOWCompiler, UOWExecutor, UOWDecoder } from "./unit-of-work";
|
|
4
|
+
import { createUnitOfWork } from "./unit-of-work";
|
|
5
|
+
|
|
6
|
+
// Test schemas
|
|
7
|
+
const schema1 = schema((s) =>
|
|
8
|
+
s.addTable("users", (t) => t.addColumn("id", idColumn()).addColumn("name", column("string"))),
|
|
9
|
+
);
|
|
10
|
+
|
|
11
|
+
const schema2 = schema((s) =>
|
|
12
|
+
s.addTable("posts", (t) =>
|
|
13
|
+
t
|
|
14
|
+
.addColumn("id", idColumn())
|
|
15
|
+
.addColumn("userId", referenceColumn())
|
|
16
|
+
.addColumn("title", column("string")),
|
|
17
|
+
),
|
|
18
|
+
);
|
|
19
|
+
|
|
20
|
+
// Mock compiler, executor, and decoder
|
|
21
|
+
const mockCompiler: UOWCompiler<string> = {
|
|
22
|
+
compileRetrievalOperation: (op) => `RETRIEVE-${op.type}-${op.table.name}-${op.indexName}`,
|
|
23
|
+
compileMutationOperation: (op) => ({
|
|
24
|
+
query: `MUTATE-${op.type}`,
|
|
25
|
+
expectedAffectedRows: null,
|
|
26
|
+
}),
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
const mockExecutor: UOWExecutor<string, string> = {
|
|
30
|
+
executeRetrievalPhase: async (queries) => queries.map((q) => `RESULT-${q}`),
|
|
31
|
+
executeMutationPhase: async () => ({ success: true, createdInternalIds: [] }),
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const mockDecoder: UOWDecoder<string> = (rawResults) => rawResults.map((r) => ({ decoded: r }));
|
|
35
|
+
|
|
36
|
+
describe("Multi-Schema Unit of Work", () => {
|
|
37
|
+
test("chained operations on view accumulate result types", async () => {
|
|
38
|
+
const uow = createUnitOfWork(schema1, mockCompiler, mockExecutor, mockDecoder);
|
|
39
|
+
|
|
40
|
+
// Chain multiple finds on same view
|
|
41
|
+
const _view1 = uow
|
|
42
|
+
.forSchema(schema1)
|
|
43
|
+
.find("users", (b) => b.whereIndex("primary").select(["id"]))
|
|
44
|
+
.find("users", (b) => b.whereIndex("primary").select(["name"]));
|
|
45
|
+
|
|
46
|
+
const _view2 = uow
|
|
47
|
+
.forSchema(schema2)
|
|
48
|
+
.find("posts", (b) => b.whereIndex("primary").select(["title"]));
|
|
49
|
+
|
|
50
|
+
await uow.executeRetrieve();
|
|
51
|
+
|
|
52
|
+
// const [[users1, users2], [posts]] = await Promise.all([view1.retrievalPhase, view2.retrievalPhase]);
|
|
53
|
+
|
|
54
|
+
// const [users1, users2] = await view1.retrievalPhase;
|
|
55
|
+
|
|
56
|
+
// // expect(users1)
|
|
57
|
+
|
|
58
|
+
// // expectTypeOf(users1).toMatchObjectType<{ id: FragnoId; name: string }[]>();
|
|
59
|
+
// console.log({ users1, users2 });
|
|
60
|
+
|
|
61
|
+
// const [posts] = await view2.retrievalPhase;
|
|
62
|
+
// console.log({ posts });
|
|
63
|
+
});
|
|
64
|
+
});
|
|
@@ -114,6 +114,19 @@ describe("UnitOfWork type tests", () => {
|
|
|
114
114
|
}>();
|
|
115
115
|
});
|
|
116
116
|
|
|
117
|
+
it("should type find with select clause correctly", async () => {
|
|
118
|
+
const uow = createTestUOW();
|
|
119
|
+
|
|
120
|
+
const uow1 = uow.find("users", (b) => b.whereIndex("primary").select(["id", "name"]));
|
|
121
|
+
const [_userResult] = await uow1.executeRetrieve();
|
|
122
|
+
type UserResult = RecursivePrettify<(typeof _userResult)[number]>;
|
|
123
|
+
|
|
124
|
+
expectTypeOf<UserResult>().toEqualTypeOf<{
|
|
125
|
+
id: FragnoId;
|
|
126
|
+
name: string;
|
|
127
|
+
}>();
|
|
128
|
+
});
|
|
129
|
+
|
|
117
130
|
it("should type find with joins correctly", async () => {
|
|
118
131
|
const uow = createTestUOW();
|
|
119
132
|
|
|
@@ -9,14 +9,10 @@ import {
|
|
|
9
9
|
type IndexColumns,
|
|
10
10
|
} from "./unit-of-work";
|
|
11
11
|
import { createIndexedBuilder } from "./condition-builder";
|
|
12
|
-
import type { AnySchema } from "../schema/create";
|
|
13
12
|
import type { AbstractQuery } from "./query";
|
|
14
13
|
|
|
15
14
|
// Mock compiler and executor for testing
|
|
16
|
-
function createMockCompiler
|
|
17
|
-
TSchema,
|
|
18
|
-
unknown
|
|
19
|
-
> {
|
|
15
|
+
function createMockCompiler(): UOWCompiler<unknown> {
|
|
20
16
|
return {
|
|
21
17
|
compileRetrievalOperation: () => null,
|
|
22
18
|
compileMutationOperation: () => null,
|
|
@@ -30,7 +26,7 @@ function createMockExecutor() {
|
|
|
30
26
|
};
|
|
31
27
|
}
|
|
32
28
|
|
|
33
|
-
function createMockDecoder
|
|
29
|
+
function createMockDecoder(): UOWDecoder {
|
|
34
30
|
return (rawResults, operations) => {
|
|
35
31
|
if (rawResults.length !== operations.length) {
|
|
36
32
|
throw new Error("rawResults and operations must have the same length");
|
|
@@ -706,16 +702,16 @@ describe("IndexedConditionBuilder", () => {
|
|
|
706
702
|
|
|
707
703
|
const uow = createUnitOfWork(
|
|
708
704
|
typeTestSchema,
|
|
709
|
-
createMockCompiler
|
|
705
|
+
createMockCompiler(),
|
|
710
706
|
createMockExecutor(),
|
|
711
|
-
createMockDecoder
|
|
707
|
+
createMockDecoder(),
|
|
712
708
|
);
|
|
713
709
|
expectTypeOf(uow.schema).toEqualTypeOf(typeTestSchema);
|
|
714
710
|
expectTypeOf<keyof typeof typeTestSchema.tables>().toEqualTypeOf<"users">();
|
|
715
711
|
type _Query = AbstractQuery<typeof typeTestSchema>;
|
|
716
712
|
expectTypeOf<Parameters<_Query["create"]>[0]>().toEqualTypeOf<"users">();
|
|
717
713
|
|
|
718
|
-
expectTypeOf
|
|
714
|
+
expectTypeOf<Parameters<typeof uow.find>[0]>().toEqualTypeOf<"users">();
|
|
719
715
|
|
|
720
716
|
uow.find("users", (b) =>
|
|
721
717
|
b.whereIndex("primary", (eb) => {
|