@tduniec/plugin-template-designer 0.3.7 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/CHANGELOG.md +34 -39
  2. package/README.md +8 -130
  3. package/dist/alpha.esm.js +1 -1
  4. package/dist/alpha.esm.js.map +1 -1
  5. package/dist/components/TemplateDesigner/TemplateDesigner.esm.js +14 -12
  6. package/dist/components/TemplateDesigner/TemplateDesigner.esm.js.map +1 -1
  7. package/dist/index.d.ts +10 -4
  8. package/dist/index.esm.js +3 -1
  9. package/dist/index.esm.js.map +1 -1
  10. package/dist/package.json.esm.js +53 -92
  11. package/dist/package.json.esm.js.map +1 -1
  12. package/dist/plugin.esm.js +1 -2
  13. package/dist/plugin.esm.js.map +1 -1
  14. package/package.json +46 -77
  15. package/LICENSE +0 -201
  16. package/dist/api/mockScaffolderActions.esm.js +0 -85
  17. package/dist/api/mockScaffolderActions.esm.js.map +0 -1
  18. package/dist/api/scaffolderActions.esm.js +0 -57
  19. package/dist/api/scaffolderActions.esm.js.map +0 -1
  20. package/dist/components/DesignerFlow/DesignerFlow.esm.js +0 -431
  21. package/dist/components/DesignerFlow/DesignerFlow.esm.js.map +0 -1
  22. package/dist/components/DesignerFlow/flowConfig.esm.js +0 -21
  23. package/dist/components/DesignerFlow/flowConfig.esm.js.map +0 -1
  24. package/dist/components/DesignerFlow/handlers.esm.js +0 -322
  25. package/dist/components/DesignerFlow/handlers.esm.js.map +0 -1
  26. package/dist/components/DesignerFlow/model.esm.js +0 -185
  27. package/dist/components/DesignerFlow/model.esm.js.map +0 -1
  28. package/dist/components/DesignerFlow/nodeLayout.esm.js +0 -138
  29. package/dist/components/DesignerFlow/nodeLayout.esm.js.map +0 -1
  30. package/dist/components/DesignerFlow/parameterTransforms.esm.js +0 -184
  31. package/dist/components/DesignerFlow/parameterTransforms.esm.js.map +0 -1
  32. package/dist/components/Nodes/ActionNode.esm.js +0 -602
  33. package/dist/components/Nodes/ActionNode.esm.js.map +0 -1
  34. package/dist/components/Nodes/OutputNode.esm.js +0 -370
  35. package/dist/components/Nodes/OutputNode.esm.js.map +0 -1
  36. package/dist/components/Nodes/ParameterInputNode.esm.js +0 -310
  37. package/dist/components/Nodes/ParameterInputNode.esm.js.map +0 -1
  38. package/dist/components/Nodes/ParameterTitlesNode.esm.js +0 -251
  39. package/dist/components/Nodes/ParameterTitlesNode.esm.js.map +0 -1
  40. package/dist/components/Nodes/ParametersNode.esm.js +0 -144
  41. package/dist/components/Nodes/ParametersNode.esm.js.map +0 -1
  42. package/dist/components/Nodes/action/schema.esm.js +0 -144
  43. package/dist/components/Nodes/action/schema.esm.js.map +0 -1
  44. package/dist/components/Nodes/action/useActionInputs.esm.js +0 -84
  45. package/dist/components/Nodes/action/useActionInputs.esm.js.map +0 -1
  46. package/dist/components/Nodes/common/AutoWidthPopper.esm.js +0 -22
  47. package/dist/components/Nodes/common/AutoWidthPopper.esm.js.map +0 -1
  48. package/dist/components/Nodes/common/nodeInteraction.esm.js +0 -9
  49. package/dist/components/Nodes/common/nodeInteraction.esm.js.map +0 -1
  50. package/dist/components/Nodes/output/useOutputController.esm.js +0 -191
  51. package/dist/components/Nodes/output/useOutputController.esm.js.map +0 -1
  52. package/dist/components/Nodes/parameters/useParameterSections.esm.js +0 -162
  53. package/dist/components/Nodes/parameters/useParameterSections.esm.js.map +0 -1
  54. package/dist/components/Nodes/types.esm.js +0 -8
  55. package/dist/components/Nodes/types.esm.js.map +0 -1
  56. package/dist/components/TemplateDesigner/components/FieldEditorDialog.esm.js +0 -55
  57. package/dist/components/TemplateDesigner/components/FieldEditorDialog.esm.js.map +0 -1
  58. package/dist/components/TemplateDesigner/components/TemplateLanding.esm.js +0 -157
  59. package/dist/components/TemplateDesigner/components/TemplateLanding.esm.js.map +0 -1
  60. package/dist/components/TemplateDesigner/components/TemplateWorkspace.esm.js +0 -302
  61. package/dist/components/TemplateDesigner/components/TemplateWorkspace.esm.js.map +0 -1
  62. package/dist/components/TemplateDesigner/components/codemirrorTheme.esm.js +0 -30
  63. package/dist/components/TemplateDesigner/components/codemirrorTheme.esm.js.map +0 -1
  64. package/dist/components/TemplateDesigner/useFieldEditor.esm.js +0 -95
  65. package/dist/components/TemplateDesigner/useFieldEditor.esm.js.map +0 -1
  66. package/dist/components/TemplateDesigner/useTemplateState.esm.js +0 -627
  67. package/dist/components/TemplateDesigner/useTemplateState.esm.js.map +0 -1
  68. package/dist/components/TemplateDesigner/utils.esm.js +0 -46
  69. package/dist/components/TemplateDesigner/utils.esm.js.map +0 -1
  70. package/dist/components/TemplateDesignerIcon.esm.js +0 -33
  71. package/dist/components/TemplateDesignerIcon.esm.js.map +0 -1
  72. package/dist/utils/createSequentialEdges.esm.js +0 -15
  73. package/dist/utils/createSequentialEdges.esm.js.map +0 -1
  74. package/dist/utils/sampleTemplate.esm.js +0 -40
  75. package/dist/utils/sampleTemplate.esm.js.map +0 -1
  76. package/dist/utils/yamlJsonConversion.esm.js +0 -47
  77. package/dist/utils/yamlJsonConversion.esm.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"flowConfig.esm.js","sources":["../../../src/components/DesignerFlow/flowConfig.ts"],"sourcesContent":["import { Position } from \"@xyflow/react\";\nimport { ActionNode } from \"../Nodes/ActionNode\";\nimport { ParametersNode } from \"../Nodes/ParametersNode\";\nimport { OutputNode } from \"../Nodes/OutputNode\";\n\n// Centralized flow layout + node type definitions consumed across DesignerFlow.\n\nexport const FLOW_LAYOUT = {\n verticalSpacing: 400,\n fixedXPosition: 100,\n} as const;\n\nexport const nodeTypes = {\n parametersNode: ParametersNode,\n actionNode: ActionNode,\n outputNode: OutputNode,\n};\n\nexport const nodeDefaults = {\n sourcePosition: Position.Bottom,\n targetPosition: Position.Top,\n};\n"],"names":[],"mappings":";;;;;AAOO,MAAM,WAAA,GAAc;AAAA,EACzB,eAAA,EAAiB,GAAA;AAAA,EACjB,cAAA,EAAgB;AAClB;AAEO,MAAM,SAAA,GAAY;AAAA,EACvB,cAAA,EAAgB,cAAA;AAAA,EAChB,UAAA,EAAY,UAAA;AAAA,EACZ,UAAA,EAAY;AACd;AAEO,MAAM,YAAA,GAAe;AAAA,EAC1B,gBAAgB,QAAA,CAAS,MAAA;AAAA,EACzB,gBAAgB,QAAA,CAAS;AAC3B;;;;"}
@@ -1,322 +0,0 @@
1
- import { createSequentialEdges } from '../../utils/createSequentialEdges.esm.js';
2
- import { normalizeParametersToSections, sanitizeSections, sectionsToParametersValue } from './parameterTransforms.esm.js';
3
- import { alignNodes } from './nodeLayout.esm.js';
4
-
5
- const orderNodes = (parameterNodes, actionNodes, outputNodes) => [...parameterNodes, ...actionNodes, ...outputNodes];
6
- const setSequentialEdgesIfChanged = (setEdges, alignedNodes) => {
7
- setEdges((prevEdges) => {
8
- const nextEdges = createSequentialEdges(alignedNodes);
9
- if (prevEdges.length === nextEdges.length && prevEdges.every(
10
- (edge, index) => edge.source === nextEdges[index]?.source && edge.target === nextEdges[index]?.target
11
- )) {
12
- return prevEdges;
13
- }
14
- return nextEdges;
15
- });
16
- };
17
- const createHandleAddNode = (setNodes, setEdges, options) => {
18
- const {
19
- fixedXPosition,
20
- verticalSpacing,
21
- nodeDefaults,
22
- scaffolderActionIds,
23
- scaffolderActionInputsById,
24
- scaffolderActionInputRequiredById,
25
- scaffolderActionOutputsById
26
- } = options;
27
- return (config) => {
28
- const {
29
- afterRfId,
30
- type = "actionNode",
31
- stepTemplate,
32
- outputTemplate,
33
- parametersTemplate
34
- } = config;
35
- const nodeType = type;
36
- setNodes((nodes) => {
37
- const parameterNodes = nodes.filter((n) => n.type === "parametersNode");
38
- const actionNodes = nodes.filter((n) => n.type === "actionNode");
39
- const outputNodes = nodes.filter((n) => n.type === "outputNode");
40
- const composeAndAlign = (nextParameters, nextActions, nextOutputs) => {
41
- const ordered = orderNodes(nextParameters, nextActions, nextOutputs);
42
- const aligned = alignNodes(ordered, fixedXPosition, verticalSpacing);
43
- setSequentialEdgesIfChanged(setEdges, aligned);
44
- return aligned;
45
- };
46
- if (nodeType === "parametersNode") {
47
- if (parameterNodes.length > 0) {
48
- return composeAndAlign(parameterNodes, actionNodes, outputNodes);
49
- }
50
- const rfParametersId = "rf-parameters";
51
- const initialParameters = parametersTemplate !== void 0 ? JSON.parse(
52
- JSON.stringify(parametersTemplate)
53
- ) : void 0;
54
- const parameterNode = {
55
- id: rfParametersId,
56
- type: "parametersNode",
57
- position: { x: fixedXPosition, y: 0 },
58
- data: {
59
- rfId: rfParametersId,
60
- parameters: initialParameters,
61
- sections: [],
62
- scaffolderActionIds,
63
- scaffolderActionInputsById,
64
- scaffolderActionInputRequiredById,
65
- scaffolderActionOutputsById
66
- },
67
- ...nodeDefaults
68
- };
69
- return composeAndAlign([parameterNode], actionNodes, outputNodes);
70
- }
71
- if (nodeType === "outputNode") {
72
- if (outputNodes.length > 0) {
73
- return composeAndAlign(parameterNodes, actionNodes, outputNodes);
74
- }
75
- const rfOutputId = "rf-output";
76
- const initialOutput = outputTemplate !== void 0 && outputTemplate !== null ? JSON.parse(JSON.stringify(outputTemplate)) : {};
77
- const outputNode = {
78
- id: rfOutputId,
79
- type: "outputNode",
80
- position: { x: fixedXPosition, y: 0 },
81
- data: {
82
- rfId: rfOutputId,
83
- output: initialOutput,
84
- scaffolderActionIds,
85
- scaffolderActionInputsById,
86
- scaffolderActionInputRequiredById,
87
- scaffolderActionOutputsById
88
- },
89
- ...nodeDefaults
90
- };
91
- return composeAndAlign(parameterNodes, actionNodes, [
92
- ...outputNodes,
93
- outputNode
94
- ]);
95
- }
96
- const parametersPlaceholder = nodes.find(
97
- (n) => n.type === "parametersNode"
98
- );
99
- const parametersNodeId = parametersPlaceholder?.id ?? null;
100
- const parentIndex = actionNodes.findIndex((n) => n.id === afterRfId);
101
- let insertIndex;
102
- if (parentIndex >= 0) {
103
- insertIndex = parentIndex + 1;
104
- } else if (afterRfId === parametersNodeId) {
105
- insertIndex = 0;
106
- } else {
107
- insertIndex = actionNodes.length;
108
- }
109
- const rfId = `rf-${Date.now()}`;
110
- const stepDefaults = {
111
- id: `step-${rfId}`,
112
- name: "New Step",
113
- action: "",
114
- input: {}
115
- };
116
- const newStep = {
117
- ...stepDefaults,
118
- ...stepTemplate ?? {}
119
- };
120
- const newNode = {
121
- id: rfId,
122
- type: "actionNode",
123
- position: { x: fixedXPosition, y: 0 },
124
- data: {
125
- rfId,
126
- step: newStep,
127
- scaffolderActionIds,
128
- scaffolderActionInputsById,
129
- scaffolderActionInputRequiredById,
130
- scaffolderActionOutputsById
131
- },
132
- ...nodeDefaults
133
- };
134
- const nextActionNodes = [
135
- ...actionNodes.slice(0, insertIndex),
136
- newNode,
137
- ...actionNodes.slice(insertIndex)
138
- ];
139
- return composeAndAlign(parameterNodes, nextActionNodes, outputNodes);
140
- });
141
- };
142
- };
143
- const createHandleRemoveNode = (setNodes, setEdges, options) => {
144
- const { fixedXPosition, verticalSpacing } = options;
145
- return (rfId) => {
146
- setNodes((nodes) => {
147
- const targetNode = nodes.find((node) => node.id === rfId);
148
- if (!targetNode || targetNode.type !== "actionNode") {
149
- return nodes;
150
- }
151
- const remainingNodes = nodes.filter((node) => node.id !== rfId);
152
- const alignedNodes = alignNodes(
153
- remainingNodes,
154
- fixedXPosition,
155
- verticalSpacing
156
- );
157
- setSequentialEdgesIfChanged(setEdges, alignedNodes);
158
- return alignedNodes;
159
- });
160
- };
161
- };
162
- const createHandleRemoveInputKey = (setNodes) => {
163
- return (rfId, key) => {
164
- setNodes(
165
- (nds) => nds.map((n) => {
166
- if (n.id !== rfId) {
167
- return n;
168
- }
169
- const data = n.data;
170
- if (!data.step) {
171
- return n;
172
- }
173
- const nextInput = { ...data.step.input ?? {} };
174
- delete nextInput[key];
175
- const step = { ...data.step, input: nextInput };
176
- return { ...n, data: { ...data, step } };
177
- })
178
- );
179
- };
180
- };
181
- const createHandleReorderAndAlignNodes = (setNodes, setEdges, options) => {
182
- const { fixedXPosition, verticalSpacing } = options;
183
- return (updatedNode) => {
184
- setNodes((prevNodes) => {
185
- const updatedNodes = prevNodes.map(
186
- (node) => node.id === updatedNode.id ? updatedNode : node
187
- );
188
- const parameterNodes = updatedNodes.filter((node) => node.type === "parametersNode").sort((a, b) => a.position.y - b.position.y);
189
- const actionNodes = updatedNodes.filter((node) => node.type === "actionNode").sort((a, b) => a.position.y - b.position.y);
190
- const outputNodes = updatedNodes.filter((node) => node.type === "outputNode").sort((a, b) => a.position.y - b.position.y);
191
- const ordered = orderNodes(parameterNodes, actionNodes, outputNodes);
192
- const aligned = alignNodes(ordered, fixedXPosition, verticalSpacing);
193
- setSequentialEdgesIfChanged(setEdges, aligned);
194
- return aligned;
195
- });
196
- };
197
- };
198
- const createHandleUpdateField = (setNodes) => {
199
- return (rfId, field, value) => {
200
- setNodes(
201
- (nds) => nds.map((n) => {
202
- if (n.id !== rfId) {
203
- return n;
204
- }
205
- const data = n.data;
206
- if (!data.step) {
207
- return n;
208
- }
209
- const step = { ...data.step, [field]: value };
210
- return { ...n, data: { ...data, step } };
211
- })
212
- );
213
- };
214
- };
215
- const createHandleUpdateInput = (setNodes) => {
216
- return (rfId, key, value) => {
217
- setNodes(
218
- (nds) => nds.map((n) => {
219
- if (n.id !== rfId) {
220
- return n;
221
- }
222
- const data = n.data;
223
- if (!data.step) {
224
- return n;
225
- }
226
- const nextInput = { ...data.step.input ?? {}, [key]: value };
227
- const step = { ...data.step, input: nextInput };
228
- return { ...n, data: { ...data, step } };
229
- })
230
- );
231
- };
232
- };
233
- const collectStepOutputReferences = (nodes, parameterReferences) => {
234
- const referencesByNode = {};
235
- const sortedNodes = [...nodes].sort((a, b) => a.position.y - b.position.y);
236
- const accumulatedReferences = [...parameterReferences];
237
- const accumulatedSet = new Set(parameterReferences);
238
- sortedNodes.forEach((node) => {
239
- referencesByNode[node.id] = [...accumulatedReferences];
240
- const data = node.data;
241
- if (!data || !data.step) {
242
- return;
243
- }
244
- const { step, scaffolderActionOutputsById } = data;
245
- const stepId = step && typeof step.id === "string" && step.id.trim().length > 0 ? step.id : null;
246
- const actionId = step && typeof step.action === "string" && step.action.trim().length > 0 ? step.action : null;
247
- if (!stepId || !actionId) {
248
- return;
249
- }
250
- const outputKeys = /* @__PURE__ */ new Set();
251
- const schemaOutputs = scaffolderActionOutputsById?.[actionId];
252
- if (schemaOutputs && typeof schemaOutputs === "object") {
253
- Object.keys(schemaOutputs).forEach((key) => {
254
- if (key) {
255
- outputKeys.add(key);
256
- }
257
- });
258
- }
259
- const stepOutput = step.output;
260
- if (stepOutput && typeof stepOutput === "object") {
261
- Object.keys(stepOutput).forEach((key) => {
262
- if (key) {
263
- outputKeys.add(key);
264
- }
265
- });
266
- }
267
- outputKeys.forEach((outputKey) => {
268
- const reference = `\${{ steps['${stepId}'].output.${outputKey} }}`;
269
- if (!accumulatedSet.has(reference)) {
270
- accumulatedSet.add(reference);
271
- accumulatedReferences.push(reference);
272
- }
273
- });
274
- });
275
- return referencesByNode;
276
- };
277
- const createHandleUpdateOutput = (setNodes) => {
278
- return (rfId, updater) => {
279
- setNodes(
280
- (nodes) => nodes.map((node) => {
281
- if (node.id !== rfId || node.type !== "outputNode") {
282
- return node;
283
- }
284
- const data = node.data;
285
- const nextOutput = updater(data.output ?? {});
286
- return {
287
- ...node,
288
- data: {
289
- ...data,
290
- output: nextOutput
291
- }
292
- };
293
- })
294
- );
295
- };
296
- };
297
- const createHandleUpdateSections = (setNodes) => {
298
- return (rfId, updater) => {
299
- setNodes(
300
- (nodes) => nodes.map((node) => {
301
- if (node.id !== rfId || node.type !== "parametersNode") {
302
- return node;
303
- }
304
- const data = node.data;
305
- const previousSections = data.sections ?? normalizeParametersToSections(data.parameters);
306
- const nextSections = sanitizeSections(updater(previousSections));
307
- const nextParameters = sectionsToParametersValue(nextSections);
308
- return {
309
- ...node,
310
- data: {
311
- ...data,
312
- sections: nextSections,
313
- parameters: nextParameters
314
- }
315
- };
316
- })
317
- );
318
- };
319
- };
320
-
321
- export { collectStepOutputReferences, createHandleAddNode, createHandleRemoveInputKey, createHandleRemoveNode, createHandleReorderAndAlignNodes, createHandleUpdateField, createHandleUpdateInput, createHandleUpdateOutput, createHandleUpdateSections };
322
- //# sourceMappingURL=handlers.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"handlers.esm.js","sources":["../../../src/components/DesignerFlow/handlers.ts"],"sourcesContent":["import type { Dispatch, SetStateAction } from \"react\";\nimport type { Edge, Node } from \"@xyflow/react\";\nimport type { TaskStep } from \"@backstage/plugin-scaffolder-common\";\n\n// Stateful handlers that mutate nodes/edges in response to user interactions.\nimport type {\n ActionNodeData,\n AddNodeConfig,\n DesignerNodeType,\n OutputNodeData,\n ParametersNodeData,\n ParameterSectionDisplay,\n TemplateParametersValue,\n} from \"../Nodes/types\";\nimport { createSequentialEdges } from \"../../utils/createSequentialEdges\";\nimport {\n normalizeParametersToSections,\n sanitizeSections,\n sectionsToParametersValue,\n} from \"./parameterTransforms\";\nimport { alignNodes } from \"./nodeLayout\";\n\ntype SetNodes = Dispatch<SetStateAction<Node[]>>;\ntype SetEdges = Dispatch<SetStateAction<Edge[]>>;\n\ninterface CreateHandleAddNodeOptions {\n fixedXPosition: number;\n verticalSpacing: number;\n nodeDefaults: Partial<Node>;\n scaffolderActionIds: string[];\n scaffolderActionInputsById: Record<string, Record<string, unknown>>;\n scaffolderActionInputRequiredById: Record<string, string[]>;\n scaffolderActionOutputsById: Record<string, Record<string, unknown>>;\n}\n\ninterface CreateHandleRemoveNodeOptions {\n fixedXPosition: number;\n verticalSpacing: number;\n}\n\nconst orderNodes = (\n parameterNodes: Node[],\n actionNodes: Node[],\n outputNodes: Node[]\n) => [...parameterNodes, ...actionNodes, ...outputNodes];\n\nconst setSequentialEdgesIfChanged = (\n setEdges: SetEdges,\n alignedNodes: Node[]\n) => {\n setEdges((prevEdges) => {\n const nextEdges = createSequentialEdges(alignedNodes);\n if (\n prevEdges.length === nextEdges.length &&\n prevEdges.every(\n (edge, index) =>\n edge.source === nextEdges[index]?.source &&\n edge.target === nextEdges[index]?.target\n )\n ) {\n return prevEdges;\n }\n return nextEdges;\n });\n};\n\nexport const createHandleAddNode = (\n setNodes: SetNodes,\n setEdges: SetEdges,\n options: CreateHandleAddNodeOptions\n) => {\n const {\n fixedXPosition,\n verticalSpacing,\n nodeDefaults,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n } = options;\n\n return (config: AddNodeConfig) => {\n const {\n afterRfId,\n type = \"actionNode\",\n stepTemplate,\n outputTemplate,\n parametersTemplate,\n } = config;\n const nodeType: DesignerNodeType = type;\n\n setNodes((nodes) => {\n const parameterNodes = nodes.filter((n) => n.type === \"parametersNode\");\n const actionNodes = nodes.filter((n) => n.type === \"actionNode\");\n const outputNodes = nodes.filter((n) => n.type === \"outputNode\");\n\n const composeAndAlign = (\n nextParameters: Node[],\n nextActions: Node[],\n nextOutputs: Node[]\n ) => {\n const ordered = orderNodes(nextParameters, nextActions, nextOutputs);\n const aligned = alignNodes(ordered, fixedXPosition, verticalSpacing);\n setSequentialEdgesIfChanged(setEdges, aligned);\n return aligned;\n };\n\n if (nodeType === \"parametersNode\") {\n if (parameterNodes.length > 0) {\n return composeAndAlign(parameterNodes, actionNodes, outputNodes);\n }\n\n const rfParametersId = \"rf-parameters\";\n const initialParameters =\n parametersTemplate !== undefined\n ? (JSON.parse(\n JSON.stringify(parametersTemplate)\n ) as TemplateParametersValue)\n : undefined;\n\n const parameterNode: Node = {\n id: rfParametersId,\n type: \"parametersNode\",\n position: { x: fixedXPosition, y: 0 },\n data: {\n rfId: rfParametersId,\n parameters: initialParameters,\n sections: [],\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n } satisfies ParametersNodeData,\n ...nodeDefaults,\n };\n\n return composeAndAlign([parameterNode], actionNodes, outputNodes);\n }\n\n if (nodeType === \"outputNode\") {\n if (outputNodes.length > 0) {\n return composeAndAlign(parameterNodes, actionNodes, outputNodes);\n }\n\n const rfOutputId = \"rf-output\";\n const initialOutput =\n outputTemplate !== undefined && outputTemplate !== null\n ? (JSON.parse(JSON.stringify(outputTemplate)) as Record<\n string,\n unknown\n >)\n : {};\n\n const outputNode: Node = {\n id: rfOutputId,\n type: \"outputNode\",\n position: { x: fixedXPosition, y: 0 },\n data: {\n rfId: rfOutputId,\n output: initialOutput,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n },\n ...nodeDefaults,\n };\n\n return composeAndAlign(parameterNodes, actionNodes, [\n ...outputNodes,\n outputNode,\n ]);\n }\n\n const parametersPlaceholder = nodes.find(\n (n) => n.type === \"parametersNode\"\n );\n const parametersNodeId = parametersPlaceholder?.id ?? null;\n const parentIndex = actionNodes.findIndex((n) => n.id === afterRfId);\n let insertIndex: number;\n if (parentIndex >= 0) {\n insertIndex = parentIndex + 1;\n } else if (afterRfId === parametersNodeId) {\n insertIndex = 0;\n } else {\n insertIndex = actionNodes.length;\n }\n\n const rfId = `rf-${Date.now()}`;\n const stepDefaults: TaskStep = {\n id: `step-${rfId}`,\n name: \"New Step\",\n action: \"\",\n input: {},\n };\n\n const newStep: TaskStep = {\n ...stepDefaults,\n ...(stepTemplate ?? {}),\n };\n\n const newNode: Node = {\n id: rfId,\n type: \"actionNode\",\n position: { x: fixedXPosition, y: 0 },\n data: {\n rfId,\n step: newStep,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n },\n ...nodeDefaults,\n };\n\n const nextActionNodes = [\n ...actionNodes.slice(0, insertIndex),\n newNode,\n ...actionNodes.slice(insertIndex),\n ];\n\n return composeAndAlign(parameterNodes, nextActionNodes, outputNodes);\n });\n };\n};\n\nexport const createHandleRemoveNode = (\n setNodes: SetNodes,\n setEdges: SetEdges,\n options: CreateHandleRemoveNodeOptions\n) => {\n const { fixedXPosition, verticalSpacing } = options;\n\n return (rfId: string) => {\n setNodes((nodes) => {\n const targetNode = nodes.find((node) => node.id === rfId);\n if (!targetNode || targetNode.type !== \"actionNode\") {\n return nodes;\n }\n\n const remainingNodes = nodes.filter((node) => node.id !== rfId);\n const alignedNodes = alignNodes(\n remainingNodes,\n fixedXPosition,\n verticalSpacing\n );\n setSequentialEdgesIfChanged(setEdges, alignedNodes);\n return alignedNodes;\n });\n };\n};\n\nexport const createHandleRemoveInputKey = (setNodes: SetNodes) => {\n return (rfId: string, key: string) => {\n setNodes((nds) =>\n nds.map((n) => {\n if (n.id !== rfId) {\n return n;\n }\n\n const data = n.data as Partial<ActionNodeData>;\n if (!data.step) {\n return n;\n }\n const nextInput = { ...(data.step.input ?? {}) };\n delete nextInput[key];\n const step = { ...data.step, input: nextInput };\n\n return { ...n, data: { ...data, step } };\n })\n );\n };\n};\n\nexport const createHandleReorderAndAlignNodes = (\n setNodes: SetNodes,\n setEdges: SetEdges,\n options: { fixedXPosition: number; verticalSpacing: number }\n) => {\n const { fixedXPosition, verticalSpacing } = options;\n\n return (updatedNode: Node) => {\n setNodes((prevNodes) => {\n const updatedNodes = prevNodes.map((node) =>\n node.id === updatedNode.id ? updatedNode : node\n );\n\n const parameterNodes = updatedNodes\n .filter((node) => node.type === \"parametersNode\")\n .sort((a, b) => a.position.y - b.position.y);\n const actionNodes = updatedNodes\n .filter((node) => node.type === \"actionNode\")\n .sort((a, b) => a.position.y - b.position.y);\n const outputNodes = updatedNodes\n .filter((node) => node.type === \"outputNode\")\n .sort((a, b) => a.position.y - b.position.y);\n\n const ordered = orderNodes(parameterNodes, actionNodes, outputNodes);\n const aligned = alignNodes(ordered, fixedXPosition, verticalSpacing);\n\n setSequentialEdgesIfChanged(setEdges, aligned);\n return aligned;\n });\n };\n};\n\nexport const createHandleUpdateField = (setNodes: SetNodes) => {\n return (rfId: string, field: keyof TaskStep, value: string) => {\n setNodes((nds) =>\n nds.map((n) => {\n if (n.id !== rfId) {\n return n;\n }\n\n const data = n.data as Partial<ActionNodeData>;\n if (!data.step) {\n return n;\n }\n const step = { ...data.step, [field]: value };\n\n return { ...n, data: { ...data, step } };\n })\n );\n };\n};\n\nexport const createHandleUpdateInput = (setNodes: SetNodes) => {\n return (rfId: string, key: string, value: unknown) => {\n setNodes((nds) =>\n nds.map((n) => {\n if (n.id !== rfId) {\n return n;\n }\n\n const data = n.data as Partial<ActionNodeData>;\n if (!data.step) {\n return n;\n }\n const nextInput = { ...(data.step.input ?? {}), [key]: value };\n const step = { ...data.step, input: nextInput };\n\n return { ...n, data: { ...data, step } };\n })\n );\n };\n};\n\nexport const collectStepOutputReferences = (\n nodes: Node[],\n parameterReferences: string[]\n): Record<string, string[]> => {\n const referencesByNode: Record<string, string[]> = {};\n const sortedNodes = [...nodes].sort((a, b) => a.position.y - b.position.y);\n const accumulatedReferences: string[] = [...parameterReferences];\n const accumulatedSet = new Set<string>(parameterReferences);\n\n sortedNodes.forEach((node) => {\n referencesByNode[node.id] = [...accumulatedReferences];\n\n const data = node.data as Partial<ActionNodeData> | undefined;\n if (!data || !data.step) {\n return;\n }\n\n const { step, scaffolderActionOutputsById } = data;\n const stepId =\n step && typeof step.id === \"string\" && step.id.trim().length > 0\n ? step.id\n : null;\n const actionId =\n step && typeof step.action === \"string\" && step.action.trim().length > 0\n ? step.action\n : null;\n\n if (!stepId || !actionId) {\n return;\n }\n\n const outputKeys = new Set<string>();\n const schemaOutputs = scaffolderActionOutputsById?.[actionId];\n if (schemaOutputs && typeof schemaOutputs === \"object\") {\n Object.keys(schemaOutputs).forEach((key) => {\n if (key) {\n outputKeys.add(key);\n }\n });\n }\n\n const stepOutput = (step as { output?: Record<string, unknown> }).output;\n if (stepOutput && typeof stepOutput === \"object\") {\n Object.keys(stepOutput).forEach((key) => {\n if (key) {\n outputKeys.add(key);\n }\n });\n }\n\n outputKeys.forEach((outputKey) => {\n const reference = `\\${{ steps['${stepId}'].output.${outputKey} }}`;\n if (!accumulatedSet.has(reference)) {\n accumulatedSet.add(reference);\n accumulatedReferences.push(reference);\n }\n });\n });\n\n return referencesByNode;\n};\n\nexport const createHandleUpdateOutput = (setNodes: SetNodes) => {\n return (\n rfId: string,\n updater: (prev: OutputNodeData[\"output\"]) => OutputNodeData[\"output\"]\n ) => {\n setNodes((nodes) =>\n nodes.map((node) => {\n if (node.id !== rfId || node.type !== \"outputNode\") {\n return node;\n }\n const data = node.data as OutputNodeData;\n const nextOutput = updater(data.output ?? {});\n return {\n ...node,\n data: {\n ...data,\n output: nextOutput,\n },\n };\n })\n );\n };\n};\n\nexport const createHandleUpdateSections = (setNodes: SetNodes) => {\n return (\n rfId: string,\n updater: (prev: ParameterSectionDisplay[]) => ParameterSectionDisplay[]\n ) => {\n setNodes((nodes) =>\n nodes.map((node) => {\n if (node.id !== rfId || node.type !== \"parametersNode\") {\n return node;\n }\n const data = node.data as ParametersNodeData;\n const previousSections =\n data.sections ?? normalizeParametersToSections(data.parameters);\n const nextSections = sanitizeSections(updater(previousSections));\n const nextParameters = sectionsToParametersValue(nextSections);\n return {\n ...node,\n data: {\n ...data,\n sections: nextSections,\n parameters: nextParameters,\n },\n };\n })\n );\n };\n};\n"],"names":[],"mappings":"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"}
@@ -1,185 +0,0 @@
1
- import { alignNodes } from './nodeLayout.esm.js';
2
- import { normalizeParametersToSections } from './parameterTransforms.esm.js';
3
- import { nodeDefaults, FLOW_LAYOUT } from './flowConfig.esm.js';
4
-
5
- const sanitizeForRfId = (value) => value.replace(/[^a-zA-Z0-9-_.:]/g, "_");
6
- const buildRfId = (step, index) => {
7
- if (step && typeof step.id === "string" && step.id.trim().length > 0) {
8
- return `rf-${sanitizeForRfId(step.id)}-${index}`;
9
- }
10
- return `rf-${index + 1}`;
11
- };
12
- const cloneStep = (step) => JSON.parse(JSON.stringify(step ?? {}));
13
- const cloneOutput = (output) => JSON.parse(JSON.stringify(output ?? {}));
14
- const cloneParameters = (parameters) => parameters === void 0 ? void 0 : JSON.parse(JSON.stringify(parameters));
15
- const buildNodesFromModel = (steps, parameters, output, options) => {
16
- const {
17
- scaffolderActionIds,
18
- scaffolderActionInputsById,
19
- scaffolderActionOutputsById,
20
- scaffolderActionInputRequiredById
21
- } = options;
22
- const parameterSections = normalizeParametersToSections(parameters);
23
- const nodes = [];
24
- const rfParametersId = "rf-parameters";
25
- nodes.push({
26
- id: rfParametersId,
27
- type: "parametersNode",
28
- position: { x: FLOW_LAYOUT.fixedXPosition, y: 0 },
29
- data: {
30
- rfId: rfParametersId,
31
- parameters: cloneParameters(parameters),
32
- sections: parameterSections,
33
- scaffolderActionIds,
34
- scaffolderActionInputsById,
35
- scaffolderActionInputRequiredById,
36
- scaffolderActionOutputsById
37
- },
38
- ...nodeDefaults
39
- });
40
- const actionNodes = steps.map((step, index) => {
41
- const rfId = buildRfId(step, index);
42
- return {
43
- id: rfId,
44
- type: "actionNode",
45
- position: { x: FLOW_LAYOUT.fixedXPosition, y: 0 },
46
- data: {
47
- rfId,
48
- step: cloneStep(step),
49
- scaffolderActionIds,
50
- scaffolderActionInputsById,
51
- scaffolderActionInputRequiredById,
52
- scaffolderActionOutputsById
53
- },
54
- ...nodeDefaults
55
- };
56
- });
57
- nodes.push(...actionNodes);
58
- if (output !== void 0 && output !== null) {
59
- const rfOutputId = "rf-output";
60
- nodes.push({
61
- id: rfOutputId,
62
- type: "outputNode",
63
- position: { x: FLOW_LAYOUT.fixedXPosition, y: 0 },
64
- data: {
65
- rfId: rfOutputId,
66
- output: cloneOutput(output),
67
- scaffolderActionIds,
68
- scaffolderActionInputsById,
69
- scaffolderActionInputRequiredById,
70
- scaffolderActionOutputsById
71
- },
72
- ...nodeDefaults
73
- });
74
- }
75
- return alignNodes(
76
- nodes,
77
- FLOW_LAYOUT.fixedXPosition,
78
- FLOW_LAYOUT.verticalSpacing
79
- );
80
- };
81
- const collectParameterReferences = (parameters) => {
82
- const refs = /* @__PURE__ */ new Set();
83
- const extractProperties = (schema) => {
84
- if (!schema || typeof schema !== "object") {
85
- return;
86
- }
87
- const record = schema;
88
- if (record.properties && typeof record.properties === "object") {
89
- Object.keys(record.properties).forEach(
90
- (key) => {
91
- if (key) {
92
- refs.add(`\${{ parameters.${key} }}`);
93
- }
94
- }
95
- );
96
- }
97
- if (Array.isArray(record.steps)) {
98
- record.steps.forEach((stepSchema) => {
99
- if (!stepSchema || typeof stepSchema !== "object") {
100
- return;
101
- }
102
- extractProperties(stepSchema.schema);
103
- });
104
- }
105
- };
106
- if (Array.isArray(parameters)) {
107
- parameters.forEach((item) => extractProperties(item));
108
- } else {
109
- extractProperties(parameters);
110
- }
111
- return Array.from(refs).sort();
112
- };
113
- const normalizeValueForStableStringify = (value) => {
114
- if (Array.isArray(value)) {
115
- return value.map(normalizeValueForStableStringify);
116
- }
117
- if (value && typeof value === "object") {
118
- const entries = Object.entries(value).filter(([key]) => key !== void 0).sort(([a], [b]) => {
119
- if (a > b) {
120
- return 1;
121
- }
122
- if (a < b) {
123
- return -1;
124
- }
125
- return 0;
126
- });
127
- return entries.reduce((acc, [key, val]) => {
128
- acc[key] = normalizeValueForStableStringify(val);
129
- return acc;
130
- }, {});
131
- }
132
- return value;
133
- };
134
- const stableStringify = (value) => JSON.stringify(normalizeValueForStableStringify(value));
135
- const resolveNodeHeightForTracking = (node) => {
136
- const measuredHeight = node.measured?.height;
137
- if (typeof measuredHeight === "number" && measuredHeight > 0) {
138
- return measuredHeight;
139
- }
140
- const explicitHeight = node.height;
141
- if (typeof explicitHeight === "number" && explicitHeight > 0) {
142
- return explicitHeight;
143
- }
144
- return void 0;
145
- };
146
- const sortNodesByY = (nodes) => [...nodes].sort((a, b) => a.position.y - b.position.y);
147
- const extractStepsFromNodes = (nodes) => {
148
- const sorted = sortNodesByY(nodes);
149
- return sorted.map((node) => {
150
- const data = node.data;
151
- if (!data || !data.step) {
152
- return void 0;
153
- }
154
- return cloneStep(data.step);
155
- }).filter((step) => !!step);
156
- };
157
- const extractParametersFromNodes = (nodes) => {
158
- const parametersNode = sortNodesByY(nodes).find(
159
- (node) => node.type === "parametersNode"
160
- );
161
- if (!parametersNode) {
162
- return void 0;
163
- }
164
- const data = parametersNode.data;
165
- if (!data) {
166
- return void 0;
167
- }
168
- return cloneParameters(data.parameters);
169
- };
170
- const extractOutputFromNodes = (nodes) => {
171
- const outputNode = sortNodesByY(nodes).find(
172
- (node) => node.type === "outputNode"
173
- );
174
- if (!outputNode) {
175
- return void 0;
176
- }
177
- const data = outputNode.data;
178
- if (!data) {
179
- return void 0;
180
- }
181
- return cloneOutput(data.output);
182
- };
183
-
184
- export { buildNodesFromModel, cloneOutput, cloneParameters, cloneStep, collectParameterReferences, extractOutputFromNodes, extractParametersFromNodes, extractStepsFromNodes, resolveNodeHeightForTracking, stableStringify };
185
- //# sourceMappingURL=model.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"model.esm.js","sources":["../../../src/components/DesignerFlow/model.ts"],"sourcesContent":["import type { Node } from \"@xyflow/react\";\n\n// Pure helpers for serializing/deserializing flow nodes and template models.\nimport type {\n TaskStep,\n ScaffolderTaskOutput,\n} from \"@backstage/plugin-scaffolder-common\";\nimport type {\n ActionNodeData,\n OutputNodeData,\n ParametersNodeData,\n TemplateParametersValue,\n} from \"../Nodes/types\";\nimport { alignNodes } from \"./nodeLayout\";\nimport { normalizeParametersToSections } from \"./parameterTransforms\";\nimport { FLOW_LAYOUT, nodeDefaults } from \"./flowConfig\";\n\nconst sanitizeForRfId = (value: string) =>\n value.replace(/[^a-zA-Z0-9-_.:]/g, \"_\");\n\nconst buildRfId = (step: TaskStep | undefined, index: number) => {\n if (step && typeof step.id === \"string\" && step.id.trim().length > 0) {\n return `rf-${sanitizeForRfId(step.id)}-${index}`;\n }\n return `rf-${index + 1}`;\n};\n\nexport const cloneStep = (step: TaskStep): TaskStep =>\n JSON.parse(JSON.stringify(step ?? {})) as TaskStep;\n\nexport const cloneOutput = (\n output: ScaffolderTaskOutput | undefined | null\n): ScaffolderTaskOutput =>\n JSON.parse(JSON.stringify(output ?? {})) as ScaffolderTaskOutput;\n\nexport const cloneParameters = (\n parameters: TemplateParametersValue\n): TemplateParametersValue =>\n parameters === undefined\n ? undefined\n : (JSON.parse(JSON.stringify(parameters)) as TemplateParametersValue);\n\nexport type BuildNodesFromModelOptions = {\n scaffolderActionIds: string[];\n scaffolderActionInputsById: Record<string, Record<string, unknown>>;\n scaffolderActionOutputsById: Record<string, Record<string, unknown>>;\n scaffolderActionInputRequiredById: Record<string, string[]>;\n};\n\nexport const buildNodesFromModel = (\n steps: TaskStep[],\n parameters: TemplateParametersValue,\n output: ScaffolderTaskOutput | undefined | null,\n options: BuildNodesFromModelOptions\n) => {\n const {\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n } = options;\n\n const parameterSections = normalizeParametersToSections(parameters);\n const nodes: Node[] = [];\n\n const rfParametersId = \"rf-parameters\";\n nodes.push({\n id: rfParametersId,\n type: \"parametersNode\",\n position: { x: FLOW_LAYOUT.fixedXPosition, y: 0 },\n data: {\n rfId: rfParametersId,\n parameters: cloneParameters(parameters),\n sections: parameterSections,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n },\n ...nodeDefaults,\n });\n\n const actionNodes = steps.map((step, index) => {\n const rfId = buildRfId(step, index);\n return {\n id: rfId,\n type: \"actionNode\",\n position: { x: FLOW_LAYOUT.fixedXPosition, y: 0 },\n data: {\n rfId,\n step: cloneStep(step),\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n },\n ...nodeDefaults,\n } as Node;\n });\n\n nodes.push(...actionNodes);\n\n if (output !== undefined && output !== null) {\n const rfOutputId = \"rf-output\";\n nodes.push({\n id: rfOutputId,\n type: \"outputNode\",\n position: { x: FLOW_LAYOUT.fixedXPosition, y: 0 },\n data: {\n rfId: rfOutputId,\n output: cloneOutput(output),\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n },\n ...nodeDefaults,\n });\n }\n\n return alignNodes(\n nodes,\n FLOW_LAYOUT.fixedXPosition,\n FLOW_LAYOUT.verticalSpacing\n );\n};\n\nexport const collectParameterReferences = (\n parameters: TemplateParametersValue\n): string[] => {\n const refs = new Set<string>();\n\n const extractProperties = (schema: unknown) => {\n if (!schema || typeof schema !== \"object\") {\n return;\n }\n\n const record = schema as Record<string, unknown>;\n if (record.properties && typeof record.properties === \"object\") {\n Object.keys(record.properties as Record<string, unknown>).forEach(\n (key) => {\n if (key) {\n refs.add(`\\${{ parameters.${key} }}`);\n }\n }\n );\n }\n\n if (Array.isArray(record.steps)) {\n record.steps.forEach((stepSchema) => {\n if (!stepSchema || typeof stepSchema !== \"object\") {\n return;\n }\n extractProperties((stepSchema as Record<string, unknown>).schema);\n });\n }\n };\n\n if (Array.isArray(parameters)) {\n parameters.forEach((item) => extractProperties(item));\n } else {\n extractProperties(parameters);\n }\n\n return Array.from(refs).sort();\n};\n\nconst normalizeValueForStableStringify = (value: unknown): unknown => {\n if (Array.isArray(value)) {\n return value.map(normalizeValueForStableStringify);\n }\n if (value && typeof value === \"object\") {\n const entries = Object.entries(value as Record<string, unknown>)\n .filter(([key]) => key !== undefined)\n .sort(([a], [b]) => {\n if (a > b) {\n return 1;\n }\n if (a < b) {\n return -1;\n }\n return 0;\n });\n return entries.reduce<Record<string, unknown>>((acc, [key, val]) => {\n acc[key] = normalizeValueForStableStringify(val);\n return acc;\n }, {});\n }\n return value;\n};\n\nexport const stableStringify = (value: unknown): string =>\n JSON.stringify(normalizeValueForStableStringify(value));\n\nexport const resolveNodeHeightForTracking = (\n node: Node\n): number | undefined => {\n const measuredHeight = node.measured?.height;\n if (typeof measuredHeight === \"number\" && measuredHeight > 0) {\n return measuredHeight;\n }\n\n const explicitHeight = node.height;\n if (typeof explicitHeight === \"number\" && explicitHeight > 0) {\n return explicitHeight;\n }\n\n return undefined;\n};\n\nconst sortNodesByY = (nodes: Node[]) =>\n [...nodes].sort((a, b) => a.position.y - b.position.y);\n\nexport const extractStepsFromNodes = (nodes: Node[]): TaskStep[] => {\n const sorted = sortNodesByY(nodes);\n return sorted\n .map((node) => {\n const data = node.data as ActionNodeData | undefined;\n if (!data || !data.step) {\n return undefined;\n }\n return cloneStep(data.step as TaskStep);\n })\n .filter((step): step is TaskStep => !!step);\n};\n\nexport const extractParametersFromNodes = (\n nodes: Node[]\n): TemplateParametersValue | undefined => {\n const parametersNode = sortNodesByY(nodes).find(\n (node) => node.type === \"parametersNode\"\n );\n if (!parametersNode) {\n return undefined;\n }\n const data = parametersNode.data as ParametersNodeData | undefined;\n if (!data) {\n return undefined;\n }\n return cloneParameters(data.parameters);\n};\n\nexport const extractOutputFromNodes = (\n nodes: Node[]\n): ScaffolderTaskOutput | undefined => {\n const outputNode = sortNodesByY(nodes).find(\n (node) => node.type === \"outputNode\"\n );\n if (!outputNode) {\n return undefined;\n }\n const data = outputNode.data as OutputNodeData | undefined;\n if (!data) {\n return undefined;\n }\n return cloneOutput(data.output);\n};\n"],"names":[],"mappings":"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"}