@fragno-dev/db 0.1.13 → 0.1.15

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 (178) hide show
  1. package/.turbo/turbo-build.log +179 -132
  2. package/CHANGELOG.md +30 -0
  3. package/dist/adapters/adapters.d.ts +27 -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 +5 -1
  7. package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
  8. package/dist/adapters/drizzle/drizzle-adapter.js +15 -3
  9. package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
  10. package/dist/adapters/drizzle/drizzle-query.js +7 -5
  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 +76 -44
  15. package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +1 -1
  16. package/dist/adapters/drizzle/drizzle-uow-decoder.js +23 -16
  17. package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +1 -1
  18. package/dist/adapters/drizzle/drizzle-uow-executor.js +18 -7
  19. package/dist/adapters/drizzle/drizzle-uow-executor.js.map +1 -1
  20. package/dist/adapters/drizzle/generate.d.ts +4 -1
  21. package/dist/adapters/drizzle/generate.d.ts.map +1 -1
  22. package/dist/adapters/drizzle/generate.js +11 -18
  23. package/dist/adapters/drizzle/generate.js.map +1 -1
  24. package/dist/adapters/drizzle/shared.d.ts +14 -1
  25. package/dist/adapters/drizzle/shared.d.ts.map +1 -0
  26. package/dist/adapters/kysely/kysely-adapter.d.ts +5 -1
  27. package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
  28. package/dist/adapters/kysely/kysely-adapter.js +14 -3
  29. package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
  30. package/dist/adapters/kysely/kysely-query-builder.js +1 -1
  31. package/dist/adapters/kysely/kysely-query-compiler.js +3 -2
  32. package/dist/adapters/kysely/kysely-query-compiler.js.map +1 -1
  33. package/dist/adapters/kysely/kysely-query.d.ts +1 -0
  34. package/dist/adapters/kysely/kysely-query.d.ts.map +1 -1
  35. package/dist/adapters/kysely/kysely-query.js +28 -19
  36. package/dist/adapters/kysely/kysely-query.js.map +1 -1
  37. package/dist/adapters/kysely/kysely-shared.d.ts +14 -0
  38. package/dist/adapters/kysely/kysely-shared.d.ts.map +1 -0
  39. package/dist/adapters/kysely/kysely-shared.js +16 -1
  40. package/dist/adapters/kysely/kysely-shared.js.map +1 -1
  41. package/dist/adapters/kysely/kysely-uow-compiler.js +68 -16
  42. package/dist/adapters/kysely/kysely-uow-compiler.js.map +1 -1
  43. package/dist/adapters/kysely/kysely-uow-executor.js +8 -4
  44. package/dist/adapters/kysely/kysely-uow-executor.js.map +1 -1
  45. package/dist/adapters/kysely/migration/execute-base.js +1 -1
  46. package/dist/adapters/kysely/migration/execute-base.js.map +1 -1
  47. package/dist/db-fragment-definition-builder.d.ts +152 -0
  48. package/dist/db-fragment-definition-builder.d.ts.map +1 -0
  49. package/dist/db-fragment-definition-builder.js +137 -0
  50. package/dist/db-fragment-definition-builder.js.map +1 -0
  51. package/dist/fragments/internal-fragment.d.ts +19 -0
  52. package/dist/fragments/internal-fragment.d.ts.map +1 -0
  53. package/dist/fragments/internal-fragment.js +39 -0
  54. package/dist/fragments/internal-fragment.js.map +1 -0
  55. package/dist/migration-engine/generation-engine.d.ts.map +1 -1
  56. package/dist/migration-engine/generation-engine.js +35 -15
  57. package/dist/migration-engine/generation-engine.js.map +1 -1
  58. package/dist/mod.d.ts +8 -18
  59. package/dist/mod.d.ts.map +1 -1
  60. package/dist/mod.js +7 -34
  61. package/dist/mod.js.map +1 -1
  62. package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js +165 -0
  63. package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js.map +1 -0
  64. package/dist/packages/fragno/dist/api/bind-services.js +20 -0
  65. package/dist/packages/fragno/dist/api/bind-services.js.map +1 -0
  66. package/dist/packages/fragno/dist/api/error.js +48 -0
  67. package/dist/packages/fragno/dist/api/error.js.map +1 -0
  68. package/dist/packages/fragno/dist/api/fragment-definition-builder.js +320 -0
  69. package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -0
  70. package/dist/packages/fragno/dist/api/fragment-instantiator.js +487 -0
  71. package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -0
  72. package/dist/packages/fragno/dist/api/fragno-response.js +73 -0
  73. package/dist/packages/fragno/dist/api/fragno-response.js.map +1 -0
  74. package/dist/packages/fragno/dist/api/internal/response-stream.js +81 -0
  75. package/dist/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
  76. package/dist/packages/fragno/dist/api/internal/route.js +10 -0
  77. package/dist/packages/fragno/dist/api/internal/route.js.map +1 -0
  78. package/dist/packages/fragno/dist/api/mutable-request-state.js +97 -0
  79. package/dist/packages/fragno/dist/api/mutable-request-state.js.map +1 -0
  80. package/dist/packages/fragno/dist/api/request-context-storage.js +43 -0
  81. package/dist/packages/fragno/dist/api/request-context-storage.js.map +1 -0
  82. package/dist/packages/fragno/dist/api/request-input-context.js +118 -0
  83. package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -0
  84. package/dist/packages/fragno/dist/api/request-middleware.js +83 -0
  85. package/dist/packages/fragno/dist/api/request-middleware.js.map +1 -0
  86. package/dist/packages/fragno/dist/api/request-output-context.js +119 -0
  87. package/dist/packages/fragno/dist/api/request-output-context.js.map +1 -0
  88. package/dist/packages/fragno/dist/api/route.js +17 -0
  89. package/dist/packages/fragno/dist/api/route.js.map +1 -0
  90. package/dist/packages/fragno/dist/internal/symbols.js +10 -0
  91. package/dist/packages/fragno/dist/internal/symbols.js.map +1 -0
  92. package/dist/query/cursor.d.ts +10 -2
  93. package/dist/query/cursor.d.ts.map +1 -1
  94. package/dist/query/cursor.js +11 -4
  95. package/dist/query/cursor.js.map +1 -1
  96. package/dist/query/execute-unit-of-work.d.ts +123 -0
  97. package/dist/query/execute-unit-of-work.d.ts.map +1 -0
  98. package/dist/query/execute-unit-of-work.js +184 -0
  99. package/dist/query/execute-unit-of-work.js.map +1 -0
  100. package/dist/query/query.d.ts +3 -3
  101. package/dist/query/query.d.ts.map +1 -1
  102. package/dist/query/result-transform.js +4 -2
  103. package/dist/query/result-transform.js.map +1 -1
  104. package/dist/query/retry-policy.d.ts +88 -0
  105. package/dist/query/retry-policy.d.ts.map +1 -0
  106. package/dist/query/retry-policy.js +61 -0
  107. package/dist/query/retry-policy.js.map +1 -0
  108. package/dist/query/unit-of-work.d.ts +171 -32
  109. package/dist/query/unit-of-work.d.ts.map +1 -1
  110. package/dist/query/unit-of-work.js +530 -133
  111. package/dist/query/unit-of-work.js.map +1 -1
  112. package/dist/schema/serialize.js +12 -7
  113. package/dist/schema/serialize.js.map +1 -1
  114. package/dist/with-database.d.ts +28 -0
  115. package/dist/with-database.d.ts.map +1 -0
  116. package/dist/with-database.js +34 -0
  117. package/dist/with-database.js.map +1 -0
  118. package/package.json +10 -3
  119. package/src/adapters/adapters.ts +30 -0
  120. package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +86 -17
  121. package/src/adapters/drizzle/drizzle-adapter-sqlite.test.ts +291 -7
  122. package/src/adapters/drizzle/drizzle-adapter.test.ts +3 -51
  123. package/src/adapters/drizzle/drizzle-adapter.ts +35 -7
  124. package/src/adapters/drizzle/drizzle-query.ts +25 -15
  125. package/src/adapters/drizzle/drizzle-uow-compiler-mysql.test.ts +1442 -0
  126. package/src/adapters/drizzle/drizzle-uow-compiler-sqlite.test.ts +1414 -0
  127. package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +78 -61
  128. package/src/adapters/drizzle/drizzle-uow-compiler.ts +123 -42
  129. package/src/adapters/drizzle/drizzle-uow-decoder.ts +34 -27
  130. package/src/adapters/drizzle/drizzle-uow-executor.ts +41 -8
  131. package/src/adapters/drizzle/generate.test.ts +102 -269
  132. package/src/adapters/drizzle/generate.ts +12 -30
  133. package/src/adapters/drizzle/test-utils.ts +36 -5
  134. package/src/adapters/kysely/kysely-adapter-pglite.test.ts +66 -22
  135. package/src/adapters/kysely/kysely-adapter-sqlite.test.ts +156 -0
  136. package/src/adapters/kysely/kysely-adapter.ts +25 -2
  137. package/src/adapters/kysely/kysely-query-compiler.ts +3 -8
  138. package/src/adapters/kysely/kysely-query.ts +57 -37
  139. package/src/adapters/kysely/kysely-shared.ts +34 -0
  140. package/src/adapters/kysely/kysely-uow-compiler.test.ts +62 -74
  141. package/src/adapters/kysely/kysely-uow-compiler.ts +92 -24
  142. package/src/adapters/kysely/kysely-uow-executor.ts +26 -7
  143. package/src/adapters/kysely/kysely-uow-joins.test.ts +33 -50
  144. package/src/adapters/kysely/migration/execute-base.ts +1 -1
  145. package/src/db-fragment-definition-builder.test.ts +887 -0
  146. package/src/db-fragment-definition-builder.ts +506 -0
  147. package/src/db-fragment-instantiator.test.ts +467 -0
  148. package/src/db-fragment-integration.test.ts +408 -0
  149. package/src/fragments/internal-fragment.test.ts +160 -0
  150. package/src/fragments/internal-fragment.ts +85 -0
  151. package/src/migration-engine/generation-engine.test.ts +58 -15
  152. package/src/migration-engine/generation-engine.ts +78 -25
  153. package/src/mod.ts +35 -43
  154. package/src/query/cursor.test.ts +119 -0
  155. package/src/query/cursor.ts +17 -4
  156. package/src/query/execute-unit-of-work.test.ts +1310 -0
  157. package/src/query/execute-unit-of-work.ts +463 -0
  158. package/src/query/query.ts +4 -4
  159. package/src/query/result-transform.test.ts +129 -0
  160. package/src/query/result-transform.ts +4 -1
  161. package/src/query/retry-policy.test.ts +217 -0
  162. package/src/query/retry-policy.ts +141 -0
  163. package/src/query/unit-of-work-coordinator.test.ts +833 -0
  164. package/src/query/unit-of-work-types.test.ts +15 -2
  165. package/src/query/unit-of-work.test.ts +878 -200
  166. package/src/query/unit-of-work.ts +963 -321
  167. package/src/schema/serialize.ts +22 -11
  168. package/src/with-database.ts +140 -0
  169. package/tsdown.config.ts +1 -0
  170. package/dist/fragment.d.ts +0 -54
  171. package/dist/fragment.d.ts.map +0 -1
  172. package/dist/fragment.js +0 -92
  173. package/dist/fragment.js.map +0 -1
  174. package/dist/shared/settings-schema.js +0 -36
  175. package/dist/shared/settings-schema.js.map +0 -1
  176. package/src/fragment.test.ts +0 -341
  177. package/src/fragment.ts +0 -198
  178. package/src/shared/settings-schema.ts +0 -61
@@ -1,18 +1,19 @@
1
- import type { DatabaseAdapter } from "../adapters";
1
+ import type { DatabaseAdapter, DatabaseContextStorage } from "../adapters";
2
2
  import { type AnySchema } from "../../schema/create";
3
3
  import type { AbstractQuery } from "../../query/query";
4
4
  import type { SchemaGenerator } from "../../schema-generator/schema-generator";
5
5
  import { generateSchema } from "./generate";
6
6
  import { fromDrizzle, type DrizzleUOWConfig } from "./drizzle-query";
7
7
  import { createTableNameMapper, type DBType, type DrizzleResult } from "./shared";
8
- import { createSettingsManager, settingsSchema } from "../../shared/settings-schema";
9
8
  import { sql } from "drizzle-orm";
9
+ import { settingsSchema, SETTINGS_TABLE_NAME } from "../../fragments/internal-fragment";
10
10
  import {
11
11
  fragnoDatabaseAdapterNameFakeSymbol,
12
12
  fragnoDatabaseAdapterVersionFakeSymbol,
13
13
  } from "../adapters";
14
14
  import type { ConnectionPool } from "../../shared/connection-pool";
15
15
  import { createDrizzleConnectionPool } from "./drizzle-connection-pool";
16
+ import { RequestContextStorage } from "@fragno-dev/core/internal/request-context-storage";
16
17
 
17
18
  export interface DrizzleConfig {
18
19
  db: unknown | (() => unknown | Promise<unknown>);
@@ -22,12 +23,15 @@ export interface DrizzleConfig {
22
23
  export class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
23
24
  #connectionPool: ConnectionPool<DBType>;
24
25
  #provider: "sqlite" | "mysql" | "postgresql";
26
+ #schemaNamespaceMap = new WeakMap<AnySchema, string>();
27
+ #contextStorage: RequestContextStorage<DatabaseContextStorage>;
25
28
 
26
29
  constructor(config: DrizzleConfig) {
27
30
  this.#connectionPool = createDrizzleConnectionPool(
28
31
  config.db as DBType | (() => DBType | Promise<DBType>),
29
32
  );
30
33
  this.#provider = config.provider;
34
+ this.#contextStorage = new RequestContextStorage();
31
35
  }
32
36
 
33
37
  get [fragnoDatabaseAdapterNameFakeSymbol](): string {
@@ -38,10 +42,18 @@ export class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
38
42
  return 0;
39
43
  }
40
44
 
45
+ get contextStorage(): RequestContextStorage<DatabaseContextStorage> {
46
+ return this.#contextStorage;
47
+ }
48
+
41
49
  async close(): Promise<void> {
42
50
  await this.#connectionPool.close();
43
51
  }
44
52
 
53
+ createTableNameMapper(namespace: string) {
54
+ return createTableNameMapper(namespace);
55
+ }
56
+
45
57
  get provider(): "sqlite" | "mysql" | "postgresql" {
46
58
  return this.#provider;
47
59
  }
@@ -68,11 +80,17 @@ export class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
68
80
  }
69
81
 
70
82
  async getSchemaVersion(namespace: string): Promise<string | undefined> {
71
- const queryEngine = this.createQueryEngine(settingsSchema, namespace);
72
- const manager = createSettingsManager(queryEngine, namespace);
83
+ // Note: This looks up arbitrary fragment schema versions (e.g., "my-fragment.schema_version")
84
+ // which are different from Fragno's internal settings (prefixed with SETTINGS_NAMESPACE)
85
+ // So we can't use the internal fragment here, we need direct query engine access
86
+ const queryEngine = this.createQueryEngine(settingsSchema, "");
73
87
 
74
- // Try to read the version key directly
75
- const result = await manager.get("version");
88
+ const uow = queryEngine
89
+ .createUnitOfWork()
90
+ .find(SETTINGS_TABLE_NAME, (b) =>
91
+ b.whereIndex("unique_key", (eb) => eb("key", "=", `${namespace}.schema_version`)),
92
+ );
93
+ const [[result]] = await uow.executeRetrieve();
76
94
  return result?.value;
77
95
  }
78
96
 
@@ -80,9 +98,19 @@ export class DrizzleAdapter implements DatabaseAdapter<DrizzleUOWConfig> {
80
98
  schema: TSchema,
81
99
  namespace: string,
82
100
  ): AbstractQuery<TSchema, DrizzleUOWConfig> {
101
+ // Register schema-namespace mapping
102
+ this.#schemaNamespaceMap.set(schema, namespace);
103
+
83
104
  // Only create mapper if namespace is non-empty
84
105
  const mapper = namespace ? createTableNameMapper(namespace) : undefined;
85
- return fromDrizzle(schema, this.#connectionPool, this.#provider, mapper);
106
+ return fromDrizzle(
107
+ schema,
108
+ this.#connectionPool,
109
+ this.#provider,
110
+ mapper,
111
+ undefined,
112
+ this.#schemaNamespaceMap,
113
+ );
86
114
  }
87
115
 
88
116
  createSchemaGenerator(
@@ -68,6 +68,8 @@ class UpdateManySpecialBuilder<TTable extends AnyTable> {
68
68
  * @param pool - Connection pool for acquiring database connections
69
69
  * @param provider - SQL provider (sqlite, mysql, postgresql)
70
70
  * @param mapper - Optional table name mapper for namespace prefixing
71
+ * @param uowConfig - Optional UOW configuration
72
+ * @param schemaNamespaceMap - Optional WeakMap for schema-to-namespace lookups
71
73
  * @returns An AbstractQuery instance for performing database operations
72
74
  *
73
75
  * @example
@@ -84,9 +86,10 @@ export function fromDrizzle<T extends AnySchema>(
84
86
  provider: "sqlite" | "mysql" | "postgresql",
85
87
  mapper?: TableNameMapper,
86
88
  uowConfig?: DrizzleUOWConfig,
89
+ schemaNamespaceMap?: WeakMap<AnySchema, string>,
87
90
  ): AbstractQuery<T, DrizzleUOWConfig> {
88
91
  function createUOW(opts: { name?: string; config?: DrizzleUOWConfig }) {
89
- const uowCompiler = createDrizzleUOWCompiler(schema, pool, provider, mapper);
92
+ const uowCompiler = createDrizzleUOWCompiler(pool, provider, mapper);
90
93
 
91
94
  const executor: UOWExecutor<DrizzleCompiledQuery, DrizzleResult> = {
92
95
  async executeRetrievalPhase(retrievalBatch: DrizzleCompiledQuery[]) {
@@ -125,24 +128,31 @@ export function fromDrizzle<T extends AnySchema>(
125
128
  },
126
129
  };
127
130
 
128
- const decoder = createDrizzleUOWDecoder(schema, provider);
131
+ const decoder = createDrizzleUOWDecoder(provider);
129
132
 
130
133
  const { onQuery, ...restUowConfig } = opts.config ?? {};
131
134
 
132
- return new UnitOfWork(schema, uowCompiler, executor, decoder, opts.name, {
133
- ...restUowConfig,
134
- onQuery: (query) => {
135
- // Handle both CompiledQuery and CompiledMutation structures
136
- // Retrieval operations return DrizzleCompiledQuery directly: { sql, params }
137
- // Mutation operations return CompiledMutation: { query: DrizzleCompiledQuery, expectedAffectedRows }
138
- const actualQuery =
139
- query && typeof query === "object" && "query" in query
140
- ? (query as CompiledMutation<DrizzleCompiledQuery>).query
141
- : (query as DrizzleCompiledQuery);
142
-
143
- opts.config?.onQuery?.(actualQuery);
135
+ return new UnitOfWork(
136
+ uowCompiler,
137
+ executor,
138
+ decoder,
139
+ opts.name,
140
+ {
141
+ ...restUowConfig,
142
+ onQuery: (query) => {
143
+ // Handle both CompiledQuery and CompiledMutation structures
144
+ // Retrieval operations return DrizzleCompiledQuery directly: { sql, params }
145
+ // Mutation operations return CompiledMutation: { query: DrizzleCompiledQuery, expectedAffectedRows }
146
+ const actualQuery =
147
+ query && typeof query === "object" && "query" in query
148
+ ? (query as CompiledMutation<DrizzleCompiledQuery>).query
149
+ : (query as DrizzleCompiledQuery);
150
+
151
+ opts.config?.onQuery?.(actualQuery);
152
+ },
144
153
  },
145
- });
154
+ schemaNamespaceMap,
155
+ ).forSchema(schema);
146
156
  }
147
157
 
148
158
  return {