@geekmidas/testkit 0.1.0 → 0.2.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 (65) hide show
  1. package/README.md +162 -13
  2. package/dist/{Factory-BZ8uMoXl.d.cts → Factory-D7oHtI2D.d.cts} +2 -2
  3. package/dist/Factory.d.cts +2 -2
  4. package/dist/{KyselyFactory-BFygzOlO.d.cts → KyselyFactory-dYdviox2.d.cts} +3 -3
  5. package/dist/KyselyFactory.d.cts +3 -3
  6. package/dist/{ObjectionFactory-CeSIN3kZ.d.cts → ObjectionFactory-0gUdx8bB.d.cts} +3 -3
  7. package/dist/ObjectionFactory.d.cts +3 -3
  8. package/dist/{VitestKyselyTransactionIsolator-XDL3ngs_.mjs → VitestKyselyTransactionIsolator-CNURW8y6.mjs} +2 -2
  9. package/dist/{VitestKyselyTransactionIsolator-XDL3ngs_.mjs.map → VitestKyselyTransactionIsolator-CNURW8y6.mjs.map} +1 -1
  10. package/dist/{VitestKyselyTransactionIsolator-DnyZMaA-.d.mts → VitestKyselyTransactionIsolator-D3EZZhjZ.d.cts} +2 -2
  11. package/dist/{VitestKyselyTransactionIsolator-4HOeLQ0d.d.cts → VitestKyselyTransactionIsolator-Dxlp1u0f.d.mts} +2 -2
  12. package/dist/{VitestKyselyTransactionIsolator-DX_VPKS-.cjs → VitestKyselyTransactionIsolator-EvDLk5zg.cjs} +2 -2
  13. package/dist/{VitestKyselyTransactionIsolator-DX_VPKS-.cjs.map → VitestKyselyTransactionIsolator-EvDLk5zg.cjs.map} +1 -1
  14. package/dist/VitestKyselyTransactionIsolator.cjs +2 -2
  15. package/dist/VitestKyselyTransactionIsolator.d.cts +2 -2
  16. package/dist/VitestKyselyTransactionIsolator.d.mts +2 -2
  17. package/dist/VitestKyselyTransactionIsolator.mjs +2 -2
  18. package/dist/{VitestObjectionTransactionIsolator-COVDlpEo.d.cts → VitestObjectionTransactionIsolator-1TpsPqfG.d.cts} +2 -2
  19. package/dist/{VitestObjectionTransactionIsolator-D_tlOtq8.cjs → VitestObjectionTransactionIsolator-CM5KTAFA.cjs} +2 -2
  20. package/dist/{VitestObjectionTransactionIsolator-D_tlOtq8.cjs.map → VitestObjectionTransactionIsolator-CM5KTAFA.cjs.map} +1 -1
  21. package/dist/{VitestObjectionTransactionIsolator-lZUSz1w0.d.mts → VitestObjectionTransactionIsolator-i9jIgU8Q.d.mts} +2 -2
  22. package/dist/{VitestObjectionTransactionIsolator-_EhJKu_O.mjs → VitestObjectionTransactionIsolator-jQFaCz0u.mjs} +2 -2
  23. package/dist/{VitestObjectionTransactionIsolator-_EhJKu_O.mjs.map → VitestObjectionTransactionIsolator-jQFaCz0u.mjs.map} +1 -1
  24. package/dist/VitestObjectionTransactionIsolator.cjs +2 -2
  25. package/dist/VitestObjectionTransactionIsolator.d.cts +2 -2
  26. package/dist/VitestObjectionTransactionIsolator.d.mts +2 -2
  27. package/dist/VitestObjectionTransactionIsolator.mjs +2 -2
  28. package/dist/{VitestTransactionIsolator-DWDbnITQ.d.mts → VitestTransactionIsolator-BvR19bYn.d.mts} +44 -18
  29. package/dist/{VitestTransactionIsolator-BKIrj3Uy.cjs → VitestTransactionIsolator-CMfJXZP8.cjs} +52 -36
  30. package/dist/VitestTransactionIsolator-CMfJXZP8.cjs.map +1 -0
  31. package/dist/{VitestTransactionIsolator-CyG_i_Nj.d.cts → VitestTransactionIsolator-CwQaxZLP.d.cts} +44 -18
  32. package/dist/{VitestTransactionIsolator-BIaMs4c2.mjs → VitestTransactionIsolator-DQ7tLqgV.mjs} +52 -36
  33. package/dist/VitestTransactionIsolator-DQ7tLqgV.mjs.map +1 -0
  34. package/dist/VitestTransactionIsolator.cjs +1 -1
  35. package/dist/VitestTransactionIsolator.d.cts +2 -2
  36. package/dist/VitestTransactionIsolator.d.mts +2 -2
  37. package/dist/VitestTransactionIsolator.mjs +1 -1
  38. package/dist/better-auth.d.cts +2 -2
  39. package/dist/{directory-DlkPEzL4.d.cts → directory-BUcnztHI.d.cts} +3 -3
  40. package/dist/{faker-Cg76aFNO.d.cts → faker-Dg3trU4a.d.cts} +3 -3
  41. package/dist/faker.d.cts +1 -1
  42. package/dist/kysely.cjs +23 -29
  43. package/dist/kysely.cjs.map +1 -1
  44. package/dist/kysely.d.cts +40 -38
  45. package/dist/kysely.d.mts +37 -35
  46. package/dist/kysely.mjs +23 -29
  47. package/dist/kysely.mjs.map +1 -1
  48. package/dist/objection.cjs +23 -47
  49. package/dist/objection.cjs.map +1 -1
  50. package/dist/objection.d.cts +40 -56
  51. package/dist/objection.d.mts +37 -53
  52. package/dist/objection.mjs +23 -47
  53. package/dist/objection.mjs.map +1 -1
  54. package/dist/os/directory.d.cts +1 -1
  55. package/dist/os/index.d.cts +1 -1
  56. package/package.json +1 -1
  57. package/src/VitestTransactionIsolator.ts +98 -31
  58. package/src/__tests__/KyselyFactory.spec.ts +4 -5
  59. package/src/__tests__/ObjectionFactory.spec.ts +4 -5
  60. package/src/__tests__/VitestObjectionTransactionIsolator.spec.ts +6 -3
  61. package/src/__tests__/integration.spec.ts +8 -10
  62. package/src/kysely.ts +49 -34
  63. package/src/objection.ts +47 -52
  64. package/dist/VitestTransactionIsolator-BIaMs4c2.mjs.map +0 -1
  65. package/dist/VitestTransactionIsolator-BKIrj3Uy.cjs.map +0 -1
package/README.md CHANGED
@@ -33,8 +33,21 @@ yarn add -D @geekmidas/testkit
33
33
  ## Subpath Exports
34
34
 
35
35
  ```typescript
36
- import { KyselyFactory } from '@geekmidas/testkit/kysely';
37
- import { ObjectionFactory } from '@geekmidas/testkit/objection';
36
+ // Kysely utilities
37
+ import {
38
+ KyselyFactory,
39
+ wrapVitestKyselyTransaction,
40
+ extendWithFixtures,
41
+ } from '@geekmidas/testkit/kysely';
42
+
43
+ // Objection.js utilities
44
+ import {
45
+ ObjectionFactory,
46
+ wrapVitestObjectionTransaction,
47
+ extendWithFixtures,
48
+ } from '@geekmidas/testkit/objection';
49
+
50
+ // Other utilities
38
51
  import { faker } from '@geekmidas/testkit/faker';
39
52
  import { waitFor } from '@geekmidas/testkit/timer';
40
53
  import { itWithDir } from '@geekmidas/testkit/os';
@@ -71,7 +84,7 @@ interface Database {
71
84
  const builders = {
72
85
  user: KyselyFactory.createBuilder<Database, 'users'>(
73
86
  'users',
74
- (attrs, factory, db, faker) => ({
87
+ ({ attrs, faker }) => ({
75
88
  id: faker.string.uuid(),
76
89
  name: faker.person.fullName(),
77
90
  email: faker.internet.email(),
@@ -81,7 +94,7 @@ const builders = {
81
94
  ),
82
95
  post: KyselyFactory.createBuilder<Database, 'posts'>(
83
96
  'posts',
84
- (attrs, factory, db, faker) => ({
97
+ ({ attrs, faker }) => ({
85
98
  id: faker.string.uuid(),
86
99
  title: 'Test Post',
87
100
  content: faker.lorem.paragraph(),
@@ -127,7 +140,7 @@ class User extends Model {
127
140
  const builders = {
128
141
  user: ObjectionFactory.createBuilder(
129
142
  User,
130
- (attrs, factory, db, faker) => ({
143
+ ({ attrs, faker }) => ({
131
144
  id: faker.string.uuid(),
132
145
  name: faker.person.fullName(),
133
146
  email: faker.internet.email(),
@@ -337,9 +350,145 @@ afterAll(async () => {
337
350
  });
338
351
  ```
339
352
 
340
- ## Transaction Isolation
353
+ ## Vitest Transaction Isolation
354
+
355
+ TestKit provides Vitest-specific helpers for automatic transaction isolation. Each test runs in a transaction that is automatically rolled back after the test completes.
356
+
357
+ ### Basic Usage
358
+
359
+ ```typescript
360
+ import { test } from 'vitest';
361
+ import { wrapVitestKyselyTransaction } from '@geekmidas/testkit/kysely';
362
+ import { db } from './database';
363
+
364
+ // Wrap Vitest's test function with transaction support
365
+ const it = wrapVitestKyselyTransaction<Database>(
366
+ test,
367
+ () => db,
368
+ async (trx) => {
369
+ // Optional: Set up test tables or seed data
370
+ await trx.schema.createTable('users').execute();
371
+ }
372
+ );
373
+
374
+ // Each test gets its own transaction
375
+ it('should create user', async ({ trx }) => {
376
+ const user = await trx
377
+ .insertInto('users')
378
+ .values({ name: 'John' })
379
+ .returningAll()
380
+ .executeTakeFirst();
381
+
382
+ expect(user.name).toBe('John');
383
+ // Transaction is automatically rolled back after test
384
+ });
385
+ ```
386
+
387
+ ### Extending with Fixtures
388
+
389
+ Use `extendWithFixtures` to add factory and other fixtures to your tests:
390
+
391
+ ```typescript
392
+ import { test } from 'vitest';
393
+ import {
394
+ wrapVitestKyselyTransaction,
395
+ extendWithFixtures,
396
+ KyselyFactory,
397
+ } from '@geekmidas/testkit/kysely';
398
+
399
+ // Define builders
400
+ const builders = {
401
+ user: KyselyFactory.createBuilder<Database, 'users'>('users', ({ faker }) => ({
402
+ name: faker.person.fullName(),
403
+ email: faker.internet.email(),
404
+ })),
405
+ post: KyselyFactory.createBuilder<Database, 'posts'>('posts', ({ faker }) => ({
406
+ title: faker.lorem.sentence(),
407
+ content: faker.lorem.paragraphs(),
408
+ })),
409
+ };
410
+
411
+ // Create base test with transaction
412
+ const baseTest = wrapVitestKyselyTransaction<Database>(test, () => db);
413
+
414
+ // Extend with factory fixture
415
+ const it = extendWithFixtures<
416
+ Database,
417
+ { factory: KyselyFactory<Database, typeof builders, {}> }
418
+ >(baseTest, {
419
+ factory: (trx) => new KyselyFactory(builders, {}, trx),
420
+ });
421
+
422
+ // Both trx and factory are available in tests
423
+ it('should create user with factory', async ({ trx, factory }) => {
424
+ const user = await factory.insert('user', { name: 'Jane' });
425
+
426
+ expect(user.id).toBeDefined();
427
+ expect(user.name).toBe('Jane');
428
+
429
+ // Verify in database
430
+ const found = await trx
431
+ .selectFrom('users')
432
+ .where('id', '=', user.id)
433
+ .selectAll()
434
+ .executeTakeFirst();
435
+
436
+ expect(found?.name).toBe('Jane');
437
+ });
438
+
439
+ it('should create related records', async ({ factory }) => {
440
+ const user = await factory.insert('user');
441
+ const posts = await factory.insertMany(3, 'post', { userId: user.id });
442
+
443
+ expect(posts).toHaveLength(3);
444
+ expect(posts[0].userId).toBe(user.id);
445
+ });
446
+ ```
447
+
448
+ ### Multiple Fixtures
449
+
450
+ You can add multiple fixtures that all receive the transaction:
451
+
452
+ ```typescript
453
+ const it = extendWithFixtures<
454
+ Database,
455
+ {
456
+ factory: KyselyFactory<Database, typeof builders, {}>;
457
+ userRepo: UserRepository;
458
+ config: { maxUsers: number };
459
+ }
460
+ >(baseTest, {
461
+ factory: (trx) => new KyselyFactory(builders, {}, trx),
462
+ userRepo: (trx) => new UserRepository(trx),
463
+ config: () => ({ maxUsers: 100 }), // Fixtures can ignore trx if not needed
464
+ });
465
+
466
+ it('should use multiple fixtures', async ({ factory, userRepo, config }) => {
467
+ const user = await factory.insert('user');
468
+ const found = await userRepo.findById(user.id);
469
+ expect(found).toBeDefined();
470
+ expect(config.maxUsers).toBe(100);
471
+ });
472
+ ```
473
+
474
+ ### With Objection.js
475
+
476
+ ```typescript
477
+ import { wrapVitestObjectionTransaction, extendWithFixtures } from '@geekmidas/testkit/objection';
478
+
479
+ const baseTest = wrapVitestObjectionTransaction(test, () => knex);
480
+
481
+ const it = extendWithFixtures<{ factory: ObjectionFactory<typeof builders, {}> }>(
482
+ baseTest,
483
+ {
484
+ factory: (trx) => new ObjectionFactory(builders, {}, trx),
485
+ }
486
+ );
487
+ ```
488
+
489
+ ## Manual Transaction Isolation
341
490
 
342
- TestKit supports transaction-based test isolation:
491
+ For more control, you can manage transactions manually:
343
492
 
344
493
  ```typescript
345
494
  describe('User Service', () => {
@@ -402,12 +551,12 @@ class KyselyFactory<DB, Builders, Seeds> {
402
551
 
403
552
  static createBuilder<DB, TableName extends keyof DB & string>(
404
553
  table: TableName,
405
- item?: (
406
- attrs: Partial<Insertable<DB[TableName]>>,
407
- factory: KyselyFactory,
408
- db: Kysely<DB>,
409
- faker: FakerFactory
410
- ) => Partial<Insertable<DB[TableName]>> | Promise<...>,
554
+ defaults?: (context: {
555
+ attrs: Partial<Insertable<DB[TableName]>>;
556
+ factory: KyselyFactory;
557
+ db: Kysely<DB>;
558
+ faker: FakerFactory;
559
+ }) => Partial<Insertable<DB[TableName]>> | Promise<...>,
411
560
  autoInsert?: boolean
412
561
  ): BuilderFunction;
413
562
 
@@ -1,4 +1,4 @@
1
- import { FakerFactory } from "./faker-Cg76aFNO.cjs";
1
+ import { FakerFactory } from "./faker-Dg3trU4a.cjs";
2
2
 
3
3
  //#region src/Factory.d.ts
4
4
 
@@ -129,4 +129,4 @@ type MixedFactoryBuilder<Attrs = any, Factory = any, Result = any, DB = any> = (
129
129
  type FactorySeed<Attrs = any, Factory = any, Result = any, DB = any> = (attrs: Attrs, factory: Factory, db: DB) => Promise<Result>;
130
130
  //#endregion
131
131
  export { Factory, FactorySeed, MixedFactoryBuilder };
132
- //# sourceMappingURL=Factory-BZ8uMoXl.d.cts.map
132
+ //# sourceMappingURL=Factory-D7oHtI2D.d.cts.map
@@ -1,3 +1,3 @@
1
- import "./faker-Cg76aFNO.cjs";
2
- import { Factory, FactorySeed, MixedFactoryBuilder } from "./Factory-BZ8uMoXl.cjs";
1
+ import "./faker-Dg3trU4a.cjs";
2
+ import { Factory, FactorySeed, MixedFactoryBuilder } from "./Factory-D7oHtI2D.cjs";
3
3
  export { Factory, FactorySeed, MixedFactoryBuilder };
@@ -1,5 +1,5 @@
1
- import { FakerFactory } from "./faker-Cg76aFNO.cjs";
2
- import { Factory, FactorySeed } from "./Factory-BZ8uMoXl.cjs";
1
+ import { FakerFactory } from "./faker-Dg3trU4a.cjs";
2
+ import { Factory, FactorySeed } from "./Factory-D7oHtI2D.cjs";
3
3
  import { ControlledTransaction, Insertable, Kysely, Selectable } from "kysely";
4
4
 
5
5
  //#region src/KyselyFactory.d.ts
@@ -211,4 +211,4 @@ declare class KyselyFactory<DB, Builders extends Record<string, any>, Seeds exte
211
211
  }
212
212
  //#endregion
213
213
  export { KyselyFactory };
214
- //# sourceMappingURL=KyselyFactory-BFygzOlO.d.cts.map
214
+ //# sourceMappingURL=KyselyFactory-dYdviox2.d.cts.map
@@ -1,4 +1,4 @@
1
- import "./faker-Cg76aFNO.cjs";
2
- import "./Factory-BZ8uMoXl.cjs";
3
- import { KyselyFactory } from "./KyselyFactory-BFygzOlO.cjs";
1
+ import "./faker-Dg3trU4a.cjs";
2
+ import "./Factory-D7oHtI2D.cjs";
3
+ import { KyselyFactory } from "./KyselyFactory-dYdviox2.cjs";
4
4
  export { KyselyFactory };
@@ -1,5 +1,5 @@
1
- import { FakerFactory } from "./faker-Cg76aFNO.cjs";
2
- import { Factory, FactorySeed } from "./Factory-BZ8uMoXl.cjs";
1
+ import { FakerFactory } from "./faker-Dg3trU4a.cjs";
2
+ import { Factory, FactorySeed } from "./Factory-D7oHtI2D.cjs";
3
3
  import { Knex } from "knex";
4
4
  import { Model } from "objection";
5
5
 
@@ -224,4 +224,4 @@ declare class ObjectionFactory<Builders extends Record<string, any>, Seeds exten
224
224
  }
225
225
  //#endregion
226
226
  export { ObjectionFactory };
227
- //# sourceMappingURL=ObjectionFactory-CeSIN3kZ.d.cts.map
227
+ //# sourceMappingURL=ObjectionFactory-0gUdx8bB.d.cts.map
@@ -1,4 +1,4 @@
1
- import "./faker-Cg76aFNO.cjs";
2
- import "./Factory-BZ8uMoXl.cjs";
3
- import { ObjectionFactory } from "./ObjectionFactory-CeSIN3kZ.cjs";
1
+ import "./faker-Dg3trU4a.cjs";
2
+ import "./Factory-D7oHtI2D.cjs";
3
+ import { ObjectionFactory } from "./ObjectionFactory-0gUdx8bB.cjs";
4
4
  export { ObjectionFactory };
@@ -1,4 +1,4 @@
1
- import { VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-BIaMs4c2.mjs";
1
+ import { VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-DQ7tLqgV.mjs";
2
2
 
3
3
  //#region src/VitestKyselyTransactionIsolator.ts
4
4
  /**
@@ -57,4 +57,4 @@ var VitestKyselyTransactionIsolator = class extends VitestPostgresTransactionIso
57
57
 
58
58
  //#endregion
59
59
  export { VitestKyselyTransactionIsolator };
60
- //# sourceMappingURL=VitestKyselyTransactionIsolator-XDL3ngs_.mjs.map
60
+ //# sourceMappingURL=VitestKyselyTransactionIsolator-CNURW8y6.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"VitestKyselyTransactionIsolator-XDL3ngs_.mjs","names":["conn: Kysely<Database>","level: IsolationLevel","fn: (trx: Transaction<Database>) => Promise<void>"],"sources":["../src/VitestKyselyTransactionIsolator.ts"],"sourcesContent":["import type { Kysely, Transaction } from 'kysely';\nimport {\n type IsolationLevel,\n VitestPostgresTransactionIsolator,\n} from './VitestTransactionIsolator';\n\n/**\n * Kysely-specific implementation of the Vitest transaction isolator.\n * Provides automatic transaction rollback for test isolation using Kysely's transaction API.\n * Each test runs within a database transaction that is rolled back after completion,\n * ensuring a clean state between tests without the overhead of recreating data.\n *\n * @template Database - The database schema type\n *\n * @example\n * ```typescript\n * import { VitestKyselyTransactionIsolator } from '@geekmidas/testkit';\n * import { db } from './database';\n *\n * // Create isolator instance\n * const isolator = new VitestKyselyTransactionIsolator<Database>();\n *\n * // In your test setup\n * beforeEach(async () => {\n * await isolator.start(db);\n * });\n *\n * afterEach(async () => {\n * await isolator.rollback();\n * });\n *\n * // Tests run in isolated transactions\n * it('should create user', async () => {\n * const user = await db.insertInto('users')\n * .values({ name: 'Test User' })\n * .returningAll()\n * .executeTakeFirst();\n *\n * expect(user).toBeDefined();\n * // This data will be rolled back after the test\n * });\n * ```\n */\nexport class VitestKyselyTransactionIsolator<\n Database,\n> extends VitestPostgresTransactionIsolator<\n Kysely<Database>,\n Transaction<Database>\n> {\n async destroy(conn: Kysely<Database>): Promise<void> {\n // return conn.destroy();\n }\n /**\n * Creates a Kysely transaction with the specified isolation level.\n * Implements the abstract transact method from VitestPostgresTransactionIsolator.\n *\n * @param conn - The Kysely database connection\n * @param level - The transaction isolation level\n * @param fn - The function to execute within the transaction\n * @returns Promise that resolves when the transaction completes\n */\n async transact(\n conn: Kysely<Database>,\n level: IsolationLevel,\n fn: (trx: Transaction<Database>) => Promise<void>,\n ): Promise<void> {\n const isolationLevel =\n level.toLocaleLowerCase() as Lowercase<IsolationLevel>;\n await conn.transaction().setIsolationLevel(isolationLevel).execute(fn);\n }\n // Implement any Kysely-specific transaction logic here\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,IAAa,kCAAb,cAEU,kCAGR;CACA,MAAM,QAAQA,MAAuC,CAEpD;;;;;;;;;;CAUD,MAAM,SACJA,MACAC,OACAC,IACe;EACf,MAAM,iBACJ,MAAM,mBAAmB;AAC3B,QAAM,KAAK,aAAa,CAAC,kBAAkB,eAAe,CAAC,QAAQ,GAAG;CACvE;AAEF"}
1
+ {"version":3,"file":"VitestKyselyTransactionIsolator-CNURW8y6.mjs","names":["conn: Kysely<Database>","level: IsolationLevel","fn: (trx: Transaction<Database>) => Promise<void>"],"sources":["../src/VitestKyselyTransactionIsolator.ts"],"sourcesContent":["import type { Kysely, Transaction } from 'kysely';\nimport {\n type IsolationLevel,\n VitestPostgresTransactionIsolator,\n} from './VitestTransactionIsolator';\n\n/**\n * Kysely-specific implementation of the Vitest transaction isolator.\n * Provides automatic transaction rollback for test isolation using Kysely's transaction API.\n * Each test runs within a database transaction that is rolled back after completion,\n * ensuring a clean state between tests without the overhead of recreating data.\n *\n * @template Database - The database schema type\n *\n * @example\n * ```typescript\n * import { VitestKyselyTransactionIsolator } from '@geekmidas/testkit';\n * import { db } from './database';\n *\n * // Create isolator instance\n * const isolator = new VitestKyselyTransactionIsolator<Database>();\n *\n * // In your test setup\n * beforeEach(async () => {\n * await isolator.start(db);\n * });\n *\n * afterEach(async () => {\n * await isolator.rollback();\n * });\n *\n * // Tests run in isolated transactions\n * it('should create user', async () => {\n * const user = await db.insertInto('users')\n * .values({ name: 'Test User' })\n * .returningAll()\n * .executeTakeFirst();\n *\n * expect(user).toBeDefined();\n * // This data will be rolled back after the test\n * });\n * ```\n */\nexport class VitestKyselyTransactionIsolator<\n Database,\n> extends VitestPostgresTransactionIsolator<\n Kysely<Database>,\n Transaction<Database>\n> {\n async destroy(conn: Kysely<Database>): Promise<void> {\n // return conn.destroy();\n }\n /**\n * Creates a Kysely transaction with the specified isolation level.\n * Implements the abstract transact method from VitestPostgresTransactionIsolator.\n *\n * @param conn - The Kysely database connection\n * @param level - The transaction isolation level\n * @param fn - The function to execute within the transaction\n * @returns Promise that resolves when the transaction completes\n */\n async transact(\n conn: Kysely<Database>,\n level: IsolationLevel,\n fn: (trx: Transaction<Database>) => Promise<void>,\n ): Promise<void> {\n const isolationLevel =\n level.toLocaleLowerCase() as Lowercase<IsolationLevel>;\n await conn.transaction().setIsolationLevel(isolationLevel).execute(fn);\n }\n // Implement any Kysely-specific transaction logic here\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,IAAa,kCAAb,cAEU,kCAGR;CACA,MAAM,QAAQA,MAAuC,CAEpD;;;;;;;;;;CAUD,MAAM,SACJA,MACAC,OACAC,IACe;EACf,MAAM,iBACJ,MAAM,mBAAmB;AAC3B,QAAM,KAAK,aAAa,CAAC,kBAAkB,eAAe,CAAC,QAAQ,GAAG;CACvE;AAEF"}
@@ -1,4 +1,4 @@
1
- import { IsolationLevel, VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-DWDbnITQ.mjs";
1
+ import { IsolationLevel, VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-CwQaxZLP.cjs";
2
2
  import { Kysely, Transaction } from "kysely";
3
3
 
4
4
  //#region src/VitestKyselyTransactionIsolator.d.ts
@@ -55,4 +55,4 @@ declare class VitestKyselyTransactionIsolator<Database> extends VitestPostgresTr
55
55
  }
56
56
  //#endregion
57
57
  export { VitestKyselyTransactionIsolator };
58
- //# sourceMappingURL=VitestKyselyTransactionIsolator-DnyZMaA-.d.mts.map
58
+ //# sourceMappingURL=VitestKyselyTransactionIsolator-D3EZZhjZ.d.cts.map
@@ -1,4 +1,4 @@
1
- import { IsolationLevel, VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-CyG_i_Nj.cjs";
1
+ import { IsolationLevel, VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-BvR19bYn.mjs";
2
2
  import { Kysely, Transaction } from "kysely";
3
3
 
4
4
  //#region src/VitestKyselyTransactionIsolator.d.ts
@@ -55,4 +55,4 @@ declare class VitestKyselyTransactionIsolator<Database> extends VitestPostgresTr
55
55
  }
56
56
  //#endregion
57
57
  export { VitestKyselyTransactionIsolator };
58
- //# sourceMappingURL=VitestKyselyTransactionIsolator-4HOeLQ0d.d.cts.map
58
+ //# sourceMappingURL=VitestKyselyTransactionIsolator-Dxlp1u0f.d.mts.map
@@ -1,4 +1,4 @@
1
- const require_VitestTransactionIsolator = require('./VitestTransactionIsolator-BKIrj3Uy.cjs');
1
+ const require_VitestTransactionIsolator = require('./VitestTransactionIsolator-CMfJXZP8.cjs');
2
2
 
3
3
  //#region src/VitestKyselyTransactionIsolator.ts
4
4
  /**
@@ -62,4 +62,4 @@ Object.defineProperty(exports, 'VitestKyselyTransactionIsolator', {
62
62
  return VitestKyselyTransactionIsolator;
63
63
  }
64
64
  });
65
- //# sourceMappingURL=VitestKyselyTransactionIsolator-DX_VPKS-.cjs.map
65
+ //# sourceMappingURL=VitestKyselyTransactionIsolator-EvDLk5zg.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"VitestKyselyTransactionIsolator-DX_VPKS-.cjs","names":["VitestPostgresTransactionIsolator","conn: Kysely<Database>","level: IsolationLevel","fn: (trx: Transaction<Database>) => Promise<void>"],"sources":["../src/VitestKyselyTransactionIsolator.ts"],"sourcesContent":["import type { Kysely, Transaction } from 'kysely';\nimport {\n type IsolationLevel,\n VitestPostgresTransactionIsolator,\n} from './VitestTransactionIsolator';\n\n/**\n * Kysely-specific implementation of the Vitest transaction isolator.\n * Provides automatic transaction rollback for test isolation using Kysely's transaction API.\n * Each test runs within a database transaction that is rolled back after completion,\n * ensuring a clean state between tests without the overhead of recreating data.\n *\n * @template Database - The database schema type\n *\n * @example\n * ```typescript\n * import { VitestKyselyTransactionIsolator } from '@geekmidas/testkit';\n * import { db } from './database';\n *\n * // Create isolator instance\n * const isolator = new VitestKyselyTransactionIsolator<Database>();\n *\n * // In your test setup\n * beforeEach(async () => {\n * await isolator.start(db);\n * });\n *\n * afterEach(async () => {\n * await isolator.rollback();\n * });\n *\n * // Tests run in isolated transactions\n * it('should create user', async () => {\n * const user = await db.insertInto('users')\n * .values({ name: 'Test User' })\n * .returningAll()\n * .executeTakeFirst();\n *\n * expect(user).toBeDefined();\n * // This data will be rolled back after the test\n * });\n * ```\n */\nexport class VitestKyselyTransactionIsolator<\n Database,\n> extends VitestPostgresTransactionIsolator<\n Kysely<Database>,\n Transaction<Database>\n> {\n async destroy(conn: Kysely<Database>): Promise<void> {\n // return conn.destroy();\n }\n /**\n * Creates a Kysely transaction with the specified isolation level.\n * Implements the abstract transact method from VitestPostgresTransactionIsolator.\n *\n * @param conn - The Kysely database connection\n * @param level - The transaction isolation level\n * @param fn - The function to execute within the transaction\n * @returns Promise that resolves when the transaction completes\n */\n async transact(\n conn: Kysely<Database>,\n level: IsolationLevel,\n fn: (trx: Transaction<Database>) => Promise<void>,\n ): Promise<void> {\n const isolationLevel =\n level.toLocaleLowerCase() as Lowercase<IsolationLevel>;\n await conn.transaction().setIsolationLevel(isolationLevel).execute(fn);\n }\n // Implement any Kysely-specific transaction logic here\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,IAAa,kCAAb,cAEUA,oEAGR;CACA,MAAM,QAAQC,MAAuC,CAEpD;;;;;;;;;;CAUD,MAAM,SACJA,MACAC,OACAC,IACe;EACf,MAAM,iBACJ,MAAM,mBAAmB;AAC3B,QAAM,KAAK,aAAa,CAAC,kBAAkB,eAAe,CAAC,QAAQ,GAAG;CACvE;AAEF"}
1
+ {"version":3,"file":"VitestKyselyTransactionIsolator-EvDLk5zg.cjs","names":["VitestPostgresTransactionIsolator","conn: Kysely<Database>","level: IsolationLevel","fn: (trx: Transaction<Database>) => Promise<void>"],"sources":["../src/VitestKyselyTransactionIsolator.ts"],"sourcesContent":["import type { Kysely, Transaction } from 'kysely';\nimport {\n type IsolationLevel,\n VitestPostgresTransactionIsolator,\n} from './VitestTransactionIsolator';\n\n/**\n * Kysely-specific implementation of the Vitest transaction isolator.\n * Provides automatic transaction rollback for test isolation using Kysely's transaction API.\n * Each test runs within a database transaction that is rolled back after completion,\n * ensuring a clean state between tests without the overhead of recreating data.\n *\n * @template Database - The database schema type\n *\n * @example\n * ```typescript\n * import { VitestKyselyTransactionIsolator } from '@geekmidas/testkit';\n * import { db } from './database';\n *\n * // Create isolator instance\n * const isolator = new VitestKyselyTransactionIsolator<Database>();\n *\n * // In your test setup\n * beforeEach(async () => {\n * await isolator.start(db);\n * });\n *\n * afterEach(async () => {\n * await isolator.rollback();\n * });\n *\n * // Tests run in isolated transactions\n * it('should create user', async () => {\n * const user = await db.insertInto('users')\n * .values({ name: 'Test User' })\n * .returningAll()\n * .executeTakeFirst();\n *\n * expect(user).toBeDefined();\n * // This data will be rolled back after the test\n * });\n * ```\n */\nexport class VitestKyselyTransactionIsolator<\n Database,\n> extends VitestPostgresTransactionIsolator<\n Kysely<Database>,\n Transaction<Database>\n> {\n async destroy(conn: Kysely<Database>): Promise<void> {\n // return conn.destroy();\n }\n /**\n * Creates a Kysely transaction with the specified isolation level.\n * Implements the abstract transact method from VitestPostgresTransactionIsolator.\n *\n * @param conn - The Kysely database connection\n * @param level - The transaction isolation level\n * @param fn - The function to execute within the transaction\n * @returns Promise that resolves when the transaction completes\n */\n async transact(\n conn: Kysely<Database>,\n level: IsolationLevel,\n fn: (trx: Transaction<Database>) => Promise<void>,\n ): Promise<void> {\n const isolationLevel =\n level.toLocaleLowerCase() as Lowercase<IsolationLevel>;\n await conn.transaction().setIsolationLevel(isolationLevel).execute(fn);\n }\n // Implement any Kysely-specific transaction logic here\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,IAAa,kCAAb,cAEUA,oEAGR;CACA,MAAM,QAAQC,MAAuC,CAEpD;;;;;;;;;;CAUD,MAAM,SACJA,MACAC,OACAC,IACe;EACf,MAAM,iBACJ,MAAM,mBAAmB;AAC3B,QAAM,KAAK,aAAa,CAAC,kBAAkB,eAAe,CAAC,QAAQ,GAAG;CACvE;AAEF"}
@@ -1,4 +1,4 @@
1
- require('./VitestTransactionIsolator-BKIrj3Uy.cjs');
2
- const require_VitestKyselyTransactionIsolator = require('./VitestKyselyTransactionIsolator-DX_VPKS-.cjs');
1
+ require('./VitestTransactionIsolator-CMfJXZP8.cjs');
2
+ const require_VitestKyselyTransactionIsolator = require('./VitestKyselyTransactionIsolator-EvDLk5zg.cjs');
3
3
 
4
4
  exports.VitestKyselyTransactionIsolator = require_VitestKyselyTransactionIsolator.VitestKyselyTransactionIsolator;
@@ -1,3 +1,3 @@
1
- import "./VitestTransactionIsolator-CyG_i_Nj.cjs";
2
- import { VitestKyselyTransactionIsolator } from "./VitestKyselyTransactionIsolator-4HOeLQ0d.cjs";
1
+ import "./VitestTransactionIsolator-CwQaxZLP.cjs";
2
+ import { VitestKyselyTransactionIsolator } from "./VitestKyselyTransactionIsolator-D3EZZhjZ.cjs";
3
3
  export { VitestKyselyTransactionIsolator };
@@ -1,3 +1,3 @@
1
- import "./VitestTransactionIsolator-DWDbnITQ.mjs";
2
- import { VitestKyselyTransactionIsolator } from "./VitestKyselyTransactionIsolator-DnyZMaA-.mjs";
1
+ import "./VitestTransactionIsolator-BvR19bYn.mjs";
2
+ import { VitestKyselyTransactionIsolator } from "./VitestKyselyTransactionIsolator-Dxlp1u0f.mjs";
3
3
  export { VitestKyselyTransactionIsolator };
@@ -1,4 +1,4 @@
1
- import "./VitestTransactionIsolator-BIaMs4c2.mjs";
2
- import { VitestKyselyTransactionIsolator } from "./VitestKyselyTransactionIsolator-XDL3ngs_.mjs";
1
+ import "./VitestTransactionIsolator-DQ7tLqgV.mjs";
2
+ import { VitestKyselyTransactionIsolator } from "./VitestKyselyTransactionIsolator-CNURW8y6.mjs";
3
3
 
4
4
  export { VitestKyselyTransactionIsolator };
@@ -1,4 +1,4 @@
1
- import { IsolationLevel, VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-CyG_i_Nj.cjs";
1
+ import { IsolationLevel, VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-CwQaxZLP.cjs";
2
2
  import { Knex } from "knex";
3
3
 
4
4
  //#region src/VitestObjectionTransactionIsolator.d.ts
@@ -56,4 +56,4 @@ declare class VitestObjectionTransactionIsolator extends VitestPostgresTransacti
56
56
  }
57
57
  //#endregion
58
58
  export { VitestObjectionTransactionIsolator };
59
- //# sourceMappingURL=VitestObjectionTransactionIsolator-COVDlpEo.d.cts.map
59
+ //# sourceMappingURL=VitestObjectionTransactionIsolator-1TpsPqfG.d.cts.map
@@ -1,4 +1,4 @@
1
- const require_VitestTransactionIsolator = require('./VitestTransactionIsolator-BKIrj3Uy.cjs');
1
+ const require_VitestTransactionIsolator = require('./VitestTransactionIsolator-CMfJXZP8.cjs');
2
2
 
3
3
  //#region src/VitestObjectionTransactionIsolator.ts
4
4
  /**
@@ -65,4 +65,4 @@ Object.defineProperty(exports, 'VitestObjectionTransactionIsolator', {
65
65
  return VitestObjectionTransactionIsolator;
66
66
  }
67
67
  });
68
- //# sourceMappingURL=VitestObjectionTransactionIsolator-D_tlOtq8.cjs.map
68
+ //# sourceMappingURL=VitestObjectionTransactionIsolator-CM5KTAFA.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"VitestObjectionTransactionIsolator-D_tlOtq8.cjs","names":["VitestPostgresTransactionIsolator","conn: Knex<any, any[]>","connection: Knex","level: IsolationLevel","fn: (trx: Knex.Transaction) => Promise<void>"],"sources":["../src/VitestObjectionTransactionIsolator.ts"],"sourcesContent":["import type { Knex } from 'knex';\nimport {\n type IsolationLevel,\n VitestPostgresTransactionIsolator,\n} from './VitestTransactionIsolator';\n\n/**\n * Objection.js-specific implementation of the Vitest transaction isolator.\n * Provides automatic transaction rollback for test isolation using Objection.js and Knex transaction API.\n * Each test runs within a database transaction that is rolled back after completion,\n * ensuring a clean state between tests without the overhead of recreating data.\n *\n * @example\n * ```typescript\n * import { VitestObjectionTransactionIsolator } from '@geekmidas/testkit';\n * import { knex } from './database';\n * import { User } from './models';\n * import { test } from 'vitest';\n *\n * // Create isolator instance\n * const isolator = new VitestObjectionTransactionIsolator(test);\n *\n * // Use with wrapped test API\n * const isolatedTest = isolator.wrapVitestWithTransaction(knex);\n *\n * isolatedTest('should create user', async ({ trx }) => {\n * const user = await User.query(trx)\n * .insert({ name: 'Test User' });\n *\n * expect(user).toBeDefined();\n * // This data will be rolled back after the test\n * });\n * ```\n */\nexport class VitestObjectionTransactionIsolator extends VitestPostgresTransactionIsolator<\n Knex,\n Knex.Transaction\n> {\n async destroy(conn: Knex<any, any[]>): Promise<void> {}\n /**\n * Creates a Knex transaction with the specified isolation level.\n * Implements the abstract transact method from VitestPostgresTransactionIsolator.\n * This transaction can be used with Objection.js models via Model.query(trx).\n *\n * @param conn - The Knex database connection\n * @param level - The transaction isolation level\n * @param fn - The function to execute within the transaction\n * @returns Promise that resolves when the transaction completes\n *\n * @example\n * ```typescript\n * await isolator.transact(knex, IsolationLevel.REPEATABLE_READ, async (trx) => {\n * // Use transaction with Objection models\n * await User.query(trx).insert({ name: 'Test' });\n * await Post.query(trx).where('userId', user.id).delete();\n * });\n * ```\n */\n async transact(\n connection: Knex,\n level: IsolationLevel,\n fn: (trx: Knex.Transaction) => Promise<void>,\n ): Promise<void> {\n const isolationLevel = level.toLowerCase() as Lowercase<IsolationLevel>;\n\n await connection.transaction(\n async (trx) => {\n await fn(trx);\n },\n {\n isolationLevel,\n },\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,IAAa,qCAAb,cAAwDA,oEAGtD;CACA,MAAM,QAAQC,MAAuC,CAAE;;;;;;;;;;;;;;;;;;;;CAoBvD,MAAM,SACJC,YACAC,OACAC,IACe;EACf,MAAM,iBAAiB,MAAM,aAAa;AAE1C,QAAM,WAAW,YACf,OAAO,QAAQ;AACb,SAAM,GAAG,IAAI;EACd,GACD,EACE,eACD,EACF;CACF;AACF"}
1
+ {"version":3,"file":"VitestObjectionTransactionIsolator-CM5KTAFA.cjs","names":["VitestPostgresTransactionIsolator","conn: Knex<any, any[]>","connection: Knex","level: IsolationLevel","fn: (trx: Knex.Transaction) => Promise<void>"],"sources":["../src/VitestObjectionTransactionIsolator.ts"],"sourcesContent":["import type { Knex } from 'knex';\nimport {\n type IsolationLevel,\n VitestPostgresTransactionIsolator,\n} from './VitestTransactionIsolator';\n\n/**\n * Objection.js-specific implementation of the Vitest transaction isolator.\n * Provides automatic transaction rollback for test isolation using Objection.js and Knex transaction API.\n * Each test runs within a database transaction that is rolled back after completion,\n * ensuring a clean state between tests without the overhead of recreating data.\n *\n * @example\n * ```typescript\n * import { VitestObjectionTransactionIsolator } from '@geekmidas/testkit';\n * import { knex } from './database';\n * import { User } from './models';\n * import { test } from 'vitest';\n *\n * // Create isolator instance\n * const isolator = new VitestObjectionTransactionIsolator(test);\n *\n * // Use with wrapped test API\n * const isolatedTest = isolator.wrapVitestWithTransaction(knex);\n *\n * isolatedTest('should create user', async ({ trx }) => {\n * const user = await User.query(trx)\n * .insert({ name: 'Test User' });\n *\n * expect(user).toBeDefined();\n * // This data will be rolled back after the test\n * });\n * ```\n */\nexport class VitestObjectionTransactionIsolator extends VitestPostgresTransactionIsolator<\n Knex,\n Knex.Transaction\n> {\n async destroy(conn: Knex<any, any[]>): Promise<void> {}\n /**\n * Creates a Knex transaction with the specified isolation level.\n * Implements the abstract transact method from VitestPostgresTransactionIsolator.\n * This transaction can be used with Objection.js models via Model.query(trx).\n *\n * @param conn - The Knex database connection\n * @param level - The transaction isolation level\n * @param fn - The function to execute within the transaction\n * @returns Promise that resolves when the transaction completes\n *\n * @example\n * ```typescript\n * await isolator.transact(knex, IsolationLevel.REPEATABLE_READ, async (trx) => {\n * // Use transaction with Objection models\n * await User.query(trx).insert({ name: 'Test' });\n * await Post.query(trx).where('userId', user.id).delete();\n * });\n * ```\n */\n async transact(\n connection: Knex,\n level: IsolationLevel,\n fn: (trx: Knex.Transaction) => Promise<void>,\n ): Promise<void> {\n const isolationLevel = level.toLowerCase() as Lowercase<IsolationLevel>;\n\n await connection.transaction(\n async (trx) => {\n await fn(trx);\n },\n {\n isolationLevel,\n },\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,IAAa,qCAAb,cAAwDA,oEAGtD;CACA,MAAM,QAAQC,MAAuC,CAAE;;;;;;;;;;;;;;;;;;;;CAoBvD,MAAM,SACJC,YACAC,OACAC,IACe;EACf,MAAM,iBAAiB,MAAM,aAAa;AAE1C,QAAM,WAAW,YACf,OAAO,QAAQ;AACb,SAAM,GAAG,IAAI;EACd,GACD,EACE,eACD,EACF;CACF;AACF"}
@@ -1,4 +1,4 @@
1
- import { IsolationLevel, VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-DWDbnITQ.mjs";
1
+ import { IsolationLevel, VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-BvR19bYn.mjs";
2
2
  import { Knex } from "knex";
3
3
 
4
4
  //#region src/VitestObjectionTransactionIsolator.d.ts
@@ -56,4 +56,4 @@ declare class VitestObjectionTransactionIsolator extends VitestPostgresTransacti
56
56
  }
57
57
  //#endregion
58
58
  export { VitestObjectionTransactionIsolator };
59
- //# sourceMappingURL=VitestObjectionTransactionIsolator-lZUSz1w0.d.mts.map
59
+ //# sourceMappingURL=VitestObjectionTransactionIsolator-i9jIgU8Q.d.mts.map
@@ -1,4 +1,4 @@
1
- import { VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-BIaMs4c2.mjs";
1
+ import { VitestPostgresTransactionIsolator } from "./VitestTransactionIsolator-DQ7tLqgV.mjs";
2
2
 
3
3
  //#region src/VitestObjectionTransactionIsolator.ts
4
4
  /**
@@ -60,4 +60,4 @@ var VitestObjectionTransactionIsolator = class extends VitestPostgresTransaction
60
60
 
61
61
  //#endregion
62
62
  export { VitestObjectionTransactionIsolator };
63
- //# sourceMappingURL=VitestObjectionTransactionIsolator-_EhJKu_O.mjs.map
63
+ //# sourceMappingURL=VitestObjectionTransactionIsolator-jQFaCz0u.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"VitestObjectionTransactionIsolator-_EhJKu_O.mjs","names":["conn: Knex<any, any[]>","connection: Knex","level: IsolationLevel","fn: (trx: Knex.Transaction) => Promise<void>"],"sources":["../src/VitestObjectionTransactionIsolator.ts"],"sourcesContent":["import type { Knex } from 'knex';\nimport {\n type IsolationLevel,\n VitestPostgresTransactionIsolator,\n} from './VitestTransactionIsolator';\n\n/**\n * Objection.js-specific implementation of the Vitest transaction isolator.\n * Provides automatic transaction rollback for test isolation using Objection.js and Knex transaction API.\n * Each test runs within a database transaction that is rolled back after completion,\n * ensuring a clean state between tests without the overhead of recreating data.\n *\n * @example\n * ```typescript\n * import { VitestObjectionTransactionIsolator } from '@geekmidas/testkit';\n * import { knex } from './database';\n * import { User } from './models';\n * import { test } from 'vitest';\n *\n * // Create isolator instance\n * const isolator = new VitestObjectionTransactionIsolator(test);\n *\n * // Use with wrapped test API\n * const isolatedTest = isolator.wrapVitestWithTransaction(knex);\n *\n * isolatedTest('should create user', async ({ trx }) => {\n * const user = await User.query(trx)\n * .insert({ name: 'Test User' });\n *\n * expect(user).toBeDefined();\n * // This data will be rolled back after the test\n * });\n * ```\n */\nexport class VitestObjectionTransactionIsolator extends VitestPostgresTransactionIsolator<\n Knex,\n Knex.Transaction\n> {\n async destroy(conn: Knex<any, any[]>): Promise<void> {}\n /**\n * Creates a Knex transaction with the specified isolation level.\n * Implements the abstract transact method from VitestPostgresTransactionIsolator.\n * This transaction can be used with Objection.js models via Model.query(trx).\n *\n * @param conn - The Knex database connection\n * @param level - The transaction isolation level\n * @param fn - The function to execute within the transaction\n * @returns Promise that resolves when the transaction completes\n *\n * @example\n * ```typescript\n * await isolator.transact(knex, IsolationLevel.REPEATABLE_READ, async (trx) => {\n * // Use transaction with Objection models\n * await User.query(trx).insert({ name: 'Test' });\n * await Post.query(trx).where('userId', user.id).delete();\n * });\n * ```\n */\n async transact(\n connection: Knex,\n level: IsolationLevel,\n fn: (trx: Knex.Transaction) => Promise<void>,\n ): Promise<void> {\n const isolationLevel = level.toLowerCase() as Lowercase<IsolationLevel>;\n\n await connection.transaction(\n async (trx) => {\n await fn(trx);\n },\n {\n isolationLevel,\n },\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,IAAa,qCAAb,cAAwD,kCAGtD;CACA,MAAM,QAAQA,MAAuC,CAAE;;;;;;;;;;;;;;;;;;;;CAoBvD,MAAM,SACJC,YACAC,OACAC,IACe;EACf,MAAM,iBAAiB,MAAM,aAAa;AAE1C,QAAM,WAAW,YACf,OAAO,QAAQ;AACb,SAAM,GAAG,IAAI;EACd,GACD,EACE,eACD,EACF;CACF;AACF"}
1
+ {"version":3,"file":"VitestObjectionTransactionIsolator-jQFaCz0u.mjs","names":["conn: Knex<any, any[]>","connection: Knex","level: IsolationLevel","fn: (trx: Knex.Transaction) => Promise<void>"],"sources":["../src/VitestObjectionTransactionIsolator.ts"],"sourcesContent":["import type { Knex } from 'knex';\nimport {\n type IsolationLevel,\n VitestPostgresTransactionIsolator,\n} from './VitestTransactionIsolator';\n\n/**\n * Objection.js-specific implementation of the Vitest transaction isolator.\n * Provides automatic transaction rollback for test isolation using Objection.js and Knex transaction API.\n * Each test runs within a database transaction that is rolled back after completion,\n * ensuring a clean state between tests without the overhead of recreating data.\n *\n * @example\n * ```typescript\n * import { VitestObjectionTransactionIsolator } from '@geekmidas/testkit';\n * import { knex } from './database';\n * import { User } from './models';\n * import { test } from 'vitest';\n *\n * // Create isolator instance\n * const isolator = new VitestObjectionTransactionIsolator(test);\n *\n * // Use with wrapped test API\n * const isolatedTest = isolator.wrapVitestWithTransaction(knex);\n *\n * isolatedTest('should create user', async ({ trx }) => {\n * const user = await User.query(trx)\n * .insert({ name: 'Test User' });\n *\n * expect(user).toBeDefined();\n * // This data will be rolled back after the test\n * });\n * ```\n */\nexport class VitestObjectionTransactionIsolator extends VitestPostgresTransactionIsolator<\n Knex,\n Knex.Transaction\n> {\n async destroy(conn: Knex<any, any[]>): Promise<void> {}\n /**\n * Creates a Knex transaction with the specified isolation level.\n * Implements the abstract transact method from VitestPostgresTransactionIsolator.\n * This transaction can be used with Objection.js models via Model.query(trx).\n *\n * @param conn - The Knex database connection\n * @param level - The transaction isolation level\n * @param fn - The function to execute within the transaction\n * @returns Promise that resolves when the transaction completes\n *\n * @example\n * ```typescript\n * await isolator.transact(knex, IsolationLevel.REPEATABLE_READ, async (trx) => {\n * // Use transaction with Objection models\n * await User.query(trx).insert({ name: 'Test' });\n * await Post.query(trx).where('userId', user.id).delete();\n * });\n * ```\n */\n async transact(\n connection: Knex,\n level: IsolationLevel,\n fn: (trx: Knex.Transaction) => Promise<void>,\n ): Promise<void> {\n const isolationLevel = level.toLowerCase() as Lowercase<IsolationLevel>;\n\n await connection.transaction(\n async (trx) => {\n await fn(trx);\n },\n {\n isolationLevel,\n },\n );\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkCA,IAAa,qCAAb,cAAwD,kCAGtD;CACA,MAAM,QAAQA,MAAuC,CAAE;;;;;;;;;;;;;;;;;;;;CAoBvD,MAAM,SACJC,YACAC,OACAC,IACe;EACf,MAAM,iBAAiB,MAAM,aAAa;AAE1C,QAAM,WAAW,YACf,OAAO,QAAQ;AACb,SAAM,GAAG,IAAI;EACd,GACD,EACE,eACD,EACF;CACF;AACF"}
@@ -1,4 +1,4 @@
1
- require('./VitestTransactionIsolator-BKIrj3Uy.cjs');
2
- const require_VitestObjectionTransactionIsolator = require('./VitestObjectionTransactionIsolator-D_tlOtq8.cjs');
1
+ require('./VitestTransactionIsolator-CMfJXZP8.cjs');
2
+ const require_VitestObjectionTransactionIsolator = require('./VitestObjectionTransactionIsolator-CM5KTAFA.cjs');
3
3
 
4
4
  exports.VitestObjectionTransactionIsolator = require_VitestObjectionTransactionIsolator.VitestObjectionTransactionIsolator;
@@ -1,3 +1,3 @@
1
- import "./VitestTransactionIsolator-CyG_i_Nj.cjs";
2
- import { VitestObjectionTransactionIsolator } from "./VitestObjectionTransactionIsolator-COVDlpEo.cjs";
1
+ import "./VitestTransactionIsolator-CwQaxZLP.cjs";
2
+ import { VitestObjectionTransactionIsolator } from "./VitestObjectionTransactionIsolator-1TpsPqfG.cjs";
3
3
  export { VitestObjectionTransactionIsolator };
@@ -1,3 +1,3 @@
1
- import "./VitestTransactionIsolator-DWDbnITQ.mjs";
2
- import { VitestObjectionTransactionIsolator } from "./VitestObjectionTransactionIsolator-lZUSz1w0.mjs";
1
+ import "./VitestTransactionIsolator-BvR19bYn.mjs";
2
+ import { VitestObjectionTransactionIsolator } from "./VitestObjectionTransactionIsolator-i9jIgU8Q.mjs";
3
3
  export { VitestObjectionTransactionIsolator };
@@ -1,4 +1,4 @@
1
- import "./VitestTransactionIsolator-BIaMs4c2.mjs";
2
- import { VitestObjectionTransactionIsolator } from "./VitestObjectionTransactionIsolator-_EhJKu_O.mjs";
1
+ import "./VitestTransactionIsolator-DQ7tLqgV.mjs";
2
+ import { VitestObjectionTransactionIsolator } from "./VitestObjectionTransactionIsolator-jQFaCz0u.mjs";
3
3
 
4
4
  export { VitestObjectionTransactionIsolator };
@@ -112,35 +112,61 @@ declare abstract class VitestPostgresTransactionIsolator<TConn, Transaction> {
112
112
  * Creates a wrapped version of Vitest's test API that provides transaction isolation.
113
113
  * Each test will run within a database transaction that is automatically rolled back.
114
114
  *
115
- * @param conn - The database connection to use
116
- * @param setup - Optional setup function to run within the transaction before each test
117
- * @param level - The transaction isolation level (defaults to REPEATABLE_READ)
115
+ * @param options - Configuration options for transaction wrapping
118
116
  * @returns A wrapped test API with transaction support
119
117
  *
120
118
  * @example
121
119
  * ```typescript
122
- * const isolatedTest = isolator.wrapVitestWithTransaction(db, async (trx) => {
123
- * // Optional setup: create common test data
124
- * await trx.insert('settings', { key: 'test', value: 'true' });
120
+ * const isolatedTest = isolator.wrapVitestWithTransaction({
121
+ * connection: db,
122
+ * setup: async (trx) => {
123
+ * await trx.insert('settings', { key: 'test', value: 'true' });
124
+ * },
125
+ * fixtures: {
126
+ * factory: (trx) => new Factory(trx),
127
+ * },
125
128
  * });
126
129
  *
127
- * isolatedTest('test with transaction', async ({ trx }) => {
128
- * const user = await trx.insert('users', { name: 'Test' });
130
+ * isolatedTest('test with transaction', async ({ trx, factory }) => {
131
+ * const user = await factory.insert('user', { name: 'Test' });
129
132
  * expect(user).toBeDefined();
130
133
  * });
131
134
  * ```
132
135
  */
133
- wrapVitestWithTransaction(createConnection: DatabaseConnection<TConn>, setup?: (trx: Transaction) => Promise<void>, level?: IsolationLevel): TestAPI<{
134
- trx: Transaction;
135
- }>;
136
+ wrapVitestWithTransaction<Extended extends Record<string, unknown> = {}>(options: TransactionWrapperOptions<TConn, Transaction, Extended>): TestAPI<DatabaseFixtures<Transaction, object> & Extended>;
136
137
  }
137
138
  type DatabaseConnectionFn<Conn> = () => Conn | Promise<Conn>;
138
139
  type DatabaseConnection<Conn> = DatabaseConnectionFn<Conn>;
140
+ /**
141
+ * Options for wrapping Vitest tests with database transaction isolation.
142
+ */
143
+ interface TransactionWrapperOptions<TConn, Transaction, Extended extends Record<string, unknown> = {}> {
144
+ /** Function that creates or returns a database connection */
145
+ connection: DatabaseConnection<TConn>;
146
+ /** Optional setup function to run within the transaction before each test */
147
+ setup?: (trx: Transaction) => Promise<void>;
148
+ /** Transaction isolation level (defaults to REPEATABLE_READ) */
149
+ isolationLevel?: IsolationLevel;
150
+ /** Additional fixtures that depend on the transaction */
151
+ fixtures?: FixtureCreators<Transaction, Extended>;
152
+ }
139
153
  /**
140
154
  * Type for fixture creator functions that depend on the transaction.
141
155
  * Each function receives the transaction and returns the fixture value.
142
156
  */
143
157
  type FixtureCreators<Transaction, Extended extends Record<string, unknown>> = { [K in keyof Extended]: (trx: Transaction) => Extended[K] | Promise<Extended[K]> };
158
+ /**
159
+ * The test API returned by extendWithFixtures.
160
+ * Provides access to both the transaction (trx) and all extended fixtures.
161
+ *
162
+ * @template Transaction - The transaction type
163
+ * @template Extended - The type of additional fixtures provided
164
+ * @template BaseTest - The base wrapped test type
165
+ */
166
+ type TestWithExtendedFixtures<Transaction, Extended extends Record<string, unknown>, BaseTest extends ReturnType<TestAPI['extend']> = ReturnType<TestAPI['extend']>> = BaseTest & {
167
+ <C extends object>(name: string, fn: (context: DatabaseFixtures<Transaction> & Extended & C) => Promise<void>): void;
168
+ <C extends object>(name: string, options: object, fn: (context: DatabaseFixtures<Transaction> & Extended & C) => Promise<void>): void;
169
+ };
144
170
  /**
145
171
  * Extends a wrapped test API with additional fixtures that depend on the transaction.
146
172
  * This allows composing test context with factories, repositories, or other helpers.
@@ -156,7 +182,10 @@ type FixtureCreators<Transaction, Extended extends Record<string, unknown>> = {
156
182
  * import { wrapVitestKyselyTransaction, extendWithFixtures } from '@geekmidas/testkit/kysely';
157
183
  *
158
184
  * // Create base wrapped test
159
- * const baseTest = wrapVitestKyselyTransaction(test, db, createTestTables);
185
+ * const baseTest = wrapVitestKyselyTransaction(test, {
186
+ * connection: db,
187
+ * setup: createTestTables,
188
+ * });
160
189
  *
161
190
  * // Extend with fixtures
162
191
  * const it = extendWithFixtures(baseTest, {
@@ -171,10 +200,7 @@ type FixtureCreators<Transaction, Extended extends Record<string, unknown>> = {
171
200
  * });
172
201
  * ```
173
202
  */
174
- declare function extendWithFixtures<Transaction, Extended extends Record<string, unknown>, T extends ReturnType<TestAPI['extend']> = any>(wrappedTest: T, fixtures: FixtureCreators<Transaction, Extended>): T & {
175
- <C extends object>(name: string, fn: (context: DatabaseFixtures<Transaction> & Extended & C) => Promise<void>): void;
176
- <C extends object>(name: string, options: object, fn: (context: DatabaseFixtures<Transaction> & Extended & C) => Promise<void>): void;
177
- };
203
+ declare function extendWithFixtures<Transaction, Extended extends Record<string, unknown>, T extends ReturnType<TestAPI['extend']> = any>(wrappedTest: T, fixtures: FixtureCreators<Transaction, Extended>): TestWithExtendedFixtures<Transaction, Extended, T>;
178
204
  //#endregion
179
- export { DatabaseConnection, DatabaseConnectionFn, DatabaseFixtures, ExtendContextFn, ExtendedDatabaseFixtures, FixtureCreators, IsolationLevel, VitestPostgresTransactionIsolator, extendWithFixtures };
180
- //# sourceMappingURL=VitestTransactionIsolator-DWDbnITQ.d.mts.map
205
+ export { DatabaseConnection, DatabaseConnectionFn, DatabaseFixtures, ExtendContextFn, ExtendedDatabaseFixtures, FixtureCreators, IsolationLevel, TestWithExtendedFixtures, TransactionWrapperOptions, VitestPostgresTransactionIsolator, extendWithFixtures };
206
+ //# sourceMappingURL=VitestTransactionIsolator-BvR19bYn.d.mts.map