@shivaedev/effect-prisma 0.0.0 → 0.1.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 (89) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/LICENSE +21 -0
  3. package/README.md +120 -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 +37 -0
  31. package/dist/internal/recipe.js.map +1 -0
  32. package/dist/internal/relation-runtime.d.ts +5 -0
  33. package/dist/internal/relation-runtime.d.ts.map +1 -0
  34. package/dist/internal/relation-runtime.js +88 -0
  35. package/dist/internal/relation-runtime.js.map +1 -0
  36. package/dist/internal/testing.d.ts +11 -0
  37. package/dist/internal/testing.d.ts.map +1 -0
  38. package/dist/internal/testing.js +9 -0
  39. package/dist/internal/testing.js.map +1 -0
  40. package/dist/internal/transaction.d.ts +14 -0
  41. package/dist/internal/transaction.d.ts.map +1 -0
  42. package/dist/internal/transaction.js +79 -0
  43. package/dist/internal/transaction.js.map +1 -0
  44. package/dist/internal/vitest-database.d.ts +18 -0
  45. package/dist/internal/vitest-database.d.ts.map +1 -0
  46. package/dist/internal/vitest-database.js +73 -0
  47. package/dist/internal/vitest-database.js.map +1 -0
  48. package/dist/relation/prisma-methods.d.ts +53 -0
  49. package/dist/relation/prisma-methods.d.ts.map +1 -0
  50. package/dist/relation/prisma-methods.js +2 -0
  51. package/dist/relation/prisma-methods.js.map +1 -0
  52. package/dist/relation.d.ts +27 -0
  53. package/dist/relation.d.ts.map +1 -0
  54. package/dist/relation.js +2 -0
  55. package/dist/relation.js.map +1 -0
  56. package/dist/testing/transaction.d.ts +10 -0
  57. package/dist/testing/transaction.d.ts.map +1 -0
  58. package/dist/testing/transaction.js +6 -0
  59. package/dist/testing/transaction.js.map +1 -0
  60. package/dist/testing/types.d.ts +29 -0
  61. package/dist/testing/types.d.ts.map +1 -0
  62. package/dist/testing/types.js +2 -0
  63. package/dist/testing/types.js.map +1 -0
  64. package/dist/testing/vitest.d.ts +6 -0
  65. package/dist/testing/vitest.d.ts.map +1 -0
  66. package/dist/testing/vitest.js +28 -0
  67. package/dist/testing/vitest.js.map +1 -0
  68. package/dist/testing.d.ts +4 -0
  69. package/dist/testing.d.ts.map +1 -0
  70. package/dist/testing.js +3 -0
  71. package/dist/testing.js.map +1 -0
  72. package/package.json +69 -4
  73. package/src/database.ts +232 -0
  74. package/src/error.ts +89 -0
  75. package/src/index.ts +14 -0
  76. package/src/internal/client-lifecycle.ts +31 -0
  77. package/src/internal/executor.ts +28 -0
  78. package/src/internal/promise.ts +16 -0
  79. package/src/internal/recipe.ts +71 -0
  80. package/src/internal/relation-runtime.ts +217 -0
  81. package/src/internal/testing.ts +32 -0
  82. package/src/internal/transaction.ts +149 -0
  83. package/src/internal/vitest-database.ts +210 -0
  84. package/src/relation/prisma-methods.ts +192 -0
  85. package/src/relation.ts +104 -0
  86. package/src/testing/transaction.ts +28 -0
  87. package/src/testing/types.ts +67 -0
  88. package/src/testing/vitest.ts +67 -0
  89. package/src/testing.ts +8 -0
@@ -0,0 +1,88 @@
1
+ import { Effect, Effectable, Option, Stream } from "effect";
2
+ import { isPrismaFailure, toPrismaError } from "../error.js";
3
+ import { fromPrismaPromise } from "./promise.js";
4
+ import { appendOperation, replayRecipe, rootRecipe, } from "./recipe.js";
5
+ const evaluateResult = (value, terminal) => {
6
+ if (terminal === "exists" &&
7
+ typeof value === "object" &&
8
+ value !== null &&
9
+ typeof Reflect.get(value, "first") === "function") {
10
+ const first = Reflect.apply(Reflect.get(value, "first"), value, []);
11
+ return fromPrismaPromise(() => first).pipe(Effect.map((result) => result !== null));
12
+ }
13
+ const executable = typeof value === "object" &&
14
+ value !== null &&
15
+ typeof Reflect.get(value, "all") === "function"
16
+ ? Reflect.apply(Reflect.get(value, "all"), value, [])
17
+ : value;
18
+ if (typeof executable === "object" &&
19
+ executable !== null &&
20
+ "then" in executable) {
21
+ return fromPrismaPromise(() => executable).pipe(Effect.map((result) => terminal === "first" ? Option.fromNullishOr(result) : result));
22
+ }
23
+ return Effect.succeed(executable);
24
+ };
25
+ const relationEffect = (self) => Effect.flatMap(self.runtime.executor, (executor) => Effect.suspend(() => evaluateResult(replayRecipe(executor.models, self.runtime.recipe), self.runtime.terminal))).pipe(Effect.withSpan(`prisma.${self.runtime.recipe.model}.${String(self.runtime.terminal ?? "all")}`, {
26
+ kind: "client",
27
+ attributes: {
28
+ "db.system": "postgresql",
29
+ "db.model": self.runtime.recipe.model,
30
+ "db.operation": String(self.runtime.terminal ?? "all"),
31
+ },
32
+ }));
33
+ const relationStream = (self) => {
34
+ const result = Effect.map(self.runtime.executor, (executor) => {
35
+ const collection = replayRecipe(executor.models, self.runtime.recipe);
36
+ if (typeof collection !== "object" ||
37
+ collection === null ||
38
+ typeof Reflect.get(collection, "all") !== "function") {
39
+ throw new TypeError("Only collection Relations can be streamed");
40
+ }
41
+ return Reflect.apply(Reflect.get(collection, "all"), collection, []);
42
+ });
43
+ return Stream.unwrap(Effect.map(result, (iterable) => Stream.fromAsyncIterable(iterable, (error) => error).pipe(Stream.catch((error) => isPrismaFailure(error)
44
+ ? Stream.fail(toPrismaError(error))
45
+ : Stream.die(error)))));
46
+ };
47
+ const RelationPrototype = {
48
+ ...Effectable.Prototype({
49
+ label: "EffectPrismaRelation",
50
+ evaluate() {
51
+ return relationEffect(this);
52
+ },
53
+ }),
54
+ get stream() {
55
+ return relationStream(this);
56
+ },
57
+ };
58
+ const makeRelationProxy = (runtime) => {
59
+ const target = Object.assign(Object.create(RelationPrototype), {
60
+ runtime,
61
+ });
62
+ return new Proxy(target, {
63
+ get(self, property, receiver) {
64
+ if (property === "then") {
65
+ return undefined;
66
+ }
67
+ if (Reflect.has(self, property)) {
68
+ return Reflect.get(self, property, receiver);
69
+ }
70
+ if (property === "exists") {
71
+ return () => makeRelationProxy({
72
+ ...runtime,
73
+ terminal: "exists",
74
+ });
75
+ }
76
+ return (...arguments_) => makeRelationProxy({
77
+ ...runtime,
78
+ recipe: appendOperation(runtime.recipe, property, arguments_),
79
+ terminal: property,
80
+ });
81
+ },
82
+ });
83
+ };
84
+ export const makeModelRelation = (executor, model) => makeRelationProxy({
85
+ executor,
86
+ recipe: rootRecipe(model),
87
+ });
88
+ //# sourceMappingURL=relation-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation-runtime.js","sourceRoot":"","sources":["../../src/internal/relation-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { Effect } from "effect";
2
+ import type { PrismaError } from "../error.js";
3
+ export declare const DatabaseTestingTypeId: unique symbol;
4
+ export interface DatabaseTesting<Requirement> {
5
+ readonly withTestTransaction: <A, E, R>(program: Effect.Effect<A, E, R>) => Effect.Effect<A, E | PrismaError, R | Requirement>;
6
+ }
7
+ export interface DatabaseWithTesting<Requirement> {
8
+ readonly [DatabaseTestingTypeId]: DatabaseTesting<Requirement>;
9
+ }
10
+ export declare const getDatabaseTesting: <Requirement>(database: object) => DatabaseTesting<Requirement>;
11
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../src/internal/testing.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,eAAO,MAAM,qBAAqB,EAAE,OAAO,MAE1C,CAAC;AAEF,MAAM,WAAW,eAAe,CAAC,WAAW;IAC3C,QAAQ,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACrC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,mBAAmB,CAAC,WAAW;IAC/C,QAAQ,CAAC,CAAC,qBAAqB,CAAC,EAAE,eAAe,CAAC,WAAW,CAAC,CAAC;CAC/D;AAED,eAAO,MAAM,kBAAkB,GAAI,WAAW,EAC7C,UAAU,MAAM,KACd,eAAe,CAAC,WAAW,CAY7B,CAAC"}
@@ -0,0 +1,9 @@
1
+ export const DatabaseTestingTypeId = Symbol.for("@shivaedev/effect-prisma/DatabaseTesting");
2
+ export const getDatabaseTesting = (database) => {
3
+ const testing = Reflect.get(database, DatabaseTestingTypeId);
4
+ if (testing === undefined) {
5
+ throw new TypeError("The database was not created by this copy of @shivaedev/effect-prisma");
6
+ }
7
+ return testing;
8
+ };
9
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../../src/internal/testing.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,qBAAqB,GAAkB,MAAM,CAAC,GAAG,CAC7D,0CAA0C,CAC1C,CAAC;AAYF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CACjC,QAAgB,EACe,EAAE;IACjC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,qBAAqB,CAE/C,CAAC;IAEb,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,IAAI,SAAS,CAClB,uEAAuE,CACvE,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AAChB,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { PostgresClient } from "@prisma-next/postgres/runtime";
2
+ import type { RuntimeConnection, RuntimeTransaction } from "@prisma-next/sql-runtime";
3
+ import { Effect, Exit } from "effect";
4
+ import type { PrismaError } from "../error.js";
5
+ import type { AnyPostgresContract, DatabaseExecutor } from "./executor.js";
6
+ export interface TransactionResource<Models extends object, Contract extends AnyPostgresContract> {
7
+ readonly connection: RuntimeConnection;
8
+ readonly transaction: RuntimeTransaction;
9
+ readonly executor: DatabaseExecutor<Models, Contract>;
10
+ }
11
+ export declare const acquireTransaction: <Models extends object, Contract extends AnyPostgresContract>(current: DatabaseExecutor<Models, Contract>, models: (orm: PostgresClient<Contract>["orm"]) => Models) => Effect.Effect<TransactionResource<Models, Contract>, PrismaError>;
12
+ export declare const releaseTransaction: <Models extends object, Contract extends AnyPostgresContract, A, E>(resource: TransactionResource<Models, Contract>, exit: Exit.Exit<A, E>) => Effect.Effect<void, PrismaError>;
13
+ export declare const releaseTestTransaction: <Models extends object, Contract extends AnyPostgresContract, A, E>(resource: TransactionResource<Models, Contract>, exit: Exit.Exit<A, E>) => Effect.Effect<void, PrismaError>;
14
+ //# sourceMappingURL=transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/internal/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEpE,OAAO,KAAK,EACX,iBAAiB,EACjB,kBAAkB,EAClB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC/C,OAAO,KAAK,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAG3E,MAAM,WAAW,mBAAmB,CACnC,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,mBAAmB;IAEpC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC;IACvC,QAAQ,CAAC,WAAW,EAAE,kBAAkB,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;CACtD;AASD,eAAO,MAAM,kBAAkB,GAC9B,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,mBAAmB,EAEpC,SAAS,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC3C,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,KAAK,MAAM,KACtD,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,CAwBhE,CAAC;AAEJ,eAAO,MAAM,kBAAkB,GAC9B,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,mBAAmB,EACpC,CAAC,EACD,CAAC,EAED,UAAU,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC/C,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,KACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAA4C,CAAC;AAE/E,eAAO,MAAM,sBAAsB,GAClC,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,mBAAmB,EACpC,CAAC,EACD,CAAC,EAED,UAAU,mBAAmB,CAAC,MAAM,EAAE,QAAQ,CAAC,EAC/C,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,KACnB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAA6C,CAAC"}
@@ -0,0 +1,79 @@
1
+ import { orm } from "@prisma-next/sql-orm-client";
2
+ import { Effect, Exit } from "effect";
3
+ import { fromPrismaPromise } from "./promise.js";
4
+ const runtimeFailure = (code, cause, details) => Object.assign(new Error(code, { cause }), { code, ...details });
5
+ export const acquireTransaction = (current, models) => fromPrismaPromise(async () => {
6
+ const connection = await current.client.runtime().connection();
7
+ try {
8
+ const transaction = await connection.transaction();
9
+ const transactionOrm = orm({
10
+ runtime: transaction,
11
+ context: current.client.context,
12
+ });
13
+ return {
14
+ connection,
15
+ transaction,
16
+ executor: {
17
+ client: current.client,
18
+ models: models(transactionOrm),
19
+ transactional: true,
20
+ },
21
+ };
22
+ }
23
+ catch (error) {
24
+ await connection.destroy(error).catch(() => undefined);
25
+ throw error;
26
+ }
27
+ });
28
+ export const releaseTransaction = (resource, exit) => settleTransaction(resource, exit, true);
29
+ export const releaseTestTransaction = (resource, exit) => settleTransaction(resource, exit, false);
30
+ const settleTransaction = (resource, exit, commitOnSuccess) => Effect.uninterruptible(fromPrismaPromise(async () => {
31
+ let disposed = false;
32
+ let failure;
33
+ const destroy = async (reason) => {
34
+ if (disposed) {
35
+ return;
36
+ }
37
+ disposed = true;
38
+ await resource.connection.destroy(reason).catch(() => undefined);
39
+ };
40
+ if (commitOnSuccess && Exit.isSuccess(exit)) {
41
+ try {
42
+ await resource.transaction.commit();
43
+ }
44
+ catch (commitError) {
45
+ try {
46
+ await resource.transaction.rollback();
47
+ }
48
+ catch {
49
+ await destroy(commitError);
50
+ }
51
+ failure = runtimeFailure("RUNTIME.TRANSACTION_COMMIT_FAILED", commitError);
52
+ }
53
+ }
54
+ else {
55
+ try {
56
+ await resource.transaction.rollback();
57
+ }
58
+ catch (rollbackError) {
59
+ await destroy(rollbackError);
60
+ failure = runtimeFailure("RUNTIME.TRANSACTION_ROLLBACK_FAILED", rollbackError);
61
+ }
62
+ }
63
+ if (!disposed) {
64
+ try {
65
+ await resource.connection.release();
66
+ }
67
+ catch (releaseError) {
68
+ await destroy(releaseError);
69
+ if (failure !== undefined) {
70
+ throw runtimeFailure("RUNTIME.TRANSACTION_RELEASE_FAILED", failure, { releaseError });
71
+ }
72
+ throw releaseError;
73
+ }
74
+ }
75
+ if (failure !== undefined) {
76
+ throw failure;
77
+ }
78
+ }));
79
+ //# sourceMappingURL=transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/internal/transaction.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { TestContext, TestOptions } from "@effect/vitest";
2
+ import { type Context, Effect } from "effect";
3
+ import type { AnyDatabase, DatabaseRequirement, DatabaseTester } from "../testing/types.js";
4
+ export declare const fixtureName = "__effectPrismaContext";
5
+ export type DatabaseFixture<Provided> = TestContext & {
6
+ readonly [fixtureName]: Context.Context<Provided>;
7
+ };
8
+ export interface FixtureTestApi<Provided> {
9
+ (name: string, options: TestOptions, body: (context: DatabaseFixture<Provided>) => Promise<unknown>): void;
10
+ readonly skip: FixtureTestApi<Provided>;
11
+ readonly skipIf: (condition: unknown) => FixtureTestApi<Provided>;
12
+ readonly runIf: (condition: unknown) => FixtureTestApi<Provided>;
13
+ readonly only: FixtureTestApi<Provided>;
14
+ readonly fails: FixtureTestApi<Provided>;
15
+ readonly for: <Item>(cases: ReadonlyArray<Item>) => (name: string, options: TestOptions, body: (item: Item, context: DatabaseFixture<Provided>) => Promise<unknown>) => void;
16
+ }
17
+ export declare const makeDatabaseTester: <Database extends AnyDatabase, Provided>(fixtureIt: FixtureTestApi<Provided | DatabaseRequirement<Database> | Effect.Services<Database>>, database: Database) => DatabaseTester<Database, Provided | DatabaseRequirement<Database> | Effect.Services<Database>>;
18
+ //# sourceMappingURL=vitest-database.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest-database.d.ts","sourceRoot":"","sources":["../../src/internal/vitest-database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,EAA2B,MAAM,QAAQ,CAAC;AAI9E,OAAO,KAAK,EACX,WAAW,EACX,mBAAmB,EAGnB,cAAc,EACd,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,WAAW,0BAA0B,CAAC;AAEnD,MAAM,MAAM,eAAe,CAAC,QAAQ,IAAI,WAAW,GAAG;IACrD,QAAQ,CAAC,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,WAAW,cAAc,CAAC,QAAQ;IACvC,CACC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAC5D,IAAI,CAAC;IACR,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClE,QAAQ,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAClB,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,KACtB,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,KACtE,IAAI,CAAC;CACV;AAwCD,eAAO,MAAM,kBAAkB,GAAI,QAAQ,SAAS,WAAW,EAAE,QAAQ,EACxE,WAAW,cAAc,CACxB,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CACpE,EACD,UAAU,QAAQ,KAChB,cAAc,CAChB,QAAQ,EACR,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CA6HpE,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { Cause, Effect, Exit, Layer } from "effect";
2
+ import * as TestClock from "effect/testing/TestClock";
3
+ import * as TestConsole from "effect/testing/TestConsole";
4
+ import { withTestTransaction } from "../testing/transaction.js";
5
+ export const fixtureName = "__effectPrismaContext";
6
+ const TestEnvironment = Layer.mergeAll(TestConsole.layer, TestClock.layer());
7
+ const contextFrom = (context) => context[fixtureName];
8
+ const runEffectTest = (effect, context) => Effect.runPromise(Effect.gen(function* () {
9
+ const exit = yield* Effect.exit(effect);
10
+ if (Exit.isFailure(exit)) {
11
+ for (const error of Cause.prettyErrors(exit.cause)) {
12
+ yield* Effect.logError(error);
13
+ }
14
+ }
15
+ return yield* exit;
16
+ }).pipe(Effect.scoped, Effect.provide(TestEnvironment)), { signal: context.signal });
17
+ const normalizeTestOptions = (options) => typeof options === "number" ? { timeout: options } : (options ?? {});
18
+ const restoreContext = (fixture, context) => ({
19
+ ...context,
20
+ [fixtureName]: fixture,
21
+ });
22
+ export const makeDatabaseTester = (fixtureIt, database) => {
23
+ const run = (body, context) => {
24
+ const effect = withTestTransaction(database, Effect.gen(function* () {
25
+ const service = yield* database;
26
+ return yield* Effect.gen(() => body(service, context));
27
+ })).pipe(Effect.provide(contextFrom(context)));
28
+ // The callback constraint proves that its services are in the built
29
+ // Layer. TypeScript cannot reduce that generic Exclude after
30
+ // Effect.provide, so the runner closes the type at this private boundary.
31
+ return effect;
32
+ };
33
+ const register = (current) => (name, body, options) => current(name, normalizeTestOptions(options), ({ __effectPrismaContext, task, signal, onTestFailed, onTestFinished, skip, annotate, expect, _local, }) => {
34
+ const testContext = restoreContext(__effectPrismaContext, {
35
+ task,
36
+ signal,
37
+ onTestFailed,
38
+ onTestFinished,
39
+ skip,
40
+ annotate,
41
+ expect,
42
+ _local,
43
+ });
44
+ return runEffectTest(run(body, testContext), testContext);
45
+ });
46
+ const make = (current) => {
47
+ const test = register(current);
48
+ return Object.assign(test, {
49
+ skip: register(current.skip),
50
+ skipIf: (condition) => register(current.skipIf(condition)),
51
+ runIf: (condition) => register(current.runIf(condition)),
52
+ only: register(current.only),
53
+ each: (cases) => {
54
+ return (name, body, options) => fixtureIt.for(cases)(name, normalizeTestOptions(options), (item, { __effectPrismaContext, task, signal, onTestFailed, onTestFinished, skip, annotate, expect, _local, }) => {
55
+ const testContext = restoreContext(__effectPrismaContext, {
56
+ task,
57
+ signal,
58
+ onTestFailed,
59
+ onTestFinished,
60
+ skip,
61
+ annotate,
62
+ expect,
63
+ _local,
64
+ });
65
+ return runEffectTest(run((service, testContext) => body(item, service, testContext), testContext), testContext);
66
+ });
67
+ },
68
+ fails: register(current.fails),
69
+ });
70
+ };
71
+ return make(fixtureIt);
72
+ };
73
+ //# sourceMappingURL=vitest-database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest-database.js","sourceRoot":"","sources":["../../src/internal/vitest-database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { Contract as PrismaContract } from "@prisma-next/contract/types";
2
+ import type { SqlStorage } from "@prisma-next/sql-contract/types";
3
+ import type { AggregateBuilder, AggregateResult, AggregateSpec, DefaultModelRow, GroupedCollection, Collection as PrismaCollection } from "@prisma-next/sql-orm-client";
4
+ import type { Effect, Stream } from "effect";
5
+ import type { PrismaError } from "../error.js";
6
+ import type { CollectionResult, Relation } from "../relation.js";
7
+ type AnyFunction = (...arguments_: ReadonlyArray<never>) => unknown;
8
+ type AnyPostgresContract = PrismaContract<SqlStorage>;
9
+ type FieldTuple<Row> = readonly [keyof Row & string, ...(keyof Row & string)[]];
10
+ type Simplify<Value> = {
11
+ [Key in keyof Value]: Value[Key];
12
+ };
13
+ type TerminalMethod<Method, Requirement> = Method extends (...arguments_: infer Arguments) => PromiseLike<infer Value> ? (...arguments_: Arguments) => Effect.Effect<Awaited<Value>, PrismaError, Requirement> : never;
14
+ type SelectMethod<Collection, Requirement, Contract, Model extends string> = Contract extends AnyPostgresContract ? Collection extends PrismaCollection<Contract, Model, infer _Row, infer State> ? {
15
+ select<Fields extends FieldTuple<DefaultModelRow<Contract, Model>>>(...fields: Fields): Relation<PrismaCollection<Contract, Model, Pick<DefaultModelRow<Contract, Model>, Fields[number]>, State>, Requirement, Contract, Model>;
16
+ } : Record<never, never> : Collection extends {
17
+ select: infer Select extends AnyFunction;
18
+ } ? {
19
+ select: Select extends (...arguments_: infer Arguments) => infer Result ? (...arguments_: Arguments) => Result extends object ? Relation<Result, Requirement, Contract, Model> : never : never;
20
+ } : Record<never, never>;
21
+ type AggregateConfigure<Collection> = Collection extends {
22
+ aggregate: infer Method extends AnyFunction;
23
+ } ? Exclude<Parameters<Method>[1], undefined> : never;
24
+ type AggregateSuccess<Collection, Contract extends AnyPostgresContract, Model extends string, Spec extends AggregateSpec> = Collection extends GroupedCollection<Contract, Model, infer Fields extends FieldTuple<DefaultModelRow<Contract, Model>>> ? Array<Simplify<Pick<DefaultModelRow<Contract, Model>, Fields[number]> & AggregateResult<Spec>>> : AggregateResult<Spec>;
25
+ type AggregateMethod<Collection, Requirement, Contract, Model extends string> = Contract extends AnyPostgresContract ? Collection extends {
26
+ aggregate: AnyFunction;
27
+ } ? {
28
+ aggregate<Spec extends AggregateSpec>(make: (aggregate: AggregateBuilder<Contract, Model>) => Spec, configure?: AggregateConfigure<Collection>): Effect.Effect<AggregateSuccess<Collection, Contract, Model, Spec>, PrismaError, Requirement>;
29
+ } : Record<never, never> : Record<never, never>;
30
+ type CollectionMethods<Collection, Requirement, Contract, Model extends string> = Contract extends AnyPostgresContract ? Collection extends PrismaCollection<Contract, Model, infer _Row, infer State> ? {
31
+ groupBy<Fields extends FieldTuple<DefaultModelRow<Contract, Model>>>(...fields: Fields): Relation<GroupedCollection<Contract, Model, Fields>, Requirement, Contract, Model>;
32
+ cursor(values: State extends {
33
+ readonly hasOrderBy: true;
34
+ } ? Partial<Record<keyof DefaultModelRow<Contract, Model> & string, unknown>> : never): Relation<Collection, Requirement, Contract, Model>;
35
+ distinct<Fields extends FieldTuple<DefaultModelRow<Contract, Model>>>(...fields: Fields): Relation<Collection, Requirement, Contract, Model>;
36
+ distinctOn<Fields extends FieldTuple<DefaultModelRow<Contract, Model>>>(...fields: State extends {
37
+ readonly hasOrderBy: true;
38
+ } ? Fields : never): Relation<Collection, Requirement, Contract, Model>;
39
+ } & (State extends {
40
+ readonly hasWhere: true;
41
+ } ? {
42
+ readonly [Key in "delete" | "deleteAll" | "deleteCount"]: TerminalMethod<Collection[Key], Requirement>;
43
+ } : Record<never, never>) : Record<never, never> : Record<never, never>;
44
+ type CollectionConveniences<Collection, Requirement, Contract, Model extends string> = Contract extends AnyPostgresContract ? Collection extends PrismaCollection<Contract, Model, infer Row, infer _State> ? {
45
+ readonly stream: Stream.Stream<Row, PrismaError, Requirement>;
46
+ exists(): Effect.Effect<boolean, PrismaError, Requirement>;
47
+ } : Record<never, never> : CollectionResult<Collection> extends ReadonlyArray<infer Row> ? {
48
+ readonly stream: Stream.Stream<Row, PrismaError, Requirement>;
49
+ exists(): Effect.Effect<boolean, PrismaError, Requirement>;
50
+ } : Record<never, never>;
51
+ export type PrismaRelationMethods<Collection, Requirement, Contract, Model extends string> = SelectMethod<Collection, Requirement, Contract, Model> & AggregateMethod<Collection, Requirement, Contract, Model> & CollectionMethods<Collection, Requirement, Contract, Model> & CollectionConveniences<Collection, Requirement, Contract, Model>;
52
+ export {};
53
+ //# sourceMappingURL=prisma-methods.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-methods.d.ts","sourceRoot":"","sources":["../../src/relation/prisma-methods.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=prisma-methods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prisma-methods.js","sourceRoot":"","sources":["../../src/relation/prisma-methods.ts"],"names":[],"mappings":""}
@@ -0,0 +1,27 @@
1
+ import type { Effect } from "effect";
2
+ import type { PrismaError } from "./error.js";
3
+ import type { PrismaRelationMethods } from "./relation/prisma-methods.js";
4
+ type AnyFunction = (...arguments_: ReadonlyArray<never>) => unknown;
5
+ export type CollectionResult<Collection> = Collection extends {
6
+ all(): infer Result;
7
+ } ? Awaited<Result> : never;
8
+ type NormalizeTerminal<Name, Result> = Name extends "first" ? import("effect").Option.Option<Exclude<Result, null>> : Result;
9
+ type WrapReturn<Name, Result, Requirement, Contract, Model extends string> = Result extends PromiseLike<infer Value> ? Effect.Effect<NormalizeTerminal<Name, Awaited<Value>>, PrismaError, Requirement> : Result extends object ? Relation<Result, Requirement, Contract, Model> : never;
10
+ type WrapFunction<Name, Function_, Requirement, Contract, Model extends string> = Function_ extends {
11
+ (...arguments_: infer Arguments1): infer Result1;
12
+ (...arguments_: infer Arguments2): infer Result2;
13
+ (...arguments_: infer Arguments3): infer Result3;
14
+ (...arguments_: infer Arguments4): infer Result4;
15
+ (...arguments_: infer Arguments5): infer Result5;
16
+ (...arguments_: infer Arguments6): infer Result6;
17
+ } ? ((...arguments_: Arguments1) => WrapReturn<Name, Result1, Requirement, Contract, Model>) & ((...arguments_: Arguments2) => WrapReturn<Name, Result2, Requirement, Contract, Model>) & ((...arguments_: Arguments3) => WrapReturn<Name, Result3, Requirement, Contract, Model>) & ((...arguments_: Arguments4) => WrapReturn<Name, Result4, Requirement, Contract, Model>) & ((...arguments_: Arguments5) => WrapReturn<Name, Result5, Requirement, Contract, Model>) & ((...arguments_: Arguments6) => WrapReturn<Name, Result6, Requirement, Contract, Model>) : never;
18
+ type FunctionKeys<Value> = {
19
+ [Key in keyof Value]-?: Value[Key] extends AnyFunction ? Key : never;
20
+ }[keyof Value];
21
+ type ExplicitPrismaMethod = "aggregate" | "avg" | "combine" | "count" | "cursor" | "delete" | "deleteAll" | "deleteCount" | "distinct" | "distinctOn" | "groupBy" | "include" | "max" | "min" | "select" | "sum" | "variant";
22
+ type RelationMethods<Collection, Requirement, Contract, Model extends string> = {
23
+ readonly [Key in Exclude<FunctionKeys<Collection>, ExplicitPrismaMethod>]: WrapFunction<Key, Collection[Key], Requirement, Contract, Model>;
24
+ };
25
+ export type Relation<Collection, Requirement, Contract = undefined, Model extends string = string> = Effect.Effect<CollectionResult<Collection>, PrismaError, Requirement> & RelationMethods<Collection, Requirement, Contract, Model> & PrismaRelationMethods<Collection, Requirement, Contract, Model>;
26
+ export {};
27
+ //# sourceMappingURL=relation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation.d.ts","sourceRoot":"","sources":["../src/relation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=relation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation.js","sourceRoot":"","sources":["../src/relation.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import type { Effect } from "effect";
2
+ import type { PrismaError } from "../error.js";
3
+ import type { AnyDatabase, DatabaseRequirement } from "./types.js";
4
+ type WithTestTransaction = {
5
+ <Database extends AnyDatabase>(database: Database): <A, E, R>(program: Effect.Effect<A, E, R>) => Effect.Effect<A, E | PrismaError, R | DatabaseRequirement<Database>>;
6
+ <Database extends AnyDatabase, A, E, R>(database: Database, program: Effect.Effect<A, E, R>): Effect.Effect<A, E | PrismaError, R | DatabaseRequirement<Database>>;
7
+ };
8
+ export declare const withTestTransaction: WithTestTransaction;
9
+ export {};
10
+ //# sourceMappingURL=transaction.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/testing/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEnE,KAAK,mBAAmB,GAAG;IAC1B,CAAC,QAAQ,SAAS,WAAW,EAC5B,QAAQ,EAAE,QAAQ,GAChB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACV,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC3B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC1E,CAAC,QAAQ,SAAS,WAAW,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EACrC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAC7B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC;CACxE,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,mBAUT,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { getDatabaseTesting } from "../internal/testing.js";
2
+ export const withTestTransaction = ((database, program) => {
3
+ const run = (effect) => getDatabaseTesting(database).withTestTransaction(effect);
4
+ return program === undefined ? run : run(program);
5
+ });
6
+ //# sourceMappingURL=transaction.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../../src/testing/transaction.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAe5D,MAAM,CAAC,MAAM,mBAAmB,GAAwB,CAAC,CACxD,QAAqB,EACrB,OAAkD,EACjD,EAAE;IACH,MAAM,GAAG,GAAG,CAAC,MAAgD,EAAE,EAAE,CAChE,kBAAkB,CACjB,QAAQ,CACR,CAAC,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE/B,OAAO,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AACnD,CAAC,CAAwB,CAAC"}
@@ -0,0 +1,29 @@
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
+ type AnyPostgresContract = PrismaContract<SqlStorage>;
7
+ export type AnyDatabase = Effect.Effect<unknown, never, unknown> & {
8
+ readonly layer: (...arguments_: ReadonlyArray<never>) => Layer.Any;
9
+ };
10
+ export type DatabaseRequirement<Database> = Database extends DatabaseDefinition<AnyPostgresContract, infer Requirement> ? Requirement : never;
11
+ export type DatabaseService<Database extends AnyDatabase> = Effect.Success<Database>;
12
+ export type DatabaseTest<Database extends AnyDatabase, Provided> = <A, Eff extends Effect.Effect<unknown, unknown, Provided>>(name: string, body: (database: DatabaseService<Database>, context: TestContext) => Generator<Eff, A, never>, options?: number | TestOptions) => void;
13
+ export interface DatabaseTester<Database extends AnyDatabase, Provided> extends DatabaseTest<Database, Provided> {
14
+ readonly skip: DatabaseTest<Database, Provided>;
15
+ readonly skipIf: (condition: unknown) => DatabaseTest<Database, Provided>;
16
+ readonly runIf: (condition: unknown) => DatabaseTest<Database, Provided>;
17
+ readonly only: DatabaseTest<Database, Provided>;
18
+ readonly each: <Item>(cases: ReadonlyArray<Item>) => <A, Eff extends Effect.Effect<unknown, unknown, Provided>>(name: string, body: (item: Item, database: DatabaseService<Database>, context: TestContext) => Generator<Eff, A, never>, options?: number | TestOptions) => void;
19
+ readonly fails: DatabaseTest<Database, Provided>;
20
+ }
21
+ export type DatabaseIt<Database extends AnyDatabase, Provided> = Vitest.Methods & {
22
+ readonly effectDB: DatabaseTester<Database, Provided>;
23
+ };
24
+ export interface MakeDatabaseItOptions<Database extends AnyDatabase, Provided, LayerError> {
25
+ readonly database: Database;
26
+ readonly layer: Layer.Layer<Provided, LayerError>;
27
+ }
28
+ export {};
29
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import { Effect, Layer } from "effect";
2
+ import type { AnyDatabase, DatabaseIt, DatabaseRequirement, MakeDatabaseItOptions } from "./types.js";
3
+ export declare const makeDatabaseIt: <Database extends AnyDatabase, Provided, LayerError>(options: MakeDatabaseItOptions<Database, Provided, LayerError> & {
4
+ readonly layer: Layer.Layer<Provided | DatabaseRequirement<Database> | Effect.Services<Database>, LayerError>;
5
+ }) => DatabaseIt<Database, Provided | DatabaseRequirement<Database> | Effect.Services<Database>>;
6
+ //# sourceMappingURL=vitest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../../src/testing/vitest.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAQ,KAAK,EAAS,MAAM,QAAQ,CAAC;AAMpD,OAAO,KAAK,EACX,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,qBAAqB,EACrB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,cAAc,GAC1B,QAAQ,SAAS,WAAW,EAC5B,QAAQ,EACR,UAAU,EAEV,SAAS,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,GAAG;IAChE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAC1B,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACpE,UAAU,CACV,CAAC;CACF,KACC,UAAU,CACZ,QAAQ,EACR,QAAQ,GAAG,mBAAmB,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAuCpE,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { it as effectIt } from "@effect/vitest";
2
+ import { Effect, Exit, Layer, Scope } from "effect";
3
+ import { fixtureName, makeDatabaseTester, } from "../internal/vitest-database.js";
4
+ export const makeDatabaseIt = (options) => {
5
+ const fixtureIt = effectIt.extend(fixtureName, { scope: "worker" },
6
+ // biome-ignore lint/correctness/noEmptyPattern: Vitest fixtures require a destructured context parameter.
7
+ async ({}, { onCleanup }) => {
8
+ const scope = Effect.runSync(Scope.make());
9
+ onCleanup(() => Effect.runPromise(Scope.close(scope, Exit.void)));
10
+ try {
11
+ return await Effect.runPromise(Layer.buildWithScope(options.layer, scope));
12
+ }
13
+ catch (error) {
14
+ await Effect.runPromise(Scope.close(scope, Exit.void));
15
+ throw error;
16
+ }
17
+ });
18
+ const effectDB = makeDatabaseTester(fixtureIt, options.database);
19
+ return new Proxy(effectIt, {
20
+ get(target, property, receiver) {
21
+ if (property === "effectDB") {
22
+ return effectDB;
23
+ }
24
+ return Reflect.get(target, property, receiver);
25
+ },
26
+ });
27
+ };
28
+ //# sourceMappingURL=vitest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.js","sourceRoot":"","sources":["../../src/testing/vitest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,EAEN,WAAW,EACX,kBAAkB,GAClB,MAAM,gCAAgC,CAAC;AAQxC,MAAM,CAAC,MAAM,cAAc,GAAG,CAK7B,OAKC,EAIA,EAAE;IAMH,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAChC,WAAW,EACX,EAAE,KAAK,EAAE,QAAQ,EAAE;IACnB,0GAA0G;IAC1G,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3C,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAElE,IAAI,CAAC;YACJ,OAAO,MAAM,MAAM,CAAC,UAAU,CAC7B,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAC1C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACvD,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC,CACD,CAAC;IAEF,MAAM,QAAQ,GAAG,kBAAkB,CAClC,SAAgD,EAChD,OAAO,CAAC,QAAQ,CAChB,CAAC;IAEF,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE;QAC1B,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ;YAC7B,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;gBAC7B,OAAO,QAAQ,CAAC;YACjB,CAAC;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC;KACD,CAA8C,CAAC;AACjD,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { withTestTransaction } from "./testing/transaction.js";
2
+ export type { DatabaseIt, DatabaseTest, DatabaseTester, MakeDatabaseItOptions, } from "./testing/types.js";
3
+ export { makeDatabaseIt } from "./testing/vitest.js";
4
+ //# sourceMappingURL=testing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,YAAY,EACX,UAAU,EACV,YAAY,EACZ,cAAc,EACd,qBAAqB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { withTestTransaction } from "./testing/transaction.js";
2
+ export { makeDatabaseIt } from "./testing/vitest.js";
3
+ //# sourceMappingURL=testing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAO/D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC"}