@fragno-dev/test 1.0.1 → 2.0.0

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 (42) hide show
  1. package/.turbo/turbo-build.log +31 -15
  2. package/CHANGELOG.md +54 -0
  3. package/dist/adapters.d.ts +21 -3
  4. package/dist/adapters.d.ts.map +1 -1
  5. package/dist/adapters.js +125 -31
  6. package/dist/adapters.js.map +1 -1
  7. package/dist/db-test.d.ts.map +1 -1
  8. package/dist/db-test.js +33 -2
  9. package/dist/db-test.js.map +1 -1
  10. package/dist/durable-hooks.d.ts +7 -0
  11. package/dist/durable-hooks.d.ts.map +1 -0
  12. package/dist/durable-hooks.js +12 -0
  13. package/dist/durable-hooks.js.map +1 -0
  14. package/dist/index.d.ts +8 -4
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +6 -2
  17. package/dist/index.js.map +1 -1
  18. package/dist/model-checker-actors.d.ts +41 -0
  19. package/dist/model-checker-actors.d.ts.map +1 -0
  20. package/dist/model-checker-actors.js +406 -0
  21. package/dist/model-checker-actors.js.map +1 -0
  22. package/dist/model-checker-adapter.d.ts +32 -0
  23. package/dist/model-checker-adapter.d.ts.map +1 -0
  24. package/dist/model-checker-adapter.js +109 -0
  25. package/dist/model-checker-adapter.js.map +1 -0
  26. package/dist/model-checker.d.ts +128 -0
  27. package/dist/model-checker.d.ts.map +1 -0
  28. package/dist/model-checker.js +443 -0
  29. package/dist/model-checker.js.map +1 -0
  30. package/package.json +13 -12
  31. package/src/adapter-conformance.test.ts +322 -0
  32. package/src/adapters.ts +199 -36
  33. package/src/db-test.test.ts +2 -2
  34. package/src/db-test.ts +53 -3
  35. package/src/durable-hooks.ts +13 -0
  36. package/src/index.test.ts +84 -7
  37. package/src/index.ts +39 -4
  38. package/src/model-checker-actors.test.ts +78 -0
  39. package/src/model-checker-actors.ts +642 -0
  40. package/src/model-checker-adapter.ts +200 -0
  41. package/src/model-checker.test.ts +399 -0
  42. package/src/model-checker.ts +799 -0
@@ -1,5 +1,5 @@
1
1
 
2
- > @fragno-dev/test@1.0.1 build /home/runner/work/fragno/fragno/packages/fragno-test
2
+ > @fragno-dev/test@2.0.0 build /home/runner/work/fragno/fragno/packages/fragno-test
3
3
  > tsdown
4
4
 
5
5
  ℹ tsdown v0.15.12 powered by rolldown v1.0.0-beta.45
@@ -7,17 +7,33 @@
7
7
  ℹ entry: src/index.ts
8
8
  ℹ tsconfig: tsconfig.json
9
9
  ℹ Build start
10
- ℹ dist/index.js  0.71 kB │ gzip: 0.40 kB
11
- ℹ dist/db-test.js.map 24.19 kB │ gzip: 5.91 kB
12
- ℹ dist/adapters.js.map 16.98 kB │ gzip: 3.34 kB
13
- ℹ dist/adapters.js  7.53 kB │ gzip: 1.45 kB
14
- ℹ dist/db-test.js  7.43 kB │ gzip: 2.18 kB
15
- ℹ dist/db-test.d.ts.map  3.19 kB │ gzip: 1.47 kB
16
- ℹ dist/index.js.map  2.46 kB │ gzip: 0.96 kB
17
- ℹ dist/index.d.ts.map  0.55 kB │ gzip: 0.31 kB
18
- ℹ dist/adapters.d.ts.map  0.42 kB │ gzip: 0.27 kB
19
- ℹ dist/index.d.ts  1.81 kB │ gzip: 0.68 kB
20
- ℹ dist/db-test.d.ts  6.68 kB │ gzip: 1.80 kB
21
- ℹ dist/adapters.d.ts  0.96 kB │ gzip: 0.38 kB
22
- ℹ 12 files, total: 72.92 kB
23
- ✔ Build complete in 14164ms
10
+ ℹ dist/index.js  1.18 kB │ gzip: 0.53 kB
11
+ ℹ dist/model-checker.js.map 33.95 kB │ gzip: 8.30 kB
12
+ ℹ dist/model-checker-actors.js.map 28.86 kB │ gzip: 7.06 kB
13
+ ℹ dist/db-test.js.map 26.36 kB │ gzip: 6.51 kB
14
+ ℹ dist/adapters.js.map 23.99 kB │ gzip: 4.40 kB
15
+ ℹ dist/model-checker.js 14.08 kB │ gzip: 3.89 kB
16
+ ℹ dist/model-checker-actors.js 12.86 kB │ gzip: 3.32 kB
17
+ ℹ dist/adapters.js 10.69 kB │ gzip: 1.94 kB
18
+ ℹ dist/model-checker-adapter.js.map  9.08 kB │ gzip: 2.65 kB
19
+ ℹ dist/db-test.js  8.59 kB │ gzip: 2.53 kB
20
+ ℹ dist/model-checker.d.ts.map  4.84 kB │ gzip: 1.89 kB
21
+ ℹ dist/model-checker-adapter.js  3.98 kB │ gzip: 1.18 kB
22
+ ℹ dist/index.js.map  3.55 kB │ gzip: 1.22 kB
23
+ ℹ dist/db-test.d.ts.map  3.19 kB │ gzip: 1.47 kB
24
+ ℹ dist/model-checker-actors.d.ts.map  1.58 kB │ gzip: 0.71 kB
25
+ ℹ dist/model-checker-adapter.d.ts.map  1.07 kB │ gzip: 0.53 kB
26
+ ℹ dist/adapters.d.ts.map  0.82 kB │ gzip: 0.43 kB
27
+ ℹ dist/durable-hooks.js.map  0.68 kB │ gzip: 0.38 kB
28
+ ℹ dist/index.d.ts.map  0.57 kB │ gzip: 0.32 kB
29
+ ℹ dist/durable-hooks.js  0.34 kB │ gzip: 0.22 kB
30
+ ℹ dist/durable-hooks.d.ts.map  0.15 kB │ gzip: 0.14 kB
31
+ ℹ dist/index.d.ts  3.42 kB │ gzip: 1.01 kB
32
+ ℹ dist/db-test.d.ts  6.68 kB │ gzip: 1.80 kB
33
+ ℹ dist/model-checker.d.ts  5.67 kB │ gzip: 1.38 kB
34
+ ℹ dist/model-checker-actors.d.ts  2.04 kB │ gzip: 0.63 kB
35
+ ℹ dist/model-checker-adapter.d.ts  1.79 kB │ gzip: 0.68 kB
36
+ ℹ dist/adapters.d.ts  1.71 kB │ gzip: 0.52 kB
37
+ ℹ dist/durable-hooks.d.ts  0.28 kB │ gzip: 0.19 kB
38
+ ℹ 28 files, total: 212.03 kB
39
+ ✔ Build complete in 13414ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,59 @@
1
1
  # @fragno-dev/test
2
2
 
3
+ ## 2.0.0
4
+
5
+ ### Patch Changes
6
+
7
+ - 3e07799: fix: allow durable hook processing to bypass wrapper adapters and widen drain helpers
8
+ - 15e3263: feat(db): require schema names and support namespace-aware SQL naming
9
+ - a79e90d: feat: add trace recording support to model checker runs
10
+ - 5cef16e: feat(db,test): add SQL outbox support and adapter testing configuration.
11
+ - Updated dependencies [f569301]
12
+ - Updated dependencies [dbbbf60]
13
+ - Updated dependencies [3e07799]
14
+ - Updated dependencies [20a98f8]
15
+ - Updated dependencies [1902f30]
16
+ - Updated dependencies [15e3263]
17
+ - Updated dependencies [208cb8e]
18
+ - Updated dependencies [33f671b]
19
+ - Updated dependencies [fc803fc]
20
+ - Updated dependencies [0628c1f]
21
+ - Updated dependencies [7e1eb47]
22
+ - Updated dependencies [301e2f8]
23
+ - Updated dependencies [5f6f90e]
24
+ - Updated dependencies [1dc4e7f]
25
+ - Updated dependencies [2eafef4]
26
+ - Updated dependencies [3c9fbac]
27
+ - Updated dependencies [a5ead11]
28
+ - Updated dependencies [7d7b2b9]
29
+ - Updated dependencies [c4d4cc6]
30
+ - Updated dependencies [d4baad3]
31
+ - Updated dependencies [548bf37]
32
+ - Updated dependencies [a79e90d]
33
+ - Updated dependencies [3041732]
34
+ - Updated dependencies [7e179d1]
35
+ - Updated dependencies [0013fa6]
36
+ - Updated dependencies [7c60341]
37
+ - Updated dependencies [afb06a4]
38
+ - Updated dependencies [53e5f97]
39
+ - Updated dependencies [8e9b6cd]
40
+ - Updated dependencies [c5fd7b3]
41
+ - Updated dependencies [69b9a79]
42
+ - Updated dependencies [5cef16e]
43
+ - @fragno-dev/core@0.2.0
44
+ - @fragno-dev/db@0.3.0
45
+
46
+ ## 1.0.2
47
+
48
+ ### Patch Changes
49
+
50
+ - Updated dependencies [aca5990]
51
+ - Updated dependencies [f150db9]
52
+ - Updated dependencies [0b373fc]
53
+ - Updated dependencies [fe27e33]
54
+ - Updated dependencies [9753f15]
55
+ - @fragno-dev/db@0.2.2
56
+
3
57
  ## 1.0.1
4
58
 
5
59
  ### Patch Changes
@@ -1,27 +1,45 @@
1
1
  import "./index.js";
2
2
  import { Kysely } from "kysely";
3
3
  import { drizzle } from "drizzle-orm/pglite";
4
+ import { InMemoryAdapterOptions } from "@fragno-dev/db/adapters/in-memory";
5
+ import { OutboxConfig, UnitOfWorkConfig } from "@fragno-dev/db/adapters/sql";
6
+ import { DatabaseAdapter } from "@fragno-dev/db/adapters";
4
7
  import { AnySchema } from "@fragno-dev/db/schema";
5
8
  import { SimpleQueryInterface } from "@fragno-dev/db/query";
6
9
 
7
10
  //#region src/adapters.d.ts
8
11
  interface KyselySqliteAdapter {
9
12
  type: "kysely-sqlite";
13
+ uowConfig?: UnitOfWorkConfig;
14
+ outbox?: OutboxConfig;
10
15
  }
11
16
  interface KyselyPgliteAdapter {
12
17
  type: "kysely-pglite";
13
18
  databasePath?: string;
19
+ uowConfig?: UnitOfWorkConfig;
20
+ outbox?: OutboxConfig;
14
21
  }
15
22
  interface DrizzlePgliteAdapter {
16
23
  type: "drizzle-pglite";
17
24
  databasePath?: string;
25
+ uowConfig?: UnitOfWorkConfig;
26
+ outbox?: OutboxConfig;
18
27
  }
19
- type SupportedAdapter = KyselySqliteAdapter | KyselyPgliteAdapter | DrizzlePgliteAdapter;
28
+ interface InMemoryAdapterConfig {
29
+ type: "in-memory";
30
+ options?: InMemoryAdapterOptions;
31
+ uowConfig?: UnitOfWorkConfig;
32
+ }
33
+ interface ModelCheckerAdapterConfig {
34
+ type: "model-checker";
35
+ options?: InMemoryAdapterOptions;
36
+ }
37
+ type SupportedAdapter = KyselySqliteAdapter | KyselyPgliteAdapter | DrizzlePgliteAdapter | InMemoryAdapterConfig | ModelCheckerAdapterConfig;
20
38
  type AdapterContext<T extends SupportedAdapter> = T extends KyselySqliteAdapter | KyselyPgliteAdapter ? {
21
39
  readonly kysely: Kysely<any>;
22
40
  } : T extends DrizzlePgliteAdapter ? {
23
41
  readonly drizzle: ReturnType<typeof drizzle<any>>;
24
- } : never;
42
+ } : T extends InMemoryAdapterConfig | ModelCheckerAdapterConfig ? {} : never;
25
43
  //#endregion
26
- export { AdapterContext, DrizzlePgliteAdapter, KyselyPgliteAdapter, KyselySqliteAdapter, SupportedAdapter };
44
+ export { AdapterContext, DrizzlePgliteAdapter, InMemoryAdapterConfig, KyselyPgliteAdapter, KyselySqliteAdapter, SupportedAdapter };
27
45
  //# sourceMappingURL=adapters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.d.ts","names":[],"sources":["../src/adapters.ts"],"sourcesContent":[],"mappings":";;;;;;;UAkBiB,mBAAA;EAAA,IAAA,EAAA,eAAA;AAIjB;AAKiB,UALA,mBAAA,CAKoB;EAKzB,IAAA,EAAA,eAAgB;EAAG,YAAA,CAAA,EAAA,MAAA;;AAA4C,UAL1D,oBAAA,CAK0D;EAAoB,IAAA,EAAA,gBAAA;EAenF,YAAA,CAAA,EAAA,MAAc;;AAA+B,KAf7C,gBAAA,GAAmB,mBAe0B,GAfJ,mBAeI,GAfkB,oBAelB;KAA7C,yBAAyB,oBAAoB,UACrD,sBACA;mBAEmB;IAEnB,UAAU;oBAEY,kBAAkB"}
1
+ {"version":3,"file":"adapters.d.ts","names":[],"sources":["../src/adapters.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;UAsBiB,mBAAA;EAAA,IAAA,EAAA,eAAA;EAMA,SAAA,CAAA,EAJH,gBAIsB;EAOnB,MAAA,CAAA,EAVN,YAUM;AAOjB;AAMiB,UApBA,mBAAA,CAoByB;EAK9B,IAAA,EAAA,eAAgB;EACxB,YAAA,CAAA,EAAA,MAAA;EACA,SAAA,CAAA,EAxBU,gBAwBV;EACA,MAAA,CAAA,EAxBO,YAwBP;;AAEA,UAvBa,oBAAA,CAuBb;EAAyB,IAAA,EAAA,gBAAA;EAejB,YAAA,CAAA,EAAA,MAAc;EAAW,SAAA,CAAA,EAnCvB,gBAmCuB;EAAoB,MAAA,CAAA,EAlC9C,YAkC8C;;AAErD,UAjCa,qBAAA,CAiCb;EAEmB,IAAA,EAAA,WAAA;EAEnB,OAAA,CAAA,EAnCQ,sBAmCR;EAAU,SAAA,CAAA,EAlCA,gBAkCA;;AAEY,UAjCT,yBAAA,CAiCS;EAEpB,IAAA,EAAA,eAAA;EAAU,OAAA,CAAA,EAjCJ,sBAiCI;;AAAiD,KA9BrD,gBAAA,GACR,mBA6B6D,GA5B7D,mBA4B6D,GA3B7D,oBA2B6D,GA1B7D,qBA0B6D,GAzB7D,yBAyB6D;KAVrD,yBAAyB,oBAAoB,UACrD,sBACA;mBAEmB;IAEnB,UAAU;oBAEY,kBAAkB;IAEtC,UAAU,wBAAwB"}
package/dist/adapters.js CHANGED
@@ -1,29 +1,57 @@
1
+ import { ModelCheckerAdapter } from "./model-checker-adapter.js";
1
2
  import { createCommonTestContextMethods } from "./index.js";
2
3
  import { Kysely } from "kysely";
3
4
  import { SQLocalKysely } from "sqlocal/kysely";
4
5
  import { KyselyPGlite } from "kysely-pglite";
5
6
  import { drizzle } from "drizzle-orm/pglite";
6
7
  import { PGlite } from "@electric-sql/pglite";
7
- import { KyselyAdapter } from "@fragno-dev/db/adapters/kysely";
8
- import { DrizzleAdapter } from "@fragno-dev/db/adapters/drizzle";
8
+ import { InMemoryAdapter } from "@fragno-dev/db/adapters/in-memory";
9
+ import { SqlAdapter } from "@fragno-dev/db/adapters/sql";
9
10
  import { rm } from "node:fs/promises";
10
11
  import { existsSync } from "node:fs";
11
12
  import { PGLiteDriverConfig, SQLocalDriverConfig } from "@fragno-dev/db/drivers";
12
13
  import { internalFragmentDef } from "@fragno-dev/db";
13
14
 
14
15
  //#region src/adapters.ts
16
+ const runInternalFragmentMigrations = async (adapter) => {
17
+ const dependencies = internalFragmentDef.dependencies;
18
+ if (!dependencies) return;
19
+ const databaseDeps = dependencies({
20
+ config: {},
21
+ options: {
22
+ databaseAdapter: adapter,
23
+ databaseNamespace: null
24
+ }
25
+ });
26
+ if (databaseDeps?.schema) {
27
+ await adapter.prepareMigrations(databaseDeps.schema, databaseDeps.namespace).executeWithDriver(adapter.driver, 0);
28
+ return {
29
+ schema: databaseDeps.schema,
30
+ namespace: databaseDeps.namespace
31
+ };
32
+ }
33
+ };
34
+ const resolveSchemaName = (adapter, namespace) => {
35
+ if (adapter.namingStrategy.namespaceScope !== "schema") return null;
36
+ if (!namespace || namespace.length === 0) return null;
37
+ return adapter.namingStrategy.namespaceToSchema(namespace);
38
+ };
15
39
  /**
16
40
  * Create Kysely + SQLite adapter using SQLocalKysely (always in-memory)
17
41
  * Supports multiple schemas with separate namespaces
18
42
  */
19
- async function createKyselySqliteAdapter(_config, schemas) {
43
+ async function createKyselySqliteAdapter(config, schemas) {
44
+ let internalSchemaConfig;
20
45
  const createDatabase = async () => {
21
46
  const { dialect } = new SQLocalKysely(":memory:");
22
47
  const kysely$1 = new Kysely({ dialect });
23
- const adapter$1 = new KyselyAdapter({
48
+ const adapter$1 = new SqlAdapter({
24
49
  dialect,
25
- driverConfig: new SQLocalDriverConfig()
50
+ driverConfig: new SQLocalDriverConfig(),
51
+ uowConfig: config.uowConfig,
52
+ outbox: config.outbox
26
53
  });
54
+ internalSchemaConfig = await runInternalFragmentMigrations(adapter$1);
27
55
  const ormMap$1 = /* @__PURE__ */ new Map();
28
56
  for (const { schema, namespace, migrateToVersion } of schemas) {
29
57
  const preparedMigrations = adapter$1.prepareMigrations(schema, namespace);
@@ -40,12 +68,10 @@ async function createKyselySqliteAdapter(_config, schemas) {
40
68
  };
41
69
  let { kysely, adapter, ormMap } = await createDatabase();
42
70
  const resetDatabase = async () => {
43
- for (const { schema, namespace } of schemas) {
44
- const mapper = adapter.createTableNameMapper(namespace);
45
- for (const tableName of Object.keys(schema.tables)) {
46
- const physicalTableName = mapper.toPhysical(tableName);
47
- await kysely.deleteFrom(physicalTableName).execute();
48
- }
71
+ const schemasToTruncate = internalSchemaConfig ? [internalSchemaConfig, ...schemas] : schemas;
72
+ for (const { schema, namespace } of schemasToTruncate) for (const tableName of Object.keys(schema.tables)) {
73
+ const physicalTableName = adapter.namingStrategy.tableName(tableName, namespace);
74
+ await kysely.deleteFrom(physicalTableName).execute();
49
75
  }
50
76
  };
51
77
  const cleanup = async () => {
@@ -74,13 +100,17 @@ async function createKyselySqliteAdapter(_config, schemas) {
74
100
  */
75
101
  async function createKyselyPgliteAdapter(config, schemas) {
76
102
  const databasePath = config.databasePath;
103
+ let internalSchemaConfig;
77
104
  const createDatabase = async () => {
78
105
  const kyselyPglite$1 = await KyselyPGlite.create(databasePath);
79
106
  const kysely$1 = new Kysely({ dialect: kyselyPglite$1.dialect });
80
- const adapter$1 = new KyselyAdapter({
107
+ const adapter$1 = new SqlAdapter({
81
108
  dialect: kyselyPglite$1.dialect,
82
- driverConfig: new PGLiteDriverConfig()
109
+ driverConfig: new PGLiteDriverConfig(),
110
+ uowConfig: config.uowConfig,
111
+ outbox: config.outbox
83
112
  });
113
+ internalSchemaConfig = await runInternalFragmentMigrations(adapter$1);
84
114
  const ormMap$1 = /* @__PURE__ */ new Map();
85
115
  for (const { schema, namespace, migrateToVersion } of schemas) {
86
116
  const preparedMigrations = adapter$1.prepareMigrations(schema, namespace);
@@ -99,12 +129,11 @@ async function createKyselyPgliteAdapter(config, schemas) {
99
129
  const { kysely, adapter, kyselyPglite, ormMap } = await createDatabase();
100
130
  const resetDatabase = async () => {
101
131
  if (databasePath && databasePath !== ":memory:") throw new Error("resetDatabase is only supported for in-memory databases");
102
- for (const { schema, namespace } of schemas) {
103
- const mapper = adapter.createTableNameMapper(namespace);
104
- for (const tableName of Object.keys(schema.tables)) {
105
- const physicalTableName = mapper.toPhysical(tableName);
106
- await kysely.deleteFrom(physicalTableName).execute();
107
- }
132
+ const schemasToTruncate = internalSchemaConfig ? [internalSchemaConfig, ...schemas] : schemas;
133
+ for (const { schema, namespace } of schemasToTruncate) for (const tableName of Object.keys(schema.tables)) {
134
+ const physicalTableName = adapter.namingStrategy.tableName(tableName, namespace);
135
+ const schemaName = resolveSchemaName(adapter, namespace);
136
+ await (schemaName ? kysely.withSchema(schemaName) : kysely).deleteFrom(physicalTableName).execute();
108
137
  }
109
138
  };
110
139
  const cleanup = async () => {
@@ -140,19 +169,18 @@ async function createKyselyPgliteAdapter(config, schemas) {
140
169
  */
141
170
  async function createDrizzlePgliteAdapter(config, schemas) {
142
171
  const databasePath = config.databasePath;
172
+ let internalSchemaConfig;
143
173
  const createDatabase = async () => {
144
174
  const pglite = new PGlite(databasePath);
145
175
  const { dialect } = new KyselyPGlite(pglite);
146
- const adapter$1 = new DrizzleAdapter({
176
+ const adapter$1 = new SqlAdapter({
147
177
  dialect,
148
- driverConfig: new PGLiteDriverConfig()
178
+ driverConfig: new PGLiteDriverConfig(),
179
+ uowConfig: config.uowConfig,
180
+ outbox: config.outbox
149
181
  });
182
+ internalSchemaConfig = await runInternalFragmentMigrations(adapter$1);
150
183
  const ormMap$1 = /* @__PURE__ */ new Map();
151
- const databaseDeps = internalFragmentDef.dependencies?.({
152
- config: {},
153
- options: { databaseAdapter: adapter$1 }
154
- });
155
- if (databaseDeps?.schema) await adapter$1.prepareMigrations(databaseDeps.schema, databaseDeps.namespace).executeWithDriver(adapter$1.driver, 0);
156
184
  for (const { schema, namespace, migrateToVersion } of schemas) {
157
185
  const preparedMigrations = adapter$1.prepareMigrations(schema, namespace);
158
186
  if (migrateToVersion !== void 0) await preparedMigrations.execute(0, migrateToVersion, { updateVersionInMigration: false });
@@ -170,11 +198,14 @@ async function createDrizzlePgliteAdapter(config, schemas) {
170
198
  const { drizzle: drizzleDb, adapter, ormMap } = await createDatabase();
171
199
  const resetDatabase = async () => {
172
200
  if (databasePath && databasePath !== ":memory:") throw new Error("resetDatabase is only supported for in-memory databases");
173
- for (const { schema, namespace } of schemas) {
174
- const mapper = adapter.createTableNameMapper(namespace);
175
- for (const tableName of Object.keys(schema.tables)) {
176
- const physicalTableName = mapper.toPhysical(tableName);
177
- await drizzleDb.execute(`DELETE FROM "${physicalTableName}"`);
201
+ const schemasToTruncate = internalSchemaConfig ? [internalSchemaConfig, ...schemas] : schemas;
202
+ for (const { schema, namespace } of schemasToTruncate) {
203
+ const tableNames = Object.keys(schema.tables).slice().reverse();
204
+ for (const tableName of tableNames) {
205
+ const physicalTableName = adapter.namingStrategy.tableName(tableName, namespace);
206
+ const schemaName = resolveSchemaName(adapter, namespace);
207
+ const qualifiedTable = schemaName ? `"${schemaName}"."${physicalTableName}"` : `"${physicalTableName}"`;
208
+ await drizzleDb.execute(`DELETE FROM ${qualifiedTable}`);
178
209
  }
179
210
  }
180
211
  };
@@ -203,6 +234,67 @@ async function createDrizzlePgliteAdapter(config, schemas) {
203
234
  };
204
235
  }
205
236
  /**
237
+ * Create InMemory adapter (no migrations required).
238
+ */
239
+ async function createInMemoryAdapter(config, schemas) {
240
+ const adapter = new InMemoryAdapter(config.options);
241
+ const ormMap = /* @__PURE__ */ new Map();
242
+ for (const { schema, namespace } of schemas) {
243
+ const orm = adapter.createQueryEngine(schema, namespace);
244
+ ormMap.set(namespace, orm);
245
+ }
246
+ const resetDatabase = async () => {
247
+ await adapter.reset();
248
+ };
249
+ const cleanup = async () => {
250
+ await adapter.close();
251
+ };
252
+ return {
253
+ testContext: {
254
+ get adapter() {
255
+ return adapter;
256
+ },
257
+ ...createCommonTestContextMethods(ormMap),
258
+ resetDatabase,
259
+ cleanup
260
+ },
261
+ get adapter() {
262
+ return adapter;
263
+ }
264
+ };
265
+ }
266
+ /**
267
+ * Create ModelChecker adapter (wraps the in-memory adapter).
268
+ */
269
+ async function createModelCheckerAdapter(config, schemas) {
270
+ const baseAdapter = new InMemoryAdapter(config.options);
271
+ const adapter = new ModelCheckerAdapter(baseAdapter);
272
+ const ormMap = /* @__PURE__ */ new Map();
273
+ for (const { schema, namespace } of schemas) {
274
+ const orm = adapter.createQueryEngine(schema, namespace);
275
+ ormMap.set(namespace, orm);
276
+ }
277
+ const resetDatabase = async () => {
278
+ await baseAdapter.reset();
279
+ };
280
+ const cleanup = async () => {
281
+ await adapter.close();
282
+ };
283
+ return {
284
+ testContext: {
285
+ get adapter() {
286
+ return adapter;
287
+ },
288
+ ...createCommonTestContextMethods(ormMap),
289
+ resetDatabase,
290
+ cleanup
291
+ },
292
+ get adapter() {
293
+ return adapter;
294
+ }
295
+ };
296
+ }
297
+ /**
206
298
  * Create adapter based on configuration
207
299
  * Supports multiple schemas with separate namespaces
208
300
  */
@@ -210,6 +302,8 @@ async function createAdapter(adapterConfig, schemas) {
210
302
  if (adapterConfig.type === "kysely-sqlite") return createKyselySqliteAdapter(adapterConfig, schemas);
211
303
  else if (adapterConfig.type === "kysely-pglite") return createKyselyPgliteAdapter(adapterConfig, schemas);
212
304
  else if (adapterConfig.type === "drizzle-pglite") return createDrizzlePgliteAdapter(adapterConfig, schemas);
305
+ else if (adapterConfig.type === "in-memory") return createInMemoryAdapter(adapterConfig, schemas);
306
+ else if (adapterConfig.type === "model-checker") return createModelCheckerAdapter(adapterConfig, schemas);
213
307
  throw new Error(`Unsupported adapter type: ${adapterConfig.type}`);
214
308
  }
215
309
 
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.js","names":["kysely","adapter","ormMap","kyselyPglite"],"sources":["../src/adapters.ts"],"sourcesContent":["import { Kysely } from \"kysely\";\nimport { SQLocalKysely } from \"sqlocal/kysely\";\nimport { KyselyPGlite } from \"kysely-pglite\";\nimport { drizzle } from \"drizzle-orm/pglite\";\nimport { PGlite } from \"@electric-sql/pglite\";\nimport { KyselyAdapter } from \"@fragno-dev/db/adapters/kysely\";\nimport { DrizzleAdapter } from \"@fragno-dev/db/adapters/drizzle\";\nimport type { AnySchema } from \"@fragno-dev/db/schema\";\nimport type { DatabaseAdapter } from \"@fragno-dev/db/adapters\";\nimport { rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport type { BaseTestContext } from \".\";\nimport { createCommonTestContextMethods } from \".\";\nimport { PGLiteDriverConfig, SQLocalDriverConfig } from \"@fragno-dev/db/drivers\";\nimport { internalFragmentDef } from \"@fragno-dev/db\";\nimport type { SimpleQueryInterface } from \"@fragno-dev/db/query\";\n\n// Adapter configuration types\nexport interface KyselySqliteAdapter {\n type: \"kysely-sqlite\";\n}\n\nexport interface KyselyPgliteAdapter {\n type: \"kysely-pglite\";\n databasePath?: string;\n}\n\nexport interface DrizzlePgliteAdapter {\n type: \"drizzle-pglite\";\n databasePath?: string;\n}\n\nexport type SupportedAdapter = KyselySqliteAdapter | KyselyPgliteAdapter | DrizzlePgliteAdapter;\n\n// Schema configuration for multi-schema adapters\nexport interface SchemaConfig {\n schema: AnySchema;\n namespace: string;\n migrateToVersion?: number;\n}\n\n// Internal test context extends BaseTestContext with getOrm (not exposed publicly)\ninterface InternalTestContext extends BaseTestContext {\n getOrm: <TSchema extends AnySchema>(namespace: string) => SimpleQueryInterface<TSchema>;\n}\n\n// Conditional return types based on adapter (adapter-specific properties only)\nexport type AdapterContext<T extends SupportedAdapter> = T extends\n | KyselySqliteAdapter\n | KyselyPgliteAdapter\n ? {\n readonly kysely: Kysely<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n }\n : T extends DrizzlePgliteAdapter\n ? {\n readonly drizzle: ReturnType<typeof drizzle<any>>; // eslint-disable-line @typescript-eslint/no-explicit-any\n }\n : never;\n\n// Factory function return type\ninterface AdapterFactoryResult<T extends SupportedAdapter> {\n testContext: InternalTestContext & AdapterContext<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n adapter: DatabaseAdapter<any>;\n}\n\n/**\n * Create Kysely + SQLite adapter using SQLocalKysely (always in-memory)\n * Supports multiple schemas with separate namespaces\n */\nexport async function createKyselySqliteAdapter(\n _config: KyselySqliteAdapter,\n schemas: SchemaConfig[],\n): Promise<AdapterFactoryResult<KyselySqliteAdapter>> {\n // Helper to create a new database instance and run migrations for all schemas\n const createDatabase = async () => {\n // Create SQLocalKysely instance (always in-memory for tests)\n const { dialect } = new SQLocalKysely(\":memory:\");\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const kysely = new Kysely<any>({\n dialect,\n });\n\n // Create KyselyAdapter\n const adapter = new KyselyAdapter({\n dialect,\n driverConfig: new SQLocalDriverConfig(),\n });\n\n // Run migrations for all schemas in order\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ormMap = new Map<string, SimpleQueryInterface<any, any>>();\n\n for (const { schema, namespace, migrateToVersion } of schemas) {\n // Run migrations\n const preparedMigrations = adapter.prepareMigrations(schema, namespace);\n if (migrateToVersion !== undefined) {\n await preparedMigrations.execute(0, migrateToVersion, { updateVersionInMigration: false });\n } else {\n await preparedMigrations.execute(0, schema.version, { updateVersionInMigration: false });\n }\n\n // Create ORM instance and store in map\n const orm = adapter.createQueryEngine(schema, namespace);\n ormMap.set(namespace, orm);\n }\n\n return { kysely, adapter, ormMap };\n };\n\n // Create initial database\n let { kysely, adapter, ormMap } = await createDatabase();\n\n // Reset database function - truncates all tables (only supported for in-memory databases)\n const resetDatabase = async () => {\n // For SQLite, truncate all tables by deleting rows\n for (const { schema, namespace } of schemas) {\n const mapper = adapter.createTableNameMapper(namespace);\n for (const tableName of Object.keys(schema.tables)) {\n const physicalTableName = mapper.toPhysical(tableName);\n await kysely.deleteFrom(physicalTableName).execute();\n }\n }\n };\n\n // Cleanup function - closes connections (no files to delete for in-memory)\n const cleanup = async () => {\n await kysely.destroy();\n };\n\n const commonMethods = createCommonTestContextMethods(ormMap);\n\n return {\n testContext: {\n get kysely() {\n return kysely;\n },\n get adapter() {\n return adapter;\n },\n ...commonMethods,\n resetDatabase,\n cleanup,\n },\n get adapter() {\n return adapter;\n },\n };\n}\n\n/**\n * Create Kysely + PGLite adapter using kysely-pglite\n * Supports multiple schemas with separate namespaces\n */\nexport async function createKyselyPgliteAdapter(\n config: KyselyPgliteAdapter,\n schemas: SchemaConfig[],\n): Promise<AdapterFactoryResult<KyselyPgliteAdapter>> {\n const databasePath = config.databasePath;\n\n // Helper to create a new database instance and run migrations for all schemas\n const createDatabase = async () => {\n // Create KyselyPGlite instance\n const kyselyPglite = await KyselyPGlite.create(databasePath);\n\n // Create Kysely instance with PGlite dialect\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const kysely = new Kysely<any>({\n dialect: kyselyPglite.dialect,\n });\n\n // Create KyselyAdapter\n const adapter = new KyselyAdapter({\n dialect: kyselyPglite.dialect,\n driverConfig: new PGLiteDriverConfig(),\n });\n\n // Run migrations for all schemas in order\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ormMap = new Map<string, SimpleQueryInterface<any, any>>();\n\n for (const { schema, namespace, migrateToVersion } of schemas) {\n // Run migrations\n const preparedMigrations = adapter.prepareMigrations(schema, namespace);\n if (migrateToVersion !== undefined) {\n await preparedMigrations.execute(0, migrateToVersion, { updateVersionInMigration: false });\n } else {\n await preparedMigrations.execute(0, schema.version, { updateVersionInMigration: false });\n }\n\n // Create ORM instance and store in map\n const orm = adapter.createQueryEngine(schema, namespace);\n ormMap.set(namespace, orm);\n }\n\n return { kysely, adapter, kyselyPglite, ormMap };\n };\n\n // Create initial database\n const { kysely, adapter, kyselyPglite, ormMap } = await createDatabase();\n\n // Reset database function - truncates all tables (only supported for in-memory databases)\n const resetDatabase = async () => {\n if (databasePath && databasePath !== \":memory:\") {\n throw new Error(\"resetDatabase is only supported for in-memory databases\");\n }\n\n // Truncate all tables\n for (const { schema, namespace } of schemas) {\n const mapper = adapter.createTableNameMapper(namespace);\n for (const tableName of Object.keys(schema.tables)) {\n const physicalTableName = mapper.toPhysical(tableName);\n await kysely.deleteFrom(physicalTableName).execute();\n }\n }\n };\n\n // Cleanup function - closes connections and deletes database directory\n const cleanup = async () => {\n await kysely.destroy();\n\n try {\n await kyselyPglite.client.close();\n } catch {\n // Ignore if already closed\n }\n\n // Delete the database directory if it exists and is a file path\n if (databasePath && databasePath !== \":memory:\" && existsSync(databasePath)) {\n await rm(databasePath, { recursive: true, force: true });\n }\n };\n\n const commonMethods = createCommonTestContextMethods(ormMap);\n\n return {\n testContext: {\n get kysely() {\n return kysely;\n },\n get adapter() {\n return adapter;\n },\n ...commonMethods,\n resetDatabase,\n cleanup,\n },\n get adapter() {\n return adapter;\n },\n };\n}\n\n/**\n * Create Drizzle + PGLite adapter using drizzle-orm/pglite\n * Supports multiple schemas with separate namespaces\n */\nexport async function createDrizzlePgliteAdapter(\n config: DrizzlePgliteAdapter,\n schemas: SchemaConfig[],\n): Promise<AdapterFactoryResult<DrizzlePgliteAdapter>> {\n const databasePath = config.databasePath;\n\n // Helper to create a new database instance and run migrations for all schemas\n const createDatabase = async () => {\n const pglite = new PGlite(databasePath);\n\n const { dialect } = new KyselyPGlite(pglite);\n\n const adapter = new DrizzleAdapter({\n dialect,\n driverConfig: new PGLiteDriverConfig(),\n });\n\n // Run migrations for all schemas\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ormMap = new Map<string, SimpleQueryInterface<any, any>>();\n\n const databaseDeps = internalFragmentDef.dependencies?.({\n config: {},\n options: { databaseAdapter: adapter },\n });\n if (databaseDeps?.schema) {\n const migrations = adapter.prepareMigrations(databaseDeps.schema, databaseDeps.namespace);\n await migrations.executeWithDriver(adapter.driver, 0);\n }\n\n for (const { schema, namespace, migrateToVersion } of schemas) {\n const preparedMigrations = adapter.prepareMigrations(schema, namespace);\n if (migrateToVersion !== undefined) {\n await preparedMigrations.execute(0, migrateToVersion, { updateVersionInMigration: false });\n } else {\n await preparedMigrations.execute(0, schema.version, { updateVersionInMigration: false });\n }\n\n // Create ORM instance and store in map\n const orm = adapter.createQueryEngine(schema, namespace);\n ormMap.set(namespace, orm);\n }\n\n // Create Drizzle instance for backward compatibility (if needed)\n const db = drizzle(pglite) as any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n return { drizzle: db, adapter, pglite, ormMap };\n };\n\n // Create initial database\n const { drizzle: drizzleDb, adapter, ormMap } = await createDatabase();\n\n // Reset database function - truncates all tables (only supported for in-memory databases)\n const resetDatabase = async () => {\n if (databasePath && databasePath !== \":memory:\") {\n throw new Error(\"resetDatabase is only supported for in-memory databases\");\n }\n\n // Truncate all tables by deleting rows\n for (const { schema, namespace } of schemas) {\n const mapper = adapter.createTableNameMapper(namespace);\n for (const tableName of Object.keys(schema.tables)) {\n const physicalTableName = mapper.toPhysical(tableName);\n await drizzleDb.execute(`DELETE FROM \"${physicalTableName}\"`);\n }\n }\n };\n\n // Cleanup function - closes connections and deletes database directory\n const cleanup = async () => {\n // Close the adapter (which will handle closing the underlying database connection)\n await adapter.close();\n\n // Delete the database directory if it exists and is a file path\n if (databasePath && databasePath !== \":memory:\" && existsSync(databasePath)) {\n await rm(databasePath, { recursive: true, force: true });\n }\n };\n\n const commonMethods = createCommonTestContextMethods(ormMap);\n\n return {\n testContext: {\n get drizzle() {\n return drizzleDb;\n },\n get adapter() {\n return adapter;\n },\n ...commonMethods,\n resetDatabase,\n cleanup,\n },\n get adapter() {\n return adapter;\n },\n };\n}\n\n/**\n * Create adapter based on configuration\n * Supports multiple schemas with separate namespaces\n */\nexport async function createAdapter<T extends SupportedAdapter>(\n adapterConfig: T,\n schemas: SchemaConfig[],\n): Promise<AdapterFactoryResult<T>> {\n if (adapterConfig.type === \"kysely-sqlite\") {\n return createKyselySqliteAdapter(adapterConfig, schemas) as Promise<AdapterFactoryResult<T>>;\n } else if (adapterConfig.type === \"kysely-pglite\") {\n return createKyselyPgliteAdapter(adapterConfig, schemas) as Promise<AdapterFactoryResult<T>>;\n } else if (adapterConfig.type === \"drizzle-pglite\") {\n return createDrizzlePgliteAdapter(adapterConfig, schemas) as Promise<AdapterFactoryResult<T>>;\n }\n\n throw new Error(`Unsupported adapter type: ${(adapterConfig as SupportedAdapter).type}`);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"adapters.js","names":["internalSchemaConfig: SchemaConfig | undefined","kysely","adapter","ormMap","kyselyPglite"],"sources":["../src/adapters.ts"],"sourcesContent":["// Test database adapter helpers and reset logic for fragment suites.\nimport { Kysely } from \"kysely\";\nimport { SQLocalKysely } from \"sqlocal/kysely\";\nimport { KyselyPGlite } from \"kysely-pglite\";\nimport { drizzle } from \"drizzle-orm/pglite\";\nimport { PGlite } from \"@electric-sql/pglite\";\nimport { InMemoryAdapter, type InMemoryAdapterOptions } from \"@fragno-dev/db/adapters/in-memory\";\nimport { SqlAdapter } from \"@fragno-dev/db/adapters/sql\";\nimport type { AnySchema } from \"@fragno-dev/db/schema\";\nimport type { DatabaseAdapter } from \"@fragno-dev/db/adapters\";\nimport type { UnitOfWorkConfig } from \"@fragno-dev/db/adapters/sql\";\nimport type { OutboxConfig } from \"@fragno-dev/db/adapters/sql\";\nimport { rm } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport type { BaseTestContext } from \".\";\nimport { ModelCheckerAdapter } from \"./model-checker-adapter\";\nimport { createCommonTestContextMethods } from \".\";\nimport { PGLiteDriverConfig, SQLocalDriverConfig } from \"@fragno-dev/db/drivers\";\nimport { internalFragmentDef } from \"@fragno-dev/db\";\nimport type { SimpleQueryInterface } from \"@fragno-dev/db/query\";\n\n// Adapter configuration types\nexport interface KyselySqliteAdapter {\n type: \"kysely-sqlite\";\n uowConfig?: UnitOfWorkConfig;\n outbox?: OutboxConfig;\n}\n\nexport interface KyselyPgliteAdapter {\n type: \"kysely-pglite\";\n databasePath?: string;\n uowConfig?: UnitOfWorkConfig;\n outbox?: OutboxConfig;\n}\n\nexport interface DrizzlePgliteAdapter {\n type: \"drizzle-pglite\";\n databasePath?: string;\n uowConfig?: UnitOfWorkConfig;\n outbox?: OutboxConfig;\n}\n\nexport interface InMemoryAdapterConfig {\n type: \"in-memory\";\n options?: InMemoryAdapterOptions;\n uowConfig?: UnitOfWorkConfig;\n}\n\nexport interface ModelCheckerAdapterConfig {\n type: \"model-checker\";\n options?: InMemoryAdapterOptions;\n}\n\nexport type SupportedAdapter =\n | KyselySqliteAdapter\n | KyselyPgliteAdapter\n | DrizzlePgliteAdapter\n | InMemoryAdapterConfig\n | ModelCheckerAdapterConfig;\n\n// Schema configuration for multi-schema adapters\nexport interface SchemaConfig {\n schema: AnySchema;\n namespace: string | null;\n migrateToVersion?: number;\n}\n\n// Internal test context extends BaseTestContext with getOrm (not exposed publicly)\ninterface InternalTestContext extends BaseTestContext {\n getOrm: <TSchema extends AnySchema>(namespace: string | null) => SimpleQueryInterface<TSchema>;\n}\n\n// Conditional return types based on adapter (adapter-specific properties only)\nexport type AdapterContext<T extends SupportedAdapter> = T extends\n | KyselySqliteAdapter\n | KyselyPgliteAdapter\n ? {\n readonly kysely: Kysely<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n }\n : T extends DrizzlePgliteAdapter\n ? {\n readonly drizzle: ReturnType<typeof drizzle<any>>; // eslint-disable-line @typescript-eslint/no-explicit-any\n }\n : T extends InMemoryAdapterConfig | ModelCheckerAdapterConfig\n ? {}\n : never;\n\n// Factory function return type\ninterface AdapterFactoryResult<T extends SupportedAdapter> {\n testContext: InternalTestContext & AdapterContext<T>;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n adapter: DatabaseAdapter<any>;\n}\n\nconst runInternalFragmentMigrations = async (\n adapter: SqlAdapter,\n): Promise<SchemaConfig | undefined> => {\n const dependencies = internalFragmentDef.dependencies;\n if (!dependencies) {\n return undefined;\n }\n\n const databaseDeps = dependencies({\n config: {},\n options: { databaseAdapter: adapter, databaseNamespace: null },\n });\n if (databaseDeps?.schema) {\n const migrations = adapter.prepareMigrations(databaseDeps.schema, databaseDeps.namespace);\n await migrations.executeWithDriver(adapter.driver, 0);\n return { schema: databaseDeps.schema, namespace: databaseDeps.namespace };\n }\n return undefined;\n};\n\nconst resolveSchemaName = (\n adapter: DatabaseAdapter<any>, // eslint-disable-line @typescript-eslint/no-explicit-any\n namespace: string | null,\n): string | null => {\n if (adapter.namingStrategy.namespaceScope !== \"schema\") {\n return null;\n }\n if (!namespace || namespace.length === 0) {\n return null;\n }\n return adapter.namingStrategy.namespaceToSchema(namespace);\n};\n\n/**\n * Create Kysely + SQLite adapter using SQLocalKysely (always in-memory)\n * Supports multiple schemas with separate namespaces\n */\nexport async function createKyselySqliteAdapter(\n config: KyselySqliteAdapter,\n schemas: SchemaConfig[],\n): Promise<AdapterFactoryResult<KyselySqliteAdapter>> {\n let internalSchemaConfig: SchemaConfig | undefined;\n\n // Helper to create a new database instance and run migrations for all schemas\n const createDatabase = async () => {\n // Create SQLocalKysely instance (always in-memory for tests)\n const { dialect } = new SQLocalKysely(\":memory:\");\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const kysely = new Kysely<any>({\n dialect,\n });\n\n // Create SqlAdapter\n const adapter = new SqlAdapter({\n dialect,\n driverConfig: new SQLocalDriverConfig(),\n uowConfig: config.uowConfig,\n outbox: config.outbox,\n });\n internalSchemaConfig = await runInternalFragmentMigrations(adapter);\n\n // Run migrations for all schemas in order\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ormMap = new Map<string | null, SimpleQueryInterface<any, any>>();\n\n for (const { schema, namespace, migrateToVersion } of schemas) {\n // Run migrations\n const preparedMigrations = adapter.prepareMigrations(schema, namespace);\n if (migrateToVersion !== undefined) {\n await preparedMigrations.execute(0, migrateToVersion, { updateVersionInMigration: false });\n } else {\n await preparedMigrations.execute(0, schema.version, { updateVersionInMigration: false });\n }\n\n // Create ORM instance and store in map\n const orm = adapter.createQueryEngine(schema, namespace);\n ormMap.set(namespace, orm);\n }\n\n return { kysely, adapter, ormMap };\n };\n\n // Create initial database\n let { kysely, adapter, ormMap } = await createDatabase();\n\n // Reset database function - truncates all tables (only supported for in-memory databases)\n const resetDatabase = async () => {\n const schemasToTruncate = internalSchemaConfig ? [internalSchemaConfig, ...schemas] : schemas;\n\n // For SQLite, truncate all tables by deleting rows\n for (const { schema, namespace } of schemasToTruncate) {\n for (const tableName of Object.keys(schema.tables)) {\n const physicalTableName = adapter.namingStrategy.tableName(tableName, namespace);\n await kysely.deleteFrom(physicalTableName).execute();\n }\n }\n };\n\n // Cleanup function - closes connections (no files to delete for in-memory)\n const cleanup = async () => {\n await kysely.destroy();\n };\n\n const commonMethods = createCommonTestContextMethods(ormMap);\n\n return {\n testContext: {\n get kysely() {\n return kysely;\n },\n get adapter() {\n return adapter;\n },\n ...commonMethods,\n resetDatabase,\n cleanup,\n },\n get adapter() {\n return adapter;\n },\n };\n}\n\n/**\n * Create Kysely + PGLite adapter using kysely-pglite\n * Supports multiple schemas with separate namespaces\n */\nexport async function createKyselyPgliteAdapter(\n config: KyselyPgliteAdapter,\n schemas: SchemaConfig[],\n): Promise<AdapterFactoryResult<KyselyPgliteAdapter>> {\n const databasePath = config.databasePath;\n let internalSchemaConfig: SchemaConfig | undefined;\n\n // Helper to create a new database instance and run migrations for all schemas\n const createDatabase = async () => {\n // Create KyselyPGlite instance\n const kyselyPglite = await KyselyPGlite.create(databasePath);\n\n // Create Kysely instance with PGlite dialect\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const kysely = new Kysely<any>({\n dialect: kyselyPglite.dialect,\n });\n\n // Create SqlAdapter\n const adapter = new SqlAdapter({\n dialect: kyselyPglite.dialect,\n driverConfig: new PGLiteDriverConfig(),\n uowConfig: config.uowConfig,\n outbox: config.outbox,\n });\n internalSchemaConfig = await runInternalFragmentMigrations(adapter);\n\n // Run migrations for all schemas in order\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ormMap = new Map<string | null, SimpleQueryInterface<any, any>>();\n\n for (const { schema, namespace, migrateToVersion } of schemas) {\n // Run migrations\n const preparedMigrations = adapter.prepareMigrations(schema, namespace);\n if (migrateToVersion !== undefined) {\n await preparedMigrations.execute(0, migrateToVersion, { updateVersionInMigration: false });\n } else {\n await preparedMigrations.execute(0, schema.version, { updateVersionInMigration: false });\n }\n\n // Create ORM instance and store in map\n const orm = adapter.createQueryEngine(schema, namespace);\n ormMap.set(namespace, orm);\n }\n\n return { kysely, adapter, kyselyPglite, ormMap };\n };\n\n // Create initial database\n const { kysely, adapter, kyselyPglite, ormMap } = await createDatabase();\n\n // Reset database function - truncates all tables (only supported for in-memory databases)\n const resetDatabase = async () => {\n if (databasePath && databasePath !== \":memory:\") {\n throw new Error(\"resetDatabase is only supported for in-memory databases\");\n }\n\n const schemasToTruncate = internalSchemaConfig ? [internalSchemaConfig, ...schemas] : schemas;\n\n // Truncate all tables\n for (const { schema, namespace } of schemasToTruncate) {\n for (const tableName of Object.keys(schema.tables)) {\n const physicalTableName = adapter.namingStrategy.tableName(tableName, namespace);\n const schemaName = resolveSchemaName(adapter, namespace);\n const scopedKysely = schemaName ? kysely.withSchema(schemaName) : kysely;\n await scopedKysely.deleteFrom(physicalTableName).execute();\n }\n }\n };\n\n // Cleanup function - closes connections and deletes database directory\n const cleanup = async () => {\n await kysely.destroy();\n\n try {\n await kyselyPglite.client.close();\n } catch {\n // Ignore if already closed\n }\n\n // Delete the database directory if it exists and is a file path\n if (databasePath && databasePath !== \":memory:\" && existsSync(databasePath)) {\n await rm(databasePath, { recursive: true, force: true });\n }\n };\n\n const commonMethods = createCommonTestContextMethods(ormMap);\n\n return {\n testContext: {\n get kysely() {\n return kysely;\n },\n get adapter() {\n return adapter;\n },\n ...commonMethods,\n resetDatabase,\n cleanup,\n },\n get adapter() {\n return adapter;\n },\n };\n}\n\n/**\n * Create Drizzle + PGLite adapter using drizzle-orm/pglite\n * Supports multiple schemas with separate namespaces\n */\nexport async function createDrizzlePgliteAdapter(\n config: DrizzlePgliteAdapter,\n schemas: SchemaConfig[],\n): Promise<AdapterFactoryResult<DrizzlePgliteAdapter>> {\n const databasePath = config.databasePath;\n let internalSchemaConfig: SchemaConfig | undefined;\n\n // Helper to create a new database instance and run migrations for all schemas\n const createDatabase = async () => {\n const pglite = new PGlite(databasePath);\n\n const { dialect } = new KyselyPGlite(pglite);\n\n const adapter = new SqlAdapter({\n dialect,\n driverConfig: new PGLiteDriverConfig(),\n uowConfig: config.uowConfig,\n outbox: config.outbox,\n });\n\n internalSchemaConfig = await runInternalFragmentMigrations(adapter);\n\n // Run migrations for all schemas\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ormMap = new Map<string | null, SimpleQueryInterface<any, any>>();\n\n for (const { schema, namespace, migrateToVersion } of schemas) {\n const preparedMigrations = adapter.prepareMigrations(schema, namespace);\n if (migrateToVersion !== undefined) {\n await preparedMigrations.execute(0, migrateToVersion, { updateVersionInMigration: false });\n } else {\n await preparedMigrations.execute(0, schema.version, { updateVersionInMigration: false });\n }\n\n // Create ORM instance and store in map\n const orm = adapter.createQueryEngine(schema, namespace);\n ormMap.set(namespace, orm);\n }\n\n // Create Drizzle instance for backward compatibility (if needed)\n const db = drizzle(pglite) as any; // eslint-disable-line @typescript-eslint/no-explicit-any\n\n return { drizzle: db, adapter, pglite, ormMap };\n };\n\n // Create initial database\n const { drizzle: drizzleDb, adapter, ormMap } = await createDatabase();\n\n // Reset database function - truncates all tables (only supported for in-memory databases)\n const resetDatabase = async () => {\n if (databasePath && databasePath !== \":memory:\") {\n throw new Error(\"resetDatabase is only supported for in-memory databases\");\n }\n\n const schemasToTruncate = internalSchemaConfig ? [internalSchemaConfig, ...schemas] : schemas;\n\n // Truncate all tables by deleting rows\n for (const { schema, namespace } of schemasToTruncate) {\n const tableNames = Object.keys(schema.tables).slice().reverse();\n for (const tableName of tableNames) {\n const physicalTableName = adapter.namingStrategy.tableName(tableName, namespace);\n const schemaName = resolveSchemaName(adapter, namespace);\n const qualifiedTable = schemaName\n ? `\"${schemaName}\".\"${physicalTableName}\"`\n : `\"${physicalTableName}\"`;\n await drizzleDb.execute(`DELETE FROM ${qualifiedTable}`);\n }\n }\n };\n\n // Cleanup function - closes connections and deletes database directory\n const cleanup = async () => {\n // Close the adapter (which will handle closing the underlying database connection)\n await adapter.close();\n\n // Delete the database directory if it exists and is a file path\n if (databasePath && databasePath !== \":memory:\" && existsSync(databasePath)) {\n await rm(databasePath, { recursive: true, force: true });\n }\n };\n\n const commonMethods = createCommonTestContextMethods(ormMap);\n\n return {\n testContext: {\n get drizzle() {\n return drizzleDb;\n },\n get adapter() {\n return adapter;\n },\n ...commonMethods,\n resetDatabase,\n cleanup,\n },\n get adapter() {\n return adapter;\n },\n };\n}\n\n/**\n * Create InMemory adapter (no migrations required).\n */\nexport async function createInMemoryAdapter(\n config: InMemoryAdapterConfig,\n schemas: SchemaConfig[],\n): Promise<AdapterFactoryResult<InMemoryAdapterConfig>> {\n const adapter = new InMemoryAdapter(config.options);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ormMap = new Map<string | null, SimpleQueryInterface<any, any>>();\n for (const { schema, namespace } of schemas) {\n const orm = adapter.createQueryEngine(schema, namespace);\n ormMap.set(namespace, orm);\n }\n\n const resetDatabase = async () => {\n await adapter.reset();\n };\n\n const cleanup = async () => {\n await adapter.close();\n };\n\n const commonMethods = createCommonTestContextMethods(ormMap);\n\n return {\n testContext: {\n get adapter() {\n return adapter;\n },\n ...commonMethods,\n resetDatabase,\n cleanup,\n },\n get adapter() {\n return adapter;\n },\n };\n}\n\n/**\n * Create ModelChecker adapter (wraps the in-memory adapter).\n */\nexport async function createModelCheckerAdapter(\n config: ModelCheckerAdapterConfig,\n schemas: SchemaConfig[],\n): Promise<AdapterFactoryResult<ModelCheckerAdapterConfig>> {\n const baseAdapter = new InMemoryAdapter(config.options);\n const adapter = new ModelCheckerAdapter(baseAdapter);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ormMap = new Map<string | null, SimpleQueryInterface<any, any>>();\n for (const { schema, namespace } of schemas) {\n const orm = adapter.createQueryEngine(schema, namespace);\n ormMap.set(namespace, orm);\n }\n\n const resetDatabase = async () => {\n await baseAdapter.reset();\n };\n\n const cleanup = async () => {\n await adapter.close();\n };\n\n const commonMethods = createCommonTestContextMethods(ormMap);\n\n return {\n testContext: {\n get adapter() {\n return adapter;\n },\n ...commonMethods,\n resetDatabase,\n cleanup,\n },\n get adapter() {\n return adapter;\n },\n };\n}\n\n/**\n * Create adapter based on configuration\n * Supports multiple schemas with separate namespaces\n */\nexport async function createAdapter<T extends SupportedAdapter>(\n adapterConfig: T,\n schemas: SchemaConfig[],\n): Promise<AdapterFactoryResult<T>> {\n if (adapterConfig.type === \"kysely-sqlite\") {\n return createKyselySqliteAdapter(adapterConfig, schemas) as Promise<AdapterFactoryResult<T>>;\n } else if (adapterConfig.type === \"kysely-pglite\") {\n return createKyselyPgliteAdapter(adapterConfig, schemas) as Promise<AdapterFactoryResult<T>>;\n } else if (adapterConfig.type === \"drizzle-pglite\") {\n return createDrizzlePgliteAdapter(adapterConfig, schemas) as Promise<AdapterFactoryResult<T>>;\n } else if (adapterConfig.type === \"in-memory\") {\n return createInMemoryAdapter(adapterConfig, schemas) as Promise<AdapterFactoryResult<T>>;\n } else if (adapterConfig.type === \"model-checker\") {\n return createModelCheckerAdapter(adapterConfig, schemas) as Promise<AdapterFactoryResult<T>>;\n }\n\n throw new Error(`Unsupported adapter type: ${(adapterConfig as SupportedAdapter).type}`);\n}\n"],"mappings":";;;;;;;;;;;;;;;AA8FA,MAAM,gCAAgC,OACpC,YACsC;CACtC,MAAM,eAAe,oBAAoB;AACzC,KAAI,CAAC,aACH;CAGF,MAAM,eAAe,aAAa;EAChC,QAAQ,EAAE;EACV,SAAS;GAAE,iBAAiB;GAAS,mBAAmB;GAAM;EAC/D,CAAC;AACF,KAAI,cAAc,QAAQ;AAExB,QADmB,QAAQ,kBAAkB,aAAa,QAAQ,aAAa,UAAU,CACxE,kBAAkB,QAAQ,QAAQ,EAAE;AACrD,SAAO;GAAE,QAAQ,aAAa;GAAQ,WAAW,aAAa;GAAW;;;AAK7E,MAAM,qBACJ,SACA,cACkB;AAClB,KAAI,QAAQ,eAAe,mBAAmB,SAC5C,QAAO;AAET,KAAI,CAAC,aAAa,UAAU,WAAW,EACrC,QAAO;AAET,QAAO,QAAQ,eAAe,kBAAkB,UAAU;;;;;;AAO5D,eAAsB,0BACpB,QACA,SACoD;CACpD,IAAIA;CAGJ,MAAM,iBAAiB,YAAY;EAEjC,MAAM,EAAE,YAAY,IAAI,cAAc,WAAW;EAEjD,MAAMC,WAAS,IAAI,OAAY,EAC7B,SACD,CAAC;EAGF,MAAMC,YAAU,IAAI,WAAW;GAC7B;GACA,cAAc,IAAI,qBAAqB;GACvC,WAAW,OAAO;GAClB,QAAQ,OAAO;GAChB,CAAC;AACF,yBAAuB,MAAM,8BAA8BA,UAAQ;EAInE,MAAMC,2BAAS,IAAI,KAAoD;AAEvE,OAAK,MAAM,EAAE,QAAQ,WAAW,sBAAsB,SAAS;GAE7D,MAAM,qBAAqBD,UAAQ,kBAAkB,QAAQ,UAAU;AACvE,OAAI,qBAAqB,OACvB,OAAM,mBAAmB,QAAQ,GAAG,kBAAkB,EAAE,0BAA0B,OAAO,CAAC;OAE1F,OAAM,mBAAmB,QAAQ,GAAG,OAAO,SAAS,EAAE,0BAA0B,OAAO,CAAC;GAI1F,MAAM,MAAMA,UAAQ,kBAAkB,QAAQ,UAAU;AACxD,YAAO,IAAI,WAAW,IAAI;;AAG5B,SAAO;GAAE;GAAQ;GAAS;GAAQ;;CAIpC,IAAI,EAAE,QAAQ,SAAS,WAAW,MAAM,gBAAgB;CAGxD,MAAM,gBAAgB,YAAY;EAChC,MAAM,oBAAoB,uBAAuB,CAAC,sBAAsB,GAAG,QAAQ,GAAG;AAGtF,OAAK,MAAM,EAAE,QAAQ,eAAe,kBAClC,MAAK,MAAM,aAAa,OAAO,KAAK,OAAO,OAAO,EAAE;GAClD,MAAM,oBAAoB,QAAQ,eAAe,UAAU,WAAW,UAAU;AAChF,SAAM,OAAO,WAAW,kBAAkB,CAAC,SAAS;;;CAM1D,MAAM,UAAU,YAAY;AAC1B,QAAM,OAAO,SAAS;;AAKxB,QAAO;EACL,aAAa;GACX,IAAI,SAAS;AACX,WAAO;;GAET,IAAI,UAAU;AACZ,WAAO;;GAET,GAVkB,+BAA+B,OAAO;GAWxD;GACA;GACD;EACD,IAAI,UAAU;AACZ,UAAO;;EAEV;;;;;;AAOH,eAAsB,0BACpB,QACA,SACoD;CACpD,MAAM,eAAe,OAAO;CAC5B,IAAIF;CAGJ,MAAM,iBAAiB,YAAY;EAEjC,MAAMI,iBAAe,MAAM,aAAa,OAAO,aAAa;EAI5D,MAAMH,WAAS,IAAI,OAAY,EAC7B,SAASG,eAAa,SACvB,CAAC;EAGF,MAAMF,YAAU,IAAI,WAAW;GAC7B,SAASE,eAAa;GACtB,cAAc,IAAI,oBAAoB;GACtC,WAAW,OAAO;GAClB,QAAQ,OAAO;GAChB,CAAC;AACF,yBAAuB,MAAM,8BAA8BF,UAAQ;EAInE,MAAMC,2BAAS,IAAI,KAAoD;AAEvE,OAAK,MAAM,EAAE,QAAQ,WAAW,sBAAsB,SAAS;GAE7D,MAAM,qBAAqBD,UAAQ,kBAAkB,QAAQ,UAAU;AACvE,OAAI,qBAAqB,OACvB,OAAM,mBAAmB,QAAQ,GAAG,kBAAkB,EAAE,0BAA0B,OAAO,CAAC;OAE1F,OAAM,mBAAmB,QAAQ,GAAG,OAAO,SAAS,EAAE,0BAA0B,OAAO,CAAC;GAI1F,MAAM,MAAMA,UAAQ,kBAAkB,QAAQ,UAAU;AACxD,YAAO,IAAI,WAAW,IAAI;;AAG5B,SAAO;GAAE;GAAQ;GAAS;GAAc;GAAQ;;CAIlD,MAAM,EAAE,QAAQ,SAAS,cAAc,WAAW,MAAM,gBAAgB;CAGxE,MAAM,gBAAgB,YAAY;AAChC,MAAI,gBAAgB,iBAAiB,WACnC,OAAM,IAAI,MAAM,0DAA0D;EAG5E,MAAM,oBAAoB,uBAAuB,CAAC,sBAAsB,GAAG,QAAQ,GAAG;AAGtF,OAAK,MAAM,EAAE,QAAQ,eAAe,kBAClC,MAAK,MAAM,aAAa,OAAO,KAAK,OAAO,OAAO,EAAE;GAClD,MAAM,oBAAoB,QAAQ,eAAe,UAAU,WAAW,UAAU;GAChF,MAAM,aAAa,kBAAkB,SAAS,UAAU;AAExD,UADqB,aAAa,OAAO,WAAW,WAAW,GAAG,QAC/C,WAAW,kBAAkB,CAAC,SAAS;;;CAMhE,MAAM,UAAU,YAAY;AAC1B,QAAM,OAAO,SAAS;AAEtB,MAAI;AACF,SAAM,aAAa,OAAO,OAAO;UAC3B;AAKR,MAAI,gBAAgB,iBAAiB,cAAc,WAAW,aAAa,CACzE,OAAM,GAAG,cAAc;GAAE,WAAW;GAAM,OAAO;GAAM,CAAC;;AAM5D,QAAO;EACL,aAAa;GACX,IAAI,SAAS;AACX,WAAO;;GAET,IAAI,UAAU;AACZ,WAAO;;GAET,GAVkB,+BAA+B,OAAO;GAWxD;GACA;GACD;EACD,IAAI,UAAU;AACZ,UAAO;;EAEV;;;;;;AAOH,eAAsB,2BACpB,QACA,SACqD;CACrD,MAAM,eAAe,OAAO;CAC5B,IAAIF;CAGJ,MAAM,iBAAiB,YAAY;EACjC,MAAM,SAAS,IAAI,OAAO,aAAa;EAEvC,MAAM,EAAE,YAAY,IAAI,aAAa,OAAO;EAE5C,MAAME,YAAU,IAAI,WAAW;GAC7B;GACA,cAAc,IAAI,oBAAoB;GACtC,WAAW,OAAO;GAClB,QAAQ,OAAO;GAChB,CAAC;AAEF,yBAAuB,MAAM,8BAA8BA,UAAQ;EAInE,MAAMC,2BAAS,IAAI,KAAoD;AAEvE,OAAK,MAAM,EAAE,QAAQ,WAAW,sBAAsB,SAAS;GAC7D,MAAM,qBAAqBD,UAAQ,kBAAkB,QAAQ,UAAU;AACvE,OAAI,qBAAqB,OACvB,OAAM,mBAAmB,QAAQ,GAAG,kBAAkB,EAAE,0BAA0B,OAAO,CAAC;OAE1F,OAAM,mBAAmB,QAAQ,GAAG,OAAO,SAAS,EAAE,0BAA0B,OAAO,CAAC;GAI1F,MAAM,MAAMA,UAAQ,kBAAkB,QAAQ,UAAU;AACxD,YAAO,IAAI,WAAW,IAAI;;AAM5B,SAAO;GAAE,SAFE,QAAQ,OAAO;GAEJ;GAAS;GAAQ;GAAQ;;CAIjD,MAAM,EAAE,SAAS,WAAW,SAAS,WAAW,MAAM,gBAAgB;CAGtE,MAAM,gBAAgB,YAAY;AAChC,MAAI,gBAAgB,iBAAiB,WACnC,OAAM,IAAI,MAAM,0DAA0D;EAG5E,MAAM,oBAAoB,uBAAuB,CAAC,sBAAsB,GAAG,QAAQ,GAAG;AAGtF,OAAK,MAAM,EAAE,QAAQ,eAAe,mBAAmB;GACrD,MAAM,aAAa,OAAO,KAAK,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS;AAC/D,QAAK,MAAM,aAAa,YAAY;IAClC,MAAM,oBAAoB,QAAQ,eAAe,UAAU,WAAW,UAAU;IAChF,MAAM,aAAa,kBAAkB,SAAS,UAAU;IACxD,MAAM,iBAAiB,aACnB,IAAI,WAAW,KAAK,kBAAkB,KACtC,IAAI,kBAAkB;AAC1B,UAAM,UAAU,QAAQ,eAAe,iBAAiB;;;;CAM9D,MAAM,UAAU,YAAY;AAE1B,QAAM,QAAQ,OAAO;AAGrB,MAAI,gBAAgB,iBAAiB,cAAc,WAAW,aAAa,CACzE,OAAM,GAAG,cAAc;GAAE,WAAW;GAAM,OAAO;GAAM,CAAC;;AAM5D,QAAO;EACL,aAAa;GACX,IAAI,UAAU;AACZ,WAAO;;GAET,IAAI,UAAU;AACZ,WAAO;;GAET,GAVkB,+BAA+B,OAAO;GAWxD;GACA;GACD;EACD,IAAI,UAAU;AACZ,UAAO;;EAEV;;;;;AAMH,eAAsB,sBACpB,QACA,SACsD;CACtD,MAAM,UAAU,IAAI,gBAAgB,OAAO,QAAQ;CAGnD,MAAM,yBAAS,IAAI,KAAoD;AACvE,MAAK,MAAM,EAAE,QAAQ,eAAe,SAAS;EAC3C,MAAM,MAAM,QAAQ,kBAAkB,QAAQ,UAAU;AACxD,SAAO,IAAI,WAAW,IAAI;;CAG5B,MAAM,gBAAgB,YAAY;AAChC,QAAM,QAAQ,OAAO;;CAGvB,MAAM,UAAU,YAAY;AAC1B,QAAM,QAAQ,OAAO;;AAKvB,QAAO;EACL,aAAa;GACX,IAAI,UAAU;AACZ,WAAO;;GAET,GAPkB,+BAA+B,OAAO;GAQxD;GACA;GACD;EACD,IAAI,UAAU;AACZ,UAAO;;EAEV;;;;;AAMH,eAAsB,0BACpB,QACA,SAC0D;CAC1D,MAAM,cAAc,IAAI,gBAAgB,OAAO,QAAQ;CACvD,MAAM,UAAU,IAAI,oBAAoB,YAAY;CAGpD,MAAM,yBAAS,IAAI,KAAoD;AACvE,MAAK,MAAM,EAAE,QAAQ,eAAe,SAAS;EAC3C,MAAM,MAAM,QAAQ,kBAAkB,QAAQ,UAAU;AACxD,SAAO,IAAI,WAAW,IAAI;;CAG5B,MAAM,gBAAgB,YAAY;AAChC,QAAM,YAAY,OAAO;;CAG3B,MAAM,UAAU,YAAY;AAC1B,QAAM,QAAQ,OAAO;;AAKvB,QAAO;EACL,aAAa;GACX,IAAI,UAAU;AACZ,WAAO;;GAET,GAPkB,+BAA+B,OAAO;GAQxD;GACA;GACD;EACD,IAAI,UAAU;AACZ,UAAO;;EAEV;;;;;;AAOH,eAAsB,cACpB,eACA,SACkC;AAClC,KAAI,cAAc,SAAS,gBACzB,QAAO,0BAA0B,eAAe,QAAQ;UAC/C,cAAc,SAAS,gBAChC,QAAO,0BAA0B,eAAe,QAAQ;UAC/C,cAAc,SAAS,iBAChC,QAAO,2BAA2B,eAAe,QAAQ;UAChD,cAAc,SAAS,YAChC,QAAO,sBAAsB,eAAe,QAAQ;UAC3C,cAAc,SAAS,gBAChC,QAAO,0BAA0B,eAAe,QAAQ;AAG1D,OAAM,IAAI,MAAM,6BAA8B,cAAmC,OAAO"}
@@ -1 +1 @@
1
- {"version":3,"file":"db-test.d.ts","names":[],"sources":["../src/db-test.ts"],"sourcesContent":[],"mappings":"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"}
1
+ {"version":3,"file":"db-test.d.ts","names":[],"sources":["../src/db-test.ts"],"sourcesContent":[],"mappings":"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"}
package/dist/db-test.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { createAdapter } from "./adapters.js";
2
+ import { drainDurableHooks } from "./durable-hooks.js";
2
3
 
3
4
  //#region src/db-test.ts
4
5
  /**
@@ -48,7 +49,18 @@ var DatabaseFragmentsTestBuilder = class {
48
49
  if (definition.dependencies) try {
49
50
  const mockAdapter = {
50
51
  createQueryEngine: () => ({ schema: null }),
51
- contextStorage: { run: (_data, fn) => fn() }
52
+ getSchemaVersion: async () => void 0,
53
+ namingStrategy: {
54
+ namespaceScope: "suffix",
55
+ namespaceToSchema: (value) => value,
56
+ tableName: (logicalTable, ns) => ns ? `${logicalTable}_${ns}` : logicalTable,
57
+ columnName: (logicalColumn) => logicalColumn,
58
+ indexName: (logicalIndex) => logicalIndex,
59
+ uniqueIndexName: (logicalIndex) => logicalIndex,
60
+ foreignKeyName: ({ referenceName }) => referenceName
61
+ },
62
+ contextStorage: { run: (_data, fn) => fn() },
63
+ close: async () => {}
52
64
  };
53
65
  const actualConfig = builder.config ?? {};
54
66
  const deps = definition.dependencies({
@@ -64,7 +76,7 @@ var DatabaseFragmentsTestBuilder = class {
64
76
  throw new Error(`Failed to extract schema from fragment '${definition.name}'.\nOriginal error: ${errorMessage}\n\nMake sure the fragment is a database fragment using defineFragment().extend(withDatabase(schema)).`);
65
77
  }
66
78
  if (!schema) throw new Error(`Fragment '${definition.name}' does not have a database schema. Make sure you're using defineFragment().extend(withDatabase(schema)).`);
67
- if (!namespace) throw new Error(`Fragment '${definition.name}' does not have a namespace in dependencies. This should be automatically provided by withDatabase().`);
79
+ if (namespace === void 0) throw new Error(`Fragment '${definition.name}' does not have a namespace in dependencies. This should be automatically provided by withDatabase().`);
68
80
  schemaConfigs.push({
69
81
  schema,
70
82
  namespace,
@@ -155,9 +167,28 @@ var DatabaseFragmentsTestBuilder = class {
155
167
  };
156
168
  const firstFragment = fragmentResults[0]?.fragment;
157
169
  if (!firstFragment) throw new Error("At least one fragment must be added");
170
+ const originalCleanup = testContext.cleanup;
171
+ const cleanup = async () => {
172
+ let drainError;
173
+ let cleanupError;
174
+ for (const result of fragmentResults) try {
175
+ await drainDurableHooks(result.fragment);
176
+ } catch (error) {
177
+ if (!drainError) drainError = error;
178
+ }
179
+ try {
180
+ await originalCleanup();
181
+ } catch (error) {
182
+ cleanupError = error;
183
+ }
184
+ if (drainError && cleanupError) throw new AggregateError([drainError, cleanupError], "Failed to drain durable hooks and clean up test context");
185
+ if (drainError) throw drainError;
186
+ if (cleanupError) throw cleanupError;
187
+ };
158
188
  const finalTestContext = {
159
189
  ...testContext,
160
190
  resetDatabase,
191
+ cleanup,
161
192
  adapter,
162
193
  inContext: firstFragment.inContext.bind(firstFragment)
163
194
  };