@shivaedev/effect-prisma 0.5.3 → 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.
- package/CHANGELOG.md +18 -0
- package/README.md +25 -7
- package/dist/database.d.ts +6 -6
- package/dist/database.d.ts.map +1 -1
- package/dist/database.js +9 -2
- package/dist/database.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/internal/database-factory.d.ts +20 -22
- package/dist/internal/database-factory.d.ts.map +1 -1
- package/dist/internal/database-factory.js +83 -24
- package/dist/internal/database-factory.js.map +1 -1
- package/dist/internal/executor.d.ts +9 -7
- package/dist/internal/executor.d.ts.map +1 -1
- package/dist/internal/query-execution.d.ts +3 -4
- package/dist/internal/query-execution.d.ts.map +1 -1
- package/dist/internal/query-execution.js +9 -3
- package/dist/internal/query-execution.js.map +1 -1
- package/dist/internal/recipe.d.ts +1 -1
- package/dist/internal/recipe.d.ts.map +1 -1
- package/dist/internal/recipe.js +22 -9
- package/dist/internal/recipe.js.map +1 -1
- package/dist/internal/relation-plan.d.ts +6 -1
- package/dist/internal/relation-plan.d.ts.map +1 -1
- package/dist/internal/relation-plan.js +6 -5
- package/dist/internal/relation-plan.js.map +1 -1
- package/dist/internal/relation-runtime.d.ts +4 -3
- package/dist/internal/relation-runtime.d.ts.map +1 -1
- package/dist/internal/relation-runtime.js +38 -19
- package/dist/internal/relation-runtime.js.map +1 -1
- package/dist/internal/relation-stream.d.ts +3 -4
- package/dist/internal/relation-stream.d.ts.map +1 -1
- package/dist/internal/relation-stream.js +23 -21
- package/dist/internal/relation-stream.js.map +1 -1
- package/dist/internal/testing.d.ts +5 -5
- package/dist/internal/testing.d.ts.map +1 -1
- package/dist/internal/testing.js.map +1 -1
- package/dist/internal/transaction.d.ts +6 -3
- package/dist/internal/transaction.d.ts.map +1 -1
- package/dist/internal/transaction.js +14 -4
- package/dist/internal/transaction.js.map +1 -1
- package/dist/internal/vitest-database.d.ts +2 -2
- package/dist/internal/vitest-database.d.ts.map +1 -1
- package/dist/internal/vitest-database.js.map +1 -1
- package/dist/relation/include.d.ts +10 -8
- package/dist/relation/include.d.ts.map +1 -1
- package/dist/relation/prisma-methods.d.ts +20 -20
- package/dist/relation/prisma-methods.d.ts.map +1 -1
- package/dist/relation.d.ts +8 -7
- package/dist/relation.d.ts.map +1 -1
- package/dist/sqlite.d.ts +6 -6
- package/dist/sqlite.d.ts.map +1 -1
- package/dist/sqlite.js +10 -2
- package/dist/sqlite.js.map +1 -1
- package/dist/testing/transaction.d.ts +3 -3
- package/dist/testing/transaction.d.ts.map +1 -1
- package/dist/testing/transaction.js.map +1 -1
- package/dist/testing/types.d.ts +1 -1
- package/dist/testing/types.d.ts.map +1 -1
- package/dist/testing/vitest.d.ts +3 -3
- package/dist/testing/vitest.d.ts.map +1 -1
- package/dist/testing/vitest.js.map +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.d.ts.map +1 -1
- package/dist/testing.js.map +1 -1
- package/package.json +1 -1
- package/src/database.ts +53 -47
- package/src/index.ts +0 -1
- package/src/internal/database-factory.ts +221 -98
- package/src/internal/executor.ts +9 -15
- package/src/internal/query-execution.ts +14 -6
- package/src/internal/recipe.ts +46 -7
- package/src/internal/relation-plan.ts +11 -11
- package/src/internal/relation-runtime.ts +67 -65
- package/src/internal/relation-stream.ts +54 -48
- package/src/internal/testing.ts +8 -8
- package/src/internal/transaction.ts +80 -56
- package/src/internal/vitest-database.ts +3 -12
- package/src/relation/include.ts +31 -22
- package/src/relation/prisma-methods.ts +27 -31
- package/src/relation.ts +19 -27
- package/src/sqlite.ts +61 -54
- package/src/testing/transaction.ts +16 -6
- package/src/testing/types.ts +1 -1
- package/src/testing/vitest.ts +3 -10
- package/src/testing.ts +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,24 @@
|
|
|
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
|
+
|
|
5
23
|
## 0.5.3 - 2026-08-12
|
|
6
24
|
|
|
7
25
|
### 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
|
-
|
|
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`
|
|
70
|
-
|
|
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
|
|
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
|
package/dist/database.d.ts
CHANGED
|
@@ -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
|
|
5
|
-
import type { AnySqlContract
|
|
6
|
-
export type { AnyDatabase,
|
|
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,
|
|
18
|
-
readonly layer: (options: DatabaseLayerOptions) => Layer.Layer<DatabaseIdentifier<Contract
|
|
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:
|
|
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
|
package/dist/database.d.ts.map
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
37
|
+
transactionIdentity: undefined,
|
|
38
|
+
transactionSemaphore: undefined,
|
|
32
39
|
})));
|
|
33
40
|
});
|
|
34
41
|
};
|
package/dist/database.js.map
CHANGED
|
@@ -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,
|
|
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
|
|
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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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,
|
|
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
|
|
3
|
+
import { type PrismaError } from "../error.js";
|
|
4
4
|
import type { Relation } from "../relation.js";
|
|
5
|
-
import type { AnySqlContract, DatabaseExecutor
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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,
|
|
15
|
-
readonly [Model in keyof DefaultModels<Contract>]: Relation<DefaultModels<Contract>[Model],
|
|
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,
|
|
18
|
-
transaction<A, E, R>(program: Effect.Effect<A, E, R>): Effect.Effect<A, E | PrismaError, R
|
|
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,
|
|
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
|
|
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
|
|
48
|
-
*
|
|
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:
|
|
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":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,KAAK,
|
|
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
|
|
21
|
-
*
|
|
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
|
-
|
|
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
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
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
|
|
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) =>
|
|
49
|
-
|
|
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":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;
|
|
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 {
|
|
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
|
|
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,
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
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,
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
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":"
|
|
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;
|
|
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"}
|