@beehexa/hexasync-template-engine 2608.21.2 → 2610.3.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/dist/capabilityPolicy.d.ts +29 -0
- package/dist/capabilityPolicy.d.ts.map +1 -0
- package/dist/capabilityPolicy.js +46 -0
- package/dist/capabilityPolicy.js.map +1 -0
- package/dist/compositeFlow.d.ts +23 -0
- package/dist/compositeFlow.d.ts.map +1 -0
- package/dist/compositeFlow.js +350 -0
- package/dist/compositeFlow.js.map +1 -0
- package/dist/connectionEditing.d.ts +124 -0
- package/dist/connectionEditing.d.ts.map +1 -0
- package/dist/connectionEditing.js +122 -0
- package/dist/connectionEditing.js.map +1 -0
- package/dist/editDiagnostics.d.ts +80 -0
- package/dist/editDiagnostics.d.ts.map +1 -0
- package/dist/editDiagnostics.js +130 -0
- package/dist/editDiagnostics.js.map +1 -0
- package/dist/extensionRegistry.d.ts +31 -0
- package/dist/extensionRegistry.d.ts.map +1 -0
- package/dist/extensionRegistry.js +48 -0
- package/dist/extensionRegistry.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -1
- package/dist/layout.d.ts +414 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +460 -0
- package/dist/layout.js.map +1 -0
- package/dist/nodeExtensions.d.ts +17 -0
- package/dist/nodeExtensions.d.ts.map +1 -0
- package/dist/nodeExtensions.js +39 -0
- package/dist/nodeExtensions.js.map +1 -0
- package/dist/nodeResolution.d.ts +29 -0
- package/dist/nodeResolution.d.ts.map +1 -0
- package/dist/nodeResolution.js +77 -0
- package/dist/nodeResolution.js.map +1 -0
- package/dist/presentationOverlay.d.ts +29 -0
- package/dist/presentationOverlay.d.ts.map +1 -0
- package/dist/presentationOverlay.js +128 -0
- package/dist/presentationOverlay.js.map +1 -0
- package/dist/presentationReconciliation.d.ts +59 -0
- package/dist/presentationReconciliation.d.ts.map +1 -0
- package/dist/presentationReconciliation.js +54 -0
- package/dist/presentationReconciliation.js.map +1 -0
- package/dist/presentationStorage.d.ts +168 -0
- package/dist/presentationStorage.d.ts.map +1 -0
- package/dist/presentationStorage.js +405 -0
- package/dist/presentationStorage.js.map +1 -0
- package/dist/semanticTransactions.d.ts +107 -0
- package/dist/semanticTransactions.d.ts.map +1 -0
- package/dist/semanticTransactions.js +86 -0
- package/dist/semanticTransactions.js.map +1 -0
- package/dist/stepFormEditing.d.ts +47 -0
- package/dist/stepFormEditing.d.ts.map +1 -0
- package/dist/stepFormEditing.js +259 -0
- package/dist/stepFormEditing.js.map +1 -0
- package/dist/themeStyles.d.ts +26 -0
- package/dist/themeStyles.d.ts.map +1 -0
- package/dist/themeStyles.js +71 -0
- package/dist/themeStyles.js.map +1 -0
- package/dist/visualResources.d.ts +30 -0
- package/dist/visualResources.d.ts.map +1 -0
- package/dist/visualResources.js +89 -0
- package/dist/visualResources.js.map +1 -0
- package/dist/vnextFlow.d.ts +57 -0
- package/dist/vnextFlow.d.ts.map +1 -0
- package/dist/vnextFlow.js +333 -0
- package/dist/vnextFlow.js.map +1 -0
- package/package.json +16 -12
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
const issue = (code, message, layer, path) => ({ severity: 'error', code, message, ...(layer === undefined ? {} : { layer }), ...(path === undefined ? {} : { path }) });
|
|
2
|
+
export function resolveTheme(input) {
|
|
3
|
+
const chain = [];
|
|
4
|
+
const visited = new Set();
|
|
5
|
+
let id = input.themeId;
|
|
6
|
+
while (id) {
|
|
7
|
+
if (visited.has(id))
|
|
8
|
+
return { status: 'unresolved', diagnostics: [issue('THEME_INHERITANCE_CYCLE', `Theme inheritance cycle at '${id}'.`)] };
|
|
9
|
+
visited.add(id);
|
|
10
|
+
const theme = input.registry.resolve('theme', id);
|
|
11
|
+
if (!theme)
|
|
12
|
+
return { status: 'unresolved', diagnostics: [issue('THEME_REGISTRY_REF_MISSING', `Theme '${id}' is not registered.`)] };
|
|
13
|
+
chain.unshift(theme);
|
|
14
|
+
id = typeof theme.extends === 'string' ? theme.extends : undefined;
|
|
15
|
+
}
|
|
16
|
+
const tokens = {};
|
|
17
|
+
const diagnostics = [];
|
|
18
|
+
for (const theme of chain) {
|
|
19
|
+
if (theme.media !== undefined && theme.media !== input.appearance)
|
|
20
|
+
continue;
|
|
21
|
+
const values = theme.tokens;
|
|
22
|
+
for (const [key, value] of Object.entries(values ?? {})) {
|
|
23
|
+
if (value && typeof value === 'object' && typeof value.hostToken === 'string') {
|
|
24
|
+
const hostKey = String(value.hostToken);
|
|
25
|
+
if (input.hostTokens?.[hostKey] === undefined)
|
|
26
|
+
diagnostics.push(issue('HOST_TOKEN_MISSING', `Host token '${hostKey}' is missing.`));
|
|
27
|
+
else
|
|
28
|
+
tokens[key] = input.hostTokens[hostKey];
|
|
29
|
+
}
|
|
30
|
+
else
|
|
31
|
+
tokens[key] = value;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (diagnostics.length > 0)
|
|
35
|
+
return { status: 'unresolved', diagnostics };
|
|
36
|
+
return { status: 'resolved', themeId: input.themeId, appearance: input.appearance, tokens: Object.freeze(tokens), diagnostics: [] };
|
|
37
|
+
}
|
|
38
|
+
const flatten = (value, prefix = '') => { if (!value || typeof value !== 'object' || Array.isArray(value))
|
|
39
|
+
return [[prefix, value]]; return Object.entries(value).flatMap(([key, child]) => flatten(child, prefix ? `${prefix}.${key}` : key)); };
|
|
40
|
+
const assign = (target, path, value) => { const parts = path.split('.'); let current = target; parts.forEach((part, index) => { if (index === parts.length - 1)
|
|
41
|
+
current[part] = value;
|
|
42
|
+
else {
|
|
43
|
+
const next = current[part];
|
|
44
|
+
current[part] = next && typeof next === 'object' ? next : {};
|
|
45
|
+
current = current[part];
|
|
46
|
+
} }); };
|
|
47
|
+
const safeValue = (value, allowCssUrls) => typeof value === 'string' ? !/(?:@import|expression\s*\(|javascript:|position\s*:\s*fixed)/i.test(value) && (allowCssUrls || !/url\s*\(/i.test(value)) : typeof value === 'number' || typeof value === 'boolean' || value === null;
|
|
48
|
+
export function resolveStyleCascade(input) {
|
|
49
|
+
const order = ['base', 'theme', 'type', 'workflow', 'instance', 'transient'];
|
|
50
|
+
const style = {};
|
|
51
|
+
const diagnostics = [];
|
|
52
|
+
for (const layer of order) {
|
|
53
|
+
const layerValue = input.layers[layer];
|
|
54
|
+
if (layerValue === undefined)
|
|
55
|
+
continue;
|
|
56
|
+
for (const [path, value] of flatten(layerValue)) {
|
|
57
|
+
if (!input.allowedProperties[layer]?.includes(path))
|
|
58
|
+
diagnostics.push(issue('STYLE_PROPERTY_NOT_ALLOWED', `Style property '${path}' is not allowed in ${layer}.`, layer, path));
|
|
59
|
+
else if (!safeValue(value, input.policy?.allowCssUrls === true))
|
|
60
|
+
diagnostics.push(issue('STYLE_VALUE_NOT_ALLOWED', `Style value for '${path}' is not allowed.`, layer, path));
|
|
61
|
+
else
|
|
62
|
+
assign(style, path, value);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (diagnostics.length > 0)
|
|
66
|
+
return { status: 'unresolved', diagnostics };
|
|
67
|
+
if (input.semanticState && typeof input.semanticState.color === 'string')
|
|
68
|
+
assign(style, 'edge.stroke', input.semanticState.color);
|
|
69
|
+
return { status: 'resolved', style, ...(input.semanticState === undefined ? {} : { semanticState: input.semanticState }), ...(input.transientState === undefined ? {} : { transientState: input.transientState }), diagnostics: [] };
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=themeStyles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"themeStyles.js","sourceRoot":"","sources":["../src/themeStyles.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ExtensionRegistry } from './extensionRegistry.js';
|
|
2
|
+
export interface VisualPolicy {
|
|
3
|
+
readonly allowedRemoteOrigins?: readonly string[];
|
|
4
|
+
readonly allowedAssetRefs?: readonly string[];
|
|
5
|
+
readonly allowedDataMediaTypes?: readonly string[];
|
|
6
|
+
readonly cspImageSources?: readonly string[];
|
|
7
|
+
readonly maxInlineBytes?: number;
|
|
8
|
+
readonly maxTotalBytes?: number;
|
|
9
|
+
readonly maxRemoteBytes?: number;
|
|
10
|
+
}
|
|
11
|
+
export interface VisualDiagnostic {
|
|
12
|
+
readonly severity: 'error';
|
|
13
|
+
readonly code: string;
|
|
14
|
+
readonly side: 'left' | 'right';
|
|
15
|
+
readonly index: number;
|
|
16
|
+
readonly message: string;
|
|
17
|
+
}
|
|
18
|
+
type Visual = Readonly<Record<string, unknown>> & {
|
|
19
|
+
readonly kind: string;
|
|
20
|
+
};
|
|
21
|
+
export declare function resolveIconStacks(stacks: Readonly<{
|
|
22
|
+
left: readonly Visual[];
|
|
23
|
+
right: readonly Visual[];
|
|
24
|
+
}>, options: Readonly<{
|
|
25
|
+
registry?: ExtensionRegistry;
|
|
26
|
+
policy?: VisualPolicy;
|
|
27
|
+
fallback?: Visual;
|
|
28
|
+
}>): Readonly<Record<string, unknown>>;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=visualResources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visualResources.d.ts","sourceRoot":"","sources":["../src/visualResources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC/E,MAAM,WAAW,YAAY;IAAG,QAAQ,CAAC,oBAAoB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE;AACzU,MAAM,WAAW,gBAAgB;IAAG,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAC1K,KAAK,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAM5E,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC;IAAE,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC;IAAE,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAAC,MAAM,CAAC,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAkB3O"}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
const error = (code, side, index) => ({ severity: 'error', code, side, index, message: `Visual resource rejected by policy (${code}).` });
|
|
2
|
+
const safeSvg = (source) => /^\s*<svg[\s>]/i.test(source) && !/<\/?(?:script|foreignObject|iframe|object|embed|style)\b|\son\w+\s*=|(?:href|src)\s*=\s*["']?\s*(?:javascript:|data:text\/html)/i.test(source);
|
|
3
|
+
const bytes = (value) => new TextEncoder().encode(value).length;
|
|
4
|
+
const containsExecutable = (value, seen = new WeakSet()) => { if (typeof value === 'function' || typeof value === 'symbol')
|
|
5
|
+
return true; if (value === null || typeof value !== 'object' || seen.has(value))
|
|
6
|
+
return false; seen.add(value); return Reflect.ownKeys(value).some(key => /^on/i.test(String(key)) || containsExecutable(value[key], seen)); };
|
|
7
|
+
export function resolveIconStacks(stacks, options) {
|
|
8
|
+
const policy = options.policy ?? {};
|
|
9
|
+
const fallback = options.fallback ?? { kind: 'text', value: '?' };
|
|
10
|
+
const diagnostics = [];
|
|
11
|
+
let total = 0;
|
|
12
|
+
const resolve = (item, side, index) => {
|
|
13
|
+
let code;
|
|
14
|
+
let size = 0;
|
|
15
|
+
if (item.kind === 'url') {
|
|
16
|
+
try {
|
|
17
|
+
const url = new URL(String(item.src));
|
|
18
|
+
const origin = url.origin;
|
|
19
|
+
if (url.protocol !== 'https:' || url.username || url.password)
|
|
20
|
+
code = 'VISUAL_URL_DENIED';
|
|
21
|
+
else if (!policy.allowedRemoteOrigins?.includes(origin))
|
|
22
|
+
code = 'VISUAL_ORIGIN_DENIED';
|
|
23
|
+
else if (!policy.cspImageSources?.includes(origin))
|
|
24
|
+
code = 'VISUAL_CSP_DENIED';
|
|
25
|
+
else {
|
|
26
|
+
size = Number(item.byteLength ?? Number.NaN);
|
|
27
|
+
if (!Number.isFinite(size) || size < 0 || size > (policy.maxRemoteBytes ?? 0))
|
|
28
|
+
code = 'VISUAL_RESOURCE_SIZE_LIMIT';
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
code = 'VISUAL_URL_DENIED';
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
else if (item.kind === 'asset') {
|
|
36
|
+
if (!policy.allowedAssetRefs?.includes(String(item.ref)))
|
|
37
|
+
code = 'VISUAL_ASSET_DENIED';
|
|
38
|
+
}
|
|
39
|
+
else if (item.kind === 'svg') {
|
|
40
|
+
const source = String(item.source ?? '');
|
|
41
|
+
size = bytes(source);
|
|
42
|
+
if (!safeSvg(source))
|
|
43
|
+
code = 'VISUAL_SVG_REJECTED';
|
|
44
|
+
else if (size > (policy.maxInlineBytes ?? 0))
|
|
45
|
+
code = 'VISUAL_RESOURCE_SIZE_LIMIT';
|
|
46
|
+
}
|
|
47
|
+
else if (item.kind === 'data') {
|
|
48
|
+
const match = /^data:([^;,]+);base64,[A-Za-z0-9+/]*={0,2}$/.exec(String(item.uri ?? ''));
|
|
49
|
+
if (!match || !policy.allowedDataMediaTypes?.includes(match[1]) || !policy.cspImageSources?.includes('data:'))
|
|
50
|
+
code = 'VISUAL_DATA_URI_DENIED';
|
|
51
|
+
else {
|
|
52
|
+
size = Math.max(Number(item.byteLength ?? 0), Math.ceil((String(item.uri).split(',')[1]?.replace(/=+$/, '').length ?? 0) * 3 / 4));
|
|
53
|
+
if (size > (policy.maxInlineBytes ?? 0))
|
|
54
|
+
code = 'VISUAL_RESOURCE_SIZE_LIMIT';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
else if (item.kind === 'icon' || item.kind === 'component') {
|
|
58
|
+
const kind = item.kind;
|
|
59
|
+
if (options.registry?.resolve(kind, String(item.ref)) === undefined)
|
|
60
|
+
code = 'VISUAL_REGISTRY_REF_MISSING';
|
|
61
|
+
else if (containsExecutable(item.props))
|
|
62
|
+
code = 'VISUAL_PROPS_DENIED';
|
|
63
|
+
}
|
|
64
|
+
else if (item.kind === 'custom-element') {
|
|
65
|
+
const tag = String(item.tag ?? '');
|
|
66
|
+
const props = item.props && typeof item.props === 'object' ? Object.keys(item.props) : [];
|
|
67
|
+
if (!/^[a-z][a-z0-9]*-[a-z0-9-]+$/.test(tag) || props.some(key => /^on/i.test(key)))
|
|
68
|
+
code = 'VISUAL_CUSTOM_ELEMENT_DENIED';
|
|
69
|
+
}
|
|
70
|
+
else if (item.kind === 'text') {
|
|
71
|
+
if (typeof item.value !== 'string')
|
|
72
|
+
code = 'VISUAL_KIND_DENIED';
|
|
73
|
+
}
|
|
74
|
+
else
|
|
75
|
+
code = 'VISUAL_KIND_DENIED';
|
|
76
|
+
if (!code && size > 0 && total + size > (policy.maxTotalBytes ?? 0))
|
|
77
|
+
code = 'VISUAL_TOTAL_SIZE_LIMIT';
|
|
78
|
+
if (code) {
|
|
79
|
+
diagnostics.push(error(code, side, index));
|
|
80
|
+
return fallback;
|
|
81
|
+
}
|
|
82
|
+
total += size;
|
|
83
|
+
return item;
|
|
84
|
+
};
|
|
85
|
+
const left = stacks.left.map((item, index) => resolve(item, 'left', index));
|
|
86
|
+
const right = stacks.right.map((item, index) => resolve(item, 'right', index));
|
|
87
|
+
return { status: diagnostics.length === 0 ? 'resolved' : 'resolved-with-fallbacks', stacks: { left, right }, diagnostics };
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=visualResources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"visualResources.js","sourceRoot":"","sources":["../src/visualResources.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { type CanonicalNode, type CanonicalRoute, type GraphDiagnostic, type WorkflowGraph } from '@beehexa/hexasync-template-model';
|
|
2
|
+
export interface VnextStepMetadata {
|
|
3
|
+
readonly providerId: string;
|
|
4
|
+
readonly stepKind: string;
|
|
5
|
+
readonly paramsSchema?: unknown;
|
|
6
|
+
readonly outputSchema?: unknown;
|
|
7
|
+
readonly routeKeys?: readonly string[] | null;
|
|
8
|
+
readonly isSubProcess?: boolean;
|
|
9
|
+
readonly providerType?: 'built-in' | 'plugin' | 'virtual' | 'reusable-workflow' | 'internal-scaffold';
|
|
10
|
+
readonly forSubprocess?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface CompileVnextRegistrySnapshotInput {
|
|
13
|
+
readonly revision: string;
|
|
14
|
+
readonly validatedRevision?: string;
|
|
15
|
+
readonly scope?: {
|
|
16
|
+
readonly kind: 'top-level' | 'subprocess';
|
|
17
|
+
readonly providerId?: string;
|
|
18
|
+
};
|
|
19
|
+
readonly metadata: readonly VnextStepMetadata[];
|
|
20
|
+
}
|
|
21
|
+
export interface VnextRegistryEntry extends VnextStepMetadata {
|
|
22
|
+
readonly registrationKey: string;
|
|
23
|
+
readonly paletteVisible: boolean;
|
|
24
|
+
}
|
|
25
|
+
export interface VnextRegistrySnapshot {
|
|
26
|
+
readonly revision: string;
|
|
27
|
+
readonly entries: readonly VnextRegistryEntry[];
|
|
28
|
+
readonly capabilities: {
|
|
29
|
+
readonly semanticSave: boolean;
|
|
30
|
+
};
|
|
31
|
+
readonly diagnostics: readonly GraphDiagnostic[];
|
|
32
|
+
}
|
|
33
|
+
export interface CompileVnextWorkflowGraphInput {
|
|
34
|
+
readonly workflow: Readonly<Record<string, unknown>>;
|
|
35
|
+
readonly metadata: readonly VnextStepMetadata[];
|
|
36
|
+
}
|
|
37
|
+
export interface VnextCanonicalRoute extends CanonicalRoute {
|
|
38
|
+
readonly sourceFamily: 'static' | 'inline-routes' | 'boolean' | 'cases' | 'onFailure';
|
|
39
|
+
}
|
|
40
|
+
export interface VnextRegistration {
|
|
41
|
+
readonly providerId: string;
|
|
42
|
+
readonly stepKind: string;
|
|
43
|
+
readonly paramsSchema?: unknown;
|
|
44
|
+
readonly outputSchema?: unknown;
|
|
45
|
+
readonly routeKeys: readonly string[] | null;
|
|
46
|
+
readonly isSubProcess: boolean;
|
|
47
|
+
}
|
|
48
|
+
export interface VnextCanonicalNode extends CanonicalNode {
|
|
49
|
+
readonly registration?: VnextRegistration;
|
|
50
|
+
}
|
|
51
|
+
export interface VnextWorkflowGraph extends WorkflowGraph {
|
|
52
|
+
readonly nodes: readonly VnextCanonicalNode[];
|
|
53
|
+
readonly routes: readonly VnextCanonicalRoute[];
|
|
54
|
+
}
|
|
55
|
+
export declare function compileVnextRegistrySnapshot(input: CompileVnextRegistrySnapshotInput): VnextRegistrySnapshot;
|
|
56
|
+
export declare function compileVnextWorkflowGraph(input: CompileVnextWorkflowGraphInput): VnextWorkflowGraph;
|
|
57
|
+
//# sourceMappingURL=vnextFlow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vnextFlow.d.ts","sourceRoot":"","sources":["../src/vnextFlow.ts"],"names":[],"mappings":"AAAA,OAAO,EAEe,KAAK,aAAa,EAAE,KAAK,cAAc,EAC3D,KAAK,eAAe,EAAuC,KAAK,aAAa,EAC9E,MAAM,kCAAkC,CAAC;AAE1C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IACvD,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAC/E,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,GAAG,mBAAmB,GAAG,mBAAmB,CAAC;IACtG,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC;AACD,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,GAAG,YAAY,CAAC;QAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7F,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACjD;AACD,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC;AACD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAChD,QAAQ,CAAC,YAAY,EAAE;QAAE,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1D,QAAQ,CAAC,WAAW,EAAE,SAAS,eAAe,EAAE,CAAC;CAClD;AACD,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,CAAC;CACjD;AACD,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,QAAQ,CAAC,YAAY,EAAE,QAAQ,GAAG,eAAe,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,CAAC;CACvF;AACD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IACvD,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;IACjE,QAAQ,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAC9E;AACD,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,QAAQ,CAAC,YAAY,CAAC,EAAE,iBAAiB,CAAC;CAC3C;AACD,MAAM,WAAW,kBAAmB,SAAQ,aAAa;IACvD,QAAQ,CAAC,KAAK,EAAE,SAAS,kBAAkB,EAAE,CAAC;IAC9C,QAAQ,CAAC,MAAM,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACjD;AAkED,wBAAgB,4BAA4B,CAC1C,KAAK,EAAE,iCAAiC,GACvC,qBAAqB,CA+BvB;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,8BAA8B,GAAG,kBAAkB,CAyPnG"}
|
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
import { compileWorkflowGraph, genericWorkflowAdapter, identitySegment, } from '@beehexa/hexasync-template-model';
|
|
2
|
+
const ADAPTER = genericWorkflowAdapter({
|
|
3
|
+
adapterId: 'vnext', adapterVersion: '1', identityFields: ['key'],
|
|
4
|
+
displayTypeFields: ['provider'], dialect: 'vnext/v1',
|
|
5
|
+
capabilities: { semanticEdit: true, presentationEdit: true },
|
|
6
|
+
});
|
|
7
|
+
const recordOf = (value) => typeof value === 'object' && value !== null && !Array.isArray(value) ? value : undefined;
|
|
8
|
+
const textOf = (value) => typeof value === 'string' && value.trim() !== '' ? value : undefined;
|
|
9
|
+
const identityOf = (value) => {
|
|
10
|
+
const text = textOf(value);
|
|
11
|
+
if (text === undefined)
|
|
12
|
+
return undefined;
|
|
13
|
+
const segment = identitySegment(text, 'key');
|
|
14
|
+
return segment && 'value' in segment ? segment.value : undefined;
|
|
15
|
+
};
|
|
16
|
+
const source = (path, canonicalField) => ({
|
|
17
|
+
adapterId: ADAPTER.id, adapterVersion: ADAPTER.version, path, derived: false,
|
|
18
|
+
...(canonicalField === undefined ? {} : { canonicalField }),
|
|
19
|
+
});
|
|
20
|
+
const fieldPath = (base, field) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(field) ? `${base}.${field}` : `${base}[${JSON.stringify(field)}]`;
|
|
21
|
+
const fingerprintOf = (value) => {
|
|
22
|
+
let hash = 2166136261;
|
|
23
|
+
const pending = [value];
|
|
24
|
+
const seen = new WeakSet();
|
|
25
|
+
const write = (text) => {
|
|
26
|
+
for (let index = 0; index < text.length; index += 1) {
|
|
27
|
+
hash ^= text.charCodeAt(index);
|
|
28
|
+
hash = Math.imul(hash, 16777619);
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
while (pending.length) {
|
|
32
|
+
const current = pending.pop();
|
|
33
|
+
if (Array.isArray(current)) {
|
|
34
|
+
if (seen.has(current)) {
|
|
35
|
+
write('[cycle]');
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
seen.add(current);
|
|
39
|
+
write(`array:${current.length};`);
|
|
40
|
+
for (let index = current.length - 1; index >= 0; index -= 1)
|
|
41
|
+
pending.push(current[index]);
|
|
42
|
+
continue;
|
|
43
|
+
}
|
|
44
|
+
const record = recordOf(current);
|
|
45
|
+
if (record) {
|
|
46
|
+
if (seen.has(record)) {
|
|
47
|
+
write('{cycle}');
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
seen.add(record);
|
|
51
|
+
const keys = Object.keys(record).sort();
|
|
52
|
+
write(`object:${keys.length};`);
|
|
53
|
+
for (let index = keys.length - 1; index >= 0; index -= 1) {
|
|
54
|
+
const key = keys[index];
|
|
55
|
+
pending.push(record[key]);
|
|
56
|
+
pending.push(`key:${key}`);
|
|
57
|
+
}
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
write(`${typeof current}:${String(current)};`);
|
|
61
|
+
}
|
|
62
|
+
return `fnv1a32:${(hash >>> 0).toString(16).padStart(8, '0')}`;
|
|
63
|
+
};
|
|
64
|
+
const issue = (code, message, path, elementId) => ({
|
|
65
|
+
code, severity: 'warning', phase: 'compile', message, source: source(path), recoverable: true,
|
|
66
|
+
...(elementId === undefined ? {} : { elementId }),
|
|
67
|
+
});
|
|
68
|
+
export function compileVnextRegistrySnapshot(input) {
|
|
69
|
+
const stale = input.validatedRevision !== undefined && input.validatedRevision !== input.revision;
|
|
70
|
+
const entries = input.metadata.map((meta) => {
|
|
71
|
+
const scopeAllows = meta.forSubprocess === undefined
|
|
72
|
+
|| (input.scope?.kind === 'subprocess' && meta.forSubprocess === input.scope.providerId);
|
|
73
|
+
return {
|
|
74
|
+
...meta,
|
|
75
|
+
registrationKey: `vnext/v1::${meta.providerId}`,
|
|
76
|
+
paletteVisible: meta.providerType !== 'internal-scaffold' && scopeAllows,
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
return {
|
|
80
|
+
revision: input.revision,
|
|
81
|
+
entries,
|
|
82
|
+
capabilities: { semanticSave: !stale },
|
|
83
|
+
diagnostics: stale ? [{
|
|
84
|
+
code: 'STALE_VNEXT_REGISTRY_REVISION',
|
|
85
|
+
severity: 'error',
|
|
86
|
+
phase: 'compile',
|
|
87
|
+
message: 'Registry revision changed; semantic save requires revalidation.',
|
|
88
|
+
source: {
|
|
89
|
+
adapterId: ADAPTER.id, adapterVersion: ADAPTER.version,
|
|
90
|
+
path: '$.revision', derived: false,
|
|
91
|
+
},
|
|
92
|
+
details: {
|
|
93
|
+
revision: input.revision,
|
|
94
|
+
validatedRevision: input.validatedRevision,
|
|
95
|
+
},
|
|
96
|
+
recoverable: true,
|
|
97
|
+
}] : [],
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
export function compileVnextWorkflowGraph(input) {
|
|
101
|
+
const workflowId = textOf(input.workflow.name) ?? textOf(input.workflow.id) ?? 'workflow';
|
|
102
|
+
const rawSteps = Array.isArray(input.workflow.steps) ? input.workflow.steps : [];
|
|
103
|
+
const registry = new Map();
|
|
104
|
+
const duplicateProviders = new Set();
|
|
105
|
+
for (const meta of input.metadata) {
|
|
106
|
+
if (registry.has(meta.providerId))
|
|
107
|
+
duplicateProviders.add(meta.providerId);
|
|
108
|
+
else
|
|
109
|
+
registry.set(meta.providerId, meta);
|
|
110
|
+
}
|
|
111
|
+
const nodeSteps = rawSteps.map((raw) => {
|
|
112
|
+
const step = recordOf(raw);
|
|
113
|
+
if (!step)
|
|
114
|
+
return raw;
|
|
115
|
+
const { next, onFailure, true: yes, false: no, cases, default: otherwise, routing, steps, ...node } = step;
|
|
116
|
+
void next;
|
|
117
|
+
void onFailure;
|
|
118
|
+
void yes;
|
|
119
|
+
void no;
|
|
120
|
+
void cases;
|
|
121
|
+
void otherwise;
|
|
122
|
+
void routing;
|
|
123
|
+
void steps;
|
|
124
|
+
return node;
|
|
125
|
+
});
|
|
126
|
+
const base = compileWorkflowGraph({ id: workflowId, steps: nodeSteps }, { ...ADAPTER, container: { documentId: workflowId, workflowId, scope: 'top-level' } });
|
|
127
|
+
const diagnostics = [...base.diagnostics];
|
|
128
|
+
for (const provider of [...duplicateProviders].sort()) {
|
|
129
|
+
diagnostics.push(issue('DUPLICATE_VNEXT_PROVIDER', `Provider '${provider}' has multiple metadata registrations.`, '$.metadata'));
|
|
130
|
+
}
|
|
131
|
+
if (input.workflow.steps !== undefined && !Array.isArray(input.workflow.steps)) {
|
|
132
|
+
diagnostics.push(issue('INVALID_STEPS_COLLECTION', 'The steps field must be an array.', '$.steps'));
|
|
133
|
+
}
|
|
134
|
+
const rawByKey = new Map();
|
|
135
|
+
rawSteps.forEach((raw, index) => {
|
|
136
|
+
const step = recordOf(raw);
|
|
137
|
+
const key = identityOf(step?.key);
|
|
138
|
+
if (step && key && !rawByKey.has(key))
|
|
139
|
+
rawByKey.set(key, { step, index });
|
|
140
|
+
});
|
|
141
|
+
const nodes = base.nodes.map((node) => {
|
|
142
|
+
const raw = rawByKey.get(node.sourceIdentity)?.step;
|
|
143
|
+
const provider = textOf(raw?.provider);
|
|
144
|
+
const meta = provider === undefined ? undefined : registry.get(provider);
|
|
145
|
+
if (raw && provider === undefined)
|
|
146
|
+
diagnostics.push(issue('MISSING_VNEXT_PROVIDER', `Step '${node.sourceIdentity}' requires a provider.`, node.provenance[0].path + '.provider', node.id));
|
|
147
|
+
if (provider && !meta)
|
|
148
|
+
diagnostics.push(issue('UNKNOWN_VNEXT_PROVIDER', `Unregistered vNext provider '${provider}'.`, node.provenance[0].path + '.provider', node.id));
|
|
149
|
+
return {
|
|
150
|
+
...node, source: (raw ?? node.source),
|
|
151
|
+
kind: meta?.stepKind ?? node.kind, displayType: meta?.stepKind ?? node.displayType,
|
|
152
|
+
...(meta === undefined ? {} : { registration: {
|
|
153
|
+
providerId: meta.providerId, stepKind: meta.stepKind,
|
|
154
|
+
...(meta.paramsSchema === undefined ? {} : { paramsSchema: meta.paramsSchema }),
|
|
155
|
+
...(meta.outputSchema === undefined ? {} : { outputSchema: meta.outputSchema }),
|
|
156
|
+
routeKeys: meta.routeKeys === undefined || meta.routeKeys === null ? null : [...meta.routeKeys],
|
|
157
|
+
isSubProcess: meta.isSubProcess ?? false,
|
|
158
|
+
} }),
|
|
159
|
+
};
|
|
160
|
+
});
|
|
161
|
+
const byIdentity = new Map(nodes.map((node) => [node.sourceIdentity, node]));
|
|
162
|
+
const routes = [];
|
|
163
|
+
const edges = [];
|
|
164
|
+
let unsafeWriteback = duplicateProviders.size > 0;
|
|
165
|
+
const add = (node, draft) => {
|
|
166
|
+
const output = node.ports.find((port) => port.direction === 'output');
|
|
167
|
+
const id = `${node.id}|route|${draft.path.length}:${draft.path}|${draft.role}`;
|
|
168
|
+
const provenance = [source(draft.path, 'targetIdentity')];
|
|
169
|
+
routes.push({
|
|
170
|
+
id, sourceNodeId: node.id, sourcePortId: output.id, kind: draft.kind,
|
|
171
|
+
role: draft.role, targetIdentity: draft.target, order: draft.order,
|
|
172
|
+
...(draft.label === undefined ? {} : { label: draft.label }),
|
|
173
|
+
...(draft.expression === undefined ? {} : { expression: { provider: 'jsonata', source: draft.expression } }),
|
|
174
|
+
sourceFamily: draft.family, provenance,
|
|
175
|
+
});
|
|
176
|
+
const target = byIdentity.get(draft.target);
|
|
177
|
+
const inputPort = target?.ports.find((port) => port.direction === 'input');
|
|
178
|
+
if (!target || !inputPort) {
|
|
179
|
+
diagnostics.push(issue('MISSING_ROUTE_TARGET', `Missing route target '${draft.target}'.`, draft.path, id));
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
edges.push({
|
|
183
|
+
id: id + '|edge|' + target.id,
|
|
184
|
+
source: { nodeId: node.id, portId: output.id },
|
|
185
|
+
target: { nodeId: target.id, portId: inputPort.id },
|
|
186
|
+
kind: draft.kind, provenance, capabilities: { reconnect: true, delete: true },
|
|
187
|
+
});
|
|
188
|
+
};
|
|
189
|
+
for (const node of nodes) {
|
|
190
|
+
const rawEntry = rawByKey.get(node.sourceIdentity);
|
|
191
|
+
if (!rawEntry)
|
|
192
|
+
continue;
|
|
193
|
+
const { step } = rawEntry;
|
|
194
|
+
const basePath = `$.steps[${rawEntry.index}]`;
|
|
195
|
+
const failure = textOf(step.onFailure);
|
|
196
|
+
if (failure)
|
|
197
|
+
add(node, {
|
|
198
|
+
kind: 'onFailure', role: 'failure', label: 'Failed result', target: failure,
|
|
199
|
+
order: 0, path: basePath + '.onFailure', family: 'onFailure',
|
|
200
|
+
});
|
|
201
|
+
if (Object.hasOwn(step, 'routing')) {
|
|
202
|
+
unsafeWriteback = true;
|
|
203
|
+
diagnostics.push(issue('UNSUPPORTED_VNEXT_ROUTING_FIELD', "Top-level 'routing' is not accepted by the vNext backend compiler.", basePath + '.routing', node.id));
|
|
204
|
+
}
|
|
205
|
+
const meta = registry.get(textOf(step.provider) ?? '');
|
|
206
|
+
const yes = textOf(step.true);
|
|
207
|
+
const no = textOf(step.false);
|
|
208
|
+
const hasCases = Object.hasOwn(step, 'cases');
|
|
209
|
+
const cases = recordOf(step.cases);
|
|
210
|
+
const isBoolean = meta?.routeKeys?.some((key) => key === 'true' || key === 'false') === true;
|
|
211
|
+
const isDynamicDecision = meta?.stepKind === 'decision' && (meta.routeKeys === null || meta.routeKeys === undefined);
|
|
212
|
+
if (!isBoolean && (yes || no)) {
|
|
213
|
+
unsafeWriteback = true;
|
|
214
|
+
diagnostics.push(issue('UNSUPPORTED_VNEXT_BOOLEAN_ROUTES', "Fields 'true' and 'false' require registered boolean route keys.", basePath, node.id));
|
|
215
|
+
}
|
|
216
|
+
if (isBoolean) {
|
|
217
|
+
for (const required of meta?.routeKeys ?? []) {
|
|
218
|
+
if ((required === 'true' && !yes) || (required === 'false' && !no)) {
|
|
219
|
+
unsafeWriteback = true;
|
|
220
|
+
diagnostics.push(issue('MISSING_VNEXT_FIXED_ROUTE', `Registered route '${required}' must be wired.`, basePath + '.' + required, node.id));
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
if (hasCases || Object.hasOwn(step, 'default')) {
|
|
224
|
+
unsafeWriteback = true;
|
|
225
|
+
diagnostics.push(issue('UNSUPPORTED_VNEXT_ROUTE_FAMILY', 'Boolean decisions cannot also define cases/default routing.', hasCases ? basePath + '.cases' : basePath + '.default', node.id));
|
|
226
|
+
}
|
|
227
|
+
if (yes)
|
|
228
|
+
add(node, { kind: 'branch', role: 'true', label: 'true', target: yes, order: 0, path: basePath + '.true', family: 'boolean' });
|
|
229
|
+
if (no)
|
|
230
|
+
add(node, { kind: 'branch', role: 'false', label: 'false', target: no, order: 1, path: basePath + '.false', family: 'boolean' });
|
|
231
|
+
}
|
|
232
|
+
else if (hasCases && isDynamicDecision) {
|
|
233
|
+
if (!cases || Object.keys(cases).length === 0) {
|
|
234
|
+
unsafeWriteback = true;
|
|
235
|
+
diagnostics.push(issue('INVALID_VNEXT_CASES', 'Cases must be a non-empty route map.', basePath + '.cases', node.id));
|
|
236
|
+
}
|
|
237
|
+
let order = 0;
|
|
238
|
+
for (const [label, rawTarget] of Object.entries(cases ?? {})) {
|
|
239
|
+
const target = textOf(rawTarget);
|
|
240
|
+
const path = fieldPath(basePath + '.cases', label);
|
|
241
|
+
if (target)
|
|
242
|
+
add(node, {
|
|
243
|
+
kind: 'branch', role: label === 'default' ? 'default' : 'case', label,
|
|
244
|
+
target, order: order++, path, family: 'cases',
|
|
245
|
+
});
|
|
246
|
+
else {
|
|
247
|
+
unsafeWriteback = true;
|
|
248
|
+
diagnostics.push(issue('INVALID_VNEXT_CASE_TARGET', 'Case targets must be non-blank strings.', path, node.id));
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (Object.hasOwn(step, 'default')) {
|
|
252
|
+
unsafeWriteback = true;
|
|
253
|
+
diagnostics.push(issue('UNSUPPORTED_VNEXT_DEFAULT_FIELD', "The vNext backend requires fallback as the 'default' cases entry.", basePath + '.default', node.id));
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
else if (hasCases) {
|
|
257
|
+
unsafeWriteback = true;
|
|
258
|
+
diagnostics.push(issue('UNSUPPORTED_VNEXT_CASES', "The 'cases' route family requires a registered dynamic decision provider.", basePath + '.cases', node.id));
|
|
259
|
+
}
|
|
260
|
+
else {
|
|
261
|
+
const nextText = textOf(step.next);
|
|
262
|
+
const next = recordOf(step.next);
|
|
263
|
+
if (nextText)
|
|
264
|
+
add(node, { kind: 'next', role: 'success', target: nextText, order: 0, path: basePath + '.next', family: 'static' });
|
|
265
|
+
else if (next) {
|
|
266
|
+
const expression = textOf(next.routeKey);
|
|
267
|
+
const map = recordOf(next.routes);
|
|
268
|
+
const usableRoutes = map === undefined
|
|
269
|
+
? []
|
|
270
|
+
: Object.entries(map).filter((entry) => textOf(entry[1]) !== undefined)
|
|
271
|
+
.map(([label, target]) => [label, target]);
|
|
272
|
+
if (!expression || usableRoutes.length === 0) {
|
|
273
|
+
unsafeWriteback = true;
|
|
274
|
+
diagnostics.push(issue('INVALID_VNEXT_INLINE_NEXT', 'Inline next requires routeKey and routes.', basePath + '.next', node.id));
|
|
275
|
+
}
|
|
276
|
+
else {
|
|
277
|
+
let order = 0;
|
|
278
|
+
for (const [label, rawTarget] of Object.entries(map ?? {})) {
|
|
279
|
+
const target = textOf(rawTarget);
|
|
280
|
+
if (!target) {
|
|
281
|
+
unsafeWriteback = true;
|
|
282
|
+
diagnostics.push(issue('INVALID_VNEXT_INLINE_ROUTE_TARGET', 'Inline route targets must be non-blank strings.', fieldPath(basePath + '.next.routes', label), node.id));
|
|
283
|
+
continue;
|
|
284
|
+
}
|
|
285
|
+
add(node, { kind: 'inline-route', role: 'route', label, target, order: order++, path: fieldPath(basePath + '.next.routes', label), family: 'inline-routes', expression });
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
const pending = [];
|
|
291
|
+
const visitedNested = new WeakSet();
|
|
292
|
+
if (meta?.isSubProcess === true && Array.isArray(step.steps)) {
|
|
293
|
+
pending.push({ steps: step.steps, path: basePath + '.steps' });
|
|
294
|
+
}
|
|
295
|
+
while (pending.length) {
|
|
296
|
+
const current = pending.pop();
|
|
297
|
+
if (visitedNested.has(current.steps)) {
|
|
298
|
+
unsafeWriteback = true;
|
|
299
|
+
diagnostics.push(issue('INVALID_VNEXT_SUBPROCESS_CYCLE', 'Cyclic nested steps are unsupported.', current.path, node.id));
|
|
300
|
+
continue;
|
|
301
|
+
}
|
|
302
|
+
visitedNested.add(current.steps);
|
|
303
|
+
current.steps.forEach((raw, index) => {
|
|
304
|
+
const inner = recordOf(raw);
|
|
305
|
+
if (!inner)
|
|
306
|
+
return;
|
|
307
|
+
const path = `${current.path}[${index}]`;
|
|
308
|
+
if (recordOf(inner.next)) {
|
|
309
|
+
unsafeWriteback = true;
|
|
310
|
+
diagnostics.push(issue('UNSUPPORTED_SUBPROCESS_INLINE_NEXT', 'Inline object next is not compiled inside a vNext subprocess.', path + '.next', node.id));
|
|
311
|
+
}
|
|
312
|
+
const innerMeta = registry.get(textOf(inner.provider) ?? '');
|
|
313
|
+
if (innerMeta?.isSubProcess === true && Array.isArray(inner.steps)) {
|
|
314
|
+
pending.push({ steps: inner.steps, path: path + '.steps' });
|
|
315
|
+
}
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
const capabilities = { semanticEdit: !unsafeWriteback, presentationEdit: true };
|
|
320
|
+
const finalNodes = nodes.map((node) => ({ ...node, capabilities }));
|
|
321
|
+
const finalEdges = edges.map((edge) => ({
|
|
322
|
+
...edge,
|
|
323
|
+
capabilities: { reconnect: capabilities.semanticEdit, delete: capabilities.semanticEdit },
|
|
324
|
+
}));
|
|
325
|
+
return {
|
|
326
|
+
...base,
|
|
327
|
+
sourceFingerprint: fingerprintOf({ workflow: input.workflow, metadata: input.metadata }),
|
|
328
|
+
nodes: finalNodes, ports: finalNodes.flatMap((node) => node.ports), routes, edges: finalEdges,
|
|
329
|
+
capabilities,
|
|
330
|
+
diagnostics,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=vnextFlow.js.map
|