@shivaedev/effect-prisma 0.5.2 → 0.6.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 (87) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +25 -7
  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/internal/vitest-database.d.ts +2 -2
  44. package/dist/internal/vitest-database.d.ts.map +1 -1
  45. package/dist/internal/vitest-database.js.map +1 -1
  46. package/dist/relation/include.d.ts +10 -8
  47. package/dist/relation/include.d.ts.map +1 -1
  48. package/dist/relation/prisma-methods.d.ts +20 -20
  49. package/dist/relation/prisma-methods.d.ts.map +1 -1
  50. package/dist/relation.d.ts +8 -7
  51. package/dist/relation.d.ts.map +1 -1
  52. package/dist/sqlite.d.ts +6 -6
  53. package/dist/sqlite.d.ts.map +1 -1
  54. package/dist/sqlite.js +10 -2
  55. package/dist/sqlite.js.map +1 -1
  56. package/dist/testing/transaction.d.ts +3 -3
  57. package/dist/testing/transaction.d.ts.map +1 -1
  58. package/dist/testing/transaction.js.map +1 -1
  59. package/dist/testing/types.d.ts +1 -1
  60. package/dist/testing/types.d.ts.map +1 -1
  61. package/dist/testing/vitest.d.ts +3 -3
  62. package/dist/testing/vitest.d.ts.map +1 -1
  63. package/dist/testing/vitest.js.map +1 -1
  64. package/dist/testing.d.ts +1 -1
  65. package/dist/testing.d.ts.map +1 -1
  66. package/dist/testing.js.map +1 -1
  67. package/package.json +5 -5
  68. package/src/database.ts +53 -47
  69. package/src/index.ts +0 -1
  70. package/src/internal/database-factory.ts +221 -98
  71. package/src/internal/executor.ts +9 -15
  72. package/src/internal/query-execution.ts +14 -6
  73. package/src/internal/recipe.ts +46 -7
  74. package/src/internal/relation-plan.ts +11 -11
  75. package/src/internal/relation-runtime.ts +67 -65
  76. package/src/internal/relation-stream.ts +54 -48
  77. package/src/internal/testing.ts +8 -8
  78. package/src/internal/transaction.ts +80 -56
  79. package/src/internal/vitest-database.ts +3 -12
  80. package/src/relation/include.ts +31 -22
  81. package/src/relation/prisma-methods.ts +27 -31
  82. package/src/relation.ts +19 -27
  83. package/src/sqlite.ts +61 -54
  84. package/src/testing/transaction.ts +16 -6
  85. package/src/testing/types.ts +1 -1
  86. package/src/testing/vitest.ts +3 -10
  87. package/src/testing.ts +0 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,31 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.6.0 - 2026-08-27
6
+
7
+ ### Changed
8
+
9
+ - **Breaking:** Make Database the only public persistence service. Relations
10
+ and Streams no longer expose an executor requirement. Transaction bodies
11
+ yield Database, while captured Relations from that singleton resolve the
12
+ private active transaction when executed inside the boundary.
13
+ - **Breaking:** Construct database definitions with `makeDatabase<Contract>()`
14
+ or `makeSqliteDatabase<Contract>()` so two databases sharing one contract
15
+ retain distinct service identities. Composition uses one unique definition
16
+ identifier and one live Layer per definition.
17
+ - Refuse forced-rollback test transactions nested inside ordinary commit
18
+ transactions, and fail closed when transaction-bound values escape their
19
+ settled boundary or cross into a concurrent sibling transaction.
20
+ - Serialize SQLite transaction scopes inside the supported singleton Database
21
+ Layer while leaving ordinary queries and writes unsynchronized.
22
+
23
+ ## 0.5.3 - 2026-08-12
24
+
25
+ ### Changed
26
+
27
+ - Require Effect 4.0.0-rc.108. The 4.0 release candidate starts the stable line,
28
+ so consumers pick up the compatibility promise the betas did not carry.
29
+
5
30
  ## 0.5.2 - 2026-08-12
6
31
 
7
32
  ### 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,10 @@ 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 its transaction scopes; ordinary queries and writes remain
77
+ direct and unsynchronized. Do not coordinate multiple Database Layers against
78
+ the same SQLite file.
71
79
 
72
80
  SQLite stores `DateTime` as text, and `prisma-next db init` generates
73
81
  `DEFAULT (datetime('now'))`, which writes a UTC instant without a zone
@@ -100,7 +108,8 @@ const program = Effect.gen(function* () {
100
108
  ```
101
109
 
102
110
  Relations are lazy and immutable. Reusing or branching a Relation never changes
103
- the original, and each execution resolves the active database context again.
111
+ the original, and each Relation closes over the Database implementation that
112
+ created it.
104
113
 
105
114
  Relations can be loaded directly or refined with another immutable Relation:
106
115
 
@@ -163,8 +172,17 @@ yield* db.transaction(
163
172
  )
164
173
  ```
165
174
 
175
+ Relations from the singleton Database resolve its active transaction when they
176
+ execute, so a Relation created before the boundary still participates when used
177
+ inside it. The Database yielded inside the body is the transaction-bound
178
+ implementation for methods constructed there. A transaction-bound Database or
179
+ Relation is valid only inside that boundary and fails closed if used after
180
+ settlement.
181
+
166
182
  Nested package transactions reuse the active transaction. Successful programs
167
- commit; failure, defect, and interruption roll back.
183
+ commit; failure, defect, and interruption roll back. A forced-rollback test
184
+ transaction inside an ordinary commit transaction is refused because the
185
+ drivers do not provide the savepoint semantics that promise would require.
168
186
 
169
187
  Queries composed concurrently inside a transaction are executed one at a time
170
188
  on its single connection. Once a transaction query starts, interruption waits
@@ -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":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAoB,aAAa,EAAE,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAElB,wBAAwB,GACxB,MAAM,kBAAkB,CAAC;AAwB1B,MAAM,+BAA+B,GAAG,sCAAsC,CAAC;AAC/E,IAAI,kCAAkC,GAAG,CAAC,CAAC;AA6E3C;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAI9B,QAAkB,EAClB,aAAuC,EAC9B,EAAE;IACX,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC5D,MAAM,IAAI,SAAS,CAClB,+DAA+D,CAC/D,CAAC;IACH,CAAC;IACD,yBAAyB,CACxB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAC7D,CAAC;IACF,OAAO,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC,CAAC,CAAW,CAAC;AAC5D,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAK9B,UAAiD,EACjD,eAKC,EAC4C,EAAE;IAC/C,IAAI,UAAU,CAAC,UAAU,CAAC,+BAA+B,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,SAAS,CAClB,wDAAwD,CACxD,CAAC;IACH,CAAC;IAID,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAG7B,UAAU,CAAC,CAAC;IACd,MAAM,SAAS,GAAG,IAAI,OAAO,EAG1B,CAAC;IAKJ,MAAM,iBAAiB,GAAG,OAAO,CAAC,SAAS,CAC1C,GAAG,+BAA+B,qBAAqB,kCAAkC,EAAE,EAAE,EAC7F,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS,EAAE,CACjC,CAAC;IACF,MAAM,UAAU,GAAG,CAClB,MAA6C,EACO,EAAE;QACtD,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,OAAO,QAAQ,KAAK,SAAS;YAC5B,CAAC,CAAC,MAAM,CAAC,GAAG,CACV,IAAI,SAAS,CACZ,4DAA4D,CAC5D,CACD;YACF,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAC;IACF,MAAM,cAAc,GAAG,CACtB,OAA2C,EAC3C,aAAoD,EACpD,OAA+B,EAC/B,OAAkC,EAClC,IAA4B,EAC5B,IAAY,EACgD,EAAE;QAC9D,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;QAC1E,CAAC;QACD,IACC,OAAO,CAAC,IAAI,KAAK,MAAM;YACvB,CAAC,OAAO,CAAC,IAAI,KAAK,aAAa,IAAI,IAAI,KAAK,aAAa,CAAC,EACzD,CAAC;YACF,OAAO,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;QAC/D,CAAC;QACD,IAAI,OAAO,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YACpC,OAAO,MAAM,CAAC,IAAI,CACjB,aAAa,CAAC;gBACb,IAAI,EAAE,yDAAyD;aAC/D,CAAC,CACF,CAAC;QACH,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,iBAAiB,CAC3C,kBAAkB,CACjB,OAAO,EACP,CAAC,cAAc,EAAE,EAAE,CAClB,eAAe,CACd,OAAO,CAAC,MAAM,CAAC,QAAQ,EACvB,cAAc,CACd,EACF,IAAI,CACJ,EACD,CAAC,QAAQ,EAAE,EAAE;YACZ,MAAM,iBAAiB,GAAG,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACxD,OAAO,OAAO,CAAC,IAAI,CAClB,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,iBAAiB,CAAC,EACjD,MAAM,CAAC,cAAc,CAAC,iBAAiB,EAAE;gBACxC,QAAQ,EAAE,QAAQ,CAAC,QAAQ;gBAC3B,MAAM,EAAE,iBAAiB;aACzB,CAAC,CACF,CAAC;QACH,CAAC,EACD,OAAO,CACP,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;QAElD,OAAO,wBAAwB,CAAC,OAAO,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;IAC5E,CAAC,CAAC;IAEF,SAAS,UAAU,CAClB,OAA2C;QAE3C,IAAI,MAA6C,CAAC;QAClD,MAAM,wBAAwB,GAAG,MAAM,CAAC,OAAO,CAC9C,iBAAiB,EACjB,CAAC,MAAM,EAAE,EAAE;YACV,IAAI,OAAO,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;gBAC7B,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAChE,CAAC;YACD,OAAO,MAAM,EAAE,QAAQ,KAAK,OAAO;gBAClC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;gBACxB,CAAC,CAAC,MAAM,CAAC,IAAI,CACX,aAAa,CAAC;oBACb,IAAI,EAAE,sCAAsC;iBAC5C,CAAC,CACF,CAAC;QACL,CAAC,CACD,CAAC;QACF,MAAM,eAAe,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAC3C,OAAO,CAAC,QAAQ,CAAC,IAAI;YACpB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,QAAQ,CAAC;YAClE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAC1B,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YACjD,WAAW,EAAE,CACZ,OACyC,EACxC,EAAE,CACH,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE;gBACnB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;oBAC5B,OAAO,MAAM,CAAC,IAAI,CACjB,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CACpD,CAAC;gBACH,CAAC;gBACD,OAAO,MAAM,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC,QAAQ,EAAE,EAAE;oBAC5D,OAAO,cAAc,CACpB,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,MAAM,EACf,OAAO,EACP,kBAAkB,EAClB,aAAa,EACb,oBAAoB,CACpB,CAAC;gBACH,CAAC,CAAC,CAAC;YACJ,CAAC,CAAC;SACH,CAA0C,CAAC;QAC5C,MAAM,GAAG,IAAI,KAAK,CAAC,MAAM,EAAE;YAC1B,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ;gBAC7B,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC;oBACnC,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBAChD,CAAC;gBACD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;oBAClC,OAAO,SAAS,CAAC;gBAClB,CAAC;gBACD,OAAO,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;YAC9D,CAAC;SACD,CAAC,CAAC;QACH,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC/B,OAAO,MAAM,CAAC;IACf,CAAC;IAED,MAAM,mBAAmB,GAAG,CAC3B,OAA0E,EACD,EAAE,CAC3E,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE;QAClC,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CACrD,cAAc,CACb,OAAO,EACP,MAAM,EACN,OAAO,EACP,sBAAsB,EACtB,MAAM,EACN,wBAAwB,CACxB,CACD,CAAC;IACH,CAAC,CAAC,CAAC;IAEJ,MAAM,KAAK,GAAG,CACb,YAAqB,EACkB,EAAE;QACzC,MAAM,OAAO,GAAG,MAAM,CAAC,cAAc,CACpC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,EACnD,CAAC,QAAQ,EAAE,EAAE;YACZ,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC;YAC/B,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzE,CAAC,CACD,CAAC;QAEF,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC;IAEF,OAAO,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE;QAC7B,KAAK;QACL,CAAC,qBAAqB,CAAC,EAAE,EAAE,mBAAmB,EAAE;KAChD,CAA+C,CAAC;AAClD,CAAC,CAAC"}
@@ -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"}