@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/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";
@@ -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<TSchema extends AnySchema = AnySchema>(): UOWCompiler<
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<TSchema extends AnySchema = AnySchema>(): UOWDecoder<TSchema> {
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<typeof typeTestSchema>(),
705
+ createMockCompiler(),
710
706
  createMockExecutor(),
711
- createMockDecoder<typeof typeTestSchema>(),
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(uow.find).parameter(0).toEqualTypeOf<"users">();
714
+ expectTypeOf<Parameters<typeof uow.find>[0]>().toEqualTypeOf<"users">();
719
715
 
720
716
  uow.find("users", (b) =>
721
717
  b.whereIndex("primary", (eb) => {