@beehexa/hexasync-template-frontend-flow 2608.21.4 → 2610.4.3

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.
@@ -0,0 +1,8 @@
1
+ import { type WorkflowGraph } from '@beehexa/hexasync-template-model';
2
+ export interface CompileFrontendWorkflowGraphInput {
3
+ readonly collection: 'connectors' | 'templates';
4
+ readonly document: Readonly<Record<string, unknown>>;
5
+ readonly documentId?: unknown;
6
+ }
7
+ export declare function compileFrontendWorkflowGraph(input: CompileFrontendWorkflowGraphInput): WorkflowGraph;
8
+ //# sourceMappingURL=canonicalGraph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonicalGraph.d.ts","sourceRoot":"","sources":["../src/canonicalGraph.ts"],"names":[],"mappings":"AAAA,OAAO,EAcL,KAAK,aAAa,EACnB,MAAM,kCAAkC,CAAC;AAU1C,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,UAAU,EAAE,YAAY,GAAG,WAAW,CAAC;IAChD,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAwED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,iCAAiC,GAAG,aAAa,CAwJpG"}
@@ -0,0 +1,238 @@
1
+ import { CANONICAL_GRAPH_SCHEMA_VERSION, compileWorkflowGraph, genericWorkflowAdapter, identitySegment, } from '@beehexa/hexasync-template-model';
2
+ import { CONNECTOR_WORKFLOW_KEYS, TEMPLATE_WORKFLOW_KEYS, workflowsPresent, } from './workflows.js';
3
+ import { branchArm } from './routes.js';
4
+ import { looksLikeTemplate, templateTargets } from './liquid.js';
5
+ const ADAPTER = genericWorkflowAdapter({
6
+ adapterId: 'frontend', adapterVersion: '1', identityFields: ['key'],
7
+ displayTypeFields: ['type', 'displayType'], dialect: 'frontend/v1',
8
+ capabilities: { semanticEdit: true, presentationEdit: true },
9
+ });
10
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
11
+ const pointer = (path, canonicalField) => ({
12
+ adapterId: ADAPTER.id, adapterVersion: ADAPTER.version, path, derived: false,
13
+ ...(canonicalField === undefined ? {} : { canonicalField }),
14
+ });
15
+ const withWorkflowPath = (workflow, source) => ({
16
+ ...source, path: source.path.replace(/^\$\.steps/, `$.${workflow}`),
17
+ });
18
+ const normalizedIdentity = (value) => {
19
+ const segment = identitySegment(value, 'key');
20
+ return segment && 'value' in segment ? segment.value : undefined;
21
+ };
22
+ const fingerprintOf = (value) => {
23
+ let hash = 2166136261;
24
+ const stack = [value];
25
+ const seen = new WeakSet();
26
+ const write = (text) => {
27
+ for (let index = 0; index < text.length; index += 1) {
28
+ hash ^= text.charCodeAt(index);
29
+ hash = Math.imul(hash, 16777619);
30
+ }
31
+ };
32
+ while (stack.length > 0) {
33
+ const current = stack.pop();
34
+ if (Array.isArray(current)) {
35
+ if (seen.has(current)) {
36
+ write('[cycle]');
37
+ continue;
38
+ }
39
+ seen.add(current);
40
+ write(`[${current.length}:`);
41
+ for (let index = current.length - 1; index >= 0; index -= 1)
42
+ stack.push(current[index]);
43
+ }
44
+ else if (isRecord(current)) {
45
+ if (seen.has(current)) {
46
+ write('{cycle}');
47
+ continue;
48
+ }
49
+ seen.add(current);
50
+ const keys = Object.keys(current).sort();
51
+ write(`{${keys.length}:`);
52
+ for (let index = keys.length - 1; index >= 0; index -= 1) {
53
+ const key = keys[index];
54
+ stack.push(current[key]);
55
+ stack.push(`key:${key}`);
56
+ }
57
+ }
58
+ else
59
+ write(`${typeof current}:${String(current)};`);
60
+ }
61
+ return `fnv1a32:${(hash >>> 0).toString(16).padStart(8, '0')}`;
62
+ };
63
+ const conditionsOf = (tail) => {
64
+ const result = [];
65
+ for (let current = tail; current !== undefined; current = current.previous)
66
+ result.push(current.condition);
67
+ result.reverse();
68
+ return result;
69
+ };
70
+ const containsObject = (tail, value) => {
71
+ for (let current = tail; current !== undefined; current = current.previous) {
72
+ if (current.value === value)
73
+ return true;
74
+ }
75
+ return false;
76
+ };
77
+ const fieldPath = (base, field) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(field)
78
+ ? `${base}.${field}`
79
+ : `${base}[${JSON.stringify(field)}]`;
80
+ export function compileFrontendWorkflowGraph(input) {
81
+ const documentId = String(input.documentId ?? input.document.id ?? input.collection);
82
+ const allowed = new Set(input.collection === 'connectors'
83
+ ? CONNECTOR_WORKFLOW_KEYS : TEMPLATE_WORKFLOW_KEYS);
84
+ const workflows = workflowsPresent(input.document)
85
+ .filter((workflow) => allowed.has(workflow));
86
+ const nodes = [];
87
+ const ports = [];
88
+ const diagnostics = [];
89
+ const rawByWorkflowIdentity = new Map();
90
+ for (const workflow of workflows) {
91
+ const rawSteps = input.document[workflow];
92
+ for (const rawStep of rawSteps) {
93
+ if (!isRecord(rawStep) || typeof rawStep.key !== 'string')
94
+ continue;
95
+ const identity = normalizedIdentity(rawStep.key);
96
+ if (identity !== undefined && !rawByWorkflowIdentity.has(`${workflow}\0${identity}`)) {
97
+ rawByWorkflowIdentity.set(`${workflow}\0${identity}`, rawStep);
98
+ }
99
+ }
100
+ const stepsWithoutRoutes = rawSteps.map((rawStep) => {
101
+ if (!isRecord(rawStep))
102
+ return rawStep;
103
+ const { next: _next, onCancelled: _cancel, ...step } = rawStep;
104
+ return step;
105
+ });
106
+ const graph = compileWorkflowGraph({ id: documentId, steps: stepsWithoutRoutes }, {
107
+ ...ADAPTER,
108
+ container: { documentId, workflowId: workflow, scope: 'stage', stage: workflow },
109
+ });
110
+ for (const node of graph.nodes) {
111
+ const mapped = {
112
+ ...node,
113
+ source: rawByWorkflowIdentity.get(`${workflow}\0${node.sourceIdentity}`) ?? node.source,
114
+ provenance: node.provenance.map((entry) => withWorkflowPath(workflow, entry)),
115
+ ports: node.ports.map((port) => ({
116
+ ...port, provenance: port.provenance.map((entry) => withWorkflowPath(workflow, entry)),
117
+ })),
118
+ };
119
+ nodes.push(mapped);
120
+ ports.push(...mapped.ports);
121
+ }
122
+ diagnostics.push(...graph.diagnostics.map((diagnostic) => ({
123
+ ...diagnostic, source: withWorkflowPath(workflow, diagnostic.source),
124
+ })));
125
+ }
126
+ const routes = [];
127
+ const edges = [];
128
+ const byWorkflowIdentity = new Map(nodes.map((node) => [
129
+ `${node.container.workflowId}\0${node.sourceIdentity}`, node,
130
+ ]));
131
+ for (const node of nodes) {
132
+ const workflow = node.container.workflowId;
133
+ const type = String(node.source.type ?? node.source.displayType ?? '').toUpperCase();
134
+ const metadata = isRecord(node.source.metadata) ? node.source.metadata : undefined;
135
+ const pending = [];
136
+ if (typeof node.source.onCancelled === 'string' && node.source.onCancelled.trim() !== '') {
137
+ pending.push({ value: node.source.onCancelled.trim(), path: `${node.provenance[0].path}.onCancelled`, role: 'cancel', label: 'Cancel' });
138
+ }
139
+ if (type === 'IF' && metadata) {
140
+ pending.push({ value: metadata.then, path: `${node.provenance[0].path}.metadata.then`, role: 'true', label: 'YES' });
141
+ pending.push({ value: metadata.else, path: `${node.provenance[0].path}.metadata.else`, role: 'false', label: 'NO' });
142
+ }
143
+ else if (type === 'SWITCH' && metadata) {
144
+ if (isRecord(metadata.cases)) {
145
+ for (const [label, value] of Object.entries(metadata.cases)) {
146
+ pending.push({ value, path: fieldPath(`${node.provenance[0].path}.metadata.cases`, label), role: 'case', label });
147
+ }
148
+ }
149
+ if (typeof metadata.default === 'string') {
150
+ pending.push({ value: metadata.default, path: `${node.provenance[0].path}.metadata.default`, role: 'default', label: 'default' });
151
+ }
152
+ }
153
+ else if (Object.prototype.hasOwnProperty.call(node.source, 'next')) {
154
+ pending.push({ value: node.source.next, path: `${node.provenance[0].path}.next`, role: 'success' });
155
+ }
156
+ let order = 0;
157
+ while (pending.length > 0) {
158
+ const current = pending.shift();
159
+ if (typeof current.value === 'string' && current.value.trim() !== '') {
160
+ const value = current.value.trim();
161
+ const sourcePort = node.ports.find((port) => port.direction === 'output');
162
+ const routeBase = `${node.id}|route|${encodeURIComponent(current.path)}|${current.role}`;
163
+ const conditions = conditionsOf(current.conditionTail);
164
+ const common = {
165
+ id: routeBase, sourceNodeId: node.id, sourcePortId: sourcePort.id,
166
+ kind: current.role === 'cancel' ? 'cancel' : 'next', role: current.role,
167
+ ...(current.label === undefined ? {} : { label: current.label }), order,
168
+ ...(conditions.length === 0 ? {} : { conditions }),
169
+ };
170
+ if (looksLikeTemplate(value)) {
171
+ const possible = templateTargets(value).map((targetIdentity, index) => ({
172
+ role: 'possible', label: String(index + 1), targetIdentity,
173
+ }));
174
+ routes.push({ ...common, expression: { provider: 'liquid', source: current.value },
175
+ potentialBranches: possible, provenance: [pointer(current.path, 'expression')] });
176
+ }
177
+ else {
178
+ const targetIdentity = normalizedIdentity(value) ?? value;
179
+ const route = { ...common, targetIdentity,
180
+ provenance: [pointer(current.path, 'targetIdentity')] };
181
+ routes.push(route);
182
+ const target = byWorkflowIdentity.get(`${workflow}\0${targetIdentity}`);
183
+ const targetPort = target?.ports.find((port) => port.direction === 'input');
184
+ if (target && targetPort)
185
+ edges.push({
186
+ id: `${routeBase}|edge`, source: { nodeId: node.id, portId: sourcePort.id },
187
+ target: { nodeId: target.id, portId: targetPort.id }, kind: route.kind,
188
+ provenance: route.provenance, capabilities: { reconnect: true, delete: true },
189
+ });
190
+ }
191
+ order += 1;
192
+ continue;
193
+ }
194
+ if (isRecord(current.value)) {
195
+ if (containsObject(current.ancestorTail, current.value)) {
196
+ diagnostics.push({
197
+ code: 'INVALID_FRONTEND_ROUTE_CYCLE', severity: 'error', phase: 'compile',
198
+ message: 'Frontend route object contains a cycle.', elementId: node.id,
199
+ source: pointer(current.path), recoverable: true,
200
+ });
201
+ continue;
202
+ }
203
+ const ancestorTail = {
204
+ value: current.value,
205
+ ...(current.ancestorTail === undefined ? {} : { previous: current.ancestorTail }),
206
+ };
207
+ const expression = typeof current.value.if === 'string'
208
+ ? { provider: 'liquid', source: current.value.if } : undefined;
209
+ const conditionPointer = pointer(`${current.path}.if`, 'expression');
210
+ const thenValue = branchArm(current.value, 'then', 'success');
211
+ const elseValue = branchArm(current.value, 'else', 'failed');
212
+ const arms = [];
213
+ if (thenValue !== undefined)
214
+ arms.push({
215
+ value: thenValue, path: Object.prototype.hasOwnProperty.call(current.value, 'then') ? `${current.path}.then` : `${current.path}.success`,
216
+ role: 'true', label: 'YES', ancestorTail,
217
+ ...(expression === undefined ? {} : { conditionTail: { condition: { expression, outcome: true, provenance: [conditionPointer] }, ...(current.conditionTail === undefined ? {} : { previous: current.conditionTail }) } }),
218
+ });
219
+ if (elseValue !== undefined)
220
+ arms.push({
221
+ value: elseValue, path: Object.prototype.hasOwnProperty.call(current.value, 'else') ? `${current.path}.else` : `${current.path}.failed`,
222
+ role: 'false', label: 'NO', ancestorTail,
223
+ ...(expression === undefined ? {} : { conditionTail: { condition: { expression, outcome: false, provenance: [conditionPointer] }, ...(current.conditionTail === undefined ? {} : { previous: current.conditionTail }) } }),
224
+ });
225
+ pending.unshift(...arms);
226
+ }
227
+ }
228
+ }
229
+ const shell = compileWorkflowGraph({ id: `${input.collection}:${documentId}`, steps: [] }, ADAPTER);
230
+ return {
231
+ schemaVersion: CANONICAL_GRAPH_SCHEMA_VERSION, graphId: shell.graphId,
232
+ dialect: ADAPTER.dialect,
233
+ sourceFingerprint: fingerprintOf({ collection: input.collection, documentId: input.documentId, document: input.document }),
234
+ nodes, ports, routes, edges, capabilities: ADAPTER.capabilities,
235
+ provenance: [pointer('$')], diagnostics,
236
+ };
237
+ }
238
+ //# sourceMappingURL=canonicalGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"canonicalGraph.js","sourceRoot":"","sources":["../src/canonicalGraph.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -18,6 +18,7 @@
18
18
  export { CONNECTOR_WORKFLOW_KEYS, TEMPLATE_WORKFLOW_KEYS, FRONTEND_WORKFLOW_KEYS, FRONTEND_WORKFLOW_TITLES, workflowsPresent, surfaceOf, type ConnectorWorkflowKey, type TemplateWorkflowKey, type FrontendWorkflowKey, type FrontendSurface, } from './workflows.js';
19
19
  export { frontendRouteGraph, branchArm, type FrontendStep, type FrontendRouteGraph, type Junction, type JunctionKind, type GraphEdge, type EdgeEnd, } from './routes.js';
20
20
  export { frontendFlow, type FrontendFlow, type FrontendFlowInput, type FrontendWorkflowFlow, type FrontendFlowNode, type FrontendFlowEdge, type NodeLocation, type LocateRequest, } from './flow.js';
21
- export { renderMermaid, renderMarkdown, renderDocumentMarkdown, } from './render.js';
21
+ export { renderMermaid, renderMermaidWithOccurrences, renderMarkdown, renderDocumentMarkdown, } from './render.js';
22
22
  export { looksLikeTemplate, templateTargets } from './liquid.js';
23
+ export { compileFrontendWorkflowGraph, type CompileFrontendWorkflowGraphInput, } from './canonicalGraph.js';
23
24
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,gBAAgB,EAChB,SAAS,EACT,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,OAAO,GACb,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,aAAa,EACb,cAAc,EACd,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,gBAAgB,EAChB,SAAS,EACT,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,mBAAmB,EACxB,KAAK,eAAe,GACrB,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,kBAAkB,EAClB,SAAS,EACT,KAAK,YAAY,EACjB,KAAK,kBAAkB,EACvB,KAAK,QAAQ,EACb,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,OAAO,GACb,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,YAAY,EACZ,KAAK,YAAY,EACjB,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,gBAAgB,EACrB,KAAK,gBAAgB,EACrB,KAAK,YAAY,EACjB,KAAK,aAAa,GACnB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,aAAa,EACb,4BAA4B,EAC5B,cAAc,EACd,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EACL,4BAA4B,EAC5B,KAAK,iCAAiC,GACvC,MAAM,qBAAqB,CAAC"}
package/dist/index.js CHANGED
@@ -18,6 +18,7 @@
18
18
  export { CONNECTOR_WORKFLOW_KEYS, TEMPLATE_WORKFLOW_KEYS, FRONTEND_WORKFLOW_KEYS, FRONTEND_WORKFLOW_TITLES, workflowsPresent, surfaceOf, } from './workflows.js';
19
19
  export { frontendRouteGraph, branchArm, } from './routes.js';
20
20
  export { frontendFlow, } from './flow.js';
21
- export { renderMermaid, renderMarkdown, renderDocumentMarkdown, } from './render.js';
21
+ export { renderMermaid, renderMermaidWithOccurrences, renderMarkdown, renderDocumentMarkdown, } from './render.js';
22
22
  export { looksLikeTemplate, templateTargets } from './liquid.js';
23
+ export { compileFrontendWorkflowGraph, } from './canonicalGraph.js';
23
24
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,gBAAgB,EAChB,SAAS,GAKV,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,kBAAkB,EAClB,SAAS,GAOV,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,YAAY,GAQb,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,aAAa,EACb,cAAc,EACd,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,EACxB,gBAAgB,EAChB,SAAS,GAKV,MAAM,gBAAgB,CAAC;AAExB,OAAO,EACL,kBAAkB,EAClB,SAAS,GAOV,MAAM,aAAa,CAAC;AAErB,OAAO,EACL,YAAY,GAQb,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,aAAa,EACb,4BAA4B,EAC5B,cAAc,EACd,sBAAsB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EACL,4BAA4B,GAE7B,MAAM,qBAAqB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"liquid.d.ts","sourceRoot":"","sources":["../src/liquid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAQH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAa/D"}
1
+ {"version":3,"file":"liquid.d.ts","sourceRoot":"","sources":["../src/liquid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAmCH;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAkB/D"}
package/dist/liquid.js CHANGED
@@ -33,8 +33,39 @@
33
33
  * step key declared in the same workflow — see `liquid.spec.ts`, which walks the real files rather than
34
34
  * asserting a fixture.
35
35
  */
36
- /** Both tag forms, so a document written in either dialect reads correctly. */
37
- const TAGS = /\{%[\s\S]*?%\}|\{\{[\s\S]*?\}\}/g;
36
+ /**
37
+ * Leftmost complete tags, ending at their first matching delimiter.
38
+ * Cache each closing-delimiter search, including misses, so repeated incomplete openings never rescan
39
+ * the same suffix. The two searches and the opening scan each advance monotonically through the text.
40
+ */
41
+ function* tags(text) {
42
+ let liquidEnd;
43
+ let scribanEnd;
44
+ for (let start = 0; start < text.length - 1; start++) {
45
+ if (text[start] !== '{')
46
+ continue;
47
+ let end;
48
+ if (text[start + 1] === '%') {
49
+ if (liquidEnd === undefined || (liquidEnd !== -1 && liquidEnd < start + 2)) {
50
+ liquidEnd = text.indexOf('%}', start + 2);
51
+ }
52
+ end = liquidEnd;
53
+ }
54
+ else if (text[start + 1] === '{') {
55
+ if (scribanEnd === undefined || (scribanEnd !== -1 && scribanEnd < start + 2)) {
56
+ scribanEnd = text.indexOf('}}', start + 2);
57
+ }
58
+ end = scribanEnd;
59
+ }
60
+ else {
61
+ continue;
62
+ }
63
+ if (end === -1)
64
+ continue;
65
+ yield [start, end + 2];
66
+ start = end + 1;
67
+ }
68
+ }
38
69
  /** A step key: what `key:` accepts, and what a `next` is compared against. */
39
70
  const STEP_KEY = /^[A-Za-z0-9_]+$/;
40
71
  /**
@@ -44,7 +75,7 @@ const STEP_KEY = /^[A-Za-z0-9_]+$/;
44
75
  * it is a broken pointer, and drawing a decision there would claim a choice the document does not make.
45
76
  */
46
77
  export function looksLikeTemplate(text) {
47
- return /\{%[\s\S]*?%\}/.test(text) || /\{\{[\s\S]*?\}\}/.test(text);
78
+ return !tags(text).next().done;
48
79
  }
49
80
  /**
50
81
  * Every step key a template can emit, in the order it could emit them, without duplicates.
@@ -65,8 +96,12 @@ export function templateTargets(text) {
65
96
  out.push(value);
66
97
  };
67
98
  // The literal chunks — what Liquid actually emits.
68
- for (const chunk of text.split(TAGS))
69
- add(chunk);
99
+ let chunkStart = 0;
100
+ for (const [start, end] of tags(text)) {
101
+ add(text.slice(chunkStart, start));
102
+ chunkStart = end;
103
+ }
104
+ add(text.slice(chunkStart));
70
105
  // And any `"QUOTED"` key inside a tag, which is how the Scriban dialect names one.
71
106
  for (const match of text.matchAll(/"([A-Za-z0-9_]+)"/g))
72
107
  add(match[1]);
@@ -1 +1 @@
1
- {"version":3,"file":"liquid.js","sourceRoot":"","sources":["../src/liquid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,+EAA+E;AAC/E,MAAM,IAAI,GAAG,kCAAkC,CAAC;AAEhD,8EAA8E;AAC9E,MAAM,QAAQ,GAAG,iBAAiB,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtE,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,CAAC,SAAiB,EAAQ,EAAE;QACtC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO;QACzE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,mDAAmD;IACnD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,GAAG,CAAC,KAAK,CAAC,CAAC;IACjD,mFAAmF;IACnF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IACxE,OAAO,GAAG,CAAC;AACb,CAAC"}
1
+ {"version":3,"file":"liquid.js","sourceRoot":"","sources":["../src/liquid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH;;;;GAIG;AACH,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAY;IACzB,IAAI,SAA6B,CAAC;IAClC,IAAI,UAA8B,CAAC;IACnC,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;QACrD,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG;YAAE,SAAS;QAClC,IAAI,GAAW,CAAC;QAChB,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC5B,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC3E,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC5C,CAAC;YACD,GAAG,GAAG,SAAS,CAAC;QAClB,CAAC;aAAM,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACnC,IAAI,UAAU,KAAK,SAAS,IAAI,CAAC,UAAU,KAAK,CAAC,CAAC,IAAI,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;gBAC9E,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;YAC7C,CAAC;YACD,GAAG,GAAG,UAAU,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,SAAS;QACzB,MAAM,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QACvB,KAAK,GAAG,GAAG,GAAG,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,MAAM,QAAQ,GAAG,iBAAiB,CAAC;AAEnC;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC;AACjC,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,GAAG,GAAG,CAAC,SAAiB,EAAQ,EAAE;QACtC,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO;QACzE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC,CAAC;IAEF,mDAAmD;IACnD,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,CAAC;QACnC,UAAU,GAAG,GAAG,CAAC;IACnB,CAAC;IACD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC;IAC5B,mFAAmF;IACnF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAE,CAAC,CAAC;IACxE,OAAO,GAAG,CAAC;AACb,CAAC"}
package/dist/render.d.ts CHANGED
@@ -5,10 +5,12 @@
5
5
  * package both may import (AD-21). This file says what a FRONTEND node looks like — and the differences from the worker
6
6
  * side are real, not incidental.
7
7
  */
8
- import { type RenderOptions } from '@beehexa/hexasync-template-model';
8
+ import { type RenderedFlow, type RenderOptions } from '@beehexa/hexasync-template-model';
9
9
  import type { FrontendWorkflowFlow, FrontendFlow } from './flow.js';
10
10
  /** ONE workflow, which is what a diagram shows — a document with five of them is five diagrams, not one. */
11
11
  export declare function renderMermaid(one: FrontendWorkflowFlow, opts?: RenderOptions): string;
12
+ /** The definition plus the collapsed-range addresses it drew — the worker twin's contract, and for the same reason. */
13
+ export declare function renderMermaidWithOccurrences(one: FrontendWorkflowFlow, opts?: RenderOptions): RenderedFlow;
12
14
  /** Markdown for one workflow — `(flow, opts)`, the same shape as the worker twin (review MEDIUM-1). */
13
15
  export declare function renderMarkdown(one: FrontendWorkflowFlow, opts?: RenderOptions & {
14
16
  readonly title?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAiCpE,4GAA4G;AAC5G,wBAAgB,aAAa,CAC3B,GAAG,EAAE,oBAAoB,EACzB,IAAI,GAAE,aAAkB,GACvB,MAAM,CAOR;AAED,uGAAuG;AACvG,wBAAgB,cAAc,CAC5B,GAAG,EAAE,oBAAoB,EACzB,IAAI,GAAE,aAAa,GAAG;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,MAAM,CAUR;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,YAAY,EAClB,IAAI,GAAE,aAAa,GAAG;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,MAAM,CAWR"}
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAGL,KAAK,YAAY,EAMjB,KAAK,aAAa,EAGnB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AA6EpE,4GAA4G;AAC5G,wBAAgB,aAAa,CAC3B,GAAG,EAAE,oBAAoB,EACzB,IAAI,GAAE,aAAkB,GACvB,MAAM,CAIR;AAED,uHAAuH;AACvH,wBAAgB,4BAA4B,CAC1C,GAAG,EAAE,oBAAoB,EACzB,IAAI,GAAE,aAAkB,GACvB,YAAY,CASd;AAED,uGAAuG;AACvG,wBAAgB,cAAc,CAC5B,GAAG,EAAE,oBAAoB,EACzB,IAAI,GAAE,aAAa,GAAG;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,MAAM,CAWR;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,YAAY,EAClB,IAAI,GAAE,aAAa,GAAG;IAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAO,GACrD,MAAM,CAWR"}
package/dist/render.js CHANGED
@@ -5,7 +5,7 @@
5
5
  * package both may import (AD-21). This file says what a FRONTEND node looks like — and the differences from the worker
6
6
  * side are real, not incidental.
7
7
  */
8
- import { renderFlowMermaid, composeNodeLabel, renderFlowMarkdown, } from '@beehexa/hexasync-template-model';
8
+ import { expandOccurrences, renderFlowMermaid, composeNodeLabelModel, UNMAPPED_STEP_ICON, renderFlowMarkdown, } from '@beehexa/hexasync-template-model';
9
9
  /**
10
10
  * A node's label.
11
11
  *
@@ -13,42 +13,83 @@ import { renderFlowMermaid, composeNodeLabel, renderFlowMarkdown, } from '@beehe
13
13
  * `SHOW_CREATE_PROFILE_ERROR["Couldn't Start Profile Creation"]`, and dropping `name` was Story 4.2's L1 finding. The
14
14
  * worker side has no equivalent: a worker step's identity in that corpus IS its key.
15
15
  */
16
- function labelOf(node) {
16
+ function labelOf(node, fidelity) {
17
17
  // COMPOSED, not a fallback chain (2026-08-20). This was
18
18
  // `node.label ?? node.name ?? node.stepKey ?? node.address`, so a step with a name drew its name and
19
19
  // dropped the key and the type — both already on the node. A reader beside the YAML could not tell which
20
20
  // `key:` a box was, and `next:`/`outputs:` reference steps BY KEY. One composer for both runtimes, in
21
21
  // `template-model`, so the two diagrams cannot start labelling differently.
22
- return composeNodeLabel(node);
22
+ return composeNodeLabelModel(node, fidelity, 'frontend');
23
23
  }
24
24
  function groupOf(one) {
25
25
  return {
26
26
  key: one.address,
27
27
  title: one.title,
28
- nodes: one.nodes.map((node) => ({
29
- address: node.address,
30
- label: labelOf(node),
31
- decides: node.decides,
32
- // START and END are stadiums, as both baselines draw them; an unresolved target is a plain box there, matching
33
- // the reference, which ids it with the same shape as a real step.
34
- terminal: node.junction === 'start' || node.junction === 'end',
35
- })),
28
+ nodes: one.nodes.map((node) => {
29
+ const strictLabel = labelOf(node, 'strict');
30
+ const looseLabel = labelOf(node, 'loose');
31
+ return {
32
+ address: node.address,
33
+ label: strictLabel.text,
34
+ labelAnatomy: strictLabel.anatomy,
35
+ looseLabel: looseLabel.text,
36
+ looseLabelAnatomy: looseLabel.anatomy,
37
+ // Frontend has no child-family asset map yet; keep the hook asset-backed and neutral.
38
+ iconFamily: UNMAPPED_STEP_ICON.family,
39
+ decides: node.decides,
40
+ // START and END are stadiums, as both baselines draw them; an unresolved target is a plain box there, matching
41
+ // the reference, which ids it with the same shape as a real step.
42
+ terminal: node.junction === 'start' || node.junction === 'end',
43
+ };
44
+ }),
45
+ };
46
+ }
47
+ /**
48
+ * The occurrence expansion, above `frontendFlow` and below the definition — the worker twin's `expandedFor`.
49
+ *
50
+ * Same argument, same shape (Story 8.9, FR64/FR40): `frontendFlow` builds the AUTHORED graph and must stay
51
+ * evidence-unaware, and with no plan this returns the arrays and the options object it was given, so a no-run render
52
+ * is byte-identical to the one before this story existed.
53
+ */
54
+ function expandedFor(one, opts) {
55
+ const groups = [groupOf(one)];
56
+ const expansion = expandOccurrences(groups, one.edges, opts.occurrences);
57
+ if (!expansion.expanded) {
58
+ return { groups, edges: one.edges, opts, collapsedRanges: expansion.collapsedRanges };
59
+ }
60
+ // The derived overlay travels on `occurrenceOverlay`, not in `overlay.nodes` — see the worker twin for what merging
61
+ // it there cost: a plan on one step took the typed overlay chart-wide and restyled every unrelated node.
62
+ const { occurrences: _plan, ...rest } = opts;
63
+ return {
64
+ groups: expansion.groups,
65
+ edges: expansion.edges,
66
+ opts: { ...rest, occurrenceOverlay: expansion.nodes },
67
+ collapsedRanges: expansion.collapsedRanges,
36
68
  };
37
69
  }
38
70
  /** ONE workflow, which is what a diagram shows — a document with five of them is five diagrams, not one. */
39
71
  export function renderMermaid(one, opts = {}) {
40
72
  // A single workflow is a flat chart by default: its own title is the chart's, and a lone subgraph adds a box around
41
73
  // everything for nothing.
42
- return renderFlowMermaid([groupOf(one)], one.edges, {
43
- multiStage: false,
44
- ...opts,
45
- });
74
+ return renderMermaidWithOccurrences(one, opts).definition;
75
+ }
76
+ /** The definition plus the collapsed-range addresses it drew — the worker twin's contract, and for the same reason. */
77
+ export function renderMermaidWithOccurrences(one, opts = {}) {
78
+ const expanded = expandedFor(one, opts);
79
+ return {
80
+ definition: renderFlowMermaid(expanded.groups, expanded.edges, {
81
+ multiStage: false,
82
+ ...expanded.opts,
83
+ }),
84
+ collapsedRanges: expanded.collapsedRanges,
85
+ };
46
86
  }
47
87
  /** Markdown for one workflow — `(flow, opts)`, the same shape as the worker twin (review MEDIUM-1). */
48
88
  export function renderMarkdown(one, opts = {}) {
49
- return renderFlowMarkdown(opts.title ?? one.title, [groupOf(one)], one.edges, {
89
+ const expanded = expandedFor(one, opts);
90
+ return renderFlowMarkdown(opts.title ?? one.title, expanded.groups, expanded.edges, {
50
91
  multiStage: false,
51
- ...opts,
92
+ ...expanded.opts,
52
93
  });
53
94
  }
54
95
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,kBAAkB,GAGnB,MAAM,kCAAkC,CAAC;AAG1C;;;;;;GAMG;AACH,SAAS,OAAO,CAAC,IAA2C;IAC1D,wDAAwD;IACxD,qGAAqG;IACrG,yGAAyG;IACzG,sGAAsG;IACtG,4EAA4E;IAC5E,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,OAAO,CAAC,GAAyB;IACxC,OAAO;QACL,GAAG,EAAE,GAAG,CAAC,OAAO;QAChB,KAAK,EAAE,GAAG,CAAC,KAAK;QAChB,KAAK,EAAE,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC9B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC;YACpB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,+GAA+G;YAC/G,kEAAkE;YAClE,QAAQ,EAAE,IAAI,CAAC,QAAQ,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK;SAC/D,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAED,4GAA4G;AAC5G,MAAM,UAAU,aAAa,CAC3B,GAAyB,EACzB,IAAI,GAAkB,EAAE;IAExB,oHAAoH;IACpH,0BAA0B;IAC1B,OAAO,iBAAiB,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,EAAE;QAClD,UAAU,EAAE,KAAK;QACjB,GAAG,IAAI;KACR,CAAC,CAAC;AACL,CAAC;AAED,uGAAuG;AACvG,MAAM,UAAU,cAAc,CAC5B,GAAyB,EACzB,IAAI,GAAgD,EAAE;IAEtD,OAAO,kBAAkB,CACvB,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,KAAK,EACvB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EACd,GAAG,CAAC,KAAK,EACT;QACE,UAAU,EAAE,KAAK;QACjB,GAAG,IAAI;KACR,CACF,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAkB,EAClB,IAAI,GAAgD,EAAE;IAEtD;;;;;OAKG;IACH,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,OAAO,IAAI,CAAC,KAAK,IAAI,WAAW,qDAAqD,CAAC;IAC/F,CAAC;IACD,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3E,CAAC"}
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../src/render.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@beehexa/hexasync-template-frontend-flow",
3
- "version": "2608.21.4",
3
+ "version": "2610.4.3",
4
4
  "description": "The flow model for a frontend onboarding workflow — creationSteps and the five connector workflows.",
5
5
  "license": "SEE LICENSE IN ../../LICENSE",
6
6
  "type": "module",
@@ -20,7 +20,10 @@
20
20
  "build": "tsc -p tsconfig.build.json"
21
21
  },
22
22
  "dependencies": {
23
- "@beehexa/hexasync-template-model": "2608.21.4"
23
+ "@beehexa/hexasync-template-model": "2610.4.3"
24
+ },
25
+ "publishConfig": {
26
+ "access": "public"
24
27
  },
25
28
  "hexasync": {
26
29
  "layer": "core"