@shivaedev/effect-prisma 0.6.0 → 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.
- package/CHANGELOG.md +20 -0
- package/README.md +10 -6
- package/dist/internal/relation-stream.js +1 -1
- package/dist/internal/relation-stream.js.map +1 -1
- package/dist/sqlite.d.ts.map +1 -1
- package/dist/sqlite.js +3 -2
- package/dist/sqlite.js.map +1 -1
- package/dist/testing/types.d.ts +5 -3
- package/dist/testing/types.d.ts.map +1 -1
- package/dist/testing/vitest.d.ts +1 -1
- package/dist/testing/vitest.d.ts.map +1 -1
- package/dist/testing/vitest.js +8 -16
- package/dist/testing/vitest.js.map +1 -1
- package/package.json +3 -2
- package/src/internal/relation-stream.ts +1 -1
- package/src/sqlite.ts +3 -2
- package/src/testing/types.ts +5 -3
- package/src/testing/vitest.ts +16 -30
- package/dist/internal/vitest-database.d.ts +0 -18
- package/dist/internal/vitest-database.d.ts.map +0 -1
- package/dist/internal/vitest-database.js +0 -73
- package/dist/internal/vitest-database.js.map +0 -1
- package/src/internal/vitest-database.ts +0 -201
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,26 @@
|
|
|
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
|
+
|
|
5
25
|
## 0.6.0 - 2026-08-27
|
|
6
26
|
|
|
7
27
|
### Changed
|
package/README.md
CHANGED
|
@@ -73,9 +73,10 @@ per transaction, so in-memory databases are rejected.
|
|
|
73
73
|
That driver is synchronous. Queries block the event loop while they run, and
|
|
74
74
|
because SQLite allows a single writer, overlapping write transactions wait for
|
|
75
75
|
`busy_timeout` while blocking that event loop. The supported Database Layer
|
|
76
|
-
therefore serializes
|
|
77
|
-
|
|
78
|
-
|
|
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.
|
|
79
80
|
|
|
80
81
|
SQLite stores `DateTime` as text, and `prisma-next db init` generates
|
|
81
82
|
`DEFAULT (datetime('now'))`, which writes a UTC instant without a zone
|
|
@@ -186,8 +187,10 @@ drivers do not provide the savepoint semantics that promise would require.
|
|
|
186
187
|
|
|
187
188
|
Queries composed concurrently inside a transaction are executed one at a time
|
|
188
189
|
on its single connection. Once a transaction query starts, interruption waits
|
|
189
|
-
for it to settle before releasing that connection.
|
|
190
|
-
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.
|
|
191
194
|
|
|
192
195
|
Transaction-scoped Streams are read into memory before emitting rows. This
|
|
193
196
|
releases the connection before downstream Stream effects run database queries.
|
|
@@ -227,4 +230,5 @@ it.effectDB("creates a user", function* (db) {
|
|
|
227
230
|
```
|
|
228
231
|
|
|
229
232
|
`effectDB` supports the usual `skip`, `skipIf`, `runIf`, `only`, `each`, and
|
|
230
|
-
`fails` variants.
|
|
233
|
+
`fails` variants. Tests install TestClock unless you pass `clock: "live"`.
|
|
234
|
+
`withTestTransaction` is also exported for custom harnesses.
|
|
@@ -12,7 +12,7 @@ export const makeRelationStream = (resolveExecutor, recipe) => {
|
|
|
12
12
|
throw new TypeError("Only collection Relations can be streamed");
|
|
13
13
|
}
|
|
14
14
|
const iterable = Reflect.apply(Reflect.get(collection, "all"), collection, []);
|
|
15
|
-
if (executor.
|
|
15
|
+
if (executor.mode === "root") {
|
|
16
16
|
return Stream.fromAsyncIterable(iterable, (error) => error).pipe(Stream.catch((error) => isPrismaFailure(error)
|
|
17
17
|
? Stream.fail(toPrismaError(error))
|
|
18
18
|
: Stream.die(error)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relation-stream.js","sourceRoot":"","sources":["../../src/internal/relation-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,eAAe,EAAoB,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAuB,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAIjC,eAGC,EACD,MAAsB,EACgB,EAAE;IACxC,OAAO,MAAM,CAAC,MAAM,CACnB,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC5C,YAAY,CACX,QAAQ,EACR,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QAChB,MAAM,UAAU,GAAG,YAAY,CAC9B,QAAQ,CAAC,MAAM,EACf,MAAM,EACN,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,mBAAmB,CAC5B,CAAC;QACF,IACC,OAAO,UAAU,KAAK,QAAQ;YAC9B,UAAU,KAAK,IAAI;YACnB,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,UAAU,EACnD,CAAC;YACF,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAC7B,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAgB,EAC7C,UAAU,EACV,EAAE,CACwB,CAAC;QAE5B,IAAI,QAAQ,CAAC,
|
|
1
|
+
{"version":3,"file":"relation-stream.js","sourceRoot":"","sources":["../../src/internal/relation-stream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,eAAe,EAAoB,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/E,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAuB,YAAY,EAAE,MAAM,aAAa,CAAC;AAIhE,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAIjC,eAGC,EACD,MAAsB,EACgB,EAAE;IACxC,OAAO,MAAM,CAAC,MAAM,CACnB,MAAM,CAAC,OAAO,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAC5C,YAAY,CACX,QAAQ,EACR,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QAChB,MAAM,UAAU,GAAG,YAAY,CAC9B,QAAQ,CAAC,MAAM,EACf,MAAM,EACN,QAAQ,CAAC,QAAQ,EACjB,QAAQ,CAAC,mBAAmB,CAC5B,CAAC;QACF,IACC,OAAO,UAAU,KAAK,QAAQ;YAC9B,UAAU,KAAK,IAAI;YACnB,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAC,KAAK,UAAU,EACnD,CAAC;YACF,MAAM,IAAI,SAAS,CAAC,2CAA2C,CAAC,CAAC;QAClE,CAAC;QACD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAC7B,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,KAAK,CAAgB,EAC7C,UAAU,EACV,EAAE,CACwB,CAAC;QAE5B,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC9B,OAAO,MAAM,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAC/D,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CACtB,eAAe,CAAC,KAAK,CAAC;gBACrB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACnC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CACpB,CACD,CAAC;QACH,CAAC;QAED,MAAM,QAAQ,GAAG,YAAY,CAC5B,QAAQ,EACR,iBAAiB,CAAC,KAAK,IAAI,EAAE;YAC5B,MAAM,IAAI,GAAmB,EAAE,CAAC;YAChC,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAClC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;YACD,OAAO,IAAI,CAAC;QACb,CAAC,CAAC,CACF,CAAC;QAEF,OAAO,MAAM,CAAC,MAAM,CACnB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CACzD,CAAC;IACH,CAAC,CAAC,CACF,CACD,CACD,CAAC;AACH,CAAC,CAAC"}
|
package/dist/sqlite.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAAA,OAAe,EAEd,KAAK,iBAAiB,EACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,KAAK,EAAa,MAAM,QAAQ,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAG1B,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAQ7D,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,MAAM,CAAwB,CAAC;AAEhF,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB;IACpE,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACzC;AAED,KAAK,oBAAoB,CAAC,QAAQ,SAAS,cAAc,IACtD;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,wBAAwB,CACxC,QAAQ,SAAS,cAAc,EAC/B,UAAU,SAAS,MAAM,CACxB,SAAQ,qBAAqB,CAAC,QAAQ,EAAE,UAAU,CAAC;IACpD,QAAQ,CAAC,KAAK,EAAE,CACf,OAAO,EAAE,0BAA0B,KAC/B,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,CAAC;CACxE;AAED,eAAO,MAAM,kBAAkB,GAC7B,KAAK,CAAC,QAAQ,SAAS,cAAc,QACrC,KAAK,CAAC,UAAU,SAAS,MAAM,EAC/B,YAAY,yBAAyB,CAAC,UAAU,CAAC,EACjD,SAAS,oBAAoB,CAAC,QAAQ,CAAC,KACrC,wBAAwB,CAAC,QAAQ,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAAA,OAAe,EAEd,KAAK,iBAAiB,EACtB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,KAAK,KAAK,EAAa,MAAM,QAAQ,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAK9C,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,yBAAyB,EAC9B,KAAK,qBAAqB,EAG1B,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAQ7D,eAAO,MAAM,oBAAoB,EAAE,aAAa,CAAC,MAAM,CAAwB,CAAC;AAEhF,MAAM,WAAW,0BAA2B,SAAQ,iBAAiB;IACpE,wEAAwE;IACxE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;CACzC;AAED,KAAK,oBAAoB,CAAC,QAAQ,SAAS,cAAc,IACtD;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,wBAAwB,CACxC,QAAQ,SAAS,cAAc,EAC/B,UAAU,SAAS,MAAM,CACxB,SAAQ,qBAAqB,CAAC,QAAQ,EAAE,UAAU,CAAC;IACpD,QAAQ,CAAC,KAAK,EAAE,CACf,OAAO,EAAE,0BAA0B,KAC/B,KAAK,CAAC,KAAK,CAAC,kBAAkB,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,WAAW,CAAC,CAAC;CACxE;AAED,eAAO,MAAM,kBAAkB,GAC7B,KAAK,CAAC,QAAQ,SAAS,cAAc,QACrC,KAAK,CAAC,UAAU,SAAS,MAAM,EAC/B,YAAY,yBAAyB,CAAC,UAAU,CAAC,EACjD,SAAS,oBAAoB,CAAC,QAAQ,CAAC,KACrC,wBAAwB,CAAC,QAAQ,EAAE,UAAU,CAsD/C,CAAC"}
|
package/dist/sqlite.js
CHANGED
|
@@ -29,6 +29,7 @@ export const makeSqliteDatabase = () => (identifier, options) => {
|
|
|
29
29
|
return fromPrismaPromise(() => acquireConnectedClient(client, () => {
|
|
30
30
|
// The SQLite client already exposes the unbound namespace.
|
|
31
31
|
const models = client.orm;
|
|
32
|
+
const accessSemaphore = Semaphore.makeUnsafe(1);
|
|
32
33
|
assertAvailableModelNames(Object.keys(models));
|
|
33
34
|
return {
|
|
34
35
|
client,
|
|
@@ -39,9 +40,9 @@ export const makeSqliteDatabase = () => (identifier, options) => {
|
|
|
39
40
|
},
|
|
40
41
|
mode: "root",
|
|
41
42
|
models,
|
|
42
|
-
querySemaphore:
|
|
43
|
+
querySemaphore: accessSemaphore,
|
|
43
44
|
transactionIdentity: undefined,
|
|
44
|
-
transactionSemaphore:
|
|
45
|
+
transactionSemaphore: accessSemaphore,
|
|
45
46
|
};
|
|
46
47
|
}));
|
|
47
48
|
});
|
package/dist/sqlite.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAGd,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAc,SAAS,EAAE,MAAM,QAAQ,CAAC;AAE/C,OAAO,EACN,sBAAsB,EACtB,yBAAyB,GACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAKN,eAAe,GACf,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EACN,kBAAkB,EAClB,oBAAoB,GACpB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,CAAC,MAAM,oBAAoB,GAA0B,CAAC,kBAAkB,CAAC,CAAC;AA+BhF,MAAM,CAAC,MAAM,kBAAkB,GAC9B,GAA0C,EAAE,CAC5C,CACC,UAAiD,EACjD,OAAuC,EACU,EAAE;IAGnD,OAAO,eAAe,CACrB,UAAU,EACV,CAAC,YAAY,EAAE,EAAE;QAChB,oBAAoB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACxC,kBAAkB,CACjB,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,OAAO,IAAI,oBAAoB,CAC5C,CAAC;QAEF,MAAM,aAAa,GAAG;YACrB,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,YAAY,EAAE,YAAY,CAAC,YAAY;SACvC,CAAC;QACF,MAAM,MAAM,GACX,OAAO,CAAC,QAAQ,KAAK,SAAS;YAC7B,CAAC,CAAC,MAAM,CAAW;gBACjB,GAAG,aAAa;gBAChB,YAAY,EAAE,OAAO,CAAC,YAAY;aAClC,CAAC;YACH,CAAC,CAAC,MAAM,CAAW;gBACjB,GAAG,aAAa;gBAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC1B,CAAC,CAAC;QAEN,0BAA0B,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE3C,OAAO,iBAAiB,CAAC,GAAG,EAAE,CAC7B,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE;YACnC,2DAA2D;YAC3D,MAAM,MAAM,GAAG,MAAM,CAAC,GAAa,CAAC;YACpC,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/C,OAAO;gBACN,MAAM;gBACN,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE;oBACT,UAAU,EAAE,yBAAyB;oBACrC,IAAI,EAAE,IAAI;iBACV;gBACD,IAAI,EAAE,MAAM;gBACZ,MAAM;gBACN,cAAc,EAAE,
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,EAAE,EAGd,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAc,SAAS,EAAE,MAAM,QAAQ,CAAC;AAE/C,OAAO,EACN,sBAAsB,EACtB,yBAAyB,GACzB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAKN,eAAe,GACf,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EACN,kBAAkB,EAClB,oBAAoB,GACpB,MAAM,8BAA8B,CAAC;AAEtC,MAAM,CAAC,MAAM,oBAAoB,GAA0B,CAAC,kBAAkB,CAAC,CAAC;AA+BhF,MAAM,CAAC,MAAM,kBAAkB,GAC9B,GAA0C,EAAE,CAC5C,CACC,UAAiD,EACjD,OAAuC,EACU,EAAE;IAGnD,OAAO,eAAe,CACrB,UAAU,EACV,CAAC,YAAY,EAAE,EAAE;QAChB,oBAAoB,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACxC,kBAAkB,CACjB,YAAY,CAAC,IAAI,EACjB,YAAY,CAAC,OAAO,IAAI,oBAAoB,CAC5C,CAAC;QAEF,MAAM,aAAa,GAAG;YACrB,IAAI,EAAE,YAAY,CAAC,IAAI;YACvB,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,UAAU,EAAE,YAAY,CAAC,UAAU;YACnC,YAAY,EAAE,YAAY,CAAC,YAAY;SACvC,CAAC;QACF,MAAM,MAAM,GACX,OAAO,CAAC,QAAQ,KAAK,SAAS;YAC7B,CAAC,CAAC,MAAM,CAAW;gBACjB,GAAG,aAAa;gBAChB,YAAY,EAAE,OAAO,CAAC,YAAY;aAClC,CAAC;YACH,CAAC,CAAC,MAAM,CAAW;gBACjB,GAAG,aAAa;gBAChB,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC1B,CAAC,CAAC;QAEN,0BAA0B,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAE3C,OAAO,iBAAiB,CAAC,GAAG,EAAE,CAC7B,sBAAsB,CAAC,MAAM,EAAE,GAAG,EAAE;YACnC,2DAA2D;YAC3D,MAAM,MAAM,GAAG,MAAM,CAAC,GAAa,CAAC;YACpC,MAAM,eAAe,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAChD,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;YAC/C,OAAO;gBACN,MAAM;gBACN,QAAQ,EAAE,EAAE;gBACZ,QAAQ,EAAE;oBACT,UAAU,EAAE,yBAAyB;oBACrC,IAAI,EAAE,IAAI;iBACV;gBACD,IAAI,EAAE,MAAM;gBACZ,MAAM;gBACN,cAAc,EAAE,eAAe;gBAC/B,mBAAmB,EAAE,SAAS;gBAC9B,oBAAoB,EAAE,eAAe;aACrC,CAAC;QACH,CAAC,CAAC,CACF,CAAC;IACH,CAAC,CACiD,CAAC;AACrD,CAAC,CAAC"}
|
package/dist/testing/types.d.ts
CHANGED
|
@@ -1,21 +1,23 @@
|
|
|
1
|
-
import type { TestContext,
|
|
1
|
+
import type { TestContext, Vitest } from "@effect/vitest";
|
|
2
|
+
import type { EffectClock, EffectTestOptions } from "@shivaedev/effect-test";
|
|
2
3
|
import type { Effect, Layer } from "effect";
|
|
3
4
|
import type { AnyDatabase, DatabaseServiceOf } from "../database.js";
|
|
4
5
|
export type { AnyDatabase } from "../database.js";
|
|
5
6
|
export type DatabaseService<Database extends AnyDatabase> = DatabaseServiceOf<Database>;
|
|
6
|
-
export type DatabaseTest<Database extends AnyDatabase, Provided> = <A, Eff extends Effect.Effect<unknown, unknown, Provided>>(name: string, body: (database: DatabaseService<Database>, context: TestContext) => Generator<Eff, A, never>, options?: number |
|
|
7
|
+
export type DatabaseTest<Database extends AnyDatabase, Provided> = <A, Eff extends Effect.Effect<unknown, unknown, Provided>>(name: string, body: (database: DatabaseService<Database>, context: TestContext) => Generator<Eff, A, never>, options?: number | EffectTestOptions) => void;
|
|
7
8
|
export interface DatabaseTester<Database extends AnyDatabase, Provided> extends DatabaseTest<Database, Provided> {
|
|
8
9
|
readonly skip: DatabaseTest<Database, Provided>;
|
|
9
10
|
readonly skipIf: (condition: unknown) => DatabaseTest<Database, Provided>;
|
|
10
11
|
readonly runIf: (condition: unknown) => DatabaseTest<Database, Provided>;
|
|
11
12
|
readonly only: DatabaseTest<Database, Provided>;
|
|
12
|
-
readonly each: <Item>(cases: ReadonlyArray<Item>) => <A, Eff extends Effect.Effect<unknown, unknown, Provided>>(name: string, body: (item: Item, database: DatabaseService<Database>, context: TestContext) => Generator<Eff, A, never>, options?: number |
|
|
13
|
+
readonly each: <Item>(cases: ReadonlyArray<Item>) => <A, Eff extends Effect.Effect<unknown, unknown, Provided>>(name: string, body: (item: Item, database: DatabaseService<Database>, context: TestContext) => Generator<Eff, A, never>, options?: number | EffectTestOptions) => void;
|
|
13
14
|
readonly fails: DatabaseTest<Database, Provided>;
|
|
14
15
|
}
|
|
15
16
|
export type DatabaseIt<Database extends AnyDatabase, Provided> = Vitest.Methods & {
|
|
16
17
|
readonly effectDB: DatabaseTester<Database, Provided>;
|
|
17
18
|
};
|
|
18
19
|
export interface MakeDatabaseItOptions<Database extends AnyDatabase, Provided, LayerError> {
|
|
20
|
+
readonly clock?: EffectClock;
|
|
19
21
|
readonly database: Database;
|
|
20
22
|
readonly layer: Layer.Layer<Provided, LayerError>;
|
|
21
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAErE,YAAY,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,MAAM,MAAM,eAAe,CAAC,QAAQ,SAAS,WAAW,IACvD,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AAE7B,MAAM,MAAM,YAAY,CAAC,QAAQ,SAAS,WAAW,EAAE,QAAQ,IAAI,CAClE,CAAC,EACD,GAAG,SAAS,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAErD,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CACL,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAAC,EACnC,OAAO,EAAE,WAAW,KAChB,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,EAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,iBAAiB,KAChC,IAAI,CAAC;AAEV,MAAM,WAAW,cAAc,CAAC,QAAQ,SAAS,WAAW,EAAE,QAAQ,CACrE,SAAQ,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAC1E,QAAQ,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACzE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChD,QAAQ,CAAC,IAAI,EAAE,CAAC,IAAI,EACnB,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,KACtB,CAAC,CAAC,EAAE,GAAG,SAAS,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,EAC7D,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,CACL,IAAI,EAAE,IAAI,EACV,QAAQ,EAAE,eAAe,CAAC,QAAQ,CAAC,EACnC,OAAO,EAAE,WAAW,KAChB,SAAS,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,EAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,iBAAiB,KAChC,IAAI,CAAC;IACV,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;CACjD;AAED,MAAM,MAAM,UAAU,CACrB,QAAQ,SAAS,WAAW,EAC5B,QAAQ,IACL,MAAM,CAAC,OAAO,GAAG;IACpB,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;CACtD,CAAC;AAEF,MAAM,WAAW,qBAAqB,CACrC,QAAQ,SAAS,WAAW,EAC5B,QAAQ,EACR,UAAU;IAEV,QAAQ,CAAC,KAAK,CAAC,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;CAClD"}
|
package/dist/testing/vitest.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Effect, Layer } from "effect";
|
|
1
|
+
import type { Effect, Layer } from "effect";
|
|
2
2
|
import type { AnyDatabase, DatabaseIt, MakeDatabaseItOptions } from "./types.js";
|
|
3
3
|
export declare const makeDatabaseIt: <Database extends AnyDatabase, Provided, LayerError>(options: MakeDatabaseItOptions<Database, Provided, LayerError> & {
|
|
4
4
|
readonly layer: Layer.Layer<Provided | Effect.Services<Database>, LayerError>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../../src/testing/vitest.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../../src/testing/vitest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AAE5C,OAAO,KAAK,EACX,WAAW,EACX,UAAU,EAEV,qBAAqB,EACrB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,cAAc,GAC1B,QAAQ,SAAS,WAAW,EAC5B,QAAQ,EACR,UAAU,EAEV,SAAS,qBAAqB,CAAC,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAC,GAAG;IAChE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAC1B,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EACpC,UAAU,CACV,CAAC;CACF,KACC,UAAU,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAuB3D,CAAC"}
|
package/dist/testing/vitest.js
CHANGED
|
@@ -1,25 +1,17 @@
|
|
|
1
1
|
import { it as effectIt } from "@effect/vitest";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { makeEffectIt } from "@shivaedev/effect-test";
|
|
3
|
+
import { withTestTransaction } from "./transaction.js";
|
|
4
4
|
export const makeDatabaseIt = (options) => {
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
try {
|
|
11
|
-
return await Effect.runPromise(Layer.buildWithScope(options.layer, scope));
|
|
12
|
-
}
|
|
13
|
-
catch (error) {
|
|
14
|
-
await Effect.runPromise(Scope.close(scope, Exit.void));
|
|
15
|
-
throw error;
|
|
16
|
-
}
|
|
5
|
+
const { effectApp } = makeEffectIt({
|
|
6
|
+
around: (effect) => withTestTransaction(options.database, effect),
|
|
7
|
+
clock: options.clock,
|
|
8
|
+
layer: options.layer,
|
|
9
|
+
makeHarness: () => options.database,
|
|
17
10
|
});
|
|
18
|
-
const effectDB = makeDatabaseTester(fixtureIt, options.database);
|
|
19
11
|
return new Proxy(effectIt, {
|
|
20
12
|
get(target, property, receiver) {
|
|
21
13
|
if (property === "effectDB") {
|
|
22
|
-
return
|
|
14
|
+
return effectApp;
|
|
23
15
|
}
|
|
24
16
|
return Reflect.get(target, property, receiver);
|
|
25
17
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vitest.js","sourceRoot":"","sources":["../../src/testing/vitest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"vitest.js","sourceRoot":"","sources":["../../src/testing/vitest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAQvD,MAAM,CAAC,MAAM,cAAc,GAAG,CAK7B,OAKC,EAC4D,EAAE;IAG/D,MAAM,EAAE,SAAS,EAAE,GAAG,YAAY,CAAC;QAClC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC;QACjE,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,WAAW,EAAE,GAAG,EAAE,CACjB,OAAO,CAAC,QAIP;KACF,CAAC,CAAC;IAEH,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE;QAC1B,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ;YAC7B,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;gBAC7B,OAAO,SAAS,CAAC;YAClB,CAAC;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC;KACD,CAA8C,CAAC;AACjD,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shivaedev/effect-prisma",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.2",
|
|
4
4
|
"description": "Effect-native PostgreSQL queries and transactions for Prisma Next",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -58,7 +58,8 @@
|
|
|
58
58
|
"@prisma-next/sql-orm-client": "0.15.0",
|
|
59
59
|
"@prisma-next/sql-relational-core": "0.15.0",
|
|
60
60
|
"@prisma-next/sql-runtime": "0.15.0",
|
|
61
|
-
"@prisma-next/sqlite": "0.15.0"
|
|
61
|
+
"@prisma-next/sqlite": "0.15.0",
|
|
62
|
+
"@shivaedev/effect-test": "0.1.0"
|
|
62
63
|
},
|
|
63
64
|
"peerDependencies": {
|
|
64
65
|
"@effect/vitest": "4.0.0-rc.108",
|
|
@@ -41,7 +41,7 @@ export const makeRelationStream = <
|
|
|
41
41
|
[],
|
|
42
42
|
) as AsyncIterable<unknown>;
|
|
43
43
|
|
|
44
|
-
if (executor.
|
|
44
|
+
if (executor.mode === "root") {
|
|
45
45
|
return Stream.fromAsyncIterable(iterable, (error) => error).pipe(
|
|
46
46
|
Stream.catch((error) =>
|
|
47
47
|
isPrismaFailure(error)
|
package/src/sqlite.ts
CHANGED
|
@@ -94,6 +94,7 @@ export const makeSqliteDatabase =
|
|
|
94
94
|
acquireConnectedClient(client, () => {
|
|
95
95
|
// The SQLite client already exposes the unbound namespace.
|
|
96
96
|
const models = client.orm as Models;
|
|
97
|
+
const accessSemaphore = Semaphore.makeUnsafe(1);
|
|
97
98
|
assertAvailableModelNames(Object.keys(models));
|
|
98
99
|
return {
|
|
99
100
|
client,
|
|
@@ -104,9 +105,9 @@ export const makeSqliteDatabase =
|
|
|
104
105
|
},
|
|
105
106
|
mode: "root",
|
|
106
107
|
models,
|
|
107
|
-
querySemaphore:
|
|
108
|
+
querySemaphore: accessSemaphore,
|
|
108
109
|
transactionIdentity: undefined,
|
|
109
|
-
transactionSemaphore:
|
|
110
|
+
transactionSemaphore: accessSemaphore,
|
|
110
111
|
};
|
|
111
112
|
}),
|
|
112
113
|
);
|
package/src/testing/types.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { TestContext,
|
|
1
|
+
import type { TestContext, Vitest } from "@effect/vitest";
|
|
2
|
+
import type { EffectClock, EffectTestOptions } from "@shivaedev/effect-test";
|
|
2
3
|
import type { Effect, Layer } from "effect";
|
|
3
4
|
import type { AnyDatabase, DatabaseServiceOf } from "../database.js";
|
|
4
5
|
|
|
@@ -15,7 +16,7 @@ export type DatabaseTest<Database extends AnyDatabase, Provided> = <
|
|
|
15
16
|
database: DatabaseService<Database>,
|
|
16
17
|
context: TestContext,
|
|
17
18
|
) => Generator<Eff, A, never>,
|
|
18
|
-
options?: number |
|
|
19
|
+
options?: number | EffectTestOptions,
|
|
19
20
|
) => void;
|
|
20
21
|
|
|
21
22
|
export interface DatabaseTester<Database extends AnyDatabase, Provided>
|
|
@@ -33,7 +34,7 @@ export interface DatabaseTester<Database extends AnyDatabase, Provided>
|
|
|
33
34
|
database: DatabaseService<Database>,
|
|
34
35
|
context: TestContext,
|
|
35
36
|
) => Generator<Eff, A, never>,
|
|
36
|
-
options?: number |
|
|
37
|
+
options?: number | EffectTestOptions,
|
|
37
38
|
) => void;
|
|
38
39
|
readonly fails: DatabaseTest<Database, Provided>;
|
|
39
40
|
}
|
|
@@ -50,6 +51,7 @@ export interface MakeDatabaseItOptions<
|
|
|
50
51
|
Provided,
|
|
51
52
|
LayerError,
|
|
52
53
|
> {
|
|
54
|
+
readonly clock?: EffectClock;
|
|
53
55
|
readonly database: Database;
|
|
54
56
|
readonly layer: Layer.Layer<Provided, LayerError>;
|
|
55
57
|
}
|
package/src/testing/vitest.ts
CHANGED
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
import { it as effectIt } from "@effect/vitest";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
fixtureName,
|
|
6
|
-
makeDatabaseTester,
|
|
7
|
-
} from "../internal/vitest-database.js";
|
|
2
|
+
import { makeEffectIt } from "@shivaedev/effect-test";
|
|
3
|
+
import type { Effect, Layer } from "effect";
|
|
4
|
+
import { withTestTransaction } from "./transaction.js";
|
|
8
5
|
import type {
|
|
9
6
|
AnyDatabase,
|
|
10
7
|
DatabaseIt,
|
|
8
|
+
DatabaseService,
|
|
11
9
|
MakeDatabaseItOptions,
|
|
12
10
|
} from "./types.js";
|
|
13
11
|
|
|
@@ -25,34 +23,22 @@ export const makeDatabaseIt = <
|
|
|
25
23
|
): DatabaseIt<Database, Provided | Effect.Services<Database>> => {
|
|
26
24
|
type Services = Provided | Effect.Services<Database>;
|
|
27
25
|
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
);
|
|
40
|
-
} catch (error) {
|
|
41
|
-
await Effect.runPromise(Scope.close(scope, Exit.void));
|
|
42
|
-
throw error;
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
const effectDB = makeDatabaseTester(
|
|
48
|
-
fixtureIt as unknown as FixtureTestApi<Services>,
|
|
49
|
-
options.database,
|
|
50
|
-
);
|
|
26
|
+
const { effectApp } = makeEffectIt({
|
|
27
|
+
around: (effect) => withTestTransaction(options.database, effect),
|
|
28
|
+
clock: options.clock,
|
|
29
|
+
layer: options.layer,
|
|
30
|
+
makeHarness: () =>
|
|
31
|
+
options.database as unknown as Effect.Effect<
|
|
32
|
+
DatabaseService<Database>,
|
|
33
|
+
never,
|
|
34
|
+
Effect.Services<Database>
|
|
35
|
+
>,
|
|
36
|
+
});
|
|
51
37
|
|
|
52
38
|
return new Proxy(effectIt, {
|
|
53
39
|
get(target, property, receiver) {
|
|
54
40
|
if (property === "effectDB") {
|
|
55
|
-
return
|
|
41
|
+
return effectApp;
|
|
56
42
|
}
|
|
57
43
|
return Reflect.get(target, property, receiver);
|
|
58
44
|
},
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { TestContext, TestOptions } from "@effect/vitest";
|
|
2
|
-
import { type Context, Effect } from "effect";
|
|
3
|
-
import type { AnyDatabase, DatabaseTester } from "../testing/types.js";
|
|
4
|
-
export declare const fixtureName = "__effectPrismaContext";
|
|
5
|
-
export type DatabaseFixture<Provided> = TestContext & {
|
|
6
|
-
readonly [fixtureName]: Context.Context<Provided>;
|
|
7
|
-
};
|
|
8
|
-
export interface FixtureTestApi<Provided> {
|
|
9
|
-
(name: string, options: TestOptions, body: (context: DatabaseFixture<Provided>) => Promise<unknown>): void;
|
|
10
|
-
readonly skip: FixtureTestApi<Provided>;
|
|
11
|
-
readonly skipIf: (condition: unknown) => FixtureTestApi<Provided>;
|
|
12
|
-
readonly runIf: (condition: unknown) => FixtureTestApi<Provided>;
|
|
13
|
-
readonly only: FixtureTestApi<Provided>;
|
|
14
|
-
readonly fails: FixtureTestApi<Provided>;
|
|
15
|
-
readonly for: <Item>(cases: ReadonlyArray<Item>) => (name: string, options: TestOptions, body: (item: Item, context: DatabaseFixture<Provided>) => Promise<unknown>) => void;
|
|
16
|
-
}
|
|
17
|
-
export declare const makeDatabaseTester: <Database extends AnyDatabase, Provided>(fixtureIt: FixtureTestApi<Provided | Effect.Services<Database>>, database: Database) => DatabaseTester<Database, Provided | Effect.Services<Database>>;
|
|
18
|
-
//# sourceMappingURL=vitest-database.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vitest-database.d.ts","sourceRoot":"","sources":["../../src/internal/vitest-database.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAS,KAAK,OAAO,EAAE,MAAM,EAA2B,MAAM,QAAQ,CAAC;AAI9E,OAAO,KAAK,EACX,WAAW,EAGX,cAAc,EACd,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,WAAW,0BAA0B,CAAC;AAEnD,MAAM,MAAM,eAAe,CAAC,QAAQ,IAAI,WAAW,GAAG;IACrD,QAAQ,CAAC,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,WAAW,cAAc,CAAC,QAAQ;IACvC,CACC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GAC5D,IAAI,CAAC;IACR,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClE,QAAQ,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAClB,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,KACtB,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,KACtE,IAAI,CAAC;CACV;AAwCD,eAAO,MAAM,kBAAkB,GAAI,QAAQ,SAAS,WAAW,EAAE,QAAQ,EACxE,WAAW,cAAc,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAC/D,UAAU,QAAQ,KAChB,cAAc,CAAC,QAAQ,EAAE,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAyH/D,CAAC"}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { Cause, Effect, Exit, Layer } from "effect";
|
|
2
|
-
import * as TestClock from "effect/testing/TestClock";
|
|
3
|
-
import * as TestConsole from "effect/testing/TestConsole";
|
|
4
|
-
import { withTestTransaction } from "../testing/transaction.js";
|
|
5
|
-
export const fixtureName = "__effectPrismaContext";
|
|
6
|
-
const TestEnvironment = Layer.mergeAll(TestConsole.layer, TestClock.layer());
|
|
7
|
-
const contextFrom = (context) => context[fixtureName];
|
|
8
|
-
const runEffectTest = (effect, context) => Effect.runPromise(Effect.gen(function* () {
|
|
9
|
-
const exit = yield* Effect.exit(effect);
|
|
10
|
-
if (Exit.isFailure(exit)) {
|
|
11
|
-
for (const error of Cause.prettyErrors(exit.cause)) {
|
|
12
|
-
yield* Effect.logError(error);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
return yield* exit;
|
|
16
|
-
}).pipe(Effect.scoped, Effect.provide(TestEnvironment)), { signal: context.signal });
|
|
17
|
-
const normalizeTestOptions = (options) => typeof options === "number" ? { timeout: options } : (options ?? {});
|
|
18
|
-
const restoreContext = (fixture, context) => ({
|
|
19
|
-
...context,
|
|
20
|
-
[fixtureName]: fixture,
|
|
21
|
-
});
|
|
22
|
-
export const makeDatabaseTester = (fixtureIt, database) => {
|
|
23
|
-
const run = (body, context) => {
|
|
24
|
-
const effect = withTestTransaction(database, Effect.gen(function* () {
|
|
25
|
-
const service = yield* database;
|
|
26
|
-
return yield* Effect.gen(() => body(service, context));
|
|
27
|
-
})).pipe(Effect.provide(contextFrom(context)));
|
|
28
|
-
// The callback constraint proves that its services are in the built
|
|
29
|
-
// Layer. TypeScript cannot reduce that generic Exclude after
|
|
30
|
-
// Effect.provide, so the runner closes the type at this private boundary.
|
|
31
|
-
return effect;
|
|
32
|
-
};
|
|
33
|
-
const register = (current) => (name, body, options) => current(name, normalizeTestOptions(options), ({ __effectPrismaContext, task, signal, onTestFailed, onTestFinished, skip, annotate, expect, _local, }) => {
|
|
34
|
-
const testContext = restoreContext(__effectPrismaContext, {
|
|
35
|
-
task,
|
|
36
|
-
signal,
|
|
37
|
-
onTestFailed,
|
|
38
|
-
onTestFinished,
|
|
39
|
-
skip,
|
|
40
|
-
annotate,
|
|
41
|
-
expect,
|
|
42
|
-
_local,
|
|
43
|
-
});
|
|
44
|
-
return runEffectTest(run(body, testContext), testContext);
|
|
45
|
-
});
|
|
46
|
-
const make = (current) => {
|
|
47
|
-
const test = register(current);
|
|
48
|
-
return Object.assign(test, {
|
|
49
|
-
skip: register(current.skip),
|
|
50
|
-
skipIf: (condition) => register(current.skipIf(condition)),
|
|
51
|
-
runIf: (condition) => register(current.runIf(condition)),
|
|
52
|
-
only: register(current.only),
|
|
53
|
-
each: (cases) => {
|
|
54
|
-
return (name, body, options) => fixtureIt.for(cases)(name, normalizeTestOptions(options), (item, { __effectPrismaContext, task, signal, onTestFailed, onTestFinished, skip, annotate, expect, _local, }) => {
|
|
55
|
-
const testContext = restoreContext(__effectPrismaContext, {
|
|
56
|
-
task,
|
|
57
|
-
signal,
|
|
58
|
-
onTestFailed,
|
|
59
|
-
onTestFinished,
|
|
60
|
-
skip,
|
|
61
|
-
annotate,
|
|
62
|
-
expect,
|
|
63
|
-
_local,
|
|
64
|
-
});
|
|
65
|
-
return runEffectTest(run((service, testContext) => body(item, service, testContext), testContext), testContext);
|
|
66
|
-
});
|
|
67
|
-
},
|
|
68
|
-
fails: register(current.fails),
|
|
69
|
-
});
|
|
70
|
-
};
|
|
71
|
-
return make(fixtureIt);
|
|
72
|
-
};
|
|
73
|
-
//# sourceMappingURL=vitest-database.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vitest-database.js","sourceRoot":"","sources":["../../src/internal/vitest-database.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,201 +0,0 @@
|
|
|
1
|
-
import type { TestContext, TestOptions } from "@effect/vitest";
|
|
2
|
-
import { Cause, type Context, Effect, Exit, Layer, type Scope } from "effect";
|
|
3
|
-
import * as TestClock from "effect/testing/TestClock";
|
|
4
|
-
import * as TestConsole from "effect/testing/TestConsole";
|
|
5
|
-
import { withTestTransaction } from "../testing/transaction.js";
|
|
6
|
-
import type {
|
|
7
|
-
AnyDatabase,
|
|
8
|
-
DatabaseService,
|
|
9
|
-
DatabaseTest,
|
|
10
|
-
DatabaseTester,
|
|
11
|
-
} from "../testing/types.js";
|
|
12
|
-
|
|
13
|
-
export const fixtureName = "__effectPrismaContext";
|
|
14
|
-
|
|
15
|
-
export type DatabaseFixture<Provided> = TestContext & {
|
|
16
|
-
readonly [fixtureName]: Context.Context<Provided>;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
export interface FixtureTestApi<Provided> {
|
|
20
|
-
(
|
|
21
|
-
name: string,
|
|
22
|
-
options: TestOptions,
|
|
23
|
-
body: (context: DatabaseFixture<Provided>) => Promise<unknown>,
|
|
24
|
-
): void;
|
|
25
|
-
readonly skip: FixtureTestApi<Provided>;
|
|
26
|
-
readonly skipIf: (condition: unknown) => FixtureTestApi<Provided>;
|
|
27
|
-
readonly runIf: (condition: unknown) => FixtureTestApi<Provided>;
|
|
28
|
-
readonly only: FixtureTestApi<Provided>;
|
|
29
|
-
readonly fails: FixtureTestApi<Provided>;
|
|
30
|
-
readonly for: <Item>(
|
|
31
|
-
cases: ReadonlyArray<Item>,
|
|
32
|
-
) => (
|
|
33
|
-
name: string,
|
|
34
|
-
options: TestOptions,
|
|
35
|
-
body: (item: Item, context: DatabaseFixture<Provided>) => Promise<unknown>,
|
|
36
|
-
) => void;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
const TestEnvironment = Layer.mergeAll(TestConsole.layer, TestClock.layer());
|
|
40
|
-
|
|
41
|
-
const contextFrom = <Provided>(
|
|
42
|
-
context: TestContext,
|
|
43
|
-
): Context.Context<Provided> =>
|
|
44
|
-
(context as DatabaseFixture<Provided>)[fixtureName];
|
|
45
|
-
|
|
46
|
-
const runEffectTest = <A, E>(
|
|
47
|
-
effect: Effect.Effect<A, E, Scope.Scope>,
|
|
48
|
-
context: TestContext,
|
|
49
|
-
): Promise<A> =>
|
|
50
|
-
Effect.runPromise(
|
|
51
|
-
Effect.gen(function* () {
|
|
52
|
-
const exit = yield* Effect.exit(effect);
|
|
53
|
-
if (Exit.isFailure(exit)) {
|
|
54
|
-
for (const error of Cause.prettyErrors(exit.cause)) {
|
|
55
|
-
yield* Effect.logError(error);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return yield* exit;
|
|
59
|
-
}).pipe(Effect.scoped, Effect.provide(TestEnvironment)),
|
|
60
|
-
{ signal: context.signal },
|
|
61
|
-
);
|
|
62
|
-
|
|
63
|
-
const normalizeTestOptions = (
|
|
64
|
-
options: number | TestOptions | undefined,
|
|
65
|
-
): TestOptions =>
|
|
66
|
-
typeof options === "number" ? { timeout: options } : (options ?? {});
|
|
67
|
-
|
|
68
|
-
const restoreContext = <Provided>(
|
|
69
|
-
fixture: Context.Context<Provided>,
|
|
70
|
-
context: Omit<DatabaseFixture<Provided>, typeof fixtureName>,
|
|
71
|
-
): DatabaseFixture<Provided> =>
|
|
72
|
-
({
|
|
73
|
-
...context,
|
|
74
|
-
[fixtureName]: fixture,
|
|
75
|
-
}) as DatabaseFixture<Provided>;
|
|
76
|
-
|
|
77
|
-
export const makeDatabaseTester = <Database extends AnyDatabase, Provided>(
|
|
78
|
-
fixtureIt: FixtureTestApi<Provided | Effect.Services<Database>>,
|
|
79
|
-
database: Database,
|
|
80
|
-
): DatabaseTester<Database, Provided | Effect.Services<Database>> => {
|
|
81
|
-
type Services = Provided | Effect.Services<Database>;
|
|
82
|
-
|
|
83
|
-
const run = <A, Eff extends Effect.Effect<unknown, unknown, Services>>(
|
|
84
|
-
body: (
|
|
85
|
-
database: DatabaseService<Database>,
|
|
86
|
-
context: TestContext,
|
|
87
|
-
) => Generator<Eff, A, never>,
|
|
88
|
-
context: TestContext,
|
|
89
|
-
): Effect.Effect<A, unknown, Scope.Scope> => {
|
|
90
|
-
const effect = withTestTransaction(
|
|
91
|
-
database,
|
|
92
|
-
Effect.gen(function* () {
|
|
93
|
-
const service = yield* database as unknown as Effect.Effect<
|
|
94
|
-
DatabaseService<Database>,
|
|
95
|
-
never,
|
|
96
|
-
Effect.Services<Database>
|
|
97
|
-
>;
|
|
98
|
-
return yield* Effect.gen(() => body(service, context));
|
|
99
|
-
}),
|
|
100
|
-
).pipe(Effect.provide(contextFrom<Services>(context)));
|
|
101
|
-
|
|
102
|
-
// The callback constraint proves that its services are in the built
|
|
103
|
-
// Layer. TypeScript cannot reduce that generic Exclude after
|
|
104
|
-
// Effect.provide, so the runner closes the type at this private boundary.
|
|
105
|
-
return effect as unknown as Effect.Effect<A, unknown, Scope.Scope>;
|
|
106
|
-
};
|
|
107
|
-
|
|
108
|
-
const register =
|
|
109
|
-
(current: FixtureTestApi<Services>): DatabaseTest<Database, Services> =>
|
|
110
|
-
(name, body, options) =>
|
|
111
|
-
current(
|
|
112
|
-
name,
|
|
113
|
-
normalizeTestOptions(options),
|
|
114
|
-
({
|
|
115
|
-
__effectPrismaContext,
|
|
116
|
-
task,
|
|
117
|
-
signal,
|
|
118
|
-
onTestFailed,
|
|
119
|
-
onTestFinished,
|
|
120
|
-
skip,
|
|
121
|
-
annotate,
|
|
122
|
-
expect,
|
|
123
|
-
_local,
|
|
124
|
-
}: DatabaseFixture<Services>) => {
|
|
125
|
-
const testContext = restoreContext(__effectPrismaContext, {
|
|
126
|
-
task,
|
|
127
|
-
signal,
|
|
128
|
-
onTestFailed,
|
|
129
|
-
onTestFinished,
|
|
130
|
-
skip,
|
|
131
|
-
annotate,
|
|
132
|
-
expect,
|
|
133
|
-
_local,
|
|
134
|
-
});
|
|
135
|
-
return runEffectTest(run(body, testContext), testContext);
|
|
136
|
-
},
|
|
137
|
-
);
|
|
138
|
-
|
|
139
|
-
const make = (
|
|
140
|
-
current: FixtureTestApi<Services>,
|
|
141
|
-
): DatabaseTester<Database, Services> => {
|
|
142
|
-
const test = register(current);
|
|
143
|
-
|
|
144
|
-
return Object.assign(test, {
|
|
145
|
-
skip: register(current.skip),
|
|
146
|
-
skipIf: (condition: unknown) => register(current.skipIf(condition)),
|
|
147
|
-
runIf: (condition: unknown) => register(current.runIf(condition)),
|
|
148
|
-
only: register(current.only),
|
|
149
|
-
each: <Item>(cases: ReadonlyArray<Item>) => {
|
|
150
|
-
return <A, Eff extends Effect.Effect<unknown, unknown, Services>>(
|
|
151
|
-
name: string,
|
|
152
|
-
body: (
|
|
153
|
-
item: Item,
|
|
154
|
-
database: DatabaseService<Database>,
|
|
155
|
-
context: TestContext,
|
|
156
|
-
) => Generator<Eff, A, never>,
|
|
157
|
-
options?: number | TestOptions,
|
|
158
|
-
) =>
|
|
159
|
-
fixtureIt.for(cases)(
|
|
160
|
-
name,
|
|
161
|
-
normalizeTestOptions(options),
|
|
162
|
-
(
|
|
163
|
-
item,
|
|
164
|
-
{
|
|
165
|
-
__effectPrismaContext,
|
|
166
|
-
task,
|
|
167
|
-
signal,
|
|
168
|
-
onTestFailed,
|
|
169
|
-
onTestFinished,
|
|
170
|
-
skip,
|
|
171
|
-
annotate,
|
|
172
|
-
expect,
|
|
173
|
-
_local,
|
|
174
|
-
}: DatabaseFixture<Services>,
|
|
175
|
-
) => {
|
|
176
|
-
const testContext = restoreContext(__effectPrismaContext, {
|
|
177
|
-
task,
|
|
178
|
-
signal,
|
|
179
|
-
onTestFailed,
|
|
180
|
-
onTestFinished,
|
|
181
|
-
skip,
|
|
182
|
-
annotate,
|
|
183
|
-
expect,
|
|
184
|
-
_local,
|
|
185
|
-
});
|
|
186
|
-
return runEffectTest(
|
|
187
|
-
run(
|
|
188
|
-
(service, testContext) => body(item, service, testContext),
|
|
189
|
-
testContext,
|
|
190
|
-
),
|
|
191
|
-
testContext,
|
|
192
|
-
);
|
|
193
|
-
},
|
|
194
|
-
);
|
|
195
|
-
},
|
|
196
|
-
fails: register(current.fails),
|
|
197
|
-
});
|
|
198
|
-
};
|
|
199
|
-
|
|
200
|
-
return make(fixtureIt);
|
|
201
|
-
};
|