@backstage/plugin-scaffolder 1.8.0-next.1 → 1.9.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.
- package/CHANGELOG.md +73 -0
- package/alpha/package.json +1 -1
- package/dist/esm/{Router-ace3f7b5.esm.js → Router-c72ed8e0.esm.js} +580 -389
- package/dist/esm/Router-c72ed8e0.esm.js.map +1 -0
- package/dist/esm/{index-f147ab7f.esm.js → index-36d7755a.esm.js} +24 -96
- package/dist/esm/index-36d7755a.esm.js.map +1 -0
- package/dist/esm/{index-68c01d69.esm.js → index-ed1a1fba.esm.js} +112 -11
- package/dist/esm/index-ed1a1fba.esm.js.map +1 -0
- package/dist/esm/schema-b28a29ab.esm.js +126 -0
- package/dist/esm/schema-b28a29ab.esm.js.map +1 -0
- package/dist/index.alpha.d.ts +157 -46
- package/dist/index.beta.d.ts +154 -45
- package/dist/index.d.ts +154 -45
- package/dist/index.esm.js +3 -1
- package/dist/index.esm.js.map +1 -1
- package/package.json +27 -25
- package/dist/esm/Router-ace3f7b5.esm.js.map +0 -1
- package/dist/esm/default-08d14dbd.esm.js +0 -33
- package/dist/esm/default-08d14dbd.esm.js.map +0 -1
- package/dist/esm/index-68c01d69.esm.js.map +0 -1
- package/dist/esm/index-f147ab7f.esm.js.map +0 -1
|
@@ -16,19 +16,22 @@ import { Link } from 'react-router-dom';
|
|
|
16
16
|
import AddCircleOutline from '@material-ui/icons/AddCircleOutline';
|
|
17
17
|
import { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common';
|
|
18
18
|
import { usePermission } from '@backstage/plugin-permission-react';
|
|
19
|
-
import {
|
|
19
|
+
import { B as nextSelectedTemplateRouteRef, v as viewTechDocRouteRef, r as registerComponentRouteRef, s as selectedTemplateRouteRef, C as nextRouteRef, d as scaffolderTaskRouteRef, S as SecretsContext, c as scaffolderApiRef, F as FIELD_EXTENSION_WRAPPER_KEY, i as FIELD_EXTENSION_KEY, k as SecretsContextProvider } from './index-ed1a1fba.esm.js';
|
|
20
20
|
import { RELATION_OWNED_BY, parseEntityRef, stringifyEntityRef, DEFAULT_NAMESPACE } from '@backstage/catalog-model';
|
|
21
21
|
import LanguageIcon from '@material-ui/icons/Language';
|
|
22
22
|
import useAsync from 'react-use/lib/useAsync';
|
|
23
23
|
import { withTheme } from '@rjsf/core-v5';
|
|
24
24
|
import { Draft07 } from 'json-schema-library';
|
|
25
|
+
import { c as createFieldValidation, e as extractSchemaFromStep, D as DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS } from './schema-b28a29ab.esm.js';
|
|
25
26
|
import validator from '@rjsf/validator-ajv8';
|
|
26
|
-
import {
|
|
27
|
+
import { getDefaultFormState } from '@rjsf/utils';
|
|
27
28
|
import '@backstage/errors';
|
|
28
29
|
import 'qs';
|
|
29
30
|
import 'zen-observable';
|
|
30
31
|
import '@material-ui/core/FormControl';
|
|
31
32
|
import '@material-ui/lab/Autocomplete';
|
|
33
|
+
import 'zod';
|
|
34
|
+
import 'zod-to-json-schema';
|
|
32
35
|
import 'react-use/lib/useEffectOnce';
|
|
33
36
|
import '@backstage/integration-react';
|
|
34
37
|
import '@material-ui/core/FormHelperText';
|
|
@@ -386,93 +389,6 @@ const TemplateListPage = (props) => {
|
|
|
386
389
|
}))))));
|
|
387
390
|
};
|
|
388
391
|
|
|
389
|
-
function isObject(value) {
|
|
390
|
-
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
391
|
-
}
|
|
392
|
-
function extractUiSchema(schema, uiSchema) {
|
|
393
|
-
if (!isObject(schema)) {
|
|
394
|
-
return;
|
|
395
|
-
}
|
|
396
|
-
const { properties, items, anyOf, oneOf, allOf, dependencies } = schema;
|
|
397
|
-
for (const propName in schema) {
|
|
398
|
-
if (!schema.hasOwnProperty(propName)) {
|
|
399
|
-
continue;
|
|
400
|
-
}
|
|
401
|
-
if (propName.startsWith("ui:")) {
|
|
402
|
-
uiSchema[propName] = schema[propName];
|
|
403
|
-
delete schema[propName];
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
if (isObject(properties)) {
|
|
407
|
-
for (const propName in properties) {
|
|
408
|
-
if (!properties.hasOwnProperty(propName)) {
|
|
409
|
-
continue;
|
|
410
|
-
}
|
|
411
|
-
const schemaNode = properties[propName];
|
|
412
|
-
if (!isObject(schemaNode)) {
|
|
413
|
-
continue;
|
|
414
|
-
}
|
|
415
|
-
const innerUiSchema = {};
|
|
416
|
-
uiSchema[propName] = innerUiSchema;
|
|
417
|
-
extractUiSchema(schemaNode, innerUiSchema);
|
|
418
|
-
}
|
|
419
|
-
}
|
|
420
|
-
if (isObject(items)) {
|
|
421
|
-
const innerUiSchema = {};
|
|
422
|
-
uiSchema.items = innerUiSchema;
|
|
423
|
-
extractUiSchema(items, innerUiSchema);
|
|
424
|
-
}
|
|
425
|
-
if (Array.isArray(anyOf)) {
|
|
426
|
-
for (const schemaNode of anyOf) {
|
|
427
|
-
if (!isObject(schemaNode)) {
|
|
428
|
-
continue;
|
|
429
|
-
}
|
|
430
|
-
extractUiSchema(schemaNode, uiSchema);
|
|
431
|
-
}
|
|
432
|
-
}
|
|
433
|
-
if (Array.isArray(oneOf)) {
|
|
434
|
-
for (const schemaNode of oneOf) {
|
|
435
|
-
if (!isObject(schemaNode)) {
|
|
436
|
-
continue;
|
|
437
|
-
}
|
|
438
|
-
extractUiSchema(schemaNode, uiSchema);
|
|
439
|
-
}
|
|
440
|
-
}
|
|
441
|
-
if (Array.isArray(allOf)) {
|
|
442
|
-
for (const schemaNode of allOf) {
|
|
443
|
-
if (!isObject(schemaNode)) {
|
|
444
|
-
continue;
|
|
445
|
-
}
|
|
446
|
-
extractUiSchema(schemaNode, uiSchema);
|
|
447
|
-
}
|
|
448
|
-
}
|
|
449
|
-
if (isObject(dependencies)) {
|
|
450
|
-
for (const depName of Object.keys(dependencies)) {
|
|
451
|
-
const schemaNode = dependencies[depName];
|
|
452
|
-
if (!isObject(schemaNode)) {
|
|
453
|
-
continue;
|
|
454
|
-
}
|
|
455
|
-
extractUiSchema(schemaNode, uiSchema);
|
|
456
|
-
}
|
|
457
|
-
}
|
|
458
|
-
}
|
|
459
|
-
const extractSchemaFromStep = (inputStep) => {
|
|
460
|
-
const uiSchema = {};
|
|
461
|
-
const returnSchema = JSON.parse(JSON.stringify(inputStep));
|
|
462
|
-
extractUiSchema(returnSchema, uiSchema);
|
|
463
|
-
return { uiSchema, schema: returnSchema };
|
|
464
|
-
};
|
|
465
|
-
const createFieldValidation = () => {
|
|
466
|
-
const fieldValidation = {
|
|
467
|
-
__errors: [],
|
|
468
|
-
addError: (message) => {
|
|
469
|
-
var _a;
|
|
470
|
-
(_a = fieldValidation.__errors) == null ? void 0 : _a.push(message);
|
|
471
|
-
}
|
|
472
|
-
};
|
|
473
|
-
return fieldValidation;
|
|
474
|
-
};
|
|
475
|
-
|
|
476
392
|
const createAsyncValidators = (rootSchema, validators, context) => {
|
|
477
393
|
async function validate(formData, pathPrefix = "#") {
|
|
478
394
|
const parsedSchema = new Draft07(rootSchema);
|
|
@@ -613,12 +529,22 @@ const Stepper = (props) => {
|
|
|
613
529
|
const handleNext = async ({
|
|
614
530
|
formData
|
|
615
531
|
}) => {
|
|
532
|
+
var _a, _b;
|
|
616
533
|
setErrors(void 0);
|
|
617
|
-
const
|
|
534
|
+
const schema = (_a = steps[activeStep]) == null ? void 0 : _a.schema;
|
|
535
|
+
const rootSchema = (_b = steps[activeStep]) == null ? void 0 : _b.mergedSchema;
|
|
536
|
+
const newFormData = getDefaultFormState(
|
|
537
|
+
validator,
|
|
538
|
+
schema,
|
|
539
|
+
formData,
|
|
540
|
+
rootSchema,
|
|
541
|
+
true
|
|
542
|
+
);
|
|
543
|
+
const returnedValidation = await validation(newFormData);
|
|
618
544
|
const hasErrors = Object.values(returnedValidation).some(
|
|
619
545
|
(i) => {
|
|
620
|
-
var
|
|
621
|
-
return (
|
|
546
|
+
var _a2;
|
|
547
|
+
return (_a2 = i.__errors) == null ? void 0 : _a2.length;
|
|
622
548
|
}
|
|
623
549
|
);
|
|
624
550
|
if (hasErrors) {
|
|
@@ -631,7 +557,7 @@ const Stepper = (props) => {
|
|
|
631
557
|
return stepNum;
|
|
632
558
|
});
|
|
633
559
|
}
|
|
634
|
-
setFormState((current) => ({ ...current, ...
|
|
560
|
+
setFormState((current) => ({ ...current, ...newFormData }));
|
|
635
561
|
};
|
|
636
562
|
return /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement(Stepper$1, {
|
|
637
563
|
activeStep,
|
|
@@ -650,7 +576,8 @@ const Stepper = (props) => {
|
|
|
650
576
|
uiSchema: steps[activeStep].uiSchema,
|
|
651
577
|
onSubmit: handleNext,
|
|
652
578
|
fields: extensions,
|
|
653
|
-
showErrorList: false
|
|
579
|
+
showErrorList: false,
|
|
580
|
+
transformErrors: props.transformErrors
|
|
654
581
|
}, /* @__PURE__ */ React.createElement("div", {
|
|
655
582
|
className: styles.footer
|
|
656
583
|
}, /* @__PURE__ */ React.createElement(Button$2, {
|
|
@@ -756,7 +683,8 @@ const TemplateWizardPage = (props) => {
|
|
|
756
683
|
}, /* @__PURE__ */ React.createElement(Stepper, {
|
|
757
684
|
manifest,
|
|
758
685
|
extensions: props.customFieldExtensions,
|
|
759
|
-
onComplete
|
|
686
|
+
onComplete,
|
|
687
|
+
transformErrors: props.transformErrors
|
|
760
688
|
})))));
|
|
761
689
|
};
|
|
762
690
|
|
|
@@ -794,4 +722,4 @@ const Router = (props) => {
|
|
|
794
722
|
};
|
|
795
723
|
|
|
796
724
|
export { Router };
|
|
797
|
-
//# sourceMappingURL=index-
|
|
725
|
+
//# sourceMappingURL=index-36d7755a.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-36d7755a.esm.js","sources":["../../src/next/TemplateListPage/CategoryPicker.tsx","../../src/next/TemplateListPage/RegisterExistingButton.tsx","../../src/next/TemplateListPage/TemplateCard/CardHeader.tsx","../../src/next/TemplateListPage/TemplateCard/CardLink.tsx","../../src/next/TemplateListPage/TemplateCard/TemplateCard.tsx","../../src/next/TemplateListPage/TemplateGroup.tsx","../../src/next/TemplateListPage/TemplateGroups.tsx","../../src/next/TemplateListPage/TemplateListPage.tsx","../../src/next/TemplateWizardPage/Stepper/createAsyncValidators.ts","../../src/next/TemplateWizardPage/Stepper/useTemplateSchema.ts","../../src/next/TemplateWizardPage/Stepper/ReviewState.tsx","../../src/next/TemplateWizardPage/Stepper/Stepper.tsx","../../src/next/TemplateWizardPage/TemplateWizardPage.tsx","../../src/next/Router/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 */\n\nimport React from 'react';\nimport capitalize from 'lodash/capitalize';\nimport { Progress } from '@backstage/core-components';\nimport {\n Box,\n Checkbox,\n FormControlLabel,\n TextField,\n Typography,\n} from '@material-ui/core';\nimport CheckBoxIcon from '@material-ui/icons/CheckBox';\nimport CheckBoxOutlineBlankIcon from '@material-ui/icons/CheckBoxOutlineBlank';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport { Autocomplete } from '@material-ui/lab';\nimport { useEntityTypeFilter } from '@backstage/plugin-catalog-react';\nimport { alertApiRef, useApi } from '@backstage/core-plugin-api';\n\nconst icon = <CheckBoxOutlineBlankIcon fontSize=\"small\" />;\nconst checkedIcon = <CheckBoxIcon fontSize=\"small\" />;\n\n/**\n * The Category Picker that is rendered on the left side for picking\n * categories and filtering the template list.\n */\nexport const CategoryPicker = () => {\n const alertApi = useApi(alertApiRef);\n const { error, loading, availableTypes, selectedTypes, setSelectedTypes } =\n useEntityTypeFilter();\n\n if (loading) return <Progress />;\n\n if (error) {\n alertApi.post({\n message: `Failed to load entity types with error: ${error}`,\n severity: 'error',\n });\n return null;\n }\n\n if (!availableTypes) return null;\n\n return (\n <Box pb={1} pt={1}>\n <Typography variant=\"button\">Categories</Typography>\n <Autocomplete\n multiple\n aria-label=\"Categories\"\n options={availableTypes}\n value={selectedTypes}\n onChange={(_: object, value: string[]) => setSelectedTypes(value)}\n renderOption={(option, { selected }) => (\n <FormControlLabel\n control={\n <Checkbox\n icon={icon}\n checkedIcon={checkedIcon}\n checked={selected}\n />\n }\n label={capitalize(option)}\n />\n )}\n size=\"small\"\n popupIcon={<ExpandMoreIcon />}\n renderInput={params => <TextField {...params} variant=\"outlined\" />}\n />\n </Box>\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 { BackstageTheme } from '@backstage/theme';\nimport Button from '@material-ui/core/Button';\nimport IconButton from '@material-ui/core/IconButton';\nimport useMediaQuery from '@material-ui/core/useMediaQuery';\nimport React from 'react';\nimport { Link as RouterLink, LinkProps } from 'react-router-dom';\nimport AddCircleOutline from '@material-ui/icons/AddCircleOutline';\nimport { catalogEntityCreatePermission } from '@backstage/plugin-catalog-common';\nimport { usePermission } from '@backstage/plugin-permission-react';\n\n/**\n * Properties for {@link RegisterExistingButton}\n *\n * @alpha\n */\nexport type RegisterExistingButtonProps = {\n title: string;\n} & Partial<Pick<LinkProps, 'to'>>;\n\n/**\n * A button that helps users to register an existing component.\n * @alpha\n */\nexport const RegisterExistingButton = (props: RegisterExistingButtonProps) => {\n const { title, to } = props;\n const { allowed } = usePermission({\n permission: catalogEntityCreatePermission,\n });\n const isXSScreen = useMediaQuery<BackstageTheme>(theme =>\n theme.breakpoints.down('xs'),\n );\n\n if (!to || !allowed) {\n return null;\n }\n\n return isXSScreen ? (\n <IconButton\n component={RouterLink}\n color=\"primary\"\n title={title}\n size=\"small\"\n to={to}\n >\n <AddCircleOutline />\n </IconButton>\n ) : (\n <Button component={RouterLink} variant=\"contained\" color=\"primary\" to={to}>\n {title}\n </Button>\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 */\n\nimport React from 'react';\nimport { makeStyles, useTheme } from '@material-ui/core';\nimport { ItemCardHeader } from '@backstage/core-components';\nimport { BackstageTheme } from '@backstage/theme';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { FavoriteEntity } from '@backstage/plugin-catalog-react';\n\nconst useStyles = makeStyles<BackstageTheme, { cardBackgroundImage: string }>(\n () => ({\n header: {\n backgroundImage: ({ cardBackgroundImage }) => cardBackgroundImage,\n },\n subtitleWrapper: {\n display: 'flex',\n justifyContent: 'space-between',\n },\n }),\n);\n\n/**\n * Props for the CardHeader component\n */\nexport interface CardHeaderProps {\n template: TemplateEntityV1beta3;\n}\n\n/**\n * The Card Header with the background for the TemplateCard.\n */\nexport const CardHeader = (props: CardHeaderProps) => {\n const {\n template: {\n metadata: { title, name },\n spec: { type },\n },\n } = props;\n const { getPageTheme } = useTheme<BackstageTheme>();\n const themeForType = getPageTheme({ themeId: type });\n\n const styles = useStyles({\n cardBackgroundImage: themeForType.backgroundImage,\n });\n\n const SubtitleComponent = (\n <div className={styles.subtitleWrapper}>\n <div>{type}</div>\n <div>\n <FavoriteEntity entity={props.template} style={{ padding: 0 }} />\n </div>\n </div>\n );\n\n return (\n <ItemCardHeader\n title={title ?? name}\n subtitle={SubtitleComponent}\n classes={{ root: styles.header }}\n />\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 { IconComponent } from '@backstage/core-plugin-api';\nimport { BackstageTheme } from '@backstage/theme';\nimport { Link } from '@backstage/core-components';\nimport { makeStyles } from '@material-ui/core';\nimport React from 'react';\n\ninterface CardLinkProps {\n icon: IconComponent;\n text: string;\n url: string;\n}\n\nconst useStyles = makeStyles<BackstageTheme>(() => ({\n linkText: {\n display: 'inline-flex',\n alignItems: 'center',\n },\n}));\n\nexport const CardLink = ({ icon: Icon, text, url }: CardLinkProps) => {\n const styles = useStyles();\n\n return (\n <div className={styles.linkText}>\n <Icon fontSize=\"small\" />\n <Link style={{ marginLeft: '8px' }} to={url}>\n {text || url}\n </Link>\n </div>\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 {\n DEFAULT_NAMESPACE,\n parseEntityRef,\n RELATION_OWNED_BY,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { Button, MarkdownContent, UserIcon } from '@backstage/core-components';\nimport { IconComponent, useApp, useRouteRef } from '@backstage/core-plugin-api';\nimport {\n EntityRefLinks,\n getEntityRelations,\n} from '@backstage/plugin-catalog-react';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { BackstageTheme } from '@backstage/theme';\nimport {\n Box,\n Card,\n CardActions,\n CardContent,\n Chip,\n Divider,\n Grid,\n makeStyles,\n} from '@material-ui/core';\nimport LanguageIcon from '@material-ui/icons/Language';\nimport React from 'react';\nimport {\n nextSelectedTemplateRouteRef,\n viewTechDocRouteRef,\n} from '../../../routes';\nimport { CardHeader } from './CardHeader';\nimport { CardLink } from './CardLink';\n\nconst useStyles = makeStyles<BackstageTheme>(theme => ({\n box: {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n display: '-webkit-box',\n '-webkit-line-clamp': 10,\n '-webkit-box-orient': 'vertical',\n },\n markdown: {\n /** to make the styles for React Markdown not leak into the description */\n '& :first-child': {\n margin: 0,\n },\n },\n label: {\n color: theme.palette.text.secondary,\n textTransform: 'uppercase',\n fontWeight: 'bold',\n letterSpacing: 0.5,\n lineHeight: 1,\n fontSize: '0.75rem',\n },\n footer: {\n display: 'flex',\n justifyContent: 'space-between',\n flex: 1,\n alignItems: 'center',\n },\n ownedBy: {\n display: 'flex',\n alignItems: 'center',\n flex: 1,\n color: theme.palette.link,\n },\n}));\n\n/**\n * The Props for the Template Card component\n * @alpha\n */\nexport interface TemplateCardProps {\n template: TemplateEntityV1beta3;\n deprecated?: boolean;\n}\n\n/**\n * The Template Card component that is rendered in a list for each template\n * @alpha\n */\nexport const TemplateCard = (props: TemplateCardProps) => {\n const { template } = props;\n const styles = useStyles();\n const ownedByRelations = getEntityRelations(template, RELATION_OWNED_BY);\n const templateRoute = useRouteRef(nextSelectedTemplateRouteRef);\n const { name, namespace } = parseEntityRef(\n stringifyEntityRef(props.template),\n );\n const href = templateRoute({\n templateName: name,\n namespace: namespace,\n });\n\n const app = useApp();\n const iconResolver = (key?: string): IconComponent =>\n key ? app.getSystemIcon(key) ?? LanguageIcon : LanguageIcon;\n\n // TechDocs Link\n const viewTechDoc = useRouteRef(viewTechDocRouteRef);\n const viewTechDocsAnnotation =\n template.metadata.annotations?.['backstage.io/techdocs-ref'];\n const viewTechDocsLink =\n !!viewTechDocsAnnotation &&\n !!viewTechDoc &&\n viewTechDoc({\n namespace: template.metadata.namespace || DEFAULT_NAMESPACE,\n kind: template.kind,\n name: template.metadata.name,\n });\n\n return (\n <Card>\n <CardHeader template={template} />\n <CardContent>\n <Grid container spacing={2}>\n <Grid item xs={12}>\n <Box className={styles.box}>\n <MarkdownContent\n className={styles.markdown}\n content={template.metadata.description ?? 'No description'}\n />\n </Box>\n </Grid>\n {(template.metadata.tags?.length ?? 0) > 0 && (\n <>\n <Grid item xs={12}>\n <Divider />\n </Grid>\n <Grid item xs={12}>\n <Grid container spacing={2}>\n {template.metadata.tags?.map(tag => (\n <Grid item>\n <Chip\n style={{ margin: 0 }}\n size=\"small\"\n label={tag}\n key={tag}\n />\n </Grid>\n ))}\n </Grid>\n </Grid>\n </>\n )}\n {(!!viewTechDocsLink || template.metadata.links?.length) && (\n <>\n <Grid item xs={12}>\n <Divider />\n </Grid>\n <Grid item xs={12}>\n <Grid container spacing={2}>\n {viewTechDocsLink && (\n <Grid className={styles.linkText} item xs={6}>\n <CardLink\n icon={iconResolver('docs')}\n text=\"View TechDocs\"\n url={viewTechDocsLink}\n />\n </Grid>\n )}\n {template.metadata.links?.map(({ url, icon, title }) => (\n <Grid className={styles.linkText} item xs={6}>\n <CardLink\n icon={iconResolver(icon)}\n text={title || url}\n url={url}\n />\n </Grid>\n ))}\n </Grid>\n </Grid>\n </>\n )}\n </Grid>\n </CardContent>\n <CardActions style={{ padding: '16px' }}>\n <div className={styles.footer}>\n <div className={styles.ownedBy}>\n {ownedByRelations.length > 0 && (\n <>\n <UserIcon fontSize=\"small\" />\n <EntityRefLinks\n style={{ marginLeft: '8px' }}\n entityRefs={ownedByRelations}\n defaultKind=\"Group\"\n />\n </>\n )}\n </div>\n <Button size=\"small\" variant=\"outlined\" color=\"primary\" to={href}>\n Choose\n </Button>\n </div>\n </CardActions>\n </Card>\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 { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport React from 'react';\nimport {\n Content,\n ContentHeader,\n ItemCardGrid,\n Link,\n} from '@backstage/core-components';\nimport { Typography } from '@material-ui/core';\nimport { TemplateCard, TemplateCardProps } from './TemplateCard';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\n\nexport interface TemplateGroupProps {\n templates: TemplateEntityV1beta3[];\n title: React.ReactNode;\n components?: {\n CardComponent?: React.ComponentType<TemplateCardProps>;\n };\n}\n\nexport const TemplateGroup = (props: TemplateGroupProps) => {\n const { templates, title, components: { CardComponent } = {} } = props;\n const titleComponent =\n typeof title === 'string' ? <ContentHeader title={title} /> : title;\n\n if (templates.length === 0) {\n return (\n <Content>\n {titleComponent}\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 </Content>\n );\n }\n\n const Card = CardComponent || TemplateCard;\n\n return (\n <Content>\n {titleComponent}\n <ItemCardGrid>\n {templates.map(template => (\n <Card key={stringifyEntityRef(template)} template={template} />\n ))}\n </ItemCardGrid>\n </Content>\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 from 'react';\nimport { TemplateGroup } from './TemplateGroup';\nimport { Entity } from '@backstage/catalog-model';\nimport { useEntityList } from '@backstage/plugin-catalog-react';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { Progress, Link } from '@backstage/core-components';\nimport { Typography } from '@material-ui/core';\nimport { errorApiRef, useApi } from '@backstage/core-plugin-api';\n\n/**\n * @alpha\n */\nexport type TemplateGroupFilter = {\n title?: React.ReactNode;\n filter: (entity: Entity) => boolean;\n};\n\nexport interface TemplateGroupsProps {\n groups: TemplateGroupFilter[];\n TemplateCardComponent?: React.ComponentType<{\n template: TemplateEntityV1beta3;\n }>;\n}\n\nexport const TemplateGroups = (props: TemplateGroupsProps) => {\n const { loading, error, entities } = useEntityList();\n const { groups, TemplateCardComponent } = props;\n const errorApi = useApi(errorApiRef);\n\n if (loading) {\n return <Progress />;\n }\n\n if (error) {\n errorApi.post(error);\n return null;\n }\n\n if (!entities || !entities.length) {\n return (\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\n return (\n <>\n {groups.map(({ title, filter }, index) => (\n <TemplateGroup\n key={index}\n templates={entities.filter((e): e is TemplateEntityV1beta3 =>\n filter(e),\n )}\n title={title}\n components={{ CardComponent: TemplateCardComponent }}\n />\n ))}\n </>\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 */\n\nimport React from 'react';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\n\nimport {\n Content,\n ContentHeader,\n Header,\n Page,\n SupportButton,\n} from '@backstage/core-components';\nimport {\n EntityKindPicker,\n EntityListProvider,\n EntitySearchBar,\n EntityTagPicker,\n CatalogFilterLayout,\n UserListPicker,\n} from '@backstage/plugin-catalog-react';\nimport { CategoryPicker } from './CategoryPicker';\nimport { RegisterExistingButton } from './RegisterExistingButton';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport { registerComponentRouteRef } from '../../routes';\nimport { TemplateGroupFilter, TemplateGroups } from './TemplateGroups';\n\nexport type TemplateListPageProps = {\n TemplateCardComponent?: React.ComponentType<{\n template: TemplateEntityV1beta3;\n }>;\n groups?: TemplateGroupFilter[];\n};\n\nconst defaultGroup: TemplateGroupFilter = {\n title: 'All Templates',\n filter: () => true,\n};\n\nexport const TemplateListPage = (props: TemplateListPageProps) => {\n const registerComponentLink = useRouteRef(registerComponentRouteRef);\n const { TemplateCardComponent, groups = [] } = props;\n\n return (\n <EntityListProvider>\n <Page themeId=\"website\">\n <Header\n pageTitleOverride=\"Create a new component\"\n title=\"Create a new component\"\n subtitle=\"Create new software components using standard templates in your organization\"\n />\n <Content>\n <ContentHeader title=\"Available Templates\">\n <RegisterExistingButton\n title=\"Register Existing Component\"\n to={registerComponentLink && registerComponentLink()}\n />\n <SupportButton>\n Create new software components using standard templates. Different\n templates create different kinds of components (services,\n websites, 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 <CategoryPicker />\n <EntityTagPicker />\n </CatalogFilterLayout.Filters>\n <CatalogFilterLayout.Content>\n <TemplateGroups\n groups={[...groups, defaultGroup]}\n TemplateCardComponent={TemplateCardComponent}\n />\n </CatalogFilterLayout.Content>\n </CatalogFilterLayout>\n </Content>\n </Page>\n </EntityListProvider>\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 */\n\nimport { FieldValidation } from '@rjsf/utils';\nimport { JsonObject } from '@backstage/types';\nimport { ApiHolder } from '@backstage/core-plugin-api';\nimport { NextCustomFieldValidator } from '../../../extensions';\nimport { Draft07 as JSONSchema } from 'json-schema-library';\nimport { createFieldValidation } from './schema';\n\nexport const createAsyncValidators = (\n rootSchema: JsonObject,\n validators: Record<string, undefined | NextCustomFieldValidator<unknown>>,\n context: {\n apiHolder: ApiHolder;\n },\n) => {\n async function validate(formData: JsonObject, pathPrefix: string = '#') {\n const parsedSchema = new JSONSchema(rootSchema);\n const formValidation: Record<string, FieldValidation> = {};\n for (const [key, value] of Object.entries(formData)) {\n const definitionInSchema = parsedSchema.getSchema(\n `${pathPrefix}/${key}`,\n formData,\n );\n\n if (definitionInSchema && 'ui:field' in definitionInSchema) {\n const validator = validators[definitionInSchema['ui:field']];\n if (validator) {\n const fieldValidation = createFieldValidation();\n try {\n await validator(value, fieldValidation, context);\n } catch (ex) {\n fieldValidation.addError(ex.message);\n }\n formValidation[key] = fieldValidation;\n }\n }\n }\n\n return formValidation;\n }\n\n return async (formData: JsonObject) => {\n return await validate(formData);\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 { featureFlagsApiRef, useApi } from '@backstage/core-plugin-api';\nimport { JsonObject } from '@backstage/types';\nimport { UiSchema } from '@rjsf/utils';\nimport { TemplateParameterSchema } from '../../../types';\nimport { extractSchemaFromStep } from './schema';\n\nexport interface ParsedTemplateSchema {\n uiSchema: UiSchema;\n mergedSchema: JsonObject;\n schema: JsonObject;\n title: string;\n description?: string;\n}\nexport const useTemplateSchema = (\n manifest: TemplateParameterSchema,\n): { steps: ParsedTemplateSchema[] } => {\n const featureFlags = useApi(featureFlagsApiRef);\n const steps = manifest.steps.map(({ title, description, schema }) => ({\n title,\n description,\n mergedSchema: schema,\n ...extractSchemaFromStep(schema),\n }));\n\n const returningSteps = steps\n // Filter out steps that are not enabled with the feature flags\n .filter(step => {\n const stepFeatureFlag = step.uiSchema['ui:backstage']?.featureFlag;\n return stepFeatureFlag ? featureFlags.isActive(stepFeatureFlag) : true;\n })\n // Then filter out the properties that are not enabled with feature flag\n .map(step => ({\n ...step,\n schema: {\n ...step.schema,\n // Title is rendered at the top of the page, so let's ignore this from jsonschemaform\n title: undefined,\n properties: Object.fromEntries(\n Object.entries(step.schema.properties as JsonObject).filter(\n ([key]) => {\n const stepFeatureFlag =\n step.uiSchema[key]?.['ui:backstage']?.featureFlag;\n return stepFeatureFlag\n ? featureFlags.isActive(stepFeatureFlag)\n : true;\n },\n ),\n ),\n },\n }));\n\n return {\n steps: returningSteps,\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 from 'react';\nimport { StructuredMetadataTable } from '@backstage/core-components';\nimport { JsonObject } from '@backstage/types';\nimport { ParsedTemplateSchema } from './useTemplateSchema';\nimport { Draft07 as JSONSchema } from 'json-schema-library';\n\ninterface ReviewStateProps {\n schemas: ParsedTemplateSchema[];\n formState: JsonObject;\n}\n\nexport const ReviewState = (props: ReviewStateProps) => {\n const reviewData = Object.fromEntries(\n Object.entries(props.formState).map(([key, value]) => {\n for (const step of props.schemas) {\n const parsedSchema = new JSONSchema(step.mergedSchema);\n const definitionInSchema = parsedSchema.getSchema(\n `#/${key}`,\n props.formState,\n );\n if (definitionInSchema) {\n const backstageReviewOptions =\n definitionInSchema['ui:backstage']?.review;\n\n if (backstageReviewOptions) {\n if (backstageReviewOptions.mask) {\n return [key, backstageReviewOptions.mask];\n }\n if (backstageReviewOptions.show === false) {\n return [];\n }\n }\n\n if (definitionInSchema['ui:widget'] === 'password') {\n return [key, '******'];\n }\n }\n }\n return [key, value];\n }),\n );\n return <StructuredMetadataTable metadata={reviewData} />;\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 {\n useAnalytics,\n useApiHolder,\n useRouteRefParams,\n} from '@backstage/core-plugin-api';\nimport { JsonValue } from '@backstage/types';\nimport {\n Stepper as MuiStepper,\n Step as MuiStep,\n StepLabel as MuiStepLabel,\n Button,\n makeStyles,\n} from '@material-ui/core';\nimport { withTheme } from '@rjsf/core-v5';\nimport { ErrorSchema, FieldValidation } from '@rjsf/utils';\nimport React, { useMemo, useState } from 'react';\nimport { NextFieldExtensionOptions } from '../../../extensions';\nimport { TemplateParameterSchema } from '../../../types';\nimport { createAsyncValidators } from './createAsyncValidators';\nimport { useTemplateSchema } from './useTemplateSchema';\nimport { ReviewState } from './ReviewState';\nimport validator from '@rjsf/validator-ajv8';\nimport { selectedTemplateRouteRef } from '../../../routes';\nimport type { ErrorTransformer } from '@rjsf/utils';\nimport { getDefaultFormState } from '@rjsf/utils';\n\nconst useStyles = makeStyles(theme => ({\n backButton: {\n marginRight: theme.spacing(1),\n },\n\n footer: {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'right',\n },\n formWrapper: {\n padding: theme.spacing(2),\n },\n}));\n\nexport interface StepperProps {\n manifest: TemplateParameterSchema;\n extensions: NextFieldExtensionOptions<any, any>[];\n onComplete: (values: Record<string, JsonValue>) => Promise<void>;\n transformErrors?: ErrorTransformer;\n}\n\n// TODO(blam): We require here, as the types in this package depend on @rjsf/core explicitly\n// which is what we're using here as the default types, it needs to depend on @rjsf/core-v5 because\n// of the re-writing we're doing. Once we've migrated, we can import this the exact same as before.\nconst Form = withTheme(require('@rjsf/material-ui-v5').Theme);\n\nexport const Stepper = (props: StepperProps) => {\n const { templateName } = useRouteRefParams(selectedTemplateRouteRef);\n const analytics = useAnalytics();\n const { steps } = useTemplateSchema(props.manifest);\n const apiHolder = useApiHolder();\n const [activeStep, setActiveStep] = useState(0);\n const [formState, setFormState] = useState<Record<string, JsonValue>>({});\n const [errors, setErrors] = useState<\n undefined | Record<string, FieldValidation>\n >();\n const styles = useStyles();\n\n const extensions = useMemo(() => {\n return Object.fromEntries(\n props.extensions.map(({ name, component }) => [name, component]),\n );\n }, [props.extensions]);\n\n const validators = useMemo(() => {\n return Object.fromEntries(\n props.extensions.map(({ name, validation }) => [name, validation]),\n );\n }, [props.extensions]);\n\n const validation = useMemo(() => {\n return createAsyncValidators(steps[activeStep]?.mergedSchema, validators, {\n apiHolder,\n });\n }, [steps, activeStep, validators, apiHolder]);\n\n const handleBack = () => {\n setActiveStep(prevActiveStep => prevActiveStep - 1);\n };\n\n const handleNext = async ({\n formData,\n }: {\n formData: Record<string, JsonValue>;\n }) => {\n // TODO(blam): What do we do about loading states, does each field extension get a chance\n // to display it's own loading? Or should we grey out the entire form.\n setErrors(undefined);\n\n const schema = steps[activeStep]?.schema;\n const rootSchema = steps[activeStep]?.mergedSchema;\n\n const newFormData = getDefaultFormState(\n validator,\n schema,\n formData,\n rootSchema,\n true,\n );\n\n const returnedValidation = await validation(newFormData);\n\n const hasErrors = Object.values(returnedValidation).some(\n i => i.__errors?.length,\n );\n\n if (hasErrors) {\n setErrors(returnedValidation);\n } else {\n setErrors(undefined);\n setActiveStep(prevActiveStep => {\n const stepNum = prevActiveStep + 1;\n analytics.captureEvent('click', `Next Step (${stepNum})`);\n return stepNum;\n });\n }\n setFormState(current => ({ ...current, ...newFormData }));\n };\n\n return (\n <>\n <MuiStepper activeStep={activeStep} alternativeLabel variant=\"elevation\">\n {steps.map((step, index) => (\n <MuiStep key={index}>\n <MuiStepLabel>{step.title}</MuiStepLabel>\n </MuiStep>\n ))}\n <MuiStep>\n <MuiStepLabel>Review</MuiStepLabel>\n </MuiStep>\n </MuiStepper>\n <div className={styles.formWrapper}>\n {activeStep < steps.length ? (\n <Form\n validator={validator}\n extraErrors={errors as unknown as ErrorSchema}\n formData={formState}\n formContext={{ formData: formState }}\n schema={steps[activeStep].schema}\n uiSchema={steps[activeStep].uiSchema}\n onSubmit={handleNext}\n fields={extensions}\n showErrorList={false}\n transformErrors={props.transformErrors}\n >\n <div className={styles.footer}>\n <Button\n onClick={handleBack}\n className={styles.backButton}\n disabled={activeStep < 1}\n >\n Back\n </Button>\n <Button variant=\"contained\" color=\"primary\" type=\"submit\">\n {activeStep === steps.length - 1 ? 'Review' : 'Next'}\n </Button>\n </div>\n </Form>\n ) : (\n <>\n <ReviewState formState={formState} schemas={steps} />\n <div className={styles.footer}>\n <Button\n onClick={handleBack}\n className={styles.backButton}\n disabled={activeStep < 1}\n >\n Back\n </Button>\n <Button\n variant=\"contained\"\n onClick={() => {\n props.onComplete(formState);\n const name =\n typeof formState.name === 'string'\n ? formState.name\n : undefined;\n analytics.captureEvent(\n 'create',\n name || `new ${templateName}`,\n );\n }}\n >\n Create\n </Button>\n </div>\n </>\n )}\n </div>\n </>\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, { useContext, useEffect } from 'react';\nimport {\n Page,\n Header,\n Content,\n Progress,\n InfoCard,\n MarkdownContent,\n} from '@backstage/core-components';\nimport { NextFieldExtensionOptions } from '../../extensions';\nimport { Navigate, useNavigate } from 'react-router';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport {\n AnalyticsContext,\n errorApiRef,\n useApi,\n useRouteRef,\n useRouteRefParams,\n} from '@backstage/core-plugin-api';\nimport { scaffolderApiRef } from '../../api';\nimport useAsync from 'react-use/lib/useAsync';\nimport { makeStyles } from '@material-ui/core';\nimport { Stepper } from './Stepper';\nimport { BackstageTheme } from '@backstage/theme';\nimport {\n nextRouteRef,\n scaffolderTaskRouteRef,\n selectedTemplateRouteRef,\n} from '../../routes';\nimport { SecretsContext } from '../../components/secrets/SecretsContext';\nimport { JsonValue } from '@backstage/types';\nimport type { ErrorTransformer } from '@rjsf/utils';\n\nexport interface TemplateWizardPageProps {\n customFieldExtensions: NextFieldExtensionOptions<any, any>[];\n transformErrors?: ErrorTransformer;\n}\n\nconst useStyles = makeStyles<BackstageTheme>(() => ({\n markdown: {\n /** to make the styles for React Markdown not leak into the description */\n '& :first-child': {\n marginTop: 0,\n },\n '& :last-child': {\n marginBottom: 0,\n },\n },\n}));\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\n return { manifest: value, loading, error };\n};\n\nexport const TemplateWizardPage = (props: TemplateWizardPageProps) => {\n const styles = useStyles();\n const rootRef = useRouteRef(nextRouteRef);\n const taskRoute = useRouteRef(scaffolderTaskRouteRef);\n const { secrets } = useContext(SecretsContext) ?? {};\n const scaffolderApi = useApi(scaffolderApiRef);\n const navigate = useNavigate();\n const { templateName, namespace } = useRouteRefParams(\n selectedTemplateRouteRef,\n );\n\n const templateRef = stringifyEntityRef({\n kind: 'Template',\n namespace,\n name: templateName,\n });\n\n const errorApi = useApi(errorApiRef);\n const { loading, manifest, error } = useTemplateParameterSchema(templateRef);\n\n const onComplete = 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 useEffect(() => {\n if (error) {\n errorApi.post(new Error(`Failed to load template, ${error}`));\n }\n }, [error, errorApi]);\n\n if (error) {\n return <Navigate to={rootRef()} />;\n }\n\n return (\n <AnalyticsContext attributes={{ entityRef: templateRef }}>\n <Page themeId=\"website\">\n <Header\n pageTitleOverride=\"Create a new component\"\n title=\"Create a new component\"\n subtitle=\"Create new software components using standard templates in your organization\"\n />\n <Content>\n {loading && <Progress />}\n {manifest && (\n <InfoCard\n title={manifest.title}\n subheader={\n <MarkdownContent\n className={styles.markdown}\n content={manifest.description ?? 'No description'}\n />\n }\n noPadding\n titleTypographyProps={{ component: 'h2' }}\n >\n <Stepper\n manifest={manifest}\n extensions={props.customFieldExtensions}\n onComplete={onComplete}\n transformErrors={props.transformErrors}\n />\n </InfoCard>\n )}\n </Content>\n </Page>\n </AnalyticsContext>\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, { PropsWithChildren } from 'react';\nimport { Routes, Route, useOutlet } from 'react-router';\nimport { TemplateListPage } from '../TemplateListPage';\nimport { TemplateWizardPage } from '../TemplateWizardPage';\nimport {\n FIELD_EXTENSION_WRAPPER_KEY,\n FIELD_EXTENSION_KEY,\n DEFAULT_SCAFFOLDER_FIELD_EXTENSIONS,\n NextFieldExtensionOptions,\n FieldExtensionOptions,\n} from '../../extensions';\n\nimport { useElementFilter } from '@backstage/core-plugin-api';\nimport { TemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { TemplateGroupFilter } from '../TemplateListPage/TemplateGroups';\nimport { nextSelectedTemplateRouteRef } from '../../routes';\nimport { SecretsContextProvider } from '../../components/secrets/SecretsContext';\nimport type { ErrorTransformer } from '@rjsf/utils';\n\n/**\n * The Props for the Scaffolder Router\n *\n * @alpha\n */\nexport type NextRouterProps = {\n components?: {\n TemplateCardComponent?: React.ComponentType<{\n template: TemplateEntityV1beta3;\n }>;\n TaskPageComponent?: React.ComponentType<{}>;\n };\n groups?: TemplateGroupFilter[];\n transformErrors?: ErrorTransformer;\n};\n\n/**\n * The Scaffolder Router\n *\n * @alpha\n */\nexport const Router = (props: PropsWithChildren<NextRouterProps>) => {\n const { components: { TemplateCardComponent } = {} } = props;\n\n const outlet = useOutlet() || props.children;\n\n const customFieldExtensions = useElementFilter(outlet, elements =>\n elements\n .selectByComponentData({\n key: FIELD_EXTENSION_WRAPPER_KEY,\n })\n .findComponentData<FieldExtensionOptions | NextFieldExtensionOptions>({\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 ] as NextFieldExtensionOptions[];\n\n return (\n <Routes>\n <Route\n path=\"/\"\n element={\n <TemplateListPage\n TemplateCardComponent={TemplateCardComponent}\n groups={props.groups}\n />\n }\n />\n <Route\n path={nextSelectedTemplateRouteRef.path}\n element={\n <SecretsContextProvider>\n <TemplateWizardPage customFieldExtensions={fieldExtensions} />\n </SecretsContextProvider>\n }\n />\n </Routes>\n );\n};\n"],"names":["RouterLink","useStyles","Link","_a","Button","JSONSchema","validation","MuiStepper","MuiStep","MuiStepLabel"],"mappings":"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"}
|
|
@@ -9,6 +9,8 @@ import FormControl from '@material-ui/core/FormControl';
|
|
|
9
9
|
import Autocomplete from '@material-ui/lab/Autocomplete';
|
|
10
10
|
import React, { useCallback, useEffect, useState, createContext, useContext, useMemo, useRef, memo } from 'react';
|
|
11
11
|
import useAsync from 'react-use/lib/useAsync';
|
|
12
|
+
import { z } from 'zod';
|
|
13
|
+
import zodToJsonSchema from 'zod-to-json-schema';
|
|
12
14
|
import useEffectOnce from 'react-use/lib/useEffectOnce';
|
|
13
15
|
import { Autocomplete as Autocomplete$1 } from '@material-ui/lab';
|
|
14
16
|
import { scmIntegrationsApiRef, scmAuthApiRef } from '@backstage/integration-react';
|
|
@@ -236,6 +238,32 @@ class ScaffolderClient {
|
|
|
236
238
|
}
|
|
237
239
|
}
|
|
238
240
|
|
|
241
|
+
function makeFieldSchemaFromZod(returnSchema, uiOptionsSchema) {
|
|
242
|
+
return {
|
|
243
|
+
schema: {
|
|
244
|
+
returnValue: zodToJsonSchema(returnSchema),
|
|
245
|
+
uiOptions: uiOptionsSchema ? zodToJsonSchema(uiOptionsSchema) : void 0
|
|
246
|
+
},
|
|
247
|
+
type: null,
|
|
248
|
+
uiOptionsType: null
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const EntityPickerFieldSchema = makeFieldSchemaFromZod(
|
|
253
|
+
z.string(),
|
|
254
|
+
z.object({
|
|
255
|
+
allowedKinds: z.array(z.string()).optional().describe("List of kinds of entities to derive options from"),
|
|
256
|
+
defaultKind: z.string().optional().describe(
|
|
257
|
+
"The default entity kind. Options of this kind will not be prefixed."
|
|
258
|
+
),
|
|
259
|
+
allowArbitraryValues: z.boolean().optional().describe("Whether to allow arbitrary user input. Defaults to true"),
|
|
260
|
+
defaultNamespace: z.union([z.string(), z.literal(false)]).optional().describe(
|
|
261
|
+
"The default namespace. Options with this namespace will not be prefixed."
|
|
262
|
+
)
|
|
263
|
+
})
|
|
264
|
+
);
|
|
265
|
+
const EntityPickerSchema = EntityPickerFieldSchema.schema;
|
|
266
|
+
|
|
239
267
|
const EntityPicker = (props) => {
|
|
240
268
|
var _a, _b, _c, _d, _e;
|
|
241
269
|
const {
|
|
@@ -296,6 +324,9 @@ const EntityPicker = (props) => {
|
|
|
296
324
|
}));
|
|
297
325
|
};
|
|
298
326
|
|
|
327
|
+
const EntityNamePickerFieldSchema = makeFieldSchemaFromZod(z.string());
|
|
328
|
+
const EntityNamePickerSchema = EntityNamePickerFieldSchema.schema;
|
|
329
|
+
|
|
299
330
|
const EntityNamePicker = (props) => {
|
|
300
331
|
const {
|
|
301
332
|
onChange,
|
|
@@ -324,11 +355,21 @@ const EntityNamePicker = (props) => {
|
|
|
324
355
|
const entityNamePickerValidation = (value, validation) => {
|
|
325
356
|
if (!KubernetesValidatorFunctions.isValidObjectName(value)) {
|
|
326
357
|
validation.addError(
|
|
327
|
-
"
|
|
358
|
+
"Must start and end with an alphanumeric character, and contain only alphanumeric characters, hyphens, underscores, and periods. Maximum length is 63 characters."
|
|
328
359
|
);
|
|
329
360
|
}
|
|
330
361
|
};
|
|
331
362
|
|
|
363
|
+
const EntityTagsPickerFieldSchema = makeFieldSchemaFromZod(
|
|
364
|
+
z.array(z.string()),
|
|
365
|
+
z.object({
|
|
366
|
+
kinds: z.array(z.string()).optional().describe("List of kinds of entities to derive tags from"),
|
|
367
|
+
showCounts: z.boolean().optional().describe("Whether to show usage counts per tag"),
|
|
368
|
+
helperText: z.string().optional().describe("Helper text to display")
|
|
369
|
+
})
|
|
370
|
+
);
|
|
371
|
+
const EntityTagsPickerSchema = EntityTagsPickerFieldSchema.schema;
|
|
372
|
+
|
|
332
373
|
const EntityTagsPicker = (props) => {
|
|
333
374
|
var _a, _b, _c;
|
|
334
375
|
const { formData, onChange, uiSchema } = props;
|
|
@@ -396,6 +437,20 @@ const EntityTagsPicker = (props) => {
|
|
|
396
437
|
}));
|
|
397
438
|
};
|
|
398
439
|
|
|
440
|
+
const OwnerPickerFieldSchema = makeFieldSchemaFromZod(
|
|
441
|
+
z.string(),
|
|
442
|
+
z.object({
|
|
443
|
+
allowedKinds: z.array(z.string()).default(["Group", "User"]).optional().describe(
|
|
444
|
+
"List of kinds of entities to derive options from. Defaults to Group and User"
|
|
445
|
+
),
|
|
446
|
+
allowArbitraryValues: z.boolean().optional().describe("Whether to allow arbitrary user input. Defaults to true"),
|
|
447
|
+
defaultNamespace: z.union([z.string(), z.literal(false)]).optional().describe(
|
|
448
|
+
"The default namespace. Options with this namespace will not be prefixed."
|
|
449
|
+
)
|
|
450
|
+
})
|
|
451
|
+
);
|
|
452
|
+
const OwnerPickerSchema = OwnerPickerFieldSchema.schema;
|
|
453
|
+
|
|
399
454
|
const OwnerPicker = (props) => {
|
|
400
455
|
var _a, _b, _c, _d;
|
|
401
456
|
const {
|
|
@@ -723,6 +778,31 @@ const useTemplateSecrets = () => {
|
|
|
723
778
|
return { setSecrets };
|
|
724
779
|
};
|
|
725
780
|
|
|
781
|
+
const RepoUrlPickerFieldSchema = makeFieldSchemaFromZod(
|
|
782
|
+
z.string(),
|
|
783
|
+
z.object({
|
|
784
|
+
allowedHosts: z.array(z.string()).optional().describe("List of allowed SCM platform hosts"),
|
|
785
|
+
allowedOrganizations: z.array(z.string()).optional().describe("List of allowed organizations in the given SCM platform"),
|
|
786
|
+
allowedOwners: z.array(z.string()).optional().describe("List of allowed owners in the given SCM platform"),
|
|
787
|
+
allowedRepos: z.array(z.string()).optional().describe("List of allowed repos in the given SCM platform"),
|
|
788
|
+
requestUserCredentials: z.object({
|
|
789
|
+
secretsKey: z.string().describe(
|
|
790
|
+
"Key used within the template secrets context to store the credential"
|
|
791
|
+
),
|
|
792
|
+
additionalScopes: z.object({
|
|
793
|
+
gerrit: z.array(z.string()).optional().describe("Additional Gerrit scopes to request"),
|
|
794
|
+
github: z.array(z.string()).optional().describe("Additional GitHub scopes to request"),
|
|
795
|
+
gitlab: z.array(z.string()).optional().describe("Additional GitLab scopes to request"),
|
|
796
|
+
bitbucket: z.array(z.string()).optional().describe("Additional BitBucket scopes to request"),
|
|
797
|
+
azure: z.array(z.string()).optional().describe("Additional Azure scopes to request")
|
|
798
|
+
}).optional().describe("Additional permission scopes to request")
|
|
799
|
+
}).optional().describe(
|
|
800
|
+
"If defined will request user credentials to auth against the given SCM platform"
|
|
801
|
+
)
|
|
802
|
+
})
|
|
803
|
+
);
|
|
804
|
+
const RepoUrlPickerSchema = RepoUrlPickerFieldSchema.schema;
|
|
805
|
+
|
|
726
806
|
const RepoUrlPicker = (props) => {
|
|
727
807
|
var _a, _b;
|
|
728
808
|
const { uiSchema, onChange, rawErrors, formData } = props;
|
|
@@ -893,6 +973,21 @@ const repoPickerValidation = (value, validation, context) => {
|
|
|
893
973
|
}
|
|
894
974
|
};
|
|
895
975
|
|
|
976
|
+
const OwnedEntityPickerFieldSchema = makeFieldSchemaFromZod(
|
|
977
|
+
z.string(),
|
|
978
|
+
z.object({
|
|
979
|
+
allowedKinds: z.array(z.string()).optional().describe("List of kinds of entities to derive options from"),
|
|
980
|
+
defaultKind: z.string().optional().describe(
|
|
981
|
+
"The default entity kind. Options of this kind will not be prefixed."
|
|
982
|
+
),
|
|
983
|
+
allowArbitraryValues: z.boolean().optional().describe("Whether to allow arbitrary user input. Defaults to true"),
|
|
984
|
+
defaultNamespace: z.union([z.string(), z.literal(false)]).optional().describe(
|
|
985
|
+
"The default namespace. Options with this namespace will not be prefixed."
|
|
986
|
+
)
|
|
987
|
+
})
|
|
988
|
+
);
|
|
989
|
+
const OwnedEntityPickerSchema = OwnedEntityPickerFieldSchema.schema;
|
|
990
|
+
|
|
896
991
|
const OwnedEntityPicker = (props) => {
|
|
897
992
|
var _a, _b, _c, _d, _e;
|
|
898
993
|
const {
|
|
@@ -1097,52 +1192,58 @@ const scaffolderPlugin = createPlugin({
|
|
|
1097
1192
|
const EntityPickerFieldExtension = scaffolderPlugin.provide(
|
|
1098
1193
|
createScaffolderFieldExtension({
|
|
1099
1194
|
component: EntityPicker,
|
|
1100
|
-
name: "EntityPicker"
|
|
1195
|
+
name: "EntityPicker",
|
|
1196
|
+
schema: EntityPickerSchema
|
|
1101
1197
|
})
|
|
1102
1198
|
);
|
|
1103
1199
|
const EntityNamePickerFieldExtension = scaffolderPlugin.provide(
|
|
1104
1200
|
createScaffolderFieldExtension({
|
|
1105
1201
|
component: EntityNamePicker,
|
|
1106
1202
|
name: "EntityNamePicker",
|
|
1107
|
-
validation: entityNamePickerValidation
|
|
1203
|
+
validation: entityNamePickerValidation,
|
|
1204
|
+
schema: EntityNamePickerSchema
|
|
1108
1205
|
})
|
|
1109
1206
|
);
|
|
1110
1207
|
const RepoUrlPickerFieldExtension = scaffolderPlugin.provide(
|
|
1111
1208
|
createScaffolderFieldExtension({
|
|
1112
1209
|
component: RepoUrlPicker,
|
|
1113
1210
|
name: "RepoUrlPicker",
|
|
1114
|
-
validation: repoPickerValidation
|
|
1211
|
+
validation: repoPickerValidation,
|
|
1212
|
+
schema: RepoUrlPickerSchema
|
|
1115
1213
|
})
|
|
1116
1214
|
);
|
|
1117
1215
|
const OwnerPickerFieldExtension = scaffolderPlugin.provide(
|
|
1118
1216
|
createScaffolderFieldExtension({
|
|
1119
1217
|
component: OwnerPicker,
|
|
1120
|
-
name: "OwnerPicker"
|
|
1218
|
+
name: "OwnerPicker",
|
|
1219
|
+
schema: OwnerPickerSchema
|
|
1121
1220
|
})
|
|
1122
1221
|
);
|
|
1123
1222
|
const ScaffolderPage = scaffolderPlugin.provide(
|
|
1124
1223
|
createRoutableExtension({
|
|
1125
1224
|
name: "ScaffolderPage",
|
|
1126
|
-
component: () => import('./Router-
|
|
1225
|
+
component: () => import('./Router-c72ed8e0.esm.js').then((m) => m.Router),
|
|
1127
1226
|
mountPoint: rootRouteRef
|
|
1128
1227
|
})
|
|
1129
1228
|
);
|
|
1130
1229
|
const OwnedEntityPickerFieldExtension = scaffolderPlugin.provide(
|
|
1131
1230
|
createScaffolderFieldExtension({
|
|
1132
1231
|
component: OwnedEntityPicker,
|
|
1133
|
-
name: "OwnedEntityPicker"
|
|
1232
|
+
name: "OwnedEntityPicker",
|
|
1233
|
+
schema: OwnedEntityPickerSchema
|
|
1134
1234
|
})
|
|
1135
1235
|
);
|
|
1136
1236
|
const EntityTagsPickerFieldExtension = scaffolderPlugin.provide(
|
|
1137
1237
|
createScaffolderFieldExtension({
|
|
1138
1238
|
component: EntityTagsPicker,
|
|
1139
|
-
name: "EntityTagsPicker"
|
|
1239
|
+
name: "EntityTagsPicker",
|
|
1240
|
+
schema: EntityTagsPickerSchema
|
|
1140
1241
|
})
|
|
1141
1242
|
);
|
|
1142
1243
|
const NextScaffolderPage = scaffolderPlugin.provide(
|
|
1143
1244
|
createRoutableExtension({
|
|
1144
1245
|
name: "NextScaffolderPage",
|
|
1145
|
-
component: () => import('./index-
|
|
1246
|
+
component: () => import('./index-36d7755a.esm.js').then((m) => m.Router),
|
|
1146
1247
|
mountPoint: nextRouteRef
|
|
1147
1248
|
})
|
|
1148
1249
|
);
|
|
@@ -1623,5 +1724,5 @@ const TaskPage = ({ loadingText }) => {
|
|
|
1623
1724
|
})))))));
|
|
1624
1725
|
};
|
|
1625
1726
|
|
|
1626
|
-
export {
|
|
1627
|
-
//# sourceMappingURL=index-
|
|
1727
|
+
export { OwnerPickerFieldSchema as $, OwnedEntityPickerSchema as A, nextSelectedTemplateRouteRef as B, nextRouteRef as C, ScaffolderClient as D, EntityPicker as E, FIELD_EXTENSION_WRAPPER_KEY as F, createScaffolderFieldExtension as G, ScaffolderFieldExtensions as H, createScaffolderLayout as I, ScaffolderLayouts as J, EntityPickerFieldExtension as K, LAYOUTS_WRAPPER_KEY as L, EntityNamePickerFieldExtension as M, EntityTagsPickerFieldExtension as N, OwnerPicker as O, OwnerPickerFieldExtension as P, OwnedEntityPickerFieldExtension as Q, RepoUrlPicker as R, SecretsContext as S, TemplateTypePicker as T, RepoUrlPickerFieldExtension as U, ScaffolderPage as V, scaffolderPlugin as W, NextScaffolderPage as X, createNextScaffolderFieldExtension as Y, makeFieldSchemaFromZod as Z, EntityPickerFieldSchema as _, actionsRouteRef as a, RepoUrlPickerFieldSchema as a0, OwnedEntityPickerFieldSchema as a1, EntityTagsPickerFieldSchema as a2, useTemplateSecrets as a3, scaffolderListTaskRouteRef as b, scaffolderApiRef as c, scaffolderTaskRouteRef as d, editRouteRef as e, rootRouteRef as f, TaskStatusStepper as g, TaskPageLinks as h, FIELD_EXTENSION_KEY as i, LAYOUTS_KEY as j, SecretsContextProvider as k, legacySelectedTemplateRouteRef as l, TaskPage as m, EntityPickerSchema as n, EntityNamePicker as o, entityNamePickerValidation as p, EntityNamePickerSchema as q, registerComponentRouteRef as r, selectedTemplateRouteRef as s, EntityTagsPicker as t, EntityTagsPickerSchema as u, viewTechDocRouteRef as v, repoPickerValidation as w, RepoUrlPickerSchema as x, OwnerPickerSchema as y, OwnedEntityPicker as z };
|
|
1728
|
+
//# sourceMappingURL=index-ed1a1fba.esm.js.map
|