@tduniec/plugin-template-designer-foundation 0.1.1

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 (78) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +13 -0
  3. package/dist/api/useScaffolderActions.esm.js +59 -0
  4. package/dist/api/useScaffolderActions.esm.js.map +1 -0
  5. package/dist/components/FieldEditorDialog.esm.js +55 -0
  6. package/dist/components/FieldEditorDialog.esm.js.map +1 -0
  7. package/dist/components/Nodes/ActionNode.esm.js +613 -0
  8. package/dist/components/Nodes/ActionNode.esm.js.map +1 -0
  9. package/dist/components/Nodes/OutputNode.esm.js +373 -0
  10. package/dist/components/Nodes/OutputNode.esm.js.map +1 -0
  11. package/dist/components/Nodes/ParameterInputNode.esm.js +320 -0
  12. package/dist/components/Nodes/ParameterInputNode.esm.js.map +1 -0
  13. package/dist/components/Nodes/ParameterTitlesNode.esm.js +251 -0
  14. package/dist/components/Nodes/ParameterTitlesNode.esm.js.map +1 -0
  15. package/dist/components/Nodes/ParametersNode.esm.js +147 -0
  16. package/dist/components/Nodes/ParametersNode.esm.js.map +1 -0
  17. package/dist/components/Nodes/action/schema.esm.js +68 -0
  18. package/dist/components/Nodes/action/schema.esm.js.map +1 -0
  19. package/dist/components/Nodes/action/useActionInputs.esm.js +71 -0
  20. package/dist/components/Nodes/action/useActionInputs.esm.js.map +1 -0
  21. package/dist/components/Nodes/common/AutoWidthPopper.esm.js +11 -0
  22. package/dist/components/Nodes/common/AutoWidthPopper.esm.js.map +1 -0
  23. package/dist/components/Nodes/common/nodeInteraction.esm.js +20 -0
  24. package/dist/components/Nodes/common/nodeInteraction.esm.js.map +1 -0
  25. package/dist/components/Nodes/output/useOutputController.esm.js +125 -0
  26. package/dist/components/Nodes/output/useOutputController.esm.js.map +1 -0
  27. package/dist/components/TemplateDesigner/TemplateLanding.esm.js +157 -0
  28. package/dist/components/TemplateDesigner/TemplateLanding.esm.js.map +1 -0
  29. package/dist/components/TemplateDesigner/TemplateWorkspace.esm.js +416 -0
  30. package/dist/components/TemplateDesigner/TemplateWorkspace.esm.js.map +1 -0
  31. package/dist/components/TemplateDesigner/codemirrorTheme.esm.js +30 -0
  32. package/dist/components/TemplateDesigner/codemirrorTheme.esm.js.map +1 -0
  33. package/dist/components/TemplateDesigner/useFieldEditor.esm.js +95 -0
  34. package/dist/components/TemplateDesigner/useFieldEditor.esm.js.map +1 -0
  35. package/dist/components/TemplateDesignerIcon.esm.js +33 -0
  36. package/dist/components/TemplateDesignerIcon.esm.js.map +1 -0
  37. package/dist/components/designerFlowConfig.esm.js +13 -0
  38. package/dist/components/designerFlowConfig.esm.js.map +1 -0
  39. package/dist/designerFlow/DesignerFlow.esm.js +828 -0
  40. package/dist/designerFlow/DesignerFlow.esm.js.map +1 -0
  41. package/dist/designerFlow/handlers.esm.js +317 -0
  42. package/dist/designerFlow/handlers.esm.js.map +1 -0
  43. package/dist/designerFlow/model.esm.js +166 -0
  44. package/dist/designerFlow/model.esm.js.map +1 -0
  45. package/dist/designerFlow/nodeLayout.esm.js +108 -0
  46. package/dist/designerFlow/nodeLayout.esm.js.map +1 -0
  47. package/dist/designerFlow/parameterTransforms.esm.js +124 -0
  48. package/dist/designerFlow/parameterTransforms.esm.js.map +1 -0
  49. package/dist/designerFlow/utils/stableComparators.esm.js +69 -0
  50. package/dist/designerFlow/utils/stableComparators.esm.js.map +1 -0
  51. package/dist/foundation/actionNodeCustomization.esm.js +20 -0
  52. package/dist/foundation/actionNodeCustomization.esm.js.map +1 -0
  53. package/dist/foundation/actionNodeRegistry.esm.js +30 -0
  54. package/dist/foundation/actionNodeRegistry.esm.js.map +1 -0
  55. package/dist/foundation/featureFlags.esm.js +6 -0
  56. package/dist/foundation/featureFlags.esm.js.map +1 -0
  57. package/dist/foundation/templateSources.esm.js +16 -0
  58. package/dist/foundation/templateSources.esm.js.map +1 -0
  59. package/dist/index.d.ts +382 -0
  60. package/dist/index.esm.js +25 -0
  61. package/dist/index.esm.js.map +1 -0
  62. package/dist/state/templateUtils.esm.js +46 -0
  63. package/dist/state/templateUtils.esm.js.map +1 -0
  64. package/dist/state/useParameterSections.esm.js +162 -0
  65. package/dist/state/useParameterSections.esm.js.map +1 -0
  66. package/dist/state/useTemplateState.esm.js +627 -0
  67. package/dist/state/useTemplateState.esm.js.map +1 -0
  68. package/dist/types/flowNodes.esm.js +8 -0
  69. package/dist/types/flowNodes.esm.js.map +1 -0
  70. package/dist/utils/createSequentialEdges.esm.js +15 -0
  71. package/dist/utils/createSequentialEdges.esm.js.map +1 -0
  72. package/dist/utils/mocks/mocks.esm.js +120 -0
  73. package/dist/utils/mocks/mocks.esm.js.map +1 -0
  74. package/dist/utils/sampleTemplate.esm.js +40 -0
  75. package/dist/utils/sampleTemplate.esm.js.map +1 -0
  76. package/dist/utils/yamlJsonConversion.esm.js +47 -0
  77. package/dist/utils/yamlJsonConversion.esm.js.map +1 -0
  78. package/package.json +103 -0
@@ -0,0 +1,147 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { NodeToolbar, Position, Handle } from '@xyflow/react';
3
+ import { memo } from 'react';
4
+ import { styled, alpha, useTheme } from '@material-ui/core/styles';
5
+ import { Box, Typography, Chip, Button } from '@material-ui/core';
6
+ import SettingsIcon from '@material-ui/icons/Settings';
7
+ import AddIcon from '@material-ui/icons/Add';
8
+ import { createStopNodeInteraction } from './common/nodeInteraction.esm.js';
9
+ import { useParameterSectionsController } from '../../state/useParameterSections.esm.js';
10
+ import { ParameterTitlesNode } from './ParameterTitlesNode.esm.js';
11
+
12
+ const resolvePaletteMode = (theme) => theme.palette.mode ?? theme.palette.type ?? "light";
13
+ const Card = styled(Box)(({ theme }) => {
14
+ const paletteMode = resolvePaletteMode(theme);
15
+ return {
16
+ position: "relative",
17
+ background: alpha(
18
+ theme.palette.warning.main,
19
+ paletteMode === "dark" ? 0.18 : 0.12
20
+ ),
21
+ border: `1px solid ${alpha(theme.palette.warning.main, 0.35)}`,
22
+ borderRadius: 12,
23
+ width: 760,
24
+ padding: theme.spacing(1.5),
25
+ boxShadow: theme.shadows[2],
26
+ color: theme.palette.text.primary,
27
+ overflow: "hidden",
28
+ "&::before": {
29
+ content: '""',
30
+ position: "absolute",
31
+ inset: 0,
32
+ background: `linear-gradient(135deg, ${alpha(
33
+ theme.palette.warning.light,
34
+ paletteMode === "dark" ? 0.28 : 0.18
35
+ )}, transparent 65%)`,
36
+ pointerEvents: "none",
37
+ zIndex: 0
38
+ },
39
+ "& > *": {
40
+ position: "relative",
41
+ zIndex: 1
42
+ }
43
+ };
44
+ });
45
+ const Header = styled(Box)(({ theme }) => {
46
+ const paletteMode = resolvePaletteMode(theme);
47
+ return {
48
+ display: "flex",
49
+ alignItems: "center",
50
+ justifyContent: "space-between",
51
+ padding: theme.spacing(1),
52
+ marginBottom: theme.spacing(1),
53
+ borderRadius: 8,
54
+ backgroundColor: alpha(
55
+ theme.palette.warning.main,
56
+ paletteMode === "dark" ? 0.24 : 0.14
57
+ ),
58
+ border: `1px solid ${alpha(theme.palette.warning.main, 0.4)}`
59
+ };
60
+ });
61
+ const ParametersNodeComponent = ({
62
+ data
63
+ }) => {
64
+ if (process.env.NODE_ENV === "development") {
65
+ console.debug("[DesignerFlow] render ParametersNode", data.rfId);
66
+ }
67
+ const theme = useTheme();
68
+ const paletteMode = resolvePaletteMode(theme);
69
+ const {
70
+ sections,
71
+ handleSectionUpdate,
72
+ handleFieldUpdate,
73
+ handleAddSection,
74
+ handleMoveSection,
75
+ handleAddField,
76
+ handleMoveField
77
+ } = useParameterSectionsController(data);
78
+ const stopAll = createStopNodeInteraction();
79
+ return /* @__PURE__ */ jsxs(Card, { children: [
80
+ /* @__PURE__ */ jsxs(Header, { children: [
81
+ /* @__PURE__ */ jsxs(
82
+ Box,
83
+ {
84
+ display: "flex",
85
+ alignItems: "center",
86
+ style: { gap: theme.spacing(1) },
87
+ children: [
88
+ /* @__PURE__ */ jsx(
89
+ SettingsIcon,
90
+ {
91
+ fontSize: "small",
92
+ htmlColor: theme.palette.warning.dark
93
+ }
94
+ ),
95
+ /* @__PURE__ */ jsx(Typography, { variant: "subtitle2", noWrap: true, children: "Parameters" })
96
+ ]
97
+ }
98
+ ),
99
+ /* @__PURE__ */ jsx(
100
+ Chip,
101
+ {
102
+ size: "small",
103
+ variant: "outlined",
104
+ label: "parameters",
105
+ style: {
106
+ borderColor: theme.palette.warning.dark,
107
+ color: paletteMode === "dark" ? theme.palette.warning.light : theme.palette.warning.dark,
108
+ textTransform: "uppercase"
109
+ }
110
+ }
111
+ )
112
+ ] }),
113
+ /* @__PURE__ */ jsx(Box, { mt: 2, children: /* @__PURE__ */ jsx(
114
+ ParameterTitlesNode,
115
+ {
116
+ sections,
117
+ onSectionUpdate: handleSectionUpdate,
118
+ onFieldUpdate: handleFieldUpdate,
119
+ onAddSection: handleAddSection,
120
+ onMoveSection: handleMoveSection,
121
+ onAddField: handleAddField,
122
+ onMoveField: handleMoveField
123
+ }
124
+ ) }),
125
+ /* @__PURE__ */ jsx(NodeToolbar, { position: Position.Bottom, children: /* @__PURE__ */ jsx(
126
+ Button,
127
+ {
128
+ variant: "outlined",
129
+ size: "small",
130
+ startIcon: /* @__PURE__ */ jsx(AddIcon, { fontSize: "small" }),
131
+ onClick: () => data.onAddNode?.({
132
+ afterRfId: data.rfId,
133
+ type: "actionNode"
134
+ }),
135
+ className: "nodrag nowheel",
136
+ onPointerDown: stopAll.onPointerDown,
137
+ onKeyDown: stopAll.onKeyDown,
138
+ children: "Add First Action"
139
+ }
140
+ ) }),
141
+ /* @__PURE__ */ jsx(Handle, { type: "source", position: Position.Bottom })
142
+ ] });
143
+ };
144
+ const ParametersNode = memo(ParametersNodeComponent);
145
+
146
+ export { ParametersNode };
147
+ //# sourceMappingURL=ParametersNode.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParametersNode.esm.js","sources":["../../../src/components/Nodes/ParametersNode.tsx"],"sourcesContent":["import type { FC } from \"react\";\nimport { Handle, NodeToolbar, Position } from \"@xyflow/react\";\nimport { memo } from \"react\";\nimport { alpha, styled, useTheme } from \"@material-ui/core/styles\";\nimport { Box, Button, Chip, Typography } from \"@material-ui/core\";\nimport SettingsIcon from \"@material-ui/icons/Settings\";\nimport AddIcon from \"@material-ui/icons/Add\";\nimport type { ParametersNodeData } from \"../../types/flowNodes\";\nimport { createStopNodeInteraction } from \"./common/nodeInteraction\";\nimport { useParameterSectionsController } from \"../../state/useParameterSections\";\nimport { ParameterTitlesNode } from \"./ParameterTitlesNode\";\n\nconst resolvePaletteMode = (theme: { palette: { type?: string } }) =>\n (theme.palette as { mode?: \"light\" | \"dark\" }).mode ??\n theme.palette.type ??\n \"light\";\n\nconst Card = styled(Box)(({ theme }) => {\n const paletteMode = resolvePaletteMode(theme);\n return {\n position: \"relative\",\n background: alpha(\n theme.palette.warning.main,\n paletteMode === \"dark\" ? 0.18 : 0.12\n ),\n border: `1px solid ${alpha(theme.palette.warning.main, 0.35)}`,\n borderRadius: 12,\n width: 760,\n padding: theme.spacing(1.5),\n boxShadow: theme.shadows[2],\n color: theme.palette.text.primary,\n overflow: \"hidden\",\n \"&::before\": {\n content: '\"\"',\n position: \"absolute\",\n inset: 0,\n background: `linear-gradient(135deg, ${alpha(\n theme.palette.warning.light,\n paletteMode === \"dark\" ? 0.28 : 0.18\n )}, transparent 65%)`,\n pointerEvents: \"none\",\n zIndex: 0,\n },\n \"& > *\": {\n position: \"relative\",\n zIndex: 1,\n },\n };\n});\n\nconst Header = styled(Box)(({ theme }) => {\n const paletteMode = resolvePaletteMode(theme);\n return {\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n padding: theme.spacing(1),\n marginBottom: theme.spacing(1),\n borderRadius: 8,\n backgroundColor: alpha(\n theme.palette.warning.main,\n paletteMode === \"dark\" ? 0.24 : 0.14\n ),\n border: `1px solid ${alpha(theme.palette.warning.main, 0.4)}`,\n };\n});\n\nconst ParametersNodeComponent: FC<{ data: ParametersNodeData }> = ({\n data,\n}) => {\n if (process.env.NODE_ENV === \"development\") {\n // Quick dev-only visibility into unnecessary renders per node.\n // eslint-disable-next-line no-console\n console.debug(\"[DesignerFlow] render ParametersNode\", data.rfId);\n }\n const theme = useTheme();\n const paletteMode = resolvePaletteMode(theme);\n const {\n sections,\n handleSectionUpdate,\n handleFieldUpdate,\n handleAddSection,\n handleMoveSection,\n handleAddField,\n handleMoveField,\n } = useParameterSectionsController(data);\n\n const stopAll = createStopNodeInteraction();\n\n return (\n <Card>\n <Header>\n <Box\n display=\"flex\"\n alignItems=\"center\"\n style={{ gap: theme.spacing(1) }}\n >\n <SettingsIcon\n fontSize=\"small\"\n htmlColor={theme.palette.warning.dark}\n />\n <Typography variant=\"subtitle2\" noWrap>\n Parameters\n </Typography>\n </Box>\n <Chip\n size=\"small\"\n variant=\"outlined\"\n label=\"parameters\"\n style={{\n borderColor: theme.palette.warning.dark,\n color:\n paletteMode === \"dark\"\n ? theme.palette.warning.light\n : theme.palette.warning.dark,\n textTransform: \"uppercase\",\n }}\n />\n </Header>\n\n <Box mt={2}>\n <ParameterTitlesNode\n sections={sections}\n onSectionUpdate={handleSectionUpdate}\n onFieldUpdate={handleFieldUpdate}\n onAddSection={handleAddSection}\n onMoveSection={handleMoveSection}\n onAddField={handleAddField}\n onMoveField={handleMoveField}\n />\n </Box>\n\n <NodeToolbar position={Position.Bottom}>\n <Button\n variant=\"outlined\"\n size=\"small\"\n startIcon={<AddIcon fontSize=\"small\" />}\n onClick={() =>\n data.onAddNode?.({\n afterRfId: data.rfId,\n type: \"actionNode\",\n })\n }\n className=\"nodrag nowheel\"\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n >\n Add First Action\n </Button>\n </NodeToolbar>\n\n <Handle type=\"source\" position={Position.Bottom} />\n </Card>\n );\n};\n\nexport const ParametersNode = memo(ParametersNodeComponent);\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ const normalizeSchemaType = (schema, value) => {
2
+ const explicitType = typeof schema === "object" ? schema?.type : void 0;
3
+ if (explicitType === "string") return "string";
4
+ if (explicitType === "number") return "number";
5
+ if (explicitType === "integer") return "integer";
6
+ if (explicitType === "boolean") return "boolean";
7
+ if (explicitType === "array") return "array";
8
+ if (explicitType === "object") return "object";
9
+ const inferredType = typeof value;
10
+ if (inferredType === "string") return "string";
11
+ if (inferredType === "number") return "number";
12
+ if (Array.isArray(value)) return "array";
13
+ if (value && typeof value === "object") return "object";
14
+ if (typeof value === "boolean") return "boolean";
15
+ return "unknown";
16
+ };
17
+ const buildTypeLabel = (schema) => {
18
+ if (!schema) {
19
+ return "";
20
+ }
21
+ if (schema.type) {
22
+ if (Array.isArray(schema.type)) {
23
+ return schema.type.join(" | ");
24
+ }
25
+ return String(schema.type);
26
+ }
27
+ return "";
28
+ };
29
+ const extractEnumOptions = (schema) => {
30
+ if (Array.isArray(schema?.enum)) {
31
+ return schema.enum.map((value) => typeof value === "string" ? value : null).filter(Boolean);
32
+ }
33
+ return [];
34
+ };
35
+ const coerceValueForType = (value, type) => {
36
+ if (type === "number" || type === "integer") {
37
+ const parsed = Number(value);
38
+ return Number.isNaN(parsed) ? value : parsed;
39
+ }
40
+ if (type === "boolean") {
41
+ if (value === "true") return true;
42
+ if (value === "false") return false;
43
+ }
44
+ if (type === "array" || type === "object") {
45
+ try {
46
+ return JSON.parse(value);
47
+ } catch {
48
+ return value;
49
+ }
50
+ }
51
+ return value;
52
+ };
53
+ const stringifyValueForDisplay = (value, type) => {
54
+ if (value === void 0 || value === null) {
55
+ return "";
56
+ }
57
+ if (type === "object" || type === "array") {
58
+ try {
59
+ return JSON.stringify(value, null, 2);
60
+ } catch {
61
+ return String(value);
62
+ }
63
+ }
64
+ return String(value);
65
+ };
66
+
67
+ export { buildTypeLabel, coerceValueForType, extractEnumOptions, normalizeSchemaType, stringifyValueForDisplay };
68
+ //# sourceMappingURL=schema.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.esm.js","sources":["../../../../src/components/Nodes/action/schema.ts"],"sourcesContent":["export type JsonSchemaProperty = Record<string, unknown>;\n\nexport type NormalizedSchemaType =\n | \"string\"\n | \"number\"\n | \"integer\"\n | \"boolean\"\n | \"array\"\n | \"object\"\n | \"unknown\";\n\nexport const normalizeSchemaType = (\n schema?: JsonSchemaProperty,\n value?: unknown\n): NormalizedSchemaType => {\n const explicitType = typeof schema === \"object\" ? schema?.type : undefined;\n if (explicitType === \"string\") return \"string\";\n if (explicitType === \"number\") return \"number\";\n if (explicitType === \"integer\") return \"integer\";\n if (explicitType === \"boolean\") return \"boolean\";\n if (explicitType === \"array\") return \"array\";\n if (explicitType === \"object\") return \"object\";\n\n const inferredType = typeof value;\n if (inferredType === \"string\") return \"string\";\n if (inferredType === \"number\") return \"number\";\n if (Array.isArray(value)) return \"array\";\n if (value && typeof value === \"object\") return \"object\";\n if (typeof value === \"boolean\") return \"boolean\";\n\n return \"unknown\";\n};\n\nexport const buildTypeLabel = (schema?: JsonSchemaProperty) => {\n if (!schema) {\n return \"\";\n }\n if (schema.type) {\n if (Array.isArray(schema.type)) {\n return schema.type.join(\" | \");\n }\n return String(schema.type);\n }\n return \"\";\n};\n\nexport const extractEnumOptions = (schema?: JsonSchemaProperty): string[] => {\n if (Array.isArray(schema?.enum)) {\n return schema.enum\n .map((value) => (typeof value === \"string\" ? value : null))\n .filter(Boolean) as string[];\n }\n return [];\n};\n\nexport const coerceValueForType = (\n value: string,\n type: NormalizedSchemaType\n): unknown => {\n if (type === \"number\" || type === \"integer\") {\n const parsed = Number(value);\n return Number.isNaN(parsed) ? value : parsed;\n }\n if (type === \"boolean\") {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n }\n if (type === \"array\" || type === \"object\") {\n try {\n return JSON.parse(value);\n } catch {\n return value;\n }\n }\n return value;\n};\n\nexport const stringifyValueForDisplay = (\n value: unknown,\n type: NormalizedSchemaType\n): string => {\n if (value === undefined || value === null) {\n return \"\";\n }\n if (type === \"object\" || type === \"array\") {\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n }\n return String(value);\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,71 @@
1
+ import { useMemo } from 'react';
2
+ import { actionNodeCustomizationRegistry } from '../../../foundation/actionNodeCustomization.esm.js';
3
+ import { normalizeSchemaType, buildTypeLabel, extractEnumOptions } from './schema.esm.js';
4
+
5
+ const useActionInputs = ({
6
+ data,
7
+ step,
8
+ actionId,
9
+ newKey
10
+ }) => {
11
+ const schemaDecorators = useMemo(
12
+ () => actionNodeCustomizationRegistry.getSchemaDecorators(),
13
+ []
14
+ );
15
+ const actionInputSchema = useMemo(() => {
16
+ if (!actionId) {
17
+ return {};
18
+ }
19
+ const baseSchema = data.scaffolderActionInputsById?.[actionId] ?? {};
20
+ return schemaDecorators.reduce(
21
+ (acc, decorator) => decorator({ actionId, step, schema: acc }) ?? acc,
22
+ baseSchema
23
+ );
24
+ }, [actionId, data.scaffolderActionInputsById, schemaDecorators, step]);
25
+ const inputEntries = useMemo(() => {
26
+ const stepInput = step?.input ?? {};
27
+ return Object.entries(stepInput);
28
+ }, [step?.input]);
29
+ const usedInputKeys = useMemo(
30
+ () => new Set(inputEntries.map(([key]) => key)),
31
+ [inputEntries]
32
+ );
33
+ const missingRequiredInputKeys = useMemo(() => {
34
+ const requiredKeys = data.scaffolderActionInputRequiredById?.[actionId] ?? [];
35
+ return requiredKeys.filter((key) => !usedInputKeys.has(key));
36
+ }, [actionId, data.scaffolderActionInputRequiredById, usedInputKeys]);
37
+ const availableInputOptions = useMemo(() => {
38
+ const options = Object.entries(actionInputSchema ?? {}).filter(([key]) => !usedInputKeys.has(key)).map(([key, schema]) => {
39
+ const typedSchema = schema;
40
+ return {
41
+ key,
42
+ label: `${key} (${buildTypeLabel(typedSchema) || "string"})`,
43
+ schema: typedSchema,
44
+ type: normalizeSchemaType(typedSchema)
45
+ };
46
+ });
47
+ return options;
48
+ }, [actionInputSchema, usedInputKeys]);
49
+ const trimmedNewKey = newKey.trim();
50
+ const selectedNewKeyOption = availableInputOptions.find((opt) => opt.key === trimmedNewKey) ?? null;
51
+ const newKeyNormalizedType = normalizeSchemaType(
52
+ selectedNewKeyOption?.schema
53
+ );
54
+ const newKeyTypeLabel = buildTypeLabel(selectedNewKeyOption?.schema);
55
+ const newKeyEnumOptions = extractEnumOptions(selectedNewKeyOption?.schema);
56
+ return {
57
+ actionInputSchema,
58
+ inputEntries,
59
+ usedInputKeys,
60
+ missingRequiredInputKeys,
61
+ availableInputOptions,
62
+ trimmedNewKey,
63
+ selectedNewKeyOption,
64
+ newKeyNormalizedType,
65
+ newKeyTypeLabel,
66
+ newKeyEnumOptions
67
+ };
68
+ };
69
+
70
+ export { useActionInputs };
71
+ //# sourceMappingURL=useActionInputs.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useActionInputs.esm.js","sources":["../../../../src/components/Nodes/action/useActionInputs.ts"],"sourcesContent":["import { useMemo } from \"react\";\nimport type { TaskStep } from \"@backstage/plugin-scaffolder-common\";\nimport type { ActionNodeData } from \"../../../types/flowNodes\";\nimport {\n actionNodeCustomizationRegistry,\n type ActionSchemaDecorator,\n} from \"../../../foundation/actionNodeCustomization\";\nimport type { JsonSchemaProperty, NormalizedSchemaType } from \"./schema\";\nimport {\n buildTypeLabel,\n extractEnumOptions,\n normalizeSchemaType,\n} from \"./schema\";\n\ntype ActionInputOption = {\n key: string;\n label: string;\n schema?: JsonSchemaProperty;\n type: NormalizedSchemaType;\n};\n\ntype UseActionInputsArgs = {\n data: ActionNodeData;\n step: TaskStep;\n actionId: string;\n newKey: string;\n};\n\nexport const useActionInputs = ({\n data,\n step,\n actionId,\n newKey,\n}: UseActionInputsArgs) => {\n const schemaDecorators = useMemo<ActionSchemaDecorator[]>(\n () => actionNodeCustomizationRegistry.getSchemaDecorators(),\n []\n );\n\n const actionInputSchema = useMemo(() => {\n if (!actionId) {\n return {} as Record<string, JsonSchemaProperty>;\n }\n const baseSchema = (data.scaffolderActionInputsById?.[actionId] ??\n {}) as Record<string, JsonSchemaProperty>;\n return schemaDecorators.reduce(\n (acc, decorator) => decorator({ actionId, step, schema: acc }) ?? acc,\n baseSchema\n );\n }, [actionId, data.scaffolderActionInputsById, schemaDecorators, step]);\n\n const inputEntries = useMemo(() => {\n const stepInput = step?.input ?? {};\n return Object.entries(stepInput);\n }, [step?.input]);\n\n const usedInputKeys = useMemo(\n () => new Set(inputEntries.map(([key]) => key)),\n [inputEntries]\n );\n\n const missingRequiredInputKeys = useMemo(() => {\n const requiredKeys =\n data.scaffolderActionInputRequiredById?.[actionId] ?? [];\n return requiredKeys.filter((key) => !usedInputKeys.has(key));\n }, [actionId, data.scaffolderActionInputRequiredById, usedInputKeys]);\n\n const availableInputOptions = useMemo<ActionInputOption[]>(() => {\n const options = Object.entries(actionInputSchema ?? {})\n .filter(([key]) => !usedInputKeys.has(key))\n .map(([key, schema]) => {\n const typedSchema = schema as JsonSchemaProperty | undefined;\n return {\n key,\n label: `${key} (${buildTypeLabel(typedSchema) || \"string\"})`,\n schema: typedSchema,\n type: normalizeSchemaType(typedSchema),\n };\n });\n return options;\n }, [actionInputSchema, usedInputKeys]);\n\n const trimmedNewKey = newKey.trim();\n const selectedNewKeyOption =\n availableInputOptions.find((opt) => opt.key === trimmedNewKey) ?? null;\n const newKeyNormalizedType = normalizeSchemaType(\n selectedNewKeyOption?.schema\n );\n const newKeyTypeLabel = buildTypeLabel(selectedNewKeyOption?.schema);\n const newKeyEnumOptions = extractEnumOptions(selectedNewKeyOption?.schema);\n\n return {\n actionInputSchema,\n inputEntries,\n usedInputKeys,\n missingRequiredInputKeys,\n availableInputOptions,\n trimmedNewKey,\n selectedNewKeyOption,\n newKeyNormalizedType,\n newKeyTypeLabel,\n newKeyEnumOptions,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import { Popper } from '@material-ui/core';
3
+
4
+ const AutoWidthPopper = (props) => {
5
+ const { anchorEl } = props;
6
+ const width = anchorEl?.clientWidth ?? void 0;
7
+ return /* @__PURE__ */ jsx(Popper, { ...props, style: { width, ...props.style } });
8
+ };
9
+
10
+ export { AutoWidthPopper };
11
+ //# sourceMappingURL=AutoWidthPopper.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutoWidthPopper.esm.js","sources":["../../../../src/components/Nodes/common/AutoWidthPopper.tsx"],"sourcesContent":["import { Popper } from \"@material-ui/core\";\nimport type { PopperProps } from \"@material-ui/core\";\n\n// Popper that matches the width of the input for nicer Autocomplete menus.\nexport const AutoWidthPopper = (props: PopperProps) => {\n const { anchorEl } = props;\n const width = (anchorEl as HTMLElement | null)?.clientWidth ?? undefined;\n return <Popper {...props} style={{ width, ...props.style }} />;\n};\n"],"names":[],"mappings":";;;AAIO,MAAM,eAAA,GAAkB,CAAC,KAAA,KAAuB;AACrD,EAAA,MAAM,EAAE,UAAS,GAAI,KAAA;AACrB,EAAA,MAAM,KAAA,GAAS,UAAiC,WAAA,IAAe,MAAA;AAC/D,EAAA,uBAAO,GAAA,CAAC,MAAA,EAAA,EAAQ,GAAG,KAAA,EAAO,KAAA,EAAO,EAAE,KAAA,EAAO,GAAG,KAAA,CAAM,KAAA,EAAM,EAAG,CAAA;AAC9D;;;;"}
@@ -0,0 +1,20 @@
1
+ const createStopNodeInteraction = () => ({
2
+ onPointerDown: (e) => {
3
+ e.stopPropagation();
4
+ },
5
+ onKeyDown: (e) => {
6
+ e.stopPropagation();
7
+ },
8
+ className: "nodrag nowheel",
9
+ inputProps: {
10
+ onPointerDown: (e) => {
11
+ e.stopPropagation();
12
+ },
13
+ onKeyDown: (e) => {
14
+ e.stopPropagation();
15
+ }
16
+ }
17
+ });
18
+
19
+ export { createStopNodeInteraction };
20
+ //# sourceMappingURL=nodeInteraction.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeInteraction.esm.js","sources":["../../../../src/components/Nodes/common/nodeInteraction.ts"],"sourcesContent":["// Utilities to prevent ReactFlow interactions from interfering with inputs.\nexport const createStopNodeInteraction = () => ({\n onPointerDown: (e: React.PointerEvent<HTMLElement>) => {\n e.stopPropagation();\n },\n onKeyDown: (e: React.KeyboardEvent<HTMLElement>) => {\n e.stopPropagation();\n },\n className: \"nodrag nowheel\",\n inputProps: {\n onPointerDown: (e: React.PointerEvent<HTMLElement>) => {\n e.stopPropagation();\n },\n onKeyDown: (e: React.KeyboardEvent<HTMLElement>) => {\n e.stopPropagation();\n },\n },\n});\n"],"names":[],"mappings":"AACO,MAAM,4BAA4B,OAAO;AAAA,EAC9C,aAAA,EAAe,CAAC,CAAA,KAAuC;AACrD,IAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,EACpB,CAAA;AAAA,EACA,SAAA,EAAW,CAAC,CAAA,KAAwC;AAClD,IAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,EACpB,CAAA;AAAA,EACA,SAAA,EAAW,gBAAA;AAAA,EACX,UAAA,EAAY;AAAA,IACV,aAAA,EAAe,CAAC,CAAA,KAAuC;AACrD,MAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,IACpB,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,KAAwC;AAClD,MAAA,CAAA,CAAE,eAAA,EAAgB;AAAA,IACpB;AAAA;AAEJ,CAAA;;;;"}
@@ -0,0 +1,125 @@
1
+ import { useMemo, useCallback } from 'react';
2
+
3
+ const useOutputController = (data) => {
4
+ const { rfId, output } = data;
5
+ const stepOutputReferences = useMemo(
6
+ () => data.stepOutputReferences ?? [],
7
+ [data.stepOutputReferences]
8
+ );
9
+ const referenceOptions = useMemo(
10
+ () => Array.from(new Set(stepOutputReferences.filter(Boolean))),
11
+ [stepOutputReferences]
12
+ );
13
+ const links = useMemo(
14
+ () => Array.isArray(output?.links) ? [...output.links] : [],
15
+ [output?.links]
16
+ );
17
+ const textEntries = useMemo(
18
+ () => Array.isArray(output?.text) ? [...output.text] : [],
19
+ [output]
20
+ );
21
+ const setLinkFieldValue = useCallback(
22
+ (index, field, value) => {
23
+ const next = [...links];
24
+ const entry = { ...next[index] ?? {} };
25
+ entry[field] = value;
26
+ next[index] = entry;
27
+ data.onUpdateOutput?.(rfId, (prev) => ({
28
+ ...prev ?? {},
29
+ links: next
30
+ }));
31
+ },
32
+ [data, links, rfId]
33
+ );
34
+ const handleLinkChange = useCallback(
35
+ (index, field) => (event) => {
36
+ setLinkFieldValue(index, field, event.target.value);
37
+ },
38
+ [setLinkFieldValue]
39
+ );
40
+ const handleAddLink = useCallback(() => {
41
+ data.onUpdateOutput?.(rfId, (prev) => ({
42
+ ...prev ?? {},
43
+ links: [...links, { title: "Link", url: "" }]
44
+ }));
45
+ }, [data, links, rfId]);
46
+ const handleRemoveLink = useCallback(
47
+ (index) => {
48
+ const next = [...links];
49
+ next.splice(index, 1);
50
+ data.onUpdateOutput?.(rfId, (prev) => ({
51
+ ...prev ?? {},
52
+ links: next
53
+ }));
54
+ },
55
+ [data, links, rfId]
56
+ );
57
+ const setTextFieldValue = useCallback(
58
+ (index, field, value) => {
59
+ const next = [...textEntries];
60
+ const entry = { ...next[index] ?? {} };
61
+ entry[field] = value;
62
+ next[index] = entry;
63
+ data.onUpdateOutput?.(rfId, (prev) => ({
64
+ ...prev ?? {},
65
+ text: next
66
+ }));
67
+ },
68
+ [data, textEntries, rfId]
69
+ );
70
+ const handleTextChange = useCallback(
71
+ (index, field) => (event) => {
72
+ setTextFieldValue(index, field, event.target.value);
73
+ },
74
+ [setTextFieldValue]
75
+ );
76
+ const handleTextDefaultToggle = useCallback(
77
+ (index) => {
78
+ const next = textEntries.map((entry, idx) => ({
79
+ ...entry,
80
+ default: idx === index ? !entry?.default : false
81
+ }));
82
+ data.onUpdateOutput?.(rfId, (prev) => ({
83
+ ...prev ?? {},
84
+ text: next
85
+ }));
86
+ },
87
+ [data, rfId, textEntries]
88
+ );
89
+ const handleAddText = useCallback(() => {
90
+ data.onUpdateOutput?.(rfId, (prev) => ({
91
+ ...prev ?? {},
92
+ text: [...textEntries, { title: "Note", content: "" }]
93
+ }));
94
+ }, [data, rfId, textEntries]);
95
+ const handleRemoveText = useCallback(
96
+ (index) => {
97
+ const next = [...textEntries];
98
+ next.splice(index, 1);
99
+ data.onUpdateOutput?.(rfId, (prev) => ({
100
+ ...prev ?? {},
101
+ text: next
102
+ }));
103
+ },
104
+ [data, textEntries, rfId]
105
+ );
106
+ return {
107
+ stepOutputReferences,
108
+ links,
109
+ textEntries,
110
+ referenceOptions,
111
+ setLinkFieldValue,
112
+ handleLinkChange,
113
+ handleAddLink,
114
+ handleRemoveLink,
115
+ setTextFieldValue,
116
+ handleTextChange,
117
+ handleTextDefaultToggle,
118
+ handleAddText,
119
+ handleRemoveText,
120
+ rfId
121
+ };
122
+ };
123
+
124
+ export { useOutputController };
125
+ //# sourceMappingURL=useOutputController.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useOutputController.esm.js","sources":["../../../../src/components/Nodes/output/useOutputController.ts"],"sourcesContent":["import { useCallback, useMemo } from \"react\";\nimport type { OutputNodeData } from \"../../../types/flowNodes\";\n\nexport const useOutputController = (data: OutputNodeData) => {\n const { rfId, output } = data;\n const stepOutputReferences = useMemo(\n () => data.stepOutputReferences ?? [],\n [data.stepOutputReferences]\n );\n const referenceOptions = useMemo(\n () => Array.from(new Set(stepOutputReferences.filter(Boolean))),\n [stepOutputReferences]\n );\n\n const links = useMemo(\n () => (Array.isArray(output?.links) ? [...output.links] : []),\n [output?.links]\n );\n const textEntries = useMemo(\n () =>\n Array.isArray((output as any)?.text) ? [...(output as any).text] : [],\n [output]\n );\n\n const setLinkFieldValue = useCallback(\n (\n index: number,\n field: \"title\" | \"icon\" | \"url\" | \"entityRef\",\n value: string\n ) => {\n const next = [...links];\n const entry = { ...(next[index] ?? {}) };\n entry[field] = value;\n next[index] = entry;\n data.onUpdateOutput?.(rfId, (prev) => ({\n ...(prev ?? {}),\n links: next,\n }));\n },\n [data, links, rfId]\n );\n\n const handleLinkChange = useCallback(\n (index: number, field: \"title\" | \"icon\" | \"url\" | \"entityRef\") =>\n (event: React.ChangeEvent<HTMLInputElement>) => {\n setLinkFieldValue(index, field, event.target.value);\n },\n [setLinkFieldValue]\n );\n\n const handleAddLink = useCallback(() => {\n data.onUpdateOutput?.(rfId, (prev) => ({\n ...(prev ?? {}),\n links: [...links, { title: \"Link\", url: \"\" }],\n }));\n }, [data, links, rfId]);\n\n const handleRemoveLink = useCallback(\n (index: number) => {\n const next = [...links];\n next.splice(index, 1);\n data.onUpdateOutput?.(rfId, (prev) => ({\n ...(prev ?? {}),\n links: next,\n }));\n },\n [data, links, rfId]\n );\n\n const setTextFieldValue = useCallback(\n (\n index: number,\n field: \"title\" | \"icon\" | \"content\" | \"default\",\n value: unknown\n ) => {\n const next = [...textEntries];\n const entry = { ...(next[index] ?? {}) };\n (entry as any)[field] = value;\n next[index] = entry;\n data.onUpdateOutput?.(rfId, (prev: any) => ({\n ...(prev ?? {}),\n text: next,\n }));\n },\n [data, textEntries, rfId]\n );\n\n const handleTextChange = useCallback(\n (index: number, field: \"title\" | \"icon\" | \"content\") =>\n (event: React.ChangeEvent<HTMLInputElement>) => {\n setTextFieldValue(index, field, event.target.value);\n },\n [setTextFieldValue]\n );\n\n const handleTextDefaultToggle = useCallback(\n (index: number) => {\n const next = textEntries.map((entry, idx) => ({\n ...entry,\n default: idx === index ? !entry?.default : false,\n }));\n data.onUpdateOutput?.(rfId, (prev: any) => ({\n ...(prev ?? {}),\n text: next,\n }));\n },\n [data, rfId, textEntries]\n );\n\n const handleAddText = useCallback(() => {\n data.onUpdateOutput?.(rfId, (prev: any) => ({\n ...(prev ?? {}),\n text: [...textEntries, { title: \"Note\", content: \"\" }],\n }));\n }, [data, rfId, textEntries]);\n\n const handleRemoveText = useCallback(\n (index: number) => {\n const next = [...textEntries];\n next.splice(index, 1);\n data.onUpdateOutput?.(rfId, (prev: any) => ({\n ...(prev ?? {}),\n text: next,\n }));\n },\n [data, textEntries, rfId]\n );\n\n return {\n stepOutputReferences,\n links,\n textEntries,\n referenceOptions,\n setLinkFieldValue,\n handleLinkChange,\n handleAddLink,\n handleRemoveLink,\n setTextFieldValue,\n handleTextChange,\n handleTextDefaultToggle,\n handleAddText,\n handleRemoveText,\n rfId,\n };\n};\n"],"names":[],"mappings":"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"}