@fragno-dev/test 0.1.10 → 0.1.12

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.
@@ -1,5 +1,5 @@
1
1
 
2
- > @fragno-dev/test@0.1.10 build /home/runner/work/fragno/fragno/packages/fragno-test
2
+ > @fragno-dev/test@0.1.12 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,13 +7,13 @@
7
7
  ℹ entry: src/index.ts
8
8
  ℹ tsconfig: tsconfig.json
9
9
  ℹ Build start
10
- ℹ dist/index.js  2.64 kB │ gzip: 0.81 kB
11
- ℹ dist/adapters.js.map 16.62 kB │ gzip: 3.63 kB
12
- ℹ dist/index.js.map  9.54 kB │ gzip: 2.63 kB
13
- ℹ dist/adapters.js  6.74 kB │ gzip: 1.54 kB
14
- ℹ dist/index.d.ts.map  1.72 kB │ gzip: 0.78 kB
15
- ℹ dist/adapters.d.ts.map  0.93 kB │ gzip: 0.42 kB
16
- ℹ dist/index.d.ts  3.34 kB │ gzip: 0.93 kB
17
- ℹ dist/adapters.d.ts  1.28 kB │ gzip: 0.42 kB
18
- ℹ 8 files, total: 42.80 kB
19
- ✔ Build complete in 13034ms
10
+ ℹ dist/index.js  5.83 kB │ gzip: 1.61 kB
11
+ ℹ dist/index.js.map 19.40 kB │ gzip: 4.76 kB
12
+ ℹ dist/adapters.js.map 18.56 kB │ gzip: 4.04 kB
13
+ ℹ dist/adapters.js  7.97 kB │ gzip: 1.74 kB
14
+ ℹ dist/index.d.ts.map  3.95 kB │ gzip: 1.63 kB
15
+ ℹ dist/adapters.d.ts.map  0.42 kB │ gzip: 0.27 kB
16
+ ℹ dist/index.d.ts  6.22 kB │ gzip: 1.54 kB
17
+ ℹ dist/adapters.d.ts  0.95 kB │ gzip: 0.37 kB
18
+ ℹ 8 files, total: 63.32 kB
19
+ ✔ Build complete in 12873ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,21 @@
1
1
  # @fragno-dev/test
2
2
 
3
+ ## 0.1.12
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [acb0877]
8
+ - @fragno-dev/core@0.1.8
9
+ - @fragno-dev/db@0.1.14
10
+
11
+ ## 0.1.11
12
+
13
+ ### Patch Changes
14
+
15
+ - Updated dependencies [09a1e13]
16
+ - @fragno-dev/core@0.1.7
17
+ - @fragno-dev/db@0.1.13
18
+
3
19
  ## 0.1.10
4
20
 
5
21
  ### Patch Changes
@@ -1,7 +1,7 @@
1
+ import "./index.js";
1
2
  import { Kysely } from "kysely";
2
3
  import { drizzle } from "drizzle-orm/pglite";
3
4
  import { AnySchema } from "@fragno-dev/db/schema";
4
- import { DatabaseAdapter } from "@fragno-dev/db/adapters";
5
5
  import { AbstractQuery } from "@fragno-dev/db/query";
6
6
 
7
7
  //#region src/adapters.d.ts
@@ -17,19 +17,11 @@ interface DrizzlePgliteAdapter {
17
17
  databasePath?: string;
18
18
  }
19
19
  type SupportedAdapter = KyselySqliteAdapter | KyselyPgliteAdapter | DrizzlePgliteAdapter;
20
- type TestContext<T extends SupportedAdapter> = T extends KyselySqliteAdapter | KyselyPgliteAdapter ? {
21
- readonly db: AbstractQuery<any>;
20
+ type AdapterContext<T extends SupportedAdapter> = T extends KyselySqliteAdapter | KyselyPgliteAdapter ? {
22
21
  readonly kysely: Kysely<any>;
23
- readonly adapter: DatabaseAdapter<any>;
24
- resetDatabase: () => Promise<void>;
25
- cleanup: () => Promise<void>;
26
22
  } : T extends DrizzlePgliteAdapter ? {
27
- readonly db: AbstractQuery<any>;
28
23
  readonly drizzle: ReturnType<typeof drizzle<any>>;
29
- readonly adapter: DatabaseAdapter<any>;
30
- resetDatabase: () => Promise<void>;
31
- cleanup: () => Promise<void>;
32
24
  } : never;
33
25
  //#endregion
34
- export { DrizzlePgliteAdapter, KyselyPgliteAdapter, KyselySqliteAdapter, SupportedAdapter, TestContext };
26
+ export { AdapterContext, DrizzlePgliteAdapter, KyselyPgliteAdapter, KyselySqliteAdapter, SupportedAdapter };
35
27
  //# sourceMappingURL=adapters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.d.ts","names":[],"sources":["../src/adapters.ts"],"sourcesContent":[],"mappings":";;;;;;;UAgBiB,mBAAA;;AAAjB;AAIiB,UAAA,mBAAA,CAAmB;EAKnB,IAAA,EAAA,eAAA;EAKL,YAAA,CAAA,EAAA,MAAgB;;AAAyB,UALpC,oBAAA,CAKoC;EAAsB,IAAA,EAAA,gBAAA;EAAoB,YAAA,CAAA,EAAA,MAAA;AAG/F;AAAkC,KAHtB,gBAAA,GAAmB,mBAGG,GAHmB,mBAGnB,GAHyC,oBAGzC;AAAoB,KAA1C,WAA0C,CAAA,UAApB,gBAAoB,CAAA,GAAA,CAAA,SAClD,mBADkD,GAElD,mBAFkD,GAAA;EAClD,SAAA,EAAA,EAGe,aAHf,CAAA,GAAA,CAAA;EACA,SAAA,MAAA,EAGmB,MAHnB,CAAA,GAAA,CAAA;EAEe,SAAA,OAAA,EAEK,eAFL,CAAA,GAAA,CAAA;EACI,aAAA,EAAA,GAAA,GAEI,OAFJ,CAAA,IAAA,CAAA;EACC,OAAA,EAAA,GAAA,GAEH,OAFG,CAAA,IAAA,CAAA;CACG,GAGvB,CAHuB,SAGb,oBAHa,GAAA;EACN,SAAA,EAAA,EAIA,aAJA,CAAA,GAAA,CAAA;EAEjB,SAAA,OAAA,EAGsB,UAHtB,CAAA,OAGwC,OAHxC,CAAA,GAAA,CAAA,CAAA;EAAU,SAAA,OAAA,EAIY,eAJZ,CAAA,GAAA,CAAA;EAEO,aAAA,EAAA,GAAA,GAGQ,OAHR,CAAA,IAAA,CAAA;EACuB,OAAA,EAAA,GAAA,GAGrB,OAHqB,CAAA,IAAA,CAAA;CAAlB,GAAA,KAAA"}
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"}
package/dist/adapters.js CHANGED
@@ -1,3 +1,4 @@
1
+ import { createCommonTestContextMethods } from "./index.js";
1
2
  import { createRequire } from "node:module";
2
3
  import { Kysely } from "kysely";
3
4
  import { SQLocalKysely } from "sqlocal/kysely";
@@ -13,8 +14,9 @@ import { existsSync } from "node:fs";
13
14
  //#region src/adapters.ts
14
15
  /**
15
16
  * Create Kysely + SQLite adapter using SQLocalKysely (always in-memory)
17
+ * Supports multiple schemas with separate namespaces
16
18
  */
17
- async function createKyselySqliteAdapter(_config, schema, namespace, migrateToVersion) {
19
+ async function createKyselySqliteAdapter(_config, schemas) {
18
20
  const createDatabase = async () => {
19
21
  const { dialect } = new SQLocalKysely(":memory:");
20
22
  const kysely$1 = new Kysely({ dialect });
@@ -22,36 +24,41 @@ async function createKyselySqliteAdapter(_config, schema, namespace, migrateToVe
22
24
  db: kysely$1,
23
25
  provider: "sqlite"
24
26
  });
25
- const migrator = adapter$1.createMigrationEngine(schema, namespace);
26
- await (migrateToVersion ? await migrator.prepareMigrationTo(migrateToVersion, { updateSettings: false }) : await migrator.prepareMigration({ updateSettings: false })).execute();
27
+ const ormMap$1 = /* @__PURE__ */ new Map();
28
+ for (const { schema, namespace, migrateToVersion } of schemas) {
29
+ const migrator = adapter$1.createMigrationEngine(schema, namespace);
30
+ await (migrateToVersion ? await migrator.prepareMigrationTo(migrateToVersion, { updateSettings: false }) : await migrator.prepareMigration({ updateSettings: false })).execute();
31
+ const orm = adapter$1.createQueryEngine(schema, namespace);
32
+ ormMap$1.set(namespace, orm);
33
+ }
27
34
  return {
28
35
  kysely: kysely$1,
29
36
  adapter: adapter$1,
30
- orm: adapter$1.createQueryEngine(schema, namespace)
37
+ ormMap: ormMap$1
31
38
  };
32
39
  };
33
- let { kysely, adapter, orm } = await createDatabase();
40
+ let { kysely, adapter, ormMap } = await createDatabase();
34
41
  const resetDatabase = async () => {
35
- await kysely.destroy();
36
- const newDb = await createDatabase();
37
- kysely = newDb.kysely;
38
- adapter = newDb.adapter;
39
- orm = newDb.orm;
42
+ for (const { schema, namespace } of schemas) {
43
+ const mapper = adapter.createTableNameMapper(namespace);
44
+ for (const tableName of Object.keys(schema.tables)) {
45
+ const physicalTableName = mapper.toPhysical(tableName);
46
+ await kysely.deleteFrom(physicalTableName).execute();
47
+ }
48
+ }
40
49
  };
41
50
  const cleanup = async () => {
42
51
  await kysely.destroy();
43
52
  };
44
53
  return {
45
54
  testContext: {
46
- get db() {
47
- return orm;
48
- },
49
55
  get kysely() {
50
56
  return kysely;
51
57
  },
52
58
  get adapter() {
53
59
  return adapter;
54
60
  },
61
+ ...createCommonTestContextMethods(ormMap),
55
62
  resetDatabase,
56
63
  cleanup
57
64
  },
@@ -62,8 +69,9 @@ async function createKyselySqliteAdapter(_config, schema, namespace, migrateToVe
62
69
  }
63
70
  /**
64
71
  * Create Kysely + PGLite adapter using kysely-pglite
72
+ * Supports multiple schemas with separate namespaces
65
73
  */
66
- async function createKyselyPgliteAdapter(config, schema, namespace, migrateToVersion) {
74
+ async function createKyselyPgliteAdapter(config, schemas) {
67
75
  const databasePath = config.databasePath;
68
76
  const createDatabase = async () => {
69
77
  const kyselyPglite$1 = await KyselyPGlite.create(databasePath);
@@ -72,26 +80,30 @@ async function createKyselyPgliteAdapter(config, schema, namespace, migrateToVer
72
80
  db: kysely$1,
73
81
  provider: "postgresql"
74
82
  });
75
- const migrator = adapter$1.createMigrationEngine(schema, namespace);
76
- await (migrateToVersion ? await migrator.prepareMigrationTo(migrateToVersion, { updateSettings: false }) : await migrator.prepareMigration({ updateSettings: false })).execute();
83
+ const ormMap$1 = /* @__PURE__ */ new Map();
84
+ for (const { schema, namespace, migrateToVersion } of schemas) {
85
+ const migrator = adapter$1.createMigrationEngine(schema, namespace);
86
+ await (migrateToVersion ? await migrator.prepareMigrationTo(migrateToVersion, { updateSettings: false }) : await migrator.prepareMigration({ updateSettings: false })).execute();
87
+ const orm = adapter$1.createQueryEngine(schema, namespace);
88
+ ormMap$1.set(namespace, orm);
89
+ }
77
90
  return {
78
91
  kysely: kysely$1,
79
92
  adapter: adapter$1,
80
93
  kyselyPglite: kyselyPglite$1,
81
- orm: adapter$1.createQueryEngine(schema, namespace)
94
+ ormMap: ormMap$1
82
95
  };
83
96
  };
84
- let { kysely, adapter, kyselyPglite, orm } = await createDatabase();
97
+ const { kysely, adapter, kyselyPglite, ormMap } = await createDatabase();
85
98
  const resetDatabase = async () => {
86
- await kysely.destroy();
87
- try {
88
- await kyselyPglite.client.close();
89
- } catch {}
90
- const newDb = await createDatabase();
91
- kysely = newDb.kysely;
92
- adapter = newDb.adapter;
93
- kyselyPglite = newDb.kyselyPglite;
94
- orm = newDb.orm;
99
+ if (databasePath && databasePath !== ":memory:") throw new Error("resetDatabase is only supported for in-memory databases");
100
+ for (const { schema, namespace } of schemas) {
101
+ const mapper = adapter.createTableNameMapper(namespace);
102
+ for (const tableName of Object.keys(schema.tables)) {
103
+ const physicalTableName = mapper.toPhysical(tableName);
104
+ await kysely.deleteFrom(physicalTableName).execute();
105
+ }
106
+ }
95
107
  };
96
108
  const cleanup = async () => {
97
109
  await kysely.destroy();
@@ -105,15 +117,13 @@ async function createKyselyPgliteAdapter(config, schema, namespace, migrateToVer
105
117
  };
106
118
  return {
107
119
  testContext: {
108
- get db() {
109
- return orm;
110
- },
111
120
  get kysely() {
112
121
  return kysely;
113
122
  },
114
123
  get adapter() {
115
124
  return adapter;
116
125
  },
126
+ ...createCommonTestContextMethods(ormMap),
117
127
  resetDatabase,
118
128
  cleanup
119
129
  },
@@ -124,8 +134,9 @@ async function createKyselyPgliteAdapter(config, schema, namespace, migrateToVer
124
134
  }
125
135
  /**
126
136
  * Create Drizzle + PGLite adapter using drizzle-orm/pglite
137
+ * Supports multiple schemas with separate namespaces
127
138
  */
128
- async function createDrizzlePgliteAdapter(config, schema, namespace, _migrateToVersion) {
139
+ async function createDrizzlePgliteAdapter(config, schemas) {
129
140
  const databasePath = config.databasePath;
130
141
  const { generateDrizzleJson, generateMigration } = createRequire(import.meta.url)("drizzle-kit/api");
131
142
  const { generateSchema } = await import("@fragno-dev/db/adapters/drizzle/generate");
@@ -133,10 +144,10 @@ async function createDrizzlePgliteAdapter(config, schema, namespace, _migrateToV
133
144
  const testDir = join(import.meta.dirname, "_generated", "drizzle-test");
134
145
  await mkdir(testDir, { recursive: true }).catch(() => {});
135
146
  const schemaFilePath = join(testDir, `test-schema-${Date.now()}-${Math.random().toString(36).slice(2, 9)}.ts`);
136
- await writeFile(schemaFilePath, generateSchema([{
147
+ await writeFile(schemaFilePath, generateSchema(schemas.map(({ schema, namespace }) => ({
137
148
  namespace: namespace ?? "",
138
149
  schema
139
- }], "postgresql"), "utf-8");
150
+ })), "postgresql"), "utf-8");
140
151
  const schemaModule = await import(`${schemaFilePath}?t=${Date.now()}`);
141
152
  const cleanup$1 = async () => {
142
153
  await rm(testDir, {
@@ -159,24 +170,29 @@ async function createDrizzlePgliteAdapter(config, schema, namespace, _migrateToV
159
170
  db: () => db,
160
171
  provider: "postgresql"
161
172
  });
173
+ const ormMap$1 = /* @__PURE__ */ new Map();
174
+ for (const { schema, namespace } of schemas) {
175
+ const orm = adapter$1.createQueryEngine(schema, namespace);
176
+ ormMap$1.set(namespace, orm);
177
+ }
162
178
  return {
163
179
  drizzle: db,
164
180
  adapter: adapter$1,
165
181
  pglite: pglite$1,
166
182
  cleanup: cleanup$1,
167
- orm: adapter$1.createQueryEngine(schema, namespace)
183
+ ormMap: ormMap$1
168
184
  };
169
185
  };
170
- let { drizzle: drizzleDb, adapter, pglite, cleanup: schemaCleanup, orm } = await createDatabase();
186
+ const { drizzle: drizzleDb, adapter, pglite, cleanup: schemaCleanup, ormMap } = await createDatabase();
171
187
  const resetDatabase = async () => {
172
- await pglite.close();
173
- await schemaCleanup();
174
- const newDb = await createDatabase();
175
- drizzleDb = newDb.drizzle;
176
- adapter = newDb.adapter;
177
- pglite = newDb.pglite;
178
- schemaCleanup = newDb.cleanup;
179
- orm = newDb.orm;
188
+ if (databasePath && databasePath !== ":memory:") throw new Error("resetDatabase is only supported for in-memory databases");
189
+ for (const { schema, namespace } of schemas) {
190
+ const mapper = adapter.createTableNameMapper(namespace);
191
+ for (const tableName of Object.keys(schema.tables)) {
192
+ const physicalTableName = mapper.toPhysical(tableName);
193
+ await drizzleDb.execute(`DELETE FROM "${physicalTableName}"`);
194
+ }
195
+ }
180
196
  };
181
197
  const cleanup = async () => {
182
198
  await pglite.close();
@@ -188,15 +204,13 @@ async function createDrizzlePgliteAdapter(config, schema, namespace, _migrateToV
188
204
  };
189
205
  return {
190
206
  testContext: {
191
- get db() {
192
- return orm;
193
- },
194
207
  get drizzle() {
195
208
  return drizzleDb;
196
209
  },
197
210
  get adapter() {
198
211
  return adapter;
199
212
  },
213
+ ...createCommonTestContextMethods(ormMap),
200
214
  resetDatabase,
201
215
  cleanup
202
216
  },
@@ -207,11 +221,12 @@ async function createDrizzlePgliteAdapter(config, schema, namespace, _migrateToV
207
221
  }
208
222
  /**
209
223
  * Create adapter based on configuration
224
+ * Supports multiple schemas with separate namespaces
210
225
  */
211
- async function createAdapter(adapterConfig, schema, namespace, migrateToVersion) {
212
- if (adapterConfig.type === "kysely-sqlite") return createKyselySqliteAdapter(adapterConfig, schema, namespace, migrateToVersion);
213
- else if (adapterConfig.type === "kysely-pglite") return createKyselyPgliteAdapter(adapterConfig, schema, namespace, migrateToVersion);
214
- else if (adapterConfig.type === "drizzle-pglite") return createDrizzlePgliteAdapter(adapterConfig, schema, namespace, migrateToVersion);
226
+ async function createAdapter(adapterConfig, schemas) {
227
+ if (adapterConfig.type === "kysely-sqlite") return createKyselySqliteAdapter(adapterConfig, schemas);
228
+ else if (adapterConfig.type === "kysely-pglite") return createKyselyPgliteAdapter(adapterConfig, schemas);
229
+ else if (adapterConfig.type === "drizzle-pglite") return createDrizzlePgliteAdapter(adapterConfig, schemas);
215
230
  throw new Error(`Unsupported adapter type: ${adapterConfig.type}`);
216
231
  }
217
232
 
@@ -1 +1 @@
1
- {"version":3,"file":"adapters.js","names":["kysely","adapter","kyselyPglite","cleanup","pglite"],"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 type { AbstractQuery } from \"@fragno-dev/db/query\";\nimport { createRequire } from \"node:module\";\nimport { mkdir, writeFile, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\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// Conditional return types based on adapter\nexport type TestContext<T extends SupportedAdapter> = T extends\n | KyselySqliteAdapter\n | KyselyPgliteAdapter\n ? {\n readonly db: AbstractQuery<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n readonly kysely: Kysely<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n readonly adapter: DatabaseAdapter<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n resetDatabase: () => Promise<void>;\n cleanup: () => Promise<void>;\n }\n : T extends DrizzlePgliteAdapter\n ? {\n readonly db: AbstractQuery<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n readonly drizzle: ReturnType<typeof drizzle<any>>; // eslint-disable-line @typescript-eslint/no-explicit-any\n readonly adapter: DatabaseAdapter<any>; // eslint-disable-line @typescript-eslint/no-explicit-any\n resetDatabase: () => Promise<void>;\n cleanup: () => Promise<void>;\n }\n : never;\n\n// Factory function return type\ninterface AdapterFactoryResult<T extends SupportedAdapter> {\n testContext: TestContext<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 */\nexport async function createKyselySqliteAdapter(\n _config: KyselySqliteAdapter,\n schema: AnySchema,\n namespace: string,\n migrateToVersion?: number,\n): Promise<AdapterFactoryResult<KyselySqliteAdapter>> {\n // Helper to create a new database instance and run migrations\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 db: kysely,\n provider: \"sqlite\",\n });\n\n // Run migrations\n const migrator = adapter.createMigrationEngine(schema, namespace);\n const preparedMigration = migrateToVersion\n ? await migrator.prepareMigrationTo(migrateToVersion, {\n updateSettings: false,\n })\n : await migrator.prepareMigration({\n updateSettings: false,\n });\n await preparedMigration.execute();\n\n // Create ORM instance\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const orm = adapter.createQueryEngine(schema, namespace) as AbstractQuery<any>;\n\n return { kysely, adapter, orm };\n };\n\n // Create initial database\n let { kysely, adapter, orm } = await createDatabase();\n\n // Reset database function - creates a fresh in-memory database and re-runs migrations\n const resetDatabase = async () => {\n // Destroy the old Kysely instance\n await kysely.destroy();\n\n // Create a new database instance\n const newDb = await createDatabase();\n kysely = newDb.kysely;\n adapter = newDb.adapter;\n orm = newDb.orm;\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 return {\n testContext: {\n get db() {\n return orm;\n },\n get kysely() {\n return kysely;\n },\n get adapter() {\n return adapter;\n },\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 */\nexport async function createKyselyPgliteAdapter(\n config: KyselyPgliteAdapter,\n schema: AnySchema,\n namespace: string,\n migrateToVersion?: number,\n): Promise<AdapterFactoryResult<KyselyPgliteAdapter>> {\n const databasePath = config.databasePath;\n\n // Helper to create a new database instance and run migrations\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 db: kysely,\n provider: \"postgresql\",\n });\n\n // Run migrations\n const migrator = adapter.createMigrationEngine(schema, namespace);\n const preparedMigration = migrateToVersion\n ? await migrator.prepareMigrationTo(migrateToVersion, {\n updateSettings: false,\n })\n : await migrator.prepareMigration({\n updateSettings: false,\n });\n await preparedMigration.execute();\n\n // Create ORM instance\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const orm = adapter.createQueryEngine(schema, namespace) as AbstractQuery<any>;\n\n return { kysely, adapter, kyselyPglite, orm };\n };\n\n // Create initial database\n let { kysely, adapter, kyselyPglite, orm } = await createDatabase();\n\n // Reset database function - creates a fresh database and re-runs migrations\n const resetDatabase = async () => {\n // Close the old instances\n await kysely.destroy();\n\n try {\n await kyselyPglite.client.close();\n } catch {\n // Ignore if already closed\n }\n\n // Create a new database instance\n const newDb = await createDatabase();\n kysely = newDb.kysely;\n adapter = newDb.adapter;\n kyselyPglite = newDb.kyselyPglite;\n orm = newDb.orm;\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 return {\n testContext: {\n get db() {\n return orm;\n },\n get kysely() {\n return kysely;\n },\n get adapter() {\n return adapter;\n },\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 */\nexport async function createDrizzlePgliteAdapter(\n config: DrizzlePgliteAdapter,\n schema: AnySchema,\n namespace: string,\n _migrateToVersion?: number,\n): Promise<AdapterFactoryResult<DrizzlePgliteAdapter>> {\n const databasePath = config.databasePath;\n\n // Import drizzle-kit for migrations\n const require = createRequire(import.meta.url);\n const { generateDrizzleJson, generateMigration } =\n require(\"drizzle-kit/api\") as typeof import(\"drizzle-kit/api\");\n\n // Import generateSchema from the properly exported module\n const { generateSchema } = await import(\"@fragno-dev/db/adapters/drizzle/generate\");\n\n // Helper to write schema to file and dynamically import it\n const writeAndLoadSchema = async () => {\n const testDir = join(import.meta.dirname, \"_generated\", \"drizzle-test\");\n await mkdir(testDir, { recursive: true }).catch(() => {\n // Ignore error if directory already exists\n });\n\n const schemaFilePath = join(\n testDir,\n `test-schema-${Date.now()}-${Math.random().toString(36).slice(2, 9)}.ts`,\n );\n\n // Generate and write the Drizzle schema to file\n const drizzleSchemaTs = generateSchema([{ namespace: namespace ?? \"\", schema }], \"postgresql\");\n await writeFile(schemaFilePath, drizzleSchemaTs, \"utf-8\");\n\n // Dynamically import the generated schema (with cache busting)\n const schemaModule = await import(`${schemaFilePath}?t=${Date.now()}`);\n\n const cleanup = async () => {\n await rm(testDir, { recursive: true, force: true });\n };\n\n return { schemaModule, cleanup };\n };\n\n // Helper to create a new database instance and run migrations\n const createDatabase = async () => {\n // Write schema to file and load it\n const { schemaModule, cleanup } = await writeAndLoadSchema();\n\n // Create PGlite instance\n const pglite = new PGlite(databasePath);\n\n // Create Drizzle instance with PGlite\n const db = drizzle(pglite, {\n schema: schemaModule,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any;\n\n // Generate and run migrations\n const migrationStatements = await generateMigration(\n generateDrizzleJson({}), // Empty schema (starting state)\n generateDrizzleJson(schemaModule), // Target schema\n );\n\n // Execute migration SQL\n for (const statement of migrationStatements) {\n await db.execute(statement);\n }\n\n // Create DrizzleAdapter\n const adapter = new DrizzleAdapter({\n db: () => db,\n provider: \"postgresql\",\n });\n\n // Create ORM instance\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const orm = adapter.createQueryEngine(schema, namespace) as AbstractQuery<any>;\n\n return { drizzle: db, adapter, pglite, cleanup, orm };\n };\n\n // Create initial database\n let { drizzle: drizzleDb, adapter, pglite, cleanup: schemaCleanup, orm } = await createDatabase();\n\n // Reset database function - creates a fresh database and re-runs migrations\n const resetDatabase = async () => {\n // Close the old instances and cleanup\n await pglite.close();\n await schemaCleanup();\n\n // Create a new database instance\n const newDb = await createDatabase();\n drizzleDb = newDb.drizzle;\n adapter = newDb.adapter;\n pglite = newDb.pglite;\n schemaCleanup = newDb.cleanup;\n orm = newDb.orm;\n };\n\n // Cleanup function - closes connections and deletes generated files and database directory\n const cleanup = async () => {\n await pglite.close();\n await schemaCleanup();\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 return {\n testContext: {\n get db() {\n return orm;\n },\n get drizzle() {\n return drizzleDb;\n },\n get adapter() {\n return adapter;\n },\n resetDatabase,\n cleanup,\n },\n get adapter() {\n return adapter;\n },\n };\n}\n\n/**\n * Create adapter based on configuration\n */\nexport async function createAdapter<T extends SupportedAdapter>(\n adapterConfig: T,\n schema: AnySchema,\n namespace: string,\n migrateToVersion?: number,\n): Promise<AdapterFactoryResult<T>> {\n if (adapterConfig.type === \"kysely-sqlite\") {\n return createKyselySqliteAdapter(adapterConfig, schema, namespace, migrateToVersion) as Promise<\n AdapterFactoryResult<T>\n >;\n } else if (adapterConfig.type === \"kysely-pglite\") {\n return createKyselyPgliteAdapter(adapterConfig, schema, namespace, migrateToVersion) as Promise<\n AdapterFactoryResult<T>\n >;\n } else if (adapterConfig.type === \"drizzle-pglite\") {\n return createDrizzlePgliteAdapter(\n adapterConfig,\n schema,\n namespace,\n migrateToVersion,\n ) 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":["kysely","adapter","ormMap","kyselyPglite","cleanup","pglite"],"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 type { AbstractQuery } from \"@fragno-dev/db/query\";\nimport { createRequire } from \"node:module\";\nimport { mkdir, writeFile, rm } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport type { BaseTestContext } from \".\";\nimport { createCommonTestContextMethods } from \".\";\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) => AbstractQuery<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 db: kysely,\n provider: \"sqlite\",\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, AbstractQuery<any, any>>();\n\n for (const { schema, namespace, migrateToVersion } of schemas) {\n // Run migrations\n const migrator = adapter.createMigrationEngine(schema, namespace);\n const preparedMigration = migrateToVersion\n ? await migrator.prepareMigrationTo(migrateToVersion, {\n updateSettings: false,\n })\n : await migrator.prepareMigration({\n updateSettings: false,\n });\n await preparedMigration.execute();\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 db: kysely,\n provider: \"postgresql\",\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, AbstractQuery<any, any>>();\n\n for (const { schema, namespace, migrateToVersion } of schemas) {\n // Run migrations\n const migrator = adapter.createMigrationEngine(schema, namespace);\n const preparedMigration = migrateToVersion\n ? await migrator.prepareMigrationTo(migrateToVersion, {\n updateSettings: false,\n })\n : await migrator.prepareMigration({\n updateSettings: false,\n });\n await preparedMigration.execute();\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 // Import drizzle-kit for migrations\n const require = createRequire(import.meta.url);\n const { generateDrizzleJson, generateMigration } =\n require(\"drizzle-kit/api\") as typeof import(\"drizzle-kit/api\");\n\n // Import generateSchema from the properly exported module\n const { generateSchema } = await import(\"@fragno-dev/db/adapters/drizzle/generate\");\n\n // Helper to write schema to file and dynamically import it\n const writeAndLoadSchema = async () => {\n const testDir = join(import.meta.dirname, \"_generated\", \"drizzle-test\");\n await mkdir(testDir, { recursive: true }).catch(() => {\n // Ignore error if directory already exists\n });\n\n const schemaFilePath = join(\n testDir,\n `test-schema-${Date.now()}-${Math.random().toString(36).slice(2, 9)}.ts`,\n );\n\n // Combine all schemas into a single Drizzle schema with namespaced tables\n const schemaConfigs = schemas.map(({ schema, namespace }) => ({\n namespace: namespace ?? \"\",\n schema,\n }));\n\n const drizzleSchemaTs = generateSchema(schemaConfigs, \"postgresql\");\n await writeFile(schemaFilePath, drizzleSchemaTs, \"utf-8\");\n\n // Dynamically import the generated schema (with cache busting)\n const schemaModule = await import(`${schemaFilePath}?t=${Date.now()}`);\n\n const cleanup = async () => {\n await rm(testDir, { recursive: true, force: true });\n };\n\n return { schemaModule, cleanup };\n };\n\n // Helper to create a new database instance and run migrations for all schemas\n const createDatabase = async () => {\n // Write schema to file and load it\n const { schemaModule, cleanup } = await writeAndLoadSchema();\n\n // Create PGlite instance\n const pglite = new PGlite(databasePath);\n\n // Create Drizzle instance with PGlite\n const db = drizzle(pglite, {\n schema: schemaModule,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }) as any;\n\n // Generate and run migrations\n const migrationStatements = await generateMigration(\n generateDrizzleJson({}), // Empty schema (starting state)\n generateDrizzleJson(schemaModule), // Target schema\n );\n\n // Execute migration SQL\n for (const statement of migrationStatements) {\n await db.execute(statement);\n }\n\n // Create DrizzleAdapter\n const adapter = new DrizzleAdapter({\n db: () => db,\n provider: \"postgresql\",\n });\n\n // Create ORM instances for each schema and store in map\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const ormMap = new Map<string, AbstractQuery<any, any>>();\n\n for (const { schema, namespace } of schemas) {\n const orm = adapter.createQueryEngine(schema, namespace);\n ormMap.set(namespace, orm);\n }\n\n return { drizzle: db, adapter, pglite, cleanup, ormMap };\n };\n\n // Create initial database\n const {\n drizzle: drizzleDb,\n adapter,\n pglite,\n cleanup: schemaCleanup,\n ormMap,\n } = 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 generated files and database directory\n const cleanup = async () => {\n await pglite.close();\n await schemaCleanup();\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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"}
package/dist/index.d.ts CHANGED
@@ -1,40 +1,112 @@
1
- import { DrizzlePgliteAdapter, KyselyPgliteAdapter, KyselySqliteAdapter, SupportedAdapter, TestContext } from "./adapters.js";
2
- import { CreateFragmentForTestOptions, CreateFragmentForTestOptions as CreateFragmentForTestOptions$1, FragmentForTest, FragmentForTest as FragmentForTest$1, RouteHandlerInputOptions, createFragmentForTest } from "@fragno-dev/core/test";
1
+ import { AdapterContext, DrizzlePgliteAdapter, KyselyPgliteAdapter, KyselySqliteAdapter, SupportedAdapter } from "./adapters.js";
2
+ import { CreateFragmentForTestOptions, FragmentForTest, FragmentForTest as FragmentForTest$1, RouteHandlerInputOptions, createFragmentForTest } from "@fragno-dev/core/test";
3
+ import { DatabaseAdapter, IUnitOfWorkBase } from "@fragno-dev/db";
3
4
  import { AnySchema } from "@fragno-dev/db/schema";
4
5
  import { FragnoPublicConfig } from "@fragno-dev/core/api/fragment-instantiation";
5
6
  import { FragmentDefinition } from "@fragno-dev/core/api/fragment-builder";
6
7
  import { AnyRouteOrFactory, FlattenRouteFactories } from "@fragno-dev/core/api/route";
7
- import { FragnoRouteConfig } from "@fragno-dev/core";
8
- import { HTTPMethod } from "@fragno-dev/core/api";
9
- import { StandardSchemaV1 } from "@standard-schema/spec";
8
+ import { AbstractQuery } from "@fragno-dev/db/query";
10
9
 
11
10
  //#region src/index.d.ts
12
11
 
13
12
  /**
14
- * Options for creating a database fragment for testing
13
+ * Base test context with common functionality across all adapters
15
14
  */
16
- interface CreateDatabaseFragmentForTestOptions<TConfig, TDeps, TServices, TAdditionalContext extends Record<string, unknown>, TOptions extends FragnoPublicConfig, TAdapter extends SupportedAdapter> extends Omit<CreateFragmentForTestOptions$1<TConfig, TDeps, TServices, TAdditionalContext, TOptions>, "config"> {
17
- adapter: TAdapter;
15
+ interface BaseTestContext {
16
+ readonly adapter: DatabaseAdapter<any>;
17
+ createUnitOfWork: (name?: string) => IUnitOfWorkBase;
18
+ withUnitOfWork: <T>(fn: (uow: IUnitOfWorkBase) => Promise<T>) => Promise<T>;
19
+ callService: <T>(fn: () => T | Promise<T>) => Promise<T>;
20
+ resetDatabase: () => Promise<void>;
21
+ cleanup: () => Promise<void>;
22
+ }
23
+ /**
24
+ * Internal interface with getOrm for adapter implementations
25
+ */
26
+ interface InternalTestContextMethods {
27
+ getOrm: <TSchema$1 extends AnySchema>(namespace: string) => AbstractQuery<TSchema$1>;
28
+ createUnitOfWork: (name?: string) => IUnitOfWorkBase;
29
+ withUnitOfWork: <T>(fn: (uow: IUnitOfWorkBase) => Promise<T>) => Promise<T>;
30
+ callService: <T>(fn: () => T | Promise<T>) => Promise<T>;
31
+ }
32
+ /**
33
+ * Helper to create common test context methods from an ORM map
34
+ * This is used internally by adapter implementations to avoid code duplication
35
+ */
36
+ declare function createCommonTestContextMethods(ormMap: Map<string, AbstractQuery<any>>): InternalTestContextMethods;
37
+ /**
38
+ * Complete test context combining base and adapter-specific functionality
39
+ */
40
+ type TestContext<T extends SupportedAdapter> = BaseTestContext & AdapterContext<T>;
41
+ /**
42
+ * Helper type to extract the schema from a fragment definition's additional context
43
+ */
44
+ type ExtractSchemaFromAdditionalContext<TAdditionalContext> = TAdditionalContext extends {
45
+ databaseSchema?: infer TSchema extends AnySchema;
46
+ } ? TSchema : AnySchema;
47
+ /**
48
+ * Fragment configuration for multi-fragment setup
49
+ */
50
+ interface FragmentConfig<TDef extends {
51
+ definition: FragmentDefinition<any, any, any, any, any, any>;
52
+ $requiredOptions: any;
53
+ } = {
54
+ definition: FragmentDefinition<any, any, any, any, any, any>;
55
+ $requiredOptions: any;
56
+ }, TRoutes extends readonly AnyRouteOrFactory[] = readonly AnyRouteOrFactory[]> {
57
+ definition: TDef;
58
+ routes: TRoutes;
59
+ config?: TDef["definition"] extends FragmentDefinition<infer TConfig, any, any, any, any, any> ? TConfig : never;
18
60
  migrateToVersion?: number;
19
- config?: TConfig;
20
61
  }
21
62
  /**
22
- * Result of creating a database fragment for testing
23
- * All properties are getters that return the current fragment instance
63
+ * Options for creating multiple database fragments for testing
24
64
  */
25
- interface DatabaseFragmentTestResult<TConfig, TDeps, TServices, TAdditionalContext extends Record<string, unknown>, TOptions extends FragnoPublicConfig, TAdapter extends SupportedAdapter, TRoutes extends readonly FragnoRouteConfig<HTTPMethod, string, StandardSchemaV1 | undefined, StandardSchemaV1 | undefined, string, string>[]> {
26
- readonly fragment: FragmentForTest$1<TConfig, TDeps, TServices, TAdditionalContext, TOptions, TRoutes>;
27
- readonly services: TServices;
28
- readonly callRoute: FragmentForTest$1<TConfig, TDeps, TServices, TAdditionalContext, TOptions, TRoutes>["callRoute"];
29
- readonly config: TConfig;
30
- readonly deps: TDeps;
31
- readonly additionalContext: TAdditionalContext;
65
+ interface MultiFragmentTestOptions<TAdapter extends SupportedAdapter> {
66
+ adapter: TAdapter;
67
+ }
68
+ /**
69
+ * Result type for a single fragment in a multi-fragment setup
70
+ */
71
+ type FragmentResultFromConfig<TConfig$1 extends FragmentConfig> = TConfig$1["definition"] extends {
72
+ definition: FragmentDefinition<infer TConf, infer TDeps, infer TServices, infer TAdditionalCtx, any, infer TProvidedServices>;
73
+ $requiredOptions: infer TOptions extends FragnoPublicConfig;
74
+ } ? {
75
+ fragment: FragmentForTest$1<TConf, TDeps, TServices & TProvidedServices, TAdditionalCtx, TOptions, FlattenRouteFactories<TConfig$1["routes"]>>;
76
+ services: TServices & TProvidedServices;
77
+ callRoute: FragmentForTest$1<TConf, TDeps, TServices & TProvidedServices, TAdditionalCtx, TOptions, FlattenRouteFactories<TConfig$1["routes"]>>["callRoute"];
78
+ config: TConf;
79
+ deps: TDeps;
80
+ additionalContext: TAdditionalCtx;
81
+ db: AbstractQuery<ExtractSchemaFromAdditionalContext<TAdditionalCtx>>;
82
+ } : never;
83
+ interface SingleFragmentTestResult<TFragment extends FragmentConfig, TAdapter extends SupportedAdapter> {
84
+ fragment: FragmentResultFromConfig<TFragment>;
85
+ test: TestContext<TAdapter>;
86
+ }
87
+ /**
88
+ * Result of creating multiple database fragments for testing (array input)
89
+ */
90
+ interface MultiFragmentTestResult<TFragments extends readonly FragmentConfig[], TAdapter extends SupportedAdapter> {
91
+ fragments: { [K in keyof TFragments]: FragmentResultFromConfig<TFragments[K]> };
92
+ test: TestContext<TAdapter>;
93
+ }
94
+ /**
95
+ * Result of creating multiple database fragments for testing (object input)
96
+ */
97
+ interface NamedMultiFragmentTestResult<TFragments extends Record<string, FragmentConfig>, TAdapter extends SupportedAdapter> {
98
+ fragments: { [K in keyof TFragments]: FragmentResultFromConfig<TFragments[K]> };
32
99
  test: TestContext<TAdapter>;
33
100
  }
34
- declare function createDatabaseFragmentForTest<const TConfig, const TDeps, const TServices extends Record<string, unknown>, const TAdditionalContext extends Record<string, unknown>, const TOptions extends FragnoPublicConfig, const TSchema extends AnySchema, const TAdapter extends SupportedAdapter, const TRoutesOrFactories extends readonly AnyRouteOrFactory[]>(fragmentBuilder: {
35
- definition: FragmentDefinition<TConfig, TDeps, TServices, TAdditionalContext>;
36
- $requiredOptions: TOptions;
37
- }, routesOrFactories: TRoutesOrFactories, options: CreateDatabaseFragmentForTestOptions<TConfig, TDeps, TServices, TAdditionalContext, TOptions, TAdapter>): Promise<DatabaseFragmentTestResult<TConfig, TDeps, TServices, TAdditionalContext, TOptions, TAdapter, FlattenRouteFactories<TRoutesOrFactories>>>;
101
+ /**
102
+ * Create multiple database fragments for testing with a shared adapter (array input)
103
+ */
104
+ declare function createDatabaseFragmentsForTest<const TFragments extends readonly FragmentConfig[], const TAdapter extends SupportedAdapter>(fragments: TFragments, options: MultiFragmentTestOptions<TAdapter>): Promise<MultiFragmentTestResult<TFragments, TAdapter>>;
105
+ /**
106
+ * Create multiple database fragments for testing with a shared adapter (object input)
107
+ */
108
+ declare function createDatabaseFragmentsForTest<const TFragments extends Record<string, FragmentConfig>, const TAdapter extends SupportedAdapter>(fragments: TFragments, options: MultiFragmentTestOptions<TAdapter>): Promise<NamedMultiFragmentTestResult<TFragments, TAdapter>>;
109
+ declare function createDatabaseFragmentForTest<const TFragment extends FragmentConfig, const TAdapter extends SupportedAdapter>(fragment: TFragment, options: MultiFragmentTestOptions<TAdapter>): Promise<SingleFragmentTestResult<TFragment, TAdapter>>;
38
110
  //#endregion
39
- export { CreateDatabaseFragmentForTestOptions, type CreateFragmentForTestOptions, DatabaseFragmentTestResult, type DrizzlePgliteAdapter, type FragmentForTest, type KyselyPgliteAdapter, type KyselySqliteAdapter, type RouteHandlerInputOptions, type SupportedAdapter, type TestContext, createDatabaseFragmentForTest, createFragmentForTest };
111
+ export { type AdapterContext, BaseTestContext, type CreateFragmentForTestOptions, type DrizzlePgliteAdapter, FragmentConfig, type FragmentForTest, InternalTestContextMethods, type KyselyPgliteAdapter, type KyselySqliteAdapter, MultiFragmentTestOptions, MultiFragmentTestResult, NamedMultiFragmentTestResult, type RouteHandlerInputOptions, SingleFragmentTestResult, type SupportedAdapter, TestContext, createCommonTestContextMethods, createDatabaseFragmentForTest, createDatabaseFragmentsForTest, createFragmentForTest };
40
112
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;AAyCA;;;AAMmB,UANF,oCAME,CAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,2BAFU,MAEV,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,iBADA,kBACA,EAAA,iBAAA,gBAAA,CAAA,SACT,IADS,CAEf,8BAFe,CAEc,OAFd,EAEuB,KAFvB,EAE8B,SAF9B,EAEyC,kBAFzC,EAE6D,QAF7D,CAAA,EAAA,QAAA,CAAA,CAAA;EAEc,OAAA,EAGtB,QAHsB;EAAS,gBAAA,CAAA,EAAA,MAAA;EAAO,MAAA,CAAA,EAKtC,OALsC;;;;;;AADvC,UAaO,0BAbP,CAAA,OAAA,EAAA,KAAA,EAAA,SAAA,EAAA,2BAiBmB,MAjBnB,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,iBAkBS,kBAlBT,EAAA,iBAmBS,gBAnBT,EAAA,gBAAA,SAoBiB,iBApBjB,CAqBN,UArBM,EAAA,MAAA,EAuBN,gBAvBM,GAAA,SAAA,EAwBN,gBAxBM,GAAA,SAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,CAAA,CAAA;EAAI,SAAA,QAAA,EA6BO,iBA7BP,CA8BV,OA9BU,EA+BV,KA/BU,EAgCV,SAhCU,EAiCV,kBAjCU,EAkCV,QAlCU,EAmCV,OAnCU,CAAA;EAaG,SAAA,QAAA,EAwBI,SAxBJ;EAIY,SAAA,SAAA,EAqBP,iBArBO,CAsBzB,OAtByB,EAuBzB,KAvByB,EAwBzB,SAxByB,EAyBzB,kBAzByB,EA0BzB,QA1ByB,EA2BzB,OA3ByB,CAAA,CAAA,WAAA,CAAA;EACV,SAAA,MAAA,EA4BA,OA5BA;EACA,SAAA,IAAA,EA4BF,KA5BE;EAEf,SAAA,iBAAA,EA2B0B,kBA3B1B;EAEA,IAAA,EA0BI,WA1BJ,CA0BgB,QA1BhB,CAAA;;AAHuB,iBAgCL,6BAhCK,CAAA,aAAA,EAAA,WAAA,EAAA,wBAmCD,MAnCC,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,iCAoCQ,MApCR,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,uBAqCF,kBArCE,EAAA,sBAsCH,SAtCG,EAAA,uBAuCF,gBAvCE,EAAA,iCAAA,SAwCiB,iBAxCjB,EAAA,CAAA,CAAA,eAAA,EAAA;EAUvB,UAAA,EAiCY,kBAjCZ,CAiC+B,OAjC/B,EAiCwC,KAjCxC,EAiC+C,SAjC/C,EAiC0D,kBAjC1D,CAAA;EACA,gBAAA,EAiCkB,QAjClB;CACA,EAAA,iBAAA,EAkCiB,kBAlCjB,EAAA,OAAA,EAmCO,oCAnCP,CAoCA,OApCA,EAqCA,KArCA,EAsCA,SAtCA,EAuCA,kBAvCA,EAwCA,QAxCA,EAyCA,QAzCA,CAAA,CAAA,EA2CD,OA3CC,CA4CF,0BA5CE,CA6CA,OA7CA,EA8CA,KA9CA,EA+CA,SA/CA,EAgDA,kBAhDA,EAiDA,QAjDA,EAkDA,QAlDA,EAmDA,qBAnDA,CAmDsB,kBAnDtB,CAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":"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"}