@shivaedev/effect-prisma 0.0.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 (104) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/LICENSE +21 -0
  3. package/README.md +150 -2
  4. package/dist/database.d.ts +35 -0
  5. package/dist/database.d.ts.map +1 -0
  6. package/dist/database.js +83 -0
  7. package/dist/database.js.map +1 -0
  8. package/dist/error.d.ts +52 -0
  9. package/dist/error.d.ts.map +1 -0
  10. package/dist/error.js +48 -0
  11. package/dist/error.js.map +1 -0
  12. package/dist/index.d.ts +4 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +3 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/internal/client-lifecycle.d.ts +7 -0
  17. package/dist/internal/client-lifecycle.d.ts.map +1 -0
  18. package/dist/internal/client-lifecycle.js +19 -0
  19. package/dist/internal/client-lifecycle.js.map +1 -0
  20. package/dist/internal/executor.d.ts +16 -0
  21. package/dist/internal/executor.d.ts.map +1 -0
  22. package/dist/internal/executor.js +2 -0
  23. package/dist/internal/executor.js.map +1 -0
  24. package/dist/internal/promise.d.ts +4 -0
  25. package/dist/internal/promise.d.ts.map +1 -0
  26. package/dist/internal/promise.js +9 -0
  27. package/dist/internal/promise.js.map +1 -0
  28. package/dist/internal/recipe.d.ts +13 -0
  29. package/dist/internal/recipe.d.ts.map +1 -0
  30. package/dist/internal/recipe.js +92 -0
  31. package/dist/internal/recipe.js.map +1 -0
  32. package/dist/internal/relation-plan.d.ts +8 -0
  33. package/dist/internal/relation-plan.d.ts.map +1 -0
  34. package/dist/internal/relation-plan.js +10 -0
  35. package/dist/internal/relation-plan.js.map +1 -0
  36. package/dist/internal/relation-runtime.d.ts +5 -0
  37. package/dist/internal/relation-runtime.d.ts.map +1 -0
  38. package/dist/internal/relation-runtime.js +106 -0
  39. package/dist/internal/relation-runtime.js.map +1 -0
  40. package/dist/internal/testing.d.ts +11 -0
  41. package/dist/internal/testing.d.ts.map +1 -0
  42. package/dist/internal/testing.js +9 -0
  43. package/dist/internal/testing.js.map +1 -0
  44. package/dist/internal/transaction.d.ts +14 -0
  45. package/dist/internal/transaction.d.ts.map +1 -0
  46. package/dist/internal/transaction.js +79 -0
  47. package/dist/internal/transaction.js.map +1 -0
  48. package/dist/internal/vitest-database.d.ts +18 -0
  49. package/dist/internal/vitest-database.d.ts.map +1 -0
  50. package/dist/internal/vitest-database.js +73 -0
  51. package/dist/internal/vitest-database.js.map +1 -0
  52. package/dist/relation/include-metadata.d.ts +34 -0
  53. package/dist/relation/include-metadata.d.ts.map +1 -0
  54. package/dist/relation/include-metadata.js +2 -0
  55. package/dist/relation/include-metadata.js.map +1 -0
  56. package/dist/relation/include.d.ts +25 -0
  57. package/dist/relation/include.d.ts.map +1 -0
  58. package/dist/relation/include.js +2 -0
  59. package/dist/relation/include.js.map +1 -0
  60. package/dist/relation/prisma-methods.d.ts +56 -0
  61. package/dist/relation/prisma-methods.d.ts.map +1 -0
  62. package/dist/relation/prisma-methods.js +2 -0
  63. package/dist/relation/prisma-methods.js.map +1 -0
  64. package/dist/relation.d.ts +34 -0
  65. package/dist/relation.d.ts.map +1 -0
  66. package/dist/relation.js +2 -0
  67. package/dist/relation.js.map +1 -0
  68. package/dist/testing/transaction.d.ts +10 -0
  69. package/dist/testing/transaction.d.ts.map +1 -0
  70. package/dist/testing/transaction.js +6 -0
  71. package/dist/testing/transaction.js.map +1 -0
  72. package/dist/testing/types.d.ts +29 -0
  73. package/dist/testing/types.d.ts.map +1 -0
  74. package/dist/testing/types.js +2 -0
  75. package/dist/testing/types.js.map +1 -0
  76. package/dist/testing/vitest.d.ts +6 -0
  77. package/dist/testing/vitest.d.ts.map +1 -0
  78. package/dist/testing/vitest.js +28 -0
  79. package/dist/testing/vitest.js.map +1 -0
  80. package/dist/testing.d.ts +4 -0
  81. package/dist/testing.d.ts.map +1 -0
  82. package/dist/testing.js +3 -0
  83. package/dist/testing.js.map +1 -0
  84. package/package.json +69 -4
  85. package/src/database.ts +232 -0
  86. package/src/error.ts +89 -0
  87. package/src/index.ts +14 -0
  88. package/src/internal/client-lifecycle.ts +31 -0
  89. package/src/internal/executor.ts +28 -0
  90. package/src/internal/promise.ts +16 -0
  91. package/src/internal/recipe.ts +148 -0
  92. package/src/internal/relation-plan.ts +22 -0
  93. package/src/internal/relation-runtime.ts +249 -0
  94. package/src/internal/testing.ts +32 -0
  95. package/src/internal/transaction.ts +149 -0
  96. package/src/internal/vitest-database.ts +210 -0
  97. package/src/relation/include-metadata.ts +102 -0
  98. package/src/relation/include.ts +169 -0
  99. package/src/relation/prisma-methods.ts +196 -0
  100. package/src/relation.ts +118 -0
  101. package/src/testing/transaction.ts +28 -0
  102. package/src/testing/types.ts +67 -0
  103. package/src/testing/vitest.ts +67 -0
  104. package/src/testing.ts +8 -0
@@ -0,0 +1,196 @@
1
+ import type { Contract as PrismaContract } from "@prisma-next/contract/types";
2
+ import type { SqlStorage } from "@prisma-next/sql-contract/types";
3
+ import type {
4
+ AggregateBuilder,
5
+ AggregateResult,
6
+ AggregateSpec,
7
+ DefaultModelRow,
8
+ GroupedCollection,
9
+ Collection as PrismaCollection,
10
+ } from "@prisma-next/sql-orm-client";
11
+ import type { Effect, Stream } from "effect";
12
+ import type { PrismaError } from "../error.js";
13
+ import type { CollectionResult, Relation, RelationQuery } from "../relation.js";
14
+ import type { IncludeMethod } from "./include.js";
15
+
16
+ type AnyFunction = (...arguments_: ReadonlyArray<never>) => unknown;
17
+ type AnyPostgresContract = PrismaContract<SqlStorage>;
18
+ type FieldTuple<Row> = readonly [keyof Row & string, ...(keyof Row & string)[]];
19
+ type Simplify<Value> = { [Key in keyof Value]: Value[Key] };
20
+
21
+ type TerminalMethod<Method, Requirement> = Method extends (
22
+ ...arguments_: infer Arguments
23
+ ) => PromiseLike<infer Value>
24
+ ? (
25
+ ...arguments_: Arguments
26
+ ) => Effect.Effect<Awaited<Value>, PrismaError, Requirement>
27
+ : never;
28
+
29
+ type SelectMethod<
30
+ Collection,
31
+ Requirement,
32
+ Contract,
33
+ Model extends string,
34
+ > = Contract extends AnyPostgresContract
35
+ ? Collection extends PrismaCollection<
36
+ Contract,
37
+ Model,
38
+ infer _Row,
39
+ infer State
40
+ >
41
+ ? {
42
+ select<Fields extends FieldTuple<DefaultModelRow<Contract, Model>>>(
43
+ ...fields: Fields
44
+ ): Relation<
45
+ PrismaCollection<
46
+ Contract,
47
+ Model,
48
+ Pick<DefaultModelRow<Contract, Model>, Fields[number]>,
49
+ State
50
+ >,
51
+ Requirement,
52
+ Contract,
53
+ Model
54
+ >;
55
+ }
56
+ : Record<never, never>
57
+ : Collection extends { select: infer Select extends AnyFunction }
58
+ ? {
59
+ select: Select extends (...arguments_: infer Arguments) => infer Result
60
+ ? (
61
+ ...arguments_: Arguments
62
+ ) => Result extends object
63
+ ? Relation<Result, Requirement, Contract, Model>
64
+ : never
65
+ : never;
66
+ }
67
+ : Record<never, never>;
68
+
69
+ type AggregateConfigure<Collection> = Collection extends {
70
+ aggregate: infer Method extends AnyFunction;
71
+ }
72
+ ? Exclude<Parameters<Method>[1], undefined>
73
+ : never;
74
+
75
+ type AggregateSuccess<
76
+ Collection,
77
+ Contract extends AnyPostgresContract,
78
+ Model extends string,
79
+ Spec extends AggregateSpec,
80
+ > =
81
+ Collection extends GroupedCollection<
82
+ Contract,
83
+ Model,
84
+ infer Fields extends FieldTuple<DefaultModelRow<Contract, Model>>
85
+ >
86
+ ? Array<
87
+ Simplify<
88
+ Pick<DefaultModelRow<Contract, Model>, Fields[number]> &
89
+ AggregateResult<Spec>
90
+ >
91
+ >
92
+ : AggregateResult<Spec>;
93
+
94
+ type AggregateMethod<
95
+ Collection,
96
+ Requirement,
97
+ Contract,
98
+ Model extends string,
99
+ > = Contract extends AnyPostgresContract
100
+ ? Collection extends { aggregate: AnyFunction }
101
+ ? {
102
+ aggregate<Spec extends AggregateSpec>(
103
+ make: (aggregate: AggregateBuilder<Contract, Model>) => Spec,
104
+ configure?: AggregateConfigure<Collection>,
105
+ ): Effect.Effect<
106
+ AggregateSuccess<Collection, Contract, Model, Spec>,
107
+ PrismaError,
108
+ Requirement
109
+ >;
110
+ }
111
+ : Record<never, never>
112
+ : Record<never, never>;
113
+
114
+ type CollectionMethods<
115
+ Collection,
116
+ Requirement,
117
+ Contract,
118
+ Model extends string,
119
+ > = Contract extends AnyPostgresContract
120
+ ? Collection extends PrismaCollection<
121
+ Contract,
122
+ Model,
123
+ infer _Row,
124
+ infer State
125
+ >
126
+ ? {
127
+ groupBy<Fields extends FieldTuple<DefaultModelRow<Contract, Model>>>(
128
+ ...fields: Fields
129
+ ): Relation<
130
+ GroupedCollection<Contract, Model, Fields>,
131
+ Requirement,
132
+ Contract,
133
+ Model
134
+ >;
135
+ cursor(
136
+ values: State extends { readonly hasOrderBy: true }
137
+ ? Partial<
138
+ Record<keyof DefaultModelRow<Contract, Model> & string, unknown>
139
+ >
140
+ : never,
141
+ ): Relation<Collection, Requirement, Contract, Model>;
142
+ distinct<Fields extends FieldTuple<DefaultModelRow<Contract, Model>>>(
143
+ ...fields: Fields
144
+ ): Relation<Collection, Requirement, Contract, Model>;
145
+ distinctOn<Fields extends FieldTuple<DefaultModelRow<Contract, Model>>>(
146
+ ...fields: State extends { readonly hasOrderBy: true }
147
+ ? Fields
148
+ : never
149
+ ): Relation<Collection, Requirement, Contract, Model>;
150
+ } & (State extends { readonly hasWhere: true }
151
+ ? {
152
+ readonly [Key in
153
+ | "delete"
154
+ | "deleteAll"
155
+ | "deleteCount"]: TerminalMethod<Collection[Key], Requirement>;
156
+ }
157
+ : Record<never, never>)
158
+ : Record<never, never>
159
+ : Record<never, never>;
160
+
161
+ type CollectionConveniences<
162
+ Collection,
163
+ Requirement,
164
+ Contract,
165
+ Model extends string,
166
+ > = Contract extends AnyPostgresContract
167
+ ? Collection extends PrismaCollection<
168
+ Contract,
169
+ Model,
170
+ infer Row,
171
+ infer _State
172
+ >
173
+ ? {
174
+ readonly stream: Stream.Stream<Row, PrismaError, Requirement>;
175
+ count(): RelationQuery<number, Requirement, Contract, Model>;
176
+ exists(): Effect.Effect<boolean, PrismaError, Requirement>;
177
+ }
178
+ : Record<never, never>
179
+ : CollectionResult<Collection> extends ReadonlyArray<infer Row>
180
+ ? {
181
+ readonly stream: Stream.Stream<Row, PrismaError, Requirement>;
182
+ count(): Effect.Effect<number, PrismaError, Requirement>;
183
+ exists(): Effect.Effect<boolean, PrismaError, Requirement>;
184
+ }
185
+ : Record<never, never>;
186
+
187
+ export type PrismaRelationMethods<
188
+ Collection,
189
+ Requirement,
190
+ Contract,
191
+ Model extends string,
192
+ > = SelectMethod<Collection, Requirement, Contract, Model> &
193
+ IncludeMethod<Collection, Requirement, Contract, Model> &
194
+ AggregateMethod<Collection, Requirement, Contract, Model> &
195
+ CollectionMethods<Collection, Requirement, Contract, Model> &
196
+ CollectionConveniences<Collection, Requirement, Contract, Model>;
@@ -0,0 +1,118 @@
1
+ import type { Effect } from "effect";
2
+ import type { PrismaError } from "./error.js";
3
+ import type { PrismaRelationMethods } from "./relation/prisma-methods.js";
4
+
5
+ type AnyFunction = (...arguments_: ReadonlyArray<never>) => unknown;
6
+
7
+ export type CollectionResult<Collection> = Collection extends {
8
+ all(): infer Result;
9
+ }
10
+ ? Awaited<Result>
11
+ : never;
12
+
13
+ type NormalizeTerminal<Name, Result> = Name extends "first"
14
+ ? import("effect").Option.Option<Exclude<Result, null>>
15
+ : Result;
16
+
17
+ type WrapReturn<Name, Result, Requirement, Contract, Model extends string> =
18
+ Result extends PromiseLike<infer Value>
19
+ ? Effect.Effect<
20
+ NormalizeTerminal<Name, Awaited<Value>>,
21
+ PrismaError,
22
+ Requirement
23
+ >
24
+ : Result extends object
25
+ ? Relation<Result, Requirement, Contract, Model>
26
+ : never;
27
+
28
+ type WrapFunction<
29
+ Name,
30
+ Function_,
31
+ Requirement,
32
+ Contract,
33
+ Model extends string,
34
+ > = Function_ extends {
35
+ (...arguments_: infer Arguments1): infer Result1;
36
+ (...arguments_: infer Arguments2): infer Result2;
37
+ (...arguments_: infer Arguments3): infer Result3;
38
+ (...arguments_: infer Arguments4): infer Result4;
39
+ (...arguments_: infer Arguments5): infer Result5;
40
+ (...arguments_: infer Arguments6): infer Result6;
41
+ }
42
+ ? ((
43
+ ...arguments_: Arguments1
44
+ ) => WrapReturn<Name, Result1, Requirement, Contract, Model>) &
45
+ ((
46
+ ...arguments_: Arguments2
47
+ ) => WrapReturn<Name, Result2, Requirement, Contract, Model>) &
48
+ ((
49
+ ...arguments_: Arguments3
50
+ ) => WrapReturn<Name, Result3, Requirement, Contract, Model>) &
51
+ ((
52
+ ...arguments_: Arguments4
53
+ ) => WrapReturn<Name, Result4, Requirement, Contract, Model>) &
54
+ ((
55
+ ...arguments_: Arguments5
56
+ ) => WrapReturn<Name, Result5, Requirement, Contract, Model>) &
57
+ ((
58
+ ...arguments_: Arguments6
59
+ ) => WrapReturn<Name, Result6, Requirement, Contract, Model>)
60
+ : never;
61
+
62
+ type FunctionKeys<Value> = {
63
+ [Key in keyof Value]-?: Value[Key] extends AnyFunction ? Key : never;
64
+ }[keyof Value];
65
+
66
+ type ExplicitPrismaMethod =
67
+ | "aggregate"
68
+ | "avg"
69
+ | "combine"
70
+ | "count"
71
+ | "cursor"
72
+ | "delete"
73
+ | "deleteAll"
74
+ | "deleteCount"
75
+ | "distinct"
76
+ | "distinctOn"
77
+ | "groupBy"
78
+ | "include"
79
+ | "max"
80
+ | "min"
81
+ | "select"
82
+ | "sum"
83
+ | "variant";
84
+
85
+ type RelationMethods<
86
+ Collection,
87
+ Requirement,
88
+ Contract,
89
+ Model extends string,
90
+ > = {
91
+ readonly [Key in Exclude<
92
+ FunctionKeys<Collection>,
93
+ ExplicitPrismaMethod
94
+ >]: WrapFunction<Key, Collection[Key], Requirement, Contract, Model>;
95
+ };
96
+
97
+ declare const RelationQueryTypeId: unique symbol;
98
+
99
+ export type RelationQuery<
100
+ Value,
101
+ Requirement,
102
+ Contract,
103
+ Model extends string,
104
+ > = Effect.Effect<Value, PrismaError, Requirement> & {
105
+ readonly [RelationQueryTypeId]: {
106
+ readonly contract: Contract;
107
+ readonly model: Model;
108
+ };
109
+ };
110
+
111
+ export type Relation<
112
+ Collection,
113
+ Requirement,
114
+ Contract = undefined,
115
+ Model extends string = string,
116
+ > = RelationQuery<CollectionResult<Collection>, Requirement, Contract, Model> &
117
+ RelationMethods<Collection, Requirement, Contract, Model> &
118
+ PrismaRelationMethods<Collection, Requirement, Contract, Model>;
@@ -0,0 +1,28 @@
1
+ import type { Effect } from "effect";
2
+ import type { PrismaError } from "../error.js";
3
+ import { getDatabaseTesting } from "../internal/testing.js";
4
+ import type { AnyDatabase, DatabaseRequirement } from "./types.js";
5
+
6
+ type WithTestTransaction = {
7
+ <Database extends AnyDatabase>(
8
+ database: Database,
9
+ ): <A, E, R>(
10
+ program: Effect.Effect<A, E, R>,
11
+ ) => Effect.Effect<A, E | PrismaError, R | DatabaseRequirement<Database>>;
12
+ <Database extends AnyDatabase, A, E, R>(
13
+ database: Database,
14
+ program: Effect.Effect<A, E, R>,
15
+ ): Effect.Effect<A, E | PrismaError, R | DatabaseRequirement<Database>>;
16
+ };
17
+
18
+ export const withTestTransaction: WithTestTransaction = ((
19
+ database: AnyDatabase,
20
+ program?: Effect.Effect<unknown, unknown, unknown>,
21
+ ) => {
22
+ const run = (effect: Effect.Effect<unknown, unknown, unknown>) =>
23
+ getDatabaseTesting<DatabaseRequirement<typeof database>>(
24
+ database,
25
+ ).withTestTransaction(effect);
26
+
27
+ return program === undefined ? run : run(program);
28
+ }) as WithTestTransaction;
@@ -0,0 +1,67 @@
1
+ import type { TestContext, TestOptions, Vitest } from "@effect/vitest";
2
+ import type { Contract as PrismaContract } from "@prisma-next/contract/types";
3
+ import type { SqlStorage } from "@prisma-next/sql-contract/types";
4
+ import type { Effect, Layer } from "effect";
5
+ import type { DatabaseDefinition } from "../database.js";
6
+
7
+ type AnyPostgresContract = PrismaContract<SqlStorage>;
8
+
9
+ export type AnyDatabase = Effect.Effect<unknown, never, unknown> & {
10
+ readonly layer: (...arguments_: ReadonlyArray<never>) => Layer.Any;
11
+ };
12
+
13
+ export type DatabaseRequirement<Database> =
14
+ Database extends DatabaseDefinition<AnyPostgresContract, infer Requirement>
15
+ ? Requirement
16
+ : never;
17
+
18
+ export type DatabaseService<Database extends AnyDatabase> =
19
+ Effect.Success<Database>;
20
+
21
+ export type DatabaseTest<Database extends AnyDatabase, Provided> = <
22
+ A,
23
+ Eff extends Effect.Effect<unknown, unknown, Provided>,
24
+ >(
25
+ name: string,
26
+ body: (
27
+ database: DatabaseService<Database>,
28
+ context: TestContext,
29
+ ) => Generator<Eff, A, never>,
30
+ options?: number | TestOptions,
31
+ ) => void;
32
+
33
+ export interface DatabaseTester<Database extends AnyDatabase, Provided>
34
+ extends DatabaseTest<Database, Provided> {
35
+ readonly skip: DatabaseTest<Database, Provided>;
36
+ readonly skipIf: (condition: unknown) => DatabaseTest<Database, Provided>;
37
+ readonly runIf: (condition: unknown) => DatabaseTest<Database, Provided>;
38
+ readonly only: DatabaseTest<Database, Provided>;
39
+ readonly each: <Item>(
40
+ cases: ReadonlyArray<Item>,
41
+ ) => <A, Eff extends Effect.Effect<unknown, unknown, Provided>>(
42
+ name: string,
43
+ body: (
44
+ item: Item,
45
+ database: DatabaseService<Database>,
46
+ context: TestContext,
47
+ ) => Generator<Eff, A, never>,
48
+ options?: number | TestOptions,
49
+ ) => void;
50
+ readonly fails: DatabaseTest<Database, Provided>;
51
+ }
52
+
53
+ export type DatabaseIt<
54
+ Database extends AnyDatabase,
55
+ Provided,
56
+ > = Vitest.Methods & {
57
+ readonly effectDB: DatabaseTester<Database, Provided>;
58
+ };
59
+
60
+ export interface MakeDatabaseItOptions<
61
+ Database extends AnyDatabase,
62
+ Provided,
63
+ LayerError,
64
+ > {
65
+ readonly database: Database;
66
+ readonly layer: Layer.Layer<Provided, LayerError>;
67
+ }
@@ -0,0 +1,67 @@
1
+ import { it as effectIt } from "@effect/vitest";
2
+ import { Effect, Exit, Layer, Scope } from "effect";
3
+ import {
4
+ type FixtureTestApi,
5
+ fixtureName,
6
+ makeDatabaseTester,
7
+ } from "../internal/vitest-database.js";
8
+ import type {
9
+ AnyDatabase,
10
+ DatabaseIt,
11
+ DatabaseRequirement,
12
+ MakeDatabaseItOptions,
13
+ } from "./types.js";
14
+
15
+ export const makeDatabaseIt = <
16
+ Database extends AnyDatabase,
17
+ Provided,
18
+ LayerError,
19
+ >(
20
+ options: MakeDatabaseItOptions<Database, Provided, LayerError> & {
21
+ readonly layer: Layer.Layer<
22
+ Provided | DatabaseRequirement<Database> | Effect.Services<Database>,
23
+ LayerError
24
+ >;
25
+ },
26
+ ): DatabaseIt<
27
+ Database,
28
+ Provided | DatabaseRequirement<Database> | Effect.Services<Database>
29
+ > => {
30
+ type Services =
31
+ | Provided
32
+ | DatabaseRequirement<Database>
33
+ | Effect.Services<Database>;
34
+
35
+ const fixtureIt = effectIt.extend(
36
+ fixtureName,
37
+ { scope: "worker" },
38
+ // biome-ignore lint/correctness/noEmptyPattern: Vitest fixtures require a destructured context parameter.
39
+ async ({}, { onCleanup }) => {
40
+ const scope = Effect.runSync(Scope.make());
41
+ onCleanup(() => Effect.runPromise(Scope.close(scope, Exit.void)));
42
+
43
+ try {
44
+ return await Effect.runPromise(
45
+ Layer.buildWithScope(options.layer, scope),
46
+ );
47
+ } catch (error) {
48
+ await Effect.runPromise(Scope.close(scope, Exit.void));
49
+ throw error;
50
+ }
51
+ },
52
+ );
53
+
54
+ const effectDB = makeDatabaseTester(
55
+ fixtureIt as unknown as FixtureTestApi<Services>,
56
+ options.database,
57
+ );
58
+
59
+ return new Proxy(effectIt, {
60
+ get(target, property, receiver) {
61
+ if (property === "effectDB") {
62
+ return effectDB;
63
+ }
64
+ return Reflect.get(target, property, receiver);
65
+ },
66
+ }) as unknown as DatabaseIt<Database, Services>;
67
+ };
package/src/testing.ts ADDED
@@ -0,0 +1,8 @@
1
+ export { withTestTransaction } from "./testing/transaction.js";
2
+ export type {
3
+ DatabaseIt,
4
+ DatabaseTest,
5
+ DatabaseTester,
6
+ MakeDatabaseItOptions,
7
+ } from "./testing/types.js";
8
+ export { makeDatabaseIt } from "./testing/vitest.js";