@backstage/plugin-scaffolder 1.25.0 → 1.26.0-next.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 (129) hide show
  1. package/CHANGELOG.md +34 -0
  2. package/alpha/package.json +1 -1
  3. package/dist/alpha/api/FormFieldsApi.esm.js +40 -0
  4. package/dist/alpha/api/FormFieldsApi.esm.js.map +1 -0
  5. package/dist/alpha/api/ref.esm.js +8 -0
  6. package/dist/alpha/api/ref.esm.js.map +1 -0
  7. package/dist/alpha/api.esm.js +27 -0
  8. package/dist/alpha/api.esm.js.map +1 -0
  9. package/dist/{next → alpha/components}/TemplateEditorPage/CustomFieldExplorer.esm.js +1 -1
  10. package/dist/alpha/components/TemplateEditorPage/CustomFieldExplorer.esm.js.map +1 -0
  11. package/dist/alpha/components/TemplateEditorPage/CustomFieldPlaygroud.esm.js +167 -0
  12. package/dist/alpha/components/TemplateEditorPage/CustomFieldPlaygroud.esm.js.map +1 -0
  13. package/dist/alpha/components/TemplateEditorPage/CustomFieldsPage.esm.js +33 -0
  14. package/dist/alpha/components/TemplateEditorPage/CustomFieldsPage.esm.js.map +1 -0
  15. package/dist/{next → alpha/components}/TemplateEditorPage/DirectoryEditorContext.esm.js +4 -7
  16. package/dist/alpha/components/TemplateEditorPage/DirectoryEditorContext.esm.js.map +1 -0
  17. package/dist/alpha/components/TemplateEditorPage/DryRunContext.esm.js.map +1 -0
  18. package/dist/{next → alpha/components}/TemplateEditorPage/DryRunResults/DryRunResults.esm.js +1 -1
  19. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResults.esm.js.map +1 -0
  20. package/dist/{next → alpha/components}/TemplateEditorPage/DryRunResults/DryRunResultsList.esm.js +2 -2
  21. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsList.esm.js.map +1 -0
  22. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsSplitView.esm.js.map +1 -0
  23. package/dist/{next → alpha/components}/TemplateEditorPage/DryRunResults/DryRunResultsView.esm.js +2 -2
  24. package/dist/alpha/components/TemplateEditorPage/DryRunResults/DryRunResultsView.esm.js.map +1 -0
  25. package/dist/alpha/components/TemplateEditorPage/DryRunResults/IconLink.esm.js.map +1 -0
  26. package/dist/alpha/components/TemplateEditorPage/DryRunResults/TaskPageLinks.esm.js.map +1 -0
  27. package/dist/{next → alpha/components}/TemplateEditorPage/DryRunResults/TaskStatusStepper.esm.js +1 -1
  28. package/dist/alpha/components/TemplateEditorPage/DryRunResults/TaskStatusStepper.esm.js.map +1 -0
  29. package/dist/alpha/components/TemplateEditorPage/TemplateEditor.esm.js +94 -0
  30. package/dist/alpha/components/TemplateEditorPage/TemplateEditor.esm.js.map +1 -0
  31. package/dist/{next → alpha/components}/TemplateEditorPage/TemplateEditorBrowser.esm.js +36 -38
  32. package/dist/alpha/components/TemplateEditorPage/TemplateEditorBrowser.esm.js.map +1 -0
  33. package/dist/{next → alpha/components}/TemplateEditorPage/TemplateEditorForm.esm.js +12 -20
  34. package/dist/alpha/components/TemplateEditorPage/TemplateEditorForm.esm.js.map +1 -0
  35. package/dist/{next → alpha/components}/TemplateEditorPage/TemplateEditorIntro.esm.js +39 -2
  36. package/dist/alpha/components/TemplateEditorPage/TemplateEditorIntro.esm.js.map +1 -0
  37. package/dist/alpha/components/TemplateEditorPage/TemplateEditorPage.esm.js +61 -0
  38. package/dist/alpha/components/TemplateEditorPage/TemplateEditorPage.esm.js.map +1 -0
  39. package/dist/{next → alpha/components}/TemplateEditorPage/TemplateEditorTextArea.esm.js +36 -3
  40. package/dist/alpha/components/TemplateEditorPage/TemplateEditorTextArea.esm.js.map +1 -0
  41. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbar.esm.js +98 -0
  42. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbar.esm.js.map +1 -0
  43. package/dist/alpha/components/TemplateEditorPage/TemplateFormPage.esm.js +43 -0
  44. package/dist/alpha/components/TemplateEditorPage/TemplateFormPage.esm.js.map +1 -0
  45. package/dist/{next → alpha/components}/TemplateEditorPage/TemplateFormPreviewer.esm.js +77 -39
  46. package/dist/alpha/components/TemplateEditorPage/TemplateFormPreviewer.esm.js.map +1 -0
  47. package/dist/alpha/components/TemplateEditorPage/TemplatePage.esm.js +52 -0
  48. package/dist/alpha/components/TemplateEditorPage/TemplatePage.esm.js.map +1 -0
  49. package/dist/alpha/components/TemplateListPage/RegisterExistingButton.esm.js.map +1 -0
  50. package/dist/{next → alpha/components}/TemplateListPage/TemplateListPage.esm.js +2 -2
  51. package/dist/alpha/components/TemplateListPage/TemplateListPage.esm.js.map +1 -0
  52. package/dist/{next → alpha/components}/TemplateWizardPage/TemplateWizardPage.esm.js +2 -2
  53. package/dist/alpha/components/TemplateWizardPage/TemplateWizardPage.esm.js.map +1 -0
  54. package/dist/{next → alpha/components}/TemplateWizardPage/TemplateWizardPageContextMenu.esm.js +1 -1
  55. package/dist/alpha/components/TemplateWizardPage/TemplateWizardPageContextMenu.esm.js.map +1 -0
  56. package/dist/alpha/extensions.esm.js +30 -0
  57. package/dist/alpha/extensions.esm.js.map +1 -0
  58. package/dist/alpha/fields/RepoUrlPicker.esm.js +37 -0
  59. package/dist/alpha/fields/RepoUrlPicker.esm.js.map +1 -0
  60. package/dist/alpha/plugin.esm.js +32 -0
  61. package/dist/alpha/plugin.esm.js.map +1 -0
  62. package/dist/alpha.d.ts +78 -7
  63. package/dist/alpha.esm.js +1 -60
  64. package/dist/alpha.esm.js.map +1 -1
  65. package/dist/api.esm.js +14 -2
  66. package/dist/api.esm.js.map +1 -1
  67. package/dist/components/ActionsPage/ActionsPage.esm.js +30 -5
  68. package/dist/components/ActionsPage/ActionsPage.esm.js.map +1 -1
  69. package/dist/components/FileBrowser/FileBrowser.esm.js +4 -3
  70. package/dist/components/FileBrowser/FileBrowser.esm.js.map +1 -1
  71. package/dist/components/ListTasksPage/OwnerListPicker.esm.js +2 -2
  72. package/dist/components/ListTasksPage/OwnerListPicker.esm.js.map +1 -1
  73. package/dist/components/ListTasksPage/columns/CreatedAtColumn.esm.js +10 -5
  74. package/dist/components/ListTasksPage/columns/CreatedAtColumn.esm.js.map +1 -1
  75. package/dist/components/OngoingTask/ContextMenu.esm.js +15 -2
  76. package/dist/components/OngoingTask/ContextMenu.esm.js.map +1 -1
  77. package/dist/components/OngoingTask/OngoingTask.esm.js +24 -1
  78. package/dist/components/OngoingTask/OngoingTask.esm.js.map +1 -1
  79. package/dist/components/Router/Router.esm.js +35 -7
  80. package/dist/components/Router/Router.esm.js.map +1 -1
  81. package/dist/components/fields/RepoUrlPicker/RepoUrlPicker.esm.js.map +1 -1
  82. package/dist/components/fields/RepoUrlPicker/schema.esm.js +5 -6
  83. package/dist/components/fields/RepoUrlPicker/schema.esm.js.map +1 -1
  84. package/dist/components/fields/utils.esm.js +2 -1
  85. package/dist/components/fields/utils.esm.js.map +1 -1
  86. package/dist/index.d.ts +10 -8
  87. package/dist/lib/filesystem/WebFileSystemAccess.esm.js +34 -1
  88. package/dist/lib/filesystem/WebFileSystemAccess.esm.js.map +1 -1
  89. package/dist/lib/filesystem/createExampleTemplate.esm.js +76 -0
  90. package/dist/lib/filesystem/createExampleTemplate.esm.js.map +1 -0
  91. package/dist/packages/opaque-internal/src/OpaqueType.esm.js +103 -0
  92. package/dist/packages/opaque-internal/src/OpaqueType.esm.js.map +1 -0
  93. package/dist/packages/scaffolder-internal/src/wiring/InternalFormField.esm.js +6 -0
  94. package/dist/packages/scaffolder-internal/src/wiring/InternalFormField.esm.js.map +1 -0
  95. package/dist/plugin.esm.js +5 -2
  96. package/dist/plugin.esm.js.map +1 -1
  97. package/dist/routes.esm.js +16 -1
  98. package/dist/routes.esm.js.map +1 -1
  99. package/dist/translation.esm.js +20 -1
  100. package/dist/translation.esm.js.map +1 -1
  101. package/package.json +16 -14
  102. package/dist/next/TemplateEditorPage/CustomFieldExplorer.esm.js.map +0 -1
  103. package/dist/next/TemplateEditorPage/DirectoryEditorContext.esm.js.map +0 -1
  104. package/dist/next/TemplateEditorPage/DryRunContext.esm.js.map +0 -1
  105. package/dist/next/TemplateEditorPage/DryRunResults/DryRunResults.esm.js.map +0 -1
  106. package/dist/next/TemplateEditorPage/DryRunResults/DryRunResultsList.esm.js.map +0 -1
  107. package/dist/next/TemplateEditorPage/DryRunResults/DryRunResultsSplitView.esm.js.map +0 -1
  108. package/dist/next/TemplateEditorPage/DryRunResults/DryRunResultsView.esm.js.map +0 -1
  109. package/dist/next/TemplateEditorPage/DryRunResults/IconLink.esm.js.map +0 -1
  110. package/dist/next/TemplateEditorPage/DryRunResults/TaskPageLinks.esm.js.map +0 -1
  111. package/dist/next/TemplateEditorPage/DryRunResults/TaskStatusStepper.esm.js.map +0 -1
  112. package/dist/next/TemplateEditorPage/TemplateEditor.esm.js +0 -56
  113. package/dist/next/TemplateEditorPage/TemplateEditor.esm.js.map +0 -1
  114. package/dist/next/TemplateEditorPage/TemplateEditorBrowser.esm.js.map +0 -1
  115. package/dist/next/TemplateEditorPage/TemplateEditorForm.esm.js.map +0 -1
  116. package/dist/next/TemplateEditorPage/TemplateEditorIntro.esm.js.map +0 -1
  117. package/dist/next/TemplateEditorPage/TemplateEditorPage.esm.js +0 -87
  118. package/dist/next/TemplateEditorPage/TemplateEditorPage.esm.js.map +0 -1
  119. package/dist/next/TemplateEditorPage/TemplateEditorTextArea.esm.js.map +0 -1
  120. package/dist/next/TemplateEditorPage/TemplateFormPreviewer.esm.js.map +0 -1
  121. package/dist/next/TemplateListPage/RegisterExistingButton.esm.js.map +0 -1
  122. package/dist/next/TemplateListPage/TemplateListPage.esm.js.map +0 -1
  123. package/dist/next/TemplateWizardPage/TemplateWizardPage.esm.js.map +0 -1
  124. package/dist/next/TemplateWizardPage/TemplateWizardPageContextMenu.esm.js.map +0 -1
  125. /package/dist/{next → alpha/components}/TemplateEditorPage/DryRunContext.esm.js +0 -0
  126. /package/dist/{next → alpha/components}/TemplateEditorPage/DryRunResults/DryRunResultsSplitView.esm.js +0 -0
  127. /package/dist/{next → alpha/components}/TemplateEditorPage/DryRunResults/IconLink.esm.js +0 -0
  128. /package/dist/{next → alpha/components}/TemplateEditorPage/DryRunResults/TaskPageLinks.esm.js +0 -0
  129. /package/dist/{next → alpha/components}/TemplateListPage/RegisterExistingButton.esm.js +0 -0
@@ -7,9 +7,9 @@ import { useTemplateSecrets, scaffolderApiRef } from '@backstage/plugin-scaffold
7
7
  import { catalogApiRef } from '@backstage/plugin-catalog-react';
8
8
  import { Workflow } from '@backstage/plugin-scaffolder-react/alpha';
9
9
  import { Page, Header } from '@backstage/core-components';
10
- import { rootRouteRef, scaffolderTaskRouteRef, selectedTemplateRouteRef } from '../../routes.esm.js';
10
+ import { rootRouteRef, scaffolderTaskRouteRef, selectedTemplateRouteRef } from '../../../routes.esm.js';
11
11
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
12
- import { scaffolderTranslationRef } from '../../translation.esm.js';
12
+ import { scaffolderTranslationRef } from '../../../translation.esm.js';
13
13
  import { TemplateWizardPageContextMenu } from './TemplateWizardPageContextMenu.esm.js';
14
14
 
15
15
  const TemplateWizardPage = (props) => {
@@ -0,0 +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 React 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 { Workflow } from '@backstage/plugin-scaffolder-react/alpha';\nimport { JsonValue } from '@backstage/types';\nimport { Header, Page } 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';\n\n/**\n * @alpha\n */\nexport type TemplateWizardPageProps = {\n customFieldExtensions: FieldExtensionOptions<any, any>[];\n components?: {\n ReviewStepComponent?: React.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 } = useTemplateSecrets();\n const scaffolderApi = useApi(scaffolderApiRef);\n const catalogApi = useApi(catalogApiRef);\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 { 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 = async (values: Record<string, JsonValue>) => {\n const { taskId } = await scaffolderApi.scaffold({\n templateRef,\n values,\n secrets,\n });\n\n navigate(taskRoute({ taskId }));\n };\n\n const onError = () => <Navigate to={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 <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":";;;;;;;;;;;;;;AAqEa,MAAA,kBAAA,GAAqB,CAAC,KAAmC,KAAA;AACpE,EAAM,MAAA,OAAA,GAAU,YAAY,YAAY,CAAA,CAAA;AACxC,EAAM,MAAA,SAAA,GAAY,YAAY,sBAAsB,CAAA,CAAA;AACpD,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,kBAAmB,EAAA,CAAA;AACvC,EAAM,MAAA,aAAA,GAAgB,OAAO,gBAAgB,CAAA,CAAA;AAC7C,EAAM,MAAA,UAAA,GAAa,OAAO,aAAa,CAAA,CAAA;AACvC,EAAA,MAAM,WAAW,WAAY,EAAA,CAAA;AAC7B,EAAM,MAAA,EAAE,YAAc,EAAA,SAAA,EAAc,GAAA,iBAAA;AAAA,IAClC,wBAAA;AAAA,GACF,CAAA;AACA,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,wBAAwB,CAAA,CAAA;AAExD,EAAA,MAAM,cAAc,kBAAmB,CAAA;AAAA,IACrC,IAAM,EAAA,UAAA;AAAA,IACN,SAAA;AAAA,IACA,IAAM,EAAA,YAAA;AAAA,GACP,CAAA,CAAA;AAED,EAAA,MAAM,EAAE,KAAA,EAAO,OAAQ,EAAA,GAAI,SAAS,YAAY;AAC9C,IAAA,MAAM,IAAO,GAAA,MAAM,UAAW,CAAA,cAAA,CAAe,WAAW,CAAA,CAAA;AACxD,IAAO,OAAA,IAAA,EAAM,QAAS,CAAA,WAAA,GAAc,mBAAmB,CAAA,CAAA;AAAA,GACtD,EAAA,CAAC,WAAa,EAAA,UAAU,CAAC,CAAA,CAAA;AAE5B,EAAM,MAAA,QAAA,GAAW,OAAO,MAAsC,KAAA;AAC5D,IAAA,MAAM,EAAE,MAAA,EAAW,GAAA,MAAM,cAAc,QAAS,CAAA;AAAA,MAC9C,WAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAA,QAAA,CAAS,SAAU,CAAA,EAAE,MAAO,EAAC,CAAC,CAAA,CAAA;AAAA,GAChC,CAAA;AAEA,EAAA,MAAM,UAAU,sBAAM,KAAA,CAAA,aAAA,CAAC,QAAS,EAAA,EAAA,EAAA,EAAI,SAAW,EAAA,CAAA,CAAA;AAE/C,EACE,uBAAA,KAAA,CAAA,aAAA,CAAC,gBAAiB,EAAA,EAAA,UAAA,EAAY,EAAE,SAAA,EAAW,aACzC,EAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,IAAK,EAAA,EAAA,OAAA,EAAQ,SACZ,EAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,iBAAA,EAAmB,EAAE,8BAA8B,CAAA;AAAA,MACnD,KAAA,EAAO,EAAE,0BAA0B,CAAA;AAAA,MACnC,QAAA,EAAU,EAAE,6BAA6B,CAAA;AAAA,MACxC,GAAG,KAAM,CAAA,aAAA;AAAA,KAAA;AAAA,oBAEV,KAAA,CAAA,aAAA,CAAC,iCAA8B,OAAkB,EAAA,CAAA;AAAA,GAEnD,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAY,KAAM,CAAA,UAAA;AAAA,MAClB,OAAA;AAAA,MACA,YAAY,KAAM,CAAA,qBAAA;AAAA,MAClB,WAAW,KAAM,CAAA,SAAA;AAAA,MACjB,SAAS,KAAM,CAAA,OAAA;AAAA,KAAA;AAAA,GAEnB,CACF,CAAA,CAAA;AAEJ;;;;"}
@@ -9,7 +9,7 @@ import Edit from '@material-ui/icons/Edit';
9
9
  import MoreVert from '@material-ui/icons/MoreVert';
10
10
  import React, { useState } from 'react';
11
11
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
12
- import { scaffolderTranslationRef } from '../../translation.esm.js';
12
+ import { scaffolderTranslationRef } from '../../../translation.esm.js';
13
13
 
14
14
  const useStyles = makeStyles((theme) => ({
15
15
  button: {
@@ -0,0 +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 React, { useState } from 'react';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\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: React.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 onClick={() => window.open(editUrl, '_blank')}>\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":";;;;;;;;;;;;;AA6BA,MAAM,SAAA,GAAY,WAAW,CAAU,KAAA,MAAA;AAAA,EACrC,MAAQ,EAAA;AAAA,IACN,KAAA,EAAO,MAAM,IAAK,CAAA,SAAA;AAAA,GACpB;AACF,CAAE,CAAA,CAAA,CAAA;AAMK,SAAS,8BACd,KACA,EAAA;AACA,EAAM,MAAA,EAAE,SAAY,GAAA,KAAA,CAAA;AACpB,EAAA,MAAM,UAAU,SAAU,EAAA,CAAA;AAC1B,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,QAA4B,EAAA,CAAA;AAC5D,EAAA,MAAM,EAAE,CAAA,EAAM,GAAA,iBAAA,CAAkB,wBAAwB,CAAA,CAAA;AAExD,EAAA,IAAI,CAAC,OAAS,EAAA;AACZ,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AAEA,EAAM,MAAA,MAAA,GAAS,CAAC,KAAmD,KAAA;AACjE,IAAA,WAAA,CAAY,MAAM,aAAa,CAAA,CAAA;AAAA,GACjC,CAAA;AAEA,EAAA,MAAM,UAAU,MAAM;AACpB,IAAA,WAAA,CAAY,KAAS,CAAA,CAAA,CAAA;AAAA,GACvB,CAAA;AAEA,EAAA,uBAEI,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,EAAG,EAAA,WAAA;AAAA,MACH,YAAW,EAAA,MAAA;AAAA,MACX,eAAc,EAAA,WAAA;AAAA,MACd,eAAA,EAAe,CAAC,CAAC,QAAA;AAAA,MACjB,eAAc,EAAA,MAAA;AAAA,MACd,IAAK,EAAA,QAAA;AAAA,MACL,OAAS,EAAA,MAAA;AAAA,MACT,aAAY,EAAA,aAAA;AAAA,MACZ,KAAM,EAAA,SAAA;AAAA,MACN,WAAW,OAAQ,CAAA,MAAA;AAAA,KAAA;AAAA,wCAElB,QAAS,EAAA,IAAA,CAAA;AAAA,GAEZ,kBAAA,KAAA,CAAA,aAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,iBAAgB,EAAA,WAAA;AAAA,MAChB,IAAA,EAAM,QAAQ,QAAQ,CAAA;AAAA,MACtB,OAAA;AAAA,MACA,QAAA;AAAA,MACA,YAAc,EAAA,EAAE,QAAU,EAAA,QAAA,EAAU,YAAY,OAAQ,EAAA;AAAA,MACxD,eAAiB,EAAA,EAAE,QAAU,EAAA,KAAA,EAAO,YAAY,OAAQ,EAAA;AAAA,KAAA;AAAA,wCAEvD,QACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,YAAS,OAAS,EAAA,MAAM,OAAO,IAAK,CAAA,OAAA,EAAS,QAAQ,CAAA,EAAA,sCACnD,YACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,QAAS,EAAA,OAAA,EAAQ,CACzB,CACA,kBAAA,KAAA,CAAA,aAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAS,EAAA,CAAA;AAAA,UACP,2DAAA;AAAA,SACF;AAAA,OAAA;AAAA,KAEJ,CACF,CAAA;AAAA,GAEJ,CAAA,CAAA;AAEJ;;;;"}
@@ -0,0 +1,30 @@
1
+ import { convertLegacyRouteRef, compatWrapper } from '@backstage/core-compat-api';
2
+ import { PageBlueprint, NavItemBlueprint } from '@backstage/frontend-plugin-api';
3
+ import React from 'react';
4
+ import { rootRouteRef } from '../routes.esm.js';
5
+ import CreateComponentIcon from '@material-ui/icons/AddCircleOutline';
6
+ import { FormFieldBlueprint } from '@backstage/plugin-scaffolder-react/alpha';
7
+
8
+ const scaffolderPage = PageBlueprint.make({
9
+ params: {
10
+ routeRef: convertLegacyRouteRef(rootRouteRef),
11
+ defaultPath: "/create",
12
+ loader: () => import('../components/Router/index.esm.js').then((m) => compatWrapper(/* @__PURE__ */ React.createElement(m.Router, null)))
13
+ }
14
+ });
15
+ const scaffolderNavItem = NavItemBlueprint.make({
16
+ params: {
17
+ routeRef: convertLegacyRouteRef(rootRouteRef),
18
+ title: "Create...",
19
+ icon: CreateComponentIcon
20
+ }
21
+ });
22
+ const repoUrlPickerFormField = FormFieldBlueprint.make({
23
+ name: "repo-url-picker",
24
+ params: {
25
+ field: () => import('./fields/RepoUrlPicker.esm.js').then((m) => m.RepoUrlPicker)
26
+ }
27
+ });
28
+
29
+ export { repoUrlPickerFormField, scaffolderNavItem, scaffolderPage };
30
+ //# sourceMappingURL=extensions.esm.js.map
@@ -0,0 +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} from '@backstage/frontend-plugin-api';\nimport React from 'react';\nimport { rootRouteRef } from '../routes';\nimport CreateComponentIcon from '@material-ui/icons/AddCircleOutline';\nimport { FormFieldBlueprint } from '@backstage/plugin-scaffolder-react/alpha';\n\nexport const scaffolderPage = PageBlueprint.make({\n params: {\n routeRef: convertLegacyRouteRef(rootRouteRef),\n defaultPath: '/create',\n loader: () =>\n import('../components/Router').then(m => compatWrapper(<m.Router />)),\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"],"names":[],"mappings":";;;;;;;AA6Ba,MAAA,cAAA,GAAiB,cAAc,IAAK,CAAA;AAAA,EAC/C,MAAQ,EAAA;AAAA,IACN,QAAA,EAAU,sBAAsB,YAAY,CAAA;AAAA,IAC5C,WAAa,EAAA,SAAA;AAAA,IACb,MAAQ,EAAA,MACN,OAAO,mCAAsB,CAAE,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,aAAA,iBAAe,KAAA,CAAA,aAAA,CAAA,CAAA,CAAE,MAAF,EAAA,IAAS,CAAE,CAAC,CAAA;AAAA,GACxE;AACF,CAAC,EAAA;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,mBAAA;AAAA,GACR;AACF,CAAC,EAAA;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,CAAA;AAAA,GACzE;AACF,CAAC;;;;"}
@@ -0,0 +1,37 @@
1
+ import { createFormField } from '@backstage/plugin-scaffolder-react/alpha';
2
+ import { RepoUrlPicker as RepoUrlPicker$1 } from '../../components/fields/RepoUrlPicker/RepoUrlPicker.esm.js';
3
+ import '../../components/fields/EntityPicker/schema.esm.js';
4
+ import '../../components/fields/OwnerPicker/schema.esm.js';
5
+ import { RepoUrlPickerFieldSchema } from '../../components/fields/RepoUrlPicker/schema.esm.js';
6
+ import { repoPickerValidation } from '../../components/fields/RepoUrlPicker/validation.esm.js';
7
+ import '../../components/fields/OwnedEntityPicker/schema.esm.js';
8
+ import '../../components/fields/EntityTagsPicker/schema.esm.js';
9
+ import '../../components/fields/MyGroupsPicker/schema.esm.js';
10
+ import 'zod-to-json-schema';
11
+ import 'react';
12
+ import 'lodash/capitalize';
13
+ import '@backstage/core-components';
14
+ import '@material-ui/core/Box';
15
+ import '@material-ui/core/Checkbox';
16
+ import '@material-ui/core/FormControlLabel';
17
+ import '@material-ui/core/TextField';
18
+ import '@material-ui/core/Typography';
19
+ import '@material-ui/icons/CheckBox';
20
+ import '@material-ui/icons/CheckBoxOutlineBlank';
21
+ import '@material-ui/icons/ExpandMore';
22
+ import '@material-ui/lab/Autocomplete';
23
+ import '@backstage/plugin-catalog-react';
24
+ import '@backstage/core-plugin-api';
25
+ import '@backstage/core-plugin-api/alpha';
26
+ import '../../translation.esm.js';
27
+ import '../../components/OngoingTask/OngoingTask.esm.js';
28
+
29
+ const RepoUrlPicker = createFormField({
30
+ component: RepoUrlPicker$1,
31
+ name: "RepoUrlPicker",
32
+ validation: repoPickerValidation,
33
+ schema: RepoUrlPickerFieldSchema
34
+ });
35
+
36
+ export { RepoUrlPicker };
37
+ //# sourceMappingURL=RepoUrlPicker.esm.js.map
@@ -0,0 +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,wBAAA;AACV,CAAC;;;;"}
@@ -0,0 +1,32 @@
1
+ import { convertLegacyRouteRefs } from '@backstage/core-compat-api';
2
+ import { createFrontendPlugin } from '@backstage/frontend-plugin-api';
3
+ import { rootRouteRef, selectedTemplateRouteRef, scaffolderTaskRouteRef, actionsRouteRef, scaffolderListTaskRouteRef, editRouteRef, registerComponentRouteRef, viewTechDocRouteRef } from '../routes.esm.js';
4
+ import { scaffolderApi } from './api.esm.js';
5
+ import { scaffolderPage, scaffolderNavItem, repoUrlPickerFormField } from './extensions.esm.js';
6
+ import { formFieldsApi } from './api/FormFieldsApi.esm.js';
7
+
8
+ var plugin = createFrontendPlugin({
9
+ id: "scaffolder",
10
+ routes: convertLegacyRouteRefs({
11
+ root: rootRouteRef,
12
+ selectedTemplate: selectedTemplateRouteRef,
13
+ ongoingTask: scaffolderTaskRouteRef,
14
+ actions: actionsRouteRef,
15
+ listTasks: scaffolderListTaskRouteRef,
16
+ edit: editRouteRef
17
+ }),
18
+ externalRoutes: convertLegacyRouteRefs({
19
+ registerComponent: registerComponentRouteRef,
20
+ viewTechDoc: viewTechDocRouteRef
21
+ }),
22
+ extensions: [
23
+ scaffolderApi,
24
+ scaffolderPage,
25
+ scaffolderNavItem,
26
+ formFieldsApi,
27
+ repoUrlPickerFormField
28
+ ]
29
+ });
30
+
31
+ export { plugin as default };
32
+ //# sourceMappingURL=plugin.esm.js.map
@@ -0,0 +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 viewTechDocRouteRef,\n} from '../routes';\nimport { scaffolderApi } from './api';\nimport {\n repoUrlPickerFormField,\n scaffolderNavItem,\n scaffolderPage,\n} from './extensions';\nimport { formFieldsApi } from './api/FormFieldsApi';\n\n/** @alpha */\nexport default createFrontendPlugin({\n id: 'scaffolder',\n routes: convertLegacyRouteRefs({\n root: rootRouteRef,\n selectedTemplate: selectedTemplateRouteRef,\n ongoingTask: scaffolderTaskRouteRef,\n actions: actionsRouteRef,\n listTasks: scaffolderListTaskRouteRef,\n edit: editRouteRef,\n }),\n externalRoutes: convertLegacyRouteRefs({\n registerComponent: registerComponentRouteRef,\n viewTechDoc: viewTechDocRouteRef,\n }),\n extensions: [\n scaffolderApi,\n scaffolderPage,\n scaffolderNavItem,\n formFieldsApi,\n repoUrlPickerFormField,\n ],\n});\n"],"names":[],"mappings":";;;;;;;AAqCA,aAAe,oBAAqB,CAAA;AAAA,EAClC,EAAI,EAAA,YAAA;AAAA,EACJ,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,GACP,CAAA;AAAA,EACD,gBAAgB,sBAAuB,CAAA;AAAA,IACrC,iBAAmB,EAAA,yBAAA;AAAA,IACnB,WAAa,EAAA,mBAAA;AAAA,GACd,CAAA;AAAA,EACD,UAAY,EAAA;AAAA,IACV,aAAA;AAAA,IACA,cAAA;AAAA,IACA,iBAAA;AAAA,IACA,aAAA;AAAA,IACA,sBAAA;AAAA,GACF;AACF,CAAC,CAAA;;;;"}
package/dist/alpha.d.ts CHANGED
@@ -1,10 +1,12 @@
1
- import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
2
- import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
1
+ /// <reference types="react" />
2
+ import * as React from 'react';
3
3
  import React__default from 'react';
4
4
  import { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';
5
5
  import { TemplateGroupFilter, FieldExtensionOptions, ReviewStepProps, LayoutOptions, FormProps as FormProps$1 } from '@backstage/plugin-scaffolder-react';
6
6
  import { FormProps as FormProps$2 } from '@rjsf/core';
7
7
  import * as _backstage_core_plugin_api_alpha from '@backstage/core-plugin-api/alpha';
8
+ import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
9
+ import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
8
10
 
9
11
  /** @public */
10
12
  type ScaffolderCustomFieldExplorerClassKey = 'root' | 'controls' | 'fieldForm' | 'preview';
@@ -139,6 +141,7 @@ declare const scaffolderTranslationRef: _backstage_core_plugin_api_alpha.Transla
139
141
  readonly "ongoingTask.title": "Run of";
140
142
  readonly "ongoingTask.contextMenu.cancel": "Cancel";
141
143
  readonly "ongoingTask.contextMenu.startOver": "Start Over";
144
+ readonly "ongoingTask.contextMenu.retry": "Retry";
142
145
  readonly "ongoingTask.contextMenu.hideLogs": "Hide Logs";
143
146
  readonly "ongoingTask.contextMenu.showLogs": "Show Logs";
144
147
  readonly "ongoingTask.contextMenu.hideButtonBar": "Hide Button Bar";
@@ -147,10 +150,14 @@ declare const scaffolderTranslationRef: _backstage_core_plugin_api_alpha.Transla
147
150
  readonly "ongoingTask.pageTitle.hasTemplateName": "Run of {{templateName}}";
148
151
  readonly "ongoingTask.pageTitle.noTemplateName": "Scaffolder Run";
149
152
  readonly "ongoingTask.cancelButtonTitle": "Cancel";
153
+ readonly "ongoingTask.retryButtonTitle": "Retry";
150
154
  readonly "ongoingTask.startOverButtonTitle": "Start Over";
151
155
  readonly "ongoingTask.hideLogsButtonTitle": "Hide Logs";
152
156
  readonly "ongoingTask.showLogsButtonTitle": "Show Logs";
157
+ readonly "templateEditorForm.stepper.emptyText": "There are no spec parameters in the template to preview.";
153
158
  readonly "templateTypePicker.title": "Categories";
159
+ readonly "templateFormPage.title": "Template Form Playground";
160
+ readonly "templateFormPage.subtitle": "Edit, preview, and try out templates and template forms";
154
161
  readonly "templateEditorPage.title": "Template Editor";
155
162
  readonly "templateEditorPage.subtitle": "Edit, preview, and try out templates and template forms";
156
163
  readonly "templateEditorPage.dryRunResults.title": "Dry-run results";
@@ -161,10 +168,11 @@ declare const scaffolderTranslationRef: _backstage_core_plugin_api_alpha.Transla
161
168
  readonly "templateEditorPage.dryRunResultsView.tab.log": "Log";
162
169
  readonly "templateEditorPage.dryRunResultsView.tab.files": "Files";
163
170
  readonly "templateEditorPage.taskStatusStepper.skippedStepTitle": "Skipped";
164
- readonly "templateEditorPage.customFieldExplorer.preview.title": "Example Template Spec";
171
+ readonly "templateEditorPage.customFieldExplorer.preview.title": "Template Spec";
165
172
  readonly "templateEditorPage.customFieldExplorer.fieldForm.title": "Field Options";
166
173
  readonly "templateEditorPage.customFieldExplorer.fieldForm.applyButtonTitle": "Apply";
167
174
  readonly "templateEditorPage.customFieldExplorer.selectFieldLabel": "Choose Custom Field Extension";
175
+ readonly "templateEditorPage.customFieldExplorer.fieldPreview.title": "Field Preview";
168
176
  readonly "templateEditorPage.templateEditorBrowser.closeConfirmMessage": "Are you sure? Unsaved changes will be lost";
169
177
  readonly "templateEditorPage.templateEditorBrowser.saveIconTooltip": "Save all files";
170
178
  readonly "templateEditorPage.templateEditorBrowser.reloadIconTooltip": "Reload directory";
@@ -173,6 +181,9 @@ declare const scaffolderTranslationRef: _backstage_core_plugin_api_alpha.Transla
173
181
  readonly "templateEditorPage.templateEditorIntro.loadLocal.title": "Load Template Directory";
174
182
  readonly "templateEditorPage.templateEditorIntro.loadLocal.description": "Load a local template directory, allowing you to both edit and try executing your own template.";
175
183
  readonly "templateEditorPage.templateEditorIntro.loadLocal.unsupportedTooltip": "Only supported in some Chromium-based browsers";
184
+ readonly "templateEditorPage.templateEditorIntro.createLocal.title": "Create New Template";
185
+ readonly "templateEditorPage.templateEditorIntro.createLocal.description": "Create a local template directory, allowing you to both edit and try executing your own template.";
186
+ readonly "templateEditorPage.templateEditorIntro.createLocal.unsupportedTooltip": "Only supported in some Chromium-based browsers";
176
187
  readonly "templateEditorPage.templateEditorIntro.formEditor.title": "Edit Template Form";
177
188
  readonly "templateEditorPage.templateEditorIntro.formEditor.description": "Preview and edit a template form, either using a sample template or by loading a template from the catalog.";
178
189
  readonly "templateEditorPage.templateEditorIntro.fieldExplorer.title": "Custom Field Explorer";
@@ -194,6 +205,29 @@ declare const scaffolderTranslationRef: _backstage_core_plugin_api_alpha.Transla
194
205
  readonly "templateWizardPage.pageContextMenu.editConfigurationTitle": "Edit Configuration";
195
206
  }>;
196
207
 
208
+ /*
209
+ * Copyright 2024 The Backstage Authors
210
+ *
211
+ * Licensed under the Apache License, Version 2.0 (the "License");
212
+ * you may not use this file except in compliance with the License.
213
+ * You may obtain a copy of the License at
214
+ *
215
+ * http://www.apache.org/licenses/LICENSE-2.0
216
+ *
217
+ * Unless required by applicable law or agreed to in writing, software
218
+ * distributed under the License is distributed on an "AS IS" BASIS,
219
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
220
+ * See the License for the specific language governing permissions and
221
+ * limitations under the License.
222
+ */
223
+
224
+
225
+
226
+ /** @alpha */
227
+ interface FormField {
228
+ readonly $$type: '@backstage/scaffolder/FormField';
229
+ }
230
+
197
231
  /** @alpha */
198
232
  declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{
199
233
  root: _backstage_frontend_plugin_api.RouteRef<undefined>;
@@ -212,16 +246,17 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{
212
246
  }, {
213
247
  "api:scaffolder": _backstage_frontend_plugin_api.ExtensionDefinition<{
214
248
  kind: "api";
215
- namespace: undefined;
216
249
  name: undefined;
217
250
  config: {};
218
251
  configInput: {};
219
252
  output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.AnyApiFactory, "core.api.factory", {}>;
220
253
  inputs: {};
254
+ params: {
255
+ factory: _backstage_frontend_plugin_api.AnyApiFactory;
256
+ };
221
257
  }>;
222
258
  "page:scaffolder": _backstage_frontend_plugin_api.ExtensionDefinition<{
223
259
  kind: "page";
224
- namespace: undefined;
225
260
  name: undefined;
226
261
  config: {
227
262
  path: string | undefined;
@@ -229,14 +264,18 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{
229
264
  configInput: {
230
265
  path?: string | undefined;
231
266
  };
232
- output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<React__default.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
267
+ output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<React.JSX.Element, "core.reactElement", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<string, "core.routing.path", {}> | _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams>, "core.routing.ref", {
233
268
  optional: true;
234
269
  }>;
235
270
  inputs: {};
271
+ params: {
272
+ defaultPath: string;
273
+ loader: () => Promise<JSX.Element>;
274
+ routeRef?: _backstage_frontend_plugin_api.RouteRef<_backstage_frontend_plugin_api.AnyRouteRefParams> | undefined;
275
+ };
236
276
  }>;
237
277
  "nav-item:scaffolder": _backstage_frontend_plugin_api.ExtensionDefinition<{
238
278
  kind: "nav-item";
239
- namespace: undefined;
240
279
  name: undefined;
241
280
  config: {};
242
281
  configInput: {};
@@ -246,6 +285,38 @@ declare const _default: _backstage_frontend_plugin_api.FrontendPlugin<{
246
285
  routeRef: _backstage_frontend_plugin_api.RouteRef<undefined>;
247
286
  }, "core.nav-item.target", {}>;
248
287
  inputs: {};
288
+ params: {
289
+ title: string;
290
+ icon: _backstage_core_plugin_api.IconComponent;
291
+ routeRef: _backstage_frontend_plugin_api.RouteRef<undefined>;
292
+ };
293
+ }>;
294
+ "scaffolder-form-field:scaffolder/repo-url-picker": _backstage_frontend_plugin_api.ExtensionDefinition<{
295
+ kind: "scaffolder-form-field";
296
+ name: "repo-url-picker";
297
+ config: {};
298
+ configInput: {};
299
+ output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<() => Promise<FormField>, "scaffolder.form-field-loader", {}>;
300
+ inputs: {};
301
+ params: {
302
+ field: () => Promise<FormField>;
303
+ };
304
+ }>;
305
+ "api:scaffolder/form-fields": _backstage_frontend_plugin_api.ExtensionDefinition<{
306
+ config: {};
307
+ configInput: {};
308
+ output: _backstage_frontend_plugin_api.ConfigurableExtensionDataRef<_backstage_frontend_plugin_api.AnyApiFactory, "core.api.factory", {}>;
309
+ inputs: {
310
+ formFields: _backstage_frontend_plugin_api.ExtensionInput<_backstage_frontend_plugin_api.ConfigurableExtensionDataRef<() => Promise<FormField>, "scaffolder.form-field-loader", {}>, {
311
+ singleton: false;
312
+ optional: false;
313
+ }>;
314
+ };
315
+ kind: "api";
316
+ name: "form-fields";
317
+ params: {
318
+ factory: _backstage_frontend_plugin_api.AnyApiFactory;
319
+ };
249
320
  }>;
250
321
  }>;
251
322
 
package/dist/alpha.esm.js CHANGED
@@ -1,62 +1,3 @@
1
- import React from 'react';
2
- import { ApiBlueprint, createApiFactory, discoveryApiRef, fetchApiRef, identityApiRef, PageBlueprint, NavItemBlueprint, createFrontendPlugin } from '@backstage/frontend-plugin-api';
3
- import CreateComponentIcon from '@material-ui/icons/AddCircleOutline';
4
- import { convertLegacyRouteRef, compatWrapper, convertLegacyRouteRefs } from '@backstage/core-compat-api';
5
- import { scmIntegrationsApiRef } from '@backstage/integration-react';
6
- import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';
7
- import { ScaffolderClient } from './api.esm.js';
8
- import { rootRouteRef, selectedTemplateRouteRef, scaffolderTaskRouteRef, actionsRouteRef, scaffolderListTaskRouteRef, editRouteRef, registerComponentRouteRef, viewTechDocRouteRef } from './routes.esm.js';
9
1
  export { scaffolderTranslationRef } from './translation.esm.js';
10
-
11
- const scaffolderApi = ApiBlueprint.make({
12
- params: {
13
- factory: createApiFactory({
14
- api: scaffolderApiRef,
15
- deps: {
16
- discoveryApi: discoveryApiRef,
17
- scmIntegrationsApi: scmIntegrationsApiRef,
18
- fetchApi: fetchApiRef,
19
- identityApi: identityApiRef
20
- },
21
- factory: ({ discoveryApi, scmIntegrationsApi, fetchApi, identityApi }) => new ScaffolderClient({
22
- discoveryApi,
23
- scmIntegrationsApi,
24
- fetchApi,
25
- identityApi
26
- })
27
- })
28
- }
29
- });
30
- const scaffolderPage = PageBlueprint.make({
31
- params: {
32
- routeRef: convertLegacyRouteRef(rootRouteRef),
33
- defaultPath: "/create",
34
- loader: () => import('./components/Router/index.esm.js').then((m) => compatWrapper(/* @__PURE__ */ React.createElement(m.Router, null)))
35
- }
36
- });
37
- const scaffolderNavItem = NavItemBlueprint.make({
38
- params: {
39
- routeRef: convertLegacyRouteRef(rootRouteRef),
40
- title: "Create...",
41
- icon: CreateComponentIcon
42
- }
43
- });
44
- var alpha = createFrontendPlugin({
45
- id: "scaffolder",
46
- routes: convertLegacyRouteRefs({
47
- root: rootRouteRef,
48
- selectedTemplate: selectedTemplateRouteRef,
49
- ongoingTask: scaffolderTaskRouteRef,
50
- actions: actionsRouteRef,
51
- listTasks: scaffolderListTaskRouteRef,
52
- edit: editRouteRef
53
- }),
54
- externalRoutes: convertLegacyRouteRefs({
55
- registerComponent: registerComponentRouteRef,
56
- viewTechDoc: viewTechDocRouteRef
57
- }),
58
- extensions: [scaffolderApi, scaffolderPage, scaffolderNavItem]
59
- });
60
-
61
- export { alpha as default };
2
+ export { default } from './alpha/plugin.esm.js';
62
3
  //# sourceMappingURL=alpha.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alpha.esm.js","sources":["../src/alpha.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 React from 'react';\nimport {\n createApiFactory,\n createFrontendPlugin,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n ApiBlueprint,\n PageBlueprint,\n NavItemBlueprint,\n} from '@backstage/frontend-plugin-api';\nimport CreateComponentIcon from '@material-ui/icons/AddCircleOutline';\nimport {\n compatWrapper,\n convertLegacyRouteRef,\n convertLegacyRouteRefs,\n} from '@backstage/core-compat-api';\nimport { scmIntegrationsApiRef } from '@backstage/integration-react';\nimport { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport { ScaffolderClient } from './api';\nimport {\n registerComponentRouteRef,\n rootRouteRef,\n viewTechDocRouteRef,\n selectedTemplateRouteRef,\n scaffolderTaskRouteRef,\n scaffolderListTaskRouteRef,\n actionsRouteRef,\n editRouteRef,\n} from './routes';\n\nexport {\n type FormProps,\n type TemplateListPageProps,\n type TemplateWizardPageProps,\n type ScaffolderCustomFieldExplorerClassKey,\n type ScaffolderTemplateEditorClassKey,\n type ScaffolderTemplateFormPreviewerClassKey,\n} from './next';\n\nexport { scaffolderTranslationRef } from './translation';\n\nconst scaffolderApi = ApiBlueprint.make({\n params: {\n factory: createApiFactory({\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});\n\nconst scaffolderPage = PageBlueprint.make({\n params: {\n routeRef: convertLegacyRouteRef(rootRouteRef),\n defaultPath: '/create',\n loader: () =>\n import('./components/Router').then(m => compatWrapper(<m.Router />)),\n },\n});\n\nconst scaffolderNavItem = NavItemBlueprint.make({\n params: {\n routeRef: convertLegacyRouteRef(rootRouteRef),\n title: 'Create...',\n icon: CreateComponentIcon,\n },\n});\n\n/** @alpha */\nexport default createFrontendPlugin({\n id: 'scaffolder',\n routes: convertLegacyRouteRefs({\n root: rootRouteRef,\n selectedTemplate: selectedTemplateRouteRef,\n ongoingTask: scaffolderTaskRouteRef,\n actions: actionsRouteRef,\n listTasks: scaffolderListTaskRouteRef,\n edit: editRouteRef,\n }),\n externalRoutes: convertLegacyRouteRefs({\n registerComponent: registerComponentRouteRef,\n viewTechDoc: viewTechDocRouteRef,\n }),\n extensions: [scaffolderApi, scaffolderPage, scaffolderNavItem],\n});\n"],"names":[],"mappings":";;;;;;;;;;AA0DA,MAAM,aAAA,GAAgB,aAAa,IAAK,CAAA;AAAA,EACtC,MAAQ,EAAA;AAAA,IACN,SAAS,gBAAiB,CAAA;AAAA,MACxB,GAAK,EAAA,gBAAA;AAAA,MACL,IAAM,EAAA;AAAA,QACJ,YAAc,EAAA,eAAA;AAAA,QACd,kBAAoB,EAAA,qBAAA;AAAA,QACpB,QAAU,EAAA,WAAA;AAAA,QACV,WAAa,EAAA,cAAA;AAAA,OACf;AAAA,MACA,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,oBAAoB,QAAU,EAAA,WAAA,EACtD,KAAA,IAAI,gBAAiB,CAAA;AAAA,QACnB,YAAA;AAAA,QACA,kBAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,OACD,CAAA;AAAA,KACJ,CAAA;AAAA,GACH;AACF,CAAC,CAAA,CAAA;AAED,MAAM,cAAA,GAAiB,cAAc,IAAK,CAAA;AAAA,EACxC,MAAQ,EAAA;AAAA,IACN,QAAA,EAAU,sBAAsB,YAAY,CAAA;AAAA,IAC5C,WAAa,EAAA,SAAA;AAAA,IACb,MAAQ,EAAA,MACN,OAAO,kCAAqB,CAAE,CAAA,IAAA,CAAK,CAAK,CAAA,KAAA,aAAA,iBAAe,KAAA,CAAA,aAAA,CAAA,CAAA,CAAE,MAAF,EAAA,IAAS,CAAE,CAAC,CAAA;AAAA,GACvE;AACF,CAAC,CAAA,CAAA;AAED,MAAM,iBAAA,GAAoB,iBAAiB,IAAK,CAAA;AAAA,EAC9C,MAAQ,EAAA;AAAA,IACN,QAAA,EAAU,sBAAsB,YAAY,CAAA;AAAA,IAC5C,KAAO,EAAA,WAAA;AAAA,IACP,IAAM,EAAA,mBAAA;AAAA,GACR;AACF,CAAC,CAAA,CAAA;AAGD,YAAe,oBAAqB,CAAA;AAAA,EAClC,EAAI,EAAA,YAAA;AAAA,EACJ,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,GACP,CAAA;AAAA,EACD,gBAAgB,sBAAuB,CAAA;AAAA,IACrC,iBAAmB,EAAA,yBAAA;AAAA,IACnB,WAAa,EAAA,mBAAA;AAAA,GACd,CAAA;AAAA,EACD,UAAY,EAAA,CAAC,aAAe,EAAA,cAAA,EAAgB,iBAAiB,CAAA;AAC/D,CAAC,CAAA;;;;"}
1
+ {"version":3,"file":"alpha.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
package/dist/api.esm.js CHANGED
@@ -122,6 +122,7 @@ class ScaffolderClient {
122
122
  return response.json();
123
123
  }
124
124
  streamLogsEventStream({
125
+ isTaskRecoverable,
125
126
  taskId,
126
127
  after
127
128
  }) {
@@ -145,14 +146,14 @@ class ScaffolderClient {
145
146
  }
146
147
  };
147
148
  const ctrl = new AbortController();
148
- fetchEventSource(url, {
149
+ void fetchEventSource(url, {
149
150
  fetch: this.fetchApi.fetch,
150
151
  signal: ctrl.signal,
151
152
  onmessage(e) {
152
153
  if (e.event === "log") {
153
154
  processEvent(e);
154
155
  return;
155
- } else if (e.event === "completion") {
156
+ } else if (e.event === "completion" && !isTaskRecoverable) {
156
157
  processEvent(e);
157
158
  subscriber.complete();
158
159
  ctrl.abort();
@@ -219,6 +220,17 @@ class ScaffolderClient {
219
220
  }
220
221
  return await response.json();
221
222
  }
223
+ async retry(taskId) {
224
+ const baseUrl = await this.discoveryApi.getBaseUrl("scaffolder");
225
+ const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}/retry`;
226
+ const response = await this.fetchApi.fetch(url, {
227
+ method: "POST"
228
+ });
229
+ if (!response.ok) {
230
+ throw await ResponseError.fromResponse(response);
231
+ }
232
+ return await response.json();
233
+ }
222
234
  async autocomplete({
223
235
  token,
224
236
  resource,
@@ -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 { parseEntityRef } from '@backstage/catalog-model';\nimport {\n DiscoveryApi,\n FetchApi,\n IdentityApi,\n} from '@backstage/core-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { Observable } from '@backstage/types';\nimport qs from 'qs';\nimport ObservableImpl from 'zen-observable';\nimport {\n ListActionsResponse,\n LogEvent,\n ScaffolderApi,\n ScaffolderScaffoldOptions,\n ScaffolderScaffoldResponse,\n ScaffolderStreamLogsOptions,\n ScaffolderGetIntegrationsListOptions,\n ScaffolderGetIntegrationsListResponse,\n ScaffolderTask,\n ScaffolderDryRunOptions,\n ScaffolderDryRunResponse,\n TemplateParameterSchema,\n} from '@backstage/plugin-scaffolder-react';\n\nimport queryString from 'qs';\nimport {\n EventSourceMessage,\n fetchEventSource,\n} from '@microsoft/fetch-event-source';\n\n/**\n * An API to interact with the scaffolder backend.\n *\n * @public\n */\nexport class ScaffolderClient implements ScaffolderApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly scmIntegrationsApi: ScmIntegrationRegistry;\n private readonly fetchApi: FetchApi;\n private readonly identityApi?: IdentityApi;\n private readonly useLongPollingLogs: boolean;\n\n constructor(options: {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n identityApi?: IdentityApi;\n scmIntegrationsApi: ScmIntegrationRegistry;\n useLongPollingLogs?: boolean;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi ?? { fetch };\n this.scmIntegrationsApi = options.scmIntegrationsApi;\n this.useLongPollingLogs = options.useLongPollingLogs ?? false;\n this.identityApi = options.identityApi;\n }\n\n async listTasks(options: {\n filterByOwnership: 'owned' | 'all';\n }): Promise<{ tasks: ScaffolderTask[] }> {\n if (!this.identityApi) {\n throw new Error(\n 'IdentityApi is not available in the ScaffolderClient, please pass through the IdentityApi to the ScaffolderClient constructor in order to use the listTasks method',\n );\n }\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const { userEntityRef } = await this.identityApi.getBackstageIdentity();\n\n const query = queryString.stringify(\n options.filterByOwnership === 'owned' ? { createdBy: userEntityRef } : {},\n );\n\n const response = await this.fetchApi.fetch(`${baseUrl}/v2/tasks?${query}`);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async getIntegrationsList(\n options: ScaffolderGetIntegrationsListOptions,\n ): Promise<ScaffolderGetIntegrationsListResponse> {\n const integrations = [\n ...this.scmIntegrationsApi.azure.list(),\n ...this.scmIntegrationsApi.bitbucket\n .list()\n .filter(\n item =>\n !this.scmIntegrationsApi.bitbucketCloud.byHost(item.config.host) &&\n !this.scmIntegrationsApi.bitbucketServer.byHost(item.config.host),\n ),\n ...this.scmIntegrationsApi.bitbucketCloud.list(),\n ...this.scmIntegrationsApi.bitbucketServer.list(),\n ...this.scmIntegrationsApi.gerrit.list(),\n ...this.scmIntegrationsApi.gitea.list(),\n ...this.scmIntegrationsApi.github.list(),\n ...this.scmIntegrationsApi.gitlab.list(),\n ]\n .map(c => ({ type: c.type, title: c.title, host: c.config.host }))\n .filter(c => options.allowedHosts.includes(c.host));\n\n return {\n integrations,\n };\n }\n\n async getTemplateParameterSchema(\n templateRef: string,\n ): Promise<TemplateParameterSchema> {\n const { namespace, kind, name } = parseEntityRef(templateRef, {\n defaultKind: 'template',\n });\n\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const templatePath = [namespace, kind, name]\n .map(s => encodeURIComponent(s))\n .join('/');\n\n const url = `${baseUrl}/v2/templates/${templatePath}/parameter-schema`;\n\n const response = await this.fetchApi.fetch(url);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n const schema: TemplateParameterSchema = await response.json();\n return schema;\n }\n\n async scaffold(\n options: ScaffolderScaffoldOptions,\n ): Promise<ScaffolderScaffoldResponse> {\n const { templateRef, values, secrets = {} } = options;\n const url = `${await this.discoveryApi.getBaseUrl('scaffolder')}/v2/tasks`;\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n templateRef,\n values: { ...values },\n secrets,\n }),\n });\n\n if (response.status !== 201) {\n const status = `${response.status} ${response.statusText}`;\n const body = await response.text();\n throw new Error(`Backend request failed, ${status} ${body.trim()}`);\n }\n\n const { id } = (await response.json()) as { id: string };\n return { taskId: id };\n }\n\n async getTask(taskId: string): Promise<ScaffolderTask> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}`;\n\n const response = await this.fetchApi.fetch(url);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n streamLogs(options: ScaffolderStreamLogsOptions): Observable<LogEvent> {\n if (this.useLongPollingLogs) {\n return this.streamLogsPolling(options);\n }\n\n return this.streamLogsEventStream(options);\n }\n\n async dryRun(\n options: ScaffolderDryRunOptions,\n ): Promise<ScaffolderDryRunResponse> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const response = await this.fetchApi.fetch(`${baseUrl}/v2/dry-run`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n template: options.template,\n values: options.values,\n secrets: options.secrets,\n directoryContents: options.directoryContents,\n }),\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response.json();\n }\n\n private streamLogsEventStream({\n taskId,\n after,\n }: {\n taskId: string;\n after?: number;\n }): Observable<LogEvent> {\n return new ObservableImpl(subscriber => {\n const params = new URLSearchParams();\n if (after !== undefined) {\n params.set('after', String(Number(after)));\n }\n\n this.discoveryApi.getBaseUrl('scaffolder').then(\n baseUrl => {\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(\n taskId,\n )}/eventstream`;\n\n const processEvent = (event: any) => {\n if (event.data) {\n try {\n subscriber.next(JSON.parse(event.data));\n } catch (ex) {\n subscriber.error(ex);\n }\n }\n };\n\n const ctrl = new AbortController();\n fetchEventSource(url, {\n fetch: this.fetchApi.fetch,\n signal: ctrl.signal,\n onmessage(e: EventSourceMessage) {\n if (e.event === 'log') {\n processEvent(e);\n return;\n } else if (e.event === 'completion') {\n processEvent(e);\n subscriber.complete();\n ctrl.abort();\n return;\n }\n processEvent(e);\n },\n onerror(err) {\n subscriber.error(err);\n },\n });\n },\n error => {\n subscriber.error(error);\n },\n );\n });\n }\n\n private streamLogsPolling({\n taskId,\n after: inputAfter,\n }: {\n taskId: string;\n after?: number;\n }): Observable<LogEvent> {\n let after = inputAfter;\n\n return new ObservableImpl(subscriber => {\n this.discoveryApi.getBaseUrl('scaffolder').then(async baseUrl => {\n while (!subscriber.closed) {\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(\n taskId,\n )}/events?${qs.stringify({ after })}`;\n const response = await this.fetchApi.fetch(url);\n\n if (!response.ok) {\n // wait for one second to not run into an\n await new Promise(resolve => setTimeout(resolve, 1000));\n continue;\n }\n\n const logs = (await response.json()) as LogEvent[];\n\n for (const event of logs) {\n after = Number(event.id);\n\n subscriber.next(event);\n\n if (event.type === 'completion') {\n subscriber.complete();\n return;\n }\n }\n }\n });\n });\n }\n\n async listActions(): Promise<ListActionsResponse> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const response = await this.fetchApi.fetch(`${baseUrl}/v2/actions`);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async cancelTask(taskId: string): Promise<void> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}/cancel`;\n\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async autocomplete({\n token,\n resource,\n provider,\n context,\n }: {\n token: string;\n provider: string;\n resource: string;\n context?: Record<string, string>;\n }): Promise<{ results: { title: string }[] }> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n\n const url = `${baseUrl}/v2/autocomplete/${provider}/${resource}`;\n\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n token,\n context: context ?? {},\n }),\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n const { results } = await response.json();\n return { results };\n }\n}\n"],"names":["queryString"],"mappings":"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"}
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 { parseEntityRef } from '@backstage/catalog-model';\nimport {\n DiscoveryApi,\n FetchApi,\n IdentityApi,\n} from '@backstage/core-plugin-api';\nimport { ResponseError } from '@backstage/errors';\nimport { ScmIntegrationRegistry } from '@backstage/integration';\nimport { Observable } from '@backstage/types';\nimport qs from 'qs';\nimport ObservableImpl from 'zen-observable';\nimport {\n ListActionsResponse,\n LogEvent,\n ScaffolderApi,\n ScaffolderScaffoldOptions,\n ScaffolderScaffoldResponse,\n ScaffolderStreamLogsOptions,\n ScaffolderGetIntegrationsListOptions,\n ScaffolderGetIntegrationsListResponse,\n ScaffolderTask,\n ScaffolderDryRunOptions,\n ScaffolderDryRunResponse,\n TemplateParameterSchema,\n} from '@backstage/plugin-scaffolder-react';\n\nimport queryString from 'qs';\nimport {\n EventSourceMessage,\n fetchEventSource,\n} from '@microsoft/fetch-event-source';\n\n/**\n * An API to interact with the scaffolder backend.\n *\n * @public\n */\nexport class ScaffolderClient implements ScaffolderApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly scmIntegrationsApi: ScmIntegrationRegistry;\n private readonly fetchApi: FetchApi;\n private readonly identityApi?: IdentityApi;\n private readonly useLongPollingLogs: boolean;\n\n constructor(options: {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n identityApi?: IdentityApi;\n scmIntegrationsApi: ScmIntegrationRegistry;\n useLongPollingLogs?: boolean;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi ?? { fetch };\n this.scmIntegrationsApi = options.scmIntegrationsApi;\n this.useLongPollingLogs = options.useLongPollingLogs ?? false;\n this.identityApi = options.identityApi;\n }\n\n async listTasks(options: {\n filterByOwnership: 'owned' | 'all';\n }): Promise<{ tasks: ScaffolderTask[] }> {\n if (!this.identityApi) {\n throw new Error(\n 'IdentityApi is not available in the ScaffolderClient, please pass through the IdentityApi to the ScaffolderClient constructor in order to use the listTasks method',\n );\n }\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const { userEntityRef } = await this.identityApi.getBackstageIdentity();\n\n const query = queryString.stringify(\n options.filterByOwnership === 'owned' ? { createdBy: userEntityRef } : {},\n );\n\n const response = await this.fetchApi.fetch(`${baseUrl}/v2/tasks?${query}`);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async getIntegrationsList(\n options: ScaffolderGetIntegrationsListOptions,\n ): Promise<ScaffolderGetIntegrationsListResponse> {\n const integrations = [\n ...this.scmIntegrationsApi.azure.list(),\n ...this.scmIntegrationsApi.bitbucket\n .list()\n .filter(\n item =>\n !this.scmIntegrationsApi.bitbucketCloud.byHost(item.config.host) &&\n !this.scmIntegrationsApi.bitbucketServer.byHost(item.config.host),\n ),\n ...this.scmIntegrationsApi.bitbucketCloud.list(),\n ...this.scmIntegrationsApi.bitbucketServer.list(),\n ...this.scmIntegrationsApi.gerrit.list(),\n ...this.scmIntegrationsApi.gitea.list(),\n ...this.scmIntegrationsApi.github.list(),\n ...this.scmIntegrationsApi.gitlab.list(),\n ]\n .map(c => ({ type: c.type, title: c.title, host: c.config.host }))\n .filter(c => options.allowedHosts.includes(c.host));\n\n return {\n integrations,\n };\n }\n\n async getTemplateParameterSchema(\n templateRef: string,\n ): Promise<TemplateParameterSchema> {\n const { namespace, kind, name } = parseEntityRef(templateRef, {\n defaultKind: 'template',\n });\n\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const templatePath = [namespace, kind, name]\n .map(s => encodeURIComponent(s))\n .join('/');\n\n const url = `${baseUrl}/v2/templates/${templatePath}/parameter-schema`;\n\n const response = await this.fetchApi.fetch(url);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n const schema: TemplateParameterSchema = await response.json();\n return schema;\n }\n\n async scaffold(\n options: ScaffolderScaffoldOptions,\n ): Promise<ScaffolderScaffoldResponse> {\n const { templateRef, values, secrets = {} } = options;\n const url = `${await this.discoveryApi.getBaseUrl('scaffolder')}/v2/tasks`;\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n templateRef,\n values: { ...values },\n secrets,\n }),\n });\n\n if (response.status !== 201) {\n const status = `${response.status} ${response.statusText}`;\n const body = await response.text();\n throw new Error(`Backend request failed, ${status} ${body.trim()}`);\n }\n\n const { id } = (await response.json()) as { id: string };\n return { taskId: id };\n }\n\n async getTask(taskId: string): Promise<ScaffolderTask> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}`;\n\n const response = await this.fetchApi.fetch(url);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n streamLogs(options: ScaffolderStreamLogsOptions): Observable<LogEvent> {\n if (this.useLongPollingLogs) {\n return this.streamLogsPolling(options);\n }\n\n return this.streamLogsEventStream(options);\n }\n\n async dryRun(\n options: ScaffolderDryRunOptions,\n ): Promise<ScaffolderDryRunResponse> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const response = await this.fetchApi.fetch(`${baseUrl}/v2/dry-run`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n template: options.template,\n values: options.values,\n secrets: options.secrets,\n directoryContents: options.directoryContents,\n }),\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return response.json();\n }\n\n private streamLogsEventStream({\n isTaskRecoverable,\n taskId,\n after,\n }: ScaffolderStreamLogsOptions): Observable<LogEvent> {\n return new ObservableImpl(subscriber => {\n const params = new URLSearchParams();\n if (after !== undefined) {\n params.set('after', String(Number(after)));\n }\n\n this.discoveryApi.getBaseUrl('scaffolder').then(\n baseUrl => {\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(\n taskId,\n )}/eventstream`;\n\n const processEvent = (event: any) => {\n if (event.data) {\n try {\n subscriber.next(JSON.parse(event.data));\n } catch (ex) {\n subscriber.error(ex);\n }\n }\n };\n\n const ctrl = new AbortController();\n void fetchEventSource(url, {\n fetch: this.fetchApi.fetch,\n signal: ctrl.signal,\n onmessage(e: EventSourceMessage) {\n if (e.event === 'log') {\n processEvent(e);\n return;\n } else if (e.event === 'completion' && !isTaskRecoverable) {\n processEvent(e);\n subscriber.complete();\n ctrl.abort();\n return;\n }\n processEvent(e);\n },\n onerror(err) {\n subscriber.error(err);\n },\n });\n },\n error => {\n subscriber.error(error);\n },\n );\n });\n }\n\n private streamLogsPolling({\n taskId,\n after: inputAfter,\n }: {\n taskId: string;\n after?: number;\n }): Observable<LogEvent> {\n let after = inputAfter;\n\n return new ObservableImpl(subscriber => {\n this.discoveryApi.getBaseUrl('scaffolder').then(async baseUrl => {\n while (!subscriber.closed) {\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(\n taskId,\n )}/events?${qs.stringify({ after })}`;\n const response = await this.fetchApi.fetch(url);\n\n if (!response.ok) {\n // wait for one second to not run into an\n await new Promise(resolve => setTimeout(resolve, 1000));\n continue;\n }\n\n const logs = (await response.json()) as LogEvent[];\n\n for (const event of logs) {\n after = Number(event.id);\n\n subscriber.next(event);\n\n if (event.type === 'completion') {\n subscriber.complete();\n return;\n }\n }\n }\n });\n });\n }\n\n async listActions(): Promise<ListActionsResponse> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const response = await this.fetchApi.fetch(`${baseUrl}/v2/actions`);\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async cancelTask(taskId: string): Promise<void> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}/cancel`;\n\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async retry?(taskId: string): Promise<void> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n const url = `${baseUrl}/v2/tasks/${encodeURIComponent(taskId)}/retry`;\n\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n return await response.json();\n }\n\n async autocomplete({\n token,\n resource,\n provider,\n context,\n }: {\n token: string;\n provider: string;\n resource: string;\n context?: Record<string, string>;\n }): Promise<{ results: { title: string }[] }> {\n const baseUrl = await this.discoveryApi.getBaseUrl('scaffolder');\n\n const url = `${baseUrl}/v2/autocomplete/${provider}/${resource}`;\n\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n token,\n context: context ?? {},\n }),\n });\n\n if (!response.ok) {\n throw await ResponseError.fromResponse(response);\n }\n\n const { results } = await response.json();\n return { results };\n }\n}\n"],"names":["queryString"],"mappings":"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"}