@tduniec/plugin-template-designer 0.2.1 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,85 @@
1
+ const MOCK_SCAFFOLDER_ACTIONS = [
2
+ {
3
+ id: "debug:log",
4
+ description: "Writes a message to the task log output.",
5
+ schema: {
6
+ input: {
7
+ required: ["message"],
8
+ properties: {
9
+ message: {
10
+ title: "Message",
11
+ type: "string",
12
+ description: "Free-form text that will be printed to the logs."
13
+ }
14
+ }
15
+ },
16
+ output: {
17
+ properties: {}
18
+ }
19
+ }
20
+ },
21
+ {
22
+ id: "fetch:template",
23
+ description: "Fetches contents from a git repository and places them in the workspace.",
24
+ schema: {
25
+ input: {
26
+ required: ["url"],
27
+ properties: {
28
+ url: {
29
+ title: "Repository URL",
30
+ type: "string",
31
+ description: "Location of the repository or template archive."
32
+ },
33
+ targetPath: {
34
+ title: "Target Path",
35
+ type: "string",
36
+ description: "Relative path where the files will be written.",
37
+ default: "."
38
+ }
39
+ }
40
+ },
41
+ output: {
42
+ properties: {
43
+ targetPath: {
44
+ type: "string",
45
+ description: "Path where the contents were written."
46
+ }
47
+ }
48
+ }
49
+ }
50
+ },
51
+ {
52
+ id: "catalog:register",
53
+ description: "Registers an entity in the Backstage catalog.",
54
+ schema: {
55
+ input: {
56
+ required: ["catalogInfoUrl"],
57
+ properties: {
58
+ catalogInfoUrl: {
59
+ title: "catalog-info.yaml URL",
60
+ type: "string",
61
+ description: "URL that points to the generated entity definition."
62
+ },
63
+ optional: {
64
+ title: "Optional",
65
+ type: "boolean",
66
+ description: "Mark the registration as optional and ignore failures.",
67
+ default: false
68
+ }
69
+ }
70
+ },
71
+ output: {
72
+ properties: {
73
+ entityRef: {
74
+ title: "Entity Ref",
75
+ type: "string",
76
+ description: "Entity reference for the registered component."
77
+ }
78
+ }
79
+ }
80
+ }
81
+ }
82
+ ];
83
+
84
+ export { MOCK_SCAFFOLDER_ACTIONS };
85
+ //# sourceMappingURL=mockScaffolderActions.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mockScaffolderActions.esm.js","sources":["../../src/api/mockScaffolderActions.ts"],"sourcesContent":["import type { ListActionsResponse } from \"@backstage/plugin-scaffolder-common\";\n\n/**\n * Minimal action metadata used whenever the real scaffolder service is\n * unavailable (e.g. developing the plugin standalone without a backend).\n */\nexport const MOCK_SCAFFOLDER_ACTIONS: ListActionsResponse = [\n {\n id: \"debug:log\",\n description: \"Writes a message to the task log output.\",\n schema: {\n input: {\n required: [\"message\"],\n properties: {\n message: {\n title: \"Message\",\n type: \"string\",\n description: \"Free-form text that will be printed to the logs.\",\n },\n },\n },\n output: {\n properties: {},\n },\n },\n },\n {\n id: \"fetch:template\",\n description:\n \"Fetches contents from a git repository and places them in the workspace.\",\n schema: {\n input: {\n required: [\"url\"],\n properties: {\n url: {\n title: \"Repository URL\",\n type: \"string\",\n description: \"Location of the repository or template archive.\",\n },\n targetPath: {\n title: \"Target Path\",\n type: \"string\",\n description: \"Relative path where the files will be written.\",\n default: \".\",\n },\n },\n },\n output: {\n properties: {\n targetPath: {\n type: \"string\",\n description: \"Path where the contents were written.\",\n },\n },\n },\n },\n },\n {\n id: \"catalog:register\",\n description: \"Registers an entity in the Backstage catalog.\",\n schema: {\n input: {\n required: [\"catalogInfoUrl\"],\n properties: {\n catalogInfoUrl: {\n title: \"catalog-info.yaml URL\",\n type: \"string\",\n description: \"URL that points to the generated entity definition.\",\n },\n optional: {\n title: \"Optional\",\n type: \"boolean\",\n description:\n \"Mark the registration as optional and ignore failures.\",\n default: false,\n },\n },\n },\n output: {\n properties: {\n entityRef: {\n title: \"Entity Ref\",\n type: \"string\",\n description: \"Entity reference for the registered component.\",\n },\n },\n },\n },\n },\n];\n"],"names":[],"mappings":"AAMO,MAAM,uBAAA,GAA+C;AAAA,EAC1D;AAAA,IACE,EAAA,EAAI,WAAA;AAAA,IACJ,WAAA,EAAa,0CAAA;AAAA,IACb,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,CAAC,SAAS,CAAA;AAAA,QACpB,UAAA,EAAY;AAAA,UACV,OAAA,EAAS;AAAA,YACP,KAAA,EAAO,SAAA;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf;AACF,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,YAAY;AAAC;AACf;AACF,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,gBAAA;AAAA,IACJ,WAAA,EACE,0EAAA;AAAA,IACF,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,CAAC,KAAK,CAAA;AAAA,QAChB,UAAA,EAAY;AAAA,UACV,GAAA,EAAK;AAAA,YACH,KAAA,EAAO,gBAAA;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,UAAA,EAAY;AAAA,YACV,KAAA,EAAO,aAAA;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,gDAAA;AAAA,YACb,OAAA,EAAS;AAAA;AACX;AACF,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,UAAA,EAAY;AAAA,UACV,UAAA,EAAY;AAAA,YACV,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf;AACF;AACF;AACF,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,kBAAA;AAAA,IACJ,WAAA,EAAa,+CAAA;AAAA,IACb,MAAA,EAAQ;AAAA,MACN,KAAA,EAAO;AAAA,QACL,QAAA,EAAU,CAAC,gBAAgB,CAAA;AAAA,QAC3B,UAAA,EAAY;AAAA,UACV,cAAA,EAAgB;AAAA,YACd,KAAA,EAAO,uBAAA;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA,WACf;AAAA,UACA,QAAA,EAAU;AAAA,YACR,KAAA,EAAO,UAAA;AAAA,YACP,IAAA,EAAM,SAAA;AAAA,YACN,WAAA,EACE,wDAAA;AAAA,YACF,OAAA,EAAS;AAAA;AACX;AACF,OACF;AAAA,MACA,MAAA,EAAQ;AAAA,QACN,UAAA,EAAY;AAAA,UACV,SAAA,EAAW;AAAA,YACT,KAAA,EAAO,YAAA;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa;AAAA;AACf;AACF;AACF;AACF;AAEJ;;;;"}
@@ -1,35 +1,50 @@
1
1
  import { useState, useEffect } from 'react';
2
- import { useApi } from '@backstage/core-plugin-api';
2
+ import { useApiHolder } from '@backstage/core-plugin-api';
3
3
  import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';
4
+ import { MOCK_SCAFFOLDER_ACTIONS } from './mockScaffolderActions.esm.js';
4
5
 
5
6
  const buildCache = (list) => {
6
- const { inputsById, outputsById } = list.reduce(
7
+ const { inputsById, outputsById, inputRequiredById } = list.reduce(
7
8
  (acc, action) => {
8
9
  acc.inputsById[action.id] = action.schema?.input?.properties ?? {};
9
10
  acc.outputsById[action.id] = action.schema?.output?.properties ?? {};
11
+ const required = Array.isArray(action.schema?.input?.required) ? action.schema?.input?.required.filter(
12
+ (key) => typeof key === "string" && key.trim().length > 0
13
+ ) : [];
14
+ acc.inputRequiredById[action.id] = required;
10
15
  return acc;
11
16
  },
12
- { inputsById: {}, outputsById: {} }
17
+ { inputsById: {}, outputsById: {}, inputRequiredById: {} }
13
18
  );
14
19
  return {
15
20
  ids: list.map((action) => action.id),
16
21
  inputsById,
17
- outputsById
22
+ outputsById,
23
+ inputRequiredById
18
24
  };
19
25
  };
26
+ const fallbackCache = buildCache(MOCK_SCAFFOLDER_ACTIONS);
20
27
  const useScaffolderActions = () => {
21
- const scaffolderApi = useApi(scaffolderApiRef);
22
- const [cache, setCache] = useState(
23
- () => buildCache([])
24
- );
28
+ const apiHolder = useApiHolder();
29
+ const scaffolderApi = apiHolder.get(scaffolderApiRef);
30
+ const [cache, setCache] = useState(fallbackCache);
25
31
  useEffect(() => {
26
32
  let cancelled = false;
33
+ if (!scaffolderApi) {
34
+ setCache(fallbackCache);
35
+ return () => {
36
+ cancelled = true;
37
+ };
38
+ }
27
39
  scaffolderApi.listActions().then((remoteActions) => {
28
40
  if (cancelled) {
29
41
  return;
30
42
  }
31
43
  setCache(buildCache(remoteActions));
32
44
  }).catch(() => {
45
+ if (!cancelled) {
46
+ setCache(fallbackCache);
47
+ }
33
48
  });
34
49
  return () => {
35
50
  cancelled = true;
@@ -1 +1 @@
1
- {"version":3,"file":"scaffolderActions.esm.js","sources":["../../src/api/scaffolderActions.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useApi } from \"@backstage/core-plugin-api\";\nimport { scaffolderApiRef } from \"@backstage/plugin-scaffolder-react\";\n\n// Encapsulated hook for loading/caching scaffolder action metadata.\n\ntype ScaffolderAction = {\n id: string;\n schema?: {\n input?: {\n properties?: Record<string, unknown>;\n };\n output?: {\n properties?: Record<string, unknown>;\n };\n };\n};\n\nexport type ScaffolderActionsCache = {\n ids: string[];\n inputsById: Record<string, Record<string, unknown>>;\n outputsById: Record<string, Record<string, unknown>>;\n};\n\nconst buildCache = (list: ScaffolderAction[]): ScaffolderActionsCache => {\n const { inputsById, outputsById } = list.reduce<{\n inputsById: Record<string, Record<string, unknown>>;\n outputsById: Record<string, Record<string, unknown>>;\n }>(\n (acc, action) => {\n acc.inputsById[action.id] = action.schema?.input?.properties ?? {};\n acc.outputsById[action.id] = action.schema?.output?.properties ?? {};\n return acc;\n },\n { inputsById: {}, outputsById: {} }\n );\n\n return {\n ids: list.map((action) => action.id),\n inputsById,\n outputsById,\n };\n};\n\nexport const useScaffolderActions = () => {\n const scaffolderApi = useApi(scaffolderApiRef);\n const [cache, setCache] = useState<ScaffolderActionsCache>(() =>\n buildCache([])\n );\n\n useEffect(() => {\n let cancelled = false;\n\n scaffolderApi\n .listActions()\n .then((remoteActions) => {\n if (cancelled) {\n return;\n }\n setCache(buildCache(remoteActions));\n })\n .catch(() => {});\n\n return () => {\n cancelled = true;\n };\n }, [scaffolderApi]);\n\n return cache;\n};\n"],"names":[],"mappings":";;;;AAwBA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAqD;AACvE,EAAA,MAAM,EAAE,UAAA,EAAY,WAAA,EAAY,GAAI,IAAA,CAAK,MAAA;AAAA,IAIvC,CAAC,KAAK,MAAA,KAAW;AACf,MAAA,GAAA,CAAI,UAAA,CAAW,OAAO,EAAE,CAAA,GAAI,OAAO,MAAA,EAAQ,KAAA,EAAO,cAAc,EAAC;AACjE,MAAA,GAAA,CAAI,WAAA,CAAY,OAAO,EAAE,CAAA,GAAI,OAAO,MAAA,EAAQ,MAAA,EAAQ,cAAc,EAAC;AACnE,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IACA,EAAE,UAAA,EAAY,EAAC,EAAG,WAAA,EAAa,EAAC;AAAE,GACpC;AAEA,EAAA,OAAO;AAAA,IACL,KAAK,IAAA,CAAK,GAAA,CAAI,CAAC,MAAA,KAAW,OAAO,EAAE,CAAA;AAAA,IACnC,UAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;AAEO,MAAM,uBAAuB,MAAM;AACxC,EAAA,MAAM,aAAA,GAAgB,OAAO,gBAAgB,CAAA;AAC7C,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,QAAA;AAAA,IAAiC,MACzD,UAAA,CAAW,EAAE;AAAA,GACf;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,aAAA,CACG,WAAA,EAAY,CACZ,IAAA,CAAK,CAAC,aAAA,KAAkB;AACvB,MAAA,IAAI,SAAA,EAAW;AACb,QAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,UAAA,CAAW,aAAa,CAAC,CAAA;AAAA,IACpC,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AAAA,IAAC,CAAC,CAAA;AAEjB,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,OAAO,KAAA;AACT;;;;"}
1
+ {"version":3,"file":"scaffolderActions.esm.js","sources":["../../src/api/scaffolderActions.ts"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { useApiHolder } from \"@backstage/core-plugin-api\";\nimport { scaffolderApiRef } from \"@backstage/plugin-scaffolder-react\";\nimport { MOCK_SCAFFOLDER_ACTIONS } from \"./mockScaffolderActions\";\n\n// Encapsulated hook for loading/caching scaffolder action metadata.\n\ntype ScaffolderAction = {\n id: string;\n schema?: {\n input?: {\n properties?: Record<string, unknown>;\n required?: unknown;\n };\n output?: {\n properties?: Record<string, unknown>;\n };\n };\n};\n\nexport type ScaffolderActionsCache = {\n ids: string[];\n inputsById: Record<string, Record<string, unknown>>;\n outputsById: Record<string, Record<string, unknown>>;\n inputRequiredById: Record<string, string[]>;\n};\n\nconst buildCache = (list: ScaffolderAction[]): ScaffolderActionsCache => {\n const { inputsById, outputsById, inputRequiredById } = list.reduce<{\n inputsById: Record<string, Record<string, unknown>>;\n outputsById: Record<string, Record<string, unknown>>;\n inputRequiredById: Record<string, string[]>;\n }>(\n (acc, action) => {\n acc.inputsById[action.id] = action.schema?.input?.properties ?? {};\n acc.outputsById[action.id] = action.schema?.output?.properties ?? {};\n const required = Array.isArray(action.schema?.input?.required)\n ? action.schema?.input?.required.filter(\n (key): key is string =>\n typeof key === \"string\" && key.trim().length > 0\n )\n : [];\n acc.inputRequiredById[action.id] = required;\n return acc;\n },\n { inputsById: {}, outputsById: {}, inputRequiredById: {} }\n );\n\n return {\n ids: list.map((action) => action.id),\n inputsById,\n outputsById,\n inputRequiredById,\n };\n};\n\nconst fallbackCache = buildCache(MOCK_SCAFFOLDER_ACTIONS);\n\nexport const useScaffolderActions = () => {\n const apiHolder = useApiHolder();\n const scaffolderApi = apiHolder.get(scaffolderApiRef);\n const [cache, setCache] = useState<ScaffolderActionsCache>(fallbackCache);\n\n useEffect(() => {\n let cancelled = false;\n\n if (!scaffolderApi) {\n setCache(fallbackCache);\n return () => {\n cancelled = true;\n };\n }\n\n scaffolderApi\n .listActions()\n .then((remoteActions) => {\n if (cancelled) {\n return;\n }\n setCache(buildCache(remoteActions));\n })\n .catch(() => {\n if (!cancelled) {\n setCache(fallbackCache);\n }\n });\n\n return () => {\n cancelled = true;\n };\n }, [scaffolderApi]);\n\n return cache;\n};\n"],"names":[],"mappings":";;;;;AA2BA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAqD;AACvE,EAAA,MAAM,EAAE,UAAA,EAAY,WAAA,EAAa,iBAAA,KAAsB,IAAA,CAAK,MAAA;AAAA,IAK1D,CAAC,KAAK,MAAA,KAAW;AACf,MAAA,GAAA,CAAI,UAAA,CAAW,OAAO,EAAE,CAAA,GAAI,OAAO,MAAA,EAAQ,KAAA,EAAO,cAAc,EAAC;AACjE,MAAA,GAAA,CAAI,WAAA,CAAY,OAAO,EAAE,CAAA,GAAI,OAAO,MAAA,EAAQ,MAAA,EAAQ,cAAc,EAAC;AACnE,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,QAAQ,CAAA,GACzD,MAAA,CAAO,MAAA,EAAQ,KAAA,EAAO,QAAA,CAAS,MAAA;AAAA,QAC7B,CAAC,QACC,OAAO,GAAA,KAAQ,YAAY,GAAA,CAAI,IAAA,GAAO,MAAA,GAAS;AAAA,UAEnD,EAAC;AACL,MAAA,GAAA,CAAI,iBAAA,CAAkB,MAAA,CAAO,EAAE,CAAA,GAAI,QAAA;AACnC,MAAA,OAAO,GAAA;AAAA,IACT,CAAA;AAAA,IACA,EAAE,YAAY,EAAC,EAAG,aAAa,EAAC,EAAG,iBAAA,EAAmB,EAAC;AAAE,GAC3D;AAEA,EAAA,OAAO;AAAA,IACL,KAAK,IAAA,CAAK,GAAA,CAAI,CAAC,MAAA,KAAW,OAAO,EAAE,CAAA;AAAA,IACnC,UAAA;AAAA,IACA,WAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;AAEA,MAAM,aAAA,GAAgB,WAAW,uBAAuB,CAAA;AAEjD,MAAM,uBAAuB,MAAM;AACxC,EAAA,MAAM,YAAY,YAAA,EAAa;AAC/B,EAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,GAAA,CAAI,gBAAgB,CAAA;AACpD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAiC,aAAa,CAAA;AAExE,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAA,GAAY,KAAA;AAEhB,IAAA,IAAI,CAAC,aAAA,EAAe;AAClB,MAAA,QAAA,CAAS,aAAa,CAAA;AACtB,MAAA,OAAO,MAAM;AACX,QAAA,SAAA,GAAY,IAAA;AAAA,MACd,CAAA;AAAA,IACF;AAEA,IAAA,aAAA,CACG,WAAA,EAAY,CACZ,IAAA,CAAK,CAAC,aAAA,KAAkB;AACvB,MAAA,IAAI,SAAA,EAAW;AACb,QAAA;AAAA,MACF;AACA,MAAA,QAAA,CAAS,UAAA,CAAW,aAAa,CAAC,CAAA;AAAA,IACpC,CAAC,CAAA,CACA,KAAA,CAAM,MAAM;AACX,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,QAAA,CAAS,aAAa,CAAA;AAAA,MACxB;AAAA,IACF,CAAC,CAAA;AAEH,IAAA,OAAO,MAAM;AACX,MAAA,SAAA,GAAY,IAAA;AAAA,IACd,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,aAAa,CAAC,CAAA;AAElB,EAAA,OAAO,KAAA;AACT;;;;"}
@@ -3,7 +3,7 @@ import { useMemo, useState, useRef, useEffect, useCallback } from 'react';
3
3
  import { useNodesState, applyNodeChanges, applyEdgeChanges, addEdge, ReactFlow } from '@xyflow/react';
4
4
  import '@xyflow/react/dist/style.css';
5
5
  import { createSequentialEdges } from '../../utils/createSequentialEdges.esm.js';
6
- import { collectStepOutputReferences, createHandleReorderAndAlignNodes, createHandleUpdateField, createHandleUpdateInput, createHandleRemoveInputKey, createHandleUpdateOutput, createHandleUpdateSections, createHandleAddNode } from './handlers.esm.js';
6
+ import { collectStepOutputReferences, createHandleReorderAndAlignNodes, createHandleUpdateField, createHandleUpdateInput, createHandleRemoveInputKey, createHandleUpdateOutput, createHandleUpdateSections, createHandleAddNode, createHandleRemoveNode } from './handlers.esm.js';
7
7
  import { buildNodesFromModel, stableStringify, resolveNodeHeightForTracking, collectParameterReferences, extractStepsFromNodes, extractParametersFromNodes, extractOutputFromNodes } from './model.esm.js';
8
8
  import { alignNodes } from './nodeLayout.esm.js';
9
9
  import { nodeTypes, FLOW_LAYOUT, nodeDefaults } from './flowConfig.esm.js';
@@ -23,7 +23,8 @@ function App({
23
23
  const {
24
24
  ids: scaffolderActionIds,
25
25
  inputsById: scaffolderActionInputsById,
26
- outputsById: scaffolderActionOutputsById
26
+ outputsById: scaffolderActionOutputsById,
27
+ inputRequiredById: scaffolderActionInputRequiredById
27
28
  } = scaffolderActionsCache;
28
29
  const normalizedParametersProp = parameters ?? void 0;
29
30
  const normalizedOutputProp = output ?? null;
@@ -35,7 +36,8 @@ function App({
35
36
  {
36
37
  scaffolderActionIds,
37
38
  scaffolderActionInputsById,
38
- scaffolderActionOutputsById
39
+ scaffolderActionOutputsById,
40
+ scaffolderActionInputRequiredById
39
41
  }
40
42
  ),
41
43
  [
@@ -44,7 +46,8 @@ function App({
44
46
  normalizedOutputProp,
45
47
  scaffolderActionIds,
46
48
  scaffolderActionInputsById,
47
- scaffolderActionOutputsById
49
+ scaffolderActionOutputsById,
50
+ scaffolderActionInputRequiredById
48
51
  ]
49
52
  );
50
53
  const [nodes, setNodes] = useNodesState(initialNodes);
@@ -63,12 +66,14 @@ function App({
63
66
  () => stableStringify({
64
67
  ids: scaffolderActionIds,
65
68
  inputs: scaffolderActionInputsById,
66
- outputs: scaffolderActionOutputsById
69
+ outputs: scaffolderActionOutputsById,
70
+ inputRequired: scaffolderActionInputRequiredById
67
71
  }),
68
72
  [
69
73
  scaffolderActionIds,
70
74
  scaffolderActionInputsById,
71
- scaffolderActionOutputsById
75
+ scaffolderActionOutputsById,
76
+ scaffolderActionInputRequiredById
72
77
  ]
73
78
  );
74
79
  const lastAppliedModelHashRef = useRef(null);
@@ -96,7 +101,8 @@ function App({
96
101
  {
97
102
  scaffolderActionIds,
98
103
  scaffolderActionInputsById,
99
- scaffolderActionOutputsById
104
+ scaffolderActionOutputsById,
105
+ scaffolderActionInputRequiredById
100
106
  }
101
107
  );
102
108
  lastAppliedModelHashRef.current = modelHash;
@@ -114,6 +120,7 @@ function App({
114
120
  scaffolderActionIds,
115
121
  scaffolderActionInputsById,
116
122
  scaffolderActionOutputsById,
123
+ scaffolderActionInputRequiredById,
117
124
  setNodes,
118
125
  setEdges
119
126
  ]);
@@ -222,16 +229,25 @@ function App({
222
229
  nodeDefaults,
223
230
  scaffolderActionIds,
224
231
  scaffolderActionInputsById,
232
+ scaffolderActionInputRequiredById,
225
233
  scaffolderActionOutputsById
226
234
  }),
227
235
  [
228
236
  scaffolderActionIds,
229
237
  scaffolderActionInputsById,
230
238
  scaffolderActionOutputsById,
239
+ scaffolderActionInputRequiredById,
231
240
  setNodes,
232
241
  setEdges
233
242
  ]
234
243
  );
244
+ const handleRemoveNode = useMemo(
245
+ () => createHandleRemoveNode(setNodes, setEdges, {
246
+ fixedXPosition: FIXED_X_POSITION,
247
+ verticalSpacing: VERTICAL_SPACING
248
+ }),
249
+ [setNodes, setEdges]
250
+ );
235
251
  const nodesWithHandlers = useMemo(
236
252
  () => nodes.map((node) => {
237
253
  const stepOutputReferences = stepOutputReferencesByNode[node.id] ?? [];
@@ -265,6 +281,7 @@ function App({
265
281
  data: {
266
282
  ...data,
267
283
  onAddNode: handleAddNode,
284
+ onRemoveNode: handleRemoveNode,
268
285
  onUpdateField,
269
286
  onUpdateInput,
270
287
  onRemoveInputKey,
@@ -275,6 +292,7 @@ function App({
275
292
  [
276
293
  nodes,
277
294
  handleAddNode,
295
+ handleRemoveNode,
278
296
  onUpdateField,
279
297
  onUpdateInput,
280
298
  onRemoveInputKey,
@@ -1 +1 @@
1
- {"version":3,"file":"DesignerFlow.esm.js","sources":["../../../src/components/DesignerFlow/DesignerFlow.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { MouseEvent as ReactMouseEvent } from \"react\";\nimport {\n ReactFlow,\n applyNodeChanges,\n applyEdgeChanges,\n addEdge,\n Node,\n Edge,\n NodeChange,\n EdgeChange,\n useNodesState,\n ReactFlowInstance,\n} from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport type {\n ScaffolderTaskOutput,\n TaskStep,\n} from \"@backstage/plugin-scaffolder-common\";\nimport type {\n ActionNodeData,\n OutputNodeData,\n ParametersNodeData,\n TemplateParametersValue,\n} from \"../Nodes/types\";\nimport { createSequentialEdges } from \"../../utils/createSequentialEdges\";\nimport {\n collectStepOutputReferences,\n createHandleAddNode,\n createHandleRemoveInputKey,\n createHandleReorderAndAlignNodes,\n createHandleUpdateField,\n createHandleUpdateInput,\n createHandleUpdateOutput,\n createHandleUpdateSections,\n} from \"./handlers\";\nimport {\n buildNodesFromModel,\n collectParameterReferences,\n stableStringify,\n resolveNodeHeightForTracking,\n extractStepsFromNodes,\n extractParametersFromNodes,\n extractOutputFromNodes,\n} from \"./model\";\nimport { alignNodes } from \"./nodeLayout\";\nimport { FLOW_LAYOUT, nodeDefaults, nodeTypes } from \"./flowConfig\";\nimport { useScaffolderActions } from \"../../api/scaffolderActions\";\n\n// Main orchestration component that renders and synchronizes the Designer flow.\n\nconst FIXED_X_POSITION = FLOW_LAYOUT.fixedXPosition;\nconst VERTICAL_SPACING = FLOW_LAYOUT.verticalSpacing;\n\ntype DesignerFlowProps = {\n steps?: TaskStep[];\n parameters?: TemplateParametersValue;\n output?: ScaffolderTaskOutput | null;\n onStepsChange?: (steps: TaskStep[]) => void;\n onParametersChange?: (parameters: TemplateParametersValue) => void;\n onOutputChange?: (output: ScaffolderTaskOutput | undefined) => void;\n};\n\nexport default function App({\n steps = [],\n parameters,\n output,\n onStepsChange,\n onParametersChange,\n onOutputChange,\n}: DesignerFlowProps) {\n const scaffolderActionsCache = useScaffolderActions();\n\n const {\n ids: scaffolderActionIds,\n inputsById: scaffolderActionInputsById,\n outputsById: scaffolderActionOutputsById,\n } = scaffolderActionsCache;\n\n const normalizedParametersProp = parameters ?? undefined;\n const normalizedOutputProp = output ?? null;\n\n const initialNodes = useMemo(\n () =>\n buildNodesFromModel(\n steps,\n normalizedParametersProp,\n normalizedOutputProp,\n {\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n }\n ),\n [\n steps,\n normalizedParametersProp,\n normalizedOutputProp,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n ]\n );\n\n const [nodes, setNodes] = useNodesState(initialNodes);\n const [edges, setEdges] = useState<Edge[]>(() =>\n createSequentialEdges(initialNodes)\n );\n\n const modelHash = useMemo(\n () =>\n stableStringify({\n steps,\n parameters: normalizedParametersProp,\n output: normalizedOutputProp,\n }),\n [steps, normalizedParametersProp, normalizedOutputProp]\n );\n\n const cacheFingerprint = useMemo(\n () =>\n stableStringify({\n ids: scaffolderActionIds,\n inputs: scaffolderActionInputsById,\n outputs: scaffolderActionOutputsById,\n }),\n [\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n ]\n );\n\n const lastAppliedModelHashRef = useRef<string | null>(null);\n const lastEmittedModelHashRef = useRef<string | null>(null);\n const skipNextModelHashRef = useRef<string | null>(null);\n const lastCacheFingerprintRef = useRef<string | null>(null);\n const nodeHeightsRef = useRef<Record<string, number>>({});\n const shouldAutoFitViewRef = useRef(true);\n\n useEffect(() => {\n const isCacheChanged = cacheFingerprint !== lastCacheFingerprintRef.current;\n const shouldSkip =\n modelHash === skipNextModelHashRef.current && !isCacheChanged;\n\n if (shouldSkip) {\n skipNextModelHashRef.current = null;\n lastAppliedModelHashRef.current = modelHash;\n lastCacheFingerprintRef.current = cacheFingerprint;\n return;\n }\n\n if (modelHash === lastAppliedModelHashRef.current && !isCacheChanged) {\n return;\n }\n\n const nextNodes = buildNodesFromModel(\n steps,\n normalizedParametersProp,\n normalizedOutputProp,\n {\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n }\n );\n\n lastAppliedModelHashRef.current = modelHash;\n lastCacheFingerprintRef.current = cacheFingerprint;\n lastEmittedModelHashRef.current = modelHash;\n\n setNodes(nextNodes);\n setEdges(createSequentialEdges(nextNodes));\n shouldAutoFitViewRef.current = true;\n }, [\n steps,\n normalizedParametersProp,\n normalizedOutputProp,\n modelHash,\n cacheFingerprint,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n setNodes,\n setEdges,\n ]);\n\n useEffect(() => {\n if (!nodes.length) {\n return;\n }\n\n if (nodes.some((node) => node.dragging)) {\n return;\n }\n\n const activeNodeIds = new Set<string>();\n let hasMeasuredChange = false;\n\n nodes.forEach((node) => {\n activeNodeIds.add(node.id);\n const measuredHeight = resolveNodeHeightForTracking(node);\n if (typeof measuredHeight !== \"number\") {\n return;\n }\n const previousHeight = nodeHeightsRef.current[node.id];\n if (previousHeight !== measuredHeight) {\n nodeHeightsRef.current[node.id] = measuredHeight;\n hasMeasuredChange = true;\n }\n });\n\n Object.keys(nodeHeightsRef.current).forEach((id) => {\n if (!activeNodeIds.has(id)) {\n delete nodeHeightsRef.current[id];\n }\n });\n\n if (!hasMeasuredChange) {\n return;\n }\n\n setNodes((currentNodes) => {\n const alignedNodes = alignNodes(\n currentNodes,\n FIXED_X_POSITION,\n VERTICAL_SPACING\n );\n const positionsChanged = alignedNodes.some((node, index) => {\n const previousNode = currentNodes[index];\n if (!previousNode) {\n return true;\n }\n return (\n node.position.x !== previousNode.position.x ||\n node.position.y !== previousNode.position.y\n );\n });\n\n return positionsChanged ? alignedNodes : currentNodes;\n });\n }, [nodes, setNodes]);\n\n const parameterReferences = useMemo(\n () => collectParameterReferences(normalizedParametersProp),\n [normalizedParametersProp]\n );\n\n const stepOutputReferencesByNode = useMemo(\n () => collectStepOutputReferences(nodes, parameterReferences),\n [nodes, parameterReferences]\n );\n\n const onNodesChange = useCallback(\n (changes: NodeChange<Node>[]) =>\n setNodes((ns) => applyNodeChanges(changes, ns)),\n [setNodes]\n );\n\n const onEdgesChange = useCallback(\n (changes: EdgeChange<Edge>[]) =>\n setEdges((es) => applyEdgeChanges(changes, es)),\n [setEdges]\n );\n\n const onConnect = useCallback(\n (params: any) => setEdges((es) => addEdge(params, es)),\n [setEdges]\n );\n\n const reorderAndAlignNodes = useMemo(\n () =>\n createHandleReorderAndAlignNodes(setNodes, setEdges, {\n fixedXPosition: FIXED_X_POSITION,\n verticalSpacing: VERTICAL_SPACING,\n }),\n [setNodes, setEdges]\n );\n\n const onNodeDragStop = useCallback(\n (_: ReactMouseEvent, node: Node) => {\n reorderAndAlignNodes(node);\n },\n [reorderAndAlignNodes]\n );\n\n const onUpdateField = useMemo(\n () => createHandleUpdateField(setNodes),\n [setNodes]\n );\n\n const onUpdateInput = useMemo(\n () => createHandleUpdateInput(setNodes),\n [setNodes]\n );\n\n const onRemoveInputKey = useMemo(\n () => createHandleRemoveInputKey(setNodes),\n [setNodes]\n );\n\n const onUpdateOutput = useMemo(\n () => createHandleUpdateOutput(setNodes),\n [setNodes]\n );\n\n const onUpdateSections = useMemo(\n () => createHandleUpdateSections(setNodes),\n [setNodes]\n );\n\n const handleAddNode = useMemo(\n () =>\n createHandleAddNode(setNodes, setEdges, {\n fixedXPosition: FIXED_X_POSITION,\n verticalSpacing: VERTICAL_SPACING,\n nodeDefaults,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n }),\n [\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n setNodes,\n setEdges,\n ]\n );\n\n const nodesWithHandlers = useMemo(\n () =>\n nodes.map((node) => {\n const stepOutputReferences = stepOutputReferencesByNode[node.id] ?? [];\n if (node.type === \"parametersNode\") {\n const data = node.data as ParametersNodeData;\n return {\n ...node,\n data: {\n ...data,\n onAddNode: handleAddNode,\n onUpdateSections,\n stepOutputReferences,\n },\n };\n }\n if (node.type === \"outputNode\") {\n const data = node.data as OutputNodeData;\n return {\n ...node,\n data: {\n ...data,\n onAddNode: handleAddNode,\n onUpdateOutput,\n stepOutputReferences,\n },\n };\n }\n\n const data = node.data as ActionNodeData;\n return {\n ...node,\n data: {\n ...data,\n onAddNode: handleAddNode,\n onUpdateField,\n onUpdateInput,\n onRemoveInputKey,\n stepOutputReferences,\n },\n };\n }),\n [\n nodes,\n handleAddNode,\n onUpdateField,\n onUpdateInput,\n onRemoveInputKey,\n onUpdateOutput,\n onUpdateSections,\n stepOutputReferencesByNode,\n ]\n );\n\n const stepsFromNodes = useMemo(() => extractStepsFromNodes(nodes), [nodes]);\n\n const parametersFromNodes = useMemo(\n () => extractParametersFromNodes(nodes),\n [nodes]\n );\n\n const outputFromNodes = useMemo(() => extractOutputFromNodes(nodes), [nodes]);\n\n const normalizedOutputFromNodes = outputFromNodes ?? null;\n\n useEffect(() => {\n if (!onStepsChange && !onParametersChange && !onOutputChange) {\n return;\n }\n const serialized = stableStringify({\n steps: stepsFromNodes,\n parameters: parametersFromNodes ?? null,\n output: normalizedOutputFromNodes,\n });\n if (serialized === lastEmittedModelHashRef.current) {\n return;\n }\n lastEmittedModelHashRef.current = serialized;\n skipNextModelHashRef.current = serialized;\n if (onStepsChange) {\n onStepsChange(stepsFromNodes);\n }\n if (onParametersChange) {\n onParametersChange(parametersFromNodes ?? undefined);\n }\n if (onOutputChange) {\n onOutputChange(outputFromNodes);\n }\n }, [\n stepsFromNodes,\n parametersFromNodes,\n normalizedOutputFromNodes,\n outputFromNodes,\n onStepsChange,\n onParametersChange,\n onOutputChange,\n ]);\n\n const fitViewOptions = useMemo(() => ({ padding: 0.2, duration: 300 }), []);\n const [reactFlowInstance, setReactFlowInstance] =\n useState<ReactFlowInstance | null>(null);\n\n const fitFlowToView = useCallback(() => {\n if (!reactFlowInstance) {\n return;\n }\n reactFlowInstance.fitView(fitViewOptions);\n }, [fitViewOptions, reactFlowInstance]);\n\n useEffect(() => {\n if (!reactFlowInstance) {\n return;\n }\n if (!shouldAutoFitViewRef.current) {\n return;\n }\n shouldAutoFitViewRef.current = false;\n fitFlowToView();\n }, [fitFlowToView, nodes, edges, reactFlowInstance]);\n\n useEffect(() => {\n if (!reactFlowInstance) {\n return undefined;\n }\n window.addEventListener(\"resize\", fitFlowToView);\n return () => {\n window.removeEventListener(\"resize\", fitFlowToView);\n };\n }, [fitFlowToView, reactFlowInstance]);\n\n return (\n <div style={{ width: \"100%\", height: \"100%\", minHeight: \"70vh\" }}>\n <ReactFlow\n nodes={nodesWithHandlers}\n edges={edges}\n nodeTypes={nodeTypes}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onNodeDragStop={onNodeDragStop}\n onConnect={onConnect}\n fitView\n onInit={setReactFlowInstance}\n fitViewOptions={fitViewOptions}\n />\n </div>\n );\n}\n"],"names":["data"],"mappings":"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"}
1
+ {"version":3,"file":"DesignerFlow.esm.js","sources":["../../../src/components/DesignerFlow/DesignerFlow.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport type { MouseEvent as ReactMouseEvent } from \"react\";\nimport {\n ReactFlow,\n applyNodeChanges,\n applyEdgeChanges,\n addEdge,\n Node,\n Edge,\n NodeChange,\n EdgeChange,\n useNodesState,\n ReactFlowInstance,\n} from \"@xyflow/react\";\nimport \"@xyflow/react/dist/style.css\";\nimport type {\n ScaffolderTaskOutput,\n TaskStep,\n} from \"@backstage/plugin-scaffolder-common\";\nimport type {\n ActionNodeData,\n OutputNodeData,\n ParametersNodeData,\n TemplateParametersValue,\n} from \"../Nodes/types\";\nimport { createSequentialEdges } from \"../../utils/createSequentialEdges\";\nimport {\n collectStepOutputReferences,\n createHandleAddNode,\n createHandleRemoveNode,\n createHandleRemoveInputKey,\n createHandleReorderAndAlignNodes,\n createHandleUpdateField,\n createHandleUpdateInput,\n createHandleUpdateOutput,\n createHandleUpdateSections,\n} from \"./handlers\";\nimport {\n buildNodesFromModel,\n collectParameterReferences,\n stableStringify,\n resolveNodeHeightForTracking,\n extractStepsFromNodes,\n extractParametersFromNodes,\n extractOutputFromNodes,\n} from \"./model\";\nimport { alignNodes } from \"./nodeLayout\";\nimport { FLOW_LAYOUT, nodeDefaults, nodeTypes } from \"./flowConfig\";\nimport { useScaffolderActions } from \"../../api/scaffolderActions\";\n\n// Main orchestration component that renders and synchronizes the Designer flow.\n\nconst FIXED_X_POSITION = FLOW_LAYOUT.fixedXPosition;\nconst VERTICAL_SPACING = FLOW_LAYOUT.verticalSpacing;\n\ntype DesignerFlowProps = {\n steps?: TaskStep[];\n parameters?: TemplateParametersValue;\n output?: ScaffolderTaskOutput | null;\n onStepsChange?: (steps: TaskStep[]) => void;\n onParametersChange?: (parameters: TemplateParametersValue) => void;\n onOutputChange?: (output: ScaffolderTaskOutput | undefined) => void;\n};\n\nexport default function App({\n steps = [],\n parameters,\n output,\n onStepsChange,\n onParametersChange,\n onOutputChange,\n}: DesignerFlowProps) {\n const scaffolderActionsCache = useScaffolderActions();\n\n const {\n ids: scaffolderActionIds,\n inputsById: scaffolderActionInputsById,\n outputsById: scaffolderActionOutputsById,\n inputRequiredById: scaffolderActionInputRequiredById,\n } = scaffolderActionsCache;\n\n const normalizedParametersProp = parameters ?? undefined;\n const normalizedOutputProp = output ?? null;\n\n const initialNodes = useMemo(\n () =>\n buildNodesFromModel(\n steps,\n normalizedParametersProp,\n normalizedOutputProp,\n {\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n }\n ),\n [\n steps,\n normalizedParametersProp,\n normalizedOutputProp,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n ]\n );\n\n const [nodes, setNodes] = useNodesState(initialNodes);\n const [edges, setEdges] = useState<Edge[]>(() =>\n createSequentialEdges(initialNodes)\n );\n\n const modelHash = useMemo(\n () =>\n stableStringify({\n steps,\n parameters: normalizedParametersProp,\n output: normalizedOutputProp,\n }),\n [steps, normalizedParametersProp, normalizedOutputProp]\n );\n\n const cacheFingerprint = useMemo(\n () =>\n stableStringify({\n ids: scaffolderActionIds,\n inputs: scaffolderActionInputsById,\n outputs: scaffolderActionOutputsById,\n inputRequired: scaffolderActionInputRequiredById,\n }),\n [\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n ]\n );\n\n const lastAppliedModelHashRef = useRef<string | null>(null);\n const lastEmittedModelHashRef = useRef<string | null>(null);\n const skipNextModelHashRef = useRef<string | null>(null);\n const lastCacheFingerprintRef = useRef<string | null>(null);\n const nodeHeightsRef = useRef<Record<string, number>>({});\n const shouldAutoFitViewRef = useRef(true);\n\n useEffect(() => {\n const isCacheChanged = cacheFingerprint !== lastCacheFingerprintRef.current;\n const shouldSkip =\n modelHash === skipNextModelHashRef.current && !isCacheChanged;\n\n if (shouldSkip) {\n skipNextModelHashRef.current = null;\n lastAppliedModelHashRef.current = modelHash;\n lastCacheFingerprintRef.current = cacheFingerprint;\n return;\n }\n\n if (modelHash === lastAppliedModelHashRef.current && !isCacheChanged) {\n return;\n }\n\n const nextNodes = buildNodesFromModel(\n steps,\n normalizedParametersProp,\n normalizedOutputProp,\n {\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n }\n );\n\n lastAppliedModelHashRef.current = modelHash;\n lastCacheFingerprintRef.current = cacheFingerprint;\n lastEmittedModelHashRef.current = modelHash;\n\n setNodes(nextNodes);\n setEdges(createSequentialEdges(nextNodes));\n shouldAutoFitViewRef.current = true;\n }, [\n steps,\n normalizedParametersProp,\n normalizedOutputProp,\n modelHash,\n cacheFingerprint,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n setNodes,\n setEdges,\n ]);\n\n useEffect(() => {\n if (!nodes.length) {\n return;\n }\n\n if (nodes.some((node) => node.dragging)) {\n return;\n }\n\n const activeNodeIds = new Set<string>();\n let hasMeasuredChange = false;\n\n nodes.forEach((node) => {\n activeNodeIds.add(node.id);\n const measuredHeight = resolveNodeHeightForTracking(node);\n if (typeof measuredHeight !== \"number\") {\n return;\n }\n const previousHeight = nodeHeightsRef.current[node.id];\n if (previousHeight !== measuredHeight) {\n nodeHeightsRef.current[node.id] = measuredHeight;\n hasMeasuredChange = true;\n }\n });\n\n Object.keys(nodeHeightsRef.current).forEach((id) => {\n if (!activeNodeIds.has(id)) {\n delete nodeHeightsRef.current[id];\n }\n });\n\n if (!hasMeasuredChange) {\n return;\n }\n\n setNodes((currentNodes) => {\n const alignedNodes = alignNodes(\n currentNodes,\n FIXED_X_POSITION,\n VERTICAL_SPACING\n );\n const positionsChanged = alignedNodes.some((node, index) => {\n const previousNode = currentNodes[index];\n if (!previousNode) {\n return true;\n }\n return (\n node.position.x !== previousNode.position.x ||\n node.position.y !== previousNode.position.y\n );\n });\n\n return positionsChanged ? alignedNodes : currentNodes;\n });\n }, [nodes, setNodes]);\n\n const parameterReferences = useMemo(\n () => collectParameterReferences(normalizedParametersProp),\n [normalizedParametersProp]\n );\n\n const stepOutputReferencesByNode = useMemo(\n () => collectStepOutputReferences(nodes, parameterReferences),\n [nodes, parameterReferences]\n );\n\n const onNodesChange = useCallback(\n (changes: NodeChange<Node>[]) =>\n setNodes((ns) => applyNodeChanges(changes, ns)),\n [setNodes]\n );\n\n const onEdgesChange = useCallback(\n (changes: EdgeChange<Edge>[]) =>\n setEdges((es) => applyEdgeChanges(changes, es)),\n [setEdges]\n );\n\n const onConnect = useCallback(\n (params: any) => setEdges((es) => addEdge(params, es)),\n [setEdges]\n );\n\n const reorderAndAlignNodes = useMemo(\n () =>\n createHandleReorderAndAlignNodes(setNodes, setEdges, {\n fixedXPosition: FIXED_X_POSITION,\n verticalSpacing: VERTICAL_SPACING,\n }),\n [setNodes, setEdges]\n );\n\n const onNodeDragStop = useCallback(\n (_: ReactMouseEvent, node: Node) => {\n reorderAndAlignNodes(node);\n },\n [reorderAndAlignNodes]\n );\n\n const onUpdateField = useMemo(\n () => createHandleUpdateField(setNodes),\n [setNodes]\n );\n\n const onUpdateInput = useMemo(\n () => createHandleUpdateInput(setNodes),\n [setNodes]\n );\n\n const onRemoveInputKey = useMemo(\n () => createHandleRemoveInputKey(setNodes),\n [setNodes]\n );\n\n const onUpdateOutput = useMemo(\n () => createHandleUpdateOutput(setNodes),\n [setNodes]\n );\n\n const onUpdateSections = useMemo(\n () => createHandleUpdateSections(setNodes),\n [setNodes]\n );\n\n const handleAddNode = useMemo(\n () =>\n createHandleAddNode(setNodes, setEdges, {\n fixedXPosition: FIXED_X_POSITION,\n verticalSpacing: VERTICAL_SPACING,\n nodeDefaults,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n }),\n [\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n setNodes,\n setEdges,\n ]\n );\n\n const handleRemoveNode = useMemo(\n () =>\n createHandleRemoveNode(setNodes, setEdges, {\n fixedXPosition: FIXED_X_POSITION,\n verticalSpacing: VERTICAL_SPACING,\n }),\n [setNodes, setEdges]\n );\n\n const nodesWithHandlers = useMemo(\n () =>\n nodes.map((node) => {\n const stepOutputReferences = stepOutputReferencesByNode[node.id] ?? [];\n if (node.type === \"parametersNode\") {\n const data = node.data as ParametersNodeData;\n return {\n ...node,\n data: {\n ...data,\n onAddNode: handleAddNode,\n onUpdateSections,\n stepOutputReferences,\n },\n };\n }\n if (node.type === \"outputNode\") {\n const data = node.data as OutputNodeData;\n return {\n ...node,\n data: {\n ...data,\n onAddNode: handleAddNode,\n onUpdateOutput,\n stepOutputReferences,\n },\n };\n }\n\n const data = node.data as ActionNodeData;\n return {\n ...node,\n data: {\n ...data,\n onAddNode: handleAddNode,\n onRemoveNode: handleRemoveNode,\n onUpdateField,\n onUpdateInput,\n onRemoveInputKey,\n stepOutputReferences,\n },\n };\n }),\n [\n nodes,\n handleAddNode,\n handleRemoveNode,\n onUpdateField,\n onUpdateInput,\n onRemoveInputKey,\n onUpdateOutput,\n onUpdateSections,\n stepOutputReferencesByNode,\n ]\n );\n\n const stepsFromNodes = useMemo(() => extractStepsFromNodes(nodes), [nodes]);\n\n const parametersFromNodes = useMemo(\n () => extractParametersFromNodes(nodes),\n [nodes]\n );\n\n const outputFromNodes = useMemo(() => extractOutputFromNodes(nodes), [nodes]);\n\n const normalizedOutputFromNodes = outputFromNodes ?? null;\n\n useEffect(() => {\n if (!onStepsChange && !onParametersChange && !onOutputChange) {\n return;\n }\n const serialized = stableStringify({\n steps: stepsFromNodes,\n parameters: parametersFromNodes ?? null,\n output: normalizedOutputFromNodes,\n });\n if (serialized === lastEmittedModelHashRef.current) {\n return;\n }\n lastEmittedModelHashRef.current = serialized;\n skipNextModelHashRef.current = serialized;\n if (onStepsChange) {\n onStepsChange(stepsFromNodes);\n }\n if (onParametersChange) {\n onParametersChange(parametersFromNodes ?? undefined);\n }\n if (onOutputChange) {\n onOutputChange(outputFromNodes);\n }\n }, [\n stepsFromNodes,\n parametersFromNodes,\n normalizedOutputFromNodes,\n outputFromNodes,\n onStepsChange,\n onParametersChange,\n onOutputChange,\n ]);\n\n const fitViewOptions = useMemo(() => ({ padding: 0.2, duration: 300 }), []);\n const [reactFlowInstance, setReactFlowInstance] =\n useState<ReactFlowInstance | null>(null);\n\n const fitFlowToView = useCallback(() => {\n if (!reactFlowInstance) {\n return;\n }\n reactFlowInstance.fitView(fitViewOptions);\n }, [fitViewOptions, reactFlowInstance]);\n\n useEffect(() => {\n if (!reactFlowInstance) {\n return;\n }\n if (!shouldAutoFitViewRef.current) {\n return;\n }\n shouldAutoFitViewRef.current = false;\n fitFlowToView();\n }, [fitFlowToView, nodes, edges, reactFlowInstance]);\n\n useEffect(() => {\n if (!reactFlowInstance) {\n return undefined;\n }\n window.addEventListener(\"resize\", fitFlowToView);\n return () => {\n window.removeEventListener(\"resize\", fitFlowToView);\n };\n }, [fitFlowToView, reactFlowInstance]);\n\n return (\n <div style={{ width: \"100%\", height: \"100%\", minHeight: \"70vh\" }}>\n <ReactFlow\n nodes={nodesWithHandlers}\n edges={edges}\n nodeTypes={nodeTypes}\n onNodesChange={onNodesChange}\n onEdgesChange={onEdgesChange}\n onNodeDragStop={onNodeDragStop}\n onConnect={onConnect}\n fitView\n onInit={setReactFlowInstance}\n fitViewOptions={fitViewOptions}\n />\n </div>\n );\n}\n"],"names":["data"],"mappings":"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"}
@@ -10,6 +10,7 @@ const createHandleAddNode = (setNodes, setEdges, options) => {
10
10
  nodeDefaults,
11
11
  scaffolderActionIds,
12
12
  scaffolderActionInputsById,
13
+ scaffolderActionInputRequiredById,
13
14
  scaffolderActionOutputsById
14
15
  } = options;
15
16
  return (config) => {
@@ -49,6 +50,7 @@ const createHandleAddNode = (setNodes, setEdges, options) => {
49
50
  sections: [],
50
51
  scaffolderActionIds,
51
52
  scaffolderActionInputsById,
53
+ scaffolderActionInputRequiredById,
52
54
  scaffolderActionOutputsById
53
55
  },
54
56
  ...nodeDefaults
@@ -70,6 +72,7 @@ const createHandleAddNode = (setNodes, setEdges, options) => {
70
72
  output: initialOutput,
71
73
  scaffolderActionIds,
72
74
  scaffolderActionInputsById,
75
+ scaffolderActionInputRequiredById,
73
76
  scaffolderActionOutputsById
74
77
  },
75
78
  ...nodeDefaults
@@ -112,6 +115,7 @@ const createHandleAddNode = (setNodes, setEdges, options) => {
112
115
  step: newStep,
113
116
  scaffolderActionIds,
114
117
  scaffolderActionInputsById,
118
+ scaffolderActionInputRequiredById,
115
119
  scaffolderActionOutputsById
116
120
  },
117
121
  ...nodeDefaults
@@ -125,6 +129,25 @@ const createHandleAddNode = (setNodes, setEdges, options) => {
125
129
  });
126
130
  };
127
131
  };
132
+ const createHandleRemoveNode = (setNodes, setEdges, options) => {
133
+ const { fixedXPosition, verticalSpacing } = options;
134
+ return (rfId) => {
135
+ setNodes((nodes) => {
136
+ const targetNode = nodes.find((node) => node.id === rfId);
137
+ if (!targetNode || targetNode.type !== "actionNode") {
138
+ return nodes;
139
+ }
140
+ const remainingNodes = nodes.filter((node) => node.id !== rfId);
141
+ const alignedNodes = alignNodes(
142
+ remainingNodes,
143
+ fixedXPosition,
144
+ verticalSpacing
145
+ );
146
+ setEdges(createSequentialEdges(alignedNodes));
147
+ return alignedNodes;
148
+ });
149
+ };
150
+ };
128
151
  const createHandleRemoveInputKey = (setNodes) => {
129
152
  return (rfId, key) => {
130
153
  setNodes(
@@ -284,5 +307,5 @@ const createHandleUpdateSections = (setNodes) => {
284
307
  };
285
308
  };
286
309
 
287
- export { collectStepOutputReferences, createHandleAddNode, createHandleRemoveInputKey, createHandleReorderAndAlignNodes, createHandleUpdateField, createHandleUpdateInput, createHandleUpdateOutput, createHandleUpdateSections };
310
+ export { collectStepOutputReferences, createHandleAddNode, createHandleRemoveInputKey, createHandleRemoveNode, createHandleReorderAndAlignNodes, createHandleUpdateField, createHandleUpdateInput, createHandleUpdateOutput, createHandleUpdateSections };
288
311
  //# sourceMappingURL=handlers.esm.js.map
@@ -1 +1 @@
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 scaffolderActionOutputsById: Record<string, Record<string, unknown>>;\n}\n\nconst orderNodes = (\n parameterNodes: Node[],\n actionNodes: Node[],\n outputNodes: Node[]\n) => [...parameterNodes, ...actionNodes, ...outputNodes];\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 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 setEdges(createSequentialEdges(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 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 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 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 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 setEdges(createSequentialEdges(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
+ {"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\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 setEdges(createSequentialEdges(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 setEdges(createSequentialEdges(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 setEdges(createSequentialEdges(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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"}
@@ -16,7 +16,8 @@ const buildNodesFromModel = (steps, parameters, output, options) => {
16
16
  const {
17
17
  scaffolderActionIds,
18
18
  scaffolderActionInputsById,
19
- scaffolderActionOutputsById
19
+ scaffolderActionOutputsById,
20
+ scaffolderActionInputRequiredById
20
21
  } = options;
21
22
  const parameterSections = normalizeParametersToSections(parameters);
22
23
  const nodes = [];
@@ -31,6 +32,7 @@ const buildNodesFromModel = (steps, parameters, output, options) => {
31
32
  sections: parameterSections,
32
33
  scaffolderActionIds,
33
34
  scaffolderActionInputsById,
35
+ scaffolderActionInputRequiredById,
34
36
  scaffolderActionOutputsById
35
37
  },
36
38
  ...nodeDefaults
@@ -46,6 +48,7 @@ const buildNodesFromModel = (steps, parameters, output, options) => {
46
48
  step: cloneStep(step),
47
49
  scaffolderActionIds,
48
50
  scaffolderActionInputsById,
51
+ scaffolderActionInputRequiredById,
49
52
  scaffolderActionOutputsById
50
53
  },
51
54
  ...nodeDefaults
@@ -63,6 +66,7 @@ const buildNodesFromModel = (steps, parameters, output, options) => {
63
66
  output: cloneOutput(output),
64
67
  scaffolderActionIds,
65
68
  scaffolderActionInputsById,
69
+ scaffolderActionInputRequiredById,
66
70
  scaffolderActionOutputsById
67
71
  },
68
72
  ...nodeDefaults