@tduniec/plugin-template-designer-foundation 0.1.11 → 0.1.12
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.
- package/CHANGELOG.md +7 -0
- package/dist/components/Nodes/ActionNode.esm.js +6 -3
- package/dist/components/Nodes/ActionNode.esm.js.map +1 -1
- package/dist/components/Nodes/action/schema.esm.js +4 -2
- package/dist/components/Nodes/action/schema.esm.js.map +1 -1
- package/dist/designerFlow/model.esm.js +65 -5
- package/dist/designerFlow/model.esm.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,10 @@
|
|
|
1
|
+
## [0.1.12](https://github.com/tduniec/template-designer-plugin/compare/template-designer-foundation-v0.1.11...template-designer-foundation-v0.1.12) (2026-02-16)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* suggestions in poper and textfields, parse template initialy as yaml ([#68](https://github.com/tduniec/template-designer-plugin/issues/68)) ([31d47d2](https://github.com/tduniec/template-designer-plugin/commit/31d47d2a037cdfb323d4311a5550964741111b27))
|
|
7
|
+
|
|
1
8
|
## [0.1.11](https://github.com/tduniec/template-designer-plugin/compare/template-designer-foundation-v0.1.10...template-designer-foundation-v0.1.11) (2026-02-15)
|
|
2
9
|
|
|
3
10
|
|
|
@@ -80,7 +80,10 @@ const ActionNodeComponent = ({ data }) => {
|
|
|
80
80
|
/* @__PURE__ */ new Set([
|
|
81
81
|
...newKeyNormalizedType === "boolean" ? ["true", "false"] : [],
|
|
82
82
|
...newKeyEnumOptions,
|
|
83
|
-
...stepOutputReferences
|
|
83
|
+
...stepOutputReferences,
|
|
84
|
+
// add parameter references into suggestions (they are already in stepOutputReferences upstream,
|
|
85
|
+
// but keep this for safety when cache misses occur)
|
|
86
|
+
...data.stepOutputReferences ?? []
|
|
84
87
|
])
|
|
85
88
|
);
|
|
86
89
|
const paletteMode = theme.palette.mode ?? theme.palette.type ?? "light";
|
|
@@ -339,7 +342,7 @@ const ActionNodeComponent = ({ data }) => {
|
|
|
339
342
|
size: "small",
|
|
340
343
|
value: displayValue,
|
|
341
344
|
onChange: (event) => handleStringChange(event.target.value),
|
|
342
|
-
placeholder: "
|
|
345
|
+
placeholder: "YAML value",
|
|
343
346
|
fullWidth: true,
|
|
344
347
|
multiline: true,
|
|
345
348
|
minRows: 2,
|
|
@@ -484,7 +487,7 @@ const ActionNodeComponent = ({ data }) => {
|
|
|
484
487
|
size: "small",
|
|
485
488
|
value: newVal,
|
|
486
489
|
onChange: (event) => setNewVal(event.target.value),
|
|
487
|
-
placeholder: "
|
|
490
|
+
placeholder: "YAML value",
|
|
488
491
|
fullWidth: true,
|
|
489
492
|
multiline: true,
|
|
490
493
|
minRows: 2,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionNode.esm.js","sources":["../../../src/components/Nodes/ActionNode.tsx"],"sourcesContent":["import { memo, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport type { ChangeEvent } from \"react\";\nimport { Handle, Position, NodeToolbar } from \"@xyflow/react\";\nimport { styled, useTheme } from \"@material-ui/core/styles\";\nimport {\n Box,\n Typography,\n TextField,\n IconButton,\n Button,\n Divider,\n Chip,\n} from \"@material-ui/core\";\nimport DeleteOutlineIcon from \"@material-ui/icons/DeleteOutline\";\nimport AddIcon from \"@material-ui/icons/Add\";\nimport type { TaskStep } from \"@backstage/plugin-scaffolder-common\";\nimport Autocomplete from \"@material-ui/lab/Autocomplete\";\nimport type { ActionNodeData } from \"../../types/flowNodes\";\nimport type { JsonSchemaProperty } from \"./action/schema\";\nimport {\n coerceValueForType,\n extractEnumOptions,\n buildTypeLabel,\n normalizeSchemaType,\n stringifyValueForDisplay,\n} from \"./action/schema\";\nimport { useActionInputs } from \"./action/useActionInputs\";\nimport { createStopNodeInteraction } from \"./common/nodeInteraction\";\nimport { AutoWidthPopper } from \"./common/AutoWidthPopper\";\n\nconst Card = styled(Box)(({ theme }) => ({\n background: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 12,\n width: 760, // card width\n padding: theme.spacing(1.5),\n boxShadow: theme.shadows[2],\n color: theme.palette.text.primary,\n}));\n\nconst Header = styled(Box)(({ theme }) => ({\n display: \"grid\",\n gridTemplateColumns: \"1fr\",\n gap: theme.spacing(1),\n marginBottom: theme.spacing(1),\n}));\n\nconst Grid = styled(Box)(({ theme }) => ({\n display: \"grid\",\n gridTemplateColumns: \"88px 1fr\",\n gap: theme.spacing(1),\n alignItems: \"center\",\n}));\n\nconst KvRow = styled(Box)(({ theme }) => ({\n display: \"grid\",\n gridTemplateColumns: \"200px 140px 1fr auto\",\n gap: theme.spacing(1),\n alignItems: \"center\",\n}));\n\nconst DEFAULT_ACTION_OPTIONS = [\n \"fetch:template\", // TODO to be fixed later to not uses default actions\n];\n\nconst ActionNodeComponent: React.FC<{ data: ActionNodeData }> = ({ data }) => {\n const { rfId, step } = data;\n if (process.env.NODE_ENV === \"development\") {\n // Helps confirm rerender counts per node without shipping console noise to production.\n // eslint-disable-next-line no-console\n console.debug(\"[DesignerFlow] render ActionNode\", rfId);\n }\n const [newKey, setNewKey] = useState(\"\");\n const [newVal, setNewVal] = useState(\"\");\n const stepOutputReferences = data.stepOutputReferences ?? [];\n const [isConfirmingDelete, setIsConfirmingDelete] = useState(false);\n const deleteConfirmationTimeoutRef = useRef<ReturnType<\n typeof setTimeout\n > | null>(null);\n\n const theme = useTheme();\n const actionOptions =\n (data.scaffolderActionIds?.length ?? 0) > 0\n ? data.scaffolderActionIds ?? []\n : DEFAULT_ACTION_OPTIONS;\n\n const handleTop =\n (field: keyof TaskStep) => (e: ChangeEvent<HTMLInputElement>) =>\n data.onUpdateField?.(rfId, field, e.target.value);\n\n const actionId = typeof step?.action === \"string\" ? step.action : \"\";\n const [actionInputValue, setActionInputValue] = useState(actionId);\n\n useEffect(() => {\n setActionInputValue(actionId);\n }, [actionId]);\n\n const {\n actionInputSchema,\n inputEntries,\n usedInputKeys,\n missingRequiredInputKeys,\n availableInputOptions,\n trimmedNewKey,\n selectedNewKeyOption,\n newKeyNormalizedType,\n newKeyTypeLabel,\n newKeyEnumOptions,\n } = useActionInputs({ data, step, actionId, newKey });\n const displayedNewKeyTypeLabel = newKeyTypeLabel || \"Any\";\n const hasMissingRequiredInputs = missingRequiredInputKeys.length > 0;\n const isAddDisabled = !trimmedNewKey || usedInputKeys.has(trimmedNewKey);\n const newValueOptions = Array.from(\n new Set([\n ...(newKeyNormalizedType === \"boolean\" ? [\"true\", \"false\"] : []),\n ...newKeyEnumOptions,\n ...stepOutputReferences,\n ])\n );\n const paletteMode =\n (theme.palette as { mode?: \"light\" | \"dark\" }).mode ??\n theme.palette.type ??\n \"light\";\n const requiredInputsBackground =\n paletteMode === \"dark\"\n ? \"rgba(244, 67, 54, 0.2)\"\n : \"rgba(244, 67, 54, 0.08)\";\n\n const addPair = () => {\n const k = trimmedNewKey;\n if (!k || usedInputKeys.has(k)) return;\n\n const schema =\n selectedNewKeyOption?.schema ??\n (actionInputSchema?.[k] as JsonSchemaProperty | undefined);\n const normalizedType = normalizeSchemaType(schema);\n const parsedValue = coerceValueForType(newVal, normalizedType);\n\n data.onUpdateInput?.(rfId, k, parsedValue);\n setNewKey(\"\");\n setNewVal(\"\");\n };\n\n const stopAll = createStopNodeInteraction();\n\n useEffect(() => {\n if (!isConfirmingDelete) {\n if (deleteConfirmationTimeoutRef.current) {\n clearTimeout(deleteConfirmationTimeoutRef.current);\n deleteConfirmationTimeoutRef.current = null;\n }\n return undefined;\n }\n deleteConfirmationTimeoutRef.current = setTimeout(() => {\n setIsConfirmingDelete(false);\n deleteConfirmationTimeoutRef.current = null;\n }, 3500);\n return () => {\n if (deleteConfirmationTimeoutRef.current) {\n clearTimeout(deleteConfirmationTimeoutRef.current);\n deleteConfirmationTimeoutRef.current = null;\n }\n };\n }, [isConfirmingDelete]);\n\n const handleDeleteNode = () => {\n if (!data.onRemoveNode) {\n return;\n }\n if (!isConfirmingDelete) {\n setIsConfirmingDelete(true);\n return;\n }\n data.onRemoveNode(rfId);\n setIsConfirmingDelete(false);\n };\n\n return (\n <Card>\n <Header title={step?.name || \"Unnamed Step\"}>\n <Box\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: theme.spacing(1),\n }}\n >\n <Typography variant=\"subtitle2\" noWrap>\n {step?.name || \"Unnamed Step\"}\n </Typography>\n {(data.headerActionsSlot || data.onRemoveNode) && (\n <Box\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: theme.spacing(0.5),\n color: theme.palette.text.secondary,\n }}\n >\n {data.headerActionsSlot ? (\n <Box\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: theme.spacing(0.5),\n }}\n >\n {data.headerActionsSlot as ReactNode}\n </Box>\n ) : null}\n {data.onRemoveNode ? (\n <>\n {isConfirmingDelete && (\n <Typography variant=\"caption\" color=\"error\">\n Click again to delete\n </Typography>\n )}\n <IconButton\n size=\"small\"\n onClick={handleDeleteNode}\n onPointerDown={(e) => e.stopPropagation()}\n aria-label=\"Remove action\"\n color={isConfirmingDelete ? \"secondary\" : \"default\"}\n className=\"nodrag nowheel\"\n >\n <DeleteOutlineIcon fontSize=\"small\" />\n </IconButton>\n </>\n ) : null}\n </Box>\n )}\n </Box>\n {data.inputsLeadingSlot ? (\n <Box sx={{ mb: 1 }}>{data.inputsLeadingSlot as ReactNode}</Box>\n ) : null}\n <Typography variant=\"caption\" color=\"textSecondary\">\n Action\n </Typography>\n <Autocomplete\n size=\"small\"\n options={actionOptions}\n PopperComponent={AutoWidthPopper}\n freeSolo\n autoHighlight\n value={actionId}\n inputValue={actionInputValue}\n filterOptions={(options) => {\n const needle = actionInputValue.trim().toLowerCase();\n if (!needle) {\n return options;\n }\n return options.filter((opt) => opt.toLowerCase().includes(needle));\n }}\n onChange={(_, newValue) => {\n const nextValue = newValue ?? \"\";\n setActionInputValue(nextValue);\n data.onUpdateField?.(rfId, \"action\", nextValue);\n }}\n onInputChange={(_, newInputValue, reason) => {\n if (reason === \"reset\") {\n return;\n }\n const nextValue = newInputValue ?? \"\";\n setActionInputValue(nextValue);\n data.onUpdateField?.(rfId, \"action\", nextValue);\n }}\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n className={stopAll.className}\n fullWidth\n renderInput={(params) => (\n <TextField\n {...params}\n size=\"small\"\n placeholder=\"e.g. fetch:template\"\n fullWidth\n inputProps={{\n ...params.inputProps,\n ...stopAll.inputProps,\n }}\n />\n )}\n />\n </Header>\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: rfId,\n type: \"actionNode\",\n })\n }\n onPointerDown={(e) => e.stopPropagation()}\n className=\"nodrag nowheel\"\n >\n Add Action\n </Button>\n </NodeToolbar>\n\n <Divider />\n\n <Box sx={{ mb: 1 }}>\n <Grid>\n <Typography variant=\"caption\" color=\"textSecondary\">\n ID\n </Typography>\n <TextField\n size=\"small\"\n placeholder=\"string id\"\n value={String(step?.id ?? \"\")}\n onChange={handleTop(\"id\")}\n fullWidth\n {...stopAll}\n />\n\n <Typography variant=\"caption\" color=\"textSecondary\">\n Name\n </Typography>\n <TextField\n size=\"small\"\n placeholder=\"Step name\"\n value={String(step?.name ?? \"\")}\n onChange={handleTop(\"name\")}\n fullWidth\n {...stopAll}\n />\n </Grid>\n </Box>\n\n <Typography variant=\"caption\" color=\"textSecondary\">\n Inputs\n </Typography>\n\n <Box sx={{ display: \"grid\", mt: 0.5 }}>\n {inputEntries.length === 0 && (\n <Box\n sx={{\n fontSize: 12,\n color: theme.palette.text.secondary,\n border: `1px dashed ${theme.palette.divider}`,\n borderRadius: 1,\n p: 1,\n textAlign: \"center\",\n }}\n >\n No inputs yet\n </Box>\n )}\n\n <KvRow\n sx={{\n mt: inputEntries.length === 0 ? 1.5 : 0.5,\n color: theme.palette.text.secondary,\n }}\n >\n <Typography variant=\"caption\" color=\"textSecondary\">\n Key\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Type\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Value\n </Typography>\n <Box />\n </KvRow>\n\n {inputEntries.map(([k, v]) => {\n const schema = actionInputSchema?.[k];\n const normalizedType = normalizeSchemaType(schema, v);\n const fallbackTypeLabel =\n normalizedType === \"unknown\"\n ? \"Unknown\"\n : normalizedType[0].toUpperCase() + normalizedType.slice(1);\n const typeLabel = buildTypeLabel(schema) || fallbackTypeLabel;\n const enumOptions = extractEnumOptions(schema);\n const baseOptions =\n normalizedType === \"boolean\" ? [\"true\", \"false\"] : [];\n const options = Array.from(\n new Set([...baseOptions, ...enumOptions, ...stepOutputReferences])\n );\n const displayValue = stringifyValueForDisplay(v, normalizedType);\n const handleStringChange = (nextValue: string) => {\n const parsed = coerceValueForType(nextValue, normalizedType);\n data.onUpdateInput?.(rfId, k, parsed);\n };\n\n return (\n <KvRow key={k}>\n <Typography\n variant=\"caption\"\n noWrap\n title={k}\n color=\"textSecondary\"\n >\n {k}\n </Typography>\n <Box display=\"flex\">\n <Chip size=\"small\" variant=\"outlined\" label={typeLabel} />\n </Box>\n {(normalizedType === \"array\" || normalizedType === \"object\") && (\n <TextField\n size=\"small\"\n value={displayValue}\n onChange={(event) => handleStringChange(event.target.value)}\n placeholder=\"JSON value\"\n fullWidth\n multiline\n minRows={2}\n inputProps={{\n ...stopAll.inputProps,\n }}\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n className={stopAll.className}\n />\n )}\n {(normalizedType === \"number\" ||\n normalizedType === \"integer\") && (\n <TextField\n size=\"small\"\n value={displayValue}\n onChange={(event) => handleStringChange(event.target.value)}\n placeholder=\"Number\"\n fullWidth\n inputProps={{\n ...stopAll.inputProps,\n inputMode: \"decimal\",\n }}\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n className={stopAll.className}\n />\n )}\n {normalizedType !== \"array\" &&\n normalizedType !== \"object\" &&\n normalizedType !== \"number\" &&\n normalizedType !== \"integer\" && (\n <Autocomplete\n size=\"small\"\n freeSolo\n options={options}\n PopperComponent={AutoWidthPopper}\n value={displayValue}\n inputValue={displayValue}\n fullWidth\n onChange={(_, value) => handleStringChange(value ?? \"\")}\n onInputChange={(_, value, reason) => {\n if (reason === \"reset\") {\n return;\n }\n handleStringChange(value ?? \"\");\n }}\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n className={stopAll.className}\n renderInput={(params) => (\n <TextField\n {...params}\n size=\"small\"\n placeholder=\"value\"\n inputProps={{\n ...params.inputProps,\n ...stopAll.inputProps,\n }}\n />\n )}\n />\n )}\n <IconButton\n size=\"small\"\n onClick={() => data.onRemoveInputKey?.(rfId, k)}\n onPointerDown={(e) => e.stopPropagation()}\n aria-label={`Remove ${k}`}\n className=\"nodrag nowheel\"\n >\n <DeleteOutlineIcon fontSize=\"small\" />\n </IconButton>\n </KvRow>\n );\n })}\n\n <KvRow>\n <Autocomplete\n size=\"small\"\n freeSolo\n options={availableInputOptions}\n PopperComponent={AutoWidthPopper}\n value={selectedNewKeyOption}\n inputValue={newKey}\n filterOptions={(options) => {\n const needle = newKey.trim().toLowerCase();\n if (!needle) {\n return options;\n }\n return options.filter((option) =>\n (typeof option === \"string\" ? option : option.label)\n .toLowerCase()\n .includes(needle)\n );\n }}\n onChange={(_, value) => {\n if (!value) {\n setNewKey(\"\");\n return;\n }\n if (typeof value === \"string\") {\n setNewKey(value);\n return;\n }\n setNewKey(value.key);\n }}\n onInputChange={(_, value, reason) => {\n if (reason === \"reset\") {\n return;\n }\n setNewKey(value ?? \"\");\n }}\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n className={stopAll.className}\n getOptionSelected={(\n option: { key: string },\n value: { key?: string } | null\n ) => option.key === value?.key}\n getOptionLabel={(option) =>\n typeof option === \"string\" ? option : option.label\n }\n renderInput={(params) => (\n <TextField\n {...params}\n size=\"small\"\n placeholder=\"new key\"\n inputProps={{\n ...params.inputProps,\n ...stopAll.inputProps,\n }}\n />\n )}\n />\n <Box display=\"flex\">\n <Chip\n size=\"small\"\n variant=\"outlined\"\n label={displayedNewKeyTypeLabel}\n />\n </Box>\n {(newKeyNormalizedType === \"array\" ||\n newKeyNormalizedType === \"object\") && (\n <TextField\n size=\"small\"\n value={newVal}\n onChange={(event) => setNewVal(event.target.value)}\n placeholder=\"JSON value\"\n fullWidth\n multiline\n minRows={2}\n inputProps={{\n ...stopAll.inputProps,\n }}\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n className={stopAll.className}\n />\n )}\n {(newKeyNormalizedType === \"number\" ||\n newKeyNormalizedType === \"integer\") && (\n <TextField\n size=\"small\"\n value={newVal}\n onChange={(event) => setNewVal(event.target.value)}\n placeholder=\"Number\"\n fullWidth\n inputProps={{\n ...stopAll.inputProps,\n inputMode: \"decimal\",\n }}\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n className={stopAll.className}\n />\n )}\n {newKeyNormalizedType !== \"array\" &&\n newKeyNormalizedType !== \"object\" &&\n newKeyNormalizedType !== \"number\" &&\n newKeyNormalizedType !== \"integer\" && (\n <Autocomplete\n size=\"small\"\n freeSolo\n options={newValueOptions}\n PopperComponent={AutoWidthPopper}\n value={newVal}\n inputValue={newVal}\n fullWidth\n filterOptions={(options) => {\n const needle = newVal.trim().toLowerCase();\n if (!needle) {\n return options;\n }\n return options.filter((option) => {\n const raw = String(option);\n const normalized = raw\n .replace(/^\\s*\\$\\{\\{\\s*/, \"\")\n .replace(/\\s*\\}\\}\\s*$/, \"\");\n const haystacks = [\n raw.toLowerCase(),\n normalized.toLowerCase(),\n ];\n return haystacks.some((haystack) =>\n haystack.includes(needle)\n );\n });\n }}\n onChange={(_, value) => setNewVal(value ?? \"\")}\n onInputChange={(_, value, reason) => {\n if (reason === \"reset\") {\n return;\n }\n setNewVal(value ?? \"\");\n }}\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n className={stopAll.className}\n renderInput={(params) => (\n <TextField\n {...params}\n size=\"small\"\n placeholder=\"new value\"\n inputProps={{\n ...params.inputProps,\n ...stopAll.inputProps,\n }}\n />\n )}\n />\n )}\n <Button\n size=\"small\"\n variant=\"contained\"\n onClick={addPair}\n onPointerDown={(e) => e.stopPropagation()}\n disabled={isAddDisabled}\n className=\"nodrag nowheel\"\n >\n Add\n </Button>\n </KvRow>\n </Box>\n\n {hasMissingRequiredInputs && (\n <Box\n sx={{\n mt: 1.5,\n p: 1,\n borderRadius: 1,\n border: `1px solid ${theme.palette.error.main}`,\n }}\n style={{ backgroundColor: requiredInputsBackground }}\n >\n <Typography variant=\"caption\" color=\"error\">\n Missing required inputs\n </Typography>\n <Box\n sx={{\n display: \"flex\",\n flexWrap: \"wrap\",\n mt: 0.75,\n }}\n style={{ gap: theme.spacing(0.5) }}\n >\n {missingRequiredInputKeys.map((key) => (\n <Chip\n key={key}\n size=\"small\"\n variant=\"outlined\"\n label={key}\n style={{\n borderColor: theme.palette.error.main,\n color: theme.palette.error.main,\n }}\n />\n ))}\n </Box>\n </Box>\n )}\n\n <Handle type=\"target\" position={Position.Top} />\n <Handle type=\"source\" position={Position.Bottom} />\n </Card>\n );\n};\n\nexport const ActionNode = memo(ActionNodeComponent);\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ActionNode.esm.js","sources":["../../../src/components/Nodes/ActionNode.tsx"],"sourcesContent":["import { memo, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport type { ChangeEvent } from \"react\";\nimport { Handle, Position, NodeToolbar } from \"@xyflow/react\";\nimport { styled, useTheme } from \"@material-ui/core/styles\";\nimport {\n Box,\n Typography,\n TextField,\n IconButton,\n Button,\n Divider,\n Chip,\n} from \"@material-ui/core\";\nimport DeleteOutlineIcon from \"@material-ui/icons/DeleteOutline\";\nimport AddIcon from \"@material-ui/icons/Add\";\nimport type { TaskStep } from \"@backstage/plugin-scaffolder-common\";\nimport Autocomplete from \"@material-ui/lab/Autocomplete\";\nimport type { ActionNodeData } from \"../../types/flowNodes\";\nimport type { JsonSchemaProperty } from \"./action/schema\";\nimport {\n coerceValueForType,\n extractEnumOptions,\n buildTypeLabel,\n normalizeSchemaType,\n stringifyValueForDisplay,\n} from \"./action/schema\";\nimport { useActionInputs } from \"./action/useActionInputs\";\nimport { createStopNodeInteraction } from \"./common/nodeInteraction\";\nimport { AutoWidthPopper } from \"./common/AutoWidthPopper\";\n\nconst Card = styled(Box)(({ theme }) => ({\n background: theme.palette.background.paper,\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: 12,\n width: 760, // card width\n padding: theme.spacing(1.5),\n boxShadow: theme.shadows[2],\n color: theme.palette.text.primary,\n}));\n\nconst Header = styled(Box)(({ theme }) => ({\n display: \"grid\",\n gridTemplateColumns: \"1fr\",\n gap: theme.spacing(1),\n marginBottom: theme.spacing(1),\n}));\n\nconst Grid = styled(Box)(({ theme }) => ({\n display: \"grid\",\n gridTemplateColumns: \"88px 1fr\",\n gap: theme.spacing(1),\n alignItems: \"center\",\n}));\n\nconst KvRow = styled(Box)(({ theme }) => ({\n display: \"grid\",\n gridTemplateColumns: \"200px 140px 1fr auto\",\n gap: theme.spacing(1),\n alignItems: \"center\",\n}));\n\nconst DEFAULT_ACTION_OPTIONS = [\n \"fetch:template\", // TODO to be fixed later to not uses default actions\n];\n\nconst ActionNodeComponent: React.FC<{ data: ActionNodeData }> = ({ data }) => {\n const { rfId, step } = data;\n if (process.env.NODE_ENV === \"development\") {\n // Helps confirm rerender counts per node without shipping console noise to production.\n // eslint-disable-next-line no-console\n console.debug(\"[DesignerFlow] render ActionNode\", rfId);\n }\n const [newKey, setNewKey] = useState(\"\");\n const [newVal, setNewVal] = useState(\"\");\n const stepOutputReferences = data.stepOutputReferences ?? [];\n const [isConfirmingDelete, setIsConfirmingDelete] = useState(false);\n const deleteConfirmationTimeoutRef = useRef<ReturnType<\n typeof setTimeout\n > | null>(null);\n\n const theme = useTheme();\n const actionOptions =\n (data.scaffolderActionIds?.length ?? 0) > 0\n ? data.scaffolderActionIds ?? []\n : DEFAULT_ACTION_OPTIONS;\n\n const handleTop =\n (field: keyof TaskStep) => (e: ChangeEvent<HTMLInputElement>) =>\n data.onUpdateField?.(rfId, field, e.target.value);\n\n const actionId = typeof step?.action === \"string\" ? step.action : \"\";\n const [actionInputValue, setActionInputValue] = useState(actionId);\n\n useEffect(() => {\n setActionInputValue(actionId);\n }, [actionId]);\n\n const {\n actionInputSchema,\n inputEntries,\n usedInputKeys,\n missingRequiredInputKeys,\n availableInputOptions,\n trimmedNewKey,\n selectedNewKeyOption,\n newKeyNormalizedType,\n newKeyTypeLabel,\n newKeyEnumOptions,\n } = useActionInputs({ data, step, actionId, newKey });\n const displayedNewKeyTypeLabel = newKeyTypeLabel || \"Any\";\n const hasMissingRequiredInputs = missingRequiredInputKeys.length > 0;\n const isAddDisabled = !trimmedNewKey || usedInputKeys.has(trimmedNewKey);\n const newValueOptions = Array.from(\n new Set([\n ...(newKeyNormalizedType === \"boolean\" ? [\"true\", \"false\"] : []),\n ...newKeyEnumOptions,\n ...stepOutputReferences,\n // add parameter references into suggestions (they are already in stepOutputReferences upstream,\n // but keep this for safety when cache misses occur)\n ...(data.stepOutputReferences ?? []),\n ])\n );\n const paletteMode =\n (theme.palette as { mode?: \"light\" | \"dark\" }).mode ??\n theme.palette.type ??\n \"light\";\n const requiredInputsBackground =\n paletteMode === \"dark\"\n ? \"rgba(244, 67, 54, 0.2)\"\n : \"rgba(244, 67, 54, 0.08)\";\n\n const addPair = () => {\n const k = trimmedNewKey;\n if (!k || usedInputKeys.has(k)) return;\n\n const schema =\n selectedNewKeyOption?.schema ??\n (actionInputSchema?.[k] as JsonSchemaProperty | undefined);\n const normalizedType = normalizeSchemaType(schema);\n const parsedValue = coerceValueForType(newVal, normalizedType);\n\n data.onUpdateInput?.(rfId, k, parsedValue);\n setNewKey(\"\");\n setNewVal(\"\");\n };\n\n const stopAll = createStopNodeInteraction();\n\n useEffect(() => {\n if (!isConfirmingDelete) {\n if (deleteConfirmationTimeoutRef.current) {\n clearTimeout(deleteConfirmationTimeoutRef.current);\n deleteConfirmationTimeoutRef.current = null;\n }\n return undefined;\n }\n deleteConfirmationTimeoutRef.current = setTimeout(() => {\n setIsConfirmingDelete(false);\n deleteConfirmationTimeoutRef.current = null;\n }, 3500);\n return () => {\n if (deleteConfirmationTimeoutRef.current) {\n clearTimeout(deleteConfirmationTimeoutRef.current);\n deleteConfirmationTimeoutRef.current = null;\n }\n };\n }, [isConfirmingDelete]);\n\n const handleDeleteNode = () => {\n if (!data.onRemoveNode) {\n return;\n }\n if (!isConfirmingDelete) {\n setIsConfirmingDelete(true);\n return;\n }\n data.onRemoveNode(rfId);\n setIsConfirmingDelete(false);\n };\n\n return (\n <Card>\n <Header title={step?.name || \"Unnamed Step\"}>\n <Box\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n gap: theme.spacing(1),\n }}\n >\n <Typography variant=\"subtitle2\" noWrap>\n {step?.name || \"Unnamed Step\"}\n </Typography>\n {(data.headerActionsSlot || data.onRemoveNode) && (\n <Box\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: theme.spacing(0.5),\n color: theme.palette.text.secondary,\n }}\n >\n {data.headerActionsSlot ? (\n <Box\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: theme.spacing(0.5),\n }}\n >\n {data.headerActionsSlot as ReactNode}\n </Box>\n ) : null}\n {data.onRemoveNode ? (\n <>\n {isConfirmingDelete && (\n <Typography variant=\"caption\" color=\"error\">\n Click again to delete\n </Typography>\n )}\n <IconButton\n size=\"small\"\n onClick={handleDeleteNode}\n onPointerDown={(e) => e.stopPropagation()}\n aria-label=\"Remove action\"\n color={isConfirmingDelete ? \"secondary\" : \"default\"}\n className=\"nodrag nowheel\"\n >\n <DeleteOutlineIcon fontSize=\"small\" />\n </IconButton>\n </>\n ) : null}\n </Box>\n )}\n </Box>\n {data.inputsLeadingSlot ? (\n <Box sx={{ mb: 1 }}>{data.inputsLeadingSlot as ReactNode}</Box>\n ) : null}\n <Typography variant=\"caption\" color=\"textSecondary\">\n Action\n </Typography>\n <Autocomplete\n size=\"small\"\n options={actionOptions}\n PopperComponent={AutoWidthPopper}\n freeSolo\n autoHighlight\n value={actionId}\n inputValue={actionInputValue}\n filterOptions={(options) => {\n const needle = actionInputValue.trim().toLowerCase();\n if (!needle) {\n return options;\n }\n return options.filter((opt) => opt.toLowerCase().includes(needle));\n }}\n onChange={(_, newValue) => {\n const nextValue = newValue ?? \"\";\n setActionInputValue(nextValue);\n data.onUpdateField?.(rfId, \"action\", nextValue);\n }}\n onInputChange={(_, newInputValue, reason) => {\n if (reason === \"reset\") {\n return;\n }\n const nextValue = newInputValue ?? \"\";\n setActionInputValue(nextValue);\n data.onUpdateField?.(rfId, \"action\", nextValue);\n }}\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n className={stopAll.className}\n fullWidth\n renderInput={(params) => (\n <TextField\n {...params}\n size=\"small\"\n placeholder=\"e.g. fetch:template\"\n fullWidth\n inputProps={{\n ...params.inputProps,\n ...stopAll.inputProps,\n }}\n />\n )}\n />\n </Header>\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: rfId,\n type: \"actionNode\",\n })\n }\n onPointerDown={(e) => e.stopPropagation()}\n className=\"nodrag nowheel\"\n >\n Add Action\n </Button>\n </NodeToolbar>\n\n <Divider />\n\n <Box sx={{ mb: 1 }}>\n <Grid>\n <Typography variant=\"caption\" color=\"textSecondary\">\n ID\n </Typography>\n <TextField\n size=\"small\"\n placeholder=\"string id\"\n value={String(step?.id ?? \"\")}\n onChange={handleTop(\"id\")}\n fullWidth\n {...stopAll}\n />\n\n <Typography variant=\"caption\" color=\"textSecondary\">\n Name\n </Typography>\n <TextField\n size=\"small\"\n placeholder=\"Step name\"\n value={String(step?.name ?? \"\")}\n onChange={handleTop(\"name\")}\n fullWidth\n {...stopAll}\n />\n </Grid>\n </Box>\n\n <Typography variant=\"caption\" color=\"textSecondary\">\n Inputs\n </Typography>\n\n <Box sx={{ display: \"grid\", mt: 0.5 }}>\n {inputEntries.length === 0 && (\n <Box\n sx={{\n fontSize: 12,\n color: theme.palette.text.secondary,\n border: `1px dashed ${theme.palette.divider}`,\n borderRadius: 1,\n p: 1,\n textAlign: \"center\",\n }}\n >\n No inputs yet\n </Box>\n )}\n\n <KvRow\n sx={{\n mt: inputEntries.length === 0 ? 1.5 : 0.5,\n color: theme.palette.text.secondary,\n }}\n >\n <Typography variant=\"caption\" color=\"textSecondary\">\n Key\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Type\n </Typography>\n <Typography variant=\"caption\" color=\"textSecondary\">\n Value\n </Typography>\n <Box />\n </KvRow>\n\n {inputEntries.map(([k, v]) => {\n const schema = actionInputSchema?.[k];\n const normalizedType = normalizeSchemaType(schema, v);\n const fallbackTypeLabel =\n normalizedType === \"unknown\"\n ? \"Unknown\"\n : normalizedType[0].toUpperCase() + normalizedType.slice(1);\n const typeLabel = buildTypeLabel(schema) || fallbackTypeLabel;\n const enumOptions = extractEnumOptions(schema);\n const baseOptions =\n normalizedType === \"boolean\" ? [\"true\", \"false\"] : [];\n const options = Array.from(\n new Set([...baseOptions, ...enumOptions, ...stepOutputReferences])\n );\n const displayValue = stringifyValueForDisplay(v, normalizedType);\n const handleStringChange = (nextValue: string) => {\n const parsed = coerceValueForType(nextValue, normalizedType);\n data.onUpdateInput?.(rfId, k, parsed);\n };\n\n return (\n <KvRow key={k}>\n <Typography\n variant=\"caption\"\n noWrap\n title={k}\n color=\"textSecondary\"\n >\n {k}\n </Typography>\n <Box display=\"flex\">\n <Chip size=\"small\" variant=\"outlined\" label={typeLabel} />\n </Box>\n {(normalizedType === \"array\" || normalizedType === \"object\") && (\n <TextField\n size=\"small\"\n value={displayValue}\n onChange={(event) => handleStringChange(event.target.value)}\n placeholder=\"YAML value\"\n fullWidth\n multiline\n minRows={2}\n inputProps={{\n ...stopAll.inputProps,\n }}\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n className={stopAll.className}\n />\n )}\n {(normalizedType === \"number\" ||\n normalizedType === \"integer\") && (\n <TextField\n size=\"small\"\n value={displayValue}\n onChange={(event) => handleStringChange(event.target.value)}\n placeholder=\"Number\"\n fullWidth\n inputProps={{\n ...stopAll.inputProps,\n inputMode: \"decimal\",\n }}\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n className={stopAll.className}\n />\n )}\n {normalizedType !== \"array\" &&\n normalizedType !== \"object\" &&\n normalizedType !== \"number\" &&\n normalizedType !== \"integer\" && (\n <Autocomplete\n size=\"small\"\n freeSolo\n options={options}\n PopperComponent={AutoWidthPopper}\n value={displayValue}\n inputValue={displayValue}\n fullWidth\n onChange={(_, value) => handleStringChange(value ?? \"\")}\n onInputChange={(_, value, reason) => {\n if (reason === \"reset\") {\n return;\n }\n handleStringChange(value ?? \"\");\n }}\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n className={stopAll.className}\n renderInput={(params) => (\n <TextField\n {...params}\n size=\"small\"\n placeholder=\"value\"\n inputProps={{\n ...params.inputProps,\n ...stopAll.inputProps,\n }}\n />\n )}\n />\n )}\n <IconButton\n size=\"small\"\n onClick={() => data.onRemoveInputKey?.(rfId, k)}\n onPointerDown={(e) => e.stopPropagation()}\n aria-label={`Remove ${k}`}\n className=\"nodrag nowheel\"\n >\n <DeleteOutlineIcon fontSize=\"small\" />\n </IconButton>\n </KvRow>\n );\n })}\n\n <KvRow>\n <Autocomplete\n size=\"small\"\n freeSolo\n options={availableInputOptions}\n PopperComponent={AutoWidthPopper}\n value={selectedNewKeyOption}\n inputValue={newKey}\n filterOptions={(options) => {\n const needle = newKey.trim().toLowerCase();\n if (!needle) {\n return options;\n }\n return options.filter((option) =>\n (typeof option === \"string\" ? option : option.label)\n .toLowerCase()\n .includes(needle)\n );\n }}\n onChange={(_, value) => {\n if (!value) {\n setNewKey(\"\");\n return;\n }\n if (typeof value === \"string\") {\n setNewKey(value);\n return;\n }\n setNewKey(value.key);\n }}\n onInputChange={(_, value, reason) => {\n if (reason === \"reset\") {\n return;\n }\n setNewKey(value ?? \"\");\n }}\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n className={stopAll.className}\n getOptionSelected={(\n option: { key: string },\n value: { key?: string } | null\n ) => option.key === value?.key}\n getOptionLabel={(option) =>\n typeof option === \"string\" ? option : option.label\n }\n renderInput={(params) => (\n <TextField\n {...params}\n size=\"small\"\n placeholder=\"new key\"\n inputProps={{\n ...params.inputProps,\n ...stopAll.inputProps,\n }}\n />\n )}\n />\n <Box display=\"flex\">\n <Chip\n size=\"small\"\n variant=\"outlined\"\n label={displayedNewKeyTypeLabel}\n />\n </Box>\n {(newKeyNormalizedType === \"array\" ||\n newKeyNormalizedType === \"object\") && (\n <TextField\n size=\"small\"\n value={newVal}\n onChange={(event) => setNewVal(event.target.value)}\n placeholder=\"YAML value\"\n fullWidth\n multiline\n minRows={2}\n inputProps={{\n ...stopAll.inputProps,\n }}\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n className={stopAll.className}\n />\n )}\n {(newKeyNormalizedType === \"number\" ||\n newKeyNormalizedType === \"integer\") && (\n <TextField\n size=\"small\"\n value={newVal}\n onChange={(event) => setNewVal(event.target.value)}\n placeholder=\"Number\"\n fullWidth\n inputProps={{\n ...stopAll.inputProps,\n inputMode: \"decimal\",\n }}\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n className={stopAll.className}\n />\n )}\n {newKeyNormalizedType !== \"array\" &&\n newKeyNormalizedType !== \"object\" &&\n newKeyNormalizedType !== \"number\" &&\n newKeyNormalizedType !== \"integer\" && (\n <Autocomplete\n size=\"small\"\n freeSolo\n options={newValueOptions}\n PopperComponent={AutoWidthPopper}\n value={newVal}\n inputValue={newVal}\n fullWidth\n filterOptions={(options) => {\n const needle = newVal.trim().toLowerCase();\n if (!needle) {\n return options;\n }\n return options.filter((option) => {\n const raw = String(option);\n const normalized = raw\n .replace(/^\\s*\\$\\{\\{\\s*/, \"\")\n .replace(/\\s*\\}\\}\\s*$/, \"\");\n const haystacks = [\n raw.toLowerCase(),\n normalized.toLowerCase(),\n ];\n return haystacks.some((haystack) =>\n haystack.includes(needle)\n );\n });\n }}\n onChange={(_, value) => setNewVal(value ?? \"\")}\n onInputChange={(_, value, reason) => {\n if (reason === \"reset\") {\n return;\n }\n setNewVal(value ?? \"\");\n }}\n onPointerDown={stopAll.onPointerDown}\n onKeyDown={stopAll.onKeyDown}\n className={stopAll.className}\n renderInput={(params) => (\n <TextField\n {...params}\n size=\"small\"\n placeholder=\"new value\"\n inputProps={{\n ...params.inputProps,\n ...stopAll.inputProps,\n }}\n />\n )}\n />\n )}\n <Button\n size=\"small\"\n variant=\"contained\"\n onClick={addPair}\n onPointerDown={(e) => e.stopPropagation()}\n disabled={isAddDisabled}\n className=\"nodrag nowheel\"\n >\n Add\n </Button>\n </KvRow>\n </Box>\n\n {hasMissingRequiredInputs && (\n <Box\n sx={{\n mt: 1.5,\n p: 1,\n borderRadius: 1,\n border: `1px solid ${theme.palette.error.main}`,\n }}\n style={{ backgroundColor: requiredInputsBackground }}\n >\n <Typography variant=\"caption\" color=\"error\">\n Missing required inputs\n </Typography>\n <Box\n sx={{\n display: \"flex\",\n flexWrap: \"wrap\",\n mt: 0.75,\n }}\n style={{ gap: theme.spacing(0.5) }}\n >\n {missingRequiredInputKeys.map((key) => (\n <Chip\n key={key}\n size=\"small\"\n variant=\"outlined\"\n label={key}\n style={{\n borderColor: theme.palette.error.main,\n color: theme.palette.error.main,\n }}\n />\n ))}\n </Box>\n </Box>\n )}\n\n <Handle type=\"target\" position={Position.Top} />\n <Handle type=\"source\" position={Position.Bottom} />\n </Card>\n );\n};\n\nexport const ActionNode = memo(ActionNodeComponent);\n"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { stringify, parse } from 'yaml';
|
|
2
|
+
|
|
1
3
|
const normalizeSchemaType = (schema, value) => {
|
|
2
4
|
const explicitType = typeof schema === "object" ? schema?.type : void 0;
|
|
3
5
|
if (explicitType === "string") return "string";
|
|
@@ -43,7 +45,7 @@ const coerceValueForType = (value, type) => {
|
|
|
43
45
|
}
|
|
44
46
|
if (type === "array" || type === "object") {
|
|
45
47
|
try {
|
|
46
|
-
return
|
|
48
|
+
return parse(value);
|
|
47
49
|
} catch {
|
|
48
50
|
return value;
|
|
49
51
|
}
|
|
@@ -56,7 +58,7 @@ const stringifyValueForDisplay = (value, type) => {
|
|
|
56
58
|
}
|
|
57
59
|
if (type === "object" || type === "array") {
|
|
58
60
|
try {
|
|
59
|
-
return
|
|
61
|
+
return stringify(value).trimEnd();
|
|
60
62
|
} catch {
|
|
61
63
|
return String(value);
|
|
62
64
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.esm.js","sources":["../../../../src/components/Nodes/action/schema.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"schema.esm.js","sources":["../../../../src/components/Nodes/action/schema.ts"],"sourcesContent":["import { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\n\nexport 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 parseYaml(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 stringifyYaml(value).trimEnd();\n } catch {\n return String(value);\n }\n }\n return String(value);\n};\n"],"names":["parseYaml","stringifyYaml"],"mappings":"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"}
|
|
@@ -133,11 +133,71 @@ const collectParameterReferences = (parameters) => {
|
|
|
133
133
|
if (!parameters || !Array.isArray(parameters)) {
|
|
134
134
|
return [];
|
|
135
135
|
}
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
)
|
|
140
|
-
|
|
136
|
+
const refs = /* @__PURE__ */ new Set();
|
|
137
|
+
const visit = (node) => {
|
|
138
|
+
if (!node) return;
|
|
139
|
+
if (Array.isArray(node)) {
|
|
140
|
+
node.forEach((item) => {
|
|
141
|
+
if (typeof item === "string" && item) {
|
|
142
|
+
refs.add(`\${{ parameters.${item} }}`);
|
|
143
|
+
} else {
|
|
144
|
+
visit(item);
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (typeof node !== "object") return;
|
|
150
|
+
const props = node.properties;
|
|
151
|
+
if (props) {
|
|
152
|
+
Object.keys(props).forEach((key) => {
|
|
153
|
+
if (key) refs.add(`\${{ parameters.${key} }}`);
|
|
154
|
+
});
|
|
155
|
+
} else {
|
|
156
|
+
Object.entries(node).forEach(([key, val]) => {
|
|
157
|
+
if (key && val && typeof val === "object") {
|
|
158
|
+
refs.add(`\${{ parameters.${key} }}`);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
const sections = node.sections;
|
|
163
|
+
if (Array.isArray(sections)) {
|
|
164
|
+
sections.forEach((section) => {
|
|
165
|
+
const sectionProps = section?.properties;
|
|
166
|
+
if (sectionProps) {
|
|
167
|
+
Object.keys(sectionProps).forEach((key) => {
|
|
168
|
+
if (key) refs.add(`\${{ parameters.${key} }}`);
|
|
169
|
+
});
|
|
170
|
+
}
|
|
171
|
+
const sectionRequired = section?.required;
|
|
172
|
+
if (Array.isArray(sectionRequired)) {
|
|
173
|
+
sectionRequired.forEach((item) => {
|
|
174
|
+
if (typeof item === "string" && item) {
|
|
175
|
+
refs.add(`\${{ parameters.${item} }}`);
|
|
176
|
+
}
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
const required = node.required;
|
|
182
|
+
if (Array.isArray(required)) {
|
|
183
|
+
required.forEach((item) => {
|
|
184
|
+
if (typeof item === "string" && item) {
|
|
185
|
+
refs.add(`\${{ parameters.${item} }}`);
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
["oneOf", "anyOf", "allOf", "if", "then", "else"].forEach(
|
|
190
|
+
(key) => visit(node[key])
|
|
191
|
+
);
|
|
192
|
+
};
|
|
193
|
+
parameters.forEach((param) => {
|
|
194
|
+
visit(param?.properties);
|
|
195
|
+
const deps = param?.dependencies;
|
|
196
|
+
if (deps && typeof deps === "object") {
|
|
197
|
+
Object.values(deps).forEach((depVal) => visit(depVal));
|
|
198
|
+
}
|
|
199
|
+
});
|
|
200
|
+
return Array.from(refs);
|
|
141
201
|
};
|
|
142
202
|
const collectStepOutputReferences = (nodes, parameterReferences) => {
|
|
143
203
|
const formatStepOutputProp = (stepId, prop) => `\${{ steps['${stepId}'].output.${prop} }}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.esm.js","sources":["../../src/designerFlow/model.ts"],"sourcesContent":["import type { Node } from \"@xyflow/react\";\nimport type {\n TaskStep,\n ScaffolderTaskOutput,\n} from \"@backstage/plugin-scaffolder-common\";\nimport type {\n ActionNodeData,\n OutputNodeData,\n ParametersNodeData,\n TemplateParametersValue,\n} from \"../types/flowNodes\";\nimport { alignNodes } from \"./nodeLayout\";\nimport { normalizeParametersToSections } from \"./parameterTransforms\";\nimport { FLOW_LAYOUT, nodeDefaults } from \"../components/designerFlowConfig\";\n\nconst sanitizeForRfId = (value: string) =>\n value.replace(/[^a-zA-Z0-9-_.:]/g, \"_\");\n\nconst buildRfId = (step: TaskStep | undefined, index: number) => {\n if (step && typeof step.id === \"string\" && step.id.trim().length > 0) {\n return `rf-${sanitizeForRfId(step.id)}-${index}`;\n }\n return `rf-${index + 1}`;\n};\n\nexport const cloneStep = (step: TaskStep): TaskStep =>\n JSON.parse(JSON.stringify(step ?? {})) as TaskStep;\n\nexport const cloneOutput = (\n output: ScaffolderTaskOutput | undefined | null\n): ScaffolderTaskOutput =>\n JSON.parse(JSON.stringify(output ?? {})) as ScaffolderTaskOutput;\n\nexport const cloneParameters = (\n parameters: TemplateParametersValue\n): TemplateParametersValue =>\n parameters === undefined\n ? undefined\n : (JSON.parse(JSON.stringify(parameters)) as TemplateParametersValue);\n\nexport type BuildNodesFromModelOptions = {\n scaffolderActionIds: string[];\n scaffolderActionInputsById: Record<string, Record<string, unknown>>;\n scaffolderActionOutputsById: Record<string, Record<string, unknown>>;\n scaffolderActionInputRequiredById: Record<string, string[]>;\n};\n\nexport const buildNodesFromModel = (\n steps: TaskStep[],\n parameters: TemplateParametersValue,\n output: ScaffolderTaskOutput | undefined | null,\n options: BuildNodesFromModelOptions\n) => {\n const {\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n } = options;\n\n const parameterSections = normalizeParametersToSections(parameters);\n const nodes: Node[] = [];\n\n const rfParametersId = \"rf-parameters\";\n nodes.push({\n id: rfParametersId,\n type: \"parametersNode\",\n position: { x: FLOW_LAYOUT.fixedXPosition, y: 0 },\n data: {\n rfId: rfParametersId,\n parameters: cloneParameters(parameters),\n sections: parameterSections,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n },\n ...nodeDefaults,\n });\n\n const rfOutputId = \"rf-output\";\n nodes.push({\n id: rfOutputId,\n type: \"outputNode\",\n position: {\n x: FLOW_LAYOUT.fixedXPosition,\n y: FLOW_LAYOUT.verticalSpacing * (steps.length + 1),\n },\n data: {\n rfId: rfOutputId,\n output: cloneOutput(output),\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n } satisfies OutputNodeData,\n ...nodeDefaults,\n });\n\n steps.forEach((step, index) => {\n const rfId = buildRfId(step, index);\n nodes.splice(index + 1, 0, {\n id: rfId,\n type: \"actionNode\",\n position: {\n x: FLOW_LAYOUT.fixedXPosition,\n y: FLOW_LAYOUT.verticalSpacing * (index + 1),\n },\n data: {\n rfId,\n step: cloneStep(step),\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n } satisfies ActionNodeData,\n ...nodeDefaults,\n });\n });\n\n return alignNodes(\n nodes,\n FLOW_LAYOUT.fixedXPosition,\n FLOW_LAYOUT.verticalSpacing\n );\n};\n\nconst normalizeStepOrder = (step: TaskStep): TaskStep => {\n // Keep existing values intact; only adjusts insertion order for export.\n const { if: stepIf, each: stepEach, ...rest } = step as Record<string, any>;\n const ordered: Record<string, any> = {};\n if (stepIf !== undefined) {\n ordered.if = stepIf;\n }\n if (stepEach !== undefined) {\n ordered.each = stepEach;\n }\n // Preserve all other fields in their existing relative order.\n Object.keys(rest).forEach((key) => {\n ordered[key] = rest[key];\n });\n return ordered as TaskStep;\n};\n\nconst stripEmptyConditionals = (step: TaskStep): TaskStep => {\n const next = { ...step } as TaskStep;\n if (next.if === \"\" || next.if === undefined) {\n delete (next as any).if;\n }\n if (next.each === \"\" || next.each === undefined) {\n delete (next as any).each;\n }\n return next;\n};\n\nexport const extractStepsFromNodes = (nodes: Node[]): TaskStep[] => {\n const actionNodes = nodes.filter(\n (node) => node.type === \"actionNode\"\n ) as Node<ActionNodeData>[];\n return actionNodes.map((node) =>\n normalizeStepOrder(stripEmptyConditionals(cloneStep(node.data.step)))\n );\n};\n\nexport const extractParametersFromNodes = (\n nodes: Node[]\n): TemplateParametersValue => {\n const parametersNode = nodes.find(\n (node) => node.type === \"parametersNode\"\n ) as Node<ParametersNodeData> | undefined;\n if (!parametersNode) {\n return [];\n }\n return cloneParameters(parametersNode.data.parameters);\n};\n\nexport const extractOutputFromNodes = (\n nodes: Node[]\n): ScaffolderTaskOutput | undefined => {\n const outputNode = nodes.find((node) => node.type === \"outputNode\") as\n | Node<OutputNodeData>\n | undefined;\n if (!outputNode) {\n return undefined;\n }\n return cloneOutput(outputNode.data.output);\n};\n\nexport const collectParameterReferences = (\n parameters: TemplateParametersValue | undefined\n): string[] => {\n if (!parameters || !Array.isArray(parameters)) {\n return [];\n }\n return parameters.flatMap((param) =>\n Object.keys((param as any)?.properties ?? {}).map(\n (propKey) => `\\${{ parameters.${propKey} }}`\n )\n );\n};\n\nexport const collectStepOutputReferences = (\n nodes: Node[],\n parameterReferences: string[]\n): Record<string, string[]> => {\n const formatStepOutputProp = (stepId: string, prop: string) =>\n `\\${{ steps['${stepId}'].output.${prop} }}`;\n\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 const outputKeysByStepId: Record<string, string[]> = {};\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 // Prefer nested properties if present; otherwise use top-level keys.\n const props =\n (schemaOutputs as { properties?: Record<string, unknown> })\n .properties ?? schemaOutputs;\n Object.keys(props ?? {}).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 if (outputKeys.size === 0) {\n return;\n }\n\n outputKeysByStepId[stepId] = Array.from(outputKeys);\n\n // Add per-key references from schema/output values (omit whole output object to avoid unusable suggestion).\n outputKeys.forEach((outputKey) => {\n const reference = formatStepOutputProp(stepId, 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 stableStringify = (value: unknown) =>\n JSON.stringify(value, (_key, v) => {\n if (Array.isArray(v)) {\n return v;\n }\n if (v && typeof v === \"object\") {\n return Object.keys(v as Record<string, unknown>)\n .sort()\n .reduce<Record<string, unknown>>((acc, k) => {\n acc[k] = (v as Record<string, unknown>)[k];\n return acc;\n }, {});\n }\n return v;\n });\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"model.esm.js","sources":["../../src/designerFlow/model.ts"],"sourcesContent":["import type { Node } from \"@xyflow/react\";\nimport type {\n TaskStep,\n ScaffolderTaskOutput,\n} from \"@backstage/plugin-scaffolder-common\";\nimport type {\n ActionNodeData,\n OutputNodeData,\n ParametersNodeData,\n TemplateParametersValue,\n} from \"../types/flowNodes\";\nimport { alignNodes } from \"./nodeLayout\";\nimport { normalizeParametersToSections } from \"./parameterTransforms\";\nimport { FLOW_LAYOUT, nodeDefaults } from \"../components/designerFlowConfig\";\n\nconst sanitizeForRfId = (value: string) =>\n value.replace(/[^a-zA-Z0-9-_.:]/g, \"_\");\n\nconst buildRfId = (step: TaskStep | undefined, index: number) => {\n if (step && typeof step.id === \"string\" && step.id.trim().length > 0) {\n return `rf-${sanitizeForRfId(step.id)}-${index}`;\n }\n return `rf-${index + 1}`;\n};\n\nexport const cloneStep = (step: TaskStep): TaskStep =>\n JSON.parse(JSON.stringify(step ?? {})) as TaskStep;\n\nexport const cloneOutput = (\n output: ScaffolderTaskOutput | undefined | null\n): ScaffolderTaskOutput =>\n JSON.parse(JSON.stringify(output ?? {})) as ScaffolderTaskOutput;\n\nexport const cloneParameters = (\n parameters: TemplateParametersValue\n): TemplateParametersValue =>\n parameters === undefined\n ? undefined\n : (JSON.parse(JSON.stringify(parameters)) as TemplateParametersValue);\n\nexport type BuildNodesFromModelOptions = {\n scaffolderActionIds: string[];\n scaffolderActionInputsById: Record<string, Record<string, unknown>>;\n scaffolderActionOutputsById: Record<string, Record<string, unknown>>;\n scaffolderActionInputRequiredById: Record<string, string[]>;\n};\n\nexport const buildNodesFromModel = (\n steps: TaskStep[],\n parameters: TemplateParametersValue,\n output: ScaffolderTaskOutput | undefined | null,\n options: BuildNodesFromModelOptions\n) => {\n const {\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionOutputsById,\n scaffolderActionInputRequiredById,\n } = options;\n\n const parameterSections = normalizeParametersToSections(parameters);\n const nodes: Node[] = [];\n\n const rfParametersId = \"rf-parameters\";\n nodes.push({\n id: rfParametersId,\n type: \"parametersNode\",\n position: { x: FLOW_LAYOUT.fixedXPosition, y: 0 },\n data: {\n rfId: rfParametersId,\n parameters: cloneParameters(parameters),\n sections: parameterSections,\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n },\n ...nodeDefaults,\n });\n\n const rfOutputId = \"rf-output\";\n nodes.push({\n id: rfOutputId,\n type: \"outputNode\",\n position: {\n x: FLOW_LAYOUT.fixedXPosition,\n y: FLOW_LAYOUT.verticalSpacing * (steps.length + 1),\n },\n data: {\n rfId: rfOutputId,\n output: cloneOutput(output),\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n } satisfies OutputNodeData,\n ...nodeDefaults,\n });\n\n steps.forEach((step, index) => {\n const rfId = buildRfId(step, index);\n nodes.splice(index + 1, 0, {\n id: rfId,\n type: \"actionNode\",\n position: {\n x: FLOW_LAYOUT.fixedXPosition,\n y: FLOW_LAYOUT.verticalSpacing * (index + 1),\n },\n data: {\n rfId,\n step: cloneStep(step),\n scaffolderActionIds,\n scaffolderActionInputsById,\n scaffolderActionInputRequiredById,\n scaffolderActionOutputsById,\n } satisfies ActionNodeData,\n ...nodeDefaults,\n });\n });\n\n return alignNodes(\n nodes,\n FLOW_LAYOUT.fixedXPosition,\n FLOW_LAYOUT.verticalSpacing\n );\n};\n\nconst normalizeStepOrder = (step: TaskStep): TaskStep => {\n // Keep existing values intact; only adjusts insertion order for export.\n const { if: stepIf, each: stepEach, ...rest } = step as Record<string, any>;\n const ordered: Record<string, any> = {};\n if (stepIf !== undefined) {\n ordered.if = stepIf;\n }\n if (stepEach !== undefined) {\n ordered.each = stepEach;\n }\n // Preserve all other fields in their existing relative order.\n Object.keys(rest).forEach((key) => {\n ordered[key] = rest[key];\n });\n return ordered as TaskStep;\n};\n\nconst stripEmptyConditionals = (step: TaskStep): TaskStep => {\n const next = { ...step } as TaskStep;\n if (next.if === \"\" || next.if === undefined) {\n delete (next as any).if;\n }\n if (next.each === \"\" || next.each === undefined) {\n delete (next as any).each;\n }\n return next;\n};\n\nexport const extractStepsFromNodes = (nodes: Node[]): TaskStep[] => {\n const actionNodes = nodes.filter(\n (node) => node.type === \"actionNode\"\n ) as Node<ActionNodeData>[];\n return actionNodes.map((node) =>\n normalizeStepOrder(stripEmptyConditionals(cloneStep(node.data.step)))\n );\n};\n\nexport const extractParametersFromNodes = (\n nodes: Node[]\n): TemplateParametersValue => {\n const parametersNode = nodes.find(\n (node) => node.type === \"parametersNode\"\n ) as Node<ParametersNodeData> | undefined;\n if (!parametersNode) {\n return [];\n }\n return cloneParameters(parametersNode.data.parameters);\n};\n\nexport const extractOutputFromNodes = (\n nodes: Node[]\n): ScaffolderTaskOutput | undefined => {\n const outputNode = nodes.find((node) => node.type === \"outputNode\") as\n | Node<OutputNodeData>\n | undefined;\n if (!outputNode) {\n return undefined;\n }\n return cloneOutput(outputNode.data.output);\n};\n\nexport const collectParameterReferences = (\n parameters: TemplateParametersValue | undefined\n): string[] => {\n if (!parameters || !Array.isArray(parameters)) {\n return [];\n }\n const refs = new Set<string>();\n\n const visit = (node: any) => {\n if (!node) return;\n\n if (Array.isArray(node)) {\n node.forEach((item) => {\n if (typeof item === \"string\" && item) {\n refs.add(`\\${{ parameters.${item} }}`);\n } else {\n visit(item);\n }\n });\n return;\n }\n\n if (typeof node !== \"object\") return;\n\n // pull keys from properties / required if present\n const props = (node as any).properties as\n | Record<string, unknown>\n | undefined;\n if (props) {\n Object.keys(props).forEach((key) => {\n if (key) refs.add(`\\${{ parameters.${key} }}`);\n });\n } else {\n // Fallback: the node itself may be a properties map.\n Object.entries(node as Record<string, unknown>).forEach(([key, val]) => {\n if (key && val && typeof val === \"object\") {\n refs.add(`\\${{ parameters.${key} }}`);\n }\n });\n }\n const sections = (node as any).sections as\n | Array<Record<string, unknown>>\n | undefined;\n if (Array.isArray(sections)) {\n sections.forEach((section) => {\n const sectionProps = section?.properties as\n | Record<string, unknown>\n | undefined;\n if (sectionProps) {\n Object.keys(sectionProps).forEach((key) => {\n if (key) refs.add(`\\${{ parameters.${key} }}`);\n });\n }\n const sectionRequired = section?.required as unknown;\n if (Array.isArray(sectionRequired)) {\n sectionRequired.forEach((item) => {\n if (typeof item === \"string\" && item) {\n refs.add(`\\${{ parameters.${item} }}`);\n }\n });\n }\n });\n }\n const required = (node as any).required as unknown;\n if (Array.isArray(required)) {\n required.forEach((item) => {\n if (typeof item === \"string\" && item) {\n refs.add(`\\${{ parameters.${item} }}`);\n }\n });\n }\n\n // traverse known branch containers\n [\"oneOf\", \"anyOf\", \"allOf\", \"if\", \"then\", \"else\"].forEach((key) =>\n visit((node as any)[key])\n );\n };\n\n parameters.forEach((param) => {\n visit((param as any)?.properties);\n const deps = (param as any)?.dependencies;\n if (deps && typeof deps === \"object\") {\n Object.values(deps).forEach((depVal) => visit(depVal));\n }\n });\n\n return Array.from(refs);\n};\n\nexport const collectStepOutputReferences = (\n nodes: Node[],\n parameterReferences: string[]\n): Record<string, string[]> => {\n const formatStepOutputProp = (stepId: string, prop: string) =>\n `\\${{ steps['${stepId}'].output.${prop} }}`;\n\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 const outputKeysByStepId: Record<string, string[]> = {};\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 // Prefer nested properties if present; otherwise use top-level keys.\n const props =\n (schemaOutputs as { properties?: Record<string, unknown> })\n .properties ?? schemaOutputs;\n Object.keys(props ?? {}).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 if (outputKeys.size === 0) {\n return;\n }\n\n outputKeysByStepId[stepId] = Array.from(outputKeys);\n\n // Add per-key references from schema/output values (omit whole output object to avoid unusable suggestion).\n outputKeys.forEach((outputKey) => {\n const reference = formatStepOutputProp(stepId, 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 stableStringify = (value: unknown) =>\n JSON.stringify(value, (_key, v) => {\n if (Array.isArray(v)) {\n return v;\n }\n if (v && typeof v === \"object\") {\n return Object.keys(v as Record<string, unknown>)\n .sort()\n .reduce<Record<string, unknown>>((acc, k) => {\n acc[k] = (v as Record<string, unknown>)[k];\n return acc;\n }, {});\n }\n return v;\n });\n"],"names":[],"mappings":"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"}
|