@playfast/reform-proof 1.3.0 → 1.4.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/dist/engine.d.ts CHANGED
@@ -3,10 +3,10 @@ import type { ProofResult } from './proofCase.js';
3
3
  import type { DriveResult } from './index.js';
4
4
  import type { Proof } from './index.js';
5
5
  export { makeSink } from './engineSink.js';
6
- export type { Sink } from './engineSink.js';
6
+ export type { DispatchedAction, Sink } from './engineSink.js';
7
7
  export { proofLayer } from './engineTree.js';
8
8
  export { makeFacade, makeProofFacade, makeRuntimeHandleFacade } from './engineMounted.js';
9
- export type { MountedFacade, MountedSlotFacade, MountedSlotFacadesOf, } from './engineSink.js';
9
+ export type { MountedFacade, MountedSlotFacade, MountedSlotFacadesOf } from './engineSink.js';
10
10
  export { makeRuntimeTreeFacade } from './engineTreeFacade.js';
11
11
  export type { RuntimeTreeFacade } from './engineTreeTypes.js';
12
12
  export declare const executeProofEffect: (proof: Proof) => Effect.Effect<ProofResult, never, never>;
@@ -1 +1 @@
1
- {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAA8B,MAAM,QAAQ,CAAA;AAqBlE,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,SAAS,CAAA;AAErD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,YAAY,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AACtF,YAAY,EACV,aAAa,EACb,iBAAiB,EACjB,oBAAoB,GACrB,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AAkJ1D,eAAO,MAAM,kBAAkB,GAAI,OAAO,KAAK,KAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAgBtF,CAAA;AAEH,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,KAAG,OAAO,CAAC,WAAW,CACjB,CAAA;AA8D9C,eAAO,MAAM,gBAAgB,GAAI,OAAO,KAAK,KAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAgBpF,CAAA;AAEH,eAAO,MAAM,UAAU,GAAI,OAAO,KAAK,KAAG,OAAO,CAAC,WAAW,CACjB,CAAA"}
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,MAAM,EAA8B,MAAM,QAAQ,CAAA;AAsBhF,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,aAAa,CAAA;AAEzD,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,SAAS,CAAA;AAErD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAA;AAEpC,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AACvC,YAAY,EAAE,gBAAgB,EAAE,IAAI,EAAE,MAAM,cAAc,CAAA;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AACtF,YAAY,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA;AA0J1D,eAAO,MAAM,kBAAkB,GAAI,OAAO,KAAK,KAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAgBtF,CAAA;AAEH,eAAO,MAAM,YAAY,GAAI,OAAO,KAAK,KAAG,OAAO,CAAC,WAAW,CACjB,CAAA;AA8D9C,eAAO,MAAM,gBAAgB,GAAI,OAAO,KAAK,KAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAgBpF,CAAA;AAEH,eAAO,MAAM,UAAU,GAAI,OAAO,KAAK,KAAG,OAAO,CAAC,WAAW,CACjB,CAAA"}
package/dist/engine.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Cause, Effect, Option, Record as Rec, Ref } from 'effect';
1
+ import { Array as Arr, Cause, Effect, Option, Record as Rec, Ref } from 'effect';
2
2
  import { yieldWrapGet } from 'effect/Utils';
3
3
  import { makeAppRuntime, sceneInstrumentation, } from '@playfast/reform';
4
4
  import {} from '@playfast/reform/internal';
@@ -20,7 +20,11 @@ const withProofRuntimeTree = (scene, sink, dispatched, use) => Effect.acquireUse
20
20
  }), (tree) => use(runtime, tree), (tree) => Effect.sync(tree.dispose)), (runtime) => Effect.sync(runtime.dispose));
21
21
  const missingCoverage = (proof, dispatched) => Option.match(proof.requirement.manifest.events, {
22
22
  onNone: () => [],
23
- onSome: (declared) => declared.map(String).filter((event) => !dispatched.has(event)),
23
+ onSome: (declared) => {
24
+ const owner = compositionIdentity(proof.requirement.manifest.composition);
25
+ const covered = new Set(Arr.filterMap(Arr.fromIterable(dispatched), (action) => Object.is(action.identity, owner) ? Option.some(action.event) : Option.none()));
26
+ return declared.map(String).filter((event) => !covered.has(event));
27
+ },
24
28
  });
25
29
  const compositionIdentity = (composition) => composition.capture((exact) => exact.identity);
26
30
  const verifyProofPlacement = (proof, scene, runtime) => {
@@ -1 +1 @@
1
- {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
@@ -2,16 +2,16 @@ import { Effect, ManagedRuntime } from 'effect';
2
2
  import { type CapturedScene, type RuntimeHandle, type UiContract } from '@playfast/reform';
3
3
  import { CaptureSink } from '@playfast/reform/internal';
4
4
  import type { Facade } from './facade.js';
5
- import { type MountedFacade, type RuntimeRootComposition, type Sink } from './engineSink.js';
6
- export declare function makeFacade<C extends UiContract, S extends ReadonlyArray<unknown>, Services, P, N extends string, Identity>(runtime: ManagedRuntime.ManagedRuntime<Services | CaptureSink, never>, scene: CapturedScene<C, S, Services, P, N, Identity>, sink: Sink, dispatched: Set<string>): {
5
+ import { type DispatchedAction, type MountedFacade, type RuntimeRootComposition, type Sink } from './engineSink.js';
6
+ export declare function makeFacade<C extends UiContract, S extends ReadonlyArray<unknown>, Services, P, N extends string, Identity>(runtime: ManagedRuntime.ManagedRuntime<Services | CaptureSink, never>, scene: CapturedScene<C, S, Services, P, N, Identity>, sink: Sink, dispatched: Set<DispatchedAction>): {
7
7
  readonly facade: Facade<C, never>;
8
8
  readonly settle: Effect.Effect<void, never, never>;
9
9
  };
10
- export declare const makeProofFacade: <C extends UiContract, S extends ReadonlyArray<unknown>, Services, P, N extends string, Identity>(runtime: ManagedRuntime.ManagedRuntime<Services | CaptureSink, never>, scene: CapturedScene<C, S, Services, P, N, Identity>, sink: Sink, dispatched: Set<string>) => {
10
+ export declare const makeProofFacade: <C extends UiContract, S extends ReadonlyArray<unknown>, Services, P, N extends string, Identity>(runtime: ManagedRuntime.ManagedRuntime<Services | CaptureSink, never>, scene: CapturedScene<C, S, Services, P, N, Identity>, sink: Sink, dispatched: Set<DispatchedAction>) => {
11
11
  readonly facade: Facade<C, never>;
12
12
  readonly settle: Effect.Effect<void, never, never>;
13
13
  };
14
- export declare const makeRuntimeHandleFacade: <Services, RootIdentifier extends NoInfer<Services>, P, C extends UiContract, S extends ReadonlyArray<unknown>, N extends string, Identity>(runtime: RuntimeHandle<Services>, root: RuntimeRootComposition<RootIdentifier, P, C, S, N, Identity>, sink: Sink, dispatched: Set<string>) => {
14
+ export declare const makeRuntimeHandleFacade: <Services, RootIdentifier extends NoInfer<Services>, P, C extends UiContract, S extends ReadonlyArray<unknown>, N extends string, Identity>(runtime: RuntimeHandle<Services>, root: RuntimeRootComposition<RootIdentifier, P, C, S, N, Identity>, sink: Sink, dispatched: Set<DispatchedAction>) => {
15
15
  readonly facade: MountedFacade<C>;
16
16
  readonly settle: Effect.Effect<void, never, never>;
17
17
  };
@@ -1 +1 @@
1
- {"version":3,"file":"engineMounted.d.ts","sourceRoot":"","sources":["../src/engineMounted.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,MAAM,EAAE,cAAc,EAAqB,MAAM,QAAQ,CAAA;AAE/F,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,aAAa,EAElB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAuB,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAC5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAIL,KAAK,aAAa,EAKlB,KAAK,sBAAsB,EAE3B,KAAK,IAAI,EAEV,MAAM,cAAc,CAAA;AAgBrB,wBAAgB,UAAU,CACxB,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAChC,QAAQ,EACR,CAAC,EACD,CAAC,SAAS,MAAM,EAChB,QAAQ,EAER,OAAO,EAAE,cAAc,CAAC,cAAc,CAAC,QAAQ,GAAG,WAAW,EAAE,KAAK,CAAC,EACrE,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EACpD,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB;IACD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CACnD,CASA;AA2KD,eAAO,MAAM,eAAe,GAC1B,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAChC,QAAQ,EACR,CAAC,EACD,CAAC,SAAS,MAAM,EAChB,QAAQ,EAER,SAAS,cAAc,CAAC,cAAc,CAAC,QAAQ,GAAG,WAAW,EAAE,KAAK,CAAC,EACrE,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EACpD,MAAM,IAAI,EACV,YAAY,GAAG,CAAC,MAAM,CAAC,KACtB;IACD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CAGnD,CAAA;AAED,eAAO,MAAM,uBAAuB,GAClC,QAAQ,EACR,cAAc,SAAS,OAAO,CAAC,QAAQ,CAAC,EACxC,CAAC,EACD,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAChC,CAAC,SAAS,MAAM,EAChB,QAAQ,EAER,SAAS,aAAa,CAAC,QAAQ,CAAC,EAChC,MAAM,sBAAsB,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAClE,MAAM,IAAI,EACV,YAAY,GAAG,CAAC,MAAM,CAAC,KACtB;IACD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CACiB,CAAA"}
1
+ {"version":3,"file":"engineMounted.d.ts","sourceRoot":"","sources":["../src/engineMounted.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,MAAM,EAAE,cAAc,EAAqB,MAAM,QAAQ,CAAA;AAE/F,OAAO,EACL,KAAK,aAAa,EAElB,KAAK,aAAa,EAElB,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAuB,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAC5E,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAA;AACtC,OAAO,EAGL,KAAK,gBAAgB,EAGrB,KAAK,aAAa,EAKlB,KAAK,sBAAsB,EAE3B,KAAK,IAAI,EAEV,MAAM,cAAc,CAAA;AAYrB,wBAAgB,UAAU,CACxB,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAChC,QAAQ,EACR,CAAC,EACD,CAAC,SAAS,MAAM,EAChB,QAAQ,EAER,OAAO,EAAE,cAAc,CAAC,cAAc,CAAC,QAAQ,GAAG,WAAW,EAAE,KAAK,CAAC,EACrE,KAAK,EAAE,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EACpD,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,GAAG,CAAC,gBAAgB,CAAC,GAChC;IACD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CACnD,CASA;AA2KD,eAAO,MAAM,eAAe,GAC1B,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAChC,QAAQ,EACR,CAAC,EACD,CAAC,SAAS,MAAM,EAChB,QAAQ,EAER,SAAS,cAAc,CAAC,cAAc,CAAC,QAAQ,GAAG,WAAW,EAAE,KAAK,CAAC,EACrE,OAAO,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EACpD,MAAM,IAAI,EACV,YAAY,GAAG,CAAC,gBAAgB,CAAC,KAChC;IACD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CAGnD,CAAA;AAED,eAAO,MAAM,uBAAuB,GAClC,QAAQ,EACR,cAAc,SAAS,OAAO,CAAC,QAAQ,CAAC,EACxC,CAAC,EACD,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAChC,CAAC,SAAS,MAAM,EAChB,QAAQ,EAER,SAAS,aAAa,CAAC,QAAQ,CAAC,EAChC,MAAM,sBAAsB,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAClE,MAAM,IAAI,EACV,YAAY,GAAG,CAAC,gBAAgB,CAAC,KAChC;IACD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAAC,CAAA;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CACiB,CAAA"}
@@ -2,9 +2,9 @@ import { Array as Arr, Effect, ManagedRuntime, Option, TestClock } from 'effect'
2
2
  import { NoTestClock, UnknownAction, UnknownSlot } from './errors.js';
3
3
  import {} from '@playfast/reform';
4
4
  import { CaptureSink } from '@playfast/reform/internal';
5
- import { directSettle, expectMatchingProps, keyed, uiNameOf, } from './engineSink.js';
5
+ import { compositionIdentityOf, directSettle, expectMatchingProps, keyed, uiNameOf, } from './engineSink.js';
6
6
  import { makeCaptureLookup, nodeCaptureFor, renderRuntimeFromContext, rootRef, slotCapturesFor, slotsOf, } from './engineTree.js';
7
- import { collectRuntimeBindings, renderTreeRuntime, settleTreeRuntime, } from './engineRender.js';
7
+ import { collectRuntimeBindings, renderTreeRuntime, settleTreeRuntime } from './engineRender.js';
8
8
  export function makeFacade(runtime, scene, sink, dispatched) {
9
9
  const context = runtime.runSync(Effect.context());
10
10
  return makeMountedFacade(renderRuntimeFromContext(context, sink.instrumentation), scene.composition, sink, dispatched, (settlement) => Effect.promise(() => runtime.runPromise(settlement)));
@@ -37,7 +37,7 @@ function makeMountedFacade(runtime, root, sink, dispatched, settleBoundary) {
37
37
  props: propsFor(ref),
38
38
  expectProps: (partial) => propsFor(ref).pipe(Effect.flatMap((props) => expectMatchingProps({ actual: props, expected: partial }))),
39
39
  actions: keyed((event) => (payload) => rerender.pipe(Effect.flatMap(() => triggerOf(ref, event)), Effect.flatMap((trigger) => Effect.sync(() => {
40
- dispatched.add(event);
40
+ dispatched.add({ identity: compositionIdentityOf(comp), event });
41
41
  trigger(payload);
42
42
  })), Effect.flatMap(() => settle), Effect.flatMap(() => propsFor(ref)))),
43
43
  slots: keyed((slotName) => slotFacade(ref, comp, slotName)),
@@ -1 +1 @@
1
- {"version":3,"file":"engineMounted.js","sourceRoot":"","sources":["../src/engineMounted.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engineMounted.js","sourceRoot":"","sources":["../src/engineMounted.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,GAAG,EAAiB,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAC/F,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAClE,OAAO,EAMN,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAuB,WAAW,EAAE,MAAM,2BAA2B,CAAA;AAE5E,OAAO,EACL,qBAAqB,EACrB,YAAY,EAEZ,mBAAmB,EACnB,KAAK,EASL,QAAQ,GACT,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,iBAAiB,EACjB,cAAc,EAEd,wBAAwB,EACxB,OAAO,EACP,eAAe,EACf,OAAO,GACR,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAE7F,MAAM,UAAU,UAAU,CAQxB,OAAqE,EACrE,KAAoD,EACpD,IAAU,EACV,UAAiC;IAKjC,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAA0B,CAAC,CAAA;IACzE,OAAO,iBAAiB,CACtB,wBAAwB,CAAC,OAAO,EAAE,IAAI,CAAC,eAAe,CAAC,EACvD,KAAK,CAAC,WAAW,EACjB,IAAI,EACJ,UAAU,EACV,CAAC,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CACrE,CAAA;AACH,CAAC;AAyBD,SAAS,iBAAiB,CACxB,OAAsB,EACtB,IAAoB,EACpB,IAAU,EACV,UAAiC,EACjC,cAA8B;IAE9B,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACtD,MAAM,MAAM,GAAG,iBAAiB,EAAE,CAAA;IAClC,MAAM,MAAM,GAAG,cAAc,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAA;IACvF,MAAM,QAAQ,GAAG,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IAEzE,+EAA+E;IAC/E,mFAAmF;IACnF,gFAAgF;IAChF,MAAM,OAAO,GAAG,CAAC,QAAgC,EAAqC,EAAE,CACtF,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;QACpD,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,WAAW,EAAE,CAAC,OAAO,CAAC;QAC1D,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;KAC7E,CAAC,CAAA;IAEJ,MAAM,SAAS,GAAG,CAAC,GAAY,EAAE,KAAa,EAAiD,EAAE,CAC/F,MAAM,CAAC,KAAK,CACV,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,CACtD,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAC3C,EACD;QACE,MAAM,EAAE,GAAG,EAAE,CACX,MAAM,CAAC,UAAU,CACf,IAAI,aAAa,CAAC;YAChB,WAAW,EAAE,GAAG,CAAC,IAAI;YACrB,MAAM,EAAE,KAAK;YACb,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM;SAChF,CAAC,CAAC,OAAO,CACX;QACH,MAAM,EAAE,MAAM,CAAC,OAAO;KACvB,CACF,CAAA;IAEH,MAAM,QAAQ,GAAG,CAAC,GAAY,EAAwC,EAAE,CACtE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CACxB,MAAM,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE;QACxC,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS;QACvB,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK;KACnC,CAAC,CACH,CAAA;IAEH,MAAM,UAAU,GAAG,CAAC,GAAY,EAAE,IAAoB,EAAwB,EAAE,CAAC,CAAC;QAChF,KAAK,EAAE,QAAQ,CAAC,GAAG,CAAC;QACpB,WAAW,EAAE,CAAC,OAAO,EAAE,EAAE,CACvB,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAChB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,mBAAmB,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CACrF;QACH,OAAO,EAAE,KAAK,CACZ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAgB,EAAE,EAAE,CAC9B,QAAQ,CAAC,IAAI,CACX,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAC3C,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CACzB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE;YACf,UAAU,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,qBAAqB,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;YAChE,OAAO,CAAC,OAAO,CAAC,CAAA;QAClB,CAAC,CAAC,CACH,EACD,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,EAC5B,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CACpC,CACJ;QACD,KAAK,EAAE,KAAK,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC3D,KAAK,EAAE,MAAM;QACb,OAAO;KACR,CAAC,CAAA;IAEF,MAAM,UAAU,GAAG,CACjB,SAAkB,EAClB,MAAsB,EACtB,QAAgB,EACU,EAAE;QAC5B,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,CAAA;QAC3C,MAAM,KAAK,GAAG,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAA;QAClD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,MAAM,CAAC,OAAO,CACnB,MAAM,CAAC,UAAU,CAAC,IAAI,WAAW,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,CACzF,CAAA;QACH,CAAC;QACD,MAAM,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;QACjC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAW,EAAE,CAC5C,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI;YAC1D,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;YAC9B,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;gBAChB,IAAI,EAAE,QAAQ;gBACd,KAAK;gBACL,GAAG,EAAE,MAAM,CAAC,IAAI,EAAE;gBAClB,aAAa,EAAE,CAAC;aACjB,CAAC;SACH,CAAA;QACH,MAAM,OAAO,GAAG,CAAC,KAAa,EAAqD,EAAE,CACnF,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAA;QAC3D,MAAM,KAAK,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QAC9C,OAAO;YACL,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;YACjB,EAAE,EAAE,OAAO;YACX,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CAC7B,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAC1F;YACD,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE,CACb,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE,CAC5B,MAAM,CAAC,KAAK,CACV,GAAG,CAAC,SAAS,CACX,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,EAC5C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,KAAK,GAAG,CACrC,EACD;gBACE,MAAM,EAAE,GAAG,EAAE,CACX,MAAM,CAAC,UAAU,CACf,IAAI,WAAW,CAAC;oBACd,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC;oBACxB,IAAI,EAAE,GAAG,QAAQ,QAAQ,GAAG,GAAG;iBAChC,CAAC,CAAC,OAAO,CACX;gBACH,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;aAChE,CACF,CACF;YACH,KAAK,EAAE,CAAC,SAAS,EAAE,EAAE,CACnB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CACxB,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7D,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CACrE,CACF;YACH,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC;YACtF,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAA;IACH,CAAC,CAAA;IAED,OAAO;QACL,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;QACvC,MAAM;KACP,CAAA;AACH,CAAC;AAED,MAAM,CAAC,MAAM,eAAe,GAAG,CAQ7B,OAAqE,EACrE,KAAoD,EACpD,IAAU,EACV,UAAiC,EAIjC,EAAE;IACF,OAAO,UAAU,CAAC,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,CAAC,CAAA;AACrD,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG,CASrC,OAAgC,EAChC,IAAkE,EAClE,IAAU,EACV,UAAiC,EAIjC,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,CAAC,CAAA"}
@@ -44,6 +44,11 @@ export declare const settleDrain: Effect.Effect<void>;
44
44
  export declare const settleStep: Effect.Effect<void>;
45
45
  export declare const keyed: <V>(get: (key: string) => V) => Record<string, V>;
46
46
  export declare const messageOf: (error: unknown) => string;
47
+ export interface DispatchedAction {
48
+ readonly identity: symbol;
49
+ readonly event: string;
50
+ }
51
+ export declare const compositionIdentityOf: (composition: AnyComposition) => symbol;
47
52
  export declare const uiNameOf: (comp: AnyComposition) => string;
48
53
  export declare const eventsOf: (structure: Structure<UiContract>) => Record<string, Trigger<unknown>>;
49
54
  export interface ExpectedProps {
@@ -1 +1 @@
1
- {"version":3,"file":"engineSink.d.ts","sourceRoot":"","sources":["../src/engineSink.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engineSink.d.ts","sourceRoot":"","sources":["../src/engineSink.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,KAAK,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,EAAsB,MAAM,QAAQ,CAAA;AAEvF,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,kBAAkB,EAEvB,KAAK,aAAa,EAClB,KAAK,SAAS,EACd,KAAK,OAAO,EACZ,KAAK,UAAU,EAChB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,eAAe,EAErB,MAAM,2BAA2B,CAAA;AAElC,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAEjE,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,EAAE,UAAU,GAAG,iBAAiB,GAAG,YAAY,CAAC,CAAA;AAE9F,MAAM,MAAM,WAAW,GAAG,IAAI,CAC5B,aAAa,EACb,UAAU,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,YAAY,CAClE,CAAA;AAED,MAAM,MAAM,sBAAsB,CAChC,UAAU,EACV,CAAC,EACD,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAChC,CAAC,SAAS,MAAM,EAChB,QAAQ,IACN,gBAAgB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,GAAG;IAC3C,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;CAChE,CAAA;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IACpD,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAC7E,QAAQ,CAAC,OAAO,EAAE,QAAQ,CACxB,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAC3E,CAAA;IACD,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAAC,CAAA;IAClE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IACjD,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CAC1F;AAED,MAAM,WAAW,wBAAyB,SAAQ,oBAAoB;IACpE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IACjE,QAAQ,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IACjF,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAC9E,QAAQ,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC,MAAM,CAAC,oBAAoB,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IAClF,QAAQ,CAAC,KAAK,EAAE,CACd,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,KACnC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,oBAAoB,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;IACrE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CACpD;AAED,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QACpD,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,KAAK,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QAC3E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;QACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;QACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;QACjD,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,aAAa,KAAK,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;KAC1F,CAAA;IACD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;CACnD;AAED,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAA;AAC1D,MAAM,MAAM,cAAc,GAAG,CAAC,UAAU,EAAE,UAAU,KAAK,UAAU,CAAA;AAEnE,eAAO,MAAM,YAAY,EAAE,cAA2C,CAAA;AAItE,eAAO,MAAM,YAAY,KAAK,CAAA;AAC9B,eAAO,MAAM,WAAW,YAAY,CAAA;AACpC,eAAO,MAAM,kBAAkB,MAAM,CAAA;AAErC,eAAO,MAAM,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAwD,CAAA;AAQpG,eAAO,MAAM,UAAU,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAE1C,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,CAAC,EAAE,KAAK,CAAC,GAAG,EAAE,MAAM,KAAK,CAAC,KAAG,MAAM,CAAC,MAAM,EAAE,CAAC,CAGlE,CAAA;AAED,eAAO,MAAM,SAAS,GAAI,OAAO,OAAO,KAAG,MACa,CAAA;AAMxD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAA;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CACvB;AAED,eAAO,MAAM,qBAAqB,GAAI,aAAa,cAAc,KAAG,MACZ,CAAA;AAExD,eAAO,MAAM,QAAQ,GAAI,MAAM,cAAc,KAAG,MAAwC,CAAA;AAGxF,eAAO,MAAM,QAAQ,GAAI,WAAW,SAAS,CAAC,UAAU,CAAC,KAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAEzF,CAAA;AAEF,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC3B;AAED,eAAO,MAAM,mBAAmB,GAAI,uBAGjC,aAAa,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAI/C,CAAA;AAEJ,eAAO,MAAM,uBAAuB,GAAI,aAAa,cAAc,KAAG,MACM,CAAA;AAE5E,eAAO,MAAM,wBAAwB,GACnC,SAAS,aAAa,EACtB,aAAa,cAAc,EAC3B,OAAO,OAAO,KACb,SAAS,CAAC,UAAU,CA+BpB,CAAA;AAEH,MAAM,WAAW,IAAI;IACnB,QAAQ,CAAC,GAAG,EAAE,cAAc,CAAA;IAC5B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;IAChD,QAAQ,CAAC,eAAe,EAAE,eAAe,CAAA;IACzC,KAAK,IAAI,IAAI,CAAA;CACd;AAED,eAAO,MAAM,QAAQ,GAAI,kBAAiB,eAAqC,KAAG,IAiBjF,CAAA;AAED,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,UAAU,IAAI,aAAa,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;AAEhF,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,UAAU,IAAI,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;AAElE,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,UAAU,IAAI,UAAU,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA"}
@@ -22,6 +22,7 @@ export const keyed = (get) => {
22
22
  return new Proxy(target, { get: (_target, key) => get(String(key)) });
23
23
  };
24
24
  export const messageOf = (error) => error instanceof Error ? error.message : String(error);
25
+ export const compositionIdentityOf = (composition) => composition.capture((exact) => exact.identity);
25
26
  export const uiNameOf = (comp) => comp.manifest.ui.manifest.name;
26
27
  // UiContract erases event values to never, so this boundary needs no assertion.
27
28
  export const eventsOf = (structure) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"engineSink.js","sourceRoot":"","sources":["../src/engineSink.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engineSink.js","sourceRoot":"","sources":["../src/engineSink.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { type RuntimeHandle, type UiContract } from '@playfast/reform';
2
- import { type RuntimeRootComposition, type Sink } from './engineSink.js';
2
+ import { type DispatchedAction, type RuntimeRootComposition, type Sink } from './engineSink.js';
3
3
  import type { RuntimeTreeFacade } from './engineTreeTypes.js';
4
- export declare function makeRuntimeTreeFacade<Services, RootIdentifier extends NoInfer<Services>, P, C extends UiContract, S extends ReadonlyArray<unknown>, N extends string, Identity>(runtime: RuntimeHandle<Services>, root: RuntimeRootComposition<RootIdentifier, P, C, S, N, Identity>, rootProps: P, sink: Sink, dispatched: Set<string>): RuntimeTreeFacade<C>;
4
+ export declare function makeRuntimeTreeFacade<Services, RootIdentifier extends NoInfer<Services>, P, C extends UiContract, S extends ReadonlyArray<unknown>, N extends string, Identity>(runtime: RuntimeHandle<Services>, root: RuntimeRootComposition<RootIdentifier, P, C, S, N, Identity>, rootProps: P, sink: Sink, dispatched: Set<DispatchedAction>): RuntimeTreeFacade<C>;
5
5
  //# sourceMappingURL=engineTreeFacade.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"engineTreeFacade.d.ts","sourceRoot":"","sources":["../src/engineTreeFacade.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEtE,OAAO,EAKL,KAAK,sBAAsB,EAC3B,KAAK,IAAI,EAEV,MAAM,cAAc,CAAA;AAErB,OAAO,KAAK,EAAE,iBAAiB,EAAsC,MAAM,mBAAmB,CAAA;AAE9F,wBAAgB,qBAAqB,CACnC,QAAQ,EACR,cAAc,SAAS,OAAO,CAAC,QAAQ,CAAC,EACxC,CAAC,EACD,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAChC,CAAC,SAAS,MAAM,EAChB,QAAQ,EAER,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,EAChC,IAAI,EAAE,sBAAsB,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAClE,SAAS,EAAE,CAAC,EACZ,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,GACtB,iBAAiB,CAAC,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"engineTreeFacade.d.ts","sourceRoot":"","sources":["../src/engineTreeFacade.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAEtE,OAAO,EAEL,KAAK,gBAAgB,EAKrB,KAAK,sBAAsB,EAC3B,KAAK,IAAI,EAEV,MAAM,cAAc,CAAA;AAErB,OAAO,KAAK,EAAE,iBAAiB,EAAsC,MAAM,mBAAmB,CAAA;AAE9F,wBAAgB,qBAAqB,CACnC,QAAQ,EACR,cAAc,SAAS,OAAO,CAAC,QAAQ,CAAC,EACxC,CAAC,EACD,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAChC,CAAC,SAAS,MAAM,EAChB,QAAQ,EAER,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,EAChC,IAAI,EAAE,sBAAsB,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC,EAClE,SAAS,EAAE,CAAC,EACZ,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,GAAG,CAAC,gBAAgB,CAAC,GAChC,iBAAiB,CAAC,CAAC,CAAC,CAAA"}
@@ -1,8 +1,8 @@
1
- import { Array as Arr, Effect, Option, TestClock } from 'effect';
1
+ import { Array as Arr, Effect, MutableRef, Option, TestClock } from 'effect';
2
2
  import { AssertionFailed, NoTestClock, UnknownAction, UnknownSlot } from './errors.js';
3
3
  import { matchProps } from './assert.js';
4
4
  import {} from '@playfast/reform';
5
- import { keyed, uiNameOf, } from './engineSink.js';
5
+ import { compositionIdentityOf, keyed, uiNameOf, } from './engineSink.js';
6
6
  import { makeTreeDriver } from './engineTreeDriver.js';
7
7
  export function makeRuntimeTreeFacade(runtime, root, rootProps, sink, dispatched) {
8
8
  const driver = makeTreeDriver(runtime, root, rootProps, sink);
@@ -14,7 +14,9 @@ export function makeRuntimeTreeFacade(runtime, root, rootProps, sink, dispatched
14
14
  onSome: (clock) => clock.adjust(duration).pipe(Effect.flatMap(() => driver.settle)),
15
15
  });
16
16
  // `peek` is the non-dying half of `resolve`: None once the node has left the
17
- // tree, so an action that removed its own node can still report a result.
17
+ // tree, so an action that removed its own node can still report a result. It is
18
+ // given the node as it stood before the dispatch, because "is this still the node
19
+ // I acted on" cannot be answered from a bare index.
18
20
  const nodeFacade = (resolve, peek) => ({
19
21
  props: Effect.sync(() => resolve().props),
20
22
  expectProps: (partial) => Effect.sync(() => {
@@ -36,12 +38,12 @@ export function makeRuntimeTreeFacade(runtime, root, rootProps, sink, dispatched
36
38
  rendered: 1,
37
39
  }).message);
38
40
  }
39
- dispatched.add(event);
41
+ dispatched.add({ identity: compositionIdentityOf(node.comp), event });
40
42
  trigger(payload);
41
43
  yield* driver.settle;
42
44
  // A self-removing action leaves nothing to re-read; report what the
43
45
  // node last rendered instead of dying on the vanished child.
44
- return Option.match(peek(), {
46
+ return Option.match(peek(node), {
45
47
  onNone: () => node.props,
46
48
  onSome: (settled) => settled.props,
47
49
  });
@@ -59,9 +61,26 @@ export function makeRuntimeTreeFacade(runtime, root, rootProps, sink, dispatched
59
61
  }
60
62
  return resolved;
61
63
  };
62
- const peekAt = (index) => Option.fromNullable(children()[index]);
63
64
  const peekByKey = (key) => Arr.findFirst(children(), (candidate) => Option.contains(candidate.key, key));
64
- const childAt = (index) => nodeFacade(() => children()[index] ?? missingChild(index), () => peekAt(index));
65
+ const peekAt = ({ index, before, siblingsBefore }) => {
66
+ const now = children();
67
+ const survived = Arr.findFirst(now, (candidate) => Option.match(before.key, {
68
+ onNone: () => candidate.path === before.path,
69
+ onSome: (key) => Option.contains(candidate.key, key),
70
+ }));
71
+ if (Option.isSome(survived)) {
72
+ return survived;
73
+ }
74
+ return now.length === siblingsBefore ? Option.fromNullable(now[index]) : Option.none();
75
+ };
76
+ const childAt = (index) => {
77
+ const siblings = MutableRef.make(0);
78
+ return nodeFacade(() => {
79
+ const now = children();
80
+ MutableRef.set(siblings, now.length);
81
+ return now[index] ?? missingChild(index);
82
+ }, (before) => peekAt({ index, before, siblingsBefore: MutableRef.get(siblings) }));
83
+ };
65
84
  const childByKey = (key) => nodeFacade(() => Option.getOrElse(peekByKey(key), () => missingKey(key)), () => peekByKey(key));
66
85
  const missingChild = (index) => {
67
86
  const parent = resolveParent();
@@ -1 +1 @@
1
- {"version":3,"file":"engineTreeFacade.js","sourceRoot":"","sources":["../src/engineTreeFacade.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"engineTreeFacade.js","sourceRoot":"","sources":["../src/engineTreeFacade.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AAuEA,eAAO,MAAM,iBAAiB,GAAI,kBAAkB,OAAO,KAAG,MACX,CAAA"}
1
+ {"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"AA0GA,eAAO,MAAM,iBAAiB,GAAI,kBAAkB,OAAO,KAAG,MACoB,CAAA"}
@@ -1,4 +1,6 @@
1
+ import * as Arr from 'effect/Array';
1
2
  import * as Option from 'effect/Option';
3
+ import * as Order from 'effect/Order';
2
4
  const readPropertyOption = Option.liftThrowable((target, key) => Reflect.get(target, key));
3
5
  const readProperty = (target, key) => Option.getOrElse(readPropertyOption(target, key), () => '[Property read threw]');
4
6
  const propertyKeyFingerprint = (key) => typeof key === 'symbol'
@@ -6,7 +8,7 @@ const propertyKeyFingerprint = (key) => typeof key === 'symbol'
6
8
  : typeof key === 'number'
7
9
  ? `number-key:${String(key)}`
8
10
  : `key:${key.length}:${key}`;
9
- const valueFingerprint = (candidate, seen) => {
11
+ const valueFingerprint = (candidate, walk) => {
10
12
  if (typeof candidate === 'bigint') {
11
13
  return `bigint:${String(candidate)}`;
12
14
  }
@@ -31,25 +33,46 @@ const valueFingerprint = (candidate, seen) => {
31
33
  if (candidate === null) {
32
34
  return 'null';
33
35
  }
34
- if (seen.has(candidate)) {
36
+ if (walk.seen.has(candidate)) {
35
37
  return '[Circular]';
36
38
  }
37
- seen.add(candidate);
39
+ const remembered = walk.memo.get(candidate);
40
+ if (remembered !== undefined) {
41
+ return remembered;
42
+ }
43
+ // `seen` marks the path currently being walked, not everything ever visited: it
44
+ // is unwound below. Without that, a value that merely repeats a reference — the
45
+ // same config object under two keys, a DAG rather than a cycle — reads as
46
+ // `[Circular]` on its second appearance, so two equal values fingerprint
47
+ // differently and `toEqual` fails on them.
48
+ walk.seen.add(candidate);
49
+ const printed = structuralFingerprint(candidate, walk);
50
+ walk.seen.delete(candidate);
51
+ // Only a print that did not depend on where the walk had been is reusable: one
52
+ // containing `[Circular]` describes this path, not this value.
53
+ if (!printed.includes('[Circular]')) {
54
+ walk.memo.set(candidate, printed);
55
+ }
56
+ return printed;
57
+ };
58
+ const structuralFingerprint = (candidate, walk) => {
38
59
  if (Array.isArray(candidate)) {
39
- return `[${candidate.map((arrayEntry) => valueFingerprint(arrayEntry, seen)).join(',')}]`;
60
+ return `[${candidate.map((arrayEntry) => valueFingerprint(arrayEntry, walk)).join(',')}]`;
40
61
  }
41
62
  if (candidate instanceof Date) {
42
63
  return `date:${String(candidate.getTime())}`;
43
64
  }
44
65
  if (candidate instanceof Map) {
45
- return `map:[${Array.from(candidate, ([mapKey, mapEntry]) => `${valueFingerprint(mapKey, seen)}=>${valueFingerprint(mapEntry, seen)}`).join(',')}]`;
66
+ return `map:[${Array.from(candidate, ([mapKey, mapEntry]) => `${valueFingerprint(mapKey, walk)}=>${valueFingerprint(mapEntry, walk)}`).join(',')}]`;
46
67
  }
47
68
  if (candidate instanceof Set) {
48
- return `set:[${Array.from(candidate, (setEntry) => valueFingerprint(setEntry, seen)).join(',')}]`;
69
+ return `set:[${Array.from(candidate, (setEntry) => valueFingerprint(setEntry, walk)).join(',')}]`;
49
70
  }
50
- return `{${Reflect.ownKeys(candidate)
51
- .map((key) => `${propertyKeyFingerprint(key)}:${valueFingerprint(readProperty(candidate, key), seen)}`)
71
+ // Sorted by key: an object is the same value however its keys were inserted, so
72
+ // reordering fields in a composition's source must not break a passing proof.
73
+ return `{${Arr.sortWith(Reflect.ownKeys(candidate).map((key) => ({ key, printed: propertyKeyFingerprint(key) })), (entry) => entry.printed, Order.string)
74
+ .map((entry) => `${entry.printed}:${valueFingerprint(readProperty(candidate, entry.key), walk)}`)
52
75
  .join(',')}}`;
53
76
  };
54
- export const formatFingerprint = (fingerprintInput) => valueFingerprint(fingerprintInput, new WeakSet());
77
+ export const formatFingerprint = (fingerprintInput) => valueFingerprint(fingerprintInput, { seen: new WeakSet(), memo: new WeakMap() });
55
78
  //# sourceMappingURL=fingerprint.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fingerprint.js","sourceRoot":"","sources":["../src/fingerprint.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -8,7 +8,7 @@ import type { AnyScene, CapturedRender } from '@playfast/reform/internal';
8
8
  export { ProofRunner, proofRunnerLayer, withProofRunner };
9
9
  export type { ProofRunnerApi };
10
10
  export { makeFacade, makeProofFacade, makeRuntimeHandleFacade, makeRuntimeTreeFacade, makeSink, proofLayer, } from './engine.js';
11
- export type { MountedFacade, MountedSlotFacade, MountedSlotFacadesOf, RuntimeTreeFacade, Sink, } from './engine.js';
11
+ export type { DispatchedAction, MountedFacade, MountedSlotFacade, MountedSlotFacadesOf, RuntimeTreeFacade, Sink, } from './engine.js';
12
12
  export { Product, ProductRequirement } from './product.js';
13
13
  export type { AnyRequirementClass, ProductClass, ProductComposition, ProductManifest, RequirementCapture, RequirementClass, RequirementManifest, } from './product.js';
14
14
  export { expect, matchProps } from './assert.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,EAAe,KAAK,YAAY,EAAE,MAAM,QAAQ,CAAA;AACtE,OAAO,EAAE,WAAW,EAAE,KAAK,cAAc,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,UAAU,CAAA;AAE9F,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,UAAU,CAAA;AAC3D,OAAO,KAAK,EACV,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,EAClB,gBAAgB,EACjB,MAAM,WAAW,CAAA;AAClB,OAAO,KAAK,EAAE,YAAY,EAAa,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACvF,OAAO,KAAK,EAEV,KAAK,EACL,eAAe,IAAI,qBAAqB,EACxC,UAAU,EACX,MAAM,kBAAkB,CAAA;AACzB,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAEzE,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,CAAA;AACzD,YAAY,EAAE,cAAc,EAAE,CAAA;AAE9B,OAAO,EACL,UAAU,EACV,eAAe,EACf,uBAAuB,EACvB,qBAAqB,EACrB,QAAQ,EACR,UAAU,GACX,MAAM,UAAU,CAAA;AACjB,YAAY,EACV,gBAAgB,EAChB,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,IAAI,GACL,MAAM,UAAU,CAAA;AAEjB,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA;AACvD,YAAY,EACV,mBAAmB,EACnB,YAAY,EACZ,kBAAkB,EAClB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,WAAW,CAAA;AAClB,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAC7C,YAAY,EACV,MAAM,EACN,SAAS,EACT,UAAU,EACV,QAAQ,EACR,MAAM,EACN,UAAU,EACV,aAAa,GACd,MAAM,UAAU,CAAA;AACjB,YAAY,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAEpF,MAAM,WAAW,KAAK;IACpB,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAA;IACzC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAA;IACxB,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,YAAY,CAAC,MAAM,CAAC,KAAK,MAAM,CAAA;CAClE;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAA;IAC3B,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAA;IAC9B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,CAAA;CACtC;AAED,QAAA,MAAM,SAAS,GAAI,IAAI,SAAS,kBAAkB,EAChD,aAAa,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,EAC3C,OAAO,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,EAChE,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,CAAC,KAAK,cAAc,KAC7D,KA0BA,CAAA;AAEH,KAAK,YAAY,CAAC,CAAC,SAAS,UAAU,EAAE,MAAM,SAAS,kBAAkB,IAAI,CAAC,SAAS;IACrF,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAA;CACjD,GACG;KACG,CAAC,IAAI,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK;CAC7F,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,GACnB,KAAK,CAAA;AAET,KAAK,YAAY,CACf,IAAI,SAAS,kBAAkB,EAC/B,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,IAC9B,CAAC,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAEjE,QAAA,MAAM,YAAY,GAChB,IAAI,SAAS,kBAAkB,EAC/B,CAAC,SAAS,UAAU,EACpB,CAAC,SAAS,aAAa,CAAC,OAAO,CAAC,EAEhC,aAAa,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,EAC3C,OAAO,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACxC,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,cAAc,KAC9C,KAiBA,CAAA;AAEH,UAAU,eAAe;IACvB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,KAAK,CAAC,CAAA;CACtC;AAED,QAAA,MAAM,KAAK,GAAI,SAAS,YAAY,EAAE,QAAQ,eAAe,KAAG,UAI9D,CAAA;AAEF,eAAO,MAAM,YAAY,GAAI,WAAW,OAAO,KAAG,SAAS,IAAI,UACkC,CAAA;AAEjG,QAAA,MAAM,GAAG,GAAI,YAAY,UAAU,KAAG,OAAO,CAAC,WAAW,CACf,CAAA;AAE1C,QAAA,MAAM,SAAS,GAAI,YAAY,UAAU,KAAG,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,KAAK,CAWhF,CAAA;AAEH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,cAAc,CAAC,CAAA;CACjD;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC,SAAS,CAAC,CAAA;IACzC,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAA;CACnC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,OAAO,CAAC,WAAW,CAAC,CAAA;CACzC;AAED,QAAA,MAAM,MAAM,GAAI,YAAY,UAAU,KAAG,aAAa,CAAC,WAAW,CAI7D,CAAA;AAEL;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,QAAA,MAAM,aAAa,GAAI,IAAI,EAAE,CAAC,EAAE,GAAG,EACjC,OAAO,KAAK,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,KAC/B,KAAK,CAAC,KAAK,CAAC,IAAI,GAAG,YAAY,CAAC,YAAY,EAAE,CAAC,EAAE,GAAG,CACE,CAAA;AAEzD,eAAO,MAAM,KAAK,EAAE;IAClB,QAAQ,CAAC,SAAS,EAAE,OAAO,SAAS,CAAA;IACpC,QAAQ,CAAC,YAAY,EAAE,OAAO,YAAY,CAAA;IAC1C,QAAQ,CAAC,KAAK,EAAE,OAAO,KAAK,CAAA;IAC5B,QAAQ,CAAC,GAAG,EAAE,OAAO,GAAG,CAAA;IACxB,QAAQ,CAAC,SAAS,EAAE,OAAO,SAAS,CAAA;IACpC,QAAQ,CAAC,MAAM,EAAE,OAAO,MAAM,CAAA;IAC9B,QAAQ,CAAC,aAAa,EAAE,OAAO,aAAa,CAAA;CAC+B,CAAA"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@playfast/reform-proof",
3
- "version": "1.3.0",
3
+ "version": "1.4.0",
4
4
  "description": "Headless testing toolkit for reform — drive a scene's compositions and assert on the props they compute, with no DOM, timers, or text matching.",
5
5
  "keywords": [
6
6
  "effect",
package/src/engine.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { Cause, Effect, Option, Record as Rec, Ref } from 'effect'
1
+ import { Array as Arr, Cause, Effect, Option, Record as Rec, Ref } from 'effect'
2
2
  import { yieldWrapGet } from 'effect/Utils'
3
3
  import {
4
4
  type CapturedScene,
@@ -9,6 +9,7 @@ import {
9
9
  } from '@playfast/reform'
10
10
  import { type AnyComposition, type AnyScene } from '@playfast/reform/internal'
11
11
  import {
12
+ type DispatchedAction,
12
13
  invalidCompositionProps,
13
14
  type HostRuntime,
14
15
  makeSink,
@@ -26,14 +27,10 @@ import type { ProductComposition } from './product'
26
27
  import type { Proof } from './index'
27
28
 
28
29
  export { makeSink } from './engineSink'
29
- export type { Sink } from './engineSink'
30
+ export type { DispatchedAction, Sink } from './engineSink'
30
31
  export { proofLayer } from './engineTree'
31
32
  export { makeFacade, makeProofFacade, makeRuntimeHandleFacade } from './engineMounted'
32
- export type {
33
- MountedFacade,
34
- MountedSlotFacade,
35
- MountedSlotFacadesOf,
36
- } from './engineSink'
33
+ export type { MountedFacade, MountedSlotFacade, MountedSlotFacadesOf } from './engineSink'
37
34
  export { makeRuntimeTreeFacade } from './engineTreeFacade'
38
35
  export type { RuntimeTreeFacade } from './engineTreeTypes'
39
36
 
@@ -63,7 +60,7 @@ const withProofRuntimeTree = <
63
60
  >(
64
61
  scene: CapturedScene<C, S, Services, P, N, Identity>,
65
62
  sink: Sink,
66
- dispatched: Set<string>,
63
+ dispatched: Set<DispatchedAction>,
67
64
  use: (runtime: HostRuntime, tree: RuntimeTreeFacade<C>) => Effect.Effect<A, E, never>,
68
65
  ): Effect.Effect<A, E, never> =>
69
66
  Effect.acquireUseRelease(
@@ -83,11 +80,19 @@ const withProofRuntimeTree = <
83
80
 
84
81
  const missingCoverage = (
85
82
  proof: Pick<Proof, 'requirement'>,
86
- dispatched: Set<string>,
83
+ dispatched: Set<DispatchedAction>,
87
84
  ): ReadonlyArray<string> =>
88
85
  Option.match(proof.requirement.manifest.events, {
89
86
  onNone: () => [],
90
- onSome: (declared) => declared.map(String).filter((event) => !dispatched.has(event)),
87
+ onSome: (declared) => {
88
+ const owner = compositionIdentity(proof.requirement.manifest.composition)
89
+ const covered = new Set(
90
+ Arr.filterMap(Arr.fromIterable(dispatched), (action) =>
91
+ Object.is(action.identity, owner) ? Option.some(action.event) : Option.none(),
92
+ ),
93
+ )
94
+ return declared.map(String).filter((event) => !covered.has(event))
95
+ },
91
96
  })
92
97
 
93
98
  interface ProofPlacement {
@@ -144,7 +149,7 @@ const executeProofWithSink = Effect.fn('executeProofWithSink')(function* <
144
149
  scene: CapturedScene<C, S, Services, P, N, Identity>,
145
150
  sink: Sink,
146
151
  ): Effect.fn.Return<ProofResult, never, never> {
147
- const dispatched = new Set<string>()
152
+ const dispatched = new Set<DispatchedAction>()
148
153
  const statement = proof.requirement.manifest.statement
149
154
  const runGenerator = Effect.fn('runProofGenerator')(function* (
150
155
  generator: ReturnType<typeof proof.body>,
@@ -218,7 +223,7 @@ const driveProofWithSink = Effect.fn('driveProofWithSink')(function* <
218
223
  const frames = yield* Ref.make<ReadonlyArray<StepFrame>>([])
219
224
  const statement = proof.requirement.manifest.statement
220
225
  // Driving tracks dispatches for the facade without enforcing coverage.
221
- const dispatched = new Set<string>()
226
+ const dispatched = new Set<DispatchedAction>()
222
227
  const record = (index: number): Effect.Effect<void> =>
223
228
  Ref.update(frames, (current) => [...current, { index, captures: [...sink.captures] }])
224
229
  const pump = Effect.fn('pump')(function* (
@@ -282,4 +287,3 @@ export const driveProofEffect = (proof: Proof): Effect.Effect<DriveResult, never
282
287
 
283
288
  export const driveProof = (proof: Proof): Promise<DriveResult> =>
284
289
  Effect.runPromise(driveProofEffect(proof))
285
-
@@ -10,7 +10,9 @@ import {
10
10
  import { type AnyComposition, CaptureSink } from '@playfast/reform/internal'
11
11
  import type { Facade } from './facade'
12
12
  import {
13
+ compositionIdentityOf,
13
14
  directSettle,
15
+ type DispatchedAction,
14
16
  expectMatchingProps,
15
17
  keyed,
16
18
  type MountedFacade,
@@ -32,11 +34,7 @@ import {
32
34
  slotCapturesFor,
33
35
  slotsOf,
34
36
  } from './engineTree'
35
- import {
36
- collectRuntimeBindings,
37
- renderTreeRuntime,
38
- settleTreeRuntime,
39
- } from './engineRender'
37
+ import { collectRuntimeBindings, renderTreeRuntime, settleTreeRuntime } from './engineRender'
40
38
 
41
39
  export function makeFacade<
42
40
  C extends UiContract,
@@ -49,7 +47,7 @@ export function makeFacade<
49
47
  runtime: ManagedRuntime.ManagedRuntime<Services | CaptureSink, never>,
50
48
  scene: CapturedScene<C, S, Services, P, N, Identity>,
51
49
  sink: Sink,
52
- dispatched: Set<string>,
50
+ dispatched: Set<DispatchedAction>,
53
51
  ): {
54
52
  readonly facade: Facade<C, never>
55
53
  readonly settle: Effect.Effect<void, never, never>
@@ -74,7 +72,7 @@ function makeMountedFacade<
74
72
  runtime: RenderRuntime,
75
73
  root: CompositionClass<P, C, S, N, Identity>,
76
74
  sink: Sink,
77
- dispatched: Set<string>,
75
+ dispatched: Set<DispatchedAction>,
78
76
  settleBoundary: SettleBoundary,
79
77
  ): {
80
78
  readonly facade: MountedFacade<C>
@@ -84,14 +82,14 @@ function makeMountedFacade(
84
82
  runtime: RenderRuntime,
85
83
  root: AnyComposition,
86
84
  sink: Sink,
87
- dispatched: Set<string>,
85
+ dispatched: Set<DispatchedAction>,
88
86
  settleBoundary: SettleBoundary,
89
87
  ): MountedFacadeHandleErasure
90
88
  function makeMountedFacade(
91
89
  runtime: RenderRuntime,
92
90
  root: AnyComposition,
93
91
  sink: Sink,
94
- dispatched: Set<string>,
92
+ dispatched: Set<DispatchedAction>,
95
93
  settleBoundary: SettleBoundary,
96
94
  ): MountedFacadeHandleErasure {
97
95
  const bindings = collectRuntimeBindings(root, runtime)
@@ -146,7 +144,7 @@ function makeMountedFacade(
146
144
  Effect.flatMap(() => triggerOf(ref, event)),
147
145
  Effect.flatMap((trigger) =>
148
146
  Effect.sync(() => {
149
- dispatched.add(event)
147
+ dispatched.add({ identity: compositionIdentityOf(comp), event })
150
148
  trigger(payload)
151
149
  }),
152
150
  ),
@@ -244,7 +242,7 @@ export const makeProofFacade = <
244
242
  runtime: ManagedRuntime.ManagedRuntime<Services | CaptureSink, never>,
245
243
  scene: CapturedScene<C, S, Services, P, N, Identity>,
246
244
  sink: Sink,
247
- dispatched: Set<string>,
245
+ dispatched: Set<DispatchedAction>,
248
246
  ): {
249
247
  readonly facade: Facade<C, never>
250
248
  readonly settle: Effect.Effect<void, never, never>
@@ -264,7 +262,7 @@ export const makeRuntimeHandleFacade = <
264
262
  runtime: RuntimeHandle<Services>,
265
263
  root: RuntimeRootComposition<RootIdentifier, P, C, S, N, Identity>,
266
264
  sink: Sink,
267
- dispatched: Set<string>,
265
+ dispatched: Set<DispatchedAction>,
268
266
  ): {
269
267
  readonly facade: MountedFacade<C>
270
268
  readonly settle: Effect.Effect<void, never, never>
package/src/engineSink.ts CHANGED
@@ -91,7 +91,9 @@ export const settleDrain: Effect.Effect<void> = Effect.yieldNow().pipe(Effect.re
91
91
  // settle loop would never make progress. Pinning it to a real clock is what lets the
92
92
  // two clocks coexist: the harness keeps advancing while the product's timers hold
93
93
  // still until `app.advance(...)` moves them.
94
- export const settleStep: Effect.Effect<void> = Effect.sleep(SETTLE_STEP).pipe(Effect.withClock(Clock.make()))
94
+ export const settleStep: Effect.Effect<void> = Effect.sleep(SETTLE_STEP).pipe(
95
+ Effect.withClock(Clock.make()),
96
+ )
95
97
 
96
98
  export const keyed = <V>(get: (key: string) => V): Record<string, V> => {
97
99
  const target: Record<string, V> = Object.create(null)
@@ -101,6 +103,18 @@ export const keyed = <V>(get: (key: string) => V): Record<string, V> => {
101
103
  export const messageOf = (error: unknown): string =>
102
104
  error instanceof Error ? error.message : String(error)
103
105
 
106
+ // An action credited to the composition that actually raised it. A bare event name
107
+ // is not enough: two contracts in one tree can expose the same action name, and a
108
+ // requirement's coverage must be answered by *its* composition's action, not by a
109
+ // child that happens to spell its own action the same way.
110
+ export interface DispatchedAction {
111
+ readonly identity: symbol
112
+ readonly event: string
113
+ }
114
+
115
+ export const compositionIdentityOf = (composition: AnyComposition): symbol =>
116
+ composition.capture<symbol>((exact) => exact.identity)
117
+
104
118
  export const uiNameOf = (comp: AnyComposition): string => comp.manifest.ui.manifest.name
105
119
 
106
120
  // UiContract erases event values to never, so this boundary needs no assertion.
@@ -1,9 +1,11 @@
1
- import { Array as Arr, type Duration, Effect, Option, TestClock } from 'effect'
1
+ import { Array as Arr, type Duration, Effect, MutableRef, Option, TestClock } from 'effect'
2
2
  import { AssertionFailed, NoTestClock, UnknownAction, UnknownSlot } from './errors'
3
3
  import { matchProps } from './assert'
4
4
  import { type RuntimeHandle, type UiContract } from '@playfast/reform'
5
5
  import type { AnyComposition } from '@playfast/reform/internal'
6
6
  import {
7
+ compositionIdentityOf,
8
+ type DispatchedAction,
7
9
  type HostRuntime,
8
10
  keyed,
9
11
  type MountedFacadeErasure,
@@ -28,14 +30,14 @@ export function makeRuntimeTreeFacade<
28
30
  root: RuntimeRootComposition<RootIdentifier, P, C, S, N, Identity>,
29
31
  rootProps: P,
30
32
  sink: Sink,
31
- dispatched: Set<string>,
33
+ dispatched: Set<DispatchedAction>,
32
34
  ): RuntimeTreeFacade<C>
33
35
  export function makeRuntimeTreeFacade(
34
36
  runtime: HostRuntime,
35
37
  root: AnyComposition,
36
38
  rootProps: unknown,
37
39
  sink: Sink,
38
- dispatched: Set<string>,
40
+ dispatched: Set<DispatchedAction>,
39
41
  ): RuntimeTreeFacadeErasure {
40
42
  const driver = makeTreeDriver(runtime, root, rootProps, sink)
41
43
  const currentRoot = (): TreeNode => driver.render().root
@@ -49,10 +51,12 @@ export function makeRuntimeTreeFacade(
49
51
  })
50
52
 
51
53
  // `peek` is the non-dying half of `resolve`: None once the node has left the
52
- // tree, so an action that removed its own node can still report a result.
54
+ // tree, so an action that removed its own node can still report a result. It is
55
+ // given the node as it stood before the dispatch, because "is this still the node
56
+ // I acted on" cannot be answered from a bare index.
53
57
  const nodeFacade = (
54
58
  resolve: () => TreeNode,
55
- peek: () => Option.Option<TreeNode>,
59
+ peek: (before: TreeNode) => Option.Option<TreeNode>,
56
60
  ): MountedFacadeErasure => ({
57
61
  props: Effect.sync(() => resolve().props),
58
62
  expectProps: (partial) =>
@@ -81,12 +85,12 @@ export function makeRuntimeTreeFacade(
81
85
  }).message,
82
86
  )
83
87
  }
84
- dispatched.add(event)
88
+ dispatched.add({ identity: compositionIdentityOf(node.comp), event })
85
89
  trigger(payload)
86
90
  yield* driver.settle
87
91
  // A self-removing action leaves nothing to re-read; report what the
88
92
  // node last rendered instead of dying on the vanished child.
89
- return Option.match(peek(), {
93
+ return Option.match(peek(node), {
90
94
  onNone: () => node.props,
91
95
  onSome: (settled) => settled.props,
92
96
  })
@@ -113,15 +117,46 @@ export function makeRuntimeTreeFacade(
113
117
  }
114
118
  return resolved
115
119
  }
116
- const peekAt = (index: number): Option.Option<TreeNode> =>
117
- Option.fromNullable(children()[index])
118
120
  const peekByKey = (key: string): Option.Option<TreeNode> =>
119
121
  Arr.findFirst(children(), (candidate) => Option.contains(candidate.key, key))
120
- const childAt = (index: number): MountedFacadeErasure =>
121
- nodeFacade(
122
- () => children()[index] ?? missingChild(index),
123
- () => peekAt(index),
122
+
123
+ // Which node an index still refers to, after the slot may have changed under it.
124
+ // Three outcomes, in order: the same node (it survived, wherever it moved to); a
125
+ // node that took its place (a slot of unchanged length swapped one child for
126
+ // another — a placeholder giving way to the real thing); or nothing, because the
127
+ // slot shrank and whatever sits at the index now is a *different row* that slid
128
+ // down. Reporting that neighbour's props is the bug this ordering exists to stop.
129
+ interface PeekAt {
130
+ readonly index: number
131
+ readonly before: TreeNode
132
+ readonly siblingsBefore: number
133
+ }
134
+
135
+ const peekAt = ({ index, before, siblingsBefore }: PeekAt): Option.Option<TreeNode> => {
136
+ const now = children()
137
+ const survived = Arr.findFirst(now, (candidate) =>
138
+ Option.match(before.key, {
139
+ onNone: () => candidate.path === before.path,
140
+ onSome: (key) => Option.contains(candidate.key, key),
141
+ }),
124
142
  )
143
+ if (Option.isSome(survived)) {
144
+ return survived
145
+ }
146
+ return now.length === siblingsBefore ? Option.fromNullable(now[index]) : Option.none()
147
+ }
148
+
149
+ const childAt = (index: number): MountedFacadeErasure => {
150
+ const siblings = MutableRef.make(0)
151
+ return nodeFacade(
152
+ () => {
153
+ const now = children()
154
+ MutableRef.set(siblings, now.length)
155
+ return now[index] ?? missingChild(index)
156
+ },
157
+ (before) => peekAt({ index, before, siblingsBefore: MutableRef.get(siblings) }),
158
+ )
159
+ }
125
160
  const childByKey = (key: string): MountedFacadeErasure =>
126
161
  nodeFacade(
127
162
  () => Option.getOrElse(peekByKey(key), () => missingKey(key)),
@@ -1,4 +1,6 @@
1
+ import * as Arr from 'effect/Array'
1
2
  import * as Option from 'effect/Option'
3
+ import * as Order from 'effect/Order'
2
4
 
3
5
  const readPropertyOption = Option.liftThrowable((target: object, key: PropertyKey): unknown =>
4
6
  Reflect.get(target, key),
@@ -14,7 +16,15 @@ const propertyKeyFingerprint = (key: PropertyKey): string =>
14
16
  ? `number-key:${String(key)}`
15
17
  : `key:${key.length}:${key}`
16
18
 
17
- const valueFingerprint = (candidate: unknown, seen: WeakSet<object>): string => {
19
+ interface Walk {
20
+ readonly seen: WeakSet<object>
21
+ // Printed sub-fingerprints, so a shared reference is walked once. Unwinding `seen`
22
+ // made the walk follow every *path* rather than every node, which on a DAG that
23
+ // shares a child two ways doubles the work per level — a deep one hangs.
24
+ readonly memo: WeakMap<object, string>
25
+ }
26
+
27
+ const valueFingerprint = (candidate: unknown, walk: Walk): string => {
18
28
  if (typeof candidate === 'bigint') {
19
29
  return `bigint:${String(candidate)}`
20
30
  }
@@ -39,12 +49,32 @@ const valueFingerprint = (candidate: unknown, seen: WeakSet<object>): string =>
39
49
  if (candidate === null) {
40
50
  return 'null'
41
51
  }
42
- if (seen.has(candidate)) {
52
+ if (walk.seen.has(candidate)) {
43
53
  return '[Circular]'
44
54
  }
45
- seen.add(candidate)
55
+ const remembered = walk.memo.get(candidate)
56
+ if (remembered !== undefined) {
57
+ return remembered
58
+ }
59
+ // `seen` marks the path currently being walked, not everything ever visited: it
60
+ // is unwound below. Without that, a value that merely repeats a reference — the
61
+ // same config object under two keys, a DAG rather than a cycle — reads as
62
+ // `[Circular]` on its second appearance, so two equal values fingerprint
63
+ // differently and `toEqual` fails on them.
64
+ walk.seen.add(candidate)
65
+ const printed = structuralFingerprint(candidate, walk)
66
+ walk.seen.delete(candidate)
67
+ // Only a print that did not depend on where the walk had been is reusable: one
68
+ // containing `[Circular]` describes this path, not this value.
69
+ if (!printed.includes('[Circular]')) {
70
+ walk.memo.set(candidate, printed)
71
+ }
72
+ return printed
73
+ }
74
+
75
+ const structuralFingerprint = (candidate: object, walk: Walk): string => {
46
76
  if (Array.isArray(candidate)) {
47
- return `[${candidate.map((arrayEntry) => valueFingerprint(arrayEntry, seen)).join(',')}]`
77
+ return `[${candidate.map((arrayEntry) => valueFingerprint(arrayEntry, walk)).join(',')}]`
48
78
  }
49
79
  if (candidate instanceof Date) {
50
80
  return `date:${String(candidate.getTime())}`
@@ -53,21 +83,26 @@ const valueFingerprint = (candidate: unknown, seen: WeakSet<object>): string =>
53
83
  return `map:[${Array.from(
54
84
  candidate,
55
85
  ([mapKey, mapEntry]) =>
56
- `${valueFingerprint(mapKey, seen)}=>${valueFingerprint(mapEntry, seen)}`,
86
+ `${valueFingerprint(mapKey, walk)}=>${valueFingerprint(mapEntry, walk)}`,
57
87
  ).join(',')}]`
58
88
  }
59
89
  if (candidate instanceof Set) {
60
- return `set:[${Array.from(candidate, (setEntry) => valueFingerprint(setEntry, seen)).join(
90
+ return `set:[${Array.from(candidate, (setEntry) => valueFingerprint(setEntry, walk)).join(
61
91
  ',',
62
92
  )}]`
63
93
  }
64
- return `{${Reflect.ownKeys(candidate)
94
+ // Sorted by key: an object is the same value however its keys were inserted, so
95
+ // reordering fields in a composition's source must not break a passing proof.
96
+ return `{${Arr.sortWith(
97
+ Reflect.ownKeys(candidate).map((key) => ({ key, printed: propertyKeyFingerprint(key) })),
98
+ (entry) => entry.printed,
99
+ Order.string,
100
+ )
65
101
  .map(
66
- (key) =>
67
- `${propertyKeyFingerprint(key)}:${valueFingerprint(readProperty(candidate, key), seen)}`,
102
+ (entry) => `${entry.printed}:${valueFingerprint(readProperty(candidate, entry.key), walk)}`,
68
103
  )
69
104
  .join(',')}}`
70
105
  }
71
106
 
72
107
  export const formatFingerprint = (fingerprintInput: unknown): string =>
73
- valueFingerprint(fingerprintInput, new WeakSet())
108
+ valueFingerprint(fingerprintInput, { seen: new WeakSet(), memo: new WeakMap() })
package/src/index.ts CHANGED
@@ -29,6 +29,7 @@ export {
29
29
  proofLayer,
30
30
  } from './engine'
31
31
  export type {
32
+ DispatchedAction,
32
33
  MountedFacade,
33
34
  MountedSlotFacade,
34
35
  MountedSlotFacadesOf,
@@ -230,4 +231,3 @@ export const Proof: {
230
231
  readonly driver: typeof driver
231
232
  readonly withTestClock: typeof withTestClock
232
233
  } = { implement, implementVia, suite, run, runEffect, driver, withTestClock }
233
-
@@ -0,0 +1,210 @@
1
+ import { expect, it } from '@effect/vitest'
2
+ import { Effect, Layer, Ref, Schema as S } from 'effect'
3
+ import {
4
+ Composition,
5
+ each,
6
+ Engine,
7
+ Event,
8
+ mount,
9
+ provide,
10
+ Reducer,
11
+ scene,
12
+ slot,
13
+ State,
14
+ StateGroup,
15
+ type Trigger,
16
+ Ui,
17
+ ui,
18
+ } from '@playfast/reform'
19
+ import { Product, Proof, ProductRequirement, expect as proofExpect } from './index'
20
+ import type { Proof as ProofValue } from './index'
21
+
22
+ // A list of keyed children, each able to remove itself, over a root that owns its
23
+ // own `bump`. The child contract deliberately exposes an event with the SAME name
24
+ // (`bump`) backed by a DIFFERENT domain event, so "which node was this credited
25
+ // to?" is observable rather than a matter of taste.
26
+
27
+ const Todo = S.Struct({ id: S.String, label: S.String })
28
+
29
+ class HuntTodos extends State.make('huntTodos', S.Array(Todo)) {}
30
+ class HuntBumps extends State.make('huntBumps', S.Number) {}
31
+ class HuntStates extends StateGroup.make(HuntTodos, HuntBumps) {}
32
+
33
+ class HuntRemoved extends Event.make('HuntRemoved', S.Struct({ id: S.String })) {}
34
+ class HuntItemBumped extends Event.make('HuntItemBumped', S.Struct({ id: S.String })) {}
35
+ class HuntRootBumped extends Event.make('HuntRootBumped', S.Struct({})) {}
36
+
37
+ class HuntRemoveReducer extends Reducer.make('HuntRemoveReducer', {
38
+ states: [HuntTodos],
39
+ events: [HuntRemoved],
40
+ }) {}
41
+ const HuntRemoveReducerLive = Reducer.live(HuntRemoveReducer, (todos, event) =>
42
+ todos.filter((todo) => todo.id !== event.id),
43
+ )
44
+
45
+ class HuntRootBumpReducer extends Reducer.make('HuntRootBumpReducer', {
46
+ states: [HuntBumps],
47
+ events: [HuntRootBumped],
48
+ }) {}
49
+ const HuntRootBumpReducerLive = Reducer.live(HuntRootBumpReducer, (bumps) => bumps + 1)
50
+
51
+ class HuntItemUi extends ui('HuntItem')<{
52
+ props: { id: string; label: string }
53
+ events: { remove: Trigger<{ id: string }>; bump: Trigger<{ id: string }> }
54
+ }>() {}
55
+ class HuntItem extends Composition.make('HuntItem', {
56
+ title: 'HuntItem',
57
+ props: S.Struct({ id: S.String, label: S.String }),
58
+ events: [HuntRemoved, HuntItemBumped],
59
+ ui: HuntItemUi,
60
+ })<HuntItem>() {}
61
+ const HuntItemLive = Composition.live(HuntItem, function* () {
62
+ const props = yield* HuntItem.props
63
+ const remove = yield* Event.trigger(HuntRemoved)
64
+ const bump = yield* Event.trigger(HuntItemBumped)
65
+ return mount({ props, slots: {}, events: { remove, bump } })
66
+ })
67
+ class HuntItemSlot extends slot('HuntItem')<HuntItemSlot, typeof HuntItem>() {}
68
+
69
+ class HuntListUi extends ui('HuntList')<{
70
+ props: { total: number; bumps: number }
71
+ slots: { Item: HuntItemSlot }
72
+ events: { bump: Trigger<Record<string, never>> }
73
+ }>() {}
74
+ class HuntList extends Composition.make('HuntList', {
75
+ title: 'HuntList',
76
+ states: [HuntStates],
77
+ events: [HuntRootBumped],
78
+ slots: { Item: HuntItemSlot },
79
+ ui: HuntListUi,
80
+ })<HuntList>() {}
81
+ const HuntListLive = Composition.live(HuntList, function* () {
82
+ const todos = yield* StateGroup.select(HuntStates, 'huntTodos')
83
+ const bumps = yield* StateGroup.select(HuntStates, 'huntBumps')
84
+ const bump = yield* Event.trigger(HuntRootBumped)
85
+ return mount({
86
+ props: { total: todos.length, bumps },
87
+ slots: {
88
+ Item: each(todos, {
89
+ key: (todo) => todo.id,
90
+ props: (todo) => ({ id: todo.id, label: todo.label }),
91
+ }),
92
+ },
93
+ events: { bump },
94
+ })
95
+ })
96
+
97
+ const presentations = Layer.mergeAll(
98
+ provide(
99
+ HuntListUi,
100
+ Ui.make(HuntListUi, () => null),
101
+ ),
102
+ provide(
103
+ HuntItemUi,
104
+ Ui.make(HuntItemUi, () => null),
105
+ ),
106
+ )
107
+ const Views = Layer.mergeAll(HuntListLive, HuntItemLive, provide(HuntItemSlot, HuntItem)).pipe(
108
+ Layer.provideMerge(presentations),
109
+ )
110
+ const Logic = Layer.mergeAll(HuntRemoveReducerLive, HuntRootBumpReducerLive).pipe(
111
+ Layer.provideMerge(
112
+ Layer.mergeAll(
113
+ Engine,
114
+ StateGroup.live(HuntStates, {
115
+ huntTodos: [
116
+ { id: 'a', label: 'alpha' },
117
+ { id: 'b', label: 'beta' },
118
+ { id: 'c', label: 'gamma' },
119
+ ],
120
+ huntBumps: 0,
121
+ }),
122
+ ),
123
+ ),
124
+ )
125
+ const HuntScene = scene(HuntList, { provide: [Views.pipe(Layer.provideMerge(Logic))] })
126
+
127
+ class CoversListBump extends ProductRequirement.make(HuntList, 'bumps the list itself', {
128
+ events: ['bump'],
129
+ }) {}
130
+ class HuntProduct extends Product.make(HuntList, { requirements: [CoversListBump] }) {}
131
+
132
+ const runProof = (proof: ProofValue) =>
133
+ Effect.promise(() => Proof.run(Proof.suite(HuntProduct, { proofs: [proof] })))
134
+
135
+ // BUG 1 — engine.ts `missingCoverage` matches a requirement's declared events
136
+ // against a flat Set of event NAMES dispatched anywhere in the tree, so a
137
+ // same-named action on a child composition (a different domain Event entirely)
138
+ // silently satisfies coverage declared on the requirement's own composition.
139
+ it.live('requirement event coverage is not credited to the requirement’s composition', () =>
140
+ Effect.gen(function* () {
141
+ // Control A — a genuine dispatch of the list's own `bump` is covered.
142
+ const rootDispatch = Proof.implement(CoversListBump, HuntScene, function* (app) {
143
+ const after = yield* app.actions.bump({})
144
+ yield* proofExpect(after.bumps).toBe(1)
145
+ })
146
+ const rootResult = yield* runProof(rootDispatch)
147
+ expect(rootResult.results[0]?.error).toBeUndefined()
148
+ expect(rootResult.ok).toBe(true)
149
+
150
+ // Control B — dispatching nothing is reported as uncovered.
151
+ const noDispatch = Proof.implement(CoversListBump, HuntScene, function* (app) {
152
+ yield* app.expectProps({ bumps: 0 })
153
+ })
154
+ const noneResult = yield* runProof(noDispatch)
155
+ expect(noneResult.ok).toBe(false)
156
+ expect(noneResult.results[0]?.error).toContain('never dispatched')
157
+
158
+ // The defect — only the CHILD's `bump` (HuntItemBumped) is dispatched. The
159
+ // proof body itself proves the list's `bump` (HuntRootBumped) never fired,
160
+ // yet the run is reported green with its coverage requirement satisfied.
161
+ const childOnly = Proof.implement(CoversListBump, HuntScene, function* (app) {
162
+ const item = yield* app.slots.Item.first
163
+ yield* item.actions.bump({ id: 'a' })
164
+ yield* app.expectProps({ bumps: 0 })
165
+ })
166
+ const childResult = yield* runProof(childOnly)
167
+ expect(childResult.ok).toBe(false)
168
+ expect(childResult.results[0]?.error).toContain('never dispatched')
169
+ }),
170
+ )
171
+
172
+ // BUG 2 — engineTreeFacade.ts resolves a slot child's "did this node survive the
173
+ // action?" peek by INDEX, so an action that removes a non-last child reports the
174
+ // successor that slid into that index as if those were the acting node's props.
175
+ it.live('an action on a slot child resolves to that child’s own props', () =>
176
+ Effect.gen(function* () {
177
+ const observed = yield* Ref.make<ReadonlyArray<string>>([])
178
+ const removals = Proof.implement(CoversListBump, HuntScene, function* (app) {
179
+ yield* app.actions.bump({})
180
+
181
+ // [a, b, c] — remove the HEAD via its index locator.
182
+ const head = yield* app.slots.Item.at(0)
183
+ const afterHead = yield* head.actions.remove({ id: 'a' })
184
+ yield* Ref.update(observed, (seen) => [...seen, afterHead.id])
185
+
186
+ // [b, c] — remove the TAIL via its index locator (index runs past the end).
187
+ const tail = yield* app.slots.Item.at(1)
188
+ const afterTail = yield* tail.actions.remove({ id: 'c' })
189
+ yield* Ref.update(observed, (seen) => [...seen, afterTail.id])
190
+
191
+ // [b] — remove via the key locator.
192
+ const keyed = yield* app.slots.Item.byKey('b')
193
+ const afterKeyed = yield* keyed.actions.remove({ id: 'b' })
194
+ yield* Ref.update(observed, (seen) => [...seen, afterKeyed.id])
195
+ })
196
+ const result = yield* runProof(removals)
197
+ expect(result.results[0]?.error).toBeUndefined()
198
+
199
+ const seen = yield* Ref.get(observed)
200
+ expect(seen.length).toBe(3)
201
+ // Control A — removing the LAST child leaves nothing at that index, so the
202
+ // harness correctly reports the acting node's last props.
203
+ expect(seen[1]).toBe('c')
204
+ // Control B — the key locator misses after removal, likewise correct.
205
+ expect(seen[2]).toBe('b')
206
+ // The defect — removing a NON-last child still finds "something" at index 0,
207
+ // so the action resolves to sibling `b`'s props instead of `a`'s.
208
+ expect(seen[0]).toBe('a')
209
+ }),
210
+ )
@@ -66,7 +66,10 @@ const FlashLive = Composition.live(Flash, function* () {
66
66
  return mount({ props: { flash }, slots: {}, events: { submit } })
67
67
  })
68
68
 
69
- const presentations = provide(FlashUi, Ui.make(FlashUi, () => null))
69
+ const presentations = provide(
70
+ FlashUi,
71
+ Ui.make(FlashUi, () => null),
72
+ )
70
73
  const Views = FlashLive.pipe(Layer.provideMerge(presentations))
71
74
  const Logic = Layer.mergeAll(EndFlashLive, FlashTimerLive, Channel.live(FlashLane)).pipe(
72
75
  Layer.provideMerge(Layer.mergeAll(Engine, StateGroup.live(FlashStates, { flash: true }))),
@@ -83,13 +86,20 @@ class FlashProduct extends Product.make(Flash, { requirements: [ClearsFlash] })
83
86
 
84
87
  describe('Proof.withTestClock', () => {
85
88
  test('app.advance elapses a product timer without spending real time', async () => {
89
+ // An hour of product time, not the 1500ms window. The ratio is what keeps this an
90
+ // assertion about the clock rather than about the runner: virtual time costs the
91
+ // same whether it is a second or an hour, so the budget below sits ~15x above what
92
+ // this harness really spends (measured 370-710ms) and ~360x below what the real
93
+ // clock would charge. The 750ms budget it replaces sat inside that measured range,
94
+ // which is why it failed on a loaded runner.
95
+ const LONG = Duration.hours(1)
86
96
  const proof = Proof.implement(ClearsFlash, VirtualScene, function* (app) {
87
97
  yield* proofExpect((yield* app.props).flash).toBe(true)
88
98
  yield* app.actions.submit({})
89
99
  // The timer is armed but no virtual time has passed, so the flash still shows.
90
100
  // On the real clock this frame is a race; here it is a fact.
91
101
  yield* proofExpect((yield* app.props).flash).toBe(true)
92
- yield* app.advance(FLASH)
102
+ yield* app.advance(LONG)
93
103
  yield* proofExpect((yield* app.props).flash).toBe(false)
94
104
  })
95
105
 
@@ -99,10 +109,10 @@ describe('Proof.withTestClock', () => {
99
109
 
100
110
  expect(result.results.map((entry) => entry.error)).toEqual([undefined])
101
111
  expect(result.ok).toBe(true)
102
- // The assertion that matters: 1500ms of product time cost a fraction of it in
103
- // real time. Generous enough not to flake on a loaded runner, tight enough that
104
- // a regression to the real clock (>= 1500ms) fails here.
105
- expect(elapsed).toBeLessThan(750)
112
+ // The assertion that matters: an hour of product time cost well under a second of
113
+ // real time. A regression to the real clock cannot squeeze past this — it would
114
+ // have to finish an hour of sleeping in ten.
115
+ expect(elapsed).toBeLessThan(10_000)
106
116
  })
107
117
 
108
118
  test('the timer does not fire on its own — only advancing moves it', async () => {