@backstage/plugin-scaffolder 1.30.1 → 1.31.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/CHANGELOG.md +23 -4
  2. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbar.esm.js +22 -0
  3. package/dist/alpha/components/TemplateEditorPage/TemplateEditorToolbar.esm.js.map +1 -1
  4. package/dist/alpha/components/TemplateListPage/TemplateListPage.esm.js +4 -2
  5. package/dist/alpha/components/TemplateListPage/TemplateListPage.esm.js.map +1 -1
  6. package/dist/alpha/plugin.esm.js +3 -2
  7. package/dist/alpha/plugin.esm.js.map +1 -1
  8. package/dist/alpha.d.ts +23 -0
  9. package/dist/api.esm.js +1 -1
  10. package/dist/api.esm.js.map +1 -1
  11. package/dist/components/ActionsPage/ActionsPage.esm.js +4 -2
  12. package/dist/components/ActionsPage/ActionsPage.esm.js.map +1 -1
  13. package/dist/components/ListTasksPage/ListTasksPage.esm.js +4 -2
  14. package/dist/components/ListTasksPage/ListTasksPage.esm.js.map +1 -1
  15. package/dist/components/RenderSchema/RenderSchema.esm.js.map +1 -1
  16. package/dist/components/Router/Router.esm.js +9 -1
  17. package/dist/components/Router/Router.esm.js.map +1 -1
  18. package/dist/components/TemplatingExtensionsPage/TemplateFilters.esm.js +132 -0
  19. package/dist/components/TemplatingExtensionsPage/TemplateFilters.esm.js.map +1 -0
  20. package/dist/components/TemplatingExtensionsPage/TemplateGlobals.esm.js +168 -0
  21. package/dist/components/TemplatingExtensionsPage/TemplateGlobals.esm.js.map +1 -0
  22. package/dist/components/TemplatingExtensionsPage/TemplatingExtensionsPage.esm.js +250 -0
  23. package/dist/components/TemplatingExtensionsPage/TemplatingExtensionsPage.esm.js.map +1 -0
  24. package/dist/components/TemplatingExtensionsPage/functionArgs.esm.js +19 -0
  25. package/dist/components/TemplatingExtensionsPage/functionArgs.esm.js.map +1 -0
  26. package/dist/components/TemplatingExtensionsPage/navigation.esm.js +24 -0
  27. package/dist/components/TemplatingExtensionsPage/navigation.esm.js.map +1 -0
  28. package/dist/components/fields/EntityPicker/EntityPicker.esm.js +4 -1
  29. package/dist/components/fields/EntityPicker/EntityPicker.esm.js.map +1 -1
  30. package/dist/index.d.ts +1 -0
  31. package/dist/plugin.esm.js +3 -2
  32. package/dist/plugin.esm.js.map +1 -1
  33. package/dist/routes.esm.js +6 -1
  34. package/dist/routes.esm.js.map +1 -1
  35. package/dist/translation.esm.js +37 -0
  36. package/dist/translation.esm.js.map +1 -1
  37. package/package.json +22 -22
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplateGlobals.esm.js","sources":["../../../src/components/TemplatingExtensionsPage/TemplateGlobals.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { CodeSnippet, Link, MarkdownContent } from '@backstage/core-components';\nimport {\n ListTemplatingExtensionsResponse,\n TemplateGlobalFunction,\n} from '@backstage/plugin-scaffolder-react';\nimport Accordion from '@material-ui/core/Accordion';\nimport AccordionDetails from '@material-ui/core/AccordionDetails';\nimport AccordionSummary from '@material-ui/core/AccordionSummary';\nimport Box from '@material-ui/core/Box';\nimport { ClassNameMap } from '@material-ui/core/styles/withStyles';\nimport Typography from '@material-ui/core/Typography';\nimport ExpandMoreIcon from '@material-ui/icons/ExpandMore';\nimport classNames from 'classnames';\nimport React, { ReactElement, useState } from 'react';\nimport { scaffolderTranslationRef } from '../../translation';\nimport { Expanded, RenderSchema, SchemaRenderContext } from '../RenderSchema';\nimport { ScaffolderUsageExamplesTable } from '../ScaffolderUsageExamplesTable';\nimport { inspectFunctionArgSchema } from './functionArgs';\nimport { Extension, renderFragment } from './navigation';\nimport { TranslationMessages } from './types';\n\nconst FunctionDetailContent = ({\n classes,\n name,\n fn,\n t,\n}: {\n classes: ClassNameMap;\n name: string;\n fn: TemplateGlobalFunction;\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n}) => {\n const expanded = useState<Expanded>({});\n if (!Object.keys(fn).length) {\n return (\n <Typography style={{ fontStyle: 'italic' }}>\n {t('templatingExtensions.content.functions.notAvailable')}\n </Typography>\n );\n }\n const schema = fn.schema;\n const partialSchemaRenderContext: Omit<SchemaRenderContext, 'parentId'> = {\n classes,\n expanded,\n headings: [<Typography variant=\"h6\" component=\"h4\" />],\n };\n return (\n <React.Fragment key={`${name}.detail`}>\n {fn.description && <MarkdownContent content={fn.description} />}\n {schema?.arguments?.length && (\n <Box key={`${name}.args`} pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.functions.schema.arguments')}\n </Typography>\n {schema.arguments.map((arg, i) => {\n const [argSchema, required] = inspectFunctionArgSchema(arg);\n\n return (\n <React.Fragment key={i}>\n <div\n className={classNames({ [classes.argRequired]: required })}\n >\n <Typography\n variant=\"h6\"\n component=\"h4\"\n >{`[${i}]`}</Typography>\n </div>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.arg${i}`,\n ...partialSchemaRenderContext,\n headings: [<Typography variant=\"h6\" component=\"h5\" />],\n }}\n schema={argSchema}\n />\n </React.Fragment>\n );\n })}\n </Box>\n )}\n <Box pb={2}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.functions.schema.output')}\n </Typography>\n <RenderSchema\n strategy=\"root\"\n context={{\n parentId: `${name}.output`,\n ...partialSchemaRenderContext,\n }}\n schema={schema?.output ?? {}}\n />\n </Box>\n {fn.examples && (\n <Accordion>\n <AccordionSummary expandIcon={<ExpandMoreIcon />}>\n <Typography variant=\"h5\" component=\"h3\">\n {t('templatingExtensions.content.functions.examples')}\n </Typography>\n </AccordionSummary>\n <AccordionDetails>\n <Box pb={2}>\n <ScaffolderUsageExamplesTable examples={fn.examples} />\n </Box>\n </AccordionDetails>\n </Accordion>\n )}\n </React.Fragment>\n );\n};\n\nexport const TemplateGlobalFunctions = ({\n classes,\n functions,\n t,\n baseLink,\n selectedItem,\n}: {\n classes: ClassNameMap;\n functions: ListTemplatingExtensionsResponse['globals']['functions'];\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n baseLink: ReactElement<Parameters<typeof Link>[0]>;\n selectedItem: Extension | null;\n}) => {\n if (selectedItem && selectedItem.kind !== 'function') {\n return <></>;\n }\n if (!Object.keys(functions).length) {\n return (\n <div data-testid=\"no-functions\">\n {t('templatingExtensions.content.functions.notAvailable')}\n </div>\n );\n }\n return (\n <div data-testid=\"functions\">\n {Object.entries(\n selectedItem\n ? { [selectedItem.name]: functions[selectedItem.name] }\n : functions,\n ).map(([name, fn]) => {\n const fragment = renderFragment({ kind: 'function', name });\n return (\n <Box pb={4} key={name} data-testid={name}>\n <Typography\n id={fragment}\n variant=\"h4\"\n component=\"h2\"\n className={classes.code}\n >\n {name}\n </Typography>\n {React.cloneElement(baseLink, {\n to: `${baseLink.props.to}#${fragment}`,\n })}\n <FunctionDetailContent {...{ classes, name, fn, t }} />\n </Box>\n );\n })}\n </div>\n );\n};\n\nexport const TemplateGlobalValues = ({\n classes,\n t,\n values,\n baseLink,\n selectedItem,\n}: {\n classes: ClassNameMap;\n t: TranslationMessages<typeof scaffolderTranslationRef>;\n values: ListTemplatingExtensionsResponse['globals']['values'];\n baseLink: ReactElement<Parameters<typeof Link>[0]>;\n selectedItem: Extension | null;\n}) => {\n if (selectedItem && selectedItem.kind !== 'value') {\n return <></>;\n }\n if (!Object.keys(values).length) {\n return (\n <div data-testid=\"no-values\">\n {t('templatingExtensions.content.values.notAvailable')}\n </div>\n );\n }\n return (\n <div data-testid=\"values\">\n {Object.entries(\n selectedItem\n ? { [selectedItem.name]: values[selectedItem.name] }\n : values,\n ).map(([name, gv]) => {\n const fragment = renderFragment({ kind: 'value', name });\n return (\n <Box pb={4} key={name} data-testid={name}>\n <Typography\n id={fragment}\n variant=\"h4\"\n component=\"h2\"\n className={classes.code}\n >\n {name}\n </Typography>\n {React.cloneElement(baseLink, {\n to: `${baseLink.props.to}#${fragment}`,\n })}\n {gv.description && <MarkdownContent content={gv.description} />}\n <Box padding={1} data-testid={`${name}.value`}>\n <CodeSnippet\n text={JSON.stringify(gv.value, null, 2)}\n showCopyCodeButton\n language=\"json\"\n />\n </Box>\n </Box>\n );\n })}\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,250 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useRouteRef, useApi } from '@backstage/core-plugin-api';
3
+ import { editRouteRef, scaffolderListTaskRouteRef, rootRouteRef, actionsRouteRef, templatingExtensionsRouteRef } from '../../routes.esm.js';
4
+ import { makeStyles } from '@material-ui/core/styles';
5
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
6
+ import { scaffolderTranslationRef } from '../../translation.esm.js';
7
+ import { Page, Header, Content, Progress, ErrorPanel, EmptyState, Link } from '@backstage/core-components';
8
+ import { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';
9
+ import { ScaffolderPageContextMenu } from '@backstage/plugin-scaffolder-react/alpha';
10
+ import Box from '@material-ui/core/Box';
11
+ import InputAdornment from '@material-ui/core/InputAdornment';
12
+ import ListItemText from '@material-ui/core/ListItemText';
13
+ import Tab from '@material-ui/core/Tab';
14
+ import Tabs from '@material-ui/core/Tabs';
15
+ import TextField from '@material-ui/core/TextField';
16
+ import AllInclusiveIcon from '@material-ui/icons/AllInclusive';
17
+ import FilterListIcon from '@material-ui/icons/FilterList';
18
+ import FunctionsIcon from '@material-ui/icons/Functions';
19
+ import LinkIcon from '@material-ui/icons/Link';
20
+ import SearchIcon from '@material-ui/icons/Search';
21
+ import Autocomplete from '@material-ui/lab/Autocomplete';
22
+ import { useState, useEffect, useMemo } from 'react';
23
+ import { useNavigate } from 'react-router-dom';
24
+ import useAsync from 'react-use/esm/useAsync';
25
+ import { parseFragment, listTemplatingExtensions } from './navigation.esm.js';
26
+ import { TemplateFilters } from './TemplateFilters.esm.js';
27
+ import { TemplateGlobalFunctions, TemplateGlobalValues } from './TemplateGlobals.esm.js';
28
+
29
+ const useStyles = makeStyles((theme) => ({
30
+ code: {
31
+ fontFamily: "Menlo, monospace",
32
+ padding: theme.spacing(1),
33
+ backgroundColor: theme.palette.type === "dark" ? theme.palette.grey[700] : theme.palette.grey[300],
34
+ display: "inline-block",
35
+ borderRadius: 5,
36
+ border: `1px solid ${theme.palette.grey[500]}`,
37
+ position: "relative"
38
+ },
39
+ codeRequired: {
40
+ "&::after": {
41
+ position: "absolute",
42
+ content: '"*"',
43
+ top: 0,
44
+ right: theme.spacing(0.5),
45
+ fontWeight: "bolder",
46
+ color: theme.palette.error.light
47
+ }
48
+ },
49
+ argRequired: {
50
+ position: "relative",
51
+ "& > *": {
52
+ display: "inline",
53
+ position: "relative",
54
+ "&::after": {
55
+ position: "absolute",
56
+ content: '"*"',
57
+ top: 0,
58
+ right: theme.spacing(-1),
59
+ fontWeight: "bolder",
60
+ color: theme.palette.error.light
61
+ }
62
+ }
63
+ },
64
+ link: {
65
+ paddingLeft: theme.spacing(1),
66
+ cursor: "pointer"
67
+ },
68
+ tabs: {
69
+ display: "block",
70
+ minHeight: "initial",
71
+ overflow: "initial"
72
+ }
73
+ }));
74
+ const TemplatingExtensionsPageContent = ({
75
+ linkLocal
76
+ }) => {
77
+ const api = useApi(scaffolderApiRef);
78
+ const classes = useStyles();
79
+ const { t } = useTranslationRef(scaffolderTranslationRef);
80
+ const { loading, value, error } = useAsync(async () => {
81
+ if (api.listTemplatingExtensions) {
82
+ return api.listTemplatingExtensions();
83
+ }
84
+ console.warn(
85
+ "listTemplatingExtensions is not implemented in the scaffolderApi; please make sure to implement this method."
86
+ );
87
+ return Promise.resolve({
88
+ filters: {},
89
+ globals: { functions: {}, values: {} }
90
+ });
91
+ }, [api]);
92
+ const [tab, selectTab] = useState("filter");
93
+ const [selectedItem, setSelectedItem] = useState(null);
94
+ const [input, setInput] = useState("");
95
+ const handleTab = (_event, kind) => {
96
+ if (selectedItem?.kind !== kind) {
97
+ setSelectedItem(null);
98
+ setInput("");
99
+ }
100
+ selectTab(kind);
101
+ };
102
+ const selectItem = (item) => {
103
+ setSelectedItem(item);
104
+ if (item) {
105
+ selectTab(item.kind);
106
+ }
107
+ };
108
+ useEffect(() => {
109
+ if (value && window.location.hash) {
110
+ try {
111
+ selectTab(parseFragment(window.location.hash.substring(1)).kind);
112
+ document.querySelector(window.location.hash)?.scrollIntoView();
113
+ } catch (e) {
114
+ }
115
+ }
116
+ }, [value]);
117
+ const extensionKinds = useMemo(
118
+ () => ({
119
+ filter: {
120
+ icon: /* @__PURE__ */ jsx(FilterListIcon, {}),
121
+ label: t("templatingExtensions.content.filters.title")
122
+ },
123
+ function: {
124
+ icon: /* @__PURE__ */ jsx(FunctionsIcon, {}),
125
+ label: t("templatingExtensions.content.functions.title")
126
+ },
127
+ value: {
128
+ icon: /* @__PURE__ */ jsx(AllInclusiveIcon, {}),
129
+ label: t("templatingExtensions.content.values.title")
130
+ }
131
+ }),
132
+ [t]
133
+ );
134
+ const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);
135
+ if (loading) {
136
+ return /* @__PURE__ */ jsx(Progress, {});
137
+ }
138
+ if (error || !value) {
139
+ return /* @__PURE__ */ jsxs("div", { "data-testid": "empty", children: [
140
+ error && /* @__PURE__ */ jsx(ErrorPanel, { error }),
141
+ /* @__PURE__ */ jsx(
142
+ EmptyState,
143
+ {
144
+ missing: "info",
145
+ title: t("templatingExtensions.content.emptyState.title"),
146
+ description: t("templatingExtensions.content.emptyState.description")
147
+ }
148
+ )
149
+ ] });
150
+ }
151
+ const { filters, globals } = value;
152
+ const baseLink = /* @__PURE__ */ jsx(
153
+ Link,
154
+ {
155
+ className: classes.link,
156
+ to: templatingExtensionsLink(),
157
+ ...linkLocal ? {} : { target: "_blank", rel: "noopener noreferrer" },
158
+ children: /* @__PURE__ */ jsx(LinkIcon, {})
159
+ }
160
+ );
161
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
162
+ /* @__PURE__ */ jsx(
163
+ Autocomplete,
164
+ {
165
+ renderInput: (params) => /* @__PURE__ */ jsx(
166
+ TextField,
167
+ {
168
+ ...params,
169
+ "aria-label": t(
170
+ "templatingExtensions.content.searchFieldPlaceholder"
171
+ ),
172
+ placeholder: t(
173
+ "templatingExtensions.content.searchFieldPlaceholder"
174
+ ),
175
+ variant: "outlined",
176
+ InputProps: {
177
+ ...params.InputProps,
178
+ startAdornment: /* @__PURE__ */ jsx(InputAdornment, { position: "start", children: /* @__PURE__ */ jsx(SearchIcon, {}) })
179
+ }
180
+ }
181
+ ),
182
+ getOptionLabel: (option) => option.name,
183
+ getOptionSelected: (lhs, rhs) => lhs === rhs,
184
+ options: listTemplatingExtensions(value),
185
+ groupBy: (option) => option.kind,
186
+ renderGroup: (params) => /* @__PURE__ */ jsxs(Fragment, { children: [
187
+ /* @__PURE__ */ jsxs(Box, { display: "flex", alignItems: "center", children: [
188
+ extensionKinds[params.group].icon,
189
+ /* @__PURE__ */ jsx(Box, { sx: { ml: 1 }, children: extensionKinds[params.group].label })
190
+ ] }),
191
+ /* @__PURE__ */ jsx("ul", { children: params.children })
192
+ ] }),
193
+ renderOption: (option) => /* @__PURE__ */ jsx(ListItemText, { primary: option.name }),
194
+ onChange: (_event, option) => {
195
+ selectItem(option);
196
+ },
197
+ inputValue: input,
198
+ onInputChange: (_event, s) => setInput(s),
199
+ loading,
200
+ fullWidth: true,
201
+ clearOnEscape: true
202
+ }
203
+ ),
204
+ /* @__PURE__ */ jsx(Tabs, { value: tab, onChange: handleTab, centered: true, className: classes.tabs, children: Object.entries(extensionKinds).map(([k, v]) => /* @__PURE__ */ jsx(Tab, { value: k, ...v }, k)) }),
205
+ tab === "filter" && /* @__PURE__ */ jsx(TemplateFilters, { ...{ baseLink, t, classes, filters, selectedItem } }),
206
+ tab === "function" && /* @__PURE__ */ jsx(
207
+ TemplateGlobalFunctions,
208
+ {
209
+ functions: globals.functions,
210
+ ...{ baseLink, t, classes, selectedItem }
211
+ }
212
+ ),
213
+ tab === "value" && /* @__PURE__ */ jsx(
214
+ TemplateGlobalValues,
215
+ {
216
+ values: globals.values,
217
+ ...{ baseLink, t, classes, selectedItem }
218
+ }
219
+ )
220
+ ] });
221
+ };
222
+ const TemplatingExtensionsPage = () => {
223
+ const navigate = useNavigate();
224
+ const editorLink = useRouteRef(editRouteRef);
225
+ const tasksLink = useRouteRef(scaffolderListTaskRouteRef);
226
+ const createLink = useRouteRef(rootRouteRef);
227
+ const actionsLink = useRouteRef(actionsRouteRef);
228
+ const scaffolderPageContextMenuProps = {
229
+ onEditorClicked: () => navigate(editorLink()),
230
+ onActionsClicked: () => navigate(actionsLink()),
231
+ onTasksClicked: () => navigate(tasksLink()),
232
+ onCreateClicked: () => navigate(createLink())
233
+ };
234
+ const { t } = useTranslationRef(scaffolderTranslationRef);
235
+ return /* @__PURE__ */ jsxs(Page, { themeId: "home", children: [
236
+ /* @__PURE__ */ jsx(
237
+ Header,
238
+ {
239
+ pageTitleOverride: t("templatingExtensions.pageTitle"),
240
+ title: t("templatingExtensions.title"),
241
+ subtitle: t("templatingExtensions.subtitle"),
242
+ children: /* @__PURE__ */ jsx(ScaffolderPageContextMenu, { ...scaffolderPageContextMenuProps })
243
+ }
244
+ ),
245
+ /* @__PURE__ */ jsx(Content, { children: /* @__PURE__ */ jsx(TemplatingExtensionsPageContent, { linkLocal: true }) })
246
+ ] });
247
+ };
248
+
249
+ export { TemplatingExtensionsPage, TemplatingExtensionsPageContent };
250
+ //# sourceMappingURL=TemplatingExtensionsPage.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TemplatingExtensionsPage.esm.js","sources":["../../../src/components/TemplatingExtensionsPage/TemplatingExtensionsPage.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { useApi, useRouteRef } from '@backstage/core-plugin-api';\n\nimport {\n actionsRouteRef,\n editRouteRef,\n rootRouteRef,\n scaffolderListTaskRouteRef,\n templatingExtensionsRouteRef,\n} from '../../routes';\n\nimport { makeStyles } from '@material-ui/core/styles';\n\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../translation';\n\nimport {\n Content,\n EmptyState,\n ErrorPanel,\n Header,\n Link,\n Page,\n Progress,\n} from '@backstage/core-components';\nimport { scaffolderApiRef } from '@backstage/plugin-scaffolder-react';\nimport {\n ScaffolderPageContextMenu,\n ScaffolderPageContextMenuProps,\n} from '@backstage/plugin-scaffolder-react/alpha';\nimport Box from '@material-ui/core/Box';\nimport InputAdornment from '@material-ui/core/InputAdornment';\nimport ListItemText from '@material-ui/core/ListItemText';\nimport Tab from '@material-ui/core/Tab';\nimport Tabs from '@material-ui/core/Tabs';\nimport TextField from '@material-ui/core/TextField';\nimport AllInclusiveIcon from '@material-ui/icons/AllInclusive';\nimport FilterListIcon from '@material-ui/icons/FilterList';\nimport FunctionsIcon from '@material-ui/icons/Functions';\nimport LinkIcon from '@material-ui/icons/Link';\nimport SearchIcon from '@material-ui/icons/Search';\nimport Autocomplete from '@material-ui/lab/Autocomplete';\nimport { useEffect, useMemo, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n Extension,\n ExtensionKind,\n listTemplatingExtensions,\n parseFragment,\n} from './navigation';\nimport { TemplateFilters } from './TemplateFilters';\nimport {\n TemplateGlobalFunctions,\n TemplateGlobalValues,\n} from './TemplateGlobals';\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 argRequired: {\n position: 'relative',\n '& > *': {\n display: 'inline',\n position: 'relative',\n '&::after': {\n position: 'absolute',\n content: '\"*\"',\n top: 0,\n right: theme.spacing(-1),\n fontWeight: 'bolder',\n color: theme.palette.error.light,\n },\n },\n },\n\n link: {\n paddingLeft: theme.spacing(1),\n cursor: 'pointer',\n },\n\n tabs: {\n display: 'block',\n minHeight: 'initial',\n overflow: 'initial',\n },\n}));\n\nexport const TemplatingExtensionsPageContent = ({\n linkLocal,\n}: {\n linkLocal?: boolean;\n}) => {\n const api = useApi(scaffolderApiRef);\n const classes = useStyles();\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n const { loading, value, error } = useAsync(async () => {\n if (api.listTemplatingExtensions) {\n return api.listTemplatingExtensions();\n }\n // eslint-disable-next-line no-console\n console.warn(\n 'listTemplatingExtensions is not implemented in the scaffolderApi; please make sure to implement this method.',\n );\n return Promise.resolve({\n filters: {},\n globals: { functions: {}, values: {} },\n });\n }, [api]);\n\n const [tab, selectTab] = useState<ExtensionKind>('filter');\n const [selectedItem, setSelectedItem] = useState<Extension | null>(null);\n const [input, setInput] = useState<string>('');\n\n const handleTab = (_event: any, kind: ExtensionKind) => {\n if (selectedItem?.kind !== kind) {\n setSelectedItem(null);\n setInput('');\n }\n selectTab(kind);\n };\n\n const selectItem = (item: Extension | null) => {\n setSelectedItem(item);\n if (item) {\n selectTab(item.kind);\n }\n };\n\n useEffect(() => {\n if (value && window.location.hash) {\n try {\n selectTab(parseFragment(window.location.hash.substring(1)).kind);\n document.querySelector(window.location.hash)?.scrollIntoView();\n } catch (e) {\n // ignore bad link\n }\n }\n }, [value]);\n\n const extensionKinds = useMemo(\n () => ({\n filter: {\n icon: <FilterListIcon />,\n label: t('templatingExtensions.content.filters.title'),\n },\n function: {\n icon: <FunctionsIcon />,\n label: t('templatingExtensions.content.functions.title'),\n },\n value: {\n icon: <AllInclusiveIcon />,\n label: t('templatingExtensions.content.values.title'),\n },\n }),\n [t],\n );\n\n const templatingExtensionsLink = useRouteRef(templatingExtensionsRouteRef);\n\n if (loading) {\n return <Progress />;\n }\n if (error || !value) {\n return (\n <div data-testid=\"empty\">\n {error && <ErrorPanel error={error} />}\n <EmptyState\n missing=\"info\"\n title={t('templatingExtensions.content.emptyState.title')}\n description={t('templatingExtensions.content.emptyState.description')}\n />\n </div>\n );\n }\n const { filters, globals } = value;\n\n const baseLink = (\n <Link\n className={classes.link}\n to={templatingExtensionsLink()}\n {...(linkLocal ? {} : { target: '_blank', rel: 'noopener noreferrer' })}\n >\n <LinkIcon />\n </Link>\n );\n\n return (\n <>\n <Autocomplete\n renderInput={params => (\n <TextField\n {...params}\n aria-label={t(\n 'templatingExtensions.content.searchFieldPlaceholder',\n )}\n placeholder={t(\n 'templatingExtensions.content.searchFieldPlaceholder',\n )}\n variant=\"outlined\"\n InputProps={{\n ...params.InputProps,\n startAdornment: (\n <InputAdornment position=\"start\">\n <SearchIcon />\n </InputAdornment>\n ),\n }}\n />\n )}\n getOptionLabel={option => option.name}\n getOptionSelected={(lhs, rhs) => lhs === rhs}\n options={listTemplatingExtensions(value)}\n groupBy={option => option.kind}\n renderGroup={params => (\n <>\n <Box display=\"flex\" alignItems=\"center\">\n {extensionKinds[params.group as ExtensionKind].icon}\n <Box sx={{ ml: 1 }}>\n {extensionKinds[params.group as ExtensionKind].label}\n </Box>\n </Box>\n <ul>{params.children}</ul>\n </>\n )}\n renderOption={(option: Extension) => (\n <ListItemText primary={option.name} />\n )}\n onChange={(_event: any, option: Extension | null) => {\n selectItem(option);\n }}\n inputValue={input}\n onInputChange={(_event: any, s: string) => setInput(s)}\n loading={loading}\n fullWidth\n clearOnEscape\n />\n <Tabs value={tab} onChange={handleTab} centered className={classes.tabs}>\n {Object.entries(extensionKinds).map(([k, v]) => (\n <Tab key={k} value={k} {...v} />\n ))}\n </Tabs>\n {tab === 'filter' && (\n <TemplateFilters {...{ baseLink, t, classes, filters, selectedItem }} />\n )}\n {tab === 'function' && (\n <TemplateGlobalFunctions\n functions={globals.functions}\n {...{ baseLink, t, classes, selectedItem }}\n />\n )}\n {tab === 'value' && (\n <TemplateGlobalValues\n values={globals.values}\n {...{ baseLink, t, classes, selectedItem }}\n />\n )}\n </>\n );\n};\n\nexport const TemplatingExtensionsPage = () => {\n const navigate = useNavigate();\n const editorLink = useRouteRef(editRouteRef);\n const tasksLink = useRouteRef(scaffolderListTaskRouteRef);\n const createLink = useRouteRef(rootRouteRef);\n const actionsLink = useRouteRef(actionsRouteRef);\n\n const scaffolderPageContextMenuProps: ScaffolderPageContextMenuProps = {\n onEditorClicked: () => navigate(editorLink()),\n onActionsClicked: () => navigate(actionsLink()),\n onTasksClicked: () => navigate(tasksLink()),\n onCreateClicked: () => navigate(createLink()),\n };\n\n const { t } = useTranslationRef(scaffolderTranslationRef);\n\n return (\n <Page themeId=\"home\">\n <Header\n pageTitleOverride={t('templatingExtensions.pageTitle')}\n title={t('templatingExtensions.title')}\n subtitle={t('templatingExtensions.subtitle')}\n >\n <ScaffolderPageContextMenu {...scaffolderPageContextMenuProps} />\n </Header>\n <Content>\n <TemplatingExtensionsPageContent linkLocal />\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ function isSchema(d) {
2
+ return typeof d === "object";
3
+ }
4
+ function inspectFunctionArgSchema(schema) {
5
+ const hasOnlyKey = (k) => (o) => k in o && Object.keys(o).every((ok) => ok.startsWith("$") || ok === k);
6
+ if (isSchema(schema) && hasOnlyKey("anyOf")(schema) && schema.anyOf?.length === 2) {
7
+ const alt0 = schema.anyOf[0];
8
+ if (isSchema(alt0) && hasOnlyKey("not")(alt0)) {
9
+ const not = alt0.not;
10
+ if (isSchema(not) && !Object.keys(not).length) {
11
+ return [schema.anyOf[1], false];
12
+ }
13
+ }
14
+ }
15
+ return [schema, true];
16
+ }
17
+
18
+ export { inspectFunctionArgSchema };
19
+ //# sourceMappingURL=functionArgs.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"functionArgs.esm.js","sources":["../../../src/components/TemplatingExtensionsPage/functionArgs.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { JSONSchema7, JSONSchema7Definition } from 'json-schema';\n\nfunction isSchema(d: JSONSchema7Definition): d is JSONSchema7 {\n return typeof d === 'object';\n}\n\nexport function inspectFunctionArgSchema(\n schema: JSONSchema7Definition,\n): [schema: JSONSchema7Definition, required: boolean] {\n const hasOnlyKey = (k: string) => (o: any) =>\n k in o && Object.keys(o).every(ok => ok.startsWith('$') || ok === k);\n\n if (\n isSchema(schema) &&\n hasOnlyKey('anyOf')(schema) &&\n schema.anyOf?.length === 2\n ) {\n const alt0 = schema.anyOf[0];\n if (isSchema(alt0) && hasOnlyKey('not')(alt0)) {\n const not = alt0.not!;\n if (isSchema(not) && !Object.keys(not).length) {\n return [schema.anyOf[1], false];\n }\n }\n }\n return [schema, true];\n}\n"],"names":[],"mappings":"AAiBA,SAAS,SAAS,CAA4C,EAAA;AAC5D,EAAA,OAAO,OAAO,CAAM,KAAA,QAAA;AACtB;AAEO,SAAS,yBACd,MACoD,EAAA;AACpD,EAAA,MAAM,aAAa,CAAC,CAAA,KAAc,CAAC,CACjC,KAAA,CAAA,IAAK,KAAK,MAAO,CAAA,IAAA,CAAK,CAAC,CAAA,CAAE,MAAM,CAAM,EAAA,KAAA,EAAA,CAAG,WAAW,GAAG,CAAA,IAAK,OAAO,CAAC,CAAA;AAErE,EACE,IAAA,QAAA,CAAS,MAAM,CAAA,IACf,UAAW,CAAA,OAAO,CAAE,CAAA,MAAM,CAC1B,IAAA,MAAA,CAAO,KAAO,EAAA,MAAA,KAAW,CACzB,EAAA;AACA,IAAM,MAAA,IAAA,GAAO,MAAO,CAAA,KAAA,CAAM,CAAC,CAAA;AAC3B,IAAA,IAAI,SAAS,IAAI,CAAA,IAAK,WAAW,KAAK,CAAA,CAAE,IAAI,CAAG,EAAA;AAC7C,MAAA,MAAM,MAAM,IAAK,CAAA,GAAA;AACjB,MAAI,IAAA,QAAA,CAAS,GAAG,CAAK,IAAA,CAAC,OAAO,IAAK,CAAA,GAAG,EAAE,MAAQ,EAAA;AAC7C,QAAA,OAAO,CAAC,MAAA,CAAO,KAAM,CAAA,CAAC,GAAG,KAAK,CAAA;AAAA;AAChC;AACF;AAEF,EAAO,OAAA,CAAC,QAAQ,IAAI,CAAA;AACtB;;;;"}
@@ -0,0 +1,24 @@
1
+ const kinds = ["filter", "function", "value"];
2
+ const listTemplatingExtensions = (data) => {
3
+ const exts = (kind, record) => record ? Object.keys(record).map((name) => ({ kind, name })) : [];
4
+ return [
5
+ ...exts("filter", data.filters),
6
+ ...exts("function", data.globals?.functions),
7
+ ...exts("value", data.globals?.values)
8
+ ];
9
+ };
10
+ const renderFragment = (e) => `${e.kind}_${e.name}`;
11
+ const parseFragment = (fragment) => {
12
+ const [k, name] = fragment.split("_", 2);
13
+ const kind = k;
14
+ if (kinds.includes(kind)) {
15
+ return {
16
+ kind,
17
+ name
18
+ };
19
+ }
20
+ throw Error(fragment);
21
+ };
22
+
23
+ export { listTemplatingExtensions, parseFragment, renderFragment };
24
+ //# sourceMappingURL=navigation.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"navigation.esm.js","sources":["../../../src/components/TemplatingExtensionsPage/navigation.ts"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ListTemplatingExtensionsResponse } from '@backstage/plugin-scaffolder-react';\n\nconst kinds = ['filter', 'function', 'value'] as const;\n\nexport type ExtensionKind = (typeof kinds)[number];\n\nexport type Extension = {\n kind: ExtensionKind;\n name: string;\n};\n\nexport const listTemplatingExtensions = (\n data: Partial<Pick<ListTemplatingExtensionsResponse, 'filters'>> &\n Partial<{ globals: Partial<ListTemplatingExtensionsResponse['globals']> }>,\n): Extension[] => {\n const exts = (\n kind: ExtensionKind,\n record: Record<string, any> | undefined,\n ): Extension[] =>\n record ? Object.keys(record).map((name: string) => ({ kind, name })) : [];\n\n return [\n ...exts('filter', data.filters),\n ...exts('function', data.globals?.functions),\n ...exts('value', data.globals?.values),\n ];\n};\n\nexport const renderFragment = (e: Extension) => `${e.kind}_${e.name}`;\n\nexport const parseFragment = (fragment: string): Extension => {\n const [k, name] = fragment.split('_', 2);\n const kind = k as ExtensionKind;\n if (kinds.includes(kind)) {\n return {\n kind,\n name,\n };\n }\n throw Error(fragment);\n};\n"],"names":[],"mappings":"AAiBA,MAAM,KAAQ,GAAA,CAAC,QAAU,EAAA,UAAA,EAAY,OAAO,CAAA;AAS/B,MAAA,wBAAA,GAA2B,CACtC,IAEgB,KAAA;AAChB,EAAA,MAAM,OAAO,CACX,IAAA,EACA,MAEA,KAAA,MAAA,GAAS,OAAO,IAAK,CAAA,MAAM,CAAE,CAAA,GAAA,CAAI,CAAC,IAAkB,MAAA,EAAE,MAAM,IAAK,EAAA,CAAE,IAAI,EAAC;AAE1E,EAAO,OAAA;AAAA,IACL,GAAG,IAAA,CAAK,QAAU,EAAA,IAAA,CAAK,OAAO,CAAA;AAAA,IAC9B,GAAG,IAAA,CAAK,UAAY,EAAA,IAAA,CAAK,SAAS,SAAS,CAAA;AAAA,IAC3C,GAAG,IAAA,CAAK,OAAS,EAAA,IAAA,CAAK,SAAS,MAAM;AAAA,GACvC;AACF;AAEa,MAAA,cAAA,GAAiB,CAAC,CAAiB,KAAA,CAAA,EAAG,EAAE,IAAI,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA;AAEtD,MAAA,aAAA,GAAgB,CAAC,QAAgC,KAAA;AAC5D,EAAA,MAAM,CAAC,CAAG,EAAA,IAAI,IAAI,QAAS,CAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AACvC,EAAA,MAAM,IAAO,GAAA,CAAA;AACb,EAAI,IAAA,KAAA,CAAM,QAAS,CAAA,IAAI,CAAG,EAAA;AACxB,IAAO,OAAA;AAAA,MACL,IAAA;AAAA,MACA;AAAA,KACF;AAAA;AAEF,EAAA,MAAM,MAAM,QAAQ,CAAA;AACtB;;;;"}
@@ -36,10 +36,13 @@ const EntityPicker = (props) => {
36
36
  const entityPresentationApi = useApi(entityPresentationApiRef);
37
37
  const { value: entities, loading } = useAsync(async () => {
38
38
  const fields = [
39
+ "kind",
39
40
  "metadata.name",
40
41
  "metadata.namespace",
41
42
  "metadata.title",
42
- "kind"
43
+ "metadata.description",
44
+ "spec.profile.displayName",
45
+ "spec.type"
43
46
  ];
44
47
  const { items } = await catalogApi.getEntities(
45
48
  catalogFilter ? { filter: catalogFilter, fields } : { filter: void 0, fields }
@@ -1 +1 @@
1
- {"version":3,"file":"EntityPicker.esm.js","sources":["../../../../src/components/fields/EntityPicker/EntityPicker.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 {\n type EntityFilterQuery,\n CATALOG_FILTER_EXISTS,\n} from '@backstage/catalog-client';\nimport {\n Entity,\n parseEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n EntityDisplayName,\n EntityRefPresentationSnapshot,\n catalogApiRef,\n entityPresentationApiRef,\n} from '@backstage/plugin-catalog-react';\nimport TextField from '@material-ui/core/TextField';\nimport Autocomplete, {\n AutocompleteChangeReason,\n createFilterOptions,\n} from '@material-ui/lab/Autocomplete';\nimport { useCallback, useEffect } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n EntityPickerFilterQueryValue,\n EntityPickerProps,\n EntityPickerUiOptions,\n EntityPickerFilterQuery,\n} from './schema';\nimport { VirtualizedListbox } from '../VirtualizedListbox';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { ScaffolderField } from '@backstage/plugin-scaffolder-react/alpha';\n\nexport { EntityPickerSchema } from './schema';\n\n/**\n * The underlying component that is rendered in the form for the `EntityPicker`\n * field extension.\n *\n * @public\n */\nexport const EntityPicker = (props: EntityPickerProps) => {\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const {\n onChange,\n schema: {\n title = t('fields.entityPicker.title'),\n description = t('fields.entityPicker.description'),\n },\n required,\n uiSchema,\n rawErrors,\n formData,\n idSchema,\n errors,\n } = props;\n const catalogFilter = buildCatalogFilter(uiSchema);\n const defaultKind = uiSchema['ui:options']?.defaultKind;\n const defaultNamespace =\n uiSchema['ui:options']?.defaultNamespace || undefined;\n const isDisabled = uiSchema?.['ui:disabled'] ?? false;\n\n const catalogApi = useApi(catalogApiRef);\n const entityPresentationApi = useApi(entityPresentationApiRef);\n\n const { value: entities, loading } = useAsync(async () => {\n const fields = [\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n 'kind',\n ];\n const { items } = await catalogApi.getEntities(\n catalogFilter\n ? { filter: catalogFilter, fields }\n : { filter: undefined, fields },\n );\n\n const entityRefToPresentation = new Map<\n string,\n EntityRefPresentationSnapshot\n >(\n await Promise.all(\n items.map(async item => {\n const presentation = await entityPresentationApi.forEntity(item)\n .promise;\n return [stringifyEntityRef(item), presentation] as [\n string,\n EntityRefPresentationSnapshot,\n ];\n }),\n ),\n );\n\n return { catalogEntities: items, entityRefToPresentation };\n });\n\n const allowArbitraryValues =\n uiSchema['ui:options']?.allowArbitraryValues ?? true;\n\n const getLabel = useCallback(\n (freeSoloValue: string) => {\n try {\n // Will throw if defaultKind or defaultNamespace are not set\n const parsedRef = parseEntityRef(freeSoloValue, {\n defaultKind,\n defaultNamespace,\n });\n\n return stringifyEntityRef(parsedRef);\n } catch (err) {\n return freeSoloValue;\n }\n },\n [defaultKind, defaultNamespace],\n );\n\n const onSelect = useCallback(\n (_: any, ref: string | Entity | null, reason: AutocompleteChangeReason) => {\n // ref can either be a string from free solo entry or\n if (typeof ref !== 'string') {\n // if ref does not exist: pass 'undefined' to trigger validation for required value\n onChange(ref ? stringifyEntityRef(ref as Entity) : undefined);\n } else {\n if (reason === 'blur' || reason === 'create-option') {\n // Add in default namespace, etc.\n let entityRef = ref;\n try {\n // Attempt to parse the entity ref into it's full form.\n entityRef = stringifyEntityRef(\n parseEntityRef(ref as string, {\n defaultKind,\n defaultNamespace,\n }),\n );\n } catch (err) {\n // If the passed in value isn't an entity ref, do nothing.\n }\n // We need to check against formData here as that's the previous value for this field.\n if (formData !== ref || allowArbitraryValues) {\n onChange(entityRef);\n }\n }\n }\n },\n [onChange, formData, defaultKind, defaultNamespace, allowArbitraryValues],\n );\n\n // Since free solo can be enabled, attempt to parse as a full entity ref first, then fall\n // back to the given value.\n const selectedEntity =\n entities?.catalogEntities.find(e => stringifyEntityRef(e) === formData) ??\n (allowArbitraryValues && formData ? getLabel(formData) : '');\n\n useEffect(() => {\n if (\n required &&\n !allowArbitraryValues &&\n entities?.catalogEntities.length === 1 &&\n selectedEntity === ''\n ) {\n onChange(stringifyEntityRef(entities.catalogEntities[0]));\n }\n }, [entities, onChange, selectedEntity, required, allowArbitraryValues]);\n\n return (\n <ScaffolderField\n rawErrors={rawErrors}\n rawDescription={description}\n required={required}\n disabled={isDisabled}\n errors={errors}\n >\n <Autocomplete\n disabled={\n isDisabled ||\n (required &&\n !allowArbitraryValues &&\n entities?.catalogEntities.length === 1)\n }\n id={idSchema?.$id}\n value={selectedEntity}\n loading={loading}\n onChange={onSelect}\n options={entities?.catalogEntities || []}\n getOptionLabel={option =>\n // option can be a string due to freeSolo.\n typeof option === 'string'\n ? option\n : entities?.entityRefToPresentation.get(stringifyEntityRef(option))\n ?.entityRef!\n }\n autoSelect\n freeSolo={allowArbitraryValues}\n renderInput={params => (\n <TextField\n {...params}\n label={title}\n margin=\"dense\"\n variant=\"outlined\"\n required={required}\n disabled={isDisabled}\n InputProps={params.InputProps}\n />\n )}\n renderOption={option => <EntityDisplayName entityRef={option} />}\n filterOptions={createFilterOptions<Entity>({\n stringify: option =>\n entities?.entityRefToPresentation.get(stringifyEntityRef(option))\n ?.primaryTitle!,\n })}\n ListboxComponent={VirtualizedListbox}\n />\n </ScaffolderField>\n );\n};\n\n/**\n * Converts a especial `{exists: true}` value to the `CATALOG_FILTER_EXISTS` symbol.\n *\n * @param value - The value to convert.\n * @returns The converted value.\n */\nfunction convertOpsValues(\n value: Exclude<EntityPickerFilterQueryValue, Array<any>>,\n): string | symbol {\n if (typeof value === 'object' && value.exists) {\n return CATALOG_FILTER_EXISTS;\n }\n return value?.toString();\n}\n\n/**\n * Converts schema filters to entity filter query, replacing `{exists:true}` values\n * with the constant `CATALOG_FILTER_EXISTS`.\n *\n * @param schemaFilters - An object containing schema filters with keys as filter names\n * and values as filter values.\n * @returns An object with the same keys as the input object, but with `{exists:true}` values\n * transformed to `CATALOG_FILTER_EXISTS` symbol.\n */\nfunction convertSchemaFiltersToQuery(\n schemaFilters: EntityPickerFilterQuery,\n): Exclude<EntityFilterQuery, Array<any>> {\n const query: EntityFilterQuery = {};\n\n for (const [key, value] of Object.entries(schemaFilters)) {\n if (Array.isArray(value)) {\n query[key] = value;\n } else {\n query[key] = convertOpsValues(value);\n }\n }\n\n return query;\n}\n\n/**\n * Builds an `EntityFilterQuery` based on the `uiSchema` passed in.\n * If `catalogFilter` is specified in the `uiSchema`, it is converted to a `EntityFilterQuery`.\n * If `allowedKinds` is specified in the `uiSchema` will support the legacy `allowedKinds` option.\n *\n * @param uiSchema The `uiSchema` of an `EntityPicker` component.\n * @returns An `EntityFilterQuery` based on the `uiSchema`, or `undefined` if `catalogFilter` is not specified in the `uiSchema`.\n */\nfunction buildCatalogFilter(\n uiSchema: EntityPickerProps['uiSchema'],\n): EntityFilterQuery | undefined {\n const allowedKinds = uiSchema['ui:options']?.allowedKinds;\n\n const catalogFilter: EntityPickerUiOptions['catalogFilter'] | undefined =\n uiSchema['ui:options']?.catalogFilter ||\n (allowedKinds && { kind: allowedKinds });\n\n if (!catalogFilter) {\n return undefined;\n }\n\n if (Array.isArray(catalogFilter)) {\n return catalogFilter.map(convertSchemaFiltersToQuery);\n }\n\n return convertSchemaFiltersToQuery(catalogFilter);\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EntityPicker.esm.js","sources":["../../../../src/components/fields/EntityPicker/EntityPicker.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 {\n type EntityFilterQuery,\n CATALOG_FILTER_EXISTS,\n} from '@backstage/catalog-client';\nimport {\n Entity,\n parseEntityRef,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n EntityDisplayName,\n EntityRefPresentationSnapshot,\n catalogApiRef,\n entityPresentationApiRef,\n} from '@backstage/plugin-catalog-react';\nimport TextField from '@material-ui/core/TextField';\nimport Autocomplete, {\n AutocompleteChangeReason,\n createFilterOptions,\n} from '@material-ui/lab/Autocomplete';\nimport { useCallback, useEffect } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport {\n EntityPickerFilterQueryValue,\n EntityPickerProps,\n EntityPickerUiOptions,\n EntityPickerFilterQuery,\n} from './schema';\nimport { VirtualizedListbox } from '../VirtualizedListbox';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { scaffolderTranslationRef } from '../../../translation';\nimport { ScaffolderField } from '@backstage/plugin-scaffolder-react/alpha';\n\nexport { EntityPickerSchema } from './schema';\n\n/**\n * The underlying component that is rendered in the form for the `EntityPicker`\n * field extension.\n *\n * @public\n */\nexport const EntityPicker = (props: EntityPickerProps) => {\n const { t } = useTranslationRef(scaffolderTranslationRef);\n const {\n onChange,\n schema: {\n title = t('fields.entityPicker.title'),\n description = t('fields.entityPicker.description'),\n },\n required,\n uiSchema,\n rawErrors,\n formData,\n idSchema,\n errors,\n } = props;\n const catalogFilter = buildCatalogFilter(uiSchema);\n const defaultKind = uiSchema['ui:options']?.defaultKind;\n const defaultNamespace =\n uiSchema['ui:options']?.defaultNamespace || undefined;\n const isDisabled = uiSchema?.['ui:disabled'] ?? false;\n\n const catalogApi = useApi(catalogApiRef);\n const entityPresentationApi = useApi(entityPresentationApiRef);\n\n const { value: entities, loading } = useAsync(async () => {\n const fields = [\n 'kind',\n 'metadata.name',\n 'metadata.namespace',\n 'metadata.title',\n 'metadata.description',\n 'spec.profile.displayName',\n 'spec.type',\n ];\n const { items } = await catalogApi.getEntities(\n catalogFilter\n ? { filter: catalogFilter, fields }\n : { filter: undefined, fields },\n );\n\n const entityRefToPresentation = new Map<\n string,\n EntityRefPresentationSnapshot\n >(\n await Promise.all(\n items.map(async item => {\n const presentation = await entityPresentationApi.forEntity(item)\n .promise;\n return [stringifyEntityRef(item), presentation] as [\n string,\n EntityRefPresentationSnapshot,\n ];\n }),\n ),\n );\n\n return { catalogEntities: items, entityRefToPresentation };\n });\n\n const allowArbitraryValues =\n uiSchema['ui:options']?.allowArbitraryValues ?? true;\n\n const getLabel = useCallback(\n (freeSoloValue: string) => {\n try {\n // Will throw if defaultKind or defaultNamespace are not set\n const parsedRef = parseEntityRef(freeSoloValue, {\n defaultKind,\n defaultNamespace,\n });\n\n return stringifyEntityRef(parsedRef);\n } catch (err) {\n return freeSoloValue;\n }\n },\n [defaultKind, defaultNamespace],\n );\n\n const onSelect = useCallback(\n (_: any, ref: string | Entity | null, reason: AutocompleteChangeReason) => {\n // ref can either be a string from free solo entry or\n if (typeof ref !== 'string') {\n // if ref does not exist: pass 'undefined' to trigger validation for required value\n onChange(ref ? stringifyEntityRef(ref as Entity) : undefined);\n } else {\n if (reason === 'blur' || reason === 'create-option') {\n // Add in default namespace, etc.\n let entityRef = ref;\n try {\n // Attempt to parse the entity ref into it's full form.\n entityRef = stringifyEntityRef(\n parseEntityRef(ref as string, {\n defaultKind,\n defaultNamespace,\n }),\n );\n } catch (err) {\n // If the passed in value isn't an entity ref, do nothing.\n }\n // We need to check against formData here as that's the previous value for this field.\n if (formData !== ref || allowArbitraryValues) {\n onChange(entityRef);\n }\n }\n }\n },\n [onChange, formData, defaultKind, defaultNamespace, allowArbitraryValues],\n );\n\n // Since free solo can be enabled, attempt to parse as a full entity ref first, then fall\n // back to the given value.\n const selectedEntity =\n entities?.catalogEntities.find(e => stringifyEntityRef(e) === formData) ??\n (allowArbitraryValues && formData ? getLabel(formData) : '');\n\n useEffect(() => {\n if (\n required &&\n !allowArbitraryValues &&\n entities?.catalogEntities.length === 1 &&\n selectedEntity === ''\n ) {\n onChange(stringifyEntityRef(entities.catalogEntities[0]));\n }\n }, [entities, onChange, selectedEntity, required, allowArbitraryValues]);\n\n return (\n <ScaffolderField\n rawErrors={rawErrors}\n rawDescription={description}\n required={required}\n disabled={isDisabled}\n errors={errors}\n >\n <Autocomplete\n disabled={\n isDisabled ||\n (required &&\n !allowArbitraryValues &&\n entities?.catalogEntities.length === 1)\n }\n id={idSchema?.$id}\n value={selectedEntity}\n loading={loading}\n onChange={onSelect}\n options={entities?.catalogEntities || []}\n getOptionLabel={option =>\n // option can be a string due to freeSolo.\n typeof option === 'string'\n ? option\n : entities?.entityRefToPresentation.get(stringifyEntityRef(option))\n ?.entityRef!\n }\n autoSelect\n freeSolo={allowArbitraryValues}\n renderInput={params => (\n <TextField\n {...params}\n label={title}\n margin=\"dense\"\n variant=\"outlined\"\n required={required}\n disabled={isDisabled}\n InputProps={params.InputProps}\n />\n )}\n renderOption={option => <EntityDisplayName entityRef={option} />}\n filterOptions={createFilterOptions<Entity>({\n stringify: option =>\n entities?.entityRefToPresentation.get(stringifyEntityRef(option))\n ?.primaryTitle!,\n })}\n ListboxComponent={VirtualizedListbox}\n />\n </ScaffolderField>\n );\n};\n\n/**\n * Converts a especial `{exists: true}` value to the `CATALOG_FILTER_EXISTS` symbol.\n *\n * @param value - The value to convert.\n * @returns The converted value.\n */\nfunction convertOpsValues(\n value: Exclude<EntityPickerFilterQueryValue, Array<any>>,\n): string | symbol {\n if (typeof value === 'object' && value.exists) {\n return CATALOG_FILTER_EXISTS;\n }\n return value?.toString();\n}\n\n/**\n * Converts schema filters to entity filter query, replacing `{exists:true}` values\n * with the constant `CATALOG_FILTER_EXISTS`.\n *\n * @param schemaFilters - An object containing schema filters with keys as filter names\n * and values as filter values.\n * @returns An object with the same keys as the input object, but with `{exists:true}` values\n * transformed to `CATALOG_FILTER_EXISTS` symbol.\n */\nfunction convertSchemaFiltersToQuery(\n schemaFilters: EntityPickerFilterQuery,\n): Exclude<EntityFilterQuery, Array<any>> {\n const query: EntityFilterQuery = {};\n\n for (const [key, value] of Object.entries(schemaFilters)) {\n if (Array.isArray(value)) {\n query[key] = value;\n } else {\n query[key] = convertOpsValues(value);\n }\n }\n\n return query;\n}\n\n/**\n * Builds an `EntityFilterQuery` based on the `uiSchema` passed in.\n * If `catalogFilter` is specified in the `uiSchema`, it is converted to a `EntityFilterQuery`.\n * If `allowedKinds` is specified in the `uiSchema` will support the legacy `allowedKinds` option.\n *\n * @param uiSchema The `uiSchema` of an `EntityPicker` component.\n * @returns An `EntityFilterQuery` based on the `uiSchema`, or `undefined` if `catalogFilter` is not specified in the `uiSchema`.\n */\nfunction buildCatalogFilter(\n uiSchema: EntityPickerProps['uiSchema'],\n): EntityFilterQuery | undefined {\n const allowedKinds = uiSchema['ui:options']?.allowedKinds;\n\n const catalogFilter: EntityPickerUiOptions['catalogFilter'] | undefined =\n uiSchema['ui:options']?.catalogFilter ||\n (allowedKinds && { kind: allowedKinds });\n\n if (!catalogFilter) {\n return undefined;\n }\n\n if (Array.isArray(catalogFilter)) {\n return catalogFilter.map(convertSchemaFiltersToQuery);\n }\n\n return convertSchemaFiltersToQuery(catalogFilter);\n}\n"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -117,6 +117,7 @@ declare const scaffolderPlugin: _backstage_core_plugin_api.BackstagePlugin<{
117
117
  editor: _backstage_core_plugin_api.SubRouteRef<undefined>;
118
118
  customFields: _backstage_core_plugin_api.SubRouteRef<undefined>;
119
119
  templateForm: _backstage_core_plugin_api.SubRouteRef<undefined>;
120
+ templatingExtensions: _backstage_core_plugin_api.SubRouteRef<undefined>;
120
121
  }, {
121
122
  registerComponent: _backstage_core_plugin_api.ExternalRouteRef<undefined, true>;
122
123
  viewTechDoc: _backstage_core_plugin_api.ExternalRouteRef<{
@@ -12,7 +12,7 @@ import { RepoUrlPicker } from './components/fields/RepoUrlPicker/RepoUrlPicker.e
12
12
  import { createPlugin, createApiFactory, discoveryApiRef, fetchApiRef, identityApiRef, createRoutableExtension } from '@backstage/core-plugin-api';
13
13
  import { OwnedEntityPicker } from './components/fields/OwnedEntityPicker/OwnedEntityPicker.esm.js';
14
14
  import { EntityTagsPicker } from './components/fields/EntityTagsPicker/EntityTagsPicker.esm.js';
15
- import { rootRouteRef, selectedTemplateRouteRef, scaffolderTaskRouteRef, actionsRouteRef, scaffolderListTaskRouteRef, editRouteRef, editorRouteRef, customFieldsRouteRef, templateFormRouteRef, registerComponentRouteRef, viewTechDocRouteRef } from './routes.esm.js';
15
+ import { rootRouteRef, selectedTemplateRouteRef, scaffolderTaskRouteRef, actionsRouteRef, scaffolderListTaskRouteRef, editRouteRef, editorRouteRef, customFieldsRouteRef, templateFormRouteRef, templatingExtensionsRouteRef, registerComponentRouteRef, viewTechDocRouteRef } from './routes.esm.js';
16
16
  import { MyGroupsPicker } from './components/fields/MyGroupsPicker/MyGroupsPicker.esm.js';
17
17
  import { RepoBranchPicker } from './components/fields/RepoBranchPicker/RepoBranchPicker.esm.js';
18
18
  import { RepoBranchPickerSchema } from './components/fields/RepoBranchPicker/schema.esm.js';
@@ -65,7 +65,8 @@ const scaffolderPlugin = createPlugin({
65
65
  edit: editRouteRef,
66
66
  editor: editorRouteRef,
67
67
  customFields: customFieldsRouteRef,
68
- templateForm: templateFormRouteRef
68
+ templateForm: templateFormRouteRef,
69
+ templatingExtensions: templatingExtensionsRouteRef
69
70
  },
70
71
  externalRoutes: {
71
72
  registerComponent: registerComponentRouteRef,
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { scmIntegrationsApiRef } from '@backstage/integration-react';\nimport {\n createScaffolderFieldExtension,\n scaffolderApiRef,\n} from '@backstage/plugin-scaffolder-react';\nimport { ScaffolderClient } from './api';\nimport {\n EntityPicker,\n EntityPickerSchema,\n} from './components/fields/EntityPicker/EntityPicker';\nimport { entityNamePickerValidation } from './components/fields/EntityNamePicker';\nimport {\n EntityNamePicker,\n EntityNamePickerSchema,\n} from './components/fields/EntityNamePicker/EntityNamePicker';\nimport {\n OwnerPicker,\n OwnerPickerSchema,\n} from './components/fields/OwnerPicker/OwnerPicker';\nimport {\n MultiEntityPicker,\n MultiEntityPickerSchema,\n validateMultiEntityPickerValidation,\n} from './components/fields/MultiEntityPicker/MultiEntityPicker';\nimport { repoPickerValidation } from './components/fields/RepoUrlPicker';\nimport {\n RepoUrlPicker,\n RepoUrlPickerSchema,\n} from './components/fields/RepoUrlPicker/RepoUrlPicker';\nimport {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n OwnedEntityPicker,\n OwnedEntityPickerSchema,\n} from './components/fields/OwnedEntityPicker/OwnedEntityPicker';\nimport {\n EntityTagsPicker,\n EntityTagsPickerSchema,\n} from './components/fields/EntityTagsPicker/EntityTagsPicker';\nimport {\n registerComponentRouteRef,\n rootRouteRef,\n viewTechDocRouteRef,\n selectedTemplateRouteRef,\n scaffolderTaskRouteRef,\n scaffolderListTaskRouteRef,\n actionsRouteRef,\n editRouteRef,\n editorRouteRef,\n customFieldsRouteRef,\n templateFormRouteRef,\n} from './routes';\nimport {\n MyGroupsPicker,\n MyGroupsPickerSchema,\n} from './components/fields/MyGroupsPicker/MyGroupsPicker';\nimport { RepoBranchPicker } from './components/fields/RepoBranchPicker/RepoBranchPicker';\nimport { RepoBranchPickerSchema } from './components/fields/RepoBranchPicker/schema';\nimport { formDecoratorsApiRef } from './alpha/api/ref';\nimport { DefaultScaffolderFormDecoratorsApi } from './alpha/api/FormDecoratorsApi';\nimport { formFieldsApiRef } from '@backstage/plugin-scaffolder-react/alpha';\n\n/**\n * The main plugin export for the scaffolder.\n * @public\n */\nexport const scaffolderPlugin = createPlugin({\n id: 'scaffolder',\n apis: [\n createApiFactory({\n api: scaffolderApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n scmIntegrationsApi: scmIntegrationsApiRef,\n fetchApi: fetchApiRef,\n identityApi: identityApiRef,\n },\n factory: ({ discoveryApi, scmIntegrationsApi, fetchApi, identityApi }) =>\n new ScaffolderClient({\n discoveryApi,\n scmIntegrationsApi,\n fetchApi,\n identityApi,\n }),\n }),\n createApiFactory({\n api: formDecoratorsApiRef,\n deps: {},\n factory: () => DefaultScaffolderFormDecoratorsApi.create(),\n }),\n createApiFactory({\n api: formFieldsApiRef,\n deps: {},\n factory: () => ({ getFormFields: async () => [] }),\n }),\n ],\n routes: {\n root: rootRouteRef,\n selectedTemplate: selectedTemplateRouteRef,\n ongoingTask: scaffolderTaskRouteRef,\n actions: actionsRouteRef,\n listTasks: scaffolderListTaskRouteRef,\n edit: editRouteRef,\n editor: editorRouteRef,\n customFields: customFieldsRouteRef,\n templateForm: templateFormRouteRef,\n },\n externalRoutes: {\n registerComponent: registerComponentRouteRef,\n viewTechDoc: viewTechDocRouteRef,\n },\n});\n\n/**\n * A field extension for selecting an Entity that exists in the Catalog.\n *\n * @public\n */\nexport const EntityPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: EntityPicker,\n name: 'EntityPicker',\n schema: EntityPickerSchema,\n }),\n);\n\n/**\n * The field extension for selecting a name for a new Entity in the Catalog.\n *\n * @public\n */\nexport const EntityNamePickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: EntityNamePicker,\n name: 'EntityNamePicker',\n validation: entityNamePickerValidation,\n schema: EntityNamePickerSchema,\n }),\n);\n\n/**\n * A field extension for selecting multiple entities that exists in the Catalog.\n *\n * @public\n */\nexport const MultiEntityPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: MultiEntityPicker,\n name: 'MultiEntityPicker',\n schema: MultiEntityPickerSchema,\n validation: validateMultiEntityPickerValidation,\n }),\n);\n\n/**\n * The field extension which provides the ability to select a RepositoryUrl.\n * Currently, this is an encoded URL that looks something like the following `github.com?repo=myRepoName&owner=backstage`.\n *\n * @public\n */\nexport const RepoUrlPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: RepoUrlPicker,\n name: 'RepoUrlPicker',\n validation: repoPickerValidation,\n schema: RepoUrlPickerSchema,\n }),\n);\n\n/**\n * A field extension for picking users and groups out of the Catalog.\n *\n * @public\n */\nexport const OwnerPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: OwnerPicker,\n name: 'OwnerPicker',\n schema: OwnerPickerSchema,\n }),\n);\n\n/**\n * A field extension for picking groups a user belongs to out of the catalog.\n *\n * @public\n */\nexport const MyGroupsPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: MyGroupsPicker,\n name: 'MyGroupsPicker',\n schema: MyGroupsPickerSchema,\n }),\n);\n\n/**\n * The Router and main entrypoint to the Scaffolder plugin.\n *\n * @public\n */\nexport const ScaffolderPage = scaffolderPlugin.provide(\n createRoutableExtension({\n name: 'ScaffolderPage',\n component: () => import('./components/Router').then(m => m.Router),\n mountPoint: rootRouteRef,\n }),\n);\n\n/**\n * A field extension to show all the Entities that are owned by the current logged-in User for use in templates.\n *\n * @public\n */\nexport const OwnedEntityPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: OwnedEntityPicker,\n name: 'OwnedEntityPicker',\n schema: OwnedEntityPickerSchema,\n }),\n);\n\n/**\n * EntityTagsPickerFieldExtension\n * @public\n */\nexport const EntityTagsPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: EntityTagsPicker,\n name: 'EntityTagsPicker',\n schema: EntityTagsPickerSchema,\n }),\n);\n\n/**\n * A field extension to select a branch from a repository.\n *\n * @public\n */\nexport const RepoBranchPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: RepoBranchPicker,\n name: 'RepoBranchPicker',\n schema: RepoBranchPickerSchema,\n }),\n);\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"plugin.esm.js","sources":["../src/plugin.tsx"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { scmIntegrationsApiRef } from '@backstage/integration-react';\nimport {\n createScaffolderFieldExtension,\n scaffolderApiRef,\n} from '@backstage/plugin-scaffolder-react';\nimport { ScaffolderClient } from './api';\nimport {\n EntityPicker,\n EntityPickerSchema,\n} from './components/fields/EntityPicker/EntityPicker';\nimport { entityNamePickerValidation } from './components/fields/EntityNamePicker';\nimport {\n EntityNamePicker,\n EntityNamePickerSchema,\n} from './components/fields/EntityNamePicker/EntityNamePicker';\nimport {\n OwnerPicker,\n OwnerPickerSchema,\n} from './components/fields/OwnerPicker/OwnerPicker';\nimport {\n MultiEntityPicker,\n MultiEntityPickerSchema,\n validateMultiEntityPickerValidation,\n} from './components/fields/MultiEntityPicker/MultiEntityPicker';\nimport { repoPickerValidation } from './components/fields/RepoUrlPicker';\nimport {\n RepoUrlPicker,\n RepoUrlPickerSchema,\n} from './components/fields/RepoUrlPicker/RepoUrlPicker';\nimport {\n createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n fetchApiRef,\n identityApiRef,\n} from '@backstage/core-plugin-api';\nimport {\n OwnedEntityPicker,\n OwnedEntityPickerSchema,\n} from './components/fields/OwnedEntityPicker/OwnedEntityPicker';\nimport {\n EntityTagsPicker,\n EntityTagsPickerSchema,\n} from './components/fields/EntityTagsPicker/EntityTagsPicker';\nimport {\n registerComponentRouteRef,\n rootRouteRef,\n viewTechDocRouteRef,\n selectedTemplateRouteRef,\n scaffolderTaskRouteRef,\n scaffolderListTaskRouteRef,\n actionsRouteRef,\n editRouteRef,\n editorRouteRef,\n customFieldsRouteRef,\n templateFormRouteRef,\n templatingExtensionsRouteRef,\n} from './routes';\nimport {\n MyGroupsPicker,\n MyGroupsPickerSchema,\n} from './components/fields/MyGroupsPicker/MyGroupsPicker';\nimport { RepoBranchPicker } from './components/fields/RepoBranchPicker/RepoBranchPicker';\nimport { RepoBranchPickerSchema } from './components/fields/RepoBranchPicker/schema';\nimport { formDecoratorsApiRef } from './alpha/api/ref';\nimport { DefaultScaffolderFormDecoratorsApi } from './alpha/api/FormDecoratorsApi';\nimport { formFieldsApiRef } from '@backstage/plugin-scaffolder-react/alpha';\n\n/**\n * The main plugin export for the scaffolder.\n * @public\n */\nexport const scaffolderPlugin = createPlugin({\n id: 'scaffolder',\n apis: [\n createApiFactory({\n api: scaffolderApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n scmIntegrationsApi: scmIntegrationsApiRef,\n fetchApi: fetchApiRef,\n identityApi: identityApiRef,\n },\n factory: ({ discoveryApi, scmIntegrationsApi, fetchApi, identityApi }) =>\n new ScaffolderClient({\n discoveryApi,\n scmIntegrationsApi,\n fetchApi,\n identityApi,\n }),\n }),\n createApiFactory({\n api: formDecoratorsApiRef,\n deps: {},\n factory: () => DefaultScaffolderFormDecoratorsApi.create(),\n }),\n createApiFactory({\n api: formFieldsApiRef,\n deps: {},\n factory: () => ({ getFormFields: async () => [] }),\n }),\n ],\n routes: {\n root: rootRouteRef,\n selectedTemplate: selectedTemplateRouteRef,\n ongoingTask: scaffolderTaskRouteRef,\n actions: actionsRouteRef,\n listTasks: scaffolderListTaskRouteRef,\n edit: editRouteRef,\n editor: editorRouteRef,\n customFields: customFieldsRouteRef,\n templateForm: templateFormRouteRef,\n templatingExtensions: templatingExtensionsRouteRef,\n },\n externalRoutes: {\n registerComponent: registerComponentRouteRef,\n viewTechDoc: viewTechDocRouteRef,\n },\n});\n\n/**\n * A field extension for selecting an Entity that exists in the Catalog.\n *\n * @public\n */\nexport const EntityPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: EntityPicker,\n name: 'EntityPicker',\n schema: EntityPickerSchema,\n }),\n);\n\n/**\n * The field extension for selecting a name for a new Entity in the Catalog.\n *\n * @public\n */\nexport const EntityNamePickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: EntityNamePicker,\n name: 'EntityNamePicker',\n validation: entityNamePickerValidation,\n schema: EntityNamePickerSchema,\n }),\n);\n\n/**\n * A field extension for selecting multiple entities that exists in the Catalog.\n *\n * @public\n */\nexport const MultiEntityPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: MultiEntityPicker,\n name: 'MultiEntityPicker',\n schema: MultiEntityPickerSchema,\n validation: validateMultiEntityPickerValidation,\n }),\n);\n\n/**\n * The field extension which provides the ability to select a RepositoryUrl.\n * Currently, this is an encoded URL that looks something like the following `github.com?repo=myRepoName&owner=backstage`.\n *\n * @public\n */\nexport const RepoUrlPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: RepoUrlPicker,\n name: 'RepoUrlPicker',\n validation: repoPickerValidation,\n schema: RepoUrlPickerSchema,\n }),\n);\n\n/**\n * A field extension for picking users and groups out of the Catalog.\n *\n * @public\n */\nexport const OwnerPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: OwnerPicker,\n name: 'OwnerPicker',\n schema: OwnerPickerSchema,\n }),\n);\n\n/**\n * A field extension for picking groups a user belongs to out of the catalog.\n *\n * @public\n */\nexport const MyGroupsPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: MyGroupsPicker,\n name: 'MyGroupsPicker',\n schema: MyGroupsPickerSchema,\n }),\n);\n\n/**\n * The Router and main entrypoint to the Scaffolder plugin.\n *\n * @public\n */\nexport const ScaffolderPage = scaffolderPlugin.provide(\n createRoutableExtension({\n name: 'ScaffolderPage',\n component: () => import('./components/Router').then(m => m.Router),\n mountPoint: rootRouteRef,\n }),\n);\n\n/**\n * A field extension to show all the Entities that are owned by the current logged-in User for use in templates.\n *\n * @public\n */\nexport const OwnedEntityPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: OwnedEntityPicker,\n name: 'OwnedEntityPicker',\n schema: OwnedEntityPickerSchema,\n }),\n);\n\n/**\n * EntityTagsPickerFieldExtension\n * @public\n */\nexport const EntityTagsPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: EntityTagsPicker,\n name: 'EntityTagsPicker',\n schema: EntityTagsPickerSchema,\n }),\n);\n\n/**\n * A field extension to select a branch from a repository.\n *\n * @public\n */\nexport const RepoBranchPickerFieldExtension = scaffolderPlugin.provide(\n createScaffolderFieldExtension({\n component: RepoBranchPicker,\n name: 'RepoBranchPicker',\n schema: RepoBranchPickerSchema,\n }),\n);\n"],"names":[],"mappings":"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"}
@@ -59,6 +59,11 @@ const templateFormRouteRef = createSubRouteRef({
59
59
  parent: rootRouteRef,
60
60
  path: "/template-form"
61
61
  });
62
+ const templatingExtensionsRouteRef = createSubRouteRef({
63
+ id: "scaffolder/templating-extensions",
64
+ parent: rootRouteRef,
65
+ path: "/templating-extensions"
66
+ });
62
67
 
63
- export { actionsRouteRef, customFieldsRouteRef, editRouteRef, editorRouteRef, registerComponentRouteRef, rootRouteRef, scaffolderListTaskRouteRef, scaffolderTaskRouteRef, selectedTemplateRouteRef, templateFormRouteRef, viewTechDocRouteRef };
68
+ export { actionsRouteRef, customFieldsRouteRef, editRouteRef, editorRouteRef, registerComponentRouteRef, rootRouteRef, scaffolderListTaskRouteRef, scaffolderTaskRouteRef, selectedTemplateRouteRef, templateFormRouteRef, templatingExtensionsRouteRef, viewTechDocRouteRef };
64
69
  //# sourceMappingURL=routes.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n createExternalRouteRef,\n createRouteRef,\n createSubRouteRef,\n} from '@backstage/core-plugin-api';\n\nexport const registerComponentRouteRef = createExternalRouteRef({\n id: 'register-component',\n optional: true,\n defaultTarget: 'catalog-import.importPage',\n});\n\nexport const viewTechDocRouteRef = createExternalRouteRef({\n id: 'view-techdoc',\n optional: true,\n params: ['namespace', 'kind', 'name'],\n defaultTarget: 'techdocs.docRoot',\n});\n\n/**\n * @public\n */\nexport const rootRouteRef = createRouteRef({\n id: 'scaffolder',\n});\n\n/**\n * @deprecated This is the old template route, can be deleted before next major release\n * @public\n */\nexport const legacySelectedTemplateRouteRef = createSubRouteRef({\n id: 'scaffolder/legacy/selected-template',\n parent: rootRouteRef,\n path: '/templates/:templateName',\n});\n\nexport const selectedTemplateRouteRef = createSubRouteRef({\n id: 'scaffolder/selected-template',\n parent: rootRouteRef,\n path: '/templates/:namespace/:templateName',\n});\n\nexport const scaffolderTaskRouteRef = createSubRouteRef({\n id: 'scaffolder/task',\n parent: rootRouteRef,\n path: '/tasks/:taskId',\n});\n\nexport const scaffolderListTaskRouteRef = createSubRouteRef({\n id: 'scaffolder/list-tasks',\n parent: rootRouteRef,\n path: '/tasks',\n});\n\nexport const actionsRouteRef = createSubRouteRef({\n id: 'scaffolder/actions',\n parent: rootRouteRef,\n path: '/actions',\n});\n\nexport const editRouteRef = createSubRouteRef({\n id: 'scaffolder/edit',\n parent: rootRouteRef,\n path: '/edit',\n});\n\nexport const editorRouteRef = createSubRouteRef({\n id: 'scaffolder/editor',\n parent: rootRouteRef,\n path: '/template',\n});\n\nexport const customFieldsRouteRef = createSubRouteRef({\n id: 'scaffolder/customFields',\n parent: rootRouteRef,\n path: '/custom-fields',\n});\n\nexport const templateFormRouteRef = createSubRouteRef({\n id: 'scaffolder/editorForm',\n parent: rootRouteRef,\n path: '/template-form',\n});\n"],"names":[],"mappings":";;AAqBO,MAAM,4BAA4B,sBAAuB,CAAA;AAAA,EAC9D,EAAI,EAAA,oBAAA;AAAA,EACJ,QAAU,EAAA,IAAA;AAAA,EACV,aAAe,EAAA;AACjB,CAAC;AAEM,MAAM,sBAAsB,sBAAuB,CAAA;AAAA,EACxD,EAAI,EAAA,cAAA;AAAA,EACJ,QAAU,EAAA,IAAA;AAAA,EACV,MAAQ,EAAA,CAAC,WAAa,EAAA,MAAA,EAAQ,MAAM,CAAA;AAAA,EACpC,aAAe,EAAA;AACjB,CAAC;AAKM,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA;AACN,CAAC;AAM6C,iBAAkB,CAAA;AAAA,EAC9D,EAAI,EAAA,qCAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,2BAA2B,iBAAkB,CAAA;AAAA,EACxD,EAAI,EAAA,8BAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,yBAAyB,iBAAkB,CAAA;AAAA,EACtD,EAAI,EAAA,iBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,6BAA6B,iBAAkB,CAAA;AAAA,EAC1D,EAAI,EAAA,uBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,kBAAkB,iBAAkB,CAAA;AAAA,EAC/C,EAAI,EAAA,oBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,eAAe,iBAAkB,CAAA;AAAA,EAC5C,EAAI,EAAA,iBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,iBAAiB,iBAAkB,CAAA;AAAA,EAC9C,EAAI,EAAA,mBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,uBAAuB,iBAAkB,CAAA;AAAA,EACpD,EAAI,EAAA,yBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,uBAAuB,iBAAkB,CAAA;AAAA,EACpD,EAAI,EAAA,uBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;;;;"}
1
+ {"version":3,"file":"routes.esm.js","sources":["../src/routes.ts"],"sourcesContent":["/*\n * Copyright 2020 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n createExternalRouteRef,\n createRouteRef,\n createSubRouteRef,\n} from '@backstage/core-plugin-api';\n\nexport const registerComponentRouteRef = createExternalRouteRef({\n id: 'register-component',\n optional: true,\n defaultTarget: 'catalog-import.importPage',\n});\n\nexport const viewTechDocRouteRef = createExternalRouteRef({\n id: 'view-techdoc',\n optional: true,\n params: ['namespace', 'kind', 'name'],\n defaultTarget: 'techdocs.docRoot',\n});\n\n/**\n * @public\n */\nexport const rootRouteRef = createRouteRef({\n id: 'scaffolder',\n});\n\n/**\n * @deprecated This is the old template route, can be deleted before next major release\n * @public\n */\nexport const legacySelectedTemplateRouteRef = createSubRouteRef({\n id: 'scaffolder/legacy/selected-template',\n parent: rootRouteRef,\n path: '/templates/:templateName',\n});\n\nexport const selectedTemplateRouteRef = createSubRouteRef({\n id: 'scaffolder/selected-template',\n parent: rootRouteRef,\n path: '/templates/:namespace/:templateName',\n});\n\nexport const scaffolderTaskRouteRef = createSubRouteRef({\n id: 'scaffolder/task',\n parent: rootRouteRef,\n path: '/tasks/:taskId',\n});\n\nexport const scaffolderListTaskRouteRef = createSubRouteRef({\n id: 'scaffolder/list-tasks',\n parent: rootRouteRef,\n path: '/tasks',\n});\n\nexport const actionsRouteRef = createSubRouteRef({\n id: 'scaffolder/actions',\n parent: rootRouteRef,\n path: '/actions',\n});\n\nexport const editRouteRef = createSubRouteRef({\n id: 'scaffolder/edit',\n parent: rootRouteRef,\n path: '/edit',\n});\n\nexport const editorRouteRef = createSubRouteRef({\n id: 'scaffolder/editor',\n parent: rootRouteRef,\n path: '/template',\n});\n\nexport const customFieldsRouteRef = createSubRouteRef({\n id: 'scaffolder/customFields',\n parent: rootRouteRef,\n path: '/custom-fields',\n});\n\nexport const templateFormRouteRef = createSubRouteRef({\n id: 'scaffolder/editorForm',\n parent: rootRouteRef,\n path: '/template-form',\n});\n\nexport const templatingExtensionsRouteRef = createSubRouteRef({\n id: 'scaffolder/templating-extensions',\n parent: rootRouteRef,\n path: '/templating-extensions',\n});\n"],"names":[],"mappings":";;AAqBO,MAAM,4BAA4B,sBAAuB,CAAA;AAAA,EAC9D,EAAI,EAAA,oBAAA;AAAA,EACJ,QAAU,EAAA,IAAA;AAAA,EACV,aAAe,EAAA;AACjB,CAAC;AAEM,MAAM,sBAAsB,sBAAuB,CAAA;AAAA,EACxD,EAAI,EAAA,cAAA;AAAA,EACJ,QAAU,EAAA,IAAA;AAAA,EACV,MAAQ,EAAA,CAAC,WAAa,EAAA,MAAA,EAAQ,MAAM,CAAA;AAAA,EACpC,aAAe,EAAA;AACjB,CAAC;AAKM,MAAM,eAAe,cAAe,CAAA;AAAA,EACzC,EAAI,EAAA;AACN,CAAC;AAM6C,iBAAkB,CAAA;AAAA,EAC9D,EAAI,EAAA,qCAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,2BAA2B,iBAAkB,CAAA;AAAA,EACxD,EAAI,EAAA,8BAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,yBAAyB,iBAAkB,CAAA;AAAA,EACtD,EAAI,EAAA,iBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,6BAA6B,iBAAkB,CAAA;AAAA,EAC1D,EAAI,EAAA,uBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,kBAAkB,iBAAkB,CAAA;AAAA,EAC/C,EAAI,EAAA,oBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,eAAe,iBAAkB,CAAA;AAAA,EAC5C,EAAI,EAAA,iBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,iBAAiB,iBAAkB,CAAA;AAAA,EAC9C,EAAI,EAAA,mBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,uBAAuB,iBAAkB,CAAA;AAAA,EACpD,EAAI,EAAA,yBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,uBAAuB,iBAAkB,CAAA;AAAA,EACpD,EAAI,EAAA,uBAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;AAEM,MAAM,+BAA+B,iBAAkB,CAAA;AAAA,EAC5D,EAAI,EAAA,kCAAA;AAAA,EACJ,MAAQ,EAAA,YAAA;AAAA,EACR,IAAM,EAAA;AACR,CAAC;;;;"}