@notmrabhi/flowforge 0.1.105 → 0.1.107

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.
@@ -1 +1 @@
1
- {"version":3,"file":"buildBackendPayload-c7Arn1ji.js","sources":["../src/payload/buildBackendPayload.ts"],"sourcesContent":["/**\n * buildBackendPayload — generic BPMN/DMN/canvasState emitter driven by each\n * task's `ui.bpmnEmit` block. Consumer ships per-task bpmnEmit specs from\n * the backend; the package handles the walk.\n *\n * Originally lived in IAM as `flowforgeStateToBackendJson`. Moved into the\n * package so every consumer gets the same emitter — and so DMN/filter/\n * approval fixes ship once, to everyone.\n *\n * Consumer injects:\n * - canvasState — `{ slots, branches }` from the canvas\n * - tasksByKey — `{ [descriptorType]: ApplicationTask }` lookup\n * - context — host-specific scalars (customerKey, workflowName)\n * - config — IAM-shaped defaults (path prefix, end-event ids,\n * trigger→category map, scheduler events)\n *\n * Returns a JSON object ready to POST to the backend.\n */\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport type CanvasSlot = {\n id: string;\n kind?: string;\n descriptorType?: string;\n nodeData?: Record<string, unknown>;\n formData?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nexport type CanvasState = {\n slots?: CanvasSlot[];\n branches?: Record<string, unknown>;\n};\n\nexport interface FieldRef {\n from: 'literal' | 'task' | 'ctx' | 'slot' | 'formData';\n key?: string;\n value?: unknown;\n}\n\nexport interface ExtensionFieldSpec {\n name: string;\n source?: {\n type: 'literal' | 'json' | 'taskConfig' | 'formData';\n value?: unknown;\n shape?: Record<string, FieldRef>;\n passthrough?: boolean;\n exclude?: string[];\n key?: string;\n /**\n * For a `formData` passthrough: wrap the resulting object under this key\n * before stringifying. e.g. `wrapKey: 'input'` turns\n * `{noOfDays, action}` into `{\"input\":{\"noOfDays\":…,\"action\":…}}` — the\n * shape the backend expects for `inputConfiguration`.\n */\n wrapKey?: string;\n };\n}\n\nexport interface ServiceTaskSpec {\n idTemplate: string;\n name?: string;\n flowableClass?: string;\n extensionFields?: ExtensionFieldSpec[];\n}\n\nexport interface GatewaySpec {\n idTemplate: string;\n name?: string;\n}\n\nexport interface TemplateFlowSpec {\n from: string;\n to: string;\n idTemplate?: string;\n condition?: string | null;\n}\n\nexport interface DmnOutputSpec {\n id: string;\n label?: string;\n name: string;\n typeRef?: string;\n}\n\nexport interface DmnEmitSpec {\n tableName: string;\n inputExpr: string;\n hitPolicy?: string;\n outputs?: DmnOutputSpec[];\n operatorMap?: Record<string, string>;\n valuesField?: string;\n /**\n * Fallback strategy. `'negation'` emits an extra rule that fires only when\n * NONE of the configured conditions match — its output is the value(s) of\n * the form's `fallback` field. The expression is `!((c1) || (c2) || …)`.\n */\n fallback?: 'negation' | string;\n /** Form field holding the fallback value(s). Defaults to `fallback`. */\n fallbackField?: string;\n}\n\n/**\n * Builds a single JUEL boolean expression from a slot's saved conditions —\n * for a pass/fail filter gateway. Fully data-driven: the host supplies the\n * operator map (e.g. `{ eq: '==', contains: '.contains' }`) at registration,\n * and the LHS path prefix comes from `config.conditionPathPrefix`. The package\n * hardcodes nothing about field names, operators, or targets.\n *\n * The computed expression is exposed to `templateFlows` / `outgoingConditions`\n * as the interpolation tokens `${pass}` (the expression) and `${fail}` (its\n * negation), so the registration declares the wiring:\n * outgoingConditions: { pass: '${pass}' }\n * templateFlows: [{ from: '${id}', to: '${endFailure}', condition: '${fail}' }]\n */\nexport interface ConditionEmitSpec {\n /** formData key holding the condition rows. Default `'conditions'`. */\n conditionsField?: string;\n /** operator token → JUEL operator (e.g. `{ eq: '==', contains: '.contains' }`). */\n operatorMap?: Record<string, string>;\n /** LHS path prefix; defaults to `config.conditionPathPrefix`. */\n pathPrefix?: string;\n}\n\nexport interface BpmnEmitSpec {\n kind: 'linear' | 'gated' | 'filter' | 'approval';\n serviceTasks?: ServiceTaskSpec[];\n gateway?: GatewaySpec;\n templateFlows?: TemplateFlowSpec[];\n outgoingConditions?: Record<string, string>;\n dmnEmit?: DmnEmitSpec;\n /** Build a pass/fail JUEL expression from saved conditions (filter gateway). */\n conditionEmit?: ConditionEmitSpec;\n callActivity?: Record<string, unknown>;\n}\n\nexport interface ApplicationTaskLike {\n name?: string;\n taskKey?: string;\n applicationUuid?: string;\n configuration?: unknown[];\n ui?: { bpmnEmit?: BpmnEmitSpec; [key: string]: unknown };\n [key: string]: unknown;\n}\n\nexport interface BuildPayloadContext {\n customerKey: string;\n workflowName: string;\n /** Anything else the host wants exposed via `from: 'ctx', key: '...'`. */\n [key: string]: unknown;\n}\n\nexport interface BuildPayloadConfig {\n /**\n * Map of trigger eventType → workflowCategory string. Defaults to a small\n * IAM-shaped fallback; consumers should pass the full map they use.\n */\n triggerToCategory?: Record<string, string>;\n /** eventType values that should set `sources: ['SCHEDULER']` and skip the message block. */\n schedulerEventTypes?: string[];\n /** DMN LHS prefix for condition expressions (default IAM-style). */\n conditionPathPrefix?: string;\n /** Fallback workflowCategory when eventType isn't mapped. */\n defaultWorkflowCategory?: string;\n /** End-event ids — override per backend convention. */\n endEventIds?: { success: string; failure: string; rejected: string };\n /** Names rendered on end events. */\n endEventNames?: { success: string; failure: string; rejected: string };\n /** Start event id used in the outer chain. */\n startEventId?: string;\n /**\n * Canonical default shape for a non-event trigger's `eventConfig.config`,\n * keyed by trigger `type` (e.g. `scheduler`). The backend expects the FULL\n * config object (all keys present, even when the user only set a few). The\n * package can't know a host's scheduler field names, so the host supplies\n * the neutral defaults here; the trigger slot's saved formData is merged on\n * top. Example:\n * { scheduler: { triggerFrequency: null, startDateTime: null, interval: 1,\n * timings: [], dateTime: null, daysOfMonth: [],\n * daysOfWeek: [], expression: null, timeZone: null } }\n */\n triggerConfigDefaults?: Record<string, Record<string, unknown>>;\n}\n\nexport interface BuildPayloadOptions {\n state: CanvasState;\n tasksByKey: Record<string, ApplicationTaskLike>;\n context: BuildPayloadContext;\n config?: BuildPayloadConfig;\n}\n\n// ─── Defaults ──────────────────────────────────────────────────────────────\n\n// Package defaults are deliberately neutral — anything tenant- or\n// product-specific (trigger event types, default category, the DMN LHS\n// prefix) MUST come from the consumer's `config`. We only ship defaults\n// for engine-neutral BPMN scalars (start/end ids and end-event names).\nconst DEFAULTS: Required<BuildPayloadConfig> = {\n triggerToCategory: {},\n schedulerEventTypes: [],\n conditionPathPrefix: '',\n defaultWorkflowCategory: '',\n endEventIds: {\n success: 'endEventSuccess',\n failure: 'endEventFailure',\n rejected: 'endEventRejected',\n },\n endEventNames: {\n success: 'Success',\n failure: 'Failure',\n rejected: 'Rejected',\n },\n startEventId: 'startEvent',\n triggerConfigDefaults: {},\n};\n\n/**\n * Strip FlowForge-internal, display-only keys (anything starting with `_`,\n * e.g. `_optionLabels`, `_conditionConfig`) from an object before it goes to\n * the backend. Returns a shallow copy.\n */\nfunction stripInternalKeys(obj: unknown): Record<string, unknown> {\n if (!obj || typeof obj !== 'object') return {};\n const out: Record<string, unknown> = {};\n Object.keys(obj as Record<string, unknown>).forEach((k) => {\n if (!k.startsWith('_')) out[k] = (obj as Record<string, unknown>)[k];\n });\n return out;\n}\n\nconst NON_TASK_KINDS = new Set([\n 'start',\n 'end',\n 'triggerFixed',\n 'addTrigger',\n 'addStep',\n]);\nconst isTaskSlot = (slot: CanvasSlot): boolean =>\n !!slot && !NON_TASK_KINDS.has(String(slot.kind ?? ''));\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\nfunction interpolate(tpl: string | null | undefined, ctx: Record<string, unknown>): string {\n if (tpl == null) return '';\n return String(tpl).replace(/\\$\\{(\\w+)\\}/g, (m, k) =>\n Object.prototype.hasOwnProperty.call(ctx, k) ? String(ctx[k]) : m\n );\n}\n\ninterface ResolveCtx {\n task: ApplicationTaskLike;\n slot: CanvasSlot;\n ctx: BuildPayloadContext;\n}\n\nfunction resolveFieldRef(ref: FieldRef | undefined, ctx: ResolveCtx): string {\n if (!ref || typeof ref !== 'object') return '';\n const { from, key, value } = ref;\n if (from === 'literal') return value === undefined ? '' : String(value);\n if (from === 'task') return String((ctx.task as Record<string, unknown>)?.[key ?? ''] ?? '');\n if (from === 'ctx') return String((ctx.ctx as Record<string, unknown>)?.[key ?? ''] ?? '');\n if (from === 'slot') return String((ctx.slot as Record<string, unknown>)?.[key ?? ''] ?? '');\n if (from === 'formData') return String(ctx.slot?.formData?.[key ?? ''] ?? '');\n return '';\n}\n\nfunction buildExtensionStringValue(field: ExtensionFieldSpec, ctx: ResolveCtx): string {\n const source = field?.source;\n if (!source) return '';\n if (source.type === 'literal') {\n return typeof source.value === 'string'\n ? source.value\n : JSON.stringify(source.value ?? '');\n }\n if (source.type === 'json' || source.type === 'taskConfig') {\n const shape = source.shape || {};\n const out: Record<string, string> = {};\n Object.keys(shape).forEach((k) => {\n out[k] = resolveFieldRef(shape[k], ctx);\n });\n return JSON.stringify(out);\n }\n if (source.type === 'formData') {\n if (source.passthrough) {\n const exclude = new Set(source.exclude || []);\n const out: Record<string, unknown> = {};\n const fd = ctx.slot?.formData ?? {};\n Object.keys(fd).forEach((k) => {\n // Drop FlowForge-internal display keys (_optionLabels, _conditionConfig)\n // and any host-excluded keys — the backend wants the clean input only.\n if (k.startsWith('_')) return;\n if (!exclude.has(k)) out[k] = fd[k];\n });\n const wrapped = source.wrapKey ? { [source.wrapKey]: out } : out;\n return JSON.stringify(wrapped);\n }\n return String(ctx.slot?.formData?.[source.key ?? ''] ?? '');\n }\n return '';\n}\n\n/** Walk a dotted path against a plain object. Returns undefined on miss. */\nfunction getValueByPath(obj: unknown, path: string): unknown {\n if (!obj || typeof obj !== 'object' || !path) return undefined;\n return path.split('.').reduce<unknown>((acc, key) => {\n if (acc == null || typeof acc !== 'object') return undefined;\n return (acc as Record<string, unknown>)[key];\n }, obj);\n}\n\n// ─── DMN rule builder ──────────────────────────────────────────────────────\n\ninterface ConditionEntry {\n field?: string;\n fieldLabel?: string;\n key?: string;\n operator?: string;\n value?: string | number | boolean | null;\n connector?: 'and' | 'or';\n logicalOperator?: 'AND' | 'OR';\n}\n\nfunction buildDmnRules(\n dmnSpec: DmnEmitSpec,\n slot: CanvasSlot,\n pathPrefix: string\n): Array<{\n id: string;\n inputEntries: Array<{ id: string; text: string }>;\n outputEntries: Array<{ id: string; text: string }>;\n}> {\n const opMap = dmnSpec.operatorMap || {};\n const valuesField = dmnSpec.valuesField || 'groups';\n\n const toJuel = (cond: ConditionEntry): string => {\n const op = opMap[String(cond?.operator ?? '')] ?? '==';\n const lhs = `${pathPrefix}.${cond?.key ?? cond?.field ?? ''}`;\n const rhs = `'${String(cond?.value ?? '')}'`;\n if (op.startsWith('.')) return `${lhs}${op}(${rhs})`;\n if (op.startsWith('!.')) return `!${lhs}${op.slice(1)}(${rhs})`;\n return `${lhs} ${op} ${rhs}`;\n };\n\n const entriesToExpression = (entries: ConditionEntry[] | undefined): string | null => {\n const list = Array.isArray(entries) ? entries : [];\n if (list.length === 0) return null;\n const parts = list.map(toJuel);\n const isOr = list[0]?.connector === 'or' || list[0]?.logicalOperator === 'OR';\n const logical = isOr ? '||' : '&&';\n return parts.join(` ${logical} `);\n };\n\n const rules: Array<{\n id: string;\n inputEntries: Array<{ id: string; text: string }>;\n outputEntries: Array<{ id: string; text: string }>;\n }> = [];\n let ruleNum = 1;\n const pushRule = (expression: string | null, outputValue: unknown) => {\n rules.push({\n id: `rule${ruleNum}`,\n inputEntries: [\n {\n id: `rule${ruleNum}InputEntry1`,\n text: expression ? `\\${(${expression})}` : '',\n },\n ],\n outputEntries: [\n {\n id: `rule${ruleNum}OutputEntry1`,\n text: `\"${outputValue}\"`,\n },\n ],\n });\n ruleNum += 1;\n };\n\n // Shape A — IAM-legacy groupBlocks[].\n const blocks = Array.isArray(slot?.formData?.groupBlocks)\n ? (slot.formData!.groupBlocks as Array<{\n conditions?: ConditionEntry[];\n [k: string]: unknown;\n }>)\n : [];\n if (blocks.length > 0) {\n blocks.forEach((block) => {\n const values = Array.isArray(block?.[valuesField])\n ? (block[valuesField] as unknown[])\n : [];\n const expression = entriesToExpression(block?.conditions);\n values.forEach((v) => pushRule(expression, v));\n });\n return rules;\n }\n\n // Shape B — FlowForm When-builder.\n const fd = (slot?.formData ?? {}) as Record<string, unknown>;\n // eslint-disable-next-line no-underscore-dangle\n const condCfg = (fd._conditionConfig ?? fd.conditionConfig) as\n | Record<string, ConditionEntry[]>\n | undefined;\n // Collect every condition expression so a `negation` fallback can be the\n // negation of their union (fires only when none match).\n const allExpressions: string[] = [];\n if (condCfg && typeof condCfg === 'object') {\n Object.keys(condCfg).forEach((fieldKey) => {\n const conditions = condCfg[fieldKey];\n const expression = entriesToExpression(conditions);\n if (expression) allExpressions.push(expression);\n // The conditionConfig key can be either a plain field name OR a dotted\n // formik path (e.g. `attributeMapping.rules.0.targetField`). Resolve\n // both shapes — first try direct, then walk the path.\n const fieldValue =\n Object.prototype.hasOwnProperty.call(fd, fieldKey)\n ? fd[fieldKey]\n : getValueByPath(fd, fieldKey);\n if (Array.isArray(fieldValue)) {\n fieldValue.forEach((v) => {\n const out =\n typeof v === 'object' && v !== null\n ? (v as { value?: unknown; label?: unknown }).value ??\n (v as { label?: unknown }).label ??\n v\n : v;\n pushRule(expression, out);\n });\n } else if (\n fieldValue !== undefined &&\n fieldValue !== null &&\n fieldValue !== ''\n ) {\n pushRule(expression, fieldValue);\n } else if (expression) {\n pushRule(expression, '');\n }\n });\n }\n\n // ── Fallback rule (negation) — fires only when NONE of the conditions match.\n // Output = the form's `fallback` field value(s). With no conditions present,\n // there's nothing to negate, so the fallback becomes an always-true rule.\n if (dmnSpec.fallback === 'negation') {\n const fallbackKey = dmnSpec.fallbackField || 'fallback';\n const rawFallback = fd[fallbackKey];\n const fallbackValues = Array.isArray(rawFallback)\n ? rawFallback\n : rawFallback != null && rawFallback !== ''\n ? [rawFallback]\n : [];\n if (fallbackValues.length > 0) {\n const negation = allExpressions.length > 0\n ? `!(${allExpressions.map((e) => `(${e})`).join(' || ')})`\n : null;\n fallbackValues.forEach((v) => {\n const out =\n typeof v === 'object' && v !== null\n ? (v as { value?: unknown; label?: unknown }).value ??\n (v as { label?: unknown }).label ??\n v\n : v;\n pushRule(negation, out);\n });\n }\n }\n return rules;\n}\n\n/**\n * Build a single JUEL boolean expression (no surrounding `${…}`) from a slot's\n * saved condition rows, for a pass/fail filter gateway. Mirrors buildDmnRules'\n * operator handling. Returns '' when there are no conditions.\n */\nfunction buildConditionExpression(\n spec: ConditionEmitSpec,\n slot: CanvasSlot,\n defaultPrefix: string\n): string {\n const opMap = spec.operatorMap || {};\n const prefix = spec.pathPrefix ?? defaultPrefix;\n const field = spec.conditionsField || 'conditions';\n const raw = (slot?.formData as Record<string, unknown> | undefined)?.[field];\n const list = Array.isArray(raw) ? (raw as ConditionEntry[]) : [];\n if (list.length === 0) return '';\n\n const toJuel = (cond: ConditionEntry): string => {\n const op = opMap[String(cond?.operator ?? '')] ?? '==';\n const lhs = `${prefix}.${cond?.key ?? cond?.field ?? ''}`;\n const rhs = `'${String(cond?.value ?? '')}'`;\n if (op.startsWith('!.')) return `!${lhs}${op.slice(1)}(${rhs})`;\n if (op.startsWith('.')) return `${lhs}${op}(${rhs})`;\n return `${lhs} ${op} ${rhs}`;\n };\n\n // Join with each row's own connector to the NEXT row (AND default).\n let out = toJuel(list[0]);\n for (let i = 1; i < list.length; i += 1) {\n const prev = list[i - 1];\n const isOr = prev?.connector === 'or' || prev?.logicalOperator === 'OR';\n out += ` ${isOr ? '||' : '&&'} ${toJuel(list[i])}`;\n }\n return out;\n}\n\nfunction buildDmn(dmnSpec: DmnEmitSpec, slot: CanvasSlot, pathPrefix: string) {\n return {\n mappings: [],\n name: dmnSpec.tableName,\n decision: {\n id: dmnSpec.tableName,\n name: dmnSpec.tableName,\n decisionTable: {\n id: `decisionTable_${dmnSpec.tableName}`,\n hitPolicy: dmnSpec.hitPolicy || 'FIRST',\n inputs: [\n {\n id: `input_${dmnSpec.tableName}`,\n inputExpression: {\n id: `inputExpr_${dmnSpec.tableName}`,\n typeRef: 'string',\n text: dmnSpec.inputExpr,\n },\n },\n ],\n outputs: (dmnSpec.outputs || []).map((o) => ({\n id: o.id,\n label: o.label,\n typeRef: o.typeRef || 'string',\n name: o.name,\n })),\n rules: buildDmnRules(dmnSpec, slot, pathPrefix),\n },\n },\n };\n}\n\n// ─── Task emitter ──────────────────────────────────────────────────────────\n\ninterface Emission {\n serviceTasks: unknown[];\n gateways: Array<{ id: string; name?: string }>;\n callActivities: unknown[];\n templateFlows: Array<{\n id: string;\n sourceRef: string;\n targetRef: string;\n conditionExpression: string | null;\n }>;\n dmn: ReturnType<typeof buildDmn> | null;\n bpmnEntry: string;\n bpmnExit: string;\n outgoingConditions: Record<string, string>;\n endsNeeded: Set<string>;\n}\n\nfunction emitTask(\n slot: CanvasSlot,\n task: ApplicationTaskLike,\n saveCtx: BuildPayloadContext,\n cfg: Required<BuildPayloadConfig>\n): Emission {\n const spec = task?.ui?.bpmnEmit;\n if (!spec) {\n return {\n serviceTasks: [\n {\n id: slot.id,\n name: task?.name || slot.descriptorType,\n configuration: Array.isArray(task?.configuration) ? task.configuration : [],\n // Strip display-only keys (_optionLabels, _conditionConfig) — the\n // backend wants the clean task input only.\n input: stripInternalKeys(slot.formData),\n },\n ],\n gateways: [],\n callActivities: [],\n templateFlows: [],\n dmn: null,\n bpmnEntry: slot.id,\n bpmnExit: slot.id,\n outgoingConditions: {},\n endsNeeded: new Set(),\n };\n }\n\n const interpCtx: Record<string, unknown> = {\n id: slot.id,\n endFailure: cfg.endEventIds.failure,\n endRejected: cfg.endEventIds.rejected,\n endSuccess: cfg.endEventIds.success,\n };\n\n // Filter gateway: build a pass/fail JUEL from the slot's saved conditions and\n // expose `${pass}` / `${fail}` so the spec's templateFlows/outgoingConditions\n // wire them. Operator map comes from the spec, path prefix from config.\n if (spec.conditionEmit) {\n const expr = buildConditionExpression(spec.conditionEmit, slot, cfg.conditionPathPrefix);\n interpCtx.pass = expr ? `\\${${expr}}` : '';\n interpCtx.fail = expr ? `\\${!(${expr})}` : '';\n }\n\n const ctx: ResolveCtx = { task, slot, ctx: saveCtx };\n\n const serviceTasks = (spec.serviceTasks || []).map((st) => ({\n id: interpolate(st.idTemplate, interpCtx),\n name: st.name,\n flowableClass: st.flowableClass,\n extensionElements: {\n fields: (st.extensionFields || []).map((f) => ({\n name: f.name,\n stringValue: buildExtensionStringValue(f, ctx),\n })),\n },\n }));\n\n let gatewayId: string | null = null;\n const gateways: Array<{ id: string; name?: string }> = [];\n if (spec.gateway) {\n gatewayId = interpolate(spec.gateway.idTemplate, interpCtx);\n interpCtx.gateway = gatewayId;\n gateways.push({ id: gatewayId, name: spec.gateway.name });\n }\n\n const endsNeeded = new Set<string>();\n const templateFlows = (spec.templateFlows || []).map((f) => {\n const source = interpolate(f.from, interpCtx);\n const target = interpolate(f.to, interpCtx);\n if (target === cfg.endEventIds.failure) endsNeeded.add(cfg.endEventIds.failure);\n if (target === cfg.endEventIds.rejected) endsNeeded.add(cfg.endEventIds.rejected);\n const id = f.idTemplate\n ? interpolate(f.idTemplate, interpCtx)\n : `${source}-to-${target}`;\n return {\n id,\n sourceRef: source,\n targetRef: target,\n conditionExpression: f.condition ? interpolate(f.condition, interpCtx) : null,\n };\n });\n\n const callActivities: unknown[] = [];\n const dmn = spec.dmnEmit ? buildDmn(spec.dmnEmit, slot, cfg.conditionPathPrefix) : null;\n\n const bpmnEntry = (serviceTasks[0] as { id?: string })?.id ?? slot.id;\n const bpmnExit =\n gatewayId ??\n (serviceTasks[serviceTasks.length - 1] as { id?: string })?.id ??\n slot.id;\n\n const outgoingConditions: Record<string, string> = {};\n Object.keys(spec.outgoingConditions || {}).forEach((branch) => {\n outgoingConditions[branch] = interpolate(\n spec.outgoingConditions![branch],\n interpCtx\n );\n });\n\n return {\n serviceTasks,\n gateways,\n callActivities,\n templateFlows,\n dmn,\n bpmnEntry,\n bpmnExit,\n outgoingConditions,\n endsNeeded,\n };\n}\n\n// ─── Main entry point ──────────────────────────────────────────────────────\n\n/**\n * Generate a backend-ready payload from canvas state + task definitions.\n *\n * @example\n * const payload = buildBackendPayload({\n * state: { slots, branches },\n * tasksByKey: { USER_CREATION: {...}, USER_GROUP_ASSIGNMENT: {...} },\n * context: { customerKey: '51995', workflowName: 'My WF' },\n * config: { triggerToCategory: { CUSTOM_TRIGGER: 'CUSTOM_CATEGORY' } },\n * });\n * await api.post('/process', payload);\n */\nexport function buildBackendPayload(opts: BuildPayloadOptions): Record<string, unknown> {\n const { state, tasksByKey, context, config } = opts;\n const cfg: Required<BuildPayloadConfig> = {\n ...DEFAULTS,\n ...(config ?? {}),\n triggerToCategory: { ...DEFAULTS.triggerToCategory, ...(config?.triggerToCategory ?? {}) },\n schedulerEventTypes: config?.schedulerEventTypes ?? DEFAULTS.schedulerEventTypes,\n endEventIds: { ...DEFAULTS.endEventIds, ...(config?.endEventIds ?? {}) },\n endEventNames: { ...DEFAULTS.endEventNames, ...(config?.endEventNames ?? {}) },\n triggerConfigDefaults: config?.triggerConfigDefaults ?? DEFAULTS.triggerConfigDefaults,\n };\n\n const slots = Array.isArray(state?.slots) ? state.slots! : [];\n\n // 1. Trigger metadata\n const triggerSlot = slots.find((s) => s.kind === 'triggerFixed');\n const eventType = (triggerSlot?.nodeData as { eventType?: string } | undefined)?.eventType;\n const triggerType =\n (triggerSlot?.nodeData as { type?: string } | undefined)?.type || 'event';\n const sourcesData = (triggerSlot?.nodeData as { sources?: unknown[] } | undefined)?.sources;\n const pickedSources = Array.isArray(sourcesData)\n ? sourcesData\n .map((s) =>\n typeof s === 'string'\n ? s\n : (s as { value?: string; key?: string })?.value ??\n (s as { value?: string; key?: string })?.key ??\n ''\n )\n .filter(Boolean)\n : [];\n const workflowCategory =\n cfg.triggerToCategory[eventType ?? ''] ?? cfg.defaultWorkflowCategory;\n const isSchedulerEvent =\n !!eventType && cfg.schedulerEventTypes.includes(eventType);\n const sources = isSchedulerEvent ? ['SCHEDULER'] : pickedSources;\n\n // 2. Walk each task slot through the emitter\n const taskSlots = slots.filter(isTaskSlot);\n const emissions = taskSlots.map((slot) => ({\n slot,\n emit: emitTask(slot, tasksByKey[slot.descriptorType ?? ''] ?? {}, context, cfg),\n }));\n\n // 3. Collect emitted parts\n const allServiceTasks: unknown[] = [];\n const allGateways: Array<{ id: string; name?: string }> = [];\n const allCallActivities: unknown[] = [];\n const allTemplateFlows: Array<{\n id: string;\n sourceRef: string;\n targetRef: string;\n conditionExpression: string | null;\n }> = [];\n const allDmns: unknown[] = [];\n const endsNeeded = new Set<string>();\n\n emissions.forEach(({ emit }) => {\n allServiceTasks.push(...emit.serviceTasks);\n allGateways.push(...emit.gateways);\n allCallActivities.push(...emit.callActivities);\n allTemplateFlows.push(...emit.templateFlows);\n if (emit.dmn) allDmns.push(emit.dmn);\n emit.endsNeeded.forEach((e) => endsNeeded.add(e));\n });\n\n // 4. Outer chain — link each task's exit to the next task's entry\n const outerFlows: Array<{\n id: string;\n sourceRef: string;\n targetRef: string;\n conditionExpression: string | null;\n }> = [];\n\n if (emissions.length > 0) {\n outerFlows.push({\n id: `${cfg.startEventId}-to-${emissions[0].emit.bpmnEntry}`,\n sourceRef: cfg.startEventId,\n targetRef: emissions[0].emit.bpmnEntry,\n conditionExpression: null,\n });\n\n for (let i = 0; i < emissions.length - 1; i += 1) {\n const cur = emissions[i].emit;\n const next = emissions[i + 1].emit;\n const condition =\n cur.outgoingConditions.success ??\n cur.outgoingConditions.pass ??\n cur.outgoingConditions.approved ??\n null;\n outerFlows.push({\n id: `${cur.bpmnExit}-to-${next.bpmnEntry}`,\n sourceRef: cur.bpmnExit,\n targetRef: next.bpmnEntry,\n conditionExpression: condition,\n });\n }\n\n const last = emissions[emissions.length - 1].emit;\n outerFlows.push({\n id: `${last.bpmnExit}-to-${cfg.endEventIds.success}`,\n sourceRef: last.bpmnExit,\n targetRef: cfg.endEventIds.success,\n conditionExpression: null,\n });\n } else {\n outerFlows.push({\n id: `${cfg.startEventId}-to-${cfg.endEventIds.success}`,\n sourceRef: cfg.startEventId,\n targetRef: cfg.endEventIds.success,\n conditionExpression: null,\n });\n }\n\n // 5. End events\n const endEvent: Array<{ id: string; name: string; executionListener?: null }> = [\n {\n id: cfg.endEventIds.success,\n name: cfg.endEventNames.success,\n executionListener: null,\n },\n ...(endsNeeded.has(cfg.endEventIds.failure)\n ? [{ id: cfg.endEventIds.failure, name: cfg.endEventNames.failure }]\n : []),\n ...(endsNeeded.has(cfg.endEventIds.rejected)\n ? [{ id: cfg.endEventIds.rejected, name: cfg.endEventNames.rejected }]\n : []),\n ];\n\n // 6. Start event\n const startEvent: Record<string, unknown> = {\n id: cfg.startEventId,\n name: 'Start',\n ...(triggerType === 'event'\n ? {\n messageEventDefinition: {\n messageRef: `msg_${(eventType || 'EVENT').toLowerCase()}_${\n sources.length > 0 ? sources.join('_').toLowerCase() : 'default'\n }_${context.customerKey}`,\n },\n }\n : {}),\n };\n\n // 7. Final payload\n const json: Record<string, unknown> = {\n canvasState: {\n slots,\n branches: state?.branches ?? {},\n },\n bpmn: {\n customerId: `${context.customerKey}`,\n workflowCategory,\n sources,\n process: {\n name: context.workflowName,\n isExecutable: 'true',\n },\n startEvent,\n endEvent,\n sequenceFlows: [...outerFlows, ...allTemplateFlows],\n exclusiveGateways: allGateways,\n serviceTasks: allServiceTasks,\n callActivities: allCallActivities,\n },\n ...(triggerType === 'event'\n ? {\n message: {\n id: `msg_${(eventType || 'event').toLowerCase()}_${\n sources.length > 0 ? sources.join('_').toLowerCase() : 'default'\n }_${context.customerKey}`,\n name: `msg_${(eventType || 'event').toLowerCase()}_${\n sources.length > 0 ? sources.join('_').toLowerCase() : 'default'\n }_${context.customerKey}`,\n },\n dmns: allDmns,\n }\n : {\n // Non-event trigger (e.g. scheduler). The saved config lives in the\n // trigger slot's formData under the trigger TYPE key — dotted field\n // ids like `scheduler.timeZone` get nested under `scheduler` on save.\n // eventType/`type` is the trigger TYPE ('scheduler'), NOT the workflow\n // category. Host-supplied defaults fill the canonical shape; saved\n // values override; internal `_*` keys are stripped.\n eventConfig: [\n {\n eventType: triggerType,\n config: {\n type: triggerType,\n ...(cfg.triggerConfigDefaults[triggerType] ?? {}),\n ...stripInternalKeys(\n (triggerSlot?.formData as Record<string, unknown> | undefined)?.[triggerType]\n ),\n },\n },\n ],\n }),\n };\n\n return json;\n}\n"],"names":["DEFAULTS","stripInternalKeys","obj","out","k","NON_TASK_KINDS","isTaskSlot","slot","interpolate","tpl","ctx","m","resolveFieldRef","ref","_a","_b","_c","_d","_e","from","key","value","buildExtensionStringValue","field","source","shape","exclude","fd","wrapped","getValueByPath","path","acc","buildDmnRules","dmnSpec","pathPrefix","opMap","valuesField","toJuel","cond","op","lhs","rhs","entriesToExpression","entries","list","parts","logical","rules","ruleNum","pushRule","expression","outputValue","blocks","block","values","v","condCfg","allExpressions","fieldKey","conditions","fieldValue","fallbackKey","rawFallback","fallbackValues","negation","e","buildConditionExpression","spec","defaultPrefix","prefix","raw","i","prev","isOr","buildDmn","o","emitTask","task","saveCtx","cfg","interpCtx","expr","serviceTasks","st","f","gatewayId","gateways","endsNeeded","templateFlows","target","callActivities","dmn","bpmnEntry","bpmnExit","outgoingConditions","branch","buildBackendPayload","opts","state","tasksByKey","context","config","slots","triggerSlot","s","eventType","triggerType","sourcesData","pickedSources","workflowCategory","sources","emissions","allServiceTasks","allGateways","allCallActivities","allTemplateFlows","allDmns","emit","outerFlows","cur","next","condition","last","endEvent","startEvent"],"mappings":"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"}
1
+ {"version":3,"file":"buildBackendPayload-CTCfdT8R.js","sources":["../src/payload/buildBackendPayload.ts"],"sourcesContent":["/**\n * buildBackendPayload — generic BPMN/DMN/canvasState emitter driven by each\n * task's `ui.bpmnEmit` block. Consumer ships per-task bpmnEmit specs from\n * the backend; the package handles the walk.\n *\n * Originally lived in IAM as `flowforgeStateToBackendJson`. Moved into the\n * package so every consumer gets the same emitter — and so DMN/filter/\n * approval fixes ship once, to everyone.\n *\n * Consumer injects:\n * - canvasState — `{ slots, branches }` from the canvas\n * - tasksByKey — `{ [descriptorType]: ApplicationTask }` lookup\n * - context — host-specific scalars (customerKey, workflowName)\n * - config — IAM-shaped defaults (path prefix, end-event ids,\n * trigger→category map, scheduler events)\n *\n * Returns a JSON object ready to POST to the backend.\n */\n\n// ─── Types ──────────────────────────────────────────────────────────────────\n\nexport type CanvasSlot = {\n id: string;\n kind?: string;\n descriptorType?: string;\n nodeData?: Record<string, unknown>;\n formData?: Record<string, unknown>;\n [key: string]: unknown;\n};\n\nexport type CanvasState = {\n slots?: CanvasSlot[];\n branches?: Record<string, unknown>;\n};\n\nexport interface FieldRef {\n from: 'literal' | 'task' | 'ctx' | 'slot' | 'formData';\n key?: string;\n value?: unknown;\n}\n\nexport interface ExtensionFieldSpec {\n name: string;\n source?: {\n type: 'literal' | 'json' | 'taskConfig' | 'formData';\n value?: unknown;\n shape?: Record<string, FieldRef>;\n passthrough?: boolean;\n exclude?: string[];\n key?: string;\n /**\n * For a `formData` passthrough: wrap the resulting object under this key\n * before stringifying. e.g. `wrapKey: 'input'` turns\n * `{noOfDays, action}` into `{\"input\":{\"noOfDays\":…,\"action\":…}}` — the\n * shape the backend expects for `inputConfiguration`.\n */\n wrapKey?: string;\n };\n}\n\nexport interface ServiceTaskSpec {\n idTemplate: string;\n name?: string;\n flowableClass?: string;\n extensionFields?: ExtensionFieldSpec[];\n}\n\nexport interface GatewaySpec {\n idTemplate: string;\n name?: string;\n}\n\nexport interface TemplateFlowSpec {\n from: string;\n to: string;\n idTemplate?: string;\n condition?: string | null;\n}\n\nexport interface DmnOutputSpec {\n id: string;\n label?: string;\n name: string;\n typeRef?: string;\n}\n\nexport interface DmnEmitSpec {\n tableName: string;\n inputExpr: string;\n hitPolicy?: string;\n outputs?: DmnOutputSpec[];\n operatorMap?: Record<string, string>;\n valuesField?: string;\n /**\n * Fallback strategy. `'negation'` emits an extra rule that fires only when\n * NONE of the configured conditions match — its output is the value(s) of\n * the form's `fallback` field. The expression is `!((c1) || (c2) || …)`.\n */\n fallback?: 'negation' | string;\n /** Form field holding the fallback value(s). Defaults to `fallback`. */\n fallbackField?: string;\n}\n\n/**\n * Builds a single JUEL boolean expression from a slot's saved conditions —\n * for a pass/fail filter gateway. Fully data-driven: the host supplies the\n * operator map (e.g. `{ eq: '==', contains: '.contains' }`) at registration,\n * and the LHS path prefix comes from `config.conditionPathPrefix`. The package\n * hardcodes nothing about field names, operators, or targets.\n *\n * The computed expression is exposed to `templateFlows` / `outgoingConditions`\n * as the interpolation tokens `${pass}` (the expression) and `${fail}` (its\n * negation), so the registration declares the wiring:\n * outgoingConditions: { pass: '${pass}' }\n * templateFlows: [{ from: '${id}', to: '${endFailure}', condition: '${fail}' }]\n */\nexport interface ConditionEmitSpec {\n /** formData key holding the condition rows. Default `'conditions'`. */\n conditionsField?: string;\n /** operator token → JUEL operator (e.g. `{ eq: '==', contains: '.contains' }`). */\n operatorMap?: Record<string, string>;\n /** LHS path prefix; defaults to `config.conditionPathPrefix`. */\n pathPrefix?: string;\n}\n\nexport interface BpmnEmitSpec {\n kind: 'linear' | 'gated' | 'filter' | 'approval';\n serviceTasks?: ServiceTaskSpec[];\n gateway?: GatewaySpec;\n templateFlows?: TemplateFlowSpec[];\n outgoingConditions?: Record<string, string>;\n dmnEmit?: DmnEmitSpec;\n /** Build a pass/fail JUEL expression from saved conditions (filter gateway). */\n conditionEmit?: ConditionEmitSpec;\n callActivity?: Record<string, unknown>;\n}\n\nexport interface ApplicationTaskLike {\n name?: string;\n taskKey?: string;\n applicationUuid?: string;\n configuration?: unknown[];\n ui?: { bpmnEmit?: BpmnEmitSpec; [key: string]: unknown };\n [key: string]: unknown;\n}\n\nexport interface BuildPayloadContext {\n customerKey: string;\n workflowName: string;\n /** Anything else the host wants exposed via `from: 'ctx', key: '...'`. */\n [key: string]: unknown;\n}\n\nexport interface BuildPayloadConfig {\n /**\n * Map of trigger eventType → workflowCategory string. Defaults to a small\n * IAM-shaped fallback; consumers should pass the full map they use.\n */\n triggerToCategory?: Record<string, string>;\n /** eventType values that should set `sources: ['SCHEDULER']` and skip the message block. */\n schedulerEventTypes?: string[];\n /** DMN LHS prefix for condition expressions (default IAM-style). */\n conditionPathPrefix?: string;\n /** Fallback workflowCategory when eventType isn't mapped. */\n defaultWorkflowCategory?: string;\n /** End-event ids — override per backend convention. */\n endEventIds?: { success: string; failure: string; rejected: string };\n /** Names rendered on end events. */\n endEventNames?: { success: string; failure: string; rejected: string };\n /** Start event id used in the outer chain. */\n startEventId?: string;\n /**\n * Canonical default shape for a non-event trigger's `eventConfig.config`,\n * keyed by trigger `type` (e.g. `scheduler`). The backend expects the FULL\n * config object (all keys present, even when the user only set a few). The\n * package can't know a host's scheduler field names, so the host supplies\n * the neutral defaults here; the trigger slot's saved formData is merged on\n * top. Example:\n * { scheduler: { triggerFrequency: null, startDateTime: null, interval: 1,\n * timings: [], dateTime: null, daysOfMonth: [],\n * daysOfWeek: [], expression: null, timeZone: null } }\n */\n triggerConfigDefaults?: Record<string, Record<string, unknown>>;\n}\n\nexport interface BuildPayloadOptions {\n state: CanvasState;\n tasksByKey: Record<string, ApplicationTaskLike>;\n context: BuildPayloadContext;\n config?: BuildPayloadConfig;\n}\n\n// ─── Defaults ──────────────────────────────────────────────────────────────\n\n// Package defaults are deliberately neutral — anything tenant- or\n// product-specific (trigger event types, default category, the DMN LHS\n// prefix) MUST come from the consumer's `config`. We only ship defaults\n// for engine-neutral BPMN scalars (start/end ids and end-event names).\nconst DEFAULTS: Required<BuildPayloadConfig> = {\n triggerToCategory: {},\n schedulerEventTypes: [],\n conditionPathPrefix: '',\n defaultWorkflowCategory: '',\n endEventIds: {\n success: 'endEventSuccess',\n failure: 'endEventFailure',\n rejected: 'endEventRejected',\n },\n endEventNames: {\n success: 'Success',\n failure: 'Failure',\n rejected: 'Rejected',\n },\n startEventId: 'startEvent',\n triggerConfigDefaults: {},\n};\n\n/**\n * Strip FlowForge-internal, display-only keys (anything starting with `_`,\n * e.g. `_optionLabels`, `_conditionConfig`) from an object before it goes to\n * the backend. Returns a shallow copy.\n */\nfunction stripInternalKeys(obj: unknown): Record<string, unknown> {\n if (!obj || typeof obj !== 'object') return {};\n const out: Record<string, unknown> = {};\n Object.keys(obj as Record<string, unknown>).forEach((k) => {\n if (!k.startsWith('_')) out[k] = (obj as Record<string, unknown>)[k];\n });\n return out;\n}\n\nconst NON_TASK_KINDS = new Set([\n 'start',\n 'end',\n 'triggerFixed',\n 'addTrigger',\n 'addStep',\n]);\nconst isTaskSlot = (slot: CanvasSlot): boolean =>\n !!slot && !NON_TASK_KINDS.has(String(slot.kind ?? ''));\n\n// ─── Helpers ───────────────────────────────────────────────────────────────\n\nfunction interpolate(tpl: string | null | undefined, ctx: Record<string, unknown>): string {\n if (tpl == null) return '';\n return String(tpl).replace(/\\$\\{(\\w+)\\}/g, (m, k) =>\n Object.prototype.hasOwnProperty.call(ctx, k) ? String(ctx[k]) : m\n );\n}\n\ninterface ResolveCtx {\n task: ApplicationTaskLike;\n slot: CanvasSlot;\n ctx: BuildPayloadContext;\n}\n\nfunction resolveFieldRef(ref: FieldRef | undefined, ctx: ResolveCtx): string {\n if (!ref || typeof ref !== 'object') return '';\n const { from, key, value } = ref;\n if (from === 'literal') return value === undefined ? '' : String(value);\n if (from === 'task') return String((ctx.task as Record<string, unknown>)?.[key ?? ''] ?? '');\n if (from === 'ctx') return String((ctx.ctx as Record<string, unknown>)?.[key ?? ''] ?? '');\n if (from === 'slot') return String((ctx.slot as Record<string, unknown>)?.[key ?? ''] ?? '');\n if (from === 'formData') return String(ctx.slot?.formData?.[key ?? ''] ?? '');\n return '';\n}\n\nfunction buildExtensionStringValue(field: ExtensionFieldSpec, ctx: ResolveCtx): string {\n const source = field?.source;\n if (!source) return '';\n if (source.type === 'literal') {\n return typeof source.value === 'string'\n ? source.value\n : JSON.stringify(source.value ?? '');\n }\n if (source.type === 'json' || source.type === 'taskConfig') {\n const shape = source.shape || {};\n const out: Record<string, string> = {};\n Object.keys(shape).forEach((k) => {\n out[k] = resolveFieldRef(shape[k], ctx);\n });\n return JSON.stringify(out);\n }\n if (source.type === 'formData') {\n if (source.passthrough) {\n const exclude = new Set(source.exclude || []);\n const out: Record<string, unknown> = {};\n const fd = ctx.slot?.formData ?? {};\n Object.keys(fd).forEach((k) => {\n // Drop FlowForge-internal display keys (_optionLabels, _conditionConfig)\n // and any host-excluded keys — the backend wants the clean input only.\n if (k.startsWith('_')) return;\n if (!exclude.has(k)) out[k] = fd[k];\n });\n const wrapped = source.wrapKey ? { [source.wrapKey]: out } : out;\n return JSON.stringify(wrapped);\n }\n return String(ctx.slot?.formData?.[source.key ?? ''] ?? '');\n }\n return '';\n}\n\n/** Walk a dotted path against a plain object. Returns undefined on miss. */\nfunction getValueByPath(obj: unknown, path: string): unknown {\n if (!obj || typeof obj !== 'object' || !path) return undefined;\n return path.split('.').reduce<unknown>((acc, key) => {\n if (acc == null || typeof acc !== 'object') return undefined;\n return (acc as Record<string, unknown>)[key];\n }, obj);\n}\n\n// ─── DMN rule builder ──────────────────────────────────────────────────────\n\ninterface ConditionEntry {\n field?: string;\n fieldLabel?: string;\n key?: string;\n operator?: string;\n value?: string | number | boolean | null;\n connector?: 'and' | 'or';\n logicalOperator?: 'AND' | 'OR';\n}\n\nfunction buildDmnRules(\n dmnSpec: DmnEmitSpec,\n slot: CanvasSlot,\n pathPrefix: string\n): Array<{\n id: string;\n inputEntries: Array<{ id: string; text: string }>;\n outputEntries: Array<{ id: string; text: string }>;\n}> {\n const opMap = dmnSpec.operatorMap || {};\n const valuesField = dmnSpec.valuesField || 'groups';\n\n const toJuel = (cond: ConditionEntry): string => {\n const op = opMap[String(cond?.operator ?? '')] ?? '==';\n const lhs = `${pathPrefix}.${cond?.key ?? cond?.field ?? ''}`;\n const rhs = `'${String(cond?.value ?? '')}'`;\n if (op.startsWith('.')) return `${lhs}${op}(${rhs})`;\n if (op.startsWith('!.')) return `!${lhs}${op.slice(1)}(${rhs})`;\n return `${lhs} ${op} ${rhs}`;\n };\n\n const entriesToExpression = (entries: ConditionEntry[] | undefined): string | null => {\n const list = Array.isArray(entries) ? entries : [];\n if (list.length === 0) return null;\n const parts = list.map(toJuel);\n const isOr = list[0]?.connector === 'or' || list[0]?.logicalOperator === 'OR';\n const logical = isOr ? '||' : '&&';\n return parts.join(` ${logical} `);\n };\n\n const rules: Array<{\n id: string;\n inputEntries: Array<{ id: string; text: string }>;\n outputEntries: Array<{ id: string; text: string }>;\n }> = [];\n let ruleNum = 1;\n const pushRule = (expression: string | null, outputValue: unknown) => {\n rules.push({\n id: `rule${ruleNum}`,\n inputEntries: [\n {\n id: `rule${ruleNum}InputEntry1`,\n text: expression ? `\\${(${expression})}` : '',\n },\n ],\n outputEntries: [\n {\n id: `rule${ruleNum}OutputEntry1`,\n text: `\"${outputValue}\"`,\n },\n ],\n });\n ruleNum += 1;\n };\n\n // Shape A — IAM-legacy groupBlocks[].\n const blocks = Array.isArray(slot?.formData?.groupBlocks)\n ? (slot.formData!.groupBlocks as Array<{\n conditions?: ConditionEntry[];\n [k: string]: unknown;\n }>)\n : [];\n if (blocks.length > 0) {\n blocks.forEach((block) => {\n const values = Array.isArray(block?.[valuesField])\n ? (block[valuesField] as unknown[])\n : [];\n const expression = entriesToExpression(block?.conditions);\n values.forEach((v) => pushRule(expression, v));\n });\n return rules;\n }\n\n // Shape B — FlowForm When-builder.\n const fd = (slot?.formData ?? {}) as Record<string, unknown>;\n // eslint-disable-next-line no-underscore-dangle\n const condCfg = (fd._conditionConfig ?? fd.conditionConfig) as\n | Record<string, ConditionEntry[]>\n | undefined;\n // Collect every condition expression so a `negation` fallback can be the\n // negation of their union (fires only when none match).\n const allExpressions: string[] = [];\n if (condCfg && typeof condCfg === 'object') {\n Object.keys(condCfg).forEach((fieldKey) => {\n const conditions = condCfg[fieldKey];\n const expression = entriesToExpression(conditions);\n if (expression) allExpressions.push(expression);\n // The conditionConfig key can be either a plain field name OR a dotted\n // formik path (e.g. `attributeMapping.rules.0.targetField`). Resolve\n // both shapes — first try direct, then walk the path.\n const fieldValue =\n Object.prototype.hasOwnProperty.call(fd, fieldKey)\n ? fd[fieldKey]\n : getValueByPath(fd, fieldKey);\n if (Array.isArray(fieldValue)) {\n fieldValue.forEach((v) => {\n const out =\n typeof v === 'object' && v !== null\n ? (v as { value?: unknown; label?: unknown }).value ??\n (v as { label?: unknown }).label ??\n v\n : v;\n pushRule(expression, out);\n });\n } else if (\n fieldValue !== undefined &&\n fieldValue !== null &&\n fieldValue !== ''\n ) {\n pushRule(expression, fieldValue);\n } else if (expression) {\n pushRule(expression, '');\n }\n });\n }\n\n // ── Fallback rule (negation) — fires only when NONE of the conditions match.\n // Output = the form's `fallback` field value(s). With no conditions present,\n // there's nothing to negate, so the fallback becomes an always-true rule.\n if (dmnSpec.fallback === 'negation') {\n const fallbackKey = dmnSpec.fallbackField || 'fallback';\n const rawFallback = fd[fallbackKey];\n const fallbackValues = Array.isArray(rawFallback)\n ? rawFallback\n : rawFallback != null && rawFallback !== ''\n ? [rawFallback]\n : [];\n if (fallbackValues.length > 0) {\n const negation = allExpressions.length > 0\n ? `!(${allExpressions.map((e) => `(${e})`).join(' || ')})`\n : null;\n fallbackValues.forEach((v) => {\n const out =\n typeof v === 'object' && v !== null\n ? (v as { value?: unknown; label?: unknown }).value ??\n (v as { label?: unknown }).label ??\n v\n : v;\n pushRule(negation, out);\n });\n }\n }\n return rules;\n}\n\n/**\n * Build a single JUEL boolean expression (no surrounding `${…}`) from a slot's\n * saved condition rows, for a pass/fail filter gateway. Mirrors buildDmnRules'\n * operator handling. Returns '' when there are no conditions.\n */\nfunction buildConditionExpression(\n spec: ConditionEmitSpec,\n slot: CanvasSlot,\n defaultPrefix: string\n): string {\n const opMap = spec.operatorMap || {};\n const prefix = spec.pathPrefix ?? defaultPrefix;\n const field = spec.conditionsField || 'conditions';\n const raw = (slot?.formData as Record<string, unknown> | undefined)?.[field];\n const list = Array.isArray(raw) ? (raw as ConditionEntry[]) : [];\n if (list.length === 0) return '';\n\n const toJuel = (cond: ConditionEntry): string => {\n const op = opMap[String(cond?.operator ?? '')] ?? '==';\n const lhs = `${prefix}.${cond?.key ?? cond?.field ?? ''}`;\n const rhs = `'${String(cond?.value ?? '')}'`;\n if (op.startsWith('!.')) return `!${lhs}${op.slice(1)}(${rhs})`;\n if (op.startsWith('.')) return `${lhs}${op}(${rhs})`;\n return `${lhs} ${op} ${rhs}`;\n };\n\n // Join with each row's own connector to the NEXT row (AND default).\n let out = toJuel(list[0]);\n for (let i = 1; i < list.length; i += 1) {\n const prev = list[i - 1];\n const isOr = prev?.connector === 'or' || prev?.logicalOperator === 'OR';\n out += ` ${isOr ? '||' : '&&'} ${toJuel(list[i])}`;\n }\n return out;\n}\n\nfunction buildDmn(dmnSpec: DmnEmitSpec, slot: CanvasSlot, pathPrefix: string) {\n return {\n mappings: [],\n name: dmnSpec.tableName,\n decision: {\n id: dmnSpec.tableName,\n name: dmnSpec.tableName,\n decisionTable: {\n id: `decisionTable_${dmnSpec.tableName}`,\n hitPolicy: dmnSpec.hitPolicy || 'FIRST',\n inputs: [\n {\n id: `input_${dmnSpec.tableName}`,\n inputExpression: {\n id: `inputExpr_${dmnSpec.tableName}`,\n typeRef: 'string',\n text: dmnSpec.inputExpr,\n },\n },\n ],\n outputs: (dmnSpec.outputs || []).map((o) => ({\n id: o.id,\n label: o.label,\n typeRef: o.typeRef || 'string',\n name: o.name,\n })),\n rules: buildDmnRules(dmnSpec, slot, pathPrefix),\n },\n },\n };\n}\n\n// ─── Task emitter ──────────────────────────────────────────────────────────\n\ninterface Emission {\n serviceTasks: unknown[];\n gateways: Array<{ id: string; name?: string }>;\n callActivities: unknown[];\n templateFlows: Array<{\n id: string;\n sourceRef: string;\n targetRef: string;\n conditionExpression: string | null;\n }>;\n dmn: ReturnType<typeof buildDmn> | null;\n bpmnEntry: string;\n bpmnExit: string;\n outgoingConditions: Record<string, string>;\n endsNeeded: Set<string>;\n}\n\nfunction emitTask(\n slot: CanvasSlot,\n task: ApplicationTaskLike,\n saveCtx: BuildPayloadContext,\n cfg: Required<BuildPayloadConfig>\n): Emission {\n const spec = task?.ui?.bpmnEmit;\n if (!spec) {\n return {\n serviceTasks: [\n {\n id: slot.id,\n name: task?.name || slot.descriptorType,\n configuration: Array.isArray(task?.configuration) ? task.configuration : [],\n // Strip display-only keys (_optionLabels, _conditionConfig) — the\n // backend wants the clean task input only.\n input: stripInternalKeys(slot.formData),\n },\n ],\n gateways: [],\n callActivities: [],\n templateFlows: [],\n dmn: null,\n bpmnEntry: slot.id,\n bpmnExit: slot.id,\n outgoingConditions: {},\n endsNeeded: new Set(),\n };\n }\n\n const interpCtx: Record<string, unknown> = {\n id: slot.id,\n endFailure: cfg.endEventIds.failure,\n endRejected: cfg.endEventIds.rejected,\n endSuccess: cfg.endEventIds.success,\n };\n\n // Filter gateway: build a pass/fail JUEL from the slot's saved conditions and\n // expose `${pass}` / `${fail}` so the spec's templateFlows/outgoingConditions\n // wire them. Operator map comes from the spec, path prefix from config.\n if (spec.conditionEmit) {\n const expr = buildConditionExpression(spec.conditionEmit, slot, cfg.conditionPathPrefix);\n interpCtx.pass = expr ? `\\${${expr}}` : '';\n interpCtx.fail = expr ? `\\${!(${expr})}` : '';\n }\n\n const ctx: ResolveCtx = { task, slot, ctx: saveCtx };\n\n const serviceTasks = (spec.serviceTasks || []).map((st) => ({\n id: interpolate(st.idTemplate, interpCtx),\n name: st.name,\n flowableClass: st.flowableClass,\n extensionElements: {\n fields: (st.extensionFields || []).map((f) => ({\n name: f.name,\n stringValue: buildExtensionStringValue(f, ctx),\n })),\n },\n }));\n\n let gatewayId: string | null = null;\n const gateways: Array<{ id: string; name?: string }> = [];\n if (spec.gateway) {\n gatewayId = interpolate(spec.gateway.idTemplate, interpCtx);\n interpCtx.gateway = gatewayId;\n gateways.push({ id: gatewayId, name: spec.gateway.name });\n }\n\n const endsNeeded = new Set<string>();\n const templateFlows = (spec.templateFlows || []).map((f) => {\n const source = interpolate(f.from, interpCtx);\n const target = interpolate(f.to, interpCtx);\n if (target === cfg.endEventIds.failure) endsNeeded.add(cfg.endEventIds.failure);\n if (target === cfg.endEventIds.rejected) endsNeeded.add(cfg.endEventIds.rejected);\n const id = f.idTemplate\n ? interpolate(f.idTemplate, interpCtx)\n : `${source}-to-${target}`;\n return {\n id,\n sourceRef: source,\n targetRef: target,\n conditionExpression: f.condition ? interpolate(f.condition, interpCtx) : null,\n };\n });\n\n const callActivities: unknown[] = [];\n const dmn = spec.dmnEmit ? buildDmn(spec.dmnEmit, slot, cfg.conditionPathPrefix) : null;\n\n const bpmnEntry = (serviceTasks[0] as { id?: string })?.id ?? slot.id;\n const bpmnExit =\n gatewayId ??\n (serviceTasks[serviceTasks.length - 1] as { id?: string })?.id ??\n slot.id;\n\n const outgoingConditions: Record<string, string> = {};\n Object.keys(spec.outgoingConditions || {}).forEach((branch) => {\n outgoingConditions[branch] = interpolate(\n spec.outgoingConditions![branch],\n interpCtx\n );\n });\n\n return {\n serviceTasks,\n gateways,\n callActivities,\n templateFlows,\n dmn,\n bpmnEntry,\n bpmnExit,\n outgoingConditions,\n endsNeeded,\n };\n}\n\n// ─── Main entry point ──────────────────────────────────────────────────────\n\n/**\n * Generate a backend-ready payload from canvas state + task definitions.\n *\n * @example\n * const payload = buildBackendPayload({\n * state: { slots, branches },\n * tasksByKey: { USER_CREATION: {...}, USER_GROUP_ASSIGNMENT: {...} },\n * context: { customerKey: '51995', workflowName: 'My WF' },\n * config: { triggerToCategory: { CUSTOM_TRIGGER: 'CUSTOM_CATEGORY' } },\n * });\n * await api.post('/process', payload);\n */\nexport function buildBackendPayload(opts: BuildPayloadOptions): Record<string, unknown> {\n const { state, tasksByKey, context, config } = opts;\n const cfg: Required<BuildPayloadConfig> = {\n ...DEFAULTS,\n ...(config ?? {}),\n triggerToCategory: { ...DEFAULTS.triggerToCategory, ...(config?.triggerToCategory ?? {}) },\n schedulerEventTypes: config?.schedulerEventTypes ?? DEFAULTS.schedulerEventTypes,\n endEventIds: { ...DEFAULTS.endEventIds, ...(config?.endEventIds ?? {}) },\n endEventNames: { ...DEFAULTS.endEventNames, ...(config?.endEventNames ?? {}) },\n triggerConfigDefaults: config?.triggerConfigDefaults ?? DEFAULTS.triggerConfigDefaults,\n };\n\n const slots = Array.isArray(state?.slots) ? state.slots! : [];\n\n // 1. Trigger metadata\n const triggerSlot = slots.find((s) => s.kind === 'triggerFixed');\n const eventType = (triggerSlot?.nodeData as { eventType?: string } | undefined)?.eventType;\n const triggerType =\n (triggerSlot?.nodeData as { type?: string } | undefined)?.type || 'event';\n const sourcesData = (triggerSlot?.nodeData as { sources?: unknown[] } | undefined)?.sources;\n const pickedSources = Array.isArray(sourcesData)\n ? sourcesData\n .map((s) =>\n typeof s === 'string'\n ? s\n : (s as { value?: string; key?: string })?.value ??\n (s as { value?: string; key?: string })?.key ??\n ''\n )\n .filter(Boolean)\n : [];\n const workflowCategory =\n cfg.triggerToCategory[eventType ?? ''] ?? cfg.defaultWorkflowCategory;\n const isSchedulerEvent =\n !!eventType && cfg.schedulerEventTypes.includes(eventType);\n const sources = isSchedulerEvent ? ['SCHEDULER'] : pickedSources;\n\n const emitSlot = (slot: CanvasSlot) =>\n emitTask(slot, tasksByKey[slot.descriptorType ?? ''] ?? {}, context, cfg);\n const isBranchingSlot = (slot: CanvasSlot) =>\n slot.kind === 'filter' || slot.kind === 'approval';\n const branchMap = (state?.branches ?? {}) as Record<string, Record<string, CanvasSlot[]>>;\n\n // 2. Walk each spine task slot through the emitter\n const taskSlots = slots.filter(isTaskSlot);\n const emissions = taskSlots.map((slot) => ({ slot, emit: emitSlot(slot) }));\n\n // 2b. Walk each branching slot's branch chains (e.g. a filter's Pass / Fail).\n // The canvas stores everything AFTER a filter inside state.branches[filterId],\n // not the spine — so we must emit those chains and wire the gateway to them.\n interface BranchWalk {\n filterEmit: Emission;\n branchKey: string;\n chain: Array<{ slot: CanvasSlot; emit: Emission }>;\n }\n const branchWalks: BranchWalk[] = [];\n emissions.forEach(({ slot, emit }) => {\n if (!isBranchingSlot(slot) || !branchMap[slot.id]) return;\n Object.entries(branchMap[slot.id]).forEach(([branchKey, chain]) => {\n const taskChain = (Array.isArray(chain) ? chain : []).filter(isTaskSlot);\n branchWalks.push({\n filterEmit: emit,\n branchKey,\n chain: taskChain.map((s) => ({ slot: s, emit: emitSlot(s) })),\n });\n });\n });\n\n // 3. Collect emitted parts (spine + branches)\n const allServiceTasks: unknown[] = [];\n const allGateways: Array<{ id: string; name?: string }> = [];\n const allCallActivities: unknown[] = [];\n const allTemplateFlows: Array<{\n id: string;\n sourceRef: string;\n targetRef: string;\n conditionExpression: string | null;\n }> = [];\n const allDmns: unknown[] = [];\n const endsNeeded = new Set<string>();\n\n const collect = (emit: Emission) => {\n allServiceTasks.push(...emit.serviceTasks);\n allGateways.push(...emit.gateways);\n allCallActivities.push(...emit.callActivities);\n allTemplateFlows.push(...emit.templateFlows);\n if (emit.dmn) allDmns.push(emit.dmn);\n emit.endsNeeded.forEach((e) => endsNeeded.add(e));\n };\n emissions.forEach(({ emit }) => collect(emit));\n branchWalks.forEach((bw) => bw.chain.forEach(({ emit }) => collect(emit)));\n\n // 4. Outer chain — link each task's exit to the next task's entry\n const outerFlows: Array<{\n id: string;\n sourceRef: string;\n targetRef: string;\n conditionExpression: string | null;\n }> = [];\n\n const pushFlow = (sourceRef: string, targetRef: string, conditionExpression: string | null) =>\n outerFlows.push({ id: `${sourceRef}-to-${targetRef}`, sourceRef, targetRef, conditionExpression });\n\n if (emissions.length > 0) {\n pushFlow(cfg.startEventId, emissions[0].emit.bpmnEntry, null);\n\n for (let i = 0; i < emissions.length - 1; i += 1) {\n const cur = emissions[i].emit;\n const next = emissions[i + 1].emit;\n const condition =\n cur.outgoingConditions.success ??\n cur.outgoingConditions.pass ??\n cur.outgoingConditions.approved ??\n null;\n pushFlow(cur.bpmnExit, next.bpmnEntry, condition);\n }\n\n const lastEmission = emissions[emissions.length - 1];\n if (isBranchingSlot(lastEmission.slot) && branchMap[lastEmission.slot.id]) {\n // Terminal branching slot (e.g. a filter): route the gateway to each\n // branch chain, condition per branch from the filter's outgoingConditions\n // (${pass}/${fail}). A branch with no tasks (just End) goes straight to\n // the success end.\n const gatewayId = lastEmission.emit.bpmnExit;\n branchWalks\n .filter((bw) => bw.filterEmit === lastEmission.emit)\n .forEach((bw) => {\n const cond = lastEmission.emit.outgoingConditions[bw.branchKey] ?? null;\n if (bw.chain.length === 0) {\n pushFlow(gatewayId, cfg.endEventIds.success, cond);\n return;\n }\n pushFlow(gatewayId, bw.chain[0].emit.bpmnEntry, cond);\n for (let i = 0; i < bw.chain.length - 1; i += 1) {\n pushFlow(bw.chain[i].emit.bpmnExit, bw.chain[i + 1].emit.bpmnEntry, null);\n }\n pushFlow(bw.chain[bw.chain.length - 1].emit.bpmnExit, cfg.endEventIds.success, null);\n });\n } else {\n pushFlow(lastEmission.emit.bpmnExit, cfg.endEventIds.success, null);\n }\n } else {\n outerFlows.push({\n id: `${cfg.startEventId}-to-${cfg.endEventIds.success}`,\n sourceRef: cfg.startEventId,\n targetRef: cfg.endEventIds.success,\n conditionExpression: null,\n });\n }\n\n // 5. End events\n const endEvent: Array<{ id: string; name: string; executionListener?: null }> = [\n {\n id: cfg.endEventIds.success,\n name: cfg.endEventNames.success,\n executionListener: null,\n },\n ...(endsNeeded.has(cfg.endEventIds.failure)\n ? [{ id: cfg.endEventIds.failure, name: cfg.endEventNames.failure }]\n : []),\n ...(endsNeeded.has(cfg.endEventIds.rejected)\n ? [{ id: cfg.endEventIds.rejected, name: cfg.endEventNames.rejected }]\n : []),\n ];\n\n // 6. Start event\n const startEvent: Record<string, unknown> = {\n id: cfg.startEventId,\n name: 'Start',\n ...(triggerType === 'event'\n ? {\n messageEventDefinition: {\n messageRef: `msg_${(eventType || 'EVENT').toLowerCase()}_${\n sources.length > 0 ? sources.join('_').toLowerCase() : 'default'\n }_${context.customerKey}`,\n },\n }\n : {}),\n };\n\n // 7. Final payload\n const json: Record<string, unknown> = {\n canvasState: {\n slots,\n branches: state?.branches ?? {},\n },\n bpmn: {\n customerId: `${context.customerKey}`,\n workflowCategory,\n sources,\n process: {\n name: context.workflowName,\n isExecutable: 'true',\n },\n startEvent,\n endEvent,\n sequenceFlows: [...outerFlows, ...allTemplateFlows],\n exclusiveGateways: allGateways,\n serviceTasks: allServiceTasks,\n callActivities: allCallActivities,\n },\n ...(triggerType === 'event'\n ? {\n message: {\n id: `msg_${(eventType || 'event').toLowerCase()}_${\n sources.length > 0 ? sources.join('_').toLowerCase() : 'default'\n }_${context.customerKey}`,\n name: `msg_${(eventType || 'event').toLowerCase()}_${\n sources.length > 0 ? sources.join('_').toLowerCase() : 'default'\n }_${context.customerKey}`,\n },\n dmns: allDmns,\n }\n : {\n // Non-event trigger (e.g. scheduler). The saved config lives in the\n // trigger slot's formData under the trigger TYPE key — dotted field\n // ids like `scheduler.timeZone` get nested under `scheduler` on save.\n // eventType/`type` is the trigger TYPE ('scheduler'), NOT the workflow\n // category. Host-supplied defaults fill the canonical shape; saved\n // values override; internal `_*` keys are stripped.\n eventConfig: [\n {\n eventType: triggerType,\n config: {\n type: triggerType,\n ...(cfg.triggerConfigDefaults[triggerType] ?? {}),\n ...stripInternalKeys(\n (triggerSlot?.formData as Record<string, unknown> | undefined)?.[triggerType]\n ),\n },\n },\n ],\n }),\n };\n\n return json;\n}\n"],"names":["DEFAULTS","stripInternalKeys","obj","out","k","NON_TASK_KINDS","isTaskSlot","slot","interpolate","tpl","ctx","m","resolveFieldRef","ref","from","key","value","_a","_b","_c","_e","_d","buildExtensionStringValue","field","source","shape","exclude","fd","wrapped","getValueByPath","path","acc","buildDmnRules","dmnSpec","pathPrefix","opMap","valuesField","toJuel","cond","op","lhs","rhs","entriesToExpression","entries","list","parts","logical","rules","ruleNum","pushRule","expression","outputValue","blocks","block","values","v","condCfg","allExpressions","fieldKey","conditions","fieldValue","fallbackKey","rawFallback","fallbackValues","negation","e","buildConditionExpression","spec","defaultPrefix","prefix","raw","i","prev","isOr","buildDmn","o","emitTask","task","saveCtx","cfg","interpCtx","expr","serviceTasks","st","f","gatewayId","gateways","endsNeeded","templateFlows","target","callActivities","dmn","bpmnEntry","bpmnExit","outgoingConditions","branch","buildBackendPayload","opts","state","tasksByKey","context","config","slots","triggerSlot","s","eventType","triggerType","sourcesData","pickedSources","workflowCategory","sources","emitSlot","isBranchingSlot","branchMap","emissions","branchWalks","emit","branchKey","chain","taskChain","allServiceTasks","allGateways","allCallActivities","allTemplateFlows","allDmns","collect","bw","outerFlows","pushFlow","sourceRef","targetRef","conditionExpression","cur","next","condition","lastEmission","endEvent","startEvent"],"mappings":"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"}
package/dist/canvas.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("./WorkflowExecutionHistory-CsBnVxC5.js"),l=require("./messages-Bg7b9RbI.js"),r=require("./bpmn-CcuE2X_Q.js"),e=require("./GatewayBranchEdge-hUano0YJ.js");exports.FlowForgeCanvas=o.FlowForgeCanvas;exports.FlowForgeHeader=o.FlowForgeHeader;exports.SubWorkflowPreviewDrawer=o.SubWorkflowPreviewDrawer;exports.WorkflowCanvas=o.FlowForgeCanvas;exports.WorkflowExecutionHistory=o.WorkflowExecutionHistory;exports.WorkflowTemplateLibrary=o.WorkflowTemplateLibrary;exports.defaultFlowForgeMessages=l.defaultFlowForgeMessages;exports.loadWorkflowFromBpmn=r.loadWorkflowFromBpmn;exports.saveWorkflowToBpmn=r.saveWorkflowToBpmn;exports.ActionNode=e.ActionNode;exports.ApprovalNode=e.ApprovalNode;exports.EdgeWithPlusLabel=e.EdgeWithPlusLabel;exports.EndNode=e.EndNode;exports.FilterNode=e.FilterNode;exports.NodeBody=e.NodeBody;exports.RestApiNode=e.RestApiNode;exports.StartNode=e.StartNode;exports.TriggerNode=e.TriggerNode;exports.WebhookTriggerNode=e.WebhookTriggerNode;exports.builtInNodeTypes=e.builtInNodeTypes;exports.deriveRows=e.deriveRows;exports.resolveNodeRows=e.resolveNodeRows;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("./WorkflowExecutionHistory-8xEbKYsc.js"),l=require("./messages-Bg7b9RbI.js"),r=require("./bpmn-CcuE2X_Q.js"),e=require("./GatewayBranchEdge-hUano0YJ.js");exports.FlowForgeCanvas=o.FlowForgeCanvas;exports.FlowForgeHeader=o.FlowForgeHeader;exports.SubWorkflowPreviewDrawer=o.SubWorkflowPreviewDrawer;exports.WorkflowCanvas=o.FlowForgeCanvas;exports.WorkflowExecutionHistory=o.WorkflowExecutionHistory;exports.WorkflowTemplateLibrary=o.WorkflowTemplateLibrary;exports.defaultFlowForgeMessages=l.defaultFlowForgeMessages;exports.loadWorkflowFromBpmn=r.loadWorkflowFromBpmn;exports.saveWorkflowToBpmn=r.saveWorkflowToBpmn;exports.ActionNode=e.ActionNode;exports.ApprovalNode=e.ApprovalNode;exports.EdgeWithPlusLabel=e.EdgeWithPlusLabel;exports.EndNode=e.EndNode;exports.FilterNode=e.FilterNode;exports.NodeBody=e.NodeBody;exports.RestApiNode=e.RestApiNode;exports.StartNode=e.StartNode;exports.TriggerNode=e.TriggerNode;exports.WebhookTriggerNode=e.WebhookTriggerNode;exports.builtInNodeTypes=e.builtInNodeTypes;exports.deriveRows=e.deriveRows;exports.resolveNodeRows=e.resolveNodeRows;
2
2
  //# sourceMappingURL=canvas.cjs.map
package/dist/canvas.d.ts CHANGED
@@ -110,6 +110,8 @@ export declare interface CanvasSlot {
110
110
  label?: string;
111
111
  /** Maps branch key → display label. e.g. { pass: 'Pass', fail: 'Fail' } */
112
112
  branchLabels?: Record<string, string>;
113
+ /** Branch layout style — see NodeDescriptor.branchStyle. */
114
+ branchStyle?: 'symmetric' | 'inline-gate';
113
115
  }
114
116
 
115
117
  declare interface CanvasSlot_2 {
@@ -123,6 +125,8 @@ declare interface CanvasSlot_2 {
123
125
  label?: string;
124
126
  /** Maps branch key → display label. e.g. { pass: 'Pass', fail: 'Fail' } */
125
127
  branchLabels?: Record<string, string>;
128
+ /** Branch layout style — see NodeDescriptor.branchStyle. */
129
+ branchStyle?: 'symmetric' | 'inline-gate';
126
130
  }
127
131
 
128
132
  declare interface CanvasSlot_3 {
@@ -136,6 +140,8 @@ declare interface CanvasSlot_3 {
136
140
  label?: string;
137
141
  /** Maps branch key → display label. e.g. { pass: 'Pass', fail: 'Fail' } */
138
142
  branchLabels?: Record<string, string>;
143
+ /** Branch layout style — see NodeDescriptor.branchStyle. */
144
+ branchStyle?: 'symmetric' | 'inline-gate';
139
145
  }
140
146
 
141
147
  /** One column in a per-field condition row */
@@ -1076,6 +1082,14 @@ export declare interface NodeDescriptor {
1076
1082
  canInsert?: (ctx: InsertContext_2) => boolean;
1077
1083
  /** Maps branch key → display label. e.g. { pass: 'Pass', fail: 'Fail' }. Only applies to branching nodes (filterNode, approvalNode). */
1078
1084
  branchLabels?: Record<string, string>;
1085
+ /**
1086
+ * Branch layout style for a branching node.
1087
+ * - 'symmetric' (default): all branches indent side-by-side under the node.
1088
+ * - 'inline-gate': the FIRST branch (e.g. Pass) continues straight down the
1089
+ * main spine; the remaining branches (e.g. Fail) render as short side
1090
+ * edges to their End. Matches a pre-trigger "filter" gate design.
1091
+ */
1092
+ branchStyle?: 'symmetric' | 'inline-gate';
1079
1093
  formSchema: FieldDescriptor_3[] | ((nodeId: string) => Promise<FieldDescriptor_3[]>);
1080
1094
  /**
1081
1095
  * Custom configuration panel. When set, NodeConfigDrawer renders the returned
@@ -1177,6 +1191,14 @@ declare interface NodeDescriptor_2 {
1177
1191
  canInsert?: (ctx: InsertContext) => boolean;
1178
1192
  /** Maps branch key → display label. e.g. { pass: 'Pass', fail: 'Fail' }. Only applies to branching nodes (filterNode, approvalNode). */
1179
1193
  branchLabels?: Record<string, string>;
1194
+ /**
1195
+ * Branch layout style for a branching node.
1196
+ * - 'symmetric' (default): all branches indent side-by-side under the node.
1197
+ * - 'inline-gate': the FIRST branch (e.g. Pass) continues straight down the
1198
+ * main spine; the remaining branches (e.g. Fail) render as short side
1199
+ * edges to their End. Matches a pre-trigger "filter" gate design.
1200
+ */
1201
+ branchStyle?: 'symmetric' | 'inline-gate';
1180
1202
  formSchema: FieldDescriptor[] | ((nodeId: string) => Promise<FieldDescriptor[]>);
1181
1203
  /**
1182
1204
  * Custom configuration panel. When set, NodeConfigDrawer renders the returned
package/dist/canvas.js CHANGED
@@ -1,4 +1,4 @@
1
- import { F as a, a as s, S as r, F as d, W as l, b as t } from "./WorkflowExecutionHistory-DYp-l7mk.js";
1
+ import { F as a, a as s, S as r, F as d, W as l, b as t } from "./WorkflowExecutionHistory-BA5IpymY.js";
2
2
  import { d as f } from "./messages-CRZgWFU-.js";
3
3
  import { l as p, s as F } from "./bpmn-CtfWDaOY.js";
4
4
  import { A as g, b as W, E as m, c as n, F as b, f as k, R as v, S as T, T as u, W as x, e as y, g as A, r as E } from "./GatewayBranchEdge-BsPsPmnx.js";
package/dist/core.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./nodeRegistry.cjs"),r=require("./templateRegistry.cjs"),t=require("./messages-Bg7b9RbI.js"),o=require("./bpmn-CcuE2X_Q.js"),i=require("./buildBackendPayload-DoRFqe2X.js");exports.NodeTypeRegistry=e.NodeTypeRegistry;exports.baseNodeDefaults=e.baseNodeDefaults;exports.conditionBranchDescriptor=e.conditionBranchDescriptor;exports.defineNode=e.defineNode;exports.endEventDescriptor=e.endEventDescriptor;exports.makeSubWorkflowDescriptor=e.makeSubWorkflowDescriptor;exports.nodeTypeRegistry=e.nodeTypeRegistry;exports.notificationDescriptor=e.notificationDescriptor;exports.restApiDescriptor=e.restApiDescriptor;exports.startEventDescriptor=e.startEventDescriptor;exports.subWorkflowDescriptor=e.subWorkflowDescriptor;exports.webhookTriggerDescriptor=e.webhookTriggerDescriptor;exports.webhookTriggerTemplate=e.webhookTriggerTemplate;exports.TemplateRegistry=r.TemplateRegistry;exports.templateRegistry=r.templateRegistry;exports.defaultFlowForgeMessages=t.defaultFlowForgeMessages;exports.loadWorkflowFromBpmn=o.loadWorkflowFromBpmn;exports.saveWorkflowToBpmn=o.saveWorkflowToBpmn;exports.buildBackendPayload=i.buildBackendPayload;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./nodeRegistry.cjs"),r=require("./templateRegistry.cjs"),t=require("./messages-Bg7b9RbI.js"),o=require("./bpmn-CcuE2X_Q.js"),i=require("./buildBackendPayload-CTCfdT8R.js");exports.NodeTypeRegistry=e.NodeTypeRegistry;exports.baseNodeDefaults=e.baseNodeDefaults;exports.conditionBranchDescriptor=e.conditionBranchDescriptor;exports.defineNode=e.defineNode;exports.endEventDescriptor=e.endEventDescriptor;exports.makeSubWorkflowDescriptor=e.makeSubWorkflowDescriptor;exports.nodeTypeRegistry=e.nodeTypeRegistry;exports.notificationDescriptor=e.notificationDescriptor;exports.restApiDescriptor=e.restApiDescriptor;exports.startEventDescriptor=e.startEventDescriptor;exports.subWorkflowDescriptor=e.subWorkflowDescriptor;exports.webhookTriggerDescriptor=e.webhookTriggerDescriptor;exports.webhookTriggerTemplate=e.webhookTriggerTemplate;exports.TemplateRegistry=r.TemplateRegistry;exports.templateRegistry=r.templateRegistry;exports.defaultFlowForgeMessages=t.defaultFlowForgeMessages;exports.loadWorkflowFromBpmn=o.loadWorkflowFromBpmn;exports.saveWorkflowToBpmn=o.saveWorkflowToBpmn;exports.buildBackendPayload=i.buildBackendPayload;
2
2
  //# sourceMappingURL=core.cjs.map
package/dist/core.d.ts CHANGED
@@ -149,6 +149,8 @@ export declare interface CanvasSlot {
149
149
  label?: string;
150
150
  /** Maps branch key → display label. e.g. { pass: 'Pass', fail: 'Fail' } */
151
151
  branchLabels?: Record<string, string>;
152
+ /** Branch layout style — see NodeDescriptor.branchStyle. */
153
+ branchStyle?: 'symmetric' | 'inline-gate';
152
154
  }
153
155
 
154
156
  /**
@@ -619,6 +621,14 @@ export declare interface NodeDescriptor {
619
621
  canInsert?: (ctx: InsertContext) => boolean;
620
622
  /** Maps branch key → display label. e.g. { pass: 'Pass', fail: 'Fail' }. Only applies to branching nodes (filterNode, approvalNode). */
621
623
  branchLabels?: Record<string, string>;
624
+ /**
625
+ * Branch layout style for a branching node.
626
+ * - 'symmetric' (default): all branches indent side-by-side under the node.
627
+ * - 'inline-gate': the FIRST branch (e.g. Pass) continues straight down the
628
+ * main spine; the remaining branches (e.g. Fail) render as short side
629
+ * edges to their End. Matches a pre-trigger "filter" gate design.
630
+ */
631
+ branchStyle?: 'symmetric' | 'inline-gate';
622
632
  formSchema: FieldDescriptor[] | ((nodeId: string) => Promise<FieldDescriptor[]>);
623
633
  /**
624
634
  * Custom configuration panel. When set, NodeConfigDrawer renders the returned
package/dist/core.js CHANGED
@@ -2,7 +2,7 @@ import { NodeTypeRegistry as r, baseNodeDefaults as t, conditionBranchDescriptor
2
2
  import { TemplateRegistry as k, templateRegistry as b } from "./templateRegistry.js";
3
3
  import { d as y } from "./messages-CRZgWFU-.js";
4
4
  import { l as u, s as x } from "./bpmn-CtfWDaOY.js";
5
- import { b as R } from "./buildBackendPayload-c7Arn1ji.js";
5
+ import { b as R } from "./buildBackendPayload-C16SLotf.js";
6
6
  export {
7
7
  r as NodeTypeRegistry,
8
8
  k as TemplateRegistry,
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-BhhUO6Ue.js"),T=require("./SchemaBuilderDrawer-CtGanHvg.js");require("react/jsx-runtime");require("react");require("@mui/material");require("react-icons/md");const i=require("./nodeRegistry.cjs"),F=require("./templateRegistry.cjs"),p=require("./WorkflowExecutionHistory-CsBnVxC5.js"),S=require("./messages-Bg7b9RbI.js"),h=require("./bpmn-CcuE2X_Q.js"),t=require("./GatewayBranchEdge-hUano0YJ.js"),R=require("./buildBackendPayload-DoRFqe2X.js");class N{constructor(){this.channels=new Map}register(r,s){this.channels.set(r,s)}get(r){return this.channels.get(r)}list(){return Array.from(this.channels.entries()).map(([r,s])=>({key:r,...s}))}has(r){return this.channels.has(r)}}const v=new N;function D(o){const{currentNodeId:r,nodes:s,getParents:l,getOutputSchema:a,nodePath:d,nodeLabel:u,getNodeId:c=n=>n.id}=o,g=s.find(n=>c(n)===r);if(!g)return[];const w=P(g,s,l,c),f=[];for(const n of w){const y=a(n);if(!y||y.length===0)continue;const b=d(n);f.push({label:u?u(n):b,items:y.map(k=>m(k,b))})}return f}function P(o,r,s,l){const a=new Set,d=[],u=[...s(o,r)];for(;u.length>0;){const c=u.shift(),g=l(c);a.has(g)||(a.add(g),d.push(c),u.push(...s(c,r)))}return d}function m(o,r){const s=`${r}.${o.key}`,l=o.description??(o.sample!==void 0&&o.sample!==null?String(o.sample):void 0),a={label:o.label,path:s,key:o.key};return l!==void 0&&(a.description=l),(o.isList||o.type==="array")&&(a.isList=!0),o.children&&o.children.length>0&&(a.children=o.children.map(d=>m(d,s))),a}exports.DRAG_DATA_KEY=e.DRAG_DATA_KEY;exports.DynamicFormRenderer=e.DynamicFormRenderer;exports.FF=e.FF;exports.FlowForgeRegistry=e.FlowForgeRegistry;exports.FlowForm=e.FlowForm;exports.FormulaInput=e.FormulaInput;exports.InfiniteSelectField=e.InfiniteSelectField;exports.OptionsResolversProvider=e.OptionsResolversProvider;exports.TablePickerField=e.TablePickerField;exports.VariablePicker=e.VariablePicker;exports.VariablePickerProvider=e.VariablePickerProvider;exports.astHasRefs=e.astHasRefs;exports.astToTokens=e.astToTokens;exports.buildEvaluationPayload=e.buildEvaluationPayload;exports.buildFieldConfig=e.buildFieldConfig;exports.buildFormulaPath=e.buildFormulaPath;exports.buildSelectStyles=e.buildSelectStyles;exports.buildValidationSchema=e.buildValidationSchema;exports.conditionConfigToRulePayload=e.conditionConfigToRulePayload;exports.conditionNodesToRuleTree=e.conditionNodesToRuleTree;exports.dataSourceRegistry=e.dataSourceRegistry;exports.errorTextStyle=e.errorTextStyle;exports.extractLabel=e.extractLabel;exports.fieldRegistry=e.fieldRegistry;exports.hasFormulaTokens=e.hasFormulaTokens;exports.helperTextStyle=e.helperTextStyle;exports.inputStyle=e.inputStyle;exports.isFormula=e.isFormula;exports.leafReference=e.leafReference;exports.parseToAST=e.parseToAST;exports.ruleConditionsToNodes=e.ruleConditionsToNodes;exports.rulePayloadToConditionConfig=e.rulePayloadToConditionConfig;exports.serializeAST=e.serializeAST;exports.serializeASTAsConfig=e.serializeASTAsConfig;exports.serializeConditionExpressions=e.serializeConditionExpressions;exports.stripFormulaTokens=e.stripFormulaTokens;exports.tokenize=e.tokenize;exports.unwrapFormula=e.unwrapFormula;exports.useDynamicOptions=e.useDynamicOptions;exports.useOptionsResolvers=e.useOptionsResolvers;exports.useVariablePickerContext=e.useVariablePickerContext;exports.variableSubtreeToValue=e.variableSubtreeToValue;exports.wrapFormula=e.wrapFormula;exports.FIELD_TYPE_OPTIONS=T.FIELD_TYPE_OPTIONS;exports.SchemaBuilder=T.SchemaBuilder;exports.SchemaBuilderDrawer=T.SchemaBuilderDrawer;exports.useFlowForm=T.useFlowForm;exports.NodeTypeRegistry=i.NodeTypeRegistry;exports.baseNodeDefaults=i.baseNodeDefaults;exports.conditionBranchDescriptor=i.conditionBranchDescriptor;exports.defineNode=i.defineNode;exports.endEventDescriptor=i.endEventDescriptor;exports.makeSubWorkflowDescriptor=i.makeSubWorkflowDescriptor;exports.nodeTypeRegistry=i.nodeTypeRegistry;exports.notificationDescriptor=i.notificationDescriptor;exports.restApiDescriptor=i.restApiDescriptor;exports.startEventDescriptor=i.startEventDescriptor;exports.subWorkflowDescriptor=i.subWorkflowDescriptor;exports.webhookTriggerDescriptor=i.webhookTriggerDescriptor;exports.webhookTriggerTemplate=i.webhookTriggerTemplate;exports.TemplateRegistry=F.TemplateRegistry;exports.templateRegistry=F.templateRegistry;exports.FlowForgeCanvas=p.FlowForgeCanvas;exports.FlowForgeHeader=p.FlowForgeHeader;exports.SubWorkflowPreviewDrawer=p.SubWorkflowPreviewDrawer;exports.WorkflowCanvas=p.FlowForgeCanvas;exports.WorkflowExecutionHistory=p.WorkflowExecutionHistory;exports.WorkflowTemplateLibrary=p.WorkflowTemplateLibrary;exports.defaultFlowForgeMessages=S.defaultFlowForgeMessages;exports.loadWorkflowFromBpmn=h.loadWorkflowFromBpmn;exports.saveWorkflowToBpmn=h.saveWorkflowToBpmn;exports.ActionNode=t.ActionNode;exports.ApprovalNode=t.ApprovalNode;exports.EdgeWithPlusLabel=t.EdgeWithPlusLabel;exports.EndNode=t.EndNode;exports.FilterNode=t.FilterNode;exports.NodeBody=t.NodeBody;exports.RestApiNode=t.RestApiNode;exports.StartNode=t.StartNode;exports.TriggerNode=t.TriggerNode;exports.WebhookTriggerNode=t.WebhookTriggerNode;exports.builtInNodeTypes=t.builtInNodeTypes;exports.deriveRows=t.deriveRows;exports.resolveNodeRows=t.resolveNodeRows;exports.buildBackendPayload=R.buildBackendPayload;exports.buildVariableGroups=D;exports.notificationChannelRegistry=v;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-BhhUO6Ue.js"),T=require("./SchemaBuilderDrawer-CtGanHvg.js");require("react/jsx-runtime");require("react");require("@mui/material");require("react-icons/md");const i=require("./nodeRegistry.cjs"),F=require("./templateRegistry.cjs"),p=require("./WorkflowExecutionHistory-8xEbKYsc.js"),S=require("./messages-Bg7b9RbI.js"),h=require("./bpmn-CcuE2X_Q.js"),t=require("./GatewayBranchEdge-hUano0YJ.js"),R=require("./buildBackendPayload-CTCfdT8R.js");class N{constructor(){this.channels=new Map}register(r,s){this.channels.set(r,s)}get(r){return this.channels.get(r)}list(){return Array.from(this.channels.entries()).map(([r,s])=>({key:r,...s}))}has(r){return this.channels.has(r)}}const v=new N;function D(o){const{currentNodeId:r,nodes:s,getParents:l,getOutputSchema:a,nodePath:d,nodeLabel:u,getNodeId:c=n=>n.id}=o,g=s.find(n=>c(n)===r);if(!g)return[];const w=P(g,s,l,c),f=[];for(const n of w){const y=a(n);if(!y||y.length===0)continue;const b=d(n);f.push({label:u?u(n):b,items:y.map(k=>m(k,b))})}return f}function P(o,r,s,l){const a=new Set,d=[],u=[...s(o,r)];for(;u.length>0;){const c=u.shift(),g=l(c);a.has(g)||(a.add(g),d.push(c),u.push(...s(c,r)))}return d}function m(o,r){const s=`${r}.${o.key}`,l=o.description??(o.sample!==void 0&&o.sample!==null?String(o.sample):void 0),a={label:o.label,path:s,key:o.key};return l!==void 0&&(a.description=l),(o.isList||o.type==="array")&&(a.isList=!0),o.children&&o.children.length>0&&(a.children=o.children.map(d=>m(d,s))),a}exports.DRAG_DATA_KEY=e.DRAG_DATA_KEY;exports.DynamicFormRenderer=e.DynamicFormRenderer;exports.FF=e.FF;exports.FlowForgeRegistry=e.FlowForgeRegistry;exports.FlowForm=e.FlowForm;exports.FormulaInput=e.FormulaInput;exports.InfiniteSelectField=e.InfiniteSelectField;exports.OptionsResolversProvider=e.OptionsResolversProvider;exports.TablePickerField=e.TablePickerField;exports.VariablePicker=e.VariablePicker;exports.VariablePickerProvider=e.VariablePickerProvider;exports.astHasRefs=e.astHasRefs;exports.astToTokens=e.astToTokens;exports.buildEvaluationPayload=e.buildEvaluationPayload;exports.buildFieldConfig=e.buildFieldConfig;exports.buildFormulaPath=e.buildFormulaPath;exports.buildSelectStyles=e.buildSelectStyles;exports.buildValidationSchema=e.buildValidationSchema;exports.conditionConfigToRulePayload=e.conditionConfigToRulePayload;exports.conditionNodesToRuleTree=e.conditionNodesToRuleTree;exports.dataSourceRegistry=e.dataSourceRegistry;exports.errorTextStyle=e.errorTextStyle;exports.extractLabel=e.extractLabel;exports.fieldRegistry=e.fieldRegistry;exports.hasFormulaTokens=e.hasFormulaTokens;exports.helperTextStyle=e.helperTextStyle;exports.inputStyle=e.inputStyle;exports.isFormula=e.isFormula;exports.leafReference=e.leafReference;exports.parseToAST=e.parseToAST;exports.ruleConditionsToNodes=e.ruleConditionsToNodes;exports.rulePayloadToConditionConfig=e.rulePayloadToConditionConfig;exports.serializeAST=e.serializeAST;exports.serializeASTAsConfig=e.serializeASTAsConfig;exports.serializeConditionExpressions=e.serializeConditionExpressions;exports.stripFormulaTokens=e.stripFormulaTokens;exports.tokenize=e.tokenize;exports.unwrapFormula=e.unwrapFormula;exports.useDynamicOptions=e.useDynamicOptions;exports.useOptionsResolvers=e.useOptionsResolvers;exports.useVariablePickerContext=e.useVariablePickerContext;exports.variableSubtreeToValue=e.variableSubtreeToValue;exports.wrapFormula=e.wrapFormula;exports.FIELD_TYPE_OPTIONS=T.FIELD_TYPE_OPTIONS;exports.SchemaBuilder=T.SchemaBuilder;exports.SchemaBuilderDrawer=T.SchemaBuilderDrawer;exports.useFlowForm=T.useFlowForm;exports.NodeTypeRegistry=i.NodeTypeRegistry;exports.baseNodeDefaults=i.baseNodeDefaults;exports.conditionBranchDescriptor=i.conditionBranchDescriptor;exports.defineNode=i.defineNode;exports.endEventDescriptor=i.endEventDescriptor;exports.makeSubWorkflowDescriptor=i.makeSubWorkflowDescriptor;exports.nodeTypeRegistry=i.nodeTypeRegistry;exports.notificationDescriptor=i.notificationDescriptor;exports.restApiDescriptor=i.restApiDescriptor;exports.startEventDescriptor=i.startEventDescriptor;exports.subWorkflowDescriptor=i.subWorkflowDescriptor;exports.webhookTriggerDescriptor=i.webhookTriggerDescriptor;exports.webhookTriggerTemplate=i.webhookTriggerTemplate;exports.TemplateRegistry=F.TemplateRegistry;exports.templateRegistry=F.templateRegistry;exports.FlowForgeCanvas=p.FlowForgeCanvas;exports.FlowForgeHeader=p.FlowForgeHeader;exports.SubWorkflowPreviewDrawer=p.SubWorkflowPreviewDrawer;exports.WorkflowCanvas=p.FlowForgeCanvas;exports.WorkflowExecutionHistory=p.WorkflowExecutionHistory;exports.WorkflowTemplateLibrary=p.WorkflowTemplateLibrary;exports.defaultFlowForgeMessages=S.defaultFlowForgeMessages;exports.loadWorkflowFromBpmn=h.loadWorkflowFromBpmn;exports.saveWorkflowToBpmn=h.saveWorkflowToBpmn;exports.ActionNode=t.ActionNode;exports.ApprovalNode=t.ApprovalNode;exports.EdgeWithPlusLabel=t.EdgeWithPlusLabel;exports.EndNode=t.EndNode;exports.FilterNode=t.FilterNode;exports.NodeBody=t.NodeBody;exports.RestApiNode=t.RestApiNode;exports.StartNode=t.StartNode;exports.TriggerNode=t.TriggerNode;exports.WebhookTriggerNode=t.WebhookTriggerNode;exports.builtInNodeTypes=t.builtInNodeTypes;exports.deriveRows=t.deriveRows;exports.resolveNodeRows=t.resolveNodeRows;exports.buildBackendPayload=R.buildBackendPayload;exports.buildVariableGroups=D;exports.notificationChannelRegistry=v;
2
2
  //# sourceMappingURL=index.cjs.map
package/dist/index.d.ts CHANGED
@@ -267,6 +267,8 @@ export declare interface CanvasSlot {
267
267
  label?: string;
268
268
  /** Maps branch key → display label. e.g. { pass: 'Pass', fail: 'Fail' } */
269
269
  branchLabels?: Record<string, string>;
270
+ /** Branch layout style — see NodeDescriptor.branchStyle. */
271
+ branchStyle?: 'symmetric' | 'inline-gate';
270
272
  }
271
273
 
272
274
  export declare interface ChildRouterProps {
@@ -1471,6 +1473,14 @@ export declare interface NodeDescriptor {
1471
1473
  canInsert?: (ctx: InsertContext) => boolean;
1472
1474
  /** Maps branch key → display label. e.g. { pass: 'Pass', fail: 'Fail' }. Only applies to branching nodes (filterNode, approvalNode). */
1473
1475
  branchLabels?: Record<string, string>;
1476
+ /**
1477
+ * Branch layout style for a branching node.
1478
+ * - 'symmetric' (default): all branches indent side-by-side under the node.
1479
+ * - 'inline-gate': the FIRST branch (e.g. Pass) continues straight down the
1480
+ * main spine; the remaining branches (e.g. Fail) render as short side
1481
+ * edges to their End. Matches a pre-trigger "filter" gate design.
1482
+ */
1483
+ branchStyle?: 'symmetric' | 'inline-gate';
1474
1484
  formSchema: FieldDescriptor[] | ((nodeId: string) => Promise<FieldDescriptor[]>);
1475
1485
  /**
1476
1486
  * Custom configuration panel. When set, NodeConfigDrawer renders the returned
package/dist/index.js CHANGED
@@ -6,11 +6,11 @@ import "@mui/material";
6
6
  import "react-icons/md";
7
7
  import { NodeTypeRegistry as we, baseNodeDefaults as ke, conditionBranchDescriptor as Se, defineNode as Ne, endEventDescriptor as Re, makeSubWorkflowDescriptor as ve, nodeTypeRegistry as xe, notificationDescriptor as De, restApiDescriptor as Pe, startEventDescriptor as Ae, subWorkflowDescriptor as Ce, webhookTriggerDescriptor as Ee, webhookTriggerTemplate as We } from "./nodeRegistry.js";
8
8
  import { TemplateRegistry as Be, templateRegistry as Le } from "./templateRegistry.js";
9
- import { F as Oe, a as ze, S as He, F as _e, W as Ge, b as Me } from "./WorkflowExecutionHistory-DYp-l7mk.js";
9
+ import { F as Oe, a as ze, S as He, F as _e, W as Ge, b as Me } from "./WorkflowExecutionHistory-BA5IpymY.js";
10
10
  import { d as Ke } from "./messages-CRZgWFU-.js";
11
11
  import { l as $e, s as je } from "./bpmn-CtfWDaOY.js";
12
12
  import { A as Ue, b as Qe, E as Xe, c as Ze, F as es, f as ss, R as os, S as as, T as rs, W as ts, e as is, g as ns, r as ls } from "./GatewayBranchEdge-BsPsPmnx.js";
13
- import { b as cs } from "./buildBackendPayload-c7Arn1ji.js";
13
+ import { b as cs } from "./buildBackendPayload-C16SLotf.js";
14
14
  class g {
15
15
  constructor() {
16
16
  this.channels = /* @__PURE__ */ new Map();
@@ -36,6 +36,8 @@ declare interface CanvasSlot {
36
36
  label?: string;
37
37
  /** Maps branch key → display label. e.g. { pass: 'Pass', fail: 'Fail' } */
38
38
  branchLabels?: Record<string, string>;
39
+ /** Branch layout style — see NodeDescriptor.branchStyle. */
40
+ branchStyle?: 'symmetric' | 'inline-gate';
39
41
  }
40
42
 
41
43
  export declare const conditionBranchDescriptor: NodeDescriptor;
@@ -371,6 +373,14 @@ export declare interface NodeDescriptor {
371
373
  canInsert?: (ctx: InsertContext) => boolean;
372
374
  /** Maps branch key → display label. e.g. { pass: 'Pass', fail: 'Fail' }. Only applies to branching nodes (filterNode, approvalNode). */
373
375
  branchLabels?: Record<string, string>;
376
+ /**
377
+ * Branch layout style for a branching node.
378
+ * - 'symmetric' (default): all branches indent side-by-side under the node.
379
+ * - 'inline-gate': the FIRST branch (e.g. Pass) continues straight down the
380
+ * main spine; the remaining branches (e.g. Fail) render as short side
381
+ * edges to their End. Matches a pre-trigger "filter" gate design.
382
+ */
383
+ branchStyle?: 'symmetric' | 'inline-gate';
374
384
  formSchema: FieldDescriptor[] | ((nodeId: string) => Promise<FieldDescriptor[]>);
375
385
  /**
376
386
  * Custom configuration panel. When set, NodeConfigDrawer renders the returned
@@ -36,6 +36,8 @@ declare interface CanvasSlot {
36
36
  label?: string;
37
37
  /** Maps branch key → display label. e.g. { pass: 'Pass', fail: 'Fail' } */
38
38
  branchLabels?: Record<string, string>;
39
+ /** Branch layout style — see NodeDescriptor.branchStyle. */
40
+ branchStyle?: 'symmetric' | 'inline-gate';
39
41
  }
40
42
 
41
43
  /** One column in a per-field condition row */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@notmrabhi/flowforge",
3
- "version": "0.1.105",
3
+ "version": "0.1.107",
4
4
  "description": "Schema-driven form renderer and workflow engine for miniOrange IAM",
5
5
  "license": "UNLICENSED",
6
6
  "author": "miniOrange",