@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.
- package/.turbo/turbo-build.log +179 -132
- package/CHANGELOG.md +30 -0
- package/dist/adapters/adapters.d.ts +27 -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 +5 -1
- package/dist/adapters/drizzle/drizzle-adapter.d.ts.map +1 -1
- package/dist/adapters/drizzle/drizzle-adapter.js +15 -3
- package/dist/adapters/drizzle/drizzle-adapter.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-query.js +7 -5
- 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 +76 -44
- package/dist/adapters/drizzle/drizzle-uow-compiler.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-uow-decoder.js +23 -16
- package/dist/adapters/drizzle/drizzle-uow-decoder.js.map +1 -1
- package/dist/adapters/drizzle/drizzle-uow-executor.js +18 -7
- package/dist/adapters/drizzle/drizzle-uow-executor.js.map +1 -1
- package/dist/adapters/drizzle/generate.d.ts +4 -1
- package/dist/adapters/drizzle/generate.d.ts.map +1 -1
- package/dist/adapters/drizzle/generate.js +11 -18
- package/dist/adapters/drizzle/generate.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 +5 -1
- package/dist/adapters/kysely/kysely-adapter.d.ts.map +1 -1
- package/dist/adapters/kysely/kysely-adapter.js +14 -3
- package/dist/adapters/kysely/kysely-adapter.js.map +1 -1
- package/dist/adapters/kysely/kysely-query-builder.js +1 -1
- package/dist/adapters/kysely/kysely-query-compiler.js +3 -2
- package/dist/adapters/kysely/kysely-query-compiler.js.map +1 -1
- package/dist/adapters/kysely/kysely-query.d.ts +1 -0
- package/dist/adapters/kysely/kysely-query.d.ts.map +1 -1
- package/dist/adapters/kysely/kysely-query.js +28 -19
- package/dist/adapters/kysely/kysely-query.js.map +1 -1
- package/dist/adapters/kysely/kysely-shared.d.ts +14 -0
- package/dist/adapters/kysely/kysely-shared.d.ts.map +1 -0
- package/dist/adapters/kysely/kysely-shared.js +16 -1
- package/dist/adapters/kysely/kysely-shared.js.map +1 -1
- package/dist/adapters/kysely/kysely-uow-compiler.js +68 -16
- package/dist/adapters/kysely/kysely-uow-compiler.js.map +1 -1
- package/dist/adapters/kysely/kysely-uow-executor.js +8 -4
- package/dist/adapters/kysely/kysely-uow-executor.js.map +1 -1
- package/dist/adapters/kysely/migration/execute-base.js +1 -1
- package/dist/adapters/kysely/migration/execute-base.js.map +1 -1
- package/dist/db-fragment-definition-builder.d.ts +152 -0
- package/dist/db-fragment-definition-builder.d.ts.map +1 -0
- package/dist/db-fragment-definition-builder.js +137 -0
- package/dist/db-fragment-definition-builder.js.map +1 -0
- package/dist/fragments/internal-fragment.d.ts +19 -0
- package/dist/fragments/internal-fragment.d.ts.map +1 -0
- package/dist/fragments/internal-fragment.js +39 -0
- package/dist/fragments/internal-fragment.js.map +1 -0
- package/dist/migration-engine/generation-engine.d.ts.map +1 -1
- package/dist/migration-engine/generation-engine.js +35 -15
- package/dist/migration-engine/generation-engine.js.map +1 -1
- package/dist/mod.d.ts +8 -18
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +7 -34
- package/dist/mod.js.map +1 -1
- package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js +165 -0
- package/dist/node_modules/.pnpm/rou3@0.7.8/node_modules/rou3/dist/index.js.map +1 -0
- package/dist/packages/fragno/dist/api/bind-services.js +20 -0
- package/dist/packages/fragno/dist/api/bind-services.js.map +1 -0
- package/dist/packages/fragno/dist/api/error.js +48 -0
- package/dist/packages/fragno/dist/api/error.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js +320 -0
- package/dist/packages/fragno/dist/api/fragment-definition-builder.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js +487 -0
- package/dist/packages/fragno/dist/api/fragment-instantiator.js.map +1 -0
- package/dist/packages/fragno/dist/api/fragno-response.js +73 -0
- package/dist/packages/fragno/dist/api/fragno-response.js.map +1 -0
- package/dist/packages/fragno/dist/api/internal/response-stream.js +81 -0
- package/dist/packages/fragno/dist/api/internal/response-stream.js.map +1 -0
- package/dist/packages/fragno/dist/api/internal/route.js +10 -0
- package/dist/packages/fragno/dist/api/internal/route.js.map +1 -0
- package/dist/packages/fragno/dist/api/mutable-request-state.js +97 -0
- package/dist/packages/fragno/dist/api/mutable-request-state.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-context-storage.js +43 -0
- package/dist/packages/fragno/dist/api/request-context-storage.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-input-context.js +118 -0
- package/dist/packages/fragno/dist/api/request-input-context.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-middleware.js +83 -0
- package/dist/packages/fragno/dist/api/request-middleware.js.map +1 -0
- package/dist/packages/fragno/dist/api/request-output-context.js +119 -0
- package/dist/packages/fragno/dist/api/request-output-context.js.map +1 -0
- package/dist/packages/fragno/dist/api/route.js +17 -0
- package/dist/packages/fragno/dist/api/route.js.map +1 -0
- package/dist/packages/fragno/dist/internal/symbols.js +10 -0
- package/dist/packages/fragno/dist/internal/symbols.js.map +1 -0
- package/dist/query/cursor.d.ts +10 -2
- package/dist/query/cursor.d.ts.map +1 -1
- package/dist/query/cursor.js +11 -4
- package/dist/query/cursor.js.map +1 -1
- package/dist/query/execute-unit-of-work.d.ts +123 -0
- package/dist/query/execute-unit-of-work.d.ts.map +1 -0
- package/dist/query/execute-unit-of-work.js +184 -0
- package/dist/query/execute-unit-of-work.js.map +1 -0
- package/dist/query/query.d.ts +3 -3
- package/dist/query/query.d.ts.map +1 -1
- package/dist/query/result-transform.js +4 -2
- package/dist/query/result-transform.js.map +1 -1
- package/dist/query/retry-policy.d.ts +88 -0
- package/dist/query/retry-policy.d.ts.map +1 -0
- package/dist/query/retry-policy.js +61 -0
- package/dist/query/retry-policy.js.map +1 -0
- package/dist/query/unit-of-work.d.ts +171 -32
- package/dist/query/unit-of-work.d.ts.map +1 -1
- package/dist/query/unit-of-work.js +530 -133
- package/dist/query/unit-of-work.js.map +1 -1
- package/dist/schema/serialize.js +12 -7
- package/dist/schema/serialize.js.map +1 -1
- package/dist/with-database.d.ts +28 -0
- package/dist/with-database.d.ts.map +1 -0
- package/dist/with-database.js +34 -0
- package/dist/with-database.js.map +1 -0
- package/package.json +10 -3
- package/src/adapters/adapters.ts +30 -0
- package/src/adapters/drizzle/drizzle-adapter-pglite.test.ts +86 -17
- package/src/adapters/drizzle/drizzle-adapter-sqlite.test.ts +291 -7
- package/src/adapters/drizzle/drizzle-adapter.test.ts +3 -51
- package/src/adapters/drizzle/drizzle-adapter.ts +35 -7
- package/src/adapters/drizzle/drizzle-query.ts +25 -15
- package/src/adapters/drizzle/drizzle-uow-compiler-mysql.test.ts +1442 -0
- package/src/adapters/drizzle/drizzle-uow-compiler-sqlite.test.ts +1414 -0
- package/src/adapters/drizzle/drizzle-uow-compiler.test.ts +78 -61
- package/src/adapters/drizzle/drizzle-uow-compiler.ts +123 -42
- package/src/adapters/drizzle/drizzle-uow-decoder.ts +34 -27
- package/src/adapters/drizzle/drizzle-uow-executor.ts +41 -8
- package/src/adapters/drizzle/generate.test.ts +102 -269
- package/src/adapters/drizzle/generate.ts +12 -30
- package/src/adapters/drizzle/test-utils.ts +36 -5
- package/src/adapters/kysely/kysely-adapter-pglite.test.ts +66 -22
- package/src/adapters/kysely/kysely-adapter-sqlite.test.ts +156 -0
- package/src/adapters/kysely/kysely-adapter.ts +25 -2
- package/src/adapters/kysely/kysely-query-compiler.ts +3 -8
- package/src/adapters/kysely/kysely-query.ts +57 -37
- package/src/adapters/kysely/kysely-shared.ts +34 -0
- package/src/adapters/kysely/kysely-uow-compiler.test.ts +62 -74
- package/src/adapters/kysely/kysely-uow-compiler.ts +92 -24
- package/src/adapters/kysely/kysely-uow-executor.ts +26 -7
- package/src/adapters/kysely/kysely-uow-joins.test.ts +33 -50
- package/src/adapters/kysely/migration/execute-base.ts +1 -1
- package/src/db-fragment-definition-builder.test.ts +887 -0
- package/src/db-fragment-definition-builder.ts +506 -0
- package/src/db-fragment-instantiator.test.ts +467 -0
- package/src/db-fragment-integration.test.ts +408 -0
- package/src/fragments/internal-fragment.test.ts +160 -0
- package/src/fragments/internal-fragment.ts +85 -0
- package/src/migration-engine/generation-engine.test.ts +58 -15
- package/src/migration-engine/generation-engine.ts +78 -25
- package/src/mod.ts +35 -43
- package/src/query/cursor.test.ts +119 -0
- package/src/query/cursor.ts +17 -4
- package/src/query/execute-unit-of-work.test.ts +1310 -0
- package/src/query/execute-unit-of-work.ts +463 -0
- package/src/query/query.ts +4 -4
- package/src/query/result-transform.test.ts +129 -0
- package/src/query/result-transform.ts +4 -1
- package/src/query/retry-policy.test.ts +217 -0
- package/src/query/retry-policy.ts +141 -0
- package/src/query/unit-of-work-coordinator.test.ts +833 -0
- package/src/query/unit-of-work-types.test.ts +15 -2
- package/src/query/unit-of-work.test.ts +878 -200
- package/src/query/unit-of-work.ts +963 -321
- package/src/schema/serialize.ts +22 -11
- package/src/with-database.ts +140 -0
- package/tsdown.config.ts +1 -0
- package/dist/fragment.d.ts +0 -54
- package/dist/fragment.d.ts.map +0 -1
- package/dist/fragment.js +0 -92
- package/dist/fragment.js.map +0 -1
- package/dist/shared/settings-schema.js +0 -36
- package/dist/shared/settings-schema.js.map +0 -1
- package/src/fragment.test.ts +0 -341
- package/src/fragment.ts +0 -198
- 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
|
-
|
|
72
|
-
|
|
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
|
-
|
|
75
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
131
|
+
const decoder = createDrizzleUOWDecoder(provider);
|
|
129
132
|
|
|
130
133
|
const { onQuery, ...restUowConfig } = opts.config ?? {};
|
|
131
134
|
|
|
132
|
-
return new UnitOfWork(
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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 {
|