@shivaedev/effect-trpc 0.1.0 → 0.2.0

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
@@ -2,6 +2,20 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 0.2.0 - 2026-08-03
6
+
7
+ ### Added
8
+
9
+ - Build an application-defined Effectful test harness around a typed tRPC
10
+ caller while retaining worker-scoped Layers and standard Vitest variants.
11
+
12
+ ## 0.1.1 - 2026-08-03
13
+
14
+ ### Fixed
15
+
16
+ - Run consumer instrumentation inside request-scoped Layers so logging and
17
+ tracing hooks can read services derived from the tRPC context.
18
+
5
19
  ## 0.1.0 - 2026-08-03
6
20
 
7
21
  ### Added
package/README.md CHANGED
@@ -140,3 +140,8 @@ The test Layer is built once per worker. Its services override matching
140
140
  application runtime services while all other runtime services remain available.
141
141
  Use `around` to add application-wide test behavior such as a rollback wrapper.
142
142
  `effectTRPC` supports `skip`, `skipIf`, `runIf`, `only`, `each`, and `fails`.
143
+
144
+ `makeTrpcHarnessIt` builds an application-defined Effectful harness around the
145
+ caller when tests need additional services or fixtures. The harness is created
146
+ inside both the test Layer and the `around` wrapper, so setup participates in
147
+ the same scoped lifecycle as the test body.
@@ -1 +1 @@
1
- {"version":3,"file":"procedure-handler.d.ts","sourceRoot":"","sources":["../../src/internal/procedure-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,UAAU,mBAAmB,CAAC,OAAO,EAAE,KAAK;IAC3C,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC9B;AAED,eAAO,MAAM,oBAAoB,GAChC,mBAAmB,EACnB,OAAO,EACP,KAAK,EACL,gBAAgB,EAChB,UAAU,EACV,MAAM,EAEN,SAAS,aAAa,CAAC,mBAAmB,CAAC,EAC3C,UAAU,uBAAuB,CAChC,KAAK,EACL,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC,EAC/C,MAAM,CACN,EACD,iBAAiB,8BAA8B,CAC9C,OAAO,EACP,gBAAgB,EAChB,UAAU,CACV,EACD,WAAW,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,MAIxB,YAAY,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,oBAW7D,CAAC"}
1
+ {"version":3,"file":"procedure-handler.d.ts","sourceRoot":"","sources":["../../src/internal/procedure-handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,8BAA8B,EAAE,MAAM,wBAAwB,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,UAAU,mBAAmB,CAAC,OAAO,EAAE,KAAK;IAC3C,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC9B;AAED,eAAO,MAAM,oBAAoB,GAChC,mBAAmB,EACnB,OAAO,EACP,KAAK,EACL,gBAAgB,EAChB,UAAU,EACV,MAAM,EAEN,SAAS,aAAa,CAAC,mBAAmB,CAAC,EAC3C,UAAU,uBAAuB,CAChC,KAAK,EACL,gBAAgB,GAAG,OAAO,CAAC,mBAAmB,CAAC,EAC/C,MAAM,CACN,EACD,iBAAiB,8BAA8B,CAC9C,OAAO,EACP,gBAAgB,EAChB,UAAU,CACV,EACD,WAAW,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,MAIxB,YAAY,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,oBAY7D,CAAC"}
@@ -2,9 +2,12 @@ import { Effect } from "effect";
2
2
  export const makeProcedureHandler = (runtime, resolver, requestServices, procedure) => {
3
3
  const tracedResolver = Effect.fnUntraced(resolver);
4
4
  return async (invocation) => {
5
- const provided = Effect.suspend(() => tracedResolver(invocation.input).pipe(Effect.provide(requestServices.layer(invocation.ctx))));
5
+ const info = { ...procedure, path: invocation.path };
6
+ const provided = Effect.suspend(() => runtime
7
+ .instrument(tracedResolver(invocation.input), info)
8
+ .pipe(Effect.provide(requestServices.layer(invocation.ctx))));
6
9
  return await runtime.runEffect(provided, {
7
- procedure: { ...procedure, path: invocation.path },
10
+ procedure: info,
8
11
  ...(invocation.signal === undefined ? {} : { signal: invocation.signal }),
9
12
  });
10
13
  };
@@ -1 +1 @@
1
- {"version":3,"file":"procedure-handler.js","sourceRoot":"","sources":["../../src/internal/procedure-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAahC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAQnC,OAA2C,EAC3C,QAIC,EACD,eAIC,EACD,SAAsC,EACrC,EAAE;IACH,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEnD,OAAO,KAAK,EAAE,UAA+C,EAAE,EAAE;QAChE,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CACpC,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,IAAI,CACpC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CACrD,CACD,CAAC;QACF,OAAO,MAAM,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE;YACxC,SAAS,EAAE,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE;YAClD,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;SACzE,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC,CAAC"}
1
+ {"version":3,"file":"procedure-handler.js","sourceRoot":"","sources":["../../src/internal/procedure-handler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAahC,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAQnC,OAA2C,EAC3C,QAIC,EACD,eAIC,EACD,SAAsC,EACrC,EAAE;IACH,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAEnD,OAAO,KAAK,EAAE,UAA+C,EAAE,EAAE;QAChE,MAAM,IAAI,GAAG,EAAE,GAAG,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CACpC,OAAO;aACL,UAAU,CAAC,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;aAClD,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAC7D,CAAC;QACF,OAAO,MAAM,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE;YACxC,SAAS,EAAE,IAAI;YACf,GAAG,CAAC,UAAU,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;SACzE,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC,CAAC"}
@@ -6,6 +6,7 @@ interface RunEffectOptions {
6
6
  readonly signal?: AbortSignal;
7
7
  }
8
8
  export interface RuntimeBridge<Requirements> {
9
+ readonly instrument: EffectTRPCInstrument;
9
10
  readonly runEffect: <Value>(effect: Effect.Effect<Value, unknown, Requirements>, options: RunEffectOptions) => Promise<Value>;
10
11
  }
11
12
  export declare const makeRuntimeBridge: <Requirements, RuntimeError>(runtime: ManagedRuntime.ManagedRuntime<Requirements, RuntimeError>, contextBridge: ContextBridge, options: {
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/internal/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAGN,MAAM,EAEN,KAAK,cAAc,EAGnB,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EACX,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,UAAU,gBAAgB;IACzB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa,CAAC,YAAY;IAC1C,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EACzB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,EACnD,OAAO,EAAE,gBAAgB,KACrB,OAAO,CAAC,KAAK,CAAC,CAAC;CACpB;AA4BD,eAAO,MAAM,iBAAiB,GAAI,YAAY,EAAE,YAAY,EAC3D,SAAS,cAAc,CAAC,cAAc,CAAC,YAAY,EAAE,YAAY,CAAC,EAClE,eAAe,aAAa,EAC5B,SAAS;IACR,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAC1C,KACC,aAAa,CAAC,YAAY,CAoE3B,CAAC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/internal/runtime.ts"],"names":[],"mappings":"AACA,OAAO,EAGN,MAAM,EAEN,KAAK,cAAc,EAGnB,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EACX,qBAAqB,EACrB,oBAAoB,EACpB,aAAa,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD,UAAU,gBAAgB;IACzB,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC9B;AAED,MAAM,WAAW,aAAa,CAAC,YAAY;IAC1C,QAAQ,CAAC,UAAU,EAAE,oBAAoB,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,CAAC,KAAK,EACzB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,YAAY,CAAC,EACnD,OAAO,EAAE,gBAAgB,KACrB,OAAO,CAAC,KAAK,CAAC,CAAC;CACpB;AA4BD,eAAO,MAAM,iBAAiB,GAAI,YAAY,EAAE,YAAY,EAC3D,SAAS,cAAc,CAAC,cAAc,CAAC,YAAY,EAAE,YAAY,CAAC,EAClE,eAAe,aAAa,EAC5B,SAAS;IACR,QAAQ,CAAC,UAAU,CAAC,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAC1C,KACC,aAAa,CAAC,YAAY,CAqE3B,CAAC"}
@@ -17,6 +17,9 @@ const mapError = (error, origin, procedure, consumerMapper) => {
17
17
  }
18
18
  };
19
19
  export const makeRuntimeBridge = (runtime, contextBridge, options) => ({
20
+ instrument: (effect, procedure) => Effect.suspend(() => options.instrument === undefined
21
+ ? effect
22
+ : options.instrument(effect, procedure)),
20
23
  runEffect: async (effect, runOptions) => {
21
24
  const traced = effect.pipe(Effect.withSpan(runOptions.procedure.path, {
22
25
  attributes: {
@@ -27,13 +30,10 @@ export const makeRuntimeBridge = (runtime, contextBridge, options) => ({
27
30
  }, {
28
31
  captureStackTrace: runOptions.procedure.captureStackTrace,
29
32
  }));
30
- const instrumented = Effect.suspend(() => options.instrument === undefined
31
- ? traced
32
- : options.instrument(traced, runOptions.procedure));
33
33
  const ambient = contextBridge.current();
34
34
  const runnable = ambient === undefined
35
- ? instrumented
36
- : Effect.flatMap(runtime.contextEffect, (base) => Effect.provideContext(instrumented, Context.merge(base, ambient)));
35
+ ? traced
36
+ : Effect.flatMap(runtime.contextEffect, (base) => Effect.provideContext(traced, Context.merge(base, ambient)));
37
37
  const exit = await runtime.runPromiseExit(runnable, runOptions.signal === undefined
38
38
  ? undefined
39
39
  : { signal: runOptions.signal });
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/internal/runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../../src/internal/runtime.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { TestContext, TestOptions } from "@effect/vitest";
2
2
  import { type Context } from "effect";
3
- import type { TrpcTester, TrpcTestRuntimeOptions } from "../testing/types.js";
3
+ import type { TrpcHarnessTester, TrpcHarnessTestRuntimeOptions, TrpcTester, TrpcTestRuntimeOptions } from "../testing/types.js";
4
4
  export declare const fixtureName = "__effectTrpcContext";
5
5
  export type TrpcFixture<Provided> = TestContext & {
6
6
  readonly [fixtureName]: Context.Context<Provided>;
@@ -14,5 +14,6 @@ export interface FixtureTestApi<Provided> {
14
14
  readonly fails: FixtureTestApi<Provided>;
15
15
  readonly for: <Item>(cases: ReadonlyArray<Item>) => (name: string, options: TestOptions, body: (item: Item, context: TrpcFixture<Provided>) => Promise<unknown>) => void;
16
16
  }
17
+ export declare const makeTrpcHarnessTester: <Options, Caller extends object, Harness, Provided, LayerError>(fixtureIt: FixtureTestApi<Provided>, options: TrpcHarnessTestRuntimeOptions<Options, Caller, Harness, Provided, LayerError>) => TrpcHarnessTester<Harness, Provided>;
17
18
  export declare const makeTrpcTester: <Options, Caller extends object, Provided, LayerError>(fixtureIt: FixtureTestApi<Provided>, options: TrpcTestRuntimeOptions<Options, Caller, Provided, LayerError>) => TrpcTester<Options, Caller, Provided>;
18
19
  //# sourceMappingURL=vitest-trpc.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vitest-trpc.d.ts","sourceRoot":"","sources":["../../src/internal/vitest-trpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAS,KAAK,OAAO,EAAmC,MAAM,QAAQ,CAAC;AAI9E,OAAO,KAAK,EAEX,UAAU,EACV,sBAAsB,EACtB,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,WAAW,wBAAwB,CAAC;AAEjD,MAAM,MAAM,WAAW,CAAC,QAAQ,IAAI,WAAW,GAAG;IACjD,QAAQ,CAAC,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,WAAW,cAAc,CAAC,QAAQ;IACvC,CACC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GACxD,IAAI,CAAC;IACR,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClE,QAAQ,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAClB,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,KACtB,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,KAClE,IAAI,CAAC;CACV;AAoCD,eAAO,MAAM,cAAc,GAC1B,OAAO,EACP,MAAM,SAAS,MAAM,EACrB,QAAQ,EACR,UAAU,EAEV,WAAW,cAAc,CAAC,QAAQ,CAAC,EACnC,SAAS,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,KACpE,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CA0HtC,CAAC"}
1
+ {"version":3,"file":"vitest-trpc.d.ts","sourceRoot":"","sources":["../../src/internal/vitest-trpc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC/D,OAAO,EAAS,KAAK,OAAO,EAAmC,MAAM,QAAQ,CAAC;AAI9E,OAAO,KAAK,EAEX,iBAAiB,EACjB,6BAA6B,EAC7B,UAAU,EACV,sBAAsB,EACtB,MAAM,qBAAqB,CAAC;AAE7B,eAAO,MAAM,WAAW,wBAAwB,CAAC;AAEjD,MAAM,MAAM,WAAW,CAAC,QAAQ,IAAI,WAAW,GAAG;IACjD,QAAQ,CAAC,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;CAClD,CAAC;AAEF,MAAM,WAAW,cAAc,CAAC,QAAQ;IACvC,CACC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,GACxD,IAAI,CAAC;IACR,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClE,QAAQ,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,cAAc,CAAC,QAAQ,CAAC,CAAC;IACjE,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACxC,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IACzC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAClB,KAAK,EAAE,aAAa,CAAC,IAAI,CAAC,KACtB,CACJ,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,IAAI,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,KAClE,IAAI,CAAC;CACV;AAoCD,eAAO,MAAM,qBAAqB,GACjC,OAAO,EACP,MAAM,SAAS,MAAM,EACrB,OAAO,EACP,QAAQ,EACR,UAAU,EAEV,WAAW,cAAc,CAAC,QAAQ,CAAC,EACnC,SAAS,6BAA6B,CACrC,OAAO,EACP,MAAM,EACN,OAAO,EACP,QAAQ,EACR,UAAU,CACV,KACC,iBAAiB,CAAC,OAAO,EAAE,QAAQ,CAoHrC,CAAC;AAEF,eAAO,MAAM,cAAc,GAC1B,OAAO,EACP,MAAM,SAAS,MAAM,EACrB,QAAQ,EACR,UAAU,EAEV,WAAW,cAAc,CAAC,QAAQ,CAAC,EACnC,SAAS,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,KACpE,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAIK,CAAC"}
@@ -16,12 +16,13 @@ const runEffectTest = (effect, context) => Effect.runPromise(Effect.gen(function
16
16
  }
17
17
  return yield* exit;
18
18
  }).pipe(Effect.scoped, Effect.provide(TestEnvironment)), { signal: context.signal });
19
- export const makeTrpcTester = (fixtureIt, options) => {
19
+ export const makeTrpcHarnessTester = (fixtureIt, options) => {
20
20
  const run = (body, context) => {
21
21
  const program = Effect.gen(function* () {
22
22
  const services = yield* Effect.context();
23
23
  const trpc = makeEffectCallerFactory(options.adapter, options.createCaller, services);
24
- return yield* Effect.gen(() => body(trpc, context));
24
+ const harness = yield* options.makeHarness(trpc, context);
25
+ return yield* Effect.gen(() => body(harness, context));
25
26
  });
26
27
  // The body constraint proves every yielded service is part of Provided.
27
28
  // TypeScript cannot reduce that generic generator requirement here.
@@ -60,11 +61,15 @@ export const makeTrpcTester = (fixtureIt, options) => {
60
61
  expect,
61
62
  _local,
62
63
  });
63
- return runEffectTest(run((trpc, testContext) => body(item, trpc, testContext), context), context);
64
+ return runEffectTest(run((harness, testContext) => body(item, harness, testContext), context), context);
64
65
  }),
65
66
  fails: register(current.fails),
66
67
  });
67
68
  };
68
69
  return make(fixtureIt);
69
70
  };
71
+ export const makeTrpcTester = (fixtureIt, options) => makeTrpcHarnessTester(fixtureIt, {
72
+ ...options,
73
+ makeHarness: (trpc) => Effect.succeed(trpc),
74
+ });
70
75
  //# sourceMappingURL=vitest-trpc.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vitest-trpc.js","sourceRoot":"","sources":["../../src/internal/vitest-trpc.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"vitest-trpc.js","sourceRoot":"","sources":["../../src/internal/vitest-trpc.ts"],"names":[],"mappings":"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"}
@@ -2,30 +2,40 @@ import type { TestContext, TestOptions, Vitest } from "@effect/vitest";
2
2
  import type { Effect, Layer } from "effect";
3
3
  import type { EffectTRPCAdapter } from "../adapter.js";
4
4
  import type { EffectCallerFactory } from "./caller.js";
5
- export type TrpcTest<Options, Caller, Provided> = <A, Eff extends Effect.Effect<unknown, unknown, Provided>>(name: string, body: (trpc: EffectCallerFactory<Options, Caller>, context: TestContext) => Generator<Eff, A, never>, options?: number | TestOptions) => void;
6
- export interface TrpcTester<Options, Caller, Provided> extends TrpcTest<Options, Caller, Provided> {
7
- readonly skip: TrpcTest<Options, Caller, Provided>;
8
- readonly skipIf: (condition: unknown) => TrpcTest<Options, Caller, Provided>;
9
- readonly runIf: (condition: unknown) => TrpcTest<Options, Caller, Provided>;
10
- readonly only: TrpcTest<Options, Caller, Provided>;
11
- readonly each: <Item>(cases: ReadonlyArray<Item>) => <A, Eff extends Effect.Effect<unknown, unknown, Provided>>(name: string, body: (item: Item, trpc: EffectCallerFactory<Options, Caller>, context: TestContext) => Generator<Eff, A, never>, options?: number | TestOptions) => void;
12
- readonly fails: TrpcTest<Options, Caller, Provided>;
5
+ export type TrpcHarnessTest<Harness, Provided> = <A, Eff extends Effect.Effect<unknown, unknown, Provided>>(name: string, body: (harness: Harness, context: TestContext) => Generator<Eff, A, never>, options?: number | TestOptions) => void;
6
+ export interface TrpcHarnessTester<Harness, Provided> extends TrpcHarnessTest<Harness, Provided> {
7
+ readonly skip: TrpcHarnessTest<Harness, Provided>;
8
+ readonly skipIf: (condition: unknown) => TrpcHarnessTest<Harness, Provided>;
9
+ readonly runIf: (condition: unknown) => TrpcHarnessTest<Harness, Provided>;
10
+ readonly only: TrpcHarnessTest<Harness, Provided>;
11
+ readonly each: <Item>(cases: ReadonlyArray<Item>) => <A, Eff extends Effect.Effect<unknown, unknown, Provided>>(name: string, body: (item: Item, harness: Harness, context: TestContext) => Generator<Eff, A, never>, options?: number | TestOptions) => void;
12
+ readonly fails: TrpcHarnessTest<Harness, Provided>;
13
13
  }
14
+ export type TrpcTest<Options, Caller, Provided> = TrpcHarnessTest<EffectCallerFactory<Options, Caller>, Provided>;
15
+ export type TrpcTester<Options, Caller, Provided> = TrpcHarnessTester<EffectCallerFactory<Options, Caller>, Provided>;
14
16
  export type TrpcIt<Options, Caller, Provided> = Vitest.Methods & {
15
17
  readonly effectTRPC: TrpcTester<Options, Caller, Provided>;
16
18
  };
17
- export interface TrpcTestRuntimeOptions<Options, Caller extends object, Provided, LayerError> {
19
+ export type TrpcHarnessIt<Harness, Provided> = Vitest.Methods & {
20
+ readonly effectTRPC: TrpcHarnessTester<Harness, Provided>;
21
+ };
22
+ export interface TrpcHarnessTestRuntimeOptions<Options, Caller extends object, Harness, Provided, LayerError> {
18
23
  readonly adapter: Pick<EffectTRPCAdapter<never>, "runWithServices">;
19
24
  readonly around?: <A, E>(effect: Effect.Effect<A, E, Provided>) => Effect.Effect<A, unknown, Provided>;
20
25
  readonly createCaller: (options?: Options) => Caller;
21
26
  readonly layer: Layer.Layer<Provided, LayerError>;
27
+ readonly makeHarness: (trpc: EffectCallerFactory<Options, Caller>, context: TestContext) => Effect.Effect<Harness, unknown, Provided>;
22
28
  }
29
+ export type TrpcTestRuntimeOptions<Options, Caller extends object, Provided, LayerError> = Omit<TrpcHarnessTestRuntimeOptions<Options, Caller, EffectCallerFactory<Options, Caller>, Provided, LayerError>, "makeHarness">;
23
30
  export interface MakeTrpcItOptions<CreateCaller extends (...arguments_: never[]) => object, TestLayer extends Layer.Layer<any, any, never>> {
24
31
  readonly adapter: Pick<EffectTRPCAdapter<never>, "runWithServices">;
25
32
  readonly around?: <A, E>(effect: Effect.Effect<A, E, Layer.Success<TestLayer>>) => Effect.Effect<A, unknown, Layer.Success<TestLayer>>;
26
33
  readonly createCaller: CreateCaller;
27
34
  readonly layer: TestLayer;
28
35
  }
36
+ export interface MakeTrpcHarnessItOptions<CreateCaller extends (...arguments_: never[]) => object, TestLayer extends Layer.Layer<any, any, never>, Harness> extends MakeTrpcItOptions<CreateCaller, TestLayer> {
37
+ readonly makeHarness: (trpc: EffectCallerFactory<CallerOptions<CreateCaller>, CallerResult<CreateCaller>>, context: TestContext) => Effect.Effect<Harness, unknown, Layer.Success<TestLayer>>;
38
+ }
29
39
  export type CallerOptions<CreateCaller> = CreateCaller extends (...arguments_: infer Arguments) => object ? Arguments[0] : never;
30
40
  export type CallerResult<CreateCaller> = CreateCaller extends (...arguments_: infer _Arguments) => infer Caller ? Caller extends object ? Caller : never : never;
31
41
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/testing/types.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
1
  import { Layer } from "effect";
2
- import type { CallerOptions, CallerResult, MakeTrpcItOptions, TrpcIt } from "./types.js";
2
+ import type { CallerOptions, CallerResult, MakeTrpcHarnessItOptions, MakeTrpcItOptions, TrpcHarnessIt, TrpcIt } from "./types.js";
3
3
  export declare const makeTrpcIt: <CreateCaller extends (...arguments_: never[]) => object, TestLayer extends Layer.Layer<any, any, never>>(options: MakeTrpcItOptions<CreateCaller, TestLayer>) => TrpcIt<CallerOptions<CreateCaller>, CallerResult<CreateCaller>, Layer.Success<TestLayer>>;
4
+ export declare const makeTrpcHarnessIt: <CreateCaller extends (...arguments_: never[]) => object, TestLayer extends Layer.Layer<any, any, never>, Harness>(options: MakeTrpcHarnessItOptions<CreateCaller, TestLayer, Harness>) => TrpcHarnessIt<Harness, Layer.Success<TestLayer>>;
4
5
  //# sourceMappingURL=vitest.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../../src/testing/vitest.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,EAAS,MAAM,QAAQ,CAAC;AAMpD,OAAO,KAAK,EACX,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,MAAM,EACN,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,UAAU,GACtB,YAAY,SAAS,CAAC,GAAG,UAAU,EAAE,KAAK,EAAE,KAAK,MAAM,EAEvD,SAAS,SAAS,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAE9C,SAAS,iBAAiB,CAAC,YAAY,EAAE,SAAS,CAAC,KACjD,MAAM,CACR,aAAa,CAAC,YAAY,CAAC,EAC3B,YAAY,CAAC,YAAY,CAAC,EAC1B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAwCxB,CAAC"}
1
+ {"version":3,"file":"vitest.d.ts","sourceRoot":"","sources":["../../src/testing/vitest.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,KAAK,EAAS,MAAM,QAAQ,CAAC;AAOpD,OAAO,KAAK,EACX,aAAa,EACb,YAAY,EACZ,wBAAwB,EACxB,iBAAiB,EACjB,aAAa,EACb,MAAM,EACN,MAAM,YAAY,CAAC;AAoCpB,eAAO,MAAM,UAAU,GACtB,YAAY,SAAS,CAAC,GAAG,UAAU,EAAE,KAAK,EAAE,KAAK,MAAM,EAEvD,SAAS,SAAS,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAE9C,SAAS,iBAAiB,CAAC,YAAY,EAAE,SAAS,CAAC,KACjD,MAAM,CACR,aAAa,CAAC,YAAY,CAAC,EAC3B,YAAY,CAAC,YAAY,CAAC,EAC1B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAkBxB,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC7B,YAAY,SAAS,CAAC,GAAG,UAAU,EAAE,KAAK,EAAE,KAAK,MAAM,EAEvD,SAAS,SAAS,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAC9C,OAAO,EAEP,SAAS,wBAAwB,CAAC,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,KACjE,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAsBjD,CAAC"}
@@ -1,28 +1,35 @@
1
1
  import { it as effectIt } from "@effect/vitest";
2
2
  import { Effect, Exit, Layer, Scope } from "effect";
3
- import { fixtureName, makeTrpcTester, } from "../internal/vitest-trpc.js";
4
- export const makeTrpcIt = (options) => {
5
- const fixtureIt = effectIt.extend(fixtureName, { scope: "worker" },
6
- // biome-ignore lint/correctness/noEmptyPattern: Vitest fixtures require a destructured context parameter.
7
- async ({}, { onCleanup }) => {
8
- const scope = Effect.runSync(Scope.make());
9
- onCleanup(() => Effect.runPromise(Scope.close(scope, Exit.void)));
10
- try {
11
- return await Effect.runPromise(Layer.buildWithScope(options.layer, scope));
12
- }
13
- catch (error) {
14
- await Effect.runPromise(Scope.close(scope, Exit.void));
15
- throw error;
3
+ import { fixtureName, makeTrpcHarnessTester, makeTrpcTester, } from "../internal/vitest-trpc.js";
4
+ const makeFixtureIt = (layer) => effectIt.extend(fixtureName, { scope: "worker" },
5
+ // biome-ignore lint/correctness/noEmptyPattern: Vitest fixtures require a destructured context parameter.
6
+ async ({}, { onCleanup }) => {
7
+ const scope = Effect.runSync(Scope.make());
8
+ onCleanup(() => Effect.runPromise(Scope.close(scope, Exit.void)));
9
+ try {
10
+ return await Effect.runPromise(Layer.buildWithScope(layer, scope));
11
+ }
12
+ catch (error) {
13
+ await Effect.runPromise(Scope.close(scope, Exit.void));
14
+ throw error;
15
+ }
16
+ });
17
+ const withEffectTRPC = (tester) => new Proxy(effectIt, {
18
+ get(target, property, receiver) {
19
+ if (property === "effectTRPC") {
20
+ return tester;
16
21
  }
17
- });
22
+ return Reflect.get(target, property, receiver);
23
+ },
24
+ });
25
+ export const makeTrpcIt = (options) => {
26
+ const fixtureIt = makeFixtureIt(options.layer);
18
27
  const effectTRPC = makeTrpcTester(fixtureIt, options);
19
- return new Proxy(effectIt, {
20
- get(target, property, receiver) {
21
- if (property === "effectTRPC") {
22
- return effectTRPC;
23
- }
24
- return Reflect.get(target, property, receiver);
25
- },
26
- });
28
+ return withEffectTRPC(effectTRPC);
29
+ };
30
+ export const makeTrpcHarnessIt = (options) => {
31
+ const fixtureIt = makeFixtureIt(options.layer);
32
+ const effectTRPC = makeTrpcHarnessTester(fixtureIt, options);
33
+ return withEffectTRPC(effectTRPC);
27
34
  };
28
35
  //# sourceMappingURL=vitest.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"vitest.js","sourceRoot":"","sources":["../../src/testing/vitest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,EAEN,WAAW,EACX,cAAc,GACd,MAAM,4BAA4B,CAAC;AAQpC,MAAM,CAAC,MAAM,UAAU,GAAG,CAKzB,OAAmD,EAKlD,EAAE;IAKH,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAChC,WAAW,EACX,EAAE,KAAK,EAAE,QAAQ,EAAE;IACnB,0GAA0G;IAC1G,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;QAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3C,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAElE,IAAI,CAAC;YACJ,OAAO,MAAM,MAAM,CAAC,UAAU,CAC7B,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAC1C,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;YACvD,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC,CACD,CAAC;IAEF,MAAM,UAAU,GAAG,cAAc,CAChC,SAAgD,EAChD,OAEI,CACJ,CAAC;IAEF,OAAO,IAAI,KAAK,CAAC,QAAQ,EAAE;QAC1B,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ;YAC7B,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;gBAC/B,OAAO,UAAU,CAAC;YACnB,CAAC;YACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC;KACD,CAAsC,CAAC;AACzC,CAAC,CAAC"}
1
+ {"version":3,"file":"vitest.js","sourceRoot":"","sources":["../../src/testing/vitest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,IAAI,QAAQ,EAAe,MAAM,gBAAgB,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,QAAQ,CAAC;AACpD,OAAO,EAEN,WAAW,EACX,qBAAqB,EACrB,cAAc,GACd,MAAM,4BAA4B,CAAC;AAUpC,MAAM,aAAa,GAAG,CACrB,KAAwC,EACb,EAAE,CAC7B,QAAQ,CAAC,MAAM,CACd,WAAW,EACX,EAAE,KAAK,EAAE,QAAQ,EAAE;AACnB,0GAA0G;AAC1G,KAAK,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC3C,SAAS,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAElE,IAAI,CAAC;QACJ,OAAO,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC,CACsC,CAAC;AAE1C,MAAM,cAAc,GAAG,CACtB,MAAc,EAGb,EAAE,CACH,IAAI,KAAK,CAAC,QAAQ,EAAE;IACnB,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ;QAC7B,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC;QACf,CAAC;QACD,OAAO,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChD,CAAC;CACD,CAAqD,CAAC;AAExD,MAAM,CAAC,MAAM,UAAU,GAAG,CAKzB,OAAmD,EAKlD,EAAE;IAKH,MAAM,SAAS,GAAG,aAAa,CAC9B,OAAO,CAAC,KAAK,CACb,CAAC;IAEF,MAAM,UAAU,GAAG,cAAc,CAChC,SAAgD,EAChD,OAEI,CACJ,CAAC;IAEF,OAAO,cAAc,CAAC,UAAU,CAAsC,CAAC;AACxE,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAMhC,OAAmE,EAChB,EAAE;IAKrD,MAAM,SAAS,GAAG,aAAa,CAC9B,OAAO,CAAC,KAAK,CACb,CAAC;IACF,MAAM,UAAU,GAAG,qBAAqB,CACvC,SAAS,EACT,OAQI,CACJ,CAAC;IAEF,OAAO,cAAc,CAAC,UAAU,CAAC,CAAC;AACnC,CAAC,CAAC"}
package/dist/testing.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export { type EffectCaller, type EffectCallerFactory, makeEffectCaller, makeEffectCallerFactory, } from "./testing/caller.js";
2
- export type { MakeTrpcItOptions, TrpcIt, TrpcTest, TrpcTester, } from "./testing/types.js";
3
- export { makeTrpcIt } from "./testing/vitest.js";
2
+ export type { CallerOptions, CallerResult, MakeTrpcHarnessItOptions, MakeTrpcItOptions, TrpcHarnessIt, TrpcHarnessTest, TrpcHarnessTester, TrpcIt, TrpcTest, TrpcTester, } from "./testing/types.js";
3
+ export { makeTrpcHarnessIt, makeTrpcIt } from "./testing/vitest.js";
4
4
  //# sourceMappingURL=testing.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,gBAAgB,EAChB,uBAAuB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACX,iBAAiB,EACjB,MAAM,EACN,QAAQ,EACR,UAAU,GACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,YAAY,EACjB,KAAK,mBAAmB,EACxB,gBAAgB,EAChB,uBAAuB,GACvB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACX,aAAa,EACb,YAAY,EACZ,wBAAwB,EACxB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,iBAAiB,EACjB,MAAM,EACN,QAAQ,EACR,UAAU,GACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
package/dist/testing.js CHANGED
@@ -1,3 +1,3 @@
1
1
  export { makeEffectCaller, makeEffectCallerFactory, } from "./testing/caller.js";
2
- export { makeTrpcIt } from "./testing/vitest.js";
2
+ export { makeTrpcHarnessIt, makeTrpcIt } from "./testing/vitest.js";
3
3
  //# sourceMappingURL=testing.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,gBAAgB,EAChB,uBAAuB,GACvB,MAAM,qBAAqB,CAAC;AAO7B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"testing.js","sourceRoot":"","sources":["../src/testing.ts"],"names":[],"mappings":"AAAA,OAAO,EAGN,gBAAgB,EAChB,uBAAuB,GACvB,MAAM,qBAAqB,CAAC;AAa7B,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shivaedev/effect-trpc",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Effect-native procedures and testing for tRPC",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -35,13 +35,14 @@ export const makeProcedureHandler = <
35
35
  const tracedResolver = Effect.fnUntraced(resolver);
36
36
 
37
37
  return async (invocation: ProcedureInvocation<Context, Input>) => {
38
+ const info = { ...procedure, path: invocation.path };
38
39
  const provided = Effect.suspend(() =>
39
- tracedResolver(invocation.input).pipe(
40
- Effect.provide(requestServices.layer(invocation.ctx)),
41
- ),
40
+ runtime
41
+ .instrument(tracedResolver(invocation.input), info)
42
+ .pipe(Effect.provide(requestServices.layer(invocation.ctx))),
42
43
  );
43
44
  return await runtime.runEffect(provided, {
44
- procedure: { ...procedure, path: invocation.path },
45
+ procedure: info,
45
46
  ...(invocation.signal === undefined ? {} : { signal: invocation.signal }),
46
47
  });
47
48
  };
@@ -21,6 +21,7 @@ interface RunEffectOptions {
21
21
  }
22
22
 
23
23
  export interface RuntimeBridge<Requirements> {
24
+ readonly instrument: EffectTRPCInstrument;
24
25
  readonly runEffect: <Value>(
25
26
  effect: Effect.Effect<Value, unknown, Requirements>,
26
27
  options: RunEffectOptions,
@@ -61,6 +62,12 @@ export const makeRuntimeBridge = <Requirements, RuntimeError>(
61
62
  readonly mapError?: EffectTRPCErrorMapper;
62
63
  },
63
64
  ): RuntimeBridge<Requirements> => ({
65
+ instrument: (effect, procedure) =>
66
+ Effect.suspend(() =>
67
+ options.instrument === undefined
68
+ ? effect
69
+ : options.instrument(effect, procedure),
70
+ ),
64
71
  runEffect: async (effect, runOptions) => {
65
72
  const traced = effect.pipe(
66
73
  Effect.withSpan(
@@ -77,17 +84,12 @@ export const makeRuntimeBridge = <Requirements, RuntimeError>(
77
84
  },
78
85
  ),
79
86
  );
80
- const instrumented = Effect.suspend(() =>
81
- options.instrument === undefined
82
- ? traced
83
- : options.instrument(traced, runOptions.procedure),
84
- );
85
87
  const ambient = contextBridge.current();
86
88
  const runnable =
87
89
  ambient === undefined
88
- ? instrumented
90
+ ? traced
89
91
  : Effect.flatMap(runtime.contextEffect, (base) =>
90
- Effect.provideContext(instrumented, Context.merge(base, ambient)),
92
+ Effect.provideContext(traced, Context.merge(base, ambient)),
91
93
  );
92
94
  const exit = await runtime.runPromiseExit(
93
95
  runnable,
@@ -4,7 +4,9 @@ import * as TestClock from "effect/testing/TestClock";
4
4
  import * as TestConsole from "effect/testing/TestConsole";
5
5
  import { makeEffectCallerFactory } from "../testing/caller.js";
6
6
  import type {
7
- TrpcTest,
7
+ TrpcHarnessTest,
8
+ TrpcHarnessTester,
9
+ TrpcHarnessTestRuntimeOptions,
8
10
  TrpcTester,
9
11
  TrpcTestRuntimeOptions,
10
12
  } from "../testing/types.js";
@@ -69,22 +71,24 @@ const runEffectTest = <A, E>(
69
71
  { signal: context.signal },
70
72
  );
71
73
 
72
- export const makeTrpcTester = <
74
+ export const makeTrpcHarnessTester = <
73
75
  Options,
74
76
  Caller extends object,
77
+ Harness,
75
78
  Provided,
76
79
  LayerError,
77
80
  >(
78
81
  fixtureIt: FixtureTestApi<Provided>,
79
- options: TrpcTestRuntimeOptions<Options, Caller, Provided, LayerError>,
80
- ): TrpcTester<Options, Caller, Provided> => {
82
+ options: TrpcHarnessTestRuntimeOptions<
83
+ Options,
84
+ Caller,
85
+ Harness,
86
+ Provided,
87
+ LayerError
88
+ >,
89
+ ): TrpcHarnessTester<Harness, Provided> => {
81
90
  const run = <A, Eff extends Effect.Effect<unknown, unknown, Provided>>(
82
- body: (
83
- trpc: ReturnType<
84
- typeof makeEffectCallerFactory<Options, Caller, Provided>
85
- >,
86
- context: TestContext,
87
- ) => Generator<Eff, A, never>,
91
+ body: (harness: Harness, context: TestContext) => Generator<Eff, A, never>,
88
92
  context: TestContext,
89
93
  ): Effect.Effect<A, unknown, Scope.Scope> => {
90
94
  const program = Effect.gen(function* () {
@@ -94,7 +98,8 @@ export const makeTrpcTester = <
94
98
  options.createCaller,
95
99
  services,
96
100
  );
97
- return yield* Effect.gen(() => body(trpc, context));
101
+ const harness = yield* options.makeHarness(trpc, context);
102
+ return yield* Effect.gen(() => body(harness, context));
98
103
  });
99
104
  // The body constraint proves every yielded service is part of Provided.
100
105
  // TypeScript cannot reduce that generic generator requirement here.
@@ -106,7 +111,7 @@ export const makeTrpcTester = <
106
111
  };
107
112
 
108
113
  const register =
109
- (current: FixtureTestApi<Provided>): TrpcTest<Options, Caller, Provided> =>
114
+ (current: FixtureTestApi<Provided>): TrpcHarnessTest<Harness, Provided> =>
110
115
  (name, body, testOptions) =>
111
116
  current(
112
117
  name,
@@ -138,7 +143,7 @@ export const makeTrpcTester = <
138
143
 
139
144
  const make = (
140
145
  current: FixtureTestApi<Provided>,
141
- ): TrpcTester<Options, Caller, Provided> => {
146
+ ): TrpcHarnessTester<Harness, Provided> => {
142
147
  const test = register(current);
143
148
  return Object.assign(test, {
144
149
  skip: register(current.skip),
@@ -151,9 +156,7 @@ export const makeTrpcTester = <
151
156
  name: string,
152
157
  body: (
153
158
  item: Item,
154
- trpc: ReturnType<
155
- typeof makeEffectCallerFactory<Options, Caller, Provided>
156
- >,
159
+ harness: Harness,
157
160
  context: TestContext,
158
161
  ) => Generator<Eff, A, never>,
159
162
  testOptions?: number | TestOptions,
@@ -187,7 +190,7 @@ export const makeTrpcTester = <
187
190
  });
188
191
  return runEffectTest(
189
192
  run(
190
- (trpc, testContext) => body(item, trpc, testContext),
193
+ (harness, testContext) => body(item, harness, testContext),
191
194
  context,
192
195
  ),
193
196
  context,
@@ -200,3 +203,17 @@ export const makeTrpcTester = <
200
203
 
201
204
  return make(fixtureIt);
202
205
  };
206
+
207
+ export const makeTrpcTester = <
208
+ Options,
209
+ Caller extends object,
210
+ Provided,
211
+ LayerError,
212
+ >(
213
+ fixtureIt: FixtureTestApi<Provided>,
214
+ options: TrpcTestRuntimeOptions<Options, Caller, Provided, LayerError>,
215
+ ): TrpcTester<Options, Caller, Provided> =>
216
+ makeTrpcHarnessTester(fixtureIt, {
217
+ ...options,
218
+ makeHarness: (trpc) => Effect.succeed(trpc),
219
+ }) as TrpcTester<Options, Caller, Provided>;
@@ -3,45 +3,57 @@ import type { Effect, Layer } from "effect";
3
3
  import type { EffectTRPCAdapter } from "../adapter.js";
4
4
  import type { EffectCallerFactory } from "./caller.js";
5
5
 
6
- export type TrpcTest<Options, Caller, Provided> = <
6
+ export type TrpcHarnessTest<Harness, Provided> = <
7
7
  A,
8
8
  Eff extends Effect.Effect<unknown, unknown, Provided>,
9
9
  >(
10
10
  name: string,
11
- body: (
12
- trpc: EffectCallerFactory<Options, Caller>,
13
- context: TestContext,
14
- ) => Generator<Eff, A, never>,
11
+ body: (harness: Harness, context: TestContext) => Generator<Eff, A, never>,
15
12
  options?: number | TestOptions,
16
13
  ) => void;
17
14
 
18
- export interface TrpcTester<Options, Caller, Provided>
19
- extends TrpcTest<Options, Caller, Provided> {
20
- readonly skip: TrpcTest<Options, Caller, Provided>;
21
- readonly skipIf: (condition: unknown) => TrpcTest<Options, Caller, Provided>;
22
- readonly runIf: (condition: unknown) => TrpcTest<Options, Caller, Provided>;
23
- readonly only: TrpcTest<Options, Caller, Provided>;
15
+ export interface TrpcHarnessTester<Harness, Provided>
16
+ extends TrpcHarnessTest<Harness, Provided> {
17
+ readonly skip: TrpcHarnessTest<Harness, Provided>;
18
+ readonly skipIf: (condition: unknown) => TrpcHarnessTest<Harness, Provided>;
19
+ readonly runIf: (condition: unknown) => TrpcHarnessTest<Harness, Provided>;
20
+ readonly only: TrpcHarnessTest<Harness, Provided>;
24
21
  readonly each: <Item>(
25
22
  cases: ReadonlyArray<Item>,
26
23
  ) => <A, Eff extends Effect.Effect<unknown, unknown, Provided>>(
27
24
  name: string,
28
25
  body: (
29
26
  item: Item,
30
- trpc: EffectCallerFactory<Options, Caller>,
27
+ harness: Harness,
31
28
  context: TestContext,
32
29
  ) => Generator<Eff, A, never>,
33
30
  options?: number | TestOptions,
34
31
  ) => void;
35
- readonly fails: TrpcTest<Options, Caller, Provided>;
32
+ readonly fails: TrpcHarnessTest<Harness, Provided>;
36
33
  }
37
34
 
35
+ export type TrpcTest<Options, Caller, Provided> = TrpcHarnessTest<
36
+ EffectCallerFactory<Options, Caller>,
37
+ Provided
38
+ >;
39
+
40
+ export type TrpcTester<Options, Caller, Provided> = TrpcHarnessTester<
41
+ EffectCallerFactory<Options, Caller>,
42
+ Provided
43
+ >;
44
+
38
45
  export type TrpcIt<Options, Caller, Provided> = Vitest.Methods & {
39
46
  readonly effectTRPC: TrpcTester<Options, Caller, Provided>;
40
47
  };
41
48
 
42
- export interface TrpcTestRuntimeOptions<
49
+ export type TrpcHarnessIt<Harness, Provided> = Vitest.Methods & {
50
+ readonly effectTRPC: TrpcHarnessTester<Harness, Provided>;
51
+ };
52
+
53
+ export interface TrpcHarnessTestRuntimeOptions<
43
54
  Options,
44
55
  Caller extends object,
56
+ Harness,
45
57
  Provided,
46
58
  LayerError,
47
59
  > {
@@ -51,8 +63,28 @@ export interface TrpcTestRuntimeOptions<
51
63
  ) => Effect.Effect<A, unknown, Provided>;
52
64
  readonly createCaller: (options?: Options) => Caller;
53
65
  readonly layer: Layer.Layer<Provided, LayerError>;
66
+ readonly makeHarness: (
67
+ trpc: EffectCallerFactory<Options, Caller>,
68
+ context: TestContext,
69
+ ) => Effect.Effect<Harness, unknown, Provided>;
54
70
  }
55
71
 
72
+ export type TrpcTestRuntimeOptions<
73
+ Options,
74
+ Caller extends object,
75
+ Provided,
76
+ LayerError,
77
+ > = Omit<
78
+ TrpcHarnessTestRuntimeOptions<
79
+ Options,
80
+ Caller,
81
+ EffectCallerFactory<Options, Caller>,
82
+ Provided,
83
+ LayerError
84
+ >,
85
+ "makeHarness"
86
+ >;
87
+
56
88
  export interface MakeTrpcItOptions<
57
89
  CreateCaller extends (...arguments_: never[]) => object,
58
90
  // biome-ignore lint/suspicious/noExplicitAny: Layer output and error are recovered with Layer utility types
@@ -66,6 +98,21 @@ export interface MakeTrpcItOptions<
66
98
  readonly layer: TestLayer;
67
99
  }
68
100
 
101
+ export interface MakeTrpcHarnessItOptions<
102
+ CreateCaller extends (...arguments_: never[]) => object,
103
+ // biome-ignore lint/suspicious/noExplicitAny: Layer output and error are recovered with Layer utility types
104
+ TestLayer extends Layer.Layer<any, any, never>,
105
+ Harness,
106
+ > extends MakeTrpcItOptions<CreateCaller, TestLayer> {
107
+ readonly makeHarness: (
108
+ trpc: EffectCallerFactory<
109
+ CallerOptions<CreateCaller>,
110
+ CallerResult<CreateCaller>
111
+ >,
112
+ context: TestContext,
113
+ ) => Effect.Effect<Harness, unknown, Layer.Success<TestLayer>>;
114
+ }
115
+
69
116
  export type CallerOptions<CreateCaller> = CreateCaller extends (
70
117
  ...arguments_: infer Arguments
71
118
  ) => object
@@ -1,17 +1,54 @@
1
- import { it as effectIt } from "@effect/vitest";
1
+ import { it as effectIt, type Vitest } from "@effect/vitest";
2
2
  import { Effect, Exit, Layer, Scope } from "effect";
3
3
  import {
4
4
  type FixtureTestApi,
5
5
  fixtureName,
6
+ makeTrpcHarnessTester,
6
7
  makeTrpcTester,
7
8
  } from "../internal/vitest-trpc.js";
8
9
  import type {
9
10
  CallerOptions,
10
11
  CallerResult,
12
+ MakeTrpcHarnessItOptions,
11
13
  MakeTrpcItOptions,
14
+ TrpcHarnessIt,
12
15
  TrpcIt,
13
16
  } from "./types.js";
14
17
 
18
+ const makeFixtureIt = <Provided, LayerError>(
19
+ layer: Layer.Layer<Provided, LayerError>,
20
+ ): FixtureTestApi<Provided> =>
21
+ effectIt.extend(
22
+ fixtureName,
23
+ { scope: "worker" },
24
+ // biome-ignore lint/correctness/noEmptyPattern: Vitest fixtures require a destructured context parameter.
25
+ async ({}, { onCleanup }) => {
26
+ const scope = Effect.runSync(Scope.make());
27
+ onCleanup(() => Effect.runPromise(Scope.close(scope, Exit.void)));
28
+
29
+ try {
30
+ return await Effect.runPromise(Layer.buildWithScope(layer, scope));
31
+ } catch (error) {
32
+ await Effect.runPromise(Scope.close(scope, Exit.void));
33
+ throw error;
34
+ }
35
+ },
36
+ ) as unknown as FixtureTestApi<Provided>;
37
+
38
+ const withEffectTRPC = <Tester>(
39
+ tester: Tester,
40
+ ): Vitest.Methods & {
41
+ readonly effectTRPC: Tester;
42
+ } =>
43
+ new Proxy(effectIt, {
44
+ get(target, property, receiver) {
45
+ if (property === "effectTRPC") {
46
+ return tester;
47
+ }
48
+ return Reflect.get(target, property, receiver);
49
+ },
50
+ }) as Vitest.Methods & { readonly effectTRPC: Tester };
51
+
15
52
  export const makeTrpcIt = <
16
53
  CreateCaller extends (...arguments_: never[]) => object,
17
54
  // biome-ignore lint/suspicious/noExplicitAny: Layer output and error are recovered with Layer utility types
@@ -27,23 +64,8 @@ export const makeTrpcIt = <
27
64
  type Caller = CallerResult<CreateCaller>;
28
65
  type Provided = Layer.Success<TestLayer>;
29
66
 
30
- const fixtureIt = effectIt.extend(
31
- fixtureName,
32
- { scope: "worker" },
33
- // biome-ignore lint/correctness/noEmptyPattern: Vitest fixtures require a destructured context parameter.
34
- async ({}, { onCleanup }) => {
35
- const scope = Effect.runSync(Scope.make());
36
- onCleanup(() => Effect.runPromise(Scope.close(scope, Exit.void)));
37
-
38
- try {
39
- return await Effect.runPromise(
40
- Layer.buildWithScope(options.layer, scope),
41
- );
42
- } catch (error) {
43
- await Effect.runPromise(Scope.close(scope, Exit.void));
44
- throw error;
45
- }
46
- },
67
+ const fixtureIt = makeFixtureIt<Provided, Layer.Error<TestLayer>>(
68
+ options.layer,
47
69
  );
48
70
 
49
71
  const effectTRPC = makeTrpcTester(
@@ -53,12 +75,36 @@ export const makeTrpcIt = <
53
75
  >[1],
54
76
  );
55
77
 
56
- return new Proxy(effectIt, {
57
- get(target, property, receiver) {
58
- if (property === "effectTRPC") {
59
- return effectTRPC;
60
- }
61
- return Reflect.get(target, property, receiver);
62
- },
63
- }) as TrpcIt<Options, Caller, Provided>;
78
+ return withEffectTRPC(effectTRPC) as TrpcIt<Options, Caller, Provided>;
79
+ };
80
+
81
+ export const makeTrpcHarnessIt = <
82
+ CreateCaller extends (...arguments_: never[]) => object,
83
+ // biome-ignore lint/suspicious/noExplicitAny: Layer output and error are recovered with Layer utility types
84
+ TestLayer extends Layer.Layer<any, any, never>,
85
+ Harness,
86
+ >(
87
+ options: MakeTrpcHarnessItOptions<CreateCaller, TestLayer, Harness>,
88
+ ): TrpcHarnessIt<Harness, Layer.Success<TestLayer>> => {
89
+ type Options = CallerOptions<CreateCaller>;
90
+ type Caller = CallerResult<CreateCaller>;
91
+ type Provided = Layer.Success<TestLayer>;
92
+
93
+ const fixtureIt = makeFixtureIt<Provided, Layer.Error<TestLayer>>(
94
+ options.layer,
95
+ );
96
+ const effectTRPC = makeTrpcHarnessTester(
97
+ fixtureIt,
98
+ options as unknown as Parameters<
99
+ typeof makeTrpcHarnessTester<
100
+ Options,
101
+ Caller,
102
+ Harness,
103
+ Provided,
104
+ Layer.Error<TestLayer>
105
+ >
106
+ >[1],
107
+ );
108
+
109
+ return withEffectTRPC(effectTRPC);
64
110
  };
package/src/testing.ts CHANGED
@@ -5,9 +5,15 @@ export {
5
5
  makeEffectCallerFactory,
6
6
  } from "./testing/caller.js";
7
7
  export type {
8
+ CallerOptions,
9
+ CallerResult,
10
+ MakeTrpcHarnessItOptions,
8
11
  MakeTrpcItOptions,
12
+ TrpcHarnessIt,
13
+ TrpcHarnessTest,
14
+ TrpcHarnessTester,
9
15
  TrpcIt,
10
16
  TrpcTest,
11
17
  TrpcTester,
12
18
  } from "./testing/types.js";
13
- export { makeTrpcIt } from "./testing/vitest.js";
19
+ export { makeTrpcHarnessIt, makeTrpcIt } from "./testing/vitest.js";