@shivaedev/effect-changes-prisma 0.2.1 → 0.3.1

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,28 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.3.1 - 2026-10-04
4
+
5
+ ### Changed
6
+
7
+ - The README and the package description say plainly that the package works with PostgreSQL only.
8
+
9
+ ## 0.3.0 - 2026-10-04
10
+
11
+ ### Changed
12
+
13
+ - Validate packed consumers and executable bins through the shared workspace gate.
14
+ - `TransactionOptions.isolationLevel` takes only `"ReadUncommitted"`, `"ReadCommitted"`, `"RepeatableRead"` or `"Serializable"`, the levels Prisma accepts on PostgreSQL, instead of any string. `Transactional.$transaction` is declared as a property, so a client is checked strictly against it. The package now depends on `@shivaedev/types` for `Bivariant`, which keeps the change functions of a model map bivariant.
15
+
16
+ - Build with the `@shivaedev/quality` tsconfig presets, which target ESNext and allow only erasable TypeScript syntax, so classes declare their fields instead of using constructor parameter properties.
17
+
18
+ - Type-check with TypeScript 7 only. TypeScript 6 still builds the package.
19
+
20
+ - Lint and format with the `@shivaedev/quality` Biome preset through `quality lint` at the repository root, which replaces the package's `check` script.
21
+
22
+ - Run tests through the `@shivaedev/quality` Vitest projects, which take a test's environment from its file name. Type tests are named `*.typecheck.test.ts`.
23
+
24
+ - Keep `package.json` in sort-package-json key order, checked by `quality lint`.
25
+
3
26
  ## 0.2.1 - 2026-09-28
4
27
 
5
28
  ### Changed
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  Commit-bound change channels for Prisma Classic (`@prisma/client` with interactive `$transaction`). Writes to mapped models record their changes automatically; the changes publish once, deduplicated, after the transaction commits, and never for a rollback. A test-time coverage check reports writes that no recorded change accounts for.
4
4
 
5
+ It works with PostgreSQL only. The coverage check reads PostgreSQL's `pg_stat_xact_user_tables`, `isolationLevel` takes the levels Prisma accepts on PostgreSQL, and every test runs against PostgreSQL.
6
+
5
7
  It binds a [`@shivaedev/effect-changes`](../effect-changes) channel to Prisma: the channel semantics (owners, savepoint merge and discard, batches, sink failures, test seams) are the same, see [commit-bound changes](../../docs/framework/changes.md).
6
8
 
7
9
  ```ts
package/dist/changes.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { type Channel, type ChannelOptions } from "@shivaedev/effect-changes";
2
1
  import { Context, Effect } from "effect";
2
+ import { type Channel, type ChannelOptions } from "@shivaedev/effect-changes";
3
3
  import { PrismaError, type TransactionExpired } from "./error.ts";
4
4
  import type { ChangeMap, Transactional, TransactionOptions } from "./model.ts";
5
5
  import { type UnnamedWrite, type Write } from "./write.ts";
@@ -9,12 +9,12 @@ export interface PrismaChangesOptions<Tx, A, R> extends Omit<ChannelOptions<A, R
9
9
  readonly models: Partial<ChangeMap<Tx, A>>;
10
10
  }
11
11
  export interface PrismaChanges<Tx, A, R> {
12
- readonly channel: Channel<A, R>;
13
12
  readonly Client: Context.Reference<Tx>;
14
- readonly use: <X>(query: (client: Tx) => PromiseLike<X>) => Effect.Effect<X, PrismaError, R>;
15
- readonly transaction: <X, E, R2>(body: Effect.Effect<X, E, R2>, options?: TransactionOptions) => Effect.Effect<X, E | TransactionExpired | PrismaError, R | R2>;
13
+ readonly channel: Channel<A, R>;
16
14
  readonly recordWrite: (write: Write) => Effect.Effect<void, never, R>;
15
+ readonly transaction: <X, E, R2>(body: Effect.Effect<X, E, R2>, options?: TransactionOptions) => Effect.Effect<X, E | TransactionExpired | PrismaError, R | R2>;
17
16
  readonly Unnamed: Context.Reference<UnnamedObserver>;
17
+ readonly use: <X>(query: (client: Tx) => PromiseLike<X>) => Effect.Effect<X, PrismaError, R>;
18
18
  }
19
19
  export declare const makePrismaChanges: <Tx extends Transactional<Tx>, A, R = never>(options: PrismaChangesOptions<Tx, A, R>) => PrismaChanges<Tx, 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,EAAE,KAAK,OAAO,EAAE,KAAK,cAAc,EAAe,MAAM,2BAA2B,CAAC;AAC3F,OAAO,EAAS,OAAO,EAAE,MAAM,EAAgB,MAAM,QAAQ,CAAC;AAC9D,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,EAAE,EAAE,CAAC,EAAE,CAAC,CAAE,SAAQ,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtG,QAAQ,CAAC,MAAM,EAAE,EAAE,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACtC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACvC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;IAC7F,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAC7B,OAAO,CAAC,EAAE,kBAAkB,KACxB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,kBAAkB,GAAG,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IACpE,QAAQ,CAAC,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;IACtE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;CACrD;AAUD,eAAO,MAAM,iBAAiB,GAAI,EAAE,SAAS,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,SAAS,oBAAoB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CA0C7I,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,2BAA2B,CAAC;AAC3F,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,EAAE,EAAE,CAAC,EAAE,CAAC,CAAE,SAAQ,IAAI,CAAC,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACtG,QAAQ,CAAC,MAAM,EAAE,EAAE,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;CAC3C;AAED,MAAM,WAAW,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;IACtC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACvC,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,CAAC,EAAE,CAAC,EAAE,EAAE,EAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAC7B,OAAO,CAAC,EAAE,kBAAkB,KACxB,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,kBAAkB,GAAG,WAAW,EAAE,CAAC,GAAG,EAAE,CAAC,CAAC;IACpE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;IACrD,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;CAC7F;AAUD,eAAO,MAAM,iBAAiB,GAAI,EAAE,SAAS,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,SAAS,oBAAoB,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,aAAa,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CA8C7I,CAAC"}
package/dist/changes.js CHANGED
@@ -1,5 +1,5 @@
1
- import { makeChannel } from "@shivaedev/effect-changes";
2
1
  import { Cause, Context, Effect, Exit, Option } from "effect";
2
+ import { makeChannel } from "@shivaedev/effect-changes";
3
3
  import { PrismaError } from "./error.js";
4
4
  import { configuredTimeout, isTransactionClient, isTransactionClosed, makeExpiry, unlinked } from "./expiry.js";
5
5
  import { delegatesOf, recordingClient } from "./recording.js";
@@ -21,16 +21,18 @@ export const makePrismaChanges = (options) => {
21
21
  const delegates = delegatesOf(models);
22
22
  const recordWrite = Effect.fn("PrismaChanges.recordWrite")(function* (write) {
23
23
  const { changes, unnamed } = interpret(models, write);
24
- if (unnamed !== undefined)
24
+ if (unnamed !== undefined) {
25
25
  yield* Effect.flatMap(Effect.service(Unnamed), (observe) => observe(unnamed));
26
- if (changes.length > 0)
26
+ }
27
+ if (changes.length > 0) {
27
28
  yield* channel.record(changes);
29
+ }
28
30
  });
29
31
  const use = Effect.fn("PrismaChanges.use")(function* (query) {
30
32
  const current = yield* Client;
31
33
  const writes = [];
32
34
  const recording = recordingClient(current, delegates, (write) => writes.push(write));
33
- const exit = yield* Effect.exit(Effect.tryPromise({ try: () => query(recording), catch: (cause) => new PrismaError({ cause }) }));
35
+ const exit = yield* Effect.exit(Effect.tryPromise({ catch: (cause) => new PrismaError({ cause }), try: () => query(recording) }));
34
36
  yield* Effect.forEach(writes, recordWrite, { discard: true });
35
37
  yield* expireOnClosed(Expiry, exit);
36
38
  return yield* exit;
@@ -38,16 +40,16 @@ export const makePrismaChanges = (options) => {
38
40
  const transaction = (body, transactionOptions) => Effect.flatMap(Effect.service(Client), (current) => {
39
41
  const savepoint = isTransactionClient(current);
40
42
  const run = runTransaction({
41
- client: current,
42
- open: channel.open,
43
43
  body: (tx) => Effect.provideService(body, Client, tx),
44
- transaction: transactionOptions,
45
- savepoint,
44
+ client: current,
46
45
  deadline: savepoint ? undefined : (transactionOptions?.timeout ?? configuredTimeout(current)),
47
46
  Expiry,
47
+ open: channel.open,
48
+ savepoint,
49
+ transaction: transactionOptions,
48
50
  });
49
51
  return savepoint ? run : Effect.provideService(run, Expiry, unlinked);
50
52
  }).pipe(Effect.withSpan("PrismaChanges.transaction"));
51
- return { channel, Client, use, transaction, recordWrite, Unnamed };
53
+ return { Client, channel, recordWrite, transaction, Unnamed, use };
52
54
  };
53
55
  //# sourceMappingURL=changes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"changes.js","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"changes.js","sourceRoot":"","sources":["../src/changes.ts"],"names":[],"mappings":"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"}
@@ -9,12 +9,12 @@ export type CoverageViolation = {
9
9
  readonly write: UnnamedWrite;
10
10
  };
11
11
  export interface Coverage<A> {
12
- readonly written: Iterable<string>;
13
- readonly tables: ReadonlyMap<string, string>;
12
+ readonly covers: (model: string, change: A) => boolean;
14
13
  readonly models: Readonly<Record<string, unknown>>;
15
14
  readonly observations: Iterable<Observation<A>>;
15
+ readonly tables: ReadonlyMap<string, string>;
16
16
  readonly unnamed: Iterable<UnnamedWrite>;
17
- readonly covers: (model: string, change: A) => boolean;
17
+ readonly written: Iterable<string>;
18
18
  }
19
- export declare const checkCoverage: <A>(coverage: Coverage<A>) => ReadonlyArray<CoverageViolation>;
19
+ export declare const 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,2BAA2B,CAAC;AAC7D,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,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,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,OAAO,EAAE,QAAQ,CAAC,YAAY,CAAC,CAAC;IACzC,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,KAAK,OAAO,CAAC;CACvD;AAQD,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,UAAU,QAAQ,CAAC,CAAC,CAAC,KAAG,aAAa,CAAC,iBAAiB,CAUvF,CAAC"}
1
+ {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,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;AAQD,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,UAAU,QAAQ,CAAC,CAAC,CAAC,KAAG,SAAS,iBAAiB,EAclF,CAAC"}
package/dist/coverage.js CHANGED
@@ -4,11 +4,13 @@ export const checkCoverage = (coverage) => {
4
4
  const recorded = recordedIn(coverage.observations);
5
5
  const unrecorded = [...new Set(coverage.written)].flatMap((table) => {
6
6
  const model = coverage.tables.get(table);
7
- if (model !== undefined && coverage.models[model] === null)
7
+ if (model !== undefined && coverage.models[model] === null) {
8
8
  return [];
9
- if (model !== undefined && recorded.some((change) => coverage.covers(model, change)))
9
+ }
10
+ if (model !== undefined && recorded.some((change) => coverage.covers(model, change))) {
10
11
  return [];
11
- return [{ _tag: "Unrecorded", table, model }];
12
+ }
13
+ return [{ _tag: "Unrecorded", model, table }];
12
14
  });
13
15
  const unnamed = new Map([...coverage.unnamed].map((write) => [identify(write), write]));
14
16
  return [...unrecorded, ...[...unnamed.values()].map((write) => ({ _tag: "Unnamed", write }))];
@@ -1 +1 @@
1
- {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../src/coverage.ts"],"names":[],"mappings":"AAgBA,MAAM,UAAU,GAAG,CAAI,YAAsC,EAAoB,EAAE,CAClF,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;AAE1G,MAAM,QAAQ,GAAG,CAAC,KAAmB,EAAU,EAAE,CAChD,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;AAExH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAI,QAAqB,EAAoC,EAAE;IAC3F,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,EAAoC,EAAE;QACrG,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;YAAE,OAAO,EAAE,CAAC;QACtE,IAAI,KAAK,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAAE,OAAO,EAAE,CAAC;QAChG,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,MAAM,UAAU,GAAG,CAAI,YAAsC,EAAgB,EAAE,CAC9E,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;AAE1G,MAAM,QAAQ,GAAG,CAAC,KAAmB,EAAU,EAAE,CAChD,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;AAExH,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"}
package/dist/expiry.js CHANGED
@@ -13,7 +13,7 @@ const wallClock = Clock.Clock.defaultValue();
13
13
  export const expiring = (body, timeout, Expiry) => Effect.gen(function* () {
14
14
  const outer = yield* Expiry;
15
15
  const expired = yield* Deferred.make();
16
- const closed = (cause) => Effect.andThen(Deferred.fail(expired, new TransactionExpired({ message: "The transaction was closed before its body finished", cause })), outer(cause));
16
+ const closed = (cause) => Effect.andThen(Deferred.fail(expired, new TransactionExpired({ cause, message: "The transaction was closed before its body finished" })), outer(cause));
17
17
  const deadline = timeout === undefined
18
18
  ? Effect.never
19
19
  : Effect.andThen(Effect.provideService(Effect.sleep(timeout), Clock.Clock, wallClock), Deferred.fail(expired, new TransactionExpired({ message: `The transaction expired after its ${timeout} ms timeout` })));
@@ -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
@@ -1,10 +1,10 @@
1
1
  export interface TransactionOptions {
2
+ readonly isolationLevel?: "ReadUncommitted" | "ReadCommitted" | "RepeatableRead" | "Serializable";
2
3
  readonly maxWait?: number;
3
4
  readonly timeout?: number;
4
- readonly isolationLevel?: string;
5
5
  }
6
6
  export interface Transactional<Tx> {
7
- $transaction<X>(run: (tx: Tx) => Promise<X>, options?: TransactionOptions): PromiseLike<X>;
7
+ $transaction: <X>(run: (tx: Tx) => Promise<X>, options?: TransactionOptions) => PromiseLike<X>;
8
8
  }
9
9
  type PayloadOf<Delegate> = Delegate extends {
10
10
  readonly [key: symbol]: {
@@ -1 +1 @@
1
- {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../src/model.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,aAAa,CAAC,EAAE;IAChC,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;CAC3F;AAED,KAAK,SAAS,CAAC,QAAQ,IAAI,QAAQ,SAAS;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE;YAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,GAAG,OAAO,GAAG,KAAK,CAAC;AAElJ,KAAK,SAAS,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,MAAM,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC,CAAC;AAEtE,MAAM,MAAM,SAAS,CAAC,MAAM,IAAI;KAC9B,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,SAAS,MAAM,CAAA;KAAE,GAAG,IAAI,GAAG,KAAK;CACtH,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAErB,MAAM,MAAM,QAAQ,CAAC,MAAM,EAAE,KAAK,SAAS,MAAM,IAAI,OAAO,CAC3D;KACE,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,CAAA;KAAE,GAAG,GAAG,GAAG,KAAK;CAC9H,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EACpB,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,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC;AAEtF,MAAM,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI;IAClC,QAAQ,EAAE,KAAK,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;CACtF,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,GAAI,OAAO,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,EAAE;IAChC,YAAY,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,kBAAkB,KAAK,WAAW,CAAC,CAAC,CAAC,CAAC;CAC/F;AAED,KAAK,SAAS,CAAC,QAAQ,IAAI,QAAQ,SAAS;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG;QAAE,QAAQ,CAAC,KAAK,EAAE;YAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,OAAO,CAAA;SAAE,CAAA;KAAE,CAAA;CAAE,GAAG,OAAO,GAAG,KAAK,CAAC;AAElJ,KAAK,SAAS,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,MAAM,GAAG,MAAM,EAAE,IAAI,MAAM,EAAE,CAAC,CAAC;AAEtE,MAAM,MAAM,SAAS,CAAC,MAAM,IAAI;KAC9B,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,IAAI,SAAS,MAAM,CAAA;KAAE,GAAG,IAAI,GAAG,KAAK;CACtH,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;AAErB,MAAM,MAAM,QAAQ,CAAC,MAAM,EAAE,KAAK,SAAS,MAAM,IAAI,OAAO,CAC3D;KACE,GAAG,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,CAAA;KAAE,GAAG,GAAG,GAAG,KAAK;CAC9H,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EACpB,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,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,SAAS,EAAE,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC;AAEtF,MAAM,MAAM,SAAS,CAAC,MAAM,EAAE,CAAC,IAAI;IAClC,QAAQ,EAAE,KAAK,IAAI,SAAS,CAAC,MAAM,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI;CACtF,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,GAAI,OAAO,MAAM,KAAG,MAA6D,CAAC"}
@@ -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,GAAI,WAAW,MAAM,KAAG,OAAyE,CAAC;AAE/H,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,QAAQ,QAAQ,CAAC,CAAC,CAAC,KAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAK7E,CAAC;AAiBH,eAAO,MAAM,eAAe,GAAI,MAAM,SAAS,MAAM,EACpD,QAAQ,MAAM,EACd,WAAW,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,SAAS,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,KAC7B,MAQA,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,eAAO,MAAM,gBAAgB,GAAI,WAAW,MAAM,KAAG,OAAyE,CAAC;AAE/H,eAAO,MAAM,WAAW,GAAI,CAAC,EAAE,QAAQ,QAAQ,CAAC,CAAC,CAAC,KAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAK7E,CAAC;AAmBH,eAAO,MAAM,eAAe,GAAI,MAAM,SAAS,MAAM,EACpD,QAAQ,MAAM,EACd,WAAW,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,EACtC,SAAS,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,KAC7B,MAUA,CAAC"}
package/dist/recording.js CHANGED
@@ -5,8 +5,9 @@ const bound = (value, target) => (typeof value === "function" ? value.bind(targe
5
5
  const recordingDelegate = (delegate, model, collect) => new Proxy(delegate, {
6
6
  get: (target, key) => {
7
7
  const value = Reflect.get(target, key);
8
- if (typeof key !== "string" || typeof value !== "function" || !isWriteOperation(key))
8
+ if (typeof key !== "string" || typeof value !== "function" || !isWriteOperation(key)) {
9
9
  return bound(value, target);
10
+ }
10
11
  return (...args) => Promise.resolve(Reflect.apply(value, target, args)).then((result) => {
11
12
  collect({ model, operation: key, result });
12
13
  return result;
@@ -17,8 +18,9 @@ export const recordingClient = (client, delegates, collect) => new Proxy(client,
17
18
  get: (target, key) => {
18
19
  const value = Reflect.get(target, key);
19
20
  const model = typeof key === "string" ? delegates.get(key) : undefined;
20
- if (model !== undefined && typeof value === "object" && value !== null)
21
+ if (model !== undefined && typeof value === "object" && value !== null) {
21
22
  return recordingDelegate(value, model, collect);
23
+ }
22
24
  return bound(value, target);
23
25
  },
24
26
  });
@@ -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,MAAM,KAAK,GAAG,CAAC,KAAc,EAAE,MAAc,EAAW,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAEtH,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,KAAa,EAAE,OAA+B,EAAU,EAAE,CACtG,IAAI,KAAK,CAAC,QAAQ,EAAE;IACnB,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACpB,MAAM,KAAK,GAAY,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;YAAE,OAAO,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAClH,OAAO,CAAC,GAAG,IAA4B,EAAE,EAAE,CAC1C,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAe,EAAE,EAAE;YAC5E,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3C,OAAO,MAAM,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;CACD,CAAC,CAAC;AAEJ,MAAM,CAAC,MAAM,eAAe,GAAG,CAC9B,MAAc,EACd,SAAsC,EACtC,OAA+B,EACtB,EAAE,CACX,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;YAAE,OAAO,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACxH,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,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,MAAM,KAAK,GAAG,CAAC,KAAc,EAAE,MAAc,EAAW,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;AAEtH,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAE,KAAa,EAAE,OAA+B,EAAU,EAAE,CACtG,IAAI,KAAK,CAAC,QAAQ,EAAE;IACnB,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACpB,MAAM,KAAK,GAAY,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAChD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,UAAU,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YACtF,OAAO,KAAK,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC7B,CAAC;QACD,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;YAC5E,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC;YAC3C,OAAO,MAAM,CAAC;QACf,CAAC,CAAC,CAAC;IACL,CAAC;CACD,CAAC,CAAC;AAEJ,MAAM,CAAC,MAAM,eAAe,GAAG,CAC9B,MAAc,EACd,SAAsC,EACtC,OAA+B,EACtB,EAAE,CACX,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"}
package/dist/tables.d.ts CHANGED
@@ -2,7 +2,7 @@ import { Effect } from "effect";
2
2
  import { PrismaError } from "./error.ts";
3
3
  export declare const tablesOf: (schema: string) => ReadonlyMap<string, string>;
4
4
  export interface RawQueryClient {
5
- $queryRawUnsafe(query: string): PromiseLike<unknown>;
5
+ $queryRawUnsafe: (query: string) => PromiseLike<unknown>;
6
6
  }
7
7
  export type TableWrites = ReadonlyMap<string, bigint>;
8
8
  export declare const tableWrites: (client: RawQueryClient) => Effect.Effect<Map<string, bigint>, PrismaError, never>;
@@ -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,GAAI,QAAQ,MAAM,KAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAC4E,CAAC;AAEjJ,MAAM,WAAW,cAAc;IAC9B,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;CACrD;AAED,MAAM,MAAM,WAAW,GAAG,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAStD,eAAO,MAAM,WAAW,oFAMtB,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,eAAO,MAAM,QAAQ,GAAI,QAAQ,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"}
package/dist/tables.js CHANGED
@@ -1,18 +1,19 @@
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]*\}/gm;
4
- const MAPPED = /@@map\(\s*(?:name\s*:\s*)?"([^"]+)"/;
5
- const COMMENT = /\/\/.*$/gm;
3
+ const MODEL = /^[ \t]*model[ \t]+(\w+)[ \t]*\{([\s\S]*?)^[ \t]*\}/gmu;
4
+ const MAPPED = /@@map\(\s*(?:name\s*:\s*)?"([^"]+)"/u;
5
+ const COMMENT = /\/\/.*$/gmu;
6
6
  export const tablesOf = (schema) => new Map([...schema.replace(COMMENT, "").matchAll(MODEL)].map(([, model = "", body = ""]) => [MAPPED.exec(body)?.[1] ?? model, model]));
7
7
  const Counted = Schema.Array(Schema.Struct({ relname: Schema.String, writes: Schema.BigInt }));
8
8
  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
9
  const none = new Map();
10
10
  export const tableWrites = Effect.fn("PrismaChanges.tableWrites")(function* (client) {
11
- const rows = yield* Effect.tryPromise({ try: () => client.$queryRawUnsafe(COUNTED), catch: (cause) => new PrismaError({ cause }) });
11
+ const rows = yield* Effect.tryPromise({ catch: (cause) => new PrismaError({ cause }), try: () => client.$queryRawUnsafe(COUNTED) });
12
12
  const decoded = yield* Effect.mapError(Schema.decodeUnknownEffect(Counted)(rows), (cause) => new PrismaError({ cause }));
13
13
  const counts = new Map();
14
- for (const { relname, writes } of decoded)
14
+ for (const { relname, writes } of decoded) {
15
15
  counts.set(relname, (counts.get(relname) ?? 0n) + writes);
16
+ }
16
17
  return counts;
17
18
  });
18
19
  export const writtenTables = Effect.fn("PrismaChanges.writtenTables")(function* (client, since = none) {
@@ -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,sDAAsD,CAAC;AACrE,MAAM,MAAM,GAAG,qCAAqC,CAAC;AACrD,MAAM,OAAO,GAAG,WAAW,CAAC;AAE5B,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,GAAG,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,EAAE,KAAK,EAAE,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;QAAE,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,CAAC,CAAC;IACrG,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,QAAqB,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,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,QAAqB,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,5 +1,5 @@
1
- import type { Frame } from "@shivaedev/effect-changes";
2
1
  import { type Context, Effect } from "effect";
2
+ import type { Frame } from "@shivaedev/effect-changes";
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";
@@ -1 +1 @@
1
- {"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../src/transaction.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,EAAQ,MAAM,QAAQ,CAAC;AACpD,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;AAuCpE,eAAO,MAAM,cAAc,GAAI,EAAE,SAAS,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS;IAClF,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/C,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,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,CAAC,EAAE,CAAC,GAAG,kBAAkB,GAAG,WAAW,EAAE,CAAC,GAAG,EAAE,CA4B/D,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,KAAK,EAAE,MAAM,2BAA2B,CAAC;AACvD,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,EAAE,SAAS,aAAa,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS;IAClF,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/C,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAClD,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,CAAC,EAAE,CAAC,GAAG,kBAAkB,GAAG,WAAW,EAAE,CAAC,GAAG,EAAE,CA4B/D,CAAC"}
@@ -9,18 +9,21 @@ const commit = (client, options, savepoint, body, context, signal) => {
9
9
  const run = async (tx) => {
10
10
  started = true;
11
11
  const exit = await Effect.runPromiseExitWith(context)(body(tx), { signal });
12
- if (Exit.isSuccess(exit))
12
+ if (Exit.isSuccess(exit)) {
13
13
  return exit.value;
14
+ }
14
15
  failed = exit;
15
16
  throw new BodyFailed();
16
17
  };
17
18
  const rejected = (cause) => {
18
- if (failed !== undefined)
19
+ if (failed !== undefined) {
19
20
  return { committed: false, exit: failed };
20
- if (!isTransactionClosed(cause) || !(started || savepoint))
21
+ }
22
+ if (!(isTransactionClosed(cause) && (started || savepoint))) {
21
23
  return { committed: false, exit: Exit.fail(new PrismaError({ cause })) };
22
- const closed = new TransactionExpired({ message: "The transaction was closed before it could finish", cause });
23
- return { committed: false, exit: Exit.fail(closed), closed };
24
+ }
25
+ const closed = new TransactionExpired({ cause, message: "The transaction was closed before it could finish" });
26
+ return { closed, committed: false, exit: Exit.fail(closed) };
24
27
  };
25
28
  return Promise.resolve(client.$transaction(run, options)).then((value) => ({ committed: true, exit: Exit.succeed(value) }), rejected);
26
29
  };
@@ -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
@@ -1,3 +1,4 @@
1
+ import type { Bivariant } from "@shivaedev/types";
1
2
  import { type RowOperation } from "./model.ts";
2
3
  export interface Write {
3
4
  readonly model: string;
@@ -14,12 +15,10 @@ export type UnnamedWrite = {
14
15
  readonly reason: "narrowed";
15
16
  readonly field: string;
16
17
  };
17
- export type LooseChanges<A> = {
18
- bivariant(row: object, operation: RowOperation): Iterable<A>;
19
- }["bivariant"];
18
+ export type LooseChanges<A> = Bivariant<(row: object, operation: RowOperation) => Iterable<A>>;
20
19
  export type LooseMap<A> = Readonly<Record<string, LooseChanges<A> | null | undefined>>;
21
20
  export interface Interpreted<A> {
22
- readonly changes: ReadonlyArray<A>;
21
+ readonly changes: readonly A[];
23
22
  readonly unnamed: UnnamedWrite | undefined;
24
23
  }
25
24
  export declare const interpret: <A>(models: LooseMap<A>, write: Write) => Interpreted<A>;
@@ -1 +1 @@
1
- {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AAAA,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;IAAE,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;CAAE,CAAC,WAAW,CAAC,CAAC;AAE5G,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,aAAa,CAAC,CAAC,CAAC,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,SAAS,CAAC;CAC3C;AAqBD,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,QAAQ,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,KAAG,WAAW,CAAC,CAAC,CAc7E,CAAC"}
1
+ {"version":3,"file":"write.d.ts","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,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;AA2BD,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,QAAQ,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,KAAG,WAAW,CAAC,CAAC,CAwB7E,CAAC"}
package/dist/write.js CHANGED
@@ -7,8 +7,9 @@ class MissingField {
7
7
  }
8
8
  const guarded = (row) => new Proxy(row, {
9
9
  get: (target, key, receiver) => {
10
- if (typeof key === "string" && !(key in target))
10
+ if (typeof key === "string" && !(key in target)) {
11
11
  throw new MissingField(key);
12
+ }
12
13
  return Reflect.get(target, key, receiver);
13
14
  },
14
15
  });
@@ -18,20 +19,25 @@ const nothing = { changes: [], unnamed: undefined };
18
19
  export const interpret = (models, write) => {
19
20
  const { model, operation } = write;
20
21
  const changesOf = models[model];
21
- if (changesOf === undefined || changesOf === null)
22
+ if (changesOf === undefined || changesOf === null) {
22
23
  return nothing;
23
- if (countOperations.has(operation))
24
+ }
25
+ if (countOperations.has(operation)) {
24
26
  return { changes: [], unnamed: { model, operation, reason: "countOnly" } };
25
- if (!isRowOperation(operation))
27
+ }
28
+ if (!isRowOperation(operation)) {
26
29
  return nothing;
30
+ }
27
31
  const changes = [];
28
32
  try {
29
- for (const row of rowsOf(write.result))
33
+ for (const row of rowsOf(write.result)) {
30
34
  changes.push(...changesOf(guarded(row), operation));
35
+ }
31
36
  }
32
37
  catch (error) {
33
- if (error instanceof MissingField)
34
- return { changes: [], unnamed: { model, operation, reason: "narrowed", field: error.field } };
38
+ if (error instanceof MissingField) {
39
+ return { changes: [], unnamed: { field: error.field, model, operation, reason: "narrowed" } };
40
+ }
35
41
  throw error;
36
42
  }
37
43
  return { changes, unnamed: undefined };
package/dist/write.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"write.js","sourceRoot":"","sources":["../src/write.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAqB,aAAa,EAAE,MAAM,YAAY,CAAC;AAqB/E,MAAM,YAAY;IACI;IAArB,YAAqB,KAAa;QAAb,UAAK,GAAL,KAAK,CAAQ;IAAG,CAAC;CACtC;AAED,MAAM,OAAO,GAAG,CAAC,GAAW,EAAU,EAAE,CACvC,IAAI,KAAK,CAAC,GAAG,EAAE;IACd,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;QAC9B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC;YAAE,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;QAC7E,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;CACD,CAAC,CAAC;AAEJ,MAAM,cAAc,GAAG,CAAC,SAAiB,EAA6B,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAEtG,MAAM,MAAM,GAAG,CAAC,MAAe,EAAyB,EAAE,CACzD,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;AAErH,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;QAAE,OAAO,OAAO,CAAC;IAClE,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC;IAC/G,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC;QAAE,OAAO,OAAO,CAAC;IAC/C,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC;QACJ,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IAC7F,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,KAAK,YAAY,YAAY;YAAE,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;QACjI,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,MAAM,OAAO,GAAG,CAAC,GAAW,EAAU,EAAE,CACvC,IAAI,KAAK,CAAC,GAAG,EAAE;IACd,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,EAAE;QAC9B,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;YACjD,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;CACD,CAAC,CAAC;AAEJ,MAAM,cAAc,GAAG,CAAC,SAAiB,EAA6B,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAEtG,MAAM,MAAM,GAAG,CAAC,MAAe,EAAqB,EAAE,CACrD,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;AAErH,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"}
package/package.json CHANGED
@@ -1,28 +1,19 @@
1
1
  {
2
2
  "name": "@shivaedev/effect-changes-prisma",
3
- "version": "0.2.1",
4
- "description": "Commit-bound change channels for Prisma Classic: automatic change recording, publish after $transaction commits, and a test-time coverage check",
5
- "type": "module",
6
- "license": "MIT",
7
- "repository": {
8
- "type": "git",
9
- "url": "git+https://github.com/ShivaeDev/platform.git",
10
- "directory": "packages/effect-changes-prisma"
11
- },
3
+ "version": "0.3.1",
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",
12
5
  "homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/effect-changes-prisma#readme",
13
6
  "bugs": {
14
7
  "url": "https://github.com/ShivaeDev/platform/issues"
15
8
  },
16
- "engines": {
17
- "node": ">=24"
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/ShivaeDev/platform.git",
12
+ "directory": "packages/effect-changes-prisma"
18
13
  },
14
+ "license": "MIT",
19
15
  "sideEffects": false,
20
- "files": [
21
- "dist",
22
- "src",
23
- "CHANGELOG.md",
24
- "README.md"
25
- ],
16
+ "type": "module",
26
17
  "exports": {
27
18
  ".": {
28
19
  "types": "./dist/index.d.ts",
@@ -32,20 +23,20 @@
32
23
  },
33
24
  "./package.json": "./package.json"
34
25
  },
35
- "publishConfig": {
36
- "access": "public",
37
- "provenance": true
38
- },
26
+ "files": [
27
+ "dist",
28
+ "src",
29
+ "CHANGELOG.md",
30
+ "README.md"
31
+ ],
39
32
  "dependencies": {
40
- "@shivaedev/effect-changes": "0.1.0"
41
- },
42
- "peerDependencies": {
43
- "@prisma/client": "7.10.0",
44
- "effect": "4.0.0-rc.112"
33
+ "@shivaedev/effect-changes": "0.1.0",
34
+ "@shivaedev/types": "0.1.0"
45
35
  },
46
36
  "devDependencies": {
47
37
  "@prisma/adapter-pg": "7.10.0",
48
38
  "@prisma/client": "7.10.0",
39
+ "@shivaedev/quality": "0.7.2",
49
40
  "@types/node": "24.10.1",
50
41
  "@typescript/native": "npm:typescript@7.0.2",
51
42
  "effect": "4.0.0-rc.112",
@@ -53,13 +44,21 @@
53
44
  "typescript": "npm:@typescript/typescript6@6.0.2",
54
45
  "vitest": "4.1.9"
55
46
  },
47
+ "peerDependencies": {
48
+ "@prisma/client": "7.10.0",
49
+ "effect": "4.0.0-rc.112"
50
+ },
51
+ "engines": {
52
+ "node": ">=24"
53
+ },
54
+ "publishConfig": {
55
+ "access": "public",
56
+ "provenance": true
57
+ },
56
58
  "scripts": {
57
59
  "build": "node --eval \"import('node:fs').then(({ rmSync }) => rmSync('dist', { force: true, recursive: true }))\" && tsc6 --project tsconfig.build.json",
58
- "check": "biome check .",
60
+ "ready": "pnpm typecheck && pnpm test && pnpm build",
59
61
  "test": "prisma generate --config test/prisma.config.ts --no-hints && vitest run",
60
- "test:package": "node scripts/test-package.mjs",
61
- "typecheck": "prisma generate --config test/prisma.config.ts --no-hints && tsc --noEmit",
62
- "typecheck:compat": "prisma generate --config test/prisma.config.ts --no-hints && tsc6 --noEmit",
63
- "ready": "pnpm check && pnpm typecheck && pnpm typecheck:compat && pnpm test && pnpm build && pnpm test:package"
62
+ "typecheck": "prisma generate --config test/prisma.config.ts --no-hints && tsc --noEmit"
64
63
  }
65
64
  }
package/src/changes.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { type Channel, type ChannelOptions, makeChannel } from "@shivaedev/effect-changes";
2
1
  import { Cause, Context, Effect, Exit, Option } from "effect";
2
+ import { type Channel, type ChannelOptions, makeChannel } from "@shivaedev/effect-changes";
3
3
  import { PrismaError, type TransactionExpired } from "./error.ts";
4
4
  import { configuredTimeout, type Expire, isTransactionClient, isTransactionClosed, makeExpiry, unlinked } from "./expiry.ts";
5
5
  import type { ChangeMap, Transactional, TransactionOptions } from "./model.ts";
@@ -15,15 +15,15 @@ export interface PrismaChangesOptions<Tx, A, R> extends Omit<ChannelOptions<A, R
15
15
  }
16
16
 
17
17
  export interface PrismaChanges<Tx, A, R> {
18
- readonly channel: Channel<A, R>;
19
18
  readonly Client: Context.Reference<Tx>;
20
- readonly use: <X>(query: (client: Tx) => PromiseLike<X>) => Effect.Effect<X, PrismaError, R>;
19
+ readonly channel: Channel<A, R>;
20
+ readonly recordWrite: (write: Write) => Effect.Effect<void, never, R>;
21
21
  readonly transaction: <X, E, R2>(
22
22
  body: Effect.Effect<X, E, R2>,
23
23
  options?: TransactionOptions,
24
24
  ) => Effect.Effect<X, E | TransactionExpired | PrismaError, R | R2>;
25
- readonly recordWrite: (write: Write) => Effect.Effect<void, never, R>;
26
25
  readonly Unnamed: Context.Reference<UnnamedObserver>;
26
+ readonly use: <X>(query: (client: Tx) => PromiseLike<X>) => Effect.Effect<X, PrismaError, R>;
27
27
  }
28
28
 
29
29
  const ignoreUnnamed: UnnamedObserver = () => Effect.void;
@@ -46,15 +46,19 @@ export const makePrismaChanges = <Tx extends Transactional<Tx>, A, R = never>(op
46
46
 
47
47
  const recordWrite = Effect.fn("PrismaChanges.recordWrite")(function* (write: Write) {
48
48
  const { changes, unnamed } = interpret(models, write);
49
- if (unnamed !== undefined) yield* Effect.flatMap(Effect.service(Unnamed), (observe) => observe(unnamed));
50
- if (changes.length > 0) yield* channel.record(changes);
49
+ if (unnamed !== undefined) {
50
+ yield* Effect.flatMap(Effect.service(Unnamed), (observe) => observe(unnamed));
51
+ }
52
+ if (changes.length > 0) {
53
+ yield* channel.record(changes);
54
+ }
51
55
  });
52
56
 
53
57
  const use = Effect.fn("PrismaChanges.use")(function* <X>(query: (client: Tx) => PromiseLike<X>) {
54
58
  const current = yield* Client;
55
- const writes: Array<Write> = [];
59
+ const writes: Write[] = [];
56
60
  const recording = recordingClient(current, delegates, (write) => writes.push(write));
57
- const exit = yield* Effect.exit(Effect.tryPromise({ try: () => query(recording), catch: (cause) => new PrismaError({ cause }) }));
61
+ const exit = yield* Effect.exit(Effect.tryPromise({ catch: (cause) => new PrismaError({ cause }), try: () => query(recording) }));
58
62
  yield* Effect.forEach(writes, recordWrite, { discard: true });
59
63
  yield* expireOnClosed(Expiry, exit);
60
64
  return yield* exit;
@@ -64,16 +68,16 @@ export const makePrismaChanges = <Tx extends Transactional<Tx>, A, R = never>(op
64
68
  Effect.flatMap(Effect.service(Client), (current) => {
65
69
  const savepoint = isTransactionClient(current);
66
70
  const run = runTransaction({
67
- client: current,
68
- open: channel.open,
69
71
  body: (tx: Tx) => Effect.provideService(body, Client, tx),
70
- transaction: transactionOptions,
71
- savepoint,
72
+ client: current,
72
73
  deadline: savepoint ? undefined : (transactionOptions?.timeout ?? configuredTimeout(current)),
73
74
  Expiry,
75
+ open: channel.open,
76
+ savepoint,
77
+ transaction: transactionOptions,
74
78
  });
75
79
  return savepoint ? run : Effect.provideService(run, Expiry, unlinked);
76
80
  }).pipe(Effect.withSpan("PrismaChanges.transaction"));
77
81
 
78
- return { channel, Client, use, transaction, recordWrite, Unnamed };
82
+ return { Client, channel, recordWrite, transaction, Unnamed, use };
79
83
  };
package/src/coverage.ts CHANGED
@@ -6,27 +6,31 @@ export type CoverageViolation =
6
6
  | { readonly _tag: "Unnamed"; readonly write: UnnamedWrite };
7
7
 
8
8
  export interface Coverage<A> {
9
- readonly written: Iterable<string>;
10
- readonly tables: ReadonlyMap<string, string>;
9
+ readonly covers: (model: string, change: A) => boolean;
11
10
  readonly models: Readonly<Record<string, unknown>>;
12
11
  readonly observations: Iterable<Observation<A>>;
12
+ readonly tables: ReadonlyMap<string, string>;
13
13
  readonly unnamed: Iterable<UnnamedWrite>;
14
- readonly covers: (model: string, change: A) => boolean;
14
+ readonly written: Iterable<string>;
15
15
  }
16
16
 
17
- const recordedIn = <A>(observations: Iterable<Observation<A>>): ReadonlyArray<A> =>
17
+ const recordedIn = <A>(observations: Iterable<Observation<A>>): readonly A[] =>
18
18
  [...observations].flatMap((observation) => (observation._tag === "Recorded" ? observation.changes : []));
19
19
 
20
20
  const identify = (write: UnnamedWrite): string =>
21
21
  write.reason === "narrowed" ? `${write.model}.${write.operation}.${write.field}` : `${write.model}.${write.operation}`;
22
22
 
23
- export const checkCoverage = <A>(coverage: Coverage<A>): ReadonlyArray<CoverageViolation> => {
23
+ export const checkCoverage = <A>(coverage: Coverage<A>): readonly CoverageViolation[] => {
24
24
  const recorded = recordedIn(coverage.observations);
25
- const unrecorded = [...new Set(coverage.written)].flatMap((table): ReadonlyArray<CoverageViolation> => {
25
+ const unrecorded = [...new Set(coverage.written)].flatMap((table): readonly CoverageViolation[] => {
26
26
  const model = coverage.tables.get(table);
27
- if (model !== undefined && coverage.models[model] === null) return [];
28
- if (model !== undefined && recorded.some((change) => coverage.covers(model, change))) return [];
29
- return [{ _tag: "Unrecorded", table, model }];
27
+ if (model !== undefined && coverage.models[model] === null) {
28
+ return [];
29
+ }
30
+ if (model !== undefined && recorded.some((change) => coverage.covers(model, change))) {
31
+ return [];
32
+ }
33
+ return [{ _tag: "Unrecorded", model, table }];
30
34
  });
31
35
  const unnamed = new Map([...coverage.unnamed].map((write) => [identify(write), write] as const));
32
36
  return [...unrecorded, ...[...unnamed.values()].map((write): CoverageViolation => ({ _tag: "Unnamed", write }))];
package/src/expiry.ts CHANGED
@@ -32,7 +32,7 @@ export const expiring = <X, E, R>(
32
32
  const expired = yield* Deferred.make<never, TransactionExpired>();
33
33
  const closed: Expire = (cause) =>
34
34
  Effect.andThen(
35
- Deferred.fail(expired, new TransactionExpired({ message: "The transaction was closed before its body finished", cause })),
35
+ Deferred.fail(expired, new TransactionExpired({ cause, message: "The transaction was closed before its body finished" })),
36
36
  outer(cause),
37
37
  );
38
38
  const deadline =
package/src/model.ts CHANGED
@@ -1,11 +1,11 @@
1
1
  export interface TransactionOptions {
2
+ readonly isolationLevel?: "ReadUncommitted" | "ReadCommitted" | "RepeatableRead" | "Serializable";
2
3
  readonly maxWait?: number;
3
4
  readonly timeout?: number;
4
- readonly isolationLevel?: string;
5
5
  }
6
6
 
7
7
  export interface Transactional<Tx> {
8
- $transaction<X>(run: (tx: Tx) => Promise<X>, options?: TransactionOptions): PromiseLike<X>;
8
+ $transaction: <X>(run: (tx: Tx) => Promise<X>, options?: TransactionOptions) => PromiseLike<X>;
9
9
  }
10
10
 
11
11
  type PayloadOf<Delegate> = Delegate extends { readonly [key: symbol]: { readonly types: { readonly payload: infer Payload } } } ? Payload : never;
package/src/recording.ts CHANGED
@@ -16,8 +16,10 @@ const recordingDelegate = (delegate: object, model: string, collect: (write: Wri
16
16
  new Proxy(delegate, {
17
17
  get: (target, key) => {
18
18
  const value: unknown = Reflect.get(target, key);
19
- if (typeof key !== "string" || typeof value !== "function" || !isWriteOperation(key)) return bound(value, target);
20
- return (...args: ReadonlyArray<unknown>) =>
19
+ if (typeof key !== "string" || typeof value !== "function" || !isWriteOperation(key)) {
20
+ return bound(value, target);
21
+ }
22
+ return (...args: readonly unknown[]) =>
21
23
  Promise.resolve(Reflect.apply(value, target, args)).then((result: unknown) => {
22
24
  collect({ model, operation: key, result });
23
25
  return result;
@@ -34,7 +36,9 @@ export const recordingClient = <Client extends object>(
34
36
  get: (target, key) => {
35
37
  const value: unknown = Reflect.get(target, key);
36
38
  const model = typeof key === "string" ? delegates.get(key) : undefined;
37
- if (model !== undefined && typeof value === "object" && value !== null) return recordingDelegate(value, model, collect);
39
+ if (model !== undefined && typeof value === "object" && value !== null) {
40
+ return recordingDelegate(value, model, collect);
41
+ }
38
42
  return bound(value, target);
39
43
  },
40
44
  });
package/src/tables.ts CHANGED
@@ -1,15 +1,15 @@
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]*\}/gm;
5
- const MAPPED = /@@map\(\s*(?:name\s*:\s*)?"([^"]+)"/;
6
- const COMMENT = /\/\/.*$/gm;
4
+ const MODEL = /^[ \t]*model[ \t]+(\w+)[ \t]*\{([\s\S]*?)^[ \t]*\}/gmu;
5
+ const MAPPED = /@@map\(\s*(?:name\s*:\s*)?"([^"]+)"/u;
6
+ const COMMENT = /\/\/.*$/gmu;
7
7
 
8
8
  export const tablesOf = (schema: string): ReadonlyMap<string, string> =>
9
9
  new Map([...schema.replace(COMMENT, "").matchAll(MODEL)].map(([, model = "", body = ""]) => [MAPPED.exec(body)?.[1] ?? model, model] as const));
10
10
 
11
11
  export interface RawQueryClient {
12
- $queryRawUnsafe(query: string): PromiseLike<unknown>;
12
+ $queryRawUnsafe: (query: string) => PromiseLike<unknown>;
13
13
  }
14
14
 
15
15
  export type TableWrites = ReadonlyMap<string, bigint>;
@@ -22,10 +22,12 @@ const COUNTED =
22
22
  const none: TableWrites = new Map();
23
23
 
24
24
  export const tableWrites = Effect.fn("PrismaChanges.tableWrites")(function* (client: RawQueryClient) {
25
- const rows = yield* Effect.tryPromise({ try: () => client.$queryRawUnsafe(COUNTED), catch: (cause) => new PrismaError({ cause }) });
25
+ const rows = yield* Effect.tryPromise({ catch: (cause) => new PrismaError({ cause }), try: () => client.$queryRawUnsafe(COUNTED) });
26
26
  const decoded = yield* Effect.mapError(Schema.decodeUnknownEffect(Counted)(rows), (cause) => new PrismaError({ cause }));
27
27
  const counts = new Map<string, bigint>();
28
- for (const { relname, writes } of decoded) counts.set(relname, (counts.get(relname) ?? 0n) + writes);
28
+ for (const { relname, writes } of decoded) {
29
+ counts.set(relname, (counts.get(relname) ?? 0n) + writes);
30
+ }
29
31
  return counts satisfies TableWrites;
30
32
  });
31
33
 
@@ -1,13 +1,13 @@
1
- import type { Frame } from "@shivaedev/effect-changes";
2
1
  import { type Context, Effect, Exit } from "effect";
2
+ import type { Frame } from "@shivaedev/effect-changes";
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";
6
6
 
7
7
  interface Settled<X, E> {
8
+ readonly closed?: TransactionExpired;
8
9
  readonly committed: boolean;
9
10
  readonly exit: Exit.Exit<X, E | TransactionExpired | PrismaError>;
10
- readonly closed?: TransactionExpired;
11
11
  }
12
12
 
13
13
  class BodyFailed {}
@@ -25,15 +25,21 @@ const commit = <Tx extends Transactional<Tx>, X, E, R>(
25
25
  const run = async (tx: Tx) => {
26
26
  started = true;
27
27
  const exit = await Effect.runPromiseExitWith(context)(body(tx), { signal });
28
- if (Exit.isSuccess(exit)) return exit.value;
28
+ if (Exit.isSuccess(exit)) {
29
+ return exit.value;
30
+ }
29
31
  failed = exit;
30
32
  throw new BodyFailed();
31
33
  };
32
34
  const rejected = (cause: unknown): Settled<X, E> => {
33
- if (failed !== undefined) return { committed: false, exit: failed };
34
- if (!isTransactionClosed(cause) || !(started || savepoint)) return { committed: false, exit: Exit.fail(new PrismaError({ cause })) };
35
- const closed = new TransactionExpired({ message: "The transaction was closed before it could finish", cause });
36
- return { committed: false, exit: Exit.fail(closed), closed };
35
+ if (failed !== undefined) {
36
+ return { committed: false, exit: failed };
37
+ }
38
+ if (!(isTransactionClosed(cause) && (started || savepoint))) {
39
+ return { committed: false, exit: Exit.fail(new PrismaError({ cause })) };
40
+ }
41
+ const closed = new TransactionExpired({ cause, message: "The transaction was closed before it could finish" });
42
+ return { closed, committed: false, exit: Exit.fail(closed) };
37
43
  };
38
44
  return Promise.resolve(client.$transaction(run, options)).then(
39
45
  (value): Settled<X, E> => ({ committed: true, exit: Exit.succeed(value) }),
package/src/write.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import type { Bivariant } from "@shivaedev/types";
1
2
  import { countOperations, type RowOperation, rowOperations } from "./model.ts";
2
3
 
3
4
  export interface Write {
@@ -10,30 +11,36 @@ export type UnnamedWrite =
10
11
  | { readonly model: string; readonly operation: string; readonly reason: "countOnly" }
11
12
  | { readonly model: string; readonly operation: string; readonly reason: "narrowed"; readonly field: string };
12
13
 
13
- export type LooseChanges<A> = { bivariant(row: object, operation: RowOperation): Iterable<A> }["bivariant"];
14
+ export type LooseChanges<A> = Bivariant<(row: object, operation: RowOperation) => Iterable<A>>;
14
15
 
15
16
  export type LooseMap<A> = Readonly<Record<string, LooseChanges<A> | null | undefined>>;
16
17
 
17
18
  export interface Interpreted<A> {
18
- readonly changes: ReadonlyArray<A>;
19
+ readonly changes: readonly A[];
19
20
  readonly unnamed: UnnamedWrite | undefined;
20
21
  }
21
22
 
22
23
  class MissingField {
23
- constructor(readonly field: string) {}
24
+ readonly field: string;
25
+
26
+ constructor(field: string) {
27
+ this.field = field;
28
+ }
24
29
  }
25
30
 
26
31
  const guarded = (row: object): object =>
27
32
  new Proxy(row, {
28
33
  get: (target, key, receiver) => {
29
- if (typeof key === "string" && !(key in target)) throw new MissingField(key);
34
+ if (typeof key === "string" && !(key in target)) {
35
+ throw new MissingField(key);
36
+ }
30
37
  return Reflect.get(target, key, receiver);
31
38
  },
32
39
  });
33
40
 
34
41
  const isRowOperation = (operation: string): operation is RowOperation => rowOperations.has(operation);
35
42
 
36
- const rowsOf = (result: unknown): ReadonlyArray<object> =>
43
+ const rowsOf = (result: unknown): readonly object[] =>
37
44
  (Array.isArray(result) ? result : [result]).filter((row): row is object => typeof row === "object" && row !== null);
38
45
 
39
46
  const nothing: Interpreted<never> = { changes: [], unnamed: undefined };
@@ -41,14 +48,24 @@ const nothing: Interpreted<never> = { changes: [], unnamed: undefined };
41
48
  export const interpret = <A>(models: LooseMap<A>, write: Write): Interpreted<A> => {
42
49
  const { model, operation } = write;
43
50
  const changesOf = models[model];
44
- if (changesOf === undefined || changesOf === null) return nothing;
45
- if (countOperations.has(operation)) return { changes: [], unnamed: { model, operation, reason: "countOnly" } };
46
- if (!isRowOperation(operation)) return nothing;
47
- const changes: Array<A> = [];
51
+ if (changesOf === undefined || changesOf === null) {
52
+ return nothing;
53
+ }
54
+ if (countOperations.has(operation)) {
55
+ return { changes: [], unnamed: { model, operation, reason: "countOnly" } };
56
+ }
57
+ if (!isRowOperation(operation)) {
58
+ return nothing;
59
+ }
60
+ const changes: A[] = [];
48
61
  try {
49
- for (const row of rowsOf(write.result)) changes.push(...changesOf(guarded(row), operation));
62
+ for (const row of rowsOf(write.result)) {
63
+ changes.push(...changesOf(guarded(row), operation));
64
+ }
50
65
  } catch (error) {
51
- if (error instanceof MissingField) return { changes: [], unnamed: { model, operation, reason: "narrowed", field: error.field } };
66
+ if (error instanceof MissingField) {
67
+ return { changes: [], unnamed: { field: error.field, model, operation, reason: "narrowed" } };
68
+ }
52
69
  throw error;
53
70
  }
54
71
  return { changes, unnamed: undefined };