@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,15 @@
1
+ import { Effect } from 'effect';
2
+ export declare const expect: <A>(actual: A) => {
3
+ toBe: (expected: A) => Effect.Effect<void>;
4
+ toEqual: (expected: A) => Effect.Effect<void>;
5
+ toContain: (expected: A extends ReadonlyArray<infer E> ? E : unknown) => Effect.Effect<void>;
6
+ toMatchObject: (expected: Partial<A>) => Effect.Effect<void>;
7
+ };
8
+ export declare const isRecord: (candidate: unknown) => candidate is Record<string, unknown>;
9
+ interface MatchInput {
10
+ readonly actual: unknown;
11
+ readonly expected: unknown;
12
+ }
13
+ export declare const matchProps: (input: MatchInput) => string | undefined;
14
+ export {};
15
+ //# sourceMappingURL=assert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../src/assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,MAAM,EAAyB,MAAM,QAAQ,CAAA;AAiBpE,eAAO,MAAM,MAAM,GAAI,CAAC,EAAE,QAAQ,CAAC;qBAChB,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;wBAIpB,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;0BAIrB,CAAC,SAAS,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,OAAO,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;8BAIhE,OAAO,CAAC,CAAC,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;CAI1D,CAAA;AAEF,eAAO,MAAM,QAAQ,GAAI,WAAW,OAAO,KAAG,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAC5B,CAAA;AAErD,UAAU,UAAU;IAClB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAA;IACxB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAC3B;AAsBD,eAAO,MAAM,UAAU,EAAE,CAAC,KAAK,EAAE,UAAU,KAAK,MAAM,GAAG,SAAwB,CAAA"}
package/dist/assert.js ADDED
@@ -0,0 +1,39 @@
1
+ import { Array as Arr, Effect, Option, Record as Rec } from 'effect';
2
+ import { AssertionFailed } from './errors.js';
3
+ import { formatFingerprint } from './fingerprint.js';
4
+ const show = (subject) => formatFingerprint(subject);
5
+ const deepEqual = ({ left, right }) => Object.is(left, right) || show(left) === show(right);
6
+ const fail = (message) => Effect.dieMessage(new AssertionFailed({ detail: message }).message);
7
+ export const expect = (actual) => ({
8
+ toBe: (expected) => Object.is(actual, expected)
9
+ ? Effect.void
10
+ : fail(`expected ${show(actual)} to be ${show(expected)}`),
11
+ toEqual: (expected) => deepEqual({ left: actual, right: expected })
12
+ ? Effect.void
13
+ : fail(`expected ${show(actual)} to equal ${show(expected)}`),
14
+ toContain: (expected) => Array.isArray(actual) && actual.some((element) => deepEqual({ left: element, right: expected }))
15
+ ? Effect.void
16
+ : fail(`expected ${show(actual)} to contain ${show(expected)}`),
17
+ toMatchObject: (expected) => {
18
+ const mismatch = matchPartial({ actual, expected });
19
+ return mismatch === undefined ? Effect.void : fail(mismatch);
20
+ },
21
+ });
22
+ export const isRecord = (candidate) => typeof candidate === 'object' && candidate !== null;
23
+ const matchPartial = ({ actual, expected }) => {
24
+ if (!isRecord(expected)) {
25
+ return deepEqual({ left: actual, right: expected })
26
+ ? undefined
27
+ : `expected ${show(actual)} to match ${show(expected)}`;
28
+ }
29
+ if (!isRecord(actual)) {
30
+ return `expected ${show(actual)} to be an object matching ${show(expected)}`;
31
+ }
32
+ const mismatch = Arr.findFirst(Rec.keys(expected), (key) => !deepEqual({ left: actual[key], right: expected[key] }));
33
+ return Option.match(mismatch, {
34
+ onNone: () => undefined,
35
+ onSome: (key) => `expected key ${show(key)} to match ${show(expected[key])}, got ${show(actual[key])}`,
36
+ });
37
+ };
38
+ export const matchProps = matchPartial;
39
+ //# sourceMappingURL=assert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assert.js","sourceRoot":"","sources":["../src/assert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import { Effect } from 'effect';
2
+ import type { ProofResult } from './proofCase.js';
3
+ import type { DriveResult } from './index.js';
4
+ import type { Proof } from './index.js';
5
+ export { makeSink } from './engineSink.js';
6
+ export type { Sink } from './engineSink.js';
7
+ export { proofLayer } from './engineTree.js';
8
+ export { makeFacade, makeProofFacade, makeRuntimeHandleFacade } from './engineMounted.js';
9
+ export type { MountedFacade, MountedSlotFacade, MountedSlotFacadesOf, } from './engineSink.js';
10
+ export { makeRuntimeTreeFacade } from './engineTreeFacade.js';
11
+ export type { RuntimeTreeFacade } from './engineTreeTypes.js';
12
+ export declare const executeProofEffect: (proof: Proof) => Effect.Effect<ProofResult, never, never>;
13
+ export declare const executeProof: (proof: Proof) => Promise<ProofResult>;
14
+ export declare const driveProofEffect: (proof: Proof) => Effect.Effect<DriveResult, never, never>;
15
+ export declare const driveProof: (proof: Proof) => Promise<DriveResult>;
16
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +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"}
package/dist/engine.js ADDED
@@ -0,0 +1,119 @@
1
+ import { Cause, Effect, Option, Record as Rec, Ref } from 'effect';
2
+ import { yieldWrapGet } from 'effect/Utils';
3
+ import { makeAppRuntime, sceneInstrumentation, } from '@playfast/reform';
4
+ import {} from '@playfast/reform/internal';
5
+ import { invalidCompositionProps, makeSink, messageOf, } from './engineSink.js';
6
+ import { childComposition, readRuntimeSlotChild, slotsOf } from './engineTree.js';
7
+ import { makeRuntimeTreeFacade } from './engineTreeFacade.js';
8
+ export { makeSink } from './engineSink.js';
9
+ export { proofLayer } from './engineTree.js';
10
+ export { makeFacade, makeProofFacade, makeRuntimeHandleFacade } from './engineMounted.js';
11
+ export { makeRuntimeTreeFacade } from './engineTreeFacade.js';
12
+ const proofRootProps = (composition) => Option.match(composition.parseProps({}), {
13
+ onNone: () => Effect.dieMessage(invalidCompositionProps(composition)),
14
+ onSome: Effect.succeed,
15
+ });
16
+ const withProofRuntimeTree = (scene, sink, dispatched, use) => Effect.acquireUseRelease(Effect.sync(() => makeAppRuntime(scene)), (runtime) => Effect.acquireUseRelease(Effect.gen(function* () {
17
+ const rootProps = yield* proofRootProps(scene.composition);
18
+ yield* Effect.sync(() => runtime.boot());
19
+ return makeRuntimeTreeFacade(runtime, scene.composition, rootProps, sink, dispatched);
20
+ }), (tree) => use(runtime, tree), (tree) => Effect.sync(tree.dispose)), (runtime) => Effect.sync(runtime.dispose));
21
+ const missingCoverage = (proof, dispatched) => Option.match(proof.requirement.manifest.events, {
22
+ onNone: () => [],
23
+ onSome: (declared) => declared.map(String).filter((event) => !dispatched.has(event)),
24
+ });
25
+ const compositionIdentity = (composition) => composition.capture((exact) => exact.identity);
26
+ const verifyProofPlacement = (proof, scene, runtime) => {
27
+ const expected = proof.requirement.manifest.composition;
28
+ if (proof.placement === 'Root' &&
29
+ Object.is(compositionIdentity(scene.composition), compositionIdentity(expected))) {
30
+ return Effect.void;
31
+ }
32
+ if (proof.placement === 'Slot') {
33
+ const matches = Rec.values(slotsOf(scene.composition)).some((slotClass) => {
34
+ const child = childComposition(readRuntimeSlotChild({
35
+ runtime,
36
+ slotDefinition: slotClass,
37
+ parent: scene.composition,
38
+ }));
39
+ return Object.is(compositionIdentity(child), compositionIdentity(expected));
40
+ });
41
+ if (matches) {
42
+ return Effect.void;
43
+ }
44
+ }
45
+ const location = proof.placement === 'Root' ? 'scene root' : 'direct scene slot';
46
+ return Effect.dieMessage(`reform-proof: requirement composition ${expected.manifest.name} is not the ${location} by definition identity`);
47
+ };
48
+ const executeProofWithSink = Effect.fn('executeProofWithSink')(function* (proof, scene, sink) {
49
+ const dispatched = new Set();
50
+ const statement = proof.requirement.manifest.statement;
51
+ const runGenerator = Effect.fn('runProofGenerator')(function* (generator, input, settleEffect) {
52
+ const next = generator.next(input);
53
+ if (next.done === true) {
54
+ return;
55
+ }
56
+ const output = yield* yieldWrapGet(next.value);
57
+ yield* settleEffect;
58
+ yield* runGenerator(generator, output, settleEffect);
59
+ });
60
+ return yield* withProofRuntimeTree(scene, sink, dispatched, (runtime, tree) => Effect.gen(function* () {
61
+ yield* verifyProofPlacement(proof, scene, runtime);
62
+ yield* tree.settle;
63
+ yield* runGenerator(proof.body(tree.facade), undefined, tree.settle);
64
+ const missing = missingCoverage(proof, dispatched);
65
+ const coverageError = `requirement declares events never dispatched: ${missing.join(', ')}`;
66
+ return missing.length > 0
67
+ ? { requirement: statement, ok: false, error: coverageError }
68
+ : { requirement: statement, ok: true, error: undefined };
69
+ })).pipe(Effect.catchAllCause((cause) => Effect.succeed({
70
+ requirement: statement,
71
+ ok: false,
72
+ error: messageOf(Cause.squash(cause)),
73
+ })));
74
+ });
75
+ export const executeProofEffect = (proof) => proof.capture((exact) => {
76
+ const sink = makeSink(sceneInstrumentation(exact.scene));
77
+ return executeProofWithSink(exact, exact.scene, sink);
78
+ });
79
+ export const executeProof = (proof) => Effect.runPromise(executeProofEffect(proof));
80
+ const driveProofWithSink = Effect.fn('driveProofWithSink')(function* (proof, scene, sink) {
81
+ const frames = yield* Ref.make([]);
82
+ const statement = proof.requirement.manifest.statement;
83
+ // Driving tracks dispatches for the facade without enforcing coverage.
84
+ const dispatched = new Set();
85
+ const record = (index) => Ref.update(frames, (current) => [...current, { index, captures: [...sink.captures] }]);
86
+ const pump = Effect.fn('pump')(function* (generator, step, settleEffect) {
87
+ const next = generator.next(step.input);
88
+ if (next.done === true) {
89
+ return;
90
+ }
91
+ const output = yield* yieldWrapGet(next.value);
92
+ yield* settleEffect;
93
+ yield* record(step.index);
94
+ yield* pump(generator, { input: output, index: step.index + 1 }, settleEffect);
95
+ });
96
+ return yield* withProofRuntimeTree(scene, sink, dispatched, (runtime, tree) => Effect.gen(function* () {
97
+ yield* verifyProofPlacement(proof, scene, runtime);
98
+ yield* tree.settle;
99
+ yield* record(0);
100
+ yield* pump(proof.body(tree.facade), { input: undefined, index: 1 }, tree.settle);
101
+ return {
102
+ requirement: statement,
103
+ frames: yield* Ref.get(frames),
104
+ ok: true,
105
+ error: undefined,
106
+ };
107
+ })).pipe(Effect.catchAllCause((cause) => Ref.get(frames).pipe(Effect.map((collected) => ({
108
+ requirement: statement,
109
+ frames: collected,
110
+ ok: false,
111
+ error: messageOf(Cause.squash(cause)),
112
+ })))));
113
+ });
114
+ export const driveProofEffect = (proof) => proof.capture((exact) => {
115
+ const sink = makeSink(sceneInstrumentation(exact.scene));
116
+ return driveProofWithSink(exact, exact.scene, sink);
117
+ });
118
+ export const driveProof = (proof) => Effect.runPromise(driveProofEffect(proof));
119
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,IAAI,GAAG,EAAE,GAAG,EAAE,MAAM,QAAQ,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAC3C,OAAO,EAGL,cAAc,EACd,oBAAoB,GAErB,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAsC,MAAM,2BAA2B,CAAA;AAC9E,OAAO,EACL,uBAAuB,EAEvB,QAAQ,EACR,SAAS,GAGV,MAAM,cAAc,CAAA;AACrB,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAE9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAO1D,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAA;AAEvC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAA;AACzC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAA;AAMtF,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAG1D,MAAM,cAAc,GAAG,CAOrB,WAAmD,EACnB,EAAE,CAClC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE;IACvC,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,uBAAuB,CAAC,WAAW,CAAC,CAAC;IACrE,MAAM,EAAE,MAAM,CAAC,OAAO;CACvB,CAAC,CAAA;AAEJ,MAAM,oBAAoB,GAAG,CAU3B,KAAoD,EACpD,IAAU,EACV,UAAuB,EACvB,GAAqF,EACzD,EAAE,CAC9B,MAAM,CAAC,iBAAiB,CACtB,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EACxC,CAAC,OAAO,EAAE,EAAE,CACV,MAAM,CAAC,iBAAiB,CACtB,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IAC1D,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAA;IACxC,OAAO,qBAAqB,CAAC,OAAO,EAAE,KAAK,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,EAAE,UAAU,CAAC,CAAA;AACvF,CAAC,CAAC,EACF,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,EAC5B,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CACpC,EACH,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAC1C,CAAA;AAEH,MAAM,eAAe,GAAG,CACtB,KAAiC,EACjC,UAAuB,EACA,EAAE,CACzB,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,EAAE;IAC9C,MAAM,EAAE,GAAG,EAAE,CAAC,EAAE;IAChB,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;CACrF,CAAC,CAAA;AAOJ,MAAM,mBAAmB,GAAG,CAAC,WAA2B,EAAU,EAAE,CAClE,WAAW,CAAC,OAAO,CAAS,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;AAExD,MAAM,oBAAoB,GAAG,CAC3B,KAAqB,EACrB,KAAe,EACf,OAAsB,EACa,EAAE;IACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAA;IACvD,IACE,KAAK,CAAC,SAAS,KAAK,MAAM;QAC1B,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,WAAW,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,EAChF,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAA;IACpB,CAAC;IACD,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;YACxE,MAAM,KAAK,GAAG,gBAAgB,CAC5B,oBAAoB,CAAC;gBACnB,OAAO;gBACP,cAAc,EAAE,SAAS;gBACzB,MAAM,EAAE,KAAK,CAAC,WAAW;aAC1B,CAAC,CACH,CAAA;YACD,OAAO,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAA;QAC7E,CAAC,CAAC,CAAA;QACF,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,MAAM,CAAC,IAAI,CAAA;QACpB,CAAC;IACH,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAA;IAChF,OAAO,MAAM,CAAC,UAAU,CACtB,yCAAyC,QAAQ,CAAC,QAAQ,CAAC,IAAI,eAAe,QAAQ,yBAAyB,CAChH,CAAA;AACH,CAAC,CAAA;AAED,MAAM,oBAAoB,GAAG,MAAM,CAAC,EAAE,CAAC,sBAAsB,CAAC,CAAC,QAAQ,CAAC,EAStE,KAAsD,EACtD,KAAoD,EACpD,IAAU;IAEV,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;IACpC,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAA;IACtD,MAAM,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,QAAQ,CAAC,EAC3D,SAAwC,EACxC,KAAc,EACd,YAA+C;QAE/C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAClC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACvB,OAAM;QACR,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC9C,KAAK,CAAC,CAAC,YAAY,CAAA;QACnB,KAAK,CAAC,CAAC,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,CAAA;IACtD,CAAC,CAAC,CAAA;IACF,OAAO,KAAK,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAC5E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,KAAK,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;QAClD,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;QAClB,KAAK,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACpE,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;QAClD,MAAM,aAAa,GAAG,iDAAiD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;QAC3F,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC;YACvB,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE;YAC7D,CAAC,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,CAAA;IAC5D,CAAC,CAAC,CACH,CAAC,IAAI,CACJ,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7B,MAAM,CAAC,OAAO,CAAC;QACb,WAAW,EAAE,SAAS;QACtB,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KACtC,CAAC,CACH,CACF,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,KAAY,EAA4C,EAAE,CAC3F,KAAK,CAAC,OAAO,CACX,CASE,KAAsD,EACZ,EAAE;IAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IACxD,OAAO,oBAAoB,CAAuC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;AAC7F,CAAC,CACF,CAAA;AAEH,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAY,EAAwB,EAAE,CACjE,MAAM,CAAC,UAAU,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAA;AAE9C,MAAM,kBAAkB,GAAG,MAAM,CAAC,EAAE,CAAC,oBAAoB,CAAC,CAAC,QAAQ,CAAC,EASlE,KAAsD,EACtD,KAAoD,EACpD,IAAU;IAEV,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,IAAI,CAA2B,EAAE,CAAC,CAAA;IAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,QAAQ,CAAC,SAAS,CAAA;IACtD,uEAAuE;IACvE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;IACpC,MAAM,MAAM,GAAG,CAAC,KAAa,EAAuB,EAAE,CACpD,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAA;IACxF,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,EACtC,SAAwC,EACxC,IAAc,EACd,YAA+C;QAE/C,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACvC,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACvB,OAAM;QACR,CAAC;QACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QAC9C,KAAK,CAAC,CAAC,YAAY,CAAA;QACnB,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACzB,KAAK,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,CAAA;IAChF,CAAC,CAAC,CAAA;IACF,OAAO,KAAK,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,CAC5E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QAClB,KAAK,CAAC,CAAC,oBAAoB,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;QAClD,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;QAClB,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;QAChB,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAA;QACjF,OAAO;YACL,WAAW,EAAE,SAAS;YACtB,MAAM,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;YAC9B,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,SAAS;SACjB,CAAA;IACH,CAAC,CAAC,CACH,CAAC,IAAI,CACJ,MAAM,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,EAAE,CAC7B,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAClB,MAAM,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACzB,WAAW,EAAE,SAAS;QACtB,MAAM,EAAE,SAAS;QACjB,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;KACtC,CAAC,CAAC,CACJ,CACF,CACF,CAAA;AACH,CAAC,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,KAAY,EAA4C,EAAE,CACzF,KAAK,CAAC,OAAO,CACX,CASE,KAAsD,EACZ,EAAE;IAC5C,MAAM,IAAI,GAAG,QAAQ,CAAC,oBAAoB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IACxD,OAAO,kBAAkB,CAAuC,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAA;AAC3F,CAAC,CACF,CAAA;AAEH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAY,EAAwB,EAAE,CAC/D,MAAM,CAAC,UAAU,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAA"}
@@ -0,0 +1,18 @@
1
+ import { Effect, ManagedRuntime } from 'effect';
2
+ import { type CapturedScene, type RuntimeHandle, type UiContract } from '@playfast/reform';
3
+ import { CaptureSink } from '@playfast/reform/internal';
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>): {
7
+ readonly facade: Facade<C, never>;
8
+ readonly settle: Effect.Effect<void, never, never>;
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>) => {
11
+ readonly facade: Facade<C, never>;
12
+ readonly settle: Effect.Effect<void, never, never>;
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>) => {
15
+ readonly facade: MountedFacade<C>;
16
+ readonly settle: Effect.Effect<void, never, never>;
17
+ };
18
+ //# sourceMappingURL=engineMounted.d.ts.map
@@ -0,0 +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"}
@@ -0,0 +1,96 @@
1
+ import { Array as Arr, Effect, ManagedRuntime, Option, TestClock } from 'effect';
2
+ import { NoTestClock, UnknownAction, UnknownSlot } from './errors.js';
3
+ import {} from '@playfast/reform';
4
+ import { CaptureSink } from '@playfast/reform/internal';
5
+ import { directSettle, expectMatchingProps, keyed, uiNameOf, } from './engineSink.js';
6
+ import { makeCaptureLookup, nodeCaptureFor, renderRuntimeFromContext, rootRef, slotCapturesFor, slotsOf, } from './engineTree.js';
7
+ import { collectRuntimeBindings, renderTreeRuntime, settleTreeRuntime, } from './engineRender.js';
8
+ export function makeFacade(runtime, scene, sink, dispatched) {
9
+ const context = runtime.runSync(Effect.context());
10
+ return makeMountedFacade(renderRuntimeFromContext(context, sink.instrumentation), scene.composition, sink, dispatched, (settlement) => Effect.promise(() => runtime.runPromise(settlement)));
11
+ }
12
+ function makeMountedFacade(runtime, root, sink, dispatched, settleBoundary) {
13
+ const bindings = collectRuntimeBindings(root, runtime);
14
+ const lookup = makeCaptureLookup();
15
+ const settle = settleBoundary(settleTreeRuntime(runtime, root, bindings, sink, lookup));
16
+ const rerender = renderTreeRuntime(runtime, root, bindings, sink, lookup);
17
+ // Move the scene's virtual clock, then settle the tree the woken fibers dirty.
18
+ // The clock is read off the runtime the scene's procedures run on, so adjusting it
19
+ // resumes their `Effect.sleep`s even though the proof body drives from outside.
20
+ const advance = (duration) => Option.match(runtime.readOption(TestClock.TestClock), {
21
+ onNone: () => Effect.dieMessage(new NoTestClock().message),
22
+ onSome: (clock) => clock.adjust(duration).pipe(Effect.flatMap(() => settle)),
23
+ });
24
+ const triggerOf = (ref, event) => Option.match(Option.flatMap(nodeCaptureFor(lookup, ref), (capture) => Option.fromNullable(capture.events[event])), {
25
+ onNone: () => Effect.dieMessage(new UnknownAction({
26
+ composition: ref.name,
27
+ action: event,
28
+ rendered: lookup.captures.filter((entry) => entry.ref.name === ref.name).length,
29
+ }).message),
30
+ onSome: Effect.succeed,
31
+ });
32
+ const propsFor = (ref) => Effect.map(rerender, () => Option.match(nodeCaptureFor(lookup, ref), {
33
+ onNone: () => undefined,
34
+ onSome: (capture) => capture.props,
35
+ }));
36
+ const nodeFacade = (ref, comp) => ({
37
+ props: propsFor(ref),
38
+ expectProps: (partial) => propsFor(ref).pipe(Effect.flatMap((props) => expectMatchingProps({ actual: props, expected: partial }))),
39
+ actions: keyed((event) => (payload) => rerender.pipe(Effect.flatMap(() => triggerOf(ref, event)), Effect.flatMap((trigger) => Effect.sync(() => {
40
+ dispatched.add(event);
41
+ trigger(payload);
42
+ })), Effect.flatMap(() => settle), Effect.flatMap(() => propsFor(ref)))),
43
+ slots: keyed((slotName) => slotFacade(ref, comp, slotName)),
44
+ frame: settle,
45
+ advance,
46
+ });
47
+ const slotFacade = (parentRef, parent, slotName) => {
48
+ const slotClass = slotsOf(parent)[slotName];
49
+ const child = slotClass && bindings.get(slotClass);
50
+ if (child === undefined) {
51
+ return Effect.runSync(Effect.dieMessage(new UnknownSlot({ parent: uiNameOf(parent), slot: slotName }).message));
52
+ }
53
+ const childName = uiNameOf(child);
54
+ const childRefAt = (index) => slotCapturesFor(lookup, parentRef, slotName)[index]?.ref ?? {
55
+ name: childName,
56
+ parent: Option.some(parentRef),
57
+ slot: Option.some({
58
+ name: slotName,
59
+ index,
60
+ key: Option.none(),
61
+ keyOccurrence: 0,
62
+ }),
63
+ };
64
+ const atIndex = (index) => Effect.as(rerender, nodeFacade(childRefAt(index), child));
65
+ const first = nodeFacade(childRefAt(0), child);
66
+ return {
67
+ first: atIndex(0),
68
+ at: atIndex,
69
+ all: Effect.map(rerender, () => slotCapturesFor(lookup, parentRef, slotName).map((entry) => nodeFacade(entry.ref, child))),
70
+ byKey: (key) => Effect.flatMap(rerender, () => Option.match(Arr.findFirst(slotCapturesFor(lookup, parentRef, slotName), (entry) => entry.capture.key === key), {
71
+ onNone: () => Effect.dieMessage(new UnknownSlot({
72
+ parent: uiNameOf(parent),
73
+ slot: `${slotName}[key=${key}]`,
74
+ }).message),
75
+ onSome: (entry) => Effect.succeed(nodeFacade(entry.ref, child)),
76
+ })),
77
+ where: (predicate) => Effect.map(rerender, () => slotCapturesFor(lookup, parentRef, slotName).flatMap((entry) => predicate(entry.capture.props) ? [nodeFacade(entry.ref, child)] : [])),
78
+ count: Effect.map(rerender, () => slotCapturesFor(lookup, parentRef, slotName).length),
79
+ props: first.props,
80
+ expectProps: first.expectProps,
81
+ actions: first.actions,
82
+ slots: first.slots,
83
+ frame: first.frame,
84
+ advance: first.advance,
85
+ };
86
+ };
87
+ return {
88
+ facade: nodeFacade(rootRef(root), root),
89
+ settle,
90
+ };
91
+ }
92
+ export const makeProofFacade = (runtime, scene, sink, dispatched) => {
93
+ return makeFacade(runtime, scene, sink, dispatched);
94
+ };
95
+ export const makeRuntimeHandleFacade = (runtime, root, sink, dispatched) => makeMountedFacade(runtime, root, sink, dispatched, directSettle);
96
+ //# sourceMappingURL=engineMounted.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineMounted.js","sourceRoot":"","sources":["../src/engineMounted.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type FeatureRecordInput, type MountIdentityInput, type TreeFeatureMount } from './engineTreeTypes.js';
2
+ export interface RegistryStatus {
3
+ disposed: boolean;
4
+ }
5
+ export interface FeatureMountRegistry {
6
+ readonly mountId: (input: MountIdentityInput) => string;
7
+ readonly retryMount: (record: TreeFeatureMount) => void;
8
+ readonly recordForRender: (input: FeatureRecordInput, mountMissing: boolean) => TreeFeatureMount | undefined;
9
+ readonly disposeStale: (seen: ReadonlySet<string>) => void;
10
+ readonly disposeAll: () => void;
11
+ }
12
+ export declare const makeFeatureMountRegistry: (status: RegistryStatus) => FeatureMountRegistry;
13
+ //# sourceMappingURL=engineMounts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineMounts.d.ts","sourceRoot":"","sources":["../src/engineMounts.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,gBAAgB,EACtB,MAAM,mBAAmB,CAAA;AAE1B,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,kBAAkB,KAAK,MAAM,CAAA;IACvD,QAAQ,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAA;IACvD,QAAQ,CAAC,eAAe,EAAE,CACxB,KAAK,EAAE,kBAAkB,EACzB,YAAY,EAAE,OAAO,KAClB,gBAAgB,GAAG,SAAS,CAAA;IACjC,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,KAAK,IAAI,CAAA;IAC1D,QAAQ,CAAC,UAAU,EAAE,MAAM,IAAI,CAAA;CAChC;AAGD,eAAO,MAAM,wBAAwB,GAAI,QAAQ,cAAc,KAAG,oBA2IjE,CAAA"}
@@ -0,0 +1,116 @@
1
+ import { Array as Arr, Order } from 'effect';
2
+ import { encodeIdentityPart, } from './engineTreeTypes.js';
3
+ // Owns every mounted Feature scope: identity, (re)mount attempts, and deepest-first teardown.
4
+ export const makeFeatureMountRegistry = (status) => {
5
+ const mounts = new Map();
6
+ const runtimeIds = new WeakMap();
7
+ const bindingIds = new WeakMap();
8
+ const sequence = { runtime: 0, binding: 0 };
9
+ const identity = (identities, subject, next) => {
10
+ const current = identities.get(subject);
11
+ if (current !== undefined) {
12
+ return current;
13
+ }
14
+ const created = next();
15
+ identities.set(subject, created);
16
+ return created;
17
+ };
18
+ const mountId = ({ parent, parentPath, slotName, key, binding }) => {
19
+ const runtimeId = identity(runtimeIds, parent, () => ++sequence.runtime);
20
+ const bindingId = identity(bindingIds, binding, () => ++sequence.binding);
21
+ return [String(runtimeId), parentPath, slotName, String(bindingId), key]
22
+ .map(encodeIdentityPart)
23
+ .join('');
24
+ };
25
+ const startMount = (record) => {
26
+ record.attempt += 1;
27
+ const attempt = record.attempt;
28
+ record.binding.capture((binding) => {
29
+ if (binding.strategy === 'default') {
30
+ record.state = { _tag: 'Live', runtime: record.parent };
31
+ binding.boot.forEach((event) => record.parent.dispatch('High', event));
32
+ record.dispose = () => { };
33
+ return;
34
+ }
35
+ record.state = { _tag: 'Loading' };
36
+ record.dispose = record.parent.mountAnyFeature(binding, {
37
+ props: record.props,
38
+ onLive: (childRuntime) => {
39
+ if (status.disposed || record.attempt !== attempt || mounts.get(record.id) !== record) {
40
+ return;
41
+ }
42
+ record.state = { _tag: 'Live', runtime: childRuntime };
43
+ },
44
+ onFailed: (error) => {
45
+ if (status.disposed || record.attempt !== attempt || mounts.get(record.id) !== record) {
46
+ return;
47
+ }
48
+ record.state = { _tag: 'Failed', error };
49
+ },
50
+ });
51
+ });
52
+ };
53
+ const retryMount = (record) => {
54
+ if (status.disposed || mounts.get(record.id) !== record || record.state._tag !== 'Failed') {
55
+ return;
56
+ }
57
+ record.dispose();
58
+ startMount(record);
59
+ };
60
+ const featureRecord = ({ id, parent, binding, depth, props, }) => {
61
+ const current = mounts.get(id);
62
+ if (current !== undefined && current.binding === binding && current.parent === parent) {
63
+ return current;
64
+ }
65
+ if (current !== undefined) {
66
+ current.attempt += 1;
67
+ current.dispose();
68
+ }
69
+ const created = {
70
+ id,
71
+ binding,
72
+ parent,
73
+ depth,
74
+ props,
75
+ attempt: 0,
76
+ state: { _tag: 'Loading' },
77
+ dispose: () => { },
78
+ };
79
+ mounts.set(id, created);
80
+ startMount(created);
81
+ return created;
82
+ };
83
+ const featureRecordForRender = (input, mountMissing) => {
84
+ const current = mounts.get(input.id);
85
+ if (current !== undefined || !mountMissing) {
86
+ return current;
87
+ }
88
+ return featureRecord(input);
89
+ };
90
+ const disposeStale = (seen) => {
91
+ Arr.sortWith(Array.from(mounts.values()).filter((record) => !seen.has(record.id)), (record) => -record.depth, Order.number).forEach((record) => {
92
+ mounts.delete(record.id);
93
+ record.attempt += 1;
94
+ record.dispose();
95
+ });
96
+ };
97
+ const disposeAll = () => {
98
+ if (status.disposed) {
99
+ return;
100
+ }
101
+ status.disposed = true;
102
+ Arr.sortWith(Array.from(mounts.values()), (record) => -record.depth, Order.number).forEach((record) => {
103
+ record.attempt += 1;
104
+ record.dispose();
105
+ });
106
+ mounts.clear();
107
+ };
108
+ return {
109
+ mountId,
110
+ retryMount,
111
+ recordForRender: featureRecordForRender,
112
+ disposeStale,
113
+ disposeAll,
114
+ };
115
+ };
116
+ //# sourceMappingURL=engineMounts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineMounts.js","sourceRoot":"","sources":["../src/engineMounts.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { Effect } from 'effect';
2
+ import type { AnyComposition, AnySlot } from '@playfast/reform/internal';
3
+ import { type RenderRuntime, type Sink } from './engineSink.js';
4
+ import { type CaptureLookup, type Mounted } from './engineTree.js';
5
+ export declare const collectRuntimeBindings: (root: AnyComposition, runtime: RenderRuntime) => Map<AnySlot, AnyComposition>;
6
+ export declare const renderMountedRuntime: (runtime: RenderRuntime, mounted: Mounted, bindings: ReadonlyMap<AnySlot, AnyComposition>, sink: Sink, lookup: CaptureLookup) => ReadonlyArray<Mounted>;
7
+ export declare const renderLevelRuntime: (runtime: RenderRuntime, frontier: ReadonlyArray<Mounted>, bindings: ReadonlyMap<AnySlot, AnyComposition>, sink: Sink, lookup: CaptureLookup) => void;
8
+ export declare const renderTreeRuntime: (runtime: RenderRuntime, root: AnyComposition, bindings: ReadonlyMap<AnySlot, AnyComposition>, sink: Sink, lookup: CaptureLookup) => Effect.Effect<void, never, never>;
9
+ export declare const settleTreeRuntime: (runtime: RenderRuntime, root: AnyComposition, bindings: ReadonlyMap<AnySlot, AnyComposition>, sink: Sink, lookup: CaptureLookup) => Effect.Effect<void, never, never>;
10
+ //# sourceMappingURL=engineRender.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineRender.d.ts","sourceRoot":"","sources":["../src/engineRender.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,QAAQ,CAAA;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,EACL,KAAK,aAAa,EAKlB,KAAK,IAAI,EAEV,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,KAAK,aAAa,EAKlB,KAAK,OAAO,EAKb,MAAM,cAAc,CAAA;AAErB,eAAO,MAAM,sBAAsB,GACjC,MAAM,cAAc,EACpB,SAAS,aAAa,KACrB,GAAG,CAAC,OAAO,EAAE,cAAc,CAoB7B,CAAA;AAED,eAAO,MAAM,oBAAoB,GAC/B,SAAS,aAAa,EACtB,SAAS,OAAO,EAChB,UAAU,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,EAC9C,MAAM,IAAI,EACV,QAAQ,aAAa,KACpB,aAAa,CAAC,OAAO,CAKvB,CAAA;AAED,eAAO,MAAM,kBAAkB,GAC7B,SAAS,aAAa,EACtB,UAAU,aAAa,CAAC,OAAO,CAAC,EAChC,UAAU,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,EAC9C,MAAM,IAAI,EACV,QAAQ,aAAa,KACpB,IAQF,CAAA;AAED,eAAO,MAAM,iBAAiB,GAC5B,SAAS,aAAa,EACtB,MAAM,cAAc,EACpB,UAAU,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,EAC9C,MAAM,IAAI,EACV,QAAQ,aAAa,KACpB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAW/B,CAAA;AAEJ,eAAO,MAAM,iBAAiB,EAAE,CAC9B,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE,cAAc,EACpB,QAAQ,EAAE,WAAW,CAAC,OAAO,EAAE,cAAc,CAAC,EAC9C,IAAI,EAAE,IAAI,EACV,MAAM,EAAE,aAAa,KAClB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAgCnC,CAAA"}
@@ -0,0 +1,64 @@
1
+ import { Effect, Record as Rec } from 'effect';
2
+ import { renderCompositionRuntime, SETTLE_MAX_RENDERS, settleDrain, settleStep, uiNameOf, } from './engineSink.js';
3
+ import { childComposition, driveStructure, ensureSettled, fingerprint, readRuntimeSlotChild, rootRef, slotsOf, } from './engineTree.js';
4
+ export const collectRuntimeBindings = (root, runtime) => {
5
+ const bindings = new Map();
6
+ const walk = (comp) => {
7
+ Rec.values(slotsOf(comp)).forEach((slotClass) => {
8
+ if (bindings.has(slotClass)) {
9
+ return;
10
+ }
11
+ const child = childComposition(readRuntimeSlotChild({
12
+ runtime,
13
+ slotDefinition: slotClass,
14
+ parent: comp,
15
+ }));
16
+ bindings.set(slotClass, child);
17
+ walk(child);
18
+ });
19
+ };
20
+ walk(root);
21
+ return bindings;
22
+ };
23
+ export const renderMountedRuntime = (runtime, mounted, bindings, sink, lookup) => {
24
+ const endRenderSpan = sink.instrumentation.uiRendered(uiNameOf(mounted.comp));
25
+ const frame = renderCompositionRuntime(runtime, mounted.comp, mounted.props);
26
+ endRenderSpan();
27
+ return driveStructure(mounted.comp, frame, mounted.ref, sink, lookup, bindings);
28
+ };
29
+ export const renderLevelRuntime = (runtime, frontier, bindings, sink, lookup) => {
30
+ if (frontier.length === 0) {
31
+ return;
32
+ }
33
+ const levels = frontier.map((mounted) => renderMountedRuntime(runtime, mounted, bindings, sink, lookup));
34
+ renderLevelRuntime(runtime, levels.flat(), bindings, sink, lookup);
35
+ };
36
+ export const renderTreeRuntime = (runtime, root, bindings, sink, lookup) => Effect.sync(() => {
37
+ sink.reset();
38
+ lookup.reset();
39
+ renderLevelRuntime(runtime, [{ comp: root, props: {}, ref: rootRef(root) }], bindings, sink, lookup);
40
+ });
41
+ export const settleTreeRuntime = Effect.fn('settleTreeRuntime')(function* (runtime, root, bindings, sink, lookup) {
42
+ yield* settleDrain;
43
+ yield* renderTreeRuntime(runtime, root, bindings, sink, lookup);
44
+ const progress = yield* Effect.iterate({
45
+ previous: fingerprint(lookup),
46
+ remaining: SETTLE_MAX_RENDERS,
47
+ stable: false,
48
+ }, {
49
+ while: (progress) => !progress.stable && progress.remaining > 0,
50
+ body: (progress) => Effect.gen(function* () {
51
+ yield* settleDrain;
52
+ yield* settleStep;
53
+ yield* renderTreeRuntime(runtime, root, bindings, sink, lookup);
54
+ const current = fingerprint(lookup);
55
+ return {
56
+ previous: current,
57
+ remaining: progress.remaining - 1,
58
+ stable: current === progress.previous,
59
+ };
60
+ }),
61
+ });
62
+ yield* ensureSettled(progress);
63
+ });
64
+ //# sourceMappingURL=engineRender.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engineRender.js","sourceRoot":"","sources":["../src/engineRender.ts"],"names":[],"mappings":"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"}