@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 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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@backstage/plugin-catalog",
3
- "version": "1.20.1-next.0",
3
+ "version": "1.20.1-next.1",
4
4
  "main": "../dist/alpha.esm.js",
5
5
  "module": "../dist/alpha.esm.js",
6
6
  "types": "../dist/alpha.d.ts"
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
- export { createCatalogFilterExtension, _default as default };
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
@@ -1,3 +1,4 @@
1
1
  export { default } from './alpha/plugin.esm.js';
2
2
  export { createCatalogFilterExtension } from './alpha/createCatalogFilterExtension.esm.js';
3
+ export { catalogTranslationRef } from './translation.esm.js';
3
4
  //# sourceMappingURL=alpha.esm.js.map
@@ -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.0",
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.2",
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.6-next.0",
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",