@shivaedev/effect-changes-prisma 0.5.0 → 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 +12 -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 +6 -5
- 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,17 @@
|
|
|
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
|
+
|
|
9
|
+
## 0.5.1 - 2026-10-17
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- Publish against `@shivaedev/types` 0.2.1 so framework consumers share the current version.
|
|
14
|
+
|
|
3
15
|
## 0.5.0 - 2026-10-13
|
|
4
16
|
|
|
5
17
|
### Changed
|
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.
|
|
46
|
-
"@shivaedev/types": "0.2.
|
|
45
|
+
"@shivaedev/effect-changes": "0.3.1",
|
|
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
|
+
}
|