@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
package/src/schema/serialize.ts
CHANGED
|
@@ -337,8 +337,16 @@ export function deserialize(value: unknown, col: AnyColumn, provider: SQLProvide
|
|
|
337
337
|
|
|
338
338
|
/**
|
|
339
339
|
* Encode to driver value
|
|
340
|
+
*
|
|
341
|
+
* @param skipDriverConversions - Skip driver-level type conversions (Date->number, boolean->0/1, bigint->Buffer).
|
|
342
|
+
* Set to true when using ORMs like Drizzle that handle these conversions internally.
|
|
340
343
|
*/
|
|
341
|
-
export function serialize(
|
|
344
|
+
export function serialize(
|
|
345
|
+
value: unknown,
|
|
346
|
+
col: AnyColumn,
|
|
347
|
+
provider: SQLProvider,
|
|
348
|
+
skipDriverConversions = false,
|
|
349
|
+
) {
|
|
342
350
|
if (value === null) {
|
|
343
351
|
return null;
|
|
344
352
|
}
|
|
@@ -373,18 +381,21 @@ export function serialize(value: unknown, col: AnyColumn, provider: SQLProvider)
|
|
|
373
381
|
return JSON.stringify(value);
|
|
374
382
|
}
|
|
375
383
|
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
384
|
+
// Skip driver-specific type conversions when using ORMs that handle them internally
|
|
385
|
+
if (!skipDriverConversions) {
|
|
386
|
+
if (provider === "sqlite" && value instanceof Date) {
|
|
387
|
+
return value.getTime();
|
|
388
|
+
}
|
|
379
389
|
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
390
|
+
if (provider === "sqlite" && typeof value === "boolean") {
|
|
391
|
+
return value ? 1 : 0;
|
|
392
|
+
}
|
|
383
393
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
394
|
+
if (provider === "sqlite" && typeof value === "bigint") {
|
|
395
|
+
const buf = Buffer.alloc(8);
|
|
396
|
+
buf.writeBigInt64BE(value);
|
|
397
|
+
return buf;
|
|
398
|
+
}
|
|
388
399
|
}
|
|
389
400
|
|
|
390
401
|
// most drivers accept Buffer
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import type { AnySchema } from "./schema/create";
|
|
2
|
+
import type { RequestThisContext, FragnoPublicConfig } from "@fragno-dev/core";
|
|
3
|
+
import { FragmentDefinitionBuilder, instantiate } from "@fragno-dev/core";
|
|
4
|
+
import {
|
|
5
|
+
DatabaseFragmentDefinitionBuilder,
|
|
6
|
+
type DatabaseServiceContext,
|
|
7
|
+
type DatabaseHandlerContext,
|
|
8
|
+
type ImplicitDatabaseDependencies,
|
|
9
|
+
type FragnoPublicConfigWithDatabase,
|
|
10
|
+
type DatabaseRequestStorage,
|
|
11
|
+
} from "./db-fragment-definition-builder";
|
|
12
|
+
import { internalFragmentDef } from "./fragments/internal-fragment";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Helper to add database support to a fragment builder.
|
|
16
|
+
* Automatically links the internal fragment and adds ImplicitDatabaseDependencies to the TDeps type.
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* // With .extend() - recommended
|
|
21
|
+
* const def = defineFragment("my-frag")
|
|
22
|
+
* .extend(withDatabase(mySchema))
|
|
23
|
+
* .withDependencies(...)
|
|
24
|
+
* .build();
|
|
25
|
+
*
|
|
26
|
+
* // Or as a function wrapper
|
|
27
|
+
* const def = withDatabase(mySchema)(defineFragment("my-frag"))
|
|
28
|
+
* .withDependencies(...)
|
|
29
|
+
* .build();
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
export function withDatabase<TSchema extends AnySchema>(
|
|
33
|
+
schema: TSchema,
|
|
34
|
+
namespace?: string,
|
|
35
|
+
): <
|
|
36
|
+
TConfig,
|
|
37
|
+
TDeps,
|
|
38
|
+
TBaseServices,
|
|
39
|
+
TServices,
|
|
40
|
+
TServiceDeps,
|
|
41
|
+
TPrivateServices,
|
|
42
|
+
TServiceThisContext extends RequestThisContext,
|
|
43
|
+
THandlerThisContext extends RequestThisContext,
|
|
44
|
+
TRequestStorage,
|
|
45
|
+
>(
|
|
46
|
+
builder: FragmentDefinitionBuilder<
|
|
47
|
+
TConfig,
|
|
48
|
+
FragnoPublicConfig,
|
|
49
|
+
TDeps,
|
|
50
|
+
TBaseServices,
|
|
51
|
+
TServices,
|
|
52
|
+
TServiceDeps,
|
|
53
|
+
TPrivateServices,
|
|
54
|
+
TServiceThisContext,
|
|
55
|
+
THandlerThisContext,
|
|
56
|
+
TRequestStorage
|
|
57
|
+
>,
|
|
58
|
+
) => DatabaseFragmentDefinitionBuilder<
|
|
59
|
+
TSchema,
|
|
60
|
+
TConfig,
|
|
61
|
+
TDeps & ImplicitDatabaseDependencies<TSchema>,
|
|
62
|
+
TBaseServices,
|
|
63
|
+
TServices,
|
|
64
|
+
TServiceDeps,
|
|
65
|
+
TPrivateServices,
|
|
66
|
+
DatabaseServiceContext,
|
|
67
|
+
DatabaseHandlerContext
|
|
68
|
+
> {
|
|
69
|
+
return <
|
|
70
|
+
TConfig,
|
|
71
|
+
TDeps,
|
|
72
|
+
TBaseServices,
|
|
73
|
+
TServices,
|
|
74
|
+
TServiceDeps,
|
|
75
|
+
TPrivateServices,
|
|
76
|
+
TServiceThisContext extends RequestThisContext,
|
|
77
|
+
THandlerThisContext extends RequestThisContext,
|
|
78
|
+
TRequestStorage,
|
|
79
|
+
>(
|
|
80
|
+
builder: FragmentDefinitionBuilder<
|
|
81
|
+
TConfig,
|
|
82
|
+
FragnoPublicConfig,
|
|
83
|
+
TDeps,
|
|
84
|
+
TBaseServices,
|
|
85
|
+
TServices,
|
|
86
|
+
TServiceDeps,
|
|
87
|
+
TPrivateServices,
|
|
88
|
+
TServiceThisContext,
|
|
89
|
+
THandlerThisContext,
|
|
90
|
+
TRequestStorage
|
|
91
|
+
>,
|
|
92
|
+
) => {
|
|
93
|
+
// Link the internal fragment to all database fragments (except the internal fragment itself)
|
|
94
|
+
// No circular dependency: internal-fragment.ts uses DatabaseFragmentDefinitionBuilder directly
|
|
95
|
+
const isInternalFragment = builder.name === "$fragno-internal-fragment";
|
|
96
|
+
const builderWithInternal = isInternalFragment
|
|
97
|
+
? builder
|
|
98
|
+
: builder.withLinkedFragment("_fragno_internal", ({ config, options }) => {
|
|
99
|
+
// Cast is safe: by the time this callback is invoked during fragment instantiation,
|
|
100
|
+
// the options will be FragnoPublicConfigWithDatabase (enforced by DatabaseFragmentDefinitionBuilder)
|
|
101
|
+
return instantiate(internalFragmentDef)
|
|
102
|
+
.withConfig(config as {})
|
|
103
|
+
.withOptions(options as FragnoPublicConfigWithDatabase)
|
|
104
|
+
.build();
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
// Cast is safe: we're creating a DatabaseFragmentDefinitionBuilder which internally uses
|
|
108
|
+
// FragnoPublicConfigWithDatabase, but the input builder uses FragnoPublicConfig.
|
|
109
|
+
// The database builder's build() method will enforce FragnoPublicConfigWithDatabase at the end.
|
|
110
|
+
// We also add ImplicitDatabaseDependencies to TDeps so they're available in service constructors.
|
|
111
|
+
// Note: We discard TRequestStorage here because database fragments manage their own storage (DatabaseRequestStorage).
|
|
112
|
+
// We set TServiceThisContext to DatabaseServiceContext (restricted) and THandlerThisContext to DatabaseHandlerContext (full).
|
|
113
|
+
return new DatabaseFragmentDefinitionBuilder<
|
|
114
|
+
TSchema,
|
|
115
|
+
TConfig,
|
|
116
|
+
TDeps & ImplicitDatabaseDependencies<TSchema>,
|
|
117
|
+
TBaseServices,
|
|
118
|
+
TServices,
|
|
119
|
+
TServiceDeps,
|
|
120
|
+
TPrivateServices,
|
|
121
|
+
DatabaseServiceContext,
|
|
122
|
+
DatabaseHandlerContext
|
|
123
|
+
>(
|
|
124
|
+
builderWithInternal as unknown as FragmentDefinitionBuilder<
|
|
125
|
+
TConfig,
|
|
126
|
+
FragnoPublicConfigWithDatabase,
|
|
127
|
+
TDeps & ImplicitDatabaseDependencies<TSchema>,
|
|
128
|
+
TBaseServices,
|
|
129
|
+
TServices,
|
|
130
|
+
TServiceDeps,
|
|
131
|
+
TPrivateServices,
|
|
132
|
+
DatabaseServiceContext,
|
|
133
|
+
DatabaseHandlerContext,
|
|
134
|
+
DatabaseRequestStorage
|
|
135
|
+
>,
|
|
136
|
+
schema,
|
|
137
|
+
namespace,
|
|
138
|
+
);
|
|
139
|
+
};
|
|
140
|
+
}
|
package/tsdown.config.ts
CHANGED
package/dist/fragment.d.ts
DELETED
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
import { AnySchema } from "./schema/create.js";
|
|
2
|
-
import { AbstractQuery } from "./query/query.js";
|
|
3
|
-
import { DatabaseAdapter } from "./adapters/adapters.js";
|
|
4
|
-
import { FragmentDefinition, FragnoPublicConfig } from "@fragno-dev/core";
|
|
5
|
-
|
|
6
|
-
//#region src/fragment.d.ts
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* Extended FragnoPublicConfig that includes a database adapter.
|
|
10
|
-
* Use this type when creating fragments with database support.
|
|
11
|
-
*/
|
|
12
|
-
type FragnoPublicConfigWithDatabase = FragnoPublicConfig & {
|
|
13
|
-
databaseAdapter: DatabaseAdapter<any>;
|
|
14
|
-
};
|
|
15
|
-
/**
|
|
16
|
-
* Additional context provided to database fragments containing the database adapter and ORM instance.
|
|
17
|
-
*/
|
|
18
|
-
type DatabaseFragmentContext<TSchema extends AnySchema> = {
|
|
19
|
-
databaseAdapter: DatabaseAdapter<any>;
|
|
20
|
-
orm: AbstractQuery<TSchema>;
|
|
21
|
-
};
|
|
22
|
-
declare class DatabaseFragmentBuilder<const TSchema extends AnySchema, const TConfig, const TDeps = {}, const TServices extends Record<string, unknown> = {}> {
|
|
23
|
-
#private;
|
|
24
|
-
constructor(options: {
|
|
25
|
-
name: string;
|
|
26
|
-
schema?: TSchema;
|
|
27
|
-
namespace?: string;
|
|
28
|
-
dependencies?: (context: {
|
|
29
|
-
config: TConfig;
|
|
30
|
-
fragnoConfig: FragnoPublicConfig;
|
|
31
|
-
} & DatabaseFragmentContext<TSchema>) => TDeps;
|
|
32
|
-
services?: (context: {
|
|
33
|
-
config: TConfig;
|
|
34
|
-
fragnoConfig: FragnoPublicConfig;
|
|
35
|
-
deps: TDeps;
|
|
36
|
-
} & DatabaseFragmentContext<TSchema>) => TServices;
|
|
37
|
-
});
|
|
38
|
-
get $requiredOptions(): FragnoPublicConfigWithDatabase;
|
|
39
|
-
get definition(): FragmentDefinition<TConfig, TDeps, TServices>;
|
|
40
|
-
withDatabase<TNewSchema extends AnySchema>(schema: TNewSchema, namespace?: string): DatabaseFragmentBuilder<TNewSchema, TConfig, TDeps, TServices>;
|
|
41
|
-
withDependencies<TNewDeps>(fn: (context: {
|
|
42
|
-
config: TConfig;
|
|
43
|
-
fragnoConfig: FragnoPublicConfig;
|
|
44
|
-
} & DatabaseFragmentContext<TSchema>) => TNewDeps): DatabaseFragmentBuilder<TSchema, TConfig, TNewDeps, {}>;
|
|
45
|
-
withServices<TNewServices extends Record<string, unknown>>(fn: (context: {
|
|
46
|
-
config: TConfig;
|
|
47
|
-
fragnoConfig: FragnoPublicConfig;
|
|
48
|
-
deps: TDeps;
|
|
49
|
-
} & DatabaseFragmentContext<TSchema>) => TNewServices): DatabaseFragmentBuilder<TSchema, TConfig, TDeps, TNewServices>;
|
|
50
|
-
}
|
|
51
|
-
declare function defineFragmentWithDatabase<TConfig = {}>(name: string): DatabaseFragmentBuilder<never, TConfig, {}, {}>;
|
|
52
|
-
//#endregion
|
|
53
|
-
export { DatabaseFragmentBuilder, DatabaseFragmentContext, FragnoPublicConfigWithDatabase, defineFragmentWithDatabase };
|
|
54
|
-
//# sourceMappingURL=fragment.d.ts.map
|
package/dist/fragment.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fragment.d.ts","names":[],"sources":["../src/fragment.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AASA;AAQA;AAAoD,KARxC,8BAAA,GAAiC,kBAQO,GAAA;EAEjC,eAAA,EARA,eAQA,CAAA,GAAA,CAAA;CACE;;;AAGrB;AACwB,KAPZ,uBAOY,CAAA,gBAP4B,SAO5B,CAAA,GAAA;EAGE,eAAA,EARP,eAQO,CAAA,GAAA,CAAA;EAqBb,GAAA,EA5BN,aA4BM,CA5BQ,OA4BR,CAAA;CAIG;AACM,cA9BT,uBA8BS,CAAA,sBA7BE,SA6BF,EAAA,aAAA,EAAA,cAAA,CAAA,CAAA,EAAA,wBA1BI,MA0BJ,CAAA,MAAA,EAAA,OAAA,CAAA,GAAA,CAAA,CAAA,CAAA,CAAA;EACY,CAAA,OAAA;EAAxB,WAAA,CAAA,OAAA,EAAA;IACD,IAAA,EAAA,MAAA;IAGO,MAAA,CAAA,EAVH,OAUG;IACM,SAAA,CAAA,EAAA,MAAA;IACR,YAAA,CAAA,EAAA,CAAA,OAAA,EAAA;MACoB,MAAA,EATlB,OASkB;MAAxB,YAAA,EARY,kBAQZ;IACD,CAAA,GARC,uBAQD,CARyB,OAQzB,CAAA,EAAA,GAPA,KAOA;IASiB,QAAA,CAAA,EAAA,CAAA,OAAA,EAAA;MAIa,MAAA,EAjBvB,OAiBuB;MAAS,YAAA,EAhB1B,kBAgB0B;MAAO,IAAA,EAfzC,KAeyC;IAAnC,CAAA,GAdV,uBAcU,CAdc,OAcd,CAAA,EAAA,GAbX,SAaW;EAoDc,CAAA;EACtB,IAAA,gBAAA,CAAA,CAAA,EAzDc,8BAyDd;EAEiB,IAAA,UAAA,CAAA,CAAA,EAvDT,kBAuDS,CAvDU,OAuDV,EAvDmB,KAuDnB,EAvD0B,SAuD1B,CAAA;EAAY,YAAA,CAAA,mBAHP,SAGO,CAAA,CAAA,MAAA,EAF7B,UAE6B,EAAA,SAAA,CAAA,EAAA,MAAA,CAAA,EAApC,uBAAoC,CAAZ,UAAY,EAAA,OAAA,EAAS,KAAT,EAAgB,SAAhB,CAAA;EAAS,gBAAA,CAAA,QAAA,CAAA,CAAA,EAAA,EAAA,CAAA,OAAA,EAAA;IAAO,MAAA,EA4BzC,OA5ByC;IAApD,YAAA,EA6BiB,kBA7BjB;EA4BW,CAAA,GAEN,uBAFM,CAEkB,OAFlB,CAAA,EAAA,GAGP,QAHO,CAAA,EAIX,uBAJW,CAIa,OAJb,EAIsB,OAJtB,EAI+B,QAJ/B,EAAA,CAAA,CAAA,CAAA;EACM,YAAA,CAAA,qBAac,MAbd,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,CAAA,EAAA,EAAA,CAAA,OAAA,EAAA;IACY,MAAA,EAelB,OAfkB;IAAxB,YAAA,EAgBY,kBAhBZ;IACD,IAAA,EAgBK,KAhBL;EACoB,CAAA,GAgBnB,uBAhBmB,CAgBK,OAhBL,CAAA,EAAA,GAiBpB,YAjBoB,CAAA,EAkBxB,uBAlBwB,CAkBA,OAlBA,EAkBS,OAlBT,EAkBkB,KAlBlB,EAkByB,YAlBzB,CAAA;;AAAkB,iBA6B/B,0BA7B+B,CAAA,UAAA,CAAA,CAAA,CAAA,CAAA,IAAA,EAAA,MAAA,CAAA,EA+B5C,uBA/B4C,CAAA,KAAA,EA+Bb,OA/Ba,EAAA,CAAA,CAAA,EAAA,CAAA,CAAA,CAAA"}
|
package/dist/fragment.js
DELETED
|
@@ -1,92 +0,0 @@
|
|
|
1
|
-
//#region src/fragment.ts
|
|
2
|
-
var DatabaseFragmentBuilder = class DatabaseFragmentBuilder {
|
|
3
|
-
#name;
|
|
4
|
-
#schema;
|
|
5
|
-
#namespace;
|
|
6
|
-
#dependencies;
|
|
7
|
-
#services;
|
|
8
|
-
constructor(options) {
|
|
9
|
-
this.#name = options.name;
|
|
10
|
-
this.#schema = options.schema;
|
|
11
|
-
this.#namespace = options.namespace;
|
|
12
|
-
this.#dependencies = options.dependencies;
|
|
13
|
-
this.#services = options.services;
|
|
14
|
-
}
|
|
15
|
-
get $requiredOptions() {
|
|
16
|
-
throw new Error("Type only method. Do not call.");
|
|
17
|
-
}
|
|
18
|
-
get definition() {
|
|
19
|
-
const schema = this.#schema;
|
|
20
|
-
const namespace = this.#namespace ?? "";
|
|
21
|
-
const name = this.#name;
|
|
22
|
-
const dependencies = this.#dependencies;
|
|
23
|
-
const services = this.#services;
|
|
24
|
-
return {
|
|
25
|
-
name,
|
|
26
|
-
dependencies: (config, options) => {
|
|
27
|
-
const dbContext = this.#createDatabaseContext(options, schema, namespace, name);
|
|
28
|
-
return dependencies?.({
|
|
29
|
-
config,
|
|
30
|
-
fragnoConfig: options,
|
|
31
|
-
...dbContext
|
|
32
|
-
}) ?? {};
|
|
33
|
-
},
|
|
34
|
-
services: (config, options, deps) => {
|
|
35
|
-
const dbContext = this.#createDatabaseContext(options, schema, namespace, name);
|
|
36
|
-
return services?.({
|
|
37
|
-
config,
|
|
38
|
-
fragnoConfig: options,
|
|
39
|
-
deps,
|
|
40
|
-
...dbContext
|
|
41
|
-
}) ?? {};
|
|
42
|
-
},
|
|
43
|
-
additionalContext: {
|
|
44
|
-
databaseSchema: schema,
|
|
45
|
-
databaseNamespace: namespace
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
}
|
|
49
|
-
#createDatabaseContext(options, schema, namespace, name) {
|
|
50
|
-
const databaseAdapter = options.databaseAdapter;
|
|
51
|
-
if (!databaseAdapter) throw new Error(`Fragment '${name}' requires a database adapter in options.databaseAdapter`);
|
|
52
|
-
if (!schema) throw new Error(`Fragment '${name}' requires a schema. Use withDatabase() to provide one.`);
|
|
53
|
-
return {
|
|
54
|
-
databaseAdapter,
|
|
55
|
-
orm: databaseAdapter.createQueryEngine(schema, namespace)
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
withDatabase(schema, namespace) {
|
|
59
|
-
return new DatabaseFragmentBuilder({
|
|
60
|
-
name: this.#name,
|
|
61
|
-
schema,
|
|
62
|
-
namespace: namespace ?? this.#name + "-db",
|
|
63
|
-
dependencies: this.#dependencies,
|
|
64
|
-
services: this.#services
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
withDependencies(fn) {
|
|
68
|
-
return new DatabaseFragmentBuilder({
|
|
69
|
-
name: this.#name,
|
|
70
|
-
schema: this.#schema,
|
|
71
|
-
namespace: this.#namespace,
|
|
72
|
-
dependencies: fn,
|
|
73
|
-
services: void 0
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
withServices(fn) {
|
|
77
|
-
return new DatabaseFragmentBuilder({
|
|
78
|
-
name: this.#name,
|
|
79
|
-
schema: this.#schema,
|
|
80
|
-
namespace: this.#namespace,
|
|
81
|
-
dependencies: this.#dependencies,
|
|
82
|
-
services: fn
|
|
83
|
-
});
|
|
84
|
-
}
|
|
85
|
-
};
|
|
86
|
-
function defineFragmentWithDatabase(name) {
|
|
87
|
-
return new DatabaseFragmentBuilder({ name });
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
//#endregion
|
|
91
|
-
export { DatabaseFragmentBuilder, defineFragmentWithDatabase };
|
|
92
|
-
//# sourceMappingURL=fragment.js.map
|
package/dist/fragment.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
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,36 +0,0 @@
|
|
|
1
|
-
import { column, idColumn, schema } from "../schema/create.js";
|
|
2
|
-
|
|
3
|
-
//#region src/shared/settings-schema.ts
|
|
4
|
-
const SETTINGS_TABLE_NAME = "fragno_db_settings";
|
|
5
|
-
const SETTINGS_NAMESPACE = "fragno-db-settings";
|
|
6
|
-
const settingsSchema = schema((s) => {
|
|
7
|
-
return s.addTable(SETTINGS_TABLE_NAME, (t) => {
|
|
8
|
-
return t.addColumn("id", idColumn()).addColumn("key", column("string")).addColumn("value", column("string")).createIndex("unique_key", ["key"], { unique: true });
|
|
9
|
-
});
|
|
10
|
-
});
|
|
11
|
-
function createSettingsManager(queryEngine, namespace) {
|
|
12
|
-
return {
|
|
13
|
-
async get(key) {
|
|
14
|
-
const [[result]] = await queryEngine.createUnitOfWork().find(SETTINGS_TABLE_NAME, (b) => b.whereIndex("unique_key", (eb) => eb("key", "=", `${namespace}.${key}`))).executeRetrieve();
|
|
15
|
-
return result;
|
|
16
|
-
},
|
|
17
|
-
async set(key, value) {
|
|
18
|
-
const uow = queryEngine.createUnitOfWork("createSettingsManager#set").find(SETTINGS_TABLE_NAME, (b) => b.whereIndex("unique_key", (eb) => eb("key", "=", `${namespace}.${key}`)));
|
|
19
|
-
const [[existing]] = await uow.executeRetrieve();
|
|
20
|
-
if (existing) uow.update(SETTINGS_TABLE_NAME, existing.id, (b) => b.set({ value }).check());
|
|
21
|
-
else uow.create(SETTINGS_TABLE_NAME, {
|
|
22
|
-
key: `${namespace}.${key}`,
|
|
23
|
-
value
|
|
24
|
-
});
|
|
25
|
-
const { success } = await uow.executeMutations();
|
|
26
|
-
if (!success) throw new Error("Failed to set schema version");
|
|
27
|
-
},
|
|
28
|
-
async delete(id) {
|
|
29
|
-
await queryEngine.delete(SETTINGS_TABLE_NAME, id);
|
|
30
|
-
}
|
|
31
|
-
};
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
//#endregion
|
|
35
|
-
export { SETTINGS_NAMESPACE, SETTINGS_TABLE_NAME, createSettingsManager, settingsSchema };
|
|
36
|
-
//# sourceMappingURL=settings-schema.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings-schema.js","names":[],"sources":["../../src/shared/settings-schema.ts"],"sourcesContent":["import type { AbstractQuery } from \"../query/query\";\nimport { schema, idColumn, column, type FragnoId } from \"../schema/create\";\n\nexport const SETTINGS_TABLE_NAME = \"fragno_db_settings\" as const;\nexport const SETTINGS_NAMESPACE = \"fragno-db-settings\" as const;\n\nexport const settingsSchema = schema((s) => {\n return s.addTable(SETTINGS_TABLE_NAME, (t) => {\n return t\n .addColumn(\"id\", idColumn())\n .addColumn(\"key\", column(\"string\"))\n .addColumn(\"value\", column(\"string\"))\n .createIndex(\"unique_key\", [\"key\"], { unique: true });\n });\n});\n\nexport function createSettingsManager(\n // oxlint-disable-next-line no-explicit-any\n queryEngine: AbstractQuery<typeof settingsSchema, any>,\n namespace: string,\n) {\n return {\n async get(key: string): Promise<{ id: FragnoId; key: string; value: string } | undefined> {\n const uow = queryEngine\n .createUnitOfWork()\n .find(SETTINGS_TABLE_NAME, (b) =>\n b.whereIndex(\"unique_key\", (eb) => eb(\"key\", \"=\", `${namespace}.${key}`)),\n );\n const [[result]] = await uow.executeRetrieve();\n return result; // Safe: result can be undefined if key doesn't exist\n },\n\n async set(key: string, value: string) {\n const uow = queryEngine\n .createUnitOfWork(\"createSettingsManager#set\")\n .find(SETTINGS_TABLE_NAME, (b) =>\n b.whereIndex(\"unique_key\", (eb) => eb(\"key\", \"=\", `${namespace}.${key}`)),\n );\n const [[existing]] = await uow.executeRetrieve();\n\n if (existing) {\n uow.update(SETTINGS_TABLE_NAME, existing.id, (b) => b.set({ value }).check());\n } else {\n uow.create(SETTINGS_TABLE_NAME, {\n key: `${namespace}.${key}`,\n value,\n });\n }\n\n const { success } = await uow.executeMutations();\n\n if (!success) {\n throw new Error(\"Failed to set schema version\");\n }\n },\n\n async delete(id: FragnoId) {\n await queryEngine.delete(SETTINGS_TABLE_NAME, id);\n },\n };\n}\n"],"mappings":";;;AAGA,MAAa,sBAAsB;AACnC,MAAa,qBAAqB;AAElC,MAAa,iBAAiB,QAAQ,MAAM;AAC1C,QAAO,EAAE,SAAS,sBAAsB,MAAM;AAC5C,SAAO,EACJ,UAAU,MAAM,UAAU,CAAC,CAC3B,UAAU,OAAO,OAAO,SAAS,CAAC,CAClC,UAAU,SAAS,OAAO,SAAS,CAAC,CACpC,YAAY,cAAc,CAAC,MAAM,EAAE,EAAE,QAAQ,MAAM,CAAC;GACvD;EACF;AAEF,SAAgB,sBAEd,aACA,WACA;AACA,QAAO;EACL,MAAM,IAAI,KAAgF;GAMxF,MAAM,CAAC,CAAC,WAAW,MALP,YACT,kBAAkB,CAClB,KAAK,sBAAsB,MAC1B,EAAE,WAAW,eAAe,OAAO,GAAG,OAAO,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC,CAC1E,CAC0B,iBAAiB;AAC9C,UAAO;;EAGT,MAAM,IAAI,KAAa,OAAe;GACpC,MAAM,MAAM,YACT,iBAAiB,4BAA4B,CAC7C,KAAK,sBAAsB,MAC1B,EAAE,WAAW,eAAe,OAAO,GAAG,OAAO,KAAK,GAAG,UAAU,GAAG,MAAM,CAAC,CAC1E;GACH,MAAM,CAAC,CAAC,aAAa,MAAM,IAAI,iBAAiB;AAEhD,OAAI,SACF,KAAI,OAAO,qBAAqB,SAAS,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC;OAE7E,KAAI,OAAO,qBAAqB;IAC9B,KAAK,GAAG,UAAU,GAAG;IACrB;IACD,CAAC;GAGJ,MAAM,EAAE,YAAY,MAAM,IAAI,kBAAkB;AAEhD,OAAI,CAAC,QACH,OAAM,IAAI,MAAM,+BAA+B;;EAInD,MAAM,OAAO,IAAc;AACzB,SAAM,YAAY,OAAO,qBAAqB,GAAG;;EAEpD"}
|