@shivaedev/effect-prisma 0.5.3 → 0.6.2

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 +38 -0
  2. package/README.md +32 -10
  3. package/dist/database.d.ts +6 -6
  4. package/dist/database.d.ts.map +1 -1
  5. package/dist/database.js +9 -2
  6. package/dist/database.js.map +1 -1
  7. package/dist/index.d.ts +1 -1
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/internal/database-factory.d.ts +20 -22
  11. package/dist/internal/database-factory.d.ts.map +1 -1
  12. package/dist/internal/database-factory.js +83 -24
  13. package/dist/internal/database-factory.js.map +1 -1
  14. package/dist/internal/executor.d.ts +9 -7
  15. package/dist/internal/executor.d.ts.map +1 -1
  16. package/dist/internal/query-execution.d.ts +3 -4
  17. package/dist/internal/query-execution.d.ts.map +1 -1
  18. package/dist/internal/query-execution.js +9 -3
  19. package/dist/internal/query-execution.js.map +1 -1
  20. package/dist/internal/recipe.d.ts +1 -1
  21. package/dist/internal/recipe.d.ts.map +1 -1
  22. package/dist/internal/recipe.js +22 -9
  23. package/dist/internal/recipe.js.map +1 -1
  24. package/dist/internal/relation-plan.d.ts +6 -1
  25. package/dist/internal/relation-plan.d.ts.map +1 -1
  26. package/dist/internal/relation-plan.js +6 -5
  27. package/dist/internal/relation-plan.js.map +1 -1
  28. package/dist/internal/relation-runtime.d.ts +4 -3
  29. package/dist/internal/relation-runtime.d.ts.map +1 -1
  30. package/dist/internal/relation-runtime.js +38 -19
  31. package/dist/internal/relation-runtime.js.map +1 -1
  32. package/dist/internal/relation-stream.d.ts +3 -4
  33. package/dist/internal/relation-stream.d.ts.map +1 -1
  34. package/dist/internal/relation-stream.js +23 -21
  35. package/dist/internal/relation-stream.js.map +1 -1
  36. package/dist/internal/testing.d.ts +5 -5
  37. package/dist/internal/testing.d.ts.map +1 -1
  38. package/dist/internal/testing.js.map +1 -1
  39. package/dist/internal/transaction.d.ts +6 -3
  40. package/dist/internal/transaction.d.ts.map +1 -1
  41. package/dist/internal/transaction.js +14 -4
  42. package/dist/internal/transaction.js.map +1 -1
  43. package/dist/relation/include.d.ts +10 -8
  44. package/dist/relation/include.d.ts.map +1 -1
  45. package/dist/relation/prisma-methods.d.ts +20 -20
  46. package/dist/relation/prisma-methods.d.ts.map +1 -1
  47. package/dist/relation.d.ts +8 -7
  48. package/dist/relation.d.ts.map +1 -1
  49. package/dist/sqlite.d.ts +6 -6
  50. package/dist/sqlite.d.ts.map +1 -1
  51. package/dist/sqlite.js +12 -3
  52. package/dist/sqlite.js.map +1 -1
  53. package/dist/testing/transaction.d.ts +3 -3
  54. package/dist/testing/transaction.d.ts.map +1 -1
  55. package/dist/testing/transaction.js.map +1 -1
  56. package/dist/testing/types.d.ts +6 -4
  57. package/dist/testing/types.d.ts.map +1 -1
  58. package/dist/testing/vitest.d.ts +4 -4
  59. package/dist/testing/vitest.d.ts.map +1 -1
  60. package/dist/testing/vitest.js +8 -16
  61. package/dist/testing/vitest.js.map +1 -1
  62. package/dist/testing.d.ts +1 -1
  63. package/dist/testing.d.ts.map +1 -1
  64. package/dist/testing.js.map +1 -1
  65. package/package.json +3 -2
  66. package/src/database.ts +53 -47
  67. package/src/index.ts +0 -1
  68. package/src/internal/database-factory.ts +221 -98
  69. package/src/internal/executor.ts +9 -15
  70. package/src/internal/query-execution.ts +14 -6
  71. package/src/internal/recipe.ts +46 -7
  72. package/src/internal/relation-plan.ts +11 -11
  73. package/src/internal/relation-runtime.ts +67 -65
  74. package/src/internal/relation-stream.ts +54 -48
  75. package/src/internal/testing.ts +8 -8
  76. package/src/internal/transaction.ts +80 -56
  77. package/src/relation/include.ts +31 -22
  78. package/src/relation/prisma-methods.ts +27 -31
  79. package/src/relation.ts +19 -27
  80. package/src/sqlite.ts +62 -54
  81. package/src/testing/transaction.ts +16 -6
  82. package/src/testing/types.ts +6 -4
  83. package/src/testing/vitest.ts +19 -40
  84. package/src/testing.ts +0 -1
  85. package/dist/internal/vitest-database.d.ts +0 -18
  86. package/dist/internal/vitest-database.d.ts.map +0 -1
  87. package/dist/internal/vitest-database.js +0 -73
  88. package/dist/internal/vitest-database.js.map +0 -1
  89. package/src/internal/vitest-database.ts +0 -210
package/CHANGELOG.md CHANGED
@@ -2,6 +2,44 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.6.2 - 2026-08-31
6
+
7
+ ### Fixed
8
+
9
+ - Coordinate finite root SQLite query effects with explicit transaction
10
+ lifetimes so a transaction cannot lose its WAL snapshot to an interleaved
11
+ root write.
12
+
13
+ ## 0.6.1 - 2026-08-30
14
+
15
+ ### Changed
16
+
17
+ - Build `makeDatabaseIt` on `@shivaedev/effect-test` instead of a private
18
+ Vitest runner.
19
+
20
+ ### Added
21
+
22
+ - Accept `clock: "live"` on `makeDatabaseIt` and `effectDB` tests to use
23
+ wall-clock time instead of TestClock.
24
+
25
+ ## 0.6.0 - 2026-08-27
26
+
27
+ ### Changed
28
+
29
+ - **Breaking:** Make Database the only public persistence service. Relations
30
+ and Streams no longer expose an executor requirement. Transaction bodies
31
+ yield Database, while captured Relations from that singleton resolve the
32
+ private active transaction when executed inside the boundary.
33
+ - **Breaking:** Construct database definitions with `makeDatabase<Contract>()`
34
+ or `makeSqliteDatabase<Contract>()` so two databases sharing one contract
35
+ retain distinct service identities. Composition uses one unique definition
36
+ identifier and one live Layer per definition.
37
+ - Refuse forced-rollback test transactions nested inside ordinary commit
38
+ transactions, and fail closed when transaction-bound values escape their
39
+ settled boundary or cross into a concurrent sibling transaction.
40
+ - Serialize SQLite transaction scopes inside the supported singleton Database
41
+ Layer while leaving ordinary queries and writes unsynchronized.
42
+
5
43
  ## 0.5.3 - 2026-08-12
6
44
 
7
45
  ### Changed
package/README.md CHANGED
@@ -29,7 +29,7 @@ instead of silently producing weakened types.
29
29
  import { makeDatabase } from "@shivaedev/effect-prisma"
30
30
  import { contractJson, type Contract } from "./generated/contract.js"
31
31
 
32
- export const Database = makeDatabase<Contract>("@app/Database", {
32
+ export const Database = makeDatabase<Contract>()("@app/Database", {
33
33
  contractJson,
34
34
  })
35
35
 
@@ -38,7 +38,13 @@ export const DatabaseLive = Database.layer({
38
38
  })
39
39
  ```
40
40
 
41
- The Layer owns the PostgreSQL client and closes it with its Effect scope.
41
+ Each identifier names one exported Database definition, and each composed
42
+ runtime provides one live Layer for that definition. Reuse that singleton;
43
+ duplicate identifiers and multiple simultaneous Layers for one definition are
44
+ outside the supported composition.
45
+
46
+ The Layer owns the PostgreSQL client and closes it with its structured Effect
47
+ scope. Database values do not outlive that scope.
42
48
 
43
49
  ## SQLite (experimental)
44
50
 
@@ -50,7 +56,7 @@ normalization step above is PostgreSQL-only.
50
56
  import { makeSqliteDatabase } from "@shivaedev/effect-prisma/sqlite"
51
57
  import { contractJson, type Contract } from "./generated/contract.js"
52
58
 
53
- export const Database = makeSqliteDatabase<Contract>("@app/Database", {
59
+ export const Database = makeSqliteDatabase<Contract>()("@app/Database", {
54
60
  contractJson,
55
61
  })
56
62
 
@@ -66,8 +72,11 @@ per transaction, so in-memory databases are rejected.
66
72
 
67
73
  That driver is synchronous. Queries block the event loop while they run, and
68
74
  because SQLite allows a single writer, overlapping write transactions wait for
69
- `busy_timeout` before failing with a transient `PrismaConnectionFailure`.
70
- Serialize write transactions in the application.
75
+ `busy_timeout` while blocking that event loop. The supported Database Layer
76
+ therefore serializes finite root query effects and explicit transaction
77
+ lifetimes through one access permit. Transaction-internal queries use a private
78
+ permit for their single connection, while root Streams remain incremental. Do
79
+ not coordinate multiple Database Layers against the same SQLite file.
71
80
 
72
81
  SQLite stores `DateTime` as text, and `prisma-next db init` generates
73
82
  `DEFAULT (datetime('now'))`, which writes a UTC instant without a zone
@@ -100,7 +109,8 @@ const program = Effect.gen(function* () {
100
109
  ```
101
110
 
102
111
  Relations are lazy and immutable. Reusing or branching a Relation never changes
103
- the original, and each execution resolves the active database context again.
112
+ the original, and each Relation closes over the Database implementation that
113
+ created it.
104
114
 
105
115
  Relations can be loaded directly or refined with another immutable Relation:
106
116
 
@@ -163,13 +173,24 @@ yield* db.transaction(
163
173
  )
164
174
  ```
165
175
 
176
+ Relations from the singleton Database resolve its active transaction when they
177
+ execute, so a Relation created before the boundary still participates when used
178
+ inside it. The Database yielded inside the body is the transaction-bound
179
+ implementation for methods constructed there. A transaction-bound Database or
180
+ Relation is valid only inside that boundary and fails closed if used after
181
+ settlement.
182
+
166
183
  Nested package transactions reuse the active transaction. Successful programs
167
- commit; failure, defect, and interruption roll back.
184
+ commit; failure, defect, and interruption roll back. A forced-rollback test
185
+ transaction inside an ordinary commit transaction is refused because the
186
+ drivers do not provide the savepoint semantics that promise would require.
168
187
 
169
188
  Queries composed concurrently inside a transaction are executed one at a time
170
189
  on its single connection. Once a transaction query starts, interruption waits
171
- for it to settle before releasing that connection. Query effects outside
172
- transactions remain parallel.
190
+ for it to settle before releasing that connection. PostgreSQL query effects
191
+ outside transactions remain parallel. SQLite root query effects execute one at
192
+ a time and do not overlap an explicit transaction lifetime, so a root write
193
+ cannot invalidate the transaction's WAL snapshot.
173
194
 
174
195
  Transaction-scoped Streams are read into memory before emitting rows. This
175
196
  releases the connection before downstream Stream effects run database queries.
@@ -209,4 +230,5 @@ it.effectDB("creates a user", function* (db) {
209
230
  ```
210
231
 
211
232
  `effectDB` supports the usual `skip`, `skipIf`, `runIf`, `only`, `each`, and
212
- `fails` variants. `withTestTransaction` is also exported for custom harnesses.
233
+ `fails` variants. Tests install TestClock unless you pass `clock: "live"`.
234
+ `withTestTransaction` is also exported for custom harnesses.
@@ -1,9 +1,9 @@
1
1
  import { type PostgresOptionsBase } from "@prisma-next/postgres/runtime";
2
2
  import { type Layer, Redacted } from "effect";
3
3
  import type { PrismaError } from "./error.js";
4
- import { type DatabaseIdentifier, type DatabaseServiceHolder, type DefaultModels } from "./internal/database-factory.js";
5
- import type { AnySqlContract, ExecutorIdentifier } from "./internal/executor.js";
6
- export type { AnyDatabase, DatabaseRequirement, DatabaseService, DatabaseServiceOf, } from "./internal/database-factory.js";
4
+ import { type DatabaseIdentifier, type DatabaseIdentifierLiteral, type DatabaseServiceHolder } from "./internal/database-factory.js";
5
+ import type { AnySqlContract } from "./internal/executor.js";
6
+ export type { AnyDatabase, DatabaseService, DatabaseServiceOf, } from "./internal/database-factory.js";
7
7
  export interface DatabaseLayerOptions extends PostgresOptionsBase {
8
8
  readonly url: string | Redacted.Redacted<string>;
9
9
  }
@@ -14,8 +14,8 @@ type DatabaseFactoryOptions<Contract extends AnySqlContract> = {
14
14
  readonly contractJson: unknown;
15
15
  readonly contract?: never;
16
16
  };
17
- export interface DatabaseDefinition<Contract extends AnySqlContract, Requirement = ExecutorIdentifier<DefaultModels<Contract>>> extends DatabaseServiceHolder<Contract, Requirement> {
18
- readonly layer: (options: DatabaseLayerOptions) => Layer.Layer<DatabaseIdentifier<Contract> | Requirement, PrismaError>;
17
+ export interface DatabaseDefinition<Contract extends AnySqlContract, Identifier extends string> extends DatabaseServiceHolder<Contract, Identifier> {
18
+ readonly layer: (options: DatabaseLayerOptions) => Layer.Layer<DatabaseIdentifier<Contract, Identifier>, PrismaError>;
19
19
  }
20
- export declare const makeDatabase: <const Contract extends AnySqlContract>(identifier: string, options: DatabaseFactoryOptions<Contract>) => DatabaseDefinition<Contract>;
20
+ export declare const makeDatabase: <const Contract extends AnySqlContract>() => <const Identifier extends string>(identifier: DatabaseIdentifierLiteral<Identifier>, options: DatabaseFactoryOptions<Contract>) => DatabaseDefinition<Contract, Identifier>;
21
21
  //# sourceMappingURL=database.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAiB,EAEhB,KAAK,mBAAmB,EACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,KAAK,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAGlB,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EACX,cAAc,EACd,kBAAkB,EAClB,MAAM,wBAAwB,CAAC;AAGhC,YAAY,EACX,WAAW,EACX,mBAAmB,EACnB,eAAe,EACf,iBAAiB,GACjB,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAChE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;CACjD;AAED,KAAK,sBAAsB,CAAC,QAAQ,SAAS,cAAc,IACxD;IACA,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;CAC7B,GACD;IACA,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;CACzB,CAAC;AAEL,MAAM,WAAW,kBAAkB,CAClC,QAAQ,SAAS,cAAc,EAC/B,WAAW,GAAG,kBAAkB,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC,CACxD,SAAQ,qBAAqB,CAAC,QAAQ,EAAE,WAAW,CAAC;IACrD,QAAQ,CAAC,KAAK,EAAE,CACf,OAAO,EAAE,oBAAoB,KACzB,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,CAAC,GAAG,WAAW,EAAE,WAAW,CAAC,CAAC;CAC1E;AAMD,eAAO,MAAM,YAAY,GAAI,KAAK,CAAC,QAAQ,SAAS,cAAc,EACjE,YAAY,MAAM,EAClB,SAAS,sBAAsB,CAAC,QAAQ,CAAC,KACvC,kBAAkB,CAAC,QAAQ,CAqC7B,CAAC"}
1
+ {"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAiB,EAEhB,KAAK,mBAAmB,EACxB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,KAAK,KAAK,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAI1B,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,YAAY,EACX,WAAW,EACX,eAAe,EACf,iBAAiB,GACjB,MAAM,gCAAgC,CAAC;AAExC,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAChE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;CACjD;AAED,KAAK,sBAAsB,CAAC,QAAQ,SAAS,cAAc,IACxD;IACA,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC;CAC7B,GACD;IACA,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;CACzB,CAAC;AAEL,MAAM,WAAW,kBAAkB,CAClC,QAAQ,SAAS,cAAc,EAC/B,UAAU,SAAS,MAAM,CACxB,SAAQ,qBAAqB,CAAC,QAAQ,EAAE,UAAU,CAAC;IACpD,QAAQ,CAAC,KAAK,EAAE,CACf,OAAO,EAAE,oBAAoB,KACzB,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,CAAC;CACxE;AAMD,eAAO,MAAM,YAAY,GACvB,KAAK,CAAC,QAAQ,SAAS,cAAc,QACrC,KAAK,CAAC,UAAU,SAAS,MAAM,EAC/B,YAAY,yBAAyB,CAAC,UAAU,CAAC,EACjD,SAAS,sBAAsB,CAAC,QAAQ,CAAC,KACvC,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CA4CzC,CAAC"}
package/dist/database.js CHANGED
@@ -4,7 +4,7 @@ import { acquireConnectedClient } from "./internal/client-lifecycle.js";
4
4
  import { makeSqlDatabase, namespaceModels, } from "./internal/database-factory.js";
5
5
  import { fromPrismaPromise } from "./internal/promise.js";
6
6
  const defaultModels = (client) => namespaceModels(client.contract, client.orm);
7
- export const makeDatabase = (identifier, options) => {
7
+ export const makeDatabase = () => (identifier, options) => {
8
8
  return makeSqlDatabase(identifier, (layerOptions) => {
9
9
  const clientOptions = {
10
10
  url: typeof layerOptions.url === "string"
@@ -26,9 +26,16 @@ export const makeDatabase = (identifier, options) => {
26
26
  });
27
27
  return fromPrismaPromise(() => acquireConnectedClient(client, () => ({
28
28
  client,
29
+ identity: {},
30
+ liveness: {
31
+ closedCode: "RUNTIME.DATABASE_CLOSED",
32
+ open: true,
33
+ },
34
+ mode: "root",
29
35
  models: defaultModels(client),
30
36
  querySemaphore: undefined,
31
- transactional: false,
37
+ transactionIdentity: undefined,
38
+ transactionSemaphore: undefined,
32
39
  })));
33
40
  });
34
41
  };
@@ -1 +1 @@
1
- {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EAGhB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAc,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAIN,eAAe,EACf,eAAe,GACf,MAAM,gCAAgC,CAAC;AAKxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAgC1D,MAAM,aAAa,GAAG,CACrB,MAA0D,EACjD,EAAE,CAAC,eAAe,CAAmB,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,YAAY,GAAG,CAC3B,UAAkB,EAClB,OAAyC,EACV,EAAE;IAGjC,OAAO,eAAe,CACrB,UAAU,EACV,CAAC,YAAY,EAAE,EAAE;QAChB,MAAM,aAAa,GAAG;YACrB,GAAG,EACF,OAAO,YAAY,CAAC,GAAG,KAAK,QAAQ;gBACnC,CAAC,CAAC,YAAY,CAAC,GAAG;gBAClB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC;YACpC,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,YAAY,EAAE,YAAY,CAAC,YAAY;SACvC,CAAC;QACF,MAAM,MAAM,GACX,OAAO,CAAC,QAAQ,KAAK,SAAS;YAC7B,CAAC,CAAC,QAAQ,CAAW;gBACnB,GAAG,aAAa;gBAChB,YAAY,EAAE,OAAO,CAAC,YAAY;aAClC,CAAC;YACH,CAAC,CAAC,QAAQ,CAAW;gBACnB,GAAG,aAAa;gBAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC1B,CAAC,CAAC;QAEN,OAAO,iBAAiB,CAAC,GAAG,EAAE,CAC7B,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACrC,MAAM;YACN,MAAM,EAAE,aAAa,CAAmB,MAAM,CAAC;YAC/C,cAAc,EAAE,SAAS;YACzB,aAAa,EAAE,KAAK;SACpB,CAAC,CAAC,CACH,CAAC;IACH,CAAC,CAC+B,CAAC;AACnC,CAAC,CAAC"}
1
+ {"version":3,"file":"database.js","sourceRoot":"","sources":["../src/database.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,EAAE,EAGhB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAc,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AACxE,OAAO,EAKN,eAAe,EACf,eAAe,GACf,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AA+B1D,MAAM,aAAa,GAAG,CACrB,MAA0D,EACjD,EAAE,CAAC,eAAe,CAAmB,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;AAE5E,MAAM,CAAC,MAAM,YAAY,GACxB,GAA0C,EAAE,CAC5C,CACC,UAAiD,EACjD,OAAyC,EACE,EAAE;IAG7C,OAAO,eAAe,CACrB,UAAU,EACV,CAAC,YAAY,EAAE,EAAE;QAChB,MAAM,aAAa,GAAG;YACrB,GAAG,EACF,OAAO,YAAY,CAAC,GAAG,KAAK,QAAQ;gBACnC,CAAC,CAAC,YAAY,CAAC,GAAG;gBAClB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,CAAC;YACpC,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,WAAW,EAAE,YAAY,CAAC,WAAW;YACrC,YAAY,EAAE,YAAY,CAAC,YAAY;SACvC,CAAC;QACF,MAAM,MAAM,GACX,OAAO,CAAC,QAAQ,KAAK,SAAS;YAC7B,CAAC,CAAC,QAAQ,CAAW;gBACnB,GAAG,aAAa;gBAChB,YAAY,EAAE,OAAO,CAAC,YAAY;aAClC,CAAC;YACH,CAAC,CAAC,QAAQ,CAAW;gBACnB,GAAG,aAAa;gBAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC1B,CAAC,CAAC;QAEN,OAAO,iBAAiB,CAAC,GAAG,EAAE,CAC7B,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;YACrC,MAAM;YACN,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE;gBACT,UAAU,EAAE,yBAAyB;gBACrC,IAAI,EAAE,IAAI;aACV;YACD,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,aAAa,CAAmB,MAAM,CAAC;YAC/C,cAAc,EAAE,SAAS;YACzB,mBAAmB,EAAE,SAAS;YAC9B,oBAAoB,EAAE,SAAS;SAC/B,CAAC,CAAC,CACH,CAAC;IACH,CAAC,CAC2C,CAAC;AAC/C,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  export { all, and, not, or } from "@prisma-next/sql-orm-client";
2
- export { type AnyDatabase, type DatabaseDefinition, type DatabaseLayerOptions, type DatabaseRequirement, type DatabaseService, type DatabaseServiceOf, makeDatabase, } from "./database.js";
2
+ export { type AnyDatabase, type DatabaseDefinition, type DatabaseLayerOptions, type DatabaseService, type DatabaseServiceOf, makeDatabase, } from "./database.js";
3
3
  export { PrismaConnectionFailure, PrismaError, type PrismaErrorReason, PrismaQueryFailure, PrismaRuntimeFailure, } from "./error.js";
4
4
  export type { Relation } from "./relation.js";
5
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,YAAY,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,uBAAuB,EACvB,WAAW,EACX,KAAK,iBAAiB,EACtB,kBAAkB,EAClB,oBAAoB,GACpB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EACN,KAAK,WAAW,EAChB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,iBAAiB,EACtB,YAAY,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,uBAAuB,EACvB,WAAW,EACX,KAAK,iBAAiB,EACtB,kBAAkB,EAClB,oBAAoB,GACpB,MAAM,YAAY,CAAC;AACpB,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAON,YAAY,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,uBAAuB,EACvB,WAAW,EAEX,kBAAkB,EAClB,oBAAoB,GACpB,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAMN,YAAY,GACZ,MAAM,eAAe,CAAC;AACvB,OAAO,EACN,uBAAuB,EACvB,WAAW,EAEX,kBAAkB,EAClB,oBAAoB,GACpB,MAAM,YAAY,CAAC"}
@@ -1,41 +1,39 @@
1
1
  import type { orm } from "@prisma-next/sql-orm-client";
2
2
  import { Context, Effect, Layer } from "effect";
3
- import type { PrismaError } from "../error.js";
3
+ import { type PrismaError } from "../error.js";
4
4
  import type { Relation } from "../relation.js";
5
- import type { AnySqlContract, DatabaseExecutor, ExecutorIdentifier } from "./executor.js";
5
+ import type { AnySqlContract, DatabaseExecutor } from "./executor.js";
6
6
  import { type TransactionOrm } from "./transaction.js";
7
7
  type OrmFor<Contract extends AnySqlContract> = ReturnType<typeof orm<Contract>>;
8
8
  type DefaultNamespaceId<Contract extends AnySqlContract> = "__unbound__" extends keyof OrmFor<Contract> ? "__unbound__" : "public" extends keyof OrmFor<Contract> ? "public" : keyof OrmFor<Contract>;
9
9
  export type DefaultModels<Contract extends AnySqlContract> = OrmFor<Contract>[DefaultNamespaceId<Contract>] extends infer Models extends object ? Models : never;
10
- export interface DatabaseIdentifier<Contract extends AnySqlContract> {
11
- readonly _contract: Contract;
12
- readonly _databaseIdentifier: unique symbol;
10
+ type IsUnion<Value, Whole = Value> = Value extends unknown ? [Whole] extends [Value] ? false : true : never;
11
+ type IsSingletonString<Value extends string> = Record<never, never> extends Record<Value, never> ? false : true;
12
+ export type DatabaseIdentifierLiteral<Identifier extends string> = [
13
+ Identifier
14
+ ] extends [`\0@shivaedev/effect-prisma/internal/${string}`] ? never : string extends Identifier ? never : true extends IsUnion<Identifier> ? never : IsSingletonString<Identifier> extends true ? Identifier : never;
15
+ export interface DatabaseIdentifier<Contract extends AnySqlContract, Identifier extends string> {
16
+ readonly _contract: (contract: Contract) => Contract;
17
+ readonly _databaseIdentifier: (identifier: Identifier) => Identifier;
13
18
  }
14
- type DatabaseModels<Contract extends AnySqlContract, Requirement> = {
15
- readonly [Model in keyof DefaultModels<Contract>]: Relation<DefaultModels<Contract>[Model], Requirement, Contract, Model & string>;
19
+ type DatabaseModels<Contract extends AnySqlContract, Identifier extends string> = {
20
+ readonly [Model in keyof DefaultModels<Contract>]: Relation<DefaultModels<Contract>[Model], Contract, Model & string, DatabaseIdentifier<Contract, Identifier>>;
16
21
  };
17
- export type DatabaseService<Contract extends AnySqlContract, Requirement> = DatabaseModels<Contract, Requirement> & {
18
- transaction<A, E, R>(program: Effect.Effect<A, E, R>): Effect.Effect<A, E | PrismaError, R | Requirement>;
22
+ export type DatabaseService<Contract extends AnySqlContract, Identifier extends string> = DatabaseModels<Contract, Identifier> & {
23
+ transaction<A, E, R>(program: Effect.Effect<A, E, R> & (DatabaseIdentifier<Contract, Identifier> extends R ? unknown : never)): Effect.Effect<A, E | PrismaError, Exclude<R, DatabaseIdentifier<Contract, Identifier>>>;
19
24
  };
20
25
  /**
21
26
  * The driver-independent part of a database definition: the Context service
22
27
  * carrying the typed facade. Driver entrypoints add their own `layer` options.
23
28
  */
24
- export interface DatabaseServiceHolder<Contract extends AnySqlContract, Requirement = ExecutorIdentifier<DefaultModels<Contract>>> extends Context.Service<DatabaseIdentifier<Contract>, DatabaseService<Contract, Requirement>> {
29
+ export interface DatabaseServiceHolder<Contract extends AnySqlContract, Identifier extends string> extends Context.Service<DatabaseIdentifier<Contract, Identifier>, DatabaseService<Contract, Identifier>> {
25
30
  }
26
31
  export type AnyDatabase = Effect.Effect<unknown, never, unknown> & {
27
32
  readonly layer: (...arguments_: ReadonlyArray<never>) => Layer.Any;
28
33
  };
29
- /**
30
- * `Context.Service` is invariant in both of its parameters, so a holder built
31
- * for a concrete contract never matches `DatabaseServiceHolder<AnySqlContract,
32
- * …>`. The contract has to be inferred alongside the requirement, or the
33
- * conditional falls through to `never` for every real database.
34
- */
35
- export type DatabaseRequirement<Database> = Database extends DatabaseServiceHolder<infer _Contract extends AnySqlContract, infer Requirement> ? Requirement : never;
36
34
  export type DatabaseServiceOf<Database extends AnyDatabase> = Effect.Success<Database>;
37
- export interface SqlDatabase<Contract extends AnySqlContract, Options> extends DatabaseServiceHolder<Contract> {
38
- readonly layer: (options: Options) => Layer.Layer<DatabaseIdentifier<Contract> | ExecutorIdentifier<DefaultModels<Contract>>, PrismaError>;
35
+ export interface SqlDatabase<Contract extends AnySqlContract, Identifier extends string, Options> extends DatabaseServiceHolder<Contract, Identifier> {
36
+ readonly layer: (options: Options) => Layer.Layer<DatabaseIdentifier<Contract, Identifier>, PrismaError>;
39
37
  }
40
38
  /**
41
39
  * Resolve the models of the single domain namespace from a namespaced ORM
@@ -44,9 +42,9 @@ export interface SqlDatabase<Contract extends AnySqlContract, Options> extends D
44
42
  */
45
43
  export declare const namespaceModels: <Contract extends AnySqlContract, Models extends object>(contract: Contract, namespacedOrm: TransactionOrm<Contract>) => Models;
46
44
  /**
47
- * Assemble the database service, its Executor service, and its Layer around a
48
- * driver-specific executor acquisition.
45
+ * Assemble the database service and its Layer around a driver-specific
46
+ * executor acquisition.
49
47
  */
50
- export declare const makeSqlDatabase: <const Contract extends AnySqlContract, Options>(identifier: string, acquireExecutor: (options: Options) => Effect.Effect<DatabaseExecutor<DefaultModels<Contract>, Contract>, PrismaError>) => SqlDatabase<Contract, Options>;
48
+ export declare const makeSqlDatabase: <const Contract extends AnySqlContract, const Identifier extends string, Options>(identifier: DatabaseIdentifierLiteral<Identifier>, acquireExecutor: (options: Options) => Effect.Effect<DatabaseExecutor<DefaultModels<Contract>, Contract>, PrismaError>) => SqlDatabase<Contract, Identifier, Options>;
51
49
  export {};
52
50
  //# sourceMappingURL=database-factory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"database-factory.d.ts","sourceRoot":"","sources":["../../src/internal/database-factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database-factory.d.ts","sourceRoot":"","sources":["../../src/internal/database-factory.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,11 @@
1
1
  import { Context, Effect, Layer } from "effect";
2
+ import { toPrismaError } from "../error.js";
2
3
  import { assertAvailableModelNames } from "./client-lifecycle.js";
3
4
  import { makeModelRelation } from "./relation-runtime.js";
4
5
  import { DatabaseTestingTypeId } from "./testing.js";
5
- import { acquireTransaction, releaseTestTransaction, releaseTransaction, } from "./transaction.js";
6
+ import { acquireTransaction, releaseTestTransaction, releaseTransaction, withTransactionSemaphore, } from "./transaction.js";
7
+ const internalContextIdentifierPrefix = "\0@shivaedev/effect-prisma/internal/";
8
+ let activeTransactionReferenceSequence = 0;
6
9
  /**
7
10
  * Resolve the models of the single domain namespace from a namespaced ORM
8
11
  * client. Prisma Next namespaces PostgreSQL models under their schema and
@@ -17,36 +20,92 @@ export const namespaceModels = (contract, namespacedOrm) => {
17
20
  return Reflect.get(namespacedOrm, namespaces[0]);
18
21
  };
19
22
  /**
20
- * Assemble the database service, its Executor service, and its Layer around a
21
- * driver-specific executor acquisition.
23
+ * Assemble the database service and its Layer around a driver-specific
24
+ * executor acquisition.
22
25
  */
23
26
  export const makeSqlDatabase = (identifier, acquireExecutor) => {
24
- const Executor = Context.Service(`${identifier}/Executor`);
27
+ if (identifier.startsWith(internalContextIdentifierPrefix)) {
28
+ throw new TypeError("Database identifier uses a reserved internal namespace");
29
+ }
25
30
  const Service = Context.Service(identifier);
26
- const scopedTransaction = (release, span) => (program) => Effect.flatMap(Executor, (current) => {
27
- if (current.transactional) {
28
- return program;
31
+ const executors = new WeakMap();
32
+ const ActiveTransaction = Context.Reference(`${internalContextIdentifierPrefix}ActiveTransaction/${activeTransactionReferenceSequence++}`, { defaultValue: () => undefined });
33
+ const executorOf = (facade) => {
34
+ const executor = executors.get(facade);
35
+ return executor === undefined
36
+ ? Effect.die(new TypeError("The database service was not created by its database Layer"))
37
+ : Effect.succeed(executor);
38
+ };
39
+ const runTransaction = (current, currentFacade, program, release, mode, span) => {
40
+ if (!current.liveness.open) {
41
+ return Effect.fail(toPrismaError({ code: current.liveness.closedCode }));
29
42
  }
30
- return Effect.acquireUseRelease(acquireTransaction(current, (transactionOrm) => namespaceModels(current.client.contract, transactionOrm)), (resource) => program.pipe(Effect.provideService(Executor, resource.executor)), release).pipe(Effect.withSpan(span, { kind: "client" }));
31
- });
32
- const transaction = scopedTransaction(releaseTransaction, "prisma.transaction");
33
- const withTestTransaction = scopedTransaction(releaseTestTransaction, "prisma.testTransaction");
34
- const facade = new Proxy(Object.assign(Object.create(null), {
35
- transaction,
36
- }), {
37
- get(target, property, receiver) {
38
- if (Reflect.has(target, property)) {
39
- return Reflect.get(target, property, receiver);
40
- }
41
- if (typeof property !== "string") {
42
- return undefined;
43
+ if (current.mode === "test" ||
44
+ (current.mode === "transaction" && mode === "transaction")) {
45
+ return Effect.provideService(program, Service, currentFacade);
46
+ }
47
+ if (current.mode === "transaction") {
48
+ return Effect.fail(toPrismaError({
49
+ code: "RUNTIME.TEST_TRANSACTION_INSIDE_TRANSACTION_UNSUPPORTED",
50
+ }));
51
+ }
52
+ const transaction = Effect.acquireUseRelease(acquireTransaction(current, (transactionOrm) => namespaceModels(current.client.contract, transactionOrm), mode), (resource) => {
53
+ const transactionFacade = makeFacade(resource.executor);
54
+ return program.pipe(Effect.provideService(Service, transactionFacade), Effect.provideService(ActiveTransaction, {
55
+ executor: resource.executor,
56
+ facade: transactionFacade,
57
+ }));
58
+ }, release).pipe(Effect.withSpan(span, { kind: "client" }));
59
+ return withTransactionSemaphore(current.transactionSemaphore, transaction);
60
+ };
61
+ function makeFacade(current) {
62
+ let facade;
63
+ const resolveActiveTransaction = Effect.flatMap(ActiveTransaction, (active) => {
64
+ if (current.mode === "root") {
65
+ return Effect.succeed(active ?? { executor: current, facade });
43
66
  }
44
- return makeModelRelation(Executor, property);
45
- },
67
+ return active?.executor === current
68
+ ? Effect.succeed(active)
69
+ : Effect.fail(toPrismaError({
70
+ code: "RUNTIME.TRANSACTION_CONTEXT_MISMATCH",
71
+ }));
72
+ });
73
+ const resolveExecutor = Effect.suspend(() => current.liveness.open
74
+ ? Effect.map(resolveActiveTransaction, ({ executor }) => executor)
75
+ : Effect.succeed(current));
76
+ const target = Object.assign(Object.create(null), {
77
+ transaction: (program) => Effect.suspend(() => {
78
+ if (!current.liveness.open) {
79
+ return Effect.fail(toPrismaError({ code: current.liveness.closedCode }));
80
+ }
81
+ return Effect.flatMap(resolveActiveTransaction, (selected) => {
82
+ return runTransaction(selected.executor, selected.facade, program, releaseTransaction, "transaction", "prisma.transaction");
83
+ });
84
+ }),
85
+ });
86
+ facade = new Proxy(target, {
87
+ get(target, property, receiver) {
88
+ if (Reflect.has(target, property)) {
89
+ return Reflect.get(target, property, receiver);
90
+ }
91
+ if (typeof property !== "string") {
92
+ return undefined;
93
+ }
94
+ return makeModelRelation(current, property, resolveExecutor);
95
+ },
96
+ });
97
+ executors.set(facade, current);
98
+ return facade;
99
+ }
100
+ const withTestTransaction = (program) => Effect.flatMap(Service, (facade) => {
101
+ return Effect.flatMap(executorOf(facade), (current) => runTransaction(current, facade, program, releaseTestTransaction, "test", "prisma.testTransaction"));
46
102
  });
47
103
  const layer = (layerOptions) => {
48
- const acquire = Effect.acquireRelease(Effect.suspend(() => acquireExecutor(layerOptions)), (executor) => Effect.promise(() => executor.client.close()).pipe(Effect.orDie));
49
- return Layer.effectContext(Effect.map(acquire, (executor) => Context.make(Executor, executor).pipe(Context.add(Service, facade))));
104
+ const acquire = Effect.acquireRelease(Effect.suspend(() => acquireExecutor(layerOptions)), (executor) => {
105
+ executor.liveness.open = false;
106
+ return Effect.promise(() => executor.client.close()).pipe(Effect.orDie);
107
+ });
108
+ return Layer.effect(Service)(Effect.map(acquire, makeFacade));
50
109
  };
51
110
  return Object.assign(Service, {
52
111
  layer,
@@ -1 +1 @@
1
- {"version":3,"file":"database-factory.js","sourceRoot":"","sources":["../../src/internal/database-factory.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"database-factory.js","sourceRoot":"","sources":["../../src/internal/database-factory.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import type { Contract as PrismaContract } from "@prisma-next/contract/types";
2
2
  import type { SqlStorage } from "@prisma-next/sql-contract/types";
3
3
  import type { ExecutionContext, Runtime } from "@prisma-next/sql-runtime";
4
- import type { Context, Semaphore } from "effect";
4
+ import type { Semaphore } from "effect";
5
5
  export type AnySqlContract = PrismaContract<SqlStorage>;
6
6
  export type AnyPostgresContract = AnySqlContract;
7
7
  /**
@@ -16,13 +16,15 @@ export interface SqlDatabaseClient<Contract extends AnySqlContract> {
16
16
  }
17
17
  export interface DatabaseExecutor<Models extends object, Contract extends AnySqlContract = AnySqlContract> {
18
18
  readonly client: SqlDatabaseClient<Contract>;
19
+ readonly identity: object;
20
+ readonly liveness: {
21
+ readonly closedCode: string;
22
+ open: boolean;
23
+ };
24
+ readonly mode: "root" | "test" | "transaction";
19
25
  readonly models: Models;
20
26
  readonly querySemaphore: Semaphore.Semaphore | undefined;
21
- readonly transactional: boolean;
22
- }
23
- export type ExecutorService<Models extends object, Contract extends AnySqlContract = AnySqlContract> = Context.Service<ExecutorIdentifier<Models>, DatabaseExecutor<Models, Contract>>;
24
- export interface ExecutorIdentifier<Models extends object> {
25
- readonly _models: Models;
26
- readonly _executorIdentifier: unique symbol;
27
+ readonly transactionIdentity: object | undefined;
28
+ readonly transactionSemaphore: Semaphore.Semaphore | undefined;
27
29
  }
28
30
  //# sourceMappingURL=executor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/internal/executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEjD,MAAM,MAAM,cAAc,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;AACxD,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAEjD;;;GAGG;AACH,MAAM,WAAW,iBAAiB,CAAC,QAAQ,SAAS,cAAc;IACjE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC7C,OAAO,IAAI,OAAO,CAAC;IACnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB,CAChC,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,cAAc,GAAG,cAAc;IAEhD,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC7C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;IACzD,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,MAAM,eAAe,CAC1B,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,cAAc,GAAG,cAAc,IAC7C,OAAO,CAAC,OAAO,CAClB,kBAAkB,CAAC,MAAM,CAAC,EAC1B,gBAAgB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAClC,CAAC;AAEF,MAAM,WAAW,kBAAkB,CAAC,MAAM,SAAS,MAAM;IACxD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,mBAAmB,EAAE,OAAO,MAAM,CAAC;CAC5C"}
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../../src/internal/executor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,IAAI,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC9E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAExC,MAAM,MAAM,cAAc,GAAG,cAAc,CAAC,UAAU,CAAC,CAAC;AACxD,MAAM,MAAM,mBAAmB,GAAG,cAAc,CAAC;AAEjD;;;GAGG;AACH,MAAM,WAAW,iBAAiB,CAAC,QAAQ,SAAS,cAAc;IACjE,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,OAAO,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAC7C,OAAO,IAAI,OAAO,CAAC;IACnB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB,CAChC,MAAM,SAAS,MAAM,EACrB,QAAQ,SAAS,cAAc,GAAG,cAAc;IAEhD,QAAQ,CAAC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC7C,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE;QAClB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,IAAI,EAAE,OAAO,CAAC;KACd,CAAC;IACF,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;IACzD,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,SAAS,CAAC;IACjD,QAAQ,CAAC,oBAAoB,EAAE,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;CAC/D"}
@@ -1,6 +1,5 @@
1
- import type { Semaphore } from "effect";
2
1
  import { Effect } from "effect";
3
- export declare const executeQuery: <A, E, R>(executor: {
4
- readonly querySemaphore: Semaphore.Semaphore | undefined;
5
- }, effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
2
+ import { type PrismaError } from "../error.js";
3
+ import type { DatabaseExecutor } from "./executor.js";
4
+ export declare const executeQuery: <A, E, R>(executor: Pick<DatabaseExecutor<object>, "liveness" | "querySemaphore">, effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E | PrismaError, R>;
6
5
  //# sourceMappingURL=query-execution.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-execution.d.ts","sourceRoot":"","sources":["../../src/internal/query-execution.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,eAAO,MAAM,YAAY,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EACnC,UAAU;IAAE,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC,SAAS,GAAG,SAAS,CAAA;CAAE,EACtE,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAG8C,CAAC"}
1
+ {"version":3,"file":"query-execution.d.ts","sourceRoot":"","sources":["../../src/internal/query-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,KAAK,WAAW,EAAiB,MAAM,aAAa,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAEtD,eAAO,MAAM,YAAY,GAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EACnC,UAAU,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,UAAU,GAAG,gBAAgB,CAAC,EACvE,QAAQ,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAC5B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,CAUrC,CAAC"}
@@ -1,5 +1,11 @@
1
1
  import { Effect } from "effect";
2
- export const executeQuery = (executor, effect) => executor.querySemaphore === undefined
3
- ? effect
4
- : executor.querySemaphore.withPermit(Effect.uninterruptible(effect));
2
+ import { toPrismaError } from "../error.js";
3
+ export const executeQuery = (executor, effect) => {
4
+ const checked = Effect.suspend(() => executor.liveness.open
5
+ ? effect
6
+ : Effect.fail(toPrismaError({ code: executor.liveness.closedCode })));
7
+ return executor.querySemaphore === undefined
8
+ ? checked
9
+ : executor.querySemaphore.withPermit(Effect.uninterruptible(checked));
10
+ };
5
11
  //# sourceMappingURL=query-execution.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-execution.js","sourceRoot":"","sources":["../../src/internal/query-execution.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,MAAM,CAAC,MAAM,YAAY,GAAG,CAC3B,QAAsE,EACtE,MAA8B,EACL,EAAE,CAC3B,QAAQ,CAAC,cAAc,KAAK,SAAS;IACpC,CAAC,CAAC,MAAM;IACR,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"query-execution.js","sourceRoot":"","sources":["../../src/internal/query-execution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAoB,aAAa,EAAE,MAAM,aAAa,CAAC;AAG9D,MAAM,CAAC,MAAM,YAAY,GAAG,CAC3B,QAAuE,EACvE,MAA8B,EACS,EAAE;IACzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAC7B,GAAyC,EAAE,CAC1C,QAAQ,CAAC,QAAQ,CAAC,IAAI;QACrB,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CACtE,CAAC;IACF,OAAO,QAAQ,CAAC,cAAc,KAAK,SAAS;QAC3C,CAAC,CAAC,OAAO;QACT,CAAC,CAAC,QAAQ,CAAC,cAAc,CAAC,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC;AACxE,CAAC,CAAC"}
@@ -9,5 +9,5 @@ export interface RelationRecipe {
9
9
  }
10
10
  export declare const rootRecipe: (model: string) => RelationRecipe;
11
11
  export declare const appendOperation: (parent: RelationRecipe, name: PropertyKey, arguments_: ReadonlyArray<unknown>) => RelationRecipe;
12
- export declare const replayRecipe: (models: object, recipe: RelationRecipe) => unknown;
12
+ export declare const replayRecipe: (models: object, recipe: RelationRecipe, owner: object, transactionIdentity: object | undefined) => unknown;
13
13
  //# sourceMappingURL=recipe.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../src/internal/recipe.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,cAA6B,CAAC;AAEzE,eAAO,MAAM,eAAe,GAC3B,QAAQ,cAAc,EACtB,MAAM,WAAW,EACjB,YAAY,aAAa,CAAC,OAAO,CAAC,KAChC,cAOD,CAAC;AA8GH,eAAO,MAAM,YAAY,GACxB,QAAQ,MAAM,EACd,QAAQ,cAAc,KACpB,OAQF,CAAC"}
1
+ {"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../../src/internal/recipe.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,iBAAiB;IACjC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC;IACjC,QAAQ,CAAC,SAAS,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAED,eAAO,MAAM,UAAU,GAAI,OAAO,MAAM,KAAG,cAA6B,CAAC;AAEzE,eAAO,MAAM,eAAe,GAC3B,QAAQ,cAAc,EACtB,MAAM,WAAW,EACjB,YAAY,aAAa,CAAC,OAAO,CAAC,KAChC,cAOD,CAAC;AAmJH,eAAO,MAAM,YAAY,GACxB,QAAQ,MAAM,EACd,QAAQ,cAAc,EACtB,OAAO,MAAM,EACb,qBAAqB,MAAM,GAAG,SAAS,KACrC,OAQF,CAAC"}