@backstage/plugin-scaffolder 0.15.0 → 1.0.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,37 @@
1
1
  # @backstage/plugin-scaffolder
2
2
 
3
+ ## 1.0.0
4
+
5
+ ### Major Changes
6
+
7
+ - b58c70c223: This package has been promoted to v1.0! To understand how this change affects the package, please check out our [versioning policy](https://backstage.io/docs/overview/versioning-policy).
8
+
9
+ ### Minor Changes
10
+
11
+ - 9a408928a1: **BREAKING**: Removed the unused `titleComponent` property of `groups` passed to the `ScaffolderPage`. The property was already ignored, but existing usage should migrated to use the `title` property instead, which now accepts any `ReactNode`.
12
+
13
+ ### Patch Changes
14
+
15
+ - 9b7e361783: Remove beta labels
16
+ - a422d7ce5e: chore(deps): bump `@testing-library/react` from 11.2.6 to 12.1.3
17
+ - 20a262c214: The `ScaffolderPage` now uses the `CatalogFilterLayout`, which means the filters are put in a drawer on smaller screens.
18
+ - f24ef7864e: Minor typo fixes
19
+ - d8716924d6: Implement a template preview page (`/create/preview`) to test creating form UIs
20
+ - Updated dependencies
21
+ - @backstage/core-components@0.9.2
22
+ - @backstage/core-plugin-api@1.0.0
23
+ - @backstage/integration-react@1.0.0
24
+ - @backstage/plugin-catalog-react@1.0.0
25
+ - @backstage/plugin-permission-react@0.3.4
26
+ - @backstage/catalog-model@1.0.0
27
+ - @backstage/plugin-scaffolder-common@1.0.0
28
+ - @backstage/integration@1.0.0
29
+ - @backstage/catalog-client@1.0.0
30
+ - @backstage/config@1.0.0
31
+ - @backstage/errors@1.0.0
32
+ - @backstage/types@1.0.0
33
+ - @backstage/plugin-catalog-common@1.0.0
34
+
3
35
  ## 0.15.0
4
36
 
5
37
  ### Minor Changes
@@ -1,11 +1,11 @@
1
1
  import React, { useState, useContext, useCallback } from 'react';
2
2
  import { useNavigate, Navigate, useOutlet, Routes, Route } from 'react-router';
3
- import { ItemCardHeader, MarkdownContent, Button, ContentHeader, Progress, WarningPanel, Link as Link$1, Content, ItemCardGrid, Page, Header, Lifecycle, CreateButton, SupportButton, StructuredMetadataTable, InfoCard, ErrorPage } from '@backstage/core-components';
4
- import { useRouteRef, useApi, errorApiRef, featureFlagsApiRef, useApiHolder, useElementFilter } from '@backstage/core-plugin-api';
5
- import { getEntityRelations, getEntitySourceLocation, FavoriteEntity, EntityRefLinks, useEntityList, EntityListProvider, EntitySearchBar, EntityKindPicker, UserListPicker, EntityTagPicker } from '@backstage/plugin-catalog-react';
6
- import { makeStyles, useTheme, Card, CardMedia, CardContent, Box, Typography, Chip, CardActions, IconButton, Tooltip, Link, Stepper, Step, StepLabel, StepContent, Button as Button$1, Paper, LinearProgress, TableContainer, Table, TableHead, TableRow, TableCell, TableBody } from '@material-ui/core';
7
- import { E as EntityPicker, a as EntityNamePicker, e as entityNamePickerValidation, b as EntityTagsPicker, R as RepoUrlPicker, r as repoPickerValidation, O as OwnerPicker, c as OwnedEntityPicker, s as selectedTemplateRouteRef, d as registerComponentRouteRef, T as TemplateTypePicker, S as SecretsContext, f as scaffolderApiRef, g as scaffolderTaskRouteRef, h as rootRouteRef, F as FIELD_EXTENSION_WRAPPER_KEY, i as FIELD_EXTENSION_KEY, j as SecretsContextProvider, k as TaskPage } from './index-ced3b204.esm.js';
3
+ import { ItemCardHeader, MarkdownContent, Button, ContentHeader, Progress, WarningPanel, Link as Link$1, Content, ItemCardGrid, Page, Header, CreateButton, SupportButton, StructuredMetadataTable, InfoCard, ErrorPage } from '@backstage/core-components';
4
+ import { useRouteRef, useApi, errorApiRef, featureFlagsApiRef, useApiHolder, alertApiRef, useElementFilter } from '@backstage/core-plugin-api';
5
+ import { getEntityRelations, getEntitySourceLocation, FavoriteEntity, EntityRefLinks, useEntityList, EntityListProvider, CatalogFilterLayout, EntitySearchBar, EntityKindPicker, UserListPicker, EntityTagPicker, catalogApiRef, humanizeEntityRef } from '@backstage/plugin-catalog-react';
6
+ import { E as EntityPicker, a as EntityNamePicker, e as entityNamePickerValidation, b as EntityTagsPicker, R as RepoUrlPicker, r as repoPickerValidation, O as OwnerPicker, c as OwnedEntityPicker, s as selectedTemplateRouteRef, d as registerComponentRouteRef, T as TemplateTypePicker, S as SecretsContext, f as scaffolderApiRef, g as scaffolderTaskRouteRef, h as rootRouteRef, F as FIELD_EXTENSION_WRAPPER_KEY, i as FIELD_EXTENSION_KEY, j as SecretsContextProvider, k as TaskPage } from './index-25fdb62e.esm.js';
8
7
  import { RELATION_OWNED_BY, stringifyEntityRef } from '@backstage/catalog-model';
8
+ import { makeStyles, useTheme, Card, CardMedia, CardContent, Box, Typography, Chip, CardActions, IconButton, Tooltip, Link, Stepper, Step, StepLabel, StepContent, Button as Button$1, Paper, LinearProgress, TableContainer, Table, TableHead, TableRow, TableCell, TableBody, Grid, FormControl, InputLabel, Select, MenuItem } from '@material-ui/core';
9
9
  import { scmIntegrationsApiRef, ScmIntegrationIcon } from '@backstage/integration-react';
10
10
  import WarningIcon from '@material-ui/icons/Warning';
11
11
  import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common';
@@ -17,6 +17,12 @@ import { withTheme } from '@rjsf/core';
17
17
  import { Theme } from '@rjsf/material-ui';
18
18
  import cloneDeep from 'lodash/cloneDeep';
19
19
  import classNames from 'classnames';
20
+ import useDebounce from 'react-use/lib/useDebounce';
21
+ import { yaml as yaml$1 } from '@codemirror/legacy-modes/mode/yaml';
22
+ import { showPanel } from '@codemirror/panel';
23
+ import { StreamLanguage } from '@codemirror/stream-parser';
24
+ import CodeMirror from '@uiw/react-codemirror';
25
+ import yaml from 'yaml';
20
26
  import '@backstage/errors';
21
27
  import 'zen-observable';
22
28
  import '@material-ui/core/FormControl';
@@ -26,7 +32,6 @@ import '@material-ui/lab';
26
32
  import '@material-ui/core/FormHelperText';
27
33
  import '@material-ui/core/Input';
28
34
  import '@material-ui/core/InputLabel';
29
- import 'react-use/lib/useDebounce';
30
35
  import 'lodash/capitalize';
31
36
  import '@material-ui/icons/CheckBox';
32
37
  import '@material-ui/icons/CheckBoxOutlineBlank';
@@ -210,10 +215,6 @@ const TemplateList = ({
210
215
  const Card = TemplateCardComponent || TemplateCard;
211
216
  const maybeFilteredEntities = group ? entities.filter((e) => group.filter(e)) : entities;
212
217
  const titleComponent = (() => {
213
- if (group == null ? void 0 : group.titleComponent) {
214
- console.warn("DEPRECATED: group.titleComponent is now deprecated. Use group.title instead, it can be a string or a react component");
215
- return group == null ? void 0 : group.titleComponent;
216
- }
217
218
  if (group && group.title) {
218
219
  if (typeof group.title === "string") {
219
220
  return /* @__PURE__ */ React.createElement(ContentHeader, {
@@ -242,19 +243,10 @@ const TemplateList = ({
242
243
  })))));
243
244
  };
244
245
 
245
- const useStyles$1 = makeStyles((theme) => ({
246
- contentWrapper: {
247
- display: "grid",
248
- gridTemplateAreas: "'filters' 'grid'",
249
- gridTemplateColumns: "250px 1fr",
250
- gridColumnGap: theme.spacing(2)
251
- }
252
- }));
253
246
  const ScaffolderPageContents = ({
254
247
  TemplateCardComponent,
255
248
  groups
256
249
  }) => {
257
- const styles = useStyles$1();
258
250
  const registerComponentLink = useRouteRef(registerComponentRouteRef);
259
251
  const otherTemplatesGroup = {
260
252
  title: groups ? "Other Templates" : "Templates",
@@ -268,24 +260,20 @@ const ScaffolderPageContents = ({
268
260
  themeId: "home"
269
261
  }, /* @__PURE__ */ React.createElement(Header, {
270
262
  pageTitleOverride: "Create a New Component",
271
- title: /* @__PURE__ */ React.createElement(React.Fragment, null, "Create a New Component ", /* @__PURE__ */ React.createElement(Lifecycle, {
272
- shorthand: true
273
- })),
263
+ title: "Create a New Component",
274
264
  subtitle: "Create new software components using standard templates"
275
265
  }), /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(ContentHeader, {
276
266
  title: "Available Templates"
277
267
  }, allowed && /* @__PURE__ */ React.createElement(CreateButton, {
278
268
  title: "Register Existing Component",
279
269
  to: registerComponentLink && registerComponentLink()
280
- }), /* @__PURE__ */ React.createElement(SupportButton, null, "Create new software components using standard templates. Different templates create different kinds of components (services, websites, documentation, ...).")), /* @__PURE__ */ React.createElement("div", {
281
- className: styles.contentWrapper
282
- }, /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(EntitySearchBar, null), /* @__PURE__ */ React.createElement(EntityKindPicker, {
270
+ }), /* @__PURE__ */ React.createElement(SupportButton, null, "Create new software components using standard templates. Different templates create different kinds of components (services, websites, documentation, ...).")), /* @__PURE__ */ React.createElement(CatalogFilterLayout, null, /* @__PURE__ */ React.createElement(CatalogFilterLayout.Filters, null, /* @__PURE__ */ React.createElement(EntitySearchBar, null), /* @__PURE__ */ React.createElement(EntityKindPicker, {
283
271
  initialFilter: "template",
284
272
  hidden: true
285
273
  }), /* @__PURE__ */ React.createElement(UserListPicker, {
286
274
  initialFilter: "all",
287
275
  availableFilters: ["all", "starred"]
288
- }), /* @__PURE__ */ React.createElement(TemplateTypePicker, null), /* @__PURE__ */ React.createElement(EntityTagPicker, null)), /* @__PURE__ */ React.createElement("div", null, groups && groups.map((group, index) => /* @__PURE__ */ React.createElement(TemplateList, {
276
+ }), /* @__PURE__ */ React.createElement(TemplateTypePicker, null), /* @__PURE__ */ React.createElement(EntityTagPicker, null)), /* @__PURE__ */ React.createElement(CatalogFilterLayout.Content, null, groups && groups.map((group, index) => /* @__PURE__ */ React.createElement(TemplateList, {
289
277
  key: index,
290
278
  TemplateCardComponent,
291
279
  group
@@ -477,6 +465,9 @@ const MultistepJsonForm = (props) => {
477
465
  };
478
466
  const handleBack = () => setActiveStep(Math.max(activeStep - 1, 0));
479
467
  const handleCreate = async () => {
468
+ if (!onFinish) {
469
+ return;
470
+ }
480
471
  setDisableButtons(true);
481
472
  try {
482
473
  await onFinish();
@@ -541,7 +532,7 @@ const MultistepJsonForm = (props) => {
541
532
  variant: "contained",
542
533
  color: "primary",
543
534
  onClick: handleCreate,
544
- disabled: disableButtons
535
+ disabled: !onFinish || disableButtons
545
536
  }, "Create"))));
546
537
  };
547
538
 
@@ -639,9 +630,7 @@ const TemplatePage = ({
639
630
  themeId: "home"
640
631
  }, /* @__PURE__ */ React.createElement(Header, {
641
632
  pageTitleOverride: "Create a New Component",
642
- title: /* @__PURE__ */ React.createElement(React.Fragment, null, "Create a New Component ", /* @__PURE__ */ React.createElement(Lifecycle, {
643
- shorthand: true
644
- })),
633
+ title: "Create a New Component",
645
634
  subtitle: "Create new software components using standard templates"
646
635
  }), /* @__PURE__ */ React.createElement(Content, null, loading && /* @__PURE__ */ React.createElement(LinearProgress, {
647
636
  "data-testid": "loading-progress"
@@ -664,7 +653,7 @@ const TemplatePage = ({
664
653
  }))));
665
654
  };
666
655
 
667
- const useStyles = makeStyles((theme) => ({
656
+ const useStyles$1 = makeStyles((theme) => ({
668
657
  code: {
669
658
  fontFamily: "Menlo, monospace",
670
659
  padding: theme.spacing(1),
@@ -687,7 +676,7 @@ const useStyles = makeStyles((theme) => ({
687
676
  }));
688
677
  const ActionsPage = () => {
689
678
  const api = useApi(scaffolderApiRef);
690
- const classes = useStyles();
679
+ const classes = useStyles$1();
691
680
  const { loading, value, error } = useAsync(async () => {
692
681
  return api.listActions();
693
682
  });
@@ -772,8 +761,166 @@ const ActionsPage = () => {
772
761
  }), /* @__PURE__ */ React.createElement(Content, null, items));
773
762
  };
774
763
 
764
+ const EXAMPLE_TEMPLATE_PARAMS_YAML = `# Edit the template parameters below to see how they will render in the scaffolder form UI
765
+ parameters:
766
+ - title: Fill in some steps
767
+ required:
768
+ - name
769
+ properties:
770
+ name:
771
+ title: Name
772
+ type: string
773
+ description: Unique name of the component
774
+ owner:
775
+ title: Owner
776
+ type: string
777
+ description: Owner of the component
778
+ ui:field: OwnerPicker
779
+ ui:options:
780
+ allowedKinds:
781
+ - Group
782
+ - title: Choose a location
783
+ required:
784
+ - repoUrl
785
+ properties:
786
+ repoUrl:
787
+ title: Repository Location
788
+ type: string
789
+ ui:field: RepoUrlPicker
790
+ ui:options:
791
+ allowedHosts:
792
+ - github.com
793
+ `;
794
+ const useStyles = makeStyles({
795
+ templateSelect: {
796
+ marginBottom: "10px"
797
+ },
798
+ grid: {
799
+ height: "100%"
800
+ },
801
+ codeMirror: {
802
+ height: "95%"
803
+ }
804
+ });
805
+ const TemplatePreviewPage = ({
806
+ defaultPreviewTemplate = EXAMPLE_TEMPLATE_PARAMS_YAML,
807
+ customFieldExtensions = []
808
+ }) => {
809
+ const classes = useStyles();
810
+ const alertApi = useApi(alertApiRef);
811
+ const catalogApi = useApi(catalogApiRef);
812
+ const apiHolder = useApiHolder();
813
+ const [selectedTemplate, setSelectedTemplate] = useState("");
814
+ const [schema, setSchema] = useState({
815
+ title: "",
816
+ steps: []
817
+ });
818
+ const [templateOptions, setTemplateOptions] = useState([]);
819
+ const [templateYaml, setTemplateYaml] = useState(defaultPreviewTemplate);
820
+ const [formState, setFormState] = useState({});
821
+ const { loading } = useAsync(() => catalogApi.getEntities({
822
+ filter: { kind: "template" },
823
+ fields: [
824
+ "kind",
825
+ "metadata.namespace",
826
+ "metadata.name",
827
+ "metadata.title",
828
+ "spec.parameters"
829
+ ]
830
+ }).then(({ items }) => setTemplateOptions(items.map((template) => {
831
+ var _a;
832
+ return {
833
+ label: (_a = template.metadata.title) != null ? _a : humanizeEntityRef(template, { defaultKind: "template" }),
834
+ value: template
835
+ };
836
+ }))).catch((e) => alertApi.post({
837
+ message: `Error loading exisiting templates: ${e.message}`,
838
+ severity: "error"
839
+ })), [catalogApi]);
840
+ const errorPanel = document.createElement("div");
841
+ errorPanel.style.color = "red";
842
+ useDebounce(() => {
843
+ try {
844
+ const parsedTemplate = yaml.parse(templateYaml);
845
+ setSchema({
846
+ title: "Preview",
847
+ steps: parsedTemplate.parameters.map((param) => ({
848
+ title: param.title,
849
+ schema: param
850
+ }))
851
+ });
852
+ setFormState({});
853
+ } catch (e) {
854
+ errorPanel.textContent = e.message;
855
+ }
856
+ }, 250, [setFormState, setSchema, templateYaml]);
857
+ const handleSelectChange = useCallback((selected) => {
858
+ setSelectedTemplate(selected);
859
+ setTemplateYaml(yaml.stringify(selected.spec));
860
+ }, [setTemplateYaml]);
861
+ const handleFormReset = () => setFormState({});
862
+ const handleFormChange = useCallback((e) => setFormState(e.formData), [setFormState]);
863
+ const handleCodeChange = useCallback((code) => {
864
+ setTemplateYaml(code);
865
+ }, [setTemplateYaml]);
866
+ const customFieldComponents = Object.fromEntries(customFieldExtensions.map(({ name, component }) => [name, component]));
867
+ const customFieldValidators = Object.fromEntries(customFieldExtensions.map(({ name, validation }) => [name, validation]));
868
+ return /* @__PURE__ */ React.createElement(Page, {
869
+ themeId: "home"
870
+ }, /* @__PURE__ */ React.createElement(Header, {
871
+ title: "Template Preview",
872
+ subtitle: "Preview your template parameter UI"
873
+ }), /* @__PURE__ */ React.createElement(Content, null, loading && /* @__PURE__ */ React.createElement(LinearProgress, null), /* @__PURE__ */ React.createElement(Grid, {
874
+ container: true,
875
+ className: classes.grid
876
+ }, /* @__PURE__ */ React.createElement(Grid, {
877
+ item: true,
878
+ xs: 6
879
+ }, /* @__PURE__ */ React.createElement(FormControl, {
880
+ className: classes.templateSelect,
881
+ variant: "outlined",
882
+ fullWidth: true
883
+ }, /* @__PURE__ */ React.createElement(InputLabel, {
884
+ id: "select-template-label"
885
+ }, "Load Existing Template"), /* @__PURE__ */ React.createElement(Select, {
886
+ value: selectedTemplate,
887
+ label: "Load Existing Template",
888
+ labelId: "select-template-label",
889
+ onChange: (e) => handleSelectChange(e.target.value)
890
+ }, templateOptions.map((option, idx) => /* @__PURE__ */ React.createElement(MenuItem, {
891
+ key: idx,
892
+ value: option.value
893
+ }, option.label)))), /* @__PURE__ */ React.createElement(CodeMirror, {
894
+ className: classes.codeMirror,
895
+ value: templateYaml,
896
+ theme: "dark",
897
+ height: "100%",
898
+ extensions: [
899
+ StreamLanguage.define(yaml$1),
900
+ showPanel.of(() => ({ dom: errorPanel, top: true }))
901
+ ],
902
+ onChange: handleCodeChange
903
+ })), /* @__PURE__ */ React.createElement(Grid, {
904
+ item: true,
905
+ xs: 6
906
+ }, schema && /* @__PURE__ */ React.createElement(InfoCard, {
907
+ key: JSON.stringify(schema)
908
+ }, /* @__PURE__ */ React.createElement(MultistepJsonForm, {
909
+ formData: formState,
910
+ fields: customFieldComponents,
911
+ onChange: handleFormChange,
912
+ onReset: handleFormReset,
913
+ steps: schema.steps.map((step) => {
914
+ return {
915
+ ...step,
916
+ validate: createValidator(step.schema, customFieldValidators, { apiHolder })
917
+ };
918
+ })
919
+ }))))));
920
+ };
921
+
775
922
  const Router = (props) => {
776
- const { groups, components = {} } = props;
923
+ const { groups, components = {}, defaultPreviewTemplate } = props;
777
924
  const { TemplateCardComponent, TaskPageComponent } = components;
778
925
  const outlet = useOutlet();
779
926
  const TaskPageElement = TaskPageComponent != null ? TaskPageComponent : TaskPage;
@@ -803,8 +950,14 @@ const Router = (props) => {
803
950
  }), /* @__PURE__ */ React.createElement(Route, {
804
951
  path: "/actions",
805
952
  element: /* @__PURE__ */ React.createElement(ActionsPage, null)
953
+ }), /* @__PURE__ */ React.createElement(Route, {
954
+ path: "/preview",
955
+ element: /* @__PURE__ */ React.createElement(SecretsContextProvider, null, /* @__PURE__ */ React.createElement(TemplatePreviewPage, {
956
+ defaultPreviewTemplate,
957
+ customFieldExtensions: fieldExtensions
958
+ }))
806
959
  }));
807
960
  };
808
961
 
809
962
  export { Router };
810
- //# sourceMappingURL=Router-47c9a9ee.esm.js.map
963
+ //# sourceMappingURL=Router-773d053b.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Router-773d053b.esm.js","sources":["../../src/extensions/default.ts","../../src/components/TemplateCard/TemplateCard.tsx","../../src/components/TemplateList/TemplateList.tsx","../../src/components/ScaffolderPage/ScaffolderPage.tsx","../../src/components/MultistepJsonForm/schema.ts","../../src/components/MultistepJsonForm/FieldOverrides/DescriptionField.tsx","../../src/components/MultistepJsonForm/MultistepJsonForm.tsx","../../src/components/TemplatePage/TemplatePage.tsx","../../src/components/ActionsPage/ActionsPage.tsx","../../src/components/TemplatePreviewPage/TemplatePreviewPage.tsx","../../src/components/Router.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 { EntityPicker } from '../components/fields/EntityPicker/EntityPicker';\nimport { EntityNamePicker } from '../components/fields/EntityNamePicker/EntityNamePicker';\nimport { entityNamePickerValidation } from '../components/fields/EntityNamePicker/validation';\nimport { EntityTagsPicker } from '../components/fields/EntityTagsPicker/EntityTagsPicker';\nimport { OwnerPicker } from '../components/fields/OwnerPicker/OwnerPicker';\nimport { RepoUrlPicker } from '../components/fields/RepoUrlPicker/RepoUrlPicker';\nimport { repoPickerValidation } from '../components/fields/RepoUrlPicker/validation';\nimport { OwnedEntityPicker } from '../components/fields/OwnedEntityPicker/OwnedEntityPicker';\n\nexport const DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS = [\n {\n component: EntityPicker,\n name: 'EntityPicker',\n },\n {\n component: EntityNamePicker,\n name: 'EntityNamePicker',\n validation: entityNamePickerValidation,\n },\n {\n component: EntityTagsPicker,\n name: 'EntityTagsPicker',\n },\n {\n component: RepoUrlPicker,\n name: 'RepoUrlPicker',\n validation: repoPickerValidation,\n },\n {\n component: OwnerPicker,\n name: 'OwnerPicker',\n },\n {\n component: OwnedEntityPicker,\n name: 'OwnedEntityPicker',\n },\n];\n","/*\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 */\nimport { Entity, RELATION_OWNED_BY } from '@backstage/catalog-model';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport {\n ScmIntegrationIcon,\n scmIntegrationsApiRef,\n} from '@backstage/integration-react';\nimport {\n EntityRefLinks,\n FavoriteEntity,\n getEntityRelations,\n getEntitySourceLocation,\n} from '@backstage/plugin-catalog-react';\nimport { BackstageTheme } from '@backstage/theme';\nimport {\n Box,\n Card,\n CardActions,\n CardContent,\n CardMedia,\n Chip,\n IconButton,\n Link,\n makeStyles,\n Tooltip,\n Typography,\n useTheme,\n} from '@material-ui/core';\nimport WarningIcon from '@material-ui/icons/Warning';\nimport React from 'react';\nimport { selectedTemplateRouteRef } from '../../routes';\n\nimport {\n Button,\n ItemCardHeader,\n MarkdownContent,\n} from '@backstage/core-components';\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\n\nconst useStyles = makeStyles(theme => ({\n cardHeader: {\n position: 'relative',\n },\n title: {\n backgroundImage: ({ backgroundImage }: any) => backgroundImage,\n },\n box: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: '-webkit-box',\n '-webkit-line-clamp': 10,\n '-webkit-box-orient': 'vertical',\n paddingBottom: '0.8em',\n },\n label: {\n color: theme.palette.text.secondary,\n textTransform: 'uppercase',\n fontSize: '0.65rem',\n fontWeight: 'bold',\n letterSpacing: 0.5,\n lineHeight: 1,\n paddingBottom: '0.2rem',\n },\n leftButton: {\n marginRight: 'auto',\n },\n starButton: {\n position: 'absolute',\n top: theme.spacing(0.5),\n right: theme.spacing(0.5),\n padding: '0.25rem',\n color: '#fff',\n },\n}));\n\nconst useDeprecationStyles = makeStyles(theme => ({\n deprecationIcon: {\n position: 'absolute',\n top: theme.spacing(0.5),\n right: theme.spacing(3.5),\n padding: '0.25rem',\n },\n link: {\n color: theme.palette.warning.light,\n },\n}));\n\nexport type TemplateCardProps = {\n template: TemplateEntityV1beta3;\n deprecated?: boolean;\n};\n\ntype TemplateProps = {\n description: string;\n tags: string[];\n title: string;\n type: string;\n name: string;\n};\n\nconst getTemplateCardProps = (\n template: TemplateEntityV1beta3,\n): TemplateProps & { key: string } => {\n return {\n key: template.metadata.uid!,\n name: template.metadata.name,\n title: `${(template.metadata.title || template.metadata.name) ?? ''}`,\n type: template.spec.type ?? '',\n description: template.metadata.description ?? '-',\n tags: (template.metadata?.tags as string[]) ?? [],\n };\n};\n\nconst DeprecationWarning = () => {\n const styles = useDeprecationStyles();\n\n const Title = (\n <Typography style={{ padding: 10, maxWidth: 300 }}>\n This template uses a syntax that has been deprecated, and should be\n migrated to a newer syntax. Click for more info.\n </Typography>\n );\n\n return (\n <div className={styles.deprecationIcon}>\n <Tooltip title={Title}>\n <Link\n href=\"https://backstage.io/docs/features/software-templates/migrating-from-v1beta2-to-v1beta3\"\n className={styles.link}\n >\n <WarningIcon />\n </Link>\n </Tooltip>\n </div>\n );\n};\n\nexport const TemplateCard = ({ template, deprecated }: TemplateCardProps) => {\n const backstageTheme = useTheme<BackstageTheme>();\n const templateRoute = useRouteRef(selectedTemplateRouteRef);\n const templateProps = getTemplateCardProps(template);\n const ownedByRelations = getEntityRelations(\n template as Entity,\n RELATION_OWNED_BY,\n );\n const themeId = backstageTheme.getPageTheme({ themeId: templateProps.type })\n ? templateProps.type\n : 'other';\n const theme = backstageTheme.getPageTheme({ themeId });\n const classes = useStyles({ backgroundImage: theme.backgroundImage });\n const href = templateRoute({ templateName: templateProps.name });\n\n const scmIntegrationsApi = useApi(scmIntegrationsApiRef);\n const sourceLocation = getEntitySourceLocation(template, scmIntegrationsApi);\n\n return (\n <Card>\n <CardMedia className={classes.cardHeader}>\n <FavoriteEntity className={classes.starButton} entity={template} />\n {deprecated && <DeprecationWarning />}\n <ItemCardHeader\n title={templateProps.title}\n subtitle={templateProps.type}\n classes={{ root: classes.title }}\n />\n </CardMedia>\n <CardContent style={{ display: 'grid' }}>\n <Box className={classes.box}>\n <Typography variant=\"body2\" className={classes.label}>\n Description\n </Typography>\n <MarkdownContent content={templateProps.description} />\n </Box>\n <Box className={classes.box}>\n <Typography variant=\"body2\" className={classes.label}>\n Owner\n </Typography>\n <EntityRefLinks entityRefs={ownedByRelations} defaultKind=\"Group\" />\n </Box>\n <Box>\n <Typography variant=\"body2\" className={classes.label}>\n Tags\n </Typography>\n {templateProps.tags?.map(tag => (\n <Chip size=\"small\" label={tag} key={tag} />\n ))}\n </Box>\n </CardContent>\n <CardActions>\n {sourceLocation && (\n <IconButton\n className={classes.leftButton}\n href={sourceLocation.locationTargetUrl}\n >\n <ScmIntegrationIcon type={sourceLocation.integrationType} />\n </IconButton>\n )}\n <Button\n color=\"primary\"\n to={href}\n aria-label={`Choose ${templateProps.title}`}\n >\n Choose\n </Button>\n </CardActions>\n </Card>\n );\n};\n","/*\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 React, { ComponentType } from 'react';\nimport { Entity, stringifyEntityRef } from '@backstage/catalog-model';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport {\n Content,\n ContentHeader,\n ItemCardGrid,\n Link,\n Progress,\n WarningPanel,\n} from '@backstage/core-components';\nimport { useEntityList } from '@backstage/plugin-catalog-react';\nimport { Typography } from '@material-ui/core';\nimport { TemplateCard } from '../TemplateCard';\n\n/**\n * @internal\n */\nexport type TemplateListProps = {\n TemplateCardComponent?:\n | ComponentType<{ template: TemplateEntityV1beta3 }>\n | undefined;\n group?: {\n title?: React.ReactNode;\n filter: (entity: Entity) => boolean;\n };\n};\n\n/**\n * @internal\n */\nexport const TemplateList = ({\n TemplateCardComponent,\n group,\n}: TemplateListProps) => {\n const { loading, error, entities } = useEntityList();\n const Card = TemplateCardComponent || TemplateCard;\n const maybeFilteredEntities = group\n ? entities.filter(e => group.filter(e))\n : entities;\n\n const titleComponent: React.ReactNode = (() => {\n if (group && group.title) {\n if (typeof group.title === 'string') {\n return <ContentHeader title={group.title} />;\n }\n return group.title;\n }\n\n return <ContentHeader title=\"Other Templates\" />;\n })();\n\n if (group && maybeFilteredEntities.length === 0) {\n return null;\n }\n return (\n <>\n {loading && <Progress />}\n\n {error && (\n <WarningPanel title=\"Oops! Something went wrong loading the templates\">\n {error.message}\n </WarningPanel>\n )}\n\n {!error && !loading && !entities.length && (\n <Typography variant=\"body2\">\n No templates found that match your filter. Learn more about{' '}\n <Link to=\"https://backstage.io/docs/features/software-templates/adding-templates\">\n adding templates\n </Link>\n .\n </Typography>\n )}\n\n <Content>\n {titleComponent}\n <ItemCardGrid>\n {maybeFilteredEntities &&\n maybeFilteredEntities?.length > 0 &&\n maybeFilteredEntities.map((template: Entity) => (\n <Card\n key={stringifyEntityRef(template)}\n template={template as TemplateEntityV1beta3}\n deprecated={template.apiVersion === 'backstage.io/v1beta2'}\n />\n ))}\n </ItemCardGrid>\n </Content>\n </>\n );\n};\n","/*\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 {\n Content,\n ContentHeader,\n CreateButton,\n Header,\n Page,\n SupportButton,\n} from '@backstage/core-components';\nimport { Entity } from '@backstage/catalog-model';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n CatalogFilterLayout,\n EntityKindPicker,\n EntityListProvider,\n EntitySearchBar,\n EntityTagPicker,\n UserListPicker,\n} from '@backstage/plugin-catalog-react';\nimport React, { ComponentType } from 'react';\nimport { registerComponentRouteRef } from '../../routes';\nimport { TemplateList } from '../TemplateList';\nimport { TemplateTypePicker } from '../TemplateTypePicker';\nimport { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common';\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nexport type ScaffolderPageProps = {\n TemplateCardComponent?:\n | ComponentType<{ template: TemplateEntityV1beta3 }>\n | undefined;\n groups?: Array<{\n title?: React.ReactNode;\n filter: (entity: Entity) => boolean;\n }>;\n};\n\nexport const ScaffolderPageContents = ({\n TemplateCardComponent,\n groups,\n}: ScaffolderPageProps) => {\n const registerComponentLink = useRouteRef(registerComponentRouteRef);\n const otherTemplatesGroup = {\n title: groups ? 'Other Templates' : 'Templates',\n filter: (entity: Entity) => {\n const filtered = (groups ?? []).map(group => group.filter(entity));\n return !filtered.some(result => result === true);\n },\n };\n\n const { allowed } = usePermission(catalogEntityCreatePermission);\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride=\"Create a New Component\"\n title=\"Create a New Component\"\n subtitle=\"Create new software components using standard templates\"\n />\n <Content>\n <ContentHeader title=\"Available Templates\">\n {allowed && (\n <CreateButton\n title=\"Register Existing Component\"\n to={registerComponentLink && registerComponentLink()}\n />\n )}\n <SupportButton>\n Create new software components using standard templates. Different\n templates create different kinds of components (services, websites,\n documentation, ...).\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 <TemplateTypePicker />\n <EntityTagPicker />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n {groups &&\n groups.map((group, index) => (\n <TemplateList\n key={index}\n TemplateCardComponent={TemplateCardComponent}\n group={group}\n />\n ))}\n <TemplateList\n key=\"other\"\n TemplateCardComponent={TemplateCardComponent}\n group={otherTemplatesGroup}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n </Content>\n </Page>\n );\n};\n\nexport const ScaffolderPage = ({\n TemplateCardComponent,\n groups,\n}: ScaffolderPageProps) => (\n <EntityListProvider>\n <ScaffolderPageContents\n TemplateCardComponent={TemplateCardComponent}\n groups={groups}\n />\n </EntityListProvider>\n);\n","/*\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 { JsonObject } from '@backstage/types';\nimport { FormProps } from '@rjsf/core';\n\nfunction isObject(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction extractUiSchema(schema: JsonObject, uiSchema: JsonObject) {\n if (!isObject(schema)) {\n return;\n }\n\n const { properties, items, anyOf, oneOf, allOf, dependencies } = schema;\n\n for (const propName in schema) {\n if (!schema.hasOwnProperty(propName)) {\n continue;\n }\n\n if (propName.startsWith('ui:')) {\n uiSchema[propName] = schema[propName];\n delete schema[propName];\n }\n }\n\n if (isObject(properties)) {\n for (const propName in properties) {\n if (!properties.hasOwnProperty(propName)) {\n continue;\n }\n\n const schemaNode = properties[propName];\n if (!isObject(schemaNode)) {\n continue;\n }\n const innerUiSchema = {};\n uiSchema[propName] = innerUiSchema;\n extractUiSchema(schemaNode, innerUiSchema);\n }\n }\n\n if (isObject(items)) {\n const innerUiSchema = {};\n uiSchema.items = innerUiSchema;\n extractUiSchema(items, innerUiSchema);\n }\n\n if (Array.isArray(anyOf)) {\n for (const schemaNode of anyOf) {\n if (!isObject(schemaNode)) {\n continue;\n }\n extractUiSchema(schemaNode, uiSchema);\n }\n }\n\n if (Array.isArray(oneOf)) {\n for (const schemaNode of oneOf) {\n if (!isObject(schemaNode)) {\n continue;\n }\n extractUiSchema(schemaNode, uiSchema);\n }\n }\n\n if (Array.isArray(allOf)) {\n for (const schemaNode of allOf) {\n if (!isObject(schemaNode)) {\n continue;\n }\n extractUiSchema(schemaNode, uiSchema);\n }\n }\n\n if (isObject(dependencies)) {\n for (const depName of Object.keys(dependencies)) {\n const schemaNode = dependencies[depName];\n if (!isObject(schemaNode)) {\n continue;\n }\n extractUiSchema(schemaNode, uiSchema);\n }\n }\n}\n\nexport function transformSchemaToProps(inputSchema: JsonObject): {\n schema: FormProps<any>['schema'];\n uiSchema: FormProps<any>['uiSchema'];\n} {\n inputSchema.type = inputSchema.type || 'object';\n const schema = JSON.parse(JSON.stringify(inputSchema));\n delete schema.title; // Rendered separately\n const uiSchema = {};\n extractUiSchema(schema, uiSchema);\n return { schema, uiSchema };\n}\n","/*\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 React from 'react';\nimport { MarkdownContent } from '@backstage/core-components';\nimport { FieldProps } from '@rjsf/core';\n\nexport const DescriptionField = ({ description }: FieldProps) =>\n description && <MarkdownContent content={description} linkTarget=\"_blank\" />;\n","/*\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 */\nimport { JsonObject } from '@backstage/types';\nimport {\n Box,\n Button,\n Paper,\n Step as StepUI,\n StepContent,\n StepLabel,\n Stepper,\n Typography,\n} from '@material-ui/core';\nimport {\n errorApiRef,\n useApi,\n featureFlagsApiRef,\n} from '@backstage/core-plugin-api';\nimport { FormProps, IChangeEvent, UiSchema, withTheme } from '@rjsf/core';\nimport { Theme as MuiTheme } from '@rjsf/material-ui';\nimport React, { useState } from 'react';\nimport { transformSchemaToProps } from './schema';\nimport { Content, StructuredMetadataTable } from '@backstage/core-components';\nimport cloneDeep from 'lodash/cloneDeep';\nimport * as fieldOverrides from './FieldOverrides';\n\nconst Form = withTheme(MuiTheme);\ntype Step = {\n schema: JsonObject;\n title: string;\n} & Partial<Omit<FormProps<any>, 'schema'>>;\n\ntype Props = {\n /**\n * Steps for the form, each contains title and form schema\n */\n steps: Step[];\n formData: Record<string, any>;\n onChange: (e: IChangeEvent) => void;\n onReset: () => void;\n onFinish?: () => Promise<void>;\n widgets?: FormProps<any>['widgets'];\n fields?: FormProps<any>['fields'];\n};\n\nexport function getUiSchemasFromSteps(steps: Step[]): UiSchema[] {\n const uiSchemas: Array<UiSchema> = [];\n steps.forEach(step => {\n const schemaProps = step.schema.properties as JsonObject;\n for (const key in schemaProps) {\n if (schemaProps.hasOwnProperty(key)) {\n const uiSchema = schemaProps[key] as UiSchema;\n uiSchema.name = key;\n uiSchemas.push(uiSchema);\n }\n }\n });\n return uiSchemas;\n}\n\nexport function getReviewData(formData: Record<string, any>, steps: Step[]) {\n const uiSchemas = getUiSchemasFromSteps(steps);\n const reviewData: Record<string, any> = {};\n for (const key in formData) {\n if (formData.hasOwnProperty(key)) {\n const uiSchema = uiSchemas.find(us => us.name === key);\n\n if (!uiSchema) {\n reviewData[key] = formData[key];\n continue;\n }\n\n if (uiSchema['ui:widget'] === 'password') {\n reviewData[key] = '******';\n continue;\n }\n\n if (!uiSchema['ui:backstage'] || !uiSchema['ui:backstage'].review) {\n reviewData[key] = formData[key];\n continue;\n }\n\n const review = uiSchema['ui:backstage'].review as JsonObject;\n if (!review.show) {\n continue;\n }\n\n if (review.mask) {\n reviewData[key] = review.mask;\n continue;\n }\n reviewData[key] = formData[key];\n }\n }\n\n return reviewData;\n}\n\nexport const MultistepJsonForm = (props: Props) => {\n const { formData, onChange, onReset, onFinish, fields, widgets } = props;\n const [activeStep, setActiveStep] = useState(0);\n const [disableButtons, setDisableButtons] = useState(false);\n const errorApi = useApi(errorApiRef);\n const featureFlagApi = useApi(featureFlagsApiRef);\n const featureFlagKey = 'backstage:featureFlag';\n const filterOutProperties = (step: Step): Step => {\n const filteredStep = cloneDeep(step);\n const removedPropertyKeys: Array<string> = [];\n if (filteredStep.schema.properties) {\n filteredStep.schema.properties = Object.fromEntries(\n Object.entries(filteredStep.schema.properties).filter(\n ([key, value]) => {\n if (value[featureFlagKey]) {\n if (featureFlagApi.isActive(value[featureFlagKey])) {\n return true;\n }\n removedPropertyKeys.push(key);\n return false;\n }\n return true;\n },\n ),\n );\n\n // remove the feature flag property key from required if they are not active\n filteredStep.schema.required = Array.isArray(filteredStep.schema.required)\n ? filteredStep.schema.required?.filter(\n r => !removedPropertyKeys.includes(r as string),\n )\n : filteredStep.schema.required;\n }\n return filteredStep;\n };\n\n const steps = props.steps\n .filter(step => {\n const featureFlag = step.schema[featureFlagKey];\n return (\n typeof featureFlag !== 'string' || featureFlagApi.isActive(featureFlag)\n );\n })\n .map(filterOutProperties);\n\n const handleReset = () => {\n setActiveStep(0);\n onReset();\n };\n const handleNext = () => {\n setActiveStep(Math.min(activeStep + 1, steps.length));\n };\n const handleBack = () => setActiveStep(Math.max(activeStep - 1, 0));\n const handleCreate = async () => {\n if (!onFinish) {\n return;\n }\n\n setDisableButtons(true);\n try {\n await onFinish();\n } catch (err) {\n setDisableButtons(false);\n errorApi.post(err);\n }\n };\n\n return (\n <>\n <Stepper activeStep={activeStep} orientation=\"vertical\">\n {steps.map(({ title, schema, ...formProps }, index) => {\n return (\n <StepUI key={title}>\n <StepLabel\n aria-label={`Step ${index + 1} ${title}`}\n aria-disabled=\"false\"\n tabIndex={0}\n >\n <Typography variant=\"h6\" component=\"h3\">\n {title}\n </Typography>\n </StepLabel>\n <StepContent key={title}>\n <Form\n showErrorList={false}\n fields={{ ...fieldOverrides, ...fields }}\n widgets={widgets}\n noHtml5Validate\n formData={formData}\n onChange={onChange}\n onSubmit={e => {\n if (e.errors.length === 0) handleNext();\n }}\n {...formProps}\n {...transformSchemaToProps(schema)}\n >\n <Button disabled={activeStep === 0} onClick={handleBack}>\n Back\n </Button>\n <Button variant=\"contained\" color=\"primary\" type=\"submit\">\n Next step\n </Button>\n </Form>\n </StepContent>\n </StepUI>\n );\n })}\n </Stepper>\n {activeStep === steps.length && (\n <Content>\n <Paper square elevation={0}>\n <Typography variant=\"h6\">Review and create</Typography>\n <StructuredMetadataTable\n dense\n metadata={getReviewData(formData, steps)}\n />\n <Box mb={4} />\n <Button onClick={handleBack} disabled={disableButtons}>\n Back\n </Button>\n <Button onClick={handleReset} disabled={disableButtons}>\n Reset\n </Button>\n <Button\n variant=\"contained\"\n color=\"primary\"\n onClick={handleCreate}\n disabled={!onFinish || disableButtons}\n >\n Create\n </Button>\n </Paper>\n </Content>\n )}\n </>\n );\n};\n","/*\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 */\nimport { JsonObject, JsonValue } from '@backstage/types';\nimport { LinearProgress } from '@material-ui/core';\nimport { FormValidation, IChangeEvent } from '@rjsf/core';\nimport qs from 'qs';\nimport React, { useCallback, useContext, useState } from 'react';\nimport { Navigate, useNavigate } from 'react-router';\nimport { useParams } from 'react-router-dom';\nimport useAsync from 'react-use/lib/useAsync';\nimport { scaffolderApiRef } from '../../api';\nimport { CustomFieldValidator, FieldExtensionOptions } from '../../extensions';\nimport { SecretsContext } from '../secrets/SecretsContext';\nimport { rootRouteRef, scaffolderTaskRouteRef } from '../../routes';\nimport { MultistepJsonForm } from '../MultistepJsonForm';\n\nimport { Content, Header, InfoCard, Page } from '@backstage/core-components';\nimport {\n ApiHolder,\n errorApiRef,\n useApi,\n useApiHolder,\n useRouteRef,\n} from '@backstage/core-plugin-api';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\n\nconst useTemplateParameterSchema = (templateRef: string) => {\n const scaffolderApi = useApi(scaffolderApiRef);\n const { value, loading, error } = useAsync(\n () => scaffolderApi.getTemplateParameterSchema(templateRef),\n [scaffolderApi, templateRef],\n );\n return { schema: value, loading, error };\n};\n\nfunction isObject(obj: unknown): obj is JsonObject {\n return typeof obj === 'object' && obj !== null && !Array.isArray(obj);\n}\n\nexport const createValidator = (\n rootSchema: JsonObject,\n validators: Record<string, undefined | CustomFieldValidator<unknown>>,\n context: {\n apiHolder: ApiHolder;\n },\n) => {\n function validate(\n schema: JsonObject,\n formData: JsonObject,\n errors: FormValidation,\n ) {\n const schemaProps = schema.properties;\n if (!isObject(schemaProps)) {\n return;\n }\n\n for (const [key, propData] of Object.entries(formData)) {\n const propValidation = errors[key];\n\n if (isObject(propData)) {\n const propSchemaProps = schemaProps[key];\n if (isObject(propSchemaProps)) {\n validate(\n propSchemaProps,\n propData as JsonObject,\n propValidation as FormValidation,\n );\n }\n } else {\n const propSchema = schemaProps[key];\n const fieldName =\n isObject(propSchema) && (propSchema['ui:field'] as string);\n if (fieldName && typeof validators[fieldName] === 'function') {\n validators[fieldName]!(\n propData as JsonValue,\n propValidation,\n context,\n );\n }\n }\n }\n }\n\n return (formData: JsonObject, errors: FormValidation) => {\n validate(rootSchema, formData, errors);\n return errors;\n };\n};\n\nexport const TemplatePage = ({\n customFieldExtensions = [],\n}: {\n customFieldExtensions?: FieldExtensionOptions<any, any>[];\n}) => {\n const apiHolder = useApiHolder();\n const secretsContext = useContext(SecretsContext);\n const errorApi = useApi(errorApiRef);\n const scaffolderApi = useApi(scaffolderApiRef);\n const { templateName } = useParams();\n const navigate = useNavigate();\n const scaffolderTaskRoute = useRouteRef(scaffolderTaskRouteRef);\n const rootRoute = useRouteRef(rootRouteRef);\n const { schema, loading, error } = useTemplateParameterSchema(templateName);\n const [formState, setFormState] = useState<Record<string, any>>(() => {\n const query = qs.parse(window.location.search, {\n ignoreQueryPrefix: true,\n });\n\n try {\n return JSON.parse(query.formData as string);\n } catch (e) {\n return query.formData ?? {};\n }\n });\n const handleFormReset = () => setFormState({});\n const handleChange = useCallback(\n (e: IChangeEvent) => setFormState(e.formData),\n [setFormState],\n );\n\n const handleCreate = async () => {\n const { taskId } = await scaffolderApi.scaffold({\n templateRef: stringifyEntityRef({\n name: templateName,\n kind: 'template',\n namespace: 'default',\n }),\n values: formState,\n secrets: secretsContext?.secrets,\n });\n\n const formParams = qs.stringify(\n { formData: formState },\n { addQueryPrefix: true },\n );\n const newUrl = `${window.location.pathname}${formParams}`;\n // We use direct history manipulation since useSearchParams and\n // useNavigate in react-router-dom cause unnecessary extra rerenders.\n // Also make sure to replace the state rather than pushing to avoid\n // extra back/forward slots.\n window.history?.replaceState(null, document.title, newUrl);\n\n navigate(scaffolderTaskRoute({ taskId }));\n };\n\n if (error) {\n errorApi.post(new Error(`Failed to load template, ${error}`));\n return <Navigate to={rootRoute()} />;\n }\n if (!loading && !schema) {\n errorApi.post(new Error('Template was not found.'));\n return <Navigate to={rootRoute()} />;\n }\n\n const customFieldComponents = Object.fromEntries(\n customFieldExtensions.map(({ name, component }) => [name, component]),\n );\n\n const customFieldValidators = Object.fromEntries(\n customFieldExtensions.map(({ name, validation }) => [name, validation]),\n );\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride=\"Create a New Component\"\n title=\"Create a New Component\"\n subtitle=\"Create new software components using standard templates\"\n />\n <Content>\n {loading && <LinearProgress data-testid=\"loading-progress\" />}\n {schema && (\n <InfoCard\n title={schema.title}\n noPadding\n titleTypographyProps={{ component: 'h2' }}\n >\n <MultistepJsonForm\n formData={formState}\n fields={customFieldComponents}\n onChange={handleChange}\n onReset={handleFormReset}\n onFinish={handleCreate}\n steps={schema.steps.map(step => {\n return {\n ...step,\n validate: createValidator(\n step.schema,\n customFieldValidators,\n { apiHolder },\n ),\n };\n })}\n />\n </InfoCard>\n )}\n </Content>\n </Page>\n );\n};\n","/*\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 React from 'react';\nimport useAsync from 'react-use/lib/useAsync';\nimport { scaffolderApiRef } from '../../api';\nimport {\n Typography,\n Paper,\n Table,\n TableBody,\n Box,\n TableCell,\n TableContainer,\n TableHead,\n TableRow,\n makeStyles,\n} from '@material-ui/core';\nimport { JSONSchema7, JSONSchema7Definition } from 'json-schema';\nimport classNames from 'classnames';\n\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n Progress,\n Content,\n Header,\n Page,\n ErrorPage,\n} from '@backstage/core-components';\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}));\n\nexport const ActionsPage = () => {\n const api = useApi(scaffolderApiRef);\n const classes = useStyles();\n const { loading, value, error } = useAsync(async () => {\n return api.listActions();\n });\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n return (\n <ErrorPage\n statusMessage=\"Failed to load installed actions\"\n status=\"500\"\n />\n );\n }\n\n const formatRows = (input: JSONSchema7) => {\n const properties = input.properties;\n if (!properties) {\n return undefined;\n }\n\n return Object.entries(properties).map(entry => {\n const [key] = entry;\n const props = entry[1] as unknown as JSONSchema7;\n const codeClassname = classNames(classes.code, {\n [classes.codeRequired]: input.required?.includes(key),\n });\n\n return (\n <TableRow key={key}>\n <TableCell>\n <div className={codeClassname}>{key}</div>\n </TableCell>\n <TableCell>{props.title}</TableCell>\n <TableCell>{props.description}</TableCell>\n <TableCell>\n <span className={classes.code}>{props.type}</span>\n </TableCell>\n </TableRow>\n );\n });\n };\n\n const renderTable = (input: JSONSchema7) => {\n if (!input.properties) {\n return undefined;\n }\n return (\n <TableContainer component={Paper}>\n <Table size=\"small\">\n <TableHead>\n <TableRow>\n <TableCell>Name</TableCell>\n <TableCell>Title</TableCell>\n <TableCell>Description</TableCell>\n <TableCell>Type</TableCell>\n </TableRow>\n </TableHead>\n <TableBody>{formatRows(input)}</TableBody>\n </Table>\n </TableContainer>\n );\n };\n\n const renderTables = (name: string, input?: JSONSchema7Definition[]) => {\n if (!input) {\n return undefined;\n }\n\n return (\n <>\n <Typography variant=\"h6\">{name}</Typography>\n {input.map((i, index) => (\n <div key={index}>{renderTable(i as unknown as JSONSchema7)}</div>\n ))}\n </>\n );\n };\n\n const items = value?.map(action => {\n if (action.id.startsWith('legacy:')) {\n return undefined;\n }\n\n const oneOf = renderTables('oneOf', action.schema?.input?.oneOf);\n return (\n <Box pb={4} key={action.id}>\n <Typography variant=\"h4\" className={classes.code}>\n {action.id}\n </Typography>\n <Typography>{action.description}</Typography>\n {action.schema?.input && (\n <Box pb={2}>\n <Typography variant=\"h5\">Input</Typography>\n {renderTable(action.schema.input)}\n {oneOf}\n </Box>\n )}\n {action.schema?.output && (\n <Box pb={2}>\n <Typography variant=\"h5\">Output</Typography>\n {renderTable(action.schema.output)}\n </Box>\n )}\n </Box>\n );\n });\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride=\"Create a New Component\"\n title=\"Installed actions\"\n subtitle=\"This is the collection of all installed actions\"\n />\n <Content>{items}</Content>\n </Page>\n );\n};\n","/*\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, { useCallback, useState } from 'react';\nimport useAsync from 'react-use/lib/useAsync';\nimport useDebounce from 'react-use/lib/useDebounce';\nimport { Entity } from '@backstage/catalog-model';\nimport { Content, Header, InfoCard, Page } from '@backstage/core-components';\nimport { alertApiRef, useApi, useApiHolder } from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n humanizeEntityRef,\n} from '@backstage/plugin-catalog-react';\nimport { JsonObject } from '@backstage/types';\nimport { yaml as yamlSupport } from '@codemirror/legacy-modes/mode/yaml';\nimport { showPanel } from '@codemirror/panel';\nimport { StreamLanguage } from '@codemirror/stream-parser';\nimport {\n FormControl,\n Grid,\n InputLabel,\n LinearProgress,\n makeStyles,\n MenuItem,\n Select,\n} from '@material-ui/core';\nimport { IChangeEvent } from '@rjsf/core';\nimport CodeMirror from '@uiw/react-codemirror';\nimport yaml from 'yaml';\nimport { FieldExtensionOptions } from '../../extensions';\nimport { TemplateParameterSchema } from '../../types';\nimport { MultistepJsonForm } from '../MultistepJsonForm';\nimport { createValidator } from '../TemplatePage';\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 allowedKinds:\n - 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\n`;\n\ntype TemplateOption = {\n label: string;\n value: Entity;\n};\n\nconst useStyles = makeStyles({\n templateSelect: {\n marginBottom: '10px',\n },\n grid: {\n height: '100%',\n },\n codeMirror: {\n height: '95%',\n },\n});\n\nexport const TemplatePreviewPage = ({\n defaultPreviewTemplate = EXAMPLE_TEMPLATE_PARAMS_YAML,\n customFieldExtensions = [],\n}: {\n defaultPreviewTemplate?: string;\n customFieldExtensions?: FieldExtensionOptions<any, any>[];\n}) => {\n const classes = useStyles();\n const alertApi = useApi(alertApiRef);\n const catalogApi = useApi(catalogApiRef);\n const apiHolder = useApiHolder();\n const [selectedTemplate, setSelectedTemplate] = useState('');\n const [schema, setSchema] = useState<TemplateParameterSchema>({\n title: '',\n steps: [],\n });\n const [templateOptions, setTemplateOptions] = useState<TemplateOption[]>([]);\n const [templateYaml, setTemplateYaml] = useState(defaultPreviewTemplate);\n const [formState, setFormState] = useState({});\n\n const { loading } = 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 ],\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 exisiting templates: ${e.message}`,\n severity: 'error',\n }),\n ),\n [catalogApi],\n );\n\n const errorPanel = document.createElement('div');\n errorPanel.style.color = 'red';\n\n useDebounce(\n () => {\n try {\n const parsedTemplate = yaml.parse(templateYaml);\n\n setSchema({\n title: 'Preview',\n steps: parsedTemplate.parameters.map((param: JsonObject) => ({\n title: param.title,\n schema: param,\n })),\n });\n setFormState({});\n } catch (e) {\n errorPanel.textContent = e.message;\n }\n },\n 250,\n [setFormState, setSchema, templateYaml],\n );\n\n const handleSelectChange = useCallback(\n selected => {\n setSelectedTemplate(selected);\n setTemplateYaml(yaml.stringify(selected.spec));\n },\n [setTemplateYaml],\n );\n\n const handleFormReset = () => setFormState({});\n const handleFormChange = useCallback(\n (e: IChangeEvent) => setFormState(e.formData),\n [setFormState],\n );\n\n const handleCodeChange = useCallback(\n (code: string) => {\n setTemplateYaml(code);\n },\n [setTemplateYaml],\n );\n\n const customFieldComponents = Object.fromEntries(\n customFieldExtensions.map(({ name, component }) => [name, component]),\n );\n\n const customFieldValidators = Object.fromEntries(\n customFieldExtensions.map(({ name, validation }) => [name, validation]),\n );\n\n return (\n <Page themeId=\"home\">\n <Header\n title=\"Template Preview\"\n subtitle=\"Preview your template parameter UI\"\n />\n <Content>\n {loading && <LinearProgress />}\n <Grid container className={classes.grid}>\n <Grid item xs={6}>\n <FormControl\n className={classes.templateSelect}\n variant=\"outlined\"\n fullWidth\n >\n <InputLabel id=\"select-template-label\">\n Load Existing Template\n </InputLabel>\n <Select\n value={selectedTemplate}\n label=\"Load Existing Template\"\n labelId=\"select-template-label\"\n onChange={e => handleSelectChange(e.target.value)}\n >\n {templateOptions.map((option, idx) => (\n <MenuItem key={idx} value={option.value as any}>\n {option.label}\n </MenuItem>\n ))}\n </Select>\n </FormControl>\n <CodeMirror\n className={classes.codeMirror}\n value={templateYaml}\n theme=\"dark\"\n height=\"100%\"\n extensions={[\n StreamLanguage.define(yamlSupport),\n showPanel.of(() => ({ dom: errorPanel, top: true })),\n ]}\n onChange={handleCodeChange}\n />\n </Grid>\n <Grid item xs={6}>\n {schema && (\n <InfoCard key={JSON.stringify(schema)}>\n <MultistepJsonForm\n formData={formState}\n fields={customFieldComponents}\n onChange={handleFormChange}\n onReset={handleFormReset}\n steps={schema.steps.map(step => {\n return {\n ...step,\n validate: createValidator(\n step.schema,\n customFieldValidators,\n { apiHolder },\n ),\n };\n })}\n />\n </InfoCard>\n )}\n </Grid>\n </Grid>\n </Content>\n </Page>\n );\n};\n","/*\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 React, { ComponentType } from 'react';\nimport { Routes, Route, useOutlet } from 'react-router';\nimport { Entity } from '@backstage/catalog-model';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { ScaffolderPage } from './ScaffolderPage';\nimport { TemplatePage } from './TemplatePage';\nimport { TaskPage } from './TaskPage';\nimport { ActionsPage } from './ActionsPage';\nimport { SecretsContextProvider } from './secrets/SecretsContext';\nimport { TemplatePreviewPage } from './TemplatePreviewPage';\n\nimport {\n FieldExtensionOptions,\n FIELD_EXTENSION_WRAPPER_KEY,\n FIELD_EXTENSION_KEY,\n DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS,\n} from '../extensions';\nimport { useElementFilter } from '@backstage/core-plugin-api';\n\n/**\n * The props for the entrypoint `ScaffolderPage` component the plugin.\n * @public\n */\nexport type RouterProps = {\n components?: {\n TemplateCardComponent?:\n | ComponentType<{ template: TemplateEntityV1beta3 }>\n | undefined;\n TaskPageComponent?: ComponentType<{}>;\n };\n groups?: Array<{\n title?: React.ReactNode;\n filter: (entity: Entity) => boolean;\n }>;\n defaultPreviewTemplate?: string;\n};\n\n/**\n * The main entrypoint `Router` for the `ScaffolderPlugin`.\n *\n * @public\n */\nexport const Router = (props: RouterProps) => {\n const { groups, components = {}, defaultPreviewTemplate } = props;\n\n const { TemplateCardComponent, TaskPageComponent } = components;\n\n const outlet = useOutlet();\n const TaskPageElement = TaskPageComponent ?? TaskPage;\n\n const customFieldExtensions = useElementFilter(outlet, elements =>\n elements\n .selectByComponentData({\n key: FIELD_EXTENSION_WRAPPER_KEY,\n })\n .findComponentData<FieldExtensionOptions>({\n key: FIELD_EXTENSION_KEY,\n }),\n );\n\n const fieldExtensions = [\n ...customFieldExtensions,\n ...DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS.filter(\n ({ name }) =>\n !customFieldExtensions.some(\n customFieldExtension => customFieldExtension.name === name,\n ),\n ),\n ];\n\n return (\n <Routes>\n <Route\n path=\"/\"\n element={\n <ScaffolderPage\n groups={groups}\n TemplateCardComponent={TemplateCardComponent}\n />\n }\n />\n <Route\n path=\"/templates/:templateName\"\n element={\n <SecretsContextProvider>\n <TemplatePage customFieldExtensions={fieldExtensions} />\n </SecretsContextProvider>\n }\n />\n <Route path=\"/tasks/:taskId\" element={<TaskPageElement />} />\n <Route path=\"/actions\" element={<ActionsPage />} />\n <Route\n path=\"/preview\"\n element={\n <SecretsContextProvider>\n <TemplatePreviewPage\n defaultPreviewTemplate={defaultPreviewTemplate}\n customFieldExtensions={fieldExtensions}\n />\n </SecretsContextProvider>\n }\n />\n </Routes>\n );\n};\n"],"names":["useStyles","Link","isObject","MuiTheme","StepUI","Button","yamlSupport"],"mappings":"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"}
@@ -15,7 +15,7 @@ import { scmIntegrationsApiRef, scmAuthApiRef } from '@backstage/integration-rea
15
15
  import FormHelperText from '@material-ui/core/FormHelperText';
16
16
  import Input from '@material-ui/core/Input';
17
17
  import InputLabel from '@material-ui/core/InputLabel';
18
- import { Select, Progress, Link, Page, Header, Lifecycle, Content, ErrorPage, LogViewer } from '@backstage/core-components';
18
+ import { Select, Progress, Link, Page, Header, Content, ErrorPage, LogViewer } from '@backstage/core-components';
19
19
  import useDebounce from 'react-use/lib/useDebounce';
20
20
  import capitalize from 'lodash/capitalize';
21
21
  import CheckBoxIcon from '@material-ui/icons/CheckBox';
@@ -839,7 +839,7 @@ const OwnerPickerFieldExtension = scaffolderPlugin.provide(createScaffolderField
839
839
  }));
840
840
  const ScaffolderPage = scaffolderPlugin.provide(createRoutableExtension({
841
841
  name: "ScaffolderPage",
842
- component: () => import('./Router-47c9a9ee.esm.js').then((m) => m.Router),
842
+ component: () => import('./Router-773d053b.esm.js').then((m) => m.Router),
843
843
  mountPoint: rootRouteRef
844
844
  }));
845
845
  const OwnedEntityPickerFieldExtension = scaffolderPlugin.provide(createScaffolderFieldExtension({
@@ -1254,10 +1254,7 @@ const TaskPage = ({ loadingText }) => {
1254
1254
  themeId: "home"
1255
1255
  }, /* @__PURE__ */ React.createElement(Header, {
1256
1256
  pageTitleOverride: `Task ${taskId}`,
1257
- title: /* @__PURE__ */ React.createElement(React.Fragment, null, "Task Activity ", /* @__PURE__ */ React.createElement(Lifecycle, {
1258
- alpha: true,
1259
- shorthand: true
1260
- })),
1257
+ title: "Task Activity",
1261
1258
  subtitle: `Activity for task: ${taskId}`
1262
1259
  }), /* @__PURE__ */ React.createElement(Content, null, taskNotFound ? /* @__PURE__ */ React.createElement(ErrorPage, {
1263
1260
  status: "404",
@@ -1291,4 +1288,4 @@ const TaskPage = ({ loadingText }) => {
1291
1288
  };
1292
1289
 
1293
1290
  export { EntityPicker as E, FIELD_EXTENSION_WRAPPER_KEY as F, OwnerPicker as O, RepoUrlPicker as R, SecretsContext as S, TemplateTypePicker as T, EntityNamePicker as a, EntityTagsPicker as b, OwnedEntityPicker as c, registerComponentRouteRef as d, entityNamePickerValidation as e, scaffolderApiRef as f, scaffolderTaskRouteRef as g, rootRouteRef as h, FIELD_EXTENSION_KEY as i, SecretsContextProvider as j, TaskPage as k, ScaffolderClient as l, createScaffolderFieldExtension as m, ScaffolderFieldExtensions as n, EntityPickerFieldExtension as o, EntityNamePickerFieldExtension as p, EntityTagsPickerFieldExtension as q, repoPickerValidation as r, selectedTemplateRouteRef as s, OwnerPickerFieldExtension as t, OwnedEntityPickerFieldExtension as u, RepoUrlPickerFieldExtension as v, ScaffolderPage as w, scaffolderPlugin as x, useTemplateSecrets as y };
1294
- //# sourceMappingURL=index-ced3b204.esm.js.map
1291
+ //# sourceMappingURL=index-25fdb62e.esm.js.map