@backstage/plugin-scaffolder 1.34.0-next.3 → 1.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (122) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/alpha/api/FormDecoratorsApi.esm.js.map +1 -1
  3. package/dist/alpha/api/ref.esm.js.map +1 -1
  4. package/dist/alpha/components/TemplateEditorPage/CustomFieldExplorer.esm.js.map +1 -1
  5. package/dist/alpha/components/TemplateEditorPage/CustomFieldPlayground.esm.js.map +1 -1
  6. package/dist/alpha/components/TemplateEditorPage/CustomFieldsPage.esm.js.map +1 -1
  7. package/dist/alpha/components/TemplateEditorPage/DirectoryEditorContext.esm.js +1 -1
  8. package/dist/alpha/components/TemplateEditorPage/DirectoryEditorContext.esm.js.map +1 -1
  9. package/dist/alpha/components/TemplateEditorPage/DryRunContext.esm.js +1 -1
  10. package/dist/alpha/components/TemplateEditorPage/DryRunContext.esm.js.map +1 -1
  11. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResults.esm.js.map +1 -1
  12. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsList.esm.js.map +1 -1
  13. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsSplitView.esm.js.map +1 -1
  14. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsView.esm.js.map +1 -1
  15. package/dist/alpha/components/TemplateEditorPage/DryRunResults/IconLink.esm.js.map +1 -1
  16. package/dist/alpha/components/TemplateEditorPage/DryRunResults/TaskPageLinks.esm.js.map +1 -1
  17. package/dist/alpha/components/TemplateEditorPage/DryRunResults/TaskStatusStepper.esm.js.map +1 -1
  18. package/dist/alpha/components/TemplateEditorPage/TemplateEditor.esm.js +1 -1
  19. package/dist/alpha/components/TemplateEditorPage/TemplateEditor.esm.js.map +1 -1
  20. package/dist/alpha/components/TemplateEditorPage/TemplateEditorBrowser.esm.js.map +1 -1
  21. package/dist/alpha/components/TemplateEditorPage/TemplateEditorForm.esm.js.map +1 -1
  22. package/dist/alpha/components/TemplateEditorPage/TemplateEditorIntro.esm.js.map +1 -1
  23. package/dist/alpha/components/TemplateEditorPage/TemplateEditorLayout.esm.js +1 -1
  24. package/dist/alpha/components/TemplateEditorPage/TemplateEditorLayout.esm.js.map +1 -1
  25. package/dist/alpha/components/TemplateEditorPage/TemplateEditorPage.esm.js.map +1 -1
  26. package/dist/alpha/components/TemplateEditorPage/TemplateEditorTextArea.esm.js.map +1 -1
  27. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbar.esm.js.map +1 -1
  28. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarFileMenu.esm.js.map +1 -1
  29. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbarTemplatesMenu.esm.js.map +1 -1
  30. package/dist/alpha/components/TemplateEditorPage/TemplateFormPage.esm.js.map +1 -1
  31. package/dist/alpha/components/TemplateEditorPage/TemplateFormPreviewer.esm.js +1 -1
  32. package/dist/alpha/components/TemplateEditorPage/TemplateFormPreviewer.esm.js.map +1 -1
  33. package/dist/alpha/components/TemplateEditorPage/TemplateIntroPage.esm.js.map +1 -1
  34. package/dist/alpha/components/TemplateEditorPage/useTemplateDirectory.esm.js.map +1 -1
  35. package/dist/alpha/components/TemplateListPage/RegisterExistingButton.esm.js.map +1 -1
  36. package/dist/alpha/components/TemplateListPage/TemplateListPage.esm.js.map +1 -1
  37. package/dist/alpha/components/TemplateWizardPage/TemplateWizardPage.esm.js.map +1 -1
  38. package/dist/alpha/components/TemplateWizardPage/TemplateWizardPageContextMenu.esm.js.map +1 -1
  39. package/dist/alpha/extensions.esm.js +1 -1
  40. package/dist/alpha/extensions.esm.js.map +1 -1
  41. package/dist/alpha/fields/RepoUrlPicker.esm.js.map +1 -1
  42. package/dist/alpha/hooks/useFormDecorators.esm.js.map +1 -1
  43. package/dist/alpha/hooks/useScaffolderTemplateIconLinkProps.esm.js.map +1 -1
  44. package/dist/alpha/plugin.esm.js +1 -1
  45. package/dist/alpha/plugin.esm.js.map +1 -1
  46. package/dist/alpha.d.ts +1 -1
  47. package/dist/api.esm.js.map +1 -1
  48. package/dist/components/ActionsPage/ActionsPage.esm.js.map +1 -1
  49. package/dist/components/FileBrowser/FileBrowser.esm.js +0 -3
  50. package/dist/components/FileBrowser/FileBrowser.esm.js.map +1 -1
  51. package/dist/components/ListTasksPage/ListTasksPage.esm.js.map +1 -1
  52. package/dist/components/ListTasksPage/OwnerListPicker.esm.js.map +1 -1
  53. package/dist/components/ListTasksPage/columns/CreatedAtColumn.esm.js.map +1 -1
  54. package/dist/components/ListTasksPage/columns/OwnerEntityColumn.esm.js.map +1 -1
  55. package/dist/components/ListTasksPage/columns/TaskStatusColumn.esm.js.map +1 -1
  56. package/dist/components/ListTasksPage/columns/TemplateTitleColumn.esm.js.map +1 -1
  57. package/dist/components/OngoingTask/ContextMenu.esm.js +1 -1
  58. package/dist/components/OngoingTask/ContextMenu.esm.js.map +1 -1
  59. package/dist/components/OngoingTask/OngoingTask.esm.js.map +1 -1
  60. package/dist/components/RenderSchema/RenderSchema.esm.js +1 -1
  61. package/dist/components/RenderSchema/RenderSchema.esm.js.map +1 -1
  62. package/dist/components/Router/Router.esm.js +1 -1
  63. package/dist/components/Router/Router.esm.js.map +1 -1
  64. package/dist/components/ScaffolderUsageExamplesTable/ScaffolderUsageExamplesTable.esm.js.map +1 -1
  65. package/dist/components/TemplateTypePicker/TemplateTypePicker.esm.js.map +1 -1
  66. package/dist/components/TemplatingExtensionsPage/TemplateFilters.esm.js.map +1 -1
  67. package/dist/components/TemplatingExtensionsPage/TemplateGlobals.esm.js.map +1 -1
  68. package/dist/components/TemplatingExtensionsPage/TemplatingExtensionsPage.esm.js.map +1 -1
  69. package/dist/components/TemplatingExtensionsPage/functionArgs.esm.js.map +1 -1
  70. package/dist/components/TemplatingExtensionsPage/navigation.esm.js.map +1 -1
  71. package/dist/components/fields/EntityNamePicker/EntityNamePicker.esm.js.map +1 -1
  72. package/dist/components/fields/EntityNamePicker/schema.esm.js.map +1 -1
  73. package/dist/components/fields/EntityNamePicker/validation.esm.js.map +1 -1
  74. package/dist/components/fields/EntityPicker/EntityPicker.esm.js.map +1 -1
  75. package/dist/components/fields/EntityPicker/schema.esm.js.map +1 -1
  76. package/dist/components/fields/EntityTagsPicker/EntityTagsPicker.esm.js.map +1 -1
  77. package/dist/components/fields/EntityTagsPicker/schema.esm.js.map +1 -1
  78. package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js +1 -1
  79. package/dist/components/fields/MultiEntityPicker/MultiEntityPicker.esm.js.map +1 -1
  80. package/dist/components/fields/MultiEntityPicker/schema.esm.js.map +1 -1
  81. package/dist/components/fields/MyGroupsPicker/MyGroupsPicker.esm.js.map +1 -1
  82. package/dist/components/fields/MyGroupsPicker/schema.esm.js.map +1 -1
  83. package/dist/components/fields/OwnedEntityPicker/OwnedEntityPicker.esm.js.map +1 -1
  84. package/dist/components/fields/OwnedEntityPicker/schema.esm.js.map +1 -1
  85. package/dist/components/fields/OwnerPicker/OwnerPicker.esm.js.map +1 -1
  86. package/dist/components/fields/OwnerPicker/schema.esm.js.map +1 -1
  87. package/dist/components/fields/RepoBranchPicker/BitbucketRepoBranchPicker.esm.js.map +1 -1
  88. package/dist/components/fields/RepoBranchPicker/DefaultRepoBranchPicker.esm.js.map +1 -1
  89. package/dist/components/fields/RepoBranchPicker/GitHubRepoBranchPicker.esm.js.map +1 -1
  90. package/dist/components/fields/RepoBranchPicker/RepoBranchPicker.esm.js.map +1 -1
  91. package/dist/components/fields/RepoBranchPicker/schema.esm.js.map +1 -1
  92. package/dist/components/fields/RepoUrlPicker/AzureRepoPicker.esm.js.map +1 -1
  93. package/dist/components/fields/RepoUrlPicker/BitbucketRepoPicker.esm.js.map +1 -1
  94. package/dist/components/fields/RepoUrlPicker/GerritRepoPicker.esm.js.map +1 -1
  95. package/dist/components/fields/RepoUrlPicker/GiteaRepoPicker.esm.js.map +1 -1
  96. package/dist/components/fields/RepoUrlPicker/GithubRepoPicker.esm.js.map +1 -1
  97. package/dist/components/fields/RepoUrlPicker/GitlabRepoPicker.esm.js.map +1 -1
  98. package/dist/components/fields/RepoUrlPicker/RepoUrlPicker.esm.js.map +1 -1
  99. package/dist/components/fields/RepoUrlPicker/RepoUrlPickerHost.esm.js.map +1 -1
  100. package/dist/components/fields/RepoUrlPicker/RepoUrlPickerRepoName.esm.js.map +1 -1
  101. package/dist/components/fields/RepoUrlPicker/schema.esm.js.map +1 -1
  102. package/dist/components/fields/RepoUrlPicker/utils.esm.js.map +1 -1
  103. package/dist/components/fields/RepoUrlPicker/validation.esm.js.map +1 -1
  104. package/dist/components/fields/SecretInput/SecretInput.esm.js.map +1 -1
  105. package/dist/components/fields/VirtualizedListbox.esm.js.map +1 -1
  106. package/dist/components/fields/utils.esm.js.map +1 -1
  107. package/dist/deprecated.esm.js.map +1 -1
  108. package/dist/extensions/default.esm.js +1 -1
  109. package/dist/extensions/default.esm.js.map +1 -1
  110. package/dist/lib/download/helpers.esm.js.map +1 -1
  111. package/dist/lib/filesystem/WebFileSystemAccess.esm.js.map +1 -1
  112. package/dist/lib/filesystem/WebFileSystemStore.esm.js.map +1 -1
  113. package/dist/lib/filesystem/createExampleTemplate.esm.js.map +1 -1
  114. package/dist/packages/opaque-internal/src/OpaqueType.esm.js.map +1 -1
  115. package/dist/packages/scaffolder-internal/src/wiring/InternalFormDecorator.esm.js.map +1 -1
  116. package/dist/packages/scaffolder-internal/src/wiring/InternalFormField.esm.js.map +1 -1
  117. package/dist/plugin.esm.js +3 -3
  118. package/dist/plugin.esm.js.map +1 -1
  119. package/dist/plugins/scaffolder/package.json.esm.js +1 -1
  120. package/dist/routes.esm.js.map +1 -1
  121. package/dist/translation.esm.js.map +1 -1
  122. package/package.json +22 -22
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateFormPreviewer.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateFormPreviewer.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport yaml from 'yaml';\nimport { useCallback, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport useAsync from 'react-use/esm/useAsync';\n\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport { alertApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n humanizeEntityRef,\n} from '@backstage/plugin-catalog-react';\nimport {\n LayoutOptions,\n FieldExtensionOptions,\n FormProps,\n} from '@backstage/plugin-scaffolder-react';\n\nimport { editRouteRef } from '../../../routes';\n\nimport {\n TemplateEditorLayout,\n TemplateEditorLayoutToolbar,\n TemplateEditorLayoutFiles,\n TemplateEditorLayoutPreview,\n TemplateEditorPanels,\n} from './TemplateEditorLayout';\nimport { TemplateEditorToolbar } from './TemplateEditorToolbar';\nimport { TemplateEditorToolbarFileMenu } from './TemplateEditorToolbarFileMenu';\nimport {\n TemplateOption,\n TemplateEditorToolbarTemplatesMenu,\n} from './TemplateEditorToolbarTemplatesMenu';\nimport { TemplateEditorForm } from './TemplateEditorForm';\nimport { TemplateEditorTextArea } from './TemplateEditorTextArea';\n\nconst EXAMPLE_TEMPLATE_PARAMS_YAML = `# Edit the template parameters below to see how they will render in the scaffolder form UI\nparameters:\n - title: Fill in some steps\n required:\n - name\n properties:\n name:\n title: Name\n type: string\n description: Unique name of the component\n owner:\n title: Owner\n type: string\n description: Owner of the component\n ui:field: OwnerPicker\n ui:options:\n catalogFilter:\n kind: Group\n - title: Choose a location\n required:\n - repoUrl\n properties:\n repoUrl:\n title: Repository Location\n type: string\n ui:field: RepoUrlPicker\n ui:options:\n allowedHosts:\n - github.com\nsteps:\n - id: fetch-base\n name: Fetch Base\n action: fetch:template\n input:\n url: ./template\n values:\n name: \\${{parameters.name}}\n`;\n\n/** @public */\nexport type ScaffolderTemplateFormPreviewerClassKey =\n | 'root'\n | 'toolbar'\n | 'controls'\n | 'textArea'\n | 'preview';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n height: '100%',\n gridArea: 'pageContent',\n display: 'grid',\n gridTemplateAreas: `\n \"toolbar\"\n \"textArea\"\n \"preview\"\n `,\n [theme.breakpoints.up('md')]: {\n gridTemplateAreas: `\n \"toolbar toolbar\"\n \"textArea preview\"\n `,\n gridTemplateRows: 'auto 1fr',\n gridTemplateColumns: '1fr',\n },\n },\n files: {\n gridArea: 'textArea',\n },\n }),\n { name: 'ScaffolderTemplateFormPreviewer' },\n);\n\nexport const TemplateFormPreviewer = ({\n defaultPreviewTemplate = EXAMPLE_TEMPLATE_PARAMS_YAML,\n customFieldExtensions = [],\n layouts = [],\n formProps,\n}: {\n defaultPreviewTemplate?: string;\n customFieldExtensions?: FieldExtensionOptions<any, any>[];\n onClose?: () => void;\n layouts?: LayoutOptions[];\n formProps?: FormProps;\n}) => {\n const classes = useStyles();\n const alertApi = useApi(alertApiRef);\n const catalogApi = useApi(catalogApiRef);\n const navigate = useNavigate();\n const editLink = useRouteRef(editRouteRef);\n\n const [errorText, setErrorText] = useState<string>();\n const [selectedTemplate, setSelectedTemplate] = useState<TemplateOption>();\n const [templateOptions, setTemplateOptions] = useState<TemplateOption[]>([]);\n const [templateYaml, setTemplateYaml] = useState(defaultPreviewTemplate);\n\n const handleCloseDirectory = useCallback(() => {\n navigate(editLink());\n }, [navigate, editLink]);\n\n useAsync(\n () =>\n catalogApi\n .getEntities({\n filter: { kind: 'template' },\n fields: [\n 'kind',\n 'metadata.namespace',\n 'metadata.name',\n 'metadata.title',\n 'spec.parameters',\n 'spec.steps',\n 'spec.output',\n ],\n })\n .then(({ items }) =>\n setTemplateOptions(\n items.map(template => ({\n label:\n template.metadata.title ??\n humanizeEntityRef(template, { defaultKind: 'template' }),\n value: template,\n })),\n ),\n )\n .catch(e =>\n alertApi.post({\n message: `Error loading existing templates: ${e.message}`,\n severity: 'error',\n }),\n ),\n [catalogApi],\n );\n\n const handleSelectChange = useCallback(\n // TODO(Rugvip): Afaik this should be Entity, but didn't want to make runtime changes while fixing types\n (selected: TemplateOption) => {\n setSelectedTemplate(selected);\n setTemplateYaml(yaml.stringify(selected.value.spec));\n },\n [setSelectedTemplate, setTemplateYaml],\n );\n\n return (\n <TemplateEditorLayout classes={{ root: classes.root }}>\n <TemplateEditorLayoutToolbar>\n <TemplateEditorToolbar fieldExtensions={customFieldExtensions}>\n <TemplateEditorToolbarFileMenu\n onCloseDirectory={handleCloseDirectory}\n />\n <TemplateEditorToolbarTemplatesMenu\n options={templateOptions}\n selectedOption={selectedTemplate}\n onSelectOption={handleSelectChange}\n />\n </TemplateEditorToolbar>\n </TemplateEditorLayoutToolbar>\n <TemplateEditorPanels\n autoSaveId=\"template-form-previewer\"\n files={\n <TemplateEditorLayoutFiles classes={{ root: classes.files }}>\n <TemplateEditorTextArea\n content={templateYaml}\n onUpdate={setTemplateYaml}\n errorText={errorText}\n />\n </TemplateEditorLayoutFiles>\n }\n preview={\n <TemplateEditorLayoutPreview>\n <TemplateEditorForm\n content={templateYaml}\n contentIsSpec\n fieldExtensions={customFieldExtensions}\n setErrorText={setErrorText}\n layouts={layouts}\n formProps={formProps}\n />\n </TemplateEditorLayoutPreview>\n }\n />\n </TemplateEditorLayout>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TemplateFormPreviewer.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateFormPreviewer.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport yaml from 'yaml';\nimport { useCallback, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport useAsync from 'react-use/esm/useAsync';\n\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport { alertApiRef, useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n humanizeEntityRef,\n} from '@backstage/plugin-catalog-react';\nimport {\n LayoutOptions,\n FieldExtensionOptions,\n FormProps,\n} from '@backstage/plugin-scaffolder-react';\n\nimport { editRouteRef } from '../../../routes';\n\nimport {\n TemplateEditorLayout,\n TemplateEditorLayoutToolbar,\n TemplateEditorLayoutFiles,\n TemplateEditorLayoutPreview,\n TemplateEditorPanels,\n} from './TemplateEditorLayout';\nimport { TemplateEditorToolbar } from './TemplateEditorToolbar';\nimport { TemplateEditorToolbarFileMenu } from './TemplateEditorToolbarFileMenu';\nimport {\n TemplateOption,\n TemplateEditorToolbarTemplatesMenu,\n} from './TemplateEditorToolbarTemplatesMenu';\nimport { TemplateEditorForm } from './TemplateEditorForm';\nimport { TemplateEditorTextArea } from './TemplateEditorTextArea';\n\nconst EXAMPLE_TEMPLATE_PARAMS_YAML = `# Edit the template parameters below to see how they will render in the scaffolder form UI\nparameters:\n - title: Fill in some steps\n required:\n - name\n properties:\n name:\n title: Name\n type: string\n description: Unique name of the component\n owner:\n title: Owner\n type: string\n description: Owner of the component\n ui:field: OwnerPicker\n ui:options:\n catalogFilter:\n kind: Group\n - title: Choose a location\n required:\n - repoUrl\n properties:\n repoUrl:\n title: Repository Location\n type: string\n ui:field: RepoUrlPicker\n ui:options:\n allowedHosts:\n - github.com\nsteps:\n - id: fetch-base\n name: Fetch Base\n action: fetch:template\n input:\n url: ./template\n values:\n name: \\${{parameters.name}}\n`;\n\n/** @public */\nexport type ScaffolderTemplateFormPreviewerClassKey =\n | 'root'\n | 'toolbar'\n | 'controls'\n | 'textArea'\n | 'preview';\n\nconst useStyles = makeStyles(\n theme => ({\n root: {\n height: '100%',\n gridArea: 'pageContent',\n display: 'grid',\n gridTemplateAreas: `\n \"toolbar\"\n \"textArea\"\n \"preview\"\n `,\n [theme.breakpoints.up('md')]: {\n gridTemplateAreas: `\n \"toolbar toolbar\"\n \"textArea preview\"\n `,\n gridTemplateRows: 'auto 1fr',\n gridTemplateColumns: '1fr',\n },\n },\n files: {\n gridArea: 'textArea',\n },\n }),\n { name: 'ScaffolderTemplateFormPreviewer' },\n);\n\nexport const TemplateFormPreviewer = ({\n defaultPreviewTemplate = EXAMPLE_TEMPLATE_PARAMS_YAML,\n customFieldExtensions = [],\n layouts = [],\n formProps,\n}: {\n defaultPreviewTemplate?: string;\n customFieldExtensions?: FieldExtensionOptions<any, any>[];\n onClose?: () => void;\n layouts?: LayoutOptions[];\n formProps?: FormProps;\n}) => {\n const classes = useStyles();\n const alertApi = useApi(alertApiRef);\n const catalogApi = useApi(catalogApiRef);\n const navigate = useNavigate();\n const editLink = useRouteRef(editRouteRef);\n\n const [errorText, setErrorText] = useState<string>();\n const [selectedTemplate, setSelectedTemplate] = useState<TemplateOption>();\n const [templateOptions, setTemplateOptions] = useState<TemplateOption[]>([]);\n const [templateYaml, setTemplateYaml] = useState(defaultPreviewTemplate);\n\n const handleCloseDirectory = useCallback(() => {\n navigate(editLink());\n }, [navigate, editLink]);\n\n useAsync(\n () =>\n catalogApi\n .getEntities({\n filter: { kind: 'template' },\n fields: [\n 'kind',\n 'metadata.namespace',\n 'metadata.name',\n 'metadata.title',\n 'spec.parameters',\n 'spec.steps',\n 'spec.output',\n ],\n })\n .then(({ items }) =>\n setTemplateOptions(\n items.map(template => ({\n label:\n template.metadata.title ??\n humanizeEntityRef(template, { defaultKind: 'template' }),\n value: template,\n })),\n ),\n )\n .catch(e =>\n alertApi.post({\n message: `Error loading existing templates: ${e.message}`,\n severity: 'error',\n }),\n ),\n [catalogApi],\n );\n\n const handleSelectChange = useCallback(\n // TODO(Rugvip): Afaik this should be Entity, but didn't want to make runtime changes while fixing types\n (selected: TemplateOption) => {\n setSelectedTemplate(selected);\n setTemplateYaml(yaml.stringify(selected.value.spec));\n },\n [setSelectedTemplate, setTemplateYaml],\n );\n\n return (\n <TemplateEditorLayout classes={{ root: classes.root }}>\n <TemplateEditorLayoutToolbar>\n <TemplateEditorToolbar fieldExtensions={customFieldExtensions}>\n <TemplateEditorToolbarFileMenu\n onCloseDirectory={handleCloseDirectory}\n />\n <TemplateEditorToolbarTemplatesMenu\n options={templateOptions}\n selectedOption={selectedTemplate}\n onSelectOption={handleSelectChange}\n />\n </TemplateEditorToolbar>\n </TemplateEditorLayoutToolbar>\n <TemplateEditorPanels\n autoSaveId=\"template-form-previewer\"\n files={\n <TemplateEditorLayoutFiles classes={{ root: classes.files }}>\n <TemplateEditorTextArea\n content={templateYaml}\n onUpdate={setTemplateYaml}\n errorText={errorText}\n />\n </TemplateEditorLayoutFiles>\n }\n preview={\n <TemplateEditorLayoutPreview>\n <TemplateEditorForm\n content={templateYaml}\n contentIsSpec\n fieldExtensions={customFieldExtensions}\n setErrorText={setErrorText}\n layouts={layouts}\n formProps={formProps}\n />\n </TemplateEditorLayoutPreview>\n }\n />\n </TemplateEditorLayout>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateIntroPage.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateIntroPage.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useCallback } from 'react';\nimport { Content, Header, Page } from '@backstage/core-components';\n\nimport { TemplateEditorIntro } from './TemplateEditorIntro';\nimport { useNavigate } from 'react-router-dom';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n rootRouteRef,\n editorRouteRef,\n templateFormRouteRef,\n customFieldsRouteRef,\n} from '../../../routes';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { useTemplateDirectory } from './useTemplateDirectory';\n\nexport function TemplateIntroPage() {\n const navigate = useNavigate();\n const createLink = useRouteRef(rootRouteRef);\n const editorLink = useRouteRef(editorRouteRef);\n const templateFormLink = useRouteRef(templateFormRouteRef);\n const customFieldsLink = useRouteRef(customFieldsRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const { openDirectory, createDirectory } = useTemplateDirectory();\n\n const handleSelect = useCallback(\n (option: 'create-template' | 'local' | 'form' | 'field-explorer') => {\n if (option === 'local') {\n openDirectory()\n .then(() => navigate(editorLink()))\n .catch(() => {});\n } else if (option === 'create-template') {\n createDirectory()\n .then(() => navigate(editorLink()))\n .catch(() => {});\n } else if (option === 'form') {\n navigate(templateFormLink());\n } else if (option === 'field-explorer') {\n navigate(customFieldsLink());\n }\n },\n [\n openDirectory,\n createDirectory,\n navigate,\n editorLink,\n templateFormLink,\n customFieldsLink,\n ],\n );\n\n return (\n <Page themeId=\"home\">\n <Header\n title={t('templateIntroPage.title')}\n type=\"Scaffolder\"\n typeLink={createLink()}\n subtitle={t('templateIntroPage.subtitle')}\n />\n <Content>\n <TemplateEditorIntro onSelect={handleSelect} />\n </Content>\n </Page>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AA+BO,SAAS,iBAAoB,GAAA;AAClC,EAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,EAAM,MAAA,UAAA,GAAa,YAAY,YAAY,CAAA;AAC3C,EAAM,MAAA,UAAA,GAAa,YAAY,cAAc,CAAA;AAC7C,EAAM,MAAA,gBAAA,GAAmB,YAAY,oBAAoB,CAAA;AACzD,EAAM,MAAA,gBAAA,GAAmB,YAAY,oBAAoB,CAAA;AACzD,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,EAAE,aAAA,EAAe,eAAgB,EAAA,GAAI,oBAAqB,EAAA;AAEhE,EAAA,MAAM,YAAe,GAAA,WAAA;AAAA,IACnB,CAAC,MAAoE,KAAA;AACnE,MAAA,IAAI,WAAW,OAAS,EAAA;AACtB,QAAc,aAAA,EAAA,CACX,KAAK,MAAM,QAAA,CAAS,YAAY,CAAC,CACjC,CAAA,KAAA,CAAM,MAAM;AAAA,SAAE,CAAA;AAAA,OACnB,MAAA,IAAW,WAAW,iBAAmB,EAAA;AACvC,QAAgB,eAAA,EAAA,CACb,KAAK,MAAM,QAAA,CAAS,YAAY,CAAC,CACjC,CAAA,KAAA,CAAM,MAAM;AAAA,SAAE,CAAA;AAAA,OACnB,MAAA,IAAW,WAAW,MAAQ,EAAA;AAC5B,QAAA,QAAA,CAAS,kBAAkB,CAAA;AAAA,OAC7B,MAAA,IAAW,WAAW,gBAAkB,EAAA;AACtC,QAAA,QAAA,CAAS,kBAAkB,CAAA;AAAA;AAC7B,KACF;AAAA,IACA;AAAA,MACE,aAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EACE,uBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,MACZ,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,yBAAyB,CAAA;AAAA,QAClC,IAAK,EAAA,YAAA;AAAA,QACL,UAAU,UAAW,EAAA;AAAA,QACrB,QAAA,EAAU,EAAE,4BAA4B;AAAA;AAAA,KAC1C;AAAA,wBACC,OACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,mBAAoB,EAAA,EAAA,QAAA,EAAU,cAAc,CAC/C,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"TemplateIntroPage.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/TemplateIntroPage.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useCallback } from 'react';\nimport { Content, Header, Page } from '@backstage/core-components';\n\nimport { TemplateEditorIntro } from './TemplateEditorIntro';\nimport { useNavigate } from 'react-router-dom';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n rootRouteRef,\n editorRouteRef,\n templateFormRouteRef,\n customFieldsRouteRef,\n} from '../../../routes';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { useTemplateDirectory } from './useTemplateDirectory';\n\nexport function TemplateIntroPage() {\n const navigate = useNavigate();\n const createLink = useRouteRef(rootRouteRef);\n const editorLink = useRouteRef(editorRouteRef);\n const templateFormLink = useRouteRef(templateFormRouteRef);\n const customFieldsLink = useRouteRef(customFieldsRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const { openDirectory, createDirectory } = useTemplateDirectory();\n\n const handleSelect = useCallback(\n (option: 'create-template' | 'local' | 'form' | 'field-explorer') => {\n if (option === 'local') {\n openDirectory()\n .then(() => navigate(editorLink()))\n .catch(() => {});\n } else if (option === 'create-template') {\n createDirectory()\n .then(() => navigate(editorLink()))\n .catch(() => {});\n } else if (option === 'form') {\n navigate(templateFormLink());\n } else if (option === 'field-explorer') {\n navigate(customFieldsLink());\n }\n },\n [\n openDirectory,\n createDirectory,\n navigate,\n editorLink,\n templateFormLink,\n customFieldsLink,\n ],\n );\n\n return (\n <Page themeId=\"home\">\n <Header\n title={t('templateIntroPage.title')}\n type=\"Scaffolder\"\n typeLink={createLink()}\n subtitle={t('templateIntroPage.subtitle')}\n />\n <Content>\n <TemplateEditorIntro onSelect={handleSelect} />\n </Content>\n </Page>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AA+BO,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,UAAA,GAAa,YAAY,YAAY,CAAA;AAC3C,EAAA,MAAM,UAAA,GAAa,YAAY,cAAc,CAAA;AAC7C,EAAA,MAAM,gBAAA,GAAmB,YAAY,oBAAoB,CAAA;AACzD,EAAA,MAAM,gBAAA,GAAmB,YAAY,oBAAoB,CAAA;AACzD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,EAAE,aAAA,EAAe,eAAA,EAAgB,GAAI,oBAAA,EAAqB;AAEhE,EAAA,MAAM,YAAA,GAAe,WAAA;AAAA,IACnB,CAAC,MAAA,KAAoE;AACnE,MAAA,IAAI,WAAW,OAAA,EAAS;AACtB,QAAA,aAAA,EAAc,CACX,KAAK,MAAM,QAAA,CAAS,YAAY,CAAC,CAAA,CACjC,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACnB,CAAA,MAAA,IAAW,WAAW,iBAAA,EAAmB;AACvC,QAAA,eAAA,EAAgB,CACb,KAAK,MAAM,QAAA,CAAS,YAAY,CAAC,CAAA,CACjC,KAAA,CAAM,MAAM;AAAA,QAAC,CAAC,CAAA;AAAA,MACnB,CAAA,MAAA,IAAW,WAAW,MAAA,EAAQ;AAC5B,QAAA,QAAA,CAAS,kBAAkB,CAAA;AAAA,MAC7B,CAAA,MAAA,IAAW,WAAW,gBAAA,EAAkB;AACtC,QAAA,QAAA,CAAS,kBAAkB,CAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,IACA;AAAA,MACE,aAAA;AAAA,MACA,eAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,gBAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,MAAA,EACZ,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,MAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,yBAAyB,CAAA;AAAA,QAClC,IAAA,EAAK,YAAA;AAAA,QACL,UAAU,UAAA,EAAW;AAAA,QACrB,QAAA,EAAU,EAAE,4BAA4B;AAAA;AAAA,KAC1C;AAAA,wBACC,OAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,mBAAA,EAAA,EAAoB,QAAA,EAAU,cAAc,CAAA,EAC/C;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useTemplateDirectory.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/useTemplateDirectory.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback } from 'react';\nimport useAsyncRetry from 'react-use/esm/useAsyncRetry';\n\nimport {\n WebFileSystemStore,\n WebFileSystemAccess,\n WebDirectoryAccess,\n createExampleTemplate,\n} from '../../../lib/filesystem';\n\nexport function useTemplateDirectory(): {\n directory?: WebDirectoryAccess;\n loading: boolean;\n error?: Error;\n openDirectory: () => Promise<void>;\n createDirectory: () => Promise<void>;\n closeDirectory: () => Promise<void>;\n} {\n const { value, loading, error, retry } = useAsyncRetry(async () => {\n const directory = await WebFileSystemStore.getDirectory();\n if (!directory) return undefined;\n return WebFileSystemAccess.fromHandle(directory);\n }, []);\n\n const openDirectory = useCallback(() => {\n return WebFileSystemAccess.requestDirectoryAccess()\n .then(WebFileSystemStore.setDirectory)\n .then(retry);\n }, [retry]);\n\n const createDirectory = useCallback(() => {\n return WebFileSystemAccess.requestDirectoryAccess()\n .then(createExampleTemplate)\n .then(WebFileSystemStore.setDirectory)\n .then(retry);\n }, [retry]);\n\n const closeDirectory = useCallback(() => {\n return WebFileSystemStore.setDirectory(undefined).then(retry);\n }, [retry]);\n\n return {\n directory: value,\n loading,\n error,\n openDirectory,\n createDirectory,\n closeDirectory,\n };\n}\n"],"names":[],"mappings":";;;;;;AA0BO,SAAS,oBAOd,GAAA;AACA,EAAA,MAAM,EAAE,KAAO,EAAA,OAAA,EAAS,OAAO,KAAM,EAAA,GAAI,cAAc,YAAY;AACjE,IAAM,MAAA,SAAA,GAAY,MAAM,kBAAA,CAAmB,YAAa,EAAA;AACxD,IAAI,IAAA,CAAC,WAAkB,OAAA,KAAA,CAAA;AACvB,IAAO,OAAA,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,GACjD,EAAG,EAAE,CAAA;AAEL,EAAM,MAAA,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAO,OAAA,mBAAA,CAAoB,wBACxB,CAAA,IAAA,CAAK,mBAAmB,YAAY,CAAA,CACpC,KAAK,KAAK,CAAA;AAAA,GACf,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAM,MAAA,eAAA,GAAkB,YAAY,MAAM;AACxC,IAAO,OAAA,mBAAA,CAAoB,sBAAuB,EAAA,CAC/C,IAAK,CAAA,qBAAqB,CAC1B,CAAA,IAAA,CAAK,kBAAmB,CAAA,YAAY,CACpC,CAAA,IAAA,CAAK,KAAK,CAAA;AAAA,GACf,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAM,MAAA,cAAA,GAAiB,YAAY,MAAM;AACvC,IAAA,OAAO,kBAAmB,CAAA,YAAA,CAAa,KAAS,CAAA,CAAA,CAAE,KAAK,KAAK,CAAA;AAAA,GAC9D,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAO,OAAA;AAAA,IACL,SAAW,EAAA,KAAA;AAAA,IACX,OAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
1
+ {"version":3,"file":"useTemplateDirectory.esm.js","sources":["../../../../src/alpha/components/TemplateEditorPage/useTemplateDirectory.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback } from 'react';\nimport useAsyncRetry from 'react-use/esm/useAsyncRetry';\n\nimport {\n WebFileSystemStore,\n WebFileSystemAccess,\n WebDirectoryAccess,\n createExampleTemplate,\n} from '../../../lib/filesystem';\n\nexport function useTemplateDirectory(): {\n directory?: WebDirectoryAccess;\n loading: boolean;\n error?: Error;\n openDirectory: () => Promise<void>;\n createDirectory: () => Promise<void>;\n closeDirectory: () => Promise<void>;\n} {\n const { value, loading, error, retry } = useAsyncRetry(async () => {\n const directory = await WebFileSystemStore.getDirectory();\n if (!directory) return undefined;\n return WebFileSystemAccess.fromHandle(directory);\n }, []);\n\n const openDirectory = useCallback(() => {\n return WebFileSystemAccess.requestDirectoryAccess()\n .then(WebFileSystemStore.setDirectory)\n .then(retry);\n }, [retry]);\n\n const createDirectory = useCallback(() => {\n return WebFileSystemAccess.requestDirectoryAccess()\n .then(createExampleTemplate)\n .then(WebFileSystemStore.setDirectory)\n .then(retry);\n }, [retry]);\n\n const closeDirectory = useCallback(() => {\n return WebFileSystemStore.setDirectory(undefined).then(retry);\n }, [retry]);\n\n return {\n directory: value,\n loading,\n error,\n openDirectory,\n createDirectory,\n closeDirectory,\n };\n}\n"],"names":[],"mappings":";;;;;;AA0BO,SAAS,oBAAA,GAOd;AACA,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,OAAO,KAAA,EAAM,GAAI,cAAc,YAAY;AACjE,IAAA,MAAM,SAAA,GAAY,MAAM,kBAAA,CAAmB,YAAA,EAAa;AACxD,IAAA,IAAI,CAAC,WAAW,OAAO,MAAA;AACvB,IAAA,OAAO,mBAAA,CAAoB,WAAW,SAAS,CAAA;AAAA,EACjD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,OAAO,mBAAA,CAAoB,wBAAuB,CAC/C,IAAA,CAAK,mBAAmB,YAAY,CAAA,CACpC,KAAK,KAAK,CAAA;AAAA,EACf,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAM;AACxC,IAAA,OAAO,mBAAA,CAAoB,sBAAA,EAAuB,CAC/C,IAAA,CAAK,qBAAqB,CAAA,CAC1B,IAAA,CAAK,kBAAA,CAAmB,YAAY,CAAA,CACpC,IAAA,CAAK,KAAK,CAAA;AAAA,EACf,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,MAAM,cAAA,GAAiB,YAAY,MAAM;AACvC,IAAA,OAAO,kBAAA,CAAmB,YAAA,CAAa,MAAS,CAAA,CAAE,KAAK,KAAK,CAAA;AAAA,EAC9D,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,KAAA;AAAA,IACX,OAAA;AAAA,IACA,KAAA;AAAA,IACA,aAAA;AAAA,IACA,eAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"RegisterExistingButton.esm.js","sources":["../../../../src/alpha/components/TemplateListPage/RegisterExistingButton.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Button from '@material-ui/core/Button';\nimport IconButton from '@material-ui/core/IconButton';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport { Link as RouterLink, LinkProps } from 'react-router-dom';\nimport AddCircleOutline from '@material-ui/icons/AddCircleOutline';\nimport { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { Theme } from '@material-ui/core/styles';\n\n/**\n * Properties for {@link RegisterExistingButton}\n *\n * @alpha\n */\nexport type RegisterExistingButtonProps = {\n title: string;\n} & Partial<Pick<LinkProps, 'to'>>;\n\n/**\n * A button that helps users to register an existing component.\n * @alpha\n */\nexport const RegisterExistingButton = (props: RegisterExistingButtonProps) => {\n const { title, to } = props;\n const { allowed } = usePermission({\n permission: catalogEntityCreatePermission,\n });\n const isXSScreen = useMediaQuery<Theme>(theme =>\n theme.breakpoints.down('xs'),\n );\n\n if (!to || !allowed) {\n return null;\n }\n\n return isXSScreen ? (\n <IconButton\n component={RouterLink}\n color=\"primary\"\n title={title}\n size=\"small\"\n to={to}\n >\n <AddCircleOutline />\n </IconButton>\n ) : (\n <Button component={RouterLink} variant=\"outlined\" color=\"primary\" to={to}>\n {title}\n </Button>\n );\n};\n"],"names":["RouterLink","AddCircleOutline"],"mappings":";;;;;;;;;AAsCa,MAAA,sBAAA,GAAyB,CAAC,KAAuC,KAAA;AAC5E,EAAM,MAAA,EAAE,KAAO,EAAA,EAAA,EAAO,GAAA,KAAA;AACtB,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,aAAc,CAAA;AAAA,IAChC,UAAY,EAAA;AAAA,GACb,CAAA;AACD,EAAA,MAAM,UAAa,GAAA,aAAA;AAAA,IAAqB,CACtC,KAAA,KAAA,KAAA,CAAM,WAAY,CAAA,IAAA,CAAK,IAAI;AAAA,GAC7B;AAEA,EAAI,IAAA,CAAC,EAAM,IAAA,CAAC,OAAS,EAAA;AACnB,IAAO,OAAA,IAAA;AAAA;AAGT,EAAA,OAAO,UACL,mBAAA,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAAA,IAAA;AAAA,MACX,KAAM,EAAA,SAAA;AAAA,MACN,KAAA;AAAA,MACA,IAAK,EAAA,OAAA;AAAA,MACL,EAAA;AAAA,MAEA,8BAACC,mBAAiB,EAAA,EAAA;AAAA;AAAA,GACpB,mBAEC,GAAA,CAAA,MAAA,EAAA,EAAO,SAAW,EAAAD,IAAA,EAAY,SAAQ,UAAW,EAAA,KAAA,EAAM,SAAU,EAAA,EAAA,EAC/D,QACH,EAAA,KAAA,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"RegisterExistingButton.esm.js","sources":["../../../../src/alpha/components/TemplateListPage/RegisterExistingButton.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport Button from '@material-ui/core/Button';\nimport IconButton from '@material-ui/core/IconButton';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport { Link as RouterLink, LinkProps } from 'react-router-dom';\nimport AddCircleOutline from '@material-ui/icons/AddCircleOutline';\nimport { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common/alpha';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { Theme } from '@material-ui/core/styles';\n\n/**\n * Properties for {@link RegisterExistingButton}\n *\n * @alpha\n */\nexport type RegisterExistingButtonProps = {\n title: string;\n} & Partial<Pick<LinkProps, 'to'>>;\n\n/**\n * A button that helps users to register an existing component.\n * @alpha\n */\nexport const RegisterExistingButton = (props: RegisterExistingButtonProps) => {\n const { title, to } = props;\n const { allowed } = usePermission({\n permission: catalogEntityCreatePermission,\n });\n const isXSScreen = useMediaQuery<Theme>(theme =>\n theme.breakpoints.down('xs'),\n );\n\n if (!to || !allowed) {\n return null;\n }\n\n return isXSScreen ? (\n <IconButton\n component={RouterLink}\n color=\"primary\"\n title={title}\n size=\"small\"\n to={to}\n >\n <AddCircleOutline />\n </IconButton>\n ) : (\n <Button component={RouterLink} variant=\"outlined\" color=\"primary\" to={to}>\n {title}\n </Button>\n );\n};\n"],"names":["RouterLink","AddCircleOutline"],"mappings":";;;;;;;;;AAsCO,MAAM,sBAAA,GAAyB,CAAC,KAAA,KAAuC;AAC5E,EAAA,MAAM,EAAE,KAAA,EAAO,EAAA,EAAG,GAAI,KAAA;AACtB,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,aAAA,CAAc;AAAA,IAChC,UAAA,EAAY;AAAA,GACb,CAAA;AACD,EAAA,MAAM,UAAA,GAAa,aAAA;AAAA,IAAqB,CAAA,KAAA,KACtC,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,IAAI;AAAA,GAC7B;AAEA,EAAA,IAAI,CAAC,EAAA,IAAM,CAAC,OAAA,EAAS;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,OAAO,UAAA,mBACL,GAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAWA,IAAA;AAAA,MACX,KAAA,EAAM,SAAA;AAAA,MACN,KAAA;AAAA,MACA,IAAA,EAAK,OAAA;AAAA,MACL,EAAA;AAAA,MAEA,8BAACC,mBAAA,EAAA,EAAiB;AAAA;AAAA,GACpB,mBAEA,GAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAWD,IAAA,EAAY,SAAQ,UAAA,EAAW,KAAA,EAAM,SAAA,EAAU,EAAA,EAC/D,QAAA,EAAA,KAAA,EACH,CAAA;AAEJ;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateListPage.esm.js","sources":["../../../../src/alpha/components/TemplateListPage/TemplateListPage.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ComponentType, useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { useApp, useRouteRef } from '@backstage/core-plugin-api';\n\nimport {\n Content,\n ContentHeader,\n DocsIcon,\n Header,\n Page,\n SupportButton,\n} from '@backstage/core-components';\nimport {\n EntityKindPicker,\n EntityListProvider,\n EntitySearchBar,\n EntityTagPicker,\n CatalogFilterLayout,\n UserListPicker,\n EntityOwnerPicker,\n} from '@backstage/plugin-catalog-react';\nimport {\n ScaffolderPageContextMenu,\n TemplateCategoryPicker,\n TemplateGroups,\n} from '@backstage/plugin-scaffolder-react/alpha';\n\nimport { RegisterExistingButton } from './RegisterExistingButton';\nimport {\n actionsRouteRef,\n editRouteRef,\n registerComponentRouteRef,\n scaffolderListTaskRouteRef,\n selectedTemplateRouteRef,\n templatingExtensionsRouteRef,\n viewTechDocRouteRef,\n} from '../../../routes';\nimport { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model';\nimport { TemplateGroupFilter } from '@backstage/plugin-scaffolder-react';\nimport {\n TranslationFunction,\n useTranslationRef,\n} from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\n\n/**\n * @alpha\n */\nexport type TemplateListPageProps = {\n TemplateCardComponent?: ComponentType<{\n template: TemplateEntityV1beta3;\n }>;\n groups?: TemplateGroupFilter[];\n templateFilter?: (entity: TemplateEntityV1beta3) => boolean;\n contextMenu?: {\n editor?: boolean;\n actions?: boolean;\n tasks?: boolean;\n templatingExtensions?: boolean;\n };\n headerOptions?: {\n pageTitleOverride?: string;\n title?: string;\n subtitle?: string;\n };\n};\n\nconst createGroupsWithOther = (\n groups: TemplateGroupFilter[],\n t: TranslationFunction<typeof scaffolderTranslationRef.T>,\n): TemplateGroupFilter[] => [\n ...groups,\n {\n title: t('templateListPage.templateGroups.otherTitle'),\n filter: e => ![...groups].some(({ filter }) => filter(e)),\n },\n];\n\n/**\n * @alpha\n */\nexport const TemplateListPage = (props: TemplateListPageProps) => {\n const registerComponentLink = useRouteRef(registerComponentRouteRef);\n const {\n TemplateCardComponent,\n groups: givenGroups = [],\n templateFilter,\n headerOptions,\n } = props;\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const actionsLink = useRouteRef(actionsRouteRef);\n const tasksLink = useRouteRef(scaffolderListTaskRouteRef);\n const viewTechDocsLink = useRouteRef(viewTechDocRouteRef);\n const templateRoute = useRouteRef(selectedTemplateRouteRef);\n const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);\n const app = useApp();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const groups = givenGroups.length\n ? createGroupsWithOther(givenGroups, t)\n : [\n {\n title: t('templateListPage.templateGroups.defaultTitle'),\n filter: () => true,\n },\n ];\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked:\n props?.contextMenu?.editor !== false\n ? () => navigate(editorLink())\n : undefined,\n onActionsClicked:\n props?.contextMenu?.actions !== false\n ? () => navigate(actionsLink())\n : undefined,\n onTasksClicked:\n props?.contextMenu?.tasks !== false\n ? () => navigate(tasksLink())\n : undefined,\n onTemplatingExtensionsClicked:\n props?.contextMenu?.templatingExtensions !== false\n ? () => navigate(templatingExtensionsLink())\n : undefined,\n };\n\n const additionalLinksForEntity = useCallback(\n (template: TemplateEntityV1beta3) => {\n const { kind, namespace, name } = parseEntityRef(\n stringifyEntityRef(template),\n );\n return template.metadata.annotations?.['backstage.io/techdocs-ref'] &&\n viewTechDocsLink\n ? [\n {\n icon: app.getSystemIcon('docs') ?? DocsIcon,\n text: t(\n 'templateListPage.additionalLinksForEntity.viewTechDocsTitle',\n ),\n url: viewTechDocsLink({ kind, namespace, name }),\n },\n ]\n : [];\n },\n [app, viewTechDocsLink, t],\n );\n\n const onTemplateSelected = useCallback(\n (template: TemplateEntityV1beta3) => {\n const { namespace, name } = parseEntityRef(stringifyEntityRef(template));\n\n navigate(templateRoute({ namespace, templateName: name }));\n },\n [navigate, templateRoute],\n );\n\n return (\n <EntityListProvider>\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('templateListPage.pageTitle')}\n title={t('templateListPage.title')}\n subtitle={t('templateListPage.subtitle')}\n {...headerOptions}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ContentHeader>\n <RegisterExistingButton\n title={t(\n 'templateListPage.contentHeader.registerExistingButtonTitle',\n )}\n to={registerComponentLink && registerComponentLink()}\n />\n <SupportButton>\n {t('templateListPage.contentHeader.supportButtonTitle')}\n </SupportButton>\n </ContentHeader>\n\n <CatalogFilterLayout>\n <CatalogFilterLayout.Filters>\n <EntitySearchBar />\n <EntityKindPicker initialFilter=\"template\" hidden />\n <UserListPicker\n initialFilter=\"all\"\n availableFilters={['all', 'starred']}\n />\n <TemplateCategoryPicker />\n <EntityTagPicker />\n <EntityOwnerPicker />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <TemplateGroups\n groups={groups}\n templateFilter={templateFilter}\n TemplateCardComponent={TemplateCardComponent}\n onTemplateSelected={onTemplateSelected}\n additionalLinksForEntity={additionalLinksForEntity}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n </Content>\n </Page>\n </EntityListProvider>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TemplateListPage.esm.js","sources":["../../../../src/alpha/components/TemplateListPage/TemplateListPage.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ComponentType, useCallback } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { useApp, useRouteRef } from '@backstage/core-plugin-api';\n\nimport {\n Content,\n ContentHeader,\n DocsIcon,\n Header,\n Page,\n SupportButton,\n} from '@backstage/core-components';\nimport {\n EntityKindPicker,\n EntityListProvider,\n EntitySearchBar,\n EntityTagPicker,\n CatalogFilterLayout,\n UserListPicker,\n EntityOwnerPicker,\n} from '@backstage/plugin-catalog-react';\nimport {\n ScaffolderPageContextMenu,\n TemplateCategoryPicker,\n TemplateGroups,\n} from '@backstage/plugin-scaffolder-react/alpha';\n\nimport { RegisterExistingButton } from './RegisterExistingButton';\nimport {\n actionsRouteRef,\n editRouteRef,\n registerComponentRouteRef,\n scaffolderListTaskRouteRef,\n selectedTemplateRouteRef,\n templatingExtensionsRouteRef,\n viewTechDocRouteRef,\n} from '../../../routes';\nimport { parseEntityRef, stringifyEntityRef } from '@backstage/catalog-model';\nimport { TemplateGroupFilter } from '@backstage/plugin-scaffolder-react';\nimport {\n TranslationFunction,\n useTranslationRef,\n} from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\n\n/**\n * @alpha\n */\nexport type TemplateListPageProps = {\n TemplateCardComponent?: ComponentType<{\n template: TemplateEntityV1beta3;\n }>;\n groups?: TemplateGroupFilter[];\n templateFilter?: (entity: TemplateEntityV1beta3) => boolean;\n contextMenu?: {\n editor?: boolean;\n actions?: boolean;\n tasks?: boolean;\n templatingExtensions?: boolean;\n };\n headerOptions?: {\n pageTitleOverride?: string;\n title?: string;\n subtitle?: string;\n };\n};\n\nconst createGroupsWithOther = (\n groups: TemplateGroupFilter[],\n t: TranslationFunction<typeof scaffolderTranslationRef.T>,\n): TemplateGroupFilter[] => [\n ...groups,\n {\n title: t('templateListPage.templateGroups.otherTitle'),\n filter: e => ![...groups].some(({ filter }) => filter(e)),\n },\n];\n\n/**\n * @alpha\n */\nexport const TemplateListPage = (props: TemplateListPageProps) => {\n const registerComponentLink = useRouteRef(registerComponentRouteRef);\n const {\n TemplateCardComponent,\n groups: givenGroups = [],\n templateFilter,\n headerOptions,\n } = props;\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const actionsLink = useRouteRef(actionsRouteRef);\n const tasksLink = useRouteRef(scaffolderListTaskRouteRef);\n const viewTechDocsLink = useRouteRef(viewTechDocRouteRef);\n const templateRoute = useRouteRef(selectedTemplateRouteRef);\n const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);\n const app = useApp();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const groups = givenGroups.length\n ? createGroupsWithOther(givenGroups, t)\n : [\n {\n title: t('templateListPage.templateGroups.defaultTitle'),\n filter: () => true,\n },\n ];\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked:\n props?.contextMenu?.editor !== false\n ? () => navigate(editorLink())\n : undefined,\n onActionsClicked:\n props?.contextMenu?.actions !== false\n ? () => navigate(actionsLink())\n : undefined,\n onTasksClicked:\n props?.contextMenu?.tasks !== false\n ? () => navigate(tasksLink())\n : undefined,\n onTemplatingExtensionsClicked:\n props?.contextMenu?.templatingExtensions !== false\n ? () => navigate(templatingExtensionsLink())\n : undefined,\n };\n\n const additionalLinksForEntity = useCallback(\n (template: TemplateEntityV1beta3) => {\n const { kind, namespace, name } = parseEntityRef(\n stringifyEntityRef(template),\n );\n return template.metadata.annotations?.['backstage.io/techdocs-ref'] &&\n viewTechDocsLink\n ? [\n {\n icon: app.getSystemIcon('docs') ?? DocsIcon,\n text: t(\n 'templateListPage.additionalLinksForEntity.viewTechDocsTitle',\n ),\n url: viewTechDocsLink({ kind, namespace, name }),\n },\n ]\n : [];\n },\n [app, viewTechDocsLink, t],\n );\n\n const onTemplateSelected = useCallback(\n (template: TemplateEntityV1beta3) => {\n const { namespace, name } = parseEntityRef(stringifyEntityRef(template));\n\n navigate(templateRoute({ namespace, templateName: name }));\n },\n [navigate, templateRoute],\n );\n\n return (\n <EntityListProvider>\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('templateListPage.pageTitle')}\n title={t('templateListPage.title')}\n subtitle={t('templateListPage.subtitle')}\n {...headerOptions}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ContentHeader>\n <RegisterExistingButton\n title={t(\n 'templateListPage.contentHeader.registerExistingButtonTitle',\n )}\n to={registerComponentLink && registerComponentLink()}\n />\n <SupportButton>\n {t('templateListPage.contentHeader.supportButtonTitle')}\n </SupportButton>\n </ContentHeader>\n\n <CatalogFilterLayout>\n <CatalogFilterLayout.Filters>\n <EntitySearchBar />\n <EntityKindPicker initialFilter=\"template\" hidden />\n <UserListPicker\n initialFilter=\"all\"\n availableFilters={['all', 'starred']}\n />\n <TemplateCategoryPicker />\n <EntityTagPicker />\n <EntityOwnerPicker />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <TemplateGroups\n groups={groups}\n templateFilter={templateFilter}\n TemplateCardComponent={TemplateCardComponent}\n onTemplateSelected={onTemplateSelected}\n additionalLinksForEntity={additionalLinksForEntity}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n </Content>\n </Page>\n </EntityListProvider>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateWizardPage.esm.js","sources":["../../../../src/alpha/components/TemplateWizardPage/TemplateWizardPage.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ComponentType, useCallback, useState } from 'react';\nimport { Navigate, useNavigate } from 'react-router-dom';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n stringifyEntityRef,\n ANNOTATION_EDIT_URL,\n} from '@backstage/catalog-model';\nimport {\n AnalyticsContext,\n useApi,\n useRouteRef,\n useRouteRefParams,\n} from '@backstage/core-plugin-api';\nimport {\n scaffolderApiRef,\n useTemplateSecrets,\n type LayoutOptions,\n FormProps,\n FieldExtensionOptions,\n ReviewStepProps,\n} from '@backstage/plugin-scaffolder-react';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\n\nimport {\n Workflow,\n useTemplateParameterSchema,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport { JsonValue } from '@backstage/types';\nimport { Header, Page, Progress } from '@backstage/core-components';\n\nimport {\n rootRouteRef,\n scaffolderTaskRouteRef,\n selectedTemplateRouteRef,\n} from '../../../routes';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\n\nimport { TemplateWizardPageContextMenu } from './TemplateWizardPageContextMenu';\nimport { useFormDecorators } from '../../hooks';\n\n/**\n * @alpha\n */\nexport type TemplateWizardPageProps = {\n customFieldExtensions: FieldExtensionOptions<any, any>[];\n components?: {\n ReviewStepComponent?: ComponentType<ReviewStepProps>;\n };\n layouts?: LayoutOptions[];\n formProps?: FormProps;\n headerOptions?: {\n pageTitleOverride?: string;\n title?: string;\n subtitle?: string;\n };\n};\n\nexport const TemplateWizardPage = (props: TemplateWizardPageProps) => {\n const rootRef = useRouteRef(rootRouteRef);\n const taskRoute = useRouteRef(scaffolderTaskRouteRef);\n const { secrets: contextSecrets } = useTemplateSecrets();\n const scaffolderApi = useApi(scaffolderApiRef);\n const catalogApi = useApi(catalogApiRef);\n const [isCreating, setIsCreating] = useState(false);\n const navigate = useNavigate();\n const { templateName, namespace } = useRouteRefParams(\n selectedTemplateRouteRef,\n );\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const templateRef = stringifyEntityRef({\n kind: 'Template',\n namespace,\n name: templateName,\n });\n\n const { manifest } = useTemplateParameterSchema(templateRef);\n const decorators = useFormDecorators();\n\n const { value: editUrl } = useAsync(async () => {\n const data = await catalogApi.getEntityByRef(templateRef);\n return data?.metadata.annotations?.[ANNOTATION_EDIT_URL];\n }, [templateRef, catalogApi]);\n\n const onCreate = useCallback(\n async (initialValues: Record<string, JsonValue>) => {\n if (isCreating) {\n return;\n }\n\n setIsCreating(true);\n\n const { formState: values, secrets } = await decorators.run({\n formState: initialValues,\n secrets: contextSecrets,\n manifest,\n });\n\n const { taskId } = await scaffolderApi.scaffold({\n templateRef,\n values,\n secrets,\n });\n\n navigate(taskRoute({ taskId }));\n },\n [\n contextSecrets,\n decorators,\n isCreating,\n manifest,\n navigate,\n scaffolderApi,\n taskRoute,\n templateRef,\n ],\n );\n\n const onError = useCallback(() => <Navigate to={rootRef()} />, [rootRef]);\n\n return (\n <AnalyticsContext attributes={{ entityRef: templateRef }}>\n <Page themeId=\"website\">\n <Header\n pageTitleOverride={t('templateWizardPage.pageTitle')}\n title={t('templateWizardPage.title')}\n subtitle={t('templateWizardPage.subtitle')}\n {...props.headerOptions}\n >\n <TemplateWizardPageContextMenu editUrl={editUrl} />\n </Header>\n {isCreating && <Progress />}\n <Workflow\n namespace={namespace}\n templateName={templateName}\n onCreate={onCreate}\n components={props.components}\n onError={onError}\n extensions={props.customFieldExtensions}\n formProps={props.formProps}\n layouts={props.layouts}\n />\n </Page>\n </AnalyticsContext>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TemplateWizardPage.esm.js","sources":["../../../../src/alpha/components/TemplateWizardPage/TemplateWizardPage.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ComponentType, useCallback, useState } from 'react';\nimport { Navigate, useNavigate } from 'react-router-dom';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n stringifyEntityRef,\n ANNOTATION_EDIT_URL,\n} from '@backstage/catalog-model';\nimport {\n AnalyticsContext,\n useApi,\n useRouteRef,\n useRouteRefParams,\n} from '@backstage/core-plugin-api';\nimport {\n scaffolderApiRef,\n useTemplateSecrets,\n type LayoutOptions,\n FormProps,\n FieldExtensionOptions,\n ReviewStepProps,\n} from '@backstage/plugin-scaffolder-react';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\n\nimport {\n Workflow,\n useTemplateParameterSchema,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport { JsonValue } from '@backstage/types';\nimport { Header, Page, Progress } from '@backstage/core-components';\n\nimport {\n rootRouteRef,\n scaffolderTaskRouteRef,\n selectedTemplateRouteRef,\n} from '../../../routes';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\n\nimport { TemplateWizardPageContextMenu } from './TemplateWizardPageContextMenu';\nimport { useFormDecorators } from '../../hooks';\n\n/**\n * @alpha\n */\nexport type TemplateWizardPageProps = {\n customFieldExtensions: FieldExtensionOptions<any, any>[];\n components?: {\n ReviewStepComponent?: ComponentType<ReviewStepProps>;\n };\n layouts?: LayoutOptions[];\n formProps?: FormProps;\n headerOptions?: {\n pageTitleOverride?: string;\n title?: string;\n subtitle?: string;\n };\n};\n\nexport const TemplateWizardPage = (props: TemplateWizardPageProps) => {\n const rootRef = useRouteRef(rootRouteRef);\n const taskRoute = useRouteRef(scaffolderTaskRouteRef);\n const { secrets: contextSecrets } = useTemplateSecrets();\n const scaffolderApi = useApi(scaffolderApiRef);\n const catalogApi = useApi(catalogApiRef);\n const [isCreating, setIsCreating] = useState(false);\n const navigate = useNavigate();\n const { templateName, namespace } = useRouteRefParams(\n selectedTemplateRouteRef,\n );\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const templateRef = stringifyEntityRef({\n kind: 'Template',\n namespace,\n name: templateName,\n });\n\n const { manifest } = useTemplateParameterSchema(templateRef);\n const decorators = useFormDecorators();\n\n const { value: editUrl } = useAsync(async () => {\n const data = await catalogApi.getEntityByRef(templateRef);\n return data?.metadata.annotations?.[ANNOTATION_EDIT_URL];\n }, [templateRef, catalogApi]);\n\n const onCreate = useCallback(\n async (initialValues: Record<string, JsonValue>) => {\n if (isCreating) {\n return;\n }\n\n setIsCreating(true);\n\n const { formState: values, secrets } = await decorators.run({\n formState: initialValues,\n secrets: contextSecrets,\n manifest,\n });\n\n const { taskId } = await scaffolderApi.scaffold({\n templateRef,\n values,\n secrets,\n });\n\n navigate(taskRoute({ taskId }));\n },\n [\n contextSecrets,\n decorators,\n isCreating,\n manifest,\n navigate,\n scaffolderApi,\n taskRoute,\n templateRef,\n ],\n );\n\n const onError = useCallback(() => <Navigate to={rootRef()} />, [rootRef]);\n\n return (\n <AnalyticsContext attributes={{ entityRef: templateRef }}>\n <Page themeId=\"website\">\n <Header\n pageTitleOverride={t('templateWizardPage.pageTitle')}\n title={t('templateWizardPage.title')}\n subtitle={t('templateWizardPage.subtitle')}\n {...props.headerOptions}\n >\n <TemplateWizardPageContextMenu editUrl={editUrl} />\n </Header>\n {isCreating && <Progress />}\n <Workflow\n namespace={namespace}\n templateName={templateName}\n onCreate={onCreate}\n components={props.components}\n onError={onError}\n extensions={props.customFieldExtensions}\n formProps={props.formProps}\n layouts={props.layouts}\n />\n </Page>\n </AnalyticsContext>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TemplateWizardPageContextMenu.esm.js","sources":["../../../../src/alpha/components/TemplateWizardPage/TemplateWizardPageContextMenu.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport IconButton from '@material-ui/core/IconButton';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport MenuList from '@material-ui/core/MenuList';\nimport Popover from '@material-ui/core/Popover';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Edit from '@material-ui/icons/Edit';\nimport MoreVert from '@material-ui/icons/MoreVert';\nimport { SyntheticEvent, useState } from 'react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { Link } from '@backstage/core-components';\n\nconst useStyles = makeStyles(theme => ({\n button: {\n color: theme.page.fontColor,\n },\n}));\n\nexport type TemplateWizardPageContextMenuProps = {\n editUrl?: string;\n};\n\nexport function TemplateWizardPageContextMenu(\n props: TemplateWizardPageContextMenuProps,\n) {\n const { editUrl } = props;\n const classes = useStyles();\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement>();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n if (!editUrl) {\n return null;\n }\n\n const onOpen = (event: SyntheticEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const onClose = () => {\n setAnchorEl(undefined);\n };\n\n return (\n <>\n <IconButton\n id=\"long-menu\"\n aria-label=\"more\"\n aria-controls=\"long-menu\"\n aria-expanded={!!anchorEl}\n aria-haspopup=\"true\"\n role=\"button\"\n onClick={onOpen}\n data-testid=\"menu-button\"\n color=\"inherit\"\n className={classes.button}\n >\n <MoreVert />\n </IconButton>\n <Popover\n aria-labelledby=\"long-menu\"\n open={Boolean(anchorEl)}\n onClose={onClose}\n anchorEl={anchorEl}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n <MenuList>\n <MenuItem component={Link} to={editUrl}>\n <ListItemIcon>\n <Edit fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText\n primary={t(\n 'templateWizardPage.pageContextMenu.editConfigurationTitle',\n )}\n />\n </MenuItem>\n </MenuList>\n </Popover>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AA8BA,MAAM,SAAA,GAAY,WAAW,CAAU,KAAA,MAAA;AAAA,EACrC,MAAQ,EAAA;AAAA,IACN,KAAA,EAAO,MAAM,IAAK,CAAA;AAAA;AAEtB,CAAE,CAAA,CAAA;AAMK,SAAS,8BACd,KACA,EAAA;AACA,EAAM,MAAA,EAAE,SAAY,GAAA,KAAA;AACpB,EAAA,MAAM,UAAU,SAAU,EAAA;AAC1B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAA4B,EAAA;AAC5D,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAO,OAAA,IAAA;AAAA;AAGT,EAAM,MAAA,MAAA,GAAS,CAAC,KAA6C,KAAA;AAC3D,IAAA,WAAA,CAAY,MAAM,aAAa,CAAA;AAAA,GACjC;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,WAAA,CAAY,KAAS,CAAA,CAAA;AAAA,GACvB;AAEA,EAAA,uBAEI,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,EAAG,EAAA,WAAA;AAAA,QACH,YAAW,EAAA,MAAA;AAAA,QACX,eAAc,EAAA,WAAA;AAAA,QACd,eAAA,EAAe,CAAC,CAAC,QAAA;AAAA,QACjB,eAAc,EAAA,MAAA;AAAA,QACd,IAAK,EAAA,QAAA;AAAA,QACL,OAAS,EAAA,MAAA;AAAA,QACT,aAAY,EAAA,aAAA;AAAA,QACZ,KAAM,EAAA,SAAA;AAAA,QACN,WAAW,OAAQ,CAAA,MAAA;AAAA,QAEnB,8BAAC,QAAS,EAAA,EAAA;AAAA;AAAA,KACZ;AAAA,oBACA,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,iBAAgB,EAAA,WAAA;AAAA,QAChB,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAAA,QACtB,OAAA;AAAA,QACA,QAAA;AAAA,QACA,YAAc,EAAA,EAAE,QAAU,EAAA,QAAA,EAAU,YAAY,OAAQ,EAAA;AAAA,QACxD,eAAiB,EAAA,EAAE,QAAU,EAAA,KAAA,EAAO,YAAY,OAAQ,EAAA;AAAA,QAExD,8BAAC,QACC,EAAA,EAAA,QAAA,kBAAA,IAAA,CAAC,YAAS,SAAW,EAAA,IAAA,EAAM,IAAI,OAC7B,EAAA,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YACC,EAAA,EAAA,QAAA,kBAAA,GAAA,CAAC,IAAK,EAAA,EAAA,QAAA,EAAS,SAAQ,CACzB,EAAA,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAS,EAAA,CAAA;AAAA,gBACP;AAAA;AACF;AAAA;AACF,SAAA,EACF,CACF,EAAA;AAAA;AAAA;AACF,GACF,EAAA,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"TemplateWizardPageContextMenu.esm.js","sources":["../../../../src/alpha/components/TemplateWizardPage/TemplateWizardPageContextMenu.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport IconButton from '@material-ui/core/IconButton';\nimport ListItemIcon from '@material-ui/core/ListItemIcon';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport MenuItem from '@material-ui/core/MenuItem';\nimport MenuList from '@material-ui/core/MenuList';\nimport Popover from '@material-ui/core/Popover';\nimport { makeStyles } from '@material-ui/core/styles';\nimport Edit from '@material-ui/icons/Edit';\nimport MoreVert from '@material-ui/icons/MoreVert';\nimport { SyntheticEvent, useState } from 'react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { Link } from '@backstage/core-components';\n\nconst useStyles = makeStyles(theme => ({\n button: {\n color: theme.page.fontColor,\n },\n}));\n\nexport type TemplateWizardPageContextMenuProps = {\n editUrl?: string;\n};\n\nexport function TemplateWizardPageContextMenu(\n props: TemplateWizardPageContextMenuProps,\n) {\n const { editUrl } = props;\n const classes = useStyles();\n const [anchorEl, setAnchorEl] = useState<HTMLButtonElement>();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n if (!editUrl) {\n return null;\n }\n\n const onOpen = (event: SyntheticEvent<HTMLButtonElement>) => {\n setAnchorEl(event.currentTarget);\n };\n\n const onClose = () => {\n setAnchorEl(undefined);\n };\n\n return (\n <>\n <IconButton\n id=\"long-menu\"\n aria-label=\"more\"\n aria-controls=\"long-menu\"\n aria-expanded={!!anchorEl}\n aria-haspopup=\"true\"\n role=\"button\"\n onClick={onOpen}\n data-testid=\"menu-button\"\n color=\"inherit\"\n className={classes.button}\n >\n <MoreVert />\n </IconButton>\n <Popover\n aria-labelledby=\"long-menu\"\n open={Boolean(anchorEl)}\n onClose={onClose}\n anchorEl={anchorEl}\n anchorOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n transformOrigin={{ vertical: 'top', horizontal: 'right' }}\n >\n <MenuList>\n <MenuItem component={Link} to={editUrl}>\n <ListItemIcon>\n <Edit fontSize=\"small\" />\n </ListItemIcon>\n <ListItemText\n primary={t(\n 'templateWizardPage.pageContextMenu.editConfigurationTitle',\n )}\n />\n </MenuItem>\n </MenuList>\n </Popover>\n </>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AA8BA,MAAM,SAAA,GAAY,WAAW,CAAA,KAAA,MAAU;AAAA,EACrC,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,MAAM,IAAA,CAAK;AAAA;AAEtB,CAAA,CAAE,CAAA;AAMK,SAAS,8BACd,KAAA,EACA;AACA,EAAA,MAAM,EAAE,SAAQ,GAAI,KAAA;AACpB,EAAA,MAAM,UAAU,SAAA,EAAU;AAC1B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAAA,EAA4B;AAC5D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,CAAC,KAAA,KAA6C;AAC3D,IAAA,WAAA,CAAY,MAAM,aAAa,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,WAAA,CAAY,MAAS,CAAA;AAAA,EACvB,CAAA;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAG,WAAA;AAAA,QACH,YAAA,EAAW,MAAA;AAAA,QACX,eAAA,EAAc,WAAA;AAAA,QACd,eAAA,EAAe,CAAC,CAAC,QAAA;AAAA,QACjB,eAAA,EAAc,MAAA;AAAA,QACd,IAAA,EAAK,QAAA;AAAA,QACL,OAAA,EAAS,MAAA;AAAA,QACT,aAAA,EAAY,aAAA;AAAA,QACZ,KAAA,EAAM,SAAA;AAAA,QACN,WAAW,OAAA,CAAQ,MAAA;AAAA,QAEnB,8BAAC,QAAA,EAAA,EAAS;AAAA;AAAA,KACZ;AAAA,oBACA,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,iBAAA,EAAgB,WAAA;AAAA,QAChB,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAAA,QACtB,OAAA;AAAA,QACA,QAAA;AAAA,QACA,YAAA,EAAc,EAAE,QAAA,EAAU,QAAA,EAAU,YAAY,OAAA,EAAQ;AAAA,QACxD,eAAA,EAAiB,EAAE,QAAA,EAAU,KAAA,EAAO,YAAY,OAAA,EAAQ;AAAA,QAExD,8BAAC,QAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,YAAS,SAAA,EAAW,IAAA,EAAM,IAAI,OAAA,EAC7B,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,YAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,QAAA,EAAS,SAAQ,CAAA,EACzB,CAAA;AAAA,0BACA,GAAA;AAAA,YAAC,YAAA;AAAA,YAAA;AAAA,cACC,OAAA,EAAS,CAAA;AAAA,gBACP;AAAA;AACF;AAAA;AACF,SAAA,EACF,CAAA,EACF;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { convertLegacyRouteRef, compatWrapper } from '@backstage/core-compat-api';
3
- import { PageBlueprint, createExtensionInput, NavItemBlueprint, ApiBlueprint, discoveryApiRef, fetchApiRef, identityApiRef } from '@backstage/frontend-plugin-api';
3
+ import { PageBlueprint, createExtensionInput, NavItemBlueprint, ApiBlueprint, identityApiRef, fetchApiRef, discoveryApiRef } from '@backstage/frontend-plugin-api';
4
4
  import { rootRouteRef } from '../routes.esm.js';
5
5
  import CreateComponentIcon from '@material-ui/icons/AddCircleOutline';
6
6
  import { FormFieldBlueprint } from '@backstage/plugin-scaffolder-react/alpha';
@@ -1 +1 @@
1
- {"version":3,"file":"extensions.esm.js","sources":["../../src/alpha/extensions.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n compatWrapper,\n convertLegacyRouteRef,\n} from '@backstage/core-compat-api';\nimport {\n NavItemBlueprint,\n PageBlueprint,\n ApiBlueprint,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n createExtensionInput,\n} from '@backstage/frontend-plugin-api';\nimport { rootRouteRef } from '../routes';\nimport CreateComponentIcon from '@material-ui/icons/AddCircleOutline';\nimport { FormFieldBlueprint } from '@backstage/plugin-scaffolder-react/alpha';\nimport { scmIntegrationsApiRef } from '@backstage/integration-react';\nimport { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport { ScaffolderClient } from '../api';\n\nexport const scaffolderPage = PageBlueprint.makeWithOverrides({\n inputs: {\n formFields: createExtensionInput([\n FormFieldBlueprint.dataRefs.formFieldLoader,\n ]),\n },\n factory(originalFactory, { inputs }) {\n const formFieldLoaders = inputs.formFields.map(i =>\n i.get(FormFieldBlueprint.dataRefs.formFieldLoader),\n );\n return originalFactory({\n routeRef: convertLegacyRouteRef(rootRouteRef),\n path: '/create',\n loader: () =>\n import('../components/Router/Router').then(m =>\n compatWrapper(\n <m.InternalRouter formFieldLoaders={formFieldLoaders} />,\n ),\n ),\n });\n },\n});\n\nexport const scaffolderNavItem = NavItemBlueprint.make({\n params: {\n routeRef: convertLegacyRouteRef(rootRouteRef),\n title: 'Create...',\n icon: CreateComponentIcon,\n },\n});\n\nexport const repoUrlPickerFormField = FormFieldBlueprint.make({\n name: 'repo-url-picker',\n params: {\n field: () => import('./fields/RepoUrlPicker').then(m => m.RepoUrlPicker),\n },\n});\n\nexport const scaffolderApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: scaffolderApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n scmIntegrationsApi: scmIntegrationsApiRef,\n fetchApi: fetchApiRef,\n identityApi: identityApiRef,\n },\n factory: ({ discoveryApi, scmIntegrationsApi, fetchApi, identityApi }) =>\n new ScaffolderClient({\n discoveryApi,\n scmIntegrationsApi,\n fetchApi,\n identityApi,\n }),\n }),\n});\n"],"names":[],"mappings":";;;;;;;;;;AAoCa,MAAA,cAAA,GAAiB,cAAc,iBAAkB,CAAA;AAAA,EAC5D,MAAQ,EAAA;AAAA,IACN,YAAY,oBAAqB,CAAA;AAAA,MAC/B,mBAAmB,QAAS,CAAA;AAAA,KAC7B;AAAA,GACH;AAAA,EACA,OAAQ,CAAA,eAAA,EAAiB,EAAE,MAAA,EAAU,EAAA;AACnC,IAAM,MAAA,gBAAA,GAAmB,OAAO,UAAW,CAAA,GAAA;AAAA,MAAI,CAC7C,CAAA,KAAA,CAAA,CAAE,GAAI,CAAA,kBAAA,CAAmB,SAAS,eAAe;AAAA,KACnD;AACA,IAAA,OAAO,eAAgB,CAAA;AAAA,MACrB,QAAA,EAAU,sBAAsB,YAAY,CAAA;AAAA,MAC5C,IAAM,EAAA,SAAA;AAAA,MACN,MAAQ,EAAA,MACN,OAAO,oCAA6B,CAAE,CAAA,IAAA;AAAA,QAAK,CACzC,CAAA,KAAA,aAAA;AAAA,0BACG,GAAA,CAAA,CAAA,CAAE,cAAF,EAAA,EAAiB,gBAAoC,EAAA;AAAA;AACxD;AACF,KACH,CAAA;AAAA;AAEL,CAAC;AAEY,MAAA,iBAAA,GAAoB,iBAAiB,IAAK,CAAA;AAAA,EACrD,MAAQ,EAAA;AAAA,IACN,QAAA,EAAU,sBAAsB,YAAY,CAAA;AAAA,IAC5C,KAAO,EAAA,WAAA;AAAA,IACP,IAAM,EAAA;AAAA;AAEV,CAAC;AAEY,MAAA,sBAAA,GAAyB,mBAAmB,IAAK,CAAA;AAAA,EAC5D,IAAM,EAAA,iBAAA;AAAA,EACN,MAAQ,EAAA;AAAA,IACN,KAAA,EAAO,MAAM,OAAO,+BAAwB,EAAE,IAAK,CAAA,CAAA,CAAA,KAAK,EAAE,aAAa;AAAA;AAE3E,CAAC;AAEY,MAAA,aAAA,GAAgB,aAAa,IAAK,CAAA;AAAA,EAC7C,MAAA,EAAQ,kBACN,YAAa,CAAA;AAAA,IACX,GAAK,EAAA,gBAAA;AAAA,IACL,IAAM,EAAA;AAAA,MACJ,YAAc,EAAA,eAAA;AAAA,MACd,kBAAoB,EAAA,qBAAA;AAAA,MACpB,QAAU,EAAA,WAAA;AAAA,MACV,WAAa,EAAA;AAAA,KACf;AAAA,IACA,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,oBAAoB,QAAU,EAAA,WAAA,EACtD,KAAA,IAAI,gBAAiB,CAAA;AAAA,MACnB,YAAA;AAAA,MACA,kBAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACD;AAAA,GACJ;AACL,CAAC;;;;"}
1
+ {"version":3,"file":"extensions.esm.js","sources":["../../src/alpha/extensions.tsx"],"sourcesContent":["/*\n * Copyright 2023 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n compatWrapper,\n convertLegacyRouteRef,\n} from '@backstage/core-compat-api';\nimport {\n NavItemBlueprint,\n PageBlueprint,\n ApiBlueprint,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n createExtensionInput,\n} from '@backstage/frontend-plugin-api';\nimport { rootRouteRef } from '../routes';\nimport CreateComponentIcon from '@material-ui/icons/AddCircleOutline';\nimport { FormFieldBlueprint } from '@backstage/plugin-scaffolder-react/alpha';\nimport { scmIntegrationsApiRef } from '@backstage/integration-react';\nimport { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport { ScaffolderClient } from '../api';\n\nexport const scaffolderPage = PageBlueprint.makeWithOverrides({\n inputs: {\n formFields: createExtensionInput([\n FormFieldBlueprint.dataRefs.formFieldLoader,\n ]),\n },\n factory(originalFactory, { inputs }) {\n const formFieldLoaders = inputs.formFields.map(i =>\n i.get(FormFieldBlueprint.dataRefs.formFieldLoader),\n );\n return originalFactory({\n routeRef: convertLegacyRouteRef(rootRouteRef),\n path: '/create',\n loader: () =>\n import('../components/Router/Router').then(m =>\n compatWrapper(\n <m.InternalRouter formFieldLoaders={formFieldLoaders} />,\n ),\n ),\n });\n },\n});\n\nexport const scaffolderNavItem = NavItemBlueprint.make({\n params: {\n routeRef: convertLegacyRouteRef(rootRouteRef),\n title: 'Create...',\n icon: CreateComponentIcon,\n },\n});\n\nexport const repoUrlPickerFormField = FormFieldBlueprint.make({\n name: 'repo-url-picker',\n params: {\n field: () => import('./fields/RepoUrlPicker').then(m => m.RepoUrlPicker),\n },\n});\n\nexport const scaffolderApi = ApiBlueprint.make({\n params: defineParams =>\n defineParams({\n api: scaffolderApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n scmIntegrationsApi: scmIntegrationsApiRef,\n fetchApi: fetchApiRef,\n identityApi: identityApiRef,\n },\n factory: ({ discoveryApi, scmIntegrationsApi, fetchApi, identityApi }) =>\n new ScaffolderClient({\n discoveryApi,\n scmIntegrationsApi,\n fetchApi,\n identityApi,\n }),\n }),\n});\n"],"names":[],"mappings":";;;;;;;;;;AAoCO,MAAM,cAAA,GAAiB,cAAc,iBAAA,CAAkB;AAAA,EAC5D,MAAA,EAAQ;AAAA,IACN,YAAY,oBAAA,CAAqB;AAAA,MAC/B,mBAAmB,QAAA,CAAS;AAAA,KAC7B;AAAA,GACH;AAAA,EACA,OAAA,CAAQ,eAAA,EAAiB,EAAE,MAAA,EAAO,EAAG;AACnC,IAAA,MAAM,gBAAA,GAAmB,OAAO,UAAA,CAAW,GAAA;AAAA,MAAI,CAAA,CAAA,KAC7C,CAAA,CAAE,GAAA,CAAI,kBAAA,CAAmB,SAAS,eAAe;AAAA,KACnD;AACA,IAAA,OAAO,eAAA,CAAgB;AAAA,MACrB,QAAA,EAAU,sBAAsB,YAAY,CAAA;AAAA,MAC5C,IAAA,EAAM,SAAA;AAAA,MACN,MAAA,EAAQ,MACN,OAAO,oCAA6B,CAAA,CAAE,IAAA;AAAA,QAAK,CAAA,CAAA,KACzC,aAAA;AAAA,0BACE,GAAA,CAAC,CAAA,CAAE,cAAA,EAAF,EAAiB,gBAAA,EAAoC;AAAA;AACxD;AACF,KACH,CAAA;AAAA,EACH;AACF,CAAC;AAEM,MAAM,iBAAA,GAAoB,iBAAiB,IAAA,CAAK;AAAA,EACrD,MAAA,EAAQ;AAAA,IACN,QAAA,EAAU,sBAAsB,YAAY,CAAA;AAAA,IAC5C,KAAA,EAAO,WAAA;AAAA,IACP,IAAA,EAAM;AAAA;AAEV,CAAC;AAEM,MAAM,sBAAA,GAAyB,mBAAmB,IAAA,CAAK;AAAA,EAC5D,IAAA,EAAM,iBAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,KAAA,EAAO,MAAM,OAAO,+BAAwB,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,aAAa;AAAA;AAE3E,CAAC;AAEM,MAAM,aAAA,GAAgB,aAAa,IAAA,CAAK;AAAA,EAC7C,MAAA,EAAQ,kBACN,YAAA,CAAa;AAAA,IACX,GAAA,EAAK,gBAAA;AAAA,IACL,IAAA,EAAM;AAAA,MACJ,YAAA,EAAc,eAAA;AAAA,MACd,kBAAA,EAAoB,qBAAA;AAAA,MACpB,QAAA,EAAU,WAAA;AAAA,MACV,WAAA,EAAa;AAAA,KACf;AAAA,IACA,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,oBAAoB,QAAA,EAAU,WAAA,EAAY,KAClE,IAAI,gBAAA,CAAiB;AAAA,MACnB,YAAA;AAAA,MACA,kBAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACD;AAAA,GACJ;AACL,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"RepoUrlPicker.esm.js","sources":["../../../src/alpha/fields/RepoUrlPicker.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { createFormField } from '@backstage/plugin-scaffolder-react/alpha';\nimport { RepoUrlPicker as Component } from '../../components/fields/RepoUrlPicker/RepoUrlPicker';\nimport {\n RepoUrlPickerFieldSchema,\n repoPickerValidation,\n} from '../../components';\n\nexport const RepoUrlPicker = createFormField({\n component: Component,\n name: 'RepoUrlPicker',\n validation: repoPickerValidation,\n schema: RepoUrlPickerFieldSchema,\n});\n"],"names":["Component"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBO,MAAM,gBAAgB,eAAgB,CAAA;AAAA,EAC3C,SAAW,EAAAA,eAAA;AAAA,EACX,IAAM,EAAA,eAAA;AAAA,EACN,UAAY,EAAA,oBAAA;AAAA,EACZ,MAAQ,EAAA;AACV,CAAC;;;;"}
1
+ {"version":3,"file":"RepoUrlPicker.esm.js","sources":["../../../src/alpha/fields/RepoUrlPicker.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { createFormField } from '@backstage/plugin-scaffolder-react/alpha';\nimport { RepoUrlPicker as Component } from '../../components/fields/RepoUrlPicker/RepoUrlPicker';\nimport {\n RepoUrlPickerFieldSchema,\n repoPickerValidation,\n} from '../../components';\n\nexport const RepoUrlPicker = createFormField({\n component: Component,\n name: 'RepoUrlPicker',\n validation: repoPickerValidation,\n schema: RepoUrlPickerFieldSchema,\n});\n"],"names":["Component"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsBO,MAAM,gBAAgB,eAAA,CAAgB;AAAA,EAC3C,SAAA,EAAWA,eAAA;AAAA,EACX,IAAA,EAAM,eAAA;AAAA,EACN,UAAA,EAAY,oBAAA;AAAA,EACZ,MAAA,EAAQ;AACV,CAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"useFormDecorators.esm.js","sources":["../../../src/alpha/hooks/useFormDecorators.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { errorApiRef, useApi, useApiHolder } from '@backstage/core-plugin-api';\nimport { formDecoratorsApiRef } from '../api/ref';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useCallback, useMemo } from 'react';\nimport { ScaffolderFormDecoratorContext } from '@backstage/plugin-scaffolder-react/alpha';\nimport { OpaqueFormDecorator } from '@internal/scaffolder';\nimport { TemplateParameterSchema } from '@backstage/plugin-scaffolder-react';\nimport { JsonValue } from '@backstage/types';\n\n/** @internal */\ntype BoundFieldDecorator = {\n decorator: (ctx: ScaffolderFormDecoratorContext) => Promise<void>;\n};\n\nexport const useFormDecorators = () => {\n const formDecoratorsApi = useApi(formDecoratorsApiRef);\n const errorApi = useApi(errorApiRef);\n const { value: decorators } = useAsync(\n () => formDecoratorsApi.getFormDecorators(),\n [],\n );\n const apiHolder = useApiHolder();\n\n const boundDecorators = useMemo(() => {\n const decoratorsMap = new Map<string, BoundFieldDecorator>();\n\n for (const decorator of decorators ?? []) {\n try {\n const { decorator: decoratorFn, deps } =\n OpaqueFormDecorator.toInternal(decorator);\n\n const resolvedDeps = Object.entries(deps ?? {}).map(([key, value]) => {\n const api = apiHolder.get(value);\n if (!api) {\n throw new Error(\n `Failed to resolve apiRef ${value.id} for form decorator ${decorator.id} it will be disabled`,\n );\n }\n return [key, api];\n });\n\n decoratorsMap.set(decorator.id, {\n decorator: ctx => decoratorFn(ctx, Object.fromEntries(resolvedDeps)),\n });\n } catch (ex) {\n errorApi.post(ex);\n return undefined;\n }\n }\n return decoratorsMap;\n }, [apiHolder, decorators, errorApi]);\n\n const run = useCallback(\n async (opts: {\n formState: Record<string, JsonValue>;\n secrets: Record<string, string>;\n manifest?: TemplateParameterSchema;\n }) => {\n let formState: Record<string, JsonValue> = { ...opts.formState };\n let secrets: Record<string, string> = { ...opts.secrets };\n\n const formDecorators = opts.manifest?.EXPERIMENTAL_formDecorators;\n if (formDecorators) {\n // for each of the form decorators, go and call the decorator with the context\n await Promise.all(\n formDecorators.map(async decorator => {\n const formDecorator = boundDecorators?.get(decorator.id);\n if (!formDecorator) {\n errorApi.post(\n new Error(`Failed to find form decorator ${decorator.id}`),\n );\n return;\n }\n\n await formDecorator.decorator({\n setSecrets: (\n handler: (\n oldState: Record<string, string>,\n ) => Record<string, string>,\n ) => {\n secrets = { ...handler(secrets) };\n },\n setFormState: (\n handler: (\n oldState: Record<string, JsonValue>,\n ) => Record<string, JsonValue>,\n ) => {\n formState = { ...handler(formState) };\n },\n formState,\n input: decorator.input ?? {},\n });\n }),\n );\n }\n\n return { formState, secrets };\n },\n [boundDecorators, errorApi],\n );\n\n return useMemo(\n () => ({\n run,\n }),\n [run],\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useFormDecorators.esm.js","sources":["../../../src/alpha/hooks/useFormDecorators.ts"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { errorApiRef, useApi, useApiHolder } from '@backstage/core-plugin-api';\nimport { formDecoratorsApiRef } from '../api/ref';\nimport useAsync from 'react-use/esm/useAsync';\nimport { useCallback, useMemo } from 'react';\nimport { ScaffolderFormDecoratorContext } from '@backstage/plugin-scaffolder-react/alpha';\nimport { OpaqueFormDecorator } from '@internal/scaffolder';\nimport { TemplateParameterSchema } from '@backstage/plugin-scaffolder-react';\nimport { JsonValue } from '@backstage/types';\n\n/** @internal */\ntype BoundFieldDecorator = {\n decorator: (ctx: ScaffolderFormDecoratorContext) => Promise<void>;\n};\n\nexport const useFormDecorators = () => {\n const formDecoratorsApi = useApi(formDecoratorsApiRef);\n const errorApi = useApi(errorApiRef);\n const { value: decorators } = useAsync(\n () => formDecoratorsApi.getFormDecorators(),\n [],\n );\n const apiHolder = useApiHolder();\n\n const boundDecorators = useMemo(() => {\n const decoratorsMap = new Map<string, BoundFieldDecorator>();\n\n for (const decorator of decorators ?? []) {\n try {\n const { decorator: decoratorFn, deps } =\n OpaqueFormDecorator.toInternal(decorator);\n\n const resolvedDeps = Object.entries(deps ?? {}).map(([key, value]) => {\n const api = apiHolder.get(value);\n if (!api) {\n throw new Error(\n `Failed to resolve apiRef ${value.id} for form decorator ${decorator.id} it will be disabled`,\n );\n }\n return [key, api];\n });\n\n decoratorsMap.set(decorator.id, {\n decorator: ctx => decoratorFn(ctx, Object.fromEntries(resolvedDeps)),\n });\n } catch (ex) {\n errorApi.post(ex);\n return undefined;\n }\n }\n return decoratorsMap;\n }, [apiHolder, decorators, errorApi]);\n\n const run = useCallback(\n async (opts: {\n formState: Record<string, JsonValue>;\n secrets: Record<string, string>;\n manifest?: TemplateParameterSchema;\n }) => {\n let formState: Record<string, JsonValue> = { ...opts.formState };\n let secrets: Record<string, string> = { ...opts.secrets };\n\n const formDecorators = opts.manifest?.EXPERIMENTAL_formDecorators;\n if (formDecorators) {\n // for each of the form decorators, go and call the decorator with the context\n await Promise.all(\n formDecorators.map(async decorator => {\n const formDecorator = boundDecorators?.get(decorator.id);\n if (!formDecorator) {\n errorApi.post(\n new Error(`Failed to find form decorator ${decorator.id}`),\n );\n return;\n }\n\n await formDecorator.decorator({\n setSecrets: (\n handler: (\n oldState: Record<string, string>,\n ) => Record<string, string>,\n ) => {\n secrets = { ...handler(secrets) };\n },\n setFormState: (\n handler: (\n oldState: Record<string, JsonValue>,\n ) => Record<string, JsonValue>,\n ) => {\n formState = { ...handler(formState) };\n },\n formState,\n input: decorator.input ?? {},\n });\n }),\n );\n }\n\n return { formState, secrets };\n },\n [boundDecorators, errorApi],\n );\n\n return useMemo(\n () => ({\n run,\n }),\n [run],\n );\n};\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useScaffolderTemplateIconLinkProps.esm.js","sources":["../../../src/alpha/hooks/useScaffolderTemplateIconLinkProps.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DEFAULT_NAMESPACE } from '@backstage/catalog-model';\nimport { useApp, useRouteRef } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\nimport CreateComponentIcon from '@material-ui/icons/AddCircleOutline';\nimport { taskCreatePermission } from '@backstage/plugin-scaffolder-common/alpha';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nimport { scaffolderTranslationRef } from '../../translation';\nimport { selectedTemplateRouteRef } from '../../routes';\n\n// Note: If you update this hook, please also update the \"useScaffolderTemplateIconLinkProps\" hook\n// in the \"plugins/catalog/src/components/AboutCard/AboutCard.tsx\" file\n/** @alpha */\nexport function useScaffolderTemplateIconLinkProps() {\n const app = useApp();\n const { entity } = useEntity();\n const templateRoute = useRouteRef(selectedTemplateRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const Icon = app.getSystemIcon('scaffolder') ?? CreateComponentIcon;\n const { allowed: canCreateTemplateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n return {\n label: t('aboutCard.launchTemplate'),\n icon: <Icon />,\n disabled: !templateRoute || !canCreateTemplateTask,\n href:\n templateRoute &&\n templateRoute({\n templateName: entity.metadata.name,\n namespace: entity.metadata.namespace || DEFAULT_NAMESPACE,\n }),\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;AA+BO,SAAS,kCAAqC,GAAA;AACnD,EAAA,MAAM,MAAM,MAAO,EAAA;AACnB,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAM,MAAA,aAAA,GAAgB,YAAY,wBAAwB,CAAA;AAC1D,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,IAAO,GAAA,GAAA,CAAI,aAAc,CAAA,YAAY,CAAK,IAAA,mBAAA;AAChD,EAAA,MAAM,EAAE,OAAA,EAAS,qBAAsB,EAAA,GAAI,aAAc,CAAA;AAAA,IACvD,UAAY,EAAA;AAAA,GACb,CAAA;AAED,EAAO,OAAA;AAAA,IACL,KAAA,EAAO,EAAE,0BAA0B,CAAA;AAAA,IACnC,IAAA,sBAAO,IAAK,EAAA,EAAA,CAAA;AAAA,IACZ,QAAA,EAAU,CAAC,aAAA,IAAiB,CAAC,qBAAA;AAAA,IAC7B,IAAA,EACE,iBACA,aAAc,CAAA;AAAA,MACZ,YAAA,EAAc,OAAO,QAAS,CAAA,IAAA;AAAA,MAC9B,SAAA,EAAW,MAAO,CAAA,QAAA,CAAS,SAAa,IAAA;AAAA,KACzC;AAAA,GACL;AACF;;;;"}
1
+ {"version":3,"file":"useScaffolderTemplateIconLinkProps.esm.js","sources":["../../../src/alpha/hooks/useScaffolderTemplateIconLinkProps.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DEFAULT_NAMESPACE } from '@backstage/catalog-model';\nimport { useApp, useRouteRef } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\n\nimport CreateComponentIcon from '@material-ui/icons/AddCircleOutline';\nimport { taskCreatePermission } from '@backstage/plugin-scaffolder-common/alpha';\nimport { usePermission } from '@backstage/plugin-permission-react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\n\nimport { scaffolderTranslationRef } from '../../translation';\nimport { selectedTemplateRouteRef } from '../../routes';\n\n// Note: If you update this hook, please also update the \"useScaffolderTemplateIconLinkProps\" hook\n// in the \"plugins/catalog/src/components/AboutCard/AboutCard.tsx\" file\n/** @alpha */\nexport function useScaffolderTemplateIconLinkProps() {\n const app = useApp();\n const { entity } = useEntity();\n const templateRoute = useRouteRef(selectedTemplateRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const Icon = app.getSystemIcon('scaffolder') ?? CreateComponentIcon;\n const { allowed: canCreateTemplateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n return {\n label: t('aboutCard.launchTemplate'),\n icon: <Icon />,\n disabled: !templateRoute || !canCreateTemplateTask,\n href:\n templateRoute &&\n templateRoute({\n templateName: entity.metadata.name,\n namespace: entity.metadata.namespace || DEFAULT_NAMESPACE,\n }),\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;AA+BO,SAAS,kCAAA,GAAqC;AACnD,EAAA,MAAM,MAAM,MAAA,EAAO;AACnB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,aAAA,GAAgB,YAAY,wBAAwB,CAAA;AAC1D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,IAAA,GAAO,GAAA,CAAI,aAAA,CAAc,YAAY,CAAA,IAAK,mBAAA;AAChD,EAAA,MAAM,EAAE,OAAA,EAAS,qBAAA,EAAsB,GAAI,aAAA,CAAc;AAAA,IACvD,UAAA,EAAY;AAAA,GACb,CAAA;AAED,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,EAAE,0BAA0B,CAAA;AAAA,IACnC,IAAA,sBAAO,IAAA,EAAA,EAAK,CAAA;AAAA,IACZ,QAAA,EAAU,CAAC,aAAA,IAAiB,CAAC,qBAAA;AAAA,IAC7B,IAAA,EACE,iBACA,aAAA,CAAc;AAAA,MACZ,YAAA,EAAc,OAAO,QAAA,CAAS,IAAA;AAAA,MAC9B,SAAA,EAAW,MAAA,CAAO,QAAA,CAAS,SAAA,IAAa;AAAA,KACzC;AAAA,GACL;AACF;;;;"}
@@ -1,6 +1,6 @@
1
1
  import { convertLegacyRouteRefs } from '@backstage/core-compat-api';
2
2
  import { createFrontendPlugin } from '@backstage/frontend-plugin-api';
3
- import { rootRouteRef, selectedTemplateRouteRef, scaffolderTaskRouteRef, actionsRouteRef, scaffolderListTaskRouteRef, editRouteRef, templatingExtensionsRouteRef, registerComponentRouteRef, viewTechDocRouteRef } from '../routes.esm.js';
3
+ import { viewTechDocRouteRef, registerComponentRouteRef, templatingExtensionsRouteRef, editRouteRef, scaffolderListTaskRouteRef, actionsRouteRef, scaffolderTaskRouteRef, selectedTemplateRouteRef, rootRouteRef } from '../routes.esm.js';
4
4
  import { scaffolderApi, scaffolderPage, scaffolderNavItem, repoUrlPickerFormField } from './extensions.esm.js';
5
5
  import { isTemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';
6
6
  import { formFieldsApi } from '@backstage/plugin-scaffolder-react/alpha';
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.esm.js","sources":["../../src/alpha/plugin.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { convertLegacyRouteRefs } from '@backstage/core-compat-api';\nimport { createFrontendPlugin } from '@backstage/frontend-plugin-api';\nimport {\n rootRouteRef,\n actionsRouteRef,\n editRouteRef,\n registerComponentRouteRef,\n scaffolderListTaskRouteRef,\n scaffolderTaskRouteRef,\n selectedTemplateRouteRef,\n templatingExtensionsRouteRef,\n viewTechDocRouteRef,\n} from '../routes';\nimport {\n repoUrlPickerFormField,\n scaffolderNavItem,\n scaffolderPage,\n scaffolderApi,\n} from './extensions';\nimport { isTemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { formFieldsApi } from '@backstage/plugin-scaffolder-react/alpha';\nimport { formDecoratorsApi } from './api';\nimport { EntityIconLinkBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport { useScaffolderTemplateIconLinkProps } from './hooks/useScaffolderTemplateIconLinkProps';\n\n/** @alpha */\nconst scaffolderEntityIconLink = EntityIconLinkBlueprint.make({\n name: 'launch-template',\n params: {\n filter: isTemplateEntityV1beta3,\n useProps: useScaffolderTemplateIconLinkProps,\n },\n});\n\n/** @alpha */\nexport default createFrontendPlugin({\n pluginId: 'scaffolder',\n info: { packageJson: () => import('../../package.json') },\n routes: convertLegacyRouteRefs({\n root: rootRouteRef,\n selectedTemplate: selectedTemplateRouteRef,\n ongoingTask: scaffolderTaskRouteRef,\n actions: actionsRouteRef,\n listTasks: scaffolderListTaskRouteRef,\n edit: editRouteRef,\n templatingExtensions: templatingExtensionsRouteRef,\n }),\n externalRoutes: convertLegacyRouteRefs({\n registerComponent: registerComponentRouteRef,\n viewTechDoc: viewTechDocRouteRef,\n }),\n extensions: [\n scaffolderApi,\n scaffolderPage,\n scaffolderNavItem,\n scaffolderEntityIconLink,\n formDecoratorsApi,\n formFieldsApi,\n repoUrlPickerFormField,\n ],\n});\n"],"names":[],"mappings":";;;;;;;;;;;AA0CA,MAAM,wBAAA,GAA2B,wBAAwB,IAAK,CAAA;AAAA,EAC5D,IAAM,EAAA,iBAAA;AAAA,EACN,MAAQ,EAAA;AAAA,IACN,MAAQ,EAAA,uBAAA;AAAA,IACR,QAAU,EAAA;AAAA;AAEd,CAAC,CAAA;AAGD,aAAe,oBAAqB,CAAA;AAAA,EAClC,QAAU,EAAA,YAAA;AAAA,EACV,MAAM,EAAE,WAAA,EAAa,MAAM,OAAO,2CAAoB,CAAE,EAAA;AAAA,EACxD,QAAQ,sBAAuB,CAAA;AAAA,IAC7B,IAAM,EAAA,YAAA;AAAA,IACN,gBAAkB,EAAA,wBAAA;AAAA,IAClB,WAAa,EAAA,sBAAA;AAAA,IACb,OAAS,EAAA,eAAA;AAAA,IACT,SAAW,EAAA,0BAAA;AAAA,IACX,IAAM,EAAA,YAAA;AAAA,IACN,oBAAsB,EAAA;AAAA,GACvB,CAAA;AAAA,EACD,gBAAgB,sBAAuB,CAAA;AAAA,IACrC,iBAAmB,EAAA,yBAAA;AAAA,IACnB,WAAa,EAAA;AAAA,GACd,CAAA;AAAA,EACD,UAAY,EAAA;AAAA,IACV,aAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,wBAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA;AAEJ,CAAC,CAAA;;;;"}
1
+ {"version":3,"file":"plugin.esm.js","sources":["../../src/alpha/plugin.tsx"],"sourcesContent":["/*\n * Copyright 2024 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { convertLegacyRouteRefs } from '@backstage/core-compat-api';\nimport { createFrontendPlugin } from '@backstage/frontend-plugin-api';\nimport {\n rootRouteRef,\n actionsRouteRef,\n editRouteRef,\n registerComponentRouteRef,\n scaffolderListTaskRouteRef,\n scaffolderTaskRouteRef,\n selectedTemplateRouteRef,\n templatingExtensionsRouteRef,\n viewTechDocRouteRef,\n} from '../routes';\nimport {\n repoUrlPickerFormField,\n scaffolderNavItem,\n scaffolderPage,\n scaffolderApi,\n} from './extensions';\nimport { isTemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { formFieldsApi } from '@backstage/plugin-scaffolder-react/alpha';\nimport { formDecoratorsApi } from './api';\nimport { EntityIconLinkBlueprint } from '@backstage/plugin-catalog-react/alpha';\nimport { useScaffolderTemplateIconLinkProps } from './hooks/useScaffolderTemplateIconLinkProps';\n\n/** @alpha */\nconst scaffolderEntityIconLink = EntityIconLinkBlueprint.make({\n name: 'launch-template',\n params: {\n filter: isTemplateEntityV1beta3,\n useProps: useScaffolderTemplateIconLinkProps,\n },\n});\n\n/** @alpha */\nexport default createFrontendPlugin({\n pluginId: 'scaffolder',\n info: { packageJson: () => import('../../package.json') },\n routes: convertLegacyRouteRefs({\n root: rootRouteRef,\n selectedTemplate: selectedTemplateRouteRef,\n ongoingTask: scaffolderTaskRouteRef,\n actions: actionsRouteRef,\n listTasks: scaffolderListTaskRouteRef,\n edit: editRouteRef,\n templatingExtensions: templatingExtensionsRouteRef,\n }),\n externalRoutes: convertLegacyRouteRefs({\n registerComponent: registerComponentRouteRef,\n viewTechDoc: viewTechDocRouteRef,\n }),\n extensions: [\n scaffolderApi,\n scaffolderPage,\n scaffolderNavItem,\n scaffolderEntityIconLink,\n formDecoratorsApi,\n formFieldsApi,\n repoUrlPickerFormField,\n ],\n});\n"],"names":[],"mappings":";;;;;;;;;;;AA0CA,MAAM,wBAAA,GAA2B,wBAAwB,IAAA,CAAK;AAAA,EAC5D,IAAA,EAAM,iBAAA;AAAA,EACN,MAAA,EAAQ;AAAA,IACN,MAAA,EAAQ,uBAAA;AAAA,IACR,QAAA,EAAU;AAAA;AAEd,CAAC,CAAA;AAGD,aAAe,oBAAA,CAAqB;AAAA,EAClC,QAAA,EAAU,YAAA;AAAA,EACV,MAAM,EAAE,WAAA,EAAa,MAAM,OAAO,2CAAoB,CAAA,EAAE;AAAA,EACxD,QAAQ,sBAAA,CAAuB;AAAA,IAC7B,IAAA,EAAM,YAAA;AAAA,IACN,gBAAA,EAAkB,wBAAA;AAAA,IAClB,WAAA,EAAa,sBAAA;AAAA,IACb,OAAA,EAAS,eAAA;AAAA,IACT,SAAA,EAAW,0BAAA;AAAA,IACX,IAAA,EAAM,YAAA;AAAA,IACN,oBAAA,EAAsB;AAAA,GACvB,CAAA;AAAA,EACD,gBAAgB,sBAAA,CAAuB;AAAA,IACrC,iBAAA,EAAmB,yBAAA;AAAA,IACnB,WAAA,EAAa;AAAA,GACd,CAAA;AAAA,EACD,UAAA,EAAY;AAAA,IACV,aAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,wBAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA;AAAA;AAEJ,CAAC,CAAA;;;;"}
package/dist/alpha.d.ts CHANGED
@@ -289,7 +289,7 @@ declare const formDecoratorsApi: _backstage_frontend_plugin_api.ExtensionDefinit
289
289
  }>;
290
290
 
291
291
  /** @alpha */
292
- declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{
292
+ declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin<{
293
293
  root: _backstage_frontend_plugin_api.RouteRef<undefined>;
294
294
  selectedTemplate: _backstage_frontend_plugin_api.SubRouteRef<_backstage_core_plugin_api.PathParams<"/templates/:namespace/:templateName">>;
295
295
  ongoingTask: _backstage_frontend_plugin_api.SubRouteRef<_backstage_core_plugin_api.PathParams<"/tasks/:taskId">>;
@@ -1 +1 @@
1
- {"version":3,"file":"api.esm.js","sources":["../src/api.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ScaffolderClient as _ScaffolderClient } from '@backstage/plugin-scaffolder-common';\n\n/**\n * An API to interact with the scaffolder backend.\n *\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-common#ScaffolderClient} instead as this has now been moved.\n */\nexport class ScaffolderClient extends _ScaffolderClient {}\n"],"names":["_ScaffolderClient"],"mappings":";;AAwBO,MAAM,yBAAyBA,kBAAkB,CAAA;AAAC;;;;"}
1
+ {"version":3,"file":"api.esm.js","sources":["../src/api.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ScaffolderClient as _ScaffolderClient } from '@backstage/plugin-scaffolder-common';\n\n/**\n * An API to interact with the scaffolder backend.\n *\n * @public\n * @deprecated use import from {@link @backstage/plugin-scaffolder-common#ScaffolderClient} instead as this has now been moved.\n */\nexport class ScaffolderClient extends _ScaffolderClient {}\n"],"names":["_ScaffolderClient"],"mappings":";;AAwBO,MAAM,yBAAyBA,kBAAA,CAAkB;AAAC;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"ActionsPage.esm.js","sources":["../../../src/components/ActionsPage/ActionsPage.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useEffect, useState } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { Action, scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport LinkIcon from '@material-ui/icons/Link';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport TextField from '@material-ui/core/TextField';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport SearchIcon from '@material-ui/icons/Search';\n\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Link,\n MarkdownContent,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';\nimport { useNavigate } from 'react-router-dom';\nimport {\n editRouteRef,\n rootRouteRef,\n scaffolderListTaskRouteRef,\n templatingExtensionsRouteRef,\n} from '../../routes';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\n\nconst useStyles = makeStyles(theme => ({\n code: {\n fontFamily: 'Menlo, monospace',\n padding: theme.spacing(1),\n backgroundColor:\n theme.palette.type === 'dark'\n ? theme.palette.grey[700]\n : theme.palette.grey[300],\n display: 'inline-block',\n borderRadius: 5,\n border: `1px solid ${theme.palette.grey[500]}`,\n position: 'relative',\n },\n\n codeRequired: {\n '&::after': {\n position: 'absolute',\n content: '\"*\"',\n top: 0,\n right: theme.spacing(0.5),\n fontWeight: 'bolder',\n color: theme.palette.error.light,\n },\n },\n link: {\n paddingLeft: theme.spacing(1),\n },\n}));\n\nexport const ActionPageContent = () => {\n const api = useApi(scaffolderApiRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const classes = useStyles();\n const {\n loading,\n value = [],\n error,\n } = useAsync(async () => {\n return api.listActions();\n }, [api]);\n\n const [selectedAction, setSelectedAction] = useState<Action | null>(null);\n const expanded = useState<Expanded>({});\n\n useEffect(() => {\n if (value.length && window.location.hash) {\n document.querySelector(window.location.hash)?.scrollIntoView();\n }\n }, [value]);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title={t('actionsPage.content.emptyState.title')}\n description={t('actionsPage.content.emptyState.description')}\n />\n </>\n );\n }\n\n return (\n <>\n <Box pb={3}>\n <Autocomplete\n id=\"actions-autocomplete\"\n options={value}\n loading={loading}\n getOptionLabel={option => option.id}\n renderInput={params => (\n <TextField\n {...params}\n aria-label={t('actionsPage.content.searchFieldPlaceholder')}\n placeholder={t('actionsPage.content.searchFieldPlaceholder')}\n variant=\"outlined\"\n InputProps={{\n ...params.InputProps,\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n }}\n />\n )}\n onChange={(_event, option) => {\n setSelectedAction(option);\n }}\n fullWidth\n />\n </Box>\n {(selectedAction ? [selectedAction] : value).map(action => {\n if (action.id.startsWith('legacy:')) {\n return undefined;\n }\n const partialSchemaRenderContext: Omit<\n SchemaRenderContext,\n 'parentId'\n > = {\n classes,\n expanded,\n headings: [<Typography variant=\"h6\" component=\"h4\" />],\n };\n return (\n <Box pb={3} key={action.id}>\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n id={action.id.replaceAll(':', '-')}\n variant=\"h5\"\n component=\"h2\"\n className={classes.code}\n >\n {action.id}\n </Typography>\n <Link\n className={classes.link}\n to={`#${action.id.replaceAll(':', '-')}`}\n >\n <LinkIcon />\n </Link>\n </Box>\n {action.description && (\n <MarkdownContent content={action.description} />\n )}\n {action.schema?.input && (\n <Box pb={2}>\n <Typography variant=\"h6\" component=\"h3\">\n {t('actionsPage.action.input')}\n </Typography>\n <RenderSchema\n strategy=\"properties\"\n context={{\n parentId: `${action.id}.input`,\n ...partialSchemaRenderContext,\n }}\n schema={action?.schema?.input}\n />\n </Box>\n )}\n {action.schema?.output && (\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('actionsPage.action.output')}\n </Typography>\n <RenderSchema\n strategy=\"properties\"\n context={{\n parentId: `${action.id}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={action?.schema?.output}\n />\n </Box>\n )}\n {action.examples && (\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"h6\" component=\"h3\">\n {t('actionsPage.action.examples')}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box pb={2}>\n <ScaffolderUsageExamplesTable examples={action.examples} />\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n </Box>\n );\n })}\n </>\n );\n};\n\nexport type ActionsPageProps = {\n contextMenu?: {\n editor?: boolean;\n tasks?: boolean;\n create?: boolean;\n };\n};\n\nexport const ActionsPage = (props: ActionsPageProps) => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const tasksLink = useRouteRef(scaffolderListTaskRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked:\n props?.contextMenu?.editor !== false\n ? () => navigate(editorLink())\n : undefined,\n onActionsClicked: undefined,\n onTasksClicked:\n props?.contextMenu?.tasks !== false\n ? () => navigate(tasksLink())\n : undefined,\n onCreateClicked:\n props?.contextMenu?.create !== false\n ? () => navigate(createLink())\n : undefined,\n onTemplatingExtensionsClicked: () => navigate(templatingExtensionsLink()),\n };\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('actionsPage.pageTitle')}\n title={t('actionsPage.title')}\n subtitle={t('actionsPage.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ActionPageContent />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ActionsPage.esm.js","sources":["../../../src/components/ActionsPage/ActionsPage.tsx"],"sourcesContent":["/*\n * Copyright 2021 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useEffect, useState } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport { Action, scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport Box from '@material-ui/core/Box';\nimport Typography from '@material-ui/core/Typography';\nimport { makeStyles } from '@material-ui/core/styles';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport LinkIcon from '@material-ui/icons/Link';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport TextField from '@material-ui/core/TextField';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport SearchIcon from '@material-ui/icons/Search';\n\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Link,\n MarkdownContent,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';\nimport { useNavigate } from 'react-router-dom';\nimport {\n editRouteRef,\n rootRouteRef,\n scaffolderListTaskRouteRef,\n templatingExtensionsRouteRef,\n} from '../../routes';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\n\nconst useStyles = makeStyles(theme => ({\n code: {\n fontFamily: 'Menlo, monospace',\n padding: theme.spacing(1),\n backgroundColor:\n theme.palette.type === 'dark'\n ? theme.palette.grey[700]\n : theme.palette.grey[300],\n display: 'inline-block',\n borderRadius: 5,\n border: `1px solid ${theme.palette.grey[500]}`,\n position: 'relative',\n },\n\n codeRequired: {\n '&::after': {\n position: 'absolute',\n content: '\"*\"',\n top: 0,\n right: theme.spacing(0.5),\n fontWeight: 'bolder',\n color: theme.palette.error.light,\n },\n },\n link: {\n paddingLeft: theme.spacing(1),\n },\n}));\n\nexport const ActionPageContent = () => {\n const api = useApi(scaffolderApiRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const classes = useStyles();\n const {\n loading,\n value = [],\n error,\n } = useAsync(async () => {\n return api.listActions();\n }, [api]);\n\n const [selectedAction, setSelectedAction] = useState<Action | null>(null);\n const expanded = useState<Expanded>({});\n\n useEffect(() => {\n if (value.length && window.location.hash) {\n document.querySelector(window.location.hash)?.scrollIntoView();\n }\n }, [value]);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <>\n <ErrorPanel error={error} />\n <EmptyState\n missing=\"info\"\n title={t('actionsPage.content.emptyState.title')}\n description={t('actionsPage.content.emptyState.description')}\n />\n </>\n );\n }\n\n return (\n <>\n <Box pb={3}>\n <Autocomplete\n id=\"actions-autocomplete\"\n options={value}\n loading={loading}\n getOptionLabel={option => option.id}\n renderInput={params => (\n <TextField\n {...params}\n aria-label={t('actionsPage.content.searchFieldPlaceholder')}\n placeholder={t('actionsPage.content.searchFieldPlaceholder')}\n variant=\"outlined\"\n InputProps={{\n ...params.InputProps,\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n }}\n />\n )}\n onChange={(_event, option) => {\n setSelectedAction(option);\n }}\n fullWidth\n />\n </Box>\n {(selectedAction ? [selectedAction] : value).map(action => {\n if (action.id.startsWith('legacy:')) {\n return undefined;\n }\n const partialSchemaRenderContext: Omit<\n SchemaRenderContext,\n 'parentId'\n > = {\n classes,\n expanded,\n headings: [<Typography variant=\"h6\" component=\"h4\" />],\n };\n return (\n <Box pb={3} key={action.id}>\n <Box display=\"flex\" alignItems=\"center\">\n <Typography\n id={action.id.replaceAll(':', '-')}\n variant=\"h5\"\n component=\"h2\"\n className={classes.code}\n >\n {action.id}\n </Typography>\n <Link\n className={classes.link}\n to={`#${action.id.replaceAll(':', '-')}`}\n >\n <LinkIcon />\n </Link>\n </Box>\n {action.description && (\n <MarkdownContent content={action.description} />\n )}\n {action.schema?.input && (\n <Box pb={2}>\n <Typography variant=\"h6\" component=\"h3\">\n {t('actionsPage.action.input')}\n </Typography>\n <RenderSchema\n strategy=\"properties\"\n context={{\n parentId: `${action.id}.input`,\n ...partialSchemaRenderContext,\n }}\n schema={action?.schema?.input}\n />\n </Box>\n )}\n {action.schema?.output && (\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('actionsPage.action.output')}\n </Typography>\n <RenderSchema\n strategy=\"properties\"\n context={{\n parentId: `${action.id}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={action?.schema?.output}\n />\n </Box>\n )}\n {action.examples && (\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"h6\" component=\"h3\">\n {t('actionsPage.action.examples')}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box pb={2}>\n <ScaffolderUsageExamplesTable examples={action.examples} />\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n </Box>\n );\n })}\n </>\n );\n};\n\nexport type ActionsPageProps = {\n contextMenu?: {\n editor?: boolean;\n tasks?: boolean;\n create?: boolean;\n };\n};\n\nexport const ActionsPage = (props: ActionsPageProps) => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const tasksLink = useRouteRef(scaffolderListTaskRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const scaffolderPageContextMenuProps = {\n onEditorClicked:\n props?.contextMenu?.editor !== false\n ? () => navigate(editorLink())\n : undefined,\n onActionsClicked: undefined,\n onTasksClicked:\n props?.contextMenu?.tasks !== false\n ? () => navigate(tasksLink())\n : undefined,\n onCreateClicked:\n props?.contextMenu?.create !== false\n ? () => navigate(createLink())\n : undefined,\n onTemplatingExtensionsClicked: () => navigate(templatingExtensionsLink()),\n };\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('actionsPage.pageTitle')}\n title={t('actionsPage.title')}\n subtitle={t('actionsPage.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <ActionPageContent />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -15,9 +15,6 @@ const useStyles = makeStyles((theme) => ({
15
15
  }));
16
16
  function parseFileEntries(paths) {
17
17
  const root = {
18
- type: "directory",
19
- name: "",
20
- path: "",
21
18
  children: []
22
19
  };
23
20
  for (const path of paths.slice().sort()) {
@@ -1 +1 @@
1
- {"version":3,"file":"FileBrowser.esm.js","sources":["../../../src/components/FileBrowser/FileBrowser.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useMemo } from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport TreeView from '@material-ui/lab/TreeView';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport TreeItem from '@material-ui/lab/TreeItem';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n whiteSpace: 'nowrap',\n overflowY: 'auto',\n padding: theme.spacing(1),\n },\n}));\n\nexport type FileEntry =\n | {\n type: 'file';\n name: string;\n path: string;\n }\n | {\n type: 'directory';\n name: string;\n path: string;\n children: FileEntry[];\n };\n\nexport function parseFileEntries(paths: string[]): FileEntry[] {\n const root: FileEntry = {\n type: 'directory',\n name: '',\n path: '',\n children: [],\n };\n\n for (const path of paths.slice().sort()) {\n const parts = path.split('/');\n\n let current = root;\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === '') {\n throw new Error(`Invalid path part: ''`);\n }\n\n const entryPath = parts.slice(0, i + 1).join('/');\n\n const existing = current.children.find(child => child.name === part);\n if (existing?.type === 'file') {\n throw new Error(`Duplicate filename at '${entryPath}'`);\n } else if (existing) {\n current = existing;\n } else {\n if (i < parts.length - 1) {\n const newEntry: FileEntry = {\n type: 'directory',\n name: part,\n path: entryPath,\n children: [],\n };\n const firstFileIndex = current.children.findIndex(\n child => child.type === 'file',\n );\n current.children.splice(firstFileIndex, 0, newEntry);\n current = newEntry;\n } else {\n current.children.push({\n type: 'file',\n name: part,\n path: entryPath,\n });\n }\n }\n }\n }\n\n return root.children;\n}\n\nfunction FileTreeItem({ entry }: { entry: FileEntry }) {\n if (entry.type === 'file') {\n return <TreeItem nodeId={entry.path} label={entry.name} />;\n }\n\n return (\n <TreeItem nodeId={entry.path} label={entry.name}>\n {entry.children.map(child => (\n <FileTreeItem key={child.path} entry={child} />\n ))}\n </TreeItem>\n );\n}\n\ninterface FileBrowserProps {\n /** A list of all filepaths to show, directories are separated with a `/` */\n filePaths: string[];\n /** The currently selected file */\n selected?: string;\n /** Callback for when a file is selected */\n onSelect?(filePath: string): void;\n}\n\n/** A simple file browser that allows you to select individual files */\nexport function FileBrowser(props: FileBrowserProps) {\n const classes = useStyles();\n\n const fileTree = useMemo(\n () => parseFileEntries(props.filePaths),\n [props.filePaths],\n );\n\n return (\n <TreeView\n selected={props.selected}\n className={classes.root}\n defaultCollapseIcon={<ExpandMoreIcon />}\n defaultExpandIcon={<ChevronRightIcon />}\n onNodeSelect={(_e: unknown, nodeId: string) => {\n if (props.onSelect && props.filePaths.includes(nodeId)) {\n props.onSelect(nodeId);\n }\n }}\n >\n {fileTree.map(entry => (\n <FileTreeItem key={entry.path} entry={entry} />\n ))}\n </TreeView>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"FileBrowser.esm.js","sources":["../../../src/components/FileBrowser/FileBrowser.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useMemo } from 'react';\nimport { makeStyles } from '@material-ui/core/styles';\nimport TreeView from '@material-ui/lab/TreeView';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport ChevronRightIcon from '@material-ui/icons/ChevronRight';\nimport TreeItem from '@material-ui/lab/TreeItem';\n\nconst useStyles = makeStyles(theme => ({\n root: {\n whiteSpace: 'nowrap',\n overflowY: 'auto',\n padding: theme.spacing(1),\n },\n}));\n\nexport type FileEntry =\n | {\n type: 'file';\n name: string;\n path: string;\n }\n | {\n type: 'directory';\n name: string;\n path: string;\n children: FileEntry[];\n };\n\nexport function parseFileEntries(paths: string[]): FileEntry[] {\n const root: FileEntry = {\n type: 'directory',\n name: '',\n path: '',\n children: [],\n };\n\n for (const path of paths.slice().sort()) {\n const parts = path.split('/');\n\n let current = root;\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i];\n if (part === '') {\n throw new Error(`Invalid path part: ''`);\n }\n\n const entryPath = parts.slice(0, i + 1).join('/');\n\n const existing = current.children.find(child => child.name === part);\n if (existing?.type === 'file') {\n throw new Error(`Duplicate filename at '${entryPath}'`);\n } else if (existing) {\n current = existing;\n } else {\n if (i < parts.length - 1) {\n const newEntry: FileEntry = {\n type: 'directory',\n name: part,\n path: entryPath,\n children: [],\n };\n const firstFileIndex = current.children.findIndex(\n child => child.type === 'file',\n );\n current.children.splice(firstFileIndex, 0, newEntry);\n current = newEntry;\n } else {\n current.children.push({\n type: 'file',\n name: part,\n path: entryPath,\n });\n }\n }\n }\n }\n\n return root.children;\n}\n\nfunction FileTreeItem({ entry }: { entry: FileEntry }) {\n if (entry.type === 'file') {\n return <TreeItem nodeId={entry.path} label={entry.name} />;\n }\n\n return (\n <TreeItem nodeId={entry.path} label={entry.name}>\n {entry.children.map(child => (\n <FileTreeItem key={child.path} entry={child} />\n ))}\n </TreeItem>\n );\n}\n\ninterface FileBrowserProps {\n /** A list of all filepaths to show, directories are separated with a `/` */\n filePaths: string[];\n /** The currently selected file */\n selected?: string;\n /** Callback for when a file is selected */\n onSelect?(filePath: string): void;\n}\n\n/** A simple file browser that allows you to select individual files */\nexport function FileBrowser(props: FileBrowserProps) {\n const classes = useStyles();\n\n const fileTree = useMemo(\n () => parseFileEntries(props.filePaths),\n [props.filePaths],\n );\n\n return (\n <TreeView\n selected={props.selected}\n className={classes.root}\n defaultCollapseIcon={<ExpandMoreIcon />}\n defaultExpandIcon={<ChevronRightIcon />}\n onNodeSelect={(_e: unknown, nodeId: string) => {\n if (props.onSelect && props.filePaths.includes(nodeId)) {\n props.onSelect(nodeId);\n }\n }}\n >\n {fileTree.map(entry => (\n <FileTreeItem key={entry.path} entry={entry} />\n ))}\n </TreeView>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAuBA,MAAM,SAAA,GAAY,WAAW,CAAA,KAAA,MAAU;AAAA,EACrC,IAAA,EAAM;AAAA,IACJ,UAAA,EAAY,QAAA;AAAA,IACZ,SAAA,EAAW,MAAA;AAAA,IACX,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA;AAE5B,CAAA,CAAE,CAAA;AAeK,SAAS,iBAAiB,KAAA,EAA8B;AAC7D,EAAA,MAAM,IAAA,GAAkB;AAAA,IAItB,UAAU;AAAC,GACb;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,EAAM,CAAE,MAAK,EAAG;AACvC,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAE5B,IAAA,IAAI,OAAA,GAAU,IAAA;AACd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,IAAA,GAAO,MAAM,CAAC,CAAA;AACpB,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,MAAM,IAAI,MAAM,CAAA,qBAAA,CAAuB,CAAA;AAAA,MACzC;AAEA,MAAA,MAAM,SAAA,GAAY,MAAM,KAAA,CAAM,CAAA,EAAG,IAAI,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAEhD,MAAA,MAAM,WAAW,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,KAAA,KAAS,KAAA,CAAM,SAAS,IAAI,CAAA;AACnE,MAAA,IAAI,QAAA,EAAU,SAAS,MAAA,EAAQ;AAC7B,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,MACxD,WAAW,QAAA,EAAU;AACnB,QAAA,OAAA,GAAU,QAAA;AAAA,MACZ,CAAA,MAAO;AACL,QAAA,IAAI,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AACxB,UAAA,MAAM,QAAA,GAAsB;AAAA,YAC1B,IAAA,EAAM,WAAA;AAAA,YACN,IAAA,EAAM,IAAA;AAAA,YACN,IAAA,EAAM,SAAA;AAAA,YACN,UAAU;AAAC,WACb;AACA,UAAA,MAAM,cAAA,GAAiB,QAAQ,QAAA,CAAS,SAAA;AAAA,YACtC,CAAA,KAAA,KAAS,MAAM,IAAA,KAAS;AAAA,WAC1B;AACA,UAAA,OAAA,CAAQ,QAAA,CAAS,MAAA,CAAO,cAAA,EAAgB,CAAA,EAAG,QAAQ,CAAA;AACnD,UAAA,OAAA,GAAU,QAAA;AAAA,QACZ,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,SAAS,IAAA,CAAK;AAAA,YACpB,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,IAAA;AAAA,YACN,IAAA,EAAM;AAAA,WACP,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA,CAAK,QAAA;AACd;AAEA,SAAS,YAAA,CAAa,EAAE,KAAA,EAAM,EAAyB;AACrD,EAAA,IAAI,KAAA,CAAM,SAAS,MAAA,EAAQ;AACzB,IAAA,2BAAQ,QAAA,EAAA,EAAS,MAAA,EAAQ,MAAM,IAAA,EAAM,KAAA,EAAO,MAAM,IAAA,EAAM,CAAA;AAAA,EAC1D;AAEA,EAAA,2BACG,QAAA,EAAA,EAAS,MAAA,EAAQ,MAAM,IAAA,EAAM,KAAA,EAAO,MAAM,IAAA,EACxC,QAAA,EAAA,KAAA,CAAM,SAAS,GAAA,CAAI,CAAA,KAAA,yBACjB,YAAA,EAAA,EAA8B,KAAA,EAAO,SAAnB,KAAA,CAAM,IAAoB,CAC9C,CAAA,EACH,CAAA;AAEJ;AAYO,SAAS,YAAY,KAAA,EAAyB;AACnD,EAAA,MAAM,UAAU,SAAA,EAAU;AAE1B,EAAA,MAAM,QAAA,GAAW,OAAA;AAAA,IACf,MAAM,gBAAA,CAAiB,KAAA,CAAM,SAAS,CAAA;AAAA,IACtC,CAAC,MAAM,SAAS;AAAA,GAClB;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,WAAW,OAAA,CAAQ,IAAA;AAAA,MACnB,mBAAA,sBAAsB,cAAA,EAAA,EAAe,CAAA;AAAA,MACrC,iBAAA,sBAAoB,gBAAA,EAAA,EAAiB,CAAA;AAAA,MACrC,YAAA,EAAc,CAAC,EAAA,EAAa,MAAA,KAAmB;AAC7C,QAAA,IAAI,MAAM,QAAA,IAAY,KAAA,CAAM,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AACtD,UAAA,KAAA,CAAM,SAAS,MAAM,CAAA;AAAA,QACvB;AAAA,MACF,CAAA;AAAA,MAEC,QAAA,EAAA,QAAA,CAAS,IAAI,CAAA,KAAA,qBACZ,GAAA,CAAC,gBAA8B,KAAA,EAAA,EAAZ,KAAA,CAAM,IAAoB,CAC9C;AAAA;AAAA,GACH;AAEJ;;;;"}