@shivaedev/effect-changes-prisma 0.5.1 → 0.5.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 +6 -0
- package/README.md +1 -1
- package/dist/changes.d.ts +1 -1
- package/dist/changes.d.ts.map +1 -1
- package/dist/changes.js +18 -15
- package/dist/changes.js.map +1 -1
- package/dist/coverage.d.ts +1 -1
- package/dist/coverage.d.ts.map +1 -1
- package/dist/coverage.js +2 -2
- package/dist/coverage.js.map +1 -1
- package/dist/expiry.d.ts +4 -4
- package/dist/expiry.d.ts.map +1 -1
- package/dist/expiry.js +15 -7
- package/dist/expiry.js.map +1 -1
- package/dist/model.d.ts +1 -1
- package/dist/model.d.ts.map +1 -1
- package/dist/model.js +3 -1
- package/dist/model.js.map +1 -1
- package/dist/recording.d.ts +3 -3
- package/dist/recording.d.ts.map +1 -1
- package/dist/recording.js +18 -12
- package/dist/recording.js.map +1 -1
- package/dist/tables.d.ts +1 -1
- package/dist/tables.d.ts.map +1 -1
- package/dist/tables.js +9 -3
- package/dist/tables.js.map +1 -1
- package/dist/transaction.d.ts +5 -4
- package/dist/transaction.d.ts.map +1 -1
- package/dist/transaction.js +19 -16
- package/dist/transaction.js.map +1 -1
- package/dist/write.d.ts +1 -1
- package/dist/write.d.ts.map +1 -1
- package/dist/write.js +2 -2
- package/dist/write.js.map +1 -1
- package/package.json +5 -4
- package/src/changes.ts +7 -7
- package/src/coverage.ts +2 -2
- package/src/expiry.ts +32 -26
- package/src/model.ts +3 -1
- package/src/recording.ts +10 -6
- package/src/tables.ts +11 -4
- package/src/transaction.ts +11 -8
- package/src/write.ts +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.5.2 - 2026-10-18
|
|
4
|
+
|
|
5
|
+
### Fixed
|
|
6
|
+
|
|
7
|
+
- `beforeCommit` now runs for Prisma transactions with the transaction's scoped client. Hook reads see uncommitted body rows, and a hook failure rolls back body and hook writes and publishes nothing.
|
|
8
|
+
|
|
3
9
|
## 0.5.1 - 2026-10-17
|
|
4
10
|
|
|
5
11
|
### Fixed
|
package/README.md
CHANGED
|
@@ -271,7 +271,7 @@ Import the module that defines the name. There is no root entry point.
|
|
|
271
271
|
| `tables.ts` | `RawQueryClient`, `TableWrites`, `tablesOf`, `tableWrites`, `writtenTables` |
|
|
272
272
|
| `error.ts` | `PrismaError`, `TransactionExpired` |
|
|
273
273
|
|
|
274
|
-
`PrismaChangesOptions` takes `client`, `models` and the effect-changes channel options other than `owner` and `unowned`: `name`, `key`, `publish` and `
|
|
274
|
+
`PrismaChangesOptions` takes `client`, `models` and the effect-changes channel options other than `owner` and `unowned`: `name`, `key`, `publish`, `onPublishFailure` and `beforeCommit`. The `beforeCommit` hook runs inside the Prisma transaction after the body succeeds, with its recorded changes, before commit. Calls to `use` in the hook use the transaction's scoped `Client`, so they see uncommitted body rows. A hook failure rolls back both body and hook writes and publishes nothing. The binding returns `Client`, `channel`, `use`, `transaction`, `recordWrite` and `Unnamed`.
|
|
275
275
|
|
|
276
276
|
```ts
|
|
277
277
|
interface Write {
|
package/dist/changes.d.ts
CHANGED
|
@@ -16,5 +16,5 @@ export interface PrismaChanges<TTx, A, R> {
|
|
|
16
16
|
readonly Unnamed: Context.Reference<UnnamedObserver>;
|
|
17
17
|
readonly use: <TX>(query: (client: TTx) => PromiseLike<TX>) => Effect.Effect<TX, PrismaError, R>;
|
|
18
18
|
}
|
|
19
|
-
export declare
|
|
19
|
+
export declare function makePrismaChanges<TTx extends Transactional<TTx>, A, R = never>(options: PrismaChangesOptions<TTx, A, R>): PrismaChanges<TTx, A, R>;
|
|
20
20
|
//# sourceMappingURL=changes.d.ts.map
|
package/dist/changes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,OAAO,EAAE,MAAM,EAAgB,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,cAAc,EAAe,MAAM,sCAAsC,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAG/E,OAAO,EAA4B,KAAK,YAAY,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAErF,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAE3E,MAAM,WAAW,oBAAoB,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAE,SAAQ,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvG,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,aAAa,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACtE,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAChC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAC/B,OAAO,CAAC,EAAE,kBAAkB,KACxB,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,kBAAkB,GAAG,WAAW,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;IACtE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IACrD,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,WAAW,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;CACjG;AAWD,
|
|
1
|
+
{"version":3,"file":"changes.d.ts","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,OAAO,EAAE,MAAM,EAAgB,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,cAAc,EAAe,MAAM,sCAAsC,CAAC;AACtG,OAAO,EAAE,WAAW,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAElE,OAAO,KAAK,EAAE,SAAS,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAG/E,OAAO,EAA4B,KAAK,YAAY,EAAE,KAAK,KAAK,EAAE,MAAM,YAAY,CAAC;AAErF,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,YAAY,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAE3E,MAAM,WAAW,oBAAoB,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAE,SAAQ,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvG,QAAQ,CAAC,MAAM,EAAE,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAC1C,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;CAC5C;AAED,MAAM,WAAW,aAAa,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACtE,QAAQ,CAAC,WAAW,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,EAChC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,EAC/B,OAAO,CAAC,EAAE,kBAAkB,KACxB,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,kBAAkB,GAAG,WAAW,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC;IACtE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IACrD,QAAQ,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,GAAG,KAAK,WAAW,CAAC,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;CACjG;AAWD,wBAAgB,iBAAiB,CAAC,GAAG,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,OAAO,EAAE,oBAAoB,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,CAgDlJ"}
|
package/dist/changes.js
CHANGED
|
@@ -12,7 +12,7 @@ function expireOnClosed(Expiry, exit) {
|
|
|
12
12
|
onSome: ({ cause }) => (isTransactionClosed(cause) ? Effect.flatMap(Effect.service(Expiry), (expire) => expire(cause)) : Effect.void),
|
|
13
13
|
});
|
|
14
14
|
}
|
|
15
|
-
export
|
|
15
|
+
export function makePrismaChanges(options) {
|
|
16
16
|
const { client, models: typed, ...channelOptions } = options;
|
|
17
17
|
const models = typed;
|
|
18
18
|
const prefix = `@shivaedev/effect-changes-prisma/${options.name}/${crypto.randomUUID()}`;
|
|
@@ -39,19 +39,22 @@ export const makePrismaChanges = (options) => {
|
|
|
39
39
|
yield* expireOnClosed(Expiry, exit);
|
|
40
40
|
return yield* exit;
|
|
41
41
|
}, Effect.uninterruptible);
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
42
|
+
function transaction(body, transactionOptions) {
|
|
43
|
+
return Effect.flatMap(Effect.service(Client), (current) => {
|
|
44
|
+
const savepoint = isTransactionClient(current);
|
|
45
|
+
const run = runTransaction({
|
|
46
|
+
body: () => body,
|
|
47
|
+
Client,
|
|
48
|
+
client: current,
|
|
49
|
+
deadline: savepoint ? undefined : (transactionOptions?.timeout ?? configuredTimeout(current)),
|
|
50
|
+
Expiry,
|
|
51
|
+
open: channel.open,
|
|
52
|
+
savepoint,
|
|
53
|
+
transaction: transactionOptions,
|
|
54
|
+
});
|
|
55
|
+
return savepoint ? run : Effect.provideService(run, Expiry, unlinked);
|
|
56
|
+
}).pipe(Effect.withSpan("PrismaChanges.transaction"));
|
|
57
|
+
}
|
|
55
58
|
return { Client, channel, recordWrite, transaction, Unnamed, use };
|
|
56
|
-
}
|
|
59
|
+
}
|
|
57
60
|
//# sourceMappingURL=changes.js.map
|
package/dist/changes.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"changes.js","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9D,OAAO,EAAqC,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACtG,OAAO,EAAE,WAAW,EAA2B,MAAM,YAAY,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAe,mBAAmB,EAAE,mBAAmB,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE7H,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAgD,MAAM,YAAY,CAAC;AAqBrF,MAAM,aAAa,GAAoB,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;AAEzD,SAAS,cAAc,CAAC,MAAiC,EAAE,IAAqC;IAC/F,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE;QAC7F,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI;QACzB,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;KACrI,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"changes.js","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"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"}
|
package/dist/coverage.d.ts
CHANGED
|
@@ -16,5 +16,5 @@ export interface Coverage<A> {
|
|
|
16
16
|
readonly unnamed: Iterable<UnnamedWrite>;
|
|
17
17
|
readonly written: Iterable<string>;
|
|
18
18
|
}
|
|
19
|
-
export declare
|
|
19
|
+
export declare function checkCoverage<A>(coverage: Coverage<A>): readonly CoverageViolation[];
|
|
20
20
|
//# sourceMappingURL=coverage.d.ts.map
|
package/dist/coverage.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,MAAM,iBAAiB,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC3F;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC;AAE9D,MAAM,WAAW,QAAQ,CAAC,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC;IACvD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACnC;AAUD,
|
|
1
|
+
{"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE/C,MAAM,MAAM,iBAAiB,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GAC3F;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAA;CAAE,CAAC;AAE9D,MAAM,WAAW,QAAQ,CAAC,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC;IACvD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IACzC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CACnC;AAUD,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,SAAS,iBAAiB,EAAE,CAcpF"}
|
package/dist/coverage.js
CHANGED
|
@@ -4,7 +4,7 @@ function recordedIn(observations) {
|
|
|
4
4
|
function identify(write) {
|
|
5
5
|
return write.reason === "narrowed" ? `${write.model}.${write.operation}.${write.field}` : `${write.model}.${write.operation}`;
|
|
6
6
|
}
|
|
7
|
-
export
|
|
7
|
+
export function checkCoverage(coverage) {
|
|
8
8
|
const recorded = recordedIn(coverage.observations);
|
|
9
9
|
const unrecorded = [...new Set(coverage.written)].flatMap((table) => {
|
|
10
10
|
const model = coverage.tables.get(table);
|
|
@@ -18,5 +18,5 @@ export const checkCoverage = (coverage) => {
|
|
|
18
18
|
});
|
|
19
19
|
const unnamed = new Map([...coverage.unnamed].map((write) => [identify(write), write]));
|
|
20
20
|
return [...unrecorded, ...[...unnamed.values()].map((write) => ({ _tag: "Unnamed", write }))];
|
|
21
|
-
}
|
|
21
|
+
}
|
|
22
22
|
//# sourceMappingURL=coverage.js.map
|
package/dist/coverage.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coverage.js","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"AAgBA,SAAS,UAAU,CAAI,YAAsC;IAC5D,OAAO,CAAC,GAAG,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAmB;IACpC,OAAO,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;AAC/H,CAAC;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"coverage.js","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"AAgBA,SAAS,UAAU,CAAI,YAAsC;IAC5D,OAAO,CAAC,GAAG,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACjH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAmB;IACpC,OAAO,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;AAC/H,CAAC;AAED,MAAM,UAAU,aAAa,CAAI,QAAqB;IACrD,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAgC,EAAE;QACjG,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5D,OAAO,EAAE,CAAC;QACX,CAAC;QACD,IAAI,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;YACtF,OAAO,EAAE,CAAC;QACX,CAAC;QACD,OAAO,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAU,CAAC,CAAC,CAAC;IACjG,OAAO,CAAC,GAAG,UAAU,EAAE,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAqB,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;AAClH,CAAC"}
|
package/dist/expiry.d.ts
CHANGED
|
@@ -2,9 +2,9 @@ import { Context, Effect } from "effect";
|
|
|
2
2
|
import { TransactionExpired } from "./error.ts";
|
|
3
3
|
export type Expire = (cause: unknown) => Effect.Effect<void>;
|
|
4
4
|
export declare const unlinked: Expire;
|
|
5
|
-
export declare
|
|
6
|
-
export declare
|
|
7
|
-
export declare
|
|
8
|
-
export declare
|
|
5
|
+
export declare function makeExpiry(key: string): Context.Reference<Expire>;
|
|
6
|
+
export declare function isTransactionClient(client: object): boolean;
|
|
7
|
+
export declare function isTransactionClosed(cause: unknown): boolean;
|
|
8
|
+
export declare function configuredTimeout(client: object): number | undefined;
|
|
9
9
|
export declare const expiring: <TX, E, R>(body: Effect.Effect<TX, E, R>, timeout: number | undefined, Expiry: Context.Reference<Expire>) => Effect.Effect<TX, E | TransactionExpired, R>;
|
|
10
10
|
//# sourceMappingURL=expiry.d.ts.map
|
package/dist/expiry.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expiry.d.ts","sourceRoot":"","sources":["../src/expiry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,OAAO,EAAY,MAAM,EAA6B,MAAM,QAAQ,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAE7D,eAAO,MAAM,QAAQ,EAAE,MAA0B,CAAC;AAElD,
|
|
1
|
+
{"version":3,"file":"expiry.d.ts","sourceRoot":"","sources":["../src/expiry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,OAAO,EAAY,MAAM,EAA6B,MAAM,QAAQ,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAE7D,eAAO,MAAM,QAAQ,EAAE,MAA0B,CAAC;AAElD,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,6BAErC;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAE3D;AAMD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAIpE;AAID,eAAO,MAAM,QAAQ,GAAgC,EAAE,EAAE,CAAC,EAAE,CAAC,gJAuB3D,CAAC"}
|
package/dist/expiry.js
CHANGED
|
@@ -1,16 +1,24 @@
|
|
|
1
1
|
import { Clock, Context, Deferred, Effect, Option, Predicate, Schema } from "effect";
|
|
2
2
|
import { TransactionExpired } from "./error.js";
|
|
3
3
|
export const unlinked = () => Effect.void;
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
export function makeExpiry(key) {
|
|
5
|
+
return Context.Reference(key, { defaultValue: () => unlinked });
|
|
6
|
+
}
|
|
7
|
+
export function isTransactionClient(client) {
|
|
8
|
+
return !Predicate.hasProperty(client, "$connect");
|
|
9
|
+
}
|
|
10
|
+
export function isTransactionClosed(cause) {
|
|
11
|
+
return Predicate.hasProperty(cause, "code") && cause.code === "P2028";
|
|
12
|
+
}
|
|
7
13
|
const EngineConfig = Schema.Struct({ transactionOptions: Schema.Struct({ timeout: Schema.Number }) });
|
|
8
14
|
const decodeEngineConfig = Schema.decodeUnknownOption(EngineConfig);
|
|
9
|
-
export
|
|
10
|
-
|
|
11
|
-
|
|
15
|
+
export function configuredTimeout(client) {
|
|
16
|
+
return Predicate.hasProperty(client, "_engineConfig")
|
|
17
|
+
? Option.getOrUndefined(Option.map(decodeEngineConfig(client._engineConfig), (config) => config.transactionOptions.timeout))
|
|
18
|
+
: undefined;
|
|
19
|
+
}
|
|
12
20
|
const wallClock = Clock.Clock.defaultValue();
|
|
13
|
-
export const expiring = (body, timeout, Expiry)
|
|
21
|
+
export const expiring = Effect.fnUntraced(function* (body, timeout, Expiry) {
|
|
14
22
|
const outer = yield* Expiry;
|
|
15
23
|
const expired = yield* Deferred.make();
|
|
16
24
|
const closed = (cause) => Effect.andThen(Deferred.fail(expired, new TransactionExpired({ cause, message: "The transaction was closed before its body finished" })), outer(cause));
|
package/dist/expiry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expiry.js","sourceRoot":"","sources":["../src/expiry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIhD,MAAM,CAAC,MAAM,QAAQ,GAAW,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;AAElD,MAAM,
|
|
1
|
+
{"version":3,"file":"expiry.js","sourceRoot":"","sources":["../src/expiry.ts"],"names":[],"mappings":"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"}
|
package/dist/model.d.ts
CHANGED
|
@@ -33,6 +33,6 @@ export type ChangeMap<TClient, A> = {
|
|
|
33
33
|
};
|
|
34
34
|
export declare const rowOperations: ReadonlySet<string>;
|
|
35
35
|
export declare const countOperations: ReadonlySet<string>;
|
|
36
|
-
export declare
|
|
36
|
+
export declare function delegateOf(model: string): string;
|
|
37
37
|
export {};
|
|
38
38
|
//# sourceMappingURL=model.d.ts.map
|
package/dist/model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,iBAAiB,GAAG,eAAe,GAAG,gBAAgB,GAAG,cAAc,CAAC;IAClG,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa,CAAC,GAAG;IACjC,YAAY,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,kBAAkB,KAAK,WAAW,CAAC,EAAE,CAAC,CAAC;CACnG;AAED,KAAK,SAAS,CAAC,SAAS,IAAI,SAAS,SAAS;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE;YAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,QAAQ,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEtJ,KAAK,SAAS,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC,CAAC;AAExE,MAAM,MAAM,SAAS,CAAC,OAAO,IAAI;KAC/B,IAAI,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,MAAM,CAAA;KAAE,GAAG,KAAK,GAAG,KAAK;CAC5H,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AAEtB,MAAM,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,SAAS,MAAM,IAAI,OAAO,CAC7D;KACE,IAAI,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,IAAI,GAAG,KAAK;CACrI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EACrB,MAAM,CACN,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,qBAAqB,GAAG,qBAAqB,CAAC;AAErH,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;AAExE,MAAM,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC;AAExF,MAAM,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI;IACnC,QAAQ,EAAE,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;CAC1F,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,MAAM,CAO5C,CAAC;AAEH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,CAAuE,CAAC;AAExH,
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,cAAc,CAAC,EAAE,iBAAiB,GAAG,eAAe,GAAG,gBAAgB,GAAG,cAAc,CAAC;IAClG,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa,CAAC,GAAG;IACjC,YAAY,EAAE,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,OAAO,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,kBAAkB,KAAK,WAAW,CAAC,EAAE,CAAC,CAAC;CACnG;AAED,KAAK,SAAS,CAAC,SAAS,IAAI,SAAS,SAAS;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE;YAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,QAAQ,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,GAAG,QAAQ,GAAG,KAAK,CAAC;AAEtJ,KAAK,SAAS,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,OAAO,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC,CAAC;AAExE,MAAM,MAAM,SAAS,CAAC,OAAO,IAAI;KAC/B,IAAI,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,MAAM,CAAA;KAAE,GAAG,KAAK,GAAG,KAAK;CAC5H,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;AAEtB,MAAM,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,SAAS,MAAM,IAAI,OAAO,CAC7D;KACE,IAAI,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAA;KAAE,GAAG,IAAI,GAAG,KAAK;CACrI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EACrB,MAAM,CACN,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,GAAG,qBAAqB,GAAG,qBAAqB,CAAC;AAErH,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,YAAY,GAAG,YAAY,CAAC;AAExE,MAAM,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC;AAExF,MAAM,MAAM,SAAS,CAAC,OAAO,EAAE,CAAC,IAAI;IACnC,QAAQ,EAAE,MAAM,IAAI,SAAS,CAAC,OAAO,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;CAC1F,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,WAAW,CAAC,MAAM,CAO5C,CAAC;AAEH,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,MAAM,CAAuE,CAAC;AAExH,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAEhD"}
|
package/dist/model.js
CHANGED
|
@@ -7,5 +7,7 @@ export const rowOperations = new Set([
|
|
|
7
7
|
"updateManyAndReturn",
|
|
8
8
|
]);
|
|
9
9
|
export const countOperations = new Set(["createMany", "updateMany", "deleteMany"]);
|
|
10
|
-
export
|
|
10
|
+
export function delegateOf(model) {
|
|
11
|
+
return `${model.charAt(0).toLowerCase()}${model.slice(1)}`;
|
|
12
|
+
}
|
|
11
13
|
//# sourceMappingURL=model.js.map
|
package/dist/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAmCA,MAAM,CAAC,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAe;IACvE,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,qBAAqB;IACrB,qBAAqB;CACrB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAiB,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;AAExH,MAAM,
|
|
1
|
+
{"version":3,"file":"model.js","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAmCA,MAAM,CAAC,MAAM,aAAa,GAAwB,IAAI,GAAG,CAAe;IACvE,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,qBAAqB;IACrB,qBAAqB;CACrB,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,eAAe,GAAwB,IAAI,GAAG,CAAiB,CAAC,YAAY,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;AAExH,MAAM,UAAU,UAAU,CAAC,KAAa;IACvC,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5D,CAAC"}
|
package/dist/recording.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { LooseMap, Write } from "./write.ts";
|
|
2
|
-
export declare
|
|
3
|
-
export declare
|
|
4
|
-
export declare
|
|
2
|
+
export declare function isWriteOperation(operation: string): boolean;
|
|
3
|
+
export declare function delegatesOf<A>(models: LooseMap<A>): ReadonlyMap<string, string>;
|
|
4
|
+
export declare function recordingClient<TClient extends object>(client: TClient, delegates: ReadonlyMap<string, string>, collect: (write: Write) => void): TClient;
|
|
5
5
|
//# sourceMappingURL=recording.d.ts.map
|
package/dist/recording.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recording.d.ts","sourceRoot":"","sources":["../src/recording.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAElD,
|
|
1
|
+
{"version":3,"file":"recording.d.ts","sourceRoot":"","sources":["../src/recording.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAElD,wBAAgB,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE3D;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAM/E;AAsBD,wBAAgB,eAAe,CAAC,OAAO,SAAS,MAAM,EACrD,MAAM,EAAE,OAAO,EACf,SAAS,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAC7B,OAAO,CAWT"}
|
package/dist/recording.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { countOperations, delegateOf, rowOperations } from "./model.js";
|
|
2
|
-
export
|
|
3
|
-
|
|
2
|
+
export function isWriteOperation(operation) {
|
|
3
|
+
return rowOperations.has(operation) || countOperations.has(operation);
|
|
4
|
+
}
|
|
5
|
+
export function delegatesOf(models) {
|
|
6
|
+
return new Map(Object.entries(models).flatMap(([model, changesOf]) => changesOf === undefined || changesOf === null ? [] : [[delegateOf(model), model]]));
|
|
7
|
+
}
|
|
4
8
|
function bound(value, target) {
|
|
5
9
|
return typeof value === "function" ? value.bind(target) : value;
|
|
6
10
|
}
|
|
@@ -18,14 +22,16 @@ function recordingDelegate(delegate, model, collect) {
|
|
|
18
22
|
},
|
|
19
23
|
});
|
|
20
24
|
}
|
|
21
|
-
export
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}
|
|
25
|
+
export function recordingClient(client, delegates, collect) {
|
|
26
|
+
return new Proxy(client, {
|
|
27
|
+
get: (target, key) => {
|
|
28
|
+
const value = Reflect.get(target, key);
|
|
29
|
+
const model = typeof key === "string" ? delegates.get(key) : undefined;
|
|
30
|
+
if (model !== undefined && typeof value === "object" && value !== null) {
|
|
31
|
+
return recordingDelegate(value, model, collect);
|
|
32
|
+
}
|
|
33
|
+
return bound(value, target);
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
}
|
|
31
37
|
//# sourceMappingURL=recording.js.map
|
package/dist/recording.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"recording.js","sourceRoot":"","sources":["../src/recording.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGxE,MAAM,
|
|
1
|
+
{"version":3,"file":"recording.js","sourceRoot":"","sources":["../src/recording.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGxE,MAAM,UAAU,gBAAgB,CAAC,SAAiB;IACjD,OAAO,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,WAAW,CAAI,MAAmB;IACjD,OAAO,IAAI,GAAG,CACb,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,EAAE,CACrD,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,CAAU,CAAC,CAC1F,CACD,CAAC;AACH,CAAC;AAED,SAAS,KAAK,CAAC,KAAc,EAAE,MAAc;IAC5C,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACjE,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB,EAAE,KAAa,EAAE,OAA+B;IAC1F,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE;QAC1B,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;YACpB,MAAM,KAAK,GAAY,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAChD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtF,OAAO,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,CAAC,GAAG,IAAwB,EAAE,EAAE,CACtC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAe,EAAE,EAAE;gBAC5E,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC3C,OAAO,MAAM,CAAC;YACf,CAAC,CAAC,CAAC;QACL,CAAC;KACD,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC9B,MAAe,EACf,SAAsC,EACtC,OAA+B;IAE/B,OAAO,IAAI,KAAK,CAAC,MAAM,EAAE;QACxB,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;YACpB,MAAM,KAAK,GAAY,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAChD,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACvE,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACxE,OAAO,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACjD,CAAC;YACD,OAAO,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;KACD,CAAC,CAAC;AACJ,CAAC"}
|
package/dist/tables.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
2
|
import { PrismaError } from "./error.ts";
|
|
3
|
-
export declare
|
|
3
|
+
export declare function tablesOf(schema: string): ReadonlyMap<string, string>;
|
|
4
4
|
export interface RawQueryClient {
|
|
5
5
|
$queryRawUnsafe: (query: string) => PromiseLike<unknown>;
|
|
6
6
|
}
|
package/dist/tables.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../src/tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAMzC,
|
|
1
|
+
{"version":3,"file":"tables.d.ts","sourceRoot":"","sources":["../src/tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAU,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAMzC,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAQpE;AAED,MAAM,WAAW,cAAc;IAC9B,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,WAAW,CAAC,OAAO,CAAC,CAAC;CACzD;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAStD,eAAO,MAAM,WAAW,oFAQtB,CAAC;AAEH,eAAO,MAAM,aAAa,0GAGxB,CAAC"}
|
package/dist/tables.js
CHANGED
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
import { Effect, Schema } from "effect";
|
|
2
2
|
import { PrismaError } from "./error.js";
|
|
3
|
-
const MODEL = /^[ \t]*model[ \t]+(
|
|
4
|
-
const MAPPED = /@@map\(\s*(?:name\s*:\s*)?"([^"]+)"/u;
|
|
3
|
+
const MODEL = /^[ \t]*model[ \t]+(?<model>\w+)[ \t]*\{(?<body>[\s\S]*?)^[ \t]*\}/gmu;
|
|
4
|
+
const MAPPED = /@@map\(\s*(?:name\s*:\s*)?"(?<table>[^"]+)"/u;
|
|
5
5
|
const COMMENT = /\/\/.*$/gmu;
|
|
6
|
-
export
|
|
6
|
+
export function tablesOf(schema) {
|
|
7
|
+
return new Map([...schema.replace(COMMENT, "").matchAll(MODEL)].map(({ groups }) => {
|
|
8
|
+
const model = groups?.model ?? "";
|
|
9
|
+
const body = groups?.body ?? "";
|
|
10
|
+
return [MAPPED.exec(body)?.groups?.table ?? model, model];
|
|
11
|
+
}));
|
|
12
|
+
}
|
|
7
13
|
const Counted = Schema.Array(Schema.Struct({ relname: Schema.String, writes: Schema.BigInt }));
|
|
8
14
|
const COUNTED = "select relname, n_tup_ins + n_tup_upd + n_tup_del as writes from pg_stat_xact_user_tables where n_tup_ins + n_tup_upd + n_tup_del > 0 order by relname";
|
|
9
15
|
const none = new Map();
|
package/dist/tables.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../src/tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,KAAK,GAAG,
|
|
1
|
+
{"version":3,"file":"tables.js","sourceRoot":"","sources":["../src/tables.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,MAAM,KAAK,GAAG,sEAAsE,CAAC;AACrF,MAAM,MAAM,GAAG,8CAA8C,CAAC;AAC9D,MAAM,OAAO,GAAG,YAAY,CAAC;AAE7B,MAAM,UAAU,QAAQ,CAAC,MAAc;IACtC,OAAO,IAAI,GAAG,CACb,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE;QACnE,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,EAAE,CAAC;QAClC,MAAM,IAAI,GAAG,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;QAChC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,IAAI,KAAK,EAAE,KAAK,CAAU,CAAC;IACpE,CAAC,CAAC,CACF,CAAC;AACH,CAAC;AAQD,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AAE/F,MAAM,OAAO,GACZ,wJAAwJ,CAAC;AAE1J,MAAM,IAAI,GAAgB,IAAI,GAAG,EAAE,CAAC;AAEpC,MAAM,CAAC,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAsB;IAClG,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IACpI,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACzH,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,OAAO,EAAE,CAAC;QAC3C,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,MAA4B,CAAC;AACrC,CAAC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,6BAA6B,CAAC,CAAC,QAAQ,CAAC,EAAE,MAAsB,EAAE,KAAK,GAAgB,IAAI;IACjI,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACrG,CAAC,CAAC,CAAC"}
|
package/dist/transaction.d.ts
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import { type Context, Effect } from "effect";
|
|
2
|
-
import type { Frame } from "@shivaedev/effect-changes/frame.ts";
|
|
2
|
+
import type { CommitFrame, Frame } from "@shivaedev/effect-changes/frame.ts";
|
|
3
3
|
import { PrismaError, TransactionExpired } from "./error.ts";
|
|
4
4
|
import { type Expire } from "./expiry.ts";
|
|
5
5
|
import type { Transactional, TransactionOptions } from "./model.ts";
|
|
6
|
-
export declare
|
|
6
|
+
export declare function runTransaction<TTx extends Transactional<TTx>, TX, E, R, TOpenRequirements>(options: {
|
|
7
7
|
readonly client: TTx;
|
|
8
|
-
readonly
|
|
8
|
+
readonly Client?: Context.Reference<TTx>;
|
|
9
|
+
readonly open: Effect.Effect<Frame & Partial<CommitFrame>, never, TOpenRequirements>;
|
|
9
10
|
readonly body: (tx: TTx) => Effect.Effect<TX, E, R>;
|
|
10
11
|
readonly transaction: TransactionOptions | undefined;
|
|
11
12
|
readonly savepoint: boolean;
|
|
12
13
|
readonly deadline: number | undefined;
|
|
13
14
|
readonly Expiry: Context.Reference<Expire>;
|
|
14
|
-
})
|
|
15
|
+
}): Effect.Effect<TX, E | TransactionExpired | PrismaError, R | TOpenRequirements>;
|
|
15
16
|
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,EAAQ,MAAM,QAAQ,CAAC;AACpD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,EAAQ,MAAM,QAAQ,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,oCAAoC,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,KAAK,MAAM,EAAiC,MAAM,aAAa,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA6CpE,wBAAgB,cAAc,CAAC,GAAG,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,iBAAiB,EAAE,OAAO,EAAE;IACpG,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;IACrB,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;IACrF,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,GAAG,KAAK,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IACpD,QAAQ,CAAC,WAAW,EAAE,kBAAkB,GAAG,SAAS,CAAC;IACrD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;CAC3C,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,kBAAkB,GAAG,WAAW,EAAE,CAAC,GAAG,iBAAiB,CAAC,CAiCjF"}
|
package/dist/transaction.js
CHANGED
|
@@ -27,20 +27,23 @@ function commit(client, options, savepoint, body, context, signal) {
|
|
|
27
27
|
}
|
|
28
28
|
return Promise.resolve(client.$transaction(run, options)).then((value) => ({ committed: true, exit: Exit.succeed(value) }), rejected);
|
|
29
29
|
}
|
|
30
|
-
export
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
30
|
+
export function runTransaction(options) {
|
|
31
|
+
return Effect.uninterruptibleMask((restore) => Effect.gen(function* () {
|
|
32
|
+
const { client, savepoint, body, deadline, Expiry } = options;
|
|
33
|
+
const frame = yield* options.open;
|
|
34
|
+
const context = yield* Effect.context();
|
|
35
|
+
const abort = new AbortController();
|
|
36
|
+
function guarded(tx) {
|
|
37
|
+
const work = frame.provide(Effect.tap(body(tx), () => frame.beforeCommit ?? Effect.void));
|
|
38
|
+
return expiring(options.Client === undefined ? work : Effect.provideService(work, options.Client, tx), deadline, Expiry);
|
|
39
|
+
}
|
|
40
|
+
const outcome = commit(client, options.transaction, savepoint, guarded, context, abort.signal);
|
|
41
|
+
const expire = yield* Expiry;
|
|
42
|
+
function settle(settled) {
|
|
43
|
+
return Effect.andThen(settled.closed === undefined ? Effect.void : expire(settled.closed.cause), Effect.as(frame.settle(settled.committed ? "committed" : "rolledBack"), settled.exit));
|
|
44
|
+
}
|
|
45
|
+
const result = yield* restore(Effect.promise(() => outcome)).pipe(Effect.onInterrupt(() => Effect.andThen(Effect.sync(() => abort.abort()), Effect.flatMap(Effect.promise(() => outcome), settle))));
|
|
46
|
+
return yield* Effect.flatten(settle(result));
|
|
47
|
+
}));
|
|
48
|
+
}
|
|
46
49
|
//# sourceMappingURL=transaction.js.map
|
package/dist/transaction.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAEpD,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAe,QAAQ,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AASzE,MAAM,UAAU;CAAG;AAEnB,SAAS,MAAM,CACd,MAAW,EACX,OAAuC,EACvC,SAAkB,EAClB,IAA0C,EAC1C,OAA2B,EAC3B,MAAmB;IAEnB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,MAAoC,CAAC;IACzC,KAAK,UAAU,GAAG,CAAC,EAAO;QACzB,OAAO,GAAG,IAAI,CAAC;QACf,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5E,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,KAAK,CAAC;QACnB,CAAC;QACD,MAAM,GAAG,IAAI,CAAC;QACd,MAAM,IAAI,UAAU,EAAE,CAAC;IACxB,CAAC;IACD,SAAS,QAAQ,CAAC,KAAc;QAC/B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QAC3C,CAAC;QACD,IAAI,CAAC,CAAC,mBAAmB,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC,EAAE,CAAC;YAC7D,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;QAC1E,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,kBAAkB,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,mDAAmD,EAAE,CAAC,CAAC;QAC/G,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;IAC9D,CAAC;IACD,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAC7D,CAAC,KAAK,EAAkB,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,EAC3E,QAAQ,CACR,CAAC;AACH,CAAC;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"transaction.js","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"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"}
|
package/dist/write.d.ts
CHANGED
|
@@ -21,5 +21,5 @@ export interface Interpreted<A> {
|
|
|
21
21
|
readonly changes: readonly A[];
|
|
22
22
|
readonly unnamed: UnnamedWrite | undefined;
|
|
23
23
|
}
|
|
24
|
-
export declare
|
|
24
|
+
export declare function interpret<A>(models: LooseMap<A>, write: Write): Interpreted<A>;
|
|
25
25
|
//# sourceMappingURL=write.d.ts.map
|
package/dist/write.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAmB,KAAK,YAAY,EAAiB,MAAM,YAAY,CAAC;AAE/E,MAAM,WAAW,KAAK;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,MAAM,YAAY,GACrB;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACpF;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/G,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAE/F,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;AAEvF,MAAM,WAAW,WAAW,CAAC,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC;CAC3C;AA+BD,
|
|
1
|
+
{"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAmB,KAAK,YAAY,EAAiB,MAAM,YAAY,CAAC;AAE/E,MAAM,WAAW,KAAK;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,MAAM,YAAY,GACrB;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACpF;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/G,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AAE/F,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;AAEvF,MAAM,WAAW,WAAW,CAAC,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,EAAE,CAAC;IAC/B,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC;CAC3C;AA+BD,wBAAgB,SAAS,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAwB9E"}
|
package/dist/write.js
CHANGED
|
@@ -22,7 +22,7 @@ function rowsOf(result) {
|
|
|
22
22
|
return (Array.isArray(result) ? result : [result]).filter((row) => typeof row === "object" && row !== null);
|
|
23
23
|
}
|
|
24
24
|
const nothing = { changes: [], unnamed: undefined };
|
|
25
|
-
export
|
|
25
|
+
export function interpret(models, write) {
|
|
26
26
|
const { model, operation } = write;
|
|
27
27
|
const changesOf = models[model];
|
|
28
28
|
if (changesOf === undefined || changesOf === null) {
|
|
@@ -47,5 +47,5 @@ export const interpret = (models, write) => {
|
|
|
47
47
|
throw error;
|
|
48
48
|
}
|
|
49
49
|
return { changes, unnamed: undefined };
|
|
50
|
-
}
|
|
50
|
+
}
|
|
51
51
|
//# sourceMappingURL=write.js.map
|
package/dist/write.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"write.js","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAqB,aAAa,EAAE,MAAM,YAAY,CAAC;AAqB/E,MAAM,YAAY;IACR,KAAK,CAAS;IAEvB,YAAY,KAAa;QACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;CACD;AAED,SAAS,OAAO,CAAC,GAAW;IAC3B,OAAO,IAAI,KAAK,CAAC,GAAG,EAAE;QACrB,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;YAC9B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;gBACjD,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;KACD,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB;IACxC,OAAO,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,MAAM,CAAC,MAAe;IAC9B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC;AAC5H,CAAC;AAED,MAAM,OAAO,GAAuB,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAExE,MAAM,
|
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAqB,aAAa,EAAE,MAAM,YAAY,CAAC;AAqB/E,MAAM,YAAY;IACR,KAAK,CAAS;IAEvB,YAAY,KAAa;QACxB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACpB,CAAC;CACD;AAED,SAAS,OAAO,CAAC,GAAW;IAC3B,OAAO,IAAI,KAAK,CAAC,GAAG,EAAE;QACrB,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;YAC9B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;gBACjD,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;YAC7B,CAAC;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;KACD,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,SAAiB;IACxC,OAAO,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,MAAM,CAAC,MAAe;IAC9B,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAiB,EAAE,CAAC,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,CAAC,CAAC;AAC5H,CAAC;AAED,MAAM,OAAO,GAAuB,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AAExE,MAAM,UAAU,SAAS,CAAI,MAAmB,EAAE,KAAY;IAC7D,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC;IACnC,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACnD,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACpC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC;IAC5E,CAAC;IACD,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC;IAChB,CAAC;IACD,MAAM,OAAO,GAAQ,EAAE,CAAC;IACxB,IAAI,CAAC;QACJ,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YACxC,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,YAAY,EAAE,CAAC;YACnC,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,EAAE,CAAC;QAC/F,CAAC;QACD,MAAM,KAAK,CAAC;IACb,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;AACxC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shivaedev/effect-changes-prisma",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.2",
|
|
4
4
|
"description": "Commit-bound change channels for Prisma Classic on PostgreSQL only: automatic change recording, publish after $transaction commits, and a test-time coverage check",
|
|
5
5
|
"homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/effect-changes-prisma#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -42,14 +42,15 @@
|
|
|
42
42
|
"README.md"
|
|
43
43
|
],
|
|
44
44
|
"dependencies": {
|
|
45
|
-
"@shivaedev/effect-changes": "0.3.
|
|
45
|
+
"@shivaedev/effect-changes": "0.3.1",
|
|
46
46
|
"@shivaedev/types": "0.2.1"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@prisma/adapter-pg": "7.10.0",
|
|
50
50
|
"@prisma/client": "7.10.0",
|
|
51
|
-
"@shivaedev/quality": "0.
|
|
52
|
-
"@
|
|
51
|
+
"@shivaedev/quality": "0.23.0",
|
|
52
|
+
"@shivaedev/test-story": "0.6.0",
|
|
53
|
+
"@types/node": "24.19.2",
|
|
53
54
|
"@typescript/native": "npm:typescript@7.0.2",
|
|
54
55
|
"effect": "4.0.4",
|
|
55
56
|
"prisma": "7.10.0",
|
package/src/changes.ts
CHANGED
|
@@ -35,9 +35,7 @@ function expireOnClosed(Expiry: Context.Reference<Expire>, exit: Exit.Exit<unkno
|
|
|
35
35
|
});
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
export
|
|
39
|
-
options: PrismaChangesOptions<TTx, A, R>,
|
|
40
|
-
): PrismaChanges<TTx, A, R> => {
|
|
38
|
+
export function makePrismaChanges<TTx extends Transactional<TTx>, A, R = never>(options: PrismaChangesOptions<TTx, A, R>): PrismaChanges<TTx, A, R> {
|
|
41
39
|
const { client, models: typed, ...channelOptions } = options;
|
|
42
40
|
const models: LooseMap<A> = typed;
|
|
43
41
|
const prefix = `@shivaedev/effect-changes-prisma/${options.name}/${crypto.randomUUID()}`;
|
|
@@ -67,11 +65,12 @@ export const makePrismaChanges = <TTx extends Transactional<TTx>, A, R = never>(
|
|
|
67
65
|
return yield* exit;
|
|
68
66
|
}, Effect.uninterruptible);
|
|
69
67
|
|
|
70
|
-
|
|
71
|
-
Effect.flatMap(Effect.service(Client), (current) => {
|
|
68
|
+
function transaction<TX, E, TR2>(body: Effect.Effect<TX, E, TR2>, transactionOptions?: TransactionOptions) {
|
|
69
|
+
return Effect.flatMap(Effect.service(Client), (current) => {
|
|
72
70
|
const savepoint = isTransactionClient(current);
|
|
73
71
|
const run = runTransaction({
|
|
74
|
-
body: (
|
|
72
|
+
body: () => body,
|
|
73
|
+
Client,
|
|
75
74
|
client: current,
|
|
76
75
|
deadline: savepoint ? undefined : (transactionOptions?.timeout ?? configuredTimeout(current)),
|
|
77
76
|
Expiry,
|
|
@@ -81,6 +80,7 @@ export const makePrismaChanges = <TTx extends Transactional<TTx>, A, R = never>(
|
|
|
81
80
|
});
|
|
82
81
|
return savepoint ? run : Effect.provideService(run, Expiry, unlinked);
|
|
83
82
|
}).pipe(Effect.withSpan("PrismaChanges.transaction"));
|
|
83
|
+
}
|
|
84
84
|
|
|
85
85
|
return { Client, channel, recordWrite, transaction, Unnamed, use };
|
|
86
|
-
}
|
|
86
|
+
}
|
package/src/coverage.ts
CHANGED
|
@@ -22,7 +22,7 @@ function identify(write: UnnamedWrite): string {
|
|
|
22
22
|
return write.reason === "narrowed" ? `${write.model}.${write.operation}.${write.field}` : `${write.model}.${write.operation}`;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
export
|
|
25
|
+
export function checkCoverage<A>(coverage: Coverage<A>): readonly CoverageViolation[] {
|
|
26
26
|
const recorded = recordedIn(coverage.observations);
|
|
27
27
|
const unrecorded = [...new Set(coverage.written)].flatMap((table): readonly CoverageViolation[] => {
|
|
28
28
|
const model = coverage.tables.get(table);
|
|
@@ -36,4 +36,4 @@ export const checkCoverage = <A>(coverage: Coverage<A>): readonly CoverageViolat
|
|
|
36
36
|
});
|
|
37
37
|
const unnamed = new Map([...coverage.unnamed].map((write) => [identify(write), write] as const));
|
|
38
38
|
return [...unrecorded, ...[...unnamed.values()].map((write): CoverageViolation => ({ _tag: "Unnamed", write }))];
|
|
39
|
-
}
|
|
39
|
+
}
|
package/src/expiry.ts
CHANGED
|
@@ -5,45 +5,51 @@ export type Expire = (cause: unknown) => Effect.Effect<void>;
|
|
|
5
5
|
|
|
6
6
|
export const unlinked: Expire = () => Effect.void;
|
|
7
7
|
|
|
8
|
-
export
|
|
8
|
+
export function makeExpiry(key: string) {
|
|
9
|
+
return Context.Reference<Expire>(key, { defaultValue: () => unlinked });
|
|
10
|
+
}
|
|
9
11
|
|
|
10
|
-
export
|
|
12
|
+
export function isTransactionClient(client: object): boolean {
|
|
13
|
+
return !Predicate.hasProperty(client, "$connect");
|
|
14
|
+
}
|
|
11
15
|
|
|
12
|
-
export
|
|
16
|
+
export function isTransactionClosed(cause: unknown): boolean {
|
|
17
|
+
return Predicate.hasProperty(cause, "code") && cause.code === "P2028";
|
|
18
|
+
}
|
|
13
19
|
|
|
14
20
|
const EngineConfig = Schema.Struct({ transactionOptions: Schema.Struct({ timeout: Schema.Number }) });
|
|
15
21
|
|
|
16
22
|
const decodeEngineConfig = Schema.decodeUnknownOption(EngineConfig);
|
|
17
23
|
|
|
18
|
-
export
|
|
19
|
-
Predicate.hasProperty(client, "_engineConfig")
|
|
24
|
+
export function configuredTimeout(client: object): number | undefined {
|
|
25
|
+
return Predicate.hasProperty(client, "_engineConfig")
|
|
20
26
|
? Option.getOrUndefined(Option.map(decodeEngineConfig(client._engineConfig), (config) => config.transactionOptions.timeout))
|
|
21
27
|
: undefined;
|
|
28
|
+
}
|
|
22
29
|
|
|
23
30
|
const wallClock = Clock.Clock.defaultValue();
|
|
24
31
|
|
|
25
|
-
export const expiring = <TX, E, R>(
|
|
32
|
+
export const expiring = Effect.fnUntraced(function* <TX, E, R>(
|
|
26
33
|
body: Effect.Effect<TX, E, R>,
|
|
27
34
|
timeout: number | undefined,
|
|
28
35
|
Expiry: Context.Reference<Expire>,
|
|
29
|
-
): Effect.
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
outer(cause),
|
|
37
|
-
);
|
|
38
|
-
const deadline =
|
|
39
|
-
timeout === undefined
|
|
40
|
-
? Effect.never
|
|
41
|
-
: Effect.andThen(
|
|
42
|
-
Effect.provideService(Effect.sleep(timeout), Clock.Clock, wallClock),
|
|
43
|
-
Deferred.fail(expired, new TransactionExpired({ message: `The transaction expired after its ${timeout} ms timeout` })),
|
|
44
|
-
);
|
|
45
|
-
const guard = Effect.andThen(Effect.raceFirst(deadline, Deferred.await(expired)), Deferred.await(expired));
|
|
46
|
-
return yield* Effect.raceFirst(Effect.provideService(body, Expiry, closed), guard).pipe(
|
|
47
|
-
Effect.catchCause((cause) => Effect.flatMap(Deferred.isDone(expired), (done) => (done ? Deferred.await(expired) : Effect.failCause(cause)))),
|
|
36
|
+
): Effect.fn.Return<TX, E | TransactionExpired, R> {
|
|
37
|
+
const outer = yield* Expiry;
|
|
38
|
+
const expired = yield* Deferred.make<never, TransactionExpired>();
|
|
39
|
+
const closed: Expire = (cause) =>
|
|
40
|
+
Effect.andThen(
|
|
41
|
+
Deferred.fail(expired, new TransactionExpired({ cause, message: "The transaction was closed before its body finished" })),
|
|
42
|
+
outer(cause),
|
|
48
43
|
);
|
|
49
|
-
|
|
44
|
+
const deadline =
|
|
45
|
+
timeout === undefined
|
|
46
|
+
? Effect.never
|
|
47
|
+
: Effect.andThen(
|
|
48
|
+
Effect.provideService(Effect.sleep(timeout), Clock.Clock, wallClock),
|
|
49
|
+
Deferred.fail(expired, new TransactionExpired({ message: `The transaction expired after its ${timeout} ms timeout` })),
|
|
50
|
+
);
|
|
51
|
+
const guard = Effect.andThen(Effect.raceFirst(deadline, Deferred.await(expired)), Deferred.await(expired));
|
|
52
|
+
return yield* Effect.raceFirst(Effect.provideService(body, Expiry, closed), guard).pipe(
|
|
53
|
+
Effect.catchCause((cause) => Effect.flatMap(Deferred.isDone(expired), (done) => (done ? Deferred.await(expired) : Effect.failCause(cause)))),
|
|
54
|
+
);
|
|
55
|
+
});
|
package/src/model.ts
CHANGED
|
@@ -44,4 +44,6 @@ export const rowOperations: ReadonlySet<string> = new Set<RowOperation>([
|
|
|
44
44
|
|
|
45
45
|
export const countOperations: ReadonlySet<string> = new Set<CountOperation>(["createMany", "updateMany", "deleteMany"]);
|
|
46
46
|
|
|
47
|
-
export
|
|
47
|
+
export function delegateOf(model: string): string {
|
|
48
|
+
return `${model.charAt(0).toLowerCase()}${model.slice(1)}`;
|
|
49
|
+
}
|
package/src/recording.ts
CHANGED
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
import { countOperations, delegateOf, rowOperations } from "./model.ts";
|
|
2
2
|
import type { LooseMap, Write } from "./write.ts";
|
|
3
3
|
|
|
4
|
-
export
|
|
4
|
+
export function isWriteOperation(operation: string): boolean {
|
|
5
|
+
return rowOperations.has(operation) || countOperations.has(operation);
|
|
6
|
+
}
|
|
5
7
|
|
|
6
|
-
export
|
|
7
|
-
new Map(
|
|
8
|
+
export function delegatesOf<A>(models: LooseMap<A>): ReadonlyMap<string, string> {
|
|
9
|
+
return new Map(
|
|
8
10
|
Object.entries(models).flatMap(([model, changesOf]) =>
|
|
9
11
|
changesOf === undefined || changesOf === null ? [] : [[delegateOf(model), model] as const],
|
|
10
12
|
),
|
|
11
13
|
);
|
|
14
|
+
}
|
|
12
15
|
|
|
13
16
|
function bound(value: unknown, target: object): unknown {
|
|
14
17
|
return typeof value === "function" ? value.bind(target) : value;
|
|
@@ -30,12 +33,12 @@ function recordingDelegate(delegate: object, model: string, collect: (write: Wri
|
|
|
30
33
|
});
|
|
31
34
|
}
|
|
32
35
|
|
|
33
|
-
export
|
|
36
|
+
export function recordingClient<TClient extends object>(
|
|
34
37
|
client: TClient,
|
|
35
38
|
delegates: ReadonlyMap<string, string>,
|
|
36
39
|
collect: (write: Write) => void,
|
|
37
|
-
): TClient
|
|
38
|
-
new Proxy(client, {
|
|
40
|
+
): TClient {
|
|
41
|
+
return new Proxy(client, {
|
|
39
42
|
get: (target, key) => {
|
|
40
43
|
const value: unknown = Reflect.get(target, key);
|
|
41
44
|
const model = typeof key === "string" ? delegates.get(key) : undefined;
|
|
@@ -45,3 +48,4 @@ export const recordingClient = <TClient extends object>(
|
|
|
45
48
|
return bound(value, target);
|
|
46
49
|
},
|
|
47
50
|
});
|
|
51
|
+
}
|
package/src/tables.ts
CHANGED
|
@@ -1,12 +1,19 @@
|
|
|
1
1
|
import { Effect, Schema } from "effect";
|
|
2
2
|
import { PrismaError } from "./error.ts";
|
|
3
3
|
|
|
4
|
-
const MODEL = /^[ \t]*model[ \t]+(
|
|
5
|
-
const MAPPED = /@@map\(\s*(?:name\s*:\s*)?"([^"]+)"/u;
|
|
4
|
+
const MODEL = /^[ \t]*model[ \t]+(?<model>\w+)[ \t]*\{(?<body>[\s\S]*?)^[ \t]*\}/gmu;
|
|
5
|
+
const MAPPED = /@@map\(\s*(?:name\s*:\s*)?"(?<table>[^"]+)"/u;
|
|
6
6
|
const COMMENT = /\/\/.*$/gmu;
|
|
7
7
|
|
|
8
|
-
export
|
|
9
|
-
new Map(
|
|
8
|
+
export function tablesOf(schema: string): ReadonlyMap<string, string> {
|
|
9
|
+
return new Map(
|
|
10
|
+
[...schema.replace(COMMENT, "").matchAll(MODEL)].map(({ groups }) => {
|
|
11
|
+
const model = groups?.model ?? "";
|
|
12
|
+
const body = groups?.body ?? "";
|
|
13
|
+
return [MAPPED.exec(body)?.groups?.table ?? model, model] as const;
|
|
14
|
+
}),
|
|
15
|
+
);
|
|
16
|
+
}
|
|
10
17
|
|
|
11
18
|
export interface RawQueryClient {
|
|
12
19
|
$queryRawUnsafe: (query: string) => PromiseLike<unknown>;
|
package/src/transaction.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type Context, Effect, Exit } from "effect";
|
|
2
|
-
import type { Frame } from "@shivaedev/effect-changes/frame.ts";
|
|
2
|
+
import type { CommitFrame, Frame } from "@shivaedev/effect-changes/frame.ts";
|
|
3
3
|
import { PrismaError, TransactionExpired } from "./error.ts";
|
|
4
4
|
import { type Expire, expiring, isTransactionClosed } from "./expiry.ts";
|
|
5
5
|
import type { Transactional, TransactionOptions } from "./model.ts";
|
|
@@ -47,23 +47,25 @@ function commit<TTx extends Transactional<TTx>, TX, E, R>(
|
|
|
47
47
|
);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
export
|
|
50
|
+
export function runTransaction<TTx extends Transactional<TTx>, TX, E, R, TOpenRequirements>(options: {
|
|
51
51
|
readonly client: TTx;
|
|
52
|
-
readonly
|
|
52
|
+
readonly Client?: Context.Reference<TTx>;
|
|
53
|
+
readonly open: Effect.Effect<Frame & Partial<CommitFrame>, never, TOpenRequirements>;
|
|
53
54
|
readonly body: (tx: TTx) => Effect.Effect<TX, E, R>;
|
|
54
55
|
readonly transaction: TransactionOptions | undefined;
|
|
55
56
|
readonly savepoint: boolean;
|
|
56
57
|
readonly deadline: number | undefined;
|
|
57
58
|
readonly Expiry: Context.Reference<Expire>;
|
|
58
|
-
}): Effect.Effect<TX, E | TransactionExpired | PrismaError, R | TOpenRequirements>
|
|
59
|
-
Effect.uninterruptibleMask((restore) =>
|
|
59
|
+
}): Effect.Effect<TX, E | TransactionExpired | PrismaError, R | TOpenRequirements> {
|
|
60
|
+
return Effect.uninterruptibleMask((restore) =>
|
|
60
61
|
Effect.gen(function* () {
|
|
61
62
|
const { client, savepoint, body, deadline, Expiry } = options;
|
|
62
63
|
const frame = yield* options.open;
|
|
63
64
|
const context = yield* Effect.context<R>();
|
|
64
65
|
const abort = new AbortController();
|
|
65
66
|
function guarded(tx: TTx) {
|
|
66
|
-
|
|
67
|
+
const work = frame.provide(Effect.tap(body(tx), () => frame.beforeCommit ?? Effect.void));
|
|
68
|
+
return expiring(options.Client === undefined ? work : Effect.provideService(work, options.Client, tx), deadline, Expiry);
|
|
67
69
|
}
|
|
68
70
|
const outcome = commit(client, options.transaction, savepoint, guarded, context, abort.signal);
|
|
69
71
|
const expire = yield* Expiry;
|
|
@@ -73,7 +75,7 @@ export const runTransaction = <TTx extends Transactional<TTx>, TX, E, R, TOpenRe
|
|
|
73
75
|
Effect.as(frame.settle(settled.committed ? "committed" : "rolledBack"), settled.exit),
|
|
74
76
|
);
|
|
75
77
|
}
|
|
76
|
-
const
|
|
78
|
+
const result = yield* restore(Effect.promise(() => outcome)).pipe(
|
|
77
79
|
Effect.onInterrupt(() =>
|
|
78
80
|
Effect.andThen(
|
|
79
81
|
Effect.sync(() => abort.abort()),
|
|
@@ -84,6 +86,7 @@ export const runTransaction = <TTx extends Transactional<TTx>, TX, E, R, TOpenRe
|
|
|
84
86
|
),
|
|
85
87
|
),
|
|
86
88
|
);
|
|
87
|
-
return yield* Effect.flatten(settle(
|
|
89
|
+
return yield* Effect.flatten(settle(result));
|
|
88
90
|
}),
|
|
89
91
|
);
|
|
92
|
+
}
|
package/src/write.ts
CHANGED
|
@@ -49,7 +49,7 @@ function rowsOf(result: unknown): readonly object[] {
|
|
|
49
49
|
|
|
50
50
|
const nothing: Interpreted<never> = { changes: [], unnamed: undefined };
|
|
51
51
|
|
|
52
|
-
export
|
|
52
|
+
export function interpret<A>(models: LooseMap<A>, write: Write): Interpreted<A> {
|
|
53
53
|
const { model, operation } = write;
|
|
54
54
|
const changesOf = models[model];
|
|
55
55
|
if (changesOf === undefined || changesOf === null) {
|
|
@@ -73,4 +73,4 @@ export const interpret = <A>(models: LooseMap<A>, write: Write): Interpreted<A>
|
|
|
73
73
|
throw error;
|
|
74
74
|
}
|
|
75
75
|
return { changes, unnamed: undefined };
|
|
76
|
-
}
|
|
76
|
+
}
|