diff --git a/plugins/feedback-backend/dist-dynamic/package.json b/plugins/feedback-backend/dist-dynamic/package.json index f1fb656d746..fd8eecdcd61 100644 --- a/plugins/feedback-backend/dist-dynamic/package.json +++ b/plugins/feedback-backend/dist-dynamic/package.json @@ -1,6 +1,6 @@ { "name": "@janus-idp/backstage-plugin-feedback-backend-dynamic", - "version": "1.3.0", + "version": "1.3.1", "main": "dist/index.cjs.js", "types": "dist/index.d.ts", "license": "Apache-2.0", @@ -42,7 +42,6 @@ "config.d.ts", "app-config.janus-idp.yaml", "migrations/**/*.{js,d.ts}", - "dist-dynamic", "alpha" ], "configSchema": "config.d.ts", @@ -56,6 +55,7 @@ "bundleDependencies": true, "peerDependencies": { "@backstage/backend-common": "^0.21.7", + "@backstage/backend-dynamic-feature-service": "^0.2.10", "@backstage/backend-plugin-api": "^0.6.17", "@backstage/backend-test-utils": "^0.3.7", "@backstage/catalog-client": "^1.6.4", diff --git a/plugins/feedback-backend/dist-dynamic/yarn.lock b/plugins/feedback-backend/dist-dynamic/yarn.lock index beadc8646be..f4dc1ac3794 100644 --- a/plugins/feedback-backend/dist-dynamic/yarn.lock +++ b/plugins/feedback-backend/dist-dynamic/yarn.lock @@ -55,9 +55,9 @@ "@types/node" "*" "@types/express-serve-static-core@^4.17.33": - version "4.19.0" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.0.tgz#3ae8ab3767d98d0b682cda063c3339e1e86ccfaa" - integrity sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ== + version "4.19.1" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.19.1.tgz#57d34698bb580720fd6e3c360d4b2fdef579b979" + integrity sha512-ej0phymbFLoCB26dbbq5PGScsf2JAJ4IJHjG10LalgUV36XKTmA4GdA+PVllKvRk0sEKt64X8975qFnkSi0hqA== dependencies: "@types/node" "*" "@types/qs" "*" @@ -152,9 +152,9 @@ asynckit@^0.4.0: integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== axios@^1.6.4: - version "1.6.8" - resolved "https://registry.yarnpkg.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66" - integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== + version "1.7.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.2.tgz#b625db8a7051fbea61c35a3cbb3a1daa7b9c7621" + integrity sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw== dependencies: follow-redirects "^1.15.6" form-data "^4.0.0" diff --git a/plugins/feedback-backend/package.json b/plugins/feedback-backend/package.json index d1620407043..dd22641d81f 100644 --- a/plugins/feedback-backend/package.json +++ b/plugins/feedback-backend/package.json @@ -40,6 +40,7 @@ }, "dependencies": { "@backstage/backend-common": "^0.21.7", + "@backstage/backend-dynamic-feature-service": "^0.2.10", "@backstage/backend-plugin-api": "^0.6.17", "@backstage/backend-test-utils": "^0.3.7", "@backstage/catalog-client": "^1.6.4", @@ -69,7 +70,9 @@ "config.d.ts", "app-config.janus-idp.yaml", "migrations/**/*.{js,d.ts}", - "dist-dynamic" + "dist-dynamic/*.*", + "dist-dynamic/dist/**", + "dist-dynamic/alpha/*" ], "configSchema": "config.d.ts", "repository": "github:janus-idp/backstage-plugins", diff --git a/plugins/feedback-backend/src/dynamic/inedx.ts b/plugins/feedback-backend/src/dynamic/inedx.ts new file mode 100644 index 00000000000..786b16a65f3 --- /dev/null +++ b/plugins/feedback-backend/src/dynamic/inedx.ts @@ -0,0 +1,8 @@ +import { BackendDynamicPluginInstaller } from '@backstage/backend-dynamic-feature-service'; + +import { feedbackPlugin } from '../plugin'; + +export const dynamicPluginInstaller: BackendDynamicPluginInstaller = { + kind: 'new', + install: () => feedbackPlugin(), +}; diff --git a/plugins/feedback/package.json b/plugins/feedback/package.json index 4cfa55c9065..5cecdc01b11 100644 --- a/plugins/feedback/package.json +++ b/plugins/feedback/package.json @@ -31,9 +31,8 @@ "@backstage/core-plugin-api": "^1.9.2", "@backstage/plugin-catalog-react": "^1.11.3", "@backstage/theme": "^0.5.3", - "@material-ui/core": "^4.9.13", - "@material-ui/icons": "^4.9.1", - "@material-ui/lab": "^4.0.0-alpha.61", + "@mui/icons-material": "^5.15.18", + "@mui/material": "^5.15.18", "@one-platform/opc-feedback": "0.1.1-alpha", "axios": "^1.6.4", "react-use": "^17.2.4" diff --git a/plugins/feedback/src/components/CreateFeedbackModal/CreateFeedbackModal.tsx b/plugins/feedback/src/components/CreateFeedbackModal/CreateFeedbackModal.tsx index 9917597ae8e..faffa0c8fcd 100644 --- a/plugins/feedback/src/components/CreateFeedbackModal/CreateFeedbackModal.tsx +++ b/plugins/feedback/src/components/CreateFeedbackModal/CreateFeedbackModal.tsx @@ -2,64 +2,74 @@ import React, { useState } from 'react'; import { configApiRef, useAnalytics, useApi } from '@backstage/core-plugin-api'; -import { - Button, - Chip, - createStyles, - DialogActions, - DialogContent, - DialogTitle, - FormControlLabel, - Grid, - IconButton, - makeStyles, - Paper, - Radio, - RadioGroup, - TextField, - Theme, - Typography, -} from '@material-ui/core'; -import BugReportOutlined from '@material-ui/icons/BugReportOutlined'; -import BugReportTwoToneIcon from '@material-ui/icons/BugReportTwoTone'; -import CloseRounded from '@material-ui/icons/CloseRounded'; -import SmsOutlined from '@material-ui/icons/SmsOutlined'; -import SmsTwoTone from '@material-ui/icons/SmsTwoTone'; -import { Alert } from '@material-ui/lab'; +import BugReportOutlined from '@mui/icons-material/BugReportOutlined'; +import BugReportTwoToneIcon from '@mui/icons-material/BugReportTwoTone'; +import CloseRounded from '@mui/icons-material/CloseRounded'; +import SmsOutlined from '@mui/icons-material/SmsOutlined'; +import SmsTwoTone from '@mui/icons-material/SmsTwoTone'; +import Alert from '@mui/material/Alert'; +import Button from '@mui/material/Button'; +import Chip from '@mui/material/Chip'; +import DialogActions from '@mui/material/DialogActions'; +import DialogContent from '@mui/material/DialogContent'; +import DialogTitle from '@mui/material/DialogTitle'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Grid from '@mui/material/Grid'; +import IconButton from '@mui/material/IconButton'; +import Paper from '@mui/material/Paper'; +import Radio from '@mui/material/Radio'; +import RadioGroup from '@mui/material/RadioGroup'; +import { styled, Theme } from '@mui/material/styles'; +import TextField from '@mui/material/TextField'; +import Typography from '@mui/material/Typography'; import { feedbackApiRef } from '../../api'; import { FeedbackCategory } from '../../models/feedback.model'; -const useStyles = makeStyles((theme: Theme) => - createStyles({ - root: { - '& > * > *': { - margin: theme.spacing(1), - width: '100%', - }, - padding: '0.5rem', - }, - actions: { - '& > *': { - margin: theme.spacing(1), - }, - paddingRight: '1rem', - }, - container: { - padding: '1rem', - }, - dialogTitle: {}, - closeButton: { - position: 'absolute', - right: theme.spacing(1), - top: theme.spacing(1), - color: theme.palette.grey[500], +const PREFIX = 'CreateFeedbackModal'; + +const classes = { + root: `${PREFIX}-root`, + actions: `${PREFIX}-actions`, + container: `${PREFIX}-container`, + dialogTitle: `${PREFIX}-dialogTitle`, + closeButton: `${PREFIX}-closeButton`, + radioGroup: `${PREFIX}-radioGroup`, +}; + +const StyledPaper = styled(Paper)(({ theme }: { theme: Theme }) => ({ + [`& .${classes.root}`]: { + '& > * > *': { + margin: theme.spacing(1), + width: '100%', }, - radioGroup: { - gap: theme.spacing(3), + padding: '0.5rem', + }, + + [`& .${classes.actions}`]: { + '& > *': { + margin: theme.spacing(1), }, - }), -); + paddingRight: '1rem', + }, + + [`& .${classes.container}`]: { + padding: '1rem', + }, + + [`& .${classes.dialogTitle}`]: {}, + + [`& .${classes.closeButton}`]: { + position: 'absolute', + right: theme.spacing(1), + top: theme.spacing(1), + color: theme.palette.grey[500], + }, + + [`& .${classes.radioGroup}`]: { + gap: theme.spacing(3), + }, +})); const issueTags = [ 'Slow Loading', @@ -70,255 +80,250 @@ const issueTags = [ ]; const feedbackTags = ['Excellent', 'Good', 'Needs Improvement', 'Other']; -export const CreateFeedbackModal = React.forwardRef( - ( - props: { - projectEntity: string; - userEntity: string; - serverType: string; - handleModalCloseFn: (respObj?: any) => void; - }, - ref, - ) => { - const classes = useStyles(); - const api = useApi(feedbackApiRef); - const analytics = useAnalytics(); - const [feedbackType, setFeedbackType] = useState('BUG'); - const [selectedTag, setSelectedTag] = useState(issueTags[0]); - const app = useApi(configApiRef); - const summaryLimit = app.getOptionalNumber('feedback.summaryLimit') ?? 240; +export const CreateFeedbackModal = (props: { + projectEntity: string; + userEntity: string; + serverType: string; + handleModalCloseFn: (respObj?: any) => void; +}) => { + const api = useApi(feedbackApiRef); + const analytics = useAnalytics(); + const [feedbackType, setFeedbackType] = useState('BUG'); + const [selectedTag, setSelectedTag] = useState(issueTags[0]); + const app = useApi(configApiRef); + const summaryLimit = app.getOptionalNumber('feedback.summaryLimit') ?? 240; - const [summary, setSummary] = useState({ - value: '', - error: false, - errorMessage: 'Enter some summary', - }); - const [description, setDescription] = useState({ - value: '', - error: false, - errorMessage: 'Enter some description', - }); + const [summary, setSummary] = useState({ + value: '', + error: false, + errorMessage: 'Enter some summary', + }); + const [description, setDescription] = useState({ + value: '', + error: false, + errorMessage: 'Enter some description', + }); - const projectEntity = props.projectEntity; - const userEntity = props.userEntity; + const projectEntity = props.projectEntity; + const userEntity = props.userEntity; - function handleCategoryClick(event: any) { - setFeedbackType(event.target.value); - setSelectedTag( - event.target.value === 'FEEDBACK' ? feedbackTags[0] : issueTags[0], - ); - } + function handleCategoryClick(event: any) { + setFeedbackType(event.target.value); + setSelectedTag( + event.target.value === 'FEEDBACK' ? feedbackTags[0] : issueTags[0], + ); + } - function handleChipSlection(tag: string) { - if (tag === selectedTag) { - return; - } - setSelectedTag(tag); + function handleChipSlection(tag: string) { + if (tag === selectedTag) { + return; } + setSelectedTag(tag); + } - async function handleSubmitClick() { - const resp = await api.createFeedback({ - summary: summary.value, - description: description.value, - projectId: projectEntity, - url: window.location.href, - userAgent: navigator.userAgent, - createdBy: userEntity, - feedbackType: - feedbackType === 'BUG' - ? FeedbackCategory.BUG - : FeedbackCategory.FEEDBACK, - tag: selectedTag, - }); - props.handleModalCloseFn(resp); - analytics.captureEvent('click', `submit - ${summary.value}`); - } + async function handleSubmitClick() { + const resp = await api.createFeedback({ + summary: summary.value, + description: description.value, + projectId: projectEntity, + url: window.location.href, + userAgent: navigator.userAgent, + createdBy: userEntity, + feedbackType: + feedbackType === 'BUG' + ? FeedbackCategory.BUG + : FeedbackCategory.FEEDBACK, + tag: selectedTag, + }); + props.handleModalCloseFn(resp); + analytics.captureEvent('click', `submit - ${summary.value}`); + } - function handleInputChange( - event: React.FocusEvent, - ) { - if (event.target.id === 'summary') { - const _summary = event.target.value; - if (_summary.trim().length === 0) { - return setSummary({ - ...summary, - value: '', - errorMessage: 'Provide summary', - error: true, - }); - } else if (_summary.length > summaryLimit) { - return setSummary({ - ...summary, - value: _summary, - error: true, - errorMessage: `Summary should be less than ${summaryLimit} characters.`, - }); - } - return setSummary({ ...summary, value: _summary, error: false }); - } - if (event.target.id === 'description') { - return setDescription({ - ...description, - value: event.target.value, - error: false, + function handleInputChange( + event: React.FocusEvent, + ) { + if (event.target.id === 'summary') { + const _summary = event.target.value; + if (_summary.trim().length === 0) { + return setSummary({ + ...summary, + value: '', + errorMessage: 'Provide summary', + error: true, }); - } - return 0; - } - - function handleValidation( - event: React.FocusEvent, - ) { - if (event.target.id === 'summary') { - if (event.target.value.length === 0) { - return setSummary({ ...summary, error: true }); - } + } else if (_summary.length > summaryLimit) { return setSummary({ ...summary, - value: event.target.value.trim(), - error: event.target.value.trim().length > summaryLimit, + value: _summary, + error: true, + errorMessage: `Summary should be less than ${summaryLimit} characters.`, }); } - if (event.target.id === 'description' && event.target.value.length > 0) { - setDescription({ ...description, value: description.value.trim() }); + return setSummary({ ...summary, value: _summary, error: false }); + } + if (event.target.id === 'description') { + return setDescription({ + ...description, + value: event.target.value, + error: false, + }); + } + return 0; + } + + function handleValidation( + event: React.FocusEvent, + ) { + if (event.target.id === 'summary') { + if (event.target.value.length === 0) { + return setSummary({ ...summary, error: true }); } - return 0; + return setSummary({ + ...summary, + value: event.target.value.trim(), + error: event.target.value.trim().length > summaryLimit, + }); + } + if (event.target.id === 'description' && event.target.value.length > 0) { + setDescription({ ...description, value: description.value.trim() }); } + return 0; + } - return ( - - - {`Feedback for ${projectEntity.split('/').pop()}`} - {props.handleModalCloseFn ? ( - - - - ) : null} - - - - - Select type - - } - checkedIcon={} + return ( + + + {`Feedback for ${projectEntity.split('/').pop()}`} + {props.handleModalCloseFn ? ( + + + + ) : null} + + + + + Select type + + } + checkedIcon={} + color="secondary" + /> + } + /> + } + checkedIcon={} + color="primary" + /> + } + /> + + + + + Select {feedbackType === 'FEEDBACK' ? 'Feedback' : 'Bug'} + :  + {feedbackType === 'BUG' + ? issueTags.map(issueTitle => ( + handleChipSlection(issueTitle)} + label={issueTitle} /> - } - /> - } - checkedIcon={} + )) + : feedbackTags.map(feedbackTitle => ( + handleChipSlection(feedbackTitle)} + label={feedbackTitle} /> - } - /> - - - - - Select {feedbackType === 'FEEDBACK' ? 'Feedback' : 'Bug'} - :  - {feedbackType === 'BUG' - ? issueTags.map(issueTitle => ( - handleChipSlection(issueTitle)} - label={issueTitle} - /> - )) - : feedbackTags.map(feedbackTitle => ( - handleChipSlection(feedbackTitle)} - label={feedbackTitle} - /> - ))} - - - - - + ))} + + + + + - - - + + - - - - - - {props.serverType.toLowerCase() !== 'mail' && - !selectedTag.match(/(Excellent|Good)/g) ? ( - - Note: By submitting  - {feedbackType === 'FEEDBACK' ? 'feedback' : 'bug'} with this tag, it - will create an issue in {props.serverType.toLowerCase()} - - ) : null} - - ); - }, -); + + + + + + + {props.serverType.toLowerCase() !== 'mail' && + !selectedTag.match(/(Excellent|Good)/g) ? ( + + Note: By submitting  + {feedbackType === 'FEEDBACK' ? 'feedback' : 'bug'} with this tag, it + will create an issue in {props.serverType.toLowerCase()} + + ) : null} + + ); +}; diff --git a/plugins/feedback/src/components/EntityFeedbackPage/CustomEmptyState/CustomEmptyState.tsx b/plugins/feedback/src/components/EntityFeedbackPage/CustomEmptyState/CustomEmptyState.tsx index d728f6653cd..26a122e5bdc 100644 --- a/plugins/feedback/src/components/EntityFeedbackPage/CustomEmptyState/CustomEmptyState.tsx +++ b/plugins/feedback/src/components/EntityFeedbackPage/CustomEmptyState/CustomEmptyState.tsx @@ -2,62 +2,71 @@ import React from 'react'; import { CodeSnippet, EmptyState } from '@backstage/core-components'; -import { - Accordion, - AccordionDetails, - AccordionSummary, - createStyles, - makeStyles, - Theme, - Typography, -} from '@material-ui/core'; -import ExpandMoreRounded from '@material-ui/icons/ExpandMoreRounded'; - -const useStyles = makeStyles((theme: Theme) => - createStyles({ - code: { - width: '100%', - borderRadius: 6, - margin: theme.spacing(0, 0), - background: theme.palette.background.paper, +import ExpandMoreRounded from '@mui/icons-material/ExpandMoreRounded'; +import Accordion from '@mui/material/Accordion'; +import AccordionDetails from '@mui/material/AccordionDetails'; +import AccordionSummary from '@mui/material/AccordionSummary'; +import { styled, Theme } from '@mui/material/styles'; +import Typography from '@mui/material/Typography'; + +const PREFIX = 'CustomEmptyState'; + +const classes = { + code: `${PREFIX}-code`, + accordionGroup: `${PREFIX}-accordionGroup`, + heading: `${PREFIX}-heading`, + subHeading: `${PREFIX}-subHeading`, + embeddedVideo: `${PREFIX}-embeddedVideo`, +}; + +// TODO jss-to-styled codemod: The Fragment root was replaced by div. Change the tag if needed. +const Root = styled('div')(({ theme }: { theme: Theme }) => ({ + [`& .${classes.code}`]: { + width: '100%', + borderRadius: 6, + margin: theme.spacing(0, 0), + background: theme.palette.background.paper, + }, + + [`& .${classes.accordionGroup}`]: { + '& > *': { + marginTop: theme.spacing(2), + marginBottom: theme.spacing(1), + background: theme.palette.mode === 'dark' ? '#333' : '#eee', }, - accordionGroup: { - '& > *': { - marginTop: theme.spacing(2), - marginBottom: theme.spacing(1), - background: theme.palette.type === 'dark' ? '#333' : '#eee', + }, + + [`& .${classes.heading}`]: { + width: '50%', + fontSize: '1.2rem', + fontWeight: 600, + }, + + [`& .${classes.subHeading}`]: { + color: '#9e9e9e', + }, + + [`& .${classes.embeddedVideo}`]: { + top: '50%', + left: '50%', + zIndex: 2, + position: 'relative', + transform: 'translate(-50%, 15%)', + '& > iframe': { + [theme.breakpoints.up('sm')]: { + width: '100%', + height: '280px', }, - }, - heading: { - width: '50%', - fontSize: '1.2rem', - fontWeight: 600, - }, - subHeading: { - color: theme.palette.textSubtle, - }, - embeddedVideo: { - top: '50%', - left: '50%', - zIndex: 2, - position: 'relative', - transform: 'translate(-50%, 15%)', - '& > iframe': { - [theme.breakpoints.up('sm')]: { - width: '100%', - height: '280px', - }, - [theme.breakpoints.up('xl')]: { - width: '768px', - height: '482px', - }, - - border: '0', - borderRadius: theme.spacing(1), + [theme.breakpoints.up('xl')]: { + width: '768px', + height: '482px', }, + + border: '0', + borderRadius: theme.spacing(1), }, - }), -); + }, +})); const EMAIL_YAML = `metadata: annotations: @@ -86,7 +95,6 @@ const JIRA_YAML = `metadata: feedback/email-to: 'example@example.com';`; export const CustomEmptyState = (props: { [key: string]: string }) => { - const classes = useStyles(); const [expanded, setExpanded] = React.useState('jira'); const handleChange = @@ -106,7 +114,7 @@ export const CustomEmptyState = (props: { [key: string]: string }) => { } action={ - <> + Add the annotation to your component YAML as shown in the highlighted example below: @@ -159,7 +167,7 @@ export const CustomEmptyState = (props: { [key: string]: string }) => { - + } missing="field" /> diff --git a/plugins/feedback/src/components/EntityFeedbackPage/EntityFeedbackPage.test.tsx b/plugins/feedback/src/components/EntityFeedbackPage/EntityFeedbackPage.test.tsx index 68548bfb75a..ab8c05e61a4 100644 --- a/plugins/feedback/src/components/EntityFeedbackPage/EntityFeedbackPage.test.tsx +++ b/plugins/feedback/src/components/EntityFeedbackPage/EntityFeedbackPage.test.tsx @@ -1,6 +1,5 @@ import React from 'react'; -import { ConfigReader } from '@backstage/config'; import { BackstageUserIdentity, configApiRef, @@ -11,7 +10,11 @@ import { EntityProvider, entityRouteRef, } from '@backstage/plugin-catalog-react'; -import { renderInTestApp, TestApiProvider } from '@backstage/test-utils'; +import { + MockConfigApi, + renderInTestApp, + TestApiProvider, +} from '@backstage/test-utils'; import { FeedbackAPI, feedbackApiRef } from '../../api'; import { mockEntity, mockFeedback } from '../../mocks'; @@ -41,7 +44,7 @@ describe('Entity Feedback Page', () => { }), }; - const mockConfigApi = new ConfigReader({ + const mockConfigApi = new MockConfigApi({ feedback: { integrations: { jira: [{ host: 'https://jira-server-url' }] } }, }); @@ -73,7 +76,9 @@ describe('Entity Feedback Page', () => { it('Should have buttons', async () => { const rendered = await render(); expect( - rendered.getByRole('button', { name: 'Create' }), + rendered.getByRole('button', { + name: 'Give a feedback / Report a issue', + }), ).toBeInTheDocument(); expect( rendered.getByRole('button', { name: 'Refresh' }), diff --git a/plugins/feedback/src/components/EntityFeedbackPage/EntityFeedbackPage.tsx b/plugins/feedback/src/components/EntityFeedbackPage/EntityFeedbackPage.tsx index bf5675b0ab8..56581778051 100644 --- a/plugins/feedback/src/components/EntityFeedbackPage/EntityFeedbackPage.tsx +++ b/plugins/feedback/src/components/EntityFeedbackPage/EntityFeedbackPage.tsx @@ -2,6 +2,7 @@ import React, { useEffect, useState } from 'react'; import { Progress } from '@backstage/core-components'; import { + alertApiRef, configApiRef, identityApiRef, useAnalytics, @@ -9,42 +10,41 @@ import { } from '@backstage/core-plugin-api'; import { useEntity } from '@backstage/plugin-catalog-react'; -import { - ButtonGroup, - CircularProgress, - createStyles, - Dialog, - makeStyles, - Snackbar, - Theme, - Tooltip, - Zoom, -} from '@material-ui/core'; -import Button from '@material-ui/core/Button'; -import Grid from '@material-ui/core/Grid'; -import Add from '@material-ui/icons/Add'; -import ArrowForwardRounded from '@material-ui/icons/ArrowForwardRounded'; -import Sync from '@material-ui/icons/Sync'; -import { Alert } from '@material-ui/lab'; +import Add from '@mui/icons-material/Add'; +import ArrowForwardRounded from '@mui/icons-material/ArrowForwardRounded'; +import Sync from '@mui/icons-material/Sync'; +import Button from '@mui/material/Button'; +import ButtonGroup from '@mui/material/ButtonGroup'; +import CircularProgress from '@mui/material/CircularProgress'; +import Dialog from '@mui/material/Dialog'; +import Grid from '@mui/material/Grid'; +import { styled, Theme } from '@mui/material/styles'; +import Tooltip from '@mui/material/Tooltip'; +import Zoom from '@mui/material/Zoom'; import { CreateFeedbackModal } from '../CreateFeedbackModal/CreateFeedbackModal'; import { FeedbackDetailsModal } from '../FeedbackDetailsModal'; import { FeedbackTable } from '../FeedbackTable'; import { CustomEmptyState } from './CustomEmptyState'; -const useStyles = makeStyles((theme: Theme) => - createStyles({ - buttonGroup: { - textAlign: 'center', - whiteSpace: 'nowrap', - marginTop: theme.spacing(1), - }, - }), -); +const PREFIX = 'EntityFeedbackPage'; + +const classes = { + buttonGroup: `${PREFIX}-buttonGroup`, +}; + +const StyledGrid = styled(Grid)(({ theme }: { theme: Theme }) => ({ + [`& .${classes.buttonGroup}`]: { + textAlign: 'center', + whiteSpace: 'nowrap', + marginTop: theme.spacing(1), + }, +})); export const EntityFeedbackPage = () => { const config = useApi(configApiRef); - const classes = useStyles(); + const alertApi = useApi(alertApiRef); + const { entity } = useEntity(); const user = useApi(identityApiRef); const analytics = useAnalytics(); @@ -56,19 +56,11 @@ export const EntityFeedbackPage = () => { }>(); const [modalOpen, setModalOpen] = useState(false); - const [snackbarOpen, setSnackbarOpen] = useState<{ - message: string; - open: boolean; - severity: 'success' | 'error'; - }>({ - message: '', - open: false, - severity: 'success', - }); + const [reload, setReload] = useState(false); useEffect(() => { setReload(false); - }, [snackbarOpen, reload]); + }, [reload]); const projectEntity = `${entity.kind}:${entity.metadata.namespace}/${entity.metadata.name}`.toLowerCase(); @@ -102,41 +94,30 @@ export const EntityFeedbackPage = () => { if (respObj) { setReload(true); if (respObj.error) { - setSnackbarOpen({ + alertApi.post({ message: respObj.error, severity: 'error', - open: true, + display: 'transient', }); } else if (respObj.message) { - setSnackbarOpen({ + alertApi.post({ message: respObj.message, severity: 'success', - open: true, + display: 'transient', }); } } }; - const handleSnackbarClose = ( - event?: React.SyntheticEvent, - reason?: string, - ) => { - event?.preventDefault(); - if (reason === 'clickaway') { - return; - } - setSnackbarOpen({ ...snackbarOpen, open: false }); - }; - const handleResyncClick = () => { analytics.captureEvent('click', 'refresh'); setReload(true); }; - return pluginConfig.feedbackEmailTo === undefined ? ( + return pluginConfig.feedbackType === undefined ? ( ) : ( - + { {reload ? : } - - - {snackbarOpen?.message} - - - + ); }; diff --git a/plugins/feedback/src/components/FeedbackDetailsModal/FeedbackDetailsModal.tsx b/plugins/feedback/src/components/FeedbackDetailsModal/FeedbackDetailsModal.tsx index f028061eba8..fa0103f3fa2 100644 --- a/plugins/feedback/src/components/FeedbackDetailsModal/FeedbackDetailsModal.tsx +++ b/plugins/feedback/src/components/FeedbackDetailsModal/FeedbackDetailsModal.tsx @@ -2,90 +2,91 @@ import React, { useEffect, useState } from 'react'; import { parseEntityRef } from '@backstage/catalog-model'; import { Progress, useQueryParamState } from '@backstage/core-components'; -import { useApi } from '@backstage/core-plugin-api'; +import { alertApiRef, useApi } from '@backstage/core-plugin-api'; import { EntityRefLink } from '@backstage/plugin-catalog-react'; -import { - Avatar, - Button, - Chip, - createStyles, - Dialog, - DialogActions, - DialogContent, - DialogTitle, - Grid, - IconButton, - Link, - List, - ListItem, - ListItemSecondaryAction, - ListItemText, - makeStyles, - Snackbar, - Theme, - Tooltip, - Typography, - Zoom, -} from '@material-ui/core'; -import ArrowForwardRounded from '@material-ui/icons/ArrowForwardRounded'; -import BugReportOutlined from '@material-ui/icons/BugReportOutlined'; -import CloseRounded from '@material-ui/icons/CloseRounded'; -import ExpandLessRounded from '@material-ui/icons/ExpandLessRounded'; -import ExpandMoreRounded from '@material-ui/icons/ExpandMoreRounded'; -import SmsOutlined from '@material-ui/icons/SmsOutlined'; -import { Alert } from '@material-ui/lab'; +import ArrowForwardRounded from '@mui/icons-material/ArrowForwardRounded'; +import BugReportOutlined from '@mui/icons-material/BugReportOutlined'; +import CloseRounded from '@mui/icons-material/CloseRounded'; +import ExpandLessRounded from '@mui/icons-material/ExpandLessRounded'; +import ExpandMoreRounded from '@mui/icons-material/ExpandMoreRounded'; +import SmsOutlined from '@mui/icons-material/SmsOutlined'; +import Avatar from '@mui/material/Avatar'; +import Button from '@mui/material/Button'; +import Chip from '@mui/material/Chip'; +import Dialog from '@mui/material/Dialog'; +import DialogActions from '@mui/material/DialogActions'; +import DialogContent from '@mui/material/DialogContent'; +import DialogTitle from '@mui/material/DialogTitle'; +import Grid from '@mui/material/Grid'; +import IconButton from '@mui/material/IconButton'; +import Link from '@mui/material/Link'; +import List from '@mui/material/List'; +import ListItem from '@mui/material/ListItem'; +import ListItemSecondaryAction from '@mui/material/ListItemSecondaryAction'; +import ListItemText from '@mui/material/ListItemText'; +import { styled, Theme } from '@mui/material/styles'; +import Tooltip from '@mui/material/Tooltip'; +import Typography from '@mui/material/Typography'; +import Zoom from '@mui/material/Zoom'; import { feedbackApiRef } from '../../api'; import { FeedbackType } from '../../models/feedback.model'; -const useStyles = makeStyles((theme: Theme) => - createStyles({ - closeButton: { +const PREFIX = 'FeedbackDetailsModal'; + +const classes = { + closeButton: `${PREFIX}-closeButton`, + dialogAction: `${PREFIX}-dialogAction`, + dialogTitle: `${PREFIX}-dialogTitle`, + submittedBy: `${PREFIX}-submittedBy`, + readMoreLink: `${PREFIX}-readMoreLink`, +}; + +const StyledDialog = styled(Dialog)(({ theme }: { theme: Theme }) => ({ + [`& .${classes.dialogAction}`]: { + justifyContent: 'flex-start', + paddingLeft: theme.spacing(3), + paddingBottom: theme.spacing(2), + }, + + [`& .${classes.submittedBy}`]: { + color: '#9e9e9e', + fontWeight: 500, + }, + + [`& .${classes.readMoreLink}`]: { + display: 'flex', + alignItems: 'center', + cursor: 'pointer', + }, +})); + +const StyledDialogTitle = styled(DialogTitle)( + ({ theme }: { theme: Theme }) => ({ + display: 'flex', + paddingBottom: theme.spacing(0), + marginRight: theme.spacing(2), + '& > svg': { + marginTop: theme.spacing(0.5), + marginRight: theme.spacing(1), + }, + [`& .${classes.closeButton}`]: { position: 'absolute', right: theme.spacing(1), top: theme.spacing(1), color: theme.palette.grey[500], }, - dialogAction: { - justifyContent: 'flex-start', - paddingLeft: theme.spacing(3), - paddingBottom: theme.spacing(2), - }, - dialogTitle: { - '& > *': { - display: 'flex', - alignItems: 'center', - marginRight: theme.spacing(2), - wordBreak: 'break-word', - }, - '& > * > svg': { marginRight: theme.spacing(1) }, - - paddingBottom: theme.spacing(0), - }, - submittedBy: { - color: theme.palette.textSubtle, - fontWeight: 500, - }, - readMoreLink: { - display: 'flex', - alignItems: 'center', - cursor: 'pointer', - }, }), ); export const FeedbackDetailsModal = () => { - const classes = useStyles(); const api = useApi(feedbackApiRef); + const alertApi = useApi(alertApiRef); const [queryState, setQueryState] = useQueryParamState( 'id', ); const [modalData, setModalData] = useState(); - const [snackbarOpen, setSnackbarOpen] = useState({ - message: '', - open: false, - }); const [ticketDetails, setTicketDetails] = useState<{ status: string | null; @@ -148,26 +149,18 @@ export const FeedbackDetailsModal = () => { if (!modalData && queryState) { api.getFeedbackById(queryState).then(resp => { if (resp?.error !== undefined) { - setSnackbarOpen({ message: resp.error, open: true }); + alertApi.post({ + message: resp.error, + display: 'transient', + severity: 'error', + }); } else { const respData: FeedbackType = resp?.data!; setModalData(respData); } }); } - }, [modalData, api, queryState]); - - const handleSnackbarClose = ( - event?: React.SyntheticEvent, - reason?: string, - ) => { - event?.preventDefault(); - if (reason === 'clickaway') { - return; - } - setSnackbarOpen({ ...snackbarOpen, open: false }); - setQueryState(undefined); - }; + }, [modalData, api, queryState, alertApi]); const handleClose = () => { setModalData(undefined); @@ -194,7 +187,7 @@ export const FeedbackDetailsModal = () => { }; return ( - { maxWidth="sm" scroll="paper" > - {!modalData ? ( - - - {snackbarOpen.message} - - - ) : ( + {modalData ? ( <> - + { aria-label="close" className={classes.closeButton} onClick={handleClose} + size="large" > - + { ) : null} - )} - + ) : null} + ); }; diff --git a/plugins/feedback/src/components/FeedbackTable/FeedbackTable.tsx b/plugins/feedback/src/components/FeedbackTable/FeedbackTable.tsx index c036989d01a..2ed54cf0b1e 100644 --- a/plugins/feedback/src/components/FeedbackTable/FeedbackTable.tsx +++ b/plugins/feedback/src/components/FeedbackTable/FeedbackTable.tsx @@ -14,29 +14,32 @@ import { EntityRefLink, } from '@backstage/plugin-catalog-react'; -import { - Box, - Chip, - IconButton, - Link, - makeStyles, - Paper, - TableContainer, - TextField, - Theme, - Tooltip, - Typography, -} from '@material-ui/core'; -import BugReportOutlined from '@material-ui/icons/BugReportOutlined'; -import Clear from '@material-ui/icons/Clear'; -import Search from '@material-ui/icons/Search'; -import TextsmsOutlined from '@material-ui/icons/TextsmsOutlined'; +import BugReportOutlined from '@mui/icons-material/BugReportOutlined'; +import Clear from '@mui/icons-material/Clear'; +import Search from '@mui/icons-material/Search'; +import TextsmsOutlined from '@mui/icons-material/TextsmsOutlined'; +import Box from '@mui/material/Box'; +import Chip from '@mui/material/Chip'; +import IconButton from '@mui/material/IconButton'; +import Link from '@mui/material/Link'; +import Paper from '@mui/material/Paper'; +import { styled, Theme } from '@mui/material/styles'; +import TableContainer from '@mui/material/TableContainer'; +import TextField from '@mui/material/TextField'; +import Tooltip from '@mui/material/Tooltip'; +import Typography from '@mui/material/Typography'; import { feedbackApiRef } from '../../api'; import { FeedbackType } from '../../models/feedback.model'; -const useStyles = makeStyles((theme: Theme) => ({ - textField: { +const PREFIX = 'FeedbackTable'; + +const classes = { + textField: `${PREFIX}-textField`, +}; + +const StyledPaper = styled(Paper)(({ theme }: { theme: Theme }) => ({ + [`& .${classes.textField}`]: { padding: 0, margin: theme.spacing(2), width: '70%', @@ -46,9 +49,7 @@ const useStyles = makeStyles((theme: Theme) => ({ }, })); -export const FeedbackTable: React.FC<{ projectId?: string }> = (props: { - projectId?: string; -}) => { +export const FeedbackTable = (props: { projectId?: string }) => { const projectId = props.projectId ? props.projectId : 'all'; const api = useApi(feedbackApiRef); const analytics = useAnalytics(); @@ -61,7 +62,6 @@ export const FeedbackTable: React.FC<{ projectId?: string }> = (props: { const [queryState, setQueryState] = useQueryParamState('id'); const [loading, setLoading] = useState(true); const [searchText, setSearchText] = useState(''); - const classes = useStyles(); const columns: TableColumn[] = [ { @@ -248,7 +248,7 @@ export const FeedbackTable: React.FC<{ projectId?: string }> = (props: { } return ( - + = (props: { ), endAdornment: ( - setSearchText('')}> + setSearchText('')} size="medium"> @@ -293,6 +293,6 @@ export const FeedbackTable: React.FC<{ projectId?: string }> = (props: { page={tableConfig.page - 1} /> - + ); }; diff --git a/plugins/feedback/src/components/GlobalFeedbackPage/GlobalFeedbackPage.tsx b/plugins/feedback/src/components/GlobalFeedbackPage/GlobalFeedbackPage.tsx index 14d70800b30..dbf0bce3f7c 100644 --- a/plugins/feedback/src/components/GlobalFeedbackPage/GlobalFeedbackPage.tsx +++ b/plugins/feedback/src/components/GlobalFeedbackPage/GlobalFeedbackPage.tsx @@ -3,16 +3,16 @@ import React from 'react'; import { Content, Header, Page } from '@backstage/core-components'; import { configApiRef, useApi } from '@backstage/core-plugin-api'; -import { Grid } from '@material-ui/core'; +import Grid from '@mui/material/Grid'; import { FeedbackDetailsModal } from '../FeedbackDetailsModal'; import { FeedbackTable } from '../FeedbackTable'; -export const GlobalFeedbackPage = () => { +export const GlobalFeedbackPage = (props: { themeId?: string }) => { const app = useApi(configApiRef); const appTitle = app.getString('app.title'); return ( - +
diff --git a/plugins/feedback/src/components/OpcFeedbackComponent/OpcFeedbackComponent.tsx b/plugins/feedback/src/components/OpcFeedbackComponent/OpcFeedbackComponent.tsx index 849d11080c7..43c0f0de363 100644 --- a/plugins/feedback/src/components/OpcFeedbackComponent/OpcFeedbackComponent.tsx +++ b/plugins/feedback/src/components/OpcFeedbackComponent/OpcFeedbackComponent.tsx @@ -3,6 +3,7 @@ import React, { useEffect } from 'react'; import '@one-platform/opc-feedback'; import { + alertApiRef, configApiRef, identityApiRef, useAnalytics, @@ -10,9 +11,6 @@ import { useRouteRef, } from '@backstage/core-plugin-api'; -import { Snackbar } from '@material-ui/core'; -import { Alert } from '@material-ui/lab'; - import { feedbackApiRef } from '../../api'; import { FeedbackCategory } from '../../models/feedback.model'; import { rootRouteRef, viewDocsRouteRef } from '../../routes'; @@ -21,6 +19,7 @@ export const OpcFeedbackComponent = () => { const appConfig = useApi(configApiRef); const feedbackApi = useApi(feedbackApiRef); const identityApi = useApi(identityApiRef); + const alertApi = useApi(alertApiRef); const analytics = useAnalytics(); const footer = JSON.stringify({ @@ -33,34 +32,13 @@ export const OpcFeedbackComponent = () => { const docsSpa = useRouteRef(viewDocsRouteRef); const feedbackSpa = useRouteRef(rootRouteRef); - const [snackbarState, setSnackbarState] = React.useState<{ - message?: string; - open: boolean; - severity: 'success' | 'error'; - }>({ - message: '', - open: false, - severity: 'success', - }); - - const handleSnackbarClose = ( - event?: React.SyntheticEvent, - reason?: string, - ) => { - event?.preventDefault(); - if (reason === 'clickaway') { - return; - } - setSnackbarState({ ...snackbarState, open: false }); - }; - useEffect(() => { const onSubmit = async (event: any) => { if (event.detail.data.summary.trim().length < 1) { - setSnackbarState({ + alertApi.post({ message: 'Summary cannot be empty', severity: 'error', - open: true, + display: 'transient', }); throw Error('Summary cannot be empty'); } @@ -84,42 +62,31 @@ export const OpcFeedbackComponent = () => { : FeedbackCategory.FEEDBACK, }); if (resp.error) { - setSnackbarState({ + alertApi.post({ message: resp.error, severity: 'error', - open: true, + display: 'transient', }); throw new Error(resp.error); } else { - setSnackbarState({ - message: resp.message, + alertApi.post({ + message: resp.message as string, severity: 'success', - open: true, + display: 'transient', }); } }; const elem: any = document.querySelector('opc-feedback'); elem.onSubmit = onSubmit; - }, [feedbackApi, projectId, identityApi, analytics]); + }, [feedbackApi, projectId, identityApi, analytics, alertApi]); return ( - <> - - - {snackbarState?.message} - - - - + ); }; diff --git a/plugins/feedback/src/index.ts b/plugins/feedback/src/index.ts index d5a0b6b6577..86525d58d8f 100644 --- a/plugins/feedback/src/index.ts +++ b/plugins/feedback/src/index.ts @@ -1,4 +1,4 @@ -export { default as FeedbackIcon } from '@material-ui/icons/TextsmsOutlined'; +export { default as FeedbackIcon } from '@mui/icons-material/TextsmsOutlined'; export { feedbackPlugin, GlobalFeedbackPage, diff --git a/yarn.lock b/yarn.lock index 11d8d0e7db0..6cb1465c26b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2961,6 +2961,49 @@ winston "^3.2.1" winston-transport "^4.5.0" +"@backstage/backend-app-api@^0.7.3": + version "0.7.5" + resolved "https://registry.yarnpkg.com/@backstage/backend-app-api/-/backend-app-api-0.7.5.tgz#b3a52da8924825f8b132e4b7380e421762e08377" + integrity sha512-Ggo8IVdfcEPWrsw92UNZ3rYyIAL+5KReszKO2P2P7+qGV2aZLNdl772RG2+NgIRaUW66sxr0qSQzyFKsyXYHlg== + dependencies: + "@backstage/backend-common" "^0.22.0" + "@backstage/backend-plugin-api" "^0.6.18" + "@backstage/backend-tasks" "^0.5.23" + "@backstage/cli-common" "^0.1.13" + "@backstage/cli-node" "^0.2.5" + "@backstage/config" "^1.2.0" + "@backstage/config-loader" "^1.8.0" + "@backstage/errors" "^1.2.4" + "@backstage/plugin-auth-node" "^0.4.13" + "@backstage/plugin-permission-node" "^0.7.29" + "@backstage/types" "^1.1.1" + "@manypkg/get-packages" "^1.1.3" + "@types/cors" "^2.8.6" + "@types/express" "^4.17.6" + compression "^1.7.4" + cookie "^0.6.0" + cors "^2.8.5" + express "^4.17.1" + express-promise-router "^4.1.0" + fs-extra "^11.2.0" + helmet "^6.0.0" + jose "^5.0.0" + knex "^3.0.0" + lodash "^4.17.21" + logform "^2.3.2" + luxon "^3.0.0" + minimatch "^9.0.0" + minimist "^1.2.5" + morgan "^1.10.0" + node-forge "^1.3.1" + path-to-regexp "^6.2.1" + selfsigned "^2.0.0" + stoppable "^1.1.0" + triple-beam "^1.4.1" + uuid "^9.0.0" + winston "^3.2.1" + winston-transport "^4.5.0" + "@backstage/backend-common@0.21.7", "@backstage/backend-common@^0.21.7": version "0.21.7" resolved "https://registry.yarnpkg.com/@backstage/backend-common/-/backend-common-0.21.7.tgz#5ae796d8adccebc484edeeb2326464c28e14849e" @@ -3086,6 +3129,69 @@ yauzl "^3.0.0" yn "^4.0.0" +"@backstage/backend-common@^0.22.0": + version "0.22.0" + resolved "https://registry.yarnpkg.com/@backstage/backend-common/-/backend-common-0.22.0.tgz#d57a0eff218dc7cd8e227b989eaa13834040d322" + integrity sha512-puremJU59ILyWOSnmm8FegnlxZyu7sKaYjWCop2HmoMuFeEdYxJhPysZOQf1G7N3JootJXGEn6HB/EXy8kAipA== + dependencies: + "@aws-sdk/abort-controller" "^3.347.0" + "@aws-sdk/client-codecommit" "^3.350.0" + "@aws-sdk/client-s3" "^3.350.0" + "@aws-sdk/credential-providers" "^3.350.0" + "@aws-sdk/types" "^3.347.0" + "@backstage/backend-app-api" "^0.7.3" + "@backstage/backend-dev-utils" "^0.1.4" + "@backstage/backend-plugin-api" "^0.6.18" + "@backstage/cli-common" "^0.1.13" + "@backstage/config" "^1.2.0" + "@backstage/config-loader" "^1.8.0" + "@backstage/errors" "^1.2.4" + "@backstage/integration" "^1.11.0" + "@backstage/integration-aws-node" "^0.1.12" + "@backstage/plugin-auth-node" "^0.4.13" + "@backstage/types" "^1.1.1" + "@google-cloud/storage" "^7.0.0" + "@keyv/memcache" "^1.3.5" + "@keyv/redis" "^2.5.3" + "@kubernetes/client-node" "0.20.0" + "@manypkg/get-packages" "^1.1.3" + "@octokit/rest" "^19.0.3" + "@types/cors" "^2.8.6" + "@types/dockerode" "^3.3.0" + "@types/express" "^4.17.6" + "@types/luxon" "^3.0.0" + "@types/webpack-env" "^1.15.2" + archiver "^6.0.0" + base64-stream "^1.0.0" + compression "^1.7.4" + concat-stream "^2.0.0" + cors "^2.8.5" + dockerode "^4.0.0" + express "^4.17.1" + express-promise-router "^4.1.0" + fs-extra "^11.2.0" + git-url-parse "^14.0.0" + helmet "^6.0.0" + isomorphic-git "^1.23.0" + jose "^5.0.0" + keyv "^4.5.2" + knex "^3.0.0" + lodash "^4.17.21" + logform "^2.3.2" + luxon "^3.0.0" + minimatch "^9.0.0" + mysql2 "^3.0.0" + node-fetch "^2.6.7" + p-limit "^3.1.0" + pg "^8.11.3" + raw-body "^2.4.1" + tar "^6.1.12" + uuid "^9.0.0" + winston "^3.2.1" + winston-transport "^4.5.0" + yauzl "^3.0.0" + yn "^4.0.0" + "@backstage/backend-defaults@^0.2.17": version "0.2.17" resolved "https://registry.yarnpkg.com/@backstage/backend-defaults/-/backend-defaults-0.2.17.tgz#cbb2b7e0ac2c9b340513e38d762f7bc2d06e0ce0" @@ -3099,6 +3205,39 @@ resolved "https://registry.yarnpkg.com/@backstage/backend-dev-utils/-/backend-dev-utils-0.1.4.tgz#65d204939c49b5df6a2148e8ad4dc718ccd1df07" integrity sha512-5YgAPz4CRtnqdaUlYCHwGmXvpkGQ1jaUMoDtiQ81WDxQrf+0iYZCwS4ftVyQmB0Ga6BaGOUf6GG/OuFA56Y5mA== +"@backstage/backend-dynamic-feature-service@^0.2.10": + version "0.2.10" + resolved "https://registry.yarnpkg.com/@backstage/backend-dynamic-feature-service/-/backend-dynamic-feature-service-0.2.10.tgz#aef627570f82bc674dc5e8a91662f8db6cc5a1c9" + integrity sha512-VHMXpGDn6EflsFDedAV7Y+JOTagJknDeWcyBRtaVMRk812g2znZ5odW0u8vjckZy9/TVrSsfofjAYo36uevq4A== + dependencies: + "@backstage/backend-app-api" "^0.7.3" + "@backstage/backend-common" "^0.22.0" + "@backstage/backend-plugin-api" "^0.6.18" + "@backstage/backend-tasks" "^0.5.23" + "@backstage/cli-common" "^0.1.13" + "@backstage/cli-node" "^0.2.5" + "@backstage/config" "^1.2.0" + "@backstage/config-loader" "^1.8.0" + "@backstage/errors" "^1.2.4" + "@backstage/plugin-app-node" "^0.1.18" + "@backstage/plugin-auth-node" "^0.4.13" + "@backstage/plugin-catalog-backend" "^1.22.0" + "@backstage/plugin-events-backend" "^0.3.5" + "@backstage/plugin-events-node" "^0.3.4" + "@backstage/plugin-permission-common" "^0.7.13" + "@backstage/plugin-permission-node" "^0.7.29" + "@backstage/plugin-scaffolder-node" "^0.4.4" + "@backstage/plugin-search-backend-node" "^1.2.22" + "@backstage/plugin-search-common" "^1.2.11" + "@backstage/types" "^1.1.1" + "@manypkg/get-packages" "^1.1.3" + "@types/express" "^4.17.6" + chokidar "^3.5.3" + express "^4.17.1" + fs-extra "^11.2.0" + lodash "^4.17.21" + winston "^3.2.1" + "@backstage/backend-dynamic-feature-service@^0.2.9": version "0.2.9" resolved "https://registry.yarnpkg.com/@backstage/backend-dynamic-feature-service/-/backend-dynamic-feature-service-0.2.9.tgz#2f9f572a9f6f93e11160d9486e06bd2e3575a169" @@ -3149,6 +3288,23 @@ openapi-merge "^1.3.2" openapi3-ts "^3.1.2" +"@backstage/backend-openapi-utils@^0.1.11": + version "0.1.11" + resolved "https://registry.yarnpkg.com/@backstage/backend-openapi-utils/-/backend-openapi-utils-0.1.11.tgz#1ac9ec6392d280d3d2420cda0f8dc27c4e595b4c" + integrity sha512-IHrfYYL7CtQOx4p/6vHMtoxvIdlt9b5npNh/7bzAfStYhBxmJ2kau/qqrJgQq6dBPPaQmRU4pLOp/q1HEIc6VQ== + dependencies: + "@backstage/backend-plugin-api" "^0.6.18" + "@backstage/errors" "^1.2.4" + "@types/express" "^4.17.6" + "@types/express-serve-static-core" "^4.17.5" + express "^4.17.1" + express-openapi-validator "^5.0.4" + express-promise-router "^4.1.0" + json-schema-to-ts "^3.0.0" + lodash "^4.17.21" + openapi-merge "^1.3.2" + openapi3-ts "^3.1.2" + "@backstage/backend-plugin-api@0.6.17", "@backstage/backend-plugin-api@^0.6.16", "@backstage/backend-plugin-api@^0.6.17": version "0.6.17" resolved "https://registry.yarnpkg.com/@backstage/backend-plugin-api/-/backend-plugin-api-0.6.17.tgz#3d00b167cccb36e2341ae5cc4026352904938322" @@ -3163,6 +3319,22 @@ express "^4.17.1" knex "^3.0.0" +"@backstage/backend-plugin-api@^0.6.18": + version "0.6.18" + resolved "https://registry.yarnpkg.com/@backstage/backend-plugin-api/-/backend-plugin-api-0.6.18.tgz#0da77be39616ce4bb09c3fc55a3cdf9c973edba4" + integrity sha512-AAnLvQ8BBKEzFKenh+1sF9RaGNXLdxdNI9aCs6KpqOIQCZjWyRqXfFHO4SDY+iu/FSW5BzVlKWpe4irSk/wl3g== + dependencies: + "@backstage/backend-tasks" "^0.5.23" + "@backstage/cli-common" "^0.1.13" + "@backstage/config" "^1.2.0" + "@backstage/errors" "^1.2.4" + "@backstage/plugin-auth-node" "^0.4.13" + "@backstage/plugin-permission-common" "^0.7.13" + "@backstage/types" "^1.1.1" + "@types/express" "^4.17.6" + express "^4.17.1" + knex "^3.0.0" + "@backstage/backend-tasks@^0.5.21", "@backstage/backend-tasks@^0.5.22": version "0.5.22" resolved "https://registry.yarnpkg.com/@backstage/backend-tasks/-/backend-tasks-0.5.22.tgz#67c464f5fdccdcc161e609154c671596b642c868" @@ -3182,6 +3354,25 @@ uuid "^9.0.0" zod "^3.22.4" +"@backstage/backend-tasks@^0.5.23": + version "0.5.23" + resolved "https://registry.yarnpkg.com/@backstage/backend-tasks/-/backend-tasks-0.5.23.tgz#85c14fff99189d0540d6bd5be4cc81faf0617620" + integrity sha512-nLdRG6RkzbpiDH0BQDmz8ZFebP4FNffDfxT9VX50+UJC2Q+0qJirqpbZKcQmHIYT66u7NNeJtsOJBSn/S23P6A== + dependencies: + "@backstage/backend-common" "^0.22.0" + "@backstage/backend-plugin-api" "^0.6.18" + "@backstage/config" "^1.2.0" + "@backstage/errors" "^1.2.4" + "@backstage/types" "^1.1.1" + "@opentelemetry/api" "^1.3.0" + "@types/luxon" "^3.0.0" + cron "^3.0.0" + knex "^3.0.0" + lodash "^4.17.21" + luxon "^3.0.0" + uuid "^9.0.0" + zod "^3.22.4" + "@backstage/backend-test-utils@0.3.7", "@backstage/backend-test-utils@^0.3.7": version "0.3.7" resolved "https://registry.yarnpkg.com/@backstage/backend-test-utils/-/backend-test-utils-0.3.7.tgz#436eccbe53014f3c7becc92675e107ddba389398" @@ -3216,6 +3407,16 @@ cross-fetch "^4.0.0" uri-template "^2.0.0" +"@backstage/catalog-client@^1.6.5": + version "1.6.5" + resolved "https://registry.yarnpkg.com/@backstage/catalog-client/-/catalog-client-1.6.5.tgz#f27c933abf8c7bf8bcbd090b4b550a7eb1957686" + integrity sha512-powm86JuibW0GtxtVYwO/xj3SjwV8AWMbL/D9C3Yl3mZ+4sp8lwXTTlKR+IdNHnFlDfwHiNH7LKT4BMgtTZbtA== + dependencies: + "@backstage/catalog-model" "^1.5.0" + "@backstage/errors" "^1.2.4" + cross-fetch "^4.0.0" + uri-template "^2.0.0" + "@backstage/catalog-model@1.4.5", "@backstage/catalog-model@^1.4.5": version "1.4.5" resolved "https://registry.yarnpkg.com/@backstage/catalog-model/-/catalog-model-1.4.5.tgz#b8f6309ff12b72dffdfe852d615c553ae13452c0" @@ -3226,6 +3427,16 @@ ajv "^8.10.0" lodash "^4.17.21" +"@backstage/catalog-model@^1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@backstage/catalog-model/-/catalog-model-1.5.0.tgz#7f5c4a80a3341555db5209fbc6fc2d25f6500707" + integrity sha512-CfLO5/DMGahneuLU4KTQEs1tgNhBciUtyGUDZB4Ii9i1Uha1poWcqp4HKg61lj1hmXNDUHmlbFqY9W7kmzRC0A== + dependencies: + "@backstage/errors" "^1.2.4" + "@backstage/types" "^1.1.1" + ajv "^8.10.0" + lodash "^4.17.21" + "@backstage/cli-common@^0.1.13": version "0.1.13" resolved "https://registry.yarnpkg.com/@backstage/cli-common/-/cli-common-0.1.13.tgz#cbeda6a359ca4437fc782f0ac51bb957e8d49e73" @@ -3683,6 +3894,21 @@ lodash "^4.17.21" luxon "^3.0.0" +"@backstage/integration@^1.11.0": + version "1.11.0" + resolved "https://registry.yarnpkg.com/@backstage/integration/-/integration-1.11.0.tgz#0a04b6d3e15569c1074b7f39a7a3a17eefd1b89b" + integrity sha512-RRci3a/uEmfYCCFxuw+8GgLPuWeCxt7iGOJYUZlyDEPfvUL+GSIdB2GQm4nzktRCUrNaJPd7QxaagmQgPCaIzg== + dependencies: + "@azure/identity" "^4.0.0" + "@backstage/config" "^1.2.0" + "@backstage/errors" "^1.2.4" + "@octokit/auth-app" "^4.0.0" + "@octokit/rest" "^19.0.3" + cross-fetch "^4.0.0" + git-url-parse "^14.0.0" + lodash "^4.17.21" + luxon "^3.0.0" + "@backstage/plugin-api-docs@^0.11.4": version "0.11.4" resolved "https://registry.yarnpkg.com/@backstage/plugin-api-docs/-/plugin-api-docs-0.11.4.tgz#0d4d47f8ed9d4550a1f2b00b2e6ad0c57da85500" @@ -3745,6 +3971,17 @@ express "^4.17.1" fs-extra "^11.2.0" +"@backstage/plugin-app-node@^0.1.18": + version "0.1.18" + resolved "https://registry.yarnpkg.com/@backstage/plugin-app-node/-/plugin-app-node-0.1.18.tgz#d3c79135432497acf434b0e6ed03dd504300f8de" + integrity sha512-v7Yk9/IykyVJChhio8wtGQaoEqOWaDX7sXBxkqP8+Z1Yy584TIaaJv4cofc1csJGZBzGWoZ//EVlWD7FfbwOog== + dependencies: + "@backstage/backend-plugin-api" "^0.6.18" + "@backstage/config-loader" "^1.8.0" + "@types/express" "^4.17.6" + express "^4.17.1" + fs-extra "^11.2.0" + "@backstage/plugin-auth-backend-module-atlassian-provider@^0.1.9": version "0.1.9" resolved "https://registry.yarnpkg.com/@backstage/plugin-auth-backend-module-atlassian-provider/-/plugin-auth-backend-module-atlassian-provider-0.1.9.tgz#d04e6a25cea5b9c7f1c62768c9c8a119d4e3fc49" @@ -4003,6 +4240,29 @@ zod "^3.22.4" zod-to-json-schema "^3.21.4" +"@backstage/plugin-auth-node@^0.4.13": + version "0.4.13" + resolved "https://registry.yarnpkg.com/@backstage/plugin-auth-node/-/plugin-auth-node-0.4.13.tgz#df54d69b0f6cbce91526937cfb21a7c732630787" + integrity sha512-i+41bNGQGY8JWFq/9GO08mylaAlSTn4vxiVpj3BYG1BZdtqpHT45MqpnVZ3s1i+/49gLoAo+PquLks9WNvmU0A== + dependencies: + "@backstage/backend-common" "^0.22.0" + "@backstage/backend-plugin-api" "^0.6.18" + "@backstage/catalog-client" "^1.6.5" + "@backstage/catalog-model" "^1.5.0" + "@backstage/config" "^1.2.0" + "@backstage/errors" "^1.2.4" + "@backstage/types" "^1.1.1" + "@types/express" "*" + "@types/passport" "^1.0.3" + express "^4.17.1" + jose "^5.0.0" + lodash "^4.17.21" + node-fetch "^2.6.7" + passport "^0.7.0" + winston "^3.2.1" + zod "^3.22.4" + zod-to-json-schema "^3.21.4" + "@backstage/plugin-auth-react@^0.1.0": version "0.1.1" resolved "https://registry.yarnpkg.com/@backstage/plugin-auth-react/-/plugin-auth-react-0.1.1.tgz#8307b83c6d1958c2a0c790bed5d9d9c3f6598670" @@ -4068,6 +4328,48 @@ yn "^4.0.0" zod "^3.22.4" +"@backstage/plugin-catalog-backend@^1.22.0": + version "1.22.0" + resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog-backend/-/plugin-catalog-backend-1.22.0.tgz#7199e5b29abf121c7af0e917cb9b2c149482fec8" + integrity sha512-iuMGNNyhmYTbysH1La7tI8/mQWevFq2aHHVqD800QUCyxqYfXfESAGJRXlqUtmzxxetQLwq7CF/MgvTNZD5bCw== + dependencies: + "@backstage/backend-common" "^0.22.0" + "@backstage/backend-openapi-utils" "^0.1.11" + "@backstage/backend-plugin-api" "^0.6.18" + "@backstage/backend-tasks" "^0.5.23" + "@backstage/catalog-client" "^1.6.5" + "@backstage/catalog-model" "^1.5.0" + "@backstage/config" "^1.2.0" + "@backstage/errors" "^1.2.4" + "@backstage/integration" "^1.11.0" + "@backstage/plugin-catalog-common" "^1.0.23" + "@backstage/plugin-catalog-node" "^1.12.0" + "@backstage/plugin-events-node" "^0.3.4" + "@backstage/plugin-permission-common" "^0.7.13" + "@backstage/plugin-permission-node" "^0.7.29" + "@backstage/plugin-search-backend-module-catalog" "^0.1.24" + "@backstage/types" "^1.1.1" + "@opentelemetry/api" "^1.3.0" + "@types/express" "^4.17.6" + codeowners-utils "^1.0.2" + core-js "^3.6.5" + express "^4.17.1" + fast-json-stable-stringify "^2.1.0" + fs-extra "^11.2.0" + git-url-parse "^14.0.0" + glob "^7.1.6" + knex "^3.0.0" + lodash "^4.17.21" + luxon "^3.0.0" + minimatch "^9.0.0" + node-fetch "^2.6.7" + p-limit "^3.0.2" + prom-client "^15.0.0" + uuid "^9.0.0" + yaml "^2.0.0" + yn "^4.0.0" + zod "^3.22.4" + "@backstage/plugin-catalog-common@^1.0.22": version "1.0.22" resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog-common/-/plugin-catalog-common-1.0.22.tgz#a5ceb222f89f31b0ade96a32ff875b63067755be" @@ -4077,6 +4379,15 @@ "@backstage/plugin-permission-common" "^0.7.13" "@backstage/plugin-search-common" "^1.2.11" +"@backstage/plugin-catalog-common@^1.0.23": + version "1.0.23" + resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog-common/-/plugin-catalog-common-1.0.23.tgz#2ba1fe13450f6283e049acc83aa4fcebda6153e8" + integrity sha512-u04VUq/2wNjF9ikpGxdt1kXSQf5VlPDWTwzYyJYKD80qGa6l/klUXJ3IBs8P4XyQObkPNyS/Tho/H8XDFNeqEw== + dependencies: + "@backstage/catalog-model" "^1.5.0" + "@backstage/plugin-permission-common" "^0.7.13" + "@backstage/plugin-search-common" "^1.2.11" + "@backstage/plugin-catalog-graph@^0.4.4": version "0.4.4" resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog-graph/-/plugin-catalog-graph-0.4.4.tgz#ff26dcec8ae437d07bbdc98093aa52503fe2a1b1" @@ -4143,6 +4454,20 @@ "@backstage/plugin-permission-node" "^0.7.28" "@backstage/types" "^1.1.1" +"@backstage/plugin-catalog-node@^1.12.0": + version "1.12.0" + resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog-node/-/plugin-catalog-node-1.12.0.tgz#513bd374d48c605c664aa77c7350c8585eb9e56e" + integrity sha512-y+MsHc94Sepnqhg6pMTCMJBNEWhnCfoKhsl79/a+lsK3Hi+g6e+fNDfTJbg8shhMVnnvwwvfY/UWySZm1B02QQ== + dependencies: + "@backstage/backend-plugin-api" "^0.6.18" + "@backstage/catalog-client" "^1.6.5" + "@backstage/catalog-model" "^1.5.0" + "@backstage/errors" "^1.2.4" + "@backstage/plugin-catalog-common" "^1.0.23" + "@backstage/plugin-permission-common" "^0.7.13" + "@backstage/plugin-permission-node" "^0.7.29" + "@backstage/types" "^1.1.1" + "@backstage/plugin-catalog-react@^1.11.3": version "1.11.3" resolved "https://registry.yarnpkg.com/@backstage/plugin-catalog-react/-/plugin-catalog-react-1.11.3.tgz#e83948f3c921791066499d30ef487a9f4ce5964b" @@ -4220,6 +4545,20 @@ express-promise-router "^4.1.0" winston "^3.2.1" +"@backstage/plugin-events-backend@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@backstage/plugin-events-backend/-/plugin-events-backend-0.3.5.tgz#beb43af13e4db963ec188183447c2d2f4604283e" + integrity sha512-6PoYpNr2HBQISB+O8Us7QCG+6QoHTRI6msIQt9pKz/V30JtlGtfkjPaId9/OotiPo2csgp1p83ILRyknfmknjQ== + dependencies: + "@backstage/backend-common" "^0.22.0" + "@backstage/backend-plugin-api" "^0.6.18" + "@backstage/config" "^1.2.0" + "@backstage/plugin-events-node" "^0.3.4" + "@types/express" "^4.17.6" + express "^4.17.1" + express-promise-router "^4.1.0" + winston "^3.2.1" + "@backstage/plugin-events-node@^0.3.3": version "0.3.3" resolved "https://registry.yarnpkg.com/@backstage/plugin-events-node/-/plugin-events-node-0.3.3.tgz#4881730ed0889439b6366b27defb3e6ea6ba8fcf" @@ -4227,6 +4566,13 @@ dependencies: "@backstage/backend-plugin-api" "^0.6.17" +"@backstage/plugin-events-node@^0.3.4": + version "0.3.4" + resolved "https://registry.yarnpkg.com/@backstage/plugin-events-node/-/plugin-events-node-0.3.4.tgz#9d56b47edf9fc0d71f94b46ff91333fb10aad0f4" + integrity sha512-vALPBLIqlqAxGohbHat/z4qtvmUcC7+AyWUy+mn84O9OFB+L/v53m79qPjAJhUB9rzPZu8ClsVCfmhm/84j52Q== + dependencies: + "@backstage/backend-plugin-api" "^0.6.18" + "@backstage/plugin-home-react@^0.1.12": version "0.1.12" resolved "https://registry.yarnpkg.com/@backstage/plugin-home-react/-/plugin-home-react-0.1.12.tgz#414997aa79e1c98e208233aab1e71eb5e8f81b55" @@ -4408,6 +4754,23 @@ zod "^3.22.4" zod-to-json-schema "^3.20.4" +"@backstage/plugin-permission-node@^0.7.29": + version "0.7.29" + resolved "https://registry.yarnpkg.com/@backstage/plugin-permission-node/-/plugin-permission-node-0.7.29.tgz#9545fe0fce26ca191beff5e458b920e4445a0a03" + integrity sha512-Bjvuk9m3a2qCqoQKIuTA2Lm1zQwf+zVRJWVDIGtK+gJl1xR/gEdyEDDzIa9jX6YjfXRZ3RVsuQVA7jUg8DMw+Q== + dependencies: + "@backstage/backend-common" "^0.22.0" + "@backstage/backend-plugin-api" "^0.6.18" + "@backstage/config" "^1.2.0" + "@backstage/errors" "^1.2.4" + "@backstage/plugin-auth-node" "^0.4.13" + "@backstage/plugin-permission-common" "^0.7.13" + "@types/express" "^4.17.6" + express "^4.17.1" + express-promise-router "^4.1.0" + zod "^3.22.4" + zod-to-json-schema "^3.20.4" + "@backstage/plugin-permission-react@^0.4.22": version "0.4.22" resolved "https://registry.yarnpkg.com/@backstage/plugin-permission-react/-/plugin-permission-react-0.4.22.tgz#7a6d60a7ada0748ca7c23ccba64b1afc7b33045c" @@ -4618,6 +4981,15 @@ "@backstage/plugin-permission-common" "^0.7.13" "@backstage/types" "^1.1.1" +"@backstage/plugin-scaffolder-common@^1.5.2": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@backstage/plugin-scaffolder-common/-/plugin-scaffolder-common-1.5.2.tgz#f16d88a3594e02961bd2facd13bf7fc013cab3a2" + integrity sha512-lBet98Oxx+sLsKv84Ke8yF+47svpfzOmGdK8H0YBg+/BQ5M8SrfE05VNXF6VQw5NLsRundgcPMSIrpwKNGJxmQ== + dependencies: + "@backstage/catalog-model" "^1.5.0" + "@backstage/plugin-permission-common" "^0.7.13" + "@backstage/types" "^1.1.1" + "@backstage/plugin-scaffolder-node-test-utils@0.1.3": version "0.1.3" resolved "https://registry.yarnpkg.com/@backstage/plugin-scaffolder-node-test-utils/-/plugin-scaffolder-node-test-utils-0.1.3.tgz#3594943c05c8c60f7f2e197d352d94d19fba6038" @@ -4648,6 +5020,27 @@ zod "^3.22.4" zod-to-json-schema "^3.20.4" +"@backstage/plugin-scaffolder-node@^0.4.4": + version "0.4.4" + resolved "https://registry.yarnpkg.com/@backstage/plugin-scaffolder-node/-/plugin-scaffolder-node-0.4.4.tgz#4d90476b5c69341eba21c9fb164edb0ad3f2894e" + integrity sha512-8IEAntAutYZvyETC750yIly13d2WMaCXwIXxMOA3M0bGPfqnYj9rca4rJFBBS1sSlvYmWu+U4I16+5FO13xXKA== + dependencies: + "@backstage/backend-common" "^0.22.0" + "@backstage/backend-plugin-api" "^0.6.18" + "@backstage/catalog-model" "^1.5.0" + "@backstage/errors" "^1.2.4" + "@backstage/integration" "^1.11.0" + "@backstage/plugin-scaffolder-common" "^1.5.2" + "@backstage/types" "^1.1.1" + fs-extra "^11.2.0" + globby "^11.0.0" + isomorphic-git "^1.23.0" + jsonschema "^1.2.6" + p-limit "^3.1.0" + winston "^3.2.1" + zod "^3.22.4" + zod-to-json-schema "^3.20.4" + "@backstage/plugin-scaffolder-react@^1.8.4": version "1.8.4" resolved "https://registry.yarnpkg.com/@backstage/plugin-scaffolder-react/-/plugin-scaffolder-react-1.8.4.tgz#cb2797bd94b60d4e0c65e9c25792bf161f5f611a" @@ -4753,6 +5146,24 @@ "@backstage/plugin-search-backend-node" "^1.2.21" "@backstage/plugin-search-common" "^1.2.11" +"@backstage/plugin-search-backend-module-catalog@^0.1.24": + version "0.1.24" + resolved "https://registry.yarnpkg.com/@backstage/plugin-search-backend-module-catalog/-/plugin-search-backend-module-catalog-0.1.24.tgz#450db10a30f56f729322b72aa8385db2ca78b071" + integrity sha512-05lHb677OfCN26RwxspNYC8C5xJHfC+tyH7C7iEfJWtKNT2gknYBjpscHTSDwHrw7SzXjPP2hpfYGXhyD/0kyQ== + dependencies: + "@backstage/backend-common" "^0.22.0" + "@backstage/backend-plugin-api" "^0.6.18" + "@backstage/backend-tasks" "^0.5.23" + "@backstage/catalog-client" "^1.6.5" + "@backstage/catalog-model" "^1.5.0" + "@backstage/config" "^1.2.0" + "@backstage/errors" "^1.2.4" + "@backstage/plugin-catalog-common" "^1.0.23" + "@backstage/plugin-catalog-node" "^1.12.0" + "@backstage/plugin-permission-common" "^0.7.13" + "@backstage/plugin-search-backend-node" "^1.2.22" + "@backstage/plugin-search-common" "^1.2.11" + "@backstage/plugin-search-backend-module-techdocs@^0.1.22": version "0.1.22" resolved "https://registry.yarnpkg.com/@backstage/plugin-search-backend-module-techdocs/-/plugin-search-backend-module-techdocs-0.1.22.tgz#aaeafd653603b54f6c618adc765572612c6af451" @@ -4792,6 +5203,24 @@ ndjson "^2.0.0" uuid "^9.0.0" +"@backstage/plugin-search-backend-node@^1.2.22": + version "1.2.23" + resolved "https://registry.yarnpkg.com/@backstage/plugin-search-backend-node/-/plugin-search-backend-node-1.2.23.tgz#45e64389a6a2f8f09ca4f3f093a8d002352b5b7c" + integrity sha512-r1X9l72/jF6eQazVR3KR7/MZRknO2XGKXjvKLgSR7vxhwBi8DDE/4bg6nQaN8Okan9ll/Ng9jxjF/XRLc4plwQ== + dependencies: + "@backstage/backend-common" "^0.22.0" + "@backstage/backend-plugin-api" "^0.6.18" + "@backstage/backend-tasks" "^0.5.23" + "@backstage/config" "^1.2.0" + "@backstage/errors" "^1.2.4" + "@backstage/plugin-permission-common" "^0.7.13" + "@backstage/plugin-search-common" "^1.2.11" + "@types/lunr" "^2.3.3" + lodash "^4.17.21" + lunr "^2.3.9" + ndjson "^2.0.0" + uuid "^9.0.0" + "@backstage/plugin-search-backend@^1.5.7": version "1.5.7" resolved "https://registry.yarnpkg.com/@backstage/plugin-search-backend/-/plugin-search-backend-1.5.7.tgz#88f6fc3c49219cdd9b541c107a4e6a8ec87e598b" @@ -34257,7 +34686,7 @@ trim-newlines@^3.0.0: resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== -triple-beam@^1.3.0: +triple-beam@^1.3.0, triple-beam@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.4.1.tgz#6fde70271dc6e5d73ca0c3b24e2d92afb7441984" integrity sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==