@shivaedev/effect-changes-prisma 0.5.1 → 0.5.3

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 CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.3 - 2026-10-24
4
+
5
+ ### Changed
6
+
7
+ - Require Effect and its companion packages at exactly 4.0.5. Generated applications use the same versions.
8
+
9
+ ## 0.5.2 - 2026-10-18
10
+
11
+ ### Fixed
12
+
13
+ - `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.
14
+
3
15
  ## 0.5.1 - 2026-10-17
4
16
 
5
17
  ### Fixed
package/README.md CHANGED
@@ -178,7 +178,7 @@ const save = changes.transaction(
178
178
  );
179
179
  ```
180
180
 
181
- Pass transaction options as the second argument. Without `timeout`, the binding uses the current client's configured transaction timeout; the tested Prisma default is 5,000 milliseconds. The configuration reader also handles an extended client. If that configuration cannot be read, it supplies no deadline of its own; a query finding the transaction closed still stops the body.
181
+ Pass transaction options as the second argument. Without `timeout`, the binding uses the current client's configured transaction timeout; Prisma's default is 5,000 milliseconds. The configuration reader also handles an extended client. If that configuration cannot be read, it supplies no deadline of its own; a query finding the transaction closed still stops the body.
182
182
 
183
183
  The deadline follows the wall clock, so moving Effect's `TestClock` does not expire the transaction. An outer transaction's expiry interrupts a nested body too. A separate transaction started on the base client, or another binding's transaction, has independent expiry; handling its failure can leave the original body's transaction running.
184
184
 
@@ -271,41 +271,16 @@ 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 `onPublishFailure`. The binding returns `Client`, `channel`, `use`, `transaction`, `recordWrite` and `Unnamed`.
275
-
276
- ```ts
277
- interface Write {
278
- readonly model: string;
279
- readonly operation: string;
280
- readonly result: unknown;
281
- }
282
-
283
- type UnnamedWrite =
284
- | { readonly model: string; readonly operation: string; readonly reason: "countOnly" }
285
- | { readonly model: string; readonly operation: string; readonly reason: "narrowed"; readonly field: string };
286
-
287
- type CoverageViolation =
288
- | { readonly _tag: "Unrecorded"; readonly table: string; readonly model: string | undefined }
289
- | { readonly _tag: "Unnamed"; readonly write: UnnamedWrite };
290
- ```
291
-
292
- These are the write input and the two diagnostic results. `Coverage<A>` takes `written`, `tables`, `models`, `observations`, `unnamed` and `covers`, as shown in the harness. `TableWrites` is a `ReadonlyMap<string, bigint>`; `RawQueryClient` requires `$queryRawUnsafe(query)`.
293
-
294
- `use` has error type `PrismaError`. `transaction` adds `TransactionExpired | PrismaError` to the body's error type. `PrismaError` carries `cause`; `TransactionExpired` carries `message` and optional `cause`. Transaction options are `maxWait`, `timeout` and `isolationLevel`, whose type is `"ReadUncommitted" | "ReadCommitted" | "RepeatableRead" | "Serializable"`.
295
-
296
- The module export pattern also exposes `model.ts`'s `rowOperations`, `countOperations` and `delegateOf`; `write.ts`'s `interpret`, `Interpreted`, `LooseChanges` and `LooseMap`; and the helpers in [`recording.ts`](https://github.com/ShivaeDev/platform/blob/main/packages/effect-changes-prisma/src/recording.ts), [`expiry.ts`](https://github.com/ShivaeDev/platform/blob/main/packages/effect-changes-prisma/src/expiry.ts) and [`transaction.ts`](https://github.com/ShivaeDev/platform/blob/main/packages/effect-changes-prisma/src/transaction.ts). Application examples use the binding API above.
274
+ `makePrismaChanges` also accepts the effect-changes channel options `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.
297
275
 
298
276
  ### Install, setup and limits
299
277
 
300
278
  ```sh
301
- pnpm add @shivaedev/effect-changes-prisma @shivaedev/effect-changes @prisma/client@7.10.0 effect@4.0.4
279
+ pnpm add @shivaedev/effect-changes-prisma @shivaedev/effect-changes @prisma/client@7.10.0 effect@4.0.5
302
280
  ```
303
281
 
304
- `@prisma/client` and `effect` are peers. Generate and construct the application's Prisma Classic client for PostgreSQL before binding it. Package tests use the generated Prisma client and `@prisma/adapter-pg`; the PostgreSQL integration suite requires `PLATFORM_EFFECT_CHANGES_PRISMA_TEST_DATABASE_URL` and otherwise skips.
282
+ `@prisma/client` and `effect` are peers. Generate and construct the application's Prisma Classic client for PostgreSQL before binding it.
305
283
 
306
284
  - Use the binding's `transaction` for the transaction outcome it observes, and `use` for automatically recorded model writes.
307
285
  - Return the fields the model mapping needs. The count-only and missing-field diagnostics are part of coverage, not a way to infer omitted subjects.
308
286
  - Coverage is a table-level check: one matching recorded change covers a written model's table. Test the correctness of affected subjects separately.
309
- - A test harness's native rollback transaction can contain root binding savepoints that publish before the harness rolls back. Capture publication in tests that must not call a real external sink.
310
-
311
- Read the [north star](https://github.com/ShivaeDev/platform/blob/main/packages/effect-changes-prisma/docs/north-star.md) for design boundaries and the [roadmap](https://github.com/ShivaeDev/platform/blob/main/packages/effect-changes-prisma/docs/roadmap.md) for status and open questions.
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 const makePrismaChanges: <TTx extends Transactional<TTx>, A, R = never>(options: PrismaChangesOptions<TTx, A, R>) => PrismaChanges<TTx, A, R>;
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
@@ -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,eAAO,MAAM,iBAAiB,GAAI,GAAG,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,WACpE,oBAAoB,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,KACtC,aAAa,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CA8CzB,CAAC"}
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 const makePrismaChanges = (options) => {
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
- const transaction = (body, transactionOptions) => Effect.flatMap(Effect.service(Client), (current) => {
43
- const savepoint = isTransactionClient(current);
44
- const run = runTransaction({
45
- body: (tx) => Effect.provideService(body, Client, tx),
46
- client: current,
47
- deadline: savepoint ? undefined : (transactionOptions?.timeout ?? configuredTimeout(current)),
48
- Expiry,
49
- open: channel.open,
50
- savepoint,
51
- transaction: transactionOptions,
52
- });
53
- return savepoint ? run : Effect.provideService(run, Expiry, unlinked);
54
- }).pipe(Effect.withSpan("PrismaChanges.transaction"));
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
@@ -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,CAAC,MAAM,iBAAiB,GAAG,CAChC,OAAwC,EACb,EAAE;IAC7B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,cAAc,EAAE,GAAG,OAAO,CAAC;IAC7D,MAAM,MAAM,GAAgB,KAAK,CAAC;IAClC,MAAM,MAAM,GAAG,oCAAoC,OAAO,CAAC,IAAI,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;IACzF,MAAM,OAAO,GAAG,WAAW,CAAO,EAAE,GAAG,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxF,MAAM,MAAM,GAAG,OAAO,CAAC,SAAS,CAAM,GAAG,MAAM,SAAS,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1F,MAAM,OAAO,GAAG,OAAO,CAAC,SAAS,CAAkB,GAAG,MAAM,UAAU,EAAE,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;IAC/G,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,MAAM,SAAS,CAAC,CAAC;IAC9C,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IAEtC,MAAM,WAAW,GAAG,MAAM,CAAC,EAAE,CAAC,2BAA2B,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAY;QACjF,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QACtD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC3B,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACxB,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,EAAM,KAAuC;QAChG,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC;QAC9B,MAAM,MAAM,GAAY,EAAE,CAAC;QAC3B,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACrF,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,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,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;QAClI,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,KAAK,CAAC,CAAC,cAAc,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACpC,OAAO,KAAK,CAAC,CAAC,IAAI,CAAC;IACpB,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;IAE3B,MAAM,WAAW,GAAG,CAAa,IAA+B,EAAE,kBAAuC,EAAE,EAAE,CAC5G,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE;QAClD,MAAM,SAAS,GAAG,mBAAmB,CAAC,OAAO,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,cAAc,CAAC;YAC1B,IAAI,EAAE,CAAC,EAAO,EAAE,EAAE,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;YAC1D,MAAM,EAAE,OAAO;YACf,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,kBAAkB,EAAE,OAAO,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAC7F,MAAM;YACN,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,SAAS;YACT,WAAW,EAAE,kBAAkB;SAC/B,CAAC,CAAC;QACH,OAAO,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC,CAAC;IAEvD,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AACpE,CAAC,CAAC"}
1
+ {"version":3,"file":"changes.js","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"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"}
@@ -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 const checkCoverage: <A>(coverage: Coverage<A>) => readonly CoverageViolation[];
19
+ export declare function checkCoverage<A>(coverage: Coverage<A>): readonly CoverageViolation[];
20
20
  //# sourceMappingURL=coverage.d.ts.map
@@ -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,eAAO,MAAM,aAAa,GAAI,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAG,SAAS,iBAAiB,EAclF,CAAC"}
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 const checkCoverage = (coverage) => {
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
@@ -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,CAAC,MAAM,aAAa,GAAG,CAAI,QAAqB,EAAgC,EAAE;IACvF,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,CAAC"}
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 const makeExpiry: (key: string) => Context.Reference<Expire>;
6
- export declare const isTransactionClient: (client: object) => boolean;
7
- export declare const isTransactionClosed: (cause: unknown) => boolean;
8
- export declare const configuredTimeout: (client: object) => number | undefined;
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
@@ -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,eAAO,MAAM,UAAU,QAAS,MAAM,8BAAqE,CAAC;AAE5G,eAAO,MAAM,mBAAmB,WAAY,MAAM,KAAG,OAAqD,CAAC;AAE3G,eAAO,MAAM,mBAAmB,UAAW,OAAO,KAAG,OAAyE,CAAC;AAM/H,eAAO,MAAM,iBAAiB,WAAY,MAAM,KAAG,MAAM,GAAG,SAG/C,CAAC;AAId,eAAO,MAAM,QAAQ,GAAI,EAAE,EAAE,CAAC,EAAE,CAAC,QAC1B,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,WACpB,MAAM,GAAG,SAAS,UACnB,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,KAC/B,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,kBAAkB,EAAE,CAAC,CAoB3C,CAAC"}
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 const makeExpiry = (key) => Context.Reference(key, { defaultValue: () => unlinked });
5
- export const isTransactionClient = (client) => !Predicate.hasProperty(client, "$connect");
6
- export const isTransactionClosed = (cause) => Predicate.hasProperty(cause, "code") && cause.code === "P2028";
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 const configuredTimeout = (client) => Predicate.hasProperty(client, "_engineConfig")
10
- ? Option.getOrUndefined(Option.map(decodeEngineConfig(client._engineConfig), (config) => config.transactionOptions.timeout))
11
- : undefined;
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) => Effect.gen(function* () {
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));
@@ -1 +1 @@
1
- {"version":3,"file":"expiry.js","sourceRoot":"","sources":["../src/expiry.ts"],"names":[],"mappings":"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"}
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 const delegateOf: (model: string) => string;
36
+ export declare function delegateOf(model: string): string;
37
37
  export {};
38
38
  //# sourceMappingURL=model.d.ts.map
@@ -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,eAAO,MAAM,UAAU,UAAW,MAAM,KAAG,MAA6D,CAAC"}
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 const delegateOf = (model) => `${model.charAt(0).toLowerCase()}${model.slice(1)}`;
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,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAU,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC"}
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"}
@@ -1,5 +1,5 @@
1
1
  import type { LooseMap, Write } from "./write.ts";
2
- export declare const isWriteOperation: (operation: string) => boolean;
3
- export declare const delegatesOf: <A>(models: LooseMap<A>) => ReadonlyMap<string, string>;
4
- export declare const recordingClient: <TClient extends object>(client: TClient, delegates: ReadonlyMap<string, string>, collect: (write: Write) => void) => TClient;
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
@@ -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,eAAO,MAAM,gBAAgB,cAAe,MAAM,KAAG,OAAyE,CAAC;AAE/H,eAAO,MAAM,WAAW,GAAI,CAAC,UAAU,QAAQ,CAAC,CAAC,CAAC,KAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAK7E,CAAC;AAsBH,eAAO,MAAM,eAAe,GAAI,OAAO,SAAS,MAAM,UAC7C,OAAO,aACJ,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,WAC7B,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,KAC7B,OAUA,CAAC"}
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 const isWriteOperation = (operation) => rowOperations.has(operation) || countOperations.has(operation);
3
- export const delegatesOf = (models) => new Map(Object.entries(models).flatMap(([model, changesOf]) => changesOf === undefined || changesOf === null ? [] : [[delegateOf(model), model]]));
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 const recordingClient = (client, delegates, collect) => new Proxy(client, {
22
- get: (target, key) => {
23
- const value = Reflect.get(target, key);
24
- const model = typeof key === "string" ? delegates.get(key) : undefined;
25
- if (model !== undefined && typeof value === "object" && value !== null) {
26
- return recordingDelegate(value, model, collect);
27
- }
28
- return bound(value, target);
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
@@ -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,CAAC,MAAM,gBAAgB,GAAG,CAAC,SAAiB,EAAW,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAE/H,MAAM,CAAC,MAAM,WAAW,GAAG,CAAI,MAAmB,EAA+B,EAAE,CAClF,IAAI,GAAG,CACN,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;AAEH,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,CAAC,MAAM,eAAe,GAAG,CAC9B,MAAe,EACf,SAAsC,EACtC,OAA+B,EACrB,EAAE,CACZ,IAAI,KAAK,CAAC,MAAM,EAAE;IACjB,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACpB,MAAM,KAAK,GAAY,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,IAAI,KAAK,KAAK,SAAS,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACxE,OAAO,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC;CACD,CAAC,CAAC"}
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 const tablesOf: (schema: string) => ReadonlyMap<string, string>;
3
+ export declare function tablesOf(schema: string): ReadonlyMap<string, string>;
4
4
  export interface RawQueryClient {
5
5
  $queryRawUnsafe: (query: string) => PromiseLike<unknown>;
6
6
  }
@@ -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,eAAO,MAAM,QAAQ,WAAY,MAAM,KAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAC4E,CAAC;AAEjJ,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"}
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]+(\w+)[ \t]*\{([\s\S]*?)^[ \t]*\}/gmu;
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 const tablesOf = (schema) => new Map([...schema.replace(COMMENT, "").matchAll(MODEL)].map(([, model = "", body = ""]) => [MAPPED.exec(body)?.[1] ?? model, model]));
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();
@@ -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,uDAAuD,CAAC;AACtE,MAAM,MAAM,GAAG,sCAAsC,CAAC;AACtD,MAAM,OAAO,GAAG,YAAY,CAAC;AAE7B,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,MAAc,EAA+B,EAAE,CACvE,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,EAAE,EAAE,IAAI,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,KAAK,CAAU,CAAC,CAAC,CAAC;AAQjJ,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"}
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"}
@@ -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 const runTransaction: <TTx extends Transactional<TTx>, TX, E, R, TOpenRequirements>(options: {
6
+ export declare function runTransaction<TTx extends Transactional<TTx>, TX, E, R, TOpenRequirements>(options: {
7
7
  readonly client: TTx;
8
- readonly open: Effect.Effect<Frame, never, TOpenRequirements>;
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
- }) => Effect.Effect<TX, E | TransactionExpired | PrismaError, R | TOpenRequirements>;
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;AAChE,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,eAAO,MAAM,cAAc,GAAI,GAAG,SAAS,aAAa,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,iBAAiB,WAAW;IACpG,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC;IACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,iBAAiB,CAAC,CAAC;IAC9D,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,KAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,GAAG,kBAAkB,GAAG,WAAW,EAAE,CAAC,GAAG,iBAAiB,CA+B/E,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"}
@@ -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 const runTransaction = (options) => Effect.uninterruptibleMask((restore) => Effect.gen(function* () {
31
- const { client, savepoint, body, deadline, Expiry } = options;
32
- const frame = yield* options.open;
33
- const context = yield* Effect.context();
34
- const abort = new AbortController();
35
- function guarded(tx) {
36
- return expiring(frame.provide(body(tx)), deadline, Expiry);
37
- }
38
- const outcome = commit(client, options.transaction, savepoint, guarded, context, abort.signal);
39
- const expire = yield* Expiry;
40
- function settle(settled) {
41
- return Effect.andThen(settled.closed === undefined ? Effect.void : expire(settled.closed.cause), Effect.as(frame.settle(settled.committed ? "committed" : "rolledBack"), settled.exit));
42
- }
43
- const settled = yield* restore(Effect.promise(() => outcome)).pipe(Effect.onInterrupt(() => Effect.andThen(Effect.sync(() => abort.abort()), Effect.flatMap(Effect.promise(() => outcome), settle))));
44
- return yield* Effect.flatten(settle(settled));
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
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.js","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"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"}
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 const interpret: <A>(models: LooseMap<A>, write: Write) => Interpreted<A>;
24
+ export declare function interpret<A>(models: LooseMap<A>, write: Write): Interpreted<A>;
25
25
  //# sourceMappingURL=write.d.ts.map
@@ -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,eAAO,MAAM,SAAS,GAAI,CAAC,UAAU,QAAQ,CAAC,CAAC,CAAC,SAAS,KAAK,KAAG,WAAW,CAAC,CAAC,CAwB7E,CAAC"}
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 const interpret = (models, write) => {
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,CAAC,MAAM,SAAS,GAAG,CAAI,MAAmB,EAAE,KAAY,EAAkB,EAAE;IACjF,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,CAAC"}
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.1",
3
+ "version": "0.5.3",
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": {
@@ -24,9 +24,8 @@
24
24
  },
25
25
  "exports": {
26
26
  "./*.ts": {
27
- "types": "./dist/*.d.ts",
28
27
  "source": "./src/*.ts",
29
- "import": "./dist/*.js",
28
+ "types": "./dist/*.d.ts",
30
29
  "default": "./dist/*.js"
31
30
  },
32
31
  "./package.json": "./package.json"
@@ -37,28 +36,27 @@
37
36
  "!src/**/*.test.ts",
38
37
  "!src/**/*.spec.ts",
39
38
  "!src/**/test-support",
40
- "docs",
41
39
  "CHANGELOG.md",
42
40
  "README.md"
43
41
  ],
44
42
  "dependencies": {
45
- "@shivaedev/effect-changes": "0.3.0",
43
+ "@shivaedev/effect-changes": "0.3.2",
46
44
  "@shivaedev/types": "0.2.1"
47
45
  },
48
46
  "devDependencies": {
49
47
  "@prisma/adapter-pg": "7.10.0",
50
48
  "@prisma/client": "7.10.0",
51
- "@shivaedev/quality": "0.22.0",
52
- "@types/node": "24.19.1",
53
- "@typescript/native": "npm:typescript@7.0.2",
54
- "effect": "4.0.4",
49
+ "@shivaedev/quality": "0.34.0",
50
+ "@shivaedev/test-story": "0.18.2",
51
+ "@types/node": "24.19.2",
52
+ "effect": "4.0.5",
55
53
  "prisma": "7.10.0",
56
- "typescript": "npm:@typescript/typescript6@6.0.2",
57
- "vitest": "5.0.3"
54
+ "typescript": "7.0.2",
55
+ "vitest": "5.0.5"
58
56
  },
59
57
  "peerDependencies": {
60
58
  "@prisma/client": "7.10.0",
61
- "effect": "4.0.4"
59
+ "effect": "4.0.5"
62
60
  },
63
61
  "engines": {
64
62
  "node": ">=24"
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 const makePrismaChanges = <TTx extends Transactional<TTx>, A, R = never>(
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
- const transaction = <TX, E, TR2>(body: Effect.Effect<TX, E, TR2>, transactionOptions?: TransactionOptions) =>
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: (tx: TTx) => Effect.provideService(body, Client, tx),
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 const checkCoverage = <A>(coverage: Coverage<A>): readonly CoverageViolation[] => {
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 const makeExpiry = (key: string) => Context.Reference<Expire>(key, { defaultValue: () => unlinked });
8
+ export function makeExpiry(key: string) {
9
+ return Context.Reference<Expire>(key, { defaultValue: () => unlinked });
10
+ }
9
11
 
10
- export const isTransactionClient = (client: object): boolean => !Predicate.hasProperty(client, "$connect");
12
+ export function isTransactionClient(client: object): boolean {
13
+ return !Predicate.hasProperty(client, "$connect");
14
+ }
11
15
 
12
- export const isTransactionClosed = (cause: unknown): boolean => Predicate.hasProperty(cause, "code") && cause.code === "P2028";
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 const configuredTimeout = (client: object): number | undefined =>
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.Effect<TX, E | TransactionExpired, R> =>
30
- Effect.gen(function* () {
31
- const outer = yield* Expiry;
32
- const expired = yield* Deferred.make<never, TransactionExpired>();
33
- const closed: Expire = (cause) =>
34
- Effect.andThen(
35
- Deferred.fail(expired, new TransactionExpired({ cause, message: "The transaction was closed before its body finished" })),
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 const delegateOf = (model: string): string => `${model.charAt(0).toLowerCase()}${model.slice(1)}`;
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 const isWriteOperation = (operation: string): boolean => rowOperations.has(operation) || countOperations.has(operation);
4
+ export function isWriteOperation(operation: string): boolean {
5
+ return rowOperations.has(operation) || countOperations.has(operation);
6
+ }
5
7
 
6
- export const delegatesOf = <A>(models: LooseMap<A>): ReadonlyMap<string, string> =>
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 const recordingClient = <TClient extends object>(
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]+(\w+)[ \t]*\{([\s\S]*?)^[ \t]*\}/gmu;
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 const tablesOf = (schema: string): ReadonlyMap<string, string> =>
9
- new Map([...schema.replace(COMMENT, "").matchAll(MODEL)].map(([, model = "", body = ""]) => [MAPPED.exec(body)?.[1] ?? model, model] as const));
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>;
@@ -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 const runTransaction = <TTx extends Transactional<TTx>, TX, E, R, TOpenRequirements>(options: {
50
+ export function runTransaction<TTx extends Transactional<TTx>, TX, E, R, TOpenRequirements>(options: {
51
51
  readonly client: TTx;
52
- readonly open: Effect.Effect<Frame, never, TOpenRequirements>;
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
- return expiring(frame.provide(body(tx)), deadline, Expiry);
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 settled = yield* restore(Effect.promise(() => outcome)).pipe(
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(settled));
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 const interpret = <A>(models: LooseMap<A>, write: Write): Interpreted<A> => {
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
+ }
@@ -1,43 +0,0 @@
1
- # North star
2
-
3
- ## The problem
4
-
5
- A successful Prisma query says that its statement ran. A successful transaction body still does not say that COMMIT succeeded. A deferred constraint can reject the commit, a caller can be interrupted, or Prisma can expire the transaction while the Effect body has more work to do. If an application announces changes from its write methods or from the body's success, it can announce rows that rolled back, miss a commit that landed during interruption, or continue side effects after the database transaction closed.
6
-
7
- The other half of the problem is knowing which writes need an announcement. An application often names changes by an owner, member or domain rather than a table. That meaning belongs to the application. Returned model rows can provide it; a count alone cannot. A test also needs evidence that its writes passed through this path, including SQL that bypasses ordinary model delegates.
8
-
9
- ## The ideal
10
-
11
- An application on Prisma Classic and PostgreSQL has one path for commit-bound changes. It defines its change values and model mappings once, runs Prisma calls through `use`, and wraps an action in `transaction`. The adapter supplies the scoped client and translates the real driver's outcome into the shared effect-changes frame lifecycle. An application with an existing Effect wrapper can feed observed results through `recordWrite` without adopting another query wrapper.
12
-
13
- A mapping classifies a model deliberately: a row names changes, or `null` says its writes need none. A count-only write or a returned row missing a field the mapping needs must be visible to a test rather than quietly producing an invented subject. A PostgreSQL test compares its written tables with `Recorded` observations and its own definition of which change covers a model.
14
-
15
- ## What good looks like
16
-
17
- - COMMIT determines publication. Savepoint release determines merging into an enclosing frame; rollback determines discard.
18
- - Interruption during a body stops that body and rolls back. Interruption during an in-flight COMMIT still waits for the database outcome, so a landed commit can publish.
19
- - A started transaction expiring is distinct from one unable to start. Typed application failures remain available to callers.
20
- - An expired body stops before later side effects. Wall-clock deadlines follow the current Prisma client's timeout rather than the test clock.
21
- - Model meanings remain explicit and typed. An exhaustive map makes an added model require a classification.
22
- - Tests take a baseline on their own transaction before checking table counters, so a reused connection does not give credit or blame for another transaction's writes.
23
-
24
- ## Trade-offs
25
-
26
- When goals conflict, database outcome and interruption correctness win first, then reuse of the shared channel, then explicit application-owned meaning, then proof at the PostgreSQL boundary, then convenience.
27
-
28
- **Commit correctness costs waiting.** A Prisma promise already in flight cannot be treated as rolled back just because the Effect caller stops waiting. The adapter must settle from the driver's result, including after interruption. A more convenient cancellation API cannot invent a different database outcome.
29
-
30
- **Returned rows limit automatic naming.** The mapping uses the row a write returns. Count-only operations and missing fields need an explicit choice by the application; automatically fetching rows would add queries and its own consistency problem. Keep unsupported shapes visible before adding convenience.
31
-
32
- **Coverage is deliberately coarse.** The coverage predicate connects a written table's model to recorded changes. One covering change satisfies that table check. This is a useful guard against a missed path, but subject-level correctness belongs in the application's tests.
33
-
34
- **Prisma adaptation stays narrow.** The shared channel owns buffering, observation and publication policy. This package owns the Promise transaction boundary, the current client, returned-write interpretation and PostgreSQL table-counter helpers. Keep those responsibilities separate so improvements to a channel reach both Prisma and native SQL callers.
35
-
36
- ## What it leaves out
37
-
38
- - A replacement Prisma client, repository layer or migration runner. effect-prisma owns the separate Prisma Next database facade, and effect-sql owns native Effect persistence and migrations.
39
- - The shape of an application's change values, the meaning of their keys, or which subjects a write should name.
40
- - A selected subscription transport, durable delivery policy or deployment topology. The application chooses those around its publication sink.
41
- - Proof that every affected row or subject is announced. The coverage helper checks tables and unnamed writes; application behavior tests check the meaning of the announcements.
42
-
43
- The [roadmap](roadmap.md) holds the unresolved support and API questions. The [framework roadmap](https://github.com/ShivaeDev/platform/blob/main/docs/framework/roadmap.md) owns adoption and delivery decisions that span packages.
package/docs/roadmap.md DELETED
@@ -1,22 +0,0 @@
1
- # Roadmap
2
-
3
- ## Built
4
-
5
- - [x] A Prisma Classic/PostgreSQL binding over effect-changes, with typed model mappings, a scoped `Client`, `use` and an explicit `recordWrite` seam.
6
- - [x] Publication after a successful COMMIT, discard after rollback or failed commit, nested savepoint merge and discard, and publication when COMMIT lands after caller interruption.
7
- - [x] `TransactionExpired` and body interruption at an explicit or configured wall-clock timeout, including linked nested bodies and queries that find a transaction closed. A transaction unable to start remains a `PrismaError`.
8
- - [x] Row-based recording, keyed deduplication, autocommit publication, explicit batches, and unnamed-write reporting for count-only writes and returned rows missing a mapping field.
9
- - [x] Table/model extraction from schema text, PostgreSQL transaction-counter baselines, and a table-level coverage check over recorded observations and unnamed writes.
10
- - [x] Pure, type and real PostgreSQL tests, plus a packed-consumer fixture for published module imports and basic execution. PostgreSQL tests skip without `PLATFORM_EFFECT_CHANGES_PRISMA_TEST_DATABASE_URL`.
11
-
12
- ## Next
13
-
14
- No package implementation milestone has been selected. The next extension should come from a demonstrated Prisma consumer and a decision about the open questions below. Cross-package adoption, composed application validation and deployment delivery policy belong in the [framework roadmap](https://github.com/ShivaeDev/platform/blob/main/docs/framework/roadmap.md).
15
-
16
- ## Open questions
17
-
18
- - How much independent support should this Prisma path receive as the framework's native persistence path develops? It serves Prisma applications; there is no decision here to replace it or retire it.
19
- - Should recording stay at returned top-level model writes, with explicit `recordWrite` and coverage for other paths, or should the adapter observe more ORM behavior? Nested relation writes, cascades and trigger writes need dedicated tests before their coverage behavior is documented.
20
- - Is table-level coverage the intended acceptance bar, or does a consumer need a check that proves every affected subject has a change?
21
- - Should `recording.ts`, `expiry.ts`, `transaction.ts` and the interpretation helpers remain supported extension points? The module export pattern exposes them, while the primary usage path goes through `changes.ts`, `model.ts`, `write.ts`, `coverage.ts`, `tables.ts` and `error.ts`.
22
- - Which PostgreSQL coverage edges need a supported contract: writes followed by TRUNCATE, or identical table names in several schemas? Dedicated tests are needed before either behavior can be promised.