@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,85 +0,0 @@
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
@@ -1 +0,0 @@
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,57 +0,0 @@
1
- import { useState, useEffect } from 'react';
2
- import { useApiHolder } from '@backstage/core-plugin-api';
3
- import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';
4
- import { MOCK_SCAFFOLDER_ACTIONS } from './mockScaffolderActions.esm.js';
5
-
6
- const buildCache = (list) => {
7
- const { inputsById, outputsById, inputRequiredById } = list.reduce(
8
- (acc, action) => {
9
- acc.inputsById[action.id] = action.schema?.input?.properties ?? {};
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;
15
- return acc;
16
- },
17
- { inputsById: {}, outputsById: {}, inputRequiredById: {} }
18
- );
19
- return {
20
- ids: list.map((action) => action.id),
21
- inputsById,
22
- outputsById,
23
- inputRequiredById
24
- };
25
- };
26
- const fallbackCache = buildCache(MOCK_SCAFFOLDER_ACTIONS);
27
- const useScaffolderActions = () => {
28
- const apiHolder = useApiHolder();
29
- const scaffolderApi = apiHolder.get(scaffolderApiRef);
30
- const [cache, setCache] = useState(fallbackCache);
31
- useEffect(() => {
32
- let cancelled = false;
33
- if (!scaffolderApi) {
34
- setCache(fallbackCache);
35
- return () => {
36
- cancelled = true;
37
- };
38
- }
39
- scaffolderApi.listActions().then((remoteActions) => {
40
- if (cancelled) {
41
- return;
42
- }
43
- setCache(buildCache(remoteActions));
44
- }).catch(() => {
45
- if (!cancelled) {
46
- setCache(fallbackCache);
47
- }
48
- });
49
- return () => {
50
- cancelled = true;
51
- };
52
- }, [scaffolderApi]);
53
- return cache;
54
- };
55
-
56
- export { useScaffolderActions };
57
- //# sourceMappingURL=scaffolderActions.esm.js.map
@@ -1 +0,0 @@
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;;;;"}
@@ -1,431 +0,0 @@
1
- import { jsx } from 'react/jsx-runtime';
2
- import { useMemo, useState, useRef, useEffect, useCallback } from 'react';
3
- import { useNodesState, applyNodeChanges, applyEdgeChanges, addEdge, ReactFlow } from '@xyflow/react';
4
- import '@xyflow/react/dist/style.css';
5
- import { createSequentialEdges } from '../../utils/createSequentialEdges.esm.js';
6
- import { collectStepOutputReferences, createHandleReorderAndAlignNodes, createHandleUpdateField, createHandleUpdateInput, createHandleRemoveInputKey, createHandleUpdateOutput, createHandleUpdateSections, createHandleAddNode, createHandleRemoveNode } from './handlers.esm.js';
7
- import { buildNodesFromModel, stableStringify, resolveNodeHeightForTracking, collectParameterReferences, extractStepsFromNodes, extractParametersFromNodes, extractOutputFromNodes } from './model.esm.js';
8
- import { alignNodes } from './nodeLayout.esm.js';
9
- import { nodeTypes, FLOW_LAYOUT, nodeDefaults } from './flowConfig.esm.js';
10
- import { useScaffolderActions } from '../../api/scaffolderActions.esm.js';
11
-
12
- const FIXED_X_POSITION = FLOW_LAYOUT.fixedXPosition;
13
- const VERTICAL_SPACING = FLOW_LAYOUT.verticalSpacing;
14
- function App({
15
- steps = [],
16
- parameters,
17
- output,
18
- onStepsChange,
19
- onParametersChange,
20
- onOutputChange
21
- }) {
22
- const scaffolderActionsCache = useScaffolderActions();
23
- const {
24
- ids: scaffolderActionIds,
25
- inputsById: scaffolderActionInputsById,
26
- outputsById: scaffolderActionOutputsById,
27
- inputRequiredById: scaffolderActionInputRequiredById
28
- } = scaffolderActionsCache;
29
- const normalizedParametersProp = parameters ?? void 0;
30
- const normalizedOutputProp = output ?? null;
31
- const initialNodes = useMemo(
32
- () => buildNodesFromModel(
33
- steps,
34
- normalizedParametersProp,
35
- normalizedOutputProp,
36
- {
37
- scaffolderActionIds,
38
- scaffolderActionInputsById,
39
- scaffolderActionOutputsById,
40
- scaffolderActionInputRequiredById
41
- }
42
- ),
43
- [
44
- steps,
45
- normalizedParametersProp,
46
- normalizedOutputProp,
47
- scaffolderActionIds,
48
- scaffolderActionInputsById,
49
- scaffolderActionOutputsById,
50
- scaffolderActionInputRequiredById
51
- ]
52
- );
53
- const [nodes, setNodes] = useNodesState(initialNodes);
54
- const [edges, setEdges] = useState(
55
- () => createSequentialEdges(initialNodes)
56
- );
57
- const modelHash = useMemo(
58
- () => stableStringify({
59
- steps,
60
- parameters: normalizedParametersProp,
61
- output: normalizedOutputProp
62
- }),
63
- [steps, normalizedParametersProp, normalizedOutputProp]
64
- );
65
- const cacheFingerprint = useMemo(
66
- () => stableStringify({
67
- ids: scaffolderActionIds,
68
- inputs: scaffolderActionInputsById,
69
- outputs: scaffolderActionOutputsById,
70
- inputRequired: scaffolderActionInputRequiredById
71
- }),
72
- [
73
- scaffolderActionIds,
74
- scaffolderActionInputsById,
75
- scaffolderActionOutputsById,
76
- scaffolderActionInputRequiredById
77
- ]
78
- );
79
- const lastAppliedModelHashRef = useRef(null);
80
- const lastEmittedModelHashRef = useRef(null);
81
- const skipNextModelHashRef = useRef(null);
82
- const lastCacheFingerprintRef = useRef(null);
83
- const nodeHeightsRef = useRef({});
84
- const shouldAutoFitViewRef = useRef(true);
85
- const emitDebounceRef = useRef(null);
86
- const isDraggingRef = useRef(false);
87
- const [isDragging, setIsDragging] = useState(false);
88
- const emitAfterDragRef = useRef(false);
89
- useEffect(() => {
90
- const isCacheChanged = cacheFingerprint !== lastCacheFingerprintRef.current;
91
- const shouldSkip = modelHash === skipNextModelHashRef.current && !isCacheChanged;
92
- if (shouldSkip) {
93
- skipNextModelHashRef.current = null;
94
- lastAppliedModelHashRef.current = modelHash;
95
- lastCacheFingerprintRef.current = cacheFingerprint;
96
- return;
97
- }
98
- if (modelHash === lastAppliedModelHashRef.current && !isCacheChanged) {
99
- return;
100
- }
101
- const nextNodes = buildNodesFromModel(
102
- steps,
103
- normalizedParametersProp,
104
- normalizedOutputProp,
105
- {
106
- scaffolderActionIds,
107
- scaffolderActionInputsById,
108
- scaffolderActionOutputsById,
109
- scaffolderActionInputRequiredById
110
- }
111
- );
112
- lastAppliedModelHashRef.current = modelHash;
113
- lastCacheFingerprintRef.current = cacheFingerprint;
114
- lastEmittedModelHashRef.current = modelHash;
115
- setNodes(nextNodes);
116
- setEdges(createSequentialEdges(nextNodes));
117
- shouldAutoFitViewRef.current = true;
118
- }, [
119
- steps,
120
- normalizedParametersProp,
121
- normalizedOutputProp,
122
- modelHash,
123
- cacheFingerprint,
124
- scaffolderActionIds,
125
- scaffolderActionInputsById,
126
- scaffolderActionOutputsById,
127
- scaffolderActionInputRequiredById,
128
- setNodes,
129
- setEdges
130
- ]);
131
- useEffect(() => {
132
- if (!nodes.length) {
133
- return;
134
- }
135
- if (nodes.some((node) => node.dragging)) {
136
- return;
137
- }
138
- const activeNodeIds = /* @__PURE__ */ new Set();
139
- let hasMeasuredChange = false;
140
- nodes.forEach((node) => {
141
- activeNodeIds.add(node.id);
142
- const measuredHeight = resolveNodeHeightForTracking(node);
143
- if (typeof measuredHeight !== "number") {
144
- return;
145
- }
146
- const previousHeight = nodeHeightsRef.current[node.id];
147
- if (previousHeight !== measuredHeight) {
148
- nodeHeightsRef.current[node.id] = measuredHeight;
149
- hasMeasuredChange = true;
150
- }
151
- });
152
- Object.keys(nodeHeightsRef.current).forEach((id) => {
153
- if (!activeNodeIds.has(id)) {
154
- delete nodeHeightsRef.current[id];
155
- }
156
- });
157
- if (!hasMeasuredChange) {
158
- return;
159
- }
160
- setNodes((currentNodes) => {
161
- const alignedNodes = alignNodes(
162
- currentNodes,
163
- FIXED_X_POSITION,
164
- VERTICAL_SPACING
165
- );
166
- const positionsChanged = alignedNodes.some((node, index) => {
167
- const previousNode = currentNodes[index];
168
- if (!previousNode) {
169
- return true;
170
- }
171
- return node.position.x !== previousNode.position.x || node.position.y !== previousNode.position.y;
172
- });
173
- return positionsChanged ? alignedNodes : currentNodes;
174
- });
175
- }, [nodes, setNodes]);
176
- const parameterReferences = useMemo(
177
- () => collectParameterReferences(normalizedParametersProp),
178
- [normalizedParametersProp]
179
- );
180
- const stepOutputReferencesByNode = useMemo(
181
- () => collectStepOutputReferences(nodes, parameterReferences),
182
- [nodes, parameterReferences]
183
- );
184
- const onNodesChange = useCallback(
185
- (changes) => setNodes((ns) => {
186
- if (changes.some(
187
- (change) => change.type === "position" && change.dragging
188
- )) {
189
- isDraggingRef.current = true;
190
- setIsDragging(true);
191
- } else if (changes.some(
192
- (change) => change.type === "position" && change.dragging === false
193
- )) {
194
- const stillDragging = ns.some((node) => node.dragging);
195
- isDraggingRef.current = stillDragging;
196
- setIsDragging(stillDragging);
197
- }
198
- return applyNodeChanges(changes, ns);
199
- }),
200
- [setNodes]
201
- );
202
- const onEdgesChange = useCallback(
203
- (changes) => setEdges((es) => applyEdgeChanges(changes, es)),
204
- [setEdges]
205
- );
206
- const onConnect = useCallback(
207
- (params) => setEdges((es) => addEdge(params, es)),
208
- [setEdges]
209
- );
210
- const reorderAndAlignNodes = useMemo(
211
- () => createHandleReorderAndAlignNodes(setNodes, setEdges, {
212
- fixedXPosition: FIXED_X_POSITION,
213
- verticalSpacing: VERTICAL_SPACING
214
- }),
215
- [setNodes, setEdges]
216
- );
217
- const onNodeDragStop = useCallback(
218
- (_, node) => {
219
- isDraggingRef.current = false;
220
- setIsDragging(false);
221
- reorderAndAlignNodes(node);
222
- },
223
- [reorderAndAlignNodes]
224
- );
225
- const onUpdateField = useMemo(
226
- () => createHandleUpdateField(setNodes),
227
- [setNodes]
228
- );
229
- const onUpdateInput = useMemo(
230
- () => createHandleUpdateInput(setNodes),
231
- [setNodes]
232
- );
233
- const onRemoveInputKey = useMemo(
234
- () => createHandleRemoveInputKey(setNodes),
235
- [setNodes]
236
- );
237
- const onUpdateOutput = useMemo(
238
- () => createHandleUpdateOutput(setNodes),
239
- [setNodes]
240
- );
241
- const onUpdateSections = useMemo(
242
- () => createHandleUpdateSections(setNodes),
243
- [setNodes]
244
- );
245
- const handleAddNode = useMemo(
246
- () => createHandleAddNode(setNodes, setEdges, {
247
- fixedXPosition: FIXED_X_POSITION,
248
- verticalSpacing: VERTICAL_SPACING,
249
- nodeDefaults,
250
- scaffolderActionIds,
251
- scaffolderActionInputsById,
252
- scaffolderActionInputRequiredById,
253
- scaffolderActionOutputsById
254
- }),
255
- [
256
- scaffolderActionIds,
257
- scaffolderActionInputsById,
258
- scaffolderActionOutputsById,
259
- scaffolderActionInputRequiredById,
260
- setNodes,
261
- setEdges
262
- ]
263
- );
264
- const handleRemoveNode = useMemo(
265
- () => createHandleRemoveNode(setNodes, setEdges, {
266
- fixedXPosition: FIXED_X_POSITION,
267
- verticalSpacing: VERTICAL_SPACING
268
- }),
269
- [setNodes, setEdges]
270
- );
271
- const nodesWithHandlers = useMemo(() => {
272
- if (!nodes.length) {
273
- return nodes;
274
- }
275
- return nodes.map((node) => {
276
- const stepOutputReferences = stepOutputReferencesByNode[node.id] ?? [];
277
- if (node.type === "parametersNode") {
278
- const data2 = node.data;
279
- const nextData2 = data2.onAddNode === handleAddNode && data2.onUpdateSections === onUpdateSections && data2.stepOutputReferences === stepOutputReferences ? data2 : {
280
- ...data2,
281
- onAddNode: handleAddNode,
282
- onUpdateSections,
283
- stepOutputReferences
284
- };
285
- return data2 === nextData2 ? node : { ...node, data: nextData2 };
286
- }
287
- if (node.type === "outputNode") {
288
- const data2 = node.data;
289
- const nextData2 = data2.onAddNode === handleAddNode && data2.onUpdateOutput === onUpdateOutput && data2.stepOutputReferences === stepOutputReferences ? data2 : {
290
- ...data2,
291
- onAddNode: handleAddNode,
292
- onUpdateOutput,
293
- stepOutputReferences
294
- };
295
- return data2 === nextData2 ? node : { ...node, data: nextData2 };
296
- }
297
- const data = node.data;
298
- const nextData = data.onAddNode === handleAddNode && data.onRemoveNode === handleRemoveNode && data.onUpdateField === onUpdateField && data.onUpdateInput === onUpdateInput && data.onRemoveInputKey === onRemoveInputKey && data.stepOutputReferences === stepOutputReferences ? data : {
299
- ...data,
300
- onAddNode: handleAddNode,
301
- onRemoveNode: handleRemoveNode,
302
- onUpdateField,
303
- onUpdateInput,
304
- onRemoveInputKey,
305
- stepOutputReferences
306
- };
307
- return data === nextData ? node : { ...node, data: nextData };
308
- });
309
- }, [
310
- nodes,
311
- handleAddNode,
312
- handleRemoveNode,
313
- onUpdateField,
314
- onUpdateInput,
315
- onRemoveInputKey,
316
- onUpdateOutput,
317
- onUpdateSections,
318
- stepOutputReferencesByNode
319
- ]);
320
- const stepsFromNodes = useMemo(() => extractStepsFromNodes(nodes), [nodes]);
321
- const parametersFromNodes = useMemo(
322
- () => extractParametersFromNodes(nodes),
323
- [nodes]
324
- );
325
- const outputFromNodes = useMemo(() => extractOutputFromNodes(nodes), [nodes]);
326
- const normalizedOutputFromNodes = outputFromNodes ?? null;
327
- useEffect(() => {
328
- if (!onStepsChange && !onParametersChange && !onOutputChange) {
329
- return;
330
- }
331
- if (isDragging) {
332
- emitAfterDragRef.current = true;
333
- return;
334
- }
335
- const serialized = stableStringify({
336
- steps: stepsFromNodes,
337
- parameters: parametersFromNodes ?? null,
338
- output: normalizedOutputFromNodes
339
- });
340
- if (serialized === lastEmittedModelHashRef.current) {
341
- return;
342
- }
343
- if (emitDebounceRef.current) {
344
- clearTimeout(emitDebounceRef.current);
345
- }
346
- emitDebounceRef.current = setTimeout(() => {
347
- lastEmittedModelHashRef.current = serialized;
348
- skipNextModelHashRef.current = serialized;
349
- if (onStepsChange) {
350
- onStepsChange(stepsFromNodes);
351
- }
352
- if (onParametersChange) {
353
- onParametersChange(parametersFromNodes ?? void 0);
354
- }
355
- if (onOutputChange) {
356
- onOutputChange(outputFromNodes);
357
- }
358
- }, 120);
359
- }, [
360
- stepsFromNodes,
361
- parametersFromNodes,
362
- normalizedOutputFromNodes,
363
- outputFromNodes,
364
- onStepsChange,
365
- onParametersChange,
366
- onOutputChange,
367
- isDragging
368
- ]);
369
- useEffect(
370
- () => () => {
371
- if (emitDebounceRef.current) {
372
- clearTimeout(emitDebounceRef.current);
373
- }
374
- },
375
- []
376
- );
377
- const fitViewOptions = useMemo(() => ({ padding: 0.2, duration: 300 }), []);
378
- const [reactFlowInstance, setReactFlowInstance] = useState(null);
379
- const fitFlowToView = useCallback(() => {
380
- if (!reactFlowInstance) {
381
- return;
382
- }
383
- reactFlowInstance.fitView(fitViewOptions);
384
- }, [fitViewOptions, reactFlowInstance]);
385
- useEffect(() => {
386
- if (!reactFlowInstance) {
387
- return;
388
- }
389
- if (!shouldAutoFitViewRef.current) {
390
- return;
391
- }
392
- shouldAutoFitViewRef.current = false;
393
- fitFlowToView();
394
- }, [fitFlowToView, nodes, edges, reactFlowInstance]);
395
- useEffect(() => {
396
- if (!reactFlowInstance) {
397
- return void 0;
398
- }
399
- window.addEventListener("resize", fitFlowToView);
400
- return () => {
401
- window.removeEventListener("resize", fitFlowToView);
402
- };
403
- }, [fitFlowToView, reactFlowInstance]);
404
- useEffect(() => {
405
- if (!isDragging) {
406
- if (emitAfterDragRef.current) {
407
- emitAfterDragRef.current = false;
408
- lastEmittedModelHashRef.current = null;
409
- }
410
- lastEmittedModelHashRef.current = null;
411
- }
412
- }, [isDragging]);
413
- return /* @__PURE__ */ jsx("div", { style: { width: "100%", height: "100%", minHeight: "70vh" }, children: /* @__PURE__ */ jsx(
414
- ReactFlow,
415
- {
416
- nodes: nodesWithHandlers,
417
- edges,
418
- nodeTypes,
419
- onNodesChange,
420
- onEdgesChange,
421
- onNodeDragStop,
422
- onConnect,
423
- fitView: true,
424
- onInit: setReactFlowInstance,
425
- fitViewOptions
426
- }
427
- ) });
428
- }
429
-
430
- export { App as default };
431
- //# sourceMappingURL=DesignerFlow.esm.js.map
@@ -1 +0,0 @@
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 const emitDebounceRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const isDraggingRef = useRef(false);\n const [isDragging, setIsDragging] = useState(false);\n const emitAfterDragRef = useRef(false);\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) => {\n if (\n changes.some(\n (change) => change.type === \"position\" && change.dragging\n )\n ) {\n isDraggingRef.current = true;\n setIsDragging(true);\n } else if (\n changes.some(\n (change) => change.type === \"position\" && change.dragging === false\n )\n ) {\n const stillDragging = ns.some((node) => node.dragging);\n isDraggingRef.current = stillDragging;\n setIsDragging(stillDragging);\n }\n return applyNodeChanges(changes, ns);\n }),\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 isDraggingRef.current = false;\n setIsDragging(false);\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 if (!nodes.length) {\n return nodes;\n }\n return nodes.map((node) => {\n const stepOutputReferences = stepOutputReferencesByNode[node.id] ?? [];\n if (node.type === \"parametersNode\") {\n const data = node.data as ParametersNodeData;\n const nextData =\n data.onAddNode === handleAddNode &&\n data.onUpdateSections === onUpdateSections &&\n data.stepOutputReferences === stepOutputReferences\n ? data\n : {\n ...data,\n onAddNode: handleAddNode,\n onUpdateSections,\n stepOutputReferences,\n };\n return data === nextData ? node : { ...node, data: nextData };\n }\n if (node.type === \"outputNode\") {\n const data = node.data as OutputNodeData;\n const nextData =\n data.onAddNode === handleAddNode &&\n data.onUpdateOutput === onUpdateOutput &&\n data.stepOutputReferences === stepOutputReferences\n ? data\n : {\n ...data,\n onAddNode: handleAddNode,\n onUpdateOutput,\n stepOutputReferences,\n };\n return data === nextData ? node : { ...node, data: nextData };\n }\n\n const data = node.data as ActionNodeData;\n const nextData =\n data.onAddNode === handleAddNode &&\n data.onRemoveNode === handleRemoveNode &&\n data.onUpdateField === onUpdateField &&\n data.onUpdateInput === onUpdateInput &&\n data.onRemoveInputKey === onRemoveInputKey &&\n data.stepOutputReferences === stepOutputReferences\n ? data\n : {\n ...data,\n onAddNode: handleAddNode,\n onRemoveNode: handleRemoveNode,\n onUpdateField,\n onUpdateInput,\n onRemoveInputKey,\n stepOutputReferences,\n };\n return data === nextData ? node : { ...node, data: nextData };\n });\n }, [\n nodes,\n handleAddNode,\n handleRemoveNode,\n onUpdateField,\n onUpdateInput,\n onRemoveInputKey,\n onUpdateOutput,\n onUpdateSections,\n stepOutputReferencesByNode,\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 if (isDragging) {\n emitAfterDragRef.current = true;\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 if (emitDebounceRef.current) {\n clearTimeout(emitDebounceRef.current);\n }\n emitDebounceRef.current = setTimeout(() => {\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 }, 120);\n }, [\n stepsFromNodes,\n parametersFromNodes,\n normalizedOutputFromNodes,\n outputFromNodes,\n onStepsChange,\n onParametersChange,\n onOutputChange,\n isDragging,\n ]);\n\n useEffect(\n () => () => {\n if (emitDebounceRef.current) {\n clearTimeout(emitDebounceRef.current);\n }\n },\n []\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 useEffect(() => {\n if (!isDragging) {\n if (emitAfterDragRef.current) {\n emitAfterDragRef.current = false;\n lastEmittedModelHashRef.current = null;\n }\n // Trigger emit cycle after drag ends so external state is up to date.\n lastEmittedModelHashRef.current = null;\n }\n }, [isDragging]);\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","nextData"],"mappings":"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"}
@@ -1,21 +0,0 @@
1
- import { Position } from '@xyflow/react';
2
- import { ActionNode } from '../Nodes/ActionNode.esm.js';
3
- import { ParametersNode } from '../Nodes/ParametersNode.esm.js';
4
- import { OutputNode } from '../Nodes/OutputNode.esm.js';
5
-
6
- const FLOW_LAYOUT = {
7
- verticalSpacing: 400,
8
- fixedXPosition: 100
9
- };
10
- const nodeTypes = {
11
- parametersNode: ParametersNode,
12
- actionNode: ActionNode,
13
- outputNode: OutputNode
14
- };
15
- const nodeDefaults = {
16
- sourcePosition: Position.Bottom,
17
- targetPosition: Position.Top
18
- };
19
-
20
- export { FLOW_LAYOUT, nodeDefaults, nodeTypes };
21
- //# sourceMappingURL=flowConfig.esm.js.map