@backstage/plugin-catalog 1.20.1-next.0 → 1.20.1-next.1
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 +15 -0
- package/alpha/package.json +1 -1
- package/dist/alpha.d.ts +8 -1
- package/dist/alpha.esm.js +1 -0
- package/dist/alpha.esm.js.map +1 -1
- package/dist/components/AboutCard/AboutCard.esm.js +6 -1
- package/dist/components/AboutCard/AboutCard.esm.js.map +1 -1
- package/package.json +5 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,20 @@
|
|
|
1
1
|
# @backstage/plugin-catalog
|
|
2
2
|
|
|
3
|
+
## 1.20.1-next.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- a2d2649: Export `catalogTranslationRef` under `/alpha`
|
|
8
|
+
- bcec60f: updated the ContextMenu, ActionsPage, OngoingTask and TemplateCard frontend components to support the new scaffolder permissions:
|
|
9
|
+
|
|
10
|
+
- `scaffolder.task.create`
|
|
11
|
+
- `scaffolder.task.cancel`
|
|
12
|
+
- `scaffolder.task.read`
|
|
13
|
+
|
|
14
|
+
- Updated dependencies
|
|
15
|
+
- @backstage/plugin-scaffolder-common@1.5.3-next.0
|
|
16
|
+
- @backstage/plugin-catalog-react@1.12.1-next.0
|
|
17
|
+
|
|
3
18
|
## 1.20.1-next.0
|
|
4
19
|
|
|
5
20
|
### Patch Changes
|
package/alpha/package.json
CHANGED
package/dist/alpha.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
2
|
import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
|
|
3
3
|
import { AnyExtensionInputMap, PortableSchema } from '@backstage/frontend-plugin-api';
|
|
4
|
+
import * as _backstage_core_plugin_api_alpha from '@backstage/core-plugin-api/alpha';
|
|
4
5
|
|
|
5
6
|
/** @alpha */
|
|
6
7
|
declare const _default: _backstage_frontend_plugin_api.BackstagePlugin<{
|
|
@@ -35,4 +36,10 @@ declare function createCatalogFilterExtension<TInputs extends AnyExtensionInputM
|
|
|
35
36
|
}) => Promise<JSX.Element>;
|
|
36
37
|
}): _backstage_frontend_plugin_api.ExtensionDefinition<TConfig>;
|
|
37
38
|
|
|
38
|
-
|
|
39
|
+
/** @alpha */
|
|
40
|
+
declare const catalogTranslationRef: _backstage_core_plugin_api_alpha.TranslationRef<"catalog", {
|
|
41
|
+
readonly "indexPage.title": "{{orgName}} Catalog";
|
|
42
|
+
readonly "indexPage.createButtonTitle": "Create";
|
|
43
|
+
}>;
|
|
44
|
+
|
|
45
|
+
export { catalogTranslationRef, createCatalogFilterExtension, _default as default };
|
package/dist/alpha.esm.js
CHANGED
package/dist/alpha.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alpha.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"alpha.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -20,6 +20,8 @@ import { isTemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';
|
|
|
20
20
|
import { useEntityPermission } from '@backstage/plugin-catalog-react/alpha';
|
|
21
21
|
import { catalogEntityRefreshPermission } from '@backstage/plugin-catalog-common/alpha';
|
|
22
22
|
import { useSourceTemplateCompoundEntityRef } from './hooks.esm.js';
|
|
23
|
+
import { taskCreatePermission } from '@backstage/plugin-scaffolder-common/alpha';
|
|
24
|
+
import { usePermission } from '@backstage/plugin-permission-react';
|
|
23
25
|
|
|
24
26
|
const TECHDOCS_ANNOTATION = "backstage.io/techdocs-ref";
|
|
25
27
|
const TECHDOCS_EXTERNAL_ANNOTATION = "backstage.io/techdocs-entity";
|
|
@@ -58,6 +60,9 @@ function AboutCard(props) {
|
|
|
58
60
|
const { allowed: canRefresh } = useEntityPermission(
|
|
59
61
|
catalogEntityRefreshPermission
|
|
60
62
|
);
|
|
63
|
+
const { allowed: canCreateTemplateTask } = usePermission({
|
|
64
|
+
permission: taskCreatePermission
|
|
65
|
+
});
|
|
61
66
|
const entitySourceLocation = getEntitySourceLocation(
|
|
62
67
|
entity,
|
|
63
68
|
scmIntegrationsApi
|
|
@@ -99,7 +104,7 @@ function AboutCard(props) {
|
|
|
99
104
|
const launchTemplate = {
|
|
100
105
|
label: "Launch Template",
|
|
101
106
|
icon: /* @__PURE__ */ React.createElement(Icon, null),
|
|
102
|
-
disabled: !templateRoute,
|
|
107
|
+
disabled: !templateRoute || !canCreateTemplateTask,
|
|
103
108
|
href: templateRoute && templateRoute({
|
|
104
109
|
templateName: entity.metadata.name,
|
|
105
110
|
namespace: entity.metadata.namespace || DEFAULT_NAMESPACE
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AboutCard.esm.js","sources":["../../../src/components/AboutCard/AboutCard.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 */\nimport {\n ANNOTATION_EDIT_URL,\n ANNOTATION_LOCATION,\n CompoundEntityRef,\n DEFAULT_NAMESPACE,\n stringifyEntityRef,\n} from '@backstage/catalog-model';\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport Divider from '@material-ui/core/Divider';\nimport IconButton from '@material-ui/core/IconButton';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n AppIcon,\n HeaderIconLinkRow,\n IconLinkVerticalProps,\n InfoCardVariants,\n Link,\n} from '@backstage/core-components';\nimport React, { useCallback } from 'react';\nimport {\n ScmIntegrationIcon,\n scmIntegrationsApiRef,\n} from '@backstage/integration-react';\nimport {\n alertApiRef,\n errorApiRef,\n useApi,\n useApp,\n useRouteRef,\n} from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n getEntitySourceLocation,\n useEntity,\n} from '@backstage/plugin-catalog-react';\nimport { createFromTemplateRouteRef, viewTechDocRouteRef } from '../../routes';\n\nimport { AboutContent } from './AboutContent';\nimport CachedIcon from '@material-ui/icons/Cached';\nimport CreateComponentIcon from '@material-ui/icons/AddCircleOutline';\nimport DocsIcon from '@material-ui/icons/Description';\nimport EditIcon from '@material-ui/icons/Edit';\nimport { isTemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { parseEntityRef } from '@backstage/catalog-model';\nimport { useEntityPermission } from '@backstage/plugin-catalog-react/alpha';\nimport { catalogEntityRefreshPermission } from '@backstage/plugin-catalog-common/alpha';\nimport { useSourceTemplateCompoundEntityRef } from './hooks';\n\nconst TECHDOCS_ANNOTATION = 'backstage.io/techdocs-ref';\n\nconst TECHDOCS_EXTERNAL_ANNOTATION = 'backstage.io/techdocs-entity';\n\nconst useStyles = makeStyles({\n gridItemCard: {\n display: 'flex',\n flexDirection: 'column',\n height: 'calc(100% - 10px)', // for pages without content header\n marginBottom: '10px',\n },\n fullHeightCard: {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n },\n gridItemCardContent: {\n flex: 1,\n },\n fullHeightCardContent: {\n flex: 1,\n },\n});\n\n/**\n * Props for {@link EntityAboutCard}.\n *\n * @public\n */\nexport interface AboutCardProps {\n variant?: InfoCardVariants;\n}\n\n/**\n * Exported publicly via the EntityAboutCard\n */\nexport function AboutCard(props: AboutCardProps) {\n const { variant } = props;\n const app = useApp();\n const classes = useStyles();\n const { entity } = useEntity();\n const scmIntegrationsApi = useApi(scmIntegrationsApiRef);\n const catalogApi = useApi(catalogApiRef);\n const alertApi = useApi(alertApiRef);\n const errorApi = useApi(errorApiRef);\n const viewTechdocLink = useRouteRef(viewTechDocRouteRef);\n const templateRoute = useRouteRef(createFromTemplateRouteRef);\n const sourceTemplateRef = useSourceTemplateCompoundEntityRef(entity);\n const { allowed: canRefresh } = useEntityPermission(\n catalogEntityRefreshPermission,\n );\n\n const entitySourceLocation = getEntitySourceLocation(\n entity,\n scmIntegrationsApi,\n );\n const entityMetadataEditUrl =\n entity.metadata.annotations?.[ANNOTATION_EDIT_URL];\n\n let techdocsRef: CompoundEntityRef | undefined;\n\n if (entity.metadata.annotations?.[TECHDOCS_EXTERNAL_ANNOTATION]) {\n try {\n techdocsRef = parseEntityRef(\n entity.metadata.annotations?.[TECHDOCS_EXTERNAL_ANNOTATION],\n );\n // not a fan of this but we don't care if the parseEntityRef fails\n } catch {\n techdocsRef = undefined;\n }\n }\n\n const viewInSource: IconLinkVerticalProps = {\n label: 'View Source',\n disabled: !entitySourceLocation,\n icon: <ScmIntegrationIcon type={entitySourceLocation?.integrationType} />,\n href: entitySourceLocation?.locationTargetUrl,\n };\n const viewInTechDocs: IconLinkVerticalProps = {\n label: 'View TechDocs',\n disabled:\n !(\n entity.metadata.annotations?.[TECHDOCS_ANNOTATION] ||\n entity.metadata.annotations?.[TECHDOCS_EXTERNAL_ANNOTATION]\n ) || !viewTechdocLink,\n icon: <DocsIcon />,\n href:\n viewTechdocLink &&\n (techdocsRef\n ? viewTechdocLink({\n namespace: techdocsRef.namespace || DEFAULT_NAMESPACE,\n kind: techdocsRef.kind,\n name: techdocsRef.name,\n })\n : viewTechdocLink({\n namespace: entity.metadata.namespace || DEFAULT_NAMESPACE,\n kind: entity.kind,\n name: entity.metadata.name,\n })),\n };\n\n const subHeaderLinks = [viewInSource, viewInTechDocs];\n\n if (isTemplateEntityV1beta3(entity)) {\n const Icon = app.getSystemIcon('scaffolder') ?? CreateComponentIcon;\n\n const launchTemplate: IconLinkVerticalProps = {\n label: 'Launch Template',\n icon: <Icon />,\n disabled: !templateRoute,\n href:\n templateRoute &&\n templateRoute({\n templateName: entity.metadata.name,\n namespace: entity.metadata.namespace || DEFAULT_NAMESPACE,\n }),\n };\n\n subHeaderLinks.push(launchTemplate);\n }\n\n let cardClass = '';\n if (variant === 'gridItem') {\n cardClass = classes.gridItemCard;\n } else if (variant === 'fullHeight') {\n cardClass = classes.fullHeightCard;\n }\n\n let cardContentClass = '';\n if (variant === 'gridItem') {\n cardContentClass = classes.gridItemCardContent;\n } else if (variant === 'fullHeight') {\n cardContentClass = classes.fullHeightCardContent;\n }\n\n const entityLocation = entity.metadata.annotations?.[ANNOTATION_LOCATION];\n // Limiting the ability to manually refresh to the less expensive locations\n const allowRefresh =\n entityLocation?.startsWith('url:') || entityLocation?.startsWith('file:');\n const refreshEntity = useCallback(async () => {\n try {\n await catalogApi.refreshEntity(stringifyEntityRef(entity));\n alertApi.post({\n message: 'Refresh scheduled',\n severity: 'info',\n display: 'transient',\n });\n } catch (e) {\n errorApi.post(e);\n }\n }, [catalogApi, alertApi, errorApi, entity]);\n\n return (\n <Card className={cardClass}>\n <CardHeader\n title=\"About\"\n action={\n <>\n {allowRefresh && canRefresh && (\n <IconButton\n aria-label=\"Refresh\"\n title=\"Schedule entity refresh\"\n onClick={refreshEntity}\n >\n <CachedIcon />\n </IconButton>\n )}\n <IconButton\n component={Link}\n aria-label=\"Edit\"\n disabled={!entityMetadataEditUrl}\n title=\"Edit Metadata\"\n to={entityMetadataEditUrl ?? '#'}\n >\n <EditIcon />\n </IconButton>\n {sourceTemplateRef && templateRoute && (\n <IconButton\n component={Link}\n title=\"Create something similar\"\n to={templateRoute({\n namespace: sourceTemplateRef.namespace,\n templateName: sourceTemplateRef.name,\n })}\n >\n <AppIcon id=\"scaffolder\" />\n </IconButton>\n )}\n </>\n }\n subheader={<HeaderIconLinkRow links={subHeaderLinks} />}\n />\n <Divider />\n <CardContent className={cardContentClass}>\n <AboutContent entity={entity} />\n </CardContent>\n </Card>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AboutCard.esm.js","sources":["../../../src/components/AboutCard/AboutCard.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 */\nimport {\n ANNOTATION_EDIT_URL,\n ANNOTATION_LOCATION,\n CompoundEntityRef,\n DEFAULT_NAMESPACE,\n stringifyEntityRef,\n parseEntityRef,\n} from '@backstage/catalog-model';\nimport Card from '@material-ui/core/Card';\nimport CardContent from '@material-ui/core/CardContent';\nimport CardHeader from '@material-ui/core/CardHeader';\nimport Divider from '@material-ui/core/Divider';\nimport IconButton from '@material-ui/core/IconButton';\nimport { makeStyles } from '@material-ui/core/styles';\nimport {\n AppIcon,\n HeaderIconLinkRow,\n IconLinkVerticalProps,\n InfoCardVariants,\n Link,\n} from '@backstage/core-components';\nimport React, { useCallback } from 'react';\nimport {\n ScmIntegrationIcon,\n scmIntegrationsApiRef,\n} from '@backstage/integration-react';\nimport {\n alertApiRef,\n errorApiRef,\n useApi,\n useApp,\n useRouteRef,\n} from '@backstage/core-plugin-api';\nimport {\n catalogApiRef,\n getEntitySourceLocation,\n useEntity,\n} from '@backstage/plugin-catalog-react';\nimport { createFromTemplateRouteRef, viewTechDocRouteRef } from '../../routes';\n\nimport { AboutContent } from './AboutContent';\nimport CachedIcon from '@material-ui/icons/Cached';\nimport CreateComponentIcon from '@material-ui/icons/AddCircleOutline';\nimport DocsIcon from '@material-ui/icons/Description';\nimport EditIcon from '@material-ui/icons/Edit';\nimport { isTemplateEntityV1beta3 } from '@backstage/plugin-scaffolder-common';\nimport { useEntityPermission } from '@backstage/plugin-catalog-react/alpha';\nimport { catalogEntityRefreshPermission } from '@backstage/plugin-catalog-common/alpha';\nimport { useSourceTemplateCompoundEntityRef } from './hooks';\nimport { taskCreatePermission } from '@backstage/plugin-scaffolder-common/alpha';\nimport { usePermission } from '@backstage/plugin-permission-react';\n\nconst TECHDOCS_ANNOTATION = 'backstage.io/techdocs-ref';\n\nconst TECHDOCS_EXTERNAL_ANNOTATION = 'backstage.io/techdocs-entity';\n\nconst useStyles = makeStyles({\n gridItemCard: {\n display: 'flex',\n flexDirection: 'column',\n height: 'calc(100% - 10px)', // for pages without content header\n marginBottom: '10px',\n },\n fullHeightCard: {\n display: 'flex',\n flexDirection: 'column',\n height: '100%',\n },\n gridItemCardContent: {\n flex: 1,\n },\n fullHeightCardContent: {\n flex: 1,\n },\n});\n\n/**\n * Props for {@link EntityAboutCard}.\n *\n * @public\n */\nexport interface AboutCardProps {\n variant?: InfoCardVariants;\n}\n\n/**\n * Exported publicly via the EntityAboutCard\n */\nexport function AboutCard(props: AboutCardProps) {\n const { variant } = props;\n const app = useApp();\n const classes = useStyles();\n const { entity } = useEntity();\n const scmIntegrationsApi = useApi(scmIntegrationsApiRef);\n const catalogApi = useApi(catalogApiRef);\n const alertApi = useApi(alertApiRef);\n const errorApi = useApi(errorApiRef);\n const viewTechdocLink = useRouteRef(viewTechDocRouteRef);\n const templateRoute = useRouteRef(createFromTemplateRouteRef);\n const sourceTemplateRef = useSourceTemplateCompoundEntityRef(entity);\n const { allowed: canRefresh } = useEntityPermission(\n catalogEntityRefreshPermission,\n );\n\n const { allowed: canCreateTemplateTask } = usePermission({\n permission: taskCreatePermission,\n });\n\n const entitySourceLocation = getEntitySourceLocation(\n entity,\n scmIntegrationsApi,\n );\n const entityMetadataEditUrl =\n entity.metadata.annotations?.[ANNOTATION_EDIT_URL];\n\n let techdocsRef: CompoundEntityRef | undefined;\n\n if (entity.metadata.annotations?.[TECHDOCS_EXTERNAL_ANNOTATION]) {\n try {\n techdocsRef = parseEntityRef(\n entity.metadata.annotations?.[TECHDOCS_EXTERNAL_ANNOTATION],\n );\n // not a fan of this but we don't care if the parseEntityRef fails\n } catch {\n techdocsRef = undefined;\n }\n }\n\n const viewInSource: IconLinkVerticalProps = {\n label: 'View Source',\n disabled: !entitySourceLocation,\n icon: <ScmIntegrationIcon type={entitySourceLocation?.integrationType} />,\n href: entitySourceLocation?.locationTargetUrl,\n };\n const viewInTechDocs: IconLinkVerticalProps = {\n label: 'View TechDocs',\n disabled:\n !(\n entity.metadata.annotations?.[TECHDOCS_ANNOTATION] ||\n entity.metadata.annotations?.[TECHDOCS_EXTERNAL_ANNOTATION]\n ) || !viewTechdocLink,\n icon: <DocsIcon />,\n href:\n viewTechdocLink &&\n (techdocsRef\n ? viewTechdocLink({\n namespace: techdocsRef.namespace || DEFAULT_NAMESPACE,\n kind: techdocsRef.kind,\n name: techdocsRef.name,\n })\n : viewTechdocLink({\n namespace: entity.metadata.namespace || DEFAULT_NAMESPACE,\n kind: entity.kind,\n name: entity.metadata.name,\n })),\n };\n\n const subHeaderLinks = [viewInSource, viewInTechDocs];\n\n if (isTemplateEntityV1beta3(entity)) {\n const Icon = app.getSystemIcon('scaffolder') ?? CreateComponentIcon;\n\n const launchTemplate: IconLinkVerticalProps = {\n label: 'Launch Template',\n icon: <Icon />,\n disabled: !templateRoute || !canCreateTemplateTask,\n href:\n templateRoute &&\n templateRoute({\n templateName: entity.metadata.name,\n namespace: entity.metadata.namespace || DEFAULT_NAMESPACE,\n }),\n };\n\n subHeaderLinks.push(launchTemplate);\n }\n\n let cardClass = '';\n if (variant === 'gridItem') {\n cardClass = classes.gridItemCard;\n } else if (variant === 'fullHeight') {\n cardClass = classes.fullHeightCard;\n }\n\n let cardContentClass = '';\n if (variant === 'gridItem') {\n cardContentClass = classes.gridItemCardContent;\n } else if (variant === 'fullHeight') {\n cardContentClass = classes.fullHeightCardContent;\n }\n\n const entityLocation = entity.metadata.annotations?.[ANNOTATION_LOCATION];\n // Limiting the ability to manually refresh to the less expensive locations\n const allowRefresh =\n entityLocation?.startsWith('url:') || entityLocation?.startsWith('file:');\n const refreshEntity = useCallback(async () => {\n try {\n await catalogApi.refreshEntity(stringifyEntityRef(entity));\n alertApi.post({\n message: 'Refresh scheduled',\n severity: 'info',\n display: 'transient',\n });\n } catch (e) {\n errorApi.post(e);\n }\n }, [catalogApi, alertApi, errorApi, entity]);\n\n return (\n <Card className={cardClass}>\n <CardHeader\n title=\"About\"\n action={\n <>\n {allowRefresh && canRefresh && (\n <IconButton\n aria-label=\"Refresh\"\n title=\"Schedule entity refresh\"\n onClick={refreshEntity}\n >\n <CachedIcon />\n </IconButton>\n )}\n <IconButton\n component={Link}\n aria-label=\"Edit\"\n disabled={!entityMetadataEditUrl}\n title=\"Edit Metadata\"\n to={entityMetadataEditUrl ?? '#'}\n >\n <EditIcon />\n </IconButton>\n {sourceTemplateRef && templateRoute && (\n <IconButton\n component={Link}\n title=\"Create something similar\"\n to={templateRoute({\n namespace: sourceTemplateRef.namespace,\n templateName: sourceTemplateRef.name,\n })}\n >\n <AppIcon id=\"scaffolder\" />\n </IconButton>\n )}\n </>\n }\n subheader={<HeaderIconLinkRow links={subHeaderLinks} />}\n />\n <Divider />\n <CardContent className={cardContentClass}>\n <AboutContent entity={entity} />\n </CardContent>\n </Card>\n );\n}\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage/plugin-catalog",
|
|
3
|
-
"version": "1.20.1-next.
|
|
3
|
+
"version": "1.20.1-next.1",
|
|
4
4
|
"description": "The Backstage plugin for browsing the Backstage catalog",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "frontend-plugin"
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"@backstage/plugin-catalog-common": "^1.0.23",
|
|
61
61
|
"@backstage/plugin-catalog-react": "^1.12.1-next.0",
|
|
62
62
|
"@backstage/plugin-permission-react": "^0.4.22",
|
|
63
|
-
"@backstage/plugin-scaffolder-common": "^1.5.
|
|
63
|
+
"@backstage/plugin-scaffolder-common": "^1.5.3-next.0",
|
|
64
64
|
"@backstage/plugin-search-common": "^1.2.11",
|
|
65
65
|
"@backstage/plugin-search-react": "^1.7.12-next.0",
|
|
66
66
|
"@backstage/types": "^1.1.1",
|
|
@@ -78,7 +78,7 @@
|
|
|
78
78
|
"zen-observable": "^0.10.0"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
|
-
"@backstage/cli": "^0.26.
|
|
81
|
+
"@backstage/cli": "^0.26.7-next.1",
|
|
82
82
|
"@backstage/core-app-api": "^1.12.5",
|
|
83
83
|
"@backstage/dev-utils": "^1.0.33-next.0",
|
|
84
84
|
"@backstage/plugin-permission-common": "^0.7.13",
|
|
@@ -87,7 +87,8 @@
|
|
|
87
87
|
"@testing-library/jest-dom": "^6.0.0",
|
|
88
88
|
"@testing-library/react": "^15.0.0",
|
|
89
89
|
"@testing-library/user-event": "^14.0.0",
|
|
90
|
-
"@types/pluralize": "^0.0.33"
|
|
90
|
+
"@types/pluralize": "^0.0.33",
|
|
91
|
+
"swr": "^2.2.5"
|
|
91
92
|
},
|
|
92
93
|
"peerDependencies": {
|
|
93
94
|
"react": "^16.13.1 || ^17.0.0 || ^18.0.0",
|