@playfast/reform-proof 1.2.0 → 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.
- package/dist/assert.d.ts +15 -0
- package/dist/assert.d.ts.map +1 -0
- package/dist/assert.js +39 -0
- package/dist/assert.js.map +1 -0
- package/dist/engine.d.ts +16 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +119 -0
- package/dist/engine.js.map +1 -0
- package/dist/engineMounted.d.ts +18 -0
- package/dist/engineMounted.d.ts.map +1 -0
- package/dist/engineMounted.js +96 -0
- package/dist/engineMounted.js.map +1 -0
- package/dist/engineMounts.d.ts +13 -0
- package/dist/engineMounts.d.ts.map +1 -0
- package/dist/engineMounts.js +116 -0
- package/dist/engineMounts.js.map +1 -0
- package/dist/engineRender.d.ts +10 -0
- package/dist/engineRender.d.ts.map +1 -0
- package/dist/engineRender.js +64 -0
- package/dist/engineRender.js.map +1 -0
- package/dist/engineSink.d.ts +66 -0
- package/dist/engineSink.d.ts.map +1 -0
- package/dist/engineSink.js +72 -0
- package/dist/engineSink.js.map +1 -0
- package/dist/engineTree.d.ts +63 -0
- package/dist/engineTree.d.ts.map +1 -0
- package/dist/engineTree.js +137 -0
- package/dist/engineTree.js.map +1 -0
- package/dist/engineTreeDriver.d.ts +5 -0
- package/dist/engineTreeDriver.d.ts.map +1 -0
- package/dist/engineTreeDriver.js +187 -0
- package/dist/engineTreeDriver.js.map +1 -0
- package/dist/engineTreeFacade.d.ts +5 -0
- package/dist/engineTreeFacade.d.ts.map +1 -0
- package/dist/engineTreeFacade.js +105 -0
- package/dist/engineTreeFacade.js.map +1 -0
- package/dist/engineTreeTypes.d.ts +80 -0
- package/dist/engineTreeTypes.d.ts.map +1 -0
- package/dist/engineTreeTypes.js +11 -0
- package/dist/engineTreeTypes.js.map +1 -0
- package/dist/errors.d.ts +39 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +30 -0
- package/dist/errors.js.map +1 -0
- package/dist/facade.d.ts +54 -0
- package/dist/facade.d.ts.map +1 -0
- package/dist/facade.js +2 -0
- package/dist/facade.js.map +1 -0
- package/dist/fingerprint.d.ts +2 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +55 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/index.d.ts +88 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +73 -0
- package/dist/index.js.map +1 -0
- package/dist/product.d.ts +56 -0
- package/dist/product.d.ts.map +1 -0
- package/dist/product.js +35 -0
- package/dist/product.js.map +1 -0
- package/dist/proofCase.d.ts +24 -0
- package/dist/proofCase.d.ts.map +1 -0
- package/dist/proofCase.js +2 -0
- package/dist/proofCase.js.map +1 -0
- package/dist/runner.d.ts +15 -0
- package/dist/runner.d.ts.map +1 -0
- package/dist/runner.js +13 -0
- package/dist/runner.js.map +1 -0
- package/package.json +17 -5
- package/src/assert.ts +65 -0
- package/src/engine.ts +30 -1402
- package/src/engineMounted.ts +271 -0
- package/src/engineMounts.ts +165 -0
- package/src/engineRender.ts +136 -0
- package/src/engineSink.ts +195 -0
- package/src/engineTree.ts +298 -0
- package/src/engineTreeDriver.ts +247 -0
- package/src/engineTreeFacade.ts +183 -0
- package/src/engineTreeTypes.ts +103 -0
- package/src/errors.ts +19 -0
- package/src/facade.ts +78 -0
- package/src/index.ts +61 -276
- package/src/product.ts +108 -0
- package/src/proofCase.ts +46 -0
- package/src/test-clock.test.ts +135 -0
package/dist/assert.d.ts
ADDED
|
@@ -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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"}
|
package/dist/engine.d.ts
ADDED
|
@@ -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":"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"}
|
|
@@ -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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"}
|