@myriadcodelabs/uiflow 0.2.0 → 0.2.1
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/README.md +5 -8
- package/code_generation_guidelines/uiflow_llm_guidelines.md +20 -18
- package/dist/flow.d.ts +32 -38
- package/dist/flow.d.ts.map +1 -1
- package/dist/flow.js +22 -30
- package/dist/flow.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -235,9 +235,8 @@ export function FlashcardsScreen({ deckId }: { deckId: string }) {
|
|
|
235
235
|
### `defineFlow(steps, { start })`
|
|
236
236
|
- Validates `start` exists in `steps`.
|
|
237
237
|
- Supports optional `channelTransitions` mapping (`channelKey -> resolver`).
|
|
238
|
-
- A resolver receives `{
|
|
239
|
-
- Supports optional `
|
|
240
|
-
- Supports optional `normalizeInitialData(data)` to normalize either caller input or flow-created defaults.
|
|
238
|
+
- A resolver receives `{ domain, internal, currentStep, events, channelKey }` and returns `nextStep | void` (sync/async).
|
|
239
|
+
- Supports optional `createInternalData()` for flow-owned internal state defaults.
|
|
241
240
|
- Returns flow definition consumed by `FlowRunner`.
|
|
242
241
|
|
|
243
242
|
Example:
|
|
@@ -269,15 +268,13 @@ const flow = defineFlow(
|
|
|
269
268
|
|
|
270
269
|
Props:
|
|
271
270
|
- `flow`: flow definition
|
|
272
|
-
- `initialData
|
|
271
|
+
- `initialData`: required domain data object (caller-owned input)
|
|
273
272
|
- `eventChannels?`: optional channels map
|
|
274
273
|
- `eventChannelsStrategy?`: `"sticky"` (default) or `"replace"`
|
|
275
274
|
|
|
276
275
|
Initialization behavior:
|
|
277
|
-
-
|
|
278
|
-
-
|
|
279
|
-
- If neither exists, runner throws.
|
|
280
|
-
- If `flow.normalizeInitialData` exists, it is applied to whichever data source is used.
|
|
276
|
+
- Runner always uses `initialData` as domain data.
|
|
277
|
+
- Runner initializes internal state from `flow.createInternalData()` when provided, otherwise `{}`.
|
|
281
278
|
|
|
282
279
|
Action-step render policy:
|
|
283
280
|
- Default: action step renders nothing while running.
|
|
@@ -36,10 +36,9 @@ Creates a shared channel object:
|
|
|
36
36
|
### `defineFlow(steps, { start })`
|
|
37
37
|
- Throws if `start` is missing or not present in `steps`.
|
|
38
38
|
- Supports optional `channelTransitions` map (`channel key -> transition`).
|
|
39
|
-
- Each transition is a resolver function returning `nextStep | void` (sync or async) with context `{
|
|
40
|
-
- Supports optional `
|
|
41
|
-
-
|
|
42
|
-
- Returns `{ steps, start, channelTransitions?, createInitialData?, normalizeInitialData? }`.
|
|
39
|
+
- Each transition is a resolver function returning `nextStep | void` (sync or async) with context `{ domain, internal, currentStep, events, channelKey }`.
|
|
40
|
+
- Supports optional `createInternalData()` for flow-owned internal defaults.
|
|
41
|
+
- Returns `{ steps, start, channelTransitions?, createInternalData? }`.
|
|
43
42
|
|
|
44
43
|
### `FlowRunner`
|
|
45
44
|
|
|
@@ -49,7 +48,7 @@ Creates a shared channel object:
|
|
|
49
48
|
|
|
50
49
|
Props:
|
|
51
50
|
- `flow`: result of `defineFlow`
|
|
52
|
-
- `initialData
|
|
51
|
+
- `initialData`: domain data for this flow instance
|
|
53
52
|
- `eventChannels` (optional): shared channels
|
|
54
53
|
- `eventChannelsStrategy` (optional): `"sticky"` (default) or `"replace"`
|
|
55
54
|
|
|
@@ -68,19 +67,19 @@ These details are required for correct generated code.
|
|
|
68
67
|
9. Any channel `emit` triggers FlowRunner re-render.
|
|
69
68
|
10. If `channelTransitions[channelKey]` is configured, channel `emit` evaluates resolver and transitions only when a valid step is returned.
|
|
70
69
|
11. Resolver functions can inspect channel state via `events?.[channelKey]?.get()` to apply conditional logic.
|
|
71
|
-
12. `initialData` is shallow-copied once at initialization
|
|
72
|
-
13.
|
|
73
|
-
14.
|
|
74
|
-
15.
|
|
75
|
-
16.
|
|
76
|
-
17.
|
|
77
|
-
18. Action steps
|
|
70
|
+
12. `initialData` is shallow-copied once at initialization as domain data.
|
|
71
|
+
13. Internal data is initialized from `createInternalData()` when provided; otherwise `{}`.
|
|
72
|
+
14. Domain/internal data are mutable inside steps; transitions force re-render by cloning both references.
|
|
73
|
+
15. If `onOutput` returns an unknown step name or `void`, FlowRunner stays on current step and re-renders.
|
|
74
|
+
16. Step errors are logged (`console.error`) and not rethrown.
|
|
75
|
+
17. Channel transition resolver errors are logged (`console.error`) and runner falls back to re-rendering current step.
|
|
76
|
+
18. Action steps render `null` by default while busy.
|
|
77
|
+
19. Action steps can optionally configure `render`:
|
|
78
78
|
- `mode: "preserve-previous"` keeps previous UI step rendered while action runs.
|
|
79
79
|
- `mode: "fallback"` renders provided fallback view while action runs.
|
|
80
|
-
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
- apply `flow.normalizeInitialData(...)` when defined.
|
|
80
|
+
20. Flow initialization order is:
|
|
81
|
+
- `FlowRunner.initialData` initializes domain data.
|
|
82
|
+
- `createInternalData()` initializes internal data when defined; otherwise internal data starts as `{}`.
|
|
84
83
|
|
|
85
84
|
## 5) Hard constraints for generated code
|
|
86
85
|
|
|
@@ -239,6 +238,9 @@ When asked to implement a new flow, produce:
|
|
|
239
238
|
6. No placeholders, no pseudocode, and no internal-path imports.
|
|
240
239
|
7. No no-op transitions: each emitted output must either update rendered UI, update meaningful state, or trigger a required side-effect represented in state.
|
|
241
240
|
|
|
241
|
+
No-domain-input pattern:
|
|
242
|
+
- If a flow has no caller-provided domain input, use `type DomainData = {}` and pass `initialData={{}}` to `FlowRunner`.
|
|
243
|
+
|
|
242
244
|
## 13) Minimum quality bar
|
|
243
245
|
|
|
244
246
|
Generated code must:
|
|
@@ -288,8 +290,8 @@ Goal:
|
|
|
288
290
|
Rules:
|
|
289
291
|
- Prefer the smallest implementation that satisfies requirements and remains readable.
|
|
290
292
|
- Do not add channels, event buses, or helper layers unless there is a concrete need (cross-flow coordination, shared subscriptions, replacement semantics, or lifecycle ownership requirements).
|
|
291
|
-
- Keep action/UI flags localized inside flow
|
|
292
|
-
- Do not require callers to pass step UI flags/messages via `FlowRunner.initialData`; define defaults in `defineFlow` using `
|
|
293
|
+
- Keep action/UI flags localized inside flow internal state (prefer step-scoped `ui` state such as `internal.ui.<stepName>.*`) rather than extending `FlowRunner` with app-specific flags/messages.
|
|
294
|
+
- Do not require callers to pass step UI flags/messages via `FlowRunner.initialData`; define defaults in `defineFlow` using `createInternalData()`, then maintain flags through step logic.
|
|
293
295
|
- If a local UI handler can perform a non-stateful side effect safely, prefer that over extra orchestration.
|
|
294
296
|
- Reuse established simple patterns already present in the codebase unless there is a documented reason to diverge.
|
|
295
297
|
|
package/dist/flow.d.ts
CHANGED
|
@@ -12,13 +12,14 @@ export declare function createFlowChannel<T>(initial: T): FlowChannel<T>;
|
|
|
12
12
|
* You can refine this to a generic later, e.g. <D>.
|
|
13
13
|
*/
|
|
14
14
|
export type FlowData = Record<string, any>;
|
|
15
|
-
export interface ChannelTransitionContext<
|
|
16
|
-
|
|
15
|
+
export interface ChannelTransitionContext<DD extends FlowData = FlowData, ID extends FlowData = FlowData> {
|
|
16
|
+
domain: DD;
|
|
17
|
+
internal: ID;
|
|
17
18
|
currentStep: string;
|
|
18
19
|
events?: EventChannels;
|
|
19
20
|
channelKey: string;
|
|
20
21
|
}
|
|
21
|
-
export type ChannelTransitionResolver<
|
|
22
|
+
export type ChannelTransitionResolver<DD extends FlowData = FlowData, ID extends FlowData = FlowData> = (context: ChannelTransitionContext<DD, ID>) => string | void | Promise<string | void>;
|
|
22
23
|
/**
|
|
23
24
|
* Output handle given to UI components.
|
|
24
25
|
* They call output.emit(...) when they're finished.
|
|
@@ -33,27 +34,28 @@ export interface OutputHandle<O = any> {
|
|
|
33
34
|
* - Receives `output` from the component via output.emit()
|
|
34
35
|
* - `onOutput` decides next step and can mutate data
|
|
35
36
|
*/
|
|
36
|
-
export interface UiStep<
|
|
37
|
-
input: (
|
|
37
|
+
export interface UiStep<DD extends FlowData = FlowData, ID extends FlowData = FlowData, I = any, O = any> {
|
|
38
|
+
input: (domain: DD, internal: ID, events?: EventChannels) => I;
|
|
38
39
|
view: React.ComponentType<{
|
|
39
40
|
input: I;
|
|
40
41
|
output: OutputHandle<O>;
|
|
41
42
|
}>;
|
|
42
|
-
onOutput: (
|
|
43
|
+
onOutput: (domain: DD, internal: ID, output: O, events?: EventChannels) => string | void | Promise<string | void>;
|
|
43
44
|
}
|
|
44
45
|
export type ActionRenderMode = "preserve-previous" | "fallback";
|
|
45
|
-
export interface ActionFallbackViewProps<
|
|
46
|
+
export interface ActionFallbackViewProps<DD extends FlowData = FlowData, ID extends FlowData = FlowData, I = any> {
|
|
46
47
|
input: I;
|
|
47
|
-
|
|
48
|
+
domain: DD;
|
|
49
|
+
internal: ID;
|
|
48
50
|
events?: EventChannels;
|
|
49
51
|
step: string;
|
|
50
52
|
busy: boolean;
|
|
51
53
|
}
|
|
52
|
-
export type ActionRenderConfig<
|
|
54
|
+
export type ActionRenderConfig<DD extends FlowData = FlowData, ID extends FlowData = FlowData, I = any> = {
|
|
53
55
|
mode: "preserve-previous";
|
|
54
56
|
} | {
|
|
55
57
|
mode: "fallback";
|
|
56
|
-
view: React.ComponentType<ActionFallbackViewProps<
|
|
58
|
+
view: React.ComponentType<ActionFallbackViewProps<DD, ID, I>>;
|
|
57
59
|
};
|
|
58
60
|
/**
|
|
59
61
|
* Action (logic) step:
|
|
@@ -62,17 +64,17 @@ export type ActionRenderConfig<D extends FlowData = FlowData, I = any> = {
|
|
|
62
64
|
* - `onOutput` decides next step and can mutate data
|
|
63
65
|
* - No UI
|
|
64
66
|
*/
|
|
65
|
-
export interface ActionStep<
|
|
66
|
-
input: (
|
|
67
|
-
action: (input: I,
|
|
68
|
-
onOutput: (
|
|
67
|
+
export interface ActionStep<DD extends FlowData = FlowData, ID extends FlowData = FlowData, I = any, O = any> {
|
|
68
|
+
input: (domain: DD, internal: ID, events?: EventChannels) => I;
|
|
69
|
+
action: (input: I, domain: DD, internal: ID, events?: EventChannels) => O | Promise<O>;
|
|
70
|
+
onOutput: (domain: DD, internal: ID, output: O, events?: EventChannels) => string | void | Promise<string | void>;
|
|
69
71
|
/**
|
|
70
72
|
* Optional action-time render behavior.
|
|
71
73
|
* - preserve-previous: keep previous UI step rendered while action runs.
|
|
72
74
|
* - fallback: render the provided fallback view while action runs.
|
|
73
75
|
* If omitted, action step renders nothing by default.
|
|
74
76
|
*/
|
|
75
|
-
render?: ActionRenderConfig<
|
|
77
|
+
render?: ActionRenderConfig<DD, ID, I>;
|
|
76
78
|
}
|
|
77
79
|
/**
|
|
78
80
|
* A flow step is either:
|
|
@@ -80,51 +82,43 @@ export interface ActionStep<D extends FlowData = FlowData, I = any, O = any> {
|
|
|
80
82
|
* - an action step (has `action`)
|
|
81
83
|
* but never both at the same time by convention.
|
|
82
84
|
*/
|
|
83
|
-
export type FlowStep<
|
|
85
|
+
export type FlowStep<DD extends FlowData = FlowData, ID extends FlowData = FlowData> = UiStep<DD, ID, any, any> | ActionStep<DD, ID, any, any>;
|
|
84
86
|
/**
|
|
85
87
|
* Map of step names -> step definitions.
|
|
86
88
|
*/
|
|
87
|
-
export type FlowSteps<
|
|
89
|
+
export type FlowSteps<DD extends FlowData = FlowData, ID extends FlowData = FlowData> = Record<string, FlowStep<DD, ID>>;
|
|
88
90
|
/**
|
|
89
91
|
* Flow definition object returned by defineFlow.
|
|
90
92
|
*/
|
|
91
|
-
export interface FlowDefinition<
|
|
92
|
-
steps: FlowSteps<
|
|
93
|
+
export interface FlowDefinition<DD extends FlowData = FlowData, ID extends FlowData = FlowData> {
|
|
94
|
+
steps: FlowSteps<DD, ID>;
|
|
93
95
|
start: string;
|
|
94
|
-
channelTransitions?: Record<string, ChannelTransitionResolver<
|
|
95
|
-
|
|
96
|
-
normalizeInitialData?: (data: D) => D;
|
|
96
|
+
channelTransitions?: Record<string, ChannelTransitionResolver<DD, ID>>;
|
|
97
|
+
createInternalData?: () => ID;
|
|
97
98
|
}
|
|
98
99
|
/**
|
|
99
100
|
* Options when defining a flow.
|
|
100
101
|
*/
|
|
101
|
-
export interface DefineFlowOptions<
|
|
102
|
+
export interface DefineFlowOptions<DD extends FlowData = FlowData, ID extends FlowData = FlowData> {
|
|
102
103
|
start: string;
|
|
103
104
|
/**
|
|
104
105
|
* Optional channel transition mapping.
|
|
105
106
|
* Each channel key maps to a resolver function with conditional logic
|
|
106
107
|
* that returns target step name (or void to stay).
|
|
107
108
|
*/
|
|
108
|
-
channelTransitions?: Record<string, ChannelTransitionResolver<
|
|
109
|
+
channelTransitions?: Record<string, ChannelTransitionResolver<DD, ID>>;
|
|
109
110
|
/**
|
|
110
|
-
* Optional factory for flow-
|
|
111
|
-
* Use this to keep internal flow flags/state owned by the flow definition.
|
|
111
|
+
* Optional factory for flow-owned internal state.
|
|
112
112
|
*/
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Optional normalizer applied to whichever data source is used:
|
|
116
|
-
* - caller-provided FlowRunner initialData, or
|
|
117
|
-
* - createInitialData() output
|
|
118
|
-
*/
|
|
119
|
-
normalizeInitialData?: (data: D) => D;
|
|
113
|
+
createInternalData?: () => ID;
|
|
120
114
|
}
|
|
121
115
|
/**
|
|
122
116
|
* Main entry point to define a flow.
|
|
123
117
|
*/
|
|
124
|
-
export declare function defineFlow<
|
|
125
|
-
export interface FlowRunnerProps<
|
|
126
|
-
flow: FlowDefinition<
|
|
127
|
-
initialData
|
|
118
|
+
export declare function defineFlow<DD extends FlowData = FlowData, ID extends FlowData = FlowData>(steps: FlowSteps<DD, ID>, options: DefineFlowOptions<DD, ID>): FlowDefinition<DD, ID>;
|
|
119
|
+
export interface FlowRunnerProps<DD extends FlowData = FlowData, ID extends FlowData = FlowData> {
|
|
120
|
+
flow: FlowDefinition<DD, ID>;
|
|
121
|
+
initialData: DD;
|
|
128
122
|
eventChannels?: EventChannels;
|
|
129
123
|
/**
|
|
130
124
|
* How FlowRunner treats incoming eventChannels across parent re-renders.
|
|
@@ -139,5 +133,5 @@ export interface FlowRunnerProps<D extends FlowData = FlowData> {
|
|
|
139
133
|
* - manages transitions
|
|
140
134
|
* - renders UI steps
|
|
141
135
|
*/
|
|
142
|
-
export declare function FlowRunner<
|
|
136
|
+
export declare function FlowRunner<DD extends FlowData = FlowData, ID extends FlowData = FlowData>(props: Readonly<FlowRunnerProps<DD, ID>>): import("react/jsx-runtime").JSX.Element | null;
|
|
143
137
|
//# sourceMappingURL=flow.d.ts.map
|
package/dist/flow.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../src/flow.tsx"],"names":[],"mappings":"AAIA,OAAO,KAAsC,MAAM,OAAO,CAAC;AAS3D,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;AAE9C,MAAM,WAAW,WAAW,CAAC,CAAC;IAE1B,GAAG,EAAE,MAAM,CAAC,CAAC;IAGb,IAAI,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC;IAGnC,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC;CACnD;AAID,MAAM,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;AAI7D,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAiB/D;AAMD;;;GAGG;AACH,MAAM,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAE3C,MAAM,WAAW,wBAAwB,
|
|
1
|
+
{"version":3,"file":"flow.d.ts","sourceRoot":"","sources":["../src/flow.tsx"],"names":[],"mappings":"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"}
|
package/dist/flow.js
CHANGED
|
@@ -31,8 +31,7 @@ export function defineFlow(steps, options) {
|
|
|
31
31
|
steps,
|
|
32
32
|
start: options.start,
|
|
33
33
|
channelTransitions: options.channelTransitions,
|
|
34
|
-
|
|
35
|
-
normalizeInitialData: options.normalizeInitialData,
|
|
34
|
+
createInternalData: options.createInternalData,
|
|
36
35
|
};
|
|
37
36
|
}
|
|
38
37
|
/**
|
|
@@ -74,27 +73,17 @@ export function FlowRunner(props) {
|
|
|
74
73
|
return candidate;
|
|
75
74
|
};
|
|
76
75
|
const resolvedEventChannels = getResolvedChannels();
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
if (provided !== undefined) {
|
|
81
|
-
candidate = provided;
|
|
82
|
-
}
|
|
83
|
-
else if (flow.createInitialData) {
|
|
84
|
-
candidate = flow.createInitialData();
|
|
85
|
-
}
|
|
86
|
-
else {
|
|
87
|
-
throw new Error("FlowRunner: initialData is required unless flow.createInitialData is provided.");
|
|
88
|
-
}
|
|
89
|
-
if (flow.normalizeInitialData) {
|
|
90
|
-
return flow.normalizeInitialData(candidate);
|
|
76
|
+
const resolveInternalData = () => {
|
|
77
|
+
if (flow.createInternalData) {
|
|
78
|
+
return flow.createInternalData();
|
|
91
79
|
}
|
|
92
|
-
return
|
|
80
|
+
return {};
|
|
93
81
|
};
|
|
94
82
|
// We keep data and currentStep in state so React re-renders on change.
|
|
95
83
|
const [state, setState] = useState({
|
|
96
84
|
currentStep: flow.start,
|
|
97
|
-
|
|
85
|
+
domain: { ...initialData },
|
|
86
|
+
internal: { ...resolveInternalData() },
|
|
98
87
|
});
|
|
99
88
|
const [busy, setBusy] = useState(false); // for action steps
|
|
100
89
|
const isMountedRef = useRef(true);
|
|
@@ -103,7 +92,7 @@ export function FlowRunner(props) {
|
|
|
103
92
|
// This state is never used directly.
|
|
104
93
|
// It only exists to force a re-render when event channels change.
|
|
105
94
|
const [_tick, setTick] = useState(0);
|
|
106
|
-
const { currentStep,
|
|
95
|
+
const { currentStep, domain, internal } = state;
|
|
107
96
|
const applyTransition = (nextStepName) => {
|
|
108
97
|
if (!isMountedRef.current)
|
|
109
98
|
return;
|
|
@@ -111,14 +100,16 @@ export function FlowRunner(props) {
|
|
|
111
100
|
setState((prev) => ({
|
|
112
101
|
...prev,
|
|
113
102
|
currentStep: nextStepName,
|
|
114
|
-
|
|
103
|
+
domain: { ...prev.domain }, // new references to trigger React updates (memo-safe)
|
|
104
|
+
internal: { ...prev.internal },
|
|
115
105
|
}));
|
|
116
106
|
}
|
|
117
107
|
else {
|
|
118
108
|
// no next step: just re-render with updated data if any
|
|
119
109
|
setState((prev) => ({
|
|
120
110
|
...prev,
|
|
121
|
-
|
|
111
|
+
domain: { ...prev.domain },
|
|
112
|
+
internal: { ...prev.internal },
|
|
122
113
|
}));
|
|
123
114
|
}
|
|
124
115
|
};
|
|
@@ -130,7 +121,8 @@ export function FlowRunner(props) {
|
|
|
130
121
|
}
|
|
131
122
|
try {
|
|
132
123
|
const nextStep = await transition({
|
|
133
|
-
|
|
124
|
+
domain,
|
|
125
|
+
internal,
|
|
134
126
|
currentStep,
|
|
135
127
|
events: resolvedEventChannels,
|
|
136
128
|
channelKey,
|
|
@@ -177,9 +169,9 @@ export function FlowRunner(props) {
|
|
|
177
169
|
(async () => {
|
|
178
170
|
try {
|
|
179
171
|
setBusy(true);
|
|
180
|
-
const input = actionStep.input(state.
|
|
181
|
-
const output = await actionStep.action(input, state.
|
|
182
|
-
const next = await actionStep.onOutput(state.
|
|
172
|
+
const input = actionStep.input(state.domain, state.internal, resolvedEventChannels);
|
|
173
|
+
const output = await actionStep.action(input, state.domain, state.internal, resolvedEventChannels);
|
|
174
|
+
const next = await actionStep.onOutput(state.domain, state.internal, output, resolvedEventChannels);
|
|
183
175
|
applyTransition(next);
|
|
184
176
|
}
|
|
185
177
|
catch (e) {
|
|
@@ -214,7 +206,7 @@ export function FlowRunner(props) {
|
|
|
214
206
|
if (isPreviousUiStep) {
|
|
215
207
|
const uiStep = previousStep;
|
|
216
208
|
const ViewComponent = uiStep.view;
|
|
217
|
-
const input = uiStep.input(
|
|
209
|
+
const input = uiStep.input(domain, internal, resolvedEventChannels);
|
|
218
210
|
const outputHandle = {
|
|
219
211
|
emit: () => {
|
|
220
212
|
// While action is active, previous view stays visual-only.
|
|
@@ -225,8 +217,8 @@ export function FlowRunner(props) {
|
|
|
225
217
|
}
|
|
226
218
|
if (actionRender && actionRender.mode === "fallback") {
|
|
227
219
|
const FallbackView = actionRender.view;
|
|
228
|
-
const input = actionStep.input(
|
|
229
|
-
return (_jsx(FallbackView, { input: input,
|
|
220
|
+
const input = actionStep.input(domain, internal, resolvedEventChannels);
|
|
221
|
+
return (_jsx(FallbackView, { input: input, domain: domain, internal: internal, events: resolvedEventChannels, step: currentStep, busy: busy }));
|
|
230
222
|
}
|
|
231
223
|
// Default action rendering behavior is intentionally empty.
|
|
232
224
|
return null;
|
|
@@ -236,11 +228,11 @@ export function FlowRunner(props) {
|
|
|
236
228
|
// -----------------------
|
|
237
229
|
const uiStep = step;
|
|
238
230
|
const ViewComponent = uiStep.view;
|
|
239
|
-
const input = uiStep.input(
|
|
231
|
+
const input = uiStep.input(domain, internal, resolvedEventChannels);
|
|
240
232
|
const outputHandle = {
|
|
241
233
|
emit: async (output) => {
|
|
242
234
|
try {
|
|
243
|
-
const next = await uiStep.onOutput(
|
|
235
|
+
const next = await uiStep.onOutput(domain, internal, output, resolvedEventChannels);
|
|
244
236
|
applyTransition(next);
|
|
245
237
|
}
|
|
246
238
|
catch (e) {
|
package/dist/flow.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../src/flow.tsx"],"names":[],"mappings":";AAAA,uDAAuD;AACvD,gDAAgD;AAEhD,eAAe;AACf,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AA0B3D,wCAAwC;AACxC,6EAA6E;AAC7E,MAAM,UAAU,iBAAiB,CAAI,OAAU;IAC3C,IAAI,KAAK,GAAG,OAAO,CAAC;IACpB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAc,CAAC;IAExC,OAAO;QACH,GAAG,EAAE,GAAG,EAAE,CAAC,KAAK;QAEhB,IAAI,EAAE,CAAC,MAAkB,EAAE,EAAE;YACzB,KAAK,GAAG,OAAO,MAAM,KAAK,UAAU,CAAC,CAAC,CAAE,MAAsB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;YAC/E,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,yBAAyB;QAC5D,CAAC;QAED,SAAS,EAAE,CAAC,QAAoB,EAAE,EAAE;YAChC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC5C,CAAC;KACJ,CAAC;AACN,CAAC;
|
|
1
|
+
{"version":3,"file":"flow.js","sourceRoot":"","sources":["../src/flow.tsx"],"names":[],"mappings":"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"}
|