@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 @@
1
+ {"version":3,"file":"useTemplateState.esm.js","sources":["../../src/state/useTemplateState.ts"],"sourcesContent":["import {\n ChangeEvent,\n RefObject,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n ScaffolderTaskOutput,\n TaskStep,\n} from \"@backstage/plugin-scaffolder-common\";\nimport { TemplateEntityV1beta3 } from \"@backstage/plugin-scaffolder-common\";\nimport type { TemplateParametersValue } from \"../types/templateParameters\";\nimport {\n convertJsonToYaml,\n convertYamlToJson,\n} from \"../utils/yamlJsonConversion\";\nimport { SAMPLE_TEMPLATE_BLUEPRINT } from \"../utils/sampleTemplate\";\nimport {\n asRecord,\n cloneDeep,\n cloneSteps,\n DEFAULT_FILE_NAME,\n downloadString,\n FILE_PICKER_TYPES,\n FileSystemFileHandleLike,\n FileSystemWindow,\n isTaskStep,\n TemplateSource,\n} from \"./templateUtils\";\nimport { useApi } from \"@backstage/core-plugin-api\";\nimport { catalogApiRef } from \"@backstage/plugin-catalog-react\";\n\nexport type TemplateState = {\n templateObject: Record<string, unknown> | null;\n templateYaml: string;\n yamlError?: string;\n loadError?: string;\n isDirty: boolean;\n templateSource?: TemplateSource;\n isReloading: boolean;\n isSaving: boolean;\n isSyncing: boolean;\n templateSteps: TaskStep[];\n templateParameters: TemplateParametersValue;\n templateOutput?: ScaffolderTaskOutput;\n fileInputRef: RefObject<HTMLInputElement>;\n handleStartSampleTemplate: () => void;\n handleTemplateFileSelected: (event: ChangeEvent<HTMLInputElement>) => void;\n handleOpenTemplatePicker: () => void;\n handleYamlChange: (value: string) => void;\n handleStepsChange: (steps: TaskStep[]) => void;\n handleParametersChange: (parameters: TemplateParametersValue) => void;\n handleOutputChange: (output?: ScaffolderTaskOutput) => void;\n handleReloadFromFile: () => void;\n handleSaveTemplate: () => void;\n availableTemplates: TemplateEntityV1beta3[];\n selectCatalogTemplate: (selected: TemplateEntityV1beta3) => void;\n};\n\nconst parseTemplateYaml = (value: string) => {\n const parsed = JSON.parse(convertYamlToJson(value));\n if (!parsed || typeof parsed !== \"object\") {\n throw new Error(\"Template YAML must describe an object\");\n }\n return parsed as Record<string, unknown>;\n};\n\n/**\n * Encapsulates the template designer data model including YAML parsing,\n * scaffolder spec updates, and file-system interactions.\n */\nexport const useTemplateState = (): TemplateState => {\n const [templateObject, setTemplateObject] = useState<Record<\n string,\n unknown\n > | null>(null);\n const [templateYaml, setTemplateYaml] = useState(\"\");\n const [yamlError, setYamlError] = useState<string | undefined>();\n const [loadError, setLoadError] = useState<string | undefined>();\n const [isDirty, setIsDirty] = useState(false);\n const [templateSource, setTemplateSource] = useState<\n TemplateSource | undefined\n >();\n const [isReloading, setIsReloading] = useState(false);\n const [isSaving, setIsSaving] = useState(false);\n const [isSyncing, setIsSyncing] = useState(false);\n const templateObjectRef = useRef<Record<string, unknown> | null>(null);\n const yamlParseTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const yamlSerializeTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n const yamlParseIdleCancelRef = useRef<(() => void) | null>(null);\n const yamlSerializeIdleCancelRef = useRef<(() => void) | null>(null);\n const yamlParseCompletionRef = useRef<(() => void) | null>(null);\n const yamlSerializeCompletionRef = useRef<(() => void) | null>(null);\n const syncingCounterRef = useRef(0);\n const catalogApi = useApi(catalogApiRef);\n const [selectedTemplate, setSelectedTemplate] = useState<\n TemplateEntityV1beta3 | undefined\n >(undefined);\n const [availableTemplates, setAvailableTemplates] = useState<\n TemplateEntityV1beta3[]\n >([]);\n\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n\n const ensureHandlePermission = useCallback(\n async (\n handle: FileSystemFileHandleLike | undefined,\n mode: \"read\" | \"readwrite\"\n ) => {\n if (!handle || !handle.queryPermission || !handle.requestPermission) {\n return true;\n }\n const options = { mode };\n const current = await handle.queryPermission(options);\n if (current === \"granted\") {\n return true;\n }\n const request = await handle.requestPermission(options);\n return request === \"granted\";\n },\n []\n );\n\n const applyTemplate = useCallback(\n (template: Record<string, unknown>, source: TemplateSource) => {\n const nextTemplate = cloneDeep(template);\n const nextYaml = convertJsonToYaml(nextTemplate);\n templateObjectRef.current = nextTemplate;\n setTemplateObject(nextTemplate);\n setTemplateYaml(nextYaml);\n setYamlError(undefined);\n setLoadError(undefined);\n setTemplateSource(source);\n setIsDirty(false);\n },\n []\n );\n\n const confirmDiscardChanges = useCallback(() => {\n if (!templateObject || !isDirty) {\n return true;\n }\n\n if (typeof window === \"undefined\") {\n return true;\n }\n\n // eslint-disable-next-line no-alert\n return window.confirm(\n \"This will discard the changes you have made. Continue?\"\n );\n }, [isDirty, templateObject]);\n\n const startSyncTask = useCallback(() => {\n syncingCounterRef.current += 1;\n if (syncingCounterRef.current === 1) {\n setIsSyncing(true);\n }\n return () => {\n syncingCounterRef.current = Math.max(syncingCounterRef.current - 1, 0);\n if (syncingCounterRef.current === 0) {\n setIsSyncing(false);\n }\n };\n }, []);\n\n const scheduleYamlParse = useCallback(\n (nextYaml: string) => {\n if (yamlParseTimeoutRef.current) {\n clearTimeout(yamlParseTimeoutRef.current);\n }\n if (yamlParseIdleCancelRef.current) {\n yamlParseIdleCancelRef.current();\n yamlParseIdleCancelRef.current = null;\n }\n if (yamlParseCompletionRef.current) {\n yamlParseCompletionRef.current();\n yamlParseCompletionRef.current = null;\n }\n yamlParseCompletionRef.current = startSyncTask();\n yamlParseTimeoutRef.current = setTimeout(() => {\n yamlParseTimeoutRef.current = null;\n const runParse = () => {\n try {\n const parsed = parseTemplateYaml(nextYaml);\n templateObjectRef.current = parsed;\n setTemplateObject(parsed);\n setYamlError(undefined);\n } catch (error) {\n const message =\n error instanceof Error\n ? error.message\n : \"Unknown error parsing YAML\";\n setYamlError(message);\n }\n if (yamlParseCompletionRef.current) {\n yamlParseCompletionRef.current();\n yamlParseCompletionRef.current = null;\n }\n };\n const idle =\n typeof window !== \"undefined\" &&\n typeof (window as any).requestIdleCallback === \"function\";\n if (idle) {\n const handle = (window as any).requestIdleCallback(runParse, {\n timeout: 800,\n });\n yamlParseIdleCancelRef.current = () => {\n (window as any).cancelIdleCallback?.(handle);\n if (yamlParseCompletionRef.current) {\n yamlParseCompletionRef.current();\n yamlParseCompletionRef.current = null;\n }\n };\n return;\n }\n runParse();\n }, 450);\n },\n [startSyncTask]\n );\n\n const scheduleYamlSerialization = useCallback(\n (nextTemplate: Record<string, unknown> | null | undefined) => {\n if (yamlSerializeTimeoutRef.current) {\n clearTimeout(yamlSerializeTimeoutRef.current);\n }\n if (yamlSerializeIdleCancelRef.current) {\n yamlSerializeIdleCancelRef.current();\n yamlSerializeIdleCancelRef.current = null;\n }\n if (yamlSerializeCompletionRef.current) {\n yamlSerializeCompletionRef.current();\n yamlSerializeCompletionRef.current = null;\n }\n yamlSerializeCompletionRef.current = startSyncTask();\n yamlSerializeTimeoutRef.current = setTimeout(() => {\n yamlSerializeTimeoutRef.current = null;\n if (!nextTemplate) {\n setTemplateYaml(\"\");\n if (yamlSerializeCompletionRef.current) {\n yamlSerializeCompletionRef.current();\n yamlSerializeCompletionRef.current = null;\n }\n return;\n }\n const runSerialize = () => {\n try {\n setTemplateYaml(convertJsonToYaml(nextTemplate));\n } catch (error) {\n const message =\n error instanceof Error\n ? error.message\n : \"Unknown error updating YAML\";\n setLoadError(message);\n }\n if (yamlSerializeCompletionRef.current) {\n yamlSerializeCompletionRef.current();\n yamlSerializeCompletionRef.current = null;\n }\n };\n const idle =\n typeof window !== \"undefined\" &&\n typeof (window as any).requestIdleCallback === \"function\";\n if (idle) {\n const handle = (window as any).requestIdleCallback(runSerialize, {\n timeout: 800,\n });\n yamlSerializeIdleCancelRef.current = () => {\n (window as any).cancelIdleCallback?.(handle);\n if (yamlSerializeCompletionRef.current) {\n yamlSerializeCompletionRef.current();\n yamlSerializeCompletionRef.current = null;\n }\n };\n return;\n }\n runSerialize();\n }, 250);\n },\n [startSyncTask]\n );\n\n const flushPendingYamlSerialization = useCallback((): string => {\n if (yamlSerializeTimeoutRef.current) {\n clearTimeout(yamlSerializeTimeoutRef.current);\n yamlSerializeTimeoutRef.current = null;\n }\n if (yamlSerializeIdleCancelRef.current) {\n yamlSerializeIdleCancelRef.current();\n yamlSerializeIdleCancelRef.current = null;\n }\n if (yamlSerializeCompletionRef.current) {\n yamlSerializeCompletionRef.current();\n yamlSerializeCompletionRef.current = null;\n }\n const latest = templateObjectRef.current;\n if (!latest) {\n setTemplateYaml(\"\");\n return \"\";\n }\n try {\n const serialized = convertJsonToYaml(latest);\n setTemplateYaml(serialized);\n return serialized;\n } catch (error) {\n const message =\n error instanceof Error ? error.message : \"Unknown error updating YAML\";\n setLoadError(message);\n return templateYaml;\n }\n }, [templateYaml]);\n\n useEffect(() => {\n return () => {\n if (yamlParseTimeoutRef.current) {\n clearTimeout(yamlParseTimeoutRef.current);\n }\n if (yamlParseIdleCancelRef.current) {\n yamlParseIdleCancelRef.current();\n }\n if (yamlParseCompletionRef.current) {\n yamlParseCompletionRef.current();\n yamlParseCompletionRef.current = null;\n }\n if (yamlSerializeTimeoutRef.current) {\n clearTimeout(yamlSerializeTimeoutRef.current);\n }\n if (yamlSerializeIdleCancelRef.current) {\n yamlSerializeIdleCancelRef.current();\n }\n if (yamlSerializeCompletionRef.current) {\n yamlSerializeCompletionRef.current();\n yamlSerializeCompletionRef.current = null;\n }\n syncingCounterRef.current = 0;\n setIsSyncing(false);\n };\n }, []);\n\n useEffect(() => {\n templateObjectRef.current = templateObject;\n }, [templateObject]);\n\n const handleStartSampleTemplate = useCallback(() => {\n if (!confirmDiscardChanges()) {\n return;\n }\n applyTemplate(SAMPLE_TEMPLATE_BLUEPRINT, {\n type: \"sample\",\n label: \"Sample template\",\n });\n }, [applyTemplate, confirmDiscardChanges]);\n\n const handleTemplateFileSelected = useCallback(\n async (event: ChangeEvent<HTMLInputElement>) => {\n const file = event.target.files?.[0];\n event.target.value = \"\";\n\n if (!file) {\n return;\n }\n\n if (!confirmDiscardChanges()) {\n return;\n }\n\n try {\n const fileContents = await file.text();\n const parsed = parseTemplateYaml(fileContents);\n applyTemplate(parsed, {\n type: \"file\",\n label: file.name,\n });\n } catch (error) {\n const message =\n error instanceof Error\n ? error.message\n : \"Unknown error loading template\";\n setLoadError(`Could not load template: ${message}`);\n }\n },\n [applyTemplate, confirmDiscardChanges]\n );\n\n const handleOpenTemplatePicker = useCallback(async () => {\n if (!confirmDiscardChanges()) {\n return;\n }\n\n if (typeof window === \"undefined\") {\n return;\n }\n\n const fsWindow = window as FileSystemWindow;\n\n if (fsWindow.showOpenFilePicker) {\n try {\n const handles = await fsWindow.showOpenFilePicker({\n multiple: false,\n types: FILE_PICKER_TYPES,\n });\n const [handle] = handles ?? [];\n if (!handle) {\n return;\n }\n\n const granted = await ensureHandlePermission(handle, \"read\");\n if (!granted) {\n setLoadError(\"Permission to read the selected file was denied.\");\n return;\n }\n\n const file = await handle.getFile();\n const text = await file.text();\n const parsed = parseTemplateYaml(text);\n applyTemplate(parsed, {\n type: \"file\",\n label: handle.name ?? file.name,\n handle,\n });\n } catch (error) {\n if (error instanceof DOMException && error.name === \"AbortError\") {\n return;\n }\n const message =\n error instanceof Error\n ? error.message\n : \"Unknown error loading template\";\n setLoadError(`Could not load template: ${message}`);\n }\n return;\n }\n\n fileInputRef.current?.click();\n }, [applyTemplate, confirmDiscardChanges, ensureHandlePermission]);\n\n const templateSteps = useMemo(() => {\n if (!templateObject) {\n return [];\n }\n\n const template = asRecord(templateObject);\n if (!template) {\n return [];\n }\n\n const spec = asRecord(template.spec);\n if (!spec) {\n return [];\n }\n\n const maybeSteps = spec.steps;\n if (!Array.isArray(maybeSteps)) {\n return [];\n }\n\n const validSteps = maybeSteps.filter(isTaskStep) as TaskStep[];\n return cloneSteps(validSteps);\n }, [templateObject]);\n\n const templateParameters = useMemo((): TemplateParametersValue => {\n if (!templateObject) {\n return undefined;\n }\n\n const template = asRecord(templateObject);\n if (!template) {\n return undefined;\n }\n\n const spec = asRecord(template.spec);\n if (!spec) {\n return undefined;\n }\n\n if (!Object.prototype.hasOwnProperty.call(spec, \"parameters\")) {\n return undefined;\n }\n\n const rawParameters = (spec as Record<string, unknown>).parameters;\n if (rawParameters === undefined) {\n return undefined;\n }\n\n return cloneDeep(rawParameters as TemplateParametersValue);\n }, [templateObject]);\n\n const templateOutput = useMemo(() => {\n if (!templateObject) {\n return undefined;\n }\n\n const template = asRecord(templateObject);\n if (!template) {\n return undefined;\n }\n\n const spec = asRecord(template.spec);\n if (!spec) {\n return undefined;\n }\n\n const rawOutput = spec.output;\n if (!rawOutput || typeof rawOutput !== \"object\") {\n return undefined;\n }\n\n return cloneDeep(rawOutput as ScaffolderTaskOutput);\n }, [templateObject]);\n\n const handleYamlChange = useCallback(\n (value: string) => {\n setTemplateYaml(value);\n setIsDirty(true);\n scheduleYamlParse(value);\n },\n [scheduleYamlParse]\n );\n\n const handleStepsChange = useCallback(\n (steps: TaskStep[]) => {\n setIsDirty(true);\n setTemplateObject((prevTemplate) => {\n const base =\n prevTemplate && typeof prevTemplate === \"object\"\n ? (cloneDeep(prevTemplate) as Record<string, unknown>)\n : ({} as Record<string, unknown>);\n\n const spec = asRecord(base.spec) ?? {};\n const nextSteps = cloneSteps(steps);\n\n const nextTemplate: Record<string, unknown> = {\n ...base,\n spec: {\n ...spec,\n steps: nextSteps,\n },\n };\n\n templateObjectRef.current = nextTemplate;\n scheduleYamlSerialization(nextTemplate);\n return nextTemplate;\n });\n },\n [scheduleYamlSerialization]\n );\n\n const handleParametersChange = useCallback(\n (parameters: TemplateParametersValue) => {\n setIsDirty(true);\n setTemplateObject((prevTemplate) => {\n const base =\n prevTemplate && typeof prevTemplate === \"object\"\n ? (cloneDeep(prevTemplate) as Record<string, unknown>)\n : ({} as Record<string, unknown>);\n\n const spec = asRecord(base.spec) ?? {};\n const nextTemplate: Record<string, unknown> = {\n ...base,\n spec: {\n ...spec,\n parameters: cloneDeep(parameters),\n },\n };\n\n templateObjectRef.current = nextTemplate;\n scheduleYamlSerialization(nextTemplate);\n return nextTemplate;\n });\n },\n [scheduleYamlSerialization]\n );\n\n const handleOutputChange = useCallback(\n (output?: ScaffolderTaskOutput) => {\n setIsDirty(true);\n setTemplateObject((prevTemplate) => {\n const base =\n prevTemplate && typeof prevTemplate === \"object\"\n ? (cloneDeep(prevTemplate) as Record<string, unknown>)\n : ({} as Record<string, unknown>);\n\n const spec = asRecord(base.spec) ?? {};\n const nextTemplate: Record<string, unknown> = {\n ...base,\n spec: {\n ...spec,\n output: cloneDeep(output),\n },\n };\n\n templateObjectRef.current = nextTemplate;\n scheduleYamlSerialization(nextTemplate);\n return nextTemplate;\n });\n },\n [scheduleYamlSerialization]\n );\n\n const handleReloadFromFile = useCallback(async () => {\n if (!templateSource) {\n return;\n }\n\n if (templateSource.type === \"catalog\") {\n if (selectedTemplate) {\n applyTemplate(selectedTemplate as unknown as Record<string, unknown>, {\n type: \"catalog\",\n label:\n selectedTemplate.metadata.title ?? selectedTemplate.metadata.name,\n });\n }\n return;\n }\n if (templateSource.type !== \"file\") {\n handleStartSampleTemplate();\n return;\n }\n\n if (!templateSource.handle) {\n handleOpenTemplatePicker();\n return;\n }\n\n if (!confirmDiscardChanges()) {\n return;\n }\n\n try {\n setIsReloading(true);\n const granted = await ensureHandlePermission(\n templateSource.handle,\n \"read\"\n );\n if (!granted) {\n setLoadError(\"Permission to read the selected file was denied.\");\n return;\n }\n\n const file = await templateSource.handle.getFile();\n const text = await file.text();\n const parsed = parseTemplateYaml(text);\n applyTemplate(parsed, {\n type: \"file\",\n label: templateSource.handle.name ?? file.name ?? templateSource.label,\n handle: templateSource.handle,\n });\n } catch (error) {\n const message =\n error instanceof Error\n ? error.message\n : \"Unknown error reloading template\";\n setLoadError(`Could not reload template: ${message}`);\n } finally {\n setIsReloading(false);\n }\n }, [\n applyTemplate,\n confirmDiscardChanges,\n ensureHandlePermission,\n handleOpenTemplatePicker,\n handleStartSampleTemplate,\n selectedTemplate,\n templateSource,\n ]);\n\n const handleSaveTemplate = useCallback(async () => {\n if (!templateObject) {\n return;\n }\n\n const yamlToPersist = flushPendingYamlSerialization();\n\n if (typeof window === \"undefined\") {\n downloadString(yamlToPersist, DEFAULT_FILE_NAME);\n setIsDirty(false);\n return;\n }\n\n try {\n setIsSaving(true);\n setLoadError(undefined);\n const fsWindow = window as FileSystemWindow;\n\n if (templateSource?.type === \"file\" && templateSource.handle) {\n const granted = await ensureHandlePermission(\n templateSource.handle,\n \"readwrite\"\n );\n if (!granted) {\n setLoadError(\"Permission to save to the selected file was denied.\");\n return;\n }\n const writable = await templateSource.handle.createWritable?.();\n if (!writable) {\n throw new Error(\"Unable to open file for writing.\");\n }\n await writable.write(yamlToPersist);\n await writable.close();\n setIsDirty(false);\n return;\n }\n\n if (fsWindow.showSaveFilePicker) {\n const handle = await fsWindow.showSaveFilePicker({\n suggestedName: templateSource?.label ?? DEFAULT_FILE_NAME,\n types: FILE_PICKER_TYPES,\n });\n const writable = await handle.createWritable?.();\n if (!writable) {\n throw new Error(\"Unable to open file for writing.\");\n }\n await writable.write(yamlToPersist);\n await writable.close();\n setTemplateSource({\n type: \"file\",\n label: handle.name ?? templateSource?.label ?? DEFAULT_FILE_NAME,\n handle,\n });\n setIsDirty(false);\n return;\n }\n\n downloadString(yamlToPersist, templateSource?.label ?? DEFAULT_FILE_NAME);\n setIsDirty(false);\n } catch (error) {\n const message =\n error instanceof Error\n ? error.message\n : \"Unknown error saving template\";\n setLoadError(`Failed to save template: ${message}`);\n } finally {\n setIsSaving(false);\n }\n }, [\n ensureHandlePermission,\n flushPendingYamlSerialization,\n templateObject,\n templateSource,\n ]);\n\n useEffect(() => {\n catalogApi\n .getEntities({\n filter: {\n kind: \"Template\",\n },\n })\n .then((data) => {\n setAvailableTemplates(data.items as TemplateEntityV1beta3[]);\n })\n .catch(() => setAvailableTemplates([]));\n }, [catalogApi]);\n\n const selectCatalogTemplate = useCallback(\n (selected: TemplateEntityV1beta3) => {\n setSelectedTemplate(selected);\n applyTemplate(selected as unknown as Record<string, unknown>, {\n type: \"catalog\",\n label: selected.metadata.title ?? selected.metadata.name,\n });\n },\n [applyTemplate]\n );\n\n return {\n templateObject,\n templateYaml,\n yamlError,\n loadError,\n isDirty,\n templateSource,\n isReloading,\n isSaving,\n isSyncing,\n templateSteps,\n templateParameters,\n templateOutput,\n fileInputRef,\n handleStartSampleTemplate,\n handleTemplateFileSelected,\n handleOpenTemplatePicker,\n handleYamlChange,\n handleStepsChange,\n handleParametersChange,\n handleOutputChange,\n handleReloadFromFile,\n handleSaveTemplate,\n availableTemplates,\n selectCatalogTemplate,\n };\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ const NODE_VERTICAL_SPACING = {
2
+ parametersNode: 120,
3
+ actionNode: 120,
4
+ outputNode: 120
5
+ };
6
+
7
+ export { NODE_VERTICAL_SPACING };
8
+ //# sourceMappingURL=flowNodes.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flowNodes.esm.js","sources":["../../src/types/flowNodes.ts"],"sourcesContent":["import type {\n ScaffolderTaskOutput,\n TaskStep,\n} from \"@backstage/plugin-scaffolder-common\";\nimport type { TemplateParametersValue } from \"./templateParameters\";\n\nexport type DesignerNodeType = \"parametersNode\" | \"actionNode\" | \"outputNode\";\n\nexport type AddNodeConfig = {\n afterRfId: string;\n type?: DesignerNodeType;\n stepTemplate?: Partial<TaskStep>;\n outputTemplate?: ScaffolderTaskOutput;\n parametersTemplate?: TemplateParametersValue;\n};\n\ntype BaseNodeData = {\n /** Stable ReactFlow node id */\n rfId: string;\n /** Cached scaffolder action ids for dropdown options */\n scaffolderActionIds?: string[];\n /** Cached action input schemas keyed by action id */\n scaffolderActionInputsById?: Record<string, Record<string, unknown>>;\n /** Cached action required input keys keyed by action id */\n scaffolderActionInputRequiredById?: Record<string, string[]>;\n /** Cached action output schemas keyed by action id */\n scaffolderActionOutputsById?: Record<string, Record<string, unknown>>;\n /** Suggestions for referencing previous step outputs */\n stepOutputReferences?: string[];\n onAddNode?: (config: AddNodeConfig) => void;\n onRemoveNode?: (rfId: string) => void;\n};\n\nexport type ActionNodeData = BaseNodeData & {\n /** User payload; id is editable string (reserved by your template) */\n step: TaskStep & { input?: Record<string, unknown> };\n onUpdateField?: (rfId: string, field: keyof TaskStep, value: string) => void;\n onUpdateInput?: (rfId: string, key: string, value: unknown) => void;\n onRemoveInputKey?: (rfId: string, key: string) => void;\n};\n\nexport type OutputNodeData = BaseNodeData & {\n output: ScaffolderTaskOutput;\n onUpdateOutput?: (\n rfId: string,\n updater: (prev: ScaffolderTaskOutput) => ScaffolderTaskOutput\n ) => void;\n};\n\nexport type ParameterFieldDisplay = {\n id: string;\n fieldName: string;\n sectionId: string;\n sectionTitle?: string;\n required: boolean;\n schema?: Record<string, unknown>;\n};\n\nexport type ParameterSectionDisplay = {\n id: string;\n title?: string;\n description?: string;\n required?: string[];\n properties?: Record<string, Record<string, unknown>>;\n fields: ParameterFieldDisplay[];\n};\n\nexport type ParametersNodeData = BaseNodeData & {\n parameters: TemplateParametersValue;\n sections?: ParameterSectionDisplay[];\n onUpdateSections?: (\n rfId: string,\n updater: (prev: ParameterSectionDisplay[]) => ParameterSectionDisplay[]\n ) => void;\n};\n\nexport const NODE_VERTICAL_SPACING: Record<DesignerNodeType, number> = {\n parametersNode: 120,\n actionNode: 120,\n outputNode: 120,\n};\n\nexport type { TemplateParametersValue };\n"],"names":[],"mappings":"AA4EO,MAAM,qBAAA,GAA0D;AAAA,EACrE,cAAA,EAAgB,GAAA;AAAA,EAChB,UAAA,EAAY,GAAA;AAAA,EACZ,UAAA,EAAY;AACd;;;;"}
@@ -0,0 +1,15 @@
1
+ function createSequentialEdges(nodes) {
2
+ if (nodes.length < 2) return [];
3
+ return nodes.slice(0, -1).map((node, index) => {
4
+ const nextNode = nodes[index + 1];
5
+ return {
6
+ id: `e-${node.id}-${nextNode.id}`,
7
+ source: node.id,
8
+ target: nextNode.id,
9
+ type: "smoothstep"
10
+ };
11
+ });
12
+ }
13
+
14
+ export { createSequentialEdges };
15
+ //# sourceMappingURL=createSequentialEdges.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createSequentialEdges.esm.js","sources":["../../src/utils/createSequentialEdges.ts"],"sourcesContent":["import { Edge, Node } from \"@xyflow/react\";\n\nexport function createSequentialEdges(nodes: Node[]): Edge[] {\n if (nodes.length < 2) return [];\n\n return nodes.slice(0, -1).map((node, index) => {\n const nextNode = nodes[index + 1];\n return {\n id: `e-${node.id}-${nextNode.id}`,\n source: node.id,\n target: nextNode.id,\n type: \"smoothstep\",\n } as Edge;\n });\n}\n"],"names":[],"mappings":"AAEO,SAAS,sBAAsB,KAAA,EAAuB;AAC3D,EAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,OAAO,EAAC;AAE9B,EAAA,OAAO,KAAA,CAAM,MAAM,CAAA,EAAG,EAAE,EAAE,GAAA,CAAI,CAAC,MAAM,KAAA,KAAU;AAC7C,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA;AAChC,IAAA,OAAO;AAAA,MACL,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,EAAE,CAAA,CAAA,EAAI,SAAS,EAAE,CAAA,CAAA;AAAA,MAC/B,QAAQ,IAAA,CAAK,EAAA;AAAA,MACb,QAAQ,QAAA,CAAS,EAAA;AAAA,MACjB,IAAA,EAAM;AAAA,KACR;AAAA,EACF,CAAC,CAAA;AACH;;;;"}
@@ -0,0 +1,120 @@
1
+ import { createApiFactory } from '@backstage/core-plugin-api';
2
+ import { catalogApiRef } from '@backstage/plugin-catalog-react';
3
+ import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';
4
+
5
+ const MOCK_CATALOG_TEMPLATES = [
6
+ {
7
+ apiVersion: "scaffolder.backstage.io/v1beta3",
8
+ kind: "Template",
9
+ metadata: {
10
+ name: "sample-template",
11
+ title: "Sample Template (mock)",
12
+ description: "Mock catalog template for local dev"
13
+ },
14
+ spec: {
15
+ type: "service",
16
+ parameters: [],
17
+ steps: [],
18
+ output: {}
19
+ }
20
+ }
21
+ ];
22
+ const MOCK_SCAFFOLDER_ACTIONS = [
23
+ {
24
+ id: "debug:log",
25
+ description: "Writes a message to the task log output.",
26
+ schema: {
27
+ input: {
28
+ required: ["message"],
29
+ properties: {
30
+ message: {
31
+ title: "Message",
32
+ type: "string",
33
+ description: "Free-form text that will be printed to the logs."
34
+ }
35
+ }
36
+ },
37
+ output: {
38
+ properties: {}
39
+ }
40
+ }
41
+ },
42
+ {
43
+ id: "fetch:template",
44
+ description: "Fetches contents from a git repository and places them in the workspace.",
45
+ schema: {
46
+ input: {
47
+ required: ["url"],
48
+ properties: {
49
+ url: {
50
+ title: "Repository URL",
51
+ type: "string",
52
+ description: "Location of the repository or template archive."
53
+ },
54
+ targetPath: {
55
+ title: "Target Path",
56
+ type: "string",
57
+ description: "Relative path where the files will be written.",
58
+ default: "."
59
+ }
60
+ }
61
+ },
62
+ output: {
63
+ properties: {
64
+ targetPath: {
65
+ type: "string",
66
+ description: "Path where the contents were written."
67
+ }
68
+ }
69
+ }
70
+ }
71
+ },
72
+ {
73
+ id: "catalog:register",
74
+ description: "Registers an entity in the Backstage catalog.",
75
+ schema: {
76
+ input: {
77
+ required: ["catalogInfoUrl"],
78
+ properties: {
79
+ catalogInfoUrl: {
80
+ title: "catalog-info.yaml URL",
81
+ type: "string",
82
+ description: "URL that points to the generated entity definition."
83
+ },
84
+ optional: {
85
+ title: "Optional",
86
+ type: "boolean",
87
+ description: "Mark the registration as optional and ignore failures.",
88
+ default: false
89
+ }
90
+ }
91
+ },
92
+ output: {
93
+ properties: {
94
+ entityRef: {
95
+ title: "Entity Ref",
96
+ type: "string",
97
+ description: "Entity reference for the registered component."
98
+ }
99
+ }
100
+ }
101
+ }
102
+ }
103
+ ];
104
+ const mockCatalogApiFactory = createApiFactory({
105
+ api: catalogApiRef,
106
+ deps: {},
107
+ factory: () => ({
108
+ getEntities: async () => ({ items: MOCK_CATALOG_TEMPLATES })
109
+ })
110
+ });
111
+ const mockScaffolderApiFactory = createApiFactory({
112
+ api: scaffolderApiRef,
113
+ deps: {},
114
+ factory: () => ({
115
+ listActions: async () => MOCK_SCAFFOLDER_ACTIONS
116
+ })
117
+ });
118
+
119
+ export { MOCK_CATALOG_TEMPLATES, MOCK_SCAFFOLDER_ACTIONS, mockCatalogApiFactory, mockScaffolderApiFactory };
120
+ //# sourceMappingURL=mocks.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mocks.esm.js","sources":["../../../src/utils/mocks/mocks.ts"],"sourcesContent":["import { createApiFactory } from \"@backstage/core-plugin-api\";\nimport { catalogApiRef } from \"@backstage/plugin-catalog-react\";\nimport { scaffolderApiRef } from \"@backstage/plugin-scaffolder-react\";\nimport {\n ListActionsResponse,\n TemplateEntityV1beta3,\n} from \"@backstage/plugin-scaffolder-common\";\n\nexport const MOCK_CATALOG_TEMPLATES: TemplateEntityV1beta3[] = [\n {\n apiVersion: \"scaffolder.backstage.io/v1beta3\",\n kind: \"Template\",\n metadata: {\n name: \"sample-template\",\n title: \"Sample Template (mock)\",\n description: \"Mock catalog template for local dev\",\n },\n spec: {\n type: \"service\",\n parameters: [],\n steps: [],\n output: {},\n },\n },\n];\n\nexport const MOCK_SCAFFOLDER_ACTIONS: ListActionsResponse = [\n {\n id: \"debug:log\",\n description: \"Writes a message to the task log output.\",\n schema: {\n input: {\n required: [\"message\"],\n properties: {\n message: {\n title: \"Message\",\n type: \"string\",\n description: \"Free-form text that will be printed to the logs.\",\n },\n },\n },\n output: {\n properties: {},\n },\n },\n },\n {\n id: \"fetch:template\",\n description:\n \"Fetches contents from a git repository and places them in the workspace.\",\n schema: {\n input: {\n required: [\"url\"],\n properties: {\n url: {\n title: \"Repository URL\",\n type: \"string\",\n description: \"Location of the repository or template archive.\",\n },\n targetPath: {\n title: \"Target Path\",\n type: \"string\",\n description: \"Relative path where the files will be written.\",\n default: \".\",\n },\n },\n },\n output: {\n properties: {\n targetPath: {\n type: \"string\",\n description: \"Path where the contents were written.\",\n },\n },\n },\n },\n },\n {\n id: \"catalog:register\",\n description: \"Registers an entity in the Backstage catalog.\",\n schema: {\n input: {\n required: [\"catalogInfoUrl\"],\n properties: {\n catalogInfoUrl: {\n title: \"catalog-info.yaml URL\",\n type: \"string\",\n description: \"URL that points to the generated entity definition.\",\n },\n optional: {\n title: \"Optional\",\n type: \"boolean\",\n description:\n \"Mark the registration as optional and ignore failures.\",\n default: false,\n },\n },\n },\n output: {\n properties: {\n entityRef: {\n title: \"Entity Ref\",\n type: \"string\",\n description: \"Entity reference for the registered component.\",\n },\n },\n },\n },\n },\n];\n\nexport const mockCatalogApiFactory = createApiFactory({\n api: catalogApiRef,\n deps: {},\n factory: () =>\n ({\n getEntities: async () => ({ items: MOCK_CATALOG_TEMPLATES }),\n } as any),\n});\n\nexport const mockScaffolderApiFactory = createApiFactory({\n api: scaffolderApiRef,\n deps: {},\n factory: () =>\n ({\n listActions: async () => MOCK_SCAFFOLDER_ACTIONS,\n } as any),\n});\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ const SAMPLE_TEMPLATE_BLUEPRINT = {
2
+ apiVersion: "scaffolder.backstage.io/v1beta3",
3
+ kind: "Template",
4
+ metadata: {
5
+ name: "sample-template",
6
+ title: "Sample Template",
7
+ description: "Start from a single-step scaffolder template."
8
+ },
9
+ spec: {
10
+ owner: "user:guest",
11
+ type: "sample",
12
+ parameters: [
13
+ {
14
+ title: "Basic Information",
15
+ properties: {
16
+ message: {
17
+ title: "Message",
18
+ type: "string",
19
+ description: "Optional log message for the sample action.",
20
+ default: "Hello from Template Designer!"
21
+ }
22
+ }
23
+ }
24
+ ],
25
+ steps: [
26
+ {
27
+ id: "sample-action",
28
+ name: "Log Sample Message",
29
+ action: "debug:log",
30
+ input: {
31
+ message: "${{ parameters.message }}"
32
+ }
33
+ }
34
+ ],
35
+ output: {}
36
+ }
37
+ };
38
+
39
+ export { SAMPLE_TEMPLATE_BLUEPRINT };
40
+ //# sourceMappingURL=sampleTemplate.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sampleTemplate.esm.js","sources":["../../src/utils/sampleTemplate.ts"],"sourcesContent":["export const SAMPLE_TEMPLATE_BLUEPRINT: Record<string, unknown> = {\n apiVersion: \"scaffolder.backstage.io/v1beta3\",\n kind: \"Template\",\n metadata: {\n name: \"sample-template\",\n title: \"Sample Template\",\n description: \"Start from a single-step scaffolder template.\",\n },\n spec: {\n owner: \"user:guest\",\n type: \"sample\",\n parameters: [\n {\n title: \"Basic Information\",\n properties: {\n message: {\n title: \"Message\",\n type: \"string\",\n description: \"Optional log message for the sample action.\",\n default: \"Hello from Template Designer!\",\n },\n },\n },\n ],\n steps: [\n {\n id: \"sample-action\",\n name: \"Log Sample Message\",\n action: \"debug:log\",\n input: {\n message: \"${{ parameters.message }}\",\n },\n },\n ],\n output: {},\n },\n};\n"],"names":[],"mappings":"AAAO,MAAM,yBAAA,GAAqD;AAAA,EAChE,UAAA,EAAY,iCAAA;AAAA,EACZ,IAAA,EAAM,UAAA;AAAA,EACN,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO,iBAAA;AAAA,IACP,WAAA,EAAa;AAAA,GACf;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,KAAA,EAAO,YAAA;AAAA,IACP,IAAA,EAAM,QAAA;AAAA,IACN,UAAA,EAAY;AAAA,MACV;AAAA,QACE,KAAA,EAAO,mBAAA;AAAA,QACP,UAAA,EAAY;AAAA,UACV,OAAA,EAAS;AAAA,YACP,KAAA,EAAO,SAAA;AAAA,YACP,IAAA,EAAM,QAAA;AAAA,YACN,WAAA,EAAa,6CAAA;AAAA,YACb,OAAA,EAAS;AAAA;AACX;AACF;AACF,KACF;AAAA,IACA,KAAA,EAAO;AAAA,MACL;AAAA,QACE,EAAA,EAAI,eAAA;AAAA,QACJ,IAAA,EAAM,oBAAA;AAAA,QACN,MAAA,EAAQ,WAAA;AAAA,QACR,KAAA,EAAO;AAAA,UACL,OAAA,EAAS;AAAA;AACX;AACF,KACF;AAAA,IACA,QAAQ;AAAC;AAEb;;;;"}
@@ -0,0 +1,47 @@
1
+ import { stringify, parse } from 'yaml';
2
+
3
+ const convertJsonToYaml = (value) => {
4
+ let source = value;
5
+ if (typeof source === "string") {
6
+ const trimmed = source.trim();
7
+ if (!trimmed) {
8
+ source = {};
9
+ } else {
10
+ try {
11
+ source = JSON.parse(trimmed);
12
+ } catch (error) {
13
+ throw new Error(
14
+ `Invalid JSON input provided for YAML conversion: ${error instanceof Error ? error.message : "unknown error"}`
15
+ );
16
+ }
17
+ }
18
+ }
19
+ return stringify(source ?? {});
20
+ };
21
+ const convertYamlToJson = (value) => {
22
+ let source = value;
23
+ if (typeof source === "string") {
24
+ const trimmed = source.trim();
25
+ if (!trimmed) {
26
+ source = {};
27
+ } else {
28
+ try {
29
+ source = parse(trimmed);
30
+ } catch (error) {
31
+ throw new Error(
32
+ `Invalid YAML input provided for JSON conversion: ${error instanceof Error ? error.message : "unknown error"}`
33
+ );
34
+ }
35
+ }
36
+ }
37
+ try {
38
+ return JSON.stringify(source ?? {});
39
+ } catch (error) {
40
+ throw new Error(
41
+ `Unable to serialize value to JSON: ${error instanceof Error ? error.message : "unknown error"}`
42
+ );
43
+ }
44
+ };
45
+
46
+ export { convertJsonToYaml, convertYamlToJson };
47
+ //# sourceMappingURL=yamlJsonConversion.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yamlJsonConversion.esm.js","sources":["../../src/utils/yamlJsonConversion.ts"],"sourcesContent":["import { parse, stringify } from \"yaml\";\n\nexport const convertJsonToYaml = (value: unknown): string => {\n let source = value;\n\n if (typeof source === \"string\") {\n const trimmed = source.trim();\n if (!trimmed) {\n source = {};\n } else {\n try {\n source = JSON.parse(trimmed);\n } catch (error) {\n throw new Error(\n `Invalid JSON input provided for YAML conversion: ${\n error instanceof Error ? error.message : \"unknown error\"\n }`\n );\n }\n }\n }\n\n return stringify(source ?? {});\n};\n\nexport const convertYamlToJson = (value: unknown): string => {\n let source = value;\n\n if (typeof source === \"string\") {\n const trimmed = source.trim();\n if (!trimmed) {\n source = {};\n } else {\n try {\n source = parse(trimmed);\n } catch (error) {\n throw new Error(\n `Invalid YAML input provided for JSON conversion: ${\n error instanceof Error ? error.message : \"unknown error\"\n }`\n );\n }\n }\n }\n\n try {\n return JSON.stringify(source ?? {});\n } catch (error) {\n throw new Error(\n `Unable to serialize value to JSON: ${\n error instanceof Error ? error.message : \"unknown error\"\n }`\n );\n }\n};\n"],"names":[],"mappings":";;AAEO,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAA2B;AAC3D,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAA,GAAS,EAAC;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,MAC7B,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,iDAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAC3C,CAAA;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,SAAA,CAAU,MAAA,IAAU,EAAE,CAAA;AAC/B;AAEO,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAA2B;AAC3D,EAAA,IAAI,MAAA,GAAS,KAAA;AAEb,EAAA,IAAI,OAAO,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,OAAA,GAAU,OAAO,IAAA,EAAK;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,MAAA,GAAS,EAAC;AAAA,IACZ,CAAA,MAAO;AACL,MAAA,IAAI;AACF,QAAA,MAAA,GAAS,MAAM,OAAO,CAAA;AAAA,MACxB,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,iDAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAC3C,CAAA;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI;AACF,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,MAAA,IAAU,EAAE,CAAA;AAAA,EACpC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,mCAAA,EACE,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,UAAU,eAC3C,CAAA;AAAA,KACF;AAAA,EACF;AACF;;;;"}
package/package.json ADDED
@@ -0,0 +1,103 @@
1
+ {
2
+ "name": "@tduniec/plugin-template-designer-foundation",
3
+ "version": "0.1.1",
4
+ "license": "Apache-2.0",
5
+ "main": "./dist/index.esm.js",
6
+ "types": "./dist/index.d.ts",
7
+ "exports": {
8
+ ".": {
9
+ "import": "./dist/index.esm.js",
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.esm.js"
12
+ },
13
+ "./package.json": "./package.json"
14
+ },
15
+ "typesVersions": {
16
+ "*": {
17
+ "package.json": [
18
+ "package.json"
19
+ ]
20
+ }
21
+ },
22
+ "publishConfig": {
23
+ "access": "public"
24
+ },
25
+ "repository": {
26
+ "type": "git",
27
+ "url": "git+https://github.com/tduniec/template-designer-plugin.git",
28
+ "directory": "./plugins/temlplate-designer-foundation"
29
+ },
30
+ "backstage": {
31
+ "role": "web-library",
32
+ "pluginId": "template-designer",
33
+ "pluginPackages": [
34
+ "@tduniec/plugin-template-designer",
35
+ "@tduniec/plugin-template-designer-foundation"
36
+ ]
37
+ },
38
+ "sideEffects": false,
39
+ "scripts": {
40
+ "start": "backstage-cli package start",
41
+ "build": "backstage-cli package build",
42
+ "lint": "backstage-cli package lint",
43
+ "tsc": "tsc",
44
+ "validate:fix": "yarn tsc && backstage-cli package lint --fix && prettier -w .",
45
+ "test": "backstage-cli package test",
46
+ "prettier:check": "prettier --check .",
47
+ "prettier:fix": "prettier -w .",
48
+ "clean": "backstage-cli package clean",
49
+ "set-version": "node scripts/set-version.js",
50
+ "prepack": "backstage-cli package prepack",
51
+ "postpack": "backstage-cli package postpack"
52
+ },
53
+ "dependencies": {
54
+ "@codemirror/lang-yaml": "^6.1.2",
55
+ "@codemirror/state": "6.5.2",
56
+ "@codemirror/view": "6.26.3",
57
+ "@uiw/react-codemirror": "4.25.2",
58
+ "@xyflow/react": "^12.8.6",
59
+ "react-use": "^17.2.4",
60
+ "yaml": "^2.8.1"
61
+ },
62
+ "peerDependencies": {
63
+ "@backstage/core-components": "*",
64
+ "@backstage/core-plugin-api": "*",
65
+ "@backstage/plugin-catalog-react": "*",
66
+ "@backstage/plugin-scaffolder-common": "*",
67
+ "@backstage/plugin-scaffolder-react": "*",
68
+ "@backstage/theme": "*",
69
+ "@material-ui/core": "^4.9.13 || ^4.12.4",
70
+ "@material-ui/icons": "^4.9.1 || ^4.11.3",
71
+ "@material-ui/lab": "^4.0.0-alpha.61",
72
+ "react": "^18.0.0",
73
+ "react-dom": "^18.0.0"
74
+ },
75
+ "devDependencies": {
76
+ "@backstage/cli": "^0.34.5",
77
+ "@backstage/core-app-api": "^1.19.2",
78
+ "@backstage/core-components": "^0.18.3",
79
+ "@backstage/core-plugin-api": "^1.12.0",
80
+ "@backstage/dev-utils": "^1.1.17",
81
+ "@backstage/plugin-catalog-react": "^1.21.3",
82
+ "@backstage/plugin-scaffolder-common": "^1.7.3",
83
+ "@backstage/plugin-scaffolder-react": "^1.19.3",
84
+ "@backstage/test-utils": "^1.7.13",
85
+ "@backstage/theme": "^0.7.0",
86
+ "@material-ui/core": "^4.12.4",
87
+ "@material-ui/icons": "^4.11.3",
88
+ "@material-ui/lab": "^4.0.0-alpha.61",
89
+ "@testing-library/jest-dom": "^6.0.0",
90
+ "@testing-library/react": "^14.0.0",
91
+ "@testing-library/user-event": "^14.0.0",
92
+ "msw": "^1.0.0",
93
+ "prettier": "^2.3.2",
94
+ "react": "^18.0.0",
95
+ "react-dom": "^18.0.0",
96
+ "typescript": "~5.8.0"
97
+ },
98
+ "files": [
99
+ "dist",
100
+ "dist-types"
101
+ ],
102
+ "module": "./dist/index.esm.js"
103
+ }