@getrheo/flow-runtime 1.0.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/agentPrompt/index.d.ts +72 -0
- package/dist/agentPrompt/index.js +739 -0
- package/dist/agentPrompt/index.js.map +1 -0
- package/dist/aiFlowGenerationMerge.d.ts +32 -0
- package/dist/aiFlowGenerationMerge.js +120 -0
- package/dist/aiFlowGenerationMerge.js.map +1 -0
- package/dist/animations.d.ts +110 -0
- package/dist/animations.js +312 -0
- package/dist/animations.js.map +1 -0
- package/dist/assignment.d.ts +7 -0
- package/dist/assignment.js +25 -0
- package/dist/assignment.js.map +1 -0
- package/dist/brandGradient.d.ts +57 -0
- package/dist/brandGradient.js +137 -0
- package/dist/brandGradient.js.map +1 -0
- package/dist/brandGradientManifestIssues.d.ts +11 -0
- package/dist/brandGradientManifestIssues.js +302 -0
- package/dist/brandGradientManifestIssues.js.map +1 -0
- package/dist/buildFlowPreview.d.ts +7 -0
- package/dist/buildFlowPreview.js +81 -0
- package/dist/buildFlowPreview.js.map +1 -0
- package/dist/buttonVariantChrome.d.ts +26 -0
- package/dist/buttonVariantChrome.js +59 -0
- package/dist/buttonVariantChrome.js.map +1 -0
- package/dist/checkboxGlyphStyle.d.ts +31 -0
- package/dist/checkboxGlyphStyle.js +241 -0
- package/dist/checkboxGlyphStyle.js.map +1 -0
- package/dist/choiceOptionSelection.d.ts +11 -0
- package/dist/choiceOptionSelection.js +120 -0
- package/dist/choiceOptionSelection.js.map +1 -0
- package/dist/colorAlpha.d.ts +8 -0
- package/dist/colorAlpha.js +48 -0
- package/dist/colorAlpha.js.map +1 -0
- package/dist/counterLayer.d.ts +42 -0
- package/dist/counterLayer.js +95 -0
- package/dist/counterLayer.js.map +1 -0
- package/dist/decisionEval.d.ts +27 -0
- package/dist/decisionEval.js +197 -0
- package/dist/decisionEval.js.map +1 -0
- package/dist/dropShadow.d.ts +26 -0
- package/dist/dropShadow.js +76 -0
- package/dist/dropShadow.js.map +1 -0
- package/dist/emailPasswordAuthValidation.d.ts +16 -0
- package/dist/emailPasswordAuthValidation.js +25 -0
- package/dist/emailPasswordAuthValidation.js.map +1 -0
- package/dist/flowBuilderRules.d.ts +15 -0
- package/dist/flowBuilderRules.js +368 -0
- package/dist/flowBuilderRules.js.map +1 -0
- package/dist/flowGraph.d.ts +19 -0
- package/dist/flowGraph.js +373 -0
- package/dist/flowGraph.js.map +1 -0
- package/dist/hyperlinkLabel.d.ts +19 -0
- package/dist/hyperlinkLabel.js +232 -0
- package/dist/hyperlinkLabel.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.js +4200 -0
- package/dist/index.js.map +1 -0
- package/dist/interpolateTemplate.d.ts +44 -0
- package/dist/interpolateTemplate.js +188 -0
- package/dist/interpolateTemplate.js.map +1 -0
- package/dist/layerRotate.d.ts +10 -0
- package/dist/layerRotate.js +9 -0
- package/dist/layerRotate.js.map +1 -0
- package/dist/layerTypography.d.ts +36 -0
- package/dist/layerTypography.js +68 -0
- package/dist/layerTypography.js.map +1 -0
- package/dist/layers.d.ts +69 -0
- package/dist/layers.js +257 -0
- package/dist/layers.js.map +1 -0
- package/dist/layout/index.d.ts +57 -0
- package/dist/layout/index.js +151 -0
- package/dist/layout/index.js.map +1 -0
- package/dist/manifestBillingSlice.d.ts +17 -0
- package/dist/manifestBillingSlice.js +102 -0
- package/dist/manifestBillingSlice.js.map +1 -0
- package/dist/prepareAiGeneratedScreen.d.ts +17 -0
- package/dist/prepareAiGeneratedScreen.js +99 -0
- package/dist/prepareAiGeneratedScreen.js.map +1 -0
- package/dist/publish-exports.json +166 -0
- package/dist/responsive/breakpoints.d.ts +34 -0
- package/dist/responsive/breakpoints.js +52 -0
- package/dist/responsive/breakpoints.js.map +1 -0
- package/dist/responsive/index.d.ts +8 -0
- package/dist/responsive/index.js +307 -0
- package/dist/responsive/index.js.map +1 -0
- package/dist/responsive/layerResolve.d.ts +43 -0
- package/dist/responsive/layerResolve.js +168 -0
- package/dist/responsive/layerResolve.js.map +1 -0
- package/dist/responsive/merge.d.ts +19 -0
- package/dist/responsive/merge.js +74 -0
- package/dist/responsive/merge.js.map +1 -0
- package/dist/responsive/previewSafeAreaInsets.d.ts +14 -0
- package/dist/responsive/previewSafeAreaInsets.js +24 -0
- package/dist/responsive/previewSafeAreaInsets.js.map +1 -0
- package/dist/responsive/screenContainerResolve.d.ts +11 -0
- package/dist/responsive/screenContainerResolve.js +122 -0
- package/dist/responsive/screenContainerResolve.js.map +1 -0
- package/dist/responsive/screenShellInsets.d.ts +11 -0
- package/dist/responsive/screenShellInsets.js +26 -0
- package/dist/responsive/screenShellInsets.js.map +1 -0
- package/dist/restingMotion.d.ts +167 -0
- package/dist/restingMotion.js +484 -0
- package/dist/restingMotion.js.map +1 -0
- package/dist/rheoAgentManifestMerge.d.ts +33 -0
- package/dist/rheoAgentManifestMerge.js +55 -0
- package/dist/rheoAgentManifestMerge.js.map +1 -0
- package/dist/scaleInputStyle.d.ts +35 -0
- package/dist/scaleInputStyle.js +77 -0
- package/dist/scaleInputStyle.js.map +1 -0
- package/dist/scaleValidation.d.ts +9 -0
- package/dist/scaleValidation.js +21 -0
- package/dist/scaleValidation.js.map +1 -0
- package/dist/stateMachine.d.ts +105 -0
- package/dist/stateMachine.js +674 -0
- package/dist/stateMachine.js.map +1 -0
- package/dist/stepResponse-BXgoZ7o-.d.ts +112 -0
- package/dist/textInputValidation.d.ts +14 -0
- package/dist/textInputValidation.js +46 -0
- package/dist/textInputValidation.js.map +1 -0
- package/dist/translationPlaceholders.d.ts +9 -0
- package/dist/translationPlaceholders.js +52 -0
- package/dist/translationPlaceholders.js.map +1 -0
- package/dist/validation.d.ts +31 -0
- package/dist/validation.js +233 -0
- package/dist/validation.js.map +1 -0
- package/package.json +242 -0
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { migrateLegacyManifest, FlowManifestSchema } from '@getrheo/contracts';
|
|
2
|
+
import { isInputLayer, OS_PERMISSION_OUTCOME_END, OS_PERMISSION_OUTCOME_CONTINUE } from '@getrheo/contracts/layers';
|
|
3
|
+
import { EXTERNAL_SURFACE_NO_NEXT } from '@getrheo/contracts/decisions';
|
|
4
|
+
import '@getrheo/contracts/localized';
|
|
5
|
+
|
|
6
|
+
// src/validation.ts
|
|
7
|
+
var walkLayers = (root, fn) => {
|
|
8
|
+
const visit = (l, depth) => {
|
|
9
|
+
fn(l, depth);
|
|
10
|
+
if (l.kind === "stack") l.children.forEach((c) => visit(c, depth + 1));
|
|
11
|
+
else if (l.kind === "carousel") l.slides.forEach((c) => visit(c, depth + 1));
|
|
12
|
+
else if (l.kind === "button") l.children.forEach((c) => visit(c, depth + 1));
|
|
13
|
+
else if (l.kind === "back_button") l.children.forEach((c) => visit(c, depth + 1));
|
|
14
|
+
else if (l.kind === "hyperlink") l.children.forEach((c) => visit(c, depth + 1));
|
|
15
|
+
else if (l.kind === "single_choice" || l.kind === "multiple_choice") {
|
|
16
|
+
l.children.forEach((c) => visit(c, depth + 1));
|
|
17
|
+
} else if (l.kind === "text_input" || l.kind === "scale_input") {
|
|
18
|
+
l.children?.forEach((c) => visit(c, depth + 1));
|
|
19
|
+
} else if (l.kind === "oauth_login") {
|
|
20
|
+
l.children.forEach((c) => visit(c, depth + 1));
|
|
21
|
+
} else if (l.kind === "oauth_provider" && l.variant === "custom") {
|
|
22
|
+
l.children.forEach((c) => visit(c, depth + 1));
|
|
23
|
+
} else if (l.kind === "email_password_auth") {
|
|
24
|
+
l.children.forEach((c) => visit(c, depth + 1));
|
|
25
|
+
} else if (l.kind === "email_password_field") {
|
|
26
|
+
l.children?.forEach((c) => visit(c, depth + 1));
|
|
27
|
+
} else if (l.kind === "email_password_submit") {
|
|
28
|
+
l.children.forEach((c) => visit(c, depth + 1));
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
visit(root, 0);
|
|
32
|
+
};
|
|
33
|
+
var walkScreen = (screen, fn) => {
|
|
34
|
+
if (screen.regions.header) walkLayers(screen.regions.header, fn);
|
|
35
|
+
walkLayers(screen.regions.body, fn);
|
|
36
|
+
if (screen.regions.footer) walkLayers(screen.regions.footer, fn);
|
|
37
|
+
};
|
|
38
|
+
var findInputLayer = (screen) => {
|
|
39
|
+
let found = null;
|
|
40
|
+
walkScreen(screen, (l) => {
|
|
41
|
+
if (!found && isInputLayer(l)) found = l;
|
|
42
|
+
});
|
|
43
|
+
return found;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
// src/validation.ts
|
|
47
|
+
var validateManifest = (data) => {
|
|
48
|
+
const migrated = migrateLegacyManifest(data);
|
|
49
|
+
const result = FlowManifestSchema.safeParse(migrated);
|
|
50
|
+
if (result.success) return { ok: true, manifest: result.data };
|
|
51
|
+
return {
|
|
52
|
+
ok: false,
|
|
53
|
+
issues: result.error.issues.map((i) => {
|
|
54
|
+
const screenIdx = i.path[1];
|
|
55
|
+
const screenId = typeof screenIdx === "number" && Array.isArray(data?.screens) ? data.screens[screenIdx]?.id : void 0;
|
|
56
|
+
return {
|
|
57
|
+
stepId: screenId ?? null,
|
|
58
|
+
path: [...i.path],
|
|
59
|
+
message: i.message,
|
|
60
|
+
code: i.code
|
|
61
|
+
};
|
|
62
|
+
})
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
var validatePublishable = (manifest) => {
|
|
66
|
+
const issues = [];
|
|
67
|
+
const warnings = [];
|
|
68
|
+
if (manifest.screens.length === 0) {
|
|
69
|
+
issues.push({
|
|
70
|
+
path: ["screens"],
|
|
71
|
+
message: "flow must have at least one screen",
|
|
72
|
+
code: "flow.no_screens"
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
if (manifest.entryScreenId == null && manifest.screens.length > 0) {
|
|
76
|
+
issues.push({
|
|
77
|
+
path: ["entryScreenId"],
|
|
78
|
+
message: "flow entry is not connected \u2014 connect the entry node on the canvas to a screen, decision, or integration step before publishing",
|
|
79
|
+
code: "flow.no_entry"
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const screenMap = new Map(
|
|
83
|
+
manifest.screens.map((s) => [s.id, s])
|
|
84
|
+
);
|
|
85
|
+
const decisionMap = new Map((manifest.decisionNodes ?? []).map((d) => [d.id, d]));
|
|
86
|
+
const surfaceMap = new Map((manifest.externalSurfaceNodes ?? []).map((s) => [s.id, s]));
|
|
87
|
+
const enqueueGraphNode = (t) => {
|
|
88
|
+
if (t === null || t === void 0) return;
|
|
89
|
+
if (screenMap.has(t) || decisionMap.has(t) || surfaceMap.has(t)) {
|
|
90
|
+
queue.push(t);
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
const reachable = /* @__PURE__ */ new Set();
|
|
94
|
+
const queue = [];
|
|
95
|
+
if (manifest.entryScreenId != null) {
|
|
96
|
+
queue.push(manifest.entryScreenId);
|
|
97
|
+
}
|
|
98
|
+
let canTerminate = false;
|
|
99
|
+
while (queue.length) {
|
|
100
|
+
const id = queue.shift();
|
|
101
|
+
if (reachable.has(id)) continue;
|
|
102
|
+
reachable.add(id);
|
|
103
|
+
const decision = decisionMap.get(id);
|
|
104
|
+
if (decision) {
|
|
105
|
+
for (const c of decision.cases) {
|
|
106
|
+
if (c.next != null) enqueueGraphNode(c.next);
|
|
107
|
+
}
|
|
108
|
+
if (decision.elseNext != null) enqueueGraphNode(decision.elseNext);
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
const surface = surfaceMap.get(id);
|
|
112
|
+
if (surface) {
|
|
113
|
+
const outcomeTargets = Object.values(surface.outcomes);
|
|
114
|
+
if (outcomeTargets.some((t) => t === EXTERNAL_SURFACE_NO_NEXT) || surface.fallback === EXTERNAL_SURFACE_NO_NEXT) {
|
|
115
|
+
canTerminate = true;
|
|
116
|
+
}
|
|
117
|
+
if (surface.fallback != null && surface.fallback !== EXTERNAL_SURFACE_NO_NEXT) {
|
|
118
|
+
enqueueGraphNode(surface.fallback);
|
|
119
|
+
}
|
|
120
|
+
for (const t of outcomeTargets) {
|
|
121
|
+
if (t != null && t !== EXTERNAL_SURFACE_NO_NEXT) enqueueGraphNode(t);
|
|
122
|
+
}
|
|
123
|
+
continue;
|
|
124
|
+
}
|
|
125
|
+
const screen = screenMap.get(id);
|
|
126
|
+
if (!screen) continue;
|
|
127
|
+
const targets = [];
|
|
128
|
+
targets.push(screen.next.default);
|
|
129
|
+
const input = findInputLayer(screen);
|
|
130
|
+
if (input && (input.kind === "single_choice" || input.kind === "multiple_choice") && input.branching.enabled) {
|
|
131
|
+
for (const c of input.branching.conditions) targets.push(c.goTo);
|
|
132
|
+
}
|
|
133
|
+
walkScreen(screen, (l) => {
|
|
134
|
+
if (l.kind === "button" && l.action.kind === "go_to_step") {
|
|
135
|
+
targets.push(l.action.screenId);
|
|
136
|
+
}
|
|
137
|
+
if (l.kind === "button" && l.action.kind === "end_flow") {
|
|
138
|
+
targets.push(null);
|
|
139
|
+
}
|
|
140
|
+
if (l.kind === "button" && l.action.kind === "request_app_review") {
|
|
141
|
+
targets.push(screen.next.default);
|
|
142
|
+
}
|
|
143
|
+
if (l.kind === "button" && l.action.kind === "request_os_permission") {
|
|
144
|
+
const o = l.action.outcomes;
|
|
145
|
+
for (const t of [o.granted, o.denied, o.blocked]) {
|
|
146
|
+
if (t === OS_PERMISSION_OUTCOME_END) {
|
|
147
|
+
targets.push(null);
|
|
148
|
+
} else if (t === OS_PERMISSION_OUTCOME_CONTINUE) {
|
|
149
|
+
targets.push(screen.next.default);
|
|
150
|
+
} else {
|
|
151
|
+
targets.push(t);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
if (l.kind === "button" && l.action.kind === "go_back_one_screen" && l.action.fallbackScreenId) {
|
|
156
|
+
targets.push(l.action.fallbackScreenId);
|
|
157
|
+
}
|
|
158
|
+
if (l.kind === "back_button" && l.fallbackScreenId) {
|
|
159
|
+
targets.push(l.fallbackScreenId);
|
|
160
|
+
}
|
|
161
|
+
});
|
|
162
|
+
if (targets.every((t) => t === null || t === void 0)) {
|
|
163
|
+
canTerminate = true;
|
|
164
|
+
}
|
|
165
|
+
for (const t of targets) {
|
|
166
|
+
if (t === null || t === void 0) {
|
|
167
|
+
canTerminate = true;
|
|
168
|
+
} else {
|
|
169
|
+
enqueueGraphNode(t);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (manifest.entryScreenId != null && !canTerminate) {
|
|
174
|
+
issues.push({
|
|
175
|
+
path: ["screens"],
|
|
176
|
+
message: "no path from entry screen reaches completion",
|
|
177
|
+
code: "flow.no_completion_path"
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
for (const screen of manifest.screens) {
|
|
181
|
+
if (manifest.entryScreenId != null && !reachable.has(screen.id)) {
|
|
182
|
+
warnings.push({
|
|
183
|
+
stepId: screen.id,
|
|
184
|
+
path: ["screens", screen.id],
|
|
185
|
+
message: `screen "${screen.id}" is not reachable from entry`,
|
|
186
|
+
code: "screen.unreachable"
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
for (const sn of manifest.externalSurfaceNodes ?? []) {
|
|
191
|
+
if (manifest.entryScreenId != null && !reachable.has(sn.id)) {
|
|
192
|
+
warnings.push({
|
|
193
|
+
stepId: null,
|
|
194
|
+
path: ["externalSurfaceNodes", sn.id],
|
|
195
|
+
message: `external surface "${sn.name ?? sn.id}" is not reachable from entry`,
|
|
196
|
+
code: "external_surface.unreachable"
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
for (const dn of manifest.decisionNodes ?? []) {
|
|
201
|
+
if (manifest.entryScreenId != null && !reachable.has(dn.id)) {
|
|
202
|
+
warnings.push({
|
|
203
|
+
stepId: null,
|
|
204
|
+
path: ["decisionNodes", dn.id],
|
|
205
|
+
message: `decision "${dn.id}" is not reachable from entry`,
|
|
206
|
+
code: "decision.unreachable"
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
for (const c of dn.cases) {
|
|
210
|
+
if (c.next == null) {
|
|
211
|
+
issues.push({
|
|
212
|
+
stepId: null,
|
|
213
|
+
path: ["decisionNodes", dn.id, "cases", c.id],
|
|
214
|
+
message: `decision "${dn.id}" segment "${c.name ?? c.id}" must have a next step before publishing`,
|
|
215
|
+
code: "decision.incomplete_branches"
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
if (dn.elseNext == null) {
|
|
220
|
+
issues.push({
|
|
221
|
+
stepId: null,
|
|
222
|
+
path: ["decisionNodes", dn.id, "elseNext"],
|
|
223
|
+
message: `decision "${dn.id}" needs an "everyone else" branch connected before publishing`,
|
|
224
|
+
code: "decision.incomplete_branches"
|
|
225
|
+
});
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
return { ok: issues.length === 0, issues, warnings };
|
|
229
|
+
};
|
|
230
|
+
|
|
231
|
+
export { validateManifest, validatePublishable };
|
|
232
|
+
//# sourceMappingURL=validation.js.map
|
|
233
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/layers.ts","../src/validation.ts"],"names":[],"mappings":"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","file":"validation.js","sourcesContent":["import type { Branding } from '@getrheo/contracts/dashboard';\nimport type { FlowManifest, Theme } from '@getrheo/contracts/manifest';\nimport type { Screen } from '@getrheo/contracts/screens';\nimport {\n brandGradientFromThemedColor,\n brandGradientNativeLinear,\n brandGradientSolidFallback,\n isStoredLinearGradientCss,\n nativeLinearFromAngleAndStops,\n parseLinearGradientCss,\n resolveBrandGradientToken,\n type BrandGradientNativeLinear,\n} from './brandGradient';\nimport type {\n InputLayer,\n Layer,\n MultipleChoiceLayer,\n ScaleInputLayer,\n SingleChoiceLayer,\n StackLayer,\n TextInputLayer,\n ThemedColor,\n} from '@getrheo/contracts/layers';\nimport type { LocalizedText } from '@getrheo/contracts/localized';\nimport { resolveLocalizedText } from '@getrheo/contracts/localized';\nimport { isInputLayer } from '@getrheo/contracts/layers';\n\n/** Walk a layer tree depth-first. */\nexport const walkLayers = (root: Layer, fn: (l: Layer, depth: number) => void): void => {\n const visit = (l: Layer, depth: number): void => {\n fn(l, depth);\n if (l.kind === 'stack') l.children.forEach((c) => visit(c, depth + 1));\n else if (l.kind === 'carousel') l.slides.forEach((c) => visit(c, depth + 1));\n else if (l.kind === 'button') l.children.forEach((c) => visit(c, depth + 1));\n else if (l.kind === 'back_button') l.children.forEach((c) => visit(c, depth + 1));\n else if (l.kind === 'hyperlink') l.children.forEach((c) => visit(c, depth + 1));\n else if (l.kind === 'single_choice' || l.kind === 'multiple_choice') {\n l.children.forEach((c) => visit(c, depth + 1));\n } else if (l.kind === 'text_input' || l.kind === 'scale_input') {\n l.children?.forEach((c) => visit(c, depth + 1));\n } else if (l.kind === 'oauth_login') {\n l.children.forEach((c) => visit(c, depth + 1));\n } else if (l.kind === 'oauth_provider' && l.variant === 'custom') {\n l.children.forEach((c) => visit(c, depth + 1));\n } else if (l.kind === 'email_password_auth') {\n l.children.forEach((c) => visit(c, depth + 1));\n } else if (l.kind === 'email_password_field') {\n l.children?.forEach((c) => visit(c, depth + 1));\n } else if (l.kind === 'email_password_submit') {\n l.children.forEach((c) => visit(c, depth + 1));\n }\n };\n visit(root, 0);\n};\n\n/** Walk every layer in a screen's regions (header → body → footer). */\nexport const walkScreen = (screen: Screen, fn: (l: Layer) => void): void => {\n if (screen.regions.header) walkLayers(screen.regions.header, fn);\n walkLayers(screen.regions.body, fn);\n if (screen.regions.footer) walkLayers(screen.regions.footer, fn);\n};\n\n/** Find the screen's lone input layer (if any). Schema enforces ≤1. */\nexport const findInputLayer = (screen: Screen): InputLayer | null => {\n let found: InputLayer | null = null;\n walkScreen(screen, (l) => {\n if (!found && isInputLayer(l)) found = l;\n });\n return found;\n};\n\n/** Input kinds that use a screen draft and require an explicit Continue to submit. */\nexport const findManualSubmitInputLayer = (\n screen: Screen,\n): MultipleChoiceLayer | TextInputLayer | ScaleInputLayer | null => {\n const input = findInputLayer(screen);\n if (!input) return null;\n if (input.kind === 'multiple_choice' || input.kind === 'text_input' || input.kind === 'scale_input') {\n return input;\n }\n return null;\n};\n\n/**\n * Whether the screen contains any Button layer that submits the screen\n * (i.e. `action.kind === 'continue'`). Used by input layers to decide\n * between auto-submit-on-tap (legacy behaviour for choice-only screens)\n * and writing into the screen-level draft for a Button to submit.\n */\nexport const screenHasContinueButton = (screen: Screen): boolean => {\n let found = false;\n walkScreen(screen, (l) => {\n if (l.kind === 'button' && l.action.kind === 'continue') found = true;\n });\n return found;\n};\n\n/**\n * Resolve a choice layer's option stack by stable optionId via its\n * binding. Returns null when the binding is missing or the bound child\n * was removed (manifest validation rejects that, but runtime stays safe).\n */\nexport const findOptionStackForChoice = (\n layer: SingleChoiceLayer | MultipleChoiceLayer,\n optionId: string,\n): StackLayer | null => {\n const binding = layer.optionBindings.find((b) => b.optionId === optionId);\n if (!binding) return null;\n const stack = layer.children.find((c) => c.id === binding.rootLayerId);\n return stack ?? null;\n};\n\n/**\n * Best-effort textual label for a choice option, used by interpolation\n * (e.g. `{{ goal }}` rendering the chosen option's label) and by editor\n * surfaces that show option rows. Walks the option's child subtree\n * depth-first and returns the first `text` layer's content; falls back\n * to the option's stable id when no text is present.\n */\nexport const choiceOptionLabel = (\n layer: SingleChoiceLayer | MultipleChoiceLayer,\n optionId: string,\n locale: string,\n): string => {\n const stack = findOptionStackForChoice(layer, optionId);\n if (!stack) return '';\n let foundText: LocalizedText | null = null;\n walkLayers(stack, (l) => {\n if (foundText) return;\n if (l.kind === 'text') foundText = l.text;\n });\n if (foundText) return resolveLocalizedText(foundText, locale);\n return optionId;\n};\n\n/** Find a layer in a screen by id, including nested children/slides. */\nexport const findLayerById = (screen: Screen, id: string): Layer | null => {\n let found: Layer | null = null;\n walkScreen(screen, (l) => {\n if (!found && l.id === id) found = l;\n });\n return found;\n};\n\n/** Collect all input fieldKeys across a manifest. */\nexport const collectFieldKeys = (manifest: FlowManifest): { fieldKey: string; screenId: string }[] => {\n const out: { fieldKey: string; screenId: string }[] = [];\n for (const screen of manifest.screens) {\n walkScreen(screen as unknown as Screen, (l) => {\n if (isInputLayer(l)) out.push({ fieldKey: l.fieldKey, screenId: screen.id });\n if (l.kind === 'checkbox') out.push({ fieldKey: l.fieldKey, screenId: screen.id });\n if (l.kind === 'email_password_auth') {\n out.push({ fieldKey: l.fieldKey, screenId: screen.id });\n }\n });\n }\n return out;\n};\n\n/**\n * Pick a snake_case field key starting from `base` that is not in `used`\n * (e.g. `text` → `text_2` → `text_3` when `text` is taken).\n */\nexport const nextUniqueFieldKey = (base: string, used: Iterable<string>): string => {\n const set = used instanceof Set ? used : new Set(used);\n if (!set.has(base)) return base;\n let n = 2;\n while (set.has(`${base}_${n}`)) n += 1;\n return `${base}_${n}`;\n};\n\n/**\n * Resolve a token reference like `$primary` to a literal value from `theme`.\n * Pass-through for non-token strings; returns undefined for `undefined`.\n */\nexport const resolveTokens = <T extends string | undefined>(\n theme: Theme | undefined,\n value: T,\n): T | string => {\n if (value === undefined) return value;\n if (typeof value !== 'string' || !value.startsWith('$')) return value;\n const key = value.slice(1) as keyof Theme;\n const literal = theme?.[key];\n if (typeof literal === 'string') return literal;\n return value;\n};\n\n/**\n * Resolve a layer color for the current appearance (`light` | `dark`).\n * Plain string uses `resolveTokens` for both modes (legacy). Object form\n * picks `light` / `dark` with fallback to the other key when one is omitted.\n */\nexport const resolveThemedColor = (\n theme: Theme | undefined,\n palette: 'light' | 'dark',\n value: ThemedColor | undefined,\n): string | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === 'string') return resolveTokens(theme, value) as string;\n const raw = palette === 'dark' ? (value.dark ?? value.light) : (value.light ?? value.dark);\n if (raw === undefined) return undefined;\n return resolveTokens(theme, raw) as string;\n};\n\n/**\n * Resolve a themed value used for CSS `background` (or RN background fill).\n * Supports `$brandGradient:<uuid>` when branding presets are provided; other values match {@link resolveThemedColor}.\n */\nexport const resolveThemedBackground = (\n theme: Theme | undefined,\n branding: Branding | undefined,\n palette: 'light' | 'dark',\n value: ThemedColor | undefined,\n): string | undefined => {\n if (value === undefined) return undefined;\n if (typeof value === 'string') {\n if (value.startsWith('$brandGradient:')) {\n return resolveBrandGradientToken(branding, value);\n }\n return resolveTokens(theme, value) as string;\n }\n const raw = palette === 'dark' ? (value.dark ?? value.light) : (value.light ?? value.dark);\n if (raw === undefined) return undefined;\n if (raw.startsWith('$brandGradient:')) {\n return resolveBrandGradientToken(branding, raw);\n }\n return resolveTokens(theme, raw) as string;\n};\n\nexport const nativeBrandBackgroundFromThemedColor = (\n theme: Theme | undefined,\n branding: Branding | undefined,\n palette: 'light' | 'dark',\n value: ThemedColor | undefined,\n): { solid?: string; linear?: BrandGradientNativeLinear } => {\n const preset = brandGradientFromThemedColor(branding, palette, value);\n if (preset) {\n const lin = brandGradientNativeLinear(preset);\n if (lin) return { linear: lin };\n return { solid: brandGradientSolidFallback(preset) };\n }\n const bg = resolveThemedBackground(theme, branding, palette, value) as string | undefined;\n if (!bg) return {};\n const parsed = parseLinearGradientCss(bg);\n if (parsed) {\n return {\n linear: nativeLinearFromAngleAndStops(\n parsed.angleDeg,\n parsed.stops.map((s) => ({ color: s.color, offsetPct: s.offsetPct })),\n ),\n };\n }\n if (isStoredLinearGradientCss(bg)) {\n const first = bg.match(/#[0-9a-fA-F]{3,8}/);\n return { solid: first ? first[0] : '#808080' };\n }\n return { solid: bg };\n};\n","import type { z } from 'zod';\nimport { FlowManifestSchema, migrateLegacyManifest } from '@getrheo/contracts';\nimport type { FlowManifest } from '@getrheo/contracts';\nimport type { Screen } from '@getrheo/contracts/screens';\nimport { OS_PERMISSION_OUTCOME_CONTINUE, OS_PERMISSION_OUTCOME_END } from '@getrheo/contracts/layers';\nimport { EXTERNAL_SURFACE_NO_NEXT } from '@getrheo/contracts/decisions';\nimport { findInputLayer, walkScreen } from './layers';\n\nexport type ManifestValidationIssue = {\n /** Screen id when the issue is screen-scoped, null otherwise. Field name kept as `stepId` for back-compat with API/dashboard wire types. */\n stepId?: string | null;\n path: (string | number)[];\n message: string;\n code: string;\n};\n\nexport const validateManifest = (\n data: unknown,\n):\n | { ok: true; manifest: FlowManifest }\n | { ok: false; issues: ManifestValidationIssue[] } => {\n const migrated = migrateLegacyManifest(data);\n const result = FlowManifestSchema.safeParse(migrated);\n if (result.success) return { ok: true, manifest: result.data };\n return {\n ok: false,\n issues: result.error.issues.map((i: z.ZodIssue) => {\n const screenIdx = i.path[1];\n const screenId =\n typeof screenIdx === 'number' && Array.isArray((data as FlowManifest)?.screens)\n ? (data as FlowManifest).screens[screenIdx]?.id\n : undefined;\n return {\n stepId: screenId ?? null,\n path: [...i.path],\n message: i.message,\n code: i.code,\n };\n }),\n };\n};\n\nexport type ValidatePublishableResult = {\n /** False when there are blocking {@link issues} (empty flow or no completion path). */\n ok: boolean;\n /** Blocking publish issues. */\n issues: ManifestValidationIssue[];\n /**\n * Non-blocking notices (e.g. screens not on any path from entry). The runtime\n * only serves the reachable subgraph; orphans stay in the draft but are not shown.\n */\n warnings: ManifestValidationIssue[];\n};\n\n/** Publish-time gate. Runs semantic checks beyond the schema. */\nexport const validatePublishable = (manifest: FlowManifest): ValidatePublishableResult => {\n const issues: ManifestValidationIssue[] = [];\n const warnings: ManifestValidationIssue[] = [];\n\n if (manifest.screens.length === 0) {\n issues.push({\n path: ['screens'],\n message: 'flow must have at least one screen',\n code: 'flow.no_screens',\n });\n }\n\n if (manifest.entryScreenId == null && manifest.screens.length > 0) {\n issues.push({\n path: ['entryScreenId'],\n message:\n 'flow entry is not connected — connect the entry node on the canvas to a screen, decision, or integration step before publishing',\n code: 'flow.no_entry',\n });\n }\n\n const screenMap = new Map(\n manifest.screens.map((s) => [s.id, s as unknown as Screen] as const),\n );\n const decisionMap = new Map((manifest.decisionNodes ?? []).map((d) => [d.id, d] as const));\n const surfaceMap = new Map((manifest.externalSurfaceNodes ?? []).map((s) => [s.id, s] as const));\n\n const enqueueGraphNode = (t: string | null | undefined): void => {\n if (t === null || t === undefined) return;\n if (screenMap.has(t) || decisionMap.has(t) || surfaceMap.has(t)) {\n queue.push(t);\n }\n };\n\n // Reachability: BFS from entry across screens, decision vertices, and external surfaces (e.g. RevenueCat paywall).\n const reachable = new Set<string>();\n const queue: string[] = [];\n if (manifest.entryScreenId != null) {\n queue.push(manifest.entryScreenId);\n }\n let canTerminate = false;\n while (queue.length) {\n const id = queue.shift()!;\n if (reachable.has(id)) continue;\n reachable.add(id);\n\n const decision = decisionMap.get(id);\n if (decision) {\n for (const c of decision.cases) {\n if (c.next != null) enqueueGraphNode(c.next);\n }\n if (decision.elseNext != null) enqueueGraphNode(decision.elseNext);\n continue;\n }\n\n const surface = surfaceMap.get(id);\n if (surface) {\n const outcomeTargets = Object.values(surface.outcomes);\n if (\n outcomeTargets.some((t) => t === EXTERNAL_SURFACE_NO_NEXT) ||\n surface.fallback === EXTERNAL_SURFACE_NO_NEXT\n ) {\n canTerminate = true;\n }\n if (surface.fallback != null && surface.fallback !== EXTERNAL_SURFACE_NO_NEXT) {\n enqueueGraphNode(surface.fallback);\n }\n for (const t of outcomeTargets) {\n if (t != null && t !== EXTERNAL_SURFACE_NO_NEXT) enqueueGraphNode(t);\n }\n continue;\n }\n\n const screen = screenMap.get(id);\n if (!screen) continue;\n const targets: (string | null)[] = [];\n targets.push(screen.next.default);\n const input = findInputLayer(screen);\n if (\n input &&\n (input.kind === 'single_choice' || input.kind === 'multiple_choice') &&\n input.branching.enabled\n ) {\n for (const c of input.branching.conditions) targets.push(c.goTo);\n }\n walkScreen(screen, (l) => {\n if (l.kind === 'button' && l.action.kind === 'go_to_step') {\n targets.push(l.action.screenId);\n }\n if (l.kind === 'button' && l.action.kind === 'end_flow') {\n targets.push(null);\n }\n if (l.kind === 'button' && l.action.kind === 'request_app_review') {\n targets.push(screen.next.default);\n }\n if (l.kind === 'button' && l.action.kind === 'request_os_permission') {\n const o = l.action.outcomes;\n for (const t of [o.granted, o.denied, o.blocked]) {\n if (t === OS_PERMISSION_OUTCOME_END) {\n targets.push(null);\n } else if (t === OS_PERMISSION_OUTCOME_CONTINUE) {\n targets.push(screen.next.default);\n } else {\n targets.push(t);\n }\n }\n }\n if (l.kind === 'button' && l.action.kind === 'go_back_one_screen' && l.action.fallbackScreenId) {\n targets.push(l.action.fallbackScreenId);\n }\n if (l.kind === 'back_button' && l.fallbackScreenId) {\n targets.push(l.fallbackScreenId);\n }\n });\n if (targets.every((t) => t === null || t === undefined)) {\n canTerminate = true;\n }\n for (const t of targets) {\n if (t === null || t === undefined) {\n canTerminate = true;\n } else {\n enqueueGraphNode(t);\n }\n }\n }\n\n if (manifest.entryScreenId != null && !canTerminate) {\n issues.push({\n path: ['screens'],\n message: 'no path from entry screen reaches completion',\n code: 'flow.no_completion_path',\n });\n }\n\n for (const screen of manifest.screens) {\n if (manifest.entryScreenId != null && !reachable.has(screen.id)) {\n warnings.push({\n stepId: screen.id,\n path: ['screens', screen.id],\n message: `screen \"${screen.id}\" is not reachable from entry`,\n code: 'screen.unreachable',\n });\n }\n }\n\n for (const sn of manifest.externalSurfaceNodes ?? []) {\n if (manifest.entryScreenId != null && !reachable.has(sn.id)) {\n warnings.push({\n stepId: null,\n path: ['externalSurfaceNodes', sn.id],\n message: `external surface \"${sn.name ?? sn.id}\" is not reachable from entry`,\n code: 'external_surface.unreachable',\n });\n }\n }\n\n for (const dn of manifest.decisionNodes ?? []) {\n if (manifest.entryScreenId != null && !reachable.has(dn.id)) {\n warnings.push({\n stepId: null,\n path: ['decisionNodes', dn.id],\n message: `decision \"${dn.id}\" is not reachable from entry`,\n code: 'decision.unreachable',\n });\n }\n for (const c of dn.cases) {\n if (c.next == null) {\n issues.push({\n stepId: null,\n path: ['decisionNodes', dn.id, 'cases', c.id],\n message: `decision \"${dn.id}\" segment \"${c.name ?? c.id}\" must have a next step before publishing`,\n code: 'decision.incomplete_branches',\n });\n }\n }\n if (dn.elseNext == null) {\n issues.push({\n stepId: null,\n path: ['decisionNodes', dn.id, 'elseNext'],\n message: `decision \"${dn.id}\" needs an \"everyone else\" branch connected before publishing`,\n code: 'decision.incomplete_branches',\n });\n }\n }\n\n return { ok: issues.length === 0, issues, warnings };\n};\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@getrheo/flow-runtime",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"main": "./dist/index.js",
|
|
6
|
+
"types": "./dist/index.d.ts",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": {
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/index.js",
|
|
11
|
+
"default": "./dist/index.js"
|
|
12
|
+
},
|
|
13
|
+
"./agentPrompt": {
|
|
14
|
+
"types": "./dist/agentPrompt/index.d.ts",
|
|
15
|
+
"import": "./dist/agentPrompt/index.js",
|
|
16
|
+
"default": "./dist/agentPrompt/index.js"
|
|
17
|
+
},
|
|
18
|
+
"./animations": {
|
|
19
|
+
"types": "./dist/animations.d.ts",
|
|
20
|
+
"import": "./dist/animations.js",
|
|
21
|
+
"default": "./dist/animations.js"
|
|
22
|
+
},
|
|
23
|
+
"./buttonVariantChrome": {
|
|
24
|
+
"types": "./dist/buttonVariantChrome.d.ts",
|
|
25
|
+
"import": "./dist/buttonVariantChrome.js",
|
|
26
|
+
"default": "./dist/buttonVariantChrome.js"
|
|
27
|
+
},
|
|
28
|
+
"./counterLayer": {
|
|
29
|
+
"types": "./dist/counterLayer.d.ts",
|
|
30
|
+
"import": "./dist/counterLayer.js",
|
|
31
|
+
"default": "./dist/counterLayer.js"
|
|
32
|
+
},
|
|
33
|
+
"./emailPasswordAuthValidation": {
|
|
34
|
+
"types": "./dist/emailPasswordAuthValidation.d.ts",
|
|
35
|
+
"import": "./dist/emailPasswordAuthValidation.js",
|
|
36
|
+
"default": "./dist/emailPasswordAuthValidation.js"
|
|
37
|
+
},
|
|
38
|
+
"./hyperlinkLabel": {
|
|
39
|
+
"types": "./dist/hyperlinkLabel.d.ts",
|
|
40
|
+
"import": "./dist/hyperlinkLabel.js",
|
|
41
|
+
"default": "./dist/hyperlinkLabel.js"
|
|
42
|
+
},
|
|
43
|
+
"./interpolateTemplate": {
|
|
44
|
+
"types": "./dist/interpolateTemplate.d.ts",
|
|
45
|
+
"import": "./dist/interpolateTemplate.js",
|
|
46
|
+
"default": "./dist/interpolateTemplate.js"
|
|
47
|
+
},
|
|
48
|
+
"./layerTypography": {
|
|
49
|
+
"types": "./dist/layerTypography.d.ts",
|
|
50
|
+
"import": "./dist/layerTypography.js",
|
|
51
|
+
"default": "./dist/layerTypography.js"
|
|
52
|
+
},
|
|
53
|
+
"./layers": {
|
|
54
|
+
"types": "./dist/layers.d.ts",
|
|
55
|
+
"import": "./dist/layers.js",
|
|
56
|
+
"default": "./dist/layers.js"
|
|
57
|
+
},
|
|
58
|
+
"./layout": {
|
|
59
|
+
"types": "./dist/layout/index.d.ts",
|
|
60
|
+
"import": "./dist/layout/index.js",
|
|
61
|
+
"default": "./dist/layout/index.js"
|
|
62
|
+
},
|
|
63
|
+
"./responsive": {
|
|
64
|
+
"types": "./dist/responsive/index.d.ts",
|
|
65
|
+
"import": "./dist/responsive/index.js",
|
|
66
|
+
"default": "./dist/responsive/index.js"
|
|
67
|
+
},
|
|
68
|
+
"./responsive/breakpoints": {
|
|
69
|
+
"types": "./dist/responsive/breakpoints.d.ts",
|
|
70
|
+
"import": "./dist/responsive/breakpoints.js",
|
|
71
|
+
"default": "./dist/responsive/breakpoints.js"
|
|
72
|
+
},
|
|
73
|
+
"./responsive/layerResolve": {
|
|
74
|
+
"types": "./dist/responsive/layerResolve.d.ts",
|
|
75
|
+
"import": "./dist/responsive/layerResolve.js",
|
|
76
|
+
"default": "./dist/responsive/layerResolve.js"
|
|
77
|
+
},
|
|
78
|
+
"./responsive/merge": {
|
|
79
|
+
"types": "./dist/responsive/merge.d.ts",
|
|
80
|
+
"import": "./dist/responsive/merge.js",
|
|
81
|
+
"default": "./dist/responsive/merge.js"
|
|
82
|
+
},
|
|
83
|
+
"./responsive/previewSafeAreaInsets": {
|
|
84
|
+
"types": "./dist/responsive/previewSafeAreaInsets.d.ts",
|
|
85
|
+
"import": "./dist/responsive/previewSafeAreaInsets.js",
|
|
86
|
+
"default": "./dist/responsive/previewSafeAreaInsets.js"
|
|
87
|
+
},
|
|
88
|
+
"./responsive/screenContainerResolve": {
|
|
89
|
+
"types": "./dist/responsive/screenContainerResolve.d.ts",
|
|
90
|
+
"import": "./dist/responsive/screenContainerResolve.js",
|
|
91
|
+
"default": "./dist/responsive/screenContainerResolve.js"
|
|
92
|
+
},
|
|
93
|
+
"./responsive/screenShellInsets": {
|
|
94
|
+
"types": "./dist/responsive/screenShellInsets.d.ts",
|
|
95
|
+
"import": "./dist/responsive/screenShellInsets.js",
|
|
96
|
+
"default": "./dist/responsive/screenShellInsets.js"
|
|
97
|
+
},
|
|
98
|
+
"./restingMotion": {
|
|
99
|
+
"types": "./dist/restingMotion.d.ts",
|
|
100
|
+
"import": "./dist/restingMotion.js",
|
|
101
|
+
"default": "./dist/restingMotion.js"
|
|
102
|
+
},
|
|
103
|
+
"./scaleValidation": {
|
|
104
|
+
"types": "./dist/scaleValidation.d.ts",
|
|
105
|
+
"import": "./dist/scaleValidation.js",
|
|
106
|
+
"default": "./dist/scaleValidation.js"
|
|
107
|
+
},
|
|
108
|
+
"./stateMachine": {
|
|
109
|
+
"types": "./dist/stateMachine.d.ts",
|
|
110
|
+
"import": "./dist/stateMachine.js",
|
|
111
|
+
"default": "./dist/stateMachine.js"
|
|
112
|
+
},
|
|
113
|
+
"./textInputValidation": {
|
|
114
|
+
"types": "./dist/textInputValidation.d.ts",
|
|
115
|
+
"import": "./dist/textInputValidation.js",
|
|
116
|
+
"default": "./dist/textInputValidation.js"
|
|
117
|
+
},
|
|
118
|
+
"./aiFlowGenerationMerge": {
|
|
119
|
+
"types": "./dist/aiFlowGenerationMerge.d.ts",
|
|
120
|
+
"import": "./dist/aiFlowGenerationMerge.js",
|
|
121
|
+
"default": "./dist/aiFlowGenerationMerge.js"
|
|
122
|
+
},
|
|
123
|
+
"./assignment": {
|
|
124
|
+
"types": "./dist/assignment.d.ts",
|
|
125
|
+
"import": "./dist/assignment.js",
|
|
126
|
+
"default": "./dist/assignment.js"
|
|
127
|
+
},
|
|
128
|
+
"./brandGradient": {
|
|
129
|
+
"types": "./dist/brandGradient.d.ts",
|
|
130
|
+
"import": "./dist/brandGradient.js",
|
|
131
|
+
"default": "./dist/brandGradient.js"
|
|
132
|
+
},
|
|
133
|
+
"./brandGradientManifestIssues": {
|
|
134
|
+
"types": "./dist/brandGradientManifestIssues.d.ts",
|
|
135
|
+
"import": "./dist/brandGradientManifestIssues.js",
|
|
136
|
+
"default": "./dist/brandGradientManifestIssues.js"
|
|
137
|
+
},
|
|
138
|
+
"./buildFlowPreview": {
|
|
139
|
+
"types": "./dist/buildFlowPreview.d.ts",
|
|
140
|
+
"import": "./dist/buildFlowPreview.js",
|
|
141
|
+
"default": "./dist/buildFlowPreview.js"
|
|
142
|
+
},
|
|
143
|
+
"./checkboxGlyphStyle": {
|
|
144
|
+
"types": "./dist/checkboxGlyphStyle.d.ts",
|
|
145
|
+
"import": "./dist/checkboxGlyphStyle.js",
|
|
146
|
+
"default": "./dist/checkboxGlyphStyle.js"
|
|
147
|
+
},
|
|
148
|
+
"./choiceOptionSelection": {
|
|
149
|
+
"types": "./dist/choiceOptionSelection.d.ts",
|
|
150
|
+
"import": "./dist/choiceOptionSelection.js",
|
|
151
|
+
"default": "./dist/choiceOptionSelection.js"
|
|
152
|
+
},
|
|
153
|
+
"./colorAlpha": {
|
|
154
|
+
"types": "./dist/colorAlpha.d.ts",
|
|
155
|
+
"import": "./dist/colorAlpha.js",
|
|
156
|
+
"default": "./dist/colorAlpha.js"
|
|
157
|
+
},
|
|
158
|
+
"./decisionEval": {
|
|
159
|
+
"types": "./dist/decisionEval.d.ts",
|
|
160
|
+
"import": "./dist/decisionEval.js",
|
|
161
|
+
"default": "./dist/decisionEval.js"
|
|
162
|
+
},
|
|
163
|
+
"./dropShadow": {
|
|
164
|
+
"types": "./dist/dropShadow.d.ts",
|
|
165
|
+
"import": "./dist/dropShadow.js",
|
|
166
|
+
"default": "./dist/dropShadow.js"
|
|
167
|
+
},
|
|
168
|
+
"./flowBuilderRules": {
|
|
169
|
+
"types": "./dist/flowBuilderRules.d.ts",
|
|
170
|
+
"import": "./dist/flowBuilderRules.js",
|
|
171
|
+
"default": "./dist/flowBuilderRules.js"
|
|
172
|
+
},
|
|
173
|
+
"./flowGraph": {
|
|
174
|
+
"types": "./dist/flowGraph.d.ts",
|
|
175
|
+
"import": "./dist/flowGraph.js",
|
|
176
|
+
"default": "./dist/flowGraph.js"
|
|
177
|
+
},
|
|
178
|
+
"./layerRotate": {
|
|
179
|
+
"types": "./dist/layerRotate.d.ts",
|
|
180
|
+
"import": "./dist/layerRotate.js",
|
|
181
|
+
"default": "./dist/layerRotate.js"
|
|
182
|
+
},
|
|
183
|
+
"./manifestBillingSlice": {
|
|
184
|
+
"types": "./dist/manifestBillingSlice.d.ts",
|
|
185
|
+
"import": "./dist/manifestBillingSlice.js",
|
|
186
|
+
"default": "./dist/manifestBillingSlice.js"
|
|
187
|
+
},
|
|
188
|
+
"./prepareAiGeneratedScreen": {
|
|
189
|
+
"types": "./dist/prepareAiGeneratedScreen.d.ts",
|
|
190
|
+
"import": "./dist/prepareAiGeneratedScreen.js",
|
|
191
|
+
"default": "./dist/prepareAiGeneratedScreen.js"
|
|
192
|
+
},
|
|
193
|
+
"./rheoAgentManifestMerge": {
|
|
194
|
+
"types": "./dist/rheoAgentManifestMerge.d.ts",
|
|
195
|
+
"import": "./dist/rheoAgentManifestMerge.js",
|
|
196
|
+
"default": "./dist/rheoAgentManifestMerge.js"
|
|
197
|
+
},
|
|
198
|
+
"./scaleInputStyle": {
|
|
199
|
+
"types": "./dist/scaleInputStyle.d.ts",
|
|
200
|
+
"import": "./dist/scaleInputStyle.js",
|
|
201
|
+
"default": "./dist/scaleInputStyle.js"
|
|
202
|
+
},
|
|
203
|
+
"./translationPlaceholders": {
|
|
204
|
+
"types": "./dist/translationPlaceholders.d.ts",
|
|
205
|
+
"import": "./dist/translationPlaceholders.js",
|
|
206
|
+
"default": "./dist/translationPlaceholders.js"
|
|
207
|
+
},
|
|
208
|
+
"./validation": {
|
|
209
|
+
"types": "./dist/validation.d.ts",
|
|
210
|
+
"import": "./dist/validation.js",
|
|
211
|
+
"default": "./dist/validation.js"
|
|
212
|
+
}
|
|
213
|
+
},
|
|
214
|
+
"dependencies": {
|
|
215
|
+
"@getrheo/contracts": "1.0.0"
|
|
216
|
+
},
|
|
217
|
+
"devDependencies": {
|
|
218
|
+
"@types/node": "^22.10.1",
|
|
219
|
+
"typescript": "^5.6.3",
|
|
220
|
+
"vitest": "^3.2.6",
|
|
221
|
+
"@rheo/config": "0.1.0"
|
|
222
|
+
},
|
|
223
|
+
"license": "MIT",
|
|
224
|
+
"repository": {
|
|
225
|
+
"type": "git",
|
|
226
|
+
"url": "git+https://github.com/madeinusmate/onboardly.git",
|
|
227
|
+
"directory": "packages/flow-runtime"
|
|
228
|
+
},
|
|
229
|
+
"files": [
|
|
230
|
+
"dist",
|
|
231
|
+
"README.md"
|
|
232
|
+
],
|
|
233
|
+
"publishConfig": {
|
|
234
|
+
"access": "public"
|
|
235
|
+
},
|
|
236
|
+
"scripts": {
|
|
237
|
+
"lint": "eslint .",
|
|
238
|
+
"typecheck": "tsc --noEmit",
|
|
239
|
+
"test": "vitest run",
|
|
240
|
+
"build": "node ../../scripts/build-publishable-package.mjs"
|
|
241
|
+
}
|
|
242
|
+
}
|