@notmrabhi/flowforge 0.1.51 → 0.1.53

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,316 @@
1
+ const N = {
2
+ triggerToCategory: {},
3
+ schedulerEventTypes: [],
4
+ conditionPathPrefix: "",
5
+ defaultWorkflowCategory: "",
6
+ endEventIds: {
7
+ success: "endEventSuccess",
8
+ failure: "endEventFailure",
9
+ rejected: "endEventRejected"
10
+ },
11
+ endEventNames: {
12
+ success: "Success",
13
+ failure: "Failure",
14
+ rejected: "Rejected"
15
+ },
16
+ startEventId: "startEvent"
17
+ }, L = /* @__PURE__ */ new Set([
18
+ "start",
19
+ "end",
20
+ "triggerFixed",
21
+ "addTrigger",
22
+ "addStep"
23
+ ]), B = (e) => !!e && !L.has(String(e.kind ?? ""));
24
+ function b(e, t) {
25
+ return e == null ? "" : String(e).replace(
26
+ /\$\{(\w+)\}/g,
27
+ (o, r) => Object.prototype.hasOwnProperty.call(t, r) ? String(t[r]) : o
28
+ );
29
+ }
30
+ function V(e, t) {
31
+ var s, E, a, u, m;
32
+ if (!e || typeof e != "object") return "";
33
+ const { from: o, key: r, value: i } = e;
34
+ return o === "literal" ? i === void 0 ? "" : String(i) : o === "task" ? String(((s = t.task) == null ? void 0 : s[r ?? ""]) ?? "") : o === "ctx" ? String(((E = t.ctx) == null ? void 0 : E[r ?? ""]) ?? "") : o === "slot" ? String(((a = t.slot) == null ? void 0 : a[r ?? ""]) ?? "") : o === "formData" ? String(((m = (u = t.slot) == null ? void 0 : u.formData) == null ? void 0 : m[r ?? ""]) ?? "") : "";
35
+ }
36
+ function J(e, t) {
37
+ var r, i, s;
38
+ const o = e == null ? void 0 : e.source;
39
+ if (!o) return "";
40
+ if (o.type === "literal")
41
+ return typeof o.value == "string" ? o.value : JSON.stringify(o.value ?? "");
42
+ if (o.type === "json" || o.type === "taskConfig") {
43
+ const E = o.shape || {}, a = {};
44
+ return Object.keys(E).forEach((u) => {
45
+ a[u] = V(E[u], t);
46
+ }), JSON.stringify(a);
47
+ }
48
+ if (o.type === "formData") {
49
+ if (o.passthrough) {
50
+ const E = new Set(o.exclude || []), a = {}, u = ((r = t.slot) == null ? void 0 : r.formData) ?? {};
51
+ return Object.keys(u).forEach((m) => {
52
+ E.has(m) || (a[m] = u[m]);
53
+ }), JSON.stringify(a);
54
+ }
55
+ return String(((s = (i = t.slot) == null ? void 0 : i.formData) == null ? void 0 : s[o.key ?? ""]) ?? "");
56
+ }
57
+ return "";
58
+ }
59
+ function K(e, t) {
60
+ if (!(!e || typeof e != "object" || !t))
61
+ return t.split(".").reduce((o, r) => {
62
+ if (!(o == null || typeof o != "object"))
63
+ return o[r];
64
+ }, e);
65
+ }
66
+ function W(e, t, o) {
67
+ var I;
68
+ const r = e.operatorMap || {}, i = e.valuesField || "groups", s = (n) => {
69
+ const p = r[String((n == null ? void 0 : n.operator) ?? "")] ?? "==", d = `${o}.${(n == null ? void 0 : n.key) ?? (n == null ? void 0 : n.field) ?? ""}`, f = `'${String((n == null ? void 0 : n.value) ?? "")}'`;
70
+ return p.startsWith(".") ? `${d}${p}(${f})` : p.startsWith("!.") ? `!${d}${p.slice(1)}(${f})` : `${d} ${p} ${f}`;
71
+ }, E = (n) => {
72
+ var g, l;
73
+ const p = Array.isArray(n) ? n : [];
74
+ if (p.length === 0) return null;
75
+ const d = p.map(s), y = ((g = p[0]) == null ? void 0 : g.connector) === "or" || ((l = p[0]) == null ? void 0 : l.logicalOperator) === "OR" ? "||" : "&&";
76
+ return d.join(` ${y} `);
77
+ }, a = [];
78
+ let u = 1;
79
+ const m = (n, p) => {
80
+ a.push({
81
+ id: `rule${u}`,
82
+ inputEntries: [
83
+ {
84
+ id: `rule${u}InputEntry1`,
85
+ text: n ? `\${(${n})}` : ""
86
+ }
87
+ ],
88
+ outputEntries: [
89
+ {
90
+ id: `rule${u}OutputEntry1`,
91
+ text: `"${p}"`
92
+ }
93
+ ]
94
+ }), u += 1;
95
+ }, v = Array.isArray((I = t == null ? void 0 : t.formData) == null ? void 0 : I.groupBlocks) ? t.formData.groupBlocks : [];
96
+ if (v.length > 0)
97
+ return v.forEach((n) => {
98
+ const p = Array.isArray(n == null ? void 0 : n[i]) ? n[i] : [], d = E(n == null ? void 0 : n.conditions);
99
+ p.forEach((f) => m(d, f));
100
+ }), a;
101
+ const h = (t == null ? void 0 : t.formData) ?? {}, $ = h._conditionConfig ?? h.conditionConfig;
102
+ return $ && typeof $ == "object" && Object.keys($).forEach((n) => {
103
+ const p = $[n], d = E(p), f = Object.prototype.hasOwnProperty.call(h, n) ? h[n] : K(h, n);
104
+ Array.isArray(f) ? f.forEach((y) => {
105
+ const g = typeof y == "object" && y !== null ? y.value ?? y.label ?? y : y;
106
+ m(d, g);
107
+ }) : f != null && f !== "" ? m(d, f) : d && m(d, "");
108
+ }), a;
109
+ }
110
+ function k(e, t, o) {
111
+ return {
112
+ mappings: [],
113
+ name: e.tableName,
114
+ decision: {
115
+ id: e.tableName,
116
+ name: e.tableName,
117
+ decisionTable: {
118
+ id: `decisionTable_${e.tableName}`,
119
+ hitPolicy: e.hitPolicy || "FIRST",
120
+ inputs: [
121
+ {
122
+ id: `input_${e.tableName}`,
123
+ inputExpression: {
124
+ id: `inputExpr_${e.tableName}`,
125
+ typeRef: "string",
126
+ text: e.inputExpr
127
+ }
128
+ }
129
+ ],
130
+ outputs: (e.outputs || []).map((r) => ({
131
+ id: r.id,
132
+ label: r.label,
133
+ typeRef: r.typeRef || "string",
134
+ name: r.name
135
+ })),
136
+ rules: W(e, t, o)
137
+ }
138
+ }
139
+ };
140
+ }
141
+ function G(e, t, o, r) {
142
+ var f, y, g;
143
+ const i = (f = t == null ? void 0 : t.ui) == null ? void 0 : f.bpmnEmit;
144
+ if (!i)
145
+ return {
146
+ serviceTasks: [
147
+ {
148
+ id: e.id,
149
+ name: (t == null ? void 0 : t.name) || e.descriptorType,
150
+ configuration: Array.isArray(t == null ? void 0 : t.configuration) ? t.configuration : [],
151
+ input: e.formData || {}
152
+ }
153
+ ],
154
+ gateways: [],
155
+ callActivities: [],
156
+ templateFlows: [],
157
+ dmn: null,
158
+ bpmnEntry: e.id,
159
+ bpmnExit: e.id,
160
+ outgoingConditions: {},
161
+ endsNeeded: /* @__PURE__ */ new Set()
162
+ };
163
+ const s = {
164
+ id: e.id,
165
+ endFailure: r.endEventIds.failure,
166
+ endRejected: r.endEventIds.rejected,
167
+ endSuccess: r.endEventIds.success
168
+ }, E = { task: t, slot: e, ctx: o }, a = (i.serviceTasks || []).map((l) => ({
169
+ id: b(l.idTemplate, s),
170
+ name: l.name,
171
+ flowableClass: l.flowableClass,
172
+ extensionElements: {
173
+ fields: (l.extensionFields || []).map((w) => ({
174
+ name: w.name,
175
+ stringValue: J(w, E)
176
+ }))
177
+ }
178
+ }));
179
+ let u = null;
180
+ const m = [];
181
+ i.gateway && (u = b(i.gateway.idTemplate, s), s.gateway = u, m.push({ id: u, name: i.gateway.name }));
182
+ const v = /* @__PURE__ */ new Set(), h = (i.templateFlows || []).map((l) => {
183
+ const w = b(l.from, s), T = b(l.to, s);
184
+ return T === r.endEventIds.failure && v.add(r.endEventIds.failure), T === r.endEventIds.rejected && v.add(r.endEventIds.rejected), {
185
+ id: l.idTemplate ? b(l.idTemplate, s) : `${w}-to-${T}`,
186
+ sourceRef: w,
187
+ targetRef: T,
188
+ conditionExpression: l.condition ? b(l.condition, s) : null
189
+ };
190
+ }), $ = [], I = i.dmnEmit ? k(i.dmnEmit, e, r.conditionPathPrefix) : null, n = ((y = a[0]) == null ? void 0 : y.id) ?? e.id, p = u ?? ((g = a[a.length - 1]) == null ? void 0 : g.id) ?? e.id, d = {};
191
+ return Object.keys(i.outgoingConditions || {}).forEach((l) => {
192
+ d[l] = b(
193
+ i.outgoingConditions[l],
194
+ s
195
+ );
196
+ }), {
197
+ serviceTasks: a,
198
+ gateways: m,
199
+ callActivities: $,
200
+ templateFlows: h,
201
+ dmn: I,
202
+ bpmnEntry: n,
203
+ bpmnExit: p,
204
+ outgoingConditions: d,
205
+ endsNeeded: v
206
+ };
207
+ }
208
+ function U(e) {
209
+ var R, A, D, S;
210
+ const { state: t, tasksByKey: o, context: r, config: i } = e, s = {
211
+ ...N,
212
+ ...i ?? {},
213
+ triggerToCategory: { ...N.triggerToCategory, ...(i == null ? void 0 : i.triggerToCategory) ?? {} },
214
+ schedulerEventTypes: (i == null ? void 0 : i.schedulerEventTypes) ?? N.schedulerEventTypes,
215
+ endEventIds: { ...N.endEventIds, ...(i == null ? void 0 : i.endEventIds) ?? {} },
216
+ endEventNames: { ...N.endEventNames, ...(i == null ? void 0 : i.endEventNames) ?? {} }
217
+ }, E = Array.isArray(t == null ? void 0 : t.slots) ? t.slots : [], a = E.find((c) => c.kind === "triggerFixed"), u = (R = a == null ? void 0 : a.nodeData) == null ? void 0 : R.eventType, m = ((A = a == null ? void 0 : a.nodeData) == null ? void 0 : A.type) || "event", v = (D = a == null ? void 0 : a.nodeData) == null ? void 0 : D.sources, h = Array.isArray(v) ? v.map(
218
+ (c) => typeof c == "string" ? c : (c == null ? void 0 : c.value) ?? (c == null ? void 0 : c.key) ?? ""
219
+ ).filter(Boolean) : [], $ = s.triggerToCategory[u ?? ""] ?? s.defaultWorkflowCategory, n = !!u && s.schedulerEventTypes.includes(u) ? ["SCHEDULER"] : h, d = E.filter(B).map((c) => ({
220
+ slot: c,
221
+ emit: G(c, o[c.descriptorType ?? ""] ?? {}, r, s)
222
+ })), f = [], y = [], g = [], l = [], w = [], T = /* @__PURE__ */ new Set();
223
+ d.forEach(({ emit: c }) => {
224
+ f.push(...c.serviceTasks), y.push(...c.gateways), g.push(...c.callActivities), l.push(...c.templateFlows), c.dmn && w.push(c.dmn), c.endsNeeded.forEach((C) => T.add(C));
225
+ });
226
+ const x = [];
227
+ if (d.length > 0) {
228
+ x.push({
229
+ id: `${s.startEventId}-to-${d[0].emit.bpmnEntry}`,
230
+ sourceRef: s.startEventId,
231
+ targetRef: d[0].emit.bpmnEntry,
232
+ conditionExpression: null
233
+ });
234
+ for (let C = 0; C < d.length - 1; C += 1) {
235
+ const j = d[C].emit, F = d[C + 1].emit, P = j.outgoingConditions.success ?? j.outgoingConditions.pass ?? j.outgoingConditions.approved ?? null;
236
+ x.push({
237
+ id: `${j.bpmnExit}-to-${F.bpmnEntry}`,
238
+ sourceRef: j.bpmnExit,
239
+ targetRef: F.bpmnEntry,
240
+ conditionExpression: P
241
+ });
242
+ }
243
+ const c = d[d.length - 1].emit;
244
+ x.push({
245
+ id: `${c.bpmnExit}-to-${s.endEventIds.success}`,
246
+ sourceRef: c.bpmnExit,
247
+ targetRef: s.endEventIds.success,
248
+ conditionExpression: null
249
+ });
250
+ } else
251
+ x.push({
252
+ id: `${s.startEventId}-to-${s.endEventIds.success}`,
253
+ sourceRef: s.startEventId,
254
+ targetRef: s.endEventIds.success,
255
+ conditionExpression: null
256
+ });
257
+ const _ = [
258
+ {
259
+ id: s.endEventIds.success,
260
+ name: s.endEventNames.success,
261
+ executionListener: null
262
+ },
263
+ ...T.has(s.endEventIds.failure) ? [{ id: s.endEventIds.failure, name: s.endEventNames.failure }] : [],
264
+ ...T.has(s.endEventIds.rejected) ? [{ id: s.endEventIds.rejected, name: s.endEventNames.rejected }] : []
265
+ ], O = {
266
+ id: s.startEventId,
267
+ name: "Start",
268
+ ...m === "event" ? {
269
+ messageEventDefinition: {
270
+ messageRef: `msg_${(u || "EVENT").toLowerCase()}_${n.length > 0 ? n.join("_").toLowerCase() : "default"}_${r.customerKey}`
271
+ }
272
+ } : {}
273
+ };
274
+ return {
275
+ canvasState: {
276
+ slots: E,
277
+ branches: (t == null ? void 0 : t.branches) ?? {}
278
+ },
279
+ bpmn: {
280
+ customerId: `${r.customerKey}`,
281
+ workflowCategory: $,
282
+ sources: n,
283
+ process: {
284
+ name: r.workflowName,
285
+ isExecutable: "true"
286
+ },
287
+ startEvent: O,
288
+ endEvent: _,
289
+ sequenceFlows: [...x, ...l],
290
+ exclusiveGateways: y,
291
+ serviceTasks: f,
292
+ callActivities: g
293
+ },
294
+ ...m === "event" ? {
295
+ message: {
296
+ id: `msg_${(u || "event").toLowerCase()}_${n.length > 0 ? n.join("_").toLowerCase() : "default"}_${r.customerKey}`,
297
+ name: `msg_${(u || "event").toLowerCase()}_${n.length > 0 ? n.join("_").toLowerCase() : "default"}_${r.customerKey}`
298
+ },
299
+ dmns: w
300
+ } : {
301
+ eventConfig: [
302
+ {
303
+ eventType: u,
304
+ config: {
305
+ type: u,
306
+ ...((S = a == null ? void 0 : a.nodeData) == null ? void 0 : S.scheduler) ?? {}
307
+ }
308
+ }
309
+ ]
310
+ }
311
+ };
312
+ }
313
+ export {
314
+ U as b
315
+ };
316
+ //# sourceMappingURL=buildBackendPayload-4SwOp7St.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildBackendPayload-4SwOp7St.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}\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\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 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\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};\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 if (!exclude.has(k)) out[k] = fd[k];\n });\n return JSON.stringify(out);\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 if (condCfg && typeof condCfg === 'object') {\n Object.keys(condCfg).forEach((fieldKey) => {\n const conditions = condCfg[fieldKey];\n const expression = entriesToExpression(conditions);\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 // Conditions present but no output value — still emit the rule with\n // an empty output so the table doesn't silently drop it. Backend\n // can treat an empty output as a no-op or surface it as a config gap.\n pushRule(expression, '');\n }\n });\n }\n return rules;\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 input: 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 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 };\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 eventConfig: [\n {\n eventType,\n config: {\n type: eventType,\n ...((triggerSlot?.nodeData as { scheduler?: Record<string, unknown> })?.scheduler ?? {}),\n },\n },\n ],\n }),\n };\n\n return json;\n}\n"],"names":["DEFAULTS","NON_TASK_KINDS","isTaskSlot","slot","interpolate","tpl","ctx","m","k","resolveFieldRef","ref","_a","_b","_c","_d","_e","from","key","value","buildExtensionStringValue","field","source","shape","out","exclude","fd","getValueByPath","obj","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","fieldKey","conditions","fieldValue","buildDmn","o","emitTask","task","saveCtx","cfg","spec","interpCtx","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","e","outerFlows","i","cur","next","condition","last","endEvent","startEvent"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";const N={triggerToCategory:{},schedulerEventTypes:[],conditionPathPrefix:"",defaultWorkflowCategory:"",endEventIds:{success:"endEventSuccess",failure:"endEventFailure",rejected:"endEventRejected"},endEventNames:{success:"Success",failure:"Failure",rejected:"Rejected"},startEventId:"startEvent"},L=new Set(["start","end","triggerFixed","addTrigger","addStep"]),B=e=>!!e&&!L.has(String(e.kind??""));function b(e,t){return e==null?"":String(e).replace(/\$\{(\w+)\}/g,(o,r)=>Object.prototype.hasOwnProperty.call(t,r)?String(t[r]):o)}function V(e,t){var s,E,a,u,m;if(!e||typeof e!="object")return"";const{from:o,key:r,value:i}=e;return o==="literal"?i===void 0?"":String(i):o==="task"?String(((s=t.task)==null?void 0:s[r??""])??""):o==="ctx"?String(((E=t.ctx)==null?void 0:E[r??""])??""):o==="slot"?String(((a=t.slot)==null?void 0:a[r??""])??""):o==="formData"?String(((m=(u=t.slot)==null?void 0:u.formData)==null?void 0:m[r??""])??""):""}function k(e,t){var r,i,s;const o=e==null?void 0:e.source;if(!o)return"";if(o.type==="literal")return typeof o.value=="string"?o.value:JSON.stringify(o.value??"");if(o.type==="json"||o.type==="taskConfig"){const E=o.shape||{},a={};return Object.keys(E).forEach(u=>{a[u]=V(E[u],t)}),JSON.stringify(a)}if(o.type==="formData"){if(o.passthrough){const E=new Set(o.exclude||[]),a={},u=((r=t.slot)==null?void 0:r.formData)??{};return Object.keys(u).forEach(m=>{E.has(m)||(a[m]=u[m])}),JSON.stringify(a)}return String(((s=(i=t.slot)==null?void 0:i.formData)==null?void 0:s[o.key??""])??"")}return""}function J(e,t){if(!(!e||typeof e!="object"||!t))return t.split(".").reduce((o,r)=>{if(!(o==null||typeof o!="object"))return o[r]},e)}function K(e,t,o){var I;const r=e.operatorMap||{},i=e.valuesField||"groups",s=n=>{const p=r[String((n==null?void 0:n.operator)??"")]??"==",d=`${o}.${(n==null?void 0:n.key)??(n==null?void 0:n.field)??""}`,f=`'${String((n==null?void 0:n.value)??"")}'`;return p.startsWith(".")?`${d}${p}(${f})`:p.startsWith("!.")?`!${d}${p.slice(1)}(${f})`:`${d} ${p} ${f}`},E=n=>{var g,l;const p=Array.isArray(n)?n:[];if(p.length===0)return null;const d=p.map(s),y=((g=p[0])==null?void 0:g.connector)==="or"||((l=p[0])==null?void 0:l.logicalOperator)==="OR"?"||":"&&";return d.join(` ${y} `)},a=[];let u=1;const m=(n,p)=>{a.push({id:`rule${u}`,inputEntries:[{id:`rule${u}InputEntry1`,text:n?`\${(${n})}`:""}],outputEntries:[{id:`rule${u}OutputEntry1`,text:`"${p}"`}]}),u+=1},v=Array.isArray((I=t==null?void 0:t.formData)==null?void 0:I.groupBlocks)?t.formData.groupBlocks:[];if(v.length>0)return v.forEach(n=>{const p=Array.isArray(n==null?void 0:n[i])?n[i]:[],d=E(n==null?void 0:n.conditions);p.forEach(f=>m(d,f))}),a;const h=(t==null?void 0:t.formData)??{},$=h._conditionConfig??h.conditionConfig;return $&&typeof $=="object"&&Object.keys($).forEach(n=>{const p=$[n],d=E(p),f=Object.prototype.hasOwnProperty.call(h,n)?h[n]:J(h,n);Array.isArray(f)?f.forEach(y=>{const g=typeof y=="object"&&y!==null?y.value??y.label??y:y;m(d,g)}):f!=null&&f!==""?m(d,f):d&&m(d,"")}),a}function W(e,t,o){return{mappings:[],name:e.tableName,decision:{id:e.tableName,name:e.tableName,decisionTable:{id:`decisionTable_${e.tableName}`,hitPolicy:e.hitPolicy||"FIRST",inputs:[{id:`input_${e.tableName}`,inputExpression:{id:`inputExpr_${e.tableName}`,typeRef:"string",text:e.inputExpr}}],outputs:(e.outputs||[]).map(r=>({id:r.id,label:r.label,typeRef:r.typeRef||"string",name:r.name})),rules:K(e,t,o)}}}}function G(e,t,o,r){var f,y,g;const i=(f=t==null?void 0:t.ui)==null?void 0:f.bpmnEmit;if(!i)return{serviceTasks:[{id:e.id,name:(t==null?void 0:t.name)||e.descriptorType,configuration:Array.isArray(t==null?void 0:t.configuration)?t.configuration:[],input:e.formData||{}}],gateways:[],callActivities:[],templateFlows:[],dmn:null,bpmnEntry:e.id,bpmnExit:e.id,outgoingConditions:{},endsNeeded:new Set};const s={id:e.id,endFailure:r.endEventIds.failure,endRejected:r.endEventIds.rejected,endSuccess:r.endEventIds.success},E={task:t,slot:e,ctx:o},a=(i.serviceTasks||[]).map(l=>({id:b(l.idTemplate,s),name:l.name,flowableClass:l.flowableClass,extensionElements:{fields:(l.extensionFields||[]).map(w=>({name:w.name,stringValue:k(w,E)}))}}));let u=null;const m=[];i.gateway&&(u=b(i.gateway.idTemplate,s),s.gateway=u,m.push({id:u,name:i.gateway.name}));const v=new Set,h=(i.templateFlows||[]).map(l=>{const w=b(l.from,s),T=b(l.to,s);return T===r.endEventIds.failure&&v.add(r.endEventIds.failure),T===r.endEventIds.rejected&&v.add(r.endEventIds.rejected),{id:l.idTemplate?b(l.idTemplate,s):`${w}-to-${T}`,sourceRef:w,targetRef:T,conditionExpression:l.condition?b(l.condition,s):null}}),$=[],I=i.dmnEmit?W(i.dmnEmit,e,r.conditionPathPrefix):null,n=((y=a[0])==null?void 0:y.id)??e.id,p=u??((g=a[a.length-1])==null?void 0:g.id)??e.id,d={};return Object.keys(i.outgoingConditions||{}).forEach(l=>{d[l]=b(i.outgoingConditions[l],s)}),{serviceTasks:a,gateways:m,callActivities:$,templateFlows:h,dmn:I,bpmnEntry:n,bpmnExit:p,outgoingConditions:d,endsNeeded:v}}function M(e){var R,A,D,S;const{state:t,tasksByKey:o,context:r,config:i}=e,s={...N,...i??{},triggerToCategory:{...N.triggerToCategory,...(i==null?void 0:i.triggerToCategory)??{}},schedulerEventTypes:(i==null?void 0:i.schedulerEventTypes)??N.schedulerEventTypes,endEventIds:{...N.endEventIds,...(i==null?void 0:i.endEventIds)??{}},endEventNames:{...N.endEventNames,...(i==null?void 0:i.endEventNames)??{}}},E=Array.isArray(t==null?void 0:t.slots)?t.slots:[],a=E.find(c=>c.kind==="triggerFixed"),u=(R=a==null?void 0:a.nodeData)==null?void 0:R.eventType,m=((A=a==null?void 0:a.nodeData)==null?void 0:A.type)||"event",v=(D=a==null?void 0:a.nodeData)==null?void 0:D.sources,h=Array.isArray(v)?v.map(c=>typeof c=="string"?c:(c==null?void 0:c.value)??(c==null?void 0:c.key)??"").filter(Boolean):[],$=s.triggerToCategory[u??""]??s.defaultWorkflowCategory,n=!!u&&s.schedulerEventTypes.includes(u)?["SCHEDULER"]:h,d=E.filter(B).map(c=>({slot:c,emit:G(c,o[c.descriptorType??""]??{},r,s)})),f=[],y=[],g=[],l=[],w=[],T=new Set;d.forEach(({emit:c})=>{f.push(...c.serviceTasks),y.push(...c.gateways),g.push(...c.callActivities),l.push(...c.templateFlows),c.dmn&&w.push(c.dmn),c.endsNeeded.forEach(C=>T.add(C))});const x=[];if(d.length>0){x.push({id:`${s.startEventId}-to-${d[0].emit.bpmnEntry}`,sourceRef:s.startEventId,targetRef:d[0].emit.bpmnEntry,conditionExpression:null});for(let C=0;C<d.length-1;C+=1){const j=d[C].emit,F=d[C+1].emit,P=j.outgoingConditions.success??j.outgoingConditions.pass??j.outgoingConditions.approved??null;x.push({id:`${j.bpmnExit}-to-${F.bpmnEntry}`,sourceRef:j.bpmnExit,targetRef:F.bpmnEntry,conditionExpression:P})}const c=d[d.length-1].emit;x.push({id:`${c.bpmnExit}-to-${s.endEventIds.success}`,sourceRef:c.bpmnExit,targetRef:s.endEventIds.success,conditionExpression:null})}else x.push({id:`${s.startEventId}-to-${s.endEventIds.success}`,sourceRef:s.startEventId,targetRef:s.endEventIds.success,conditionExpression:null});const _=[{id:s.endEventIds.success,name:s.endEventNames.success,executionListener:null},...T.has(s.endEventIds.failure)?[{id:s.endEventIds.failure,name:s.endEventNames.failure}]:[],...T.has(s.endEventIds.rejected)?[{id:s.endEventIds.rejected,name:s.endEventNames.rejected}]:[]],O={id:s.startEventId,name:"Start",...m==="event"?{messageEventDefinition:{messageRef:`msg_${(u||"EVENT").toLowerCase()}_${n.length>0?n.join("_").toLowerCase():"default"}_${r.customerKey}`}}:{}};return{canvasState:{slots:E,branches:(t==null?void 0:t.branches)??{}},bpmn:{customerId:`${r.customerKey}`,workflowCategory:$,sources:n,process:{name:r.workflowName,isExecutable:"true"},startEvent:O,endEvent:_,sequenceFlows:[...x,...l],exclusiveGateways:y,serviceTasks:f,callActivities:g},...m==="event"?{message:{id:`msg_${(u||"event").toLowerCase()}_${n.length>0?n.join("_").toLowerCase():"default"}_${r.customerKey}`,name:`msg_${(u||"event").toLowerCase()}_${n.length>0?n.join("_").toLowerCase():"default"}_${r.customerKey}`},dmns:w}:{eventConfig:[{eventType:u,config:{type:u,...((S=a==null?void 0:a.nodeData)==null?void 0:S.scheduler)??{}}}]}}}exports.buildBackendPayload=M;
2
+ //# sourceMappingURL=buildBackendPayload-BvrjW1uM.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buildBackendPayload-BvrjW1uM.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}\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\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 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\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};\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 if (!exclude.has(k)) out[k] = fd[k];\n });\n return JSON.stringify(out);\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 if (condCfg && typeof condCfg === 'object') {\n Object.keys(condCfg).forEach((fieldKey) => {\n const conditions = condCfg[fieldKey];\n const expression = entriesToExpression(conditions);\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 // Conditions present but no output value — still emit the rule with\n // an empty output so the table doesn't silently drop it. Backend\n // can treat an empty output as a no-op or surface it as a config gap.\n pushRule(expression, '');\n }\n });\n }\n return rules;\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 input: 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 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 };\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 eventConfig: [\n {\n eventType,\n config: {\n type: eventType,\n ...((triggerSlot?.nodeData as { scheduler?: Record<string, unknown> })?.scheduler ?? {}),\n },\n },\n ],\n }),\n };\n\n return json;\n}\n"],"names":["DEFAULTS","NON_TASK_KINDS","isTaskSlot","slot","interpolate","tpl","ctx","m","k","resolveFieldRef","ref","from","key","value","_a","_b","_c","_e","_d","buildExtensionStringValue","field","source","shape","out","exclude","fd","getValueByPath","obj","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","fieldKey","conditions","fieldValue","buildDmn","o","emitTask","task","saveCtx","cfg","spec","interpCtx","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","e","outerFlows","i","cur","next","condition","last","endEvent","startEvent"],"mappings":"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"}
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-O9Tw_XXR.js"),o=require("./bpmn-CcuE2X_Q.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;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./nodeRegistry.cjs"),r=require("./templateRegistry.cjs"),t=require("./messages-O9Tw_XXR.js"),o=require("./bpmn-CcuE2X_Q.js"),i=require("./buildBackendPayload-BvrjW1uM.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
@@ -17,6 +17,18 @@ export declare interface ApiWorkflowTemplate {
17
17
  templateUI?: Partial<Omit<WorkflowTemplate, 'triggerKey' | 'label' | 'description' | 'availableTasks'>>;
18
18
  }
19
19
 
20
+ export declare interface ApplicationTaskLike {
21
+ name?: string;
22
+ taskKey?: string;
23
+ applicationUuid?: string;
24
+ configuration?: unknown[];
25
+ ui?: {
26
+ bpmnEmit?: BpmnEmitSpec;
27
+ [key: string]: unknown;
28
+ };
29
+ [key: string]: unknown;
30
+ }
31
+
20
32
  /**
21
33
  * Base defaults shared by every node descriptor. A new node only has to specify
22
34
  * what makes it different — these fill in the rest.
@@ -33,6 +45,16 @@ export declare interface BpmnElement {
33
45
  [key: string]: unknown;
34
46
  }
35
47
 
48
+ export declare interface BpmnEmitSpec {
49
+ kind: 'linear' | 'gated' | 'filter' | 'approval';
50
+ serviceTasks?: ServiceTaskSpec[];
51
+ gateway?: GatewaySpec;
52
+ templateFlows?: TemplateFlowSpec[];
53
+ outgoingConditions?: Record<string, string>;
54
+ dmnEmit?: DmnEmitSpec;
55
+ callActivity?: Record<string, unknown>;
56
+ }
57
+
36
58
  export declare interface BpmnSaveOptions {
37
59
  processId?: string;
38
60
  processName?: string;
@@ -46,6 +68,62 @@ export declare interface BranchMap {
46
68
  };
47
69
  }
48
70
 
71
+ /**
72
+ * Generate a backend-ready payload from canvas state + task definitions.
73
+ *
74
+ * @example
75
+ * const payload = buildBackendPayload({
76
+ * state: { slots, branches },
77
+ * tasksByKey: { USER_CREATION: {...}, USER_GROUP_ASSIGNMENT: {...} },
78
+ * context: { customerKey: '51995', workflowName: 'My WF' },
79
+ * config: { triggerToCategory: { CUSTOM_TRIGGER: 'CUSTOM_CATEGORY' } },
80
+ * });
81
+ * await api.post('/process', payload);
82
+ */
83
+ export declare function buildBackendPayload(opts: BuildPayloadOptions): Record<string, unknown>;
84
+
85
+ export declare interface BuildPayloadConfig {
86
+ /**
87
+ * Map of trigger eventType → workflowCategory string. Defaults to a small
88
+ * IAM-shaped fallback; consumers should pass the full map they use.
89
+ */
90
+ triggerToCategory?: Record<string, string>;
91
+ /** eventType values that should set `sources: ['SCHEDULER']` and skip the message block. */
92
+ schedulerEventTypes?: string[];
93
+ /** DMN LHS prefix for condition expressions (default IAM-style). */
94
+ conditionPathPrefix?: string;
95
+ /** Fallback workflowCategory when eventType isn't mapped. */
96
+ defaultWorkflowCategory?: string;
97
+ /** End-event ids — override per backend convention. */
98
+ endEventIds?: {
99
+ success: string;
100
+ failure: string;
101
+ rejected: string;
102
+ };
103
+ /** Names rendered on end events. */
104
+ endEventNames?: {
105
+ success: string;
106
+ failure: string;
107
+ rejected: string;
108
+ };
109
+ /** Start event id used in the outer chain. */
110
+ startEventId?: string;
111
+ }
112
+
113
+ export declare interface BuildPayloadContext {
114
+ customerKey: string;
115
+ workflowName: string;
116
+ /** Anything else the host wants exposed via `from: 'ctx', key: '...'`. */
117
+ [key: string]: unknown;
118
+ }
119
+
120
+ export declare interface BuildPayloadOptions {
121
+ state: CanvasState_2;
122
+ tasksByKey: Record<string, ApplicationTaskLike>;
123
+ context: BuildPayloadContext;
124
+ config?: BuildPayloadConfig;
125
+ }
126
+
49
127
  export declare interface CanvasSlot {
50
128
  id: string;
51
129
  kind: SlotKind;
@@ -59,6 +137,38 @@ export declare interface CanvasSlot {
59
137
  branchLabels?: Record<string, string>;
60
138
  }
61
139
 
140
+ /**
141
+ * buildBackendPayload — generic BPMN/DMN/canvasState emitter driven by each
142
+ * task's `ui.bpmnEmit` block. Consumer ships per-task bpmnEmit specs from
143
+ * the backend; the package handles the walk.
144
+ *
145
+ * Originally lived in IAM as `flowforgeStateToBackendJson`. Moved into the
146
+ * package so every consumer gets the same emitter — and so DMN/filter/
147
+ * approval fixes ship once, to everyone.
148
+ *
149
+ * Consumer injects:
150
+ * - canvasState — `{ slots, branches }` from the canvas
151
+ * - tasksByKey — `{ [descriptorType]: ApplicationTask }` lookup
152
+ * - context — host-specific scalars (customerKey, workflowName)
153
+ * - config — IAM-shaped defaults (path prefix, end-event ids,
154
+ * trigger→category map, scheduler events)
155
+ *
156
+ * Returns a JSON object ready to POST to the backend.
157
+ */
158
+ declare type CanvasSlot_2 = {
159
+ id: string;
160
+ kind?: string;
161
+ descriptorType?: string;
162
+ nodeData?: Record<string, unknown>;
163
+ formData?: Record<string, unknown>;
164
+ [key: string]: unknown;
165
+ };
166
+
167
+ declare type CanvasState_2 = {
168
+ slots?: CanvasSlot_2[];
169
+ branches?: Record<string, unknown>;
170
+ };
171
+
62
172
  export declare const conditionBranchDescriptor: NodeDescriptor;
63
173
 
64
174
  /** One column in a per-field condition row */
@@ -114,6 +224,22 @@ export declare interface DmnDefinition {
114
224
  [key: string]: unknown;
115
225
  }
116
226
 
227
+ export declare interface DmnEmitSpec {
228
+ tableName: string;
229
+ inputExpr: string;
230
+ hitPolicy?: string;
231
+ outputs?: DmnOutputSpec[];
232
+ operatorMap?: Record<string, string>;
233
+ valuesField?: string;
234
+ }
235
+
236
+ export declare interface DmnOutputSpec {
237
+ id: string;
238
+ label?: string;
239
+ name: string;
240
+ typeRef?: string;
241
+ }
242
+
117
243
  /**
118
244
  * End event — a fixed skeleton node with no user-editable form.
119
245
  * The canvas seeds the main-spine end as the literal slot id `'end'`, and one
@@ -125,6 +251,18 @@ export declare interface DmnDefinition {
125
251
  */
126
252
  export declare const endEventDescriptor: NodeDescriptor;
127
253
 
254
+ export declare interface ExtensionFieldSpec {
255
+ name: string;
256
+ source?: {
257
+ type: 'literal' | 'json' | 'taskConfig' | 'formData';
258
+ value?: unknown;
259
+ shape?: Record<string, FieldRef>;
260
+ passthrough?: boolean;
261
+ exclude?: string[];
262
+ key?: string;
263
+ };
264
+ }
265
+
128
266
  /** Condition definition attached to a FieldDescriptor */
129
267
  declare interface FieldConditionDef {
130
268
  fields: ConditionFieldDef[];
@@ -205,6 +343,12 @@ declare interface FieldDescriptor {
205
343
  [key: string]: unknown;
206
344
  }
207
345
 
346
+ export declare interface FieldRef {
347
+ from: 'literal' | 'task' | 'ctx' | 'slot' | 'formData';
348
+ key?: string;
349
+ value?: unknown;
350
+ }
351
+
208
352
  declare interface FieldTransform {
209
353
  in?: (value: unknown) => unknown;
210
354
  out?: (value: unknown) => unknown;
@@ -241,6 +385,11 @@ export declare interface FlowForgeMessages {
241
385
  cancel: string;
242
386
  }
243
387
 
388
+ export declare interface GatewaySpec {
389
+ idTemplate: string;
390
+ name?: string;
391
+ }
392
+
244
393
  /**
245
394
  * Context passed to `NodeDescriptor.canInsert(ctx)` describing where on the
246
395
  * canvas the user clicked "+ Add step". Used by position-aware insertion rules.
@@ -369,6 +518,13 @@ export declare const restApiDescriptor: NodeDescriptor;
369
518
 
370
519
  export declare function saveWorkflowToBpmn(workflow: WorkflowState, options?: BpmnSaveOptions): string;
371
520
 
521
+ export declare interface ServiceTaskSpec {
522
+ idTemplate: string;
523
+ name?: string;
524
+ flowableClass?: string;
525
+ extensionFields?: ExtensionFieldSpec[];
526
+ }
527
+
372
528
  declare type SlotKind = 'start' | 'end' | 'addTrigger' | 'triggerFixed' | 'userTask' | 'addStep' | 'filter' | 'approval';
373
529
 
374
530
  /**
@@ -403,6 +559,13 @@ export declare interface SubWorkflowDescriptorOptions {
403
559
  }>>;
404
560
  }
405
561
 
562
+ export declare interface TemplateFlowSpec {
563
+ from: string;
564
+ to: string;
565
+ idTemplate?: string;
566
+ condition?: string | null;
567
+ }
568
+
406
569
  export declare class TemplateRegistry {
407
570
  private templates;
408
571
  /**
package/dist/core.js CHANGED
@@ -1,25 +1,27 @@
1
- import { NodeTypeRegistry as r, baseNodeDefaults as t, conditionBranchDescriptor as s, defineNode as i, endEventDescriptor as p, makeSubWorkflowDescriptor as a, nodeTypeRegistry as f, notificationDescriptor as l, restApiDescriptor as n, startEventDescriptor as c, subWorkflowDescriptor as m, webhookTriggerDescriptor as d, webhookTriggerTemplate as g } from "./nodeRegistry.js";
2
- import { TemplateRegistry as k, templateRegistry as w } from "./templateRegistry.js";
1
+ import { NodeTypeRegistry as r, baseNodeDefaults as t, conditionBranchDescriptor as s, defineNode as i, endEventDescriptor as p, makeSubWorkflowDescriptor as a, nodeTypeRegistry as l, notificationDescriptor as d, restApiDescriptor as f, startEventDescriptor as n, subWorkflowDescriptor as c, webhookTriggerDescriptor as m, webhookTriggerTemplate as g } from "./nodeRegistry.js";
2
+ import { TemplateRegistry as k, templateRegistry as b } from "./templateRegistry.js";
3
3
  import { d as y } from "./messages-CO299wPN.js";
4
4
  import { l as u, s as x } from "./bpmn-CtfWDaOY.js";
5
+ import { b as R } from "./buildBackendPayload-4SwOp7St.js";
5
6
  export {
6
7
  r as NodeTypeRegistry,
7
8
  k as TemplateRegistry,
8
9
  t as baseNodeDefaults,
10
+ R as buildBackendPayload,
9
11
  s as conditionBranchDescriptor,
10
12
  y as defaultFlowForgeMessages,
11
13
  i as defineNode,
12
14
  p as endEventDescriptor,
13
15
  u as loadWorkflowFromBpmn,
14
16
  a as makeSubWorkflowDescriptor,
15
- f as nodeTypeRegistry,
16
- l as notificationDescriptor,
17
- n as restApiDescriptor,
17
+ l as nodeTypeRegistry,
18
+ d as notificationDescriptor,
19
+ f as restApiDescriptor,
18
20
  x as saveWorkflowToBpmn,
19
- c as startEventDescriptor,
20
- m as subWorkflowDescriptor,
21
- w as templateRegistry,
22
- d as webhookTriggerDescriptor,
21
+ n as startEventDescriptor,
22
+ c as subWorkflowDescriptor,
23
+ b as templateRegistry,
24
+ m as webhookTriggerDescriptor,
23
25
  g as webhookTriggerTemplate
24
26
  };
25
27
  //# sourceMappingURL=core.js.map
package/dist/core.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"core.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
1
+ {"version":3,"file":"core.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;"}
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-DUbQPmIx.js"),b=require("./SchemaBuilderDrawer-CIxQGffa.js");require("react/jsx-runtime");require("react");require("@mui/material");require("react-icons/md");const i=require("./nodeRegistry.cjs"),f=require("./templateRegistry.cjs"),s=require("./templateSkeletons-gOva2Xus.js"),y=require("./messages-O9Tw_XXR.js"),k=require("./bpmn-CcuE2X_Q.js"),n=require("./GatewayBranchEdge-CMY30xhz.js");class R{constructor(){this.channels=new Map}register(o,t){this.channels.set(o,t)}get(o){return this.channels.get(o)}list(){return Array.from(this.channels.entries()).map(([o,t])=>({key:o,...t}))}has(o){return this.channels.has(o)}}const D=new R;function N(r){const{currentNodeId:o,nodes:t,getParents:d,getOutputSchema:a,nodePath:c,nodeLabel:u,getNodeId:p=l=>l.id}=r,g=t.find(l=>p(l)===o);if(!g)return[];const T=v(g,t,d,p),m=[];for(const l of T){const h=a(l);if(!h||h.length===0)continue;const F=c(l);m.push({label:u?u(l):F,items:h.map(S=>w(S,F))})}return m}function v(r,o,t,d){const a=new Set,c=[],u=[...t(r,o)];for(;u.length>0;){const p=u.shift(),g=d(p);a.has(g)||(a.add(g),c.push(p),u.push(...t(p,o)))}return c}function w(r,o){const t=`${o}.${r.key}`,d=r.description??(r.sample!==void 0&&r.sample!==null?String(r.sample):void 0),a={label:r.label,path:t};return d!==void 0&&(a.description=d),r.children&&r.children.length>0&&(a.children=r.children.map(c=>w(c,t))),a}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.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.parseToAST=e.parseToAST;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.wrapFormula=e.wrapFormula;exports.FIELD_TYPE_OPTIONS=b.FIELD_TYPE_OPTIONS;exports.SchemaBuilder=b.SchemaBuilder;exports.SchemaBuilderDrawer=b.SchemaBuilderDrawer;exports.useFlowForm=b.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=s.FlowForgeCanvas;exports.FlowForgeHeader=s.FlowForgeHeader;exports.SubWorkflowPreviewDrawer=s.SubWorkflowPreviewDrawer;exports.WorkflowCanvas=s.FlowForgeCanvas;exports.WorkflowExecutionHistory=s.WorkflowExecutionHistory;exports.WorkflowTemplateLibrary=s.WorkflowTemplateLibrary;exports.accessRequestSkeleton=s.accessRequestSkeleton;exports.offboardingSkeleton=s.offboardingSkeleton;exports.userOnboardingSkeleton=s.userOnboardingSkeleton;exports.webhookIntegrationSkeleton=s.webhookIntegrationSkeleton;exports.defaultFlowForgeMessages=y.defaultFlowForgeMessages;exports.loadWorkflowFromBpmn=k.loadWorkflowFromBpmn;exports.saveWorkflowToBpmn=k.saveWorkflowToBpmn;exports.ActionNode=n.ActionNode;exports.ApprovalNode=n.ApprovalNode;exports.EdgeWithPlusLabel=n.EdgeWithPlusLabel;exports.EndNode=n.EndNode;exports.FilterNode=n.FilterNode;exports.RestApiNode=n.RestApiNode;exports.StartNode=n.StartNode;exports.TriggerNode=n.TriggerNode;exports.WebhookTriggerNode=n.WebhookTriggerNode;exports.builtInNodeTypes=n.builtInNodeTypes;exports.buildVariableGroups=N;exports.notificationChannelRegistry=D;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./index-DUbQPmIx.js"),b=require("./SchemaBuilderDrawer-CIxQGffa.js");require("react/jsx-runtime");require("react");require("@mui/material");require("react-icons/md");const i=require("./nodeRegistry.cjs"),f=require("./templateRegistry.cjs"),s=require("./templateSkeletons-gOva2Xus.js"),S=require("./messages-O9Tw_XXR.js"),k=require("./bpmn-CcuE2X_Q.js"),a=require("./GatewayBranchEdge-CMY30xhz.js"),R=require("./buildBackendPayload-BvrjW1uM.js");class D{constructor(){this.channels=new Map}register(o,t){this.channels.set(o,t)}get(o){return this.channels.get(o)}list(){return Array.from(this.channels.entries()).map(([o,t])=>({key:o,...t}))}has(o){return this.channels.has(o)}}const N=new D;function P(r){const{currentNodeId:o,nodes:t,getParents:d,getOutputSchema:n,nodePath:c,nodeLabel:u,getNodeId:p=l=>l.id}=r,g=t.find(l=>p(l)===o);if(!g)return[];const w=v(g,t,d,p),m=[];for(const l of w){const h=n(l);if(!h||h.length===0)continue;const F=c(l);m.push({label:u?u(l):F,items:h.map(T=>y(T,F))})}return m}function v(r,o,t,d){const n=new Set,c=[],u=[...t(r,o)];for(;u.length>0;){const p=u.shift(),g=d(p);n.has(g)||(n.add(g),c.push(p),u.push(...t(p,o)))}return c}function y(r,o){const t=`${o}.${r.key}`,d=r.description??(r.sample!==void 0&&r.sample!==null?String(r.sample):void 0),n={label:r.label,path:t};return d!==void 0&&(n.description=d),r.children&&r.children.length>0&&(n.children=r.children.map(c=>y(c,t))),n}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.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.parseToAST=e.parseToAST;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.wrapFormula=e.wrapFormula;exports.FIELD_TYPE_OPTIONS=b.FIELD_TYPE_OPTIONS;exports.SchemaBuilder=b.SchemaBuilder;exports.SchemaBuilderDrawer=b.SchemaBuilderDrawer;exports.useFlowForm=b.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=s.FlowForgeCanvas;exports.FlowForgeHeader=s.FlowForgeHeader;exports.SubWorkflowPreviewDrawer=s.SubWorkflowPreviewDrawer;exports.WorkflowCanvas=s.FlowForgeCanvas;exports.WorkflowExecutionHistory=s.WorkflowExecutionHistory;exports.WorkflowTemplateLibrary=s.WorkflowTemplateLibrary;exports.accessRequestSkeleton=s.accessRequestSkeleton;exports.offboardingSkeleton=s.offboardingSkeleton;exports.userOnboardingSkeleton=s.userOnboardingSkeleton;exports.webhookIntegrationSkeleton=s.webhookIntegrationSkeleton;exports.defaultFlowForgeMessages=S.defaultFlowForgeMessages;exports.loadWorkflowFromBpmn=k.loadWorkflowFromBpmn;exports.saveWorkflowToBpmn=k.saveWorkflowToBpmn;exports.ActionNode=a.ActionNode;exports.ApprovalNode=a.ApprovalNode;exports.EdgeWithPlusLabel=a.EdgeWithPlusLabel;exports.EndNode=a.EndNode;exports.FilterNode=a.FilterNode;exports.RestApiNode=a.RestApiNode;exports.StartNode=a.StartNode;exports.TriggerNode=a.TriggerNode;exports.WebhookTriggerNode=a.WebhookTriggerNode;exports.builtInNodeTypes=a.builtInNodeTypes;exports.buildBackendPayload=R.buildBackendPayload;exports.buildVariableGroups=P;exports.notificationChannelRegistry=N;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/notificationChannelRegistry/index.ts","../src/datapills/buildVariableGroups.ts"],"sourcesContent":["export interface NotificationChannelOption {\n value: string;\n label: string;\n}\n\nexport interface NotificationChannelConfig {\n label: string;\n /** Fetch recipients/channels for this notification channel at runtime */\n fetchRecipients?: () => Promise<NotificationChannelOption[]>;\n}\n\nclass NotificationChannelRegistry {\n private channels = new Map<string, NotificationChannelConfig>();\n\n register(key: string, config: NotificationChannelConfig): void {\n this.channels.set(key, config);\n }\n\n get(key: string): NotificationChannelConfig | undefined {\n return this.channels.get(key);\n }\n\n list(): Array<{ key: string } & NotificationChannelConfig> {\n return Array.from(this.channels.entries()).map(([key, cfg]) => ({ key, ...cfg }));\n }\n\n has(key: string): boolean {\n return this.channels.has(key);\n }\n}\n\nexport const notificationChannelRegistry = new NotificationChannelRegistry();\nexport default NotificationChannelRegistry;\n","/**\n * buildVariableGroups — graph walker that turns upstream nodes' outputSchemas\n * into Smart Values picker groups.\n *\n * Pattern matches Workato's datapill model: every node declares what it\n * outputs; downstream nodes see the union of upstream outputs. The package\n * doesn't know your node-id scheme, your API, or your edge model — pass\n * those in via the four predicates and we do the rest.\n *\n * Usage (IAM-side):\n *\n * const variableGroups = buildVariableGroups({\n * currentNodeId,\n * nodes, // canvas state slots\n * getParents: (node) => upstreamSlotsOf(node, edges),\n * getOutputSchema: (node) => tasksByKey[node.descriptorType]?.outputSchema ?? [],\n * nodePath: (node) => node.id === 'trigger' ? 'endUser' : `data.${index(node)}`,\n * nodeLabel: (node) => node.label,\n * });\n *\n * <FlowForm variableGroups={variableGroups} ... />\n */\n\nimport type { VariableGroup, VariableItem } from '../FlowForm/VariablePicker/VariablePickerContext';\n\nexport interface OutputSchemaItem {\n key: string;\n label: string;\n /** Optional — display only. Lets the picker show a type chip (\"ABC\" / 123). */\n type?: string;\n /** Optional — shown under/beside the label in the picker (Workato-style). */\n sample?: string | number | boolean;\n /** Optional tooltip text (independent of `sample`). */\n description?: string;\n /** Nested fields — renders as an expandable subgroup. */\n children?: OutputSchemaItem[];\n}\n\nexport interface BuildVariableGroupsOptions<TNode> {\n /** Id of the node currently being configured (its outputs are NOT included). */\n currentNodeId: string;\n /** All nodes in the canvas / workflow. */\n nodes: TNode[];\n /** Return the immediate parent node(s) — consumer walks its own edge model. */\n getParents: (node: TNode, nodes: TNode[]) => TNode[];\n /** Return the node's output schema array (empty array if none). */\n getOutputSchema: (node: TNode) => OutputSchemaItem[];\n /** Return the runtime path prefix for this node (e.g. 'endUser', 'data.1'). */\n nodePath: (node: TNode) => string;\n /** Optional — group label shown in the picker. Defaults to `nodePath(node)`. */\n nodeLabel?: (node: TNode) => string;\n /**\n * Optional — function reading a node's id. Defaults to `(n) => (n as any).id`.\n * Override if your node model nests the id (e.g. `n.data.id`).\n */\n getNodeId?: (node: TNode) => string;\n}\n\n/**\n * Walks upstream from `currentNodeId` (excluding it), collects each ancestor's\n * outputSchema, and returns a `VariableGroup[]` ready for `<FlowForm variableGroups>`.\n *\n * - Excludes the current node (a node never references its own outputs).\n * - Deduplicates ancestors via id — diamond graphs don't produce duplicate groups.\n * - Skips ancestors with empty outputSchema (no group rendered for nodes that emit nothing).\n * - Preserves traversal order — the closest parent appears first in the picker.\n */\nexport function buildVariableGroups<TNode>(\n opts: BuildVariableGroupsOptions<TNode>\n): VariableGroup[] {\n const {\n currentNodeId,\n nodes,\n getParents,\n getOutputSchema,\n nodePath,\n nodeLabel,\n getNodeId = (n: TNode) => (n as unknown as { id: string }).id,\n } = opts;\n\n const current = nodes.find((n) => getNodeId(n) === currentNodeId);\n if (!current) return [];\n\n const upstream = collectUpstream(current, nodes, getParents, getNodeId);\n\n const groups: VariableGroup[] = [];\n for (const node of upstream) {\n const schema = getOutputSchema(node);\n if (!schema || schema.length === 0) continue;\n const prefix = nodePath(node);\n groups.push({\n label: nodeLabel ? nodeLabel(node) : prefix,\n items: schema.map((item) => mapToVariableItem(item, prefix)),\n });\n }\n return groups;\n}\n\n// ─── Internals ──────────────────────────────────────────────────────────────\n\nfunction collectUpstream<TNode>(\n start: TNode,\n nodes: TNode[],\n getParents: (node: TNode, nodes: TNode[]) => TNode[],\n getNodeId: (node: TNode) => string\n): TNode[] {\n const seen = new Set<string>();\n const ordered: TNode[] = [];\n // BFS upstream — the closest parent ends up first, mirroring how Workato\n // groups the most recent step at the top of the datapill panel.\n const queue: TNode[] = [...getParents(start, nodes)];\n while (queue.length > 0) {\n const node = queue.shift() as TNode;\n const id = getNodeId(node);\n if (seen.has(id)) continue;\n seen.add(id);\n ordered.push(node);\n queue.push(...getParents(node, nodes));\n }\n return ordered;\n}\n\nfunction mapToVariableItem(\n item: OutputSchemaItem,\n prefix: string\n): VariableItem {\n const path = `${prefix}.${item.key}`;\n // Workato-style: show the sample value under the label when present.\n const description =\n item.description ??\n (item.sample !== undefined && item.sample !== null\n ? String(item.sample)\n : undefined);\n const result: VariableItem = { label: item.label, path };\n if (description !== undefined) result.description = description;\n if (item.children && item.children.length > 0) {\n result.children = item.children.map((c) => mapToVariableItem(c, path));\n }\n return result;\n}\n"],"names":["NotificationChannelRegistry","key","config","cfg","notificationChannelRegistry","buildVariableGroups","opts","currentNodeId","nodes","getParents","getOutputSchema","nodePath","nodeLabel","getNodeId","n","current","upstream","collectUpstream","groups","node","schema","prefix","item","mapToVariableItem","start","seen","ordered","queue","id","path","description","result"],"mappings":"+eAWA,MAAMA,CAA4B,CAAlC,aAAA,CACE,KAAQ,aAAe,GAAuC,CAE9D,SAASC,EAAaC,EAAyC,CAC7D,KAAK,SAAS,IAAID,EAAKC,CAAM,CAC/B,CAEA,IAAID,EAAoD,CACtD,OAAO,KAAK,SAAS,IAAIA,CAAG,CAC9B,CAEA,MAA2D,CACzD,OAAO,MAAM,KAAK,KAAK,SAAS,QAAA,CAAS,EAAE,IAAI,CAAC,CAACA,EAAKE,CAAG,KAAO,CAAE,IAAAF,EAAK,GAAGE,GAAM,CAClF,CAEA,IAAIF,EAAsB,CACxB,OAAO,KAAK,SAAS,IAAIA,CAAG,CAC9B,CACF,CAEO,MAAMG,EAA8B,IAAIJ,ECoCxC,SAASK,EACdC,EACiB,CACjB,KAAM,CACJ,cAAAC,EACA,MAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,SAAAC,EACA,UAAAC,EACA,UAAAC,EAAaC,GAAcA,EAAgC,EAAA,EACzDR,EAEES,EAAUP,EAAM,KAAMM,GAAMD,EAAUC,CAAC,IAAMP,CAAa,EAChE,GAAI,CAACQ,EAAS,MAAO,CAAA,EAErB,MAAMC,EAAWC,EAAgBF,EAASP,EAAOC,EAAYI,CAAS,EAEhEK,EAA0B,CAAA,EAChC,UAAWC,KAAQH,EAAU,CAC3B,MAAMI,EAASV,EAAgBS,CAAI,EACnC,GAAI,CAACC,GAAUA,EAAO,SAAW,EAAG,SACpC,MAAMC,EAASV,EAASQ,CAAI,EAC5BD,EAAO,KAAK,CACV,MAAON,EAAYA,EAAUO,CAAI,EAAIE,EACrC,MAAOD,EAAO,IAAKE,GAASC,EAAkBD,EAAMD,CAAM,CAAC,CAAA,CAC5D,CACH,CACA,OAAOH,CACT,CAIA,SAASD,EACPO,EACAhB,EACAC,EACAI,EACS,CACT,MAAMY,MAAW,IACXC,EAAmB,CAAA,EAGnBC,EAAiB,CAAC,GAAGlB,EAAWe,EAAOhB,CAAK,CAAC,EACnD,KAAOmB,EAAM,OAAS,GAAG,CACvB,MAAMR,EAAOQ,EAAM,MAAA,EACbC,EAAKf,EAAUM,CAAI,EACrBM,EAAK,IAAIG,CAAE,IACfH,EAAK,IAAIG,CAAE,EACXF,EAAQ,KAAKP,CAAI,EACjBQ,EAAM,KAAK,GAAGlB,EAAWU,EAAMX,CAAK,CAAC,EACvC,CACA,OAAOkB,CACT,CAEA,SAASH,EACPD,EACAD,EACc,CACd,MAAMQ,EAAO,GAAGR,CAAM,IAAIC,EAAK,GAAG,GAE5BQ,EACJR,EAAK,cACJA,EAAK,SAAW,QAAaA,EAAK,SAAW,KAC1C,OAAOA,EAAK,MAAM,EAClB,QACAS,EAAuB,CAAE,MAAOT,EAAK,MAAO,KAAAO,CAAA,EAClD,OAAIC,IAAgB,SAAWC,EAAO,YAAcD,GAChDR,EAAK,UAAYA,EAAK,SAAS,OAAS,IAC1CS,EAAO,SAAWT,EAAK,SAAS,IAAK,GAAMC,EAAkB,EAAGM,CAAI,CAAC,GAEhEE,CACT"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/notificationChannelRegistry/index.ts","../src/datapills/buildVariableGroups.ts"],"sourcesContent":["export interface NotificationChannelOption {\n value: string;\n label: string;\n}\n\nexport interface NotificationChannelConfig {\n label: string;\n /** Fetch recipients/channels for this notification channel at runtime */\n fetchRecipients?: () => Promise<NotificationChannelOption[]>;\n}\n\nclass NotificationChannelRegistry {\n private channels = new Map<string, NotificationChannelConfig>();\n\n register(key: string, config: NotificationChannelConfig): void {\n this.channels.set(key, config);\n }\n\n get(key: string): NotificationChannelConfig | undefined {\n return this.channels.get(key);\n }\n\n list(): Array<{ key: string } & NotificationChannelConfig> {\n return Array.from(this.channels.entries()).map(([key, cfg]) => ({ key, ...cfg }));\n }\n\n has(key: string): boolean {\n return this.channels.has(key);\n }\n}\n\nexport const notificationChannelRegistry = new NotificationChannelRegistry();\nexport default NotificationChannelRegistry;\n","/**\n * buildVariableGroups — graph walker that turns upstream nodes' outputSchemas\n * into Smart Values picker groups.\n *\n * Pattern matches Workato's datapill model: every node declares what it\n * outputs; downstream nodes see the union of upstream outputs. The package\n * doesn't know your node-id scheme, your API, or your edge model — pass\n * those in via the four predicates and we do the rest.\n *\n * Usage (IAM-side):\n *\n * const variableGroups = buildVariableGroups({\n * currentNodeId,\n * nodes, // canvas state slots\n * getParents: (node) => upstreamSlotsOf(node, edges),\n * getOutputSchema: (node) => tasksByKey[node.descriptorType]?.outputSchema ?? [],\n * nodePath: (node) => node.id === 'trigger' ? 'endUser' : `data.${index(node)}`,\n * nodeLabel: (node) => node.label,\n * });\n *\n * <FlowForm variableGroups={variableGroups} ... />\n */\n\nimport type { VariableGroup, VariableItem } from '../FlowForm/VariablePicker/VariablePickerContext';\n\nexport interface OutputSchemaItem {\n key: string;\n label: string;\n /** Optional — display only. Lets the picker show a type chip (\"ABC\" / 123). */\n type?: string;\n /** Optional — shown under/beside the label in the picker (Workato-style). */\n sample?: string | number | boolean;\n /** Optional tooltip text (independent of `sample`). */\n description?: string;\n /** Nested fields — renders as an expandable subgroup. */\n children?: OutputSchemaItem[];\n}\n\nexport interface BuildVariableGroupsOptions<TNode> {\n /** Id of the node currently being configured (its outputs are NOT included). */\n currentNodeId: string;\n /** All nodes in the canvas / workflow. */\n nodes: TNode[];\n /** Return the immediate parent node(s) — consumer walks its own edge model. */\n getParents: (node: TNode, nodes: TNode[]) => TNode[];\n /** Return the node's output schema array (empty array if none). */\n getOutputSchema: (node: TNode) => OutputSchemaItem[];\n /** Return the runtime path prefix for this node (e.g. 'endUser', 'data.1'). */\n nodePath: (node: TNode) => string;\n /** Optional — group label shown in the picker. Defaults to `nodePath(node)`. */\n nodeLabel?: (node: TNode) => string;\n /**\n * Optional — function reading a node's id. Defaults to `(n) => (n as any).id`.\n * Override if your node model nests the id (e.g. `n.data.id`).\n */\n getNodeId?: (node: TNode) => string;\n}\n\n/**\n * Walks upstream from `currentNodeId` (excluding it), collects each ancestor's\n * outputSchema, and returns a `VariableGroup[]` ready for `<FlowForm variableGroups>`.\n *\n * - Excludes the current node (a node never references its own outputs).\n * - Deduplicates ancestors via id — diamond graphs don't produce duplicate groups.\n * - Skips ancestors with empty outputSchema (no group rendered for nodes that emit nothing).\n * - Preserves traversal order — the closest parent appears first in the picker.\n */\nexport function buildVariableGroups<TNode>(\n opts: BuildVariableGroupsOptions<TNode>\n): VariableGroup[] {\n const {\n currentNodeId,\n nodes,\n getParents,\n getOutputSchema,\n nodePath,\n nodeLabel,\n getNodeId = (n: TNode) => (n as unknown as { id: string }).id,\n } = opts;\n\n const current = nodes.find((n) => getNodeId(n) === currentNodeId);\n if (!current) return [];\n\n const upstream = collectUpstream(current, nodes, getParents, getNodeId);\n\n const groups: VariableGroup[] = [];\n for (const node of upstream) {\n const schema = getOutputSchema(node);\n if (!schema || schema.length === 0) continue;\n const prefix = nodePath(node);\n groups.push({\n label: nodeLabel ? nodeLabel(node) : prefix,\n items: schema.map((item) => mapToVariableItem(item, prefix)),\n });\n }\n return groups;\n}\n\n// ─── Internals ──────────────────────────────────────────────────────────────\n\nfunction collectUpstream<TNode>(\n start: TNode,\n nodes: TNode[],\n getParents: (node: TNode, nodes: TNode[]) => TNode[],\n getNodeId: (node: TNode) => string\n): TNode[] {\n const seen = new Set<string>();\n const ordered: TNode[] = [];\n // BFS upstream — the closest parent ends up first, mirroring how Workato\n // groups the most recent step at the top of the datapill panel.\n const queue: TNode[] = [...getParents(start, nodes)];\n while (queue.length > 0) {\n const node = queue.shift() as TNode;\n const id = getNodeId(node);\n if (seen.has(id)) continue;\n seen.add(id);\n ordered.push(node);\n queue.push(...getParents(node, nodes));\n }\n return ordered;\n}\n\nfunction mapToVariableItem(\n item: OutputSchemaItem,\n prefix: string\n): VariableItem {\n const path = `${prefix}.${item.key}`;\n // Workato-style: show the sample value under the label when present.\n const description =\n item.description ??\n (item.sample !== undefined && item.sample !== null\n ? String(item.sample)\n : undefined);\n const result: VariableItem = { label: item.label, path };\n if (description !== undefined) result.description = description;\n if (item.children && item.children.length > 0) {\n result.children = item.children.map((c) => mapToVariableItem(c, path));\n }\n return result;\n}\n"],"names":["NotificationChannelRegistry","key","config","cfg","notificationChannelRegistry","buildVariableGroups","opts","currentNodeId","nodes","getParents","getOutputSchema","nodePath","nodeLabel","getNodeId","n","current","upstream","collectUpstream","groups","node","schema","prefix","item","mapToVariableItem","start","seen","ordered","queue","id","path","description","result"],"mappings":"8hBAWA,MAAMA,CAA4B,CAAlC,aAAA,CACE,KAAQ,aAAe,GAAuC,CAE9D,SAASC,EAAaC,EAAyC,CAC7D,KAAK,SAAS,IAAID,EAAKC,CAAM,CAC/B,CAEA,IAAID,EAAoD,CACtD,OAAO,KAAK,SAAS,IAAIA,CAAG,CAC9B,CAEA,MAA2D,CACzD,OAAO,MAAM,KAAK,KAAK,SAAS,QAAA,CAAS,EAAE,IAAI,CAAC,CAACA,EAAKE,CAAG,KAAO,CAAE,IAAAF,EAAK,GAAGE,GAAM,CAClF,CAEA,IAAIF,EAAsB,CACxB,OAAO,KAAK,SAAS,IAAIA,CAAG,CAC9B,CACF,CAEO,MAAMG,EAA8B,IAAIJ,ECoCxC,SAASK,EACdC,EACiB,CACjB,KAAM,CACJ,cAAAC,EACA,MAAAC,EACA,WAAAC,EACA,gBAAAC,EACA,SAAAC,EACA,UAAAC,EACA,UAAAC,EAAaC,GAAcA,EAAgC,EAAA,EACzDR,EAEES,EAAUP,EAAM,KAAMM,GAAMD,EAAUC,CAAC,IAAMP,CAAa,EAChE,GAAI,CAACQ,EAAS,MAAO,CAAA,EAErB,MAAMC,EAAWC,EAAgBF,EAASP,EAAOC,EAAYI,CAAS,EAEhEK,EAA0B,CAAA,EAChC,UAAWC,KAAQH,EAAU,CAC3B,MAAMI,EAASV,EAAgBS,CAAI,EACnC,GAAI,CAACC,GAAUA,EAAO,SAAW,EAAG,SACpC,MAAMC,EAASV,EAASQ,CAAI,EAC5BD,EAAO,KAAK,CACV,MAAON,EAAYA,EAAUO,CAAI,EAAIE,EACrC,MAAOD,EAAO,IAAKE,GAASC,EAAkBD,EAAMD,CAAM,CAAC,CAAA,CAC5D,CACH,CACA,OAAOH,CACT,CAIA,SAASD,EACPO,EACAhB,EACAC,EACAI,EACS,CACT,MAAMY,MAAW,IACXC,EAAmB,CAAA,EAGnBC,EAAiB,CAAC,GAAGlB,EAAWe,EAAOhB,CAAK,CAAC,EACnD,KAAOmB,EAAM,OAAS,GAAG,CACvB,MAAMR,EAAOQ,EAAM,MAAA,EACbC,EAAKf,EAAUM,CAAI,EACrBM,EAAK,IAAIG,CAAE,IACfH,EAAK,IAAIG,CAAE,EACXF,EAAQ,KAAKP,CAAI,EACjBQ,EAAM,KAAK,GAAGlB,EAAWU,EAAMX,CAAK,CAAC,EACvC,CACA,OAAOkB,CACT,CAEA,SAASH,EACPD,EACAD,EACc,CACd,MAAMQ,EAAO,GAAGR,CAAM,IAAIC,EAAK,GAAG,GAE5BQ,EACJR,EAAK,cACJA,EAAK,SAAW,QAAaA,EAAK,SAAW,KAC1C,OAAOA,EAAK,MAAM,EAClB,QACAS,EAAuB,CAAE,MAAOT,EAAK,MAAO,KAAAO,CAAA,EAClD,OAAIC,IAAgB,SAAWC,EAAO,YAAcD,GAChDR,EAAK,UAAYA,EAAK,SAAS,OAAS,IAC1CS,EAAO,SAAWT,EAAK,SAAS,IAAK,GAAMC,EAAkB,EAAGM,CAAI,CAAC,GAEhEE,CACT"}
package/dist/index.d.ts CHANGED
@@ -57,6 +57,18 @@ export declare interface ApiWorkflowTemplate {
57
57
  templateUI?: Partial<Omit<WorkflowTemplate, 'triggerKey' | 'label' | 'description' | 'availableTasks'>>;
58
58
  }
59
59
 
60
+ export declare interface ApplicationTaskLike {
61
+ name?: string;
62
+ taskKey?: string;
63
+ applicationUuid?: string;
64
+ configuration?: unknown[];
65
+ ui?: {
66
+ bpmnEmit?: BpmnEmitSpec;
67
+ [key: string]: unknown;
68
+ };
69
+ [key: string]: unknown;
70
+ }
71
+
60
72
  export declare const ApprovalNode: ({ id, data }: NodeProps) => JSX_2.Element;
61
73
 
62
74
  /** True if the AST contains at least one non-text node. */
@@ -84,6 +96,16 @@ export declare interface BpmnElement {
84
96
  [key: string]: unknown;
85
97
  }
86
98
 
99
+ export declare interface BpmnEmitSpec {
100
+ kind: 'linear' | 'gated' | 'filter' | 'approval';
101
+ serviceTasks?: ServiceTaskSpec[];
102
+ gateway?: GatewaySpec;
103
+ templateFlows?: TemplateFlowSpec[];
104
+ outgoingConditions?: Record<string, string>;
105
+ dmnEmit?: DmnEmitSpec;
106
+ callActivity?: Record<string, unknown>;
107
+ }
108
+
87
109
  export declare interface BpmnSaveOptions {
88
110
  processId?: string;
89
111
  processName?: string;
@@ -97,6 +119,20 @@ export declare interface BranchMap {
97
119
  };
98
120
  }
99
121
 
122
+ /**
123
+ * Generate a backend-ready payload from canvas state + task definitions.
124
+ *
125
+ * @example
126
+ * const payload = buildBackendPayload({
127
+ * state: { slots, branches },
128
+ * tasksByKey: { USER_CREATION: {...}, USER_GROUP_ASSIGNMENT: {...} },
129
+ * context: { customerKey: '51995', workflowName: 'My WF' },
130
+ * config: { triggerToCategory: { CUSTOM_TRIGGER: 'CUSTOM_CATEGORY' } },
131
+ * });
132
+ * await api.post('/process', payload);
133
+ */
134
+ export declare function buildBackendPayload(opts: BuildPayloadOptions): Record<string, unknown>;
135
+
100
136
  export declare function buildEvaluationPayload({ values, conditionConfig, }: {
101
137
  values: Record<string, unknown>;
102
138
  conditionConfig?: ConditionConfig;
@@ -124,6 +160,48 @@ export declare function buildFieldConfig(): FieldFormulaConfig;
124
160
  */
125
161
  export declare function buildFormulaPath(root: string, ...segments: string[]): string;
126
162
 
163
+ export declare interface BuildPayloadConfig {
164
+ /**
165
+ * Map of trigger eventType → workflowCategory string. Defaults to a small
166
+ * IAM-shaped fallback; consumers should pass the full map they use.
167
+ */
168
+ triggerToCategory?: Record<string, string>;
169
+ /** eventType values that should set `sources: ['SCHEDULER']` and skip the message block. */
170
+ schedulerEventTypes?: string[];
171
+ /** DMN LHS prefix for condition expressions (default IAM-style). */
172
+ conditionPathPrefix?: string;
173
+ /** Fallback workflowCategory when eventType isn't mapped. */
174
+ defaultWorkflowCategory?: string;
175
+ /** End-event ids — override per backend convention. */
176
+ endEventIds?: {
177
+ success: string;
178
+ failure: string;
179
+ rejected: string;
180
+ };
181
+ /** Names rendered on end events. */
182
+ endEventNames?: {
183
+ success: string;
184
+ failure: string;
185
+ rejected: string;
186
+ };
187
+ /** Start event id used in the outer chain. */
188
+ startEventId?: string;
189
+ }
190
+
191
+ export declare interface BuildPayloadContext {
192
+ customerKey: string;
193
+ workflowName: string;
194
+ /** Anything else the host wants exposed via `from: 'ctx', key: '...'`. */
195
+ [key: string]: unknown;
196
+ }
197
+
198
+ export declare interface BuildPayloadOptions {
199
+ state: PayloadCanvasState;
200
+ tasksByKey: Record<string, ApplicationTaskLike>;
201
+ context: BuildPayloadContext;
202
+ config?: BuildPayloadConfig;
203
+ }
204
+
127
205
  export declare function buildSelectStyles(hasError: boolean, isMulti?: boolean): StylesConfig<any, boolean, GroupBase<any>>;
128
206
 
129
207
  /**
@@ -353,6 +431,22 @@ export declare interface DmnDefinition {
353
431
  [key: string]: unknown;
354
432
  }
355
433
 
434
+ export declare interface DmnEmitSpec {
435
+ tableName: string;
436
+ inputExpr: string;
437
+ hitPolicy?: string;
438
+ outputs?: DmnOutputSpec[];
439
+ operatorMap?: Record<string, string>;
440
+ valuesField?: string;
441
+ }
442
+
443
+ export declare interface DmnOutputSpec {
444
+ id: string;
445
+ label?: string;
446
+ name: string;
447
+ typeRef?: string;
448
+ }
449
+
356
450
  /** @deprecated Use FlowForm */
357
451
  export declare const DynamicFormRenderer: default_2.ForwardRefExoticComponent<FlowFormProps & default_2.RefAttributes<FlowFormHandle>>;
358
452
 
@@ -430,6 +524,18 @@ export declare interface ExecutionStep {
430
524
  error?: string;
431
525
  }
432
526
 
527
+ export declare interface ExtensionFieldSpec {
528
+ name: string;
529
+ source?: {
530
+ type: 'literal' | 'json' | 'taskConfig' | 'formData';
531
+ value?: unknown;
532
+ shape?: Record<string, FieldRef>;
533
+ passthrough?: boolean;
534
+ exclude?: string[];
535
+ key?: string;
536
+ };
537
+ }
538
+
433
539
  /**
434
540
  * Extract the display label from a path expression.
435
541
  * Prefers the last [\"key\"] bracket segment; falls back to the last dot-segment.
@@ -590,6 +696,12 @@ export declare interface FieldDescriptor {
590
696
  */
591
697
  export declare type FieldFormulaConfig = Record<string, never>;
592
698
 
699
+ export declare interface FieldRef {
700
+ from: 'literal' | 'task' | 'ctx' | 'slot' | 'formData';
701
+ key?: string;
702
+ value?: unknown;
703
+ }
704
+
593
705
  export declare const fieldRegistry: {
594
706
  register(type: string, component: FieldComponent): void;
595
707
  get(type: string): FieldComponent | undefined;
@@ -1007,6 +1119,11 @@ export declare interface FunctionNode {
1007
1119
  args: FormulaASTNode[];
1008
1120
  }
1009
1121
 
1122
+ export declare interface GatewaySpec {
1123
+ idTemplate: string;
1124
+ name?: string;
1125
+ }
1126
+
1010
1127
  /** True if the string contains at least one formula token. */
1011
1128
  export declare function hasFormulaTokens(value: unknown): boolean;
1012
1129
 
@@ -1304,6 +1421,38 @@ export declare interface PathRefNode {
1304
1421
  label: string;
1305
1422
  }
1306
1423
 
1424
+ /**
1425
+ * buildBackendPayload — generic BPMN/DMN/canvasState emitter driven by each
1426
+ * task's `ui.bpmnEmit` block. Consumer ships per-task bpmnEmit specs from
1427
+ * the backend; the package handles the walk.
1428
+ *
1429
+ * Originally lived in IAM as `flowforgeStateToBackendJson`. Moved into the
1430
+ * package so every consumer gets the same emitter — and so DMN/filter/
1431
+ * approval fixes ship once, to everyone.
1432
+ *
1433
+ * Consumer injects:
1434
+ * - canvasState — `{ slots, branches }` from the canvas
1435
+ * - tasksByKey — `{ [descriptorType]: ApplicationTask }` lookup
1436
+ * - context — host-specific scalars (customerKey, workflowName)
1437
+ * - config — IAM-shaped defaults (path prefix, end-event ids,
1438
+ * trigger→category map, scheduler events)
1439
+ *
1440
+ * Returns a JSON object ready to POST to the backend.
1441
+ */
1442
+ export declare type PayloadCanvasSlot = {
1443
+ id: string;
1444
+ kind?: string;
1445
+ descriptorType?: string;
1446
+ nodeData?: Record<string, unknown>;
1447
+ formData?: Record<string, unknown>;
1448
+ [key: string]: unknown;
1449
+ };
1450
+
1451
+ export declare type PayloadCanvasState = {
1452
+ slots?: PayloadCanvasSlot[];
1453
+ branches?: Record<string, unknown>;
1454
+ };
1455
+
1307
1456
  declare interface ProviderProps {
1308
1457
  resolvers?: OptionsResolvers;
1309
1458
  children: default_2.ReactNode;
@@ -1426,6 +1575,13 @@ export declare function serializeASTAsConfig(nodes: FormulaASTNode[]): string;
1426
1575
  */
1427
1576
  export declare function serializeConditionExpressions(conditionConfig: ConditionConfig): Record<string, string>;
1428
1577
 
1578
+ export declare interface ServiceTaskSpec {
1579
+ idTemplate: string;
1580
+ name?: string;
1581
+ flowableClass?: string;
1582
+ extensionFields?: ExtensionFieldSpec[];
1583
+ }
1584
+
1429
1585
  declare type SlotKind = 'start' | 'end' | 'addTrigger' | 'triggerFixed' | 'userTask' | 'addStep' | 'filter' | 'approval';
1430
1586
 
1431
1587
  /**
@@ -1514,6 +1670,13 @@ export declare interface TabsFieldDescriptor extends FieldDescriptor {
1514
1670
  inactiveTextColor?: string;
1515
1671
  }
1516
1672
 
1673
+ export declare interface TemplateFlowSpec {
1674
+ from: string;
1675
+ to: string;
1676
+ idTemplate?: string;
1677
+ condition?: string | null;
1678
+ }
1679
+
1517
1680
  export declare class TemplateRegistry {
1518
1681
  private templates;
1519
1682
  /**
package/dist/index.js CHANGED
@@ -1,15 +1,16 @@
1
- import { D as N, F as R, a as D, b as P, c as W, I as A, O as E, T as I, V as C, d as O, e as V, f as B, g as z, h as L, i as q, j as H, k as M, E as _, l as $, m as j, n as G, o as U, p as Y, q as J, r as K, s as Q, t as X, u as Z, v as ee, w as se, x as oe, y as re, z as ae, A as te, B as ie, C as ne } from "./index-B-D9UuLO.js";
1
+ import { D as N, F as R, a as D, b as P, c as W, I as A, O as E, T as I, V as C, d as O, e as B, f as V, g as z, h as L, i as q, j as H, k as M, E as _, l as $, m as j, n as G, o as U, p as Y, q as J, r as K, s as Q, t as X, u as Z, v as ee, w as se, x as oe, y as ae, z as re, A as te, B as ie, C as ne } from "./index-B-D9UuLO.js";
2
2
  import { F as ce, S as de, a as pe, u as ue } from "./SchemaBuilderDrawer-BP7aZgFe.js";
3
3
  import "react/jsx-runtime";
4
4
  import "react";
5
5
  import "@mui/material";
6
6
  import "react-icons/md";
7
- import { NodeTypeRegistry as he, baseNodeDefaults as me, conditionBranchDescriptor as ge, defineNode as be, endEventDescriptor as Fe, makeSubWorkflowDescriptor as we, nodeTypeRegistry as ke, notificationDescriptor as Se, restApiDescriptor as Te, startEventDescriptor as ye, subWorkflowDescriptor as xe, webhookTriggerDescriptor as ve, webhookTriggerTemplate as Ne } from "./nodeRegistry.js";
7
+ import { NodeTypeRegistry as he, baseNodeDefaults as me, conditionBranchDescriptor as ge, defineNode as be, endEventDescriptor as Fe, makeSubWorkflowDescriptor as ke, nodeTypeRegistry as we, notificationDescriptor as Se, restApiDescriptor as Te, startEventDescriptor as ye, subWorkflowDescriptor as xe, webhookTriggerDescriptor as ve, webhookTriggerTemplate as Ne } from "./nodeRegistry.js";
8
8
  import { TemplateRegistry as De, templateRegistry as Pe } from "./templateRegistry.js";
9
- import { F as Ae, a as Ee, S as Ie, F as Ce, W as Oe, b as Ve, c as Be, o as ze, u as Le, w as qe } from "./templateSkeletons-f-XQQvyE.js";
9
+ import { F as Ae, a as Ee, S as Ie, F as Ce, W as Oe, b as Be, c as Ve, o as ze, u as Le, w as qe } from "./templateSkeletons-f-XQQvyE.js";
10
10
  import { d as Me } from "./messages-CO299wPN.js";
11
11
  import { l as $e, s as je } from "./bpmn-CtfWDaOY.js";
12
12
  import { A as Ue, b as Ye, E as Je, c as Ke, F as Qe, R as Xe, S as Ze, T as es, W as ss, e as os } from "./GatewayBranchEdge-CrgczPYJ.js";
13
+ import { b as rs } from "./buildBackendPayload-4SwOp7St.js";
13
14
  class g {
14
15
  constructor() {
15
16
  this.channels = /* @__PURE__ */ new Map();
@@ -33,35 +34,35 @@ function y(e) {
33
34
  currentNodeId: s,
34
35
  nodes: o,
35
36
  getParents: t,
36
- getOutputSchema: r,
37
+ getOutputSchema: a,
37
38
  nodePath: i,
38
39
  nodeLabel: n,
39
- getNodeId: l = (a) => a.id
40
- } = e, c = o.find((a) => l(a) === s);
40
+ getNodeId: l = (r) => r.id
41
+ } = e, c = o.find((r) => l(r) === s);
41
42
  if (!c) return [];
42
43
  const h = b(c, o, t, l), p = [];
43
- for (const a of h) {
44
- const d = r(a);
44
+ for (const r of h) {
45
+ const d = a(r);
45
46
  if (!d || d.length === 0) continue;
46
- const u = i(a);
47
+ const u = i(r);
47
48
  p.push({
48
- label: n ? n(a) : u,
49
+ label: n ? n(r) : u,
49
50
  items: d.map((m) => f(m, u))
50
51
  });
51
52
  }
52
53
  return p;
53
54
  }
54
55
  function b(e, s, o, t) {
55
- const r = /* @__PURE__ */ new Set(), i = [], n = [...o(e, s)];
56
+ const a = /* @__PURE__ */ new Set(), i = [], n = [...o(e, s)];
56
57
  for (; n.length > 0; ) {
57
58
  const l = n.shift(), c = t(l);
58
- r.has(c) || (r.add(c), i.push(l), n.push(...o(l, s)));
59
+ a.has(c) || (a.add(c), i.push(l), n.push(...o(l, s)));
59
60
  }
60
61
  return i;
61
62
  }
62
63
  function f(e, s) {
63
- const o = `${s}.${e.key}`, t = e.description ?? (e.sample !== void 0 && e.sample !== null ? String(e.sample) : void 0), r = { label: e.label, path: o };
64
- return t !== void 0 && (r.description = t), e.children && e.children.length > 0 && (r.children = e.children.map((i) => f(i, o))), r;
64
+ const o = `${s}.${e.key}`, t = e.description ?? (e.sample !== void 0 && e.sample !== null ? String(e.sample) : void 0), a = { label: e.label, path: o };
65
+ return t !== void 0 && (a.description = t), e.children && e.children.length > 0 && (a.children = e.children.map((i) => f(i, o))), a;
65
66
  }
66
67
  export {
67
68
  Ue as ActionNode,
@@ -93,11 +94,12 @@ export {
93
94
  ss as WebhookTriggerNode,
94
95
  Ce as WorkflowCanvas,
95
96
  Oe as WorkflowExecutionHistory,
96
- Ve as WorkflowTemplateLibrary,
97
- Be as accessRequestSkeleton,
98
- V as astHasRefs,
99
- B as astToTokens,
97
+ Be as WorkflowTemplateLibrary,
98
+ Ve as accessRequestSkeleton,
99
+ B as astHasRefs,
100
+ V as astToTokens,
100
101
  me as baseNodeDefaults,
102
+ rs as buildBackendPayload,
101
103
  z as buildEvaluationPayload,
102
104
  L as buildFieldConfig,
103
105
  q as buildFormulaPath,
@@ -118,8 +120,8 @@ export {
118
120
  J as inputStyle,
119
121
  K as isFormula,
120
122
  $e as loadWorkflowFromBpmn,
121
- we as makeSubWorkflowDescriptor,
122
- ke as nodeTypeRegistry,
123
+ ke as makeSubWorkflowDescriptor,
124
+ we as nodeTypeRegistry,
123
125
  T as notificationChannelRegistry,
124
126
  Se as notificationDescriptor,
125
127
  ze as offboardingSkeleton,
@@ -134,8 +136,8 @@ export {
134
136
  xe as subWorkflowDescriptor,
135
137
  Pe as templateRegistry,
136
138
  oe as tokenize,
137
- re as unwrapFormula,
138
- ae as useDynamicOptions,
139
+ ae as unwrapFormula,
140
+ re as useDynamicOptions,
139
141
  ue as useFlowForm,
140
142
  te as useOptionsResolvers,
141
143
  ie as useVariablePickerContext,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/notificationChannelRegistry/index.ts","../src/datapills/buildVariableGroups.ts"],"sourcesContent":["export interface NotificationChannelOption {\n value: string;\n label: string;\n}\n\nexport interface NotificationChannelConfig {\n label: string;\n /** Fetch recipients/channels for this notification channel at runtime */\n fetchRecipients?: () => Promise<NotificationChannelOption[]>;\n}\n\nclass NotificationChannelRegistry {\n private channels = new Map<string, NotificationChannelConfig>();\n\n register(key: string, config: NotificationChannelConfig): void {\n this.channels.set(key, config);\n }\n\n get(key: string): NotificationChannelConfig | undefined {\n return this.channels.get(key);\n }\n\n list(): Array<{ key: string } & NotificationChannelConfig> {\n return Array.from(this.channels.entries()).map(([key, cfg]) => ({ key, ...cfg }));\n }\n\n has(key: string): boolean {\n return this.channels.has(key);\n }\n}\n\nexport const notificationChannelRegistry = new NotificationChannelRegistry();\nexport default NotificationChannelRegistry;\n","/**\n * buildVariableGroups — graph walker that turns upstream nodes' outputSchemas\n * into Smart Values picker groups.\n *\n * Pattern matches Workato's datapill model: every node declares what it\n * outputs; downstream nodes see the union of upstream outputs. The package\n * doesn't know your node-id scheme, your API, or your edge model — pass\n * those in via the four predicates and we do the rest.\n *\n * Usage (IAM-side):\n *\n * const variableGroups = buildVariableGroups({\n * currentNodeId,\n * nodes, // canvas state slots\n * getParents: (node) => upstreamSlotsOf(node, edges),\n * getOutputSchema: (node) => tasksByKey[node.descriptorType]?.outputSchema ?? [],\n * nodePath: (node) => node.id === 'trigger' ? 'endUser' : `data.${index(node)}`,\n * nodeLabel: (node) => node.label,\n * });\n *\n * <FlowForm variableGroups={variableGroups} ... />\n */\n\nimport type { VariableGroup, VariableItem } from '../FlowForm/VariablePicker/VariablePickerContext';\n\nexport interface OutputSchemaItem {\n key: string;\n label: string;\n /** Optional — display only. Lets the picker show a type chip (\"ABC\" / 123). */\n type?: string;\n /** Optional — shown under/beside the label in the picker (Workato-style). */\n sample?: string | number | boolean;\n /** Optional tooltip text (independent of `sample`). */\n description?: string;\n /** Nested fields — renders as an expandable subgroup. */\n children?: OutputSchemaItem[];\n}\n\nexport interface BuildVariableGroupsOptions<TNode> {\n /** Id of the node currently being configured (its outputs are NOT included). */\n currentNodeId: string;\n /** All nodes in the canvas / workflow. */\n nodes: TNode[];\n /** Return the immediate parent node(s) — consumer walks its own edge model. */\n getParents: (node: TNode, nodes: TNode[]) => TNode[];\n /** Return the node's output schema array (empty array if none). */\n getOutputSchema: (node: TNode) => OutputSchemaItem[];\n /** Return the runtime path prefix for this node (e.g. 'endUser', 'data.1'). */\n nodePath: (node: TNode) => string;\n /** Optional — group label shown in the picker. Defaults to `nodePath(node)`. */\n nodeLabel?: (node: TNode) => string;\n /**\n * Optional — function reading a node's id. Defaults to `(n) => (n as any).id`.\n * Override if your node model nests the id (e.g. `n.data.id`).\n */\n getNodeId?: (node: TNode) => string;\n}\n\n/**\n * Walks upstream from `currentNodeId` (excluding it), collects each ancestor's\n * outputSchema, and returns a `VariableGroup[]` ready for `<FlowForm variableGroups>`.\n *\n * - Excludes the current node (a node never references its own outputs).\n * - Deduplicates ancestors via id — diamond graphs don't produce duplicate groups.\n * - Skips ancestors with empty outputSchema (no group rendered for nodes that emit nothing).\n * - Preserves traversal order — the closest parent appears first in the picker.\n */\nexport function buildVariableGroups<TNode>(\n opts: BuildVariableGroupsOptions<TNode>\n): VariableGroup[] {\n const {\n currentNodeId,\n nodes,\n getParents,\n getOutputSchema,\n nodePath,\n nodeLabel,\n getNodeId = (n: TNode) => (n as unknown as { id: string }).id,\n } = opts;\n\n const current = nodes.find((n) => getNodeId(n) === currentNodeId);\n if (!current) return [];\n\n const upstream = collectUpstream(current, nodes, getParents, getNodeId);\n\n const groups: VariableGroup[] = [];\n for (const node of upstream) {\n const schema = getOutputSchema(node);\n if (!schema || schema.length === 0) continue;\n const prefix = nodePath(node);\n groups.push({\n label: nodeLabel ? nodeLabel(node) : prefix,\n items: schema.map((item) => mapToVariableItem(item, prefix)),\n });\n }\n return groups;\n}\n\n// ─── Internals ──────────────────────────────────────────────────────────────\n\nfunction collectUpstream<TNode>(\n start: TNode,\n nodes: TNode[],\n getParents: (node: TNode, nodes: TNode[]) => TNode[],\n getNodeId: (node: TNode) => string\n): TNode[] {\n const seen = new Set<string>();\n const ordered: TNode[] = [];\n // BFS upstream — the closest parent ends up first, mirroring how Workato\n // groups the most recent step at the top of the datapill panel.\n const queue: TNode[] = [...getParents(start, nodes)];\n while (queue.length > 0) {\n const node = queue.shift() as TNode;\n const id = getNodeId(node);\n if (seen.has(id)) continue;\n seen.add(id);\n ordered.push(node);\n queue.push(...getParents(node, nodes));\n }\n return ordered;\n}\n\nfunction mapToVariableItem(\n item: OutputSchemaItem,\n prefix: string\n): VariableItem {\n const path = `${prefix}.${item.key}`;\n // Workato-style: show the sample value under the label when present.\n const description =\n item.description ??\n (item.sample !== undefined && item.sample !== null\n ? String(item.sample)\n : undefined);\n const result: VariableItem = { label: item.label, path };\n if (description !== undefined) result.description = description;\n if (item.children && item.children.length > 0) {\n result.children = item.children.map((c) => mapToVariableItem(c, path));\n }\n return result;\n}\n"],"names":["NotificationChannelRegistry","key","config","cfg","notificationChannelRegistry","buildVariableGroups","opts","currentNodeId","nodes","getParents","getOutputSchema","nodePath","nodeLabel","getNodeId","n","current","upstream","collectUpstream","groups","node","schema","prefix","item","mapToVariableItem","start","seen","ordered","queue","id","path","description","result","c"],"mappings":";;;;;;;;;;;;AAWA,MAAMA,EAA4B;AAAA,EAAlC,cAAA;AACE,SAAQ,+BAAe,IAAA;AAAA,EAAuC;AAAA,EAE9D,SAASC,GAAaC,GAAyC;AAC7D,SAAK,SAAS,IAAID,GAAKC,CAAM;AAAA,EAC/B;AAAA,EAEA,IAAID,GAAoD;AACtD,WAAO,KAAK,SAAS,IAAIA,CAAG;AAAA,EAC9B;AAAA,EAEA,OAA2D;AACzD,WAAO,MAAM,KAAK,KAAK,SAAS,QAAA,CAAS,EAAE,IAAI,CAAC,CAACA,GAAKE,CAAG,OAAO,EAAE,KAAAF,GAAK,GAAGE,IAAM;AAAA,EAClF;AAAA,EAEA,IAAIF,GAAsB;AACxB,WAAO,KAAK,SAAS,IAAIA,CAAG;AAAA,EAC9B;AACF;AAEO,MAAMG,IAA8B,IAAIJ,EAAA;ACoCxC,SAASK,EACdC,GACiB;AACjB,QAAM;AAAA,IACJ,eAAAC;AAAA,IACA,OAAAC;AAAA,IACA,YAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,UAAAC;AAAA,IACA,WAAAC;AAAA,IACA,WAAAC,IAAY,CAACC,MAAcA,EAAgC;AAAA,EAAA,IACzDR,GAEES,IAAUP,EAAM,KAAK,CAACM,MAAMD,EAAUC,CAAC,MAAMP,CAAa;AAChE,MAAI,CAACQ,EAAS,QAAO,CAAA;AAErB,QAAMC,IAAWC,EAAgBF,GAASP,GAAOC,GAAYI,CAAS,GAEhEK,IAA0B,CAAA;AAChC,aAAWC,KAAQH,GAAU;AAC3B,UAAMI,IAASV,EAAgBS,CAAI;AACnC,QAAI,CAACC,KAAUA,EAAO,WAAW,EAAG;AACpC,UAAMC,IAASV,EAASQ,CAAI;AAC5B,IAAAD,EAAO,KAAK;AAAA,MACV,OAAON,IAAYA,EAAUO,CAAI,IAAIE;AAAA,MACrC,OAAOD,EAAO,IAAI,CAACE,MAASC,EAAkBD,GAAMD,CAAM,CAAC;AAAA,IAAA,CAC5D;AAAA,EACH;AACA,SAAOH;AACT;AAIA,SAASD,EACPO,GACAhB,GACAC,GACAI,GACS;AACT,QAAMY,wBAAW,IAAA,GACXC,IAAmB,CAAA,GAGnBC,IAAiB,CAAC,GAAGlB,EAAWe,GAAOhB,CAAK,CAAC;AACnD,SAAOmB,EAAM,SAAS,KAAG;AACvB,UAAMR,IAAOQ,EAAM,MAAA,GACbC,IAAKf,EAAUM,CAAI;AACzB,IAAIM,EAAK,IAAIG,CAAE,MACfH,EAAK,IAAIG,CAAE,GACXF,EAAQ,KAAKP,CAAI,GACjBQ,EAAM,KAAK,GAAGlB,EAAWU,GAAMX,CAAK,CAAC;AAAA,EACvC;AACA,SAAOkB;AACT;AAEA,SAASH,EACPD,GACAD,GACc;AACd,QAAMQ,IAAO,GAAGR,CAAM,IAAIC,EAAK,GAAG,IAE5BQ,IACJR,EAAK,gBACJA,EAAK,WAAW,UAAaA,EAAK,WAAW,OAC1C,OAAOA,EAAK,MAAM,IAClB,SACAS,IAAuB,EAAE,OAAOT,EAAK,OAAO,MAAAO,EAAA;AAClD,SAAIC,MAAgB,WAAWC,EAAO,cAAcD,IAChDR,EAAK,YAAYA,EAAK,SAAS,SAAS,MAC1CS,EAAO,WAAWT,EAAK,SAAS,IAAI,CAACU,MAAMT,EAAkBS,GAAGH,CAAI,CAAC,IAEhEE;AACT;"}
1
+ {"version":3,"file":"index.js","sources":["../src/notificationChannelRegistry/index.ts","../src/datapills/buildVariableGroups.ts"],"sourcesContent":["export interface NotificationChannelOption {\n value: string;\n label: string;\n}\n\nexport interface NotificationChannelConfig {\n label: string;\n /** Fetch recipients/channels for this notification channel at runtime */\n fetchRecipients?: () => Promise<NotificationChannelOption[]>;\n}\n\nclass NotificationChannelRegistry {\n private channels = new Map<string, NotificationChannelConfig>();\n\n register(key: string, config: NotificationChannelConfig): void {\n this.channels.set(key, config);\n }\n\n get(key: string): NotificationChannelConfig | undefined {\n return this.channels.get(key);\n }\n\n list(): Array<{ key: string } & NotificationChannelConfig> {\n return Array.from(this.channels.entries()).map(([key, cfg]) => ({ key, ...cfg }));\n }\n\n has(key: string): boolean {\n return this.channels.has(key);\n }\n}\n\nexport const notificationChannelRegistry = new NotificationChannelRegistry();\nexport default NotificationChannelRegistry;\n","/**\n * buildVariableGroups — graph walker that turns upstream nodes' outputSchemas\n * into Smart Values picker groups.\n *\n * Pattern matches Workato's datapill model: every node declares what it\n * outputs; downstream nodes see the union of upstream outputs. The package\n * doesn't know your node-id scheme, your API, or your edge model — pass\n * those in via the four predicates and we do the rest.\n *\n * Usage (IAM-side):\n *\n * const variableGroups = buildVariableGroups({\n * currentNodeId,\n * nodes, // canvas state slots\n * getParents: (node) => upstreamSlotsOf(node, edges),\n * getOutputSchema: (node) => tasksByKey[node.descriptorType]?.outputSchema ?? [],\n * nodePath: (node) => node.id === 'trigger' ? 'endUser' : `data.${index(node)}`,\n * nodeLabel: (node) => node.label,\n * });\n *\n * <FlowForm variableGroups={variableGroups} ... />\n */\n\nimport type { VariableGroup, VariableItem } from '../FlowForm/VariablePicker/VariablePickerContext';\n\nexport interface OutputSchemaItem {\n key: string;\n label: string;\n /** Optional — display only. Lets the picker show a type chip (\"ABC\" / 123). */\n type?: string;\n /** Optional — shown under/beside the label in the picker (Workato-style). */\n sample?: string | number | boolean;\n /** Optional tooltip text (independent of `sample`). */\n description?: string;\n /** Nested fields — renders as an expandable subgroup. */\n children?: OutputSchemaItem[];\n}\n\nexport interface BuildVariableGroupsOptions<TNode> {\n /** Id of the node currently being configured (its outputs are NOT included). */\n currentNodeId: string;\n /** All nodes in the canvas / workflow. */\n nodes: TNode[];\n /** Return the immediate parent node(s) — consumer walks its own edge model. */\n getParents: (node: TNode, nodes: TNode[]) => TNode[];\n /** Return the node's output schema array (empty array if none). */\n getOutputSchema: (node: TNode) => OutputSchemaItem[];\n /** Return the runtime path prefix for this node (e.g. 'endUser', 'data.1'). */\n nodePath: (node: TNode) => string;\n /** Optional — group label shown in the picker. Defaults to `nodePath(node)`. */\n nodeLabel?: (node: TNode) => string;\n /**\n * Optional — function reading a node's id. Defaults to `(n) => (n as any).id`.\n * Override if your node model nests the id (e.g. `n.data.id`).\n */\n getNodeId?: (node: TNode) => string;\n}\n\n/**\n * Walks upstream from `currentNodeId` (excluding it), collects each ancestor's\n * outputSchema, and returns a `VariableGroup[]` ready for `<FlowForm variableGroups>`.\n *\n * - Excludes the current node (a node never references its own outputs).\n * - Deduplicates ancestors via id — diamond graphs don't produce duplicate groups.\n * - Skips ancestors with empty outputSchema (no group rendered for nodes that emit nothing).\n * - Preserves traversal order — the closest parent appears first in the picker.\n */\nexport function buildVariableGroups<TNode>(\n opts: BuildVariableGroupsOptions<TNode>\n): VariableGroup[] {\n const {\n currentNodeId,\n nodes,\n getParents,\n getOutputSchema,\n nodePath,\n nodeLabel,\n getNodeId = (n: TNode) => (n as unknown as { id: string }).id,\n } = opts;\n\n const current = nodes.find((n) => getNodeId(n) === currentNodeId);\n if (!current) return [];\n\n const upstream = collectUpstream(current, nodes, getParents, getNodeId);\n\n const groups: VariableGroup[] = [];\n for (const node of upstream) {\n const schema = getOutputSchema(node);\n if (!schema || schema.length === 0) continue;\n const prefix = nodePath(node);\n groups.push({\n label: nodeLabel ? nodeLabel(node) : prefix,\n items: schema.map((item) => mapToVariableItem(item, prefix)),\n });\n }\n return groups;\n}\n\n// ─── Internals ──────────────────────────────────────────────────────────────\n\nfunction collectUpstream<TNode>(\n start: TNode,\n nodes: TNode[],\n getParents: (node: TNode, nodes: TNode[]) => TNode[],\n getNodeId: (node: TNode) => string\n): TNode[] {\n const seen = new Set<string>();\n const ordered: TNode[] = [];\n // BFS upstream — the closest parent ends up first, mirroring how Workato\n // groups the most recent step at the top of the datapill panel.\n const queue: TNode[] = [...getParents(start, nodes)];\n while (queue.length > 0) {\n const node = queue.shift() as TNode;\n const id = getNodeId(node);\n if (seen.has(id)) continue;\n seen.add(id);\n ordered.push(node);\n queue.push(...getParents(node, nodes));\n }\n return ordered;\n}\n\nfunction mapToVariableItem(\n item: OutputSchemaItem,\n prefix: string\n): VariableItem {\n const path = `${prefix}.${item.key}`;\n // Workato-style: show the sample value under the label when present.\n const description =\n item.description ??\n (item.sample !== undefined && item.sample !== null\n ? String(item.sample)\n : undefined);\n const result: VariableItem = { label: item.label, path };\n if (description !== undefined) result.description = description;\n if (item.children && item.children.length > 0) {\n result.children = item.children.map((c) => mapToVariableItem(c, path));\n }\n return result;\n}\n"],"names":["NotificationChannelRegistry","key","config","cfg","notificationChannelRegistry","buildVariableGroups","opts","currentNodeId","nodes","getParents","getOutputSchema","nodePath","nodeLabel","getNodeId","n","current","upstream","collectUpstream","groups","node","schema","prefix","item","mapToVariableItem","start","seen","ordered","queue","id","path","description","result","c"],"mappings":";;;;;;;;;;;;;AAWA,MAAMA,EAA4B;AAAA,EAAlC,cAAA;AACE,SAAQ,+BAAe,IAAA;AAAA,EAAuC;AAAA,EAE9D,SAASC,GAAaC,GAAyC;AAC7D,SAAK,SAAS,IAAID,GAAKC,CAAM;AAAA,EAC/B;AAAA,EAEA,IAAID,GAAoD;AACtD,WAAO,KAAK,SAAS,IAAIA,CAAG;AAAA,EAC9B;AAAA,EAEA,OAA2D;AACzD,WAAO,MAAM,KAAK,KAAK,SAAS,QAAA,CAAS,EAAE,IAAI,CAAC,CAACA,GAAKE,CAAG,OAAO,EAAE,KAAAF,GAAK,GAAGE,IAAM;AAAA,EAClF;AAAA,EAEA,IAAIF,GAAsB;AACxB,WAAO,KAAK,SAAS,IAAIA,CAAG;AAAA,EAC9B;AACF;AAEO,MAAMG,IAA8B,IAAIJ,EAAA;ACoCxC,SAASK,EACdC,GACiB;AACjB,QAAM;AAAA,IACJ,eAAAC;AAAA,IACA,OAAAC;AAAA,IACA,YAAAC;AAAA,IACA,iBAAAC;AAAA,IACA,UAAAC;AAAA,IACA,WAAAC;AAAA,IACA,WAAAC,IAAY,CAACC,MAAcA,EAAgC;AAAA,EAAA,IACzDR,GAEES,IAAUP,EAAM,KAAK,CAACM,MAAMD,EAAUC,CAAC,MAAMP,CAAa;AAChE,MAAI,CAACQ,EAAS,QAAO,CAAA;AAErB,QAAMC,IAAWC,EAAgBF,GAASP,GAAOC,GAAYI,CAAS,GAEhEK,IAA0B,CAAA;AAChC,aAAWC,KAAQH,GAAU;AAC3B,UAAMI,IAASV,EAAgBS,CAAI;AACnC,QAAI,CAACC,KAAUA,EAAO,WAAW,EAAG;AACpC,UAAMC,IAASV,EAASQ,CAAI;AAC5B,IAAAD,EAAO,KAAK;AAAA,MACV,OAAON,IAAYA,EAAUO,CAAI,IAAIE;AAAA,MACrC,OAAOD,EAAO,IAAI,CAACE,MAASC,EAAkBD,GAAMD,CAAM,CAAC;AAAA,IAAA,CAC5D;AAAA,EACH;AACA,SAAOH;AACT;AAIA,SAASD,EACPO,GACAhB,GACAC,GACAI,GACS;AACT,QAAMY,wBAAW,IAAA,GACXC,IAAmB,CAAA,GAGnBC,IAAiB,CAAC,GAAGlB,EAAWe,GAAOhB,CAAK,CAAC;AACnD,SAAOmB,EAAM,SAAS,KAAG;AACvB,UAAMR,IAAOQ,EAAM,MAAA,GACbC,IAAKf,EAAUM,CAAI;AACzB,IAAIM,EAAK,IAAIG,CAAE,MACfH,EAAK,IAAIG,CAAE,GACXF,EAAQ,KAAKP,CAAI,GACjBQ,EAAM,KAAK,GAAGlB,EAAWU,GAAMX,CAAK,CAAC;AAAA,EACvC;AACA,SAAOkB;AACT;AAEA,SAASH,EACPD,GACAD,GACc;AACd,QAAMQ,IAAO,GAAGR,CAAM,IAAIC,EAAK,GAAG,IAE5BQ,IACJR,EAAK,gBACJA,EAAK,WAAW,UAAaA,EAAK,WAAW,OAC1C,OAAOA,EAAK,MAAM,IAClB,SACAS,IAAuB,EAAE,OAAOT,EAAK,OAAO,MAAAO,EAAA;AAClD,SAAIC,MAAgB,WAAWC,EAAO,cAAcD,IAChDR,EAAK,YAAYA,EAAK,SAAS,SAAS,MAC1CS,EAAO,WAAWT,EAAK,SAAS,IAAI,CAACU,MAAMT,EAAkBS,GAAGH,CAAI,CAAC,IAEhEE;AACT;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@notmrabhi/flowforge",
3
- "version": "0.1.51",
3
+ "version": "0.1.53",
4
4
  "description": "Schema-driven form renderer and workflow engine for miniOrange IAM",
5
5
  "license": "UNLICENSED",
6
6
  "author": "miniOrange",