@playfast/reform-proof 1.2.1 → 1.3.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.
Files changed (69) hide show
  1. package/dist/assert.d.ts +15 -0
  2. package/dist/assert.d.ts.map +1 -0
  3. package/dist/assert.js +39 -0
  4. package/dist/assert.js.map +1 -0
  5. package/dist/engine.d.ts +16 -0
  6. package/dist/engine.d.ts.map +1 -0
  7. package/dist/engine.js +119 -0
  8. package/dist/engine.js.map +1 -0
  9. package/dist/engineMounted.d.ts +18 -0
  10. package/dist/engineMounted.d.ts.map +1 -0
  11. package/dist/engineMounted.js +96 -0
  12. package/dist/engineMounted.js.map +1 -0
  13. package/dist/engineMounts.d.ts +13 -0
  14. package/dist/engineMounts.d.ts.map +1 -0
  15. package/dist/engineMounts.js +116 -0
  16. package/dist/engineMounts.js.map +1 -0
  17. package/dist/engineRender.d.ts +10 -0
  18. package/dist/engineRender.d.ts.map +1 -0
  19. package/dist/engineRender.js +64 -0
  20. package/dist/engineRender.js.map +1 -0
  21. package/dist/engineSink.d.ts +66 -0
  22. package/dist/engineSink.d.ts.map +1 -0
  23. package/dist/engineSink.js +72 -0
  24. package/dist/engineSink.js.map +1 -0
  25. package/dist/engineTree.d.ts +63 -0
  26. package/dist/engineTree.d.ts.map +1 -0
  27. package/dist/engineTree.js +137 -0
  28. package/dist/engineTree.js.map +1 -0
  29. package/dist/engineTreeDriver.d.ts +5 -0
  30. package/dist/engineTreeDriver.d.ts.map +1 -0
  31. package/dist/engineTreeDriver.js +187 -0
  32. package/dist/engineTreeDriver.js.map +1 -0
  33. package/dist/engineTreeFacade.d.ts +5 -0
  34. package/dist/engineTreeFacade.d.ts.map +1 -0
  35. package/dist/engineTreeFacade.js +105 -0
  36. package/dist/engineTreeFacade.js.map +1 -0
  37. package/dist/engineTreeTypes.d.ts +80 -0
  38. package/dist/engineTreeTypes.d.ts.map +1 -0
  39. package/dist/engineTreeTypes.js +11 -0
  40. package/dist/engineTreeTypes.js.map +1 -0
  41. package/dist/errors.d.ts +39 -0
  42. package/dist/errors.d.ts.map +1 -0
  43. package/dist/errors.js +30 -0
  44. package/dist/errors.js.map +1 -0
  45. package/dist/facade.d.ts +54 -0
  46. package/dist/facade.d.ts.map +1 -0
  47. package/dist/facade.js +2 -0
  48. package/dist/facade.js.map +1 -0
  49. package/dist/fingerprint.d.ts +2 -0
  50. package/dist/fingerprint.d.ts.map +1 -0
  51. package/dist/fingerprint.js +55 -0
  52. package/dist/fingerprint.js.map +1 -0
  53. package/dist/index.d.ts +88 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +73 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/product.d.ts +56 -0
  58. package/dist/product.d.ts.map +1 -0
  59. package/dist/product.js +35 -0
  60. package/dist/product.js.map +1 -0
  61. package/dist/proofCase.d.ts +24 -0
  62. package/dist/proofCase.d.ts.map +1 -0
  63. package/dist/proofCase.js +2 -0
  64. package/dist/proofCase.js.map +1 -0
  65. package/dist/runner.d.ts +15 -0
  66. package/dist/runner.d.ts.map +1 -0
  67. package/dist/runner.js +13 -0
  68. package/dist/runner.js.map +1 -0
  69. package/package.json +17 -5
@@ -0,0 +1,66 @@
1
+ import { type Context, type Duration, Effect } from 'effect';
2
+ import { type CompositionClass, type CompositionService, type RuntimeHandle, type Structure, type Trigger, type UiContract } from '@playfast/reform';
3
+ import { type AnyComposition, type CapturedRender, type CaptureSinkApi, type Instrumentation } from '@playfast/reform/internal';
4
+ import type { Facade, SlotFacade, SlotFacadesOf } from './facade.js';
5
+ export type RenderRuntime = Pick<RuntimeHandle, 'dispatch' | 'instrumentation' | 'readOption'>;
6
+ export type HostRuntime = Pick<RuntimeHandle, 'dispatch' | 'instrumentation' | 'mountAnyFeature' | 'readOption'>;
7
+ export type RuntimeRootComposition<Identifier, P, C extends UiContract, S extends ReadonlyArray<unknown>, N extends string, Identity> = CompositionClass<P, C, S, N, Identity> & {
8
+ readonly tag: Context.Tag<Identifier, CompositionService<P, C>>;
9
+ };
10
+ export interface MountedFacadeErasure {
11
+ readonly props: Effect.Effect<unknown, never, never>;
12
+ readonly expectProps: (partial: unknown) => Effect.Effect<void, never, never>;
13
+ readonly actions: Readonly<Record<string, (payload: unknown) => Effect.Effect<unknown, never, never>>>;
14
+ readonly slots: Readonly<Record<string, MountedSlotFacadeErasure>>;
15
+ readonly frame: Effect.Effect<void, never, never>;
16
+ readonly advance: (duration: Duration.DurationInput) => Effect.Effect<void, never, never>;
17
+ }
18
+ export interface MountedSlotFacadeErasure extends MountedFacadeErasure {
19
+ readonly first: Effect.Effect<MountedFacadeErasure, never, never>;
20
+ readonly at: (index: number) => Effect.Effect<MountedFacadeErasure, never, never>;
21
+ readonly all: Effect.Effect<ReadonlyArray<MountedFacadeErasure>, never, never>;
22
+ readonly byKey: (key: string) => Effect.Effect<MountedFacadeErasure, never, never>;
23
+ readonly where: (predicate: (props: unknown) => boolean) => Effect.Effect<ReadonlyArray<MountedFacadeErasure>, never, never>;
24
+ readonly count: Effect.Effect<number, never, never>;
25
+ }
26
+ export interface MountedFacadeHandleErasure {
27
+ readonly facade: {
28
+ readonly props: Effect.Effect<unknown, never, never>;
29
+ readonly expectProps: (partial: never) => Effect.Effect<void, never, never>;
30
+ readonly actions: object;
31
+ readonly slots: object;
32
+ readonly frame: Effect.Effect<void, never, never>;
33
+ readonly advance: (duration: Duration.DurationInput) => Effect.Effect<void, never, never>;
34
+ };
35
+ readonly settle: Effect.Effect<void, never, never>;
36
+ }
37
+ export type Settlement = Effect.Effect<void, never, never>;
38
+ export type SettleBoundary = (settlement: Settlement) => Settlement;
39
+ export declare const directSettle: SettleBoundary;
40
+ export declare const SETTLE_DRAIN = 30;
41
+ export declare const SETTLE_STEP = "1 milli";
42
+ export declare const SETTLE_MAX_RENDERS = 100;
43
+ export declare const settleDrain: Effect.Effect<void>;
44
+ export declare const settleStep: Effect.Effect<void>;
45
+ export declare const keyed: <V>(get: (key: string) => V) => Record<string, V>;
46
+ export declare const messageOf: (error: unknown) => string;
47
+ export declare const uiNameOf: (comp: AnyComposition) => string;
48
+ export declare const eventsOf: (structure: Structure<UiContract>) => Record<string, Trigger<unknown>>;
49
+ export interface ExpectedProps {
50
+ readonly actual: unknown;
51
+ readonly expected: unknown;
52
+ }
53
+ export declare const expectMatchingProps: ({ actual, expected, }: ExpectedProps) => Effect.Effect<void, never, never>;
54
+ export declare const invalidCompositionProps: (composition: AnyComposition) => string;
55
+ export declare const renderCompositionRuntime: (runtime: RenderRuntime, composition: AnyComposition, props: unknown) => Structure<UiContract>;
56
+ export interface Sink {
57
+ readonly api: CaptureSinkApi;
58
+ readonly captures: ReadonlyArray<CapturedRender>;
59
+ readonly instrumentation: Instrumentation;
60
+ reset(): void;
61
+ }
62
+ export declare const makeSink: (instrumentation?: Instrumentation) => Sink;
63
+ export type MountedSlotFacadesOf<C extends UiContract> = SlotFacadesOf<C, never>;
64
+ export type MountedFacade<C extends UiContract> = Facade<C, never>;
65
+ export type MountedSlotFacade<C extends UiContract> = SlotFacade<C, never>;
66
+ //# sourceMappingURL=engineSink.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineSink.d.ts","sourceRoot":"","sources":["../src/engineSink.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,72 @@
1
+ import { Clock, Effect, MutableRef, Option } from 'effect';
2
+ import { AssertionFailed } from './errors.js';
3
+ import { Composition, isStructure, } from '@playfast/reform';
4
+ import { noopInstrumentation, } from '@playfast/reform/internal';
5
+ import { matchProps } from './assert.js';
6
+ export const directSettle = (settlement) => settlement;
7
+ // Cooperative yields flush synchronous fibers; the real-time sleep prevents a
8
+ // genuinely delayed flow from looking stable between renders.
9
+ export const SETTLE_DRAIN = 30;
10
+ export const SETTLE_STEP = '1 milli';
11
+ export const SETTLE_MAX_RENDERS = 100;
12
+ export const settleDrain = Effect.yieldNow().pipe(Effect.repeatN(SETTLE_DRAIN));
13
+ // The drain's own pacing is harness time, and harness time is always real. A scene
14
+ // may install `Proof.withTestClock` to freeze PRODUCT time, and the proof body runs
15
+ // on that same runtime — so an unpinned sleep here would freeze with it and the
16
+ // settle loop would never make progress. Pinning it to a real clock is what lets the
17
+ // two clocks coexist: the harness keeps advancing while the product's timers hold
18
+ // still until `app.advance(...)` moves them.
19
+ export const settleStep = Effect.sleep(SETTLE_STEP).pipe(Effect.withClock(Clock.make()));
20
+ export const keyed = (get) => {
21
+ const target = Object.create(null);
22
+ return new Proxy(target, { get: (_target, key) => get(String(key)) });
23
+ };
24
+ export const messageOf = (error) => error instanceof Error ? error.message : String(error);
25
+ export const uiNameOf = (comp) => comp.manifest.ui.manifest.name;
26
+ // UiContract erases event values to never, so this boundary needs no assertion.
27
+ export const eventsOf = (structure) => ({
28
+ ...structure.events,
29
+ });
30
+ export const expectMatchingProps = ({ actual, expected, }) => Option.match(Option.fromNullable(matchProps({ actual, expected })), {
31
+ onNone: () => Effect.void,
32
+ onSome: (detail) => Effect.dieMessage(new AssertionFailed({ detail }).message),
33
+ });
34
+ export const invalidCompositionProps = (composition) => `reform-proof: invalid props for composition ${composition.manifest.name}`;
35
+ export const renderCompositionRuntime = (runtime, composition, props) => composition.capture((exact) => {
36
+ const resolved = Option.flatMap(exact.parseProps(props), (parsed) => Option.map(runtime.readOption(exact.tag), (service) => ({
37
+ parsed,
38
+ service,
39
+ })));
40
+ return Option.match(resolved, {
41
+ onNone: () => Effect.runSync(Effect.dieMessage(invalidCompositionProps(composition))),
42
+ onSome: ({ parsed, service }) => {
43
+ const frame = Effect.runSync(Composition.render(service, {
44
+ props: parsed,
45
+ tracker: { add: () => { } },
46
+ }));
47
+ if (isStructure(frame)) {
48
+ return frame;
49
+ }
50
+ return Effect.runSync(Effect.dieMessage(`reform-proof: composition ${composition.manifest.name} did not return a Structure`));
51
+ },
52
+ });
53
+ });
54
+ export const makeSink = (instrumentation = noopInstrumentation) => {
55
+ // CaptureSink.record is synchronous, so this uses MutableRef rather than Ref.
56
+ const captures = MutableRef.make([]);
57
+ return {
58
+ api: {
59
+ record: (capture) => {
60
+ MutableRef.update(captures, (current) => [...current, capture]);
61
+ },
62
+ },
63
+ get captures() {
64
+ return MutableRef.get(captures);
65
+ },
66
+ instrumentation,
67
+ reset: () => {
68
+ MutableRef.set(captures, []);
69
+ },
70
+ };
71
+ };
72
+ //# sourceMappingURL=engineSink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineSink.js","sourceRoot":"","sources":["../src/engineSink.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import { Context, Effect, Layer, Option } from 'effect';
2
+ import { type CapturedScene, type SlotFill, type Structure, type UiContract } from '@playfast/reform';
3
+ import { type AnyComposition, type AnySlot, type AnySlotChild, type CapturedRender, CaptureSink, type Instrumentation } from '@playfast/reform/internal';
4
+ import { type RenderRuntime, type Sink } from './engineSink.js';
5
+ export declare const proofLayer: <C extends UiContract, S extends ReadonlyArray<unknown>, Services, P, N extends string, Identity>(scene: CapturedScene<C, S, Services, P, N, Identity>, sink: Sink) => Layer.Layer<Services | CaptureSink, never, never>;
6
+ export declare const missingRuntimeBus: () => never;
7
+ export declare const renderRuntimeFromContext: <Services>(context: Context.Context<Services>, instrumentation: Instrumentation) => RenderRuntime;
8
+ export interface Mounted {
9
+ readonly comp: AnyComposition;
10
+ readonly props: unknown;
11
+ readonly ref: NodeRef;
12
+ }
13
+ export interface SlotInstanceRef {
14
+ readonly name: string;
15
+ readonly index: number;
16
+ readonly key: Option.Option<string>;
17
+ readonly keyOccurrence: number;
18
+ }
19
+ export interface NodeRef {
20
+ readonly name: string;
21
+ readonly parent: Option.Option<NodeRef>;
22
+ readonly slot: Option.Option<SlotInstanceRef>;
23
+ }
24
+ export interface NodeCapture {
25
+ readonly ref: NodeRef;
26
+ readonly capture: CapturedRender;
27
+ }
28
+ export interface CaptureLookup {
29
+ readonly captures: ReadonlyArray<NodeCapture>;
30
+ record(ref: NodeRef, capture: CapturedRender): void;
31
+ reset(): void;
32
+ }
33
+ export declare const makeCaptureLookup: () => CaptureLookup;
34
+ export declare const sameSlotInstance: (expected: SlotInstanceRef, actual: SlotInstanceRef) => boolean;
35
+ export declare const sameNodeRef: (expected: NodeRef, actual: NodeRef) => boolean;
36
+ export declare const rootRef: (root: AnyComposition) => NodeRef;
37
+ export declare const nodeCaptureFor: (lookup: CaptureLookup, ref: NodeRef) => Option.Option<CapturedRender>;
38
+ export declare const slotCapturesFor: (lookup: CaptureLookup, parent: NodeRef, slotName: string) => ReadonlyArray<NodeCapture>;
39
+ export interface SettleProgress {
40
+ readonly previous: string;
41
+ readonly remaining: number;
42
+ readonly stable: boolean;
43
+ }
44
+ export declare const ensureSettled: (progress: SettleProgress) => Effect.Effect<void, never, never>;
45
+ export interface PumpStep {
46
+ readonly input: unknown;
47
+ readonly index: number;
48
+ }
49
+ export declare const childComposition: (child: AnySlotChild) => AnyComposition;
50
+ export declare const isUnknownRecord: (candidate: unknown) => candidate is Record<string, unknown>;
51
+ export declare const slotsOf: (comp: AnyComposition) => Record<string, AnySlot>;
52
+ export interface RuntimeSlotRead {
53
+ readonly runtime: RenderRuntime;
54
+ readonly slotDefinition: AnySlot;
55
+ readonly parent: AnyComposition;
56
+ }
57
+ export declare const readRuntimeSlotChild: ({ runtime, slotDefinition, parent }: RuntimeSlotRead) => AnySlotChild;
58
+ export declare const isSlotFill: (candidate: unknown) => candidate is SlotFill<unknown>;
59
+ export declare const structureFills: (structure: Structure<UiContract>) => Record<string, SlotFill<unknown>>;
60
+ export declare const enqueueFill: (parent: NodeRef, slotName: string, fill: SlotFill<unknown>, child: AnyComposition) => ReadonlyArray<Mounted>;
61
+ export declare const driveStructure: (comp: AnyComposition, structure: Structure<UiContract>, ref: NodeRef, sink: Sink, lookup: CaptureLookup, bindings: ReadonlyMap<AnySlot, AnyComposition>) => ReadonlyArray<Mounted>;
62
+ export declare const fingerprint: (lookup: CaptureLookup) => string;
63
+ //# sourceMappingURL=engineTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineTree.d.ts","sourceRoot":"","sources":["../src/engineTree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ import { Array as Arr, Context, Effect, Layer, Match, MutableRef, Option, Record as Rec } from 'effect';
2
+ import { isFeatureBinding, isSlot, publish, } from '@playfast/reform';
3
+ import { Bus, CaptureSink, } from '@playfast/reform/internal';
4
+ import { formatFingerprint } from './fingerprint.js';
5
+ import { eventsOf, SETTLE_MAX_RENDERS, uiNameOf, } from './engineSink.js';
6
+ export const proofLayer = (scene, sink) => {
7
+ const sceneLayer = scene.provide.reduce((merged, layer) => Layer.merge(merged, layer));
8
+ return Layer.merge(sceneLayer, Layer.succeed(CaptureSink, sink.api));
9
+ };
10
+ export const missingRuntimeBus = () => Effect.runSync(Effect.dieMessage('reform-proof: scene does not provide Bus'));
11
+ export const renderRuntimeFromContext = (context, instrumentation) => {
12
+ const bus = Context.getOption(context, Bus);
13
+ return {
14
+ dispatch: (priority, event) => Option.match(bus, {
15
+ onNone: missingRuntimeBus,
16
+ onSome: (service) => Effect.runSync(publish(priority, event).pipe(Effect.provideService(Bus, service))),
17
+ }),
18
+ instrumentation,
19
+ readOption: (tag) => Context.getOption(context, tag),
20
+ };
21
+ };
22
+ export const makeCaptureLookup = () => {
23
+ const captures = MutableRef.make([]);
24
+ return {
25
+ get captures() {
26
+ return MutableRef.get(captures);
27
+ },
28
+ record: (ref, capture) => {
29
+ MutableRef.update(captures, (current) => [...current, { ref, capture }]);
30
+ },
31
+ reset: () => {
32
+ MutableRef.set(captures, []);
33
+ },
34
+ };
35
+ };
36
+ export const sameSlotInstance = (expected, actual) => expected.name === actual.name &&
37
+ Option.match(expected.key, {
38
+ onNone: () => expected.index === actual.index,
39
+ onSome: (key) => expected.keyOccurrence === actual.keyOccurrence && Option.contains(actual.key, key),
40
+ });
41
+ export const sameNodeRef = (expected, actual) => expected.name === actual.name &&
42
+ Option.match(expected.parent, {
43
+ onNone: () => Option.isNone(actual.parent) && Option.isNone(actual.slot),
44
+ onSome: (expectedParent) => Option.isSome(actual.parent) &&
45
+ Option.isSome(expected.slot) &&
46
+ Option.isSome(actual.slot) &&
47
+ sameNodeRef(expectedParent, actual.parent.value) &&
48
+ sameSlotInstance(expected.slot.value, actual.slot.value),
49
+ });
50
+ export const rootRef = (root) => ({
51
+ name: uiNameOf(root),
52
+ parent: Option.none(),
53
+ slot: Option.none(),
54
+ });
55
+ export const nodeCaptureFor = (lookup, ref) => Option.map(Arr.findFirst(lookup.captures, (entry) => sameNodeRef(ref, entry.ref)), (entry) => entry.capture);
56
+ export const slotCapturesFor = (lookup, parent, slotName) => lookup.captures.filter((entry) => Option.isSome(entry.ref.parent) &&
57
+ Option.isSome(entry.ref.slot) &&
58
+ sameNodeRef(parent, entry.ref.parent.value) &&
59
+ entry.ref.slot.value.name === slotName);
60
+ export const ensureSettled = (progress) => {
61
+ if (progress.stable) {
62
+ return Effect.void;
63
+ }
64
+ return Effect.dieMessage(`reform-proof: tree did not settle after ${SETTLE_MAX_RENDERS} renders`);
65
+ };
66
+ export const childComposition = (child) => isFeatureBinding(child) ? child.capture((binding) => binding.composition) : child;
67
+ export const isUnknownRecord = (candidate) => typeof candidate === 'object' && candidate !== null && !Array.isArray(candidate);
68
+ export const slotsOf = (comp) => comp.capture((exact) => {
69
+ if (!('slots' in exact.manifest)) {
70
+ return {};
71
+ }
72
+ const candidate = exact.manifest.slots;
73
+ if (!isUnknownRecord(candidate)) {
74
+ return {};
75
+ }
76
+ return Rec.fromEntries(Rec.toEntries(candidate).flatMap(([name, slotDefinition]) => isSlot(slotDefinition) ? [[name, slotDefinition]] : []));
77
+ });
78
+ export const readRuntimeSlotChild = ({ runtime, slotDefinition, parent }) => slotDefinition.capture((exact) => Option.match(runtime.readOption(exact.provider), {
79
+ onNone: () => Effect.runSync(Effect.dieMessage(`reform-proof: slot provider missing in ${uiNameOf(parent)}`)),
80
+ onSome: (child) => child,
81
+ }));
82
+ // UiContract erases per-slot fill types here, so recover them by discriminant.
83
+ export const isSlotFill = (candidate) => typeof candidate === 'object' &&
84
+ candidate !== null &&
85
+ '_tag' in candidate &&
86
+ (candidate._tag === 'Each' || candidate._tag === 'One' || candidate._tag === 'Absent');
87
+ export const structureFills = (structure) => Rec.fromEntries(Rec.toEntries(structure.slots).flatMap(([slotName, fillValue]) => isSlotFill(fillValue) ? [[slotName, fillValue]] : []));
88
+ export const enqueueFill = (parent, slotName, fill, child) => Match.value(fill).pipe(Match.when({ _tag: 'Each' }, (each) => each.items.map((entry, index) => ({
89
+ comp: child,
90
+ props: entry.props,
91
+ ref: {
92
+ name: uiNameOf(child),
93
+ parent: Option.some(parent),
94
+ slot: Option.some({
95
+ name: slotName,
96
+ index,
97
+ key: Option.some(entry.key),
98
+ keyOccurrence: each.items
99
+ .slice(0, index)
100
+ .filter((candidate) => candidate.key === entry.key).length,
101
+ }),
102
+ },
103
+ }))), Match.when({ _tag: 'One' }, (oneFill) => [
104
+ {
105
+ comp: child,
106
+ props: oneFill.props,
107
+ ref: {
108
+ name: uiNameOf(child),
109
+ parent: Option.some(parent),
110
+ slot: Option.some({
111
+ name: slotName,
112
+ index: 0,
113
+ key: Option.some(`${slotName}.0`),
114
+ keyOccurrence: 0,
115
+ }),
116
+ },
117
+ },
118
+ ]), Match.when({ _tag: 'Absent' }, () => []), Match.exhaustive);
119
+ export const driveStructure = (comp, structure, ref, sink, lookup, bindings) => {
120
+ const key = Option.flatMap(ref.slot, (instance) => instance.key);
121
+ const capture = {
122
+ name: uiNameOf(comp),
123
+ props: structure.props,
124
+ events: eventsOf(structure),
125
+ ...(Option.isSome(key) ? { key: key.value } : {}),
126
+ };
127
+ sink.api.record(capture);
128
+ lookup.record(ref, capture);
129
+ const fills = structureFills(structure);
130
+ return Rec.toEntries(slotsOf(comp)).flatMap(([slotName, slotClass]) => {
131
+ const child = bindings.get(slotClass);
132
+ const fill = fills[slotName];
133
+ return child === undefined || fill === undefined ? [] : enqueueFill(ref, slotName, fill, child);
134
+ });
135
+ };
136
+ export const fingerprint = (lookup) => formatFingerprint(lookup.captures.map(({ ref, capture }) => [ref, capture.props]));
137
+ //# sourceMappingURL=engineTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineTree.js","sourceRoot":"","sources":["../src/engineTree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type HostRuntime, type Sink } from './engineSink.js';
2
+ import type { AnyComposition } from '@playfast/reform/internal';
3
+ import { type TreeDriver } from './engineTreeTypes.js';
4
+ export declare const makeTreeDriver: (runtime: HostRuntime, root: AnyComposition, rootProps: unknown, sink: Sink) => TreeDriver;
5
+ //# sourceMappingURL=engineTreeDriver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineTreeDriver.d.ts","sourceRoot":"","sources":["../src/engineTreeDriver.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,WAAW,EAKhB,KAAK,IAAI,EAEV,MAAM,cAAc,CAAA;AACrB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAA;AAS/D,OAAO,EAIL,KAAK,UAAU,EAIhB,MAAM,mBAAmB,CAAA;AAE1B,eAAO,MAAM,cAAc,GACzB,SAAS,WAAW,EACpB,MAAM,cAAc,EACpB,WAAW,OAAO,EAClB,MAAM,IAAI,KACT,UAiNF,CAAA"}
@@ -0,0 +1,187 @@
1
+ import { Effect, Match, Option, Record as Rec } from 'effect';
2
+ import { isFeatureBinding } from '@playfast/reform';
3
+ import { formatFingerprint } from './fingerprint.js';
4
+ import { eventsOf, renderCompositionRuntime, SETTLE_MAX_RENDERS, settleDrain, settleStep, uiNameOf, } from './engineSink.js';
5
+ import { ensureSettled, readRuntimeSlotChild, slotsOf, structureFills, } from './engineTree.js';
6
+ import { makeFeatureMountRegistry } from './engineMounts.js';
7
+ import { encodeIdentityPart, fillEntries, treeFingerprint, } from './engineTreeTypes.js';
8
+ export const makeTreeDriver = (runtime, root, rootProps, sink) => {
9
+ const status = { disposed: false };
10
+ const registry = makeFeatureMountRegistry(status);
11
+ const { disposeStale, mountId, retryMount } = registry;
12
+ const featureRecordForRender = registry.recordForRender;
13
+ const renderComposition = ({ runtime: currentRuntime, comp, props, key, path, depth, seen, mountMissing, }) => {
14
+ const endRenderSpan = sink.instrumentation.uiRendered(uiNameOf(comp));
15
+ const frame = renderCompositionRuntime(currentRuntime, comp, props);
16
+ endRenderSpan();
17
+ sink.api.record({
18
+ name: uiNameOf(comp),
19
+ props: frame.props,
20
+ events: eventsOf(frame),
21
+ ...(Option.isSome(key) ? { key: key.value } : {}),
22
+ });
23
+ const fills = structureFills(frame);
24
+ const renderedSlots = Rec.map(slotsOf(comp), (slotClass, slotName) => {
25
+ const fill = fills[slotName];
26
+ if (fill === undefined) {
27
+ return [];
28
+ }
29
+ const child = readRuntimeSlotChild({
30
+ runtime: currentRuntime,
31
+ slotDefinition: slotClass,
32
+ parent: comp,
33
+ });
34
+ return fillEntries(slotName, fill).flatMap((entry) => {
35
+ const childPath = `${path}${encodeIdentityPart(slotName)}${encodeIdentityPart(entry.key)}`;
36
+ if (!isFeatureBinding(child)) {
37
+ return [
38
+ renderComposition({
39
+ runtime: currentRuntime,
40
+ comp: child,
41
+ props: entry.props,
42
+ key: Option.some(entry.key),
43
+ path: childPath,
44
+ depth: depth + 1,
45
+ seen,
46
+ mountMissing,
47
+ }),
48
+ ];
49
+ }
50
+ const id = mountId({
51
+ parent: currentRuntime,
52
+ parentPath: path,
53
+ slotName,
54
+ key: entry.key,
55
+ binding: child,
56
+ });
57
+ seen.add(id);
58
+ const record = featureRecordForRender({
59
+ id,
60
+ parent: currentRuntime,
61
+ binding: child,
62
+ depth: depth + 1,
63
+ props: entry.props,
64
+ }, mountMissing);
65
+ if (record === undefined) {
66
+ return [];
67
+ }
68
+ return child.capture((binding) => Match.value(record.state).pipe(Match.when({ _tag: 'Live' }, (live) => [
69
+ renderComposition({
70
+ runtime: live.runtime,
71
+ comp: binding.composition,
72
+ props: entry.props,
73
+ key: Option.some(entry.key),
74
+ path: childPath,
75
+ depth: depth + 1,
76
+ seen,
77
+ mountMissing,
78
+ }),
79
+ ]), Match.when({ _tag: 'Failed' }, (failed) => Option.match(binding.placeholder, {
80
+ onNone: () => [],
81
+ onSome: (placeholder) => [
82
+ renderComposition({
83
+ runtime: currentRuntime,
84
+ comp: placeholder.failed,
85
+ props: {
86
+ error: failed.error,
87
+ retry: () => retryMount(record),
88
+ },
89
+ key: Option.some(entry.key),
90
+ path: `${childPath}/failed`,
91
+ depth: depth + 1,
92
+ seen,
93
+ mountMissing,
94
+ }),
95
+ ],
96
+ })), Match.when({ _tag: 'Loading' }, () => Option.match(binding.placeholder, {
97
+ onNone: () => [],
98
+ onSome: (placeholder) => [
99
+ renderComposition({
100
+ runtime: currentRuntime,
101
+ comp: placeholder.loading,
102
+ props: entry.props,
103
+ key: Option.some(entry.key),
104
+ path: `${childPath}/loading`,
105
+ depth: depth + 1,
106
+ seen,
107
+ mountMissing,
108
+ }),
109
+ ],
110
+ })), Match.exhaustive));
111
+ });
112
+ });
113
+ return {
114
+ path,
115
+ depth,
116
+ key,
117
+ comp,
118
+ props: frame.props,
119
+ events: eventsOf(frame),
120
+ slots: renderedSlots,
121
+ };
122
+ };
123
+ const render = () => {
124
+ // Discover the desired graph without acquiring missing Features, then release
125
+ // removed scopes deepest-first before the live pass mounts replacements.
126
+ sink.reset();
127
+ const retained = new Set();
128
+ renderComposition({
129
+ runtime,
130
+ comp: root,
131
+ props: rootProps,
132
+ key: Option.none(),
133
+ path: 'root',
134
+ depth: 0,
135
+ seen: retained,
136
+ mountMissing: false,
137
+ });
138
+ disposeStale(retained);
139
+ sink.reset();
140
+ const seen = new Set();
141
+ const rootNode = renderComposition({
142
+ runtime,
143
+ comp: root,
144
+ props: rootProps,
145
+ key: Option.none(),
146
+ path: 'root',
147
+ depth: 0,
148
+ seen,
149
+ mountMissing: true,
150
+ });
151
+ return {
152
+ root: rootNode,
153
+ fingerprint: formatFingerprint(treeFingerprint(rootNode)),
154
+ };
155
+ };
156
+ const settle = Effect.gen(function* () {
157
+ yield* settleDrain;
158
+ const first = render();
159
+ const progress = yield* Effect.iterate({
160
+ previous: first.fingerprint,
161
+ remaining: SETTLE_MAX_RENDERS,
162
+ stable: false,
163
+ }, {
164
+ while: (progress) => !progress.stable && progress.remaining > 0,
165
+ body: (progress) => Effect.gen(function* () {
166
+ yield* settleDrain;
167
+ yield* settleStep;
168
+ const current = render();
169
+ return {
170
+ previous: current.fingerprint,
171
+ remaining: progress.remaining - 1,
172
+ stable: current.fingerprint === progress.previous,
173
+ };
174
+ }),
175
+ });
176
+ yield* ensureSettled(progress);
177
+ });
178
+ const dispose = () => {
179
+ if (status.disposed) {
180
+ return;
181
+ }
182
+ status.disposed = true;
183
+ registry.disposeAll();
184
+ };
185
+ return { render, settle, dispose };
186
+ };
187
+ //# sourceMappingURL=engineTreeDriver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineTreeDriver.js","sourceRoot":"","sources":["../src/engineTreeDriver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import { type RuntimeHandle, type UiContract } from '@playfast/reform';
2
+ import { type RuntimeRootComposition, type Sink } from './engineSink.js';
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>;
5
+ //# sourceMappingURL=engineTreeFacade.d.ts.map
@@ -0,0 +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"}